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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] =?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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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/367] 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 From 6ba199ddcb6cc47e97e5ad151ca3c6c6325ba449 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 2 Sep 2026 05:38:45 +0100 Subject: [PATCH 255/367] feat: add full proof for IsStandardModel --- Physlib.lean | 21 + .../StandardModel/Fermions/DownSinglet.lean | 125 +- .../StandardModel/Fermions/LeptonDoublet.lean | 123 +- .../Fermions/LeptonSinglet/Basic.lean | 39 + .../StandardModel/Fermions/QuarkDoublet.lean | 138 +- .../StandardModel/Fermions/UpSinglet.lean | 124 +- .../Invariants/IsSU2AntiFundamental.lean | 640 ++++++++ .../Invariants/IsSU2BiFundamental.lean | 310 +++- .../Invariants/IsSU2QuadFundamental.lean | 666 ++++++-- .../Invariants/IsSU3FunAntiFun.lean | 569 ++++++- .../FermionGaugeSector/MassWeight.lean | 209 +++ .../GaugeHiggsSector/MassWeight.lean | 545 +++++++ .../MassWeight/Filtration.lean | 418 +++++ .../MassWeight/Invariants.lean | 564 +++++++ .../IsCovStandardModel/MixedSector/Basic.lean | 88 +- .../YukawaSector/Families/BarHiggs.lean | 754 +++++++++ .../YukawaSector/Families/Higgs.lean | 742 +++++++++ .../YukawaSector/Families/Symbols.lean | 796 ++++++++++ .../GaugeWeightDecomposition.lean | 799 ++++++++++ .../YukawaSector/MassDimEight.lean | 882 +++++++++++ .../YukawaSector/MassDimLTEight.lean | 412 +++++ .../IsFermionSector/Components.lean | 612 ++++++++ .../MassWeight/KineticFamilies.lean | 829 ++++++++++ .../MassWeight/KineticTerms.lean | 1016 +++++++++++++ .../MassWeight/MassDimEight.lean | 1351 +++++++++++++++++ .../MassWeight/MassDimLTEight.lean | 792 ++++++++++ .../MassWeight/GaugeWeightDecomposition.lean | 1228 ++++++++------- .../MassWeight/MassDimEight.lean | 513 +++++++ .../MassWeight/MassDimLTEight.lean | 407 +++++ .../MassWeight/Filtration.lean | 421 +++++ Physlib/Particles/StandardModel/Peeling.lean | 839 ++++++++++ .../LorentzGroup/Invariants/IsBiLeftWeyl.lean | 480 +++++- .../Invariants/IsLeftRightWeyl.lean | 6 + .../Invariants/IsVectorLeftRightWeyl.lean | 813 ++++++++++ 34 files changed, 17505 insertions(+), 766 deletions(-) create mode 100644 Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2AntiFundamental.lean create mode 100644 Physlib/Particles/StandardModel/IsCovStandardModel/FermionGaugeSector/MassWeight.lean create mode 100644 Physlib/Particles/StandardModel/IsCovStandardModel/GaugeHiggsSector/MassWeight.lean create mode 100644 Physlib/Particles/StandardModel/IsCovStandardModel/MassWeight/Filtration.lean create mode 100644 Physlib/Particles/StandardModel/IsCovStandardModel/MassWeight/Invariants.lean create mode 100644 Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/Families/BarHiggs.lean create mode 100644 Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/Families/Higgs.lean create mode 100644 Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/Families/Symbols.lean create mode 100644 Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/GaugeWeightDecomposition.lean create mode 100644 Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/MassDimEight.lean create mode 100644 Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/MassDimLTEight.lean create mode 100644 Physlib/Particles/StandardModel/IsFermionSector/Components.lean create mode 100644 Physlib/Particles/StandardModel/IsFermionSector/MassWeight/KineticFamilies.lean create mode 100644 Physlib/Particles/StandardModel/IsFermionSector/MassWeight/KineticTerms.lean create mode 100644 Physlib/Particles/StandardModel/IsFermionSector/MassWeight/MassDimEight.lean create mode 100644 Physlib/Particles/StandardModel/IsFermionSector/MassWeight/MassDimLTEight.lean create mode 100644 Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/MassDimEight.lean create mode 100644 Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/MassDimLTEight.lean create mode 100644 Physlib/Particles/StandardModel/IsStandardModel/MassWeight/Filtration.lean create mode 100644 Physlib/Particles/StandardModel/Peeling.lean create mode 100644 Physlib/Relativity/LorentzGroup/Invariants/IsVectorLeftRightWeyl.lean diff --git a/Physlib.lean b/Physlib.lean index 9785c54d3..4a6a6e2ab 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -258,6 +258,7 @@ 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.IsSU2Adjoint +public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU2AntiFundamental public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU2BiAdjoint public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU2BiFundamental public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU2QuadFundamental @@ -275,17 +276,32 @@ 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.FermionGaugeSector.MassWeight public import Physlib.Particles.StandardModel.IsCovStandardModel.GaugeHiggsSector.Basic +public import Physlib.Particles.StandardModel.IsCovStandardModel.GaugeHiggsSector.MassWeight public import Physlib.Particles.StandardModel.IsCovStandardModel.Generators public import Physlib.Particles.StandardModel.IsCovStandardModel.MassWeight +public import Physlib.Particles.StandardModel.IsCovStandardModel.MassWeight.Filtration +public import Physlib.Particles.StandardModel.IsCovStandardModel.MassWeight.Invariants 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.IsCovStandardModel.YukawaSector.Families.BarHiggs +public import Physlib.Particles.StandardModel.IsCovStandardModel.YukawaSector.Families.Higgs +public import Physlib.Particles.StandardModel.IsCovStandardModel.YukawaSector.Families.Symbols +public import Physlib.Particles.StandardModel.IsCovStandardModel.YukawaSector.GaugeWeightDecomposition +public import Physlib.Particles.StandardModel.IsCovStandardModel.YukawaSector.MassDimEight +public import Physlib.Particles.StandardModel.IsCovStandardModel.YukawaSector.MassDimLTEight public import Physlib.Particles.StandardModel.IsFermionSector.Basic +public import Physlib.Particles.StandardModel.IsFermionSector.Components 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.IsFermionSector.MassWeight.KineticFamilies +public import Physlib.Particles.StandardModel.IsFermionSector.MassWeight.KineticTerms +public import Physlib.Particles.StandardModel.IsFermionSector.MassWeight.MassDimEight +public import Physlib.Particles.StandardModel.IsFermionSector.MassWeight.MassDimLTEight public import Physlib.Particles.StandardModel.IsGaugeSector.Basic public import Physlib.Particles.StandardModel.IsGaugeSector.DerivSubmodule.BoostWeightDecomposition public import Physlib.Particles.StandardModel.IsGaugeSector.DerivSubmodule.GaugeWeightDecomposition @@ -299,7 +315,10 @@ public import Physlib.Particles.StandardModel.IsHiggsSector.DerivSubmodule.Boost 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.IsHiggsSector.MassWeight.MassDimEight +public import Physlib.Particles.StandardModel.IsHiggsSector.MassWeight.MassDimLTEight public import Physlib.Particles.StandardModel.IsStandardModel.CovStandardModel +public import Physlib.Particles.StandardModel.IsStandardModel.MassWeight.Filtration public import Physlib.Particles.StandardModel.JetAlgebra.Basic public import Physlib.Particles.StandardModel.JetAlgebra.GaugeAction public import Physlib.Particles.StandardModel.JetAlgebra.Invariants @@ -320,6 +339,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.Peeling public import Physlib.Particles.StandardModel.Representations public import Physlib.Particles.SuperSymmetry.MSSMNu.AnomalyCancellation.B3 public import Physlib.Particles.SuperSymmetry.MSSMNu.AnomalyCancellation.Basic @@ -497,6 +517,7 @@ 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.Invariants.IsVectorLeftRightWeyl 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/StandardModel/Fermions/DownSinglet.lean b/Physlib/Particles/StandardModel/Fermions/DownSinglet.lean index 8cc088fe7..414e7c76f 100644 --- a/Physlib/Particles/StandardModel/Fermions/DownSinglet.lean +++ b/Physlib/Particles/StandardModel/Fermions/DownSinglet.lean @@ -59,6 +59,7 @@ Model gauge group. - G. The action of the gauge algebra - H. The representation of the jet gauge group - I. The infinitesimal action underlies the jet gauge action +- J. Component transformation laws -/ @@ -511,6 +512,121 @@ lemma repJetGaugeGroupI_ofConstant (g : GaugeGroupI) : simp only [show ({ val := a + b } : DownSinglet) = ⟨a⟩ + ⟨b⟩ from rfl, map_add, ha, hb] +/-! + +## J. Component transformation laws + +The basis of `DownSinglet` splits as a right-handed Weyl index and a colour index. The +Lorentz group moves only the first, the gauge group only the second (up to the hypercharge +scalar), so both actions are recorded as a single sum over the index they move. Dualising +inverts and transposes the coefficient matrix, and conjugating stars it; the four +combinations below are what a component of a down-singlet symbol needs. + +-/ + +/-- The down-singlet basis vector as an explicit spinor–colour tensor. -/ +lemma basis_eq_mk (k : Fin 2) (c : Fin 3) : basis (k, c) = + ⟨Fermion.RightHandedWeyl.basis k ⊗ₜ[ℂ] EuclideanSpace.basisFun (Fin 3) ℂ c⟩ := by + simp only [basis, Module.Basis.map_apply, Module.Basis.tensorProduct_apply, + OrthonormalBasis.coe_toBasis] + rfl + +/-- The Lorentz action on the down-singlet basis: the colour index is inert and the + spinor index transforms by the entrywise conjugate matrix. -/ +lemma repLorentzGroup_apply_basis (Λ : SL(2,ℂ)) (j : Fin 2 × Fin 3) : + repLorentzGroup Λ (basis j) = ∑ β, star (Λ.1 β j.1) • basis (β, j.2) := by + obtain ⟨k, c⟩ := j + simp only [basis, Module.Basis.map_apply, Module.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.RightHandedWeyl.rep_apply_basis, + Representation.trivial_apply, TensorProduct.sum_tmul, map_sum, + Matrix.map_apply, RCLike.star_def] + refine Finset.sum_congr rfl fun x _ => ?_ + rw [← TensorProduct.smul_tmul', map_smul] + +/-- The down-singlet coordinate functionals transform contragrediently, by the entrywise + conjugate of the inverse matrix. -/ +lemma repLorentzGroup_dual_dualBasis (Λ : SL(2,ℂ)) (j : Fin 2 × Fin 3) : + repLorentzGroup.dual Λ (basis.dualBasis j) = + ∑ β, star ((Λ⁻¹).1 j.1 β) • basis.dualBasis (β, j.2) := by + have key := Representation.dual_apply_dualBasis repLorentzGroup basis Λ j + (Matrix.of fun p q => if p.2 = q.2 then star ((Λ⁻¹).1 p.1 q.1) else 0) + (fun q => by + rw [repLorentzGroup_apply_basis] + simp [Fintype.sum_prod_type, ite_smul, eq_comm]) + rw [key] + simp [Fintype.sum_prod_type, ite_smul] + +/-- The Lorentz action on the conjugate down-singlet basis: the coefficients are the + conjugates of those of the down-singlet action, that is, the matrix itself. -/ +lemma repLorentzGroup_conj_apply_basis (Λ : SL(2,ℂ)) (j : Fin 2 × Fin 3) : + repLorentzGroup.conj Λ (basis.conj j) = ∑ β, Λ.1 β j.1 • basis.conj (β, j.2) := 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 down-singlet coordinate functionals transform by the inverse matrix. -/ +lemma repLorentzGroup_conj_dual_dualBasis (Λ : SL(2,ℂ)) (j : Fin 2 × Fin 3) : + repLorentzGroup.conj.dual Λ (basis.conj.dualBasis j) = + ∑ β, (Λ⁻¹).1 j.1 β • basis.conj.dualBasis (β, j.2) := by + have key := Representation.dual_apply_dualBasis repLorentzGroup.conj basis.conj Λ j + (Matrix.of fun p q => if p.2 = q.2 then ((Λ⁻¹).1 p.1 q.1) else 0) + (fun q => by + rw [repLorentzGroup_conj_apply_basis] + simp [Fintype.sum_prod_type, ite_smul, eq_comm]) + rw [key] + simp [Fintype.sum_prod_type, ite_smul] + +/-- The gauge action on the down-singlet basis: the spinor index is inert and the colour + index transforms by the `SU(3)` matrix, scaled by the hypercharge factor. -/ +lemma repGaugeGroupI_apply_basis (g : GaugeGroupI) (j : Fin 2 × Fin 3) : + repGaugeGroupI g (basis j) = + ∑ c, (star g.toU1.1 ^ 2 * g.toSU3.1 c j.2) • basis (j.1, c) := by + obtain ⟨k, c⟩ := j + simp only [basis_eq_mk] + exact repGaugeGroupI_tmul_basis_eq_sum g k c + +/-- The down-singlet coordinate functionals carry the contragredient gauge action: the + hypercharge and `SU(3)` factors of the inverse group element, transposed. -/ +lemma repGaugeGroupI_dual_dualBasis (g : GaugeGroupI) (j : Fin 2 × Fin 3) : + repGaugeGroupI.dual g (basis.dualBasis j) = + ∑ c, (star (g⁻¹).toU1.1 ^ 2 * (g⁻¹).toSU3.1 j.2 c) • basis.dualBasis (j.1, c) := by + have key := Representation.dual_apply_dualBasis repGaugeGroupI basis g j + (Matrix.of fun p q => + if p.1 = q.1 then star (g⁻¹).toU1.1 ^ 2 * (g⁻¹).toSU3.1 p.2 q.2 else 0) + (fun q => by + rw [repGaugeGroupI_apply_basis] + simp [Fintype.sum_prod_type, ite_smul, eq_comm]) + rw [key] + simp [Fintype.sum_prod_type, ite_smul] + +/-- The gauge action on the conjugate down-singlet basis: the coefficients of the + down-singlet action, conjugated. -/ +lemma repGaugeGroupI_conj_apply_basis (g : GaugeGroupI) (j : Fin 2 × Fin 3) : + repGaugeGroupI.conj g (basis.conj j) = + ∑ c, star (star g.toU1.1 ^ 2 * g.toSU3.1 c j.2) • basis.conj (j.1, c) := by + rw [Representation.conj_apply, Module.Basis.conj_apply, LinearEquiv.symm_apply_apply, + repGaugeGroupI_apply_basis, map_sum] + refine Finset.sum_congr rfl fun c _ => ?_ + rw [LinearEquiv.map_smulₛₗ, starRingEnd_apply, Module.Basis.conj_apply] + +/-- The conjugate down-singlet coordinate functionals carry the conjugate of the + contragredient gauge action. -/ +lemma repGaugeGroupI_conj_dual_dualBasis (g : GaugeGroupI) (j : Fin 2 × Fin 3) : + repGaugeGroupI.conj.dual g (basis.conj.dualBasis j) = + ∑ c, star (star (g⁻¹).toU1.1 ^ 2 * (g⁻¹).toSU3.1 j.2 c) • + basis.conj.dualBasis (j.1, c) := by + have key := Representation.dual_apply_dualBasis repGaugeGroupI.conj basis.conj g j + (Matrix.of fun p q => + if p.1 = q.1 then star (star (g⁻¹).toU1.1 ^ 2 * (g⁻¹).toSU3.1 p.2 q.2) else 0) + (fun q => by + rw [repGaugeGroupI_conj_apply_basis] + simp [Fintype.sum_prod_type, ite_smul, eq_comm]) + rw [key] + simp [Fintype.sum_prod_type, ite_smul] + end DownSinglet /-! @@ -535,12 +651,15 @@ lemma DownSinglet.repGaugeGroupI_gaugeTorusGen_basis (i : Fin 4) (j : Fin 2 × F = ((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] + 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, + 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] <;> diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet.lean b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet.lean index 0537861b3..6c9332ba3 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet.lean @@ -50,6 +50,7 @@ form of the Standard Model gauge group. - E. Kernel of the gauge action - F. Descent to quotient gauge groups - G. Jet gauge action +- H. Component transformation laws -/ @@ -509,6 +510,122 @@ lemma repJetGaugeGroupI_ofConstant (g : GaugeGroupI) : simp only [show ({ val := a + b } : LeptonDoublet) = ⟨a⟩ + ⟨b⟩ from rfl, map_add, ha, hb] +/-! + +## H. Component transformation laws + +The basis of `LeptonDoublet` splits as a left-handed Weyl index and a weak-isospin index. +The Lorentz group moves only the first, the gauge group only the second (up to the +hypercharge scalar), so both actions are recorded as a single sum over the index they move. +Dualising inverts and transposes the coefficient matrix, and conjugating stars it; the four +combinations below are what a component of a lepton-doublet symbol needs. + +-/ + +/-- The lepton-doublet basis vector as an explicit spinor–weak tensor. -/ +lemma basis_eq_mk (k j : Fin 2) : basis (k, j) = + ⟨Fermion.LeftHandedWeyl.basis k ⊗ₜ[ℂ] EuclideanSpace.basisFun (Fin 2) ℂ j⟩ := by + simp only [basis, Module.Basis.map_apply, Module.Basis.tensorProduct_apply, + OrthonormalBasis.coe_toBasis] + rfl + +/-- The Lorentz action on the lepton-doublet basis: the weak index is inert and the + spinor index transforms by the matrix itself. -/ +lemma repLorentzGroup_apply_basis (Λ : SL(2,ℂ)) (j : Fin 2 × Fin 2) : + repLorentzGroup Λ (basis j) = ∑ β, Λ.1 β j.1 • basis (β, j.2) := by + obtain ⟨k, w⟩ := j + simp only [basis, Module.Basis.map_apply, Module.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, map_sum] + refine Finset.sum_congr rfl fun x _ => ?_ + rw [← TensorProduct.smul_tmul', map_smul] + +/-- The lepton-doublet coordinate functionals transform contragrediently, by the + inverse matrix. -/ +lemma repLorentzGroup_dual_dualBasis (Λ : SL(2,ℂ)) (j : Fin 2 × Fin 2) : + repLorentzGroup.dual Λ (basis.dualBasis j) = + ∑ β, (Λ⁻¹).1 j.1 β • basis.dualBasis (β, j.2) := by + have key := Representation.dual_apply_dualBasis repLorentzGroup basis Λ j + (Matrix.of fun p q => if p.2 = q.2 then (Λ⁻¹).1 p.1 q.1 else 0) + (fun q => by + rw [repLorentzGroup_apply_basis] + simp [Fintype.sum_prod_type, ite_smul, eq_comm]) + rw [key] + simp [Fintype.sum_prod_type, ite_smul] + +/-- The Lorentz action on the conjugate lepton-doublet basis: the coefficients are the + conjugates of those of the lepton-doublet action. -/ +lemma repLorentzGroup_conj_apply_basis (Λ : SL(2,ℂ)) (j : Fin 2 × Fin 2) : + repLorentzGroup.conj Λ (basis.conj j) + = ∑ β, star (Λ.1 β j.1) • basis.conj (β, j.2) := 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, Module.Basis.conj_apply] + +/-- The conjugate lepton-doublet coordinate functionals transform by the entrywise + conjugate of the inverse matrix. -/ +lemma repLorentzGroup_conj_dual_dualBasis (Λ : SL(2,ℂ)) (j : Fin 2 × Fin 2) : + repLorentzGroup.conj.dual Λ (basis.conj.dualBasis j) = + ∑ β, star ((Λ⁻¹).1 j.1 β) • basis.conj.dualBasis (β, j.2) := by + have key := Representation.dual_apply_dualBasis repLorentzGroup.conj basis.conj Λ j + (Matrix.of fun p q => if p.2 = q.2 then star ((Λ⁻¹).1 p.1 q.1) else 0) + (fun q => by + rw [repLorentzGroup_conj_apply_basis] + simp [Fintype.sum_prod_type, ite_smul, eq_comm]) + rw [key] + simp [Fintype.sum_prod_type, ite_smul] + +/-- The gauge action on the lepton-doublet basis: the spinor index is inert and the weak + index transforms by the `SU(2)` matrix, scaled by the hypercharge factor. -/ +lemma repGaugeGroupI_apply_basis (g : GaugeGroupI) (j : Fin 2 × Fin 2) : + repGaugeGroupI g (basis j) = + ∑ w, (star g.toU1.1 ^ 3 * g.toSU2.1 w j.2) • basis (j.1, w) := by + obtain ⟨k, w⟩ := j + simp only [basis_eq_mk] + exact repGaugeGroupI_tmul_basis_eq_sum g k w + +/-- The lepton-doublet coordinate functionals carry the contragredient gauge action: the + hypercharge and `SU(2)` factors of the inverse group element, transposed. -/ +lemma repGaugeGroupI_dual_dualBasis (g : GaugeGroupI) (j : Fin 2 × Fin 2) : + repGaugeGroupI.dual g (basis.dualBasis j) = + ∑ w, (star (g⁻¹).toU1.1 ^ 3 * (g⁻¹).toSU2.1 j.2 w) • basis.dualBasis (j.1, w) := by + have key := Representation.dual_apply_dualBasis repGaugeGroupI basis g j + (Matrix.of fun p q => + if p.1 = q.1 then star (g⁻¹).toU1.1 ^ 3 * (g⁻¹).toSU2.1 p.2 q.2 else 0) + (fun q => by + rw [repGaugeGroupI_apply_basis] + simp [Fintype.sum_prod_type, ite_smul, eq_comm]) + rw [key] + simp [Fintype.sum_prod_type, ite_smul] + +/-- The gauge action on the conjugate lepton-doublet basis: the coefficients of the + lepton-doublet action, conjugated. -/ +lemma repGaugeGroupI_conj_apply_basis (g : GaugeGroupI) (j : Fin 2 × Fin 2) : + repGaugeGroupI.conj g (basis.conj j) = + ∑ w, star (star g.toU1.1 ^ 3 * g.toSU2.1 w j.2) • basis.conj (j.1, w) := by + rw [Representation.conj_apply, Module.Basis.conj_apply, LinearEquiv.symm_apply_apply, + repGaugeGroupI_apply_basis, map_sum] + refine Finset.sum_congr rfl fun w _ => ?_ + rw [LinearEquiv.map_smulₛₗ, starRingEnd_apply, Module.Basis.conj_apply] + +/-- The conjugate lepton-doublet coordinate functionals carry the conjugate of the + contragredient gauge action. -/ +lemma repGaugeGroupI_conj_dual_dualBasis (g : GaugeGroupI) (j : Fin 2 × Fin 2) : + repGaugeGroupI.conj.dual g (basis.conj.dualBasis j) = + ∑ w, star (star (g⁻¹).toU1.1 ^ 3 * (g⁻¹).toSU2.1 j.2 w) • + basis.conj.dualBasis (j.1, w) := by + have key := Representation.dual_apply_dualBasis repGaugeGroupI.conj basis.conj g j + (Matrix.of fun p q => + if p.1 = q.1 then star (star (g⁻¹).toU1.1 ^ 3 * (g⁻¹).toSU2.1 p.2 q.2) else 0) + (fun q => by + rw [repGaugeGroupI_conj_apply_basis] + simp [Fintype.sum_prod_type, ite_smul, eq_comm]) + rw [key] + simp [Fintype.sum_prod_type, ite_smul] + end LeptonDoublet /-! @@ -533,8 +650,10 @@ lemma LeptonDoublet.repGaugeGroupI_gaugeTorusGen_basis (i : Fin 4) (j : Fin 2 × = ((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] + 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 <;> diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/Basic.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/Basic.lean index 89611f41f..3fd5fe483 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/Basic.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/Basic.lean @@ -228,6 +228,45 @@ lemma repGaugeGroupI_eq_iff {g₁ g₂ : GaugeGroupI} : ext l simp [repGaugeGroupI, h'] +/-- The gauge action on the lepton-singlet basis: multiplication by the hypercharge + scalar, the colour and weak factors acting trivially. -/ +lemma repGaugeGroupI_apply_basis (g : GaugeGroupI) (α : Fin 2) : + repGaugeGroupI g (basis α) = (star g.toU1.1 ^ 6 : ℂ) • basis α := by + have hb : basis α = ⟨Fermion.RightHandedWeyl.basis α⟩ := by + simp only [basis, Module.Basis.map_apply] + rfl + rw [hb, repGaugeGroupI_basis] + +/-- The lepton-singlet coordinate functionals carry the contragredient gauge action: the + hypercharge scalar of the inverse group element. -/ +lemma repGaugeGroupI_dual_dualBasis (g : GaugeGroupI) (α : Fin 2) : + repGaugeGroupI.dual g (basis.dualBasis α) = + (star (g⁻¹).toU1.1 ^ 6 : ℂ) • basis.dualBasis α := by + have key := Representation.dual_apply_dualBasis repGaugeGroupI basis g α + (Matrix.of fun p q => if p = q then (star (g⁻¹).toU1.1 ^ 6 : ℂ) else 0) + (fun q => by rw [repGaugeGroupI_apply_basis]; simp [ite_smul, eq_comm]) + rw [key] + simp [ite_smul] + +/-- The gauge action on the conjugate lepton-singlet basis: the hypercharge scalar, + conjugated. -/ +lemma repGaugeGroupI_conj_apply_basis (g : GaugeGroupI) (α : Fin 2) : + repGaugeGroupI.conj g (basis.conj α) = + star (star g.toU1.1 ^ 6 : ℂ) • basis.conj α := by + rw [Representation.conj_apply, Module.Basis.conj_apply, LinearEquiv.symm_apply_apply, + repGaugeGroupI_apply_basis, LinearEquiv.map_smulₛₗ, starRingEnd_apply] + +/-- The conjugate lepton-singlet coordinate functionals carry the conjugate of the + contragredient gauge action. -/ +lemma repGaugeGroupI_conj_dual_dualBasis (g : GaugeGroupI) (α : Fin 2) : + repGaugeGroupI.conj.dual g (basis.conj.dualBasis α) = + star (star (g⁻¹).toU1.1 ^ 6 : ℂ) • basis.conj.dualBasis α := by + have key := Representation.dual_apply_dualBasis repGaugeGroupI.conj basis.conj g α + (Matrix.of fun p q => if p = q then star (star (g⁻¹).toU1.1 ^ 6 : ℂ) else 0) + (fun q => by rw [repGaugeGroupI_conj_apply_basis]; simp [ite_smul, eq_comm]) + rw [key] + simp [ite_smul] + /-! ## E. Kernel of the gauge action diff --git a/Physlib/Particles/StandardModel/Fermions/QuarkDoublet.lean b/Physlib/Particles/StandardModel/Fermions/QuarkDoublet.lean index 36da7e23d..5b030f331 100644 --- a/Physlib/Particles/StandardModel/Fermions/QuarkDoublet.lean +++ b/Physlib/Particles/StandardModel/Fermions/QuarkDoublet.lean @@ -530,6 +530,129 @@ lemma repJetGaugeGroupI_ofConstant (g : GaugeGroupI) : simp only [show ({ val := a + b } : QuarkDoublet) = ⟨a⟩ + ⟨b⟩ from rfl, map_add, ha, hb] +/-! + +## Component transformation laws + +The basis of `QuarkDoublet` splits as a left-handed Weyl index, a colour index and a +weak-isospin index. The Lorentz group moves only the first, the gauge group only the last +two (up to the hypercharge scalar), so each action is recorded as a sum over the indices it +moves. Dualising inverts and transposes the coefficient matrices, and conjugating stars +them; the four combinations below are what a component of a quark-doublet symbol needs. + +-/ + +/-- The quark-doublet basis vector as an explicit spinor–colour–weak tensor. -/ +lemma basis_eq_mk (k : Fin 2) (c : Fin 3) (w : Fin 2) : basis (k, c, w) = + ⟨Fermion.LeftHandedWeyl.basis k ⊗ₜ[ℂ] EuclideanSpace.basisFun (Fin 3) ℂ c + ⊗ₜ[ℂ] EuclideanSpace.basisFun (Fin 2) ℂ w⟩ := by + simp only [basis, Module.Basis.reindex_apply, Module.Basis.map_apply, + Module.Basis.tensorProduct_apply, OrthonormalBasis.coe_toBasis, + Equiv.prodAssoc_symm_apply] + rfl + +/-- The Lorentz action on the quark-doublet basis: the colour and weak indices are inert + and the spinor index transforms by the matrix itself. -/ +lemma repLorentzGroup_apply_basis (Λ : SL(2,ℂ)) (j : Fin 2 × Fin 3 × Fin 2) : + repLorentzGroup Λ (basis j) = ∑ β, Λ.1 β j.1 • basis (β, j.2.1, j.2.2) := by + obtain ⟨k, c, w⟩ := j + simp only [basis_eq_mk, repLorentzGroup, MonoidHom.coe_mk, OneHom.coe_mk, + LinearMap.coe_comp, LinearEquiv.coe_coe, Function.comp_apply, + valLinEquiv_apply, TensorProduct.map_tmul, Fermion.LeftHandedWeyl.rep_apply_basis, + Representation.trivial_apply, TensorProduct.sum_tmul, map_sum] + refine Finset.sum_congr rfl fun x _ => ?_ + rw [← TensorProduct.smul_tmul', ← TensorProduct.smul_tmul'] + exact map_smul valLinEquiv.symm _ _ + +/-- The quark-doublet coordinate functionals transform contragrediently, by the inverse + matrix. -/ +lemma repLorentzGroup_dual_dualBasis (Λ : SL(2,ℂ)) (j : Fin 2 × Fin 3 × Fin 2) : + repLorentzGroup.dual Λ (basis.dualBasis j) = + ∑ β, (Λ⁻¹).1 j.1 β • basis.dualBasis (β, j.2.1, j.2.2) := by + have key := Representation.dual_apply_dualBasis repLorentzGroup basis Λ j + (Matrix.of fun p q => if p.2 = q.2 then (Λ⁻¹).1 p.1 q.1 else 0) + (fun q => by + rw [repLorentzGroup_apply_basis] + simp [Fintype.sum_prod_type, ite_smul, eq_comm]) + rw [key] + simp [Fintype.sum_prod_type, ite_smul] + +/-- The Lorentz action on the conjugate quark-doublet basis: the coefficients are the + conjugates of those of the quark-doublet action. -/ +lemma repLorentzGroup_conj_apply_basis (Λ : SL(2,ℂ)) (j : Fin 2 × Fin 3 × Fin 2) : + repLorentzGroup.conj Λ (basis.conj j) = + ∑ β, star (Λ.1 β j.1) • basis.conj (β, j.2.1, j.2.2) := 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, Module.Basis.conj_apply] + +/-- The conjugate quark-doublet coordinate functionals transform by the entrywise + conjugate of the inverse matrix. -/ +lemma repLorentzGroup_conj_dual_dualBasis (Λ : SL(2,ℂ)) (j : Fin 2 × Fin 3 × Fin 2) : + repLorentzGroup.conj.dual Λ (basis.conj.dualBasis j) = + ∑ β, star ((Λ⁻¹).1 j.1 β) • basis.conj.dualBasis (β, j.2.1, j.2.2) := by + have key := Representation.dual_apply_dualBasis repLorentzGroup.conj basis.conj Λ j + (Matrix.of fun p q => if p.2 = q.2 then star ((Λ⁻¹).1 p.1 q.1) else 0) + (fun q => by + rw [repLorentzGroup_conj_apply_basis] + simp [Fintype.sum_prod_type, ite_smul, eq_comm]) + rw [key] + simp [Fintype.sum_prod_type, ite_smul] + +/-- The gauge action on the quark-doublet basis: the spinor index is inert, the colour + index transforms by the `SU(3)` matrix and the weak index by the `SU(2)` matrix, scaled + by the hypercharge factor. -/ +lemma repGaugeGroupI_apply_basis (g : GaugeGroupI) (j : Fin 2 × Fin 3 × Fin 2) : + repGaugeGroupI g (basis j) = + ∑ c, ∑ w, (g.toU1.1 * g.toSU3.1 c j.2.1 * g.toSU2.1 w j.2.2) • basis (j.1, c, w) := by + obtain ⟨k, c, w⟩ := j + simp only [basis_eq_mk] + exact repGaugeGroupI_tmul_basis_eq_sum g k c w + +/-- The quark-doublet coordinate functionals carry the contragredient gauge action: the + hypercharge, `SU(3)` and `SU(2)` factors of the inverse group element, transposed. -/ +lemma repGaugeGroupI_dual_dualBasis (g : GaugeGroupI) (j : Fin 2 × Fin 3 × Fin 2) : + repGaugeGroupI.dual g (basis.dualBasis j) = + ∑ c, ∑ w, ((g⁻¹).toU1.1 * (g⁻¹).toSU3.1 j.2.1 c * (g⁻¹).toSU2.1 j.2.2 w) • + basis.dualBasis (j.1, c, w) := by + have key := Representation.dual_apply_dualBasis repGaugeGroupI basis g j + (Matrix.of fun p q => if p.1 = q.1 then + (g⁻¹).toU1.1 * (g⁻¹).toSU3.1 p.2.1 q.2.1 * (g⁻¹).toSU2.1 p.2.2 q.2.2 else 0) + (fun q => by + rw [repGaugeGroupI_apply_basis] + simp [Fintype.sum_prod_type, ite_smul, eq_comm]) + rw [key] + simp [Fintype.sum_prod_type, ite_smul] + +/-- The gauge action on the conjugate quark-doublet basis: the coefficients of the + quark-doublet action, conjugated. -/ +lemma repGaugeGroupI_conj_apply_basis (g : GaugeGroupI) (j : Fin 2 × Fin 3 × Fin 2) : + repGaugeGroupI.conj g (basis.conj j) = + ∑ c, ∑ w, star (g.toU1.1 * g.toSU3.1 c j.2.1 * g.toSU2.1 w j.2.2) • + basis.conj (j.1, c, w) := by + rw [Representation.conj_apply, Module.Basis.conj_apply, LinearEquiv.symm_apply_apply, + repGaugeGroupI_apply_basis, map_sum] + refine Finset.sum_congr rfl fun c _ => ?_ + rw [map_sum] + refine Finset.sum_congr rfl fun w _ => ?_ + rw [LinearEquiv.map_smulₛₗ, starRingEnd_apply, Module.Basis.conj_apply] + +/-- The conjugate quark-doublet coordinate functionals carry the conjugate of the + contragredient gauge action. -/ +lemma repGaugeGroupI_conj_dual_dualBasis (g : GaugeGroupI) (j : Fin 2 × Fin 3 × Fin 2) : + repGaugeGroupI.conj.dual g (basis.conj.dualBasis j) = + ∑ c, ∑ w, star ((g⁻¹).toU1.1 * (g⁻¹).toSU3.1 j.2.1 c * (g⁻¹).toSU2.1 j.2.2 w) • + basis.conj.dualBasis (j.1, c, w) := by + have key := Representation.dual_apply_dualBasis repGaugeGroupI.conj basis.conj g j + (Matrix.of fun p q => if p.1 = q.1 then + star ((g⁻¹).toU1.1 * (g⁻¹).toSU3.1 p.2.1 q.2.1 * (g⁻¹).toSU2.1 p.2.2 q.2.2) else 0) + (fun q => by + rw [repGaugeGroupI_conj_apply_basis] + simp [Fintype.sum_prod_type, ite_smul, eq_comm]) + rw [key] + simp [Fintype.sum_prod_type, ite_smul] + end QuarkDoublet /-! @@ -554,21 +677,25 @@ lemma QuarkDoublet.repGaugeGroupI_gaugeTorusGen_basis (i : Fin 4) (j : Fin 2 × = ((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 ⊗ₜ[ℂ] + 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, + 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, + 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) : +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 := @@ -578,7 +705,8 @@ lemma QuarkDoublet.repGaugeGroupI_dual_gaugeTorusGen_coord (i : Fin 4) (j : Fin /-- 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) : +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 diff --git a/Physlib/Particles/StandardModel/Fermions/UpSinglet.lean b/Physlib/Particles/StandardModel/Fermions/UpSinglet.lean index f094b3e84..5eecac2d8 100644 --- a/Physlib/Particles/StandardModel/Fermions/UpSinglet.lean +++ b/Physlib/Particles/StandardModel/Fermions/UpSinglet.lean @@ -411,6 +411,121 @@ lemma repJetGaugeGroupI_ofConstant (g : GaugeGroupI) : simp only [show ({ val := a + b } : UpSinglet) = ⟨a⟩ + ⟨b⟩ from rfl, map_add, ha, hb] +/-! + +## Component transformation laws + +The basis of `UpSinglet` splits as a right-handed Weyl index and a colour index. The +Lorentz group moves only the first, the gauge group only the second (up to the hypercharge +scalar), so both actions are recorded as a single sum over the index they move. Dualising +inverts and transposes the coefficient matrix, and conjugating stars it; the four +combinations below are what a component of an up-singlet symbol needs. + +-/ + +/-- The up-singlet basis vector as an explicit spinor–colour tensor. -/ +lemma basis_eq_mk (k : Fin 2) (c : Fin 3) : basis (k, c) = + ⟨Fermion.RightHandedWeyl.basis k ⊗ₜ[ℂ] EuclideanSpace.basisFun (Fin 3) ℂ c⟩ := by + simp only [basis, Module.Basis.map_apply, Module.Basis.tensorProduct_apply, + OrthonormalBasis.coe_toBasis] + rfl + +/-- The Lorentz action on the up-singlet basis: the colour index is inert and the + spinor index transforms by the entrywise conjugate matrix. -/ +lemma repLorentzGroup_apply_basis (Λ : SL(2,ℂ)) (j : Fin 2 × Fin 3) : + repLorentzGroup Λ (basis j) = ∑ β, star (Λ.1 β j.1) • basis (β, j.2) := by + obtain ⟨k, c⟩ := j + simp only [basis, Module.Basis.map_apply, Module.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.RightHandedWeyl.rep_apply_basis, + Representation.trivial_apply, TensorProduct.sum_tmul, map_sum, + Matrix.map_apply, RCLike.star_def] + refine Finset.sum_congr rfl fun x _ => ?_ + rw [← TensorProduct.smul_tmul', map_smul] + +/-- The up-singlet coordinate functionals transform contragrediently, by the entrywise + conjugate of the inverse matrix. -/ +lemma repLorentzGroup_dual_dualBasis (Λ : SL(2,ℂ)) (j : Fin 2 × Fin 3) : + repLorentzGroup.dual Λ (basis.dualBasis j) = + ∑ β, star ((Λ⁻¹).1 j.1 β) • basis.dualBasis (β, j.2) := by + have key := Representation.dual_apply_dualBasis repLorentzGroup basis Λ j + (Matrix.of fun p q => if p.2 = q.2 then star ((Λ⁻¹).1 p.1 q.1) else 0) + (fun q => by + rw [repLorentzGroup_apply_basis] + simp [Fintype.sum_prod_type, ite_smul, eq_comm]) + rw [key] + simp [Fintype.sum_prod_type, ite_smul] + +/-- The Lorentz action on the conjugate up-singlet basis: the coefficients are the + conjugates of those of the up-singlet action, that is, the matrix itself. -/ +lemma repLorentzGroup_conj_apply_basis (Λ : SL(2,ℂ)) (j : Fin 2 × Fin 3) : + repLorentzGroup.conj Λ (basis.conj j) = ∑ β, Λ.1 β j.1 • basis.conj (β, j.2) := 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 up-singlet coordinate functionals transform by the inverse matrix. -/ +lemma repLorentzGroup_conj_dual_dualBasis (Λ : SL(2,ℂ)) (j : Fin 2 × Fin 3) : + repLorentzGroup.conj.dual Λ (basis.conj.dualBasis j) = + ∑ β, (Λ⁻¹).1 j.1 β • basis.conj.dualBasis (β, j.2) := by + have key := Representation.dual_apply_dualBasis repLorentzGroup.conj basis.conj Λ j + (Matrix.of fun p q => if p.2 = q.2 then ((Λ⁻¹).1 p.1 q.1) else 0) + (fun q => by + rw [repLorentzGroup_conj_apply_basis] + simp [Fintype.sum_prod_type, ite_smul, eq_comm]) + rw [key] + simp [Fintype.sum_prod_type, ite_smul] + +/-- The gauge action on the up-singlet basis: the spinor index is inert and the colour + index transforms by the `SU(3)` matrix, scaled by the hypercharge factor. -/ +lemma repGaugeGroupI_apply_basis (g : GaugeGroupI) (j : Fin 2 × Fin 3) : + repGaugeGroupI g (basis j) = + ∑ c, (g.toU1.1 ^ 4 * g.toSU3.1 c j.2) • basis (j.1, c) := by + obtain ⟨k, c⟩ := j + simp only [basis_eq_mk] + exact repGaugeGroupI_tmul_basis_eq_sum g k c + +/-- The up-singlet coordinate functionals carry the contragredient gauge action: the + hypercharge and `SU(3)` factors of the inverse group element, transposed. -/ +lemma repGaugeGroupI_dual_dualBasis (g : GaugeGroupI) (j : Fin 2 × Fin 3) : + repGaugeGroupI.dual g (basis.dualBasis j) = + ∑ c, ((g⁻¹).toU1.1 ^ 4 * (g⁻¹).toSU3.1 j.2 c) • basis.dualBasis (j.1, c) := by + have key := Representation.dual_apply_dualBasis repGaugeGroupI basis g j + (Matrix.of fun p q => + if p.1 = q.1 then (g⁻¹).toU1.1 ^ 4 * (g⁻¹).toSU3.1 p.2 q.2 else 0) + (fun q => by + rw [repGaugeGroupI_apply_basis] + simp [Fintype.sum_prod_type, ite_smul, eq_comm]) + rw [key] + simp [Fintype.sum_prod_type, ite_smul] + +/-- The gauge action on the conjugate up-singlet basis: the coefficients of the + up-singlet action, conjugated. -/ +lemma repGaugeGroupI_conj_apply_basis (g : GaugeGroupI) (j : Fin 2 × Fin 3) : + repGaugeGroupI.conj g (basis.conj j) = + ∑ c, star (g.toU1.1 ^ 4 * g.toSU3.1 c j.2) • basis.conj (j.1, c) := by + rw [Representation.conj_apply, Module.Basis.conj_apply, LinearEquiv.symm_apply_apply, + repGaugeGroupI_apply_basis, map_sum] + refine Finset.sum_congr rfl fun c _ => ?_ + rw [LinearEquiv.map_smulₛₗ, starRingEnd_apply, Module.Basis.conj_apply] + +/-- The conjugate up-singlet coordinate functionals carry the conjugate of the + contragredient gauge action. -/ +lemma repGaugeGroupI_conj_dual_dualBasis (g : GaugeGroupI) (j : Fin 2 × Fin 3) : + repGaugeGroupI.conj.dual g (basis.conj.dualBasis j) = + ∑ c, star ((g⁻¹).toU1.1 ^ 4 * (g⁻¹).toSU3.1 j.2 c) • + basis.conj.dualBasis (j.1, c) := by + have key := Representation.dual_apply_dualBasis repGaugeGroupI.conj basis.conj g j + (Matrix.of fun p q => + if p.1 = q.1 then star ((g⁻¹).toU1.1 ^ 4 * (g⁻¹).toSU3.1 p.2 q.2) else 0) + (fun q => by + rw [repGaugeGroupI_conj_apply_basis] + simp [Fintype.sum_prod_type, ite_smul, eq_comm]) + rw [key] + simp [Fintype.sum_prod_type, ite_smul] + end UpSinglet /-! @@ -435,12 +550,15 @@ lemma UpSinglet.repGaugeGroupI_gaugeTorusGen_basis (i : Fin 4) (j : Fin 2 × Fin = ((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] + 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, + simp [gaugeTorusGen, GaugeGroupI.toU1, GaugeGroupI.toSU3, su3ExpIOne, su3ExpITwo, + Fin.sum_univ_three, Matrix.diagonal, UpSinglet.valueGaugeWeight, colourWeight, GaugeWeight.coord, expI_inv_eq_star] <;> diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2AntiFundamental.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2AntiFundamental.lean new file mode 100644 index 000000000..ad3dbc489 --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2AntiFundamental.lean @@ -0,0 +1,640 @@ +/- +Copyright (c) 2026 Joseph Tooby-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 anti-fundamental `su(2)` indices + +`IsSU2FunAntiFun B repGauge T` and `IsSU2BiAntiFun B repGauge T` are the two twisted +companions of `IsSU2BiFundamental`: a family indexed by one fundamental and one +anti-fundamental `su(2)` index, and a family indexed by two anti-fundamental ones. Between +them and `IsSU2BiFundamental` they cover the isospin content of every surviving term of the +Standard Model Yukawa sector, `2 ⊗ 2̄` for the down and lepton couplings and their +conjugates, `2̄ ⊗ 2̄` for the up coupling, `2 ⊗ 2` for its conjugate. + +Neither needs a classification of its own, and that is the point of the file. `SU(2)` is +pseudo-real: for `U` in `SU(2)` and `ε` the antisymmetric symbol, `conj U = ε U ε⁻¹`, and +because `U` is unitary the matrix moving an anti-fundamental index, `(U⁻¹)ᵀ`, is `conj U`. +Those two identities are proved in section E of `IsSU2BiFundamental`, and they say that the +anti-fundamental representation is the fundamental one in a different basis. So re-indexing +an anti-fundamental slot by `ε` turns the law into the bi-fundamental one, for the very same +representation: no twisted representation, no transfer of invariance along a group +automorphism, nothing but a change of basis in one slot. `SU(3)` has no analogue, which is +why the colour side needs a separate `IsSU3FunAntiFun` and the isospin side does not. + +Each re-index is invertible, so it leaves the span of the components alone, and every +conclusion of `IsSU2BiFundamental` — the classification of the isospin invariants, its +module-valued form, and its form modulo a stable submodule — transfers to the original +family. All that has to be tracked is which contraction of the original family the epsilon +contraction of the re-indexed one turns out to be. For `2 ⊗ 2̄` it is minus the delta +contraction `T^{0}{}_{0} + T^{1}{}_{1}`; for `2̄ ⊗ 2̄` it is the epsilon contraction itself, +with no sign at all. Those two factors are stated rather than absorbed into the definitions, +so that a re-index stays the plain re-index by `ε` and a contraction stays the plain trace +or the plain antisymmetric combination. + +Both propositions inherit the weakness of `IsSU2BiFundamental`: they constrain the isospin +transformation `(1, U, 1)` alone and say nothing whatever about the colour and hypercharge +factors, so the conclusions are about invariance under the isospin factor, and every +statement about gauge invariance carries the invariance of the contraction as an explicit +hypothesis. + +Section A is the `2 ⊗ 2̄` case, with its epsilon re-index, its delta contraction and the +classifications that follow, and section B the `2̄ ⊗ 2̄` case in the same order. +-/ + +@[expose] public section + +namespace StandardModel + +open Matrix ComplexConjugate + +/-! + +## A. One fundamental and one anti-fundamental isospin index + +Four of the six surviving Yukawa terms contract a Higgs doublet against a quark or lepton +doublet of the opposite variance, so their isospin content is `2 ⊗ 2̄` rather than `2 ⊗ 2`. +`IsSU2FunAntiFun` records that law: a factor of `U` for the first index and a factor of +`conj U` for the second, the summed index in the row slot as always, and, as in +`IsSU2BiFundamental`, only the isospin transformation `(1, U, 1)` is constrained. It is the +law obeyed by `fun l => h.barHiggs d (l 0) * h.higgs d (l 1)` for `h : IsHiggsSector`, a +conjugate Higgs symbol and then a Higgs symbol, once the hypercharge character is set +aside; the anti-fundamental slot is the second one, so a family carrying its indices the +other way round must be presented with its two slots exchanged. + +Section E of `IsSU2BiFundamental` is what makes this cheap. Because `conj U = ε U ε⁻¹`, +re-indexing the anti-fundamental slot by the antisymmetric symbol turns the law into the +bi-fundamental one, with the very same representation: no twisted representation, no transfer of +invariance along a group automorphism, nothing but a change of basis in one slot. The +re-index is invertible, so the span is unchanged, and every conclusion of +`IsSU2BiFundamental` is available for the original family once one knows which of its +contractions the epsilon contraction of the re-indexed family is. + +That contraction is the delta contraction `T^{0}{}_{0} + T^{1}{}_{1}`, the only invariant +`2 ⊗ 2̄` admits, and the identification carries a sign: `epsilonContraction (reindex T)` is +`-deltaContraction T`. The sign is stated rather than absorbed into the definition, so that +`reindex` stays the plain re-index by `ε` and the delta contraction stays the plain trace. +Every classification below is the corresponding one of `IsSU2BiFundamental` read through +that sign, and each is stated for a family valued in a mere module, the square-zero +extension of that file having already removed the algebra hypotheses. + +`of_isSU2BiFundamental` runs the re-index the other way and is the check that the variance +is the right way round: it produces genuine `IsSU2FunAntiFun` families out of the +bi-fundamental families the file already has, and it would fail if the conjugate had been +put on the wrong slot. + +-/ + +/-- The linear map `f` moves the components of the family `T` as the `SU(2)` matrix `U` + moves a tensor with one fundamental and one anti-fundamental isospin index: a factor of + `U` for the first index, a factor of its complex conjugate for the second, with the + summed index in the row slot. -/ +def IsSU2FunAntiFunMat {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, (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(2)` fundamental index and one + anti-fundamental one, transforms as a tensor `T^{a}{}_{b}` under the representation + `repGauge` of the gauge group: an isospin transformation moves the components by the + `SU(2)` element it is built from. As with `IsSU2BiFundamental`, nothing is asked of the + colour or hypercharge factors. -/ +structure IsSU2FunAntiFun (B : Type*) [AddCommMonoid B] [Module ℂ B] + (repGauge : Representation ℂ GaugeGroupI B) + (T : (Fin 2 → Fin 2) → B) : Prop where + repGauge_T : ∀ g : specialUnitaryGroup (Fin 2) ℂ, + IsSU2FunAntiFunMat g (repGauge (1, g, 1)) T + +namespace IsSU2FunAntiFun +set_option linter.unusedVariables false +open IsSU2BiFundamental + +variable {B : Type*} [AddCommGroup B] [Module ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} + {U : specialUnitaryGroup (Fin 2) ℂ} {f : B →ₗ[ℂ] B} + +/-! + +## A.1. The epsilon re-index of the anti-fundamental slot + +-/ + +/-- The family obtained by re-indexing the anti-fundamental slot with the antisymmetric + symbol. This is the change of basis of section E of `IsSU2BiFundamental` applied to the second + index alone, and it is what turns the anti-fundamental law into the bi-fundamental one. -/ +def reindex (T : (Fin 2 → Fin 2) → B) : (Fin 2 → Fin 2) → B := + fun l => ∑ m : Fin 2, epsilon (l 1) m • T ![l 0, m] + +/-- The re-index at a second index `0` picks out the component with second index `1`. -/ +@[simp] lemma reindex_apply_zero (T : (Fin 2 → Fin 2) → B) (p : Fin 2) : + reindex T ![p, 0] = T ![p, 1] := by + simp [reindex, Fin.sum_univ_two] + +/-- The re-index at a second index `1` picks out minus the component with second index + `0`. -/ +@[simp] lemma reindex_apply_one (T : (Fin 2 → Fin 2) → B) (p : Fin 2) : + reindex T ![p, 1] = -T ![p, 0] := by + simp [reindex, Fin.sum_univ_two] + +/-- The re-indexed family obeys the bi-fundamental law. This is the whole content of the + section: the four entry identities of `IsSU2BiFundamental` remove every complex conjugate, + after which the two sides differ by nothing at all. -/ +lemma map_reindex {T : (Fin 2 → Fin 2) → B} (hf : IsSU2FunAntiFunMat U f T) : + IsSU2BiFundamentalMat U f (reindex T) := by + have hl : ∀ a : Fin 2, a = 0 ∨ a = 1 := by decide + have hf' : ∀ k : Fin 2 → Fin 2, f (T k) + = ∑ a : Fin 2 → Fin 2, (U.1 (a 0) (k 0) * conj (U.1 (a 1) (k 1))) • T a := hf + intro l + simp only [reindex, map_add, map_smul, hf', sum_pi_two, Fin.sum_univ_two, + Fin.prod_univ_two, Matrix.cons_val_zero, Matrix.cons_val_one] + rcases hl (l 0) with h0 | h0 <;> rcases hl (l 1) with h1 | h1 <;> rw [h0, h1] <;> + simp only [epsilon_zero_zero, epsilon_zero_one, epsilon_one_zero, epsilon_one_one, + conj_apply_zero_zero, conj_apply_zero_one, conj_apply_one_zero, + conj_apply_one_one] <;> + module + +/-- The re-index of a fundamental and anti-fundamental family is a bi-fundamental family + for the same representation. -/ +lemma isSU2BiFundamental_reindex {T : (Fin 2 → Fin 2) → B} + (hT : IsSU2FunAntiFun B repGauge T) : + IsSU2BiFundamental B repGauge (reindex T) where + repGauge_T g := map_reindex (hT.repGauge_T g) + +/-- The re-index run the other way: the second index of a bi-fundamental family, re-indexed + by the antisymmetric symbol, is an anti-fundamental index. Together with + `map_reindex` this says that the two laws are the same law in two bases, and it is what + exhibits families obeying the anti-fundamental law: any bi-fundamental family gives + one. -/ +lemma map_reindex_of_biFundamental {T : (Fin 2 → Fin 2) → B} + (hf : IsSU2BiFundamentalMat U f T) : + IsSU2FunAntiFunMat U f (reindex T) := by + have hl : ∀ a : Fin 2, a = 0 ∨ a = 1 := by decide + have hf' : ∀ k : Fin 2 → Fin 2, f (T k) + = ∑ a : Fin 2 → Fin 2, (∏ i : Fin 2, U.1 (a i) (k i)) • T a := hf + intro l + simp only [reindex, map_add, map_smul, hf', sum_pi_two, Fin.sum_univ_two, + Fin.prod_univ_two, Matrix.cons_val_zero, Matrix.cons_val_one] + rcases hl (l 0) with h0 | h0 <;> rcases hl (l 1) with h1 | h1 <;> rw [h0, h1] <;> + simp only [epsilon_zero_zero, epsilon_zero_one, epsilon_one_zero, epsilon_one_one, + conj_apply_zero_zero, conj_apply_zero_one, conj_apply_one_zero, + conj_apply_one_one] <;> + module + +/-- Every bi-fundamental family yields a fundamental and anti-fundamental one, by the same + re-index. This is the non-vacuity of the proposition: the products of conjugate Higgs + doublet symbols that obey `IsSU2BiFundamental` obey this law once one of their slots is + re-indexed. -/ +lemma of_isSU2BiFundamental {T : (Fin 2 → Fin 2) → B} + (hT : IsSU2BiFundamental B repGauge T) : + IsSU2FunAntiFun B repGauge (reindex T) where + repGauge_T g := map_reindex_of_biFundamental (hT.repGauge_T g) + +/-- Every component of the original family lies in the span of the re-indexed one, the + re-index being invertible. -/ +lemma self_mem_span_reindex (T : (Fin 2 → Fin 2) → B) (d : Fin 2 → Fin 2) : + T d ∈ span (reindex T) := by + have hl : ∀ a : Fin 2, a = 0 ∨ a = 1 := by decide + have hd : T d = T ![d 0, d 1] := by rw [← eq_cons] + rw [hd] + rcases hl (d 1) with h1 | h1 <;> rw [h1] + · rw [show T ![d 0, (0 : Fin 2)] = -reindex T ![d 0, 1] from by + rw [reindex_apply_one, neg_neg]] + exact neg_mem (mem_span _) + · rw [← reindex_apply_zero T (d 0)] + exact mem_span _ + +/-- The re-index does not change the span of the components, being invertible. This is what + lets every conclusion below be stated with the span of the original family. -/ +lemma span_reindex (T : (Fin 2 → Fin 2) → B) : span (reindex T) = span T := by + refine le_antisymm (iSup_le fun d => ?_) (iSup_le fun d => ?_) + · rw [Submodule.span_singleton_le_iff_mem, reindex] + exact sum_mem fun m _ => Submodule.smul_mem _ _ (mem_span _) + · rw [Submodule.span_singleton_le_iff_mem] + exact self_mem_span_reindex T d + +/-! + +## A.2. The delta contraction + +-/ + +/-- The delta contraction of a family carrying one fundamental and one anti-fundamental + isospin index: the trace, which is the only invariant `2 ⊗ 2̄` admits. -/ +def deltaContraction (T : (Fin 2 → Fin 2) → B) : B := T ![0, 0] + T ![1, 1] + +/-- The delta contraction lies in the span of the components. -/ +lemma deltaContraction_mem_span (T : (Fin 2 → Fin 2) → B) : + deltaContraction T ∈ span T := by + rw [deltaContraction] + exact add_mem (mem_span _) (mem_span _) + +/-- The epsilon contraction of the re-indexed family is minus the delta contraction of the + original one. This is the sign the re-index introduces, and it is stated here rather than + hidden in the definitions: the re-index sends the pair `(0, 1)` to `-T ![0,0]` and the + pair `(1, 0)` to `T ![1,1]`, and the antisymmetric combination of those is minus the + trace. -/ +lemma epsilonContraction_reindex (T : (Fin 2 → Fin 2) → B) : + epsilonContraction (reindex T) = -deltaContraction T := by + rw [epsilonContraction, reindex_apply_zero, reindex_apply_one, deltaContraction] + abel + +/-- The delta contraction is fixed by any linear map moving the components by an element of + `SU(2)`. It is the epsilon contraction of the re-indexed family up to sign, and that is + fixed by `IsSU2BiFundamental.map_epsilonContraction`. -/ +lemma map_deltaContraction {T : (Fin 2 → Fin 2) → B} (hf : IsSU2FunAntiFunMat U f T) : + f (deltaContraction T) = deltaContraction T := by + have h := map_epsilonContraction (map_reindex hf) + rw [epsilonContraction_reindex, map_neg, neg_inj] at h + exact h + +/-- The delta contraction of a family with one fundamental and one anti-fundamental index + is fixed by the isospin factor. That is all the transformation law constrains, the colour + and hypercharge factors being free to move it. -/ +lemma repGauge_deltaContraction {T : (Fin 2 → Fin 2) → B} + (hT : IsSU2FunAntiFun B repGauge T) (V : specialUnitaryGroup (Fin 2) ℂ) : + repGauge (1, V, 1) (deltaContraction T) = deltaContraction T := + map_deltaContraction (hT.repGauge_T V) + +/-! + +## A.3. The classification + +-/ + +/-- Every isospin invariant in the span of the components is a multiple of the delta + contraction. This is the classification of `IsSU2BiFundamental`, read through the re-index + and the sign it carries, and it asks for no algebra structure on `B`, the square-zero + extension having removed that. -/ +lemma exists_smul_deltaContraction_of_su2_invariant {T : (Fin 2 → Fin 2) → B} + (hT : IsSU2FunAntiFun B repGauge T) {x : B} (hx : x ∈ span T) + (hinv : ∀ V : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, V, 1) x = x) : + ∃ c : ℂ, x = c • deltaContraction T := by + obtain ⟨c, hc⟩ := + hT.isSU2BiFundamental_reindex.exists_smul_epsilonContraction_of_su2_invariant_module + (by rw [span_reindex]; exact hx) hinv + refine ⟨-c, ?_⟩ + rw [hc, epsilonContraction_reindex, smul_neg, neg_smul] + +/-- Every gauge invariant in the span of the components is a multiple of the delta + contraction, a gauge invariant being in particular fixed by the isospin factor. -/ +lemma exists_smul_deltaContraction_of_invariant {T : (Fin 2 → Fin 2) → B} + (hT : IsSU2FunAntiFun B repGauge T) {x : B} (hx : x ∈ span T) + (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : + ∃ c : ℂ, x = c • deltaContraction T := + hT.exists_smul_deltaContraction_of_su2_invariant hx fun V => hinv (1, V, 1) + +/-- The isospin invariants in the span of the components are exactly the multiples of the + delta contraction. This is the one singlet of `2 ⊗ 2̄`. -/ +lemma mem_span_and_su2_invariant_iff {T : (Fin 2 → Fin 2) → B} + (hT : IsSU2FunAntiFun B repGauge T) (x : B) : + (x ∈ span T ∧ ∀ V : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, V, 1) x = x) + ↔ x ∈ ℂ ∙ deltaContraction T := by + refine ⟨fun h => ?_, fun hx => ?_⟩ + · obtain ⟨c, rfl⟩ := hT.exists_smul_deltaContraction_of_su2_invariant 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 _ _ (deltaContraction_mem_span T), + fun V => by rw [map_smul, repGauge_deltaContraction hT]⟩ + +/-- The gauge invariants in the span of the components are exactly the multiples of the + delta contraction, once the delta contraction is known to be gauge invariant. That + hypothesis cannot be dropped, for the reason given at + `IsSU2BiFundamental.mem_span_and_invariant_iff`: the transformation law says nothing about + the colour and hypercharge factors, and the hypercharge factor by itself can scale the + contraction. -/ +lemma mem_span_and_invariant_iff {T : (Fin 2 → Fin 2) → B} + (hT : IsSU2FunAntiFun B repGauge T) (x : B) + (hdc : ∀ g : GaugeGroupI, + repGauge g (deltaContraction T) = deltaContraction T) : + (x ∈ span T ∧ ∀ g : GaugeGroupI, repGauge g x = x) + ↔ x ∈ ℂ ∙ deltaContraction T := by + refine ⟨fun h => ?_, fun hx => ?_⟩ + · obtain ⟨c, rfl⟩ := hT.exists_smul_deltaContraction_of_invariant 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 _ _ (deltaContraction_mem_span T), + fun g => by rw [map_smul, hdc]⟩ + +/-- The isospin invariants of the span of the components together with an isospin-stable + submodule `S`: such an element is a multiple of the delta contraction up to an error in + `S`, and the error is fixed by the isospin factor too. This is the form in which one + family at a time is peeled off a join. -/ +lemma mem_span_sup_su2_invariant_iff {T : (Fin 2 → Fin 2) → B} + (hT : IsSU2FunAntiFun B repGauge T) (x : B) (S : Submodule ℂ B) + (hS : ∀ V : specialUnitaryGroup (Fin 2) ℂ, ∀ y ∈ S, repGauge (1, V, 1) y ∈ S) + (hx : x ∈ span T ⊔ S) + (hinv : ∀ V : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, V, 1) x = x) : + ∃ c : ℂ, ∃ y ∈ S, x = c • deltaContraction T + y + ∧ ∀ V : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, V, 1) y = y := by + obtain ⟨c, y, hyS, hxy, hyinv⟩ := + hT.isSU2BiFundamental_reindex.mem_span_sup_su2_invariant_iff x S hS + (by rw [span_reindex]; exact hx) hinv + refine ⟨-c, y, hyS, ?_, hyinv⟩ + rw [hxy, epsilonContraction_reindex, smul_neg, neg_smul] + +/-- The same modulo a gauge-stable submodule, which needs the gauge invariance of the delta + contraction for the error term to be a gauge invariant rather than merely an isospin + one. -/ +lemma mem_span_sup_invariant_iff {T : (Fin 2 → Fin 2) → B} + (hT : IsSU2FunAntiFun B repGauge T) (x : B) (S : Submodule ℂ B) + (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, repGauge g y ∈ S) + (hdc : ∀ g : GaugeGroupI, + repGauge g (deltaContraction T) = deltaContraction T) + (hx : x ∈ span T ⊔ S) + (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : + ∃ c : ℂ, ∃ y ∈ S, x = c • deltaContraction T + y + ∧ ∀ g : GaugeGroupI, repGauge g y = y := by + obtain ⟨c, y, hyS, hxy, hyinv⟩ := + hT.isSU2BiFundamental_reindex.mem_span_sup_invariant_iff x S hS + (fun g => by rw [epsilonContraction_reindex, map_neg, hdc g]) + (by rw [span_reindex]; exact hx) hinv + refine ⟨-c, y, hyS, ?_, hyinv⟩ + rw [hxy, epsilonContraction_reindex, smul_neg, neg_smul] + +end IsSU2FunAntiFun + +/-! + +## B. Two anti-fundamental isospin indices + +The up-type Yukawa `ε H Q ū` carries both of its doublet indices in the anti-fundamental, +so its isospin content is `2̄ ⊗ 2̄`. `IsSU2BiAntiFun` records that law, a factor of `conj U` +per index, and again only for the isospin transformation `(1, U, 1)`. It is the law obeyed +by `fun l => h.higgs d (l 0) * h.higgs d (l 1)` for `h : IsHiggsSector`, once the +hypercharge character is set aside; the corresponding product of two conjugate Higgs +symbols, `h.barHiggs`, obeys `IsSU2BiFundamental` instead. + +The re-index of section E of `IsSU2BiFundamental` is applied to both slots at once, and +this time it costs nothing +at all: `epsilonContraction (reindex T)` is `epsilonContraction T` on the nose, the two +signs the re-index puts on the mixed components cancelling in their antisymmetric +combination. So the invariant of `2̄ ⊗ 2̄` is the same epsilon contraction as that of +`2 ⊗ 2`, and every conclusion of `IsSU2BiFundamental` transfers with no factor to keep +track of. +As with the re-index of one slot, the map is invertible, so the span is unchanged, and the +conclusions are stated with the span of the original family. `of_isSU2BiFundamental` again +runs the re-index the other way, which exhibits families obeying the law and checks that +the conjugates sit on the slots they should. + +-/ + +/-- The linear map `f` moves the components of the family `T` as the `SU(2)` matrix `U` + moves a tensor with two anti-fundamental isospin indices: one factor of the complex + conjugate of `U` per index, with the summed index in the row slot. -/ +def IsSU2BiAntiFunMat {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, + (conj (U.1 (a 0) (l 0)) * conj (U.1 (a 1) (l 1))) • T a + +/-- A family `T` of elements of `B`, indexed by two `su(2)` anti-fundamental indices, + transforms as a tensor `T_{a₁ a₂}` under the representation `repGauge` of the gauge + group: an isospin transformation moves the components by the conjugate of the `SU(2)` + element it is built from. Nothing is asked of the colour or hypercharge factors. -/ +structure IsSU2BiAntiFun (B : Type*) [AddCommMonoid B] [Module ℂ B] + (repGauge : Representation ℂ GaugeGroupI B) + (T : (Fin 2 → Fin 2) → B) : Prop where + repGauge_T : ∀ g : specialUnitaryGroup (Fin 2) ℂ, + IsSU2BiAntiFunMat g (repGauge (1, g, 1)) T + +namespace IsSU2BiAntiFun +set_option linter.unusedVariables false +open IsSU2BiFundamental + +variable {B : Type*} [AddCommGroup B] [Module ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} + {U : specialUnitaryGroup (Fin 2) ℂ} {f : B →ₗ[ℂ] B} + +/-! + +## B.1. The epsilon re-index of both slots + +-/ + +/-- The family obtained by re-indexing both slots with the antisymmetric symbol: the change + of basis of section E of `IsSU2BiFundamental` applied to each index in turn. -/ +def reindex (T : (Fin 2 → Fin 2) → B) : (Fin 2 → Fin 2) → B := + fun l => ∑ m : Fin 2, ∑ n : Fin 2, (epsilon (l 0) m * epsilon (l 1) n) • T ![m, n] + +/-- The re-index exchanges the two like components. -/ +@[simp] lemma reindex_zero_zero (T : (Fin 2 → Fin 2) → B) : + reindex T ![0, 0] = T ![1, 1] := by + simp [reindex, Fin.sum_univ_two] + +/-- The re-index exchanges the two mixed components and negates them. -/ +@[simp] lemma reindex_zero_one (T : (Fin 2 → Fin 2) → B) : + reindex T ![0, 1] = -T ![1, 0] := by + simp [reindex, Fin.sum_univ_two] + +/-- The re-index exchanges the two mixed components and negates them. -/ +@[simp] lemma reindex_one_zero (T : (Fin 2 → Fin 2) → B) : + reindex T ![1, 0] = -T ![0, 1] := by + simp [reindex, Fin.sum_univ_two] + +/-- The re-index exchanges the two like components. -/ +@[simp] lemma reindex_one_one (T : (Fin 2 → Fin 2) → B) : + reindex T ![1, 1] = T ![0, 0] := by + simp [reindex, Fin.sum_univ_two] + +/-- The re-indexed family obeys the bi-fundamental law: the four entry identities of + `IsSU2BiFundamental` remove both complex conjugates, leaving the two sides identical. -/ +lemma map_reindex {T : (Fin 2 → Fin 2) → B} (hf : IsSU2BiAntiFunMat U f T) : + IsSU2BiFundamentalMat U f (reindex T) := by + have hl : ∀ a : Fin 2, a = 0 ∨ a = 1 := by decide + have hf' : ∀ k : Fin 2 → Fin 2, f (T k) + = ∑ a : Fin 2 → Fin 2, + (conj (U.1 (a 0) (k 0)) * conj (U.1 (a 1) (k 1))) • T a := hf + intro l + simp only [reindex, map_add, map_smul, hf', sum_pi_two, Fin.sum_univ_two, + Fin.prod_univ_two, Matrix.cons_val_zero, Matrix.cons_val_one] + rcases hl (l 0) with h0 | h0 <;> rcases hl (l 1) with h1 | h1 <;> rw [h0, h1] <;> + simp only [epsilon_zero_zero, epsilon_zero_one, epsilon_one_zero, epsilon_one_one, + conj_apply_zero_zero, conj_apply_zero_one, conj_apply_one_zero, + conj_apply_one_one] <;> + module + +/-- The re-index of a family with two anti-fundamental indices is a bi-fundamental family + for the same representation. -/ +lemma isSU2BiFundamental_reindex {T : (Fin 2 → Fin 2) → B} + (hT : IsSU2BiAntiFun B repGauge T) : + IsSU2BiFundamental B repGauge (reindex T) where + repGauge_T g := map_reindex (hT.repGauge_T g) + +/-- The re-index run the other way: both indices of a bi-fundamental family, re-indexed by + the antisymmetric symbol, are anti-fundamental. -/ +lemma map_reindex_of_biFundamental {T : (Fin 2 → Fin 2) → B} + (hf : IsSU2BiFundamentalMat U f T) : + IsSU2BiAntiFunMat U f (reindex T) := by + have hl : ∀ a : Fin 2, a = 0 ∨ a = 1 := by decide + have hf' : ∀ k : Fin 2 → Fin 2, f (T k) + = ∑ a : Fin 2 → Fin 2, (∏ i : Fin 2, U.1 (a i) (k i)) • T a := hf + intro l + simp only [reindex, map_add, map_smul, hf', sum_pi_two, Fin.sum_univ_two, + Fin.prod_univ_two, Matrix.cons_val_zero, Matrix.cons_val_one] + rcases hl (l 0) with h0 | h0 <;> rcases hl (l 1) with h1 | h1 <;> rw [h0, h1] <;> + simp only [epsilon_zero_zero, epsilon_zero_one, epsilon_one_zero, epsilon_one_one, + conj_apply_zero_zero, conj_apply_zero_one, conj_apply_one_zero, + conj_apply_one_one] <;> + module + +/-- Every bi-fundamental family yields one with two anti-fundamental indices, by the same + re-index. This is the non-vacuity of the proposition. -/ +lemma of_isSU2BiFundamental {T : (Fin 2 → Fin 2) → B} + (hT : IsSU2BiFundamental B repGauge T) : + IsSU2BiAntiFun B repGauge (reindex T) where + repGauge_T g := map_reindex_of_biFundamental (hT.repGauge_T g) + +/-- Every component of the original family lies in the span of the re-indexed one, the + re-index being an involution up to signs. -/ +lemma self_mem_span_reindex (T : (Fin 2 → Fin 2) → B) (d : Fin 2 → Fin 2) : + T d ∈ span (reindex T) := by + have hl : ∀ a : Fin 2, a = 0 ∨ a = 1 := by decide + have hd : T d = T ![d 0, d 1] := by rw [← eq_cons] + rw [hd] + rcases hl (d 0) with h0 | h0 <;> rcases hl (d 1) with h1 | h1 <;> rw [h0, h1] + · rw [← reindex_one_one T] + exact mem_span _ + · rw [show T ![(0 : Fin 2), 1] = -reindex T ![1, 0] from by + rw [reindex_one_zero, neg_neg]] + exact neg_mem (mem_span _) + · rw [show T ![(1 : Fin 2), 0] = -reindex T ![0, 1] from by + rw [reindex_zero_one, neg_neg]] + exact neg_mem (mem_span _) + · rw [← reindex_zero_zero T] + exact mem_span _ + +/-- The re-index does not change the span of the components. -/ +lemma span_reindex (T : (Fin 2 → Fin 2) → B) : span (reindex T) = span T := by + refine le_antisymm (iSup_le fun d => ?_) (iSup_le fun d => ?_) + · rw [Submodule.span_singleton_le_iff_mem, reindex] + exact sum_mem fun m _ => sum_mem fun n _ => Submodule.smul_mem _ _ (mem_span _) + · rw [Submodule.span_singleton_le_iff_mem] + exact self_mem_span_reindex T d + +/-! + +## B.2. The epsilon contraction + +-/ + +/-- The re-index leaves the epsilon contraction alone: it exchanges the two mixed + components and negates each, and the two signs cancel in their antisymmetric combination. + So the invariant of `2̄ ⊗ 2̄` is the very `IsSU2BiFundamental.epsilonContraction`, with no + sign and no scalar to carry. -/ +lemma epsilonContraction_reindex (T : (Fin 2 → Fin 2) → B) : + epsilonContraction (reindex T) = epsilonContraction T := by + rw [epsilonContraction, reindex_zero_one, reindex_one_zero, epsilonContraction] + abel + +/-- The epsilon contraction is fixed by any linear map moving the components by an element + of `SU(2)` in the anti-fundamental. -/ +lemma map_epsilonContraction {T : (Fin 2 → Fin 2) → B} (hf : IsSU2BiAntiFunMat U f T) : + f (epsilonContraction T) = epsilonContraction T := by + have h := IsSU2BiFundamental.map_epsilonContraction (map_reindex hf) + rwa [epsilonContraction_reindex] at h + +/-- The epsilon contraction of a family with two anti-fundamental indices is fixed by the + isospin factor, which is all the transformation law constrains. -/ +lemma repGauge_epsilonContraction {T : (Fin 2 → Fin 2) → B} + (hT : IsSU2BiAntiFun B repGauge T) (V : specialUnitaryGroup (Fin 2) ℂ) : + repGauge (1, V, 1) (epsilonContraction T) = epsilonContraction T := + map_epsilonContraction (hT.repGauge_T V) + +/-! + +## B.3. The classification + +-/ + +/-- Every isospin invariant in the span of the components is a multiple of the epsilon + contraction. This is the classification of `IsSU2BiFundamental` read through the re-index, + which this time contributes nothing at all. -/ +lemma exists_smul_epsilonContraction_of_su2_invariant {T : (Fin 2 → Fin 2) → B} + (hT : IsSU2BiAntiFun B repGauge T) {x : B} (hx : x ∈ span T) + (hinv : ∀ V : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, V, 1) x = x) : + ∃ c : ℂ, x = c • epsilonContraction T := by + obtain ⟨c, hc⟩ := + hT.isSU2BiFundamental_reindex.exists_smul_epsilonContraction_of_su2_invariant_module + (by rw [span_reindex]; exact hx) hinv + exact ⟨c, by rw [hc, epsilonContraction_reindex]⟩ + +/-- Every gauge invariant in the span of the components is a multiple of the epsilon + contraction. -/ +lemma exists_smul_epsilonContraction_of_invariant {T : (Fin 2 → Fin 2) → B} + (hT : IsSU2BiAntiFun B repGauge T) {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 hx fun V => hinv (1, V, 1) + +/-- The isospin invariants in the span of the components are exactly the multiples of the + epsilon contraction. This is the one singlet of `2̄ ⊗ 2̄`. -/ +lemma mem_span_and_su2_invariant_iff {T : (Fin 2 → Fin 2) → B} + (hT : IsSU2BiAntiFun B repGauge T) (x : B) : + (x ∈ span T ∧ ∀ V : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, V, 1) x = x) + ↔ x ∈ ℂ ∙ epsilonContraction T := by + refine ⟨fun h => ?_, fun hx => ?_⟩ + · obtain ⟨c, rfl⟩ := hT.exists_smul_epsilonContraction_of_su2_invariant 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 V => 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. The + hypothesis cannot be dropped: the transformation law leaves the colour and hypercharge + factors free, and the hypercharge factor by itself can scale the contraction. -/ +lemma mem_span_and_invariant_iff {T : (Fin 2 → Fin 2) → B} + (hT : IsSU2BiAntiFun B repGauge T) (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 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]⟩ + +/-- The isospin invariants of the span of the components together with an isospin-stable + submodule `S`: such an element is a multiple of the epsilon contraction up to an error in + `S`, and the error is fixed by the isospin factor too. -/ +lemma mem_span_sup_su2_invariant_iff {T : (Fin 2 → Fin 2) → B} + (hT : IsSU2BiAntiFun B repGauge T) (x : B) (S : Submodule ℂ B) + (hS : ∀ V : specialUnitaryGroup (Fin 2) ℂ, ∀ y ∈ S, repGauge (1, V, 1) y ∈ S) + (hx : x ∈ span T ⊔ S) + (hinv : ∀ V : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, V, 1) x = x) : + ∃ c : ℂ, ∃ y ∈ S, x = c • epsilonContraction T + y + ∧ ∀ V : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, V, 1) y = y := by + obtain ⟨c, y, hyS, hxy, hyinv⟩ := + hT.isSU2BiFundamental_reindex.mem_span_sup_su2_invariant_iff x S hS + (by rw [span_reindex]; exact hx) hinv + exact ⟨c, y, hyS, by rw [hxy, epsilonContraction_reindex], hyinv⟩ + +/-- The same modulo a gauge-stable submodule, which needs the gauge invariance of the + epsilon contraction for the error term to be a gauge invariant rather than merely an + isospin one. -/ +lemma mem_span_sup_invariant_iff {T : (Fin 2 → Fin 2) → B} + (hT : IsSU2BiAntiFun B repGauge T) (x : B) (S : Submodule ℂ B) + (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, repGauge g y ∈ S) + (hec : ∀ g : GaugeGroupI, + repGauge g (epsilonContraction T) = epsilonContraction T) + (hx : x ∈ span T ⊔ S) + (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : + ∃ c : ℂ, ∃ y ∈ S, x = c • epsilonContraction T + y + ∧ ∀ g : GaugeGroupI, repGauge g y = y := by + obtain ⟨c, y, hyS, hxy, hyinv⟩ := + hT.isSU2BiFundamental_reindex.mem_span_sup_invariant_iff x S hS + (fun g => by rw [epsilonContraction_reindex, hec g]) + (by rw [span_reindex]; exact hx) hinv + exact ⟨c, y, hyS, by rw [hxy, epsilonContraction_reindex], hyinv⟩ + +end IsSU2BiAntiFun + +end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiFundamental.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiFundamental.lean index df3df28d8..7917ecf6e 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiFundamental.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiFundamental.lean @@ -59,13 +59,27 @@ weight decomposition of the span, for the isospin part of the representation. Se 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 isospin invariants. + +The rest of the file is what the Yukawa sector asks for on top of that. Section E verifies +the two matrix identities that make the anti-fundamental of `SU(2)` the fundamental in +another basis, `conj U = ε U ε⁻¹` and `(U⁻¹)ᵀ = conj U`; `SU(3)` has no analogue, which is +why the colour side needs a separate `IsSU3FunAntiFun` and the isospin side does not. +Section F carries the classification to a family valued in a mere module, through the +square-zero extension, and section G divides out a stable submodule, which together are +what let one family at a time be peeled off a join. + +The two twisted cases, `2 ⊗ 2̄` and `2̄ ⊗ 2̄`, are not here: they are `IsSU2FunAntiFun` and +`IsSU2BiAntiFun` of `IsSU2AntiFundamental`, which imports this file for section E. Neither +needs a classification of its own, the epsilon re-index turning each into a bi-fundamental +family with the same span, so all that is left there is the bookkeeping of which contraction +of the original family the epsilon contraction of the re-indexed one is. -/ @[expose] public section namespace StandardModel -open Matrix +open Matrix ComplexConjugate /-! @@ -849,6 +863,300 @@ lemma su2_invariant_iff_invariant (hT : IsSU2BiFundamental B repGauge T) end Grading +/-! + +## E. The anti-fundamental of `SU(2)` is the fundamental in another basis + +Everything after this section rests on a single fact about `SU(2)` which has no analogue in +`SU(3)`: the anti-fundamental representation is the fundamental one in a different basis, +the change of basis being the antisymmetric symbol. Concretely, `conj U = ε U ε⁻¹` for +every `U` in `SU(2)`, and `(U⁻¹)ᵀ = conj U` because `U` is unitary. The first identity is +what makes the doublet pseudo-real; the second is the same statement read for the +transposed inverse, which is the matrix an anti-fundamental index is moved by. + +Both come from one computation. An `SU(2)` matrix has determinant one, so its adjugate is +its inverse, and it is unitary, so its inverse is its conjugate transpose; hence its +conjugate transpose is its adjugate, which for a two by two matrix is an explicit +rearrangement of the entries. That gives the four entry identities `conj U₀₀ = U₁₁`, +`conj U₁₁ = U₀₀`, `conj U₀₁ = -U₁₀` and `conj U₁₀ = -U₀₁`, and the two matrix identities +are those four read together. Everything else in this file's later sections is bookkeeping +around them: sections H and I never touch a complex conjugate again, because the entry +identities have already removed every one of them. + +`eq_cons` is a small utility of the same section, used whenever an index pair has to be +split into its two entries so that a computation can be done on concrete indices. + +-/ + +/-- An index pair is the pair of its own two entries. This is the step that turns a + statement about a general pair of `su(2)` indices into four statements about concrete + ones. -/ +lemma eq_cons (d : Fin 2 → Fin 2) : d = ![d 0, d 1] := + funext fun j => by fin_cases j <;> simp + +/-- The antisymmetric symbol as a matrix: the change of basis carrying the fundamental + representation of `SU(2)` to its conjugate. -/ +def epsilonMat : Matrix (Fin 2) (Fin 2) ℂ := !![0, 1; -1, 0] + +/-- The conjugate transpose of an `SU(2)` matrix is its adjugate: the determinant being + one, the adjugate is the inverse, and unitarity makes the conjugate transpose the + inverse as well. -/ +lemma star_eq_adjugate (U : specialUnitaryGroup (Fin 2) ℂ) : + star U.1 = Matrix.adjugate U.1 := by + have hmem := Matrix.mem_specialUnitaryGroup_iff.mp U.2 + have hu : star U.1 * U.1 = 1 := Matrix.mem_unitaryGroup_iff'.mp hmem.1 + calc star U.1 = star U.1 * (U.1 * Matrix.adjugate U.1) := by + rw [Matrix.mul_adjugate, hmem.2, one_smul, mul_one] + _ = star U.1 * U.1 * Matrix.adjugate U.1 := by rw [mul_assoc] + _ = Matrix.adjugate U.1 := by rw [hu, one_mul] + +/-- The conjugate of an entry of an `SU(2)` matrix is the transposed entry of its + adjugate. -/ +lemma conj_apply (U : specialUnitaryGroup (Fin 2) ℂ) (i j : Fin 2) : + conj (U.1 i j) = Matrix.adjugate U.1 j i := by + have := congrFun (congrFun (star_eq_adjugate U) j) i + simpa [Matrix.star_apply] using this + +/-- Conjugating the upper left entry of an `SU(2)` matrix gives the lower right one. -/ +@[simp] lemma conj_apply_zero_zero (U : specialUnitaryGroup (Fin 2) ℂ) : + conj (U.1 0 0) = U.1 1 1 := by + rw [conj_apply, Matrix.adjugate_fin_two] + simp + +/-- Conjugating the lower right entry of an `SU(2)` matrix gives the upper left one. -/ +@[simp] lemma conj_apply_one_one (U : specialUnitaryGroup (Fin 2) ℂ) : + conj (U.1 1 1) = U.1 0 0 := by + rw [conj_apply, Matrix.adjugate_fin_two] + simp + +/-- Conjugating the upper right entry of an `SU(2)` matrix gives minus the lower left + one. -/ +@[simp] lemma conj_apply_zero_one (U : specialUnitaryGroup (Fin 2) ℂ) : + conj (U.1 0 1) = -U.1 1 0 := by + rw [conj_apply, Matrix.adjugate_fin_two] + simp + +/-- Conjugating the lower left entry of an `SU(2)` matrix gives minus the upper right + one. -/ +@[simp] lemma conj_apply_one_zero (U : specialUnitaryGroup (Fin 2) ℂ) : + conj (U.1 1 0) = -U.1 0 1 := by + rw [conj_apply, Matrix.adjugate_fin_two] + simp + +/-- The inverse of the antisymmetric symbol, which is minus itself. -/ +lemma epsilonMat_inv : epsilonMat⁻¹ = !![0, -1; 1, 0] := by + apply Matrix.inv_eq_right_inv + ext i j + fin_cases i <;> fin_cases j <;> simp [epsilonMat, Matrix.mul_apply, Fin.sum_univ_two] + +/-- The first of the two identities the rest of the file rests on: conjugation of an + `SU(2)` matrix is conjugation by the antisymmetric symbol. This is the pseudo-reality of + the doublet, and it is what `SU(3)` lacks; without it the fundamental and the + anti-fundamental would be inequivalent and each would need its own classification. -/ +lemma map_conj_eq (U : specialUnitaryGroup (Fin 2) ℂ) : + U.1.map conj = epsilonMat * U.1 * epsilonMat⁻¹ := by + rw [epsilonMat_inv] + ext i j + fin_cases i <;> fin_cases j <;> + simp [epsilonMat, Matrix.mul_apply, Matrix.vecMul, Matrix.vecHead, Matrix.vecTail, + Fin.sum_univ_two] + +/-- The second of the two identities: the matrix moving an anti-fundamental index, the + transposed inverse, is the complex conjugate matrix. This is unitarity alone, the inverse + of a unitary matrix being its conjugate transpose. -/ +lemma transpose_inv_eq (U : specialUnitaryGroup (Fin 2) ℂ) : + (U.1⁻¹)ᵀ = U.1.map conj := by + have hu : U.1 * star U.1 = 1 := Matrix.mem_unitaryGroup_iff.mp + (Matrix.mem_specialUnitaryGroup_iff.mp U.2).1 + rw [Matrix.inv_eq_right_inv hu] + ext i j + simp [Matrix.star_apply] + +/-! + +## F. The classification for a family valued in a module + +Downstream a bi-fundamental family is met inside a module that is not an algebra, and the +classification of section D cannot be read there: `GaugeWeightDecomposition` lives in an +algebra and `IsMulRep` is a statement about a product. The square-zero extension supplies +both for free. Adjoining `ℂ` to the module with a zero product makes an algebra whose +representation is multiplicative for the cheapest of reasons, the product being built from +the module structure the representation is already linear for, and the injection of the +module is injective, so a conclusion proved upstairs comes straight back down. + +The extension itself is not rebuilt here. `IsSU2BiAdjoint` declares `sqZeroRep` and its +companions for an arbitrary representation of the gauge group, with no reference to a +bi-adjoint family, and this file imports that one already; only the statements that mention +a bi-fundamental family are new. What is gained is that +`exists_smul_epsilonContraction_of_invariant_module` asks for `[AddCommGroup B]` and +`[Module ℂ B]` and nothing else, no algebra structure and no multiplicativity hypothesis. + +-/ + +section SquareZero + +variable {M : Type*} [AddCommGroup M] [Module ℂ M] + {ρ : Representation ℂ GaugeGroupI M} {T : (Fin 2 → Fin 2) → M} + +-- The opposite scalar action and its two compatibilities, which make the square-zero +-- extension of a complex vector space a ring. They are the instances `IsSU2BiAdjoint` +-- states its square-zero lemmas with, and are borrowed rather than restated so that the +-- instances here and there are literally the same. +attribute [local instance 100] IsSU2BiAdjoint.opModule + IsSU2BiAdjoint.smulCommClassOpModule IsSU2BiAdjoint.isCentralScalarOpModule + +/-- The images of the components in the square-zero extension again form a bi-fundamental + family, the extended representation acting on them by the representation extended. -/ +lemma isSU2BiFundamental_sqZeroRep (hT : IsSU2BiFundamental M ρ T) : + IsSU2BiFundamental (TrivSqZeroExt ℂ M) (IsSU2BiAdjoint.sqZeroRep ρ) + fun l => TrivSqZeroExt.inr (T l) where + repGauge_T g l := by + rw [IsSU2BiAdjoint.sqZeroRep_inr, hT.repGauge_T g l] + simp only [TrivSqZeroExt.inr_sum, TrivSqZeroExt.inr_smul] + +omit [Module ℂ M] in +/-- The epsilon contraction of the images is the image of the epsilon contraction. -/ +lemma epsilonContraction_inr (T : (Fin 2 → Fin 2) → M) : + epsilonContraction (fun l => (TrivSqZeroExt.inr (T l) : TrivSqZeroExt ℂ M)) + = TrivSqZeroExt.inr (epsilonContraction T) := by + simp only [epsilonContraction, ← TrivSqZeroExt.inr_sub] + +/-- The image of an element of the span lies in the span of the images. -/ +lemma inr_mem_span_sqZeroRep (T : (Fin 2 → Fin 2) → M) {x : M} (hx : x ∈ span T) : + (TrivSqZeroExt.inr x : TrivSqZeroExt ℂ M) + ∈ span fun l => (TrivSqZeroExt.inr (T l) : TrivSqZeroExt ℂ M) := by + obtain ⟨c, rfl⟩ := (mem_span_iff x).1 hx + refine (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 epsilon + 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_epsilonContraction_of_invariant_module (hT : IsSU2BiFundamental M ρ T) + {x : M} (hx : x ∈ span T) (hinv : ∀ g : GaugeGroupI, ρ g x = x) : + ∃ c : ℂ, x = c • epsilonContraction T := by + obtain ⟨c, hc⟩ := + hT.isSU2BiFundamental_sqZeroRep.exists_smul_epsilonContraction_of_invariant + (IsSU2BiAdjoint.isMulRep_sqZeroRep ρ) (inr_mem_span_sqZeroRep T hx) + (fun g => by rw [IsSU2BiAdjoint.sqZeroRep_inr, hinv g]) + refine ⟨c, TrivSqZeroExt.inr_injective (R := ℂ) ?_⟩ + rw [hc, epsilonContraction_inr, TrivSqZeroExt.inr_smul] + +/-- The same classification for a family valued in a mere module, read at the isospin + factor alone, which is all the transformation law constrains. -/ +lemma exists_smul_epsilonContraction_of_su2_invariant_module + (hT : IsSU2BiFundamental M ρ T) {x : M} (hx : x ∈ span T) + (hinv : ∀ V : specialUnitaryGroup (Fin 2) ℂ, ρ (1, V, 1) x = x) : + ∃ c : ℂ, x = c • epsilonContraction T := + hT.toRepSU2.exists_smul_epsilonContraction_of_invariant_module hx + ((repSU2_invariant_iff_su2 ρ x).2 hinv) + +end SquareZero + +/-! + +## G. The invariants modulo a stable submodule + +Peeling one family at a time off a join needs the invariants of the span of that family +together with everything not yet peeled, gathered in a submodule `S`. A stable submodule +can be divided out: the images of the components in the quotient again form a +bi-fundamental family, so section F applies verbatim there and lifts to a classification +modulo `S`. The error term is invariant for free, being the difference of two invariants. + +Stability of `S` cannot be dropped. For an unstable line `ℂ ∙ v` the only invariant of the +line is zero, while an invariant of the sum may well lie outside the span, so the statement +would be false without it. As in section F the quotient representation is the one +`IsSU2BiAdjoint` already declares, and only the statements mentioning a bi-fundamental +family are new. + +`mem_span_sup_su2_invariant_iff` is the isospin form, stable and invariant meaning under +`repGauge (1, V, 1)` throughout, and it is the form the transformation law supports. +`mem_span_sup_invariant_iff`, the gauge form, asks in addition that the epsilon 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} {T : (Fin 2 → Fin 2) → M} + +/-- The images of the components in the quotient by a gauge-stable submodule again form a + bi-fundamental family. -/ +lemma isSU2BiFundamental_quotRep (hT : IsSU2BiFundamental M ρ T) (S : Submodule ℂ M) + (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, ρ g y ∈ S) : + IsSU2BiFundamental (M ⧸ S) (IsSU2BiAdjoint.quotRep ρ S hS) fun l => S.mkQ (T l) where + repGauge_T g l := by + rw [IsSU2BiAdjoint.quotRep_mkQ, hT.repGauge_T g l, map_sum] + exact Finset.sum_congr rfl fun a _ => map_smul _ _ _ + +/-- The quotient map carries the epsilon contraction to the epsilon contraction of the + images. -/ +lemma mkQ_epsilonContraction (T : (Fin 2 → Fin 2) → M) (S : Submodule ℂ M) : + S.mkQ (epsilonContraction T) = epsilonContraction fun l => S.mkQ (T l) := by + simp only [epsilonContraction, map_sub] + +/-- The image of an element of the join of the span with a submodule lies in the span of + the images, the submodule dying in the quotient. -/ +lemma mkQ_mem_span_quotRep (T : (Fin 2 → Fin 2) → M) (S : Submodule ℂ M) {x : M} + (hx : x ∈ span T ⊔ S) : S.mkQ x ∈ span fun l => S.mkQ (T l) := by + obtain ⟨u, hu, z, hz, huz⟩ := Submodule.mem_sup.1 hx + obtain ⟨c, hc⟩ := (mem_span_iff u).1 hu + refine (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 _ _ _ + +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 epsilon 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 `hec` of the epsilon 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. -/ +lemma mem_span_sup_invariant_iff {T : (Fin 2 → Fin 2) → B} + (hT : IsSU2BiFundamental B repGauge T) (x : B) (S : Submodule ℂ B) + (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, repGauge g y ∈ S) + (hec : ∀ g : GaugeGroupI, + repGauge g (epsilonContraction T) = epsilonContraction T) + (hx : x ∈ span T ⊔ S) + (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : + ∃ c : ℂ, ∃ y ∈ S, x = c • epsilonContraction T + y + ∧ ∀ g : GaugeGroupI, repGauge g y = y := by + have hquot := hT.isSU2BiFundamental_quotRep S hS + obtain ⟨c, hc⟩ := hquot.exists_smul_epsilonContraction_of_invariant_module + (mkQ_mem_span_quotRep T S hx) (fun g => by rw [IsSU2BiAdjoint.quotRep_mkQ, hinv g]) + rw [← mkQ_epsilonContraction T S] at hc + refine ⟨c, x - c • epsilonContraction T, ?_, by abel, fun g => ?_⟩ + · have hker : x - c • epsilonContraction T ∈ 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, hec 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 epsilon contraction up to an error in `S`, and the error is fixed by the isospin + factor too. No hypothesis on the epsilon contraction is needed here, the isospin factor + fixing it already. -/ +lemma mem_span_sup_su2_invariant_iff {T : (Fin 2 → Fin 2) → B} + (hT : IsSU2BiFundamental B repGauge T) (x : B) (S : Submodule ℂ B) + (hS : ∀ V : specialUnitaryGroup (Fin 2) ℂ, ∀ y ∈ S, repGauge (1, V, 1) y ∈ S) + (hx : x ∈ span T ⊔ S) + (hinv : ∀ V : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, V, 1) x = x) : + ∃ c : ℂ, ∃ y ∈ S, x = c • epsilonContraction T + y + ∧ ∀ V : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, V, 1) y = y := by + obtain ⟨c, y, hyS, hxy, hyinv⟩ := + hT.toRepSU2.mem_span_sup_invariant_iff x S + ((repSU2_stable_iff_su2 repGauge S).2 hS) (repSU2_epsilonContraction hT) hx + ((repSU2_invariant_iff_su2 repGauge x).2 hinv) + exact ⟨c, y, hyS, hxy, (repSU2_invariant_iff_su2 repGauge y).1 hyinv⟩ + end IsSU2BiFundamental end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2QuadFundamental.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2QuadFundamental.lean index 8800e6dc9..3d4d2fb38 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2QuadFundamental.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2QuadFundamental.lean @@ -5,6 +5,7 @@ Authors: Joseph Tooby-Smith -/ module +public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU2BiAdjoint public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU2BiFundamental /-! # Gauge tensors carrying four `su(2)` fundamental indices @@ -29,26 +30,44 @@ independent, and the third is the difference of the other two. 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 -two of the epsilon contractions. +gauge group appears. `IsSU2QuadFundamental` 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. 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 the isospin transformation afterwards. + +What stays about `GaugeGroupI` is the bookkeeping of the two decompositions, which +`GaugeWeightDecomposition` and `SU2PermDecomposition` supply only for representations of +the gauge group. They are built for `repSU2 repGauge` of section A.2, the isospin part of +the representation, which is defined where the bi-adjoint case needs it, in +`IsSU2BiAdjoint`, and imported here. A decomposition must know how all four torus +generators act, and of the four only `gaugeTorusGen 2` is an isospin transformation; the +isospin part sends the others to the identity, so the colour and hypercharge coordinates of +every weight vanish by construction rather than by hypothesis. + +Section A gives the transformation law, the proposition, the isospin part of a +representation, the span of the components, and the way a linear combination of them +transforms. Section B builds the three double epsilon contractions, proves each fixed by +the isospin factor, and proves the Schouten relation between them. Section C is the gauge +weight decomposition of the span, for the isospin part of the representation, 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 isospin invariants down to the plane spanned by two of the epsilon +contractions. Each conclusion is stated twice, once for the isospin factor and once for the +whole gauge group, the isospin form being what the transformation law supports on its own +and the gauge form asking in addition that the two contractions be gauge invariant. + +Sections F and G carry those conclusions off the algebra: F reads them for a family valued +in a mere module, through the square-zero extension, and G reads them modulo a gauge-stable +submodule, through the quotient, which is the form in which one family at a time is peeled +off a join. Both mirror the sections of the same names in `IsSU2BiFundamental`. -/ @[expose] public section @@ -64,22 +83,27 @@ open IsSU2BiFundamental (su2Perm_apply sup_span_sub_add) ## A. Quad-fundamental `su(2)` families and the span of their components +Four `su(2)` fundamental indices are acted on by the `SU(2)` factor of the gauge group +alone. A.1 phrases the transformation law through the fundamental matrix of an `SU(2)` +element and nothing else, so that no other factor of the gauge group appears in the law, +A.2 reads a representation of the gauge group at its isospin factor, which is what carries +the two decompositions of sections C and D, and A.3 says how a linear combination of the +components moves. + +## 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 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. +`IsSU2QuadFundamentalMat`, which relates one element of `SU(2)` to one linear map on `B` +and mentions no other factor of the gauge group. -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. +`IsSU2QuadFundamental` then says that the isospin 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. 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. -/ @@ -94,12 +118,34 @@ def IsSU2QuadFundamentalMat {B : Type*} [AddCommMonoid B] [Module ℂ B] /-- 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: 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 IsSU2QuadFundamental (B : Type*) [AddCommMonoid B] [Module ℂ B] (repGauge : Representation ℂ GaugeGroupI B) (T : (Fin 4 → Fin 2) → B) : Prop where - repGauge_T : ∀ g : GaugeGroupI, - IsSU2QuadFundamentalMat (GaugeGroupI.toSU2 g) (repGauge g) T + repGauge_T : ∀ g : specialUnitaryGroup (Fin 2) ℂ, + IsSU2QuadFundamentalMat g (repGauge (1, g, 1)) T + +/-! + +## A.2. The isospin part of a representation, and the span + +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 defined in +`IsSU2BiAdjoint`, together with `repSU2_apply`, `isMulRep_repSU2`, the bridge +`repSU2_invariant_iff_su2` between invariance under it and invariance under the isospin +factor, and the stability bridge `repSU2_stable_iff_su2`. A quad-fundamental family for +`repGauge` is a quad-fundamental family for `repSU2 repGauge`, with the same span and the +same epsilon contractions, which is `toRepSU2`. + +That transport is what carries sections C and D, whose two decompositions need 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 isospin +transformation `(1, U, 1)` spelled out, so that reading one needs no unfolding. The Weyl +element of section D and the third of a turn of section E are isospin transformations, so +the two representations agree at them outright, which is `repSU2_gaugeSU2Perm`. + +-/ namespace IsSU2QuadFundamental set_option linter.unusedVariables false @@ -108,6 +154,19 @@ variable {B : Type*} [AddCommGroup B] [Module ℂ B] {repGauge : Representation ℂ GaugeGroupI B} {U : specialUnitaryGroup (Fin 2) ℂ} {f : B →ₗ[ℂ] B} +/-- A quad-fundamental family for a representation is a quad-fundamental family for its + isospin part: the transformation law reads only the isospin factor to begin with. The + span and the three epsilon contractions 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 4 → Fin 2) → B} (hT : IsSU2QuadFundamental B repGauge T) : + IsSU2QuadFundamental B (repSU2 repGauge) T where + repGauge_T g := hT.repGauge_T g + +/-- The isospin part of a representation agrees with the representation at the Weyl + element, that element being trivial on colour and hypercharge. -/ +lemma repSU2_gaugeSU2Perm (repGauge : Representation ℂ GaugeGroupI B) : + repSU2 repGauge gaugeSU2Perm = repGauge gaugeSU2Perm := rfl + /-- 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 @@ -153,6 +212,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.3. Linear combinations of the components + +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. + +-/ + /-- 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) @@ -183,25 +254,26 @@ lemma map_sum_smul_eq_self {T : (Fin 4 → Fin 2) → B} 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. -/ +/-- An isospin 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) + (V : specialUnitaryGroup (Fin 2) ℂ) (c : (Fin 4 → Fin 2) → ℂ) : + repGauge (1, V, 1) (∑ 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 + (∑ l : Fin 4 → Fin 2, c l * ∏ i, V.1 (a i) (l i)) • T a := + map_sum_smul (hT.repGauge_T V) c /-- A linear combination of the components whose coefficient family is fixed by every - `SU(2)` matrix is gauge invariant. -/ + `SU(2)` matrix is fixed by the isospin factor. -/ 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 := - map_sum_smul_eq_self (hT.repGauge_T g) c (hc (GaugeGroupI.toSU2 g)) + (V : specialUnitaryGroup (Fin 2) ℂ) : + repGauge (1, V, 1) (∑ 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 V) c (hc V) /-! @@ -213,14 +285,14 @@ of the four. There are three such pairings, and hence three double contractions. 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`. +family alone and are fixed by every element of `specialUnitaryGroup (Fin 2) ℂ`, isospin +invariance being that statement read at the isospin transformation `(1, U, 1)`. 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. +two exhaust the isospin invariants in the span of the components, so the count here is sharp. -/ @@ -374,23 +446,26 @@ lemma map_epsilonContraction₁₄ {T : (Fin 4 → Fin 2) → B} rw [epsilonContraction₁₄_eq_sum] exact map_sum_smul_eq_self hf _ (sum_epsilonPair₁₄_mul U) -/-- The first contraction is gauge invariant. -/ +/-- The first contraction is fixed by the isospin factor. That is all the transformation law + constrains, the colour and hypercharge factors being free to move it. -/ 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) + (hT : IsSU2QuadFundamental B repGauge T) (V : specialUnitaryGroup (Fin 2) ℂ) : + repGauge (1, V, 1) (epsilonContraction₁₂ T) = epsilonContraction₁₂ T := + map_epsilonContraction₁₂ (hT.repGauge_T V) -/-- The second contraction is gauge invariant. -/ +/-- The second contraction is fixed by the isospin factor. That is all the transformation law + constrains, the colour and hypercharge factors being free to move it. -/ 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) + (hT : IsSU2QuadFundamental B repGauge T) (V : specialUnitaryGroup (Fin 2) ℂ) : + repGauge (1, V, 1) (epsilonContraction₁₃ T) = epsilonContraction₁₃ T := + map_epsilonContraction₁₃ (hT.repGauge_T V) -/-- The third contraction is gauge invariant. -/ +/-- The third contraction is fixed by the isospin factor. That is all the transformation law + constrains, the colour and hypercharge factors being free to move it. -/ 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) + (hT : IsSU2QuadFundamental B repGauge T) (V : specialUnitaryGroup (Fin 2) ℂ) : + repGauge (1, V, 1) (epsilonContraction₁₄ T) = epsilonContraction₁₄ T := + map_epsilonContraction₁₄ (hT.repGauge_T V) omit [Module ℂ B] in /-- The Schouten relation between the three contractions: the third is the difference of @@ -437,9 +512,13 @@ The `SU(2)` content is `map_of_diagonal`: a family moved by a diagonal `SU(2)` m 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. +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 others to the identity, so their weights +vanish by construction rather than by hypothesis, which is why +`gaugeWeightDecomposition_supp` still lists only weights with vanishing colour and +hypercharge. The stronger typeclass assumptions are forced: `GaugeWeightDecomposition` lives in an algebra and records multiplicativity of the representation, neither of which @@ -483,19 +562,37 @@ def wtWeight (l : Fin 4 → Fin 2) : GaugeWeight := -/ -/-- 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 {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 [map_of_diagonal (hT.repGauge_T (gaugeTorusGen i)) - (toSU2_gaugeTorusGen_offDiag i) l] +/-- Any linear map moving the components of a quad-fundamental family by the isospin part + of a torus generator scales every one of them by the character of the sum of the weights + of its four indices. -/ +lemma map_gaugeTorusGen {T : (Fin 4 → Fin 2) → B} {i : Fin 4} + (hf : IsSU2QuadFundamentalMat (GaugeGroupI.toSU2 (gaugeTorusGen i)) f T) + (l : Fin 4 → Fin 2) : + f (T l) = ((expI : ℂ) ^ GaugeWeight.coord (wtWeight l) i) • T l := by + rw [map_of_diagonal hf (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] +/-- Every component of a quad-fundamental family is a simultaneous eigenvector of the gauge + torus for the isospin part of the representation, at the character of the sum of the + weights of its four indices. -/ +lemma repSU2_gaugeTorusGen {T : (Fin 4 → Fin 2) → B} + (hT : IsSU2QuadFundamental B repGauge T) (l : Fin 4 → Fin 2) (i : Fin 4) : + repSU2 repGauge (gaugeTorusGen i) (T l) + = ((expI : ℂ) ^ GaugeWeight.coord (wtWeight l) i) • T l := + map_gaugeTorusGen (hT.repGauge_T (GaugeGroupI.toSU2 (gaugeTorusGen i))) l + +/-- The isospin part of a torus generator scales every component of a quad-fundamental + family by the character of the sum of the weights of its four indices. This is + `repSU2_gaugeTorusGen` with the isospin transformation spelled out. -/ +lemma repGauge_gaugeTorusGen {T : (Fin 4 → Fin 2) → B} + (hT : IsSU2QuadFundamental B repGauge T) (l : Fin 4 → Fin 2) (i : Fin 4) : + repGauge (1, GaugeGroupI.toSU2 (gaugeTorusGen i), 1) (T l) + = ((expI : ℂ) ^ GaugeWeight.coord (wtWeight l) i) • T l := + hT.repSU2_gaugeTorusGen l i + /-! ## C.3. The decomposition @@ -508,16 +605,22 @@ variable {B : Type*} [Ring B] [Algebra ℂ B] {repGauge : Representation ℂ GaugeGroupI B} {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. -/ +/-- The gauge weight decomposition of the span of a quad-fundamental `su(2)` family, for + the isospin part of the representation. 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. + + 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 others to the identity, so their + weights vanish by construction. -/ @[implicit_reducible] noncomputable def gaugeWeightDecomposition (hT : IsSU2QuadFundamental 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 4 → Fin 2 => - GaugeWeightDecomposition.spanSingleton hmul (T d) (wtWeight d) - (repGauge_gaugeTorusGen hT d)) + (GaugeWeightDecomposition.iSup (isMulRep_repSU2 hmul) fun d : Fin 4 → Fin 2 => + GaugeWeightDecomposition.spanSingleton (isMulRep_repSU2 hmul) (T d) (wtWeight d) + (hT.repSU2_gaugeTorusGen d)) _ rfl variable (hT : IsSU2QuadFundamental B repGauge T) @@ -548,8 +651,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 the +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 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. @@ -592,18 +696,18 @@ lemma gaugeWeightDecomposition_piece_zero (hmul : IsMulRep repGauge) : · 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. -/ +/-- The first contraction lies in the zero-weight piece. It is fixed by the isospin factor, + 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_invariant_iff_su2 repGauge _).2 (repGauge_epsilonContraction₁₂ hT)) /-- The second contraction lies in the zero-weight piece. -/ 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_invariant_iff_su2 repGauge _).2 (repGauge_epsilonContraction₁₃ hT)) /-! @@ -616,7 +720,11 @@ meets, and a zero-weight component meets two of them, so the two signs cancel an 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. +the isospin transformation built from that element. Like the gauge weight decomposition the +grading is read for `repSU2 repGauge`, the isospin part of the representation, which is +where the transformation law constrains every gauge transformation; the Weyl element is +itself an isospin transformation, so the two representations agree at it outright, which is +`repSU2_gaugeSU2Perm`. 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 @@ -712,41 +820,47 @@ lemma map_su2Perm_snd₃ {T : (Fin 4 → Fin 2) → B} 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 +/-- The isospin part of the representation at 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] := - map_su2Perm_fst₁ (hT.repGauge_T gaugeSU2Perm) +lemma repSU2_gaugeSU2Perm_fst₁ (hT : IsSU2QuadFundamental B repGauge T) : + repSU2 repGauge gaugeSU2Perm (T ![0, 0, 1, 1]) = T ![1, 1, 0, 0] := + map_su2Perm_fst₁ (hT.repGauge_T su2Perm) -/-- The Weyl element of the gauge group exchanges the two components of the first +/-- The isospin part of the representation at 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] := - map_su2Perm_snd₁ (hT.repGauge_T gaugeSU2Perm) +lemma repSU2_gaugeSU2Perm_snd₁ (hT : IsSU2QuadFundamental B repGauge T) : + repSU2 repGauge gaugeSU2Perm (T ![1, 1, 0, 0]) = T ![0, 0, 1, 1] := + map_su2Perm_snd₁ (hT.repGauge_T su2Perm) -/-- The Weyl element of the gauge group exchanges the two components of the second +/-- The isospin part of the representation at 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] := - map_su2Perm_fst₂ (hT.repGauge_T gaugeSU2Perm) +lemma repSU2_gaugeSU2Perm_fst₂ (hT : IsSU2QuadFundamental B repGauge T) : + repSU2 repGauge gaugeSU2Perm (T ![0, 1, 0, 1]) = T ![1, 0, 1, 0] := + map_su2Perm_fst₂ (hT.repGauge_T su2Perm) -/-- The Weyl element of the gauge group exchanges the two components of the second +/-- The isospin part of the representation at 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] := - map_su2Perm_snd₂ (hT.repGauge_T gaugeSU2Perm) +lemma repSU2_gaugeSU2Perm_snd₂ (hT : IsSU2QuadFundamental B repGauge T) : + repSU2 repGauge gaugeSU2Perm (T ![1, 0, 1, 0]) = T ![0, 1, 0, 1] := + map_su2Perm_snd₂ (hT.repGauge_T su2Perm) -/-- The Weyl element of the gauge group exchanges the two components of the third +/-- The isospin part of the representation at 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] := - map_su2Perm_fst₃ (hT.repGauge_T gaugeSU2Perm) +lemma repSU2_gaugeSU2Perm_fst₃ (hT : IsSU2QuadFundamental B repGauge T) : + repSU2 repGauge gaugeSU2Perm (T ![0, 1, 1, 0]) = T ![1, 0, 0, 1] := + map_su2Perm_fst₃ (hT.repGauge_T su2Perm) -/-- The Weyl element of the gauge group exchanges the two components of the third +/-- The isospin part of the representation at 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] := - map_su2Perm_snd₃ (hT.repGauge_T gaugeSU2Perm) +lemma repSU2_gaugeSU2Perm_snd₃ (hT : IsSU2QuadFundamental B repGauge T) : + repSU2 repGauge gaugeSU2Perm (T ![1, 0, 0, 1]) = T ![0, 1, 1, 0] := + map_su2Perm_snd₃ (hT.repGauge_T su2Perm) /-- The symmetric combination of the first zero-weight pair. -/ def symComb₁ (T : (Fin 4 → Fin 2) → B) : B := T ![0, 0, 1, 1] + T ![1, 1, 0, 0] @@ -778,14 +892,15 @@ lemma epsilonContraction₁₂_eq_sub (T : (Fin 4 → Fin 2) → B) : 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 (repSU2 repGauge) + ((hT.gaugeWeightDecomposition hmul).piece 0) := SU2PermDecomposition.copy - (((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))) + (((swapPairSU2Perm (repSU2_gaugeSU2Perm_fst₁ hT) + (repSU2_gaugeSU2Perm_snd₁ hT)).sup + (swapPairSU2Perm (repSU2_gaugeSU2Perm_fst₂ hT) + (repSU2_gaugeSU2Perm_snd₂ hT))).sup + (swapPairSU2Perm (repSU2_gaugeSU2Perm_fst₃ hT) + (repSU2_gaugeSU2Perm_snd₃ hT))) _ (hT.gaugeWeightDecomposition_piece_zero hmul) /-- The grade-zero piece of the Weyl grading: the join of the three symmetric @@ -794,16 +909,27 @@ lemma zeroPieceSU2Perm_piece_zero (hmul : IsMulRep repGauge) : (hT.zeroPieceSU2Perm hmul).piece 0 = (ℂ ∙ symComb₁ T ⊔ ℂ ∙ symComb₂ T) ⊔ ℂ ∙ symComb₃ T := rfl -/-- Every gauge invariant in the span of the components lies in the join of the three +/-- Every isospin 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 (hT : IsSU2QuadFundamental B repGauge T) + dimension larger than the truth. Only the isospin factor is used, which is all the + transformation law constrains. -/ +lemma mem_symComb_of_su2_invariant (hT : IsSU2QuadFundamental B repGauge T) (hmul : IsMulRep repGauge) {x : B} (hx : x ∈ span T) - (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : + (hinv : ∀ V : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, V, 1) x = x) : x ∈ (ℂ ∙ symComb₁ T ⊔ ℂ ∙ symComb₂ T) ⊔ ℂ ∙ symComb₃ T := by + have hinv' : ∀ g : GaugeGroupI, repSU2 repGauge g x = x := + (repSU2_invariant_iff_su2 repGauge x).2 hinv rw [← hT.zeroPieceSU2Perm_piece_zero hmul] exact SU2PermDecomposition.mem_zero_of_invariant (hT.zeroPieceSU2Perm hmul) - (GaugeWeightDecomposition.mem_zero_of_invariant _ hx hinv) hinv + (GaugeWeightDecomposition.mem_zero_of_invariant _ hx hinv') hinv' + +/-- The same for a gauge invariant, gauge invariance being invariance under the isospin + factor and more. -/ +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 ∈ (ℂ ∙ symComb₁ T ⊔ ℂ ∙ symComb₂ T) ⊔ ℂ ∙ symComb₃ T := + hT.mem_symComb_of_su2_invariant hmul hx fun V => hinv (1, V, 1) /-! @@ -828,8 +954,8 @@ The rotation is the element `cycSU2` of `specialUnitaryGroup (Fin 2) ℂ`, and t 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. +generated by `cycGauge`, whose three elements are isospin transformations, so an element +the isospin factor fixes is three times its own average. -/ @@ -900,6 +1026,19 @@ 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 +/-- The rotation by two thirds of a turn, as an element of the gauge group. -/ +noncomputable def cycGaugeSq : GaugeGroupI := ⟨1, cycSU2 * cycSU2, 1⟩ + +/-- The `SU(2)` part of the two thirds turn as a gauge element is the square of the + rotation. -/ +lemma toSU2_cycGaugeSq : GaugeGroupI.toSU2 cycGaugeSq = cycSU2 * cycSU2 := rfl + +/-- The square of the third of a turn is the two thirds turn: the colour and hypercharge + factors are trivial, so they multiply out to the identity and only the isospin factor + moves. This is what makes the average below an average over a cyclic subgroup. -/ +lemma cycGauge_mul_cycGauge : cycGauge * cycGauge = cycGaugeSq := by + simp [cycGauge, cycGaugeSq] + 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 @@ -940,24 +1079,28 @@ lemma map_symCoeff_smul_add {T : (Fin 4 → Fin 2) → B} {f₁ f₂ : B →ₗ[ /-- 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) + LinearMap.id + repGauge cycGauge + repGauge cycGaugeSq /-- The average, written out. -/ lemma cycAverage_apply (x : B) : - cycAverage repGauge x - = x + repGauge cycGauge x + repGauge (cycGauge * cycGauge) x := rfl + cycAverage repGauge x = x + repGauge cycGauge x + repGauge cycGaugeSq x := rfl /-- Averaging annihilates the neutral state of the isospin-two multiplet. -/ lemma cycAverage_symComb_sum (hT : IsSU2QuadFundamental B repGauge T) : 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) : + exact map_symCoeff_smul_add (hT.repGauge_T cycSU2) + (hT.repGauge_T (cycSU2 * cycSU2)) + +/-- Averaging fixes an isospin invariant three times over: the two nontrivial elements of + the cyclic subgroup are isospin transformations, which is all the transformation law + constrains. -/ +lemma cycAverage_of_invariant {x : B} + (hinv : ∀ V : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, V, 1) x = x) : cycAverage repGauge x = (3 : ℂ) • x := by - rw [cycAverage_apply, hinv, hinv] + have h1 : repGauge cycGauge x = x := hinv cycSU2 + have h2 : repGauge cycGaugeSq x = x := hinv (cycSU2 * cycSU2) + rw [cycAverage_apply, h1, h2] module /-- Averaging sends the third symmetric combination to minus the sum of the two epsilon @@ -1023,15 +1166,16 @@ lemma cycAverage_symComb₂ (hT : IsSU2QuadFundamental B repGauge T) : rw [hsplit, e2, h3] module -/-- Every gauge invariant in the span of the components is a combination of two of the +/-- Every isospin 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 (hT : IsSU2QuadFundamental B repGauge T) + and averaging over the rotation cuts those down to the plane of the contractions. Only + the isospin factor is used, which is all the transformation law constrains. -/ +lemma mem_sup_epsilonContraction_of_su2_invariant (hT : IsSU2QuadFundamental B repGauge T) (hmul : IsMulRep repGauge) {x : B} (hx : x ∈ span T) - (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : + (hinv : ∀ V : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, V, 1) x = x) : x ∈ ℂ ∙ epsilonContraction₁₂ T ⊔ ℂ ∙ epsilonContraction₁₃ T := by - have hmem := mem_symComb_of_invariant hT hmul hx hinv + have hmem := mem_symComb_of_su2_invariant hT hmul hx hinv have hI₁₂ : epsilonContraction₁₂ T ∈ ℂ ∙ epsilonContraction₁₂ T ⊔ ℂ ∙ epsilonContraction₁₃ T := Submodule.mem_sup_left (Submodule.mem_span_singleton_self _) @@ -1054,25 +1198,68 @@ lemma mem_sup_epsilonContraction_of_invariant (hT : IsSU2QuadFundamental B repGa 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 same for a gauge invariant, gauge invariance being invariance under the isospin + factor and more. -/ +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 := + hT.mem_sup_epsilonContraction_of_su2_invariant hmul hx fun V => hinv (1, V, 1) + +/-- Every isospin 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 +lemma exists_smul_epsilonContraction_of_su2_invariant (hT : IsSU2QuadFundamental B repGauge T) (hmul : IsMulRep repGauge) {x : B} - (hx : x ∈ span T) (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : + (hx : x ∈ span T) + (hinv : ∀ V : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, V, 1) x = x) : ∃ c₁ c₂ : ℂ, x = c₁ • epsilonContraction₁₂ T + c₂ • epsilonContraction₁₃ T := by obtain ⟨y, hy, z, hz, rfl⟩ := - Submodule.mem_sup.1 (mem_sup_epsilonContraction_of_invariant hT hmul hx hinv) + Submodule.mem_sup.1 (mem_sup_epsilonContraction_of_su2_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⟩ +/-- The same for a gauge invariant. -/ +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 := + hT.exists_smul_epsilonContraction_of_su2_invariant hmul hx fun V => hinv (1, V, 1) + +/-- The isospin 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 fixed by the isospin factor and in the + span, which bounds them from below. -/ +lemma mem_span_and_su2_invariant_iff (hT : IsSU2QuadFundamental B repGauge T) + (hmul : IsMulRep repGauge) (x : B) : + (x ∈ span T ∧ ∀ V : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, V, 1) x = x) + ↔ x ∈ ℂ ∙ epsilonContraction₁₂ T ⊔ ℂ ∙ epsilonContraction₁₃ T := by + refine ⟨fun h => mem_sup_epsilonContraction_of_su2_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 _ _ (epsilonContraction₁₂_mem_span T)) + (Submodule.smul_mem _ _ (epsilonContraction₁₃_mem_span T)), fun V => ?_⟩ + rw [map_add, map_smul, map_smul, repGauge_epsilonContraction₁₂ hT V, + repGauge_epsilonContraction₁₃ hT V] + /-- 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. -/ + first two epsilon contractions, once the two contractions are 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 a + contraction, after which the right-hand side has invariants that the left-hand side has + not. Where the two factors do fix them, as they do for a product of four Higgs symbols + whose hypercharges cancel, the hypothesis is supplied from the transformation law of the + underlying field. -/ lemma mem_span_and_invariant_iff (hT : IsSU2QuadFundamental B repGauge T) - (hmul : IsMulRep repGauge) (x : B) : + (hmul : IsMulRep repGauge) (x : B) + (hec₁₂ : ∀ g : GaugeGroupI, + repGauge g (epsilonContraction₁₂ T) = epsilonContraction₁₂ T) + (hec₁₃ : ∀ g : GaugeGroupI, + repGauge g (epsilonContraction₁₃ T) = epsilonContraction₁₃ T) : (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 => ?_⟩ @@ -1081,11 +1268,192 @@ lemma mem_span_and_invariant_iff (hT : IsSU2QuadFundamental B repGauge T) obtain ⟨c₂, rfl⟩ := Submodule.mem_span_singleton.1 hz 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] + rw [map_add, map_smul, map_smul, hec₁₂ g, hec₁₃ g] + +/-- Inside the span of the components the two notions of invariance agree, provided the two + epsilon contractions are 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 + combinations of the two contractions. The hypotheses are exactly what the transformation + law no longer supplies, and without them the statement is false, the colour and + hypercharge factors being unconstrained. -/ +lemma su2_invariant_iff_invariant (hT : IsSU2QuadFundamental B repGauge T) + (hmul : IsMulRep repGauge) + (hec₁₂ : ∀ g : GaugeGroupI, + repGauge g (epsilonContraction₁₂ T) = epsilonContraction₁₂ T) + (hec₁₃ : ∀ g : GaugeGroupI, + repGauge g (epsilonContraction₁₃ T) = epsilonContraction₁₃ T) + {x : B} (hx : x ∈ span T) : + (∀ V : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, V, 1) x = x) + ↔ ∀ g : GaugeGroupI, repGauge g x = x := by + refine ⟨fun h g => ?_, fun h V => h (1, V, 1)⟩ + obtain ⟨c₁, c₂, rfl⟩ := hT.exists_smul_epsilonContraction_of_su2_invariant hmul hx h + rw [map_add, map_smul, map_smul, hec₁₂ g, hec₁₃ g] end Decomposition +/-! + +## F. The classification for a family valued in a module + +A quad-fundamental family is met downstream inside a module that is not an algebra, and +section E cannot be read there: `GaugeWeightDecomposition` lives in an algebra and +`IsMulRep` is a statement about a product. The square-zero extension supplies both for +free, exactly as it does in section F of `IsSU2BiFundamental`: adjoining `ℂ` to the module +with a zero product makes an algebra whose representation is multiplicative for the +cheapest of reasons, and the injection of the module is injective, so a conclusion proved +upstairs comes straight back down. + +-/ + +section SquareZero + +variable {M : Type*} [AddCommGroup M] [Module ℂ M] + {ρ : Representation ℂ GaugeGroupI M} {T : (Fin 4 → Fin 2) → M} + +-- The opposite scalar action and its two compatibilities, which make the square-zero +-- extension of a complex vector space a ring. They are borrowed from `IsSU2BiAdjoint` so +-- that the instances here and there are literally the same. +attribute [local instance 100] IsSU2BiAdjoint.opModule + IsSU2BiAdjoint.smulCommClassOpModule IsSU2BiAdjoint.isCentralScalarOpModule + +/-- The images of the components in the square-zero extension again form a + quad-fundamental family, the extended representation acting on them by the + representation extended. -/ +lemma isSU2QuadFundamental_sqZeroRep (hT : IsSU2QuadFundamental M ρ T) : + IsSU2QuadFundamental (TrivSqZeroExt ℂ M) (IsSU2BiAdjoint.sqZeroRep ρ) + fun l => TrivSqZeroExt.inr (T l) where + repGauge_T g l := by + rw [IsSU2BiAdjoint.sqZeroRep_inr, hT.repGauge_T g l] + simp only [TrivSqZeroExt.inr_sum, TrivSqZeroExt.inr_smul] + +omit [Module ℂ M] in +/-- The first contraction of the images is the image of the first contraction. -/ +lemma epsilonContraction₁₂_inr (T : (Fin 4 → Fin 2) → M) : + epsilonContraction₁₂ (fun l => (TrivSqZeroExt.inr (T l) : TrivSqZeroExt ℂ M)) + = TrivSqZeroExt.inr (epsilonContraction₁₂ T) := by + simp only [epsilonContraction₁₂, ← TrivSqZeroExt.inr_sub, ← TrivSqZeroExt.inr_add] + +omit [Module ℂ M] in +/-- The second contraction of the images is the image of the second contraction. -/ +lemma epsilonContraction₁₃_inr (T : (Fin 4 → Fin 2) → M) : + epsilonContraction₁₃ (fun l => (TrivSqZeroExt.inr (T l) : TrivSqZeroExt ℂ M)) + = TrivSqZeroExt.inr (epsilonContraction₁₃ T) := by + simp only [epsilonContraction₁₃, ← TrivSqZeroExt.inr_sub, ← TrivSqZeroExt.inr_add] + +/-- The image of an element of the span lies in the span of the images. -/ +lemma inr_mem_span_sqZeroRep (T : (Fin 4 → Fin 2) → M) {x : M} (hx : x ∈ span T) : + (TrivSqZeroExt.inr x : TrivSqZeroExt ℂ M) + ∈ span fun l => (TrivSqZeroExt.inr (T l) : TrivSqZeroExt ℂ M) := by + obtain ⟨c, rfl⟩ := (mem_span_iff x).1 hx + refine (mem_span_iff _).2 ⟨c, ?_⟩ + simp only [TrivSqZeroExt.inr_sum, TrivSqZeroExt.inr_smul] + +/-- Every gauge invariant in the span of the components is a combination of the first two + epsilon contractions, 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_epsilonContraction_of_invariant_module + (hT : IsSU2QuadFundamental M ρ T) {x : M} (hx : x ∈ span T) + (hinv : ∀ g : GaugeGroupI, ρ g x = x) : + ∃ c₁ c₂ : ℂ, + x = c₁ • epsilonContraction₁₂ T + c₂ • epsilonContraction₁₃ T := by + obtain ⟨c₁, c₂, hc⟩ := + hT.isSU2QuadFundamental_sqZeroRep.exists_smul_epsilonContraction_of_invariant + (IsSU2BiAdjoint.isMulRep_sqZeroRep ρ) (inr_mem_span_sqZeroRep T hx) + (fun g => by rw [IsSU2BiAdjoint.sqZeroRep_inr, hinv g]) + refine ⟨c₁, c₂, TrivSqZeroExt.inr_injective (R := ℂ) ?_⟩ + rw [hc, epsilonContraction₁₂_inr, epsilonContraction₁₃_inr, TrivSqZeroExt.inr_add, + TrivSqZeroExt.inr_smul, TrivSqZeroExt.inr_smul] + +end SquareZero + +/-! + +## G. The invariants modulo a stable submodule + +Peeling one family at a time off a join needs the invariants of the span of that family +together with everything not yet peeled, gathered in a submodule `S`. A stable submodule +can be divided out: the images of the components in the quotient again form a +quad-fundamental family, so section F applies verbatim there and lifts to a classification +modulo `S`. The error term is invariant for free, being the difference of two invariants. + +Stability of `S` cannot be dropped, for the reason given at the bi-fundamental twin: for +an unstable line the only invariant of the line is zero, while an invariant of the sum may +lie outside the span. The two invariance hypotheses on the contractions are the ones of +`mem_span_and_invariant_iff`, and they are what makes the error term a gauge invariant +rather than merely an isospin one. + +-/ + +section Quotient + +variable {M : Type*} [AddCommGroup M] [Module ℂ M] + {ρ : Representation ℂ GaugeGroupI M} {T : (Fin 4 → Fin 2) → M} + +/-- The images of the components in the quotient by a gauge-stable submodule again form a + quad-fundamental family. -/ +lemma isSU2QuadFundamental_quotRep (hT : IsSU2QuadFundamental M ρ T) (S : Submodule ℂ M) + (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, ρ g y ∈ S) : + IsSU2QuadFundamental (M ⧸ S) (IsSU2BiAdjoint.quotRep ρ S hS) + fun l => S.mkQ (T l) where + repGauge_T g l := by + rw [IsSU2BiAdjoint.quotRep_mkQ, hT.repGauge_T g l, map_sum] + exact Finset.sum_congr rfl fun a _ => map_smul _ _ _ + +/-- The quotient map carries the first contraction to the first contraction of the + images. -/ +lemma mkQ_epsilonContraction₁₂ (T : (Fin 4 → Fin 2) → M) (S : Submodule ℂ M) : + S.mkQ (epsilonContraction₁₂ T) = epsilonContraction₁₂ fun l => S.mkQ (T l) := by + simp only [epsilonContraction₁₂, map_add, map_sub] + +/-- The quotient map carries the second contraction to the second contraction of the + images. -/ +lemma mkQ_epsilonContraction₁₃ (T : (Fin 4 → Fin 2) → M) (S : Submodule ℂ M) : + S.mkQ (epsilonContraction₁₃ T) = epsilonContraction₁₃ fun l => S.mkQ (T l) := by + simp only [epsilonContraction₁₃, map_add, map_sub] + +/-- The image of an element of the join of the span with a submodule lies in the span of + the images, the submodule dying in the quotient. -/ +lemma mkQ_mem_span_quotRep (T : (Fin 4 → Fin 2) → M) (S : Submodule ℂ M) {x : M} + (hx : x ∈ span T ⊔ S) : S.mkQ x ∈ span fun l => S.mkQ (T l) := by + obtain ⟨u, hu, z, hz, huz⟩ := Submodule.mem_sup.1 hx + obtain ⟨c, hc⟩ := (mem_span_iff u).1 hu + refine (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 _ _ _ + +end Quotient + +/-- The gauge invariants of the span of the components together with a gauge-stable + submodule `S`: such an element is a combination of the first two epsilon contractions up + to an error in `S`, and the error is gauge invariant as well, being the difference of two + invariants. This is the form in which one family at a time is peeled off a join. -/ +lemma mem_span_sup_invariant_iff {B : Type*} [AddCommGroup B] [Module ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} {T : (Fin 4 → Fin 2) → B} + (hT : IsSU2QuadFundamental B repGauge T) (x : B) (S : Submodule ℂ B) + (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, repGauge g y ∈ S) + (hec₁₂ : ∀ g : GaugeGroupI, + repGauge g (epsilonContraction₁₂ T) = epsilonContraction₁₂ T) + (hec₁₃ : ∀ g : GaugeGroupI, + repGauge g (epsilonContraction₁₃ T) = epsilonContraction₁₃ T) + (hx : x ∈ span T ⊔ S) (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : + ∃ c₁ c₂ : ℂ, ∃ y ∈ S, + x = c₁ • epsilonContraction₁₂ T + c₂ • epsilonContraction₁₃ T + y + ∧ ∀ g : GaugeGroupI, repGauge g y = y := by + have hquot := hT.isSU2QuadFundamental_quotRep S hS + obtain ⟨c₁, c₂, hc⟩ := hquot.exists_smul_epsilonContraction_of_invariant_module + (mkQ_mem_span_quotRep T S hx) (fun g => by rw [IsSU2BiAdjoint.quotRep_mkQ, hinv g]) + rw [← mkQ_epsilonContraction₁₂ T S, ← mkQ_epsilonContraction₁₃ T S] at hc + refine ⟨c₁, c₂, x - (c₁ • epsilonContraction₁₂ T + c₂ • epsilonContraction₁₃ T), ?_, + by abel, fun g => ?_⟩ + · have hker : x - (c₁ • epsilonContraction₁₂ T + c₂ • epsilonContraction₁₃ T) + ∈ LinearMap.ker S.mkQ := by + rw [LinearMap.mem_ker, map_sub, map_add, map_smul, map_smul, hc, sub_self] + rwa [Submodule.ker_mkQ] at hker + · rw [map_sub, map_add, map_smul, map_smul, hinv g, hec₁₂ g, hec₁₃ g] + end IsSU2QuadFundamental end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3FunAntiFun.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3FunAntiFun.lean index def2c8dce..84ded5cc1 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3FunAntiFun.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3FunAntiFun.lean @@ -7,6 +7,8 @@ module public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.SU3PermDecomposition +public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU3BiAdjoint +public import Mathlib.Algebra.TrivSqZeroExt.Basic /-! # Gauge tensors carrying an `su(3)` fundamental and an anti-fundamental index @@ -30,20 +32,43 @@ a unitary matrix satisfies `U * star U = 1`, so it uses only the `U`, and it wou 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. +map on `B` and mentions no other factor of the gauge group. `IsSU3FunAntiFun` 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. That weakness is what a Yukawa bilinear needs: a colour triplet paired with +an anti-triplet carries hypercharge, so a hypercharge transformation does move its +components, and a law quantified over the whole gauge group would be false of it. + +What stays about `GaugeGroupI` is the bookkeeping of the two decompositions, +`GaugeWeightDecomposition` and `SU3PermDecomposition` being supplied only for +representations of the gauge group. They are built for `repSU3 repGauge` of section A.2, +the colour part of the representation, which is defined where the bi-adjoint case needs it, +in `IsSU3BiAdjoint`, and imported here. A decomposition must know how all four torus +generators act, and of the four only `gaugeTorusGen 0` and `gaugeTorusGen 1` are colour +transformations; the colour part sends the other two to the identity, so the isospin and +hypercharge coordinates of every weight vanish by construction rather than by hypothesis. + +Section A gives the transformation law, the proposition, the colour part of a +representation and the span of the 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 colour invariants. + +Sections E and F put that classification into the form the Yukawa sector needs, where +several colour bilinears are summed and one of them is peeled off at a time. Section E +sheds the algebra structure on the target and the multiplicativity hypothesis on the +representation, by running the classification in the trivial square-zero extension of a +module and pulling it back, and section F divides out a stable submodule, which is where +the families not yet reached are parked; the quotient is a module and no longer an algebra, +which is why section E comes first. Each conclusion is stated twice, once for the colour +factor and once for the whole gauge group, the colour form being what the transformation +law supports on its own and the gauge form asking in addition that the delta contraction be +gauge invariant. -/ @[expose] public section @@ -56,6 +81,14 @@ open Matrix ComplexConjugate ## A. Mixed `su(3)` families and the span of their components +A fundamental colour index and an anti-fundamental one are acted on by the `SU(3)` factor +of the gauge group alone. A.1 phrases the transformation law through the fundamental matrix +of an `SU(3)` element and nothing else, so that no other factor of the gauge group appears +in the law, and A.2 reads a representation of the gauge group at its colour factor, which +is what carries the two decompositions of sections C and D. + +## A.1. The transformation law and the proposition + 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 @@ -64,12 +97,14 @@ its index moves by `conj U`. It is recorded by `IsSU3FunAntiFunMat`, a relation 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. +`IsSU3FunAntiFun` 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. That is what a Yukawa bilinear needs, its components carrying hypercharge. +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. -/ @@ -85,13 +120,33 @@ def IsSU3FunAntiFunMat {B : Type*} [AddCommMonoid B] [Module ℂ B] /-- 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. -/ + `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 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 + repGauge_T : ∀ g : specialUnitaryGroup (Fin 3) ℂ, + IsSU3FunAntiFunMat 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 mixed family for `repGauge` is +a mixed family for `repSU3 repGauge`, with the same span and the same delta contraction, +which is `toRepSU3`. + +That transport is what carries sections C and D, whose two decompositions need 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 IsSU3FunAntiFun set_option linter.unusedVariables false @@ -100,6 +155,14 @@ variable {B : Type*} [AddCommGroup B] [Module ℂ B] {repGauge : Representation ℂ GaugeGroupI B} {U : specialUnitaryGroup (Fin 3) ℂ} {f : B →ₗ[ℂ] B} +/-- A mixed family for a representation is a mixed family for its colour part: the + transformation law reads only the colour factor to begin with. The span and the delta + 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 {T : (Fin 2 → Fin 3) → B} (hT : IsSU3FunAntiFun B repGauge T) : + IsSU3FunAntiFun B (repSU3 repGauge) T where + repGauge_T g := hT.repGauge_T g + /-- 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 @@ -143,7 +206,7 @@ determinant condition, so the delta contraction is an invariant of `U(3)` and no 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`. +map, colour invariance being that statement read at the colour transformation `(U, 1, 1)`. -/ @@ -207,12 +270,21 @@ lemma map_deltaContraction {T : (Fin 2 → Fin 3) → B} (hf : IsSU3FunAntiFunMa 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. -/ +/-- The delta contraction of a mixed family is fixed by the colour factor: a colour + transformation moves the components by the `SU(3)` element it is built from, which fixes + the contraction. That is all the transformation law constrains, the isospin and + hypercharge factors being free to move 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) + (hT : IsSU3FunAntiFun B repGauge T) (U : specialUnitaryGroup (Fin 3) ℂ) : + repGauge (U, 1, 1) (deltaContraction T) = deltaContraction T := + map_deltaContraction (hT.repGauge_T U) + +/-- The cyclic Weyl element of the gauge group moves the components by the cyclic Weyl + element of `SU(3)`, being the colour transformation built from it. -/ +lemma isSU3FunAntiFunMat_gaugeSU3Perm {T : (Fin 2 → Fin 3) → B} + (hT : IsSU3FunAntiFun B repGauge T) : + IsSU3FunAntiFunMat su3Perm (repGauge gaugeSU3Perm) T := + hT.repGauge_T su3Perm /-! @@ -229,9 +301,14 @@ The `SU(3)` content of the section is `map_of_diagonal`: a family moved by a dia 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. +characters of `fundWeight` on the diagonal. + +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 rather than by hypothesis, which is why +`gaugeWeightDecomposition_supp` still lists only weights 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 `IsSU3FunAntiFun` needs, @@ -302,19 +379,37 @@ def wtWeight (l : Fin 2 → Fin 3) : GaugeWeight := fundWeight (l 0) + antiFundW -/ -/-- 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] +/-- Any linear map moving the components of a mixed family by the colour part of a torus + generator scales every one of them by the character of the weight of its upper index minus + that of its lower one. -/ +lemma map_gaugeTorusGen {T : (Fin 2 → Fin 3) → B} {i : Fin 4} + (hf : IsSU3FunAntiFunMat (GaugeGroupI.toSU3 (gaugeTorusGen i)) f T) + (l : Fin 2 → Fin 3) : + f (T l) = ((expI : ℂ) ^ GaugeWeight.coord (wtWeight l) i) • T l := by + rw [map_of_diagonal hf (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] +/-- Every component of a mixed family is a simultaneous eigenvector of the gauge torus for + the colour part of the representation, at the character of the weight of its upper index + minus that of its lower one. -/ +lemma repSU3_gaugeTorusGen {T : (Fin 2 → Fin 3) → B} + (hT : IsSU3FunAntiFun 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 mixed family by the + character of the weight of its upper index minus that of its lower one. This is + `repSU3_gaugeTorusGen` with the colour transformation spelled out. -/ +lemma repGauge_gaugeTorusGen {T : (Fin 2 → Fin 3) → B} + (hT : IsSU3FunAntiFun 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 + /-! ## C.3. The decomposition @@ -327,16 +422,22 @@ 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. -/ +/-- The gauge weight decomposition of the span of a mixed `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 weight of its upper index minus that of its lower one. + + 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 : IsSU3FunAntiFun B repGauge T) - (hmul : IsMulRep repGauge) : GaugeWeightDecomposition repGauge (span T) := + (hmul : IsMulRep repGauge) : GaugeWeightDecomposition (repSU3 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)) + (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 variable (hT : IsSU3FunAntiFun B repGauge T) @@ -355,7 +456,8 @@ lemma gaugeWeightDecomposition_supp_eq (hmul : IsMulRep repGauge) : /-- 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. -/ + 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), @@ -367,8 +469,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 the +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. 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 @@ -398,12 +501,12 @@ lemma gaugeWeightDecomposition_piece_zero (hmul : IsMulRep repGauge) : · 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. -/ +/-- The delta 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 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) + ((repSU3_invariant_iff_su3 repGauge _).2 (repGauge_deltaContraction hT)) end Decomposition @@ -422,12 +525,19 @@ nothing in this section, a permutation matrix being real. That much is again `SU Weyl element enters as the element `su3Perm` of `specialUnitaryGroup (Fin 3) ℂ`, and the gauge group only through `toSU3_gaugeSU3Perm`. +Like the gauge weight decomposition the grading is read for `repSU3 repGauge`, the colour +part of the representation, which is where the transformation law constrains every gauge +transformation. The cyclic Weyl element is itself a colour transformation, so the two +representations agree at it outright, which is `repSU3_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 +three dimensional and grade zero is a line in it, so every colour 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 `⊥`. +cannot reach, its zero-weight piece being `⊥`. The gauge form +`exists_smul_deltaContraction_of_invariant` follows at once, a gauge invariant being in +particular fixed by the colour factor. -/ @@ -624,14 +734,15 @@ lemma zeroPiece_le_eigenspace (hT : IsSU3FunAntiFun B repGauge T) (k : ZMod 3) : 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]) + refine Module.End.mem_eigenspace_iff.mpr ?_ + rw [su3PermSign_zero, one_smul] + exact repGauge_deltaContraction hT su3Perm · 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)]) + (by rw [su3PermSign_one, map_su3Perm_octetOne hT.isSU3FunAntiFunMat_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)]) + (by rw [su3PermSign_two, map_su3Perm_octetTwo hT.isSU3FunAntiFunMat_gaugeSU3Perm]) variable (hT : IsSU3FunAntiFun B repGauge T) @@ -653,46 +764,356 @@ lemma iSup_zeroPiece (hmul : IsMulRep repGauge) : · 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. -/ + decomposition, for the colour part of the representation: 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 + SU3PermDecomposition (repSU3 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 [repSU3_gaugeSU3Perm] + 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 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. -/ +/-- The delta contraction lies in the grade zero piece: it is fixed by the colour factor, + 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) + (hT.deltaContraction_mem_piece_zero hmul) + ((repSU3_invariant_iff_su3 repGauge _).2 (repGauge_deltaContraction hT)) -/-- Every gauge invariant in the span of the components is a multiple of the delta +/-- Every colour 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 + sum. Only the colour factor is used, which is all the transformation law constrains. 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) : +lemma exists_smul_deltaContraction_of_su3_invariant (hT : IsSU3FunAntiFun B repGauge T) + (hmul : IsMulRep repGauge) {x : B} (hx : x ∈ span T) + (hinv : ∀ U : specialUnitaryGroup (Fin 3) ℂ, repGauge (U, 1, 1) x = x) : ∃ c : ℂ, x = c • deltaContraction T := by + have hinv' : ∀ g : GaugeGroupI, repSU3 repGauge g x = x := + (repSU3_invariant_iff_su3 repGauge x).2 hinv have hmem : x ∈ zeroPiece T 0 := SU3PermDecomposition.mem_zero_of_invariant (hT.zeroPieceSU3Perm 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 delta + 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_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 := + hT.exists_smul_deltaContraction_of_su3_invariant hmul hx fun U => hinv (U, 1, 1) + end Grading +/-! + +## E. The classification for a family valued in a module + +Section D states the classification for a family valued in an algebra, and asks that the +representation act by algebra maps. The conclusion needs neither. A mixed `su(3)` family +is a family of vectors and the delta contraction is a sum of them; the algebra structure +and `IsMulRep` are there only because the gauge weight decomposition and the `SU(3)` +permutation decomposition are set up in an algebra, `IsMulRep` being a statement about a +multiplication. + +The gap closes once and for all through the trivial square-zero extension +`TrivSqZeroExt ℂ M` of a module `M`, a commutative `ℂ`-algebra built from the module +structure alone in which the product of two module elements is zero. A representation of +the gauge group on `M` extends to it by acting trivially on the scalar part, and that +extension acts by algebra maps for free, its product being built from the module structure +the representation is linear for. So section D applies in the extension, and +`TrivSqZeroExt.inr` carries the transformation law, the span and the delta contraction +into it and, being injective, brings the conclusion back to `M`. That is +`exists_smul_deltaContraction_of_invariant_module` and its colour companion +`exists_smul_deltaContraction_of_su3_invariant_module`, which are section D with the +algebra structure and the multiplicativity hypothesis both removed, and they are the form +section F divides a submodule out of. `su3_invariant_iff_invariant` closes the section by +reading the classification backwards: inside the span, and once the delta contraction is +known to be gauge invariant, a vector fixed by the colour factor is fixed by the whole +gauge group, which is the bridge a peeling argument crosses when the families are only +colour-covariant and the submodule they are parked in is gauge-stable. + +-/ + +section SquareZero + +variable {M : Type*} [AddCommGroup M] [Module ℂ M] + {ρ : Representation ℂ GaugeGroupI M} {T : (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 family carrying + one fundamental and one anti-fundamental colour index. -/ +lemma isSU3FunAntiFun_sqZeroRep (hT : IsSU3FunAntiFun M ρ T) : + IsSU3FunAntiFun (TrivSqZeroExt ℂ M) (sqZeroRep ρ) fun l => TrivSqZeroExt.inr (T l) where + repGauge_T g l := by + rw [sqZeroRep_inr, hT.repGauge_T g l] + simp only [TrivSqZeroExt.inr_sum, TrivSqZeroExt.inr_smul] + +omit [Module ℂ M] in +/-- The delta contraction of the images is the image of the delta contraction, both being + the sum of the three diagonal components. -/ +lemma deltaContraction_sqZeroRep (T : (Fin 2 → Fin 3) → M) : + deltaContraction (fun l => TrivSqZeroExt.inr (R := ℂ) (T l)) + = TrivSqZeroExt.inr (deltaContraction T) := by + simp only [deltaContraction, TrivSqZeroExt.inr_sum] + +/-- The image of an element of the span lies in the span of the images. -/ +lemma inr_mem_span_sqZeroRep {x : M} (hx : x ∈ span T) : + TrivSqZeroExt.inr (R := ℂ) x ∈ span fun l => TrivSqZeroExt.inr (R := ℂ) (T l) := by + obtain ⟨c, rfl⟩ := (mem_span_iff x).1 hx + refine (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 delta + 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_deltaContraction_of_invariant_module (hT : IsSU3FunAntiFun M ρ T) {x : M} + (hx : x ∈ span T) (hinv : ∀ g : GaugeGroupI, ρ g x = x) : + ∃ c : ℂ, x = c • deltaContraction T := by + obtain ⟨c, hc⟩ := exists_smul_deltaContraction_of_invariant hT.isSU3FunAntiFun_sqZeroRep + (isMulRep_sqZeroRep ρ) (inr_mem_span_sqZeroRep hx) + (fun g => by rw [sqZeroRep_inr, hinv g]) + refine ⟨c, TrivSqZeroExt.inr_injective (R := ℂ) ?_⟩ + rw [hc, deltaContraction_sqZeroRep, TrivSqZeroExt.inr_smul] + +/-- The same classification for a family valued in a mere module, read at the colour factor + alone, which is all the transformation law constrains. -/ +lemma exists_smul_deltaContraction_of_su3_invariant_module (hT : IsSU3FunAntiFun M ρ T) + {x : M} (hx : x ∈ span T) + (hinv : ∀ V : specialUnitaryGroup (Fin 3) ℂ, ρ (V, 1, 1) x = x) : + ∃ c : ℂ, x = c • deltaContraction T := + hT.toRepSU3.exists_smul_deltaContraction_of_invariant_module hx + ((repSU3_invariant_iff_su3 ρ x).2 hinv) + +/-- Inside the span of the components the two notions of invariance agree, provided the + delta 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 delta contraction. The hypothesis `hdc` is exactly what the transformation law no + longer supplies, and without it the statement is false, the isospin and hypercharge + factors being unconstrained. It is stated here rather than in section D because the + square-zero extension has already shed the algebra structure and the multiplicativity + hypothesis, and a peeling argument crosses between the two notions in a quotient, which + carries neither. -/ +lemma su3_invariant_iff_invariant (hT : IsSU3FunAntiFun M ρ T) + (hdc : ∀ g : GaugeGroupI, ρ g (deltaContraction T) = deltaContraction T) + {x : M} (hx : x ∈ span T) : + (∀ V : specialUnitaryGroup (Fin 3) ℂ, ρ (V, 1, 1) x = x) + ↔ ∀ g : GaugeGroupI, ρ g x = x := by + refine ⟨fun h g => ?_, fun h V => h (V, 1, 1)⟩ + obtain ⟨c, rfl⟩ := hT.exists_smul_deltaContraction_of_su3_invariant_module hx h + rw [map_smul, hdc] + +end SquareZero + +/-! + +## F. The invariants modulo a stable submodule + +A gauge-stable submodule `S` can be divided out. The quotient `B ⧸ S` carries the induced +representation `quotRep`, the images of the components are a mixed `su(3)` family for it +again, and their span is the image of the span, so section E applies verbatim there and +lifts to a classification modulo `S`: an invariant of `span T ⊔ S` is a multiple of the +delta contraction up to an error in `S`, and the error is invariant as well, being the +difference of two invariants. + +That is the form a peeling argument wants. Several families are summed, one is classified, +and the ones not yet reached are adjoined to `S`; the quotient is only a module, which is +why section E had to shed the algebra structure first. Stability of `S` is needed and not +just convenient: it is what makes the quotient representation exist, and without it the +statement fails, since for an unstable line `ℂ ∙ v` the only invariant of the line is `0` +while an invariant of the sum may lie outside the span. + +`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 delta contraction be +gauge invariant, and cannot do without it: the law constrains the colour factor only, so +the isospin and hypercharge factors may scale the contraction, and that hypothesis is what +makes the error term a gauge invariant rather than merely a colour invariant. Where the two +factors do fix it, as they do for a colour bilinear whose hypercharges cancel, it is +supplied from the transformation law of the underlying fields. + +-/ + +section Quotient + +variable {T : (Fin 2 → Fin 3) → B} + +/-- The representation induced on the quotient by a gauge-stable submodule. -/ +noncomputable def quotRep (repGauge : Representation ℂ GaugeGroupI B) (S : Submodule ℂ B) + (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, repGauge g y ∈ S) : + Representation ℂ GaugeGroupI (B ⧸ S) where + toFun g := S.mapQ S (repGauge 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 ℂ B) (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, repGauge g y ∈ S) + (g : GaugeGroupI) (y : B) : quotRep repGauge S hS g (S.mkQ y) = S.mkQ (repGauge g y) := rfl + +/-- The images of the components in the quotient by a gauge-stable submodule again form a + family carrying one fundamental and one anti-fundamental colour index. -/ +lemma isSU3FunAntiFun_quotRep (hT : IsSU3FunAntiFun B repGauge T) (S : Submodule ℂ B) + (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, repGauge g y ∈ S) : + IsSU3FunAntiFun (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 _ _ _ + +/-- The quotient map carries the delta contraction to the delta contraction of the + images, both being the sum of the three diagonal components. -/ +lemma mkQ_deltaContraction (T : (Fin 2 → Fin 3) → B) (S : Submodule ℂ B) : + S.mkQ (deltaContraction T) = deltaContraction fun l => S.mkQ (T l) := by + simp only [deltaContraction, map_sum] + +/-- The class of an element of the span lies in the span of the classes. -/ +lemma mkQ_mem_span_quotRep {x : B} (S : Submodule ℂ B) (hx : x ∈ span T) : + S.mkQ x ∈ span fun l => S.mkQ (T l) := by + obtain ⟨c, rfl⟩ := (mem_span_iff x).1 hx + refine (mem_span_iff _).2 ⟨c, ?_⟩ + rw [map_sum] + exact Finset.sum_congr rfl fun d _ => map_smul _ _ _ + +/-- The gauge invariants of the span of the components together with a gauge-stable + submodule `S`: such an element is a multiple of the delta 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 mixed family again and the target is only a module, which is what section E prepared + for. This is the form in which one family at a time is peeled off a join of families. + + The gauge invariance `hdc` of the delta contraction is a hypothesis because the + transformation law does not supply it: the law constrains the colour factor only, so the + isospin and hypercharge factors may scale the contraction, and it is what makes the error + term a gauge invariant rather than merely a colour invariant. -/ +lemma mem_span_sup_invariant_iff (hT : IsSU3FunAntiFun B repGauge T) + (x : B) (S : Submodule ℂ B) + (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, repGauge g y ∈ S) + (hdc : ∀ g : GaugeGroupI, repGauge g (deltaContraction T) = deltaContraction T) + (hx : x ∈ span T ⊔ S) + (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : + ∃ c : ℂ, ∃ y ∈ S, x = c • deltaContraction T + y + ∧ ∀ g : GaugeGroupI, repGauge g y = y := by + have hmk : S.mkQ x ∈ span fun l => S.mkQ (T l) := by + obtain ⟨u, hu, z, hz, huz⟩ := Submodule.mem_sup.1 hx + rw [← huz, map_add, show S.mkQ z = 0 from (Submodule.Quotient.mk_eq_zero S).2 hz, + add_zero] + exact mkQ_mem_span_quotRep S hu + 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.isSU3FunAntiFun_quotRep S hS).exists_smul_deltaContraction_of_invariant_module hmk hinv' + rw [← mkQ_deltaContraction T S] at hc + refine ⟨c, x - c • deltaContraction T, ?_, by abel, fun g => ?_⟩ + · have hker : x - c • deltaContraction T ∈ 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, hdc 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 delta + contraction up to an error in `S`, and the error is fixed by the colour factor too. This + is the form the transformation law supports on its own, no invariance of the delta + contraction having to be assumed, since `repGauge_deltaContraction` supplies invariance + under the colour factor outright. -/ +lemma mem_span_sup_su3_invariant_iff (hT : IsSU3FunAntiFun B repGauge T) + (x : B) (S : Submodule ℂ B) + (hS : ∀ U : specialUnitaryGroup (Fin 3) ℂ, ∀ y ∈ S, repGauge (U, 1, 1) y ∈ S) + (hx : x ∈ span T ⊔ S) + (hinv : ∀ U : specialUnitaryGroup (Fin 3) ℂ, repGauge (U, 1, 1) x = x) : + ∃ c : ℂ, ∃ y ∈ S, x = c • deltaContraction T + 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 x S + ((repSU3_stable_iff_su3 repGauge S).2 hS) + ((repSU3_invariant_iff_su3 repGauge _).2 (repGauge_deltaContraction hT)) hx + ((repSU3_invariant_iff_su3 repGauge x).2 hinv) + exact ⟨c, y, hyS, hxy, (repSU3_invariant_iff_su3 repGauge y).1 hyinv⟩ + +end Quotient + end IsSU3FunAntiFun end StandardModel diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/FermionGaugeSector/MassWeight.lean b/Physlib/Particles/StandardModel/IsCovStandardModel/FermionGaugeSector/MassWeight.lean new file mode 100644 index 000000000..e989d9e98 --- /dev/null +++ b/Physlib/Particles/StandardModel/IsCovStandardModel/FermionGaugeSector/MassWeight.lean @@ -0,0 +1,209 @@ +/- +Copyright (c) 2026 Joseph Tooby-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.FermionGaugeSector.Basic +public import Physlib.Particles.StandardModel.IsCovStandardModel.YukawaSector.MassDimLTEight +public import Physlib.Particles.StandardModel.IsGaugeSector.DerivSubmodule.BoostWeightDecomposition +-- The fermion boost weights enter only inside the proofs below, so this import is kept +-- private: its public form is one character over the line-length limit. +import Physlib.Particles.StandardModel.IsFermionSector.DerivSubmodule.BoostWeightDecomposition +/-! +# The gauge-fermion invariants below mass weight nine + +The mixed `{gauge, fermion}` sector is almost empty below weight nine, and what little +there is cannot be invariant. A field-strength tower weighs at least four and a fermion +tower at least three, so the sector vanishes below weight seven; at weight eight the two +splittings that arithmetic allows are `4 + 4` and `6 + 2`, and the fermion sector is +trivial at both four and two, so weight eight vanishes too. That leaves weight seven, the +single product `F ψ` of the underived field strength against the underived fermion towers. + +Weight seven is barred from carrying an invariant by a parity count on boost weight, the +same one that empties the Yukawa sector at weights five and seven. Along a spatial axis a +field-strength symbol carries even boost weight, its two covector indices and its +derivative slots each contributing `±2` or `0` and its adjoint index nothing, while a +fermion symbol carries odd boost weight, the Weyl-spinor value index contributing the +extra `±1`. The one product at weight seven has exactly one fermion factor, so its boost +weight is odd along every axis; and a Lorentz invariant has boost weight zero, which is +even. + +The machinery is the Yukawa sector's: `WeightDecomposition.mulOfMul` convolves the two +factors' boost decompositions using multiplicativity of the Lorentz representation alone, +`not_two_dvd_of_mem_mulOfMul_supp` does the parity bookkeeping, and +`mem_of_invariant_of_mem_sup_of_odd_supp` turns an odd support into the absence of +invariants modulo a Lorentz-stable submodule. Only the left-hand factor changes: the +Higgs decomposition of even support is replaced by the gauge one, which is even for the +same reason. + +- A. Even field strength against odd fermion +- B. Mass weight seven +- C. The classification below mass weight nine + +The bound is `w < 9` rather than `w < 8`: weight eight is as empty as the weights below +seven, so nothing is gained by stopping short of the first weight the sector can occupy. + +-/ + +@[expose] public section + +namespace StandardModel + +open TensorProduct Matrix MatrixGroups Lorentz Lorentz.BoostWeight + +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) + +/-! + +## A. Even field strength against odd fermion + +The two boost weight decompositions of the factors are already proved: the field-strength +derivative submodules carry even weights, the covector and derivative slots contributing +`±2` or `0` and the adjoint index nothing, and the fermion ones carry odd weights, the +Weyl-spinor value index adding `±1`. Convolving them gives a boost weight decomposition of +their product, and even plus odd is odd. + +-/ + +/-- The boost weight decomposition of a product of a field-strength and a fermion + derivative submodule, obtained by convolving the two factors' decompositions. -/ +private noncomputable def gaugeFermionBoostWeight (a b : ℕ) (i : Fin 3) : + WeightDecomposition repLorentz i + (h.isGaugeSector.derivSubmodule a * h.isFermionSector.derivSubmodule b) := + WeightDecomposition.mulOfMul hrepLorentz_mul + (h.isGaugeSector.derivSubmoduleBoostWeight a i) + (h.isFermionSector.derivSubmoduleBoostWeight b i) + +/-- One field-strength factor against one fermion factor is odd: even plus odd. -/ +private lemma odd_gaugeFermionBoostWeight_supp (a b : ℕ) (i : Fin 3) : + ∀ k ∈ (h.gaugeFermionBoostWeight a b i).supp, ¬ (2 : ℤ) ∣ k := + fun _ hk => WeightDecomposition.not_two_dvd_of_mem_mulOfMul_supp + (fun _ hp => h.isGaugeSector.two_dvd_of_mem_derivSubmoduleBoostWeight_supp a i hp) + (fun _ hq => h.isFermionSector.not_two_dvd_of_mem_derivSubmoduleBoostWeight_supp b i hq) hk + +/-! + +## B. Mass weight seven + +Weight seven is the single product `F ψ`, the underived field strength against the +underived fermion towers. It has exactly one fermion factor, so section A makes every one +of its boost weights odd, and an invariant of odd boost weight is zero modulo a +Lorentz-stable submodule. The axis is immaterial; the first one will do. + +-/ + +/-- Mass weight seven carries no Lorentz invariant modulo a Lorentz-stable submodule: a + Lorentz invariant of `sectorMassWeight {gauge, fermion} 7 ⊔ S` lies in `S`. The weight is + the underived field strength against the underived fermion towers, of odd boost + weight. -/ +theorem mem_of_lorentz_invariant_sectorMassWeight_gauge_fermion_seven_sup (S : Submodule ℂ B) + (hSL : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) {x : B} + (hx : x ∈ h.sectorMassWeight {GeneratorClass.gauge, GeneratorClass.fermion} 7 ⊔ S) + (hL : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by + rw [h.sectorMassWeight_gauge_fermion_seven] at hx + exact WeightDecomposition.mem_of_invariant_of_mem_sup_of_odd_supp + (h.gaugeFermionBoostWeight 0 0 0) (h.odd_gaugeFermionBoostWeight_supp 0 0 0) S hSL hx hL + +/-! + +## C. The classification below mass weight nine + +The nine weights below nine are now settled: the sector vanishes below weight seven and +again at weight eight, and weight seven is section B. So below weight nine the +gauge-fermion sector supplies no invariant beyond what `S` already carries, and the +equivalences record it in the shape the other sectors carry, so that all of them can be +combined. + +No lower bound on the weight is needed. The sector is the two-class sector of the gauge +and fermion generators, so both classes must be present with a non-zero weight and the +sector is already trivial at weight zero; the scalars, which force `0 < w` in the +gauge-sector statement, never appear. + +-/ + +/-- Below mass weight nine the gauge-fermion sector carries no Lorentz invariant: a + Lorentz invariant of `sectorMassWeight {gauge, fermion} w ⊔ S` for `w < 9` lies in `S`. + Weights below seven and weight eight are trivial submodules, and weight seven is section + B. -/ +theorem mem_of_invariant_sectorMassWeight_gauge_fermion_lt_nine_sup (w : ℕ) (hw : w < 9) + (S : Submodule ℂ B) (hSL : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) {x : B} + (hx : x ∈ h.sectorMassWeight {GeneratorClass.gauge, GeneratorClass.fermion} w ⊔ S) + (hL : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by + rcases lt_or_ge w 7 with hw7 | hw7 + · rwa [h.sectorMassWeight_gauge_fermion_eq_bot_of_lt_seven hw7, bot_sup_eq] at hx + interval_cases w + · exact h.mem_of_lorentz_invariant_sectorMassWeight_gauge_fermion_seven_sup S hSL hx hL + · rwa [h.sectorMassWeight_gauge_fermion_eight, bot_sup_eq] at hx + +set_option linter.unusedVariables false in +/-- The classification below mass weight nine as an equivalence, in the shape of the gauge- + and Yukawa-sector statements: an element of `sectorMassWeight {gauge, fermion} w ⊔ S` for + `w < 9` is fixed by both groups exactly when it is itself an element of `S` fixed by both + groups. Gauge stability of `S` is not needed, and neither is gauge invariance of `x`: the + forward direction is the boost-weight parity argument, which uses the Lorentz group + alone. -/ +theorem mem_sectorMassWeight_gauge_fermion_lt_nine_sup_and_gauge_lorentz_invariant_iff + (w : ℕ) (hw : w < 9) (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.sectorMassWeight {GeneratorClass.gauge, GeneratorClass.fermion} 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_invariant_sectorMassWeight_gauge_fermion_lt_nine_sup w 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 nine an element of + `sectorMassWeight {gauge, fermion} w ⊔ S` fixed by both groups is an element of `S` fixed + by both groups, and conversely. -/ +theorem mem_sectorMassWeight_gauge_fermion_lt_nine_sup_and_gauge_lorentz_invariant_iff_mem + (w : ℕ) (hw : w < 9) (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.sectorMassWeight {GeneratorClass.gauge, GeneratorClass.fermion} 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) := + ⟨fun hx => ⟨h.mem_of_invariant_sectorMassWeight_gauge_fermion_lt_nine_sup w hw S hSL + hx.1 hx.2.2, hx.2⟩, fun hx => ⟨Submodule.mem_sup_right hx.1, hx.2⟩⟩ + +end IsCovStandardModel + +end StandardModel diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/GaugeHiggsSector/MassWeight.lean b/Physlib/Particles/StandardModel/IsCovStandardModel/GaugeHiggsSector/MassWeight.lean new file mode 100644 index 000000000..9da4d6ee9 --- /dev/null +++ b/Physlib/Particles/StandardModel/IsCovStandardModel/GaugeHiggsSector/MassWeight.lean @@ -0,0 +1,545 @@ +/- +Copyright (c) 2026 Joseph Tooby-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.GaugeHiggsSector.Basic +public import Physlib.Particles.StandardModel.IsGaugeSector.MassWeight.MassDimLTEight +/-! +# The gauge-Higgs invariants below mass weight nine + +The mixed `{gauge, higgs}` sector is small, and none of it is invariant. A field-strength +tower weighs at least four and a Higgs tower at least two, and both weights are even, so +the sector vanishes below weight six and at every odd weight, weight seven included. What +is left is weight six, the underived field strength against the underived Higgs, and +weight eight: that same field strength against the weight-four Higgs terms, together with +the once-derived field strength against the underived Higgs. + +None of it can carry an invariant, and the reason is an index count. The Higgs is a Lorentz +scalar, so an underived Higgs symbol has no covector index at all and is fixed by the whole +Lorentz group, while a once-derived one carries a single index, its derivative slot. The +covector indices of these products are therefore those of the field strength — two when it +is underived and three when it is once derived — plus at most one from the Higgs. + +Two indices admit exactly one invariant contraction, the metric trace, and it vanishes: the +metric is symmetric in the pair of indices in which `IsGaugeSector.F_antisymm` says the +field strength is antisymmetric. Three indices admit no invariant contraction at all, the +metric tying two and the Levi-Civita symbol four. Weight six and the two-Higgs term of +weight eight are of the first kind and the other two terms of weight eight of the second, +so at no weight below nine does the sector add an invariant to what is already there. + +Neither count needs the gauge group, and neither needs a basis of the Higgs. The families +being peeled are indexed by a covector of the gauge algebra together with a piece of Higgs +material, and neither index is finite; section B peels a join over an arbitrary index type +by passing to a finite subset of it, which is all an element of a join ever needs. + +- A. Field strengths against Lorentz-inert material +- B. Peeling a join over an arbitrary index +- C. The underived Higgs is Lorentz inert +- D. Field strengths against Higgs material +- E. Mass weights six and eight +- F. The classification below mass weight nine + +The bound is `w < 9` rather than the gauge sector's `w < 8`, weight eight being as empty of +invariants as the weights below it. No lower bound on `w` is needed either: the sector is +the two-class sector of the gauge and Higgs generators, so both classes must be present +with a non-zero weight and the scalars, which force `0 < w` in the gauge-sector statement, +never appear. + +-/ + +@[expose] public section + +namespace Lorentz + +open Matrix MatrixGroups + +variable {B : Type*} [Ring B] [Algebra ℂ B] {repLorentz : Representation ℂ SL(2,ℂ) B} + +/-! + +## A. Field strengths against Lorentz-inert material + +A family transforming as a Lorentz tensor stays one when multiplied by an element the +Lorentz group fixes, and its metric trace is multiplied by that element too. So a field +strength against an underived Higgs is a tensor of the same two or three indices as the +field strength alone. A once-derived Higgs contributes an index of its own, and a +bi-Lorentz family against a Lorentz vector is a triple Lorentz family. + +-/ + +/-- Multiplying a bi-Lorentz family by a Lorentz-inert element gives a bi-Lorentz family: + the element rides through the transformation law untouched. -/ +lemma IsBiLorentz.mul_fixed + (hmul : ∀ (Λ : SL(2,ℂ)) (x y : B), repLorentz Λ (x * y) = repLorentz Λ x * repLorentz Λ y) + {T : (Fin 2 → Fin 1 ⊕ Fin 3) → B} (hT : IsBiLorentz B repLorentz T) {y : B} + (hy : ∀ g : SL(2,ℂ), repLorentz g y = y) : + IsBiLorentz B repLorentz fun d => T d * y where + repLorentz_T g l := by + rw [hmul, hT.repLorentz_T g l, hy g, Finset.sum_mul] + exact Finset.sum_congr rfl fun a _ => smul_mul_assoc _ _ _ + +/-- The metric trace of a family multiplied on the right by a fixed element is the metric + trace of the family, multiplied by that element. -/ +lemma IsBiLorentz.metricContraction_mul (T : (Fin 2 → Fin 1 ⊕ Fin 3) → B) (y : B) : + IsBiLorentz.metricContraction (T := fun d => T d * y) + = IsBiLorentz.metricContraction (T := T) * y := by + rw [IsBiLorentz.metricContraction, IsBiLorentz.metricContraction, Finset.sum_mul] + exact Finset.sum_congr rfl fun d _ => (smul_mul_assoc _ _ _).symm + +/-- Multiplying a triple Lorentz family by a Lorentz-inert element gives a triple Lorentz + family. -/ +lemma IsTriLorentz.mul_fixed + (hmul : ∀ (Λ : SL(2,ℂ)) (x y : B), repLorentz Λ (x * y) = repLorentz Λ x * repLorentz Λ y) + {T : (Fin 3 → Fin 1 ⊕ Fin 3) → B} (hT : IsTriLorentz B repLorentz T) {y : B} + (hy : ∀ g : SL(2,ℂ), repLorentz g y = y) : + IsTriLorentz B repLorentz fun d => T d * y where + repLorentz_T g l := by + rw [hmul, hT.repLorentz_T g l, hy g, Finset.sum_mul] + exact Finset.sum_congr rfl fun a _ => smul_mul_assoc _ _ _ + +/-- A bi-Lorentz family against a Lorentz vector is a triple Lorentz family: the two + covector indices of the first factor and the single index of the second make three. -/ +lemma IsBiLorentz.isTriLorentz_mul_vector + (hmul : ∀ (Λ : SL(2,ℂ)) (x y : B), repLorentz Λ (x * y) = repLorentz Λ x * repLorentz Λ y) + {T : (Fin 2 → Fin 1 ⊕ Fin 3) → B} (hT : IsBiLorentz B repLorentz T) + {U : (Fin 1 ⊕ Fin 3) → B} + (hU : ∀ (g : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3), repLorentz g (U μ) + = ∑ ν : Fin 1 ⊕ Fin 3, (((SL2C.toLorentzGroup g).1 ν μ : ℝ) : ℂ) • U ν) : + IsTriLorentz B repLorentz fun d : Fin 3 → Fin 1 ⊕ Fin 3 => T ![d 0, d 1] * U (d 2) where + repLorentz_T g l := by + rw [hmul, hT.repLorentz_T g ![l 0, l 1], hU g (l 2), + StandardModel.IsGaugeSector.sum_cov_two, StandardModel.IsGaugeSector.sum_cov_three, + Finset.sum_mul] + refine Finset.sum_congr rfl fun x _ => ?_ + rw [Finset.sum_mul] + refine Finset.sum_congr rfl fun y _ => ?_ + rw [Finset.mul_sum] + refine Finset.sum_congr rfl fun z _ => ?_ + rw [smul_mul_assoc, mul_smul_comm, smul_smul] + congr 1 + all_goals simp [Fin.prod_univ_two, Fin.prod_univ_three, mul_assoc] + +end Lorentz + +namespace StandardModel + +open TensorProduct Matrix MatrixGroups Lorentz + +section Peeling + +variable {B : Type} [Ring B] [Algebra ℂ B] {repLorentz : Representation ℂ SL(2,ℂ) B} + +/-! + +## B. Peeling a join over an arbitrary index + +The gauge sector peels a join of spans indexed by a finite set, which is what its twelve +directions of the gauge algebra need. Here the families are indexed by a covector of the +gauge algebra together with a piece of Higgs material, and neither index is finite. Nothing +is lost: an element of a join lies in the join over finitely many of the summands, so the +finite peeling applies to it as it stands. The rest of the section collects the stability +and the inertness of products and joins that the peeling consumes. + +-/ + +/-- A Lorentz invariant of a join, over an arbitrary index type, of the spans of + bi-Lorentz families with vanishing metric traces lies in the stable submodule it is taken + modulo. An element of a join lies in a join over finitely many of the summands, so the + finite peeling of the gauge sector suffices. -/ +lemma mem_of_lorentz_invariant_iSup_isBiLorentz_span {ι : Type} + {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) {x : B} + (hx : x ∈ (⨆ i, (hT i).span) ⊔ S) + (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by + classical + obtain ⟨u, hu, z, hz, rfl⟩ := Submodule.mem_sup.1 hx + obtain ⟨s, hs⟩ := Submodule.mem_iSup_iff_exists_finset.1 hu + exact IsGaugeSector.mem_of_lorentz_invariant_biSup_isBiLorentz_span hT hzero S hS s + (Submodule.mem_sup.2 ⟨u, hs, z, hz, rfl⟩) hinv + +/-- A Lorentz invariant of a join, over an arbitrary index type, of the spans of triple + Lorentz families lies in the stable submodule it is taken modulo: three covector indices + admit no invariant contraction at all. -/ +lemma mem_of_lorentz_invariant_iSup_isTriLorentz_span {ι : Type} + {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) {x : B} + (hx : x ∈ (⨆ i, (hT i).span) ⊔ S) + (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by + classical + obtain ⟨u, hu, z, hz, rfl⟩ := Submodule.mem_sup.1 hx + obtain ⟨s, hs⟩ := Submodule.mem_iSup_iff_exists_finset.1 hu + exact IsGaugeSector.mem_of_lorentz_invariant_biSup_isTriLorentz_span hT S hS s + (Submodule.mem_sup.2 ⟨u, hs, z, hz, rfl⟩) hinv + +/-- A product of two pointwise Lorentz-inert submodules is pointwise Lorentz inert. -/ +lemma repLorentz_eq_self_of_mem_mul + (hmul : ∀ (Λ : SL(2,ℂ)) (x y : B), repLorentz Λ (x * y) = repLorentz Λ x * repLorentz Λ y) + {V W : Submodule ℂ B} (hV : ∀ (g : SL(2,ℂ)), ∀ y ∈ V, repLorentz g y = y) + (hW : ∀ (g : SL(2,ℂ)), ∀ y ∈ W, repLorentz g y = y) (g : SL(2,ℂ)) : + ∀ y ∈ V * W, repLorentz g y = y := by + intro y hy + refine Submodule.mul_induction_on hy (fun a ha b hb => ?_) fun a b ha hb => ?_ + · rw [hmul, hV g a ha, hW g b hb] + · rw [map_add, ha, hb] + +/-- A product of two Lorentz-stable submodules is Lorentz stable. -/ +lemma repLorentz_mem_mul_of_stable + (hmul : ∀ (Λ : SL(2,ℂ)) (x y : B), repLorentz Λ (x * y) = repLorentz Λ x * repLorentz Λ y) + {V W : Submodule ℂ B} (hV : ∀ (g : SL(2,ℂ)), ∀ y ∈ V, repLorentz g y ∈ V) + (hW : ∀ (g : SL(2,ℂ)), ∀ y ∈ W, repLorentz g y ∈ W) (g : SL(2,ℂ)) : + ∀ y ∈ V * W, repLorentz g y ∈ V * W := by + intro y hy + refine Submodule.mul_induction_on hy (fun a ha b hb => ?_) fun a b ha hb => ?_ + · rw [hmul] + exact Submodule.mul_mem_mul (hV g a ha) (hW g b hb) + · rw [map_add] + exact add_mem ha hb + +/-- A pointwise Lorentz-inert submodule is Lorentz stable. -/ +lemma repLorentz_mem_of_fixed {V : Submodule ℂ B} + (hV : ∀ (g : SL(2,ℂ)), ∀ y ∈ V, repLorentz g y = y) (g : SL(2,ℂ)) : + ∀ y ∈ V, repLorentz g y ∈ V := fun y hy => by rw [hV g y hy]; exact hy + +/-- A join of two Lorentz-stable submodules is Lorentz stable. -/ +lemma repLorentz_mem_sup_of_stable {V W : Submodule ℂ B} + (hV : ∀ (g : SL(2,ℂ)), ∀ y ∈ V, repLorentz g y ∈ V) + (hW : ∀ (g : SL(2,ℂ)), ∀ y ∈ W, repLorentz g y ∈ W) (g : SL(2,ℂ)) : + ∀ y ∈ V ⊔ W, repLorentz g y ∈ V ⊔ W := by + intro y hy + obtain ⟨a, ha, b, hb, rfl⟩ := Submodule.mem_sup.1 hy + rw [map_add] + exact Submodule.add_mem _ (Submodule.mem_sup_left (hV g a ha)) + (Submodule.mem_sup_right (hW g b hb)) + +end Peeling + +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) + +/-! + +## C. The underived Higgs is Lorentz inert + +The Higgs is a Lorentz scalar, and an underived symbol has no derivative slot for the +Lorentz matrix to act on, so it is fixed outright — and with it every element of the +submodule the underived symbols span. + +-/ + +/-- The underived Higgs and conjugate-Higgs symbols are Lorentz scalars with no derivative + slot to rotate, so every element of the weight-two Higgs submodule is fixed by the whole + Lorentz group. -/ +lemma repLorentz_eq_self_of_mem_higgs_derivSubmodule_zero (g : SL(2,ℂ)) {y : B} + (hy : y ∈ h.isHiggsSector.derivSubmodule 0) : repLorentz g y = y := by + have key : h.isHiggsSector.derivSubmodule 0 + ≤ LinearMap.ker (repLorentz g - LinearMap.id) := by + rw [IsHiggsSector.derivSubmodule] + refine sup_le ?_ ?_ + · rw [IsHiggsSector.higgsSubmodule] + refine iSup_le fun l => ?_ + rintro _ ⟨φ, rfl⟩ + simp only [LinearMap.mem_ker, LinearMap.sub_apply, LinearMap.id_apply, sub_eq_zero] + rw [h.isHiggsSector.repLorentz_H_apply g φ 0 l, + 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, Subsingleton.elim l ![]] + · rw [IsHiggsSector.barHiggsSubmodule] + refine iSup_le fun l => ?_ + rintro _ ⟨φ, rfl⟩ + simp only [LinearMap.mem_ker, LinearMap.sub_apply, LinearMap.id_apply, sub_eq_zero] + rw [h.isHiggsSector.repLorentz_barH_apply g φ 0 l, + 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, Subsingleton.elim l ![]] + simpa only [LinearMap.mem_ker, LinearMap.sub_apply, LinearMap.id_apply, sub_eq_zero] + using key hy + +/-! + +## D. Field strengths against Higgs material + +Three products have to be classified. An underived field strength against inert material is +a bi-Lorentz family whose metric trace vanishes with the antisymmetry of the field strength; +a once-derived one against inert material is a triple Lorentz family; and an underived one +against a once-derived Higgs is a triple Lorentz family as well, the Higgs supplying the +third index. The last is the only one in which a Higgs index moves at all. + +-/ + +/-- An underived field strength against Lorentz-inert material carries no Lorentz + invariant modulo a Lorentz-stable submodule. -/ +theorem mem_of_lorentz_invariant_derivSubmodule_zero_mul_fixed_sup (C : Submodule ℂ B) + (hC : ∀ (g : SL(2,ℂ)), ∀ y ∈ C, repLorentz g y = y) (S : Submodule ℂ B) + (hSL : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) {x : B} + (hx : x ∈ h.isGaugeSector.derivSubmodule 0 * C ⊔ S) + (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by + have hT : ∀ i : Module.Dual ℝ GaugeAlgebra × C, IsBiLorentz B repLorentz + (fun l : Fin 2 → Fin 1 ⊕ Fin 3 => F ![] (l 0) (l 1) i.1 * (i.2 : B)) := + fun i => (h.isGaugeSector.isBiLorentz_F_underived i.1).mul_fixed hrepLorentz_mul + fun g => hC g (i.2 : B) i.2.2 + have hzero : ∀ i : Module.Dual ℝ GaugeAlgebra × C, + IsBiLorentz.metricContraction + (T := fun l : Fin 2 → Fin 1 ⊕ Fin 3 => F ![] (l 0) (l 1) i.1 * (i.2 : B)) = 0 := by + intro i + refine IsGaugeSector.metricContraction_eq_zero_of_antisymm fun a b => ?_ + simp only [Matrix.cons_val_zero, Matrix.cons_val_one] + rw [h.isGaugeSector.F_antisymm ![] a b i.1, neg_mul] + refine mem_of_lorentz_invariant_iSup_isBiLorentz_span hT hzero S hSL ?_ hinv + refine sup_le_sup_right ?_ S hx + refine Submodule.mul_le.mpr fun a ha b hb => ?_ + have key : h.isGaugeSector.derivSubmodule 0 + ≤ Submodule.comap (LinearMap.mulRight ℂ b) (⨆ i, (hT i).span) := by + rw [IsGaugeSector.derivSubmodule] + refine iSup_le fun l => iSup_le fun μ => iSup_le fun ν => ?_ + rw [Submodule.span_le] + rintro _ ⟨φ, rfl⟩ + simp only [SetLike.mem_coe, Submodule.mem_comap, LinearMap.mulRight_apply] + rw [Subsingleton.elim l ![]] + refine Submodule.mem_iSup_of_mem (φ, ⟨b, hb⟩) (Submodule.mem_iSup_of_mem ![μ, ν] ?_) + simp only [Matrix.cons_val_zero, Matrix.cons_val_one] + exact Submodule.mem_span_singleton_self _ + exact key ha + +/-- A once-derived field strength against Lorentz-inert material carries no Lorentz + invariant modulo a Lorentz-stable submodule. -/ +theorem mem_of_lorentz_invariant_derivSubmodule_one_mul_fixed_sup (C : Submodule ℂ B) + (hC : ∀ (g : SL(2,ℂ)), ∀ y ∈ C, repLorentz g y = y) (S : Submodule ℂ B) + (hSL : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) {x : B} + (hx : x ∈ h.isGaugeSector.derivSubmodule 1 * C ⊔ S) + (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by + have hT : ∀ i : Module.Dual ℝ GaugeAlgebra × C, IsTriLorentz B repLorentz + (fun l : Fin 3 → Fin 1 ⊕ Fin 3 => F ![l 0] (l 1) (l 2) i.1 * (i.2 : B)) := + fun i => (h.isGaugeSector.isTriLorentz_F_deriv_one i.1).mul_fixed hrepLorentz_mul + fun g => hC g (i.2 : B) i.2.2 + refine mem_of_lorentz_invariant_iSup_isTriLorentz_span hT S hSL ?_ hinv + refine sup_le_sup_right ?_ S hx + refine Submodule.mul_le.mpr fun a ha b hb => ?_ + have key : h.isGaugeSector.derivSubmodule 1 + ≤ Submodule.comap (LinearMap.mulRight ℂ b) (⨆ i, (hT i).span) := by + rw [IsGaugeSector.derivSubmodule] + refine iSup_le fun l => iSup_le fun μ => iSup_le fun ν => ?_ + rw [Submodule.span_le] + rintro _ ⟨φ, rfl⟩ + simp only [SetLike.mem_coe, Submodule.mem_comap, LinearMap.mulRight_apply] + refine Submodule.mem_iSup_of_mem (φ, ⟨b, hb⟩) (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, IsGaugeSector.etaExpand_cov_one] + exact Submodule.mem_span_singleton_self _ + exact key ha + +/-- An underived field strength against a once-derived Higgs carries no Lorentz invariant + modulo a Lorentz-stable submodule: three covector indices admit no contraction. -/ +theorem mem_of_lorentz_invariant_derivSubmodule_zero_mul_higgs_one_sup (S : Submodule ℂ B) + (hSL : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) {x : B} + (hx : x ∈ h.isGaugeSector.derivSubmodule 0 * h.isHiggsSector.derivSubmodule 1 ⊔ S) + (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by + have hU : ∀ (j : Module.Dual ℂ HiggsVec ⊕ Module.Dual ℂ (ConjModule HiggsVec)) + (g : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3), + repLorentz g (Sum.elim (fun φ => H ![μ] φ) (fun ψ => barH ![μ] ψ) j) + = ∑ ν : Fin 1 ⊕ Fin 3, (((SL2C.toLorentzGroup g).1 ν μ : ℝ) : ℂ) • + Sum.elim (fun φ => H ![ν] φ) (fun ψ => barH ![ν] ψ) j := by + rintro (φ | ψ) g μ + · simp only [Sum.elim_inl] + rw [h.isHiggsSector.repLorentz_H_apply g φ 1 ![μ], IsGaugeSector.sum_cov_one] + exact Finset.sum_congr rfl fun ν _ => by simp + · simp only [Sum.elim_inr] + rw [h.isHiggsSector.repLorentz_barH_apply g ψ 1 ![μ], IsGaugeSector.sum_cov_one] + exact Finset.sum_congr rfl fun ν _ => by simp + have hT : ∀ i : Module.Dual ℝ GaugeAlgebra × + (Module.Dual ℂ HiggsVec ⊕ Module.Dual ℂ (ConjModule HiggsVec)), + IsTriLorentz B repLorentz (fun l : Fin 3 → Fin 1 ⊕ Fin 3 => F ![] (l 0) (l 1) i.1 * + Sum.elim (fun φ => H ![l 2] φ) (fun ψ => barH ![l 2] ψ) i.2) := + fun i => (h.isGaugeSector.isBiLorentz_F_underived i.1).isTriLorentz_mul_vector + hrepLorentz_mul (hU i.2) + refine mem_of_lorentz_invariant_iSup_isTriLorentz_span hT S hSL ?_ hinv + refine sup_le_sup_right ?_ S hx + refine Submodule.mul_le.mpr fun a ha b hb => ?_ + have key : ∀ (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), + h.isHiggsSector.derivSubmodule 1 + ≤ Submodule.comap (LinearMap.mulLeft ℂ (F ![] μ ν φ)) (⨆ i, (hT i).span) := by + intro μ ν φ + rw [IsHiggsSector.derivSubmodule] + refine sup_le ?_ ?_ + · rw [IsHiggsSector.higgsSubmodule] + refine iSup_le fun dd => ?_ + obtain ⟨ρ, rfl⟩ : ∃ ρ, dd = ![ρ] := ⟨dd 0, (IsGaugeSector.etaExpand_cov_one dd).symm⟩ + rintro _ ⟨ψ, rfl⟩ + simp only [Submodule.mem_comap, LinearMap.mulLeft_apply] + refine Submodule.mem_iSup_of_mem (φ, Sum.inl ψ) + (Submodule.mem_iSup_of_mem ![μ, ν, ρ] ?_) + simp only [Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.cons_val_two, + Matrix.tail_cons, Sum.elim_inl] + exact Submodule.mem_span_singleton_self _ + · rw [IsHiggsSector.barHiggsSubmodule] + refine iSup_le fun dd => ?_ + obtain ⟨ρ, rfl⟩ : ∃ ρ, dd = ![ρ] := ⟨dd 0, (IsGaugeSector.etaExpand_cov_one dd).symm⟩ + rintro _ ⟨ψ, rfl⟩ + simp only [Submodule.mem_comap, LinearMap.mulLeft_apply] + refine Submodule.mem_iSup_of_mem (φ, Sum.inr ψ) + (Submodule.mem_iSup_of_mem ![μ, ν, ρ] ?_) + simp only [Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.cons_val_two, + Matrix.tail_cons, Sum.elim_inr] + exact Submodule.mem_span_singleton_self _ + have hA : h.isGaugeSector.derivSubmodule 0 + ≤ Submodule.comap (LinearMap.mulRight ℂ b) (⨆ i, (hT i).span) := by + rw [IsGaugeSector.derivSubmodule] + refine iSup_le fun l => iSup_le fun μ => iSup_le fun ν => ?_ + rw [Submodule.span_le] + rintro _ ⟨φ, rfl⟩ + simp only [SetLike.mem_coe, Submodule.mem_comap, LinearMap.mulRight_apply] + rw [Subsingleton.elim l ![]] + exact key μ ν φ hb + exact hA ha + +/-! + +## E. Mass weights six and eight + +Weight six is a single product and section D settles it outright. Weight eight is a join of +three, and they are peeled one at a time, the two not yet peeled joining the error term — +which asks that they be Lorentz stable. The gauge and Higgs derivative submodules are, and +so are their products and joins. + +-/ + +/-- Mass weight six carries no Lorentz invariant modulo a Lorentz-stable submodule: a + Lorentz invariant of `sectorMassWeight {gauge, higgs} 6 ⊔ S` lies in `S`. The weight is + the underived field strength against the underived Higgs, whose two covector indices are + contracted only by the metric, and that trace vanishes. -/ +theorem mem_of_lorentz_invariant_sectorMassWeight_gauge_higgs_six_sup (S : Submodule ℂ B) + (hSL : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) {x : B} + (hx : x ∈ h.sectorMassWeight {GeneratorClass.gauge, GeneratorClass.higgs} 6 ⊔ S) + (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by + rw [h.sectorMassWeight_gauge_higgs_six] at hx + exact h.mem_of_lorentz_invariant_derivSubmodule_zero_mul_fixed_sup _ + (fun g y hy => h.repLorentz_eq_self_of_mem_higgs_derivSubmodule_zero g hy) S hSL hx hinv + +/-- Mass weight eight carries no Lorentz invariant modulo a Lorentz-stable submodule: a + Lorentz invariant of `sectorMassWeight {gauge, higgs} 8 ⊔ S` lies in `S`. The three + products making up the weight are peeled off one at a time, the two carrying three + covector indices by the absence of any contraction and the one carrying two by the + vanishing of the metric trace. -/ +theorem mem_of_lorentz_invariant_sectorMassWeight_gauge_higgs_eight_sup (S : Submodule ℂ B) + (hSL : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) {x : B} + (hx : x ∈ h.sectorMassWeight {GeneratorClass.gauge, GeneratorClass.higgs} 8 ⊔ S) + (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by + have hH0 : ∀ (g : SL(2,ℂ)), ∀ y ∈ h.isHiggsSector.derivSubmodule 0, repLorentz g y = y := + fun g y hy => h.repLorentz_eq_self_of_mem_higgs_derivSubmodule_zero g hy + have hH0H0 : ∀ (g : SL(2,ℂ)), ∀ y ∈ h.isHiggsSector.derivSubmodule 0 * + h.isHiggsSector.derivSubmodule 0, repLorentz g y = y := + repLorentz_eq_self_of_mem_mul hrepLorentz_mul hH0 hH0 + have hGst : ∀ (n : ℕ) (g : SL(2,ℂ)), ∀ y ∈ h.isGaugeSector.derivSubmodule n, + repLorentz g y ∈ h.isGaugeSector.derivSubmodule n := + fun n g y hy => h.isGaugeSector.derivSubmodule_map_repLorentz_le n g ⟨y, hy, rfl⟩ + have hBst := repLorentz_mem_mul_of_stable hrepLorentz_mul (hGst 0) + (repLorentz_mem_of_fixed hH0H0) + have hCst := repLorentz_mem_mul_of_stable hrepLorentz_mul (hGst 1) + (repLorentz_mem_of_fixed hH0) + rw [h.sectorMassWeight_gauge_higgs_eight, mul_assoc, sup_assoc, sup_assoc] at hx + exact h.mem_of_lorentz_invariant_derivSubmodule_one_mul_fixed_sup _ hH0 S hSL + (h.mem_of_lorentz_invariant_derivSubmodule_zero_mul_fixed_sup _ hH0H0 _ + (repLorentz_mem_sup_of_stable hCst hSL) + (h.mem_of_lorentz_invariant_derivSubmodule_zero_mul_higgs_one_sup _ + (repLorentz_mem_sup_of_stable hBst (repLorentz_mem_sup_of_stable hCst hSL)) hx hinv) + hinv) hinv + +/-! + +## F. The classification below mass weight nine + +The nine weights below nine are now settled: the sector vanishes below weight six and at +weight seven, and weights six and eight are section E. So below weight nine the gauge-Higgs +sector supplies no invariant beyond what `S` already carries, and the equivalences record it +in the shape the other sectors carry, so that all of them can be combined. + +-/ + +/-- Below mass weight nine the gauge-Higgs sector carries no Lorentz invariant: a Lorentz + invariant of `sectorMassWeight {gauge, higgs} w ⊔ S` for `w < 9` lies in `S`. Weights + below six and weight seven are trivial submodules, and weights six and eight are the two + index counts. -/ +theorem mem_of_invariant_sectorMassWeight_gauge_higgs_lt_nine_sup (w : ℕ) (hw : w < 9) + (S : Submodule ℂ B) (hSL : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) {x : B} + (hx : x ∈ h.sectorMassWeight {GeneratorClass.gauge, GeneratorClass.higgs} w ⊔ S) + (hL : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by + rcases lt_or_ge w 6 with hw6 | hw6 + · rwa [h.sectorMassWeight_gauge_higgs_eq_bot_of_lt_six hw6, bot_sup_eq] at hx + interval_cases w + · exact h.mem_of_lorentz_invariant_sectorMassWeight_gauge_higgs_six_sup S hSL hx hL + · rwa [h.sectorMassWeight_gauge_higgs_seven, bot_sup_eq] at hx + · exact h.mem_of_lorentz_invariant_sectorMassWeight_gauge_higgs_eight_sup S hSL hx hL + +set_option linter.unusedVariables false in +/-- The classification below mass weight nine as an equivalence, in the shape of the gauge- + and Yukawa-sector statements: an element of `sectorMassWeight {gauge, higgs} w ⊔ S` for + `w < 9` is fixed by both groups exactly when it is itself an element of `S` fixed by both + groups. Gauge stability of `S` is not needed, and neither is gauge invariance of `x`: the + forward direction is the index count, which uses the Lorentz group alone. -/ +theorem mem_sectorMassWeight_gauge_higgs_lt_nine_sup_and_gauge_lorentz_invariant_iff + (w : ℕ) (hw : w < 9) (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.sectorMassWeight {GeneratorClass.gauge, GeneratorClass.higgs} 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_invariant_sectorMassWeight_gauge_higgs_lt_nine_sup w 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 nine an element of + `sectorMassWeight {gauge, higgs} w ⊔ S` fixed by both groups is an element of `S` fixed by + both groups, and conversely. -/ +theorem mem_sectorMassWeight_gauge_higgs_lt_nine_sup_and_gauge_lorentz_invariant_iff_mem + (w : ℕ) (hw : w < 9) (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.sectorMassWeight {GeneratorClass.gauge, GeneratorClass.higgs} 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) := + ⟨fun hx => ⟨h.mem_of_invariant_sectorMassWeight_gauge_higgs_lt_nine_sup w hw S hSL + hx.1 hx.2.2, hx.2⟩, fun hx => ⟨Submodule.mem_sup_right hx.1, hx.2⟩⟩ + +end IsCovStandardModel + +end StandardModel diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/MassWeight/Filtration.lean b/Physlib/Particles/StandardModel/IsCovStandardModel/MassWeight/Filtration.lean new file mode 100644 index 000000000..d240cb756 --- /dev/null +++ b/Physlib/Particles/StandardModel/IsCovStandardModel/MassWeight/Filtration.lean @@ -0,0 +1,418 @@ +/- +Copyright (c) 2026 Joseph Tooby-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.Invariants +/-! +# The mass-weight filtration and the constant term + +The grading of the field algebra by mass weight answers one weight at a time. A +Lagrangian is not graded: it is a sum of terms of every weight up to a cut-off, and the +object that holds such a sum is the filtration `massWeightSubmoduleLE w`, the join of the +weight pieces of weight at most `w`. + +Passing from the grading to the filtration adds exactly one thing, and it is the thing the +graded statement had to exclude. `Invariants.lean` classifies the invariants of +`massWeightSubmodule w` for `0 < w ≤ 8`, and the lower bound is not an artefact: at weight +zero the field algebra contains the scalars, which are fixed by both groups and lie in no +given `S`, so no classification into a span plus a remainder in `S` can hold there. The +filtration contains weight zero, so the scalars have to be met rather than avoided — and +they are a genuine invariant, the constant term of mass dimension zero, the cosmological +term. + +Section B settles what the weight-zero piece is: the only word of total weight zero is the +empty word, every generator carrying positive weight, so `massWeightSubmodule 0` is exactly +the scalars, and the unit is fixed by both groups because both act by algebra maps. + +The classification then runs as it does for the grading. `Peels` is closed under joins in +its source, and the filtration is a join: each weight from one to eight peels to the +Standard-Model span of that weight by `peels_massWeightSubmodule`, weight zero peels to +itself, and the join of the nine is a peeling of the filtration. No independence of the +sectors, and none of the weights, is used anywhere. + +The answer at bound eight is the whole of the Standard Model below and at mass dimension +four: the constant term, the Higgs mass term `H† H`, and the dimension-four Lagrangian. + +- A. The mass-weight filtration +- B. The constant term at weight zero +- C. The span of the filtration +- D. Peeling the filtration +- E. The classification up to mass dimension four +- F. The Standard Model Lagrangian with its constant and mass terms + +-/ + +@[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) + +/-! + +## A. The mass-weight filtration + +-/ + +/-- The elements of the field algebra of mass weight at most `w`: the join of the + mass-weight submodules of weight `0` through `w`. This is where a Lagrangian lives, a + sum of terms of every mass dimension up to a cut-off rather than of a single one. -/ +noncomputable def massWeightSubmoduleLE (w : ℕ) : Submodule ℂ B := + ⨆ k ∈ Finset.range (w + 1), h.massWeightSubmodule k + +/-- Each graded piece of weight at most `w` sits inside the filtration at `w`. -/ +lemma massWeightSubmodule_le_massWeightSubmoduleLE {k w : ℕ} (hk : k ≤ w) : + h.massWeightSubmodule k ≤ h.massWeightSubmoduleLE w := + le_iSup₂_of_le k (Finset.mem_range.2 (Nat.lt_succ_of_le hk)) le_rfl + +/-- An element of a graded piece of weight at most `w` lies in the filtration at `w`. -/ +lemma mem_massWeightSubmoduleLE {k w : ℕ} (hk : k ≤ w) {x : B} + (hx : x ∈ h.massWeightSubmodule k) : x ∈ h.massWeightSubmoduleLE w := + h.massWeightSubmodule_le_massWeightSubmoduleLE hk hx + +/-- A submodule containing every graded piece of weight at most `w` contains the + filtration at `w`: the join is taken over exactly those pieces. -/ +lemma massWeightSubmoduleLE_le {w : ℕ} {V : Submodule ℂ B} + (hV : ∀ k ≤ w, h.massWeightSubmodule k ≤ V) : h.massWeightSubmoduleLE w ≤ V := + iSup₂_le fun k hk => hV k (Nat.lt_succ_iff.1 (Finset.mem_range.1 hk)) + +/-- The filtration grows with the bound. -/ +lemma massWeightSubmoduleLE_mono {w w' : ℕ} (hw : w ≤ w') : + h.massWeightSubmoduleLE w ≤ h.massWeightSubmoduleLE w' := + h.massWeightSubmoduleLE_le fun _ hk => + h.massWeightSubmodule_le_massWeightSubmoduleLE (hk.trans hw) + +/-- The filtration as a join over a finite index type, which is the form in which the + peeling of a join consumes it. -/ +lemma massWeightSubmoduleLE_eq_iSup (w : ℕ) : + h.massWeightSubmoduleLE w = ⨆ k : Fin (w + 1), h.massWeightSubmodule (k : ℕ) := + le_antisymm + (h.massWeightSubmoduleLE_le fun k hk => + le_iSup_of_le ⟨k, Nat.lt_succ_of_le hk⟩ le_rfl) + (iSup_le fun k => + h.massWeightSubmodule_le_massWeightSubmoduleLE (Nat.lt_succ_iff.1 k.isLt)) + +/-- The filtration is carried into itself by both groups: each graded piece is, and a + join of stable submodules is stable. -/ +lemma isStableUnder_massWeightSubmoduleLE (w : ℕ) : + IsStableUnder (gaugeLorentzMaps repGauge repLorentz) (h.massWeightSubmoduleLE w) := + isStableUnder_iSup fun _ => isStableUnder_iSup fun _ => + isStableUnder_gaugeLorentzMaps_iff.2 + ⟨fun g _ hy => h.repGauge_mem_massWeightSubmodule g hy, + fun Λ _ hy => h.repLorentz_mem_massWeightSubmodule Λ hy⟩ + +/-! + +## B. The constant term at weight zero + +-/ + +/-- The weight-zero part of the field algebra is the scalars. Every covariant generator + carries positive mass weight, so the only word of total weight zero is the empty one, + whose value is the unit. This is the constant term of the Lagrangian, of mass dimension + zero — the cosmological term. -/ +lemma massWeightSubmodule_zero : h.massWeightSubmodule 0 = 1 := by + rw [h.massWeightSubmodule_eq_span, Submodule.one_eq_span] + congr 1 + refine Set.eq_singleton_iff_unique_mem.2 ⟨⟨[], rfl, rfl⟩, ?_⟩ + rintro x ⟨gl, hw, rfl⟩ + cases gl with + | nil => rfl + | cons g t => + rw [List.map_cons, List.sum_cons] at hw + have hg := g.weight_pos + omega + +/-- The scalars are fixed by both groups: each acts by an algebra map, so each fixes the + unit. This is what makes the constant term an invariant, and it is what the backward + direction of the classification needs of the weight-zero part of the span. -/ +lemma isFixedBy_massWeightSubmodule_zero : + IsFixedBy (gaugeLorentzMaps repGauge repLorentz) (h.massWeightSubmodule 0) := by + rw [h.massWeightSubmodule_zero, Submodule.one_eq_span] + refine isFixedBy_span_singleton ?_ + rintro (g | Λ) + · exact h.repGauge_one g + · exact h.repLorentz_one Λ + +/-! + +## C. The span of the filtration + +-/ + +/-- The gauge- and Lorentz-invariant content of the Standard Model up to mass weight `w`: + the weight-zero part of the field algebra, which is the constant term, joined with the + Standard-Model span of every weight up to `w`. -/ +noncomputable def standardModelSpanLE (w : ℕ) : Submodule ℂ B := + h.massWeightSubmodule 0 ⊔ ⨆ k ∈ Finset.range (w + 1), h.standardModelSpan k + +/-- The constant term lies in the span of the filtration, at every bound. -/ +lemma massWeightSubmodule_zero_le_standardModelSpanLE (w : ℕ) : + h.massWeightSubmodule 0 ≤ h.standardModelSpanLE w := by + rw [standardModelSpanLE] + exact le_sup_left + +/-- The graded span of a weight at most `w` lies in the span of the filtration at `w`. -/ +lemma standardModelSpan_le_standardModelSpanLE {k w : ℕ} (hk : k ≤ w) : + h.standardModelSpan k ≤ h.standardModelSpanLE w := by + rw [standardModelSpanLE] + exact le_sup_of_le_right (le_iSup₂_of_le k (Finset.mem_range.2 (Nat.lt_succ_of_le hk)) le_rfl) + +/-- The span of the filtration at `w` has mass weight at most `w`: the constant term has + weight zero and each graded span has its own weight. -/ +lemma standardModelSpanLE_le_massWeightSubmoduleLE (w : ℕ) : + h.standardModelSpanLE w ≤ h.massWeightSubmoduleLE w := + sup_le (h.massWeightSubmodule_le_massWeightSubmoduleLE (Nat.zero_le w)) + (iSup₂_le fun k hk => (h.standardModelSpan_le_massWeightSubmodule k).trans + (h.massWeightSubmodule_le_massWeightSubmoduleLE + (Nat.lt_succ_iff.1 (Finset.mem_range.1 hk)))) + +/-- The span of the filtration is fixed pointwise by the gauge and Lorentz groups + together. At positive weight this is the fixedness of the graded spans; at weight zero + it is the fixedness of the unit, and that is the only new content of the filtration. -/ +lemma isFixedBy_standardModelSpanLE (w : ℕ) : + IsFixedBy (gaugeLorentzMaps repGauge repLorentz) (h.standardModelSpanLE w) := + h.isFixedBy_massWeightSubmodule_zero.sup + (isFixedBy_iSup fun k => isFixedBy_iSup fun _ => h.isFixedBy_standardModelSpan k) + +/-- Every element of the span of the filtration is a gauge invariant. -/ +lemma repGauge_of_mem_standardModelSpanLE (w : ℕ) (g : GaugeGroupI) {y : B} + (hy : y ∈ h.standardModelSpanLE w) : repGauge g y = y := + h.isFixedBy_standardModelSpanLE w (Sum.inl g) y hy + +/-- Every element of the span of the filtration is a Lorentz invariant. -/ +lemma repLorentz_of_mem_standardModelSpanLE (w : ℕ) (Λ : SL(2,ℂ)) {y : B} + (hy : y ∈ h.standardModelSpanLE w) : repLorentz Λ y = y := + h.isFixedBy_standardModelSpanLE w (Sum.inr Λ) y hy + +/-- The span of the filtration at bound eight in reduced form. Of the nine graded spans + only two are non-trivial, the Higgs mass term at weight four and the dimension-four + Lagrangian at weight eight, so what survives up to mass dimension four is the constant + term, the Higgs mass term, and the Lagrangian. -/ +lemma standardModelSpanLE_eight : + h.standardModelSpanLE 8 = (1 : Submodule ℂ B) ⊔ (h.isHiggsSector.dotSpan 0 0 + ⊔ (h.isGaugeSector.lorentzContractionEightSpan + ⊔ h.isHiggsSector.lorentzContractionEightSpan + ⊔ (h.isFermionSector.kineticSpan ⊔ h.yukawaSpan))) := by + rw [standardModelSpanLE, h.massWeightSubmodule_zero, ← h.standardModelSpan_eight, + ← h.standardModelSpan_four] + congr 1 + refine le_antisymm (iSup₂_le fun k hk => ?_) (sup_le ?_ ?_) + · rw [Finset.mem_range] at hk + by_cases hk8 : k = 8 + · subst hk8 + exact le_sup_right + by_cases hk4 : k = 4 + · subst hk4 + exact le_sup_left + · rw [h.standardModelSpan_eq_bot hk8 hk4] + exact bot_le + · exact le_iSup₂_of_le 4 (by decide) le_rfl + · exact le_iSup₂_of_le 8 (by decide) le_rfl + +/-! + +## D. Peeling the filtration + +-/ + +/-- The filtration peels to its span, at every bound up to eight. The filtration is a + join of the graded pieces, each of them stable under both groups, and `Peels` is closed + under joins in its source: the weights are taken one at a time, each in turn joining the + error term of the others. At positive weight the graded peeling of `Invariants.lean` is + used; at weight zero a submodule peels to itself, the constant term being carried in the + span. -/ +lemma peels_massWeightSubmoduleLE {w : ℕ} (hw : w ≤ 8) : + Peels (gaugeLorentzMaps repGauge repLorentz) (h.massWeightSubmoduleLE w) + (h.standardModelSpanLE w) := by + rw [h.massWeightSubmoduleLE_eq_iSup] + refine Peels.iSup (fun k => ?_) (fun _ => ?_) + (h.isFixedBy_standardModelSpanLE w).isStableUnder + · have hkw : (k : ℕ) ≤ w := Nat.lt_succ_iff.1 k.isLt + rcases Nat.eq_zero_or_pos (k : ℕ) with hk0 | hk0 + · rw [hk0] + exact peels_of_le (h.massWeightSubmodule_zero_le_standardModelSpanLE w) + · exact (h.peels_massWeightSubmodule hk0 (hkw.trans hw)).mono_right + (h.standardModelSpan_le_standardModelSpanLE hkw) + · exact isStableUnder_gaugeLorentzMaps_iff.2 + ⟨fun g _ hy => h.repGauge_mem_massWeightSubmodule g hy, + fun Λ _ hy => h.repLorentz_mem_massWeightSubmodule Λ hy⟩ + +/-! + +## E. The classification up to mass dimension four + +-/ + +/-- The gauge and Lorentz invariants of mass weight at most `w`, for `w ≤ 8`, modulo a + submodule `S` stable under both groups: such an invariant is a combination of the + constant term and the Standard-Model terms of weight at most `w`, plus a remainder in + `S`, and the remainder is fixed by both groups as well, being the difference of two + invariants. -/ +theorem exists_mem_standardModelSpanLE_of_gauge_and_lorentz_invariant (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} + (hx : x ∈ h.massWeightSubmoduleLE w ⊔ S) + (hG : ∀ g : GaugeGroupI, repGauge g x = x) + (hL : ∀ 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.standardModelSpanLE w := by + obtain ⟨z, hz, y, hy, rfl⟩ := Submodule.mem_sup.1 + (h.peels_massWeightSubmoduleLE hw S (isStableUnder_gaugeLorentzMaps_iff.2 ⟨hS, hSL⟩) + x hx (forall_gaugeLorentzMaps_eq_self_iff.2 ⟨hG, hL⟩)) + refine ⟨y, hy, fun g => ?_, fun g => ?_, by simpa using hz⟩ + · have hstep := hG g + rw [map_add, h.repGauge_of_mem_standardModelSpanLE w g hz, add_right_inj] at hstep + exact hstep + · have hstep := hL g + rw [map_add, h.repLorentz_of_mem_standardModelSpanLE w g hz, add_right_inj] at hstep + exact hstep + +/-- The classification of the Standard Model up to mass weight `w ≤ 8` as an equivalence, + in the shape every sector uses: an element of `massWeightSubmoduleLE w ⊔ S`, with `S` + stable under both groups, is fixed by both groups exactly when it is a combination of + the constant term and the Standard-Model terms of weight at most `w`, up to a remainder + in `S` fixed by both groups. -/ +theorem mem_massWeightSubmoduleLE_sup_and_gauge_lorentz_invariant_iff (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.massWeightSubmoduleLE 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 ∈ h.standardModelSpanLE w := by + refine ⟨fun hx => h.exists_mem_standardModelSpanLE_of_gauge_and_lorentz_invariant w hw + S hS hSL hx.1 hx.2.1 hx.2.2, ?_⟩ + rintro ⟨y, hyS, hyG, hyL, hxy⟩ + refine ⟨?_, fun g => ?_, fun g => ?_⟩ + · have hsum : x - y + y ∈ h.massWeightSubmoduleLE w ⊔ S := + Submodule.add_mem _ + (Submodule.mem_sup_left (h.standardModelSpanLE_le_massWeightSubmoduleLE w hxy)) + (Submodule.mem_sup_right hyS) + simpa using hsum + · have hstep : repGauge g (x - y + y) = x - y + y := by + rw [map_add, h.repGauge_of_mem_standardModelSpanLE w g hxy, hyG g] + simpa using hstep + · have hstep : repLorentz g (x - y + y) = x - y + y := by + rw [map_add, h.repLorentz_of_mem_standardModelSpanLE w g hxy, hyL g] + simpa using hstep + +/-- The same classification without the existential: at every bound up to eight an element + of `massWeightSubmoduleLE w ⊔ S` fixed by both groups is an element of the span of the + filtration joined with `S` fixed by both groups, and conversely. -/ +theorem mem_massWeightSubmoduleLE_sup_and_gauge_lorentz_invariant_iff_mem (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.massWeightSubmoduleLE w ⊔ S ∧ (∀ g : GaugeGroupI, repGauge g x = x) + ∧ ∀ g : SL(2,ℂ), repLorentz g x = x) + ↔ (x ∈ h.standardModelSpanLE w ⊔ S ∧ (∀ g : GaugeGroupI, repGauge g x = x) + ∧ ∀ g : SL(2,ℂ), repLorentz g x = x) := by + constructor + · rintro ⟨hxm, hG, hL⟩ + obtain ⟨y, hyS, -, -, hxy⟩ := + h.exists_mem_standardModelSpanLE_of_gauge_and_lorentz_invariant w hw S hS hSL hxm hG hL + refine ⟨?_, hG, hL⟩ + have hsum : x - y + y ∈ h.standardModelSpanLE w ⊔ S := + Submodule.add_mem _ (Submodule.mem_sup_left hxy) (Submodule.mem_sup_right hyS) + simpa using hsum + · rintro ⟨hxm, hG, hL⟩ + exact ⟨sup_le_sup_right (h.standardModelSpanLE_le_massWeightSubmoduleLE w) S hxm, hG, hL⟩ + +/-! + +## F. The Standard Model Lagrangian with its constant and mass terms + +-/ + +/-- The classification at bound eight, that is at mass dimension at most four, as an + equivalence: an element of `massWeightSubmoduleLE 8 ⊔ S`, with `S` stable under both + groups, is fixed by both groups exactly when it lies in the span of the filtration up to + a remainder in `S` fixed by both groups. -/ +theorem mem_massWeightSubmoduleLE_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.massWeightSubmoduleLE 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.standardModelSpanLE 8 := + h.mem_massWeightSubmoduleLE_sup_and_gauge_lorentz_invariant_iff 8 le_rfl S hS hSL x + +/-- The same at bound eight without the existential. -/ +theorem mem_massWeightSubmoduleLE_eight_sup_and_gauge_lorentz_invariant_iff_mem + (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.massWeightSubmoduleLE 8 ⊔ S ∧ (∀ g : GaugeGroupI, repGauge g x = x) + ∧ ∀ g : SL(2,ℂ), repLorentz g x = x) + ↔ (x ∈ h.standardModelSpanLE 8 ⊔ S ∧ (∀ g : GaugeGroupI, repGauge g x = x) + ∧ ∀ g : SL(2,ℂ), repLorentz g x = x) := + h.mem_massWeightSubmoduleLE_sup_and_gauge_lorentz_invariant_iff_mem 8 le_rfl S hS hSL x + +/-- The invariant content of the Standard Model up to mass dimension four. An element of + `massWeightSubmoduleLE 8 ⊔ S`, for `S` a submodule stable under both groups, is fixed by + the gauge group and the Lorentz group exactly when it is a combination of + the constant term, of mass dimension zero, + the Higgs mass term `H† H`, of mass dimension two (`IsHiggsSector.dotSpan`), + and the Standard-Model Lagrangian of mass dimension four — the gauge kinetic and theta + terms of the three gauge groups (`IsGaugeSector.lorentzContractionEightSpan`), the Higgs + kinetic term, its quartic potential and its two box terms + (`IsHiggsSector.lorentzContractionEightSpan`), the kinetic terms of the ten fermion + species over the nine family pairs (`IsFermionSector.kineticSpan`), and the six Yukawa + couplings over the nine family pairs (`yukawaSpan`) — + up to a remainder in `S` fixed by both groups, and nothing else. -/ +theorem mem_massWeightSubmoduleLE_eight_sup_and_gauge_lorentz_invariant_iff_lagrangian + (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.massWeightSubmoduleLE 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 ∈ (1 : Submodule ℂ B) ⊔ (h.isHiggsSector.dotSpan 0 0 + ⊔ (h.isGaugeSector.lorentzContractionEightSpan + ⊔ h.isHiggsSector.lorentzContractionEightSpan + ⊔ (h.isFermionSector.kineticSpan ⊔ h.yukawaSpan))) := by + rw [← h.standardModelSpanLE_eight] + exact h.mem_massWeightSubmoduleLE_eight_sup_and_gauge_lorentz_invariant_iff S hS hSL x + +end IsCovStandardModel + +end StandardModel diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/MassWeight/Invariants.lean b/Physlib/Particles/StandardModel/IsCovStandardModel/MassWeight/Invariants.lean new file mode 100644 index 000000000..6acd658d4 --- /dev/null +++ b/Physlib/Particles/StandardModel/IsCovStandardModel/MassWeight/Invariants.lean @@ -0,0 +1,564 @@ +/- +Copyright (c) 2026 Joseph Tooby-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.FermionGaugeSector.MassWeight +public import Physlib.Particles.StandardModel.IsCovStandardModel.GaugeHiggsSector.MassWeight +public import Physlib.Particles.StandardModel.IsCovStandardModel.MixedSector.Basic +public import Physlib.Particles.StandardModel.IsCovStandardModel.YukawaSector.MassDimEight +public import Physlib.Particles.StandardModel.IsFermionSector.MassWeight.MassDimEight +public import Physlib.Particles.StandardModel.IsFermionSector.MassWeight.MassDimLTEight +public import Physlib.Particles.StandardModel.IsGaugeSector.MassWeight.MassDimEight +public import Physlib.Particles.StandardModel.IsHiggsSector.MassWeight.MassDimEight +/-! +# The invariant content of the Standard Model + +This is where the classification of the Standard Model closes. A word in the covariant +generators realises a set of generator classes — gauge, Higgs, fermion — and the eight +class sets cut the field algebra into eight sectors, each of which has been classified +separately at every mass weight up to eight, that is at every mass dimension up to four. +This file joins the eight, and the answer is the Standard Model Lagrangian: + +**at mass dimension four the gauge- and Lorentz-invariant content of the Standard Model +is the gauge kinetic and theta terms of the three gauge groups, the Higgs kinetic term +with its quartic potential and its two box terms, the kinetic terms of the ten fermion +species over the nine family pairs, and the six Yukawa couplings over the nine family +pairs — and nothing else.** + +Below mass dimension four there is a single term, the Higgs mass term `H† H` at mass +weight four; below that, nothing. + +The join is the delicate step. `massWeightSubmodule_eq_iSup_sectorMassWeight` writes the +weight-`w` submodule as the join of the eight sectors' weight-`w` parts, but reading off +from an invariant of the whole that its eight pieces are separately invariant would need +the pieces to be determined by their sum — the independence of the sectors, which does +not follow from `IsCovStandardModel` and is deliberately left open in `Sectors.lean`. + +Nothing here uses it. The classifications are carried in the shared form `Peels σ V W` of +`Peeling.lean` — every `σ`-invariant of `V ⊔ S` lies in `W ⊔ S`, for every `σ`-stable `S` +— and that relation is closed under joins in its source. Joining the sectors therefore +asks only that each of them be carried into itself by the two groups, which they are +(`repGauge_mem_sectorMassWeight`, `repLorentz_mem_sectorMassWeight`). The eight are taken +one at a time, each in turn joining the error term of the others, and independence never +enters. + +Section A collects the surviving spans of the eight sectors into `standardModelSpan`, and +section B checks that it is made of invariants of the right mass weight, which is both the +easy direction of the classification and the stability the peeling asks of its target. +Section C converts each sector's classification into a peeling, section D joins them, and +sections E and F read off the equivalence and its consequence at mass dimension four. + +- A. The span of the Standard Model Lagrangian +- B. The span is made of invariants of the right weight +- C. Each sector peels to the span +- D. Joining the eight sectors +- E. The classification at mass dimension at most four +- F. The Standard Model Lagrangian + +The weight is bounded below as well as above. At weight zero the field algebra contains +the scalars, which are fixed by both groups and lie in no given `S`; every one of the +sector classifications combined here excludes that weight for the same reason. + +-/ + +@[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) + +/-! + +## A. The span of the Standard Model Lagrangian + +-/ + +/-- The gauge- and Lorentz-invariant content of the Standard Model at mass weight `w`: + the join of the surviving spans of the eight sectors. At weight eight it is the gauge + sector's four Lorentz contractions — the kinetic and theta terms of the three gauge + groups — together with the Higgs sector's two box terms, kinetic term and quartic + potential, the fermion sector's ten kinetic terms over the nine family pairs, and the + six Yukawa couplings over the nine family pairs. Below weight eight only the Higgs + sector survives, and only at weight four, where it contributes the Higgs mass term. -/ +noncomputable def standardModelSpan (w : ℕ) : Submodule ℂ B := + if w = 8 then + h.isGaugeSector.lorentzContractionEightSpan + ⊔ h.isHiggsSector.lorentzContractionEightSpan + ⊔ (h.isFermionSector.kineticSpan ⊔ h.yukawaSpan) + else h.isHiggsSector.lorentzContractionLTEightSpan w + +/-- At mass weight eight the span is the gauge, Higgs, fermion and Yukawa spans + together. -/ +lemma standardModelSpan_eight : + h.standardModelSpan 8 = h.isGaugeSector.lorentzContractionEightSpan + ⊔ h.isHiggsSector.lorentzContractionEightSpan + ⊔ (h.isFermionSector.kineticSpan ⊔ h.yukawaSpan) := + if_pos rfl + +/-- At mass weight four the span is the line through the Higgs mass term `H† H`, the one + invariant of the Standard Model below mass dimension four. -/ +lemma standardModelSpan_four : h.standardModelSpan 4 = h.isHiggsSector.dotSpan 0 0 := by + rw [standardModelSpan, if_neg (by norm_num), IsHiggsSector.lorentzContractionLTEightSpan, + if_pos rfl] + +/-- At every mass weight other than four and eight the span is trivial: apart from the + Higgs mass term there is no Standard-Model term below mass dimension four. -/ +lemma standardModelSpan_eq_bot {w : ℕ} (hw : w ≠ 8) (hw4 : w ≠ 4) : + h.standardModelSpan w = ⊥ := by + rw [standardModelSpan, if_neg hw, IsHiggsSector.lorentzContractionLTEightSpan, + if_neg hw4] + +/-! + +## B. The span is made of invariants of the right weight + +-/ + +/-- At a non-zero weight the gauge sector's mass-weight submodule sits inside the + covariant model's, being the `{gauge}` piece of the sector decomposition there. -/ +lemma isGaugeSector_massWeightSubmodule_le {w : ℕ} (hw : w ≠ 0) : + h.isGaugeSector.massWeightSubmodule w ≤ h.massWeightSubmodule w := by + rw [← h.sectorMassWeight_gauge_eq hw] + exact h.sectorMassWeight_le_massWeightSubmodule _ w + +/-- At a non-zero weight the Higgs sector's mass-weight submodule sits inside the + covariant model's. -/ +lemma isHiggsSector_massWeightSubmodule_le {w : ℕ} (hw : w ≠ 0) : + h.isHiggsSector.massWeightSubmodule w ≤ h.massWeightSubmodule w := by + rw [← h.sectorMassWeight_higgs_eq hw] + exact h.sectorMassWeight_le_massWeightSubmodule _ w + +/-- At a non-zero weight the fermion sector's mass-weight submodule sits inside the + covariant model's. -/ +lemma isFermionSector_massWeightSubmodule_le {w : ℕ} (hw : w ≠ 0) : + h.isFermionSector.massWeightSubmodule w ≤ h.massWeightSubmodule w := by + rw [← h.sectorMassWeight_fermion_eq hw] + exact h.sectorMassWeight_le_massWeightSubmodule _ w + +/-- The span at weight `w` has mass weight `w`: each of its contributions is a + combination of words of that weight. -/ +lemma standardModelSpan_le_massWeightSubmodule (w : ℕ) : + h.standardModelSpan w ≤ h.massWeightSubmodule w := by + rw [standardModelSpan] + split_ifs with hw + · subst hw + refine sup_le (sup_le ?_ ?_) (sup_le ?_ ?_) + · exact h.isGaugeSector.lorentzContractionEightSpan_le_massWeightSubmodule.trans + (h.isGaugeSector_massWeightSubmodule_le (by norm_num)) + · exact h.isHiggsSector.lorentzContractionEightSpan_le_massWeightSubmodule.trans + (h.isHiggsSector_massWeightSubmodule_le (by norm_num)) + · exact h.isFermionSector.kineticSpan_le_massWeightSubmodule.trans + (h.isFermionSector_massWeightSubmodule_le (by norm_num)) + · exact h.yukawaSpan_le_inf.trans (le_trans inf_le_left (le_trans inf_le_left + (h.sectorMassWeight_le_massWeightSubmodule _ 8))) + · by_cases hw4 : w = 4 + · subst hw4 + exact (h.isHiggsSector.lorentzContractionLTEightSpan_le_massWeightSubmodule 4).trans + (h.isHiggsSector_massWeightSubmodule_le (by norm_num)) + · rw [IsHiggsSector.lorentzContractionLTEightSpan, if_neg hw4] + exact bot_le + +/-- The span at weight `w` is fixed pointwise by the gauge and Lorentz groups together: + every one of its contributions is a span of invariants. This is the easy direction of + the classification, and it is also what supplies the stability the peeling asks of its + target. -/ +lemma isFixedBy_standardModelSpan (w : ℕ) : + IsFixedBy (gaugeLorentzMaps repGauge repLorentz) (h.standardModelSpan w) := by + have key : ∀ V : Submodule ℂ B, (∀ g : GaugeGroupI, ∀ y ∈ V, repGauge g y = y) → + (∀ Λ : SL(2,ℂ), ∀ y ∈ V, repLorentz Λ y = y) → + IsFixedBy (gaugeLorentzMaps repGauge repLorentz) V := by + rintro V hG hL (g | Λ) y hy + · exact hG g y hy + · exact hL Λ y hy + rw [standardModelSpan] + split_ifs with hw + · refine IsFixedBy.sup (IsFixedBy.sup (key _ (fun g y hy => ?_) (fun Λ y hy => ?_)) + (key _ (fun g y hy => ?_) (fun Λ y hy => ?_))) + (IsFixedBy.sup (key _ (fun g y hy => ?_) (fun Λ y hy => ?_)) ?_) + · exact (Representation.mem_invariants _ _).1 + (h.isGaugeSector.lorentzContractionEightSpan_le_invariants hy) g + · exact (Representation.mem_invariants _ _).1 + (h.isGaugeSector.lorentzContractionEightSpan_le_lorentzInvariants hy) Λ + · exact h.isHiggsSector.rep_of_mem_lorentzContractionEightSpan g hy + · exact h.isHiggsSector.repLorentz_of_mem_lorentzContractionEightSpan Λ hy + · exact (Representation.mem_invariants _ _).1 + (h.isFermionSector.kineticSpan_le_invariants hy) g + · exact (Representation.mem_invariants _ _).1 + (h.isFermionSector.kineticSpan_le_lorentzInvariants hy) Λ + · exact h.isFixedBy_yukawaSpan + · exact key _ + (fun g y hy => h.isHiggsSector.rep_of_mem_lorentzContractionLTEightSpan w g hy) + (fun Λ y hy => h.isHiggsSector.repLorentz_of_mem_lorentzContractionLTEightSpan w Λ hy) + +/-- Every element of the span at weight `w` is a gauge invariant. -/ +lemma repGauge_of_mem_standardModelSpan (w : ℕ) (g : GaugeGroupI) {y : B} + (hy : y ∈ h.standardModelSpan w) : repGauge g y = y := + h.isFixedBy_standardModelSpan w (Sum.inl g) y hy + +/-- Every element of the span at weight `w` is a Lorentz invariant. -/ +lemma repLorentz_of_mem_standardModelSpan (w : ℕ) (Λ : SL(2,ℂ)) {y : B} + (hy : y ∈ h.standardModelSpan w) : repLorentz Λ y = y := + h.isFixedBy_standardModelSpan w (Sum.inr Λ) y hy + +/-! + +## C. Each sector peels to the span + +-/ + +/-- The empty sector peels: away from weight zero it is trivial, its only word being the + empty one. -/ +lemma peels_sectorMassWeight_empty {w : ℕ} (hw : w ≠ 0) : + Peels (gaugeLorentzMaps repGauge repLorentz) (h.sectorMassWeight ∅ w) + (h.standardModelSpan w) := by + rw [h.sectorMassWeight_empty_of_ne_zero hw] + exact peels_of_le bot_le + +/-- The gauge sector peels: at weight eight to its four Lorentz contractions, below it to + nothing at all. -/ +lemma peels_sectorMassWeight_gauge {w : ℕ} (hw0 : 0 < w) (hw : w ≤ 8) : + Peels (gaugeLorentzMaps repGauge repLorentz) + (h.sectorMassWeight {GeneratorClass.gauge} w) (h.standardModelSpan w) := by + intro S hS x hx hinv + obtain ⟨hSG, hSL⟩ := isStableUnder_gaugeLorentzMaps_iff.1 hS + obtain ⟨hG, hL⟩ := forall_gaugeLorentzMaps_eq_self_iff.1 hinv + have hx' : x ∈ h.isGaugeSector.massWeightSubmodule w ⊔ S := + sup_le_sup_right (h.sectorMassWeight_gauge_le w) S hx + rcases eq_or_lt_of_le hw with rfl | hw8 + · obtain ⟨y, hyS, -, -, hxy⟩ := + h.isGaugeSector.exists_mem_of_gauge_and_lorentz_invariant S hSG hSL hx' hG hL + refine Submodule.mem_sup.2 ⟨x - y, ?_, y, hyS, by abel⟩ + rw [h.standardModelSpan_eight] + exact Submodule.mem_sup_left (Submodule.mem_sup_left hxy) + · exact Submodule.mem_sup_right + (h.isGaugeSector.mem_of_lorentz_invariant_massWeightSubmodule_lt_eight_sup w hw0 hw8 + S hSL hx' hL) + +/-- The Higgs sector peels: at weight eight to the two box terms, the kinetic term and the + quartic potential, at weight four to the Higgs mass term, and elsewhere to nothing. -/ +lemma peels_sectorMassWeight_higgs {w : ℕ} (hw0 : 0 < w) (hw : w ≤ 8) : + Peels (gaugeLorentzMaps repGauge repLorentz) + (h.sectorMassWeight {GeneratorClass.higgs} w) (h.standardModelSpan w) := by + intro S hS x hx hinv + obtain ⟨hSG, hSL⟩ := isStableUnder_gaugeLorentzMaps_iff.1 hS + obtain ⟨hG, hL⟩ := forall_gaugeLorentzMaps_eq_self_iff.1 hinv + have hx' : x ∈ h.isHiggsSector.massWeightSubmodule w ⊔ S := + sup_le_sup_right (h.sectorMassWeight_higgs_le w) S hx + rcases eq_or_lt_of_le hw with rfl | hw8 + · obtain ⟨y, hyS, -, -, hxy⟩ := + h.isHiggsSector.exists_mem_of_gauge_and_lorentz_invariant S hSG hSL hx' hG hL + refine Submodule.mem_sup.2 ⟨x - y, ?_, y, hyS, by abel⟩ + rw [h.standardModelSpan_eight] + exact Submodule.mem_sup_left (Submodule.mem_sup_right hxy) + · obtain ⟨y, hyS, -, -, hxy⟩ := + h.isHiggsSector.exists_mem_of_gauge_lorentz_invariant_massWeightSubmodule_lt_eight_sup + w hw0 hw8 S hSG hSL hx' hG hL + refine Submodule.mem_sup.2 ⟨x - y, ?_, y, hyS, by abel⟩ + rwa [standardModelSpan, if_neg (by omega)] + +/-- The fermion sector peels: at weight eight to the ten kinetic terms over the nine + family pairs, below it to nothing — there is no Dirac mass term. -/ +lemma peels_sectorMassWeight_fermion {w : ℕ} (hw0 : 0 < w) (hw : w ≤ 8) : + Peels (gaugeLorentzMaps repGauge repLorentz) + (h.sectorMassWeight {GeneratorClass.fermion} w) (h.standardModelSpan w) := by + intro S hS x hx hinv + obtain ⟨hSG, hSL⟩ := isStableUnder_gaugeLorentzMaps_iff.1 hS + obtain ⟨hG, hL⟩ := forall_gaugeLorentzMaps_eq_self_iff.1 hinv + have hx' : x ∈ h.isFermionSector.massWeightSubmodule w ⊔ S := + sup_le_sup_right (h.sectorMassWeight_fermion_le w) S hx + rcases eq_or_lt_of_le hw with rfl | hw8 + · obtain ⟨y, hyS, -, -, hxy⟩ := + h.isFermionSector.exists_mem_of_gauge_and_lorentz_invariant S hSG hSL hx' hG hL + refine Submodule.mem_sup.2 ⟨x - y, ?_, y, hyS, by abel⟩ + rw [h.standardModelSpan_eight] + exact Submodule.mem_sup_right (Submodule.mem_sup_left hxy) + · exact Submodule.mem_sup_right + (h.isFermionSector.mem_of_invariant_massWeightSubmodule_lt_eight_sup w hw0 hw8 S hSG + hSL hx' hG hL) + +/-- The Yukawa sector peels: at weight eight to the six Yukawa couplings over the nine + family pairs, below it to nothing. -/ +lemma peels_sectorMassWeight_higgs_fermion {w : ℕ} (hw : w ≤ 8) : + Peels (gaugeLorentzMaps repGauge repLorentz) + (h.sectorMassWeight {GeneratorClass.higgs, GeneratorClass.fermion} w) + (h.standardModelSpan w) := by + intro S hS x hx hinv + obtain ⟨hSG, hSL⟩ := isStableUnder_gaugeLorentzMaps_iff.1 hS + obtain ⟨hG, hL⟩ := forall_gaugeLorentzMaps_eq_self_iff.1 hinv + rcases eq_or_lt_of_le hw with rfl | hw8 + · refine sup_le_sup_right ?_ S + (h.mem_yukawaSpan_sup_of_gauge_and_lorentz_invariant S hSG hSL hx hG hL) + rw [h.standardModelSpan_eight] + exact le_sup_right.trans le_sup_right + · exact Submodule.mem_sup_right + (h.mem_of_lorentz_invariant_sectorMassWeight_higgs_fermion_lt_eight_sup w hw8 S hSL + hx hL) + +/-- The gauge-Higgs sector peels to nothing: it carries no invariant below weight nine. -/ +lemma peels_sectorMassWeight_gauge_higgs {w : ℕ} (hw : w ≤ 8) : + Peels (gaugeLorentzMaps repGauge repLorentz) + (h.sectorMassWeight {GeneratorClass.gauge, GeneratorClass.higgs} w) + (h.standardModelSpan w) := by + intro S hS x hx hinv + obtain ⟨-, hSL⟩ := isStableUnder_gaugeLorentzMaps_iff.1 hS + obtain ⟨-, hL⟩ := forall_gaugeLorentzMaps_eq_self_iff.1 hinv + exact Submodule.mem_sup_right + (h.mem_of_invariant_sectorMassWeight_gauge_higgs_lt_nine_sup w (by omega) S hSL hx hL) + +/-- The gauge-fermion sector peels to nothing: it carries no invariant below weight + nine. -/ +lemma peels_sectorMassWeight_gauge_fermion {w : ℕ} (hw : w ≤ 8) : + Peels (gaugeLorentzMaps repGauge repLorentz) + (h.sectorMassWeight {GeneratorClass.gauge, GeneratorClass.fermion} w) + (h.standardModelSpan w) := by + intro S hS x hx hinv + obtain ⟨-, hSL⟩ := isStableUnder_gaugeLorentzMaps_iff.1 hS + obtain ⟨-, hL⟩ := forall_gaugeLorentzMaps_eq_self_iff.1 hinv + exact Submodule.mem_sup_right + (h.mem_of_invariant_sectorMassWeight_gauge_fermion_lt_nine_sup w (by omega) S hSL hx hL) + +/-- The mixed sector peels to nothing: it is trivial below weight nine. -/ +lemma peels_sectorMassWeight_mixed {w : ℕ} (hw : w ≤ 8) : + Peels (gaugeLorentzMaps repGauge repLorentz) + (h.sectorMassWeight + {GeneratorClass.gauge, GeneratorClass.higgs, GeneratorClass.fermion} w) + (h.standardModelSpan w) := fun S _ x hx _ => + Submodule.mem_sup_right + (h.mem_of_invariant_sectorMassWeight_mixed_lt_nine_sup w (by omega) S hx) + +/-! + +## D. Joining the eight sectors + +-/ + +/-- Every weight part of every sector is carried into itself by both groups: the stability + the join of the peelings asks of its summands. -/ +lemma isStableUnder_sectorMassWeight (T : Finset GeneratorClass) (w : ℕ) : + IsStableUnder (gaugeLorentzMaps repGauge repLorentz) (h.sectorMassWeight T w) := + isStableUnder_gaugeLorentzMaps_iff.2 + ⟨fun g _ hy => h.repGauge_mem_sectorMassWeight g hy, + fun Λ _ hy => h.repLorentz_mem_sectorMassWeight Λ hy⟩ + +/-- Every sector peels to the span, at every weight from one to eight. The three + constructors of `GeneratorClass` give eight class sets, and section C treats each. -/ +lemma peels_sectorMassWeight {w : ℕ} (hw0 : 0 < w) (hw : w ≤ 8) + (T : Finset GeneratorClass) : + Peels (gaugeLorentzMaps repGauge repLorentz) (h.sectorMassWeight T w) + (h.standardModelSpan w) := by + have hT : T = ∅ ∨ T = {GeneratorClass.gauge} ∨ T = {GeneratorClass.higgs} + ∨ T = {GeneratorClass.fermion} ∨ T = {GeneratorClass.gauge, GeneratorClass.higgs} + ∨ T = {GeneratorClass.gauge, GeneratorClass.fermion} + ∨ T = {GeneratorClass.higgs, GeneratorClass.fermion} + ∨ T = {GeneratorClass.gauge, GeneratorClass.higgs, GeneratorClass.fermion} := by + revert T + decide + rcases hT with rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl + · exact h.peels_sectorMassWeight_empty (by omega) + · exact h.peels_sectorMassWeight_gauge hw0 hw + · exact h.peels_sectorMassWeight_higgs hw0 hw + · exact h.peels_sectorMassWeight_fermion hw0 hw + · exact h.peels_sectorMassWeight_gauge_higgs hw + · exact h.peels_sectorMassWeight_gauge_fermion hw + · exact h.peels_sectorMassWeight_higgs_fermion hw + · exact h.peels_sectorMassWeight_mixed hw + +/-- The whole weight-`w` submodule peels to the span, for `w` from one to eight. The + mass-weight submodule is the join of the eight sectors' weight-`w` parts, each of them + stable under both groups, and `Peels` is closed under joins in its source: the sectors + are taken one at a time, each in turn joining the error term of the others. No + independence of the sectors is used, and none is available. -/ +lemma peels_massWeightSubmodule {w : ℕ} (hw0 : 0 < w) (hw : w ≤ 8) : + Peels (gaugeLorentzMaps repGauge repLorentz) (h.massWeightSubmodule w) + (h.standardModelSpan w) := by + rw [h.massWeightSubmodule_eq_iSup_sectorMassWeight w] + exact Peels.iSup (fun T => h.peels_sectorMassWeight hw0 hw T) + (fun T => h.isStableUnder_sectorMassWeight T w) + (h.isFixedBy_standardModelSpan w).isStableUnder + +/-! + +## E. The classification at mass dimension at most four + +-/ + +/-- The gauge and Lorentz invariants of mass weight `w` for `0 < w ≤ 8`, modulo a + submodule `S` stable under both groups: such an invariant is a combination of the + Standard-Model terms of that weight plus a remainder in `S`, and the remainder is fixed + by both groups as well, being the difference of two invariants. -/ +theorem exists_mem_standardModelSpan_of_gauge_and_lorentz_invariant (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} + (hx : x ∈ h.massWeightSubmodule w ⊔ S) + (hG : ∀ g : GaugeGroupI, repGauge g x = x) + (hL : ∀ 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.standardModelSpan w := by + obtain ⟨z, hz, y, hy, rfl⟩ := Submodule.mem_sup.1 + (h.peels_massWeightSubmodule hw0 hw S (isStableUnder_gaugeLorentzMaps_iff.2 ⟨hS, hSL⟩) + x hx (forall_gaugeLorentzMaps_eq_self_iff.2 ⟨hG, hL⟩)) + refine ⟨y, hy, fun g => ?_, fun g => ?_, by simpa using hz⟩ + · have hstep := hG g + rw [map_add, h.repGauge_of_mem_standardModelSpan w g hz, add_right_inj] at hstep + exact hstep + · have hstep := hL g + rw [map_add, h.repLorentz_of_mem_standardModelSpan w g hz, add_right_inj] at hstep + exact hstep + +/-- The classification of the Standard Model at mass dimension at most four as an + equivalence, in the shape every sector uses: an element of `massWeightSubmodule w ⊔ S` + for `0 < w ≤ 8`, with `S` stable under both groups, is fixed by both groups exactly when + it is a combination of the Standard-Model terms of weight `w` up to a remainder in `S` + fixed by both groups. Forwards this is + `exists_mem_standardModelSpan_of_gauge_and_lorentz_invariant`; backwards it splits `x` + as `(x - y) + y`, the first summand an invariant of weight `w` + by section B. The weight-four Higgs mass term is what makes the span, rather than the + bare equation `x = y`, the right form of the statement. -/ +theorem mem_massWeightSubmodule_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 ∈ h.standardModelSpan w := by + refine ⟨fun hx => h.exists_mem_standardModelSpan_of_gauge_and_lorentz_invariant w hw0 hw + S hS hSL hx.1 hx.2.1 hx.2.2, ?_⟩ + rintro ⟨y, hyS, hyG, hyL, hxy⟩ + refine ⟨?_, fun g => ?_, fun g => ?_⟩ + · have hsum : x - y + y ∈ h.massWeightSubmodule w ⊔ S := + Submodule.add_mem _ + (Submodule.mem_sup_left (h.standardModelSpan_le_massWeightSubmodule w hxy)) + (Submodule.mem_sup_right hyS) + simpa using hsum + · have hstep : repGauge g (x - y + y) = x - y + y := by + rw [map_add, h.repGauge_of_mem_standardModelSpan w g hxy, hyG g] + simpa using hstep + · have hstep : repLorentz g (x - y + y) = x - y + y := by + rw [map_add, h.repLorentz_of_mem_standardModelSpan w g hxy, hyL g] + simpa using hstep + +/-- The same classification without the existential: at every weight from one to eight an + element of `massWeightSubmodule w ⊔ S` fixed by both groups is an element of the + Standard-Model span joined with `S` fixed by both groups, and conversely. -/ +theorem mem_massWeightSubmodule_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 ∈ h.standardModelSpan w ⊔ S ∧ (∀ g : GaugeGroupI, repGauge g x = x) + ∧ ∀ g : SL(2,ℂ), repLorentz g x = x) := by + constructor + · rintro ⟨hxm, hG, hL⟩ + obtain ⟨y, hyS, -, -, hxy⟩ := + h.exists_mem_standardModelSpan_of_gauge_and_lorentz_invariant w hw0 hw S hS hSL hxm hG hL + refine ⟨?_, hG, hL⟩ + have hsum : x - y + y ∈ h.standardModelSpan w ⊔ S := + Submodule.add_mem _ (Submodule.mem_sup_left hxy) (Submodule.mem_sup_right hyS) + simpa using hsum + · rintro ⟨hxm, hG, hL⟩ + exact ⟨sup_le_sup_right (h.standardModelSpan_le_massWeightSubmodule w) S hxm, hG, hL⟩ + +/-! + +## F. The Standard Model Lagrangian + +-/ + +/-- The invariant content of the Standard Model at mass dimension four. An element of + `massWeightSubmodule 8 ⊔ S`, for `S` a submodule stable under both groups, is fixed by + the gauge group and the Lorentz group exactly when it is a combination of + the gauge kinetic and theta terms of the three gauge groups + (`IsGaugeSector.lorentzContractionEightSpan`), + the Higgs kinetic term, its quartic potential and its two box terms + (`IsHiggsSector.lorentzContractionEightSpan`), + the kinetic terms of the ten fermion species over the nine family pairs + (`IsFermionSector.kineticSpan`), + and the six Yukawa couplings over the nine family pairs (`yukawaSpan`), + up to a remainder in `S` fixed by both groups — and nothing else. This is the + Standard-Model Lagrangian, and the whole of it. -/ +theorem mem_massWeightSubmodule_eight_sup_and_gauge_lorentz_invariant_iff_lagrangian + (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.isGaugeSector.lorentzContractionEightSpan + ⊔ h.isHiggsSector.lorentzContractionEightSpan + ⊔ (h.isFermionSector.kineticSpan ⊔ h.yukawaSpan) := by + rw [← h.standardModelSpan_eight] + exact h.mem_massWeightSubmodule_sup_and_gauge_lorentz_invariant_iff 8 (by norm_num) + le_rfl S hS hSL x + +/-- Below mass dimension two there is nothing at all, and at mass dimension two only the + Higgs mass term: at every weight from one to seven other than four an element of + `massWeightSubmodule w ⊔ S` fixed by both groups already lies in `S`. -/ +theorem mem_of_gauge_and_lorentz_invariant_massWeightSubmodule_sup (w : ℕ) (hw0 : 0 < w) + (hw : w < 8) (hw4 : w ≠ 4) (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 w ⊔ S) + (hG : ∀ g : GaugeGroupI, repGauge g x = x) + (hL : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by + have hmem := ((h.mem_massWeightSubmodule_sup_and_gauge_lorentz_invariant_iff_mem w hw0 + (by omega) S hS hSL x).1 ⟨hx, hG, hL⟩).1 + rwa [h.standardModelSpan_eq_bot (by omega) hw4, bot_sup_eq] at hmem + +/-- At mass dimension two the only invariant of the Standard Model is the Higgs mass term + `H† H`: an element of `massWeightSubmodule 4 ⊔ S` fixed by both groups is a multiple of + it up to a remainder in `S` fixed by both groups. -/ +theorem mem_massWeightSubmodule_four_sup_and_gauge_lorentz_invariant_iff_higgsMass + (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 4 ⊔ 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.isHiggsSector.dotSpan 0 0 := by + rw [← h.standardModelSpan_four] + exact h.mem_massWeightSubmodule_sup_and_gauge_lorentz_invariant_iff 4 (by norm_num) + (by norm_num) S hS hSL x + +end IsCovStandardModel + +end StandardModel diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/MixedSector/Basic.lean b/Physlib/Particles/StandardModel/IsCovStandardModel/MixedSector/Basic.lean index 212ebb308..6763943fe 100644 --- a/Physlib/Particles/StandardModel/IsCovStandardModel/MixedSector/Basic.lean +++ b/Physlib/Particles/StandardModel/IsCovStandardModel/MixedSector/Basic.lean @@ -22,6 +22,15 @@ 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. +Below weight nine, then, there is nothing left to classify. The sector is `⊥`, so an +element of `⊥ ⊔ S` is an element of `S` outright, whatever `S` may be. Section B records +that in the shape the other sectors carry, so that the four can later be combined; unlike +them it asks no stability of `S` and no invariance of the element, there being nothing to +peel away and no parity or index count to run. + +- A. The mixed sector vanishes below weight nine +- B. The classification below weight nine + -/ @[expose] public section @@ -46,31 +55,29 @@ variable {B : Type} [Ring B] [Algebra ℂ 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} + {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} + {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} + {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} + {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 +## A. The mixed sector vanishes below weight nine -/ -/-- **The mixed sector vanishes below weight nine**: a word realising all three +/-- 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. -/ @@ -89,7 +96,7 @@ lemma sectorMassWeight_mixed_eq_bot_of_lt_nine {w : ℕ} (hw : w < 9) : have h4 := classWeight_add_three gl omega -/-- **The weight-eight mixed sector vanishes**: the mass weight of a dimension-four +/-- 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 : @@ -97,6 +104,61 @@ lemma sectorMassWeight_mixed_eight : = ⊥ := h.sectorMassWeight_mixed_eq_bot_of_lt_nine (by omega) +/-! + +## B. The classification below weight nine + +Nine is beyond every weight a dimension-four term can reach, so the vanishing of section A +settles the whole of the mixed sector at a stroke: an element of `⊥ ⊔ S` is an element of +`S`. The three statements below are those of the gauge and Yukawa sectors, name for name, +so that the four sectors can be combined uniformly. There the forward direction is an +argument — a metric trace, an index count, a boost-weight parity — and needs `S` stable +and the element invariant; here it is the emptiness of the sector, and the invariance +conjuncts ride along in the equivalences only to keep the shapes matched. + +-/ + +/-- Below mass weight nine the mixed sector adds nothing to a submodule `S`: an element of + `sectorMassWeight {gauge, higgs, fermion} w ⊔ S` for `w < 9` already lies in `S`. The + sector is trivial there, so no invariance is asked of `x` and no stability of `S`. -/ +theorem mem_of_invariant_sectorMassWeight_mixed_lt_nine_sup (w : ℕ) (hw : w < 9) + (S : Submodule ℂ B) {x : B} + (hx : x ∈ h.sectorMassWeight {GeneratorClass.gauge, GeneratorClass.higgs, + GeneratorClass.fermion} w ⊔ S) : x ∈ S := by + rwa [h.sectorMassWeight_mixed_eq_bot_of_lt_nine hw, bot_sup_eq] at hx + +/-- The classification below mass weight nine as an equivalence, in the shape of the + gauge- and Yukawa-sector statements: an element of + `sectorMassWeight {gauge, higgs, fermion} w ⊔ S` for `w < 9` is fixed by both groups + exactly when it is itself an element of `S` fixed by both groups. Neither stability + hypothesis on `S` is needed, the forward direction being the vanishing of the sector. -/ +theorem mem_sectorMassWeight_mixed_lt_nine_sup_and_gauge_lorentz_invariant_iff (w : ℕ) + (hw : w < 9) (S : Submodule ℂ B) (x : B) : + (x ∈ h.sectorMassWeight {GeneratorClass.gauge, GeneratorClass.higgs, + GeneratorClass.fermion} 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_invariant_sectorMassWeight_mixed_lt_nine_sup w hw S hx, hG, hL, rfl⟩ + · rintro ⟨y, hyS, hyG, hyL, rfl⟩ + exact ⟨Submodule.mem_sup_right hyS, hyG, hyL⟩ + +/-- The same classification without the existential: below mass weight nine an element of + `sectorMassWeight {gauge, higgs, fermion} w ⊔ S` fixed by both groups is an element of + `S` fixed by both groups, and conversely. -/ +theorem mem_sectorMassWeight_mixed_lt_nine_sup_and_gauge_lorentz_invariant_iff_mem (w : ℕ) + (hw : w < 9) (S : Submodule ℂ B) (x : B) : + (x ∈ h.sectorMassWeight {GeneratorClass.gauge, GeneratorClass.higgs, + GeneratorClass.fermion} 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) := + ⟨fun hx => ⟨h.mem_of_invariant_sectorMassWeight_mixed_lt_nine_sup w hw S hx.1, hx.2⟩, + fun hx => ⟨Submodule.mem_sup_right hx.1, hx.2⟩⟩ + end IsCovStandardModel end StandardModel diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/Families/BarHiggs.lean b/Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/Families/BarHiggs.lean new file mode 100644 index 000000000..b06844ae2 --- /dev/null +++ b/Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/Families/BarHiggs.lean @@ -0,0 +1,754 @@ +/- +Copyright (c) 2026 Joseph Tooby-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.YukawaSector.Families.Higgs +/-! +# The Yukawa terms built on the conjugate Higgs symbol + +## i. Overview + +The remaining three couplings of the mass-weight-eight Yukawa sector are built on the +conjugate Higgs symbol: `barH bard Q`, `barH u barQ` and `barH L bare`. Each is the +conjugate of one of the three couplings of `Families.Higgs`, and is the same computation +with every symbol replaced by its conjugate: fundamental and anti-fundamental indices +exchange, left- and right-handed spinors exchange, and every hypercharge changes sign. So +the isospin structure of the conjugate up type is `2 ⊗ 2` where its partner had `2̄ ⊗ 2̄`, +and its invariant is again the antisymmetric symbol. + +With these six couplings the twelve blocks are accounted for: the other six are the same +six with the two fermion factors exchanged, and by `mul_mul_swap_eq_neg` their terms are +minus these while by `mul_mul_piece_swap` their blocks are the same submodules. + +## ii. Key results + +- `barDownYukawa`, `barUpYukawa`, `barLeptonYukawa` : the three conjugate Yukawa terms. +- `isSU3FunAntiFun_barDownBlock`, `isSU2BiFundamental_barUpBlock` and the rest : the index + laws of the three conjugate blocks. +- `yukawaSpan` : the join of all six couplings over all nine family pairs. +- `yukawaSpan_le_inf` : the Yukawa span lies inside the gauge- and Lorentz-invariants of + the sector at mass weight eight. + +## iii. Table of contents + +- A. The conjugate down-type Yukawa term +- B. The invariance of the conjugate down-type Yukawa term, and its mass weight +- C. The conjugate up-type Yukawa term +- D. The invariance of the conjugate up-type Yukawa term, and its mass weight +- E. The conjugate charged-lepton Yukawa term +- F. The invariance of the conjugate charged-lepton Yukawa term, and its mass weight +- G. The Yukawa span + +-/ + +@[expose] public section + +namespace StandardModel + +open TensorProduct Matrix MatrixGroups Lorentz Pointwise ComplexConjugate + +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) + +/-! + +## A. The conjugate down-type Yukawa term + +The conjugate of the down type: the product `barH bard Q`. Colour is `3 ⊗ 3̄` with the +conjugate down singlet supplying the fundamental index, isospin is `2 ⊗ 2̄` with the +conjugate Higgs symbol supplying the fundamental index and the quark doublet the +anti-fundamental one, and both fermions are left-handed. + +-/ + +/-- The components of the conjugate down-type Yukawa block `barH bard Q`: a conjugate + Higgs symbol, a conjugate down-singlet symbol and a quark-doublet symbol, none carrying + derivatives. -/ +noncomputable def barDownBlock (f f' : Fin 3) (i sbd : Fin 2) (cbd : Fin 3) (sQ : Fin 2) + (cQ : Fin 3) (wQ : Fin 2) : B := + h.isHiggsSector.barHiggs ![] i * (h.isFermionSector.bardComponent f ![] (sbd, cbd) * + h.isFermionSector.QComponent f' ![] (sQ, cQ, wQ)) + +/-- The two colour indices of the conjugate down-type block carry one fundamental and one + anti-fundamental `su(3)` index, the conjugate down singlet supplying the fundamental + one. -/ +lemma isSU3FunAntiFun_barDownBlock (f f' : Fin 3) (i sbd sQ wQ : Fin 2) : + IsSU3FunAntiFun B repGauge + (fun l : Fin 2 → Fin 3 => h.barDownBlock f f' i sbd (l 0) sQ (l 1) wQ) where + repGauge_T U l := by + simp only [barDownBlock] + rw [h.repGauge_mul_fixed_left (U, 1, 1) + (X := fun a => h.isFermionSector.bardComponent f ![] (sbd, a)) + (Y := fun a => h.isFermionSector.QComponent f' ![] (sQ, a, wQ)) + (h.repGauge_su3_barHiggs U ![] i) (h.repGauge_su3_bard U f ![] sbd (l 0)) + (h.repGauge_su3_Q U f' ![] sQ (l 1) wQ), IsSU3FunAntiFun.sum_pi_two] + simp only [Matrix.cons_val_zero, Matrix.cons_val_one] + +/-- The two isospin indices of the conjugate down-type block carry one fundamental and one + anti-fundamental `su(2)` index, the conjugate Higgs symbol supplying the fundamental + one. -/ +lemma isSU2FunAntiFun_barDownBlock (f f' : Fin 3) (sbd : Fin 2) (cbd : Fin 3) (sQ : Fin 2) + (cQ : Fin 3) : + IsSU2FunAntiFun B repGauge + (fun l : Fin 2 → Fin 2 => h.barDownBlock f f' (l 0) sbd cbd sQ cQ (l 1)) where + repGauge_T V l := by + simp only [barDownBlock] + rw [h.repGauge_mul_fixed_mid (1, V, 1) (A := fun a => h.isHiggsSector.barHiggs ![] a) + (Y := fun a => h.isFermionSector.QComponent f' ![] (sQ, cQ, a)) + (h.repGauge_su2_barHiggs V ![] (l 0)) (h.repGauge_su2_bard V f ![] (sbd, cbd)) + (h.repGauge_su2_Q V f' ![] sQ cQ (l 1)), IsSU2BiFundamental.sum_pi_two] + simp only [Matrix.cons_val_zero, Matrix.cons_val_one] + +/-- The two spinor indices of the conjugate down-type block are both dual left-handed. -/ +lemma isBiDualLeftWeyl_barDownBlock (f f' : Fin 3) (i : Fin 2) (cbd cQ : Fin 3) + (wQ : Fin 2) : + IsBiDualLeftWeyl B repLorentz + (fun l : Fin 2 × Fin 2 => h.barDownBlock f f' i l.1 cbd l.2 cQ wQ) where + repLorentz_T Λ l := by + simp only [barDownBlock] + rw [h.repLorentz_mul_fixed_left Λ + (X := fun a => h.isFermionSector.bardComponent f ![] (a, cbd)) + (Y := fun a => h.isFermionSector.QComponent f' ![] (a, cQ, wQ)) + (h.repLorentz_barHiggs_zero Λ ![] i) + (h.isFermionSector.repLorentz_bardComponent Λ f ![] (l.1, cbd)) + (h.isFermionSector.repLorentz_QComponent Λ f' ![] (l.2, cQ, wQ))] + rw [Fintype.sum_prod_type] + exact Finset.sum_congr rfl fun x _ => Finset.sum_congr rfl fun y _ => by + simp [Matrix.transpose_apply, SL2C.inverse_coe] + +/-- A hypercharge transformation fixes every component of the conjugate down-type block, + the three hypercharges `3`, `-2` and `-1` cancelling. -/ +lemma repGauge_u1_barDownBlock (t : unitary ℂ) (f f' : Fin 3) (i sbd : Fin 2) + (cbd : Fin 3) (sQ : Fin 2) (cQ : Fin 3) (wQ : Fin 2) : + repGauge ((1, 1, t) : GaugeGroupI) (h.barDownBlock f f' i sbd cbd sQ cQ wQ) + = h.barDownBlock f f' i sbd cbd sQ cQ wQ := by + have ht : star (t : ℂ) * (t : ℂ) = 1 := t.2.1 + rw [barDownBlock, h.isHiggsSector.rep_mul, h.isHiggsSector.rep_mul, + h.repGauge_u1_barHiggs, h.repGauge_u1_bard, h.repGauge_u1_Q, smul_mul_smul_comm, + smul_mul_smul_comm, + show (t : ℂ) ^ 3 * ((star (t : ℂ)) ^ 2 * star (t : ℂ)) = 1 from by + rw [show (t : ℂ) ^ 3 * ((star (t : ℂ)) ^ 2 * star (t : ℂ)) + = (star (t : ℂ) * (t : ℂ)) ^ 3 from by ring, ht, one_pow], + one_smul] + +/-- The colour contraction of the conjugate down-type block. -/ +noncomputable def barDownBlockColour (f f' : Fin 3) (i sbd sQ wQ : Fin 2) : B := + IsSU3FunAntiFun.deltaContraction + (fun l : Fin 2 → Fin 3 => h.barDownBlock f f' i sbd (l 0) sQ (l 1) wQ) + +/-- The colour contraction of the conjugate down-type block written out. -/ +lemma barDownBlockColour_eq (f f' : Fin 3) (i sbd sQ wQ : Fin 2) : + h.barDownBlockColour f f' i sbd sQ wQ + = ∑ a : Fin 3, h.barDownBlock f f' i sbd a sQ a wQ := by + simp [barDownBlockColour, IsSU3FunAntiFun.deltaContraction] + +/-- The colour contraction of the conjugate down-type block still carries one fundamental + and one anti-fundamental isospin index. -/ +lemma isSU2FunAntiFun_barDownBlockColour (f f' : Fin 3) (sbd sQ : Fin 2) : + IsSU2FunAntiFun B repGauge + (fun l : Fin 2 → Fin 2 => h.barDownBlockColour f f' (l 0) sbd sQ (l 1)) := by + simp only [h.barDownBlockColour_eq] + exact IsSU2FunAntiFun.sum fun a => h.isSU2FunAntiFun_barDownBlock f f' sbd a sQ a + +/-- The isospin contraction of the colour-contracted conjugate down-type block. -/ +noncomputable def barDownBlockIsospin (f f' : Fin 3) (sbd sQ : Fin 2) : B := + IsSU2FunAntiFun.deltaContraction + (fun l : Fin 2 → Fin 2 => h.barDownBlockColour f f' (l 0) sbd sQ (l 1)) + +/-- The doubly contracted conjugate down-type block written out. -/ +lemma barDownBlockIsospin_eq (f f' : Fin 3) (sbd sQ : Fin 2) : + h.barDownBlockIsospin f f' sbd sQ + = ∑ p : Fin 2 × Fin 3, h.barDownBlock f f' p.1 sbd p.2 sQ p.2 p.1 := by + rw [barDownBlockIsospin, IsSU2FunAntiFun.deltaContraction, h.barDownBlockColour_eq, + h.barDownBlockColour_eq, Fintype.sum_prod_type, Fin.sum_univ_two] + simp + +/-- The doubly contracted conjugate down-type block carries two dual left-handed Weyl + indices. -/ +lemma isBiDualLeftWeyl_barDownBlockIsospin (f f' : Fin 3) : + IsBiDualLeftWeyl B repLorentz + (fun l : Fin 2 × Fin 2 => h.barDownBlockIsospin f f' l.1 l.2) := by + simp only [h.barDownBlockIsospin_eq] + exact isBiDualLeftWeyl_sum fun p => + h.isBiDualLeftWeyl_barDownBlock f f' p.1 p.2 p.2 p.1 + +/-- The conjugate down-type Yukawa term of the family pair `(f, f')`. -/ +noncomputable def barDownYukawa (f f' : Fin 3) : B := + IsBiLeftWeyl.epsilonContraction + (T := fun l : Fin 2 × Fin 2 => h.barDownBlockIsospin f f' l.1 l.2) + +/-! + +## B. The invariance of the conjugate down-type Yukawa term, and its mass weight + +-/ + +/-- The colour contraction of the conjugate down-type block is fixed by the colour + factor. -/ +lemma repGauge_su3_barDownBlockColour (U : specialUnitaryGroup (Fin 3) ℂ) (f f' : Fin 3) + (i sbd sQ wQ : Fin 2) : + repGauge ((U, 1, 1) : GaugeGroupI) (h.barDownBlockColour f f' i sbd sQ wQ) + = h.barDownBlockColour f f' i sbd sQ wQ := + IsSU3FunAntiFun.repGauge_deltaContraction + (h.isSU3FunAntiFun_barDownBlock f f' i sbd sQ wQ) U + +/-- The doubly contracted conjugate down-type block is fixed by the colour factor. -/ +lemma repGauge_su3_barDownBlockIsospin (U : specialUnitaryGroup (Fin 3) ℂ) (f f' : Fin 3) + (sbd sQ : Fin 2) : + repGauge ((U, 1, 1) : GaugeGroupI) (h.barDownBlockIsospin f f' sbd sQ) + = h.barDownBlockIsospin f f' sbd sQ := by + rw [barDownBlockIsospin, IsSU2FunAntiFun.deltaContraction, map_add, + h.repGauge_su3_barDownBlockColour, h.repGauge_su3_barDownBlockColour] + +/-- The doubly contracted conjugate down-type block is fixed by the isospin factor. -/ +lemma repGauge_su2_barDownBlockIsospin (V : specialUnitaryGroup (Fin 2) ℂ) (f f' : Fin 3) + (sbd sQ : Fin 2) : + repGauge ((1, V, 1) : GaugeGroupI) (h.barDownBlockIsospin f f' sbd sQ) + = h.barDownBlockIsospin f f' sbd sQ := + IsSU2FunAntiFun.repGauge_deltaContraction + (h.isSU2FunAntiFun_barDownBlockColour f f' sbd sQ) V + +/-- The doubly contracted conjugate down-type block is fixed by the hypercharge factor. -/ +lemma repGauge_u1_barDownBlockIsospin (t : unitary ℂ) (f f' : Fin 3) (sbd sQ : Fin 2) : + repGauge ((1, 1, t) : GaugeGroupI) (h.barDownBlockIsospin f f' sbd sQ) + = h.barDownBlockIsospin f f' sbd sQ := by + rw [h.barDownBlockIsospin_eq, map_sum] + exact Finset.sum_congr rfl fun p _ => + h.repGauge_u1_barDownBlock t f f' p.1 sbd p.2 sQ p.2 p.1 + +/-- The conjugate down-type Yukawa term is gauge invariant. -/ +lemma repGauge_barDownYukawa (f f' : Fin 3) (g : GaugeGroupI) : + repGauge g (h.barDownYukawa f f') = h.barDownYukawa f f' := by + refine forall_repGauge_eq_self (fun U => ?_) (fun V => ?_) (fun t => ?_) g <;> + rw [barDownYukawa, IsBiLeftWeyl.epsilonContraction_eq, map_sub] + · rw [h.repGauge_su3_barDownBlockIsospin, h.repGauge_su3_barDownBlockIsospin] + · rw [h.repGauge_su2_barDownBlockIsospin, h.repGauge_su2_barDownBlockIsospin] + · rw [h.repGauge_u1_barDownBlockIsospin, h.repGauge_u1_barDownBlockIsospin] + +/-- The conjugate down-type Yukawa term is Lorentz invariant. -/ +lemma repLorentz_barDownYukawa (f f' : Fin 3) (Λ : SL(2,ℂ)) : + repLorentz Λ (h.barDownYukawa f f') = h.barDownYukawa f f' := + (h.isBiDualLeftWeyl_barDownBlockIsospin f f').repLorentz_epsilonContraction Λ + +/-- Every component of the conjugate down-type block sits at mass weight eight in the + Yukawa sector. -/ +lemma barDownBlock_mem_sectorMassWeight (f f' : Fin 3) (i sbd : Fin 2) (cbd : Fin 3) + (sQ : Fin 2) (cQ : Fin 3) (wQ : Fin 2) : + h.barDownBlock f f' i sbd cbd sQ cQ wQ + ∈ h.sectorMassWeight {GeneratorClass.higgs, GeneratorClass.fermion} 8 := by + rw [h.sectorMassWeight_higgs_fermion_eight, barDownBlock] + exact Submodule.mul_mem_mul (h.barHiggs_mem_derivSubmodule ![] i) + (Submodule.mul_mem_mul (h.bardComponent_mem_derivSubmodule f ![] (sbd, cbd)) + (h.QComponent_mem_derivSubmodule f' ![] (sQ, cQ, wQ))) + +/-- The conjugate down-type Yukawa term sits at mass weight eight in the Yukawa sector. -/ +lemma barDownYukawa_mem_sectorMassWeight (f f' : Fin 3) : + h.barDownYukawa f f' + ∈ h.sectorMassWeight {GeneratorClass.higgs, GeneratorClass.fermion} 8 := by + rw [barDownYukawa, IsBiLeftWeyl.epsilonContraction_eq] + refine Submodule.sub_mem _ ?_ ?_ <;> + exact h.barDownBlockIsospin_eq _ _ _ _ ▸ + sum_mem fun p _ => h.barDownBlock_mem_sectorMassWeight _ _ _ _ _ _ _ _ + +/-! + +## C. The conjugate up-type Yukawa term + +The conjugate of the up type: the product `barH u barQ`. Colour is `3 ⊗ 3̄` with the +conjugate quark doublet supplying the fundamental index, isospin is `2 ⊗ 2` — the conjugate +Higgs symbol and the conjugate quark doublet both carry the fundamental, so the invariant +is again the antisymmetric symbol — and both fermions are right-handed. + +-/ + +/-- The components of the conjugate up-type Yukawa block `barH u barQ`. -/ +noncomputable def barUpBlock (f f' : Fin 3) (i su : Fin 2) (cu : Fin 3) (sbQ : Fin 2) + (cbQ : Fin 3) (wbQ : Fin 2) : B := + h.isHiggsSector.barHiggs ![] i * (h.isFermionSector.uComponent f ![] (su, cu) * + h.isFermionSector.barQComponent f' ![] (sbQ, cbQ, wbQ)) + +/-- The two colour indices of the conjugate up-type block carry one fundamental and one + anti-fundamental `su(3)` index, the conjugate quark doublet supplying the fundamental + one. -/ +lemma isSU3FunAntiFun_barUpBlock (f f' : Fin 3) (i su sbQ wbQ : Fin 2) : + IsSU3FunAntiFun B repGauge + (fun l : Fin 2 → Fin 3 => h.barUpBlock f f' i su (l 1) sbQ (l 0) wbQ) where + repGauge_T U l := by + simp only [barUpBlock] + rw [h.repGauge_mul_fixed_left (U, 1, 1) + (X := fun a => h.isFermionSector.uComponent f ![] (su, a)) + (Y := fun a => h.isFermionSector.barQComponent f' ![] (sbQ, a, wbQ)) + (h.repGauge_su3_barHiggs U ![] i) (h.repGauge_su3_u U f ![] su (l 1)) + (h.repGauge_su3_barQ U f' ![] sbQ (l 0) wbQ), IsSU3FunAntiFun.sum_pi_two] + simp only [Matrix.cons_val_zero, Matrix.cons_val_one] + rw [Finset.sum_comm] + exact Finset.sum_congr rfl fun x _ => Finset.sum_congr rfl fun y _ => by rw [mul_comm] + +/-- The two isospin indices of the conjugate up-type block are both fundamental: the + conjugate Higgs symbol and the conjugate quark doublet both carry the fundamental of + `su(2)`. -/ +lemma isSU2BiFundamental_barUpBlock (f f' : Fin 3) (su : Fin 2) (cu : Fin 3) + (sbQ : Fin 2) (cbQ : Fin 3) : + IsSU2BiFundamental B repGauge + (fun l : Fin 2 → Fin 2 => h.barUpBlock f f' (l 0) su cu sbQ cbQ (l 1)) where + repGauge_T V l := by + simp only [barUpBlock] + rw [h.repGauge_mul_fixed_mid (1, V, 1) (A := fun a => h.isHiggsSector.barHiggs ![] a) + (Y := fun a => h.isFermionSector.barQComponent f' ![] (sbQ, cbQ, a)) + (h.repGauge_su2_barHiggs V ![] (l 0)) (h.repGauge_su2_u V f ![] (su, cu)) + (h.repGauge_su2_barQ V f' ![] sbQ cbQ (l 1)), IsSU2BiFundamental.sum_pi_two] + simp only [Fin.prod_univ_two, Matrix.cons_val_zero, Matrix.cons_val_one] + +/-- The two spinor indices of the conjugate up-type block are both dual right-handed. -/ +lemma isBiDualRightWeyl_barUpBlock (f f' : Fin 3) (i : Fin 2) (cu cbQ : Fin 3) + (wbQ : Fin 2) : + IsBiDualRightWeyl B repLorentz + (fun l : Fin 2 × Fin 2 => h.barUpBlock f f' i l.1 cu l.2 cbQ wbQ) where + repLorentz_T Λ l := by + simp only [barUpBlock] + rw [h.repLorentz_mul_fixed_left Λ + (X := fun a => h.isFermionSector.uComponent f ![] (a, cu)) + (Y := fun a => h.isFermionSector.barQComponent f' ![] (a, cbQ, wbQ)) + (h.repLorentz_barHiggs_zero Λ ![] i) + (h.isFermionSector.repLorentz_uComponent Λ f ![] (l.1, cu)) + (h.isFermionSector.repLorentz_barQComponent Λ f' ![] (l.2, cbQ, wbQ))] + rw [Fintype.sum_prod_type] + exact Finset.sum_congr rfl fun x _ => Finset.sum_congr rfl fun y _ => by + simp [Matrix.conjTranspose_apply, SL2C.inverse_coe] + +/-- A hypercharge transformation fixes every component of the conjugate up-type block, the + three hypercharges `3`, `-4` and `1` cancelling. -/ +lemma repGauge_u1_barUpBlock (t : unitary ℂ) (f f' : Fin 3) (i su : Fin 2) (cu : Fin 3) + (sbQ : Fin 2) (cbQ : Fin 3) (wbQ : Fin 2) : + repGauge ((1, 1, t) : GaugeGroupI) (h.barUpBlock f f' i su cu sbQ cbQ wbQ) + = h.barUpBlock f f' i su cu sbQ cbQ wbQ := by + have ht : star (t : ℂ) * (t : ℂ) = 1 := t.2.1 + rw [barUpBlock, h.isHiggsSector.rep_mul, h.isHiggsSector.rep_mul, h.repGauge_u1_barHiggs, + h.repGauge_u1_u, h.repGauge_u1_barQ, smul_mul_smul_comm, smul_mul_smul_comm, + show (t : ℂ) ^ 3 * ((star (t : ℂ)) ^ 4 * (t : ℂ)) = 1 from by + rw [show (t : ℂ) ^ 3 * ((star (t : ℂ)) ^ 4 * (t : ℂ)) + = (star (t : ℂ) * (t : ℂ)) ^ 4 from by ring, ht, one_pow], + one_smul] + +/-- The colour contraction of the conjugate up-type block. -/ +noncomputable def barUpBlockColour (f f' : Fin 3) (i su sbQ wbQ : Fin 2) : B := + IsSU3FunAntiFun.deltaContraction + (fun l : Fin 2 → Fin 3 => h.barUpBlock f f' i su (l 1) sbQ (l 0) wbQ) + +/-- The colour contraction of the conjugate up-type block written out. -/ +lemma barUpBlockColour_eq (f f' : Fin 3) (i su sbQ wbQ : Fin 2) : + h.barUpBlockColour f f' i su sbQ wbQ + = ∑ a : Fin 3, h.barUpBlock f f' i su a sbQ a wbQ := by + simp [barUpBlockColour, IsSU3FunAntiFun.deltaContraction] + +/-- The colour contraction of the conjugate up-type block still carries two fundamental + isospin indices. -/ +lemma isSU2BiFundamental_barUpBlockColour (f f' : Fin 3) (su sbQ : Fin 2) : + IsSU2BiFundamental B repGauge + (fun l : Fin 2 → Fin 2 => h.barUpBlockColour f f' (l 0) su sbQ (l 1)) := by + simp only [h.barUpBlockColour_eq] + exact IsSU2BiFundamental.sum fun a => h.isSU2BiFundamental_barUpBlock f f' su a sbQ a + +/-- The isospin contraction of the colour-contracted conjugate up-type block, by the + antisymmetric symbol. -/ +noncomputable def barUpBlockIsospin (f f' : Fin 3) (su sbQ : Fin 2) : B := + IsSU2BiFundamental.epsilonContraction + (fun l : Fin 2 → Fin 2 => h.barUpBlockColour f f' (l 0) su sbQ (l 1)) + +/-- The doubly contracted conjugate up-type block written out. -/ +lemma barUpBlockIsospin_eq (f f' : Fin 3) (su sbQ : Fin 2) : + h.barUpBlockIsospin f f' su sbQ = (∑ a : Fin 3, h.barUpBlock f f' 0 su a sbQ a 1) + - ∑ a : Fin 3, h.barUpBlock f f' 1 su a sbQ a 0 := by + rw [barUpBlockIsospin, IsSU2BiFundamental.epsilonContraction] + simp [h.barUpBlockColour_eq] + +/-- The doubly contracted conjugate up-type block carries two dual right-handed Weyl + indices. -/ +lemma isBiDualRightWeyl_barUpBlockIsospin (f f' : Fin 3) : + IsBiDualRightWeyl B repLorentz + (fun l : Fin 2 × Fin 2 => h.barUpBlockIsospin f f' l.1 l.2) := by + simp only [h.barUpBlockIsospin_eq] + exact isBiDualRightWeyl_sub + (isBiDualRightWeyl_sum fun a => h.isBiDualRightWeyl_barUpBlock f f' 0 a a 1) + (isBiDualRightWeyl_sum fun a => h.isBiDualRightWeyl_barUpBlock f f' 1 a a 0) + +/-- The conjugate up-type Yukawa term of the family pair `(f, f')`. -/ +noncomputable def barUpYukawa (f f' : Fin 3) : B := + IsBiLeftWeyl.epsilonContraction + (T := fun l : Fin 2 × Fin 2 => h.barUpBlockIsospin f f' l.1 l.2) + +/-! + +## D. The invariance of the conjugate up-type Yukawa term, and its mass weight + +-/ + +/-- The colour contraction of the conjugate up-type block is fixed by the colour factor. -/ +lemma repGauge_su3_barUpBlockColour (U : specialUnitaryGroup (Fin 3) ℂ) (f f' : Fin 3) + (i su sbQ wbQ : Fin 2) : + repGauge ((U, 1, 1) : GaugeGroupI) (h.barUpBlockColour f f' i su sbQ wbQ) + = h.barUpBlockColour f f' i su sbQ wbQ := + IsSU3FunAntiFun.repGauge_deltaContraction + (h.isSU3FunAntiFun_barUpBlock f f' i su sbQ wbQ) U + +/-- The doubly contracted conjugate up-type block is fixed by the colour factor. -/ +lemma repGauge_su3_barUpBlockIsospin (U : specialUnitaryGroup (Fin 3) ℂ) (f f' : Fin 3) + (su sbQ : Fin 2) : + repGauge ((U, 1, 1) : GaugeGroupI) (h.barUpBlockIsospin f f' su sbQ) + = h.barUpBlockIsospin f f' su sbQ := by + rw [barUpBlockIsospin, IsSU2BiFundamental.epsilonContraction, map_sub, + h.repGauge_su3_barUpBlockColour, h.repGauge_su3_barUpBlockColour] + +/-- The doubly contracted conjugate up-type block is fixed by the isospin factor. -/ +lemma repGauge_su2_barUpBlockIsospin (V : specialUnitaryGroup (Fin 2) ℂ) (f f' : Fin 3) + (su sbQ : Fin 2) : + repGauge ((1, V, 1) : GaugeGroupI) (h.barUpBlockIsospin f f' su sbQ) + = h.barUpBlockIsospin f f' su sbQ := + IsSU2BiFundamental.repGauge_epsilonContraction + (h.isSU2BiFundamental_barUpBlockColour f f' su sbQ) V + +/-- The doubly contracted conjugate up-type block is fixed by the hypercharge factor. -/ +lemma repGauge_u1_barUpBlockIsospin (t : unitary ℂ) (f f' : Fin 3) (su sbQ : Fin 2) : + repGauge ((1, 1, t) : GaugeGroupI) (h.barUpBlockIsospin f f' su sbQ) + = h.barUpBlockIsospin f f' su sbQ := by + rw [h.barUpBlockIsospin_eq, map_sub, map_sum, map_sum] + exact congrArg₂ _ + (Finset.sum_congr rfl fun a _ => h.repGauge_u1_barUpBlock t f f' 0 su a sbQ a 1) + (Finset.sum_congr rfl fun a _ => h.repGauge_u1_barUpBlock t f f' 1 su a sbQ a 0) + +/-- The conjugate up-type Yukawa term is gauge invariant. -/ +lemma repGauge_barUpYukawa (f f' : Fin 3) (g : GaugeGroupI) : + repGauge g (h.barUpYukawa f f') = h.barUpYukawa f f' := by + refine forall_repGauge_eq_self (fun U => ?_) (fun V => ?_) (fun t => ?_) g <;> + rw [barUpYukawa, IsBiLeftWeyl.epsilonContraction_eq, map_sub] + · rw [h.repGauge_su3_barUpBlockIsospin, h.repGauge_su3_barUpBlockIsospin] + · rw [h.repGauge_su2_barUpBlockIsospin, h.repGauge_su2_barUpBlockIsospin] + · rw [h.repGauge_u1_barUpBlockIsospin, h.repGauge_u1_barUpBlockIsospin] + +/-- The conjugate up-type Yukawa term is Lorentz invariant. -/ +lemma repLorentz_barUpYukawa (f f' : Fin 3) (Λ : SL(2,ℂ)) : + repLorentz Λ (h.barUpYukawa f f') = h.barUpYukawa f f' := + (h.isBiDualRightWeyl_barUpBlockIsospin f f').repLorentz_epsilonContraction Λ + +/-- Every component of the conjugate up-type block sits at mass weight eight in the Yukawa + sector. -/ +lemma barUpBlock_mem_sectorMassWeight (f f' : Fin 3) (i su : Fin 2) (cu : Fin 3) + (sbQ : Fin 2) (cbQ : Fin 3) (wbQ : Fin 2) : + h.barUpBlock f f' i su cu sbQ cbQ wbQ + ∈ h.sectorMassWeight {GeneratorClass.higgs, GeneratorClass.fermion} 8 := by + rw [h.sectorMassWeight_higgs_fermion_eight, barUpBlock] + exact Submodule.mul_mem_mul (h.barHiggs_mem_derivSubmodule ![] i) + (Submodule.mul_mem_mul (h.uComponent_mem_derivSubmodule f ![] (su, cu)) + (h.barQComponent_mem_derivSubmodule f' ![] (sbQ, cbQ, wbQ))) + +/-- The conjugate up-type Yukawa term sits at mass weight eight in the Yukawa sector. -/ +lemma barUpYukawa_mem_sectorMassWeight (f f' : Fin 3) : + h.barUpYukawa f f' + ∈ h.sectorMassWeight {GeneratorClass.higgs, GeneratorClass.fermion} 8 := by + have hiso : ∀ su sbQ : Fin 2, h.barUpBlockIsospin f f' su sbQ + ∈ h.sectorMassWeight {GeneratorClass.higgs, GeneratorClass.fermion} 8 := by + intro su sbQ + rw [h.barUpBlockIsospin_eq] + exact Submodule.sub_mem _ + (sum_mem fun a _ => h.barUpBlock_mem_sectorMassWeight _ _ _ _ _ _ _ _) + (sum_mem fun a _ => h.barUpBlock_mem_sectorMassWeight _ _ _ _ _ _ _ _) + rw [barUpYukawa, IsBiLeftWeyl.epsilonContraction_eq] + exact Submodule.sub_mem _ (hiso _ _) (hiso _ _) + +/-! + +## E. The conjugate charged-lepton Yukawa term + +The conjugate of the charged-lepton type: the product `barH L bare`. As with its +unconjugated partner there is no colour at all, so the colour step is plain invariance; +isospin is `2 ⊗ 2̄` with the conjugate Higgs symbol supplying the fundamental index, and +both fermions are left-handed. + +-/ + +/-- The components of the conjugate charged-lepton Yukawa block `barH L bare`. -/ +noncomputable def barLeptonBlock (f f' : Fin 3) (i sL wL sbe : Fin 2) : B := + h.isHiggsSector.barHiggs ![] i * (h.isFermionSector.LComponent f ![] (sL, wL) * + h.isFermionSector.bareComponent f' ![] sbe) + +/-- The conjugate lepton block is colour invariant outright. -/ +lemma repGauge_su3_barLeptonBlock (U : specialUnitaryGroup (Fin 3) ℂ) (f f' : Fin 3) + (i sL wL sbe : Fin 2) : + repGauge ((U, 1, 1) : GaugeGroupI) (h.barLeptonBlock f f' i sL wL sbe) + = h.barLeptonBlock f f' i sL wL sbe := by + rw [barLeptonBlock, h.isHiggsSector.rep_mul, h.isHiggsSector.rep_mul, + h.repGauge_su3_barHiggs, h.repGauge_su3_L, h.repGauge_su3_bare] + +/-- The two isospin indices of the conjugate lepton block carry one fundamental and one + anti-fundamental `su(2)` index, the conjugate Higgs symbol supplying the fundamental + one. -/ +lemma isSU2FunAntiFun_barLeptonBlock (f f' : Fin 3) (sL sbe : Fin 2) : + IsSU2FunAntiFun B repGauge + (fun l : Fin 2 → Fin 2 => h.barLeptonBlock f f' (l 0) sL (l 1) sbe) where + repGauge_T V l := by + simp only [barLeptonBlock] + rw [h.repGauge_mul_fixed_right (1, V, 1) + (A := fun a => h.isHiggsSector.barHiggs ![] a) + (X := fun a => h.isFermionSector.LComponent f ![] (sL, a)) + (h.repGauge_su2_barHiggs V ![] (l 0)) (h.repGauge_su2_L V f ![] sL (l 1)) + (h.repGauge_su2_bare V f' ![] sbe), IsSU2BiFundamental.sum_pi_two] + simp only [Matrix.cons_val_zero, Matrix.cons_val_one] + +/-- The two spinor indices of the conjugate lepton block are both dual left-handed. -/ +lemma isBiDualLeftWeyl_barLeptonBlock (f f' : Fin 3) (i wL : Fin 2) : + IsBiDualLeftWeyl B repLorentz + (fun l : Fin 2 × Fin 2 => h.barLeptonBlock f f' i l.1 wL l.2) where + repLorentz_T Λ l := by + simp only [barLeptonBlock] + rw [h.repLorentz_mul_fixed_left Λ + (X := fun a => h.isFermionSector.LComponent f ![] (a, wL)) + (Y := fun a => h.isFermionSector.bareComponent f' ![] a) + (h.repLorentz_barHiggs_zero Λ ![] i) + (h.isFermionSector.repLorentz_LComponent Λ f ![] (l.1, wL)) + (h.isFermionSector.repLorentz_bareComponent Λ f' ![] l.2)] + rw [Fintype.sum_prod_type] + exact Finset.sum_congr rfl fun x _ => Finset.sum_congr rfl fun y _ => by + simp [Matrix.transpose_apply, SL2C.inverse_coe] + +/-- A hypercharge transformation fixes every component of the conjugate lepton block, the + three hypercharges `3`, `3` and `-6` cancelling. -/ +lemma repGauge_u1_barLeptonBlock (t : unitary ℂ) (f f' : Fin 3) (i sL wL sbe : Fin 2) : + repGauge ((1, 1, t) : GaugeGroupI) (h.barLeptonBlock f f' i sL wL sbe) + = h.barLeptonBlock f f' i sL wL sbe := by + have ht : star (t : ℂ) * (t : ℂ) = 1 := t.2.1 + rw [barLeptonBlock, h.isHiggsSector.rep_mul, h.isHiggsSector.rep_mul, + h.repGauge_u1_barHiggs, h.repGauge_u1_L, h.repGauge_u1_bare, smul_mul_smul_comm, + smul_mul_smul_comm, + show (t : ℂ) ^ 3 * ((t : ℂ) ^ 3 * (star (t : ℂ)) ^ 6) = 1 from by + rw [show (t : ℂ) ^ 3 * ((t : ℂ) ^ 3 * (star (t : ℂ)) ^ 6) + = (star (t : ℂ) * (t : ℂ)) ^ 6 from by ring, ht, one_pow], + one_smul] + +/-- The isospin contraction of the conjugate lepton block. -/ +noncomputable def barLeptonBlockIsospin (f f' : Fin 3) (sL sbe : Fin 2) : B := + IsSU2FunAntiFun.deltaContraction + (fun l : Fin 2 → Fin 2 => h.barLeptonBlock f f' (l 0) sL (l 1) sbe) + +/-- The isospin contraction of the conjugate lepton block written out. -/ +lemma barLeptonBlockIsospin_eq (f f' : Fin 3) (sL sbe : Fin 2) : + h.barLeptonBlockIsospin f f' sL sbe + = ∑ w : Fin 2, h.barLeptonBlock f f' w sL w sbe := by + rw [barLeptonBlockIsospin, IsSU2FunAntiFun.deltaContraction, Fin.sum_univ_two] + simp + +/-- The contracted conjugate lepton block carries two dual left-handed Weyl indices. -/ +lemma isBiDualLeftWeyl_barLeptonBlockIsospin (f f' : Fin 3) : + IsBiDualLeftWeyl B repLorentz + (fun l : Fin 2 × Fin 2 => h.barLeptonBlockIsospin f f' l.1 l.2) := by + simp only [h.barLeptonBlockIsospin_eq] + exact isBiDualLeftWeyl_sum fun w => h.isBiDualLeftWeyl_barLeptonBlock f f' w w + +/-- The conjugate charged-lepton Yukawa term of the family pair `(f, f')`. -/ +noncomputable def barLeptonYukawa (f f' : Fin 3) : B := + IsBiLeftWeyl.epsilonContraction + (T := fun l : Fin 2 × Fin 2 => h.barLeptonBlockIsospin f f' l.1 l.2) + +/-! + +## F. The invariance of the conjugate charged-lepton Yukawa term, and its mass weight + +-/ + +/-- The contracted conjugate lepton block is fixed by the colour factor. -/ +lemma repGauge_su3_barLeptonBlockIsospin (U : specialUnitaryGroup (Fin 3) ℂ) + (f f' : Fin 3) (sL sbe : Fin 2) : + repGauge ((U, 1, 1) : GaugeGroupI) (h.barLeptonBlockIsospin f f' sL sbe) + = h.barLeptonBlockIsospin f f' sL sbe := by + rw [h.barLeptonBlockIsospin_eq, map_sum] + exact Finset.sum_congr rfl fun w _ => h.repGauge_su3_barLeptonBlock U f f' w sL w sbe + +/-- The contracted conjugate lepton block is fixed by the isospin factor. -/ +lemma repGauge_su2_barLeptonBlockIsospin (V : specialUnitaryGroup (Fin 2) ℂ) + (f f' : Fin 3) (sL sbe : Fin 2) : + repGauge ((1, V, 1) : GaugeGroupI) (h.barLeptonBlockIsospin f f' sL sbe) + = h.barLeptonBlockIsospin f f' sL sbe := + IsSU2FunAntiFun.repGauge_deltaContraction + (h.isSU2FunAntiFun_barLeptonBlock f f' sL sbe) V + +/-- The contracted conjugate lepton block is fixed by the hypercharge factor. -/ +lemma repGauge_u1_barLeptonBlockIsospin (t : unitary ℂ) (f f' : Fin 3) (sL sbe : Fin 2) : + repGauge ((1, 1, t) : GaugeGroupI) (h.barLeptonBlockIsospin f f' sL sbe) + = h.barLeptonBlockIsospin f f' sL sbe := by + rw [h.barLeptonBlockIsospin_eq, map_sum] + exact Finset.sum_congr rfl fun w _ => h.repGauge_u1_barLeptonBlock t f f' w sL w sbe + +/-- The conjugate charged-lepton Yukawa term is gauge invariant. -/ +lemma repGauge_barLeptonYukawa (f f' : Fin 3) (g : GaugeGroupI) : + repGauge g (h.barLeptonYukawa f f') = h.barLeptonYukawa f f' := by + refine forall_repGauge_eq_self (fun U => ?_) (fun V => ?_) (fun t => ?_) g <;> + rw [barLeptonYukawa, IsBiLeftWeyl.epsilonContraction_eq, map_sub] + · rw [h.repGauge_su3_barLeptonBlockIsospin, h.repGauge_su3_barLeptonBlockIsospin] + · rw [h.repGauge_su2_barLeptonBlockIsospin, h.repGauge_su2_barLeptonBlockIsospin] + · rw [h.repGauge_u1_barLeptonBlockIsospin, h.repGauge_u1_barLeptonBlockIsospin] + +/-- The conjugate charged-lepton Yukawa term is Lorentz invariant. -/ +lemma repLorentz_barLeptonYukawa (f f' : Fin 3) (Λ : SL(2,ℂ)) : + repLorentz Λ (h.barLeptonYukawa f f') = h.barLeptonYukawa f f' := + (h.isBiDualLeftWeyl_barLeptonBlockIsospin f f').repLorentz_epsilonContraction Λ + +/-- Every component of the conjugate lepton block sits at mass weight eight in the Yukawa + sector. -/ +lemma barLeptonBlock_mem_sectorMassWeight (f f' : Fin 3) (i sL wL sbe : Fin 2) : + h.barLeptonBlock f f' i sL wL sbe + ∈ h.sectorMassWeight {GeneratorClass.higgs, GeneratorClass.fermion} 8 := by + rw [h.sectorMassWeight_higgs_fermion_eight, barLeptonBlock] + exact Submodule.mul_mem_mul (h.barHiggs_mem_derivSubmodule ![] i) + (Submodule.mul_mem_mul (h.LComponent_mem_derivSubmodule f ![] (sL, wL)) + (h.bareComponent_mem_derivSubmodule f' ![] sbe)) + +/-- The conjugate charged-lepton Yukawa term sits at mass weight eight in the Yukawa + sector. -/ +lemma barLeptonYukawa_mem_sectorMassWeight (f f' : Fin 3) : + h.barLeptonYukawa f f' + ∈ h.sectorMassWeight {GeneratorClass.higgs, GeneratorClass.fermion} 8 := by + rw [barLeptonYukawa, IsBiLeftWeyl.epsilonContraction_eq] + refine Submodule.sub_mem _ ?_ ?_ <;> + exact h.barLeptonBlockIsospin_eq _ _ _ _ ▸ + sum_mem fun w _ => h.barLeptonBlock_mem_sectorMassWeight _ _ _ _ _ _ + +/-! + +## G. The Yukawa span + +The six couplings, each joined over the nine family pairs, are the whole Yukawa content of +the sector at mass weight eight: six arbitrary `3 × 3` coupling matrices, and no matrix +written down anywhere. The join lies inside the sector and inside both spaces of +invariants, which is the direction that makes the eventual classification an equivalence +rather than a one-way inclusion. The six transposed blocks add nothing: by +`mul_mul_swap_eq_neg` their terms are minus these. + +-/ + +/-- The span of the conjugate down-type Yukawa terms over the nine family pairs. -/ +noncomputable def barDownYukawaSpan : Submodule ℂ B := + ⨆ (f : Fin 3) (f' : Fin 3), ℂ ∙ h.barDownYukawa f f' + +/-- The span of the conjugate up-type Yukawa terms over the nine family pairs. -/ +noncomputable def barUpYukawaSpan : Submodule ℂ B := + ⨆ (f : Fin 3) (f' : Fin 3), ℂ ∙ h.barUpYukawa f f' + +/-- The span of the conjugate charged-lepton Yukawa terms over the nine family pairs. -/ +noncomputable def barLeptonYukawaSpan : Submodule ℂ B := + ⨆ (f : Fin 3) (f' : Fin 3), ℂ ∙ h.barLeptonYukawa f f' + +/-- The conjugate down-type Yukawa span sits at mass weight eight in the Yukawa sector. -/ +lemma barDownYukawaSpan_le_sectorMassWeight : + h.barDownYukawaSpan + ≤ h.sectorMassWeight {GeneratorClass.higgs, GeneratorClass.fermion} 8 := + iSup_le fun f => iSup_le fun f' => (Submodule.span_singleton_le_iff_mem _ _).2 + (h.barDownYukawa_mem_sectorMassWeight f f') + +/-- The conjugate down-type Yukawa span is a space of gauge invariants. -/ +lemma barDownYukawaSpan_le_invariants : h.barDownYukawaSpan ≤ repGauge.invariants := + iSup_le fun f => iSup_le fun f' => (Submodule.span_singleton_le_iff_mem _ _).2 + ((Representation.mem_invariants _ _).2 (h.repGauge_barDownYukawa f f')) + +/-- The conjugate down-type Yukawa span is a space of Lorentz invariants. -/ +lemma barDownYukawaSpan_le_lorentzInvariants : + h.barDownYukawaSpan ≤ repLorentz.invariants := + iSup_le fun f => iSup_le fun f' => (Submodule.span_singleton_le_iff_mem _ _).2 + ((Representation.mem_invariants _ _).2 (h.repLorentz_barDownYukawa f f')) + +/-- The conjugate up-type Yukawa span sits at mass weight eight in the Yukawa sector. -/ +lemma barUpYukawaSpan_le_sectorMassWeight : + h.barUpYukawaSpan + ≤ h.sectorMassWeight {GeneratorClass.higgs, GeneratorClass.fermion} 8 := + iSup_le fun f => iSup_le fun f' => (Submodule.span_singleton_le_iff_mem _ _).2 + (h.barUpYukawa_mem_sectorMassWeight f f') + +/-- The conjugate up-type Yukawa span is a space of gauge invariants. -/ +lemma barUpYukawaSpan_le_invariants : h.barUpYukawaSpan ≤ repGauge.invariants := + iSup_le fun f => iSup_le fun f' => (Submodule.span_singleton_le_iff_mem _ _).2 + ((Representation.mem_invariants _ _).2 (h.repGauge_barUpYukawa f f')) + +/-- The conjugate up-type Yukawa span is a space of Lorentz invariants. -/ +lemma barUpYukawaSpan_le_lorentzInvariants : h.barUpYukawaSpan ≤ repLorentz.invariants := + iSup_le fun f => iSup_le fun f' => (Submodule.span_singleton_le_iff_mem _ _).2 + ((Representation.mem_invariants _ _).2 (h.repLorentz_barUpYukawa f f')) + +/-- The conjugate charged-lepton Yukawa span sits at mass weight eight in the Yukawa + sector. -/ +lemma barLeptonYukawaSpan_le_sectorMassWeight : + h.barLeptonYukawaSpan + ≤ h.sectorMassWeight {GeneratorClass.higgs, GeneratorClass.fermion} 8 := + iSup_le fun f => iSup_le fun f' => (Submodule.span_singleton_le_iff_mem _ _).2 + (h.barLeptonYukawa_mem_sectorMassWeight f f') + +/-- The conjugate charged-lepton Yukawa span is a space of gauge invariants. -/ +lemma barLeptonYukawaSpan_le_invariants : h.barLeptonYukawaSpan ≤ repGauge.invariants := + iSup_le fun f => iSup_le fun f' => (Submodule.span_singleton_le_iff_mem _ _).2 + ((Representation.mem_invariants _ _).2 (h.repGauge_barLeptonYukawa f f')) + +/-- The conjugate charged-lepton Yukawa span is a space of Lorentz invariants. -/ +lemma barLeptonYukawaSpan_le_lorentzInvariants : + h.barLeptonYukawaSpan ≤ repLorentz.invariants := + iSup_le fun f => iSup_le fun f' => (Submodule.span_singleton_le_iff_mem _ _).2 + ((Representation.mem_invariants _ _).2 (h.repLorentz_barLeptonYukawa f f')) + +/-- The Yukawa span of the Standard Model at mass weight eight: the join of the six + couplings, each over the nine family pairs. -/ +noncomputable def yukawaSpan : Submodule ℂ B := + h.downYukawaSpan ⊔ h.upYukawaSpan ⊔ h.leptonYukawaSpan + ⊔ h.barDownYukawaSpan ⊔ h.barUpYukawaSpan ⊔ h.barLeptonYukawaSpan + +/-- The Yukawa span lies inside the gauge- and Lorentz-invariants of the Yukawa sector at + mass weight eight. This is the easy direction of the classification: every Yukawa term + is an invariant of the right mass weight, so the eventual classification is an + equivalence and not merely a one-way inclusion. -/ +lemma yukawaSpan_le_inf : + h.yukawaSpan ≤ h.sectorMassWeight {GeneratorClass.higgs, GeneratorClass.fermion} 8 + ⊓ repGauge.invariants ⊓ repLorentz.invariants := + sup_le (sup_le (sup_le (sup_le (sup_le + (le_inf (le_inf h.downYukawaSpan_le_sectorMassWeight h.downYukawaSpan_le_invariants) + h.downYukawaSpan_le_lorentzInvariants) + (le_inf (le_inf h.upYukawaSpan_le_sectorMassWeight h.upYukawaSpan_le_invariants) + h.upYukawaSpan_le_lorentzInvariants)) + (le_inf (le_inf h.leptonYukawaSpan_le_sectorMassWeight + h.leptonYukawaSpan_le_invariants) h.leptonYukawaSpan_le_lorentzInvariants)) + (le_inf (le_inf h.barDownYukawaSpan_le_sectorMassWeight + h.barDownYukawaSpan_le_invariants) h.barDownYukawaSpan_le_lorentzInvariants)) + (le_inf (le_inf h.barUpYukawaSpan_le_sectorMassWeight h.barUpYukawaSpan_le_invariants) + h.barUpYukawaSpan_le_lorentzInvariants)) + (le_inf (le_inf h.barLeptonYukawaSpan_le_sectorMassWeight + h.barLeptonYukawaSpan_le_invariants) h.barLeptonYukawaSpan_le_lorentzInvariants) + +end IsCovStandardModel + +end StandardModel diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/Families/Higgs.lean b/Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/Families/Higgs.lean new file mode 100644 index 000000000..e631fefea --- /dev/null +++ b/Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/Families/Higgs.lean @@ -0,0 +1,742 @@ +/- +Copyright (c) 2026 Joseph Tooby-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.YukawaSector.Families.Symbols +/-! +# The Yukawa terms built on the Higgs symbol + +## i. Overview + +Three of the twelve blocks of the mass-weight-eight Yukawa sector are built on the Higgs +symbol rather than its conjugate: the down type `H d barQ`, the up type `H baru Q` and the +charged-lepton type `H barL e`. They are the three genuinely distinct computations of the +sector — the other nine blocks are their conjugates and the two fermion orderings of each — +and this file builds, for each of them, the block, the index laws its three symbols obey, +the iterated contraction those laws admit, and the proof that the contraction is a gauge- +and Lorentz-invariant element of the sector at mass weight eight. + +The three differ in exactly two places. Isospin: the down and lepton types contract a +`2 ⊗ 2̄` by the trace, the up type a `2̄ ⊗ 2̄` by the antisymmetric symbol, since the Higgs +symbol and the quark doublet both carry the anti-fundamental. Colour: the two quark types +contract a `3 ⊗ 3̄` by the Kronecker delta, while the lepton type carries no colour at all, +so its colour step is plain invariance rather than a classification and its contraction has +two stages instead of three. + +The transposed blocks — the same three triples with the two fermion factors exchanged — are +not built here: they are minus these terms and span the same submodules, by +`mul_mul_swap_eq_neg` and `mul_mul_piece_swap`. + +## ii. Key results + +- `downYukawa`, `upYukawa`, `leptonYukawa` : the three Yukawa terms of a family pair. +- `isSU3FunAntiFun_downBlock`, `isSU2FunAntiFun_downBlock`, `isBiDualRightWeyl_downBlock` + and their up-type and lepton-type counterparts : the index laws of each block. +- `repGauge_downYukawa`, `repLorentz_downYukawa` and their counterparts : the invariance of + each Yukawa term. +- `downYukawaSpan`, `upYukawaSpan`, `leptonYukawaSpan` : the join over the nine family + pairs, which is the coupling with an arbitrary `3 × 3` matrix. + +## iii. Table of contents + +- A. The down-type Yukawa term +- B. The invariance of the down-type Yukawa term, and its mass weight +- C. The up-type Yukawa term +- D. The invariance of the up-type Yukawa term, and its mass weight +- E. The charged-lepton Yukawa term +- F. The invariance of the charged-lepton Yukawa term, and its mass weight +- G. The spans of the Yukawa terms + +-/ + +@[expose] public section + +namespace StandardModel + +open TensorProduct Matrix MatrixGroups Lorentz Pointwise ComplexConjugate + +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) + +/-! + +## A. The down-type Yukawa term + +The first block, and the pattern for the other eleven. The block is the product +`H d barQ`; the conjugate quark doublet supplies the fundamental colour index and the +fundamental isospin index, so it goes in the first slot of both mixed families, while the +down singlet supplies the anti-fundamental colour index and the Higgs symbol the +anti-fundamental isospin one. Both fermions are right-handed. The three contractions are +then formed in turn, each one a spectator of the next. + +-/ + +/-- The components of the down-type Yukawa block `H d barQ`: a Higgs symbol, a + down-singlet symbol and a conjugate quark-doublet symbol, none carrying derivatives, + multiplied in the order in which the block of + `sectorMassWeightEightGaugeWeight_piece_zero` multiplies them. -/ +noncomputable def downBlock (f f' : Fin 3) (i sd : Fin 2) (cd : Fin 3) (sq : Fin 2) + (cq : Fin 3) (wq : Fin 2) : B := + h.isHiggsSector.higgs ![] i * (h.isFermionSector.dComponent f ![] (sd, cd) * + h.isFermionSector.barQComponent f' ![] (sq, cq, wq)) + +/-- The two colour indices of the down-type block carry one fundamental and one + anti-fundamental `su(3)` index: the conjugate quark doublet supplies the fundamental + index, so it goes in the first slot, and the down singlet the anti-fundamental one. -/ +lemma isSU3FunAntiFun_downBlock (f f' : Fin 3) (i sd sq wq : Fin 2) : + IsSU3FunAntiFun B repGauge + (fun l : Fin 2 → Fin 3 => h.downBlock f f' i sd (l 1) sq (l 0) wq) where + repGauge_T U l := by + simp only [downBlock] + rw [h.repGauge_mul_fixed_left (U, 1, 1) + (X := fun a => h.isFermionSector.dComponent f ![] (sd, a)) + (Y := fun a => h.isFermionSector.barQComponent f' ![] (sq, a, wq)) + (h.repGauge_su3_higgs U ![] i) (h.repGauge_su3_d U f ![] sd (l 1)) + (h.repGauge_su3_barQ U f' ![] sq (l 0) wq), IsSU3FunAntiFun.sum_pi_two] + simp only [Matrix.cons_val_zero, Matrix.cons_val_one] + rw [Finset.sum_comm] + exact Finset.sum_congr rfl fun x _ => Finset.sum_congr rfl fun y _ => by rw [mul_comm] + +/-- The two isospin indices of the down-type block carry one fundamental and one + anti-fundamental `su(2)` index: the conjugate quark doublet supplies the fundamental + index and the Higgs symbol the anti-fundamental one, so the Higgs index goes in the + second slot. -/ +lemma isSU2FunAntiFun_downBlock (f f' : Fin 3) (sd : Fin 2) (cd : Fin 3) (sq : Fin 2) + (cq : Fin 3) : + IsSU2FunAntiFun B repGauge + (fun l : Fin 2 → Fin 2 => h.downBlock f f' (l 1) sd cd sq cq (l 0)) where + repGauge_T V l := by + simp only [downBlock] + rw [h.repGauge_mul_fixed_mid (1, V, 1) (A := fun a => h.isHiggsSector.higgs ![] a) + (Y := fun a => h.isFermionSector.barQComponent f' ![] (sq, cq, a)) + (h.repGauge_su2_higgs V ![] (l 1)) (h.repGauge_su2_d V f ![] (sd, cd)) + (h.repGauge_su2_barQ V f' ![] sq cq (l 0)), IsSU2BiFundamental.sum_pi_two] + simp only [Matrix.cons_val_zero, Matrix.cons_val_one] + rw [Finset.sum_comm] + exact Finset.sum_congr rfl fun x _ => Finset.sum_congr rfl fun y _ => by rw [mul_comm] + +/-- The two spinor indices of the down-type block are both dual right-handed: the down + singlet and the conjugate quark doublet are both right-handed, and the Higgs symbol + without derivatives is a Lorentz scalar. -/ +lemma isBiDualRightWeyl_downBlock (f f' : Fin 3) (i : Fin 2) (cd cq : Fin 3) (wq : Fin 2) : + IsBiDualRightWeyl B repLorentz + (fun l : Fin 2 × Fin 2 => h.downBlock f f' i l.1 cd l.2 cq wq) where + repLorentz_T Λ l := by + simp only [downBlock] + rw [h.repLorentz_mul_fixed_left Λ + (X := fun a => h.isFermionSector.dComponent f ![] (a, cd)) + (Y := fun a => h.isFermionSector.barQComponent f' ![] (a, cq, wq)) + (h.repLorentz_higgs_zero Λ ![] i) + (h.isFermionSector.repLorentz_dComponent Λ f ![] (l.1, cd)) + (h.isFermionSector.repLorentz_barQComponent Λ f' ![] (l.2, cq, wq))] + rw [Fintype.sum_prod_type] + exact Finset.sum_congr rfl fun x _ => Finset.sum_congr rfl fun y _ => by + simp [Matrix.conjTranspose_apply, SL2C.inverse_coe] + +/-- A hypercharge transformation fixes every component of the down-type block, the three + hypercharges `-3`, `2` and `1` cancelling. -/ +lemma repGauge_u1_downBlock (t : unitary ℂ) (f f' : Fin 3) (i sd : Fin 2) (cd : Fin 3) + (sq : Fin 2) (cq : Fin 3) (wq : Fin 2) : + repGauge ((1, 1, t) : GaugeGroupI) (h.downBlock f f' i sd cd sq cq wq) + = h.downBlock f f' i sd cd sq cq wq := by + have ht : star (t : ℂ) * (t : ℂ) = 1 := t.2.1 + rw [downBlock, h.isHiggsSector.rep_mul, h.isHiggsSector.rep_mul, h.repGauge_u1_higgs, + h.repGauge_u1_d, h.repGauge_u1_barQ, smul_mul_smul_comm, smul_mul_smul_comm, + show (star (t : ℂ)) ^ 3 * ((t : ℂ) ^ 2 * (t : ℂ)) = 1 from by + rw [show (t : ℂ) ^ 2 * (t : ℂ) = (t : ℂ) ^ 3 from by ring, ← mul_pow, ht, one_pow], + one_smul] + +/-- The colour contraction of the down-type block: the Kronecker delta joining the + fundamental colour index of the conjugate quark doublet to the anti-fundamental one of + the down singlet. -/ +noncomputable def downBlockColour (f f' : Fin 3) (i sd sq wq : Fin 2) : B := + IsSU3FunAntiFun.deltaContraction + (fun l : Fin 2 → Fin 3 => h.downBlock f f' i sd (l 1) sq (l 0) wq) + +/-- The colour contraction written out: the sum of the three components with equal colour + indices. -/ +lemma downBlockColour_eq (f f' : Fin 3) (i sd sq wq : Fin 2) : + h.downBlockColour f f' i sd sq wq + = ∑ a : Fin 3, h.downBlock f f' i sd a sq a wq := by + simp [downBlockColour, IsSU3FunAntiFun.deltaContraction] + +/-- The colour contraction of the down-type block still carries one fundamental and one + anti-fundamental isospin index, the colour sum being an isospin spectator. -/ +lemma isSU2FunAntiFun_downBlockColour (f f' : Fin 3) (sd sq : Fin 2) : + IsSU2FunAntiFun B repGauge + (fun l : Fin 2 → Fin 2 => h.downBlockColour f f' (l 1) sd sq (l 0)) := by + simp only [h.downBlockColour_eq] + exact IsSU2FunAntiFun.sum fun a => h.isSU2FunAntiFun_downBlock f f' sd a sq a + +/-- The isospin contraction of the colour-contracted down-type block: the Kronecker delta + joining the fundamental isospin index of the conjugate quark doublet to the + anti-fundamental one of the Higgs. -/ +noncomputable def downBlockIsospin (f f' : Fin 3) (sd sq : Fin 2) : B := + IsSU2FunAntiFun.deltaContraction + (fun l : Fin 2 → Fin 2 => h.downBlockColour f f' (l 1) sd sq (l 0)) + +/-- The doubly contracted block written out as a single sum over the isospin and colour + indices it identifies. -/ +lemma downBlockIsospin_eq (f f' : Fin 3) (sd sq : Fin 2) : + h.downBlockIsospin f f' sd sq + = ∑ p : Fin 2 × Fin 3, h.downBlock f f' p.1 sd p.2 sq p.2 p.1 := by + rw [downBlockIsospin, IsSU2FunAntiFun.deltaContraction, h.downBlockColour_eq, + h.downBlockColour_eq, Fintype.sum_prod_type, Fin.sum_univ_two] + simp + +/-- The doubly contracted block carries two dual right-handed Weyl indices, the colour and + isospin sums being Lorentz spectators. -/ +lemma isBiDualRightWeyl_downBlockIsospin (f f' : Fin 3) : + IsBiDualRightWeyl B repLorentz + (fun l : Fin 2 × Fin 2 => h.downBlockIsospin f f' l.1 l.2) := by + simp only [h.downBlockIsospin_eq] + exact isBiDualRightWeyl_sum fun p => h.isBiDualRightWeyl_downBlock f f' p.1 p.2 p.2 p.1 + +/-- The down-type Yukawa term of the family pair `(f, f')`: the down-singlet symbol of + family `f` against the conjugate quark doublet of family `f'` and a Higgs symbol, with + the colour indices joined by the Kronecker delta, the isospin indices by the Kronecker + delta, and the two right-handed spinor indices by the antisymmetric symbol. -/ +noncomputable def downYukawa (f f' : Fin 3) : B := + IsBiLeftWeyl.epsilonContraction + (T := fun l : Fin 2 × Fin 2 => h.downBlockIsospin f f' l.1 l.2) + +/-! + +## B. The invariance of the down-type Yukawa term, and its mass weight + +Each contraction is invariant under the factor it contracts, and inert under the other two, +so the composite is fixed by all three factors and hence gauge invariant. Hypercharge is +already invariant component by component, the three charges `-3`, `2` and `1` summing to +zero. + +-/ + +/-- The colour contraction of the down-type block is fixed by the colour factor. -/ +lemma repGauge_su3_downBlockColour (U : specialUnitaryGroup (Fin 3) ℂ) (f f' : Fin 3) + (i sd sq wq : Fin 2) : + repGauge ((U, 1, 1) : GaugeGroupI) (h.downBlockColour f f' i sd sq wq) + = h.downBlockColour f f' i sd sq wq := + IsSU3FunAntiFun.repGauge_deltaContraction (h.isSU3FunAntiFun_downBlock f f' i sd sq wq) U + +/-- The doubly contracted down-type block is fixed by the colour factor. -/ +lemma repGauge_su3_downBlockIsospin (U : specialUnitaryGroup (Fin 3) ℂ) (f f' : Fin 3) + (sd sq : Fin 2) : + repGauge ((U, 1, 1) : GaugeGroupI) (h.downBlockIsospin f f' sd sq) + = h.downBlockIsospin f f' sd sq := by + rw [downBlockIsospin, IsSU2FunAntiFun.deltaContraction, map_add, + h.repGauge_su3_downBlockColour, h.repGauge_su3_downBlockColour] + +/-- The doubly contracted down-type block is fixed by the isospin factor. -/ +lemma repGauge_su2_downBlockIsospin (V : specialUnitaryGroup (Fin 2) ℂ) (f f' : Fin 3) + (sd sq : Fin 2) : + repGauge ((1, V, 1) : GaugeGroupI) (h.downBlockIsospin f f' sd sq) + = h.downBlockIsospin f f' sd sq := + IsSU2FunAntiFun.repGauge_deltaContraction (h.isSU2FunAntiFun_downBlockColour f f' sd sq) V + +/-- The doubly contracted down-type block is fixed by the hypercharge factor, already + component by component. -/ +lemma repGauge_u1_downBlockIsospin (t : unitary ℂ) (f f' : Fin 3) (sd sq : Fin 2) : + repGauge ((1, 1, t) : GaugeGroupI) (h.downBlockIsospin f f' sd sq) + = h.downBlockIsospin f f' sd sq := by + rw [h.downBlockIsospin_eq, map_sum] + exact Finset.sum_congr rfl fun p _ => h.repGauge_u1_downBlock t f f' p.1 sd p.2 sq p.2 p.1 + +/-- The down-type Yukawa term is gauge invariant: the colour indices are joined by the + Kronecker delta, the isospin indices by the Kronecker delta, and the three hypercharges + cancel. -/ +lemma repGauge_downYukawa (f f' : Fin 3) (g : GaugeGroupI) : + repGauge g (h.downYukawa f f') = h.downYukawa f f' := by + refine forall_repGauge_eq_self (fun U => ?_) (fun V => ?_) (fun t => ?_) g <;> + rw [downYukawa, IsBiLeftWeyl.epsilonContraction_eq, map_sub] + · rw [h.repGauge_su3_downBlockIsospin, h.repGauge_su3_downBlockIsospin] + · rw [h.repGauge_su2_downBlockIsospin, h.repGauge_su2_downBlockIsospin] + · rw [h.repGauge_u1_downBlockIsospin, h.repGauge_u1_downBlockIsospin] + +/-- The down-type Yukawa term is Lorentz invariant, the two right-handed spinor indices + being joined by the antisymmetric symbol. -/ +lemma repLorentz_downYukawa (f f' : Fin 3) (Λ : SL(2,ℂ)) : + repLorentz Λ (h.downYukawa f f') = h.downYukawa f f' := + (h.isBiDualRightWeyl_downBlockIsospin f f').repLorentz_epsilonContraction Λ + +/-- Every component of the down-type block sits at mass weight eight in the Yukawa + sector. -/ +lemma downBlock_mem_sectorMassWeight (f f' : Fin 3) (i sd : Fin 2) (cd : Fin 3) + (sq : Fin 2) (cq : Fin 3) (wq : Fin 2) : + h.downBlock f f' i sd cd sq cq wq + ∈ h.sectorMassWeight {GeneratorClass.higgs, GeneratorClass.fermion} 8 := by + rw [h.sectorMassWeight_higgs_fermion_eight, downBlock] + exact Submodule.mul_mem_mul (h.higgs_mem_derivSubmodule ![] i) + (Submodule.mul_mem_mul (h.dComponent_mem_derivSubmodule f ![] (sd, cd)) + (h.barQComponent_mem_derivSubmodule f' ![] (sq, cq, wq))) + +/-- The down-type Yukawa term sits at mass weight eight in the Yukawa sector. -/ +lemma downYukawa_mem_sectorMassWeight (f f' : Fin 3) : + h.downYukawa f f' ∈ h.sectorMassWeight {GeneratorClass.higgs, GeneratorClass.fermion} 8 := by + rw [downYukawa, IsBiLeftWeyl.epsilonContraction_eq] + refine Submodule.sub_mem _ ?_ ?_ <;> + exact h.downBlockIsospin_eq _ _ _ _ ▸ + sum_mem fun p _ => h.downBlock_mem_sectorMassWeight _ _ _ _ _ _ _ _ + +/-! + +## C. The up-type Yukawa term + +The second computation. Colour is again `3 ⊗ 3̄`, the conjugate up singlet supplying the +fundamental index, but isospin is `2̄ ⊗ 2̄`: the Higgs symbol and the quark doublet both +carry the anti-fundamental, whose only invariant is the antisymmetric symbol. Both +fermions are left-handed. + +-/ + +/-- The components of the up-type Yukawa block `H baru Q`: a Higgs symbol, a conjugate + up-singlet symbol and a quark-doublet symbol, none carrying derivatives. -/ +noncomputable def upBlock (f f' : Fin 3) (i su : Fin 2) (cu : Fin 3) (sQ : Fin 2) + (cQ : Fin 3) (wQ : Fin 2) : B := + h.isHiggsSector.higgs ![] i * (h.isFermionSector.baruComponent f ![] (su, cu) * + h.isFermionSector.QComponent f' ![] (sQ, cQ, wQ)) + +/-- The two colour indices of the up-type block carry one fundamental and one + anti-fundamental `su(3)` index, the conjugate up singlet supplying the fundamental + one. -/ +lemma isSU3FunAntiFun_upBlock (f f' : Fin 3) (i su sQ wQ : Fin 2) : + IsSU3FunAntiFun B repGauge + (fun l : Fin 2 → Fin 3 => h.upBlock f f' i su (l 0) sQ (l 1) wQ) where + repGauge_T U l := by + simp only [upBlock] + rw [h.repGauge_mul_fixed_left (U, 1, 1) + (X := fun a => h.isFermionSector.baruComponent f ![] (su, a)) + (Y := fun a => h.isFermionSector.QComponent f' ![] (sQ, a, wQ)) + (h.repGauge_su3_higgs U ![] i) (h.repGauge_su3_baru U f ![] su (l 0)) + (h.repGauge_su3_Q U f' ![] sQ (l 1) wQ), IsSU3FunAntiFun.sum_pi_two] + simp only [Matrix.cons_val_zero, Matrix.cons_val_one] + +/-- The two isospin indices of the up-type block are both anti-fundamental: the Higgs + symbol and the quark doublet both carry the anti-fundamental of `su(2)`. -/ +lemma isSU2BiAntiFun_upBlock (f f' : Fin 3) (su : Fin 2) (cu : Fin 3) (sQ : Fin 2) + (cQ : Fin 3) : + IsSU2BiAntiFun B repGauge + (fun l : Fin 2 → Fin 2 => h.upBlock f f' (l 0) su cu sQ cQ (l 1)) where + repGauge_T V l := by + simp only [upBlock] + rw [h.repGauge_mul_fixed_mid (1, V, 1) (A := fun a => h.isHiggsSector.higgs ![] a) + (Y := fun a => h.isFermionSector.QComponent f' ![] (sQ, cQ, a)) + (h.repGauge_su2_higgs V ![] (l 0)) (h.repGauge_su2_baru V f ![] (su, cu)) + (h.repGauge_su2_Q V f' ![] sQ cQ (l 1)), IsSU2BiFundamental.sum_pi_two] + simp only [Matrix.cons_val_zero, Matrix.cons_val_one] + +/-- The two spinor indices of the up-type block are both dual left-handed. -/ +lemma isBiDualLeftWeyl_upBlock (f f' : Fin 3) (i : Fin 2) (cu cQ : Fin 3) (wQ : Fin 2) : + IsBiDualLeftWeyl B repLorentz + (fun l : Fin 2 × Fin 2 => h.upBlock f f' i l.1 cu l.2 cQ wQ) where + repLorentz_T Λ l := by + simp only [upBlock] + rw [h.repLorentz_mul_fixed_left Λ + (X := fun a => h.isFermionSector.baruComponent f ![] (a, cu)) + (Y := fun a => h.isFermionSector.QComponent f' ![] (a, cQ, wQ)) + (h.repLorentz_higgs_zero Λ ![] i) + (h.isFermionSector.repLorentz_baruComponent Λ f ![] (l.1, cu)) + (h.isFermionSector.repLorentz_QComponent Λ f' ![] (l.2, cQ, wQ))] + rw [Fintype.sum_prod_type] + exact Finset.sum_congr rfl fun x _ => Finset.sum_congr rfl fun y _ => by + simp [Matrix.transpose_apply, SL2C.inverse_coe] + +/-- A hypercharge transformation fixes every component of the up-type block, the three + hypercharges `-3`, `4` and `-1` cancelling. -/ +lemma repGauge_u1_upBlock (t : unitary ℂ) (f f' : Fin 3) (i su : Fin 2) (cu : Fin 3) + (sQ : Fin 2) (cQ : Fin 3) (wQ : Fin 2) : + repGauge ((1, 1, t) : GaugeGroupI) (h.upBlock f f' i su cu sQ cQ wQ) + = h.upBlock f f' i su cu sQ cQ wQ := by + have ht : star (t : ℂ) * (t : ℂ) = 1 := t.2.1 + rw [upBlock, h.isHiggsSector.rep_mul, h.isHiggsSector.rep_mul, h.repGauge_u1_higgs, + h.repGauge_u1_baru, h.repGauge_u1_Q, smul_mul_smul_comm, smul_mul_smul_comm, + show (star (t : ℂ)) ^ 3 * ((t : ℂ) ^ 4 * star (t : ℂ)) = 1 from by + rw [show (star (t : ℂ)) ^ 3 * ((t : ℂ) ^ 4 * star (t : ℂ)) + = (star (t : ℂ) * (t : ℂ)) ^ 4 from by ring, ht, one_pow], + one_smul] + +/-- The colour contraction of the up-type block. -/ +noncomputable def upBlockColour (f f' : Fin 3) (i su sQ wQ : Fin 2) : B := + IsSU3FunAntiFun.deltaContraction + (fun l : Fin 2 → Fin 3 => h.upBlock f f' i su (l 0) sQ (l 1) wQ) + +/-- The colour contraction of the up-type block written out. -/ +lemma upBlockColour_eq (f f' : Fin 3) (i su sQ wQ : Fin 2) : + h.upBlockColour f f' i su sQ wQ = ∑ a : Fin 3, h.upBlock f f' i su a sQ a wQ := by + simp [upBlockColour, IsSU3FunAntiFun.deltaContraction] + +/-- The colour contraction of the up-type block still carries two anti-fundamental isospin + indices. -/ +lemma isSU2BiAntiFun_upBlockColour (f f' : Fin 3) (su sQ : Fin 2) : + IsSU2BiAntiFun B repGauge + (fun l : Fin 2 → Fin 2 => h.upBlockColour f f' (l 0) su sQ (l 1)) := by + simp only [h.upBlockColour_eq] + exact IsSU2BiAntiFun.sum fun a => h.isSU2BiAntiFun_upBlock f f' su a sQ a + +/-- The isospin contraction of the colour-contracted up-type block, by the antisymmetric + symbol: two anti-fundamental isospin indices admit no trace. -/ +noncomputable def upBlockIsospin (f f' : Fin 3) (su sQ : Fin 2) : B := + IsSU2BiFundamental.epsilonContraction + (fun l : Fin 2 → Fin 2 => h.upBlockColour f f' (l 0) su sQ (l 1)) + +/-- The doubly contracted up-type block written out. -/ +lemma upBlockIsospin_eq (f f' : Fin 3) (su sQ : Fin 2) : + h.upBlockIsospin f f' su sQ = (∑ a : Fin 3, h.upBlock f f' 0 su a sQ a 1) + - ∑ a : Fin 3, h.upBlock f f' 1 su a sQ a 0 := by + rw [upBlockIsospin, IsSU2BiFundamental.epsilonContraction] + simp [h.upBlockColour_eq] + +/-- The doubly contracted up-type block carries two dual left-handed Weyl indices. -/ +lemma isBiDualLeftWeyl_upBlockIsospin (f f' : Fin 3) : + IsBiDualLeftWeyl B repLorentz + (fun l : Fin 2 × Fin 2 => h.upBlockIsospin f f' l.1 l.2) := by + simp only [h.upBlockIsospin_eq] + exact isBiDualLeftWeyl_sub + (isBiDualLeftWeyl_sum fun a => h.isBiDualLeftWeyl_upBlock f f' 0 a a 1) + (isBiDualLeftWeyl_sum fun a => h.isBiDualLeftWeyl_upBlock f f' 1 a a 0) + +/-- The up-type Yukawa term of the family pair `(f, f')`: the colour indices are joined by + the Kronecker delta, the isospin indices by the antisymmetric symbol, and the two + left-handed spinor indices by the antisymmetric symbol. -/ +noncomputable def upYukawa (f f' : Fin 3) : B := + IsBiLeftWeyl.epsilonContraction + (T := fun l : Fin 2 × Fin 2 => h.upBlockIsospin f f' l.1 l.2) + +/-! + +## D. The invariance of the up-type Yukawa term, and its mass weight + +-/ + +/-- The colour contraction of the up-type block is fixed by the colour factor. -/ +lemma repGauge_su3_upBlockColour (U : specialUnitaryGroup (Fin 3) ℂ) (f f' : Fin 3) + (i su sQ wQ : Fin 2) : + repGauge ((U, 1, 1) : GaugeGroupI) (h.upBlockColour f f' i su sQ wQ) + = h.upBlockColour f f' i su sQ wQ := + IsSU3FunAntiFun.repGauge_deltaContraction (h.isSU3FunAntiFun_upBlock f f' i su sQ wQ) U + +/-- The doubly contracted up-type block is fixed by the colour factor. -/ +lemma repGauge_su3_upBlockIsospin (U : specialUnitaryGroup (Fin 3) ℂ) (f f' : Fin 3) + (su sQ : Fin 2) : + repGauge ((U, 1, 1) : GaugeGroupI) (h.upBlockIsospin f f' su sQ) + = h.upBlockIsospin f f' su sQ := by + rw [upBlockIsospin, IsSU2BiFundamental.epsilonContraction, map_sub, + h.repGauge_su3_upBlockColour, h.repGauge_su3_upBlockColour] + +/-- The doubly contracted up-type block is fixed by the isospin factor. -/ +lemma repGauge_su2_upBlockIsospin (V : specialUnitaryGroup (Fin 2) ℂ) (f f' : Fin 3) + (su sQ : Fin 2) : + repGauge ((1, V, 1) : GaugeGroupI) (h.upBlockIsospin f f' su sQ) + = h.upBlockIsospin f f' su sQ := + IsSU2BiAntiFun.repGauge_epsilonContraction (h.isSU2BiAntiFun_upBlockColour f f' su sQ) V + +/-- The doubly contracted up-type block is fixed by the hypercharge factor. -/ +lemma repGauge_u1_upBlockIsospin (t : unitary ℂ) (f f' : Fin 3) (su sQ : Fin 2) : + repGauge ((1, 1, t) : GaugeGroupI) (h.upBlockIsospin f f' su sQ) + = h.upBlockIsospin f f' su sQ := by + rw [h.upBlockIsospin_eq, map_sub, map_sum, map_sum] + exact congrArg₂ _ (Finset.sum_congr rfl fun a _ => h.repGauge_u1_upBlock t f f' 0 su a sQ a 1) + (Finset.sum_congr rfl fun a _ => h.repGauge_u1_upBlock t f f' 1 su a sQ a 0) + +/-- The up-type Yukawa term is gauge invariant. -/ +lemma repGauge_upYukawa (f f' : Fin 3) (g : GaugeGroupI) : + repGauge g (h.upYukawa f f') = h.upYukawa f f' := by + refine forall_repGauge_eq_self (fun U => ?_) (fun V => ?_) (fun t => ?_) g <;> + rw [upYukawa, IsBiLeftWeyl.epsilonContraction_eq, map_sub] + · rw [h.repGauge_su3_upBlockIsospin, h.repGauge_su3_upBlockIsospin] + · rw [h.repGauge_su2_upBlockIsospin, h.repGauge_su2_upBlockIsospin] + · rw [h.repGauge_u1_upBlockIsospin, h.repGauge_u1_upBlockIsospin] + +/-- The up-type Yukawa term is Lorentz invariant. -/ +lemma repLorentz_upYukawa (f f' : Fin 3) (Λ : SL(2,ℂ)) : + repLorentz Λ (h.upYukawa f f') = h.upYukawa f f' := + (h.isBiDualLeftWeyl_upBlockIsospin f f').repLorentz_epsilonContraction Λ + +/-- Every component of the up-type block sits at mass weight eight in the Yukawa sector. -/ +lemma upBlock_mem_sectorMassWeight (f f' : Fin 3) (i su : Fin 2) (cu : Fin 3) + (sQ : Fin 2) (cQ : Fin 3) (wQ : Fin 2) : + h.upBlock f f' i su cu sQ cQ wQ + ∈ h.sectorMassWeight {GeneratorClass.higgs, GeneratorClass.fermion} 8 := by + rw [h.sectorMassWeight_higgs_fermion_eight, upBlock] + exact Submodule.mul_mem_mul (h.higgs_mem_derivSubmodule ![] i) + (Submodule.mul_mem_mul (h.baruComponent_mem_derivSubmodule f ![] (su, cu)) + (h.QComponent_mem_derivSubmodule f' ![] (sQ, cQ, wQ))) + +/-- The up-type Yukawa term sits at mass weight eight in the Yukawa sector. -/ +lemma upYukawa_mem_sectorMassWeight (f f' : Fin 3) : + h.upYukawa f f' ∈ h.sectorMassWeight {GeneratorClass.higgs, GeneratorClass.fermion} 8 := by + have hiso : ∀ su sQ : Fin 2, h.upBlockIsospin f f' su sQ + ∈ h.sectorMassWeight {GeneratorClass.higgs, GeneratorClass.fermion} 8 := by + intro su sQ + rw [h.upBlockIsospin_eq] + exact Submodule.sub_mem _ (sum_mem fun a _ => h.upBlock_mem_sectorMassWeight _ _ _ _ _ _ _ _) + (sum_mem fun a _ => h.upBlock_mem_sectorMassWeight _ _ _ _ _ _ _ _) + rw [upYukawa, IsBiLeftWeyl.epsilonContraction_eq] + exact Submodule.sub_mem _ (hiso _ _) (hiso _ _) + +/-! + +## E. The charged-lepton Yukawa term + +The lepton blocks carry no colour at all, so there is no colour family to classify and no +colour contraction to form: the three symbols are separately fixed by the colour factor, +which is `repGauge_su3_leptonBlock`. The isospin and Lorentz steps are the same two steps +as for the quark blocks, and the contraction is the composite of those two alone. + +-/ + +/-- The components of the charged-lepton Yukawa block `H barL e`: a Higgs symbol, a + conjugate lepton-doublet symbol and a lepton-singlet symbol, none carrying + derivatives. -/ +noncomputable def leptonBlock (f f' : Fin 3) (i sL wL se : Fin 2) : B := + h.isHiggsSector.higgs ![] i * (h.isFermionSector.barLComponent f ![] (sL, wL) * + h.isFermionSector.eComponent f' ![] se) + +/-- The lepton block is colour invariant outright: none of its three symbols carries a + colour index. This is what stands in for the colour classification of the quark + blocks. -/ +lemma repGauge_su3_leptonBlock (U : specialUnitaryGroup (Fin 3) ℂ) (f f' : Fin 3) + (i sL wL se : Fin 2) : + repGauge ((U, 1, 1) : GaugeGroupI) (h.leptonBlock f f' i sL wL se) + = h.leptonBlock f f' i sL wL se := by + rw [leptonBlock, h.isHiggsSector.rep_mul, h.isHiggsSector.rep_mul, h.repGauge_su3_higgs, + h.repGauge_su3_barL, h.repGauge_su3_e] + +/-- The two isospin indices of the lepton block carry one fundamental and one + anti-fundamental `su(2)` index, the conjugate lepton doublet supplying the fundamental + one. -/ +lemma isSU2FunAntiFun_leptonBlock (f f' : Fin 3) (sL se : Fin 2) : + IsSU2FunAntiFun B repGauge + (fun l : Fin 2 → Fin 2 => h.leptonBlock f f' (l 1) sL (l 0) se) where + repGauge_T V l := by + simp only [leptonBlock] + rw [h.repGauge_mul_fixed_right (1, V, 1) (A := fun a => h.isHiggsSector.higgs ![] a) + (X := fun a => h.isFermionSector.barLComponent f ![] (sL, a)) + (h.repGauge_su2_higgs V ![] (l 1)) (h.repGauge_su2_barL V f ![] sL (l 0)) + (h.repGauge_su2_e V f' ![] se), IsSU2BiFundamental.sum_pi_two] + simp only [Matrix.cons_val_zero, Matrix.cons_val_one] + rw [Finset.sum_comm] + exact Finset.sum_congr rfl fun x _ => Finset.sum_congr rfl fun y _ => by rw [mul_comm] + +/-- The two spinor indices of the lepton block are both dual right-handed. -/ +lemma isBiDualRightWeyl_leptonBlock (f f' : Fin 3) (i wL : Fin 2) : + IsBiDualRightWeyl B repLorentz + (fun l : Fin 2 × Fin 2 => h.leptonBlock f f' i l.1 wL l.2) where + repLorentz_T Λ l := by + simp only [leptonBlock] + rw [h.repLorentz_mul_fixed_left Λ + (X := fun a => h.isFermionSector.barLComponent f ![] (a, wL)) + (Y := fun a => h.isFermionSector.eComponent f' ![] a) + (h.repLorentz_higgs_zero Λ ![] i) + (h.isFermionSector.repLorentz_barLComponent Λ f ![] (l.1, wL)) + (h.isFermionSector.repLorentz_eComponent Λ f' ![] l.2)] + rw [Fintype.sum_prod_type] + exact Finset.sum_congr rfl fun x _ => Finset.sum_congr rfl fun y _ => by + simp [Matrix.conjTranspose_apply, SL2C.inverse_coe] + +/-- A hypercharge transformation fixes every component of the lepton block, the three + hypercharges `-3`, `-3` and `6` cancelling. -/ +lemma repGauge_u1_leptonBlock (t : unitary ℂ) (f f' : Fin 3) (i sL wL se : Fin 2) : + repGauge ((1, 1, t) : GaugeGroupI) (h.leptonBlock f f' i sL wL se) + = h.leptonBlock f f' i sL wL se := by + have ht : star (t : ℂ) * (t : ℂ) = 1 := t.2.1 + rw [leptonBlock, h.isHiggsSector.rep_mul, h.isHiggsSector.rep_mul, h.repGauge_u1_higgs, + h.repGauge_u1_barL, h.repGauge_u1_e, smul_mul_smul_comm, smul_mul_smul_comm, + show (star (t : ℂ)) ^ 3 * ((star (t : ℂ)) ^ 3 * (t : ℂ) ^ 6) = 1 from by + rw [show (star (t : ℂ)) ^ 3 * ((star (t : ℂ)) ^ 3 * (t : ℂ) ^ 6) + = (star (t : ℂ) * (t : ℂ)) ^ 6 from by ring, ht, one_pow], + one_smul] + +/-- The isospin contraction of the lepton block. -/ +noncomputable def leptonBlockIsospin (f f' : Fin 3) (sL se : Fin 2) : B := + IsSU2FunAntiFun.deltaContraction + (fun l : Fin 2 → Fin 2 => h.leptonBlock f f' (l 1) sL (l 0) se) + +/-- The isospin contraction of the lepton block written out. -/ +lemma leptonBlockIsospin_eq (f f' : Fin 3) (sL se : Fin 2) : + h.leptonBlockIsospin f f' sL se = ∑ w : Fin 2, h.leptonBlock f f' w sL w se := by + rw [leptonBlockIsospin, IsSU2FunAntiFun.deltaContraction, Fin.sum_univ_two] + simp + +/-- The contracted lepton block carries two dual right-handed Weyl indices. -/ +lemma isBiDualRightWeyl_leptonBlockIsospin (f f' : Fin 3) : + IsBiDualRightWeyl B repLorentz + (fun l : Fin 2 × Fin 2 => h.leptonBlockIsospin f f' l.1 l.2) := by + simp only [h.leptonBlockIsospin_eq] + exact isBiDualRightWeyl_sum fun w => h.isBiDualRightWeyl_leptonBlock f f' w w + +/-- The charged-lepton Yukawa term of the family pair `(f, f')`: the isospin indices are + joined by the Kronecker delta and the two right-handed spinor indices by the + antisymmetric symbol, colour playing no part. -/ +noncomputable def leptonYukawa (f f' : Fin 3) : B := + IsBiLeftWeyl.epsilonContraction + (T := fun l : Fin 2 × Fin 2 => h.leptonBlockIsospin f f' l.1 l.2) + +/-! + +## F. The invariance of the charged-lepton Yukawa term, and its mass weight + +-/ + +/-- The contracted lepton block is fixed by the colour factor. -/ +lemma repGauge_su3_leptonBlockIsospin (U : specialUnitaryGroup (Fin 3) ℂ) (f f' : Fin 3) + (sL se : Fin 2) : + repGauge ((U, 1, 1) : GaugeGroupI) (h.leptonBlockIsospin f f' sL se) + = h.leptonBlockIsospin f f' sL se := by + rw [h.leptonBlockIsospin_eq, map_sum] + exact Finset.sum_congr rfl fun w _ => h.repGauge_su3_leptonBlock U f f' w sL w se + +/-- The contracted lepton block is fixed by the isospin factor. -/ +lemma repGauge_su2_leptonBlockIsospin (V : specialUnitaryGroup (Fin 2) ℂ) (f f' : Fin 3) + (sL se : Fin 2) : + repGauge ((1, V, 1) : GaugeGroupI) (h.leptonBlockIsospin f f' sL se) + = h.leptonBlockIsospin f f' sL se := + IsSU2FunAntiFun.repGauge_deltaContraction (h.isSU2FunAntiFun_leptonBlock f f' sL se) V + +/-- The contracted lepton block is fixed by the hypercharge factor. -/ +lemma repGauge_u1_leptonBlockIsospin (t : unitary ℂ) (f f' : Fin 3) (sL se : Fin 2) : + repGauge ((1, 1, t) : GaugeGroupI) (h.leptonBlockIsospin f f' sL se) + = h.leptonBlockIsospin f f' sL se := by + rw [h.leptonBlockIsospin_eq, map_sum] + exact Finset.sum_congr rfl fun w _ => h.repGauge_u1_leptonBlock t f f' w sL w se + +/-- The charged-lepton Yukawa term is gauge invariant. -/ +lemma repGauge_leptonYukawa (f f' : Fin 3) (g : GaugeGroupI) : + repGauge g (h.leptonYukawa f f') = h.leptonYukawa f f' := by + refine forall_repGauge_eq_self (fun U => ?_) (fun V => ?_) (fun t => ?_) g <;> + rw [leptonYukawa, IsBiLeftWeyl.epsilonContraction_eq, map_sub] + · rw [h.repGauge_su3_leptonBlockIsospin, h.repGauge_su3_leptonBlockIsospin] + · rw [h.repGauge_su2_leptonBlockIsospin, h.repGauge_su2_leptonBlockIsospin] + · rw [h.repGauge_u1_leptonBlockIsospin, h.repGauge_u1_leptonBlockIsospin] + +/-- The charged-lepton Yukawa term is Lorentz invariant. -/ +lemma repLorentz_leptonYukawa (f f' : Fin 3) (Λ : SL(2,ℂ)) : + repLorentz Λ (h.leptonYukawa f f') = h.leptonYukawa f f' := + (h.isBiDualRightWeyl_leptonBlockIsospin f f').repLorentz_epsilonContraction Λ + +/-- Every component of the lepton block sits at mass weight eight in the Yukawa sector. -/ +lemma leptonBlock_mem_sectorMassWeight (f f' : Fin 3) (i sL wL se : Fin 2) : + h.leptonBlock f f' i sL wL se + ∈ h.sectorMassWeight {GeneratorClass.higgs, GeneratorClass.fermion} 8 := by + rw [h.sectorMassWeight_higgs_fermion_eight, leptonBlock] + exact Submodule.mul_mem_mul (h.higgs_mem_derivSubmodule ![] i) + (Submodule.mul_mem_mul (h.barLComponent_mem_derivSubmodule f ![] (sL, wL)) + (h.eComponent_mem_derivSubmodule f' ![] se)) + +/-- The charged-lepton Yukawa term sits at mass weight eight in the Yukawa sector. -/ +lemma leptonYukawa_mem_sectorMassWeight (f f' : Fin 3) : + h.leptonYukawa f f' + ∈ h.sectorMassWeight {GeneratorClass.higgs, GeneratorClass.fermion} 8 := by + rw [leptonYukawa, IsBiLeftWeyl.epsilonContraction_eq] + refine Submodule.sub_mem _ ?_ ?_ <;> + exact h.leptonBlockIsospin_eq _ _ _ _ ▸ + sum_mem fun w _ => h.leptonBlock_mem_sectorMassWeight _ _ _ _ _ _ + +/-! + +## G. The spans of the Yukawa terms + +The nine family pairs are what the Yukawa coupling matrices are: joining the line of a +Yukawa term over `(f, f') : Fin 3 × Fin 3` gives exactly the space of terms with an +arbitrary `3 × 3` complex coupling matrix, and no matrix has to be written down. Each such +join lies inside the sector at mass weight eight and inside both spaces of invariants, +which is the direction that will make the eventual classification an equivalence rather +than a one-way inclusion. + +-/ + +/-- The span of the down-type Yukawa terms over the nine family pairs: the down-type + Yukawa coupling with an arbitrary `3 × 3` matrix. -/ +noncomputable def downYukawaSpan : Submodule ℂ B := + ⨆ (f : Fin 3) (f' : Fin 3), ℂ ∙ h.downYukawa f f' + +/-- The span of the up-type Yukawa terms over the nine family pairs. -/ +noncomputable def upYukawaSpan : Submodule ℂ B := + ⨆ (f : Fin 3) (f' : Fin 3), ℂ ∙ h.upYukawa f f' + +/-- The span of the charged-lepton Yukawa terms over the nine family pairs. -/ +noncomputable def leptonYukawaSpan : Submodule ℂ B := + ⨆ (f : Fin 3) (f' : Fin 3), ℂ ∙ h.leptonYukawa f f' + +/-- The down-type Yukawa span sits at mass weight eight in the Yukawa sector. -/ +lemma downYukawaSpan_le_sectorMassWeight : + h.downYukawaSpan ≤ h.sectorMassWeight {GeneratorClass.higgs, GeneratorClass.fermion} 8 := + iSup_le fun f => iSup_le fun f' => (Submodule.span_singleton_le_iff_mem _ _).2 + (h.downYukawa_mem_sectorMassWeight f f') + +/-- The down-type Yukawa span is a space of gauge invariants. -/ +lemma downYukawaSpan_le_invariants : h.downYukawaSpan ≤ repGauge.invariants := + iSup_le fun f => iSup_le fun f' => (Submodule.span_singleton_le_iff_mem _ _).2 + ((Representation.mem_invariants _ _).2 (h.repGauge_downYukawa f f')) + +/-- The down-type Yukawa span is a space of Lorentz invariants. -/ +lemma downYukawaSpan_le_lorentzInvariants : h.downYukawaSpan ≤ repLorentz.invariants := + iSup_le fun f => iSup_le fun f' => (Submodule.span_singleton_le_iff_mem _ _).2 + ((Representation.mem_invariants _ _).2 (h.repLorentz_downYukawa f f')) + +/-- The up-type Yukawa span sits at mass weight eight in the Yukawa sector. -/ +lemma upYukawaSpan_le_sectorMassWeight : + h.upYukawaSpan ≤ h.sectorMassWeight {GeneratorClass.higgs, GeneratorClass.fermion} 8 := + iSup_le fun f => iSup_le fun f' => (Submodule.span_singleton_le_iff_mem _ _).2 + (h.upYukawa_mem_sectorMassWeight f f') + +/-- The up-type Yukawa span is a space of gauge invariants. -/ +lemma upYukawaSpan_le_invariants : h.upYukawaSpan ≤ repGauge.invariants := + iSup_le fun f => iSup_le fun f' => (Submodule.span_singleton_le_iff_mem _ _).2 + ((Representation.mem_invariants _ _).2 (h.repGauge_upYukawa f f')) + +/-- The up-type Yukawa span is a space of Lorentz invariants. -/ +lemma upYukawaSpan_le_lorentzInvariants : h.upYukawaSpan ≤ repLorentz.invariants := + iSup_le fun f => iSup_le fun f' => (Submodule.span_singleton_le_iff_mem _ _).2 + ((Representation.mem_invariants _ _).2 (h.repLorentz_upYukawa f f')) + +/-- The charged-lepton Yukawa span sits at mass weight eight in the Yukawa sector. -/ +lemma leptonYukawaSpan_le_sectorMassWeight : + h.leptonYukawaSpan ≤ h.sectorMassWeight {GeneratorClass.higgs, GeneratorClass.fermion} 8 := + iSup_le fun f => iSup_le fun f' => (Submodule.span_singleton_le_iff_mem _ _).2 + (h.leptonYukawa_mem_sectorMassWeight f f') + +/-- The charged-lepton Yukawa span is a space of gauge invariants. -/ +lemma leptonYukawaSpan_le_invariants : h.leptonYukawaSpan ≤ repGauge.invariants := + iSup_le fun f => iSup_le fun f' => (Submodule.span_singleton_le_iff_mem _ _).2 + ((Representation.mem_invariants _ _).2 (h.repGauge_leptonYukawa f f')) + +/-- The charged-lepton Yukawa span is a space of Lorentz invariants. -/ +lemma leptonYukawaSpan_le_lorentzInvariants : h.leptonYukawaSpan ≤ repLorentz.invariants := + iSup_le fun f => iSup_le fun f' => (Submodule.span_singleton_le_iff_mem _ _).2 + ((Representation.mem_invariants _ _).2 (h.repLorentz_leptonYukawa f f')) + +end IsCovStandardModel + +end StandardModel diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/Families/Symbols.lean b/Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/Families/Symbols.lean new file mode 100644 index 000000000..432f1811a --- /dev/null +++ b/Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/Families/Symbols.lean @@ -0,0 +1,796 @@ +/- +Copyright (c) 2026 Joseph Tooby-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.YukawaSector.Basic +public import Physlib.Particles.StandardModel.IsFermionSector.Components +public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition +public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU3FunAntiFun +public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU2AntiFundamental +public import Physlib.Relativity.LorentzGroup.Invariants.IsBiLeftWeyl +public import Physlib.Particles.StandardModel.Peeling +/-! +# The symbols of the Yukawa blocks + +## i. Overview + +At mass weight eight a Yukawa block is a product of three underived symbols, one Higgs and +two fermions, and every statement about such a block reduces to statements about its three +factors. This file is that reduction: it reads each of the twelve symbols at each factor of +a gauge transformation, does the algebra of a triple product with one inert factor once for +each position the inert factor can occupy, and records the closure of the index laws under +the sums and differences a contraction performs. + +Two things here are easy to get wrong and are settled once. A gauge transformation is a +triple and the three index laws each constrain one factor of it: colour, isospin and +Lorentz between them say nothing about hypercharge, so hypercharge is a fourth step and not +a corollary of the other three, and `forall_repGauge_eq_self`, in `StandardModel.Peeling` +with the rest of the shared framework, is what assembles the four into gauge invariance. +And the twelve blocks come in two fermion orderings, but the fermion +symbols anticommute, so the two orderings of a block span the same submodule and have the +same weight pieces: `mul_mul_piece_swap` is what makes the six transposed blocks a rewrite +rather than six fresh derivations. + +## ii. Key results + +- `repGauge_mul_fixed_left`, `repGauge_mul_fixed_mid`, `repGauge_mul_fixed_right`, + `repLorentz_mul_fixed_left` : the transformation of a triple product with one inert + factor. +- `repGauge_su3_*`, `repGauge_su2_*`, `repGauge_u1_*` : the three gauge laws of each of the + twelve symbols. +- `mul_mul_piece_swap` : the two fermion orderings of a block have the same weight pieces. + +## iii. Table of contents + +- A. Triple products with one inert factor +- B. The transformation laws of the symbols + - B.1. The Higgs symbols + - B.2. The down singlet + - B.3. The conjugate down singlet + - B.4. The up singlet + - B.5. The conjugate up singlet + - B.6. The quark doublet + - B.7. The conjugate quark doublet + - B.8. The lepton doublet + - B.9. The conjugate lepton doublet + - B.10. The lepton singlet + - B.11. The conjugate lepton singlet +- C. The symbols inside the derivative submodules +- D. The two fermion orderings + +-/ + +@[expose] public section + +namespace StandardModel + +open TensorProduct Matrix MatrixGroups Lorentz Pointwise ComplexConjugate + +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) + +/-! + +## A. Triple products with one inert factor + +Every block is a product of three symbols, and every classifier moves exactly two of them: +the third is inert, being a colour singlet, an isospin singlet or a Lorentz scalar. The +three lemmas here do the algebra once for each position the inert factor can occupy, and +reduce a transformation law for a block to the laws of its factors. + +-/ + +include h in +/-- A triple product whose first factor is fixed and whose second and third move by given + coefficients moves by the product of those coefficients. -/ +lemma repGauge_mul_fixed_left (g : GaugeGroupI) {ι κ : Type} [Fintype ι] [Fintype κ] + {A : B} {X : ι → B} {Y : κ → B} {x₀ : ι} {y₀ : κ} {cX : ι → ℂ} {cY : κ → ℂ} + (hA : repGauge g A = A) (hX : repGauge g (X x₀) = ∑ x, cX x • X x) + (hY : repGauge g (Y y₀) = ∑ y, cY y • Y y) : + repGauge g (A * (X x₀ * Y y₀)) = ∑ x, ∑ y, (cX x * cY y) • (A * (X x * Y y)) := by + rw [h.isHiggsSector.rep_mul, h.isHiggsSector.rep_mul, hA, hX, hY] + simp only [Finset.sum_mul, Finset.mul_sum, Finset.smul_sum, smul_mul_assoc, + mul_smul_comm, smul_smul] + rw [Finset.sum_comm] + exact Finset.sum_congr rfl fun x _ => Finset.sum_congr rfl fun y _ => by rw [mul_comm] + +include h in +/-- A triple product whose second factor is fixed. -/ +lemma repGauge_mul_fixed_mid (g : GaugeGroupI) {ι κ : Type} [Fintype ι] [Fintype κ] + {A : ι → B} {X : B} {Y : κ → B} {a₀ : ι} {y₀ : κ} {cA : ι → ℂ} {cY : κ → ℂ} + (hA : repGauge g (A a₀) = ∑ a, cA a • A a) (hX : repGauge g X = X) + (hY : repGauge g (Y y₀) = ∑ y, cY y • Y y) : + repGauge g (A a₀ * (X * Y y₀)) = ∑ a, ∑ y, (cA a * cY y) • (A a * (X * Y y)) := by + rw [h.isHiggsSector.rep_mul, h.isHiggsSector.rep_mul, hA, hX, hY] + simp only [Finset.sum_mul, Finset.mul_sum, Finset.smul_sum, smul_mul_assoc, + mul_smul_comm, smul_smul] + rw [Finset.sum_comm] + exact Finset.sum_congr rfl fun x _ => Finset.sum_congr rfl fun y _ => by rw [mul_comm] + +include h in +/-- A triple product whose third factor is fixed. -/ +lemma repGauge_mul_fixed_right (g : GaugeGroupI) {ι κ : Type} [Fintype ι] [Fintype κ] + {A : ι → B} {X : κ → B} {Y : B} {a₀ : ι} {x₀ : κ} {cA : ι → ℂ} {cX : κ → ℂ} + (hA : repGauge g (A a₀) = ∑ a, cA a • A a) + (hX : repGauge g (X x₀) = ∑ x, cX x • X x) (hY : repGauge g Y = Y) : + repGauge g (A a₀ * (X x₀ * Y)) = ∑ a, ∑ x, (cA a * cX x) • (A a * (X x * Y)) := by + rw [h.isHiggsSector.rep_mul, h.isHiggsSector.rep_mul, hA, hX, hY] + simp only [Finset.sum_mul, Finset.mul_sum, Finset.smul_sum, smul_mul_assoc, + mul_smul_comm, smul_smul] + rw [Finset.sum_comm] + exact Finset.sum_congr rfl fun x _ => Finset.sum_congr rfl fun y _ => by rw [mul_comm] + +include h in +/-- The Lorentz analogue of `repGauge_mul_fixed_left`, the Higgs factor being inert. -/ +lemma repLorentz_mul_fixed_left (Λ : SL(2,ℂ)) {ι κ : Type} [Fintype ι] [Fintype κ] + {A : B} {X : ι → B} {Y : κ → B} {x₀ : ι} {y₀ : κ} {cX : ι → ℂ} {cY : κ → ℂ} + (hA : repLorentz Λ A = A) (hX : repLorentz Λ (X x₀) = ∑ x, cX x • X x) + (hY : repLorentz Λ (Y y₀) = ∑ y, cY y • Y y) : + repLorentz Λ (A * (X x₀ * Y y₀)) = ∑ x, ∑ y, (cX x * cY y) • (A * (X x * Y y)) := by + rw [h.isHiggsSector.repLorentz_mul, h.isHiggsSector.repLorentz_mul, hA, hX, hY] + simp only [Finset.sum_mul, Finset.mul_sum, Finset.smul_sum, smul_mul_assoc, + mul_smul_comm, smul_smul] + rw [Finset.sum_comm] + exact Finset.sum_congr rfl fun x _ => Finset.sum_congr rfl fun y _ => by rw [mul_comm] + +/-! + +## B. The transformation laws of the symbols + +Each symbol is read at the three factors of a gauge transformation in turn, and the Higgs +symbols also at the Lorentz group. Colour moves only a colour index, isospin only an +isospin index, and hypercharge is an overall scalar, the power of which is the `6Y` of the +species: `-3` for the Higgs symbols, `2` for the down singlet, `1` for the conjugate quark +doublet, `4` for the conjugate up singlet, `-1` for the quark doublet, `-3` for the +conjugate lepton doublet and `6` for the lepton singlet. A symbol carrying no index of a +given factor is fixed by it outright. + +-/ + +/-! + +### B.1. The Higgs symbols + +-/ + +/-- A colour transformation fixes a Higgs symbol. -/ +lemma repGauge_su3_higgs (U : specialUnitaryGroup (Fin 3) ℂ) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (i : Fin 2) : + repGauge ((U, 1, 1) : GaugeGroupI) (h.isHiggsSector.higgs l i) + = h.isHiggsSector.higgs l i := by + rw [h.isHiggsSector.rep_higgsComponent] + simp [Matrix.one_apply] + +/-- An isospin transformation moves the isospin index of a Higgs symbol by the conjugate + matrix, the index being anti-fundamental. -/ +lemma repGauge_su2_higgs (V : specialUnitaryGroup (Fin 2) ℂ) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (i : Fin 2) : + repGauge ((1, V, 1) : GaugeGroupI) (h.isHiggsSector.higgs l i) + = ∑ a, conj (V.1 a i) • h.isHiggsSector.higgs l a := by + rw [h.isHiggsSector.rep_higgsComponent] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [inv_su2Elt, toSU2_su2Elt, toU1_su2Elt, su2_inv_apply] + simp + +/-- A hypercharge transformation scales a Higgs symbol by the cube of the conjugate + scalar, the Higgs carrying `6Y = -3`. -/ +lemma repGauge_u1_higgs (t : unitary ℂ) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (i : Fin 2) : + repGauge ((1, 1, t) : GaugeGroupI) (h.isHiggsSector.higgs l i) + = (star (t : ℂ)) ^ 3 • h.isHiggsSector.higgs l i := by + rw [h.isHiggsSector.rep_higgsComponent] + simp [Matrix.one_apply, unitary_inv_coe] + +/-- A colour transformation fixes a conjugate Higgs symbol. -/ +lemma repGauge_su3_barHiggs (U : specialUnitaryGroup (Fin 3) ℂ) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (i : Fin 2) : + repGauge ((U, 1, 1) : GaugeGroupI) (h.isHiggsSector.barHiggs l i) + = h.isHiggsSector.barHiggs l i := by + rw [h.isHiggsSector.rep_barHiggsComponent] + simp [Matrix.one_apply] + +/-- An isospin transformation moves the isospin index of a conjugate Higgs symbol by the + matrix itself, the index being fundamental. -/ +lemma repGauge_su2_barHiggs (V : specialUnitaryGroup (Fin 2) ℂ) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (i : Fin 2) : + repGauge ((1, V, 1) : GaugeGroupI) (h.isHiggsSector.barHiggs l i) + = ∑ a, V.1 a i • h.isHiggsSector.barHiggs l a := by + rw [h.isHiggsSector.rep_barHiggsComponent] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [inv_su2Elt, toSU2_su2Elt, toU1_su2Elt, su2_inv_apply] + simp + +/-- A hypercharge transformation scales a conjugate Higgs symbol by the cube of the + scalar, the conjugate Higgs carrying `6Y = 3`. -/ +lemma repGauge_u1_barHiggs (t : unitary ℂ) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (i : Fin 2) : + repGauge ((1, 1, t) : GaugeGroupI) (h.isHiggsSector.barHiggs l i) + = (t : ℂ) ^ 3 • h.isHiggsSector.barHiggs l i := by + rw [h.isHiggsSector.rep_barHiggsComponent] + simp [Matrix.one_apply, unitary_inv_coe, apply_ite (starRingEnd ℂ)] + +/-- A Higgs symbol carrying no derivatives is Lorentz invariant. -/ +lemma repLorentz_higgs_zero (Λ : SL(2,ℂ)) (l : Fin 0 → Fin 1 ⊕ Fin 3) (i : Fin 2) : + repLorentz Λ (h.isHiggsSector.higgs l i) = h.isHiggsSector.higgs l i := by + rw [h.isHiggsSector.repLorentz_higgs, IsFermionSector.univ_derivIndex_zero l, + Finset.sum_singleton] + simp + +/-- A conjugate Higgs symbol carrying no derivatives is Lorentz invariant. -/ +lemma repLorentz_barHiggs_zero (Λ : SL(2,ℂ)) (l : Fin 0 → Fin 1 ⊕ Fin 3) (i : Fin 2) : + repLorentz Λ (h.isHiggsSector.barHiggs l i) = h.isHiggsSector.barHiggs l i := by + rw [h.isHiggsSector.repLorentz_barHiggs, IsFermionSector.univ_derivIndex_zero l, + Finset.sum_singleton] + simp + +/-! + +### B.2. The down singlet + +-/ + +/-- A colour transformation moves the colour index of a down-singlet symbol by the + conjugate matrix, the index being anti-fundamental. -/ +lemma repGauge_su3_d (U : specialUnitaryGroup (Fin 3) ℂ) (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (s : Fin 2) (c : Fin 3) : + repGauge ((U, 1, 1) : GaugeGroupI) (h.isFermionSector.dComponent f l (s, c)) + = ∑ a, conj (U.1 a c) • h.isFermionSector.dComponent f l (s, a) := by + rw [h.isFermionSector.rep_dComponent] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [inv_su3Elt, toSU3_su3Elt, toU1_su3Elt, su3_inv_apply] + simp + +/-- An isospin transformation fixes a down-singlet symbol, which carries no isospin. -/ +lemma repGauge_su2_d (V : specialUnitaryGroup (Fin 2) ℂ) (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (j : Fin 2 × Fin 3) : + repGauge ((1, V, 1) : GaugeGroupI) (h.isFermionSector.dComponent f l j) + = h.isFermionSector.dComponent f l j := by + rw [h.isFermionSector.rep_dComponent] + simp [Matrix.one_apply] + +/-- A hypercharge transformation scales a down-singlet symbol by the square of the scalar, + the down singlet carrying `6Y = 2`. -/ +lemma repGauge_u1_d (t : unitary ℂ) (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (j : Fin 2 × Fin 3) : + repGauge ((1, 1, t) : GaugeGroupI) (h.isFermionSector.dComponent f l j) + = (t : ℂ) ^ 2 • h.isFermionSector.dComponent f l j := by + rw [h.isFermionSector.rep_dComponent] + simp [Matrix.one_apply, unitary_inv_coe] + +/-! + +### B.3. The conjugate down singlet + +-/ + +/-- A colour transformation moves the colour index of a conjugate down-singlet symbol by + the matrix itself, the index being fundamental. -/ +lemma repGauge_su3_bard (U : specialUnitaryGroup (Fin 3) ℂ) (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (s : Fin 2) (c : Fin 3) : + repGauge ((U, 1, 1) : GaugeGroupI) (h.isFermionSector.bardComponent f l (s, c)) + = ∑ a, U.1 a c • h.isFermionSector.bardComponent f l (s, a) := by + rw [h.isFermionSector.rep_bardComponent] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [inv_su3Elt, toSU3_su3Elt, toU1_su3Elt, su3_inv_apply] + simp + +/-- An isospin transformation fixes a conjugate down-singlet symbol. -/ +lemma repGauge_su2_bard (V : specialUnitaryGroup (Fin 2) ℂ) (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (j : Fin 2 × Fin 3) : + repGauge ((1, V, 1) : GaugeGroupI) (h.isFermionSector.bardComponent f l j) + = h.isFermionSector.bardComponent f l j := by + rw [h.isFermionSector.rep_bardComponent] + simp [Matrix.one_apply] + +/-- A hypercharge transformation scales a conjugate down-singlet symbol by the square of + the conjugate scalar, the conjugate down singlet carrying `6Y = -2`. -/ +lemma repGauge_u1_bard (t : unitary ℂ) (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (j : Fin 2 × Fin 3) : + repGauge ((1, 1, t) : GaugeGroupI) (h.isFermionSector.bardComponent f l j) + = (star (t : ℂ)) ^ 2 • h.isFermionSector.bardComponent f l j := by + rw [h.isFermionSector.rep_bardComponent] + simp [Matrix.one_apply, unitary_inv_coe, apply_ite (starRingEnd ℂ)] + +/-! + +### B.4. The up singlet + +-/ + +/-- A colour transformation moves the colour index of an up-singlet symbol by the + conjugate matrix, the index being anti-fundamental. -/ +lemma repGauge_su3_u (U : specialUnitaryGroup (Fin 3) ℂ) (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (s : Fin 2) (c : Fin 3) : + repGauge ((U, 1, 1) : GaugeGroupI) (h.isFermionSector.uComponent f l (s, c)) + = ∑ a, conj (U.1 a c) • h.isFermionSector.uComponent f l (s, a) := by + rw [h.isFermionSector.rep_uComponent] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [inv_su3Elt, toSU3_su3Elt, toU1_su3Elt, su3_inv_apply] + simp + +/-- An isospin transformation fixes an up-singlet symbol. -/ +lemma repGauge_su2_u (V : specialUnitaryGroup (Fin 2) ℂ) (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (j : Fin 2 × Fin 3) : + repGauge ((1, V, 1) : GaugeGroupI) (h.isFermionSector.uComponent f l j) + = h.isFermionSector.uComponent f l j := by + rw [h.isFermionSector.rep_uComponent] + simp [Matrix.one_apply] + +/-- A hypercharge transformation scales an up-singlet symbol by the fourth power of the + conjugate scalar, the up singlet carrying `6Y = -4`. -/ +lemma repGauge_u1_u (t : unitary ℂ) (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (j : Fin 2 × Fin 3) : + repGauge ((1, 1, t) : GaugeGroupI) (h.isFermionSector.uComponent f l j) + = (star (t : ℂ)) ^ 4 • h.isFermionSector.uComponent f l j := by + rw [h.isFermionSector.rep_uComponent] + simp [Matrix.one_apply, unitary_inv_coe] + +/-! + +### B.5. The conjugate up singlet + +-/ + +/-- A colour transformation moves the colour index of a conjugate up-singlet symbol by the + matrix itself, the index being fundamental. -/ +lemma repGauge_su3_baru (U : specialUnitaryGroup (Fin 3) ℂ) (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (s : Fin 2) (c : Fin 3) : + repGauge ((U, 1, 1) : GaugeGroupI) (h.isFermionSector.baruComponent f l (s, c)) + = ∑ a, U.1 a c • h.isFermionSector.baruComponent f l (s, a) := by + rw [h.isFermionSector.rep_baruComponent] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [inv_su3Elt, toSU3_su3Elt, toU1_su3Elt, su3_inv_apply] + simp + +/-- An isospin transformation fixes a conjugate up-singlet symbol. -/ +lemma repGauge_su2_baru (V : specialUnitaryGroup (Fin 2) ℂ) (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (j : Fin 2 × Fin 3) : + repGauge ((1, V, 1) : GaugeGroupI) (h.isFermionSector.baruComponent f l j) + = h.isFermionSector.baruComponent f l j := by + rw [h.isFermionSector.rep_baruComponent] + simp [Matrix.one_apply] + +/-- A hypercharge transformation scales a conjugate up-singlet symbol by the fourth power + of the scalar, the conjugate up singlet carrying `6Y = 4`. -/ +lemma repGauge_u1_baru (t : unitary ℂ) (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (j : Fin 2 × Fin 3) : + repGauge ((1, 1, t) : GaugeGroupI) (h.isFermionSector.baruComponent f l j) + = (t : ℂ) ^ 4 • h.isFermionSector.baruComponent f l j := by + rw [h.isFermionSector.rep_baruComponent] + simp [Matrix.one_apply, unitary_inv_coe, apply_ite (starRingEnd ℂ)] + +/-! + +### B.6. The quark doublet + +-/ + +/-- A colour transformation moves the colour index of a quark-doublet symbol by the + conjugate matrix, the index being anti-fundamental. -/ +lemma repGauge_su3_Q (U : specialUnitaryGroup (Fin 3) ℂ) (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (s : Fin 2) (c : Fin 3) (w : Fin 2) : + repGauge ((U, 1, 1) : GaugeGroupI) (h.isFermionSector.QComponent f l (s, c, w)) + = ∑ a, conj (U.1 a c) • h.isFermionSector.QComponent f l (s, a, w) := by + rw [h.isFermionSector.rep_QComponent] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [Fin.sum_univ_two, inv_su3Elt, toSU3_su3Elt, toU1_su3Elt, toSU2_su3Elt] + fin_cases w <;> simp [su3_inv_apply] + +/-- An isospin transformation moves the isospin index of a quark-doublet symbol by the + conjugate matrix, the index being anti-fundamental. -/ +lemma repGauge_su2_Q (V : specialUnitaryGroup (Fin 2) ℂ) (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (s : Fin 2) (c : Fin 3) (w : Fin 2) : + repGauge ((1, V, 1) : GaugeGroupI) (h.isFermionSector.QComponent f l (s, c, w)) + = ∑ a, conj (V.1 a w) • h.isFermionSector.QComponent f l (s, c, a) := by + rw [h.isFermionSector.rep_QComponent, Finset.sum_comm] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [Fin.sum_univ_three, inv_su2Elt, toSU2_su2Elt, toU1_su2Elt, toSU3_su2Elt] + fin_cases c <;> simp [su2_inv_apply] + +/-- A hypercharge transformation scales a quark-doublet symbol by the conjugate scalar, + the quark doublet carrying `6Y = -1`. -/ +lemma repGauge_u1_Q (t : unitary ℂ) (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (s : Fin 2) (c : Fin 3) (w : Fin 2) : + repGauge ((1, 1, t) : GaugeGroupI) (h.isFermionSector.QComponent f l (s, c, w)) + = star (t : ℂ) • h.isFermionSector.QComponent f l (s, c, w) := by + rw [h.isFermionSector.rep_QComponent] + fin_cases w <;> simp [Matrix.one_apply, unitary_inv_coe] + +/-! + +### B.7. The conjugate quark doublet + +-/ + +/-- A colour transformation moves the colour index of a conjugate quark-doublet symbol by + the matrix itself, the index being fundamental. -/ +lemma repGauge_su3_barQ (U : specialUnitaryGroup (Fin 3) ℂ) (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (s : Fin 2) (c : Fin 3) (w : Fin 2) : + repGauge ((U, 1, 1) : GaugeGroupI) (h.isFermionSector.barQComponent f l (s, c, w)) + = ∑ a, U.1 a c • h.isFermionSector.barQComponent f l (s, a, w) := by + rw [h.isFermionSector.rep_barQComponent] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [Fin.sum_univ_two] + rw [inv_su3Elt, toSU3_su3Elt, toU1_su3Elt, toSU2_su3Elt] + fin_cases w <;> simp [su3_inv_apply] + +/-- An isospin transformation moves the isospin index of a conjugate quark-doublet symbol + by the matrix itself, the index being fundamental. -/ +lemma repGauge_su2_barQ (V : specialUnitaryGroup (Fin 2) ℂ) (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (s : Fin 2) (c : Fin 3) (w : Fin 2) : + repGauge ((1, V, 1) : GaugeGroupI) (h.isFermionSector.barQComponent f l (s, c, w)) + = ∑ a, V.1 a w • h.isFermionSector.barQComponent f l (s, c, a) := by + rw [h.isFermionSector.rep_barQComponent, Finset.sum_comm] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [Fin.sum_univ_three, inv_su2Elt, toSU2_su2Elt, toU1_su2Elt, toSU3_su2Elt] + fin_cases c <;> simp [su2_inv_apply] + +/-- A hypercharge transformation scales a conjugate quark-doublet symbol by the scalar, + the conjugate quark doublet carrying `6Y = 1`. -/ +lemma repGauge_u1_barQ (t : unitary ℂ) (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (s : Fin 2) (c : Fin 3) (w : Fin 2) : + repGauge ((1, 1, t) : GaugeGroupI) (h.isFermionSector.barQComponent f l (s, c, w)) + = (t : ℂ) • h.isFermionSector.barQComponent f l (s, c, w) := by + rw [h.isFermionSector.rep_barQComponent] + fin_cases w <;> + simp [Matrix.one_apply, unitary_inv_coe, apply_ite (starRingEnd ℂ)] + +/-! + +### B.8. The lepton doublet + +-/ + +/-- A colour transformation fixes a lepton-doublet symbol, which carries no colour. -/ +lemma repGauge_su3_L (U : specialUnitaryGroup (Fin 3) ℂ) (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (j : Fin 2 × Fin 2) : + repGauge ((U, 1, 1) : GaugeGroupI) (h.isFermionSector.LComponent f l j) + = h.isFermionSector.LComponent f l j := by + rw [h.isFermionSector.rep_LComponent] + simp [Matrix.one_apply] + +/-- An isospin transformation moves the isospin index of a lepton-doublet symbol by the + conjugate matrix, the index being anti-fundamental. -/ +lemma repGauge_su2_L (V : specialUnitaryGroup (Fin 2) ℂ) (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (s w : Fin 2) : + repGauge ((1, V, 1) : GaugeGroupI) (h.isFermionSector.LComponent f l (s, w)) + = ∑ a, conj (V.1 a w) • h.isFermionSector.LComponent f l (s, a) := by + rw [h.isFermionSector.rep_LComponent] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [inv_su2Elt, toSU2_su2Elt, toU1_su2Elt, su2_inv_apply] + simp + +/-- A hypercharge transformation scales a lepton-doublet symbol by the cube of the scalar, + the lepton doublet carrying `6Y = 3`. -/ +lemma repGauge_u1_L (t : unitary ℂ) (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (j : Fin 2 × Fin 2) : + repGauge ((1, 1, t) : GaugeGroupI) (h.isFermionSector.LComponent f l j) + = (t : ℂ) ^ 3 • h.isFermionSector.LComponent f l j := by + rw [h.isFermionSector.rep_LComponent] + simp [Matrix.one_apply, unitary_inv_coe] + +/-! + +### B.9. The conjugate lepton doublet + +-/ + +/-- A colour transformation fixes a conjugate lepton-doublet symbol, which carries no + colour. -/ +lemma repGauge_su3_barL (U : specialUnitaryGroup (Fin 3) ℂ) (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (j : Fin 2 × Fin 2) : + repGauge ((U, 1, 1) : GaugeGroupI) (h.isFermionSector.barLComponent f l j) + = h.isFermionSector.barLComponent f l j := by + rw [h.isFermionSector.rep_barLComponent] + simp [Matrix.one_apply] + +/-- An isospin transformation moves the isospin index of a conjugate lepton-doublet symbol + by the matrix itself, the index being fundamental. -/ +lemma repGauge_su2_barL (V : specialUnitaryGroup (Fin 2) ℂ) (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (s w : Fin 2) : + repGauge ((1, V, 1) : GaugeGroupI) (h.isFermionSector.barLComponent f l (s, w)) + = ∑ a, V.1 a w • h.isFermionSector.barLComponent f l (s, a) := by + rw [h.isFermionSector.rep_barLComponent] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [inv_su2Elt, toSU2_su2Elt, toU1_su2Elt, su2_inv_apply] + simp + +/-- A hypercharge transformation scales a conjugate lepton-doublet symbol by the cube of + the conjugate scalar, the conjugate lepton doublet carrying `6Y = -3`. -/ +lemma repGauge_u1_barL (t : unitary ℂ) (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (s w : Fin 2) : + repGauge ((1, 1, t) : GaugeGroupI) (h.isFermionSector.barLComponent f l (s, w)) + = (star (t : ℂ)) ^ 3 • h.isFermionSector.barLComponent f l (s, w) := by + rw [h.isFermionSector.rep_barLComponent] + fin_cases w <;> + simp [Matrix.one_apply, unitary_inv_coe, apply_ite (starRingEnd ℂ)] + +/-! + +### B.10. The lepton singlet + +-/ + +/-- A colour transformation fixes a lepton-singlet symbol. -/ +lemma repGauge_su3_e (U : specialUnitaryGroup (Fin 3) ℂ) (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (s : Fin 2) : + repGauge ((U, 1, 1) : GaugeGroupI) (h.isFermionSector.eComponent f l s) + = h.isFermionSector.eComponent f l s := by + rw [h.isFermionSector.rep_eComponent] + simp + +/-- An isospin transformation fixes a lepton-singlet symbol. -/ +lemma repGauge_su2_e (V : specialUnitaryGroup (Fin 2) ℂ) (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (s : Fin 2) : + repGauge ((1, V, 1) : GaugeGroupI) (h.isFermionSector.eComponent f l s) + = h.isFermionSector.eComponent f l s := by + rw [h.isFermionSector.rep_eComponent] + simp + +/-- A hypercharge transformation scales a lepton-singlet symbol by the sixth power of the + scalar, the lepton singlet carrying `6Y = 6`. -/ +lemma repGauge_u1_e (t : unitary ℂ) (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (s : Fin 2) : + repGauge ((1, 1, t) : GaugeGroupI) (h.isFermionSector.eComponent f l s) + = (t : ℂ) ^ 6 • h.isFermionSector.eComponent f l s := by + rw [h.isFermionSector.rep_eComponent] + simp [unitary_inv_coe] + +/-! + +### B.11. The conjugate lepton singlet + +-/ + +/-- A colour transformation fixes a conjugate lepton-singlet symbol. -/ +lemma repGauge_su3_bare (U : specialUnitaryGroup (Fin 3) ℂ) (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (s : Fin 2) : + repGauge ((U, 1, 1) : GaugeGroupI) (h.isFermionSector.bareComponent f l s) + = h.isFermionSector.bareComponent f l s := by + rw [h.isFermionSector.rep_bareComponent] + simp + +/-- An isospin transformation fixes a conjugate lepton-singlet symbol. -/ +lemma repGauge_su2_bare (V : specialUnitaryGroup (Fin 2) ℂ) (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (s : Fin 2) : + repGauge ((1, V, 1) : GaugeGroupI) (h.isFermionSector.bareComponent f l s) + = h.isFermionSector.bareComponent f l s := by + rw [h.isFermionSector.rep_bareComponent] + simp + +/-- A hypercharge transformation scales a conjugate lepton-singlet symbol by the sixth + power of the conjugate scalar, the conjugate lepton singlet carrying `6Y = -6`. -/ +lemma repGauge_u1_bare (t : unitary ℂ) (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (s : Fin 2) : + repGauge ((1, 1, t) : GaugeGroupI) (h.isFermionSector.bareComponent f l s) + = (star (t : ℂ)) ^ 6 • h.isFermionSector.bareComponent f l s := by + rw [h.isFermionSector.rep_bareComponent] + simp [unitary_inv_coe] + +/-! + +## C. The symbols inside the derivative submodules + +A block is a product of three underived symbols, and by +`sectorMassWeight_higgs_fermion_eight` the sector at mass weight eight is the product of +the Higgs derivative submodule with two copies of the fermion one. So a block sits at mass +weight eight as soon as each of its three symbols is seen inside the matching derivative +submodule. The ten ranges are recorded as inclusions rather than as memberships, since +section F needs the inclusion and the membership of a component follows from it. + +-/ + +/-- A Higgs symbol lies in the Higgs derivative submodule. -/ +lemma higgs_mem_derivSubmodule {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (i : Fin 2) : + h.isHiggsSector.higgs l i ∈ h.isHiggsSector.derivSubmodule n := + Submodule.mem_sup_left (Submodule.mem_iSup_of_mem l ⟨_, rfl⟩) + +/-- A conjugate Higgs symbol lies in the Higgs derivative submodule. -/ +lemma barHiggs_mem_derivSubmodule {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (i : Fin 2) : + h.isHiggsSector.barHiggs l i ∈ h.isHiggsSector.derivSubmodule n := + Submodule.mem_sup_right (Submodule.mem_iSup_of_mem l ⟨_, rfl⟩) + +/-- The range of a down-singlet symbol map lies in the fermion derivative submodule. -/ +lemma range_d_le_derivSubmodule (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : + LinearMap.range (d f l) ≤ h.isFermionSector.derivSubmodule n := + le_iSup₂_of_le f l (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left ( + le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left ( + le_sup_of_le_left (le_sup_of_le_left le_sup_left)))))))) + +/-- The range of a conjugate down-singlet symbol map lies in the fermion derivative submodule. -/ +lemma range_bard_le_derivSubmodule (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : + LinearMap.range (bard f l) ≤ h.isFermionSector.derivSubmodule n := + le_iSup₂_of_le f l (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left ( + le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left ( + le_sup_of_le_left (le_sup_of_le_left le_sup_right)))))))) + +/-- The range of an up-singlet symbol map lies in the fermion derivative submodule. -/ +lemma range_u_le_derivSubmodule (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : + LinearMap.range (u f l) ≤ h.isFermionSector.derivSubmodule n := + le_iSup₂_of_le f l (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left ( + le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left ( + le_sup_of_le_left le_sup_right))))))) + +/-- The range of a conjugate up-singlet symbol map lies in the fermion derivative submodule. -/ +lemma range_baru_le_derivSubmodule (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : + LinearMap.range (baru f l) ≤ h.isFermionSector.derivSubmodule n := + le_iSup₂_of_le f l (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left ( + le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left le_sup_right)))))) + +/-- The range of a quark-doublet symbol map lies in the fermion derivative submodule. -/ +lemma range_Q_le_derivSubmodule (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : + LinearMap.range (Q f l) ≤ h.isFermionSector.derivSubmodule n := + le_iSup₂_of_le f l (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left ( + le_sup_of_le_left (le_sup_of_le_left le_sup_right))))) + +/-- The range of a conjugate quark-doublet symbol map lies in the fermion derivative submodule. -/ +lemma range_barQ_le_derivSubmodule (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : + LinearMap.range (barQ f l) ≤ h.isFermionSector.derivSubmodule n := + le_iSup₂_of_le f l (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left ( + le_sup_of_le_left le_sup_right)))) + +/-- The range of a lepton-doublet symbol map lies in the fermion derivative submodule. -/ +lemma range_L_le_derivSubmodule (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : + LinearMap.range (L f l) ≤ h.isFermionSector.derivSubmodule n := + le_iSup₂_of_le f l (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left le_sup_right))) + +/-- The range of a conjugate lepton-doublet symbol map lies in the fermion derivative submodule. -/ +lemma range_barL_le_derivSubmodule (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : + LinearMap.range (barL f l) ≤ h.isFermionSector.derivSubmodule n := + le_iSup₂_of_le f l (le_sup_of_le_left (le_sup_of_le_left le_sup_right)) + +/-- The range of a lepton-singlet symbol map lies in the fermion derivative submodule. -/ +lemma range_e_le_derivSubmodule (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : + LinearMap.range (e f l) ≤ h.isFermionSector.derivSubmodule n := + le_iSup₂_of_le f l (le_sup_of_le_left le_sup_right) + +/-- The range of a conjugate lepton-singlet symbol map lies in the fermion derivative submodule. -/ +lemma range_bare_le_derivSubmodule (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : + LinearMap.range (bare f l) ≤ h.isFermionSector.derivSubmodule n := + le_iSup₂_of_le f l le_sup_right + +/-- A `d` component lies in the fermion derivative submodule. -/ +lemma dComponent_mem_derivSubmodule (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (j : Fin 2 × Fin 3) : + h.isFermionSector.dComponent f l j ∈ h.isFermionSector.derivSubmodule n := + h.range_d_le_derivSubmodule f l ⟨_, rfl⟩ + +/-- A `bard` component lies in the fermion derivative submodule. -/ +lemma bardComponent_mem_derivSubmodule (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (j : Fin 2 × Fin 3) : + h.isFermionSector.bardComponent f l j ∈ h.isFermionSector.derivSubmodule n := + h.range_bard_le_derivSubmodule f l ⟨_, rfl⟩ + +/-- A `u` component lies in the fermion derivative submodule. -/ +lemma uComponent_mem_derivSubmodule (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (j : Fin 2 × Fin 3) : + h.isFermionSector.uComponent f l j ∈ h.isFermionSector.derivSubmodule n := + h.range_u_le_derivSubmodule f l ⟨_, rfl⟩ + +/-- A `baru` component lies in the fermion derivative submodule. -/ +lemma baruComponent_mem_derivSubmodule (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (j : Fin 2 × Fin 3) : + h.isFermionSector.baruComponent f l j ∈ h.isFermionSector.derivSubmodule n := + h.range_baru_le_derivSubmodule f l ⟨_, rfl⟩ + +/-- A `Q` component lies in the fermion derivative submodule. -/ +lemma QComponent_mem_derivSubmodule (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (j : Fin 2 × Fin 3 × Fin 2) : + h.isFermionSector.QComponent f l j ∈ h.isFermionSector.derivSubmodule n := + h.range_Q_le_derivSubmodule f l ⟨_, rfl⟩ + +/-- A `barQ` component lies in the fermion derivative submodule. -/ +lemma barQComponent_mem_derivSubmodule (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (j : Fin 2 × Fin 3 × Fin 2) : + h.isFermionSector.barQComponent f l j ∈ h.isFermionSector.derivSubmodule n := + h.range_barQ_le_derivSubmodule f l ⟨_, rfl⟩ + +/-- A `L` component lies in the fermion derivative submodule. -/ +lemma LComponent_mem_derivSubmodule (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (j : Fin 2 × Fin 2) : + h.isFermionSector.LComponent f l j ∈ h.isFermionSector.derivSubmodule n := + h.range_L_le_derivSubmodule f l ⟨_, rfl⟩ + +/-- A `barL` component lies in the fermion derivative submodule. -/ +lemma barLComponent_mem_derivSubmodule (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (j : Fin 2 × Fin 2) : + h.isFermionSector.barLComponent f l j ∈ h.isFermionSector.derivSubmodule n := + h.range_barL_le_derivSubmodule f l ⟨_, rfl⟩ + +/-- A `e` component lies in the fermion derivative submodule. -/ +lemma eComponent_mem_derivSubmodule (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (j : Fin 2) : + h.isFermionSector.eComponent f l j ∈ h.isFermionSector.derivSubmodule n := + h.range_e_le_derivSubmodule f l ⟨_, rfl⟩ + +/-- A `bare` component lies in the fermion derivative submodule. -/ +lemma bareComponent_mem_derivSubmodule (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (j : Fin 2) : + h.isFermionSector.bareComponent f l j ∈ h.isFermionSector.derivSubmodule n := + h.range_bare_le_derivSubmodule f l ⟨_, rfl⟩ + +/-! + +## D. The two fermion orderings + +The twelve blocks of the mass-weight-eight decomposition are six choices of a Higgs symbol +and a fermion pair, each occurring in both fermion orderings. The two orderings are not +the same element — the fermion symbols anticommute, so one is minus the other — but they +span the same submodule, and therefore have the same weight pieces. So a classification of +one ordering is a classification of the other, and the six transposed blocks need no +argument of their own. + +-/ + +/-- Two submodules of fermion derivative submodules commute, the fermion symbols + anticommuting and a submodule being closed under negation. -/ +lemma mul_comm_of_le_derivSubmodule {n m : ℕ} {V W : Submodule ℂ B} + (hV : V ≤ h.isFermionSector.derivSubmodule n) + (hW : W ≤ h.isFermionSector.derivSubmodule m) : V * W = W * V := by + refine le_antisymm ?_ ?_ <;> rw [Submodule.mul_le] <;> intro x hx y hy + · rw [h.isFermionSector.anticomm_of_mem_derivSubmodule (hV hx) (hW hy)] + exact Submodule.neg_mem _ (Submodule.mul_mem_mul hy hx) + · rw [h.isFermionSector.anticomm_of_mem_derivSubmodule (hW hx) (hV hy)] + exact Submodule.neg_mem _ (Submodule.mul_mem_mul hy hx) + +/-- Swapping the two fermion factors of a block leaves every weight piece unchanged: the + two fermion factors commute as submodules, so the two orderings of the block are the same + submodule. This is what makes the six transposed blocks of the mass-weight-eight + decomposition a rewrite rather than six fresh classifications. -/ +lemma mul_mul_piece_swap {VH VX VY : Submodule ℂ B} {n m : ℕ} + (dH : GaugeWeightDecomposition repGauge VH) + (dX : GaugeWeightDecomposition repGauge VX) + (dY : GaugeWeightDecomposition repGauge VY) + (hX : VX ≤ h.isFermionSector.derivSubmodule n) + (hY : VY ≤ h.isFermionSector.derivSubmodule m) (w : GaugeWeight) : + (GaugeWeightDecomposition.mul (d := dH) + (d' := GaugeWeightDecomposition.mul (d := dX) (d' := dY))).piece w + = (GaugeWeightDecomposition.mul (d := dH) + (d' := GaugeWeightDecomposition.mul (d := dY) (d' := dX))).piece w := + GaugeWeightDecomposition.piece_congr + (d := GaugeWeightDecomposition.mul (d := dH) + (d' := GaugeWeightDecomposition.mul (d := dX) (d' := dY))) + (d' := GaugeWeightDecomposition.mul (d := dH) + (d' := GaugeWeightDecomposition.mul (d := dY) (d' := dX))) + (by rw [h.mul_comm_of_le_derivSubmodule hX hY]) w + +/-- Swapping the two fermion factors of a block negates it. -/ +lemma mul_mul_swap_eq_neg {n m : ℕ} (a : B) {x y : B} + (hx : x ∈ h.isFermionSector.derivSubmodule n) + (hy : y ∈ h.isFermionSector.derivSubmodule m) : + a * (y * x) = -(a * (x * y)) := by + rw [h.isFermionSector.anticomm_of_mem_derivSubmodule hy hx, mul_neg] + +end IsCovStandardModel + +end StandardModel diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/GaugeWeightDecomposition.lean b/Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/GaugeWeightDecomposition.lean new file mode 100644 index 000000000..5d61f3fda --- /dev/null +++ b/Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/GaugeWeightDecomposition.lean @@ -0,0 +1,799 @@ +/- +Copyright (c) 2026 Joseph Tooby-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.YukawaSector.Basic +public import Physlib.Particles.StandardModel.IsFermionSector.MassWeight.GaugeWeightDecomposition +public import Physlib.Particles.StandardModel.IsHiggsSector.DerivSubmodule.GaugeWeightDecomposition +/-! +# The gauge weight decomposition of the Yukawa sector at mass weight eight + +Mass weight eight is where the Yukawa sector first has anything to say: by +`sectorMassWeight_higgs_fermion_eight` the whole sector at that weight is one Higgs +tower against two underived fermion towers, the weight of `H ψ ψ` itself. Transporting +the gauge weight decompositions of the two sectors along that identification decomposes +the sector, and the question of which Yukawa couplings can exist becomes the question of +which pieces survive at gauge weight zero. + +Almost none of them do, and the reason is hypercharge alone. Writing `6Y` for the +normalisation used throughout, a symbol carries the contragredient of its value space and +so the negative of its charge: the Higgs symbols carry `-3` and their conjugates `+3`, +while the ten fermion species carry + +`d = 2`, `bard = -2`, `u = -4`, `baru = 4`, `Q = -1`, `barQ = 1`, `L = 3`, `barL = -3`, +`e = 6`, `bare = -6`. + +A block of the decomposition is a choice of one Higgs symbol and two fermion species, and +it can reach gauge weight zero only if the three charges sum to zero. Against the Higgs +that asks the fermion pair to sum to `+3`, which happens only for `{d, barQ}`, +`{baru, Q}` and `{barL, e}`; against the conjugate Higgs it asks for `-3`, which happens +only for `{bard, Q}`, `{u, barQ}` and `{L, bare}`. No species pairs with itself, since +`2f = ±3` has no solution. Each of the six pairs occurs in both orders inside the product +of the two fermion towers, so of the `2 * 10 * 10 = 200` blocks exactly twelve survive and +one hundred and eighty-eight are `⊥`. + +That is the whole content of this file: the surviving twelve are the Yukawa couplings +`H d barQ`, `H baru Q`, `H barL e`, `barH bard Q`, `barH u barQ`, `barH L bare` and their +transposes. The colour and isospin structure eliminates nothing further here — it only +decides which components inside a surviving block pair up, which is a later question. + +- A. The sector at mass weight eight, decomposed +- B. Splitting a Higgs-fermion-fermion product along its joins +- C. Hypercharge adds across a product +- D. The two Higgs hypercharges +- E. The hypercharge sieve on two fermions against one Higgs +- F. The twelve surviving blocks +- G. Invariants modulo a gauge-stable submodule + +-/ + +@[expose] public section + +namespace StandardModel + +open TensorProduct Matrix MatrixGroups Lorentz Pointwise + +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) + +/-! + +## A. The sector at mass weight eight, decomposed + +-/ + +/-- The gauge weight decomposition of the Yukawa sector at mass weight eight, transported + along `sectorMassWeight_higgs_fermion_eight` from the product of the Higgs derivative + submodule with two copies of the underived fermion towers. -/ +@[implicit_reducible] +noncomputable def sectorMassWeightEightGaugeWeight : + GaugeWeightDecomposition repGauge + (h.sectorMassWeight {GeneratorClass.higgs, GeneratorClass.fermion} 8) := + GaugeWeightDecomposition.copy + (GaugeWeightDecomposition.mul (d := h.isHiggsSector.derivSubmoduleGaugeWeight 0) + (d' := GaugeWeightDecomposition.mul + (d := h.isFermionSector.derivSubmoduleGaugeWeight 0) + (d' := h.isFermionSector.derivSubmoduleGaugeWeight 0))) + _ h.sectorMassWeight_higgs_fermion_eight + +/-! + +## B. Splitting a Higgs-fermion-fermion product along its joins + +The two fermion factors are each a join over ten species, so the product has to be +distributed over both before any species-level statement can be made. The left factor is +handled by `IsFermionSector.piece_sup_mul`; the two lemmas here reach the inner factors of +a triple product, which that lemma cannot see. + +-/ + +/-- If the first fermion factor of a triple product is a join `VA ⊔ VB`, its weight-`w` + piece splits along the join. -/ +lemma piece_mul_sup_mul {VX VA VB VZ : Submodule ℂ B} + (dX : GaugeWeightDecomposition repGauge VX) (dA : GaugeWeightDecomposition repGauge VA) + (dB : GaugeWeightDecomposition repGauge VB) (dZ : GaugeWeightDecomposition repGauge VZ) + (w : GaugeWeight) : + (GaugeWeightDecomposition.mul (d := dX) + (d' := GaugeWeightDecomposition.mul + (d := GaugeWeightDecomposition.sup (d := dA) (d' := dB)) (d' := dZ))).piece w + = (GaugeWeightDecomposition.mul (d := dX) + (d' := GaugeWeightDecomposition.mul (d := dA) (d' := dZ))).piece w + ⊔ (GaugeWeightDecomposition.mul (d := dX) + (d' := GaugeWeightDecomposition.mul (d := dB) (d' := dZ))).piece w := + GaugeWeightDecomposition.piece_congr + (d := GaugeWeightDecomposition.mul (d := dX) + (d' := GaugeWeightDecomposition.mul + (d := GaugeWeightDecomposition.sup (d := dA) (d' := dB)) (d' := dZ))) + (d' := GaugeWeightDecomposition.sup + (d := GaugeWeightDecomposition.mul (d := dX) + (d' := GaugeWeightDecomposition.mul (d := dA) (d' := dZ))) + (d' := GaugeWeightDecomposition.mul (d := dX) + (d' := GaugeWeightDecomposition.mul (d := dB) (d' := dZ)))) + (by rw [Submodule.sup_mul, Submodule.mul_sup]) w + +/-- If the second fermion factor of a triple product is a join `VA ⊔ VB`, its weight-`w` + piece splits along the join. -/ +lemma piece_mul_mul_sup {VX VY VA VB : Submodule ℂ B} + (dX : GaugeWeightDecomposition repGauge VX) (dY : GaugeWeightDecomposition repGauge VY) + (dA : GaugeWeightDecomposition repGauge VA) (dB : GaugeWeightDecomposition repGauge VB) + (w : GaugeWeight) : + (GaugeWeightDecomposition.mul (d := dX) + (d' := GaugeWeightDecomposition.mul (d := dY) + (d' := GaugeWeightDecomposition.sup (d := dA) (d' := dB)))).piece w + = (GaugeWeightDecomposition.mul (d := dX) + (d' := GaugeWeightDecomposition.mul (d := dY) (d' := dA))).piece w + ⊔ (GaugeWeightDecomposition.mul (d := dX) + (d' := GaugeWeightDecomposition.mul (d := dY) (d' := dB))).piece w := + GaugeWeightDecomposition.piece_congr + (d := GaugeWeightDecomposition.mul (d := dX) + (d' := GaugeWeightDecomposition.mul (d := dY) + (d' := GaugeWeightDecomposition.sup (d := dA) (d' := dB)))) + (d' := GaugeWeightDecomposition.sup + (d := GaugeWeightDecomposition.mul (d := dX) + (d' := GaugeWeightDecomposition.mul (d := dY) (d' := dA))) + (d' := GaugeWeightDecomposition.mul (d := dX) + (d' := GaugeWeightDecomposition.mul (d := dY) (d' := dB)))) + (by rw [Submodule.mul_sup, Submodule.mul_sup]) w + +/-! + +## C. Hypercharge adds across a product + +`IsFermionSector.mul_piece_zero_eq_bot_of_hypercharge` kills a product of two +decompositions whose constant hypercharges do not cancel. To use it on a triple product +the two fermion factors have to be read as a single decomposition, and the only thing +needed about them is that their hypercharges add. + +-/ + +/-- Two decompositions with constant hypercharge have a product of constant hypercharge, + the sum of the two: the support of a product is the pointwise sum of the supports, and + hypercharge is the fourth coordinate of a gauge weight. -/ +lemma mul_supp_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') : + ∀ w ∈ (GaugeWeightDecomposition.mul (d := dV) (d' := dV')).supp, w.2.2.2 = hc + hc' := by + intro w hw + have hw' : w ∈ dV.supp + dV'.supp := hw + obtain ⟨w₁, hw₁, w₂, hw₂, rfl⟩ := Finset.mem_add.mp hw' + show w₁.2.2.2 + w₂.2.2.2 = hc + hc' + rw [hV w₁ hw₁, hV' w₂ hw₂] + +/-! + +## D. The two Higgs hypercharges + +-/ + +/-- The Higgs symbols carry hypercharge `-3`, independent of isospin and of the number of + derivatives: the two weights in the support are `(0, 0, ∓1, -3)`. -/ +lemma higgsSubmoduleGaugeWeight_hc (n : ℕ) : + ∀ w ∈ (h.isHiggsSector.higgsSubmoduleGaugeWeight n).supp, w.2.2.2 = -3 := by + intro w hw + have hw' : w ∈ ({((0, 0, -1, -3) : GaugeWeight), (0, 0, 1, -3)} : Finset GaugeWeight) := hw + fin_cases hw' <;> rfl + +/-- The conjugate-Higgs symbols carry hypercharge `3`, independent of isospin and of the + number of derivatives: the two weights in the support are `(0, 0, ±1, 3)`. -/ +lemma barHiggsSubmoduleGaugeWeight_hc (n : ℕ) : + ∀ w ∈ (h.isHiggsSector.barHiggsSubmoduleGaugeWeight n).supp, w.2.2.2 = 3 := by + intro w hw + have hw' : w ∈ ({((0, 0, 1, 3) : GaugeWeight), (0, 0, -1, 3)} : Finset GaugeWeight) := hw + fin_cases hw' <;> rfl + +/-! + +## E. The hypercharge sieve on two fermions against one Higgs + +Everything the Standard Model gauge group has to say about which Yukawa couplings exist is +already said by hypercharge. A block of the mass-weight-eight decomposition is a Higgs +symbol against a pair of fermion species, and the three hypercharges have to cancel. Since +the Higgs contributes `∓3`, the fermion pair must contribute `±3`, and the ten species +charges `2, -2, -4, 4, -1, 1, 3, -3, 6, -6` admit only three unordered pairs of each sign. + +The two lemmas below are stated for an arbitrary decomposition `dV` of constant hypercharge +rather than for the Higgs submodules themselves, since that is all the argument uses; the +Higgs and conjugate-Higgs cases are then two applications. No species pairs with itself: +`2f = ±3` has no integer solution. + +-/ + +open IsFermionSector in +/-- The hypercharge sieve against a Higgs symbol. If `dV` has constant hypercharge `-3`, + as the Higgs symbols do, then of the hundred species pairings in a product of two fermion + towers only the six whose hypercharges sum to `+3` survive at gauge weight zero: `d barQ`, + `baru Q` and `barL e`, each in both orders. The other ninety-four pairings leave a nonzero + hypercharge behind and so contribute nothing. -/ +lemma mul_speciesGaugeWeight_mul_piece_zero_neg_three {V : Submodule ℂ B} + {dV : GaugeWeightDecomposition repGauge V} (hV : ∀ w ∈ dV.supp, w.2.2.2 = -3) + {n m : ℕ} (f f' : Fin 3) (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) : + (GaugeWeightDecomposition.mul (d := dV) + (d' := GaugeWeightDecomposition.mul + (d := h.isFermionSector.speciesGaugeWeight f l) + (d' := h.isFermionSector.speciesGaugeWeight f' l'))).piece 0 + = (GaugeWeightDecomposition.mul (d := dV) + (d' := GaugeWeightDecomposition.mul + (d := h.isFermionSector.rangeGaugeWeight_d f l) + (d' := h.isFermionSector.rangeGaugeWeight_barQ f' l'))).piece 0 + ⊔ (GaugeWeightDecomposition.mul (d := dV) + (d' := GaugeWeightDecomposition.mul + (d := h.isFermionSector.rangeGaugeWeight_barQ f l) + (d' := h.isFermionSector.rangeGaugeWeight_d f' l'))).piece 0 + ⊔ (GaugeWeightDecomposition.mul (d := dV) + (d' := GaugeWeightDecomposition.mul + (d := h.isFermionSector.rangeGaugeWeight_baru f l) + (d' := h.isFermionSector.rangeGaugeWeight_Q f' l'))).piece 0 + ⊔ (GaugeWeightDecomposition.mul (d := dV) + (d' := GaugeWeightDecomposition.mul + (d := h.isFermionSector.rangeGaugeWeight_Q f l) + (d' := h.isFermionSector.rangeGaugeWeight_baru f' l'))).piece 0 + ⊔ (GaugeWeightDecomposition.mul (d := dV) + (d' := GaugeWeightDecomposition.mul + (d := h.isFermionSector.rangeGaugeWeight_barL f l) + (d' := h.isFermionSector.rangeGaugeWeight_e f' l'))).piece 0 + ⊔ (GaugeWeightDecomposition.mul (d := dV) + (d' := GaugeWeightDecomposition.mul + (d := h.isFermionSector.rangeGaugeWeight_e f l) + (d' := h.isFermionSector.rangeGaugeWeight_barL f' l'))).piece 0 := by + have hd := h.isFermionSector.rangeGaugeWeight_d_hc f l + have hbard := h.isFermionSector.rangeGaugeWeight_bard_hc f l + have hu := h.isFermionSector.rangeGaugeWeight_u_hc f l + have hbaru := h.isFermionSector.rangeGaugeWeight_baru_hc f l + have hQ := h.isFermionSector.rangeGaugeWeight_Q_hc f l + have hbarQ := h.isFermionSector.rangeGaugeWeight_barQ_hc f l + have hL := h.isFermionSector.rangeGaugeWeight_L_hc f l + have hbarL := h.isFermionSector.rangeGaugeWeight_barL_hc f l + have he := h.isFermionSector.rangeGaugeWeight_e_hc f l + have hbare := h.isFermionSector.rangeGaugeWeight_bare_hc f l + have hd' := h.isFermionSector.rangeGaugeWeight_d_hc f' l' + have hbard' := h.isFermionSector.rangeGaugeWeight_bard_hc f' l' + have hu' := h.isFermionSector.rangeGaugeWeight_u_hc f' l' + have hbaru' := h.isFermionSector.rangeGaugeWeight_baru_hc f' l' + have hQ' := h.isFermionSector.rangeGaugeWeight_Q_hc f' l' + have hbarQ' := h.isFermionSector.rangeGaugeWeight_barQ_hc f' l' + have hL' := h.isFermionSector.rangeGaugeWeight_L_hc f' l' + have hbarL' := h.isFermionSector.rangeGaugeWeight_barL_hc f' l' + have he' := h.isFermionSector.rangeGaugeWeight_e_hc f' l' + have hbare' := h.isFermionSector.rangeGaugeWeight_bare_hc f' l' + simp only [piece_mul_sup_mul, piece_mul_mul_sup, + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hd hd') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hd hbard') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hd hu') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hd hbaru') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hd hQ') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hd hL') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hd hbarL') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hd he') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hd hbare') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbard hd') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbard hbard') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbard hu') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbard hbaru') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbard hQ') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbard hbarQ') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbard hL') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbard hbarL') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbard he') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbard hbare') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hu hd') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hu hbard') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hu hu') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hu hbaru') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hu hQ') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hu hbarQ') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hu hL') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hu hbarL') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hu he') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hu hbare') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbaru hd') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbaru hbard') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbaru hu') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbaru hbaru') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbaru hbarQ') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbaru hL') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbaru hbarL') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbaru he') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbaru hbare') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hQ hd') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hQ hbard') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hQ hu') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hQ hQ') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hQ hbarQ') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hQ hL') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hQ hbarL') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hQ he') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hQ hbare') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbarQ hbard') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbarQ hu') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbarQ hbaru') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbarQ hQ') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbarQ hbarQ') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbarQ hL') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbarQ hbarL') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbarQ he') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbarQ hbare') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hL hd') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hL hbard') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hL hu') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hL hbaru') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hL hQ') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hL hbarQ') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hL hL') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hL hbarL') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hL he') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hL hbare') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbarL hd') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbarL hbard') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbarL hu') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbarL hbaru') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbarL hQ') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbarL hbarQ') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbarL hL') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbarL hbarL') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbarL hbare') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge he hd') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge he hbard') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge he hu') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge he hbaru') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge he hQ') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge he hbarQ') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge he hL') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge he he') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge he hbare') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbare hd') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbare hbard') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbare hu') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbare hbaru') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbare hQ') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbare hbarQ') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbare hL') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbare hbarL') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbare he') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbare hbare') (by decide), + bot_sup_eq, sup_bot_eq] + ac_rfl + +open IsFermionSector in +/-- The hypercharge sieve against a conjugate-Higgs symbol. If `dV` has constant + hypercharge `3`, as the conjugate-Higgs symbols do, then of the hundred species pairings + only the six whose hypercharges sum to `-3` survive at gauge weight zero: `bard Q`, + `u barQ` and `L bare`, each in both orders. -/ +lemma mul_speciesGaugeWeight_mul_piece_zero_pos_three {V : Submodule ℂ B} + {dV : GaugeWeightDecomposition repGauge V} (hV : ∀ w ∈ dV.supp, w.2.2.2 = 3) + {n m : ℕ} (f f' : Fin 3) (l : Fin n → Fin 1 ⊕ Fin 3) + (l' : Fin m → Fin 1 ⊕ Fin 3) : + (GaugeWeightDecomposition.mul (d := dV) + (d' := GaugeWeightDecomposition.mul + (d := h.isFermionSector.speciesGaugeWeight f l) + (d' := h.isFermionSector.speciesGaugeWeight f' l'))).piece 0 + = (GaugeWeightDecomposition.mul (d := dV) + (d' := GaugeWeightDecomposition.mul + (d := h.isFermionSector.rangeGaugeWeight_bard f l) + (d' := h.isFermionSector.rangeGaugeWeight_Q f' l'))).piece 0 + ⊔ (GaugeWeightDecomposition.mul (d := dV) + (d' := GaugeWeightDecomposition.mul + (d := h.isFermionSector.rangeGaugeWeight_Q f l) + (d' := h.isFermionSector.rangeGaugeWeight_bard f' l'))).piece 0 + ⊔ (GaugeWeightDecomposition.mul (d := dV) + (d' := GaugeWeightDecomposition.mul + (d := h.isFermionSector.rangeGaugeWeight_u f l) + (d' := h.isFermionSector.rangeGaugeWeight_barQ f' l'))).piece 0 + ⊔ (GaugeWeightDecomposition.mul (d := dV) + (d' := GaugeWeightDecomposition.mul + (d := h.isFermionSector.rangeGaugeWeight_barQ f l) + (d' := h.isFermionSector.rangeGaugeWeight_u f' l'))).piece 0 + ⊔ (GaugeWeightDecomposition.mul (d := dV) + (d' := GaugeWeightDecomposition.mul + (d := h.isFermionSector.rangeGaugeWeight_L f l) + (d' := h.isFermionSector.rangeGaugeWeight_bare f' l'))).piece 0 + ⊔ (GaugeWeightDecomposition.mul (d := dV) + (d' := GaugeWeightDecomposition.mul + (d := h.isFermionSector.rangeGaugeWeight_bare f l) + (d' := h.isFermionSector.rangeGaugeWeight_L f' l'))).piece 0 := by + have hd := h.isFermionSector.rangeGaugeWeight_d_hc f l + have hbard := h.isFermionSector.rangeGaugeWeight_bard_hc f l + have hu := h.isFermionSector.rangeGaugeWeight_u_hc f l + have hbaru := h.isFermionSector.rangeGaugeWeight_baru_hc f l + have hQ := h.isFermionSector.rangeGaugeWeight_Q_hc f l + have hbarQ := h.isFermionSector.rangeGaugeWeight_barQ_hc f l + have hL := h.isFermionSector.rangeGaugeWeight_L_hc f l + have hbarL := h.isFermionSector.rangeGaugeWeight_barL_hc f l + have he := h.isFermionSector.rangeGaugeWeight_e_hc f l + have hbare := h.isFermionSector.rangeGaugeWeight_bare_hc f l + have hd' := h.isFermionSector.rangeGaugeWeight_d_hc f' l' + have hbard' := h.isFermionSector.rangeGaugeWeight_bard_hc f' l' + have hu' := h.isFermionSector.rangeGaugeWeight_u_hc f' l' + have hbaru' := h.isFermionSector.rangeGaugeWeight_baru_hc f' l' + have hQ' := h.isFermionSector.rangeGaugeWeight_Q_hc f' l' + have hbarQ' := h.isFermionSector.rangeGaugeWeight_barQ_hc f' l' + have hL' := h.isFermionSector.rangeGaugeWeight_L_hc f' l' + have hbarL' := h.isFermionSector.rangeGaugeWeight_barL_hc f' l' + have he' := h.isFermionSector.rangeGaugeWeight_e_hc f' l' + have hbare' := h.isFermionSector.rangeGaugeWeight_bare_hc f' l' + simp only [piece_mul_sup_mul, piece_mul_mul_sup, + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hd hd') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hd hbard') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hd hu') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hd hbaru') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hd hQ') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hd hbarQ') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hd hL') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hd hbarL') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hd he') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hd hbare') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbard hd') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbard hbard') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbard hu') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbard hbaru') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbard hbarQ') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbard hL') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbard hbarL') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbard he') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbard hbare') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hu hd') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hu hbard') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hu hu') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hu hbaru') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hu hQ') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hu hL') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hu hbarL') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hu he') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hu hbare') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbaru hd') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbaru hbard') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbaru hu') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbaru hbaru') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbaru hQ') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbaru hbarQ') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbaru hL') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbaru hbarL') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbaru he') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbaru hbare') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hQ hd') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hQ hu') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hQ hbaru') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hQ hQ') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hQ hbarQ') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hQ hL') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hQ hbarL') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hQ he') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hQ hbare') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbarQ hd') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbarQ hbard') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbarQ hbaru') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbarQ hQ') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbarQ hbarQ') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbarQ hL') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbarQ hbarL') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbarQ he') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbarQ hbare') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hL hd') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hL hbard') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hL hu') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hL hbaru') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hL hQ') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hL hbarQ') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hL hL') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hL hbarL') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hL he') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbarL hd') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbarL hbard') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbarL hu') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbarL hbaru') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbarL hQ') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbarL hbarQ') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbarL hL') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbarL hbarL') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbarL he') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbarL hbare') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge he hd') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge he hbard') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge he hu') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge he hbaru') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge he hQ') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge he hbarQ') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge he hL') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge he hbarL') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge he he') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge he hbare') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbare hd') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbare hbard') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbare hu') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbare hbaru') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbare hQ') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbare hbarQ') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbare hbarL') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbare he') (by decide), + mul_piece_zero_eq_bot_of_hypercharge hV (mul_supp_hypercharge hbare hbare') (by decide), + bot_sup_eq, sup_bot_eq] + ac_rfl + +/-! + +## F. The twelve surviving blocks + +The pieces now assemble. Unfolding the Higgs derivative submodule into its Higgs and +conjugate-Higgs halves and the fermion towers into a join over families splits the product +into blocks indexed by a Higgs choice and two families, and the sieve of section E reduces +each block to six terms. Twelve survive in all, and they are exactly the Yukawa couplings +of the Standard Model: the down-type coupling `H d barQ`, the up-type coupling `H baru Q`, +the charged-lepton coupling `H barL e`, their conjugates `barH bard Q`, `barH u barQ` and +`barH L bare`, and the transpose of each, the two fermion towers being interchangeable. + +Nothing here constrains the families: all nine pairs `(f, f')` occur, which is where the +Yukawa matrices come from. + +-/ + +/-- The weight-zero piece of the Yukawa sector at mass weight eight: the join, over pairs + of families, of the twelve blocks that hypercharge allows. Of the two hundred ways of + choosing one Higgs symbol and two fermion species, only these twelve have vanishing total + hypercharge; the remaining one hundred and eighty-eight are killed by + `mul_speciesGaugeWeight_mul_piece_zero_neg_three` and + `mul_speciesGaugeWeight_mul_piece_zero_pos_three`. -/ +lemma sectorMassWeightEightGaugeWeight_piece_zero : + h.sectorMassWeightEightGaugeWeight.piece 0 + = ⨆ (f : Fin 3) (f' : Fin 3), + (GaugeWeightDecomposition.mul + (d := h.isHiggsSector.higgsSubmoduleGaugeWeight 0) + (d' := GaugeWeightDecomposition.mul + (d := h.isFermionSector.rangeGaugeWeight_d f ![]) + (d' := h.isFermionSector.rangeGaugeWeight_barQ f' ![]))).piece 0 + ⊔ (GaugeWeightDecomposition.mul + (d := h.isHiggsSector.higgsSubmoduleGaugeWeight 0) + (d' := GaugeWeightDecomposition.mul + (d := h.isFermionSector.rangeGaugeWeight_barQ f ![]) + (d' := h.isFermionSector.rangeGaugeWeight_d f' ![]))).piece 0 + ⊔ (GaugeWeightDecomposition.mul + (d := h.isHiggsSector.higgsSubmoduleGaugeWeight 0) + (d' := GaugeWeightDecomposition.mul + (d := h.isFermionSector.rangeGaugeWeight_baru f ![]) + (d' := h.isFermionSector.rangeGaugeWeight_Q f' ![]))).piece 0 + ⊔ (GaugeWeightDecomposition.mul + (d := h.isHiggsSector.higgsSubmoduleGaugeWeight 0) + (d' := GaugeWeightDecomposition.mul + (d := h.isFermionSector.rangeGaugeWeight_Q f ![]) + (d' := h.isFermionSector.rangeGaugeWeight_baru f' ![]))).piece 0 + ⊔ (GaugeWeightDecomposition.mul + (d := h.isHiggsSector.higgsSubmoduleGaugeWeight 0) + (d' := GaugeWeightDecomposition.mul + (d := h.isFermionSector.rangeGaugeWeight_barL f ![]) + (d' := h.isFermionSector.rangeGaugeWeight_e f' ![]))).piece 0 + ⊔ (GaugeWeightDecomposition.mul + (d := h.isHiggsSector.higgsSubmoduleGaugeWeight 0) + (d' := GaugeWeightDecomposition.mul + (d := h.isFermionSector.rangeGaugeWeight_e f ![]) + (d' := h.isFermionSector.rangeGaugeWeight_barL f' ![]))).piece 0 + ⊔ (GaugeWeightDecomposition.mul + (d := h.isHiggsSector.barHiggsSubmoduleGaugeWeight 0) + (d' := GaugeWeightDecomposition.mul + (d := h.isFermionSector.rangeGaugeWeight_bard f ![]) + (d' := h.isFermionSector.rangeGaugeWeight_Q f' ![]))).piece 0 + ⊔ (GaugeWeightDecomposition.mul + (d := h.isHiggsSector.barHiggsSubmoduleGaugeWeight 0) + (d' := GaugeWeightDecomposition.mul + (d := h.isFermionSector.rangeGaugeWeight_Q f ![]) + (d' := h.isFermionSector.rangeGaugeWeight_bard f' ![]))).piece 0 + ⊔ (GaugeWeightDecomposition.mul + (d := h.isHiggsSector.barHiggsSubmoduleGaugeWeight 0) + (d' := GaugeWeightDecomposition.mul + (d := h.isFermionSector.rangeGaugeWeight_u f ![]) + (d' := h.isFermionSector.rangeGaugeWeight_barQ f' ![]))).piece 0 + ⊔ (GaugeWeightDecomposition.mul + (d := h.isHiggsSector.barHiggsSubmoduleGaugeWeight 0) + (d' := GaugeWeightDecomposition.mul + (d := h.isFermionSector.rangeGaugeWeight_barQ f ![]) + (d' := h.isFermionSector.rangeGaugeWeight_u f' ![]))).piece 0 + ⊔ (GaugeWeightDecomposition.mul + (d := h.isHiggsSector.barHiggsSubmoduleGaugeWeight 0) + (d' := GaugeWeightDecomposition.mul + (d := h.isFermionSector.rangeGaugeWeight_L f ![]) + (d' := h.isFermionSector.rangeGaugeWeight_bare f' ![]))).piece 0 + ⊔ (GaugeWeightDecomposition.mul + (d := h.isHiggsSector.barHiggsSubmoduleGaugeWeight 0) + (d' := GaugeWeightDecomposition.mul + (d := h.isFermionSector.rangeGaugeWeight_bare f ![]) + (d' := h.isFermionSector.rangeGaugeWeight_L f' ![]))).piece 0 := by + have hprod : h.isHiggsSector.derivSubmodule 0 + * (h.isFermionSector.derivSubmodule 0 * h.isFermionSector.derivSubmodule 0) + = ⨆ (f : Fin 3) (f' : Fin 3), + (h.isHiggsSector.higgsSubmodule 0 ⊔ h.isHiggsSector.barHiggsSubmodule 0) + * ((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 [IsHiggsSector.derivSubmodule, h.isFermionSector.derivSubmodule_zero_eq, + Submodule.iSup_mul, Submodule.mul_iSup] + exact iSup_congr fun f => by rw [Submodule.mul_iSup, Submodule.mul_iSup] + show (GaugeWeightDecomposition.mul (d := h.isHiggsSector.derivSubmoduleGaugeWeight 0) + (d' := GaugeWeightDecomposition.mul + (d := h.isFermionSector.derivSubmoduleGaugeWeight 0) + (d' := h.isFermionSector.derivSubmoduleGaugeWeight 0))).piece 0 = _ + rw [GaugeWeightDecomposition.piece_congr + (d := GaugeWeightDecomposition.mul (d := h.isHiggsSector.derivSubmoduleGaugeWeight 0) + (d' := GaugeWeightDecomposition.mul + (d := h.isFermionSector.derivSubmoduleGaugeWeight 0) + (d' := h.isFermionSector.derivSubmoduleGaugeWeight 0))) + (d' := GaugeWeightDecomposition.iSup hrepGauge_mul fun f => + GaugeWeightDecomposition.iSup hrepGauge_mul fun f' => + GaugeWeightDecomposition.mul + (d := GaugeWeightDecomposition.sup + (d := h.isHiggsSector.higgsSubmoduleGaugeWeight 0) + (d' := h.isHiggsSector.barHiggsSubmoduleGaugeWeight 0)) + (d' := GaugeWeightDecomposition.mul + (d := h.isFermionSector.speciesGaugeWeight f ![]) + (d' := h.isFermionSector.speciesGaugeWeight f' ![]))) + hprod 0] + simp only [GaugeWeightDecomposition.piece_iSup, IsFermionSector.piece_sup_mul] + refine iSup_congr fun f => iSup_congr fun f' => ?_ + rw [h.mul_speciesGaugeWeight_mul_piece_zero_neg_three + (h.higgsSubmoduleGaugeWeight_hc 0) f f' ![] ![], + h.mul_speciesGaugeWeight_mul_piece_zero_pos_three + (h.barHiggsSubmoduleGaugeWeight_hc 0) f f' ![] ![]] + ac_rfl + +/-! + +## G. Invariants modulo a gauge-stable submodule + +A gauge-invariant element sits in the weight-zero piece, and the same holds modulo a +submodule `S` stable under the torus: an invariant lying in the sector joined with `S` +lies in the weight-zero piece joined with `S`. This is what turns the twelve blocks of +section F into a statement about the invariants themselves, the remaining work being to +peel the blocks apart, which is not done here. + +The fermion sector had it easier. There every weight has nonzero hypercharge, so one +torus generator separates all of them at once and +`IsFermionSector.mem_of_invariant_of_mem_biSup_piece_sup` fixes a single `i`. At mass +weight eight the sector carries weights of vanishing hypercharge and nonzero colour or +isospin — `H d bard` is one — so the generator has to be chosen weight by weight. That +costs nothing: the induction deletes one weight at a time and never needs two generators +at once. + +-/ + +/-- The one-weight-at-a-time refinement, with the separating generator chosen per weight. + Let `S` be closed under the four torus generators and let `s` be a finite set of nonzero + gauge weights, each seen by some generator. 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_of_ne_zero {V S : Submodule ℂ B} + (dV : GaugeWeightDecomposition repGauge V) + (hS : ∀ (i : Fin 4) (y : B), y ∈ S → repGauge (gaugeTorusGen i) y ∈ S) : + ∀ (s : Finset GaugeWeight), (∀ w ∈ s, ∃ i, 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 + obtain ⟨i, hi⟩ := hs w₀ (Finset.mem_insert_self w₀ s') + 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 hi (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 i 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 `V ⊔ S`, for `S` closed under the four torus generators, + already lies in the weight-zero piece joined with `S`: every other weight is seen by some + generator and is scaled away by it. -/ +lemma mem_piece_zero_sup_of_invariant {V S : Submodule ℂ B} + (dV : GaugeWeightDecomposition repGauge V) + (hS : ∀ (i : Fin 4) (y : B), y ∈ S → repGauge (gaugeTorusGen i) y ∈ S) + {x : B} (hx : x ∈ V ⊔ S) (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : + x ∈ dV.piece 0 ⊔ S := by + refine mem_of_invariant_of_mem_biSup_piece_sup_of_ne_zero dV ?_ (dV.supp.erase 0) ?_ x ?_ hinv + · intro i y hy + rw [Submodule.mem_sup] at hy ⊢ + obtain ⟨a, ha, b, hb, rfl⟩ := hy + refine ⟨repGauge (gaugeTorusGen i) a, ?_, repGauge (gaugeTorusGen i) b, hS i b hb, ?_⟩ + · rw [dV.piece_le 0 a ha i] + exact (dV.piece 0).smul_mem _ ha + · rw [map_add] + · intro w hw + have hw0 : w ≠ 0 := (Finset.mem_erase.mp hw).1 + by_contra hcon + refine hw0 (GaugeWeight.coord_injective (funext fun i => ?_)) + have hi := not_not.mp (not_exists.mp hcon i) + rw [hi, GaugeWeight.zero_coord i] + · have hVle : V ≤ (⨆ w ∈ dV.supp.erase 0, dV.piece w) ⊔ dV.piece 0 := by + refine le_trans (le_of_eq dV.iSup_piece.symm) (iSup_le fun w => ?_) + by_cases hw0 : w = 0 + · subst hw0 + exact le_sup_right + · by_cases hw : w ∈ dV.supp + · exact le_sup_of_le_left (le_iSup₂_of_le w (Finset.mem_erase.mpr ⟨hw0, hw⟩) le_rfl) + · rw [dV.piece_eq_bot w hw] + exact bot_le + exact ((sup_le_sup_right hVle S).trans (le_of_eq (sup_assoc _ _ _))) hx + +/-- A gauge-invariant element of the Yukawa sector at mass weight eight joined with a + torus-stable `S` lies in the weight-zero piece joined with `S`, so the twelve blocks of + `sectorMassWeightEightGaugeWeight_piece_zero` are all that a Yukawa invariant can be + built from. -/ +lemma mem_sectorMassWeightEight_piece_zero_sup_of_invariant {S : Submodule ℂ B} + (hS : ∀ (i : Fin 4) (y : B), y ∈ S → repGauge (gaugeTorusGen i) y ∈ S) {x : B} + (hx : x ∈ h.sectorMassWeight {GeneratorClass.higgs, GeneratorClass.fermion} 8 ⊔ S) + (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : + x ∈ h.sectorMassWeightEightGaugeWeight.piece 0 ⊔ S := + mem_piece_zero_sup_of_invariant _ hS hx hinv + +end IsCovStandardModel + +end StandardModel diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/MassDimEight.lean b/Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/MassDimEight.lean new file mode 100644 index 000000000..f5d667d1e --- /dev/null +++ b/Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/MassDimEight.lean @@ -0,0 +1,882 @@ +/- +Copyright (c) 2026 Joseph Tooby-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.YukawaSector.Families.BarHiggs +public import Physlib.Particles.StandardModel.IsCovStandardModel.YukawaSector.GaugeWeightDecomposition +public import Physlib.Particles.StandardModel.Peeling +/-! +# The Yukawa sector at mass weight eight + +## i. Overview + +This is the theorem the Yukawa sector exists for. At mass weight eight the sector is one +Higgs tower against two underived fermion towers, and the claim proved here is that its +gauge- and Lorentz-invariant content, modulo a submodule `S` stable under both groups, is +exactly the span of the six Yukawa couplings over the nine family pairs. Nothing else +survives: no fourth coupling, no extra colour or isospin structure inside a surviving +block, no invariant carrying a free spinor index. + +Three things are already done and are used as given. Hypercharge has sieved the two +hundred blocks of the gauge weight decomposition down to twelve, in +`sectorMassWeightEightGaugeWeight_piece_zero`. A gauge invariant of the sector lies in +that weight-zero piece modulo `S`, by `mem_sectorMassWeightEight_piece_zero_sup_of_invariant`. +And the six couplings, their index laws and their contractions are built in the `Families` +files, together with `yukawaSpan_le_inf`, which is the easy direction of the equivalence. + +What is left is the peeling. A block of the decomposition is a product of three symbol +ranges, and the classification of its invariants is three classifications in a row — +colour, then isospin, then Lorentz — each cutting the span down to the span of one +contraction. The three groups are different, and the fifty-four surviving blocks have to +be peeled apart one at a time, so the argument is organised around a single relation +`Peels σ V W`: a `σ`-invariant of `V ⊔ S` lies in `W ⊔ S` whenever `S` is `σ`-stable. That +relation composes — it is transitive, it is monotone in both arguments, and it is closed +under joins in its source — and every classification theorem the `GaugeGroup` and +`LorentzGroup` files provide is an instance of it, packaged as a `Step`. + +## ii. Key results + +- `sectorMassWeightEightGaugeWeight_piece_zero_le` : the weight-zero piece inside the six + surviving block submodules. +- `peels_yukawaSpan` : the six blocks, over the nine family pairs, peel to the Yukawa span. +- `mem_yukawaSpan_sup_of_gauge_and_lorentz_invariant`, + `exists_mem_of_gauge_and_lorentz_invariant` and + `mem_sectorMassWeight_higgs_fermion_eight_sup_and_gauge_lorentz_invariant_iff` : the + classification, in the three forms the sibling sectors state it in. + +## iii. Table of contents + +- A. The symbol ranges as spans of components +- B. The block submodules and their stability +- C. The twelve surviving blocks as six submodules +- D. The blocks peel to the Yukawa terms +- E. The classification of the invariants of mass weight eight + +-/ + +@[expose] public section + +namespace StandardModel + +open TensorProduct Matrix MatrixGroups Lorentz Pointwise ComplexConjugate + +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) + +/-! + +## A. The symbol ranges as spans of components + +-/ + +/-- The Higgs submodule without derivatives lies in the span of the Higgs components. -/ +lemma higgsSubmodule_zero_le : + h.isHiggsSector.higgsSubmodule 0 ≤ ⨆ i, ℂ ∙ h.isHiggsSector.higgs ![] i := by + refine iSup_le fun l => ?_ + rw [show l = (![] : Fin 0 → Fin 1 ⊕ Fin 3) from Subsingleton.elim _ _, + range_eq_iSup_span_dualBasis HiggsVec.orthonormBasis.toBasis (H ![])] + exact le_rfl + +/-- The conjugate Higgs submodule without derivatives lies in the span of the conjugate + Higgs components. -/ +lemma barHiggsSubmodule_zero_le : + h.isHiggsSector.barHiggsSubmodule 0 ≤ ⨆ i, ℂ ∙ h.isHiggsSector.barHiggs ![] i := by + refine iSup_le fun l => ?_ + rw [show l = (![] : Fin 0 → Fin 1 ⊕ Fin 3) from Subsingleton.elim _ _, + range_eq_iSup_span_dualBasis HiggsVec.orthonormBasis.toBasis.conj (barH ![])] + exact le_rfl + +/-- The range of the down-singlet symbol map is the span of its components. -/ +lemma range_d_eq (f : Fin 3) : + LinearMap.range (d f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) + = ⨆ j, ℂ ∙ h.isFermionSector.dComponent f ![] j := + range_eq_iSup_span_dualBasis DownSinglet.basis (d f ![]) + +/-- The range of the conjugate down-singlet symbol map is the span of its components. -/ +lemma range_bard_eq (f : Fin 3) : + LinearMap.range (bard f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) + = ⨆ j, ℂ ∙ h.isFermionSector.bardComponent f ![] j := + range_eq_iSup_span_dualBasis DownSinglet.basis.conj (bard f ![]) + +/-- The range of the up-singlet symbol map is the span of its components. -/ +lemma range_u_eq (f : Fin 3) : + LinearMap.range (u f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) + = ⨆ j, ℂ ∙ h.isFermionSector.uComponent f ![] j := + range_eq_iSup_span_dualBasis UpSinglet.basis (u f ![]) + +/-- The range of the conjugate up-singlet symbol map is the span of its components. -/ +lemma range_baru_eq (f : Fin 3) : + LinearMap.range (baru f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) + = ⨆ j, ℂ ∙ h.isFermionSector.baruComponent f ![] j := + range_eq_iSup_span_dualBasis UpSinglet.basis.conj (baru f ![]) + +/-- The range of the quark-doublet symbol map is the span of its components. -/ +lemma range_Q_eq (f : Fin 3) : + LinearMap.range (Q f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) + = ⨆ j, ℂ ∙ h.isFermionSector.QComponent f ![] j := + range_eq_iSup_span_dualBasis QuarkDoublet.basis (Q f ![]) + +/-- The range of the conjugate quark-doublet symbol map is the span of its components. -/ +lemma range_barQ_eq (f : Fin 3) : + LinearMap.range (barQ f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) + = ⨆ j, ℂ ∙ h.isFermionSector.barQComponent f ![] j := + range_eq_iSup_span_dualBasis QuarkDoublet.basis.conj (barQ f ![]) + +/-- The range of the lepton-doublet symbol map is the span of its components. -/ +lemma range_L_eq (f : Fin 3) : + LinearMap.range (L f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) + = ⨆ j, ℂ ∙ h.isFermionSector.LComponent f ![] j := + range_eq_iSup_span_dualBasis LeptonDoublet.basis (L f ![]) + +/-- The range of the conjugate lepton-doublet symbol map is the span of its components. -/ +lemma range_barL_eq (f : Fin 3) : + LinearMap.range (barL f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) + = ⨆ j, ℂ ∙ h.isFermionSector.barLComponent f ![] j := + range_eq_iSup_span_dualBasis LeptonDoublet.basis.conj (barL f ![]) + +/-- The range of the lepton-singlet symbol map is the span of its components. -/ +lemma range_e_eq (f : Fin 3) : + LinearMap.range (e f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) + = ⨆ j, ℂ ∙ h.isFermionSector.eComponent f ![] j := + range_eq_iSup_span_dualBasis LeptonSinglet.basis (e f ![]) + +/-- The range of the conjugate lepton-singlet symbol map is the span of its components. -/ +lemma range_bare_eq (f : Fin 3) : + LinearMap.range (bare f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) + = ⨆ j, ℂ ∙ h.isFermionSector.bareComponent f ![] j := + range_eq_iSup_span_dualBasis LeptonSinglet.basis.conj (bare f ![]) + +/-! + +## B. The block submodules and their stability + +A surviving block of the decomposition is the product of a Higgs range with two fermion +ranges, and this is the submodule the classification of that block runs inside. All six +are carried into themselves by both groups, each factor being the range of an equivariant +symbol map with no derivative slots for the Lorentz group to mix, and a product of stable +submodules being stable. That stability is what lets the six blocks — fifty-four of them +once the family pairs are counted — be peeled apart one at a time, each in turn joining the +error term of the others. + +-/ + +include h in +/-- The two groups act on the algebra by algebra maps. -/ +lemma gaugeLorentzMaps_mul (p : GaugeGroupI ⊕ SL(2,ℂ)) (a b : B) : + gaugeLorentzMaps repGauge repLorentz p (a * b) + = gaugeLorentzMaps repGauge repLorentz p a * gaugeLorentzMaps repGauge repLorentz p b := by + cases p with + | inl g => exact h.isHiggsSector.rep_mul g a b + | inr Λ => exact h.isHiggsSector.repLorentz_mul Λ a b + +/-- The Higgs submodule without derivatives is carried into itself by both groups. -/ +lemma isStableUnder_higgsSubmodule_zero : + IsStableUnder (gaugeLorentzMaps repGauge repLorentz) + (h.isHiggsSector.higgsSubmodule 0) := by + refine isStableUnder_iSup fun l => isStableUnder_gaugeLorentzMaps_iff.2 ⟨?_, fun Λ => ?_⟩ + · exact isStableUnder_range_repGauge fun g φ => h.isHiggsSector.H_equivariant g φ 0 l + · rw [show l = (![] : Fin 0 → Fin 1 ⊕ Fin 3) from Subsingleton.elim _ _] + exact isStableUnder_range_repLorentz h.isHiggsSector.repLorentz_H Λ + +/-- The conjugate Higgs submodule without derivatives is carried into itself by both + groups. -/ +lemma isStableUnder_barHiggsSubmodule_zero : + IsStableUnder (gaugeLorentzMaps repGauge repLorentz) + (h.isHiggsSector.barHiggsSubmodule 0) := by + refine isStableUnder_iSup fun l => isStableUnder_gaugeLorentzMaps_iff.2 ⟨?_, fun Λ => ?_⟩ + · exact isStableUnder_range_repGauge fun g φ => h.isHiggsSector.barH_equivariant g φ 0 l + · rw [show l = (![] : Fin 0 → Fin 1 ⊕ Fin 3) from Subsingleton.elim _ _] + exact isStableUnder_range_repLorentz h.isHiggsSector.repLorentz_barH Λ + +include h in +/-- The range of the down-singlet symbol map is carried into itself by both groups. -/ +lemma isStableUnder_range_d (f : Fin 3) : + IsStableUnder (gaugeLorentzMaps repGauge repLorentz) + (LinearMap.range (d f (![] : Fin 0 → Fin 1 ⊕ Fin 3))) := + isStableUnder_gaugeLorentzMaps_iff.2 + ⟨isStableUnder_range_repGauge fun g φ => h.isFermionSector.repGauge_d g f ![] φ, + fun Λ => isStableUnder_range_repLorentz (h.isFermionSector.repLorentz_d f) Λ⟩ + +include h in +/-- The range of the conjugate down-singlet symbol map is carried into itself by both + groups. -/ +lemma isStableUnder_range_bard (f : Fin 3) : + IsStableUnder (gaugeLorentzMaps repGauge repLorentz) + (LinearMap.range (bard f (![] : Fin 0 → Fin 1 ⊕ Fin 3))) := + isStableUnder_gaugeLorentzMaps_iff.2 + ⟨isStableUnder_range_repGauge fun g φ => h.isFermionSector.repGauge_bard g f ![] φ, + fun Λ => isStableUnder_range_repLorentz (h.isFermionSector.repLorentz_bard f) Λ⟩ + +include h in +/-- The range of the up-singlet symbol map is carried into itself by both groups. -/ +lemma isStableUnder_range_u (f : Fin 3) : + IsStableUnder (gaugeLorentzMaps repGauge repLorentz) + (LinearMap.range (u f (![] : Fin 0 → Fin 1 ⊕ Fin 3))) := + isStableUnder_gaugeLorentzMaps_iff.2 + ⟨isStableUnder_range_repGauge fun g φ => h.isFermionSector.repGauge_u g f ![] φ, + fun Λ => isStableUnder_range_repLorentz (h.isFermionSector.repLorentz_u f) Λ⟩ + +include h in +/-- The range of the conjugate up-singlet symbol map is carried into itself by both + groups. -/ +lemma isStableUnder_range_baru (f : Fin 3) : + IsStableUnder (gaugeLorentzMaps repGauge repLorentz) + (LinearMap.range (baru f (![] : Fin 0 → Fin 1 ⊕ Fin 3))) := + isStableUnder_gaugeLorentzMaps_iff.2 + ⟨isStableUnder_range_repGauge fun g φ => h.isFermionSector.repGauge_baru g f ![] φ, + fun Λ => isStableUnder_range_repLorentz (h.isFermionSector.repLorentz_baru f) Λ⟩ + +include h in +/-- The range of the quark-doublet symbol map is carried into itself by both groups. -/ +lemma isStableUnder_range_Q (f : Fin 3) : + IsStableUnder (gaugeLorentzMaps repGauge repLorentz) + (LinearMap.range (Q f (![] : Fin 0 → Fin 1 ⊕ Fin 3))) := + isStableUnder_gaugeLorentzMaps_iff.2 + ⟨isStableUnder_range_repGauge fun g φ => h.isFermionSector.repGauge_Q g f ![] φ, + fun Λ => isStableUnder_range_repLorentz (h.isFermionSector.repLorentz_Q f) Λ⟩ + +include h in +/-- The range of the conjugate quark-doublet symbol map is carried into itself by both + groups. -/ +lemma isStableUnder_range_barQ (f : Fin 3) : + IsStableUnder (gaugeLorentzMaps repGauge repLorentz) + (LinearMap.range (barQ f (![] : Fin 0 → Fin 1 ⊕ Fin 3))) := + isStableUnder_gaugeLorentzMaps_iff.2 + ⟨isStableUnder_range_repGauge fun g φ => h.isFermionSector.repGauge_barQ g f ![] φ, + fun Λ => isStableUnder_range_repLorentz (h.isFermionSector.repLorentz_barQ f) Λ⟩ + +include h in +/-- The range of the lepton-doublet symbol map is carried into itself by both groups. -/ +lemma isStableUnder_range_L (f : Fin 3) : + IsStableUnder (gaugeLorentzMaps repGauge repLorentz) + (LinearMap.range (L f (![] : Fin 0 → Fin 1 ⊕ Fin 3))) := + isStableUnder_gaugeLorentzMaps_iff.2 + ⟨isStableUnder_range_repGauge fun g φ => h.isFermionSector.repGauge_L g f ![] φ, + fun Λ => isStableUnder_range_repLorentz (h.isFermionSector.repLorentz_L f) Λ⟩ + +include h in +/-- The range of the conjugate lepton-doublet symbol map is carried into itself by both + groups. -/ +lemma isStableUnder_range_barL (f : Fin 3) : + IsStableUnder (gaugeLorentzMaps repGauge repLorentz) + (LinearMap.range (barL f (![] : Fin 0 → Fin 1 ⊕ Fin 3))) := + isStableUnder_gaugeLorentzMaps_iff.2 + ⟨isStableUnder_range_repGauge fun g φ => h.isFermionSector.repGauge_barL g f ![] φ, + fun Λ => isStableUnder_range_repLorentz (h.isFermionSector.repLorentz_barL f) Λ⟩ + +include h in +/-- The range of the lepton-singlet symbol map is carried into itself by both groups. -/ +lemma isStableUnder_range_e (f : Fin 3) : + IsStableUnder (gaugeLorentzMaps repGauge repLorentz) + (LinearMap.range (e f (![] : Fin 0 → Fin 1 ⊕ Fin 3))) := + isStableUnder_gaugeLorentzMaps_iff.2 + ⟨isStableUnder_range_repGauge fun g φ => h.isFermionSector.repGauge_e g f ![] φ, + fun Λ => isStableUnder_range_repLorentz (h.isFermionSector.repLorentz_e f) Λ⟩ + +include h in +/-- The range of the conjugate lepton-singlet symbol map is carried into itself by both + groups. -/ +lemma isStableUnder_range_bare (f : Fin 3) : + IsStableUnder (gaugeLorentzMaps repGauge repLorentz) + (LinearMap.range (bare f (![] : Fin 0 → Fin 1 ⊕ Fin 3))) := + isStableUnder_gaugeLorentzMaps_iff.2 + ⟨isStableUnder_range_repGauge fun g φ => h.isFermionSector.repGauge_bare g f ![] φ, + fun Λ => isStableUnder_range_repLorentz (h.isFermionSector.repLorentz_bare f) Λ⟩ + +/-! + +## C. The twelve surviving blocks as six submodules + +The twelve blocks that hypercharge leaves come in six transposed pairs, and a pair is one +submodule: the two fermion factors commute as submodules, by `mul_comm_of_le_derivSubmodule`, +so exchanging them changes nothing. Under the join over family pairs the transposed block +of `(f, f')` is the untransposed block of `(f', f)`, and the weight-zero piece of the sector +lands inside the join of the six. + +-/ + +/-- The submodule of the down-type block `H d barQ` of a family pair. -/ +noncomputable def downBlockSubmodule (f f' : Fin 3) : Submodule ℂ B := + h.isHiggsSector.higgsSubmodule 0 * (LinearMap.range (d f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) + * LinearMap.range (barQ f' (![] : Fin 0 → Fin 1 ⊕ Fin 3))) + +/-- The submodule of the up-type block `H baru Q` of a family pair. -/ +noncomputable def upBlockSubmodule (f f' : Fin 3) : Submodule ℂ B := + h.isHiggsSector.higgsSubmodule 0 * (LinearMap.range (baru f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) + * LinearMap.range (Q f' (![] : Fin 0 → Fin 1 ⊕ Fin 3))) + +/-- The submodule of the charged-lepton block `H barL e` of a family pair. -/ +noncomputable def leptonBlockSubmodule (f f' : Fin 3) : Submodule ℂ B := + h.isHiggsSector.higgsSubmodule 0 * (LinearMap.range (barL f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) + * LinearMap.range (e f' (![] : Fin 0 → Fin 1 ⊕ Fin 3))) + +/-- The submodule of the conjugate down-type block `barH bard Q` of a family pair. -/ +noncomputable def barDownBlockSubmodule (f f' : Fin 3) : Submodule ℂ B := + h.isHiggsSector.barHiggsSubmodule 0 + * (LinearMap.range (bard f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) + * LinearMap.range (Q f' (![] : Fin 0 → Fin 1 ⊕ Fin 3))) + +/-- The submodule of the conjugate up-type block `barH u barQ` of a family pair. -/ +noncomputable def barUpBlockSubmodule (f f' : Fin 3) : Submodule ℂ B := + h.isHiggsSector.barHiggsSubmodule 0 + * (LinearMap.range (u f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) + * LinearMap.range (barQ f' (![] : Fin 0 → Fin 1 ⊕ Fin 3))) + +/-- The submodule of the conjugate charged-lepton block `barH L bare` of a family pair. -/ +noncomputable def barLeptonBlockSubmodule (f f' : Fin 3) : Submodule ℂ B := + h.isHiggsSector.barHiggsSubmodule 0 + * (LinearMap.range (L f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) + * LinearMap.range (bare f' (![] : Fin 0 → Fin 1 ⊕ Fin 3))) + +/-- The down-type block submodule is carried into itself by both groups. -/ +lemma isStableUnder_downBlockSubmodule (f f' : Fin 3) : + IsStableUnder (gaugeLorentzMaps repGauge repLorentz) (h.downBlockSubmodule f f') := + IsStableUnder.mul h.gaugeLorentzMaps_mul h.isStableUnder_higgsSubmodule_zero + (IsStableUnder.mul h.gaugeLorentzMaps_mul (h.isStableUnder_range_d f) + (h.isStableUnder_range_barQ f')) + +/-- The up-type block submodule is carried into itself by both groups. -/ +lemma isStableUnder_upBlockSubmodule (f f' : Fin 3) : + IsStableUnder (gaugeLorentzMaps repGauge repLorentz) (h.upBlockSubmodule f f') := + IsStableUnder.mul h.gaugeLorentzMaps_mul h.isStableUnder_higgsSubmodule_zero + (IsStableUnder.mul h.gaugeLorentzMaps_mul (h.isStableUnder_range_baru f) + (h.isStableUnder_range_Q f')) + +/-- The charged-lepton block submodule is carried into itself by both groups. -/ +lemma isStableUnder_leptonBlockSubmodule (f f' : Fin 3) : + IsStableUnder (gaugeLorentzMaps repGauge repLorentz) (h.leptonBlockSubmodule f f') := + IsStableUnder.mul h.gaugeLorentzMaps_mul h.isStableUnder_higgsSubmodule_zero + (IsStableUnder.mul h.gaugeLorentzMaps_mul (h.isStableUnder_range_barL f) + (h.isStableUnder_range_e f')) + +/-- The conjugate down-type block submodule is carried into itself by both groups. -/ +lemma isStableUnder_barDownBlockSubmodule (f f' : Fin 3) : + IsStableUnder (gaugeLorentzMaps repGauge repLorentz) (h.barDownBlockSubmodule f f') := + IsStableUnder.mul h.gaugeLorentzMaps_mul h.isStableUnder_barHiggsSubmodule_zero + (IsStableUnder.mul h.gaugeLorentzMaps_mul (h.isStableUnder_range_bard f) + (h.isStableUnder_range_Q f')) + +/-- The conjugate up-type block submodule is carried into itself by both groups. -/ +lemma isStableUnder_barUpBlockSubmodule (f f' : Fin 3) : + IsStableUnder (gaugeLorentzMaps repGauge repLorentz) (h.barUpBlockSubmodule f f') := + IsStableUnder.mul h.gaugeLorentzMaps_mul h.isStableUnder_barHiggsSubmodule_zero + (IsStableUnder.mul h.gaugeLorentzMaps_mul (h.isStableUnder_range_u f) + (h.isStableUnder_range_barQ f')) + +/-- The conjugate charged-lepton block submodule is carried into itself by both groups. -/ +lemma isStableUnder_barLeptonBlockSubmodule (f f' : Fin 3) : + IsStableUnder (gaugeLorentzMaps repGauge repLorentz) (h.barLeptonBlockSubmodule f f') := + IsStableUnder.mul h.gaugeLorentzMaps_mul h.isStableUnder_barHiggsSubmodule_zero + (IsStableUnder.mul h.gaugeLorentzMaps_mul (h.isStableUnder_range_L f) + (h.isStableUnder_range_bare f')) + +/-- The join of the six block submodules over the nine family pairs: what the weight-zero + piece of the Yukawa sector at mass weight eight is contained in. -/ +noncomputable def blockSubmodule : Submodule ℂ B := + ⨆ (f : Fin 3) (f' : Fin 3), h.downBlockSubmodule f f' ⊔ h.upBlockSubmodule f f' + ⊔ h.leptonBlockSubmodule f f' ⊔ h.barDownBlockSubmodule f f' + ⊔ h.barUpBlockSubmodule f f' ⊔ h.barLeptonBlockSubmodule f f' + +/-- The weight-zero piece of the Yukawa sector at mass weight eight lies in the join of the + six block submodules over the nine family pairs. The twelve blocks of + `sectorMassWeightEightGaugeWeight_piece_zero` become six because the two fermion factors + of a block commute, so the transposed block of `(f, f')` is the block of `(f', f)`; and + the weight refinement inside a block is dropped, hypercharge having already done its + work and colour, isospin and Lorentz being what decide the rest. -/ +lemma sectorMassWeightEightGaugeWeight_piece_zero_le : + h.sectorMassWeightEightGaugeWeight.piece 0 ≤ h.blockSubmodule := by + rw [h.sectorMassWeightEightGaugeWeight_piece_zero, blockSubmodule] + refine iSup_le fun f => iSup_le fun f' => ?_ + refine sup_le (sup_le (sup_le (sup_le (sup_le (sup_le (sup_le (sup_le (sup_le + (sup_le (sup_le ?_ ?_) ?_) ?_) ?_) ?_) ?_) ?_) ?_) ?_) ?_) ?_ + · exact le_trans (GaugeWeightDecomposition.piece_le_self _ 0) + (le_iSup₂_of_le f f' (le_sup_of_le_left (le_sup_of_le_left + (le_sup_of_le_left (le_sup_of_le_left le_sup_left))))) + · refine le_trans (GaugeWeightDecomposition.piece_le_self _ 0) ?_ + rw [h.mul_comm_of_le_derivSubmodule (h.range_barQ_le_derivSubmodule f ![]) + (h.range_d_le_derivSubmodule f' ![])] + exact le_iSup₂_of_le f' f (le_sup_of_le_left (le_sup_of_le_left + (le_sup_of_le_left (le_sup_of_le_left le_sup_left)))) + · exact le_trans (GaugeWeightDecomposition.piece_le_self _ 0) + (le_iSup₂_of_le f f' (le_sup_of_le_left (le_sup_of_le_left + (le_sup_of_le_left (le_sup_of_le_left le_sup_right))))) + · refine le_trans (GaugeWeightDecomposition.piece_le_self _ 0) ?_ + rw [h.mul_comm_of_le_derivSubmodule (h.range_Q_le_derivSubmodule f ![]) + (h.range_baru_le_derivSubmodule f' ![])] + exact le_iSup₂_of_le f' f (le_sup_of_le_left (le_sup_of_le_left + (le_sup_of_le_left (le_sup_of_le_left le_sup_right)))) + · exact le_trans (GaugeWeightDecomposition.piece_le_self _ 0) + (le_iSup₂_of_le f f' (le_sup_of_le_left (le_sup_of_le_left + (le_sup_of_le_left le_sup_right)))) + · refine le_trans (GaugeWeightDecomposition.piece_le_self _ 0) ?_ + rw [h.mul_comm_of_le_derivSubmodule (h.range_e_le_derivSubmodule f ![]) + (h.range_barL_le_derivSubmodule f' ![])] + exact le_iSup₂_of_le f' f (le_sup_of_le_left (le_sup_of_le_left + (le_sup_of_le_left le_sup_right))) + · exact le_trans (GaugeWeightDecomposition.piece_le_self _ 0) + (le_iSup₂_of_le f f' (le_sup_of_le_left (le_sup_of_le_left le_sup_right))) + · refine le_trans (GaugeWeightDecomposition.piece_le_self _ 0) ?_ + rw [h.mul_comm_of_le_derivSubmodule (h.range_Q_le_derivSubmodule f ![]) + (h.range_bard_le_derivSubmodule f' ![])] + exact le_iSup₂_of_le f' f (le_sup_of_le_left (le_sup_of_le_left le_sup_right)) + · exact le_trans (GaugeWeightDecomposition.piece_le_self _ 0) + (le_iSup₂_of_le f f' (le_sup_of_le_left le_sup_right)) + · refine le_trans (GaugeWeightDecomposition.piece_le_self _ 0) ?_ + rw [h.mul_comm_of_le_derivSubmodule (h.range_barQ_le_derivSubmodule f ![]) + (h.range_u_le_derivSubmodule f' ![])] + exact le_iSup₂_of_le f' f (le_sup_of_le_left le_sup_right) + · exact le_trans (GaugeWeightDecomposition.piece_le_self _ 0) + (le_iSup₂_of_le f f' le_sup_right) + · refine le_trans (GaugeWeightDecomposition.piece_le_self _ 0) ?_ + rw [h.mul_comm_of_le_derivSubmodule (h.range_bare_le_derivSubmodule f ![]) + (h.range_L_le_derivSubmodule f' ![])] + exact le_iSup₂_of_le f' f le_sup_right + +/-! + +## D. The blocks peel to the Yukawa terms + +Each block is classified in three stages, and each stage is the same move: one index law +holds at every value of the indices it does not see, so a family of steps is applied at +once by `Peels.iSup_step`, and what comes out is the span of the contractions, which is the +source of the next stage. Colour first, then isospin, then Lorentz — the order is forced, +each contraction being a spectator of the ones after it. + +The two lepton blocks have no colour index at all, so their first stage is `Step.ofFixed` +rather than a classification: the block is already fixed by the colour factor and the stage +peels it to itself. That keeps them in the same three-stage shape as the four quark +blocks. + +-/ + +include h in +/-- The down-type block peels to the down-type Yukawa term. -/ +lemma peels_downYukawa (f f' : Fin 3) : + Peels (gaugeLorentzMaps repGauge repLorentz) (h.downBlockSubmodule f f') + (ℂ ∙ h.downYukawa f f') := by + have hcolour : Peels (gaugeLorentzMaps repGauge repLorentz) (h.downBlockSubmodule f f') + (⨆ k : Fin 2 × Fin 2 × Fin 2 × Fin 2, + ℂ ∙ h.downBlockColour f f' k.1 k.2.1 k.2.2.1 k.2.2.2) := by + refine Peels.ofSU3 ((Peels.iSup_step fun k : Fin 2 × Fin 2 × Fin 2 × Fin 2 => + Step.ofSU3FunAntiFun + (h.isSU3FunAntiFun_downBlock f f' k.1 k.2.1 k.2.2.1 k.2.2.2)).mono_left ?_) + rw [downBlockSubmodule] + refine mul_mul_le_of_le h.higgsSubmodule_zero_le (le_of_eq (h.range_d_eq f)) + (le_of_eq (h.range_barQ_eq f')) fun i j k => ?_ + rw [show h.isHiggsSector.higgs ![] i * (h.isFermionSector.dComponent f ![] j * + h.isFermionSector.barQComponent f' ![] k) + = h.downBlock f f' i j.1 (![k.2.1, j.2] 1) k.1 (![k.2.1, j.2] 0) k.2.2 from by + simp [downBlock]] + exact Submodule.mem_iSup_of_mem (i, j.1, k.1, k.2.2) (IsSU3FunAntiFun.mem_span _) + have hisospin : Peels (gaugeLorentzMaps repGauge repLorentz) + (⨆ k : Fin 2 × Fin 2 × Fin 2 × Fin 2, + ℂ ∙ h.downBlockColour f f' k.1 k.2.1 k.2.2.1 k.2.2.2) + (⨆ m : Fin 2 × Fin 2, ℂ ∙ h.downBlockIsospin f f' m.1 m.2) := by + refine Peels.ofSU2 ((Peels.iSup_step fun m : Fin 2 × Fin 2 => + Step.ofSU2FunAntiFun (h.isSU2FunAntiFun_downBlockColour f f' m.1 m.2)).mono_left ?_) + refine iSup_le fun k => (Submodule.span_singleton_le_iff_mem _ _).2 + (Submodule.mem_iSup_of_mem (k.2.1, k.2.2.1) ?_) + rw [show h.downBlockColour f f' k.1 k.2.1 k.2.2.1 k.2.2.2 + = h.downBlockColour f f' (![k.2.2.2, k.1] 1) k.2.1 k.2.2.1 (![k.2.2.2, k.1] 0) + from by simp] + exact IsSU2BiFundamental.mem_span _ + exact (hcolour.trans hisospin).trans (Peels.ofLorentz + (Step.ofBiDualRightWeyl (h.isBiDualRightWeyl_downBlockIsospin f f')).peels) + +include h in +/-- The up-type block peels to the up-type Yukawa term. Isospin is contracted by the + antisymmetric symbol here, the Higgs symbol and the quark doublet both carrying the + anti-fundamental. -/ +lemma peels_upYukawa (f f' : Fin 3) : + Peels (gaugeLorentzMaps repGauge repLorentz) (h.upBlockSubmodule f f') + (ℂ ∙ h.upYukawa f f') := by + have hcolour : Peels (gaugeLorentzMaps repGauge repLorentz) (h.upBlockSubmodule f f') + (⨆ k : Fin 2 × Fin 2 × Fin 2 × Fin 2, + ℂ ∙ h.upBlockColour f f' k.1 k.2.1 k.2.2.1 k.2.2.2) := by + refine Peels.ofSU3 ((Peels.iSup_step fun k : Fin 2 × Fin 2 × Fin 2 × Fin 2 => + Step.ofSU3FunAntiFun + (h.isSU3FunAntiFun_upBlock f f' k.1 k.2.1 k.2.2.1 k.2.2.2)).mono_left ?_) + rw [upBlockSubmodule] + refine mul_mul_le_of_le h.higgsSubmodule_zero_le (le_of_eq (h.range_baru_eq f)) + (le_of_eq (h.range_Q_eq f')) fun i j k => ?_ + rw [show h.isHiggsSector.higgs ![] i * (h.isFermionSector.baruComponent f ![] j * + h.isFermionSector.QComponent f' ![] k) + = h.upBlock f f' i j.1 (![j.2, k.2.1] 0) k.1 (![j.2, k.2.1] 1) k.2.2 from by + simp [upBlock]] + exact Submodule.mem_iSup_of_mem (i, j.1, k.1, k.2.2) (IsSU3FunAntiFun.mem_span _) + have hisospin : Peels (gaugeLorentzMaps repGauge repLorentz) + (⨆ k : Fin 2 × Fin 2 × Fin 2 × Fin 2, + ℂ ∙ h.upBlockColour f f' k.1 k.2.1 k.2.2.1 k.2.2.2) + (⨆ m : Fin 2 × Fin 2, ℂ ∙ h.upBlockIsospin f f' m.1 m.2) := by + refine Peels.ofSU2 ((Peels.iSup_step fun m : Fin 2 × Fin 2 => + Step.ofSU2BiAntiFun (h.isSU2BiAntiFun_upBlockColour f f' m.1 m.2)).mono_left ?_) + refine iSup_le fun k => (Submodule.span_singleton_le_iff_mem _ _).2 + (Submodule.mem_iSup_of_mem (k.2.1, k.2.2.1) ?_) + rw [show h.upBlockColour f f' k.1 k.2.1 k.2.2.1 k.2.2.2 + = h.upBlockColour f f' (![k.1, k.2.2.2] 0) k.2.1 k.2.2.1 (![k.1, k.2.2.2] 1) + from by simp] + exact IsSU2BiFundamental.mem_span _ + exact (hcolour.trans hisospin).trans (Peels.ofLorentz + (Step.ofBiDualLeftWeyl (h.isBiDualLeftWeyl_upBlockIsospin f f')).peels) + +include h in +/-- The charged-lepton block peels to the charged-lepton Yukawa term. Its colour stage is + the trivial one: the three symbols carry no colour index between them, so the block is + fixed by the colour factor and the stage peels it to itself. -/ +lemma peels_leptonYukawa (f f' : Fin 3) : + Peels (gaugeLorentzMaps repGauge repLorentz) (h.leptonBlockSubmodule f f') + (ℂ ∙ h.leptonYukawa f f') := by + have hcolour : Peels (gaugeLorentzMaps repGauge repLorentz) (h.leptonBlockSubmodule f f') + (⨆ k : Fin 2 × Fin 2 × Fin 2 × Fin 2, + ℂ ∙ h.leptonBlock f f' k.1 k.2.1 k.2.2.1 k.2.2.2) := by + refine Peels.ofSU3 ((Peels.iSup_step fun k : Fin 2 × Fin 2 × Fin 2 × Fin 2 => + Step.ofFixed (h.leptonBlock f f' k.1 k.2.1 k.2.2.1 k.2.2.2) + fun U => h.repGauge_su3_leptonBlock U f f' k.1 k.2.1 k.2.2.1 k.2.2.2).mono_left ?_) + rw [leptonBlockSubmodule] + refine mul_mul_le_of_le h.higgsSubmodule_zero_le (le_of_eq (h.range_barL_eq f)) + (le_of_eq (h.range_e_eq f')) fun i j k => ?_ + rw [show h.isHiggsSector.higgs ![] i * (h.isFermionSector.barLComponent f ![] j * + h.isFermionSector.eComponent f' ![] k) + = h.leptonBlock f f' i j.1 j.2 k from by simp [leptonBlock]] + exact Submodule.mem_iSup_of_mem (i, j.1, j.2, k) (Submodule.mem_span_singleton_self _) + have hisospin : Peels (gaugeLorentzMaps repGauge repLorentz) + (⨆ k : Fin 2 × Fin 2 × Fin 2 × Fin 2, + ℂ ∙ h.leptonBlock f f' k.1 k.2.1 k.2.2.1 k.2.2.2) + (⨆ m : Fin 2 × Fin 2, ℂ ∙ h.leptonBlockIsospin f f' m.1 m.2) := by + refine Peels.ofSU2 ((Peels.iSup_step fun m : Fin 2 × Fin 2 => + Step.ofSU2FunAntiFun (h.isSU2FunAntiFun_leptonBlock f f' m.1 m.2)).mono_left ?_) + refine iSup_le fun k => (Submodule.span_singleton_le_iff_mem _ _).2 + (Submodule.mem_iSup_of_mem (k.2.1, k.2.2.2) ?_) + rw [show h.leptonBlock f f' k.1 k.2.1 k.2.2.1 k.2.2.2 + = h.leptonBlock f f' (![k.2.2.1, k.1] 1) k.2.1 (![k.2.2.1, k.1] 0) k.2.2.2 + from by simp] + exact IsSU2BiFundamental.mem_span _ + exact (hcolour.trans hisospin).trans (Peels.ofLorentz + (Step.ofBiDualRightWeyl (h.isBiDualRightWeyl_leptonBlockIsospin f f')).peels) + +include h in +/-- The conjugate down-type block peels to the conjugate down-type Yukawa term. -/ +lemma peels_barDownYukawa (f f' : Fin 3) : + Peels (gaugeLorentzMaps repGauge repLorentz) (h.barDownBlockSubmodule f f') + (ℂ ∙ h.barDownYukawa f f') := by + have hcolour : Peels (gaugeLorentzMaps repGauge repLorentz) + (h.barDownBlockSubmodule f f') + (⨆ k : Fin 2 × Fin 2 × Fin 2 × Fin 2, + ℂ ∙ h.barDownBlockColour f f' k.1 k.2.1 k.2.2.1 k.2.2.2) := by + refine Peels.ofSU3 ((Peels.iSup_step fun k : Fin 2 × Fin 2 × Fin 2 × Fin 2 => + Step.ofSU3FunAntiFun + (h.isSU3FunAntiFun_barDownBlock f f' k.1 k.2.1 k.2.2.1 k.2.2.2)).mono_left ?_) + rw [barDownBlockSubmodule] + refine mul_mul_le_of_le h.barHiggsSubmodule_zero_le (le_of_eq (h.range_bard_eq f)) + (le_of_eq (h.range_Q_eq f')) fun i j k => ?_ + rw [show h.isHiggsSector.barHiggs ![] i * (h.isFermionSector.bardComponent f ![] j * + h.isFermionSector.QComponent f' ![] k) + = h.barDownBlock f f' i j.1 (![j.2, k.2.1] 0) k.1 (![j.2, k.2.1] 1) k.2.2 from by + simp [barDownBlock]] + exact Submodule.mem_iSup_of_mem (i, j.1, k.1, k.2.2) (IsSU3FunAntiFun.mem_span _) + have hisospin : Peels (gaugeLorentzMaps repGauge repLorentz) + (⨆ k : Fin 2 × Fin 2 × Fin 2 × Fin 2, + ℂ ∙ h.barDownBlockColour f f' k.1 k.2.1 k.2.2.1 k.2.2.2) + (⨆ m : Fin 2 × Fin 2, ℂ ∙ h.barDownBlockIsospin f f' m.1 m.2) := by + refine Peels.ofSU2 ((Peels.iSup_step fun m : Fin 2 × Fin 2 => + Step.ofSU2FunAntiFun + (h.isSU2FunAntiFun_barDownBlockColour f f' m.1 m.2)).mono_left ?_) + refine iSup_le fun k => (Submodule.span_singleton_le_iff_mem _ _).2 + (Submodule.mem_iSup_of_mem (k.2.1, k.2.2.1) ?_) + rw [show h.barDownBlockColour f f' k.1 k.2.1 k.2.2.1 k.2.2.2 + = h.barDownBlockColour f f' (![k.1, k.2.2.2] 0) k.2.1 k.2.2.1 (![k.1, k.2.2.2] 1) + from by simp] + exact IsSU2BiFundamental.mem_span _ + exact (hcolour.trans hisospin).trans (Peels.ofLorentz + (Step.ofBiDualLeftWeyl (h.isBiDualLeftWeyl_barDownBlockIsospin f f')).peels) + +include h in +/-- The conjugate up-type block peels to the conjugate up-type Yukawa term. -/ +lemma peels_barUpYukawa (f f' : Fin 3) : + Peels (gaugeLorentzMaps repGauge repLorentz) (h.barUpBlockSubmodule f f') + (ℂ ∙ h.barUpYukawa f f') := by + have hcolour : Peels (gaugeLorentzMaps repGauge repLorentz) (h.barUpBlockSubmodule f f') + (⨆ k : Fin 2 × Fin 2 × Fin 2 × Fin 2, + ℂ ∙ h.barUpBlockColour f f' k.1 k.2.1 k.2.2.1 k.2.2.2) := by + refine Peels.ofSU3 ((Peels.iSup_step fun k : Fin 2 × Fin 2 × Fin 2 × Fin 2 => + Step.ofSU3FunAntiFun + (h.isSU3FunAntiFun_barUpBlock f f' k.1 k.2.1 k.2.2.1 k.2.2.2)).mono_left ?_) + rw [barUpBlockSubmodule] + refine mul_mul_le_of_le h.barHiggsSubmodule_zero_le (le_of_eq (h.range_u_eq f)) + (le_of_eq (h.range_barQ_eq f')) fun i j k => ?_ + rw [show h.isHiggsSector.barHiggs ![] i * (h.isFermionSector.uComponent f ![] j * + h.isFermionSector.barQComponent f' ![] k) + = h.barUpBlock f f' i j.1 (![k.2.1, j.2] 1) k.1 (![k.2.1, j.2] 0) k.2.2 from by + simp [barUpBlock]] + exact Submodule.mem_iSup_of_mem (i, j.1, k.1, k.2.2) (IsSU3FunAntiFun.mem_span _) + have hisospin : Peels (gaugeLorentzMaps repGauge repLorentz) + (⨆ k : Fin 2 × Fin 2 × Fin 2 × Fin 2, + ℂ ∙ h.barUpBlockColour f f' k.1 k.2.1 k.2.2.1 k.2.2.2) + (⨆ m : Fin 2 × Fin 2, ℂ ∙ h.barUpBlockIsospin f f' m.1 m.2) := by + refine Peels.ofSU2 ((Peels.iSup_step fun m : Fin 2 × Fin 2 => + Step.ofSU2BiFundamental + (h.isSU2BiFundamental_barUpBlockColour f f' m.1 m.2)).mono_left ?_) + refine iSup_le fun k => (Submodule.span_singleton_le_iff_mem _ _).2 + (Submodule.mem_iSup_of_mem (k.2.1, k.2.2.1) ?_) + rw [show h.barUpBlockColour f f' k.1 k.2.1 k.2.2.1 k.2.2.2 + = h.barUpBlockColour f f' (![k.1, k.2.2.2] 0) k.2.1 k.2.2.1 (![k.1, k.2.2.2] 1) + from by simp] + exact IsSU2BiFundamental.mem_span _ + exact (hcolour.trans hisospin).trans (Peels.ofLorentz + (Step.ofBiDualRightWeyl (h.isBiDualRightWeyl_barUpBlockIsospin f f')).peels) + +include h in +/-- The conjugate charged-lepton block peels to the conjugate charged-lepton Yukawa term, + again with the trivial colour stage. -/ +lemma peels_barLeptonYukawa (f f' : Fin 3) : + Peels (gaugeLorentzMaps repGauge repLorentz) (h.barLeptonBlockSubmodule f f') + (ℂ ∙ h.barLeptonYukawa f f') := by + have hcolour : Peels (gaugeLorentzMaps repGauge repLorentz) + (h.barLeptonBlockSubmodule f f') + (⨆ k : Fin 2 × Fin 2 × Fin 2 × Fin 2, + ℂ ∙ h.barLeptonBlock f f' k.1 k.2.1 k.2.2.1 k.2.2.2) := by + refine Peels.ofSU3 ((Peels.iSup_step fun k : Fin 2 × Fin 2 × Fin 2 × Fin 2 => + Step.ofFixed (h.barLeptonBlock f f' k.1 k.2.1 k.2.2.1 k.2.2.2) + fun U => + h.repGauge_su3_barLeptonBlock U f f' k.1 k.2.1 k.2.2.1 k.2.2.2).mono_left ?_) + rw [barLeptonBlockSubmodule] + refine mul_mul_le_of_le h.barHiggsSubmodule_zero_le (le_of_eq (h.range_L_eq f)) + (le_of_eq (h.range_bare_eq f')) fun i j k => ?_ + rw [show h.isHiggsSector.barHiggs ![] i * (h.isFermionSector.LComponent f ![] j * + h.isFermionSector.bareComponent f' ![] k) + = h.barLeptonBlock f f' i j.1 j.2 k from by simp [barLeptonBlock]] + exact Submodule.mem_iSup_of_mem (i, j.1, j.2, k) (Submodule.mem_span_singleton_self _) + have hisospin : Peels (gaugeLorentzMaps repGauge repLorentz) + (⨆ k : Fin 2 × Fin 2 × Fin 2 × Fin 2, + ℂ ∙ h.barLeptonBlock f f' k.1 k.2.1 k.2.2.1 k.2.2.2) + (⨆ m : Fin 2 × Fin 2, ℂ ∙ h.barLeptonBlockIsospin f f' m.1 m.2) := by + refine Peels.ofSU2 ((Peels.iSup_step fun m : Fin 2 × Fin 2 => + Step.ofSU2FunAntiFun (h.isSU2FunAntiFun_barLeptonBlock f f' m.1 m.2)).mono_left ?_) + refine iSup_le fun k => (Submodule.span_singleton_le_iff_mem _ _).2 + (Submodule.mem_iSup_of_mem (k.2.1, k.2.2.2) ?_) + rw [show h.barLeptonBlock f f' k.1 k.2.1 k.2.2.1 k.2.2.2 + = h.barLeptonBlock f f' (![k.1, k.2.2.1] 0) k.2.1 (![k.1, k.2.2.1] 1) k.2.2.2 + from by simp] + exact IsSU2BiFundamental.mem_span _ + exact (hcolour.trans hisospin).trans (Peels.ofLorentz + (Step.ofBiDualLeftWeyl (h.isBiDualLeftWeyl_barLeptonBlockIsospin f f')).peels) + +/-! + +## E. The classification of the invariants of mass weight eight + +The two directions meet. Forwards: a gauge invariant of the sector lies in the weight-zero +piece modulo `S`, the piece lies in the six block submodules, and the peeling takes those to +the Yukawa span. Backwards: `yukawaSpan_le_inf` says the Yukawa span is made of invariants +of the right mass weight to begin with, so splitting `x` as `(x - y) + y` recovers the +hypotheses. Nothing but that splitting is needed for the converse, which is what makes the +classification an equivalence rather than a one-way inclusion. + +-/ + +include h in +/-- The Yukawa span is fixed pointwise by both groups, `yukawaSpan_le_inf` placing it inside + both spaces of invariants. -/ +lemma isFixedBy_yukawaSpan : IsFixedBy (gaugeLorentzMaps repGauge repLorentz) h.yukawaSpan := by + intro p y hy + obtain ⟨hmem, hL⟩ := Submodule.mem_inf.1 (h.yukawaSpan_le_inf hy) + obtain ⟨-, hG⟩ := Submodule.mem_inf.1 hmem + cases p with + | inl g => exact (Representation.mem_invariants _ _).1 hG g + | inr Λ => exact (Representation.mem_invariants _ _).1 hL Λ + +/-- The line through a down-type Yukawa term lies in the Yukawa span. -/ +lemma span_downYukawa_le_yukawaSpan (f f' : Fin 3) : + ℂ ∙ h.downYukawa f f' ≤ h.yukawaSpan := + (Submodule.span_singleton_le_iff_mem _ _).2 (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 f (Submodule.mem_iSup_of_mem f' + (Submodule.mem_span_singleton_self _)))))))) + +/-- The line through an up-type Yukawa term lies in the Yukawa span. -/ +lemma span_upYukawa_le_yukawaSpan (f f' : Fin 3) : + ℂ ∙ h.upYukawa f f' ≤ h.yukawaSpan := + (Submodule.span_singleton_le_iff_mem _ _).2 (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 f (Submodule.mem_iSup_of_mem f' + (Submodule.mem_span_singleton_self _)))))))) + +/-- The line through a charged-lepton Yukawa term lies in the Yukawa span. -/ +lemma span_leptonYukawa_le_yukawaSpan (f f' : Fin 3) : + ℂ ∙ h.leptonYukawa f f' ≤ h.yukawaSpan := + (Submodule.span_singleton_le_iff_mem _ _).2 (Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_sup_left (Submodule.mem_sup_right + (Submodule.mem_iSup_of_mem f (Submodule.mem_iSup_of_mem f' + (Submodule.mem_span_singleton_self _))))))) + +/-- The line through a conjugate down-type Yukawa term lies in the Yukawa span. -/ +lemma span_barDownYukawa_le_yukawaSpan (f f' : Fin 3) : + ℂ ∙ h.barDownYukawa f f' ≤ h.yukawaSpan := + (Submodule.span_singleton_le_iff_mem _ _).2 (Submodule.mem_sup_left (Submodule.mem_sup_left + (Submodule.mem_sup_right (Submodule.mem_iSup_of_mem f (Submodule.mem_iSup_of_mem f' + (Submodule.mem_span_singleton_self _)))))) + +/-- The line through a conjugate up-type Yukawa term lies in the Yukawa span. -/ +lemma span_barUpYukawa_le_yukawaSpan (f f' : Fin 3) : + ℂ ∙ h.barUpYukawa f f' ≤ h.yukawaSpan := + (Submodule.span_singleton_le_iff_mem _ _).2 (Submodule.mem_sup_left + (Submodule.mem_sup_right (Submodule.mem_iSup_of_mem f (Submodule.mem_iSup_of_mem f' + (Submodule.mem_span_singleton_self _))))) + +/-- The line through a conjugate charged-lepton Yukawa term lies in the Yukawa span. -/ +lemma span_barLeptonYukawa_le_yukawaSpan (f f' : Fin 3) : + ℂ ∙ h.barLeptonYukawa f f' ≤ h.yukawaSpan := + (Submodule.span_singleton_le_iff_mem _ _).2 (Submodule.mem_sup_right + (Submodule.mem_iSup_of_mem f (Submodule.mem_iSup_of_mem f' + (Submodule.mem_span_singleton_self _)))) + +include h in +/-- The join of the six block submodules over the nine family pairs peels to the Yukawa + span: the fifty-four blocks are taken one at a time, each in turn joining the error term + of the others, which is what their stability is for. -/ +lemma peels_yukawaSpan : + Peels (gaugeLorentzMaps repGauge repLorentz) h.blockSubmodule h.yukawaSpan := by + have hW : IsStableUnder (gaugeLorentzMaps repGauge repLorentz) h.yukawaSpan := + h.isFixedBy_yukawaSpan.isStableUnder + have hblock : ∀ f f' : Fin 3, Peels (gaugeLorentzMaps repGauge repLorentz) + (h.downBlockSubmodule f f' ⊔ h.upBlockSubmodule f f' ⊔ h.leptonBlockSubmodule f f' + ⊔ h.barDownBlockSubmodule f f' ⊔ h.barUpBlockSubmodule f f' + ⊔ h.barLeptonBlockSubmodule f f') h.yukawaSpan := fun f f' => + Peels.sup (Peels.sup (Peels.sup (Peels.sup (Peels.sup + ((h.peels_downYukawa f f').mono_right (h.span_downYukawa_le_yukawaSpan f f')) + ((h.peels_upYukawa f f').mono_right (h.span_upYukawa_le_yukawaSpan f f')) + (h.isStableUnder_upBlockSubmodule f f') hW) + ((h.peels_leptonYukawa f f').mono_right (h.span_leptonYukawa_le_yukawaSpan f f')) + (h.isStableUnder_leptonBlockSubmodule f f') hW) + ((h.peels_barDownYukawa f f').mono_right (h.span_barDownYukawa_le_yukawaSpan f f')) + (h.isStableUnder_barDownBlockSubmodule f f') hW) + ((h.peels_barUpYukawa f f').mono_right (h.span_barUpYukawa_le_yukawaSpan f f')) + (h.isStableUnder_barUpBlockSubmodule f f') hW) + ((h.peels_barLeptonYukawa f f').mono_right + (h.span_barLeptonYukawa_le_yukawaSpan f f')) + (h.isStableUnder_barLeptonBlockSubmodule f f') hW + have hstable : ∀ f f' : Fin 3, IsStableUnder (gaugeLorentzMaps repGauge repLorentz) + (h.downBlockSubmodule f f' ⊔ h.upBlockSubmodule f f' ⊔ h.leptonBlockSubmodule f f' + ⊔ h.barDownBlockSubmodule f f' ⊔ h.barUpBlockSubmodule f f' + ⊔ h.barLeptonBlockSubmodule f f') := fun f f' => + ((((h.isStableUnder_downBlockSubmodule f f').sup + (h.isStableUnder_upBlockSubmodule f f')).sup + (h.isStableUnder_leptonBlockSubmodule f f')).sup + (h.isStableUnder_barDownBlockSubmodule f f')).sup + (h.isStableUnder_barUpBlockSubmodule f f') |>.sup + (h.isStableUnder_barLeptonBlockSubmodule f f') + rw [blockSubmodule] + exact Peels.iSup (fun f => Peels.iSup (hblock f) (hstable f) hW) + (fun f => isStableUnder_iSup (hstable f)) hW + +include h in +/-- A gauge and Lorentz invariant of the Yukawa sector at mass weight eight, modulo a + submodule `S` stable under both groups, lies in the Yukawa span joined with `S`. + Hypercharge puts it in the weight-zero piece, the piece lies in the six block submodules, + and colour, isospin and Lorentz peel each block down to its Yukawa term. -/ +theorem mem_yukawaSpan_sup_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.sectorMassWeight {GeneratorClass.higgs, GeneratorClass.fermion} 8 ⊔ S) + (hGinv : ∀ g : GaugeGroupI, repGauge g x = x) + (hLinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : + x ∈ h.yukawaSpan ⊔ S := by + have hpiece := h.mem_sectorMassWeightEight_piece_zero_sup_of_invariant + (fun i y hy => hS (gaugeTorusGen i) y hy) hx hGinv + exact h.peels_yukawaSpan S (isStableUnder_gaugeLorentzMaps_iff.2 ⟨hS, hSL⟩) x + (sup_le_sup_right h.sectorMassWeightEightGaugeWeight_piece_zero_le S hpiece) + (forall_gaugeLorentzMaps_eq_self_iff.2 ⟨hGinv, hLinv⟩) + +include h in +/-- The gauge and Lorentz invariants of the Yukawa sector at mass weight eight, modulo a + submodule `S` stable under both groups: such an invariant is a combination of the six + Yukawa couplings over the nine family pairs plus a remainder in `S`, and the remainder is + invariant under both groups as well, being the difference of two invariants. -/ +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.sectorMassWeight {GeneratorClass.higgs, GeneratorClass.fermion} 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.yukawaSpan := by + obtain ⟨z, hz, y, hy, rfl⟩ := Submodule.mem_sup.1 + (h.mem_yukawaSpan_sup_of_gauge_and_lorentz_invariant S hS hSL hx hGinv hLinv) + refine ⟨y, hy, fun g => ?_, fun g => ?_, by simpa using hz⟩ + · have hstep := hGinv g + rw [map_add, show repGauge g z = z from h.isFixedBy_yukawaSpan (Sum.inl g) z hz, + add_right_inj] at hstep + exact hstep + · have hstep := hLinv g + rw [map_add, show repLorentz g z = z from h.isFixedBy_yukawaSpan (Sum.inr g) z hz, + add_right_inj] at hstep + exact hstep + +include h in +/-- The classification of the Yukawa sector at mass weight eight as an equivalence: an + element of the sector joined with a submodule `S` stable under both groups is fixed by + both groups exactly when it is a combination of the six Yukawa couplings over the nine + family pairs 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 being an invariant of the sector by `yukawaSpan_le_inf`. -/ +theorem mem_sectorMassWeight_higgs_fermion_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.sectorMassWeight {GeneratorClass.higgs, GeneratorClass.fermion} 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.yukawaSpan := 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⟩ + obtain ⟨hmem₀, hL⟩ := Submodule.mem_inf.1 (h.yukawaSpan_le_inf hxy) + obtain ⟨hmem, hG⟩ := Submodule.mem_inf.1 hmem₀ + refine ⟨?_, fun g => ?_, fun g => ?_⟩ + · have hsum : x - y + y + ∈ h.sectorMassWeight {GeneratorClass.higgs, GeneratorClass.fermion} 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 hG g, hyG g] + simpa using hstep + · have hstep : repLorentz g (x - y + y) = x - y + y := by + rw [map_add, (Representation.mem_invariants _ _).1 hL g, hyL g] + simpa using hstep + +end IsCovStandardModel + +end StandardModel diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/MassDimLTEight.lean b/Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/MassDimLTEight.lean new file mode 100644 index 000000000..b5f914ca3 --- /dev/null +++ b/Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/MassDimLTEight.lean @@ -0,0 +1,412 @@ +/- +Copyright (c) 2026 Joseph Tooby-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.YukawaSector.Basic +public import Physlib.Particles.StandardModel.IsHiggsSector.DerivSubmodule.BoostWeightDecomposition +public import Physlib.Relativity.LorentzGroup.Invariants.IsQuadLorentz +-- The fermion boost weights enter only inside the proofs below, so this import is kept +-- private: its public form is one character over the line-length limit. +import Physlib.Particles.StandardModel.IsFermionSector.DerivSubmodule.BoostWeightDecomposition +/-! +# The Yukawa invariants below mass weight eight + +Mass weight eight is the first weight at which the Yukawa sector can carry an invariant: +it is the weight of `H ψ ψ`, one Higgs against two fermions. Below it the sector is nearly +empty — it vanishes outright below weight five and again at weight six — and the little +that survives, at weights five and seven, is barred from carrying an invariant by a parity +count. + +The count is on boost weight, not on the number of covector indices as in the gauge +sector. Along a spatial axis every Higgs symbol carries even boost weight, its derivative +slots contributing `±2` or `0` and its value index nothing, while every fermion symbol +carries odd boost weight, the Weyl-spinor value index contributing the extra `±1`. Each of +the four products surviving at weights five and seven has exactly one fermion factor, so +its boost weight is odd along every axis; and an element of odd boost weight cannot be +Lorentz invariant, since invariance forces boost weight zero and zero is even. + +Running that argument needs the product of two weight decompositions, and the general +construction in `WeightGrading.lean` asks for `IsBoostGraded`, which the Standard Model +algebra has no reason to satisfy: nothing says its boost weight spaces span. Yet +multiplicativity of the Lorentz representation is by itself enough to convolve two +decompositions, and section A rebuilds the product from that alone. Section B turns an odd +support into the absence of invariants, and does so modulo a Lorentz-stable submodule `S` +by passing to the quotient, where the weight-zero piece of the pushed-forward +decomposition is still trivial. + +- A. Convolving weight decompositions without a grading +- B. Odd boost weight admits no invariant +- C. Even Higgs against odd fermion +- D. Mass weights five and seven +- E. The classification below mass weight eight + +Unlike the gauge-sector statement, the final theorem needs no `0 < w`: the Yukawa sector +is a product of two non-empty sectors, so it already vanishes at weight zero and the +scalars never enter. + +-/ + +@[expose] public section + +namespace Lorentz.BoostWeight.WeightDecomposition + +open MatrixGroups + +/-! + +## A. Convolving weight decompositions without a grading + +The weight-`m` piece of a product is the join, over the splittings `k + l = m`, of the +products of the weight-`k` and weight-`l` pieces of the factors. That this is a weight +decomposition of the product submodule needs nothing of the representation beyond +multiplicativity: `mul_mem_boostWeightSubmodule` adds the two weights, and the pieces of +the factors join to the factors themselves. The general `mul` of `WeightGrading.lean` +instead routes through the projections `boostProj`, and so through `IsBoostGraded`, which +is more than is available here. + +-/ + +variable {K : Type*} [Field K] [Algebra ℝ K] {A : Type*} [Ring A] [Algebra K A] + {rep : Representation K SL(2,ℂ) A} {i : Fin 3} {V W : Submodule K A} + +omit [Algebra ℝ K] in +/-- The bound behind the convolution: a product of two joins of pieces is contained in the + join, over the total weights, of the convolution. -/ +lemma mul_le_iSup_convolution (p q : ℤ → Submodule K A) : + (⨆ k, p k) * (⨆ l, q l) ≤ ⨆ (m : ℤ) (k : ℤ) (l : ℤ) (_ : k + l = m), p k * q l := by + rw [Submodule.iSup_mul] + refine iSup_le fun k => ?_ + rw [Submodule.mul_iSup] + exact iSup_le fun l => le_iSup_of_le (k + l) + (le_iSup_of_le k (le_iSup_of_le l (le_iSup_of_le rfl le_rfl))) + +open scoped Pointwise in +/-- The convolution of two weight decompositions along the same axis, built from + multiplicativity of the representation alone: the weight-`m` piece of the product is the + join over the splittings `k + l = m` of the products of the pieces. -/ +noncomputable def mulOfMul + (hmul : ∀ (Λ : SL(2,ℂ)) (x y : A), rep Λ (x * y) = rep Λ x * rep Λ y) + (d₁ : WeightDecomposition rep i V) (d₂ : WeightDecomposition rep i W) : + WeightDecomposition rep i (V * W) where + piece m := ⨆ (k : ℤ) (l : ℤ) (_ : k + l = m), d₁.piece k * d₂.piece l + supp := d₁.supp + d₂.supp + piece_le m := iSup_le fun k => iSup_le fun l => iSup_le fun hkl => + Submodule.mul_le.2 fun a ha b hb => by + rw [← hkl] + exact mul_mem_boostWeightSubmodule hmul (d₁.piece_le k ha) (d₂.piece_le l hb) + piece_eq_bot m hm := by + refine iSup_eq_bot.2 fun k => iSup_eq_bot.2 fun l => iSup_eq_bot.2 fun hkl => ?_ + by_cases hk : k ∈ d₁.supp + · rw [d₂.piece_eq_bot l fun hl => hm (hkl ▸ Finset.add_mem_add hk hl), Submodule.mul_bot] + · rw [d₁.piece_eq_bot k hk, Submodule.bot_mul] + iSup_piece := + le_antisymm (iSup_le fun m => iSup_le fun k => iSup_le fun l => iSup_le fun _ => + Submodule.mul_le.2 fun a ha b hb => Submodule.mul_mem_mul + (le_of_le_of_eq (le_iSup d₁.piece k) d₁.iSup_piece ha) + (le_of_le_of_eq (le_iSup d₂.piece l) d₂.iSup_piece hb)) + (le_trans (le_of_eq (show V * W = (⨆ k, d₁.piece k) * ⨆ l, d₂.piece l by + rw [d₁.iSup_piece, d₂.iSup_piece])) (mul_le_iSup_convolution _ _)) + +open scoped Pointwise in +/-- The weights occurring in a convolution are the sums of the weights occurring in the + two factors. -/ +@[simp] +lemma mulOfMul_supp + (hmul : ∀ (Λ : SL(2,ℂ)) (x y : A), rep Λ (x * y) = rep Λ x * rep Λ y) + (d₁ : WeightDecomposition rep i V) (d₂ : WeightDecomposition rep i W) : + (d₁.mulOfMul hmul d₂).supp = d₁.supp + d₂.supp := rfl + +/-- A weight of a convolution splits as a weight of the left factor plus a weight of the + right one. -/ +lemma exists_add_eq_of_mem_mulOfMul_supp + {hmul : ∀ (Λ : SL(2,ℂ)) (x y : A), rep Λ (x * y) = rep Λ x * rep Λ y} + {d₁ : WeightDecomposition rep i V} {d₂ : WeightDecomposition rep i W} {m : ℤ} + (hm : m ∈ (d₁.mulOfMul hmul d₂).supp) : + ∃ k ∈ d₁.supp, ∃ l ∈ d₂.supp, k + l = m := by + rw [mulOfMul_supp] at hm + exact Finset.mem_add.1 hm + +/-- Even times even is even: a convolution of two decompositions of even support has even + support. -/ +lemma two_dvd_of_mem_mulOfMul_supp + {hmul : ∀ (Λ : SL(2,ℂ)) (x y : A), rep Λ (x * y) = rep Λ x * rep Λ y} + {d₁ : WeightDecomposition rep i V} {d₂ : WeightDecomposition rep i W} + (h₁ : ∀ k ∈ d₁.supp, (2 : ℤ) ∣ k) (h₂ : ∀ k ∈ d₂.supp, (2 : ℤ) ∣ k) {m : ℤ} + (hm : m ∈ (d₁.mulOfMul hmul d₂).supp) : (2 : ℤ) ∣ m := by + obtain ⟨k, hk, l, hl, rfl⟩ := exists_add_eq_of_mem_mulOfMul_supp hm + exact dvd_add (h₁ k hk) (h₂ l hl) + +/-- Even times odd is odd: a convolution of a decomposition of even support with one of odd + support has odd support. -/ +lemma not_two_dvd_of_mem_mulOfMul_supp + {hmul : ∀ (Λ : SL(2,ℂ)) (x y : A), rep Λ (x * y) = rep Λ x * rep Λ y} + {d₁ : WeightDecomposition rep i V} {d₂ : WeightDecomposition rep i W} + (h₁ : ∀ k ∈ d₁.supp, (2 : ℤ) ∣ k) (h₂ : ∀ k ∈ d₂.supp, ¬ (2 : ℤ) ∣ k) {m : ℤ} + (hm : m ∈ (d₁.mulOfMul hmul d₂).supp) : ¬ (2 : ℤ) ∣ m := by + obtain ⟨k, hk, l, hl, rfl⟩ := exists_add_eq_of_mem_mulOfMul_supp hm + exact fun hdvd => h₂ l hl ((dvd_add_right (h₁ k hk)).1 hdvd) + +/-- The weights of a join of two decompositions are the weights of the two. -/ +@[simp] +lemma sup_supp (d₁ : WeightDecomposition rep i V) (d₂ : WeightDecomposition rep i W) : + (d₁.sup d₂).supp = d₁.supp ∪ d₂.supp := rfl + +/-! + +## B. Odd boost weight admits no invariant + +A Lorentz invariant has boost weight zero along every axis, and zero is even. So a +submodule all of whose weights are odd contains no invariant but `0`. The statement is +wanted modulo a Lorentz-stable submodule `S`, and stability is exactly what is needed to +divide `S` out: the quotient carries a representation intertwined by `S.mkQ`, the images +of the pieces are again of pure weight, they join to the image of the submodule, and the +weight-zero image is the image of the trivial weight-zero piece. So the invariant dies in +the quotient, which is to say it lies in `S`. + +-/ + +/-- An equivariant linear map carries boost weight `m` to boost weight `m`: it commutes + with the boosts, and scaling is preserved. -/ +lemma map_boostWeightSubmodule_le {M N : Type*} [AddCommGroup M] [Module K M] + [AddCommGroup N] [Module K N] {repM : Representation K SL(2,ℂ) M} + {repN : Representation K SL(2,ℂ) N} (f : M →ₗ[K] N) + (hf : ∀ (g : SL(2,ℂ)) (y : M), f (repM g y) = repN g (f y)) (j : Fin 3) (m : ℤ) : + (boostWeightSubmodule repM j m).map f ≤ boostWeightSubmodule repN j m := by + rintro _ ⟨y, hy, rfl⟩ + intro t ht + rw [← hf, hy t ht, map_smul] + +/-- A submodule whose boost weights are all odd carries no Lorentz invariant beyond a + Lorentz-stable submodule `S`: an invariant of the join with `S` already lies in `S`. + Invariance forces boost weight zero, and zero is not among the weights on offer. -/ +lemma mem_of_invariant_of_mem_sup_of_odd_supp {M : Type*} [AddCommGroup M] [Module ℂ M] + {repLorentz : Representation ℂ SL(2,ℂ) M} {j : Fin 3} {V : Submodule ℂ M} + (d : WeightDecomposition repLorentz j V) (hodd : ∀ k ∈ d.supp, ¬ (2 : ℤ) ∣ k) + (S : Submodule ℂ M) (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) {x : M} + (hx : x ∈ V ⊔ S) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by + have hzero : d.piece 0 = ⊥ := d.piece_eq_bot 0 fun hmem => hodd 0 hmem ⟨0, rfl⟩ + have hle : ∀ m : ℤ, (d.piece m).map S.mkQ + ≤ boostWeightSubmodule (IsQuadLorentz.quotRep (repLorentz := repLorentz) S hS) j m := + fun m => le_trans (Submodule.map_mono (d.piece_le m)) + (map_boostWeightSubmodule_le S.mkQ (fun _ _ => rfl) j m) + have hmem : S.mkQ x ∈ ⨆ m : ℤ, (d.piece m).map S.mkQ := by + obtain ⟨y, hy, z, hz, rfl⟩ := Submodule.mem_sup.1 hx + rw [map_add, show S.mkQ z = 0 from (Submodule.Quotient.mk_eq_zero S).2 hz, add_zero, + ← Submodule.map_iSup] + exact Submodule.mem_map_of_mem (le_of_eq d.iSup_piece.symm hy) + have hinv' : ∀ g : SL(2,ℂ), + IsQuadLorentz.quotRep (repLorentz := repLorentz) S hS g (S.mkQ x) = S.mkQ x := + fun g => by rw [IsQuadLorentz.quotRep_mkQ, hinv g] + have hx0 := IsQuadLorentz.mem_of_mem_iSup_of_boostWeight_zero hle hmem + (IsQuadLorentz.mem_boostWeightSubmodule_zero_of_invariant hinv' j) + rw [hzero, Submodule.map_bot, Submodule.mem_bot] at hx0 + rwa [← Submodule.ker_mkQ S, LinearMap.mem_ker] + +end Lorentz.BoostWeight.WeightDecomposition + +namespace StandardModel + +open TensorProduct Matrix MatrixGroups Lorentz Lorentz.BoostWeight + +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) + +/-! + +## C. Even Higgs against odd fermion + +The two boost weight decompositions of the factors are already proved: the Higgs +derivative submodules carry even weights, their derivative slots contributing `±2` or `0` +and their value index nothing, and the fermion ones carry odd weights, the Weyl-spinor +value index adding `±1`. Convolving them along section A gives a decomposition of each +product surviving below weight eight, and the parity bookkeeping of that section makes +every weight of such a product odd, since each carries exactly one fermion factor. The +term with two Higgs factors is convolved twice, even against even staying even before the +fermion turns the total odd. + +-/ + +/-- The boost weight decomposition of a product of a Higgs and a fermion derivative + submodule, obtained by convolving the two factors' decompositions. -/ +private noncomputable def higgsFermionBoostWeight (a b : ℕ) (i : Fin 3) : + WeightDecomposition repLorentz i + (h.isHiggsSector.derivSubmodule a * h.isFermionSector.derivSubmodule b) := + WeightDecomposition.mulOfMul hrepLorentz_mul + (h.isHiggsSector.derivSubmoduleBoostWeight a i) + (h.isFermionSector.derivSubmoduleBoostWeight b i) + +/-- One Higgs factor against one fermion factor is odd: even plus odd. -/ +private lemma odd_higgsFermionBoostWeight_supp (a b : ℕ) (i : Fin 3) : + ∀ k ∈ (h.higgsFermionBoostWeight a b i).supp, ¬ (2 : ℤ) ∣ k := + fun _ hk => WeightDecomposition.not_two_dvd_of_mem_mulOfMul_supp + (fun _ hp => h.isHiggsSector.two_dvd_of_mem_derivSubmoduleBoostWeight_supp a i hp) + (fun _ hq => h.isFermionSector.not_two_dvd_of_mem_derivSubmoduleBoostWeight_supp b i hq) hk + +/-- The boost weight decomposition of a product of two Higgs and one fermion derivative + submodule, obtained by convolving the Higgs pair first. -/ +private noncomputable def higgsSqFermionBoostWeight (a b c : ℕ) (i : Fin 3) : + WeightDecomposition repLorentz i + (h.isHiggsSector.derivSubmodule a * h.isHiggsSector.derivSubmodule b + * h.isFermionSector.derivSubmodule c) := + WeightDecomposition.mulOfMul hrepLorentz_mul + (WeightDecomposition.mulOfMul hrepLorentz_mul + (h.isHiggsSector.derivSubmoduleBoostWeight a i) + (h.isHiggsSector.derivSubmoduleBoostWeight b i)) + (h.isFermionSector.derivSubmoduleBoostWeight c i) + +/-- Two Higgs factors against one fermion factor is odd: even plus even plus odd. -/ +private lemma odd_higgsSqFermionBoostWeight_supp (a b c : ℕ) (i : Fin 3) : + ∀ k ∈ (h.higgsSqFermionBoostWeight a b c i).supp, ¬ (2 : ℤ) ∣ k := + fun _ hk => WeightDecomposition.not_two_dvd_of_mem_mulOfMul_supp + (fun _ hp => WeightDecomposition.two_dvd_of_mem_mulOfMul_supp + (fun _ hp' => h.isHiggsSector.two_dvd_of_mem_derivSubmoduleBoostWeight_supp a i hp') + (fun _ hp' => h.isHiggsSector.two_dvd_of_mem_derivSubmoduleBoostWeight_supp b i hp') hp) + (fun _ hq => h.isFermionSector.not_two_dvd_of_mem_derivSubmoduleBoostWeight_supp c i hq) hk + +/-! + +## D. Mass weights five and seven + +Weight five is a single product, the Higgs field against the underived fermion towers. +Weight seven is a join of three: the Higgs field against the once-derived towers, the +once-derived Higgs field against the underived ones, and two Higgs fields against the +underived ones. Each of the four has exactly one fermion factor, so section C makes all of +their boost weights odd, the join included, and section B leaves the invariant in `S`. The +axis is immaterial; the first one will do. + +-/ + +/-- Mass weight five carries no Lorentz invariant modulo a Lorentz-stable submodule: a + Lorentz invariant of `sectorMassWeight {higgs, fermion} 5 ⊔ S` lies in `S`. The weight is + one Higgs field against the underived fermion towers, of odd boost weight. -/ +theorem mem_of_lorentz_invariant_sectorMassWeight_higgs_fermion_five_sup (S : Submodule ℂ B) + (hSL : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) {x : B} + (hx : x ∈ h.sectorMassWeight {GeneratorClass.higgs, GeneratorClass.fermion} 5 ⊔ S) + (hL : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by + rw [h.sectorMassWeight_higgs_fermion_five] at hx + exact WeightDecomposition.mem_of_invariant_of_mem_sup_of_odd_supp + (h.higgsFermionBoostWeight 0 0 0) (h.odd_higgsFermionBoostWeight_supp 0 0 0) S hSL hx hL + +/-- Mass weight seven carries no Lorentz invariant modulo a Lorentz-stable submodule: a + Lorentz invariant of `sectorMassWeight {higgs, fermion} 7 ⊔ S` lies in `S`. Each of the + three products making up the weight has a single fermion factor, so each is of odd boost + weight and so is their join. -/ +theorem mem_of_lorentz_invariant_sectorMassWeight_higgs_fermion_seven_sup + (S : Submodule ℂ B) (hSL : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) {x : B} + (hx : x ∈ h.sectorMassWeight {GeneratorClass.higgs, GeneratorClass.fermion} 7 ⊔ S) + (hL : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by + rw [h.sectorMassWeight_higgs_fermion_seven] at hx + refine WeightDecomposition.mem_of_invariant_of_mem_sup_of_odd_supp + (((h.higgsFermionBoostWeight 0 1 0).sup (h.higgsFermionBoostWeight 1 0 0)).sup + (h.higgsSqFermionBoostWeight 0 0 0 0)) ?_ S hSL hx hL + intro k hk + simp only [WeightDecomposition.sup_supp, Finset.mem_union] at hk + rcases hk with (hk | hk) | hk + · exact h.odd_higgsFermionBoostWeight_supp 0 1 0 k hk + · exact h.odd_higgsFermionBoostWeight_supp 1 0 0 k hk + · exact h.odd_higgsSqFermionBoostWeight_supp 0 0 0 0 k hk + +/-! + +## E. The classification below mass weight eight + +The eight weights below eight are now settled: the sector vanishes below weight five and +at weight six, and weights five and seven are section D. So below weight eight the Yukawa +sector supplies no invariant beyond what `S` already carries, and the equivalences record +it. + +No lower bound on the weight is needed, unlike the gauge-sector statement. The Yukawa +sector is the two-class sector of the Higgs and fermion generators, so both classes must +be present with a non-zero weight and the sector is already trivial at weight zero; the +scalars, which are what force `0 < w` there, never appear. + +-/ + +/-- Below mass weight eight the Yukawa sector carries no Lorentz invariant: a Lorentz + invariant of `sectorMassWeight {higgs, fermion} w ⊔ S` for `w < 8` lies in `S`. Weights + below five and weight six are trivial submodules, and weights five and seven are section + D. -/ +theorem mem_of_lorentz_invariant_sectorMassWeight_higgs_fermion_lt_eight_sup (w : ℕ) + (hw : w < 8) (S : Submodule ℂ B) + (hSL : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) {x : B} + (hx : x ∈ h.sectorMassWeight {GeneratorClass.higgs, GeneratorClass.fermion} w ⊔ S) + (hL : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by + rcases lt_or_ge w 5 with hw5 | hw5 + · rwa [h.sectorMassWeight_higgs_fermion_eq_bot_of_lt_five hw5, bot_sup_eq] at hx + interval_cases w + · exact h.mem_of_lorentz_invariant_sectorMassWeight_higgs_fermion_five_sup S hSL hx hL + · rwa [h.sectorMassWeight_higgs_fermion_six, bot_sup_eq] at hx + · exact h.mem_of_lorentz_invariant_sectorMassWeight_higgs_fermion_seven_sup S hSL hx hL + +set_option linter.unusedVariables false in +/-- The classification below mass weight eight as an equivalence, in the shape of the + gauge-sector statement `mem_massWeightSubmodule_lt_eight_sup_and_gauge_lorentz_invariant_iff`: + an element of `sectorMassWeight {higgs, fermion} w ⊔ S` for `w < 8` is fixed by both + groups exactly when it is itself an element of `S` fixed by both groups. Gauge stability + of `S` is not needed, and neither is gauge invariance of `x`: the forward direction is + the boost-weight parity argument, which uses the Lorentz group alone. -/ +theorem mem_sectorMassWeight_higgs_fermion_lt_eight_sup_and_gauge_lorentz_invariant_iff + (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.sectorMassWeight {GeneratorClass.higgs, GeneratorClass.fermion} 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_sectorMassWeight_higgs_fermion_lt_eight_sup w 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 + `sectorMassWeight {higgs, fermion} w ⊔ S` fixed by both groups is an element of `S` fixed + by both groups, and conversely. -/ +theorem mem_sectorMassWeight_higgs_fermion_lt_eight_sup_and_gauge_lorentz_invariant_iff_mem + (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.sectorMassWeight {GeneratorClass.higgs, GeneratorClass.fermion} 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) := + ⟨fun hx => ⟨h.mem_of_lorentz_invariant_sectorMassWeight_higgs_fermion_lt_eight_sup w hw S + hSL hx.1 hx.2.2, hx.2⟩, fun hx => ⟨Submodule.mem_sup_right hx.1, hx.2⟩⟩ + +end IsCovStandardModel + +end StandardModel diff --git a/Physlib/Particles/StandardModel/IsFermionSector/Components.lean b/Physlib/Particles/StandardModel/IsFermionSector/Components.lean new file mode 100644 index 000000000..8f6f28506 --- /dev/null +++ b/Physlib/Particles/StandardModel/IsFermionSector/Components.lean @@ -0,0 +1,612 @@ +/- +Copyright (c) 2026 Joseph Tooby-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 components of the fermion symbols + +## i. Overview + +A fermion sector gives the ten species as linear maps out of the dual of a value space. +Fixing a basis of that value space turns each map into a finite family of elements of `B`: +the components. This file records those components and the transformation laws they carry. + +Both laws are dictated by the variance. A symbol eats a covector, so it carries the +contragredient of its value space: its gauge charges are the negatives of the value +space's, entering through the matrix entries of the inverse group element, transposed. The +barred species carry the conjugate on top of that, which stars every coefficient. On the +Lorentz side a right-handed value space contributes the entrywise conjugate of the inverse +matrix and a left-handed one the inverse matrix itself, with the conjugates swapping the +two. + +## ii. Key results + +- `dComponent` ... `bareComponent` : the components of the ten fermion symbols. +- `rep_dComponent` ... `rep_bareComponent` : the gauge transformation of a component, + expanded over components. +- `repLorentz_dComponent` ... `repLorentz_bareComponent` : the Lorentz transformation of a + component carrying no derivatives, expanded over components. +- `repGauge_gaugeTorusGen_dComponent` ... `repGauge_gaugeTorusGen_bareComponent` : the + specialisation of the gauge law to the four torus generators, reproducing the weights + already recorded for the fermion derivative submodules. + +## iii. Table of contents + +- A. The components of the ten fermion symbols +- B. The gauge transformation of a component +- C. The Lorentz transformation of a component +- D. The torus specialisation and the recorded gauge weights + - D.1. The inverses of the torus generators + - D.2. The weights of the ten components + +-/ + +@[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) + +/-! + +## A. The components of the ten fermion symbols + +Each species is evaluated on the dual basis of its value space. The generation index and +the derivative slots ride along untouched; the new index is the basis index of the value +space, which for the barred species is that of the conjugate basis. + +-/ + +set_option linter.unusedVariables false in +/-- The component `∇_l d_i` of the down-singlet symbol against the basis vector `j` of + `DownSinglet`. -/ +noncomputable def dComponent (h : IsFermionSector B repGauge hrepGauge_mul repLorentz + hrepLorentz_mul d bard u baru Q barQ L barL e bare massWeightPoly) + (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (j : Fin 2 × Fin 3) : B := + d i l (DownSinglet.basis.dualBasis j) + +set_option linter.unusedVariables false in +/-- The component `∇_l bard_i` of the conjugate down-singlet symbol against the basis + vector `j` of `ConjModule DownSinglet`. -/ +noncomputable def bardComponent (h : IsFermionSector B repGauge hrepGauge_mul repLorentz + hrepLorentz_mul d bard u baru Q barQ L barL e bare massWeightPoly) + (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (j : Fin 2 × Fin 3) : B := + bard i l (DownSinglet.basis.conj.dualBasis j) + +set_option linter.unusedVariables false in +/-- The component `∇_l u_i` of the up-singlet symbol against the basis vector `j` of + `UpSinglet`. -/ +noncomputable def uComponent (h : IsFermionSector B repGauge hrepGauge_mul repLorentz + hrepLorentz_mul d bard u baru Q barQ L barL e bare massWeightPoly) + (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (j : Fin 2 × Fin 3) : B := + u i l (UpSinglet.basis.dualBasis j) + +set_option linter.unusedVariables false in +/-- The component `∇_l baru_i` of the conjugate up-singlet symbol against the basis vector + `j` of `ConjModule UpSinglet`. -/ +noncomputable def baruComponent (h : IsFermionSector B repGauge hrepGauge_mul repLorentz + hrepLorentz_mul d bard u baru Q barQ L barL e bare massWeightPoly) + (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (j : Fin 2 × Fin 3) : B := + baru i l (UpSinglet.basis.conj.dualBasis j) + +set_option linter.unusedVariables false in +/-- The component `∇_l Q_i` of the quark-doublet symbol against the basis vector `j` of + `QuarkDoublet`. -/ +noncomputable def QComponent (h : IsFermionSector B repGauge hrepGauge_mul repLorentz + hrepLorentz_mul d bard u baru Q barQ L barL e bare massWeightPoly) + (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (j : Fin 2 × Fin 3 × Fin 2) : B := + Q i l (QuarkDoublet.basis.dualBasis j) + +set_option linter.unusedVariables false in +/-- The component `∇_l barQ_i` of the conjugate quark-doublet symbol against the basis + vector `j` of `ConjModule QuarkDoublet`. -/ +noncomputable def barQComponent (h : IsFermionSector B repGauge hrepGauge_mul repLorentz + hrepLorentz_mul d bard u baru Q barQ L barL e bare massWeightPoly) + (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (j : Fin 2 × Fin 3 × Fin 2) : B := + barQ i l (QuarkDoublet.basis.conj.dualBasis j) + +set_option linter.unusedVariables false in +/-- The component `∇_l L_i` of the lepton-doublet symbol against the basis vector `j` of + `LeptonDoublet`. -/ +noncomputable def LComponent (h : IsFermionSector B repGauge hrepGauge_mul repLorentz + hrepLorentz_mul d bard u baru Q barQ L barL e bare massWeightPoly) + (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (j : Fin 2 × Fin 2) : B := + L i l (LeptonDoublet.basis.dualBasis j) + +set_option linter.unusedVariables false in +/-- The component `∇_l barL_i` of the conjugate lepton-doublet symbol against the basis + vector `j` of `ConjModule LeptonDoublet`. -/ +noncomputable def barLComponent (h : IsFermionSector B repGauge hrepGauge_mul repLorentz + hrepLorentz_mul d bard u baru Q barQ L barL e bare massWeightPoly) + (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (j : Fin 2 × Fin 2) : B := + barL i l (LeptonDoublet.basis.conj.dualBasis j) + +set_option linter.unusedVariables false in +/-- The component `∇_l e_i` of the lepton-singlet symbol against the basis vector `j` of + `LeptonSinglet`. -/ +noncomputable def eComponent (h : IsFermionSector B repGauge hrepGauge_mul repLorentz + hrepLorentz_mul d bard u baru Q barQ L barL e bare massWeightPoly) + (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (j : Fin 2) : B := + e i l (LeptonSinglet.basis.dualBasis j) + +set_option linter.unusedVariables false in +/-- The component `∇_l bare_i` of the conjugate lepton-singlet symbol against the basis + vector `j` of `ConjModule LeptonSinglet`. -/ +noncomputable def bareComponent (h : IsFermionSector B repGauge hrepGauge_mul repLorentz + hrepLorentz_mul d bard u baru Q barQ L barL e bare massWeightPoly) + (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (j : Fin 2) : B := + bare i l (LeptonSinglet.basis.conj.dualBasis j) + +/-! + +## B. The gauge transformation of a component + +A symbol eats a covector, so it carries the contragredient of its value space: the gauge +charges are the negatives of the value space's, and the coefficients are the matrix entries +of the inverse group element with its indices transposed. The barred species carry the +conjugate on top of that, which stars every coefficient. Colour mixes only the colour +index, weak isospin only the isospin index, and hypercharge is an overall scalar. + +-/ + +/-- The gauge transformation of a down-singlet component: the colour index mixes by the + transposed `SU(3)` matrix of `g⁻¹`, scaled by the conjugate hypercharge factor. -/ +lemma rep_dComponent (g : GaugeGroupI) (i : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (j : Fin 2 × Fin 3) : + repGauge g (h.dComponent i l j) = + ∑ c, (star (g⁻¹).toU1.1 ^ 2 * (g⁻¹).toSU3.1 j.2 c) • h.dComponent i l (j.1, c) := by + rw [dComponent, h.repGauge_d, DownSinglet.repGaugeGroupI_dual_dualBasis, map_sum] + exact Finset.sum_congr rfl fun c _ => by rw [map_smul]; rfl + +/-- The gauge transformation of a conjugate down-singlet component: the coefficients of + the down-singlet law, conjugated. -/ +lemma rep_bardComponent (g : GaugeGroupI) (i : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (j : Fin 2 × Fin 3) : + repGauge g (h.bardComponent i l j) = + ∑ c, star (star (g⁻¹).toU1.1 ^ 2 * (g⁻¹).toSU3.1 j.2 c) • + h.bardComponent i l (j.1, c) := by + rw [bardComponent, h.repGauge_bard, DownSinglet.repGaugeGroupI_conj_dual_dualBasis, + map_sum] + exact Finset.sum_congr rfl fun c _ => by rw [map_smul]; rfl + +/-- The gauge transformation of an up-singlet component: the colour index mixes by the + transposed `SU(3)` matrix of `g⁻¹`, scaled by the hypercharge factor. -/ +lemma rep_uComponent (g : GaugeGroupI) (i : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (j : Fin 2 × Fin 3) : + repGauge g (h.uComponent i l j) = + ∑ c, ((g⁻¹).toU1.1 ^ 4 * (g⁻¹).toSU3.1 j.2 c) • h.uComponent i l (j.1, c) := by + rw [uComponent, h.repGauge_u, UpSinglet.repGaugeGroupI_dual_dualBasis, map_sum] + exact Finset.sum_congr rfl fun c _ => by rw [map_smul]; rfl + +/-- The gauge transformation of a conjugate up-singlet component: the coefficients of the + up-singlet law, conjugated. -/ +lemma rep_baruComponent (g : GaugeGroupI) (i : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (j : Fin 2 × Fin 3) : + repGauge g (h.baruComponent i l j) = + ∑ c, star ((g⁻¹).toU1.1 ^ 4 * (g⁻¹).toSU3.1 j.2 c) • + h.baruComponent i l (j.1, c) := by + rw [baruComponent, h.repGauge_baru, UpSinglet.repGaugeGroupI_conj_dual_dualBasis, map_sum] + exact Finset.sum_congr rfl fun c _ => by rw [map_smul]; rfl + +/-- The gauge transformation of a quark-doublet component: the colour index mixes by the + transposed `SU(3)` matrix of `g⁻¹` and the isospin index by the transposed `SU(2)` + matrix, scaled by the hypercharge factor. -/ +lemma rep_QComponent (g : GaugeGroupI) (i : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (j : Fin 2 × Fin 3 × Fin 2) : + repGauge g (h.QComponent i l j) = + ∑ c, ∑ w, ((g⁻¹).toU1.1 * (g⁻¹).toSU3.1 j.2.1 c * (g⁻¹).toSU2.1 j.2.2 w) • + h.QComponent i l (j.1, c, w) := by + rw [QComponent, h.repGauge_Q, QuarkDoublet.repGaugeGroupI_dual_dualBasis, map_sum] + refine Finset.sum_congr rfl fun c _ => ?_ + rw [map_sum] + exact Finset.sum_congr rfl fun w _ => by rw [map_smul]; rfl + +/-- The gauge transformation of a conjugate quark-doublet component: the coefficients of + the quark-doublet law, conjugated. -/ +lemma rep_barQComponent (g : GaugeGroupI) (i : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (j : Fin 2 × Fin 3 × Fin 2) : + repGauge g (h.barQComponent i l j) = + ∑ c, ∑ w, star ((g⁻¹).toU1.1 * (g⁻¹).toSU3.1 j.2.1 c * (g⁻¹).toSU2.1 j.2.2 w) • + h.barQComponent i l (j.1, c, w) := by + rw [barQComponent, h.repGauge_barQ, QuarkDoublet.repGaugeGroupI_conj_dual_dualBasis, + map_sum] + refine Finset.sum_congr rfl fun c _ => ?_ + rw [map_sum] + exact Finset.sum_congr rfl fun w _ => by rw [map_smul]; rfl + +/-- The gauge transformation of a lepton-doublet component: the isospin index mixes by the + transposed `SU(2)` matrix of `g⁻¹`, scaled by the conjugate hypercharge factor. -/ +lemma rep_LComponent (g : GaugeGroupI) (i : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (j : Fin 2 × Fin 2) : + repGauge g (h.LComponent i l j) = + ∑ w, (star (g⁻¹).toU1.1 ^ 3 * (g⁻¹).toSU2.1 j.2 w) • h.LComponent i l (j.1, w) := by + rw [LComponent, h.repGauge_L, LeptonDoublet.repGaugeGroupI_dual_dualBasis, map_sum] + exact Finset.sum_congr rfl fun w _ => by rw [map_smul]; rfl + +/-- The gauge transformation of a conjugate lepton-doublet component: the coefficients of + the lepton-doublet law, conjugated. -/ +lemma rep_barLComponent (g : GaugeGroupI) (i : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (j : Fin 2 × Fin 2) : + repGauge g (h.barLComponent i l j) = + ∑ w, star (star (g⁻¹).toU1.1 ^ 3 * (g⁻¹).toSU2.1 j.2 w) • + h.barLComponent i l (j.1, w) := by + rw [barLComponent, h.repGauge_barL, LeptonDoublet.repGaugeGroupI_conj_dual_dualBasis, + map_sum] + exact Finset.sum_congr rfl fun w _ => by rw [map_smul]; rfl + +/-- The gauge transformation of a lepton-singlet component: colour and isospin act + trivially, so the sum over components collapses to the conjugate hypercharge scalar. -/ +lemma rep_eComponent (g : GaugeGroupI) (i : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (j : Fin 2) : + repGauge g (h.eComponent i l j) = + (star (g⁻¹).toU1.1 ^ 6 : ℂ) • h.eComponent i l j := by + rw [eComponent, h.repGauge_e, LeptonSinglet.repGaugeGroupI_dual_dualBasis, map_smul] + +/-- The gauge transformation of a conjugate lepton-singlet component: the scalar of the + lepton-singlet law, conjugated. -/ +lemma rep_bareComponent (g : GaugeGroupI) (i : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (j : Fin 2) : + repGauge g (h.bareComponent i l j) = + star (star (g⁻¹).toU1.1 ^ 6 : ℂ) • h.bareComponent i l j := by + rw [bareComponent, h.repGauge_bare, LeptonSinglet.repGaugeGroupI_conj_dual_dualBasis, + map_smul] + +/-! + +## C. The Lorentz transformation of a component + +A tower with `n` covariant derivatives mixes into every assignment of `n` derivative +directions, so its Lorentz law is a sum over such assignments. At `n = 0` there is exactly +one assignment and the product of Lorentz factors is empty, leaving only the action on the +value index. That is the case recorded here: a right-handed value space contributes the +entrywise conjugate of the inverse matrix and a left-handed one the inverse matrix itself, +with the conjugate species swapping the two. + +-/ + +/-- At zero covariant derivatives the assignments of derivative directions form a + one-element type, so the Lorentz law of a tower has a single term. -/ +lemma univ_derivIndex_zero (l : Fin 0 → Fin 1 ⊕ Fin 3) : + (Finset.univ : Finset (Fin 0 → Fin 1 ⊕ Fin 3)) = {l} := + Finset.eq_singleton_iff_unique_mem.mpr + ⟨Finset.mem_univ l, fun x _ => Subsingleton.elim x l⟩ + +/-- The Lorentz transformation of a down-singlet component carrying no derivatives: the + right-handed spinor index transforms by the entrywise conjugate of the inverse matrix. -/ +lemma repLorentz_dComponent (Λ : SL(2,ℂ)) (i : Fin 3) (l : Fin 0 → Fin 1 ⊕ Fin 3) + (j : Fin 2 × Fin 3) : + repLorentz Λ (h.dComponent i l j) = + ∑ β, star ((Λ⁻¹).1 j.1 β) • h.dComponent i l (β, j.2) := by + rw [dComponent, h.repLorentz_d i Λ 0 l (DownSinglet.basis.dualBasis j), + univ_derivIndex_zero l, Finset.sum_singleton] + simp only [Finset.univ_eq_empty, Finset.prod_empty, one_smul] + rw [DownSinglet.repLorentzGroup_dual_dualBasis, map_sum] + exact Finset.sum_congr rfl fun β _ => by rw [map_smul]; rfl + +/-- The Lorentz transformation of a conjugate down-singlet component carrying no + derivatives: the coefficients of the down-singlet law, conjugated. -/ +lemma repLorentz_bardComponent (Λ : SL(2,ℂ)) (i : Fin 3) (l : Fin 0 → Fin 1 ⊕ Fin 3) + (j : Fin 2 × Fin 3) : + repLorentz Λ (h.bardComponent i l j) = + ∑ β, (Λ⁻¹).1 j.1 β • h.bardComponent i l (β, j.2) := by + rw [bardComponent, h.repLorentz_bard i Λ 0 l (DownSinglet.basis.conj.dualBasis j), + univ_derivIndex_zero l, Finset.sum_singleton] + simp only [Finset.univ_eq_empty, Finset.prod_empty, one_smul] + rw [DownSinglet.repLorentzGroup_conj_dual_dualBasis, map_sum] + exact Finset.sum_congr rfl fun β _ => by rw [map_smul]; rfl + +/-- The Lorentz transformation of an up-singlet component carrying no derivatives: the + right-handed spinor index transforms by the entrywise conjugate of the inverse matrix. -/ +lemma repLorentz_uComponent (Λ : SL(2,ℂ)) (i : Fin 3) (l : Fin 0 → Fin 1 ⊕ Fin 3) + (j : Fin 2 × Fin 3) : + repLorentz Λ (h.uComponent i l j) = + ∑ β, star ((Λ⁻¹).1 j.1 β) • h.uComponent i l (β, j.2) := by + rw [uComponent, h.repLorentz_u i Λ 0 l (UpSinglet.basis.dualBasis j), + univ_derivIndex_zero l, Finset.sum_singleton] + simp only [Finset.univ_eq_empty, Finset.prod_empty, one_smul] + rw [UpSinglet.repLorentzGroup_dual_dualBasis, map_sum] + exact Finset.sum_congr rfl fun β _ => by rw [map_smul]; rfl + +/-- The Lorentz transformation of a conjugate up-singlet component carrying no + derivatives: the coefficients of the up-singlet law, conjugated. -/ +lemma repLorentz_baruComponent (Λ : SL(2,ℂ)) (i : Fin 3) (l : Fin 0 → Fin 1 ⊕ Fin 3) + (j : Fin 2 × Fin 3) : + repLorentz Λ (h.baruComponent i l j) = + ∑ β, (Λ⁻¹).1 j.1 β • h.baruComponent i l (β, j.2) := by + rw [baruComponent, h.repLorentz_baru i Λ 0 l (UpSinglet.basis.conj.dualBasis j), + univ_derivIndex_zero l, Finset.sum_singleton] + simp only [Finset.univ_eq_empty, Finset.prod_empty, one_smul] + rw [UpSinglet.repLorentzGroup_conj_dual_dualBasis, map_sum] + exact Finset.sum_congr rfl fun β _ => by rw [map_smul]; rfl + +/-- The Lorentz transformation of a quark-doublet component carrying no derivatives: the + left-handed spinor index transforms by the inverse matrix. -/ +lemma repLorentz_QComponent (Λ : SL(2,ℂ)) (i : Fin 3) (l : Fin 0 → Fin 1 ⊕ Fin 3) + (j : Fin 2 × Fin 3 × Fin 2) : + repLorentz Λ (h.QComponent i l j) = + ∑ β, (Λ⁻¹).1 j.1 β • h.QComponent i l (β, j.2.1, j.2.2) := by + rw [QComponent, h.repLorentz_Q i Λ 0 l (QuarkDoublet.basis.dualBasis j), + univ_derivIndex_zero l, Finset.sum_singleton] + simp only [Finset.univ_eq_empty, Finset.prod_empty, one_smul] + rw [QuarkDoublet.repLorentzGroup_dual_dualBasis, map_sum] + exact Finset.sum_congr rfl fun β _ => by rw [map_smul]; rfl + +/-- The Lorentz transformation of a conjugate quark-doublet component carrying no + derivatives: the coefficients of the quark-doublet law, conjugated. -/ +lemma repLorentz_barQComponent (Λ : SL(2,ℂ)) (i : Fin 3) (l : Fin 0 → Fin 1 ⊕ Fin 3) + (j : Fin 2 × Fin 3 × Fin 2) : + repLorentz Λ (h.barQComponent i l j) = + ∑ β, star ((Λ⁻¹).1 j.1 β) • h.barQComponent i l (β, j.2.1, j.2.2) := by + rw [barQComponent, h.repLorentz_barQ i Λ 0 l (QuarkDoublet.basis.conj.dualBasis j), + univ_derivIndex_zero l, Finset.sum_singleton] + simp only [Finset.univ_eq_empty, Finset.prod_empty, one_smul] + rw [QuarkDoublet.repLorentzGroup_conj_dual_dualBasis, map_sum] + exact Finset.sum_congr rfl fun β _ => by rw [map_smul]; rfl + +/-- The Lorentz transformation of a lepton-doublet component carrying no derivatives: the + left-handed spinor index transforms by the inverse matrix. -/ +lemma repLorentz_LComponent (Λ : SL(2,ℂ)) (i : Fin 3) (l : Fin 0 → Fin 1 ⊕ Fin 3) + (j : Fin 2 × Fin 2) : + repLorentz Λ (h.LComponent i l j) = + ∑ β, (Λ⁻¹).1 j.1 β • h.LComponent i l (β, j.2) := by + rw [LComponent, h.repLorentz_L i Λ 0 l (LeptonDoublet.basis.dualBasis j), + univ_derivIndex_zero l, Finset.sum_singleton] + simp only [Finset.univ_eq_empty, Finset.prod_empty, one_smul] + rw [LeptonDoublet.repLorentzGroup_dual_dualBasis, map_sum] + exact Finset.sum_congr rfl fun β _ => by rw [map_smul]; rfl + +/-- The Lorentz transformation of a conjugate lepton-doublet component carrying no + derivatives: the coefficients of the lepton-doublet law, conjugated. -/ +lemma repLorentz_barLComponent (Λ : SL(2,ℂ)) (i : Fin 3) (l : Fin 0 → Fin 1 ⊕ Fin 3) + (j : Fin 2 × Fin 2) : + repLorentz Λ (h.barLComponent i l j) = + ∑ β, star ((Λ⁻¹).1 j.1 β) • h.barLComponent i l (β, j.2) := by + rw [barLComponent, h.repLorentz_barL i Λ 0 l (LeptonDoublet.basis.conj.dualBasis j), + univ_derivIndex_zero l, Finset.sum_singleton] + simp only [Finset.univ_eq_empty, Finset.prod_empty, one_smul] + rw [LeptonDoublet.repLorentzGroup_conj_dual_dualBasis, map_sum] + exact Finset.sum_congr rfl fun β _ => by rw [map_smul]; rfl + +/-- The Lorentz transformation of a lepton-singlet component carrying no derivatives: the + right-handed spinor index transforms by the entrywise conjugate of the inverse matrix. -/ +lemma repLorentz_eComponent (Λ : SL(2,ℂ)) (i : Fin 3) (l : Fin 0 → Fin 1 ⊕ Fin 3) + (j : Fin 2) : + repLorentz Λ (h.eComponent i l j) = + ∑ β, star ((Λ⁻¹).1 j β) • h.eComponent i l β := by + rw [eComponent, h.repLorentz_e i Λ 0 l (LeptonSinglet.basis.dualBasis j), + univ_derivIndex_zero l, Finset.sum_singleton] + simp only [Finset.univ_eq_empty, Finset.prod_empty, one_smul] + rw [LeptonSinglet.repLorentzGroup_dual_dualBasis, map_sum] + exact Finset.sum_congr rfl fun β _ => by rw [map_smul]; rfl + +/-- The Lorentz transformation of a conjugate lepton-singlet component carrying no + derivatives: the coefficients of the lepton-singlet law, conjugated. -/ +lemma repLorentz_bareComponent (Λ : SL(2,ℂ)) (i : Fin 3) (l : Fin 0 → Fin 1 ⊕ Fin 3) + (j : Fin 2) : + repLorentz Λ (h.bareComponent i l j) = + ∑ β, (Λ⁻¹).1 j β • h.bareComponent i l β := by + rw [bareComponent, h.repLorentz_bare i Λ 0 l (LeptonSinglet.basis.conj.dualBasis j), + univ_derivIndex_zero l, Finset.sum_singleton] + simp only [Finset.univ_eq_empty, Finset.prod_empty, one_smul] + rw [LeptonSinglet.repLorentzGroup_conj_dual_dualBasis, map_sum] + exact Finset.sum_congr rfl fun β _ => by rw [map_smul]; rfl + +/-! + +## D. The torus specialisation and the recorded gauge weights + +Restricting the gauge law of section B to the four torus generators must return the gauge +weights already recorded for the fermion derivative submodules: the negative of the value +space's weight for an unbarred species, and the value space's own weight for a barred one. +The lemmas below derive exactly those weights from the full-group laws, so the variance of +section B and the weight bookkeeping of the derivative submodules agree. + +-/ + +/-! + +### D.1. The inverses of the torus generators + +-/ + +/-- The inverse of the unitary `exp i` is its conjugate. -/ +lemma _root_.StandardModel.expI_inv_coe : ((expI⁻¹ : unitary ℂ) : ℂ) = star (expI : ℂ) := rfl + +/-- The inverse of the first colour torus generator, `diag (exp (-i), exp i, 1)`. -/ +lemma _root_.StandardModel.su3ExpIOne_inv_coe : + (su3ExpIOne⁻¹ : specialUnitaryGroup (Fin 3) ℂ).1 + = Matrix.diagonal ![star (expI : ℂ), (expI : ℂ), 1] := by + rw [← Matrix.star_eq_inv, Matrix.specialUnitaryGroup.coe_star] + ext a b + fin_cases a <;> fin_cases b <;> simp [su3ExpIOne, Matrix.diagonal] + +/-- The inverse of the second colour torus generator, `diag (1, exp (-i), exp i)`. -/ +lemma _root_.StandardModel.su3ExpITwo_inv_coe : + (su3ExpITwo⁻¹ : specialUnitaryGroup (Fin 3) ℂ).1 + = Matrix.diagonal ![1, star (expI : ℂ), (expI : ℂ)] := by + rw [← Matrix.star_eq_inv, Matrix.specialUnitaryGroup.coe_star] + ext a b + fin_cases a <;> fin_cases b <;> simp [su3ExpITwo, Matrix.diagonal] + +/-! + +### D.2. The weights of the ten components + +-/ + +/-- The `d` components carry the negative of the down-singlet weight. -/ +lemma repGauge_gaugeTorusGen_dComponent (t : Fin 4) (i : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (j : Fin 2 × Fin 3) : + repGauge (gaugeTorusGen t) (h.dComponent i l j) + = ((expI : ℂ) ^ GaugeWeight.coord (-(DownSinglet.valueGaugeWeight j)) t) • + h.dComponent i l j := by + rw [h.rep_dComponent] + obtain ⟨k, c⟩ := j + fin_cases t <;> fin_cases c <;> + simp [gaugeTorusGen, GaugeGroupI.toU1, GaugeGroupI.toSU3, su3ExpIOne_inv_coe, + su3ExpITwo_inv_coe, Fin.sum_univ_three, Matrix.diagonal, + DownSinglet.valueGaugeWeight, colourWeight, GaugeWeight.coord, + expI_inv_eq_star, expI_inv_coe] <;> + (try congr 1) + +/-- The `bard` components carry the down-singlet weight itself. -/ +lemma repGauge_gaugeTorusGen_bardComponent (t : Fin 4) (i : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (j : Fin 2 × Fin 3) : + repGauge (gaugeTorusGen t) (h.bardComponent i l j) + = ((expI : ℂ) ^ GaugeWeight.coord (DownSinglet.valueGaugeWeight j) t) • + h.bardComponent i l j := by + rw [h.rep_bardComponent] + obtain ⟨k, c⟩ := j + fin_cases t <;> fin_cases c <;> + simp [gaugeTorusGen, GaugeGroupI.toU1, GaugeGroupI.toSU3, su3ExpIOne_inv_coe, + su3ExpITwo_inv_coe, Fin.sum_univ_three, Matrix.diagonal, + DownSinglet.valueGaugeWeight, colourWeight, GaugeWeight.coord, + expI_inv_eq_star, expI_inv_coe, starRingEnd_expI_pow] <;> + (try congr 1) + +/-- The `u` components carry the negative of the up-singlet weight. -/ +lemma repGauge_gaugeTorusGen_uComponent (t : Fin 4) (i : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (j : Fin 2 × Fin 3) : + repGauge (gaugeTorusGen t) (h.uComponent i l j) + = ((expI : ℂ) ^ GaugeWeight.coord (-(UpSinglet.valueGaugeWeight j)) t) • + h.uComponent i l j := by + rw [h.rep_uComponent] + obtain ⟨k, c⟩ := j + fin_cases t <;> fin_cases c <;> + simp [gaugeTorusGen, GaugeGroupI.toU1, GaugeGroupI.toSU3, su3ExpIOne_inv_coe, + su3ExpITwo_inv_coe, Fin.sum_univ_three, Matrix.diagonal, + UpSinglet.valueGaugeWeight, colourWeight, GaugeWeight.coord, + expI_inv_eq_star, expI_inv_coe, starRingEnd_expI_pow] <;> + (try congr 1) + +/-- The `baru` components carry the up-singlet weight itself. -/ +lemma repGauge_gaugeTorusGen_baruComponent (t : Fin 4) (i : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (j : Fin 2 × Fin 3) : + repGauge (gaugeTorusGen t) (h.baruComponent i l j) + = ((expI : ℂ) ^ GaugeWeight.coord (UpSinglet.valueGaugeWeight j) t) • + h.baruComponent i l j := by + rw [h.rep_baruComponent] + obtain ⟨k, c⟩ := j + fin_cases t <;> fin_cases c <;> + simp [gaugeTorusGen, GaugeGroupI.toU1, GaugeGroupI.toSU3, su3ExpIOne_inv_coe, + su3ExpITwo_inv_coe, Fin.sum_univ_three, Matrix.diagonal, + UpSinglet.valueGaugeWeight, colourWeight, GaugeWeight.coord, + expI_inv_eq_star, expI_inv_coe, starRingEnd_expI_pow] <;> + (try congr 1) + +/-- The `Q` components carry the negative of the quark-doublet weight. -/ +lemma repGauge_gaugeTorusGen_QComponent (t : Fin 4) (i : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (j : Fin 2 × Fin 3 × Fin 2) : + repGauge (gaugeTorusGen t) (h.QComponent i l j) + = ((expI : ℂ) ^ GaugeWeight.coord (-(QuarkDoublet.valueGaugeWeight j)) t) • + h.QComponent i l j := by + rw [h.rep_QComponent] + obtain ⟨k, c, w⟩ := j + fin_cases t <;> fin_cases c <;> fin_cases w <;> + simp [gaugeTorusGen, GaugeGroupI.toU1, GaugeGroupI.toSU3, GaugeGroupI.toSU2, + su3ExpIOne_inv_coe, su3ExpITwo_inv_coe, su2ExpI_inv_coe, Fin.sum_univ_three, + Fin.sum_univ_two, Matrix.diagonal, QuarkDoublet.valueGaugeWeight, colourWeight, + isoWeight, GaugeWeight.coord, expI_inv_eq_star, expI_inv_coe] + +/-- The `barQ` components carry the quark-doublet weight itself. -/ +lemma repGauge_gaugeTorusGen_barQComponent (t : Fin 4) (i : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (j : Fin 2 × Fin 3 × Fin 2) : + repGauge (gaugeTorusGen t) (h.barQComponent i l j) + = ((expI : ℂ) ^ GaugeWeight.coord (QuarkDoublet.valueGaugeWeight j) t) • + h.barQComponent i l j := by + rw [h.rep_barQComponent] + obtain ⟨k, c, w⟩ := j + fin_cases t <;> fin_cases c <;> fin_cases w <;> + simp [gaugeTorusGen, GaugeGroupI.toU1, GaugeGroupI.toSU3, GaugeGroupI.toSU2, + su3ExpIOne_inv_coe, su3ExpITwo_inv_coe, su2ExpI_inv_coe, Fin.sum_univ_three, + Fin.sum_univ_two, Matrix.diagonal, QuarkDoublet.valueGaugeWeight, colourWeight, + isoWeight, GaugeWeight.coord, expI_inv_eq_star, expI_inv_coe] + +/-- The `L` components carry the negative of the lepton-doublet weight. -/ +lemma repGauge_gaugeTorusGen_LComponent (t : Fin 4) (i : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (j : Fin 2 × Fin 2) : + repGauge (gaugeTorusGen t) (h.LComponent i l j) + = ((expI : ℂ) ^ GaugeWeight.coord (-(LeptonDoublet.valueGaugeWeight j)) t) • + h.LComponent i l j := by + rw [h.rep_LComponent] + obtain ⟨k, w⟩ := j + fin_cases t <;> fin_cases w <;> + simp [gaugeTorusGen, GaugeGroupI.toU1, GaugeGroupI.toSU2, su2ExpI_inv_coe, + Fin.sum_univ_two, LeptonDoublet.valueGaugeWeight, isoWeight, + GaugeWeight.coord, expI_inv_eq_star, expI_inv_coe] <;> + (try congr 1) + +/-- The `barL` components carry the lepton-doublet weight itself. -/ +lemma repGauge_gaugeTorusGen_barLComponent (t : Fin 4) (i : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (j : Fin 2 × Fin 2) : + repGauge (gaugeTorusGen t) (h.barLComponent i l j) + = ((expI : ℂ) ^ GaugeWeight.coord (LeptonDoublet.valueGaugeWeight j) t) • + h.barLComponent i l j := by + rw [h.rep_barLComponent] + obtain ⟨k, w⟩ := j + fin_cases t <;> fin_cases w <;> + simp [gaugeTorusGen, GaugeGroupI.toU1, GaugeGroupI.toSU2, su2ExpI_inv_coe, + Fin.sum_univ_two, LeptonDoublet.valueGaugeWeight, isoWeight, + GaugeWeight.coord, expI_inv_eq_star, expI_inv_coe, + starRingEnd_expI_pow] <;> + (try congr 1) + +/-- The `e` components carry the negative of the lepton-singlet weight. -/ +lemma repGauge_gaugeTorusGen_eComponent (t : Fin 4) (i : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (j : Fin 2) : + repGauge (gaugeTorusGen t) (h.eComponent i l j) + = ((expI : ℂ) ^ GaugeWeight.coord (-(LeptonSinglet.valueGaugeWeight j)) t) • + h.eComponent i l j := by + rw [h.rep_eComponent] + fin_cases t <;> + simp [gaugeTorusGen, GaugeGroupI.toU1, LeptonSinglet.valueGaugeWeight, + GaugeWeight.coord, expI_inv_coe] + (try congr 1) + +/-- The `bare` components carry the lepton-singlet weight itself. -/ +lemma repGauge_gaugeTorusGen_bareComponent (t : Fin 4) (i : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (j : Fin 2) : + repGauge (gaugeTorusGen t) (h.bareComponent i l j) + = ((expI : ℂ) ^ GaugeWeight.coord (LeptonSinglet.valueGaugeWeight j) t) • + h.bareComponent i l j := by + rw [h.rep_bareComponent] + fin_cases t <;> + simp [gaugeTorusGen, GaugeGroupI.toU1, LeptonSinglet.valueGaugeWeight, + GaugeWeight.coord, expI_inv_coe, starRingEnd_expI_pow] + (try congr 1) + +end IsFermionSector + +end StandardModel diff --git a/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/KineticFamilies.lean b/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/KineticFamilies.lean new file mode 100644 index 000000000..4bf18804b --- /dev/null +++ b/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/KineticFamilies.lean @@ -0,0 +1,829 @@ +/- +Copyright (c) 2026 Joseph Tooby-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.MassDimLTEight +public import Physlib.Particles.StandardModel.Peeling +/-! +# The kinetic terms of the fermion sector + +The invariants of the fermion sector at mass weight eight are the kinetic terms, and this +file builds them. A kinetic term pairs a species with its own conjugate, one of the two +carrying a covariant derivative, and joins their indices in the only ways available: the +colour indices by the Kronecker delta, the isospin indices by the Kronecker delta, and the +four-vector index against the two opposite-chirality spinor indices by the conjugate Pauli +matrices. That last contraction is `ψ̄ σ̄^μ ∂_μ ψ`. + +Ten blocks arise, the five conjugate pairs each with the derivative on one factor or the +other, and they differ only in which indices their symbols carry. So the work is done once, +generically, in the shape `StandardModel.Peeling` consumes: a `KineticBlock` packages a +block together with its three classification steps — colour, isospin, Lorentz — and from +that package alone come the contraction, its invariance under both groups, and the peeling +of the block down to the line through it. The ten blocks are then ten instantiations. + +The three stages are the same three the Yukawa sector runs, in the same order, and for the +same reason: each contraction is a spectator of the ones after it. Where a block's symbols +carry no colour index — the two lepton-doublet blocks and the two lepton-singlet ones — the +colour stage is `Step.ofFixedFamily` rather than a classification, and likewise for isospin +where the symbols carry none. That keeps all ten blocks in one shape. + +The ten blocks themselves are built in `KineticTerms`, which instantiates the package. + +- A. The once-derived chiral component families +- B. The gauge laws of the components at each factor +- C. Products of two components +- D. The kinetic block package + +-/ + +@[expose] public section + +namespace StandardModel + +open Matrix MatrixGroups Lorentz ComplexConjugate + +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) + +/-! + +## A. The once-derived chiral component families + +A tower with one covariant derivative mixes into every assignment of one derivative +direction, so its Lorentz law is a sum over such assignments, with one column of the +Lorentz matrix per slot. The value index is untouched by that sum: it still moves by the +contragredient action, exactly as at zero derivatives. Composing the two gives the laws +`IsVectorDualLeftWeyl` and `IsVectorDualRightWeyl` of `MassDimLTEight`, the derivative +slot fundamental and the spinor slot dual. + +-/ + +/-- A sum over the assignments of one derivative direction is a single sum. -/ +lemma sum_deriv_one {M : Type*} [AddCommMonoid M] (f : (Fin 1 → Fin 1 ⊕ Fin 3) → M) : + ∑ p : Fin 1 → Fin 1 ⊕ Fin 3, f p = ∑ x : Fin 1 ⊕ Fin 3, f ![x] := + Fintype.sum_equiv (Equiv.funUnique (Fin 1) (Fin 1 ⊕ Fin 3)) _ _ fun p => by + congr 1 + funext i + fin_cases i + simp + +/-- The Lorentz transformation of a symbol with one covariant derivative: the derivative + slot moves by the columns of the Lorentz matrix and the value index by the + contragredient action. -/ +lemma repLorentz_symbol_deriv_one {V : Type} [AddCommGroup V] [Module ℂ V] + {rep : Representation ℂ SL(2,ℂ) V} + {X : {n : ℕ} → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B} + (hX : IsLorentzCovDerivTransforms repLorentz rep X) (Λ : SL(2,ℂ)) + (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ V) : + repLorentz Λ (X ![μ] φ) + = ∑ ν, (((SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) • X ![ν] (rep.dual Λ φ) := by + rw [hX Λ 1 ![μ] φ, sum_deriv_one] + refine Finset.sum_congr rfl fun ν _ => ?_ + congr 1 + simp + +/-- The Lorentz transformation of a component of a once-derived symbol, when the + coordinate functionals `c` are permuted by the contragredient action with coefficients + `m`. This is the once-derived form of the laws of `Components`. -/ +lemma repLorentz_component_deriv_one {V : Type} [AddCommGroup V] [Module ℂ V] + {rep : Representation ℂ SL(2,ℂ) V} + {X : {n : ℕ} → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B} + (hX : IsLorentzCovDerivTransforms repLorentz rep X) + {c : Fin 2 → Module.Dual ℂ V} {m : SL(2,ℂ) → Fin 2 → Fin 2 → ℂ} + (hc : ∀ (Λ : SL(2,ℂ)) (a : Fin 2), rep.dual Λ (c a) = ∑ β, m Λ a β • c β) + (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) (a : Fin 2) : + repLorentz Λ (X ![μ] (c a)) + = ∑ ν, ∑ β, ((((SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * m Λ a β) • X ![ν] (c β) := by + rw [repLorentz_symbol_deriv_one hX Λ μ (c a), hc] + refine Finset.sum_congr rfl fun ν _ => ?_ + rw [map_sum, Finset.smul_sum] + exact Finset.sum_congr rfl fun β _ => by rw [map_smul, smul_smul] + +/-- Every undotted component family carries a four-vector index and a dual undotted + spinor index, at one covariant derivative. -/ +lemma isVectorDualLeftWeyl_leftComp (i : LeftIdx) : + IsVectorDualLeftWeyl repLorentz (fun μ => h.leftComp ![μ] i) := by + cases i with + | bard f c => + exact fun Λ μ a => repLorentz_component_deriv_one (h.repLorentz_bard f) + (fun Λ a => DownSinglet.repLorentzGroup_conj_dual_dualBasis Λ (a, c)) Λ μ a + | baru f c => + exact fun Λ μ a => repLorentz_component_deriv_one (h.repLorentz_baru f) + (fun Λ a => UpSinglet.repLorentzGroup_conj_dual_dualBasis Λ (a, c)) Λ μ a + | Q f c s => + exact fun Λ μ a => repLorentz_component_deriv_one (h.repLorentz_Q f) + (fun Λ a => QuarkDoublet.repLorentzGroup_dual_dualBasis Λ (a, c, s)) Λ μ a + | L f s => + exact fun Λ μ a => repLorentz_component_deriv_one (h.repLorentz_L f) + (fun Λ a => LeptonDoublet.repLorentzGroup_dual_dualBasis Λ (a, s)) Λ μ a + | bare f => + exact fun Λ μ a => repLorentz_component_deriv_one (h.repLorentz_bare f) + (fun Λ a => LeptonSinglet.repLorentzGroup_conj_dual_dualBasis Λ a) Λ μ a + +/-- Every dotted component family carries a four-vector index and a dual dotted spinor + index, at one covariant derivative. -/ +lemma isVectorDualRightWeyl_rightComp (i : RightIdx) : + IsVectorDualRightWeyl repLorentz (fun μ => h.rightComp ![μ] i) := by + cases i with + | d f c => + exact fun Λ μ a => repLorentz_component_deriv_one (h.repLorentz_d f) + (fun Λ a => DownSinglet.repLorentzGroup_dual_dualBasis Λ (a, c)) Λ μ a + | u f c => + exact fun Λ μ a => repLorentz_component_deriv_one (h.repLorentz_u f) + (fun Λ a => UpSinglet.repLorentzGroup_dual_dualBasis Λ (a, c)) Λ μ a + | barQ f c s => + exact fun Λ μ a => repLorentz_component_deriv_one (h.repLorentz_barQ f) + (fun Λ a => QuarkDoublet.repLorentzGroup_conj_dual_dualBasis Λ (a, c, s)) Λ μ a + | barL f s => + exact fun Λ μ a => repLorentz_component_deriv_one (h.repLorentz_barL f) + (fun Λ a => LeptonDoublet.repLorentzGroup_conj_dual_dualBasis Λ (a, s)) Λ μ a + | e f => + exact fun Λ μ a => repLorentz_component_deriv_one (h.repLorentz_e f) + (fun Λ a => LeptonSinglet.repLorentzGroup_dual_dualBasis Λ a) Λ μ a + +/-! + +## B. The gauge laws of the components at each factor + +A gauge transformation is a triple, and each of the three index laws that classify a block +constrains one factor of it. So each of the ten symbols is read at each factor in turn: +colour moves only a colour index, isospin only an isospin index, and hypercharge is an +overall scalar whose power is the `6Y` of the species. A symbol eats a covector, so it +carries the contragredient of its value space: the unbarred species come out +anti-fundamental in colour and isospin and the barred ones fundamental, which is what makes +every conjugate pair a fundamental against an anti-fundamental. + +- B.1. The down singlet +- B.2. The conjugate down singlet +- B.3. The up singlet +- B.4. The conjugate up singlet +- B.5. The quark doublet +- B.6. The conjugate quark doublet +- B.7. The lepton doublet +- B.8. The conjugate lepton doublet +- B.9. The lepton singlet +- B.10. The conjugate lepton singlet + +-/ + +/-! + +### B.1. The down singlet + +-/ + +/-- A colour transformation moves the colour index of a down-singlet symbol by the + conjugate matrix, the index being anti-fundamental. -/ +lemma repGauge_su3_d (U : specialUnitaryGroup (Fin 3) ℂ) (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (s : Fin 2) (c : Fin 3) : + repGauge ((U, 1, 1) : GaugeGroupI) (h.dComponent f l (s, c)) + = ∑ a, conj (U.1 a c) • h.dComponent f l (s, a) := by + rw [h.rep_dComponent] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [inv_su3Elt, toSU3_su3Elt, toU1_su3Elt, su3_inv_apply] + simp + +/-- An isospin transformation fixes a down-singlet symbol, which carries no isospin. -/ +lemma repGauge_su2_d (V : specialUnitaryGroup (Fin 2) ℂ) (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (j : Fin 2 × Fin 3) : + repGauge ((1, V, 1) : GaugeGroupI) (h.dComponent f l j) + = h.dComponent f l j := by + rw [h.rep_dComponent] + simp [Matrix.one_apply] + +/-- A hypercharge transformation scales a down-singlet symbol by the square of the scalar, + the down singlet carrying `6Y = 2`. -/ +lemma repGauge_u1_d (t : unitary ℂ) (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (j : Fin 2 × Fin 3) : + repGauge ((1, 1, t) : GaugeGroupI) (h.dComponent f l j) + = (t : ℂ) ^ 2 • h.dComponent f l j := by + rw [h.rep_dComponent] + simp [Matrix.one_apply, unitary_inv_coe] + +/-! + +### B.2. The conjugate down singlet + +-/ + +/-- A colour transformation moves the colour index of a conjugate down-singlet symbol by + the matrix itself, the index being fundamental. -/ +lemma repGauge_su3_bard (U : specialUnitaryGroup (Fin 3) ℂ) (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (s : Fin 2) (c : Fin 3) : + repGauge ((U, 1, 1) : GaugeGroupI) (h.bardComponent f l (s, c)) + = ∑ a, U.1 a c • h.bardComponent f l (s, a) := by + rw [h.rep_bardComponent] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [inv_su3Elt, toSU3_su3Elt, toU1_su3Elt, su3_inv_apply] + simp + +/-- An isospin transformation fixes a conjugate down-singlet symbol. -/ +lemma repGauge_su2_bard (V : specialUnitaryGroup (Fin 2) ℂ) (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (j : Fin 2 × Fin 3) : + repGauge ((1, V, 1) : GaugeGroupI) (h.bardComponent f l j) + = h.bardComponent f l j := by + rw [h.rep_bardComponent] + simp [Matrix.one_apply] + +/-- A hypercharge transformation scales a conjugate down-singlet symbol by the square of + the conjugate scalar, the conjugate down singlet carrying `6Y = -2`. -/ +lemma repGauge_u1_bard (t : unitary ℂ) (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (j : Fin 2 × Fin 3) : + repGauge ((1, 1, t) : GaugeGroupI) (h.bardComponent f l j) + = (star (t : ℂ)) ^ 2 • h.bardComponent f l j := by + rw [h.rep_bardComponent] + simp [Matrix.one_apply, unitary_inv_coe, apply_ite (starRingEnd ℂ)] + +/-! + +### B.3. The up singlet + +-/ + +/-- A colour transformation moves the colour index of an up-singlet symbol by the + conjugate matrix, the index being anti-fundamental. -/ +lemma repGauge_su3_u (U : specialUnitaryGroup (Fin 3) ℂ) (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (s : Fin 2) (c : Fin 3) : + repGauge ((U, 1, 1) : GaugeGroupI) (h.uComponent f l (s, c)) + = ∑ a, conj (U.1 a c) • h.uComponent f l (s, a) := by + rw [h.rep_uComponent] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [inv_su3Elt, toSU3_su3Elt, toU1_su3Elt, su3_inv_apply] + simp + +/-- An isospin transformation fixes an up-singlet symbol. -/ +lemma repGauge_su2_u (V : specialUnitaryGroup (Fin 2) ℂ) (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (j : Fin 2 × Fin 3) : + repGauge ((1, V, 1) : GaugeGroupI) (h.uComponent f l j) + = h.uComponent f l j := by + rw [h.rep_uComponent] + simp [Matrix.one_apply] + +/-- A hypercharge transformation scales an up-singlet symbol by the fourth power of the + conjugate scalar, the up singlet carrying `6Y = -4`. -/ +lemma repGauge_u1_u (t : unitary ℂ) (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (j : Fin 2 × Fin 3) : + repGauge ((1, 1, t) : GaugeGroupI) (h.uComponent f l j) + = (star (t : ℂ)) ^ 4 • h.uComponent f l j := by + rw [h.rep_uComponent] + simp [Matrix.one_apply, unitary_inv_coe] + +/-! + +### B.4. The conjugate up singlet + +-/ + +/-- A colour transformation moves the colour index of a conjugate up-singlet symbol by the + matrix itself, the index being fundamental. -/ +lemma repGauge_su3_baru (U : specialUnitaryGroup (Fin 3) ℂ) (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (s : Fin 2) (c : Fin 3) : + repGauge ((U, 1, 1) : GaugeGroupI) (h.baruComponent f l (s, c)) + = ∑ a, U.1 a c • h.baruComponent f l (s, a) := by + rw [h.rep_baruComponent] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [inv_su3Elt, toSU3_su3Elt, toU1_su3Elt, su3_inv_apply] + simp + +/-- An isospin transformation fixes a conjugate up-singlet symbol. -/ +lemma repGauge_su2_baru (V : specialUnitaryGroup (Fin 2) ℂ) (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (j : Fin 2 × Fin 3) : + repGauge ((1, V, 1) : GaugeGroupI) (h.baruComponent f l j) + = h.baruComponent f l j := by + rw [h.rep_baruComponent] + simp [Matrix.one_apply] + +/-- A hypercharge transformation scales a conjugate up-singlet symbol by the fourth power + of the scalar, the conjugate up singlet carrying `6Y = 4`. -/ +lemma repGauge_u1_baru (t : unitary ℂ) (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (j : Fin 2 × Fin 3) : + repGauge ((1, 1, t) : GaugeGroupI) (h.baruComponent f l j) + = (t : ℂ) ^ 4 • h.baruComponent f l j := by + rw [h.rep_baruComponent] + simp [Matrix.one_apply, unitary_inv_coe, apply_ite (starRingEnd ℂ)] + +/-! + +### B.5. The quark doublet + +-/ + +/-- A colour transformation moves the colour index of a quark-doublet symbol by the + conjugate matrix, the index being anti-fundamental. -/ +lemma repGauge_su3_Q (U : specialUnitaryGroup (Fin 3) ℂ) (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (s : Fin 2) (c : Fin 3) (w : Fin 2) : + repGauge ((U, 1, 1) : GaugeGroupI) (h.QComponent f l (s, c, w)) + = ∑ a, conj (U.1 a c) • h.QComponent f l (s, a, w) := by + rw [h.rep_QComponent] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [Fin.sum_univ_two, inv_su3Elt, toSU3_su3Elt, toU1_su3Elt, toSU2_su3Elt] + fin_cases w <;> simp [su3_inv_apply] + +/-- An isospin transformation moves the isospin index of a quark-doublet symbol by the + conjugate matrix, the index being anti-fundamental. -/ +lemma repGauge_su2_Q (V : specialUnitaryGroup (Fin 2) ℂ) (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (s : Fin 2) (c : Fin 3) (w : Fin 2) : + repGauge ((1, V, 1) : GaugeGroupI) (h.QComponent f l (s, c, w)) + = ∑ a, conj (V.1 a w) • h.QComponent f l (s, c, a) := by + rw [h.rep_QComponent, Finset.sum_comm] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [Fin.sum_univ_three, inv_su2Elt, toSU2_su2Elt, toU1_su2Elt, toSU3_su2Elt] + fin_cases c <;> simp [su2_inv_apply] + +/-- A hypercharge transformation scales a quark-doublet symbol by the conjugate scalar, + the quark doublet carrying `6Y = -1`. -/ +lemma repGauge_u1_Q (t : unitary ℂ) (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (s : Fin 2) (c : Fin 3) (w : Fin 2) : + repGauge ((1, 1, t) : GaugeGroupI) (h.QComponent f l (s, c, w)) + = star (t : ℂ) • h.QComponent f l (s, c, w) := by + rw [h.rep_QComponent] + fin_cases w <;> simp [Matrix.one_apply, unitary_inv_coe] + +/-! + +### B.6. The conjugate quark doublet + +-/ + +/-- A colour transformation moves the colour index of a conjugate quark-doublet symbol by + the matrix itself, the index being fundamental. -/ +lemma repGauge_su3_barQ (U : specialUnitaryGroup (Fin 3) ℂ) (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (s : Fin 2) (c : Fin 3) (w : Fin 2) : + repGauge ((U, 1, 1) : GaugeGroupI) (h.barQComponent f l (s, c, w)) + = ∑ a, U.1 a c • h.barQComponent f l (s, a, w) := by + rw [h.rep_barQComponent] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [Fin.sum_univ_two] + rw [inv_su3Elt, toSU3_su3Elt, toU1_su3Elt, toSU2_su3Elt] + fin_cases w <;> simp [su3_inv_apply] + +/-- An isospin transformation moves the isospin index of a conjugate quark-doublet symbol + by the matrix itself, the index being fundamental. -/ +lemma repGauge_su2_barQ (V : specialUnitaryGroup (Fin 2) ℂ) (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (s : Fin 2) (c : Fin 3) (w : Fin 2) : + repGauge ((1, V, 1) : GaugeGroupI) (h.barQComponent f l (s, c, w)) + = ∑ a, V.1 a w • h.barQComponent f l (s, c, a) := by + rw [h.rep_barQComponent, Finset.sum_comm] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [Fin.sum_univ_three, inv_su2Elt, toSU2_su2Elt, toU1_su2Elt, toSU3_su2Elt] + fin_cases c <;> simp [su2_inv_apply] + +/-- A hypercharge transformation scales a conjugate quark-doublet symbol by the scalar, + the conjugate quark doublet carrying `6Y = 1`. -/ +lemma repGauge_u1_barQ (t : unitary ℂ) (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (s : Fin 2) (c : Fin 3) (w : Fin 2) : + repGauge ((1, 1, t) : GaugeGroupI) (h.barQComponent f l (s, c, w)) + = (t : ℂ) • h.barQComponent f l (s, c, w) := by + rw [h.rep_barQComponent] + fin_cases w <;> + simp [Matrix.one_apply, unitary_inv_coe, apply_ite (starRingEnd ℂ)] + +/-! + +### B.7. The lepton doublet + +-/ + +/-- A colour transformation fixes a lepton-doublet symbol, which carries no colour. -/ +lemma repGauge_su3_L (U : specialUnitaryGroup (Fin 3) ℂ) (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (j : Fin 2 × Fin 2) : + repGauge ((U, 1, 1) : GaugeGroupI) (h.LComponent f l j) + = h.LComponent f l j := by + rw [h.rep_LComponent] + simp [Matrix.one_apply] + +/-- An isospin transformation moves the isospin index of a lepton-doublet symbol by the + conjugate matrix, the index being anti-fundamental. -/ +lemma repGauge_su2_L (V : specialUnitaryGroup (Fin 2) ℂ) (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (s w : Fin 2) : + repGauge ((1, V, 1) : GaugeGroupI) (h.LComponent f l (s, w)) + = ∑ a, conj (V.1 a w) • h.LComponent f l (s, a) := by + rw [h.rep_LComponent] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [inv_su2Elt, toSU2_su2Elt, toU1_su2Elt, su2_inv_apply] + simp + +/-- A hypercharge transformation scales a lepton-doublet symbol by the cube of the scalar, + the lepton doublet carrying `6Y = 3`. -/ +lemma repGauge_u1_L (t : unitary ℂ) (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (j : Fin 2 × Fin 2) : + repGauge ((1, 1, t) : GaugeGroupI) (h.LComponent f l j) + = (t : ℂ) ^ 3 • h.LComponent f l j := by + rw [h.rep_LComponent] + simp [Matrix.one_apply, unitary_inv_coe] + +/-! + +### B.8. The conjugate lepton doublet + +-/ + +/-- A colour transformation fixes a conjugate lepton-doublet symbol, which carries no + colour. -/ +lemma repGauge_su3_barL (U : specialUnitaryGroup (Fin 3) ℂ) (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (j : Fin 2 × Fin 2) : + repGauge ((U, 1, 1) : GaugeGroupI) (h.barLComponent f l j) + = h.barLComponent f l j := by + rw [h.rep_barLComponent] + simp [Matrix.one_apply] + +/-- An isospin transformation moves the isospin index of a conjugate lepton-doublet symbol + by the matrix itself, the index being fundamental. -/ +lemma repGauge_su2_barL (V : specialUnitaryGroup (Fin 2) ℂ) (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (s w : Fin 2) : + repGauge ((1, V, 1) : GaugeGroupI) (h.barLComponent f l (s, w)) + = ∑ a, V.1 a w • h.barLComponent f l (s, a) := by + rw [h.rep_barLComponent] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [inv_su2Elt, toSU2_su2Elt, toU1_su2Elt, su2_inv_apply] + simp + +/-- A hypercharge transformation scales a conjugate lepton-doublet symbol by the cube of + the conjugate scalar, the conjugate lepton doublet carrying `6Y = -3`. -/ +lemma repGauge_u1_barL (t : unitary ℂ) (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (s w : Fin 2) : + repGauge ((1, 1, t) : GaugeGroupI) (h.barLComponent f l (s, w)) + = (star (t : ℂ)) ^ 3 • h.barLComponent f l (s, w) := by + rw [h.rep_barLComponent] + fin_cases w <;> + simp [Matrix.one_apply, unitary_inv_coe, apply_ite (starRingEnd ℂ)] + +/-! + +### B.9. The lepton singlet + +-/ + +/-- A colour transformation fixes a lepton-singlet symbol. -/ +lemma repGauge_su3_e (U : specialUnitaryGroup (Fin 3) ℂ) (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (s : Fin 2) : + repGauge ((U, 1, 1) : GaugeGroupI) (h.eComponent f l s) + = h.eComponent f l s := by + rw [h.rep_eComponent] + simp + +/-- An isospin transformation fixes a lepton-singlet symbol. -/ +lemma repGauge_su2_e (V : specialUnitaryGroup (Fin 2) ℂ) (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (s : Fin 2) : + repGauge ((1, V, 1) : GaugeGroupI) (h.eComponent f l s) + = h.eComponent f l s := by + rw [h.rep_eComponent] + simp + +/-- A hypercharge transformation scales a lepton-singlet symbol by the sixth power of the + scalar, the lepton singlet carrying `6Y = 6`. -/ +lemma repGauge_u1_e (t : unitary ℂ) (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (s : Fin 2) : + repGauge ((1, 1, t) : GaugeGroupI) (h.eComponent f l s) + = (t : ℂ) ^ 6 • h.eComponent f l s := by + rw [h.rep_eComponent] + simp [unitary_inv_coe] + +/-! + +### B.10. The conjugate lepton singlet + +-/ + +/-- A colour transformation fixes a conjugate lepton-singlet symbol. -/ +lemma repGauge_su3_bare (U : specialUnitaryGroup (Fin 3) ℂ) (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (s : Fin 2) : + repGauge ((U, 1, 1) : GaugeGroupI) (h.bareComponent f l s) + = h.bareComponent f l s := by + rw [h.rep_bareComponent] + simp + +/-- An isospin transformation fixes a conjugate lepton-singlet symbol. -/ +lemma repGauge_su2_bare (V : specialUnitaryGroup (Fin 2) ℂ) (f : Fin 3) {n : ℕ} + (l : Fin n → Fin 1 ⊕ Fin 3) (s : Fin 2) : + repGauge ((1, V, 1) : GaugeGroupI) (h.bareComponent f l s) + = h.bareComponent f l s := by + rw [h.rep_bareComponent] + simp + +/-- A hypercharge transformation scales a conjugate lepton-singlet symbol by the sixth + power of the conjugate scalar, the conjugate lepton singlet carrying `6Y = -6`. -/ +lemma repGauge_u1_bare (t : unitary ℂ) (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (s : Fin 2) : + repGauge ((1, 1, t) : GaugeGroupI) (h.bareComponent f l s) + = (star (t : ℂ)) ^ 6 • h.bareComponent f l s := by + rw [h.rep_bareComponent] + simp [unitary_inv_coe] + +/-! + +## C. Products of two components + +A block is a product of two components, and each of its index laws comes from the laws of +the two factors: the representation respects multiplication, so the two transform +independently and their coefficients multiply. Which slot of the classifier a factor +occupies is decided by its variance, the fundamental one going first, so each law comes in +two arrangements according to which factor is the barred one. + +-/ + +/-- A product of a component with a fundamental colour index and one with an + anti-fundamental colour index carries one colour index of each kind. -/ +lemma isSU3FunAntiFun_mul + (hmul : ∀ (g : GaugeGroupI) (b₁ b₂ : B), + repGauge g (b₁ * b₂) = repGauge g b₁ * repGauge g b₂) + {A C : Fin 3 → B} + (hA : ∀ (U : specialUnitaryGroup (Fin 3) ℂ) (c : Fin 3), + repGauge ((U, 1, 1) : GaugeGroupI) (A c) = ∑ a, U.1 a c • A a) + (hC : ∀ (U : specialUnitaryGroup (Fin 3) ℂ) (c : Fin 3), + repGauge ((U, 1, 1) : GaugeGroupI) (C c) = ∑ a, conj (U.1 a c) • C a) : + IsSU3FunAntiFun B repGauge (fun l : Fin 2 → Fin 3 => A (l 0) * C (l 1)) where + repGauge_T U l := by + rw [hmul, hA, hC, Finset.sum_mul_sum, IsSU3FunAntiFun.sum_pi_two] + simp only [Matrix.cons_val_zero, Matrix.cons_val_one] + exact Finset.sum_congr rfl fun x _ => Finset.sum_congr rfl fun y _ => + smul_mul_smul_comm _ _ _ _ + +/-- The same with the two factors exchanged, the anti-fundamental one first. -/ +lemma isSU3FunAntiFun_mul_swap + (hmul : ∀ (g : GaugeGroupI) (b₁ b₂ : B), + repGauge g (b₁ * b₂) = repGauge g b₁ * repGauge g b₂) + {A C : Fin 3 → B} + (hA : ∀ (U : specialUnitaryGroup (Fin 3) ℂ) (c : Fin 3), + repGauge ((U, 1, 1) : GaugeGroupI) (A c) = ∑ a, conj (U.1 a c) • A a) + (hC : ∀ (U : specialUnitaryGroup (Fin 3) ℂ) (c : Fin 3), + repGauge ((U, 1, 1) : GaugeGroupI) (C c) = ∑ a, U.1 a c • C a) : + IsSU3FunAntiFun B repGauge (fun l : Fin 2 → Fin 3 => A (l 1) * C (l 0)) where + repGauge_T U l := by + rw [hmul, hA, hC, Finset.sum_mul_sum, IsSU3FunAntiFun.sum_pi_two, Finset.sum_comm] + simp only [Matrix.cons_val_zero, Matrix.cons_val_one] + refine Finset.sum_congr rfl fun x _ => Finset.sum_congr rfl fun y _ => ?_ + rw [smul_mul_smul_comm, mul_comm] + +/-- A product of a component with a fundamental isospin index and one with an + anti-fundamental isospin index carries one isospin index of each kind. -/ +lemma isSU2FunAntiFun_mul + (hmul : ∀ (g : GaugeGroupI) (b₁ b₂ : B), + repGauge g (b₁ * b₂) = repGauge g b₁ * repGauge g b₂) + {A C : Fin 2 → B} + (hA : ∀ (V : specialUnitaryGroup (Fin 2) ℂ) (w : Fin 2), + repGauge ((1, V, 1) : GaugeGroupI) (A w) = ∑ a, V.1 a w • A a) + (hC : ∀ (V : specialUnitaryGroup (Fin 2) ℂ) (w : Fin 2), + repGauge ((1, V, 1) : GaugeGroupI) (C w) = ∑ a, conj (V.1 a w) • C a) : + IsSU2FunAntiFun B repGauge (fun l : Fin 2 → Fin 2 => A (l 0) * C (l 1)) where + repGauge_T V l := by + rw [hmul, hA, hC, Finset.sum_mul_sum, IsSU2BiFundamental.sum_pi_two] + simp only [Matrix.cons_val_zero, Matrix.cons_val_one] + exact Finset.sum_congr rfl fun x _ => Finset.sum_congr rfl fun y _ => + smul_mul_smul_comm _ _ _ _ + +/-- The same with the two factors exchanged, the anti-fundamental one first. -/ +lemma isSU2FunAntiFun_mul_swap + (hmul : ∀ (g : GaugeGroupI) (b₁ b₂ : B), + repGauge g (b₁ * b₂) = repGauge g b₁ * repGauge g b₂) + {A C : Fin 2 → B} + (hA : ∀ (V : specialUnitaryGroup (Fin 2) ℂ) (w : Fin 2), + repGauge ((1, V, 1) : GaugeGroupI) (A w) = ∑ a, conj (V.1 a w) • A a) + (hC : ∀ (V : specialUnitaryGroup (Fin 2) ℂ) (w : Fin 2), + repGauge ((1, V, 1) : GaugeGroupI) (C w) = ∑ a, V.1 a w • C a) : + IsSU2FunAntiFun B repGauge (fun l : Fin 2 → Fin 2 => A (l 1) * C (l 0)) where + repGauge_T V l := by + rw [hmul, hA, hC, Finset.sum_mul_sum, IsSU2BiFundamental.sum_pi_two, Finset.sum_comm] + simp only [Matrix.cons_val_zero, Matrix.cons_val_one] + refine Finset.sum_congr rfl fun x _ => Finset.sum_congr rfl fun y _ => ?_ + rw [smul_mul_smul_comm, mul_comm] + +/-- A product of two components that a gauge transformation fixes is fixed by it: the + form in which a block whose symbols carry no colour, or no isospin, supplies the + corresponding stage. -/ +lemma repGauge_mul_fixed + (hmul : ∀ (g : GaugeGroupI) (b₁ b₂ : B), + repGauge g (b₁ * b₂) = repGauge g b₁ * repGauge g b₂) + {g : GaugeGroupI} {a c : B} (ha : repGauge g a = a) (hc : repGauge g c = c) : + repGauge g (a * c) = a * c := by + rw [hmul, ha, hc] + +/-- A product of two components that a gauge transformation scales by reciprocal scalars + is fixed by it: the form in which the hypercharges of a species and its conjugate + cancel. -/ +lemma repGauge_mul_smul_fixed + (hmul : ∀ (g : GaugeGroupI) (b₁ b₂ : B), + repGauge g (b₁ * b₂) = repGauge g b₁ * repGauge g b₂) + {g : GaugeGroupI} {z z' : ℂ} {a c : B} (hz : z * z' = 1) + (ha : repGauge g a = z • a) (hc : repGauge g c = z' • c) : + repGauge g (a * c) = a * c := by + rw [hmul, ha, hc, smul_mul_smul_comm, hz, one_smul] + + + +/-- A finite sum of families carrying one four-vector index and a pair of dual + opposite-chirality Weyl indices is such a family again: the colour and isospin + contractions are Lorentz spectators. -/ +lemma isVectorDualLeftRightWeyl_sum {ι : Type} [Fintype ι] + {T : ι → (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2 → B} + (hT : ∀ i, IsVectorDualLeftRightWeyl B repLorentz (T i)) : + IsVectorDualLeftRightWeyl B repLorentz (fun p => ∑ i, T i p) where + repLorentz_T Λ μ l := by + rw [map_sum, Finset.sum_congr rfl fun i (_ : i ∈ Finset.univ) => + (hT i).repLorentz_T Λ μ l, Finset.sum_comm] + refine Finset.sum_congr rfl fun ν _ => ?_ + rw [Finset.sum_comm] + exact Finset.sum_congr rfl fun a _ => Finset.smul_sum.symm + +/-- The conjugate Pauli contraction lies in the span of the components it contracts. -/ +lemma pauliBarContraction_mem_iSup_span (T : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2 → B) : + IsVectorDualLeftRightWeyl.pauliBarContraction (T := T) ∈ ⨆ q, ℂ ∙ T q := by + rw [IsVectorDualLeftRightWeyl.pauliBarContraction] + exact Submodule.sum_mem _ fun μ _ => Submodule.sum_mem _ fun a _ => + Submodule.smul_mem _ _ + (Submodule.mem_iSup_of_mem (μ, a) (Submodule.mem_span_singleton_self _)) + +/-- A unitary scalar times its conjugate is one, in the order the hypercharge cancellation + of a species against its conjugate needs. -/ +lemma unitary_mul_star_coe (t : unitary ℂ) : (t : ℂ) * star (t : ℂ) = 1 := t.2.2 + +/-- The conjugate of a unitary scalar times itself is one. -/ +lemma unitary_star_mul_coe (t : unitary ℂ) : star (t : ℂ) * (t : ℂ) = 1 := t.2.1 + +/-! + +## D. The kinetic block package + +A kinetic block is classified in three stages, and every block runs the same three: colour, +then isospin, then Lorentz, each contraction a spectator of the ones after it. `KineticBlock` +packages a block together with the three steps, and from the package alone come the kinetic +term, its invariance under both groups, and the peeling of the block down to the line +through it. + +The colour and isospin indices of the block are listed in the order the classifiers read +them, fundamental first; a block whose symbols carry no colour, or no isospin, simply +ignores the corresponding pair and supplies `Step.ofFixedFamily` for that stage. Each step +comes with the fact that its contraction lies in the submodule it classifies, which is what +carries the invariance of one stage through the stages after it. + +-/ + +section Blocks + +variable {B : Type} [Ring B] [Algebra ℂ B] + (repGauge : Representation ℂ GaugeGroupI B) (repLorentz : Representation ℂ SL(2,ℂ) B) + +/-- One kinetic block of the fermion sector, together with the three classifications its + indices admit. The block is indexed by the derivative direction, the pair of spinor + indices in the order `(undotted, dotted)`, the pair of colour indices and the pair of + isospin indices, each pair in the order `(fundamental, anti-fundamental)`. -/ +structure KineticBlock where + /-- The components of the block. -/ + blk : (Fin 1 ⊕ Fin 3) → Fin 2 × Fin 2 → Fin 3 → Fin 3 → Fin 2 → Fin 2 → B + /-- The colour stage: at fixed derivative, spinor and isospin indices the colour pair is + classified, by the delta contraction if the block carries colour and trivially if it + does not. -/ + colourStep : ∀ (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) (w w' : Fin 2), + Step (fun U : specialUnitaryGroup (Fin 3) ℂ => repGauge (U, 1, 1)) + (⨆ n : Fin 2 → Fin 3, ℂ ∙ blk q l (n 0) (n 1) w w') + /-- The colour contraction lies in the span of the components it contracts. -/ + colourStep_mem : ∀ q l w w', (colourStep q l w w').contraction + ∈ ⨆ n : Fin 2 → Fin 3, ℂ ∙ blk q l (n 0) (n 1) w w' + /-- The isospin stage, applied to the colour contraction. -/ + isospinStep : ∀ (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2), + Step (fun V : specialUnitaryGroup (Fin 2) ℂ => repGauge (1, V, 1)) + (⨆ n : Fin 2 → Fin 2, ℂ ∙ (colourStep q l (n 0) (n 1)).contraction) + /-- The isospin contraction lies in the span of the colour contractions. -/ + isospinStep_mem : ∀ q l, (isospinStep q l).contraction + ∈ ⨆ n : Fin 2 → Fin 2, ℂ ∙ (colourStep q l (n 0) (n 1)).contraction + /-- The Lorentz stage, applied to the doubly contracted block: one four-vector index + against a dual dotted and a dual undotted spinor index. -/ + lorentzStep : Step (fun Λ : SL(2,ℂ) => repLorentz Λ) + (⨆ p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2, ℂ ∙ (isospinStep p.1 p.2).contraction) + /-- The Lorentz contraction lies in the span of the isospin contractions. -/ + lorentzStep_mem : lorentzStep.contraction + ∈ ⨆ p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2, ℂ ∙ (isospinStep p.1 p.2).contraction + /-- A hypercharge transformation fixes every component of the block, the hypercharges of + a species and its conjugate cancelling. -/ + hyper : ∀ (t : unitary ℂ) q l c c' w w', + repGauge ((1, 1, t) : GaugeGroupI) (blk q l c c' w w') = blk q l c c' w w' + +namespace KineticBlock + +variable {repGauge repLorentz} (K : KineticBlock repGauge repLorentz) + +/-- The kinetic term of a block: the conjugate Pauli contraction of its doubly contracted + form, which is `ψ̄ σ̄^μ ∂_μ ψ` with the colour and isospin indices already joined. -/ +noncomputable def kineticTerm : B := K.lorentzStep.contraction + +/-- The join, over the derivative, spinor and isospin indices, of the colour spans of the + block: what the block submodule is peeled from. -/ +noncomputable def blockSpan : Submodule ℂ B := + ⨆ k : (Fin 1 ⊕ Fin 3) × (Fin 2 × Fin 2) × (Fin 2 × Fin 2), + ⨆ n : Fin 2 → Fin 3, ℂ ∙ K.blk k.1 k.2.1 (n 0) (n 1) k.2.2.1 k.2.2.2 + +/-- The three stages in sequence: the block span peels to the line through the kinetic + term. -/ +lemma peels : + Peels (gaugeLorentzMaps repGauge repLorentz) K.blockSpan (ℂ ∙ K.kineticTerm) := by + rw [blockSpan, kineticTerm] + have hc := Peels.iSup_step (σ := fun U : specialUnitaryGroup (Fin 3) ℂ => + repGauge ((U, 1, 1) : GaugeGroupI)) + (V := fun k : (Fin 1 ⊕ Fin 3) × (Fin 2 × Fin 2) × (Fin 2 × Fin 2) => + ⨆ n : Fin 2 → Fin 3, ℂ ∙ K.blk k.1 k.2.1 (n 0) (n 1) k.2.2.1 k.2.2.2) + fun k => K.colourStep k.1 k.2.1 k.2.2.1 k.2.2.2 + have hi := Peels.iSup_step (σ := fun V : specialUnitaryGroup (Fin 2) ℂ => + repGauge ((1, V, 1) : GaugeGroupI)) + (V := fun p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2 => + ⨆ n : Fin 2 → Fin 2, ℂ ∙ (K.colourStep p.1 p.2 (n 0) (n 1)).contraction) + fun p => K.isospinStep p.1 p.2 + have h1 := Peels.ofSU3 (repLorentz := repLorentz) hc + have h2 := Peels.ofSU2 (repLorentz := repLorentz) hi + have h3 := Peels.ofLorentz (repGauge := repGauge) K.lorentzStep.peels + refine (h1.mono_right ?_).trans (h2.trans h3) + refine iSup_le fun k => le_iSup_of_le (k.1, k.2.1) (le_iSup_of_le ![k.2.2.1, k.2.2.2] ?_) + simp + +/-- The kinetic term lies in any submodule containing every component of the block: each + contraction lies in the span of the objects of the stage before it. -/ +lemma kineticTerm_mem {V : Submodule ℂ B} + (hV : ∀ q l c c' w w', K.blk q l c c' w w' ∈ V) : K.kineticTerm ∈ V := by + have hcol : ∀ q l w w', (K.colourStep q l w w').contraction ∈ V := fun q l w w' => + (iSup_le fun n => (Submodule.span_singleton_le_iff_mem _ _).2 (hV _ _ _ _ _ _)) + (K.colourStep_mem q l w w') + have hiso : ∀ q l, (K.isospinStep q l).contraction ∈ V := fun q l => + (iSup_le fun n => (Submodule.span_singleton_le_iff_mem _ _).2 (hcol _ _ _ _)) + (K.isospinStep_mem q l) + exact (iSup_le fun p => (Submodule.span_singleton_le_iff_mem _ _).2 (hiso _ _)) + K.lorentzStep_mem + +/-- The kinetic term is fixed by the colour factor: the colour contractions are, and every + later stage stays inside their span. -/ +lemma repGauge_su3_kineticTerm (U : specialUnitaryGroup (Fin 3) ℂ) : + repGauge ((U, 1, 1) : GaugeGroupI) K.kineticTerm = K.kineticTerm := by + have hiso : ∀ p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2, ∀ U', + repGauge ((U', 1, 1) : GaugeGroupI) (K.isospinStep p.1 p.2).contraction + = (K.isospinStep p.1 p.2).contraction := fun p U' => + isFixedBy_iSup_span_singleton + (fun n U'' => (K.colourStep p.1 p.2 (n 0) (n 1)).contraction_fixed U'') U' _ + (K.isospinStep_mem p.1 p.2) + exact isFixedBy_iSup_span_singleton (fun p U' => hiso p U') U _ K.lorentzStep_mem + +/-- The kinetic term is fixed by the isospin factor. -/ +lemma repGauge_su2_kineticTerm (V : specialUnitaryGroup (Fin 2) ℂ) : + repGauge ((1, V, 1) : GaugeGroupI) K.kineticTerm = K.kineticTerm := + isFixedBy_iSup_span_singleton + (fun p V' => (K.isospinStep p.1 p.2).contraction_fixed V') V _ K.lorentzStep_mem + +/-- The kinetic term is fixed by the hypercharge factor, the hypercharges of a species and + its conjugate cancelling on every component of the block. -/ +lemma repGauge_u1_kineticTerm (t : unitary ℂ) : + repGauge ((1, 1, t) : GaugeGroupI) K.kineticTerm = K.kineticTerm := by + have hcol : ∀ q l w w', ∀ t' : unitary ℂ, + repGauge ((1, 1, t') : GaugeGroupI) (K.colourStep q l w w').contraction + = (K.colourStep q l w w').contraction := fun q l w w' t' => + isFixedBy_iSup_span_singleton (fun n t'' => K.hyper t'' q l (n 0) (n 1) w w') t' _ + (K.colourStep_mem q l w w') + have hiso : ∀ p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2, ∀ t' : unitary ℂ, + repGauge ((1, 1, t') : GaugeGroupI) (K.isospinStep p.1 p.2).contraction + = (K.isospinStep p.1 p.2).contraction := fun p t' => + isFixedBy_iSup_span_singleton (fun n t'' => hcol p.1 p.2 (n 0) (n 1) t'') t' _ + (K.isospinStep_mem p.1 p.2) + exact isFixedBy_iSup_span_singleton (fun p t' => hiso p t') t _ K.lorentzStep_mem + +/-- The kinetic term is gauge invariant: a gauge transformation is the product of its + colour, isospin and hypercharge parts, and each fixes it. -/ +lemma repGauge_kineticTerm (g : GaugeGroupI) : repGauge g K.kineticTerm = K.kineticTerm := + forall_repGauge_eq_self K.repGauge_su3_kineticTerm K.repGauge_su2_kineticTerm + K.repGauge_u1_kineticTerm g + +/-- The kinetic term is Lorentz invariant, being the conjugate Pauli contraction of a + vector dual left-right Weyl family. -/ +lemma repLorentz_kineticTerm (Λ : SL(2,ℂ)) : + repLorentz Λ K.kineticTerm = K.kineticTerm := K.lorentzStep.contraction_fixed Λ + +end KineticBlock + +end Blocks + +end IsFermionSector + +end StandardModel diff --git a/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/KineticTerms.lean b/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/KineticTerms.lean new file mode 100644 index 000000000..939cf8531 --- /dev/null +++ b/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/KineticTerms.lean @@ -0,0 +1,1016 @@ +/- +Copyright (c) 2026 Joseph Tooby-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.KineticFamilies +/-! +# The ten kinetic blocks + +The five conjugate pairs of the fermion sector, each with the covariant derivative on one +factor or the other, give ten blocks at mass weight eight, and each is packaged here as a +`KineticBlock` of `KineticFamilies`. The package does the work; what a block has to supply +is its components, the three index laws they obey, and the cancellation of the two +hypercharges. + +The blocks differ only in which indices their symbols carry. The four quark-singlet +pairings `d ∂ bard`, `bard ∂ d`, `u ∂ baru` and `baru ∂ u` run a genuine colour stage and a +trivial isospin one; the two quark-doublet pairings `Q ∂ barQ` and `barQ ∂ Q` run both; the +two lepton-doublet pairings run a trivial colour stage and a genuine isospin one; and the +two lepton-singlet pairings run neither, their two symbols carrying only hypercharge and a +spinor index between them. In every case the unbarred symbol is anti-fundamental and the +barred one fundamental, since a symbol eats a covector and so carries the contragredient of +its value space; that is what makes each conjugate pair a fundamental against an +anti-fundamental, and it is the same fact that makes the two spinor indices of a pair +opposite in chirality. + +What comes out of each block is one kinetic term per pair of generations; the join of the +ten over the nine generation pairs is the kinetic span of the sector, assembled in +`MassDimEight`. + +- A. The four quark-singlet pairings +- B. The two quark-doublet pairings +- C. The two lepton-doublet pairings +- D. The two lepton-singlet pairings + +-/ + +@[expose] public section + +namespace StandardModel + +open Matrix MatrixGroups Lorentz ComplexConjugate + +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) + +/-! + +## A. The four quark-singlet pairings + +The down and up singlets carry colour and hypercharge and nothing else, so their four +pairings run a genuine colour stage and a trivial isospin one. + +-/ + +/-- The components of the block `d ∂ bard`: an underived down-singlet symbol against a + once-derived conjugate down-singlet symbol. -/ +noncomputable def dbardBlk (f f' : Fin 3) : + (Fin 1 ⊕ Fin 3) → Fin 2 × Fin 2 → Fin 3 → Fin 3 → Fin 2 → Fin 2 → B := + fun q l c c' _ _ => h.dComponent f ![] (l.2, c') * h.bardComponent f' ![q] (l.1, c) + +/-- The two colour indices of the `d ∂ bard` block are one fundamental and one + anti-fundamental, the barred symbol supplying the fundamental one. -/ +lemma isSU3FunAntiFun_dbardBlk (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) + (w w' : Fin 2) : + IsSU3FunAntiFun B repGauge + (fun n : Fin 2 → Fin 3 => h.dbardBlk f f' q l (n 0) (n 1) w w') := + isSU3FunAntiFun_mul_swap hrepGauge_mul (fun U c => h.repGauge_su3_d U f ![] l.2 c) + (fun U c => h.repGauge_su3_bard U f' ![q] l.1 c) + +/-- An isospin transformation fixes the `d ∂ bard` block, neither symbol carrying + isospin. -/ +lemma repGauge_su2_dbardBlk (V : specialUnitaryGroup (Fin 2) ℂ) (f f' : Fin 3) + (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) (c c' w w' : _) : + repGauge ((1, V, 1) : GaugeGroupI) (h.dbardBlk f f' q l c c' w w') + = h.dbardBlk f f' q l c c' w w' := + repGauge_mul_fixed hrepGauge_mul (h.repGauge_su2_d V f ![] (l.2, c')) + (h.repGauge_su2_bard V f' ![q] (l.1, c)) + +/-- A hypercharge transformation fixes the `d ∂ bard` block, the hypercharges of a + species and its conjugate cancelling. -/ +lemma repGauge_u1_dbardBlk (t : unitary ℂ) (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) + (l : Fin 2 × Fin 2) (c c' w w' : _) : + repGauge ((1, 1, t) : GaugeGroupI) (h.dbardBlk f f' q l c c' w w') + = h.dbardBlk f f' q l c c' w w' := + repGauge_mul_smul_fixed hrepGauge_mul (by rw [← mul_pow, unitary_mul_star_coe, one_pow]) + (h.repGauge_u1_d t f ![] (l.2, c')) + (h.repGauge_u1_bard t f' ![q] (l.1, c)) + +/-- The colour stage of the `d ∂ bard` block. -/ +noncomputable def dbardColourStep (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) + (w w' : Fin 2) : + Step (fun U : specialUnitaryGroup (Fin 3) ℂ => repGauge ((U, 1, 1) : GaugeGroupI)) + (⨆ n : Fin 2 → Fin 3, ℂ ∙ h.dbardBlk f f' q l (n 0) (n 1) w w') := + Step.ofSU3FunAntiFun (h.isSU3FunAntiFun_dbardBlk f f' q l w w') + +/-- The colour contraction of the `d ∂ bard` block, written out. -/ +lemma dbardColourStep_contraction (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) + (w w' : Fin 2) : + (h.dbardColourStep f f' q l w w').contraction + = ∑ a : Fin 3, h.dbardBlk f f' q l a a w w' := rfl + +/-- The isospin stage of the `d ∂ bard` block. -/ +noncomputable def dbardIsospinStep (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) + (l : Fin 2 × Fin 2) : + Step (fun V : specialUnitaryGroup (Fin 2) ℂ => repGauge ((1, V, 1) : GaugeGroupI)) + (⨆ n : Fin 2 → Fin 2, ℂ ∙ (h.dbardColourStep f f' q l (n 0) (n 1)).contraction) := + Step.ofFixedFamily (h.dbardColourStep f f' q l 0 0).contraction (fun _ => rfl) + (fun V => isFixedBy_iSup_span_singleton + (fun n V' => h.repGauge_su2_dbardBlk V' f f' q l (n 0) (n 1) 0 0) V _ + (IsSU3FunAntiFun.deltaContraction_mem_span _)) + +/-- The doubly contracted `d ∂ bard` block carries one four-vector index and a pair of + dual opposite-chirality Weyl indices. -/ +lemma isVectorDualLeftRightWeyl_dbard (f f' : Fin 3) : + IsVectorDualLeftRightWeyl B repLorentz + (fun p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2 => + (h.dbardIsospinStep f f' p.1 p.2).contraction) := by + have hsum : ∀ p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2, + (h.dbardIsospinStep f f' p.1 p.2).contraction + = ∑ a : Fin 3, h.dbardBlk f f' p.1 p.2 a a 0 0 := fun _ => rfl + simp only [hsum] + exact isVectorDualLeftRightWeyl_sum fun a : Fin 3 => isVectorDualLeftRightWeyl_mul_swap + hrepLorentz_mul (h.isDualRightWeyl_rightComp (.d f a)) + (h.isVectorDualLeftWeyl_leftComp (.bard f' a)) + +/-- The Lorentz stage of the `d ∂ bard` block. -/ +noncomputable def dbardLorentzStep (f f' : Fin 3) : + Step (fun Λ : SL(2,ℂ) => repLorentz Λ) + (⨆ p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2, + ℂ ∙ (h.dbardIsospinStep f f' p.1 p.2).contraction) := + Step.ofVectorDualLeftRightWeyl (h.isVectorDualLeftRightWeyl_dbard f f') + +/-- The `d ∂ bard` block as a kinetic block. -/ +noncomputable def dbardKineticBlock (f f' : Fin 3) : KineticBlock repGauge repLorentz where + blk := h.dbardBlk f f' + colourStep := h.dbardColourStep f f' + colourStep_mem _ _ _ _ := IsSU3FunAntiFun.deltaContraction_mem_span _ + isospinStep := h.dbardIsospinStep f f' + isospinStep_mem _ _ := Submodule.mem_iSup_of_mem ![0, 0] (Submodule.mem_span_singleton_self _) + lorentzStep := h.dbardLorentzStep f f' + lorentzStep_mem := pauliBarContraction_mem_iSup_span _ + hyper t q l c c' w w' := h.repGauge_u1_dbardBlk t f f' q l c c' w w' + +/-- The components of the block `bard ∂ d`: an underived conjugate down-singlet symbol against a + once-derived down-singlet symbol. -/ +noncomputable def barddBlk (f f' : Fin 3) : + (Fin 1 ⊕ Fin 3) → Fin 2 × Fin 2 → Fin 3 → Fin 3 → Fin 2 → Fin 2 → B := + fun q l c c' _ _ => h.bardComponent f ![] (l.1, c) * h.dComponent f' ![q] (l.2, c') + +/-- The two colour indices of the `bard ∂ d` block are one fundamental and one + anti-fundamental, the barred symbol supplying the fundamental one. -/ +lemma isSU3FunAntiFun_barddBlk (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) + (w w' : Fin 2) : + IsSU3FunAntiFun B repGauge + (fun n : Fin 2 → Fin 3 => h.barddBlk f f' q l (n 0) (n 1) w w') := + isSU3FunAntiFun_mul hrepGauge_mul (fun U c => h.repGauge_su3_bard U f ![] l.1 c) + (fun U c => h.repGauge_su3_d U f' ![q] l.2 c) + +/-- An isospin transformation fixes the `bard ∂ d` block, neither symbol carrying + isospin. -/ +lemma repGauge_su2_barddBlk (V : specialUnitaryGroup (Fin 2) ℂ) (f f' : Fin 3) + (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) (c c' w w' : _) : + repGauge ((1, V, 1) : GaugeGroupI) (h.barddBlk f f' q l c c' w w') + = h.barddBlk f f' q l c c' w w' := + repGauge_mul_fixed hrepGauge_mul (h.repGauge_su2_bard V f ![] (l.1, c)) + (h.repGauge_su2_d V f' ![q] (l.2, c')) + +/-- A hypercharge transformation fixes the `bard ∂ d` block, the hypercharges of a + species and its conjugate cancelling. -/ +lemma repGauge_u1_barddBlk (t : unitary ℂ) (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) + (l : Fin 2 × Fin 2) (c c' w w' : _) : + repGauge ((1, 1, t) : GaugeGroupI) (h.barddBlk f f' q l c c' w w') + = h.barddBlk f f' q l c c' w w' := + repGauge_mul_smul_fixed hrepGauge_mul (by rw [← mul_pow, unitary_star_mul_coe, one_pow]) + (h.repGauge_u1_bard t f ![] (l.1, c)) + (h.repGauge_u1_d t f' ![q] (l.2, c')) + +/-- The colour stage of the `bard ∂ d` block. -/ +noncomputable def barddColourStep (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) + (w w' : Fin 2) : + Step (fun U : specialUnitaryGroup (Fin 3) ℂ => repGauge ((U, 1, 1) : GaugeGroupI)) + (⨆ n : Fin 2 → Fin 3, ℂ ∙ h.barddBlk f f' q l (n 0) (n 1) w w') := + Step.ofSU3FunAntiFun (h.isSU3FunAntiFun_barddBlk f f' q l w w') + +/-- The colour contraction of the `bard ∂ d` block, written out. -/ +lemma barddColourStep_contraction (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) + (w w' : Fin 2) : + (h.barddColourStep f f' q l w w').contraction + = ∑ a : Fin 3, h.barddBlk f f' q l a a w w' := rfl + +/-- The isospin stage of the `bard ∂ d` block. -/ +noncomputable def barddIsospinStep (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) + (l : Fin 2 × Fin 2) : + Step (fun V : specialUnitaryGroup (Fin 2) ℂ => repGauge ((1, V, 1) : GaugeGroupI)) + (⨆ n : Fin 2 → Fin 2, ℂ ∙ (h.barddColourStep f f' q l (n 0) (n 1)).contraction) := + Step.ofFixedFamily (h.barddColourStep f f' q l 0 0).contraction (fun _ => rfl) + (fun V => isFixedBy_iSup_span_singleton + (fun n V' => h.repGauge_su2_barddBlk V' f f' q l (n 0) (n 1) 0 0) V _ + (IsSU3FunAntiFun.deltaContraction_mem_span _)) + +/-- The doubly contracted `bard ∂ d` block carries one four-vector index and a pair of + dual opposite-chirality Weyl indices. -/ +lemma isVectorDualLeftRightWeyl_bardd (f f' : Fin 3) : + IsVectorDualLeftRightWeyl B repLorentz + (fun p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2 => + (h.barddIsospinStep f f' p.1 p.2).contraction) := by + have hsum : ∀ p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2, + (h.barddIsospinStep f f' p.1 p.2).contraction + = ∑ a : Fin 3, h.barddBlk f f' p.1 p.2 a a 0 0 := fun _ => rfl + simp only [hsum] + exact isVectorDualLeftRightWeyl_sum fun a : Fin 3 => isVectorDualLeftRightWeyl_mul + hrepLorentz_mul (h.isDualLeftWeyl_leftComp (.bard f a)) + (h.isVectorDualRightWeyl_rightComp (.d f' a)) + +/-- The Lorentz stage of the `bard ∂ d` block. -/ +noncomputable def barddLorentzStep (f f' : Fin 3) : + Step (fun Λ : SL(2,ℂ) => repLorentz Λ) + (⨆ p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2, + ℂ ∙ (h.barddIsospinStep f f' p.1 p.2).contraction) := + Step.ofVectorDualLeftRightWeyl (h.isVectorDualLeftRightWeyl_bardd f f') + +/-- The `bard ∂ d` block as a kinetic block. -/ +noncomputable def barddKineticBlock (f f' : Fin 3) : KineticBlock repGauge repLorentz where + blk := h.barddBlk f f' + colourStep := h.barddColourStep f f' + colourStep_mem _ _ _ _ := IsSU3FunAntiFun.deltaContraction_mem_span _ + isospinStep := h.barddIsospinStep f f' + isospinStep_mem _ _ := Submodule.mem_iSup_of_mem ![0, 0] (Submodule.mem_span_singleton_self _) + lorentzStep := h.barddLorentzStep f f' + lorentzStep_mem := pauliBarContraction_mem_iSup_span _ + hyper t q l c c' w w' := h.repGauge_u1_barddBlk t f f' q l c c' w w' + +/-- The components of the block `u ∂ baru`: an underived up-singlet symbol against a + once-derived conjugate up-singlet symbol. -/ +noncomputable def ubaruBlk (f f' : Fin 3) : + (Fin 1 ⊕ Fin 3) → Fin 2 × Fin 2 → Fin 3 → Fin 3 → Fin 2 → Fin 2 → B := + fun q l c c' _ _ => h.uComponent f ![] (l.2, c') * h.baruComponent f' ![q] (l.1, c) + +/-- The two colour indices of the `u ∂ baru` block are one fundamental and one + anti-fundamental, the barred symbol supplying the fundamental one. -/ +lemma isSU3FunAntiFun_ubaruBlk (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) + (w w' : Fin 2) : + IsSU3FunAntiFun B repGauge + (fun n : Fin 2 → Fin 3 => h.ubaruBlk f f' q l (n 0) (n 1) w w') := + isSU3FunAntiFun_mul_swap hrepGauge_mul (fun U c => h.repGauge_su3_u U f ![] l.2 c) + (fun U c => h.repGauge_su3_baru U f' ![q] l.1 c) + +/-- An isospin transformation fixes the `u ∂ baru` block, neither symbol carrying + isospin. -/ +lemma repGauge_su2_ubaruBlk (V : specialUnitaryGroup (Fin 2) ℂ) (f f' : Fin 3) + (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) (c c' w w' : _) : + repGauge ((1, V, 1) : GaugeGroupI) (h.ubaruBlk f f' q l c c' w w') + = h.ubaruBlk f f' q l c c' w w' := + repGauge_mul_fixed hrepGauge_mul (h.repGauge_su2_u V f ![] (l.2, c')) + (h.repGauge_su2_baru V f' ![q] (l.1, c)) + +/-- A hypercharge transformation fixes the `u ∂ baru` block, the hypercharges of a + species and its conjugate cancelling. -/ +lemma repGauge_u1_ubaruBlk (t : unitary ℂ) (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) + (l : Fin 2 × Fin 2) (c c' w w' : _) : + repGauge ((1, 1, t) : GaugeGroupI) (h.ubaruBlk f f' q l c c' w w') + = h.ubaruBlk f f' q l c c' w w' := + repGauge_mul_smul_fixed hrepGauge_mul (by rw [← mul_pow, unitary_star_mul_coe, one_pow]) + (h.repGauge_u1_u t f ![] (l.2, c')) + (h.repGauge_u1_baru t f' ![q] (l.1, c)) + +/-- The colour stage of the `u ∂ baru` block. -/ +noncomputable def ubaruColourStep (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) + (w w' : Fin 2) : + Step (fun U : specialUnitaryGroup (Fin 3) ℂ => repGauge ((U, 1, 1) : GaugeGroupI)) + (⨆ n : Fin 2 → Fin 3, ℂ ∙ h.ubaruBlk f f' q l (n 0) (n 1) w w') := + Step.ofSU3FunAntiFun (h.isSU3FunAntiFun_ubaruBlk f f' q l w w') + +/-- The colour contraction of the `u ∂ baru` block, written out. -/ +lemma ubaruColourStep_contraction (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) + (w w' : Fin 2) : + (h.ubaruColourStep f f' q l w w').contraction + = ∑ a : Fin 3, h.ubaruBlk f f' q l a a w w' := rfl + +/-- The isospin stage of the `u ∂ baru` block. -/ +noncomputable def ubaruIsospinStep (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) + (l : Fin 2 × Fin 2) : + Step (fun V : specialUnitaryGroup (Fin 2) ℂ => repGauge ((1, V, 1) : GaugeGroupI)) + (⨆ n : Fin 2 → Fin 2, ℂ ∙ (h.ubaruColourStep f f' q l (n 0) (n 1)).contraction) := + Step.ofFixedFamily (h.ubaruColourStep f f' q l 0 0).contraction (fun _ => rfl) + (fun V => isFixedBy_iSup_span_singleton + (fun n V' => h.repGauge_su2_ubaruBlk V' f f' q l (n 0) (n 1) 0 0) V _ + (IsSU3FunAntiFun.deltaContraction_mem_span _)) + +/-- The doubly contracted `u ∂ baru` block carries one four-vector index and a pair of + dual opposite-chirality Weyl indices. -/ +lemma isVectorDualLeftRightWeyl_ubaru (f f' : Fin 3) : + IsVectorDualLeftRightWeyl B repLorentz + (fun p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2 => + (h.ubaruIsospinStep f f' p.1 p.2).contraction) := by + have hsum : ∀ p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2, + (h.ubaruIsospinStep f f' p.1 p.2).contraction + = ∑ a : Fin 3, h.ubaruBlk f f' p.1 p.2 a a 0 0 := fun _ => rfl + simp only [hsum] + exact isVectorDualLeftRightWeyl_sum fun a : Fin 3 => isVectorDualLeftRightWeyl_mul_swap + hrepLorentz_mul (h.isDualRightWeyl_rightComp (.u f a)) + (h.isVectorDualLeftWeyl_leftComp (.baru f' a)) + +/-- The Lorentz stage of the `u ∂ baru` block. -/ +noncomputable def ubaruLorentzStep (f f' : Fin 3) : + Step (fun Λ : SL(2,ℂ) => repLorentz Λ) + (⨆ p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2, + ℂ ∙ (h.ubaruIsospinStep f f' p.1 p.2).contraction) := + Step.ofVectorDualLeftRightWeyl (h.isVectorDualLeftRightWeyl_ubaru f f') + +/-- The `u ∂ baru` block as a kinetic block. -/ +noncomputable def ubaruKineticBlock (f f' : Fin 3) : KineticBlock repGauge repLorentz where + blk := h.ubaruBlk f f' + colourStep := h.ubaruColourStep f f' + colourStep_mem _ _ _ _ := IsSU3FunAntiFun.deltaContraction_mem_span _ + isospinStep := h.ubaruIsospinStep f f' + isospinStep_mem _ _ := Submodule.mem_iSup_of_mem ![0, 0] (Submodule.mem_span_singleton_self _) + lorentzStep := h.ubaruLorentzStep f f' + lorentzStep_mem := pauliBarContraction_mem_iSup_span _ + hyper t q l c c' w w' := h.repGauge_u1_ubaruBlk t f f' q l c c' w w' + +/-- The components of the block `baru ∂ u`: an underived conjugate up-singlet symbol against a + once-derived up-singlet symbol. -/ +noncomputable def baruuBlk (f f' : Fin 3) : + (Fin 1 ⊕ Fin 3) → Fin 2 × Fin 2 → Fin 3 → Fin 3 → Fin 2 → Fin 2 → B := + fun q l c c' _ _ => h.baruComponent f ![] (l.1, c) * h.uComponent f' ![q] (l.2, c') + +/-- The two colour indices of the `baru ∂ u` block are one fundamental and one + anti-fundamental, the barred symbol supplying the fundamental one. -/ +lemma isSU3FunAntiFun_baruuBlk (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) + (w w' : Fin 2) : + IsSU3FunAntiFun B repGauge + (fun n : Fin 2 → Fin 3 => h.baruuBlk f f' q l (n 0) (n 1) w w') := + isSU3FunAntiFun_mul hrepGauge_mul (fun U c => h.repGauge_su3_baru U f ![] l.1 c) + (fun U c => h.repGauge_su3_u U f' ![q] l.2 c) + +/-- An isospin transformation fixes the `baru ∂ u` block, neither symbol carrying + isospin. -/ +lemma repGauge_su2_baruuBlk (V : specialUnitaryGroup (Fin 2) ℂ) (f f' : Fin 3) + (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) (c c' w w' : _) : + repGauge ((1, V, 1) : GaugeGroupI) (h.baruuBlk f f' q l c c' w w') + = h.baruuBlk f f' q l c c' w w' := + repGauge_mul_fixed hrepGauge_mul (h.repGauge_su2_baru V f ![] (l.1, c)) + (h.repGauge_su2_u V f' ![q] (l.2, c')) + +/-- A hypercharge transformation fixes the `baru ∂ u` block, the hypercharges of a + species and its conjugate cancelling. -/ +lemma repGauge_u1_baruuBlk (t : unitary ℂ) (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) + (l : Fin 2 × Fin 2) (c c' w w' : _) : + repGauge ((1, 1, t) : GaugeGroupI) (h.baruuBlk f f' q l c c' w w') + = h.baruuBlk f f' q l c c' w w' := + repGauge_mul_smul_fixed hrepGauge_mul (by rw [← mul_pow, unitary_mul_star_coe, one_pow]) + (h.repGauge_u1_baru t f ![] (l.1, c)) + (h.repGauge_u1_u t f' ![q] (l.2, c')) + +/-- The colour stage of the `baru ∂ u` block. -/ +noncomputable def baruuColourStep (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) + (w w' : Fin 2) : + Step (fun U : specialUnitaryGroup (Fin 3) ℂ => repGauge ((U, 1, 1) : GaugeGroupI)) + (⨆ n : Fin 2 → Fin 3, ℂ ∙ h.baruuBlk f f' q l (n 0) (n 1) w w') := + Step.ofSU3FunAntiFun (h.isSU3FunAntiFun_baruuBlk f f' q l w w') + +/-- The colour contraction of the `baru ∂ u` block, written out. -/ +lemma baruuColourStep_contraction (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) + (w w' : Fin 2) : + (h.baruuColourStep f f' q l w w').contraction + = ∑ a : Fin 3, h.baruuBlk f f' q l a a w w' := rfl + +/-- The isospin stage of the `baru ∂ u` block. -/ +noncomputable def baruuIsospinStep (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) + (l : Fin 2 × Fin 2) : + Step (fun V : specialUnitaryGroup (Fin 2) ℂ => repGauge ((1, V, 1) : GaugeGroupI)) + (⨆ n : Fin 2 → Fin 2, ℂ ∙ (h.baruuColourStep f f' q l (n 0) (n 1)).contraction) := + Step.ofFixedFamily (h.baruuColourStep f f' q l 0 0).contraction (fun _ => rfl) + (fun V => isFixedBy_iSup_span_singleton + (fun n V' => h.repGauge_su2_baruuBlk V' f f' q l (n 0) (n 1) 0 0) V _ + (IsSU3FunAntiFun.deltaContraction_mem_span _)) + +/-- The doubly contracted `baru ∂ u` block carries one four-vector index and a pair of + dual opposite-chirality Weyl indices. -/ +lemma isVectorDualLeftRightWeyl_baruu (f f' : Fin 3) : + IsVectorDualLeftRightWeyl B repLorentz + (fun p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2 => + (h.baruuIsospinStep f f' p.1 p.2).contraction) := by + have hsum : ∀ p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2, + (h.baruuIsospinStep f f' p.1 p.2).contraction + = ∑ a : Fin 3, h.baruuBlk f f' p.1 p.2 a a 0 0 := fun _ => rfl + simp only [hsum] + exact isVectorDualLeftRightWeyl_sum fun a : Fin 3 => isVectorDualLeftRightWeyl_mul + hrepLorentz_mul (h.isDualLeftWeyl_leftComp (.baru f a)) + (h.isVectorDualRightWeyl_rightComp (.u f' a)) + +/-- The Lorentz stage of the `baru ∂ u` block. -/ +noncomputable def baruuLorentzStep (f f' : Fin 3) : + Step (fun Λ : SL(2,ℂ) => repLorentz Λ) + (⨆ p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2, + ℂ ∙ (h.baruuIsospinStep f f' p.1 p.2).contraction) := + Step.ofVectorDualLeftRightWeyl (h.isVectorDualLeftRightWeyl_baruu f f') + +/-- The `baru ∂ u` block as a kinetic block. -/ +noncomputable def baruuKineticBlock (f f' : Fin 3) : KineticBlock repGauge repLorentz where + blk := h.baruuBlk f f' + colourStep := h.baruuColourStep f f' + colourStep_mem _ _ _ _ := IsSU3FunAntiFun.deltaContraction_mem_span _ + isospinStep := h.baruuIsospinStep f f' + isospinStep_mem _ _ := Submodule.mem_iSup_of_mem ![0, 0] (Submodule.mem_span_singleton_self _) + lorentzStep := h.baruuLorentzStep f f' + lorentzStep_mem := pauliBarContraction_mem_iSup_span _ + hyper t q l c c' w w' := h.repGauge_u1_baruuBlk t f f' q l c c' w w' + +/-! + +## B. The two quark-doublet pairings + +The quark doublet carries colour, isospin and hypercharge, so its two pairings are the only +blocks that run both a colour and an isospin stage. + +-/ + +/-- The components of the block `Q ∂ barQ`: an underived quark-doublet symbol against a + once-derived conjugate quark-doublet symbol. -/ +noncomputable def QbarQBlk (f f' : Fin 3) : + (Fin 1 ⊕ Fin 3) → Fin 2 × Fin 2 → Fin 3 → Fin 3 → Fin 2 → Fin 2 → B := + fun q l c c' w w' => h.QComponent f ![] (l.1, c', w') * h.barQComponent f' ![q] (l.2, c, w) + +/-- The two colour indices of the `Q ∂ barQ` block are one fundamental and one + anti-fundamental, the barred symbol supplying the fundamental one. -/ +lemma isSU3FunAntiFun_QbarQBlk (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) + (w w' : Fin 2) : + IsSU3FunAntiFun B repGauge + (fun n : Fin 2 → Fin 3 => h.QbarQBlk f f' q l (n 0) (n 1) w w') := + isSU3FunAntiFun_mul_swap hrepGauge_mul (fun U c => h.repGauge_su3_Q U f ![] l.1 c w') + (fun U c => h.repGauge_su3_barQ U f' ![q] l.2 c w) + +/-- The two isospin indices of the `Q ∂ barQ` block are one fundamental and one + anti-fundamental, the barred symbol supplying the fundamental one. -/ +lemma isSU2FunAntiFun_QbarQBlk (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) + (c c' : Fin 3) : + IsSU2FunAntiFun B repGauge + (fun n : Fin 2 → Fin 2 => h.QbarQBlk f f' q l c c' (n 0) (n 1)) := + isSU2FunAntiFun_mul_swap hrepGauge_mul (fun V w => h.repGauge_su2_Q V f ![] l.1 c' w) + (fun V w => h.repGauge_su2_barQ V f' ![q] l.2 c w) + +/-- A hypercharge transformation fixes the `Q ∂ barQ` block, the hypercharges of a + species and its conjugate cancelling. -/ +lemma repGauge_u1_QbarQBlk (t : unitary ℂ) (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) + (l : Fin 2 × Fin 2) (c c' w w' : _) : + repGauge ((1, 1, t) : GaugeGroupI) (h.QbarQBlk f f' q l c c' w w') + = h.QbarQBlk f f' q l c c' w w' := + repGauge_mul_smul_fixed hrepGauge_mul (unitary_star_mul_coe t) + (h.repGauge_u1_Q t f ![] l.1 c' w') + (h.repGauge_u1_barQ t f' ![q] l.2 c w) + +/-- The colour stage of the `Q ∂ barQ` block. -/ +noncomputable def QbarQColourStep (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) + (w w' : Fin 2) : + Step (fun U : specialUnitaryGroup (Fin 3) ℂ => repGauge ((U, 1, 1) : GaugeGroupI)) + (⨆ n : Fin 2 → Fin 3, ℂ ∙ h.QbarQBlk f f' q l (n 0) (n 1) w w') := + Step.ofSU3FunAntiFun (h.isSU3FunAntiFun_QbarQBlk f f' q l w w') + +/-- The colour contraction of the `Q ∂ barQ` block, written out. -/ +lemma QbarQColourStep_contraction (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) + (w w' : Fin 2) : + (h.QbarQColourStep f f' q l w w').contraction + = ∑ a : Fin 3, h.QbarQBlk f f' q l a a w w' := rfl + +/-- The isospin stage of the `Q ∂ barQ` block. -/ +noncomputable def QbarQIsospinStep (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) + (l : Fin 2 × Fin 2) : + Step (fun V : specialUnitaryGroup (Fin 2) ℂ => repGauge ((1, V, 1) : GaugeGroupI)) + (⨆ n : Fin 2 → Fin 2, ℂ ∙ (h.QbarQColourStep f f' q l (n 0) (n 1)).contraction) := + Step.ofSU2FunAntiFun (by + simp only [QbarQColourStep_contraction] + exact IsSU2FunAntiFun.sum fun a : Fin 3 => h.isSU2FunAntiFun_QbarQBlk f f' q l a a) + +/-- The doubly contracted `Q ∂ barQ` block carries one four-vector index and a pair of + dual opposite-chirality Weyl indices. -/ +lemma isVectorDualLeftRightWeyl_QbarQ (f f' : Fin 3) : + IsVectorDualLeftRightWeyl B repLorentz + (fun p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2 => + (h.QbarQIsospinStep f f' p.1 p.2).contraction) := by + have hsum : ∀ p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2, + (h.QbarQIsospinStep f f' p.1 p.2).contraction + = ∑ i : Fin 2 × Fin 3, h.QbarQBlk f f' p.1 p.2 i.2 i.2 i.1 i.1 := by + intro p + show (∑ a : Fin 3, h.QbarQBlk f f' p.1 p.2 a a 0 0) + + ∑ a : Fin 3, h.QbarQBlk f f' p.1 p.2 a a 1 1 = _ + rw [Fintype.sum_prod_type, Fin.sum_univ_two] + simp only [hsum] + exact isVectorDualLeftRightWeyl_sum fun i : Fin 2 × Fin 3 => isVectorDualLeftRightWeyl_mul + hrepLorentz_mul (h.isDualLeftWeyl_leftComp (.Q f i.2 i.1)) + (h.isVectorDualRightWeyl_rightComp (.barQ f' i.2 i.1)) + +/-- The Lorentz stage of the `Q ∂ barQ` block. -/ +noncomputable def QbarQLorentzStep (f f' : Fin 3) : + Step (fun Λ : SL(2,ℂ) => repLorentz Λ) + (⨆ p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2, + ℂ ∙ (h.QbarQIsospinStep f f' p.1 p.2).contraction) := + Step.ofVectorDualLeftRightWeyl (h.isVectorDualLeftRightWeyl_QbarQ f f') + +/-- The `Q ∂ barQ` block as a kinetic block. -/ +noncomputable def QbarQKineticBlock (f f' : Fin 3) : KineticBlock repGauge repLorentz where + blk := h.QbarQBlk f f' + colourStep := h.QbarQColourStep f f' + colourStep_mem _ _ _ _ := IsSU3FunAntiFun.deltaContraction_mem_span _ + isospinStep := h.QbarQIsospinStep f f' + isospinStep_mem _ _ := IsSU2FunAntiFun.deltaContraction_mem_span _ + lorentzStep := h.QbarQLorentzStep f f' + lorentzStep_mem := pauliBarContraction_mem_iSup_span _ + hyper t q l c c' w w' := h.repGauge_u1_QbarQBlk t f f' q l c c' w w' + +/-- The components of the block `barQ ∂ Q`: an underived conjugate quark-doublet symbol against a + once-derived quark-doublet symbol. -/ +noncomputable def barQQBlk (f f' : Fin 3) : + (Fin 1 ⊕ Fin 3) → Fin 2 × Fin 2 → Fin 3 → Fin 3 → Fin 2 → Fin 2 → B := + fun q l c c' w w' => h.barQComponent f ![] (l.2, c, w) * h.QComponent f' ![q] (l.1, c', w') + +/-- The two colour indices of the `barQ ∂ Q` block are one fundamental and one + anti-fundamental, the barred symbol supplying the fundamental one. -/ +lemma isSU3FunAntiFun_barQQBlk (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) + (w w' : Fin 2) : + IsSU3FunAntiFun B repGauge + (fun n : Fin 2 → Fin 3 => h.barQQBlk f f' q l (n 0) (n 1) w w') := + isSU3FunAntiFun_mul hrepGauge_mul (fun U c => h.repGauge_su3_barQ U f ![] l.2 c w) + (fun U c => h.repGauge_su3_Q U f' ![q] l.1 c w') + +/-- The two isospin indices of the `barQ ∂ Q` block are one fundamental and one + anti-fundamental, the barred symbol supplying the fundamental one. -/ +lemma isSU2FunAntiFun_barQQBlk (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) + (c c' : Fin 3) : + IsSU2FunAntiFun B repGauge + (fun n : Fin 2 → Fin 2 => h.barQQBlk f f' q l c c' (n 0) (n 1)) := + isSU2FunAntiFun_mul hrepGauge_mul (fun V w => h.repGauge_su2_barQ V f ![] l.2 c w) + (fun V w => h.repGauge_su2_Q V f' ![q] l.1 c' w) + +/-- A hypercharge transformation fixes the `barQ ∂ Q` block, the hypercharges of a + species and its conjugate cancelling. -/ +lemma repGauge_u1_barQQBlk (t : unitary ℂ) (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) + (l : Fin 2 × Fin 2) (c c' w w' : _) : + repGauge ((1, 1, t) : GaugeGroupI) (h.barQQBlk f f' q l c c' w w') + = h.barQQBlk f f' q l c c' w w' := + repGauge_mul_smul_fixed hrepGauge_mul (unitary_mul_star_coe t) + (h.repGauge_u1_barQ t f ![] l.2 c w) + (h.repGauge_u1_Q t f' ![q] l.1 c' w') + +/-- The colour stage of the `barQ ∂ Q` block. -/ +noncomputable def barQQColourStep (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) + (w w' : Fin 2) : + Step (fun U : specialUnitaryGroup (Fin 3) ℂ => repGauge ((U, 1, 1) : GaugeGroupI)) + (⨆ n : Fin 2 → Fin 3, ℂ ∙ h.barQQBlk f f' q l (n 0) (n 1) w w') := + Step.ofSU3FunAntiFun (h.isSU3FunAntiFun_barQQBlk f f' q l w w') + +/-- The colour contraction of the `barQ ∂ Q` block, written out. -/ +lemma barQQColourStep_contraction (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) + (w w' : Fin 2) : + (h.barQQColourStep f f' q l w w').contraction + = ∑ a : Fin 3, h.barQQBlk f f' q l a a w w' := rfl + +/-- The isospin stage of the `barQ ∂ Q` block. -/ +noncomputable def barQQIsospinStep (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) + (l : Fin 2 × Fin 2) : + Step (fun V : specialUnitaryGroup (Fin 2) ℂ => repGauge ((1, V, 1) : GaugeGroupI)) + (⨆ n : Fin 2 → Fin 2, ℂ ∙ (h.barQQColourStep f f' q l (n 0) (n 1)).contraction) := + Step.ofSU2FunAntiFun (by + simp only [barQQColourStep_contraction] + exact IsSU2FunAntiFun.sum fun a : Fin 3 => h.isSU2FunAntiFun_barQQBlk f f' q l a a) + +/-- The doubly contracted `barQ ∂ Q` block carries one four-vector index and a pair of + dual opposite-chirality Weyl indices. -/ +lemma isVectorDualLeftRightWeyl_barQQ (f f' : Fin 3) : + IsVectorDualLeftRightWeyl B repLorentz + (fun p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2 => + (h.barQQIsospinStep f f' p.1 p.2).contraction) := by + have hsum : ∀ p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2, + (h.barQQIsospinStep f f' p.1 p.2).contraction + = ∑ i : Fin 2 × Fin 3, h.barQQBlk f f' p.1 p.2 i.2 i.2 i.1 i.1 := by + intro p + show (∑ a : Fin 3, h.barQQBlk f f' p.1 p.2 a a 0 0) + + ∑ a : Fin 3, h.barQQBlk f f' p.1 p.2 a a 1 1 = _ + rw [Fintype.sum_prod_type, Fin.sum_univ_two] + simp only [hsum] + exact isVectorDualLeftRightWeyl_sum fun i : Fin 2 × Fin 3 => isVectorDualLeftRightWeyl_mul_swap + hrepLorentz_mul (h.isDualRightWeyl_rightComp (.barQ f i.2 i.1)) + (h.isVectorDualLeftWeyl_leftComp (.Q f' i.2 i.1)) + +/-- The Lorentz stage of the `barQ ∂ Q` block. -/ +noncomputable def barQQLorentzStep (f f' : Fin 3) : + Step (fun Λ : SL(2,ℂ) => repLorentz Λ) + (⨆ p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2, + ℂ ∙ (h.barQQIsospinStep f f' p.1 p.2).contraction) := + Step.ofVectorDualLeftRightWeyl (h.isVectorDualLeftRightWeyl_barQQ f f') + +/-- The `barQ ∂ Q` block as a kinetic block. -/ +noncomputable def barQQKineticBlock (f f' : Fin 3) : KineticBlock repGauge repLorentz where + blk := h.barQQBlk f f' + colourStep := h.barQQColourStep f f' + colourStep_mem _ _ _ _ := IsSU3FunAntiFun.deltaContraction_mem_span _ + isospinStep := h.barQQIsospinStep f f' + isospinStep_mem _ _ := IsSU2FunAntiFun.deltaContraction_mem_span _ + lorentzStep := h.barQQLorentzStep f f' + lorentzStep_mem := pauliBarContraction_mem_iSup_span _ + hyper t q l c c' w w' := h.repGauge_u1_barQQBlk t f f' q l c c' w w' + +/-! + +## C. The two lepton-doublet pairings + +The lepton doublet carries isospin and hypercharge but no colour, so its colour stage is +the trivial one. + +-/ + +/-- The components of the block `L ∂ barL`: an underived lepton-doublet symbol against a + once-derived conjugate lepton-doublet symbol. -/ +noncomputable def LbarLBlk (f f' : Fin 3) : + (Fin 1 ⊕ Fin 3) → Fin 2 × Fin 2 → Fin 3 → Fin 3 → Fin 2 → Fin 2 → B := + fun q l _ _ w w' => h.LComponent f ![] (l.1, w') * h.barLComponent f' ![q] (l.2, w) + +/-- A colour transformation fixes the `L ∂ barL` block, neither symbol carrying + colour. -/ +lemma repGauge_su3_LbarLBlk (U : specialUnitaryGroup (Fin 3) ℂ) (f f' : Fin 3) + (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) (c c' w w' : _) : + repGauge ((U, 1, 1) : GaugeGroupI) (h.LbarLBlk f f' q l c c' w w') + = h.LbarLBlk f f' q l c c' w w' := + repGauge_mul_fixed hrepGauge_mul (h.repGauge_su3_L U f ![] (l.1, w')) + (h.repGauge_su3_barL U f' ![q] (l.2, w)) + +/-- The two isospin indices of the `L ∂ barL` block are one fundamental and one + anti-fundamental, the barred symbol supplying the fundamental one. -/ +lemma isSU2FunAntiFun_LbarLBlk (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) + (c c' : Fin 3) : + IsSU2FunAntiFun B repGauge + (fun n : Fin 2 → Fin 2 => h.LbarLBlk f f' q l c c' (n 0) (n 1)) := + isSU2FunAntiFun_mul_swap hrepGauge_mul (fun V w => h.repGauge_su2_L V f ![] l.1 w) + (fun V w => h.repGauge_su2_barL V f' ![q] l.2 w) + +/-- A hypercharge transformation fixes the `L ∂ barL` block, the hypercharges of a + species and its conjugate cancelling. -/ +lemma repGauge_u1_LbarLBlk (t : unitary ℂ) (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) + (l : Fin 2 × Fin 2) (c c' w w' : _) : + repGauge ((1, 1, t) : GaugeGroupI) (h.LbarLBlk f f' q l c c' w w') + = h.LbarLBlk f f' q l c c' w w' := + repGauge_mul_smul_fixed hrepGauge_mul (by rw [← mul_pow, unitary_mul_star_coe, one_pow]) + (h.repGauge_u1_L t f ![] (l.1, w')) + (h.repGauge_u1_barL t f' ![q] l.2 w) + +/-- The colour stage of the `L ∂ barL` block. -/ +noncomputable def LbarLColourStep (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) + (w w' : Fin 2) : + Step (fun U : specialUnitaryGroup (Fin 3) ℂ => repGauge ((U, 1, 1) : GaugeGroupI)) + (⨆ n : Fin 2 → Fin 3, ℂ ∙ h.LbarLBlk f f' q l (n 0) (n 1) w w') := + Step.ofFixedFamily (h.LbarLBlk f f' q l 0 0 w w') (fun _ => rfl) + (fun U => h.repGauge_su3_LbarLBlk U f f' q l 0 0 w w') + +/-- The colour contraction of the `L ∂ barL` block, written out. -/ +lemma LbarLColourStep_contraction (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) + (w w' : Fin 2) : + (h.LbarLColourStep f f' q l w w').contraction + = h.LbarLBlk f f' q l 0 0 w w' := rfl + +/-- The isospin stage of the `L ∂ barL` block. -/ +noncomputable def LbarLIsospinStep (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) + (l : Fin 2 × Fin 2) : + Step (fun V : specialUnitaryGroup (Fin 2) ℂ => repGauge ((1, V, 1) : GaugeGroupI)) + (⨆ n : Fin 2 → Fin 2, ℂ ∙ (h.LbarLColourStep f f' q l (n 0) (n 1)).contraction) := + Step.ofSU2FunAntiFun (by + simp only [LbarLColourStep_contraction] + exact h.isSU2FunAntiFun_LbarLBlk f f' q l 0 0) + +/-- The doubly contracted `L ∂ barL` block carries one four-vector index and a pair of + dual opposite-chirality Weyl indices. -/ +lemma isVectorDualLeftRightWeyl_LbarL (f f' : Fin 3) : + IsVectorDualLeftRightWeyl B repLorentz + (fun p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2 => + (h.LbarLIsospinStep f f' p.1 p.2).contraction) := by + have hsum : ∀ p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2, + (h.LbarLIsospinStep f f' p.1 p.2).contraction + = ∑ i : Fin 2, h.LbarLBlk f f' p.1 p.2 0 0 i i := by + intro p + show h.LbarLBlk f f' p.1 p.2 0 0 0 0 + h.LbarLBlk f f' p.1 p.2 0 0 1 1 = _ + rw [Fin.sum_univ_two] + simp only [hsum] + exact isVectorDualLeftRightWeyl_sum fun i : Fin 2 => isVectorDualLeftRightWeyl_mul + hrepLorentz_mul (h.isDualLeftWeyl_leftComp (.L f i)) + (h.isVectorDualRightWeyl_rightComp (.barL f' i)) + +/-- The Lorentz stage of the `L ∂ barL` block. -/ +noncomputable def LbarLLorentzStep (f f' : Fin 3) : + Step (fun Λ : SL(2,ℂ) => repLorentz Λ) + (⨆ p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2, + ℂ ∙ (h.LbarLIsospinStep f f' p.1 p.2).contraction) := + Step.ofVectorDualLeftRightWeyl (h.isVectorDualLeftRightWeyl_LbarL f f') + +/-- The `L ∂ barL` block as a kinetic block. -/ +noncomputable def LbarLKineticBlock (f f' : Fin 3) : KineticBlock repGauge repLorentz where + blk := h.LbarLBlk f f' + colourStep := h.LbarLColourStep f f' + colourStep_mem _ _ _ _ := Submodule.mem_iSup_of_mem ![0, 0] (Submodule.mem_span_singleton_self _) + isospinStep := h.LbarLIsospinStep f f' + isospinStep_mem _ _ := IsSU2FunAntiFun.deltaContraction_mem_span _ + lorentzStep := h.LbarLLorentzStep f f' + lorentzStep_mem := pauliBarContraction_mem_iSup_span _ + hyper t q l c c' w w' := h.repGauge_u1_LbarLBlk t f f' q l c c' w w' + +/-- The components of the block `barL ∂ L`: an underived conjugate lepton-doublet symbol against a + once-derived lepton-doublet symbol. -/ +noncomputable def barLLBlk (f f' : Fin 3) : + (Fin 1 ⊕ Fin 3) → Fin 2 × Fin 2 → Fin 3 → Fin 3 → Fin 2 → Fin 2 → B := + fun q l _ _ w w' => h.barLComponent f ![] (l.2, w) * h.LComponent f' ![q] (l.1, w') + +/-- A colour transformation fixes the `barL ∂ L` block, neither symbol carrying + colour. -/ +lemma repGauge_su3_barLLBlk (U : specialUnitaryGroup (Fin 3) ℂ) (f f' : Fin 3) + (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) (c c' w w' : _) : + repGauge ((U, 1, 1) : GaugeGroupI) (h.barLLBlk f f' q l c c' w w') + = h.barLLBlk f f' q l c c' w w' := + repGauge_mul_fixed hrepGauge_mul (h.repGauge_su3_barL U f ![] (l.2, w)) + (h.repGauge_su3_L U f' ![q] (l.1, w')) + +/-- The two isospin indices of the `barL ∂ L` block are one fundamental and one + anti-fundamental, the barred symbol supplying the fundamental one. -/ +lemma isSU2FunAntiFun_barLLBlk (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) + (c c' : Fin 3) : + IsSU2FunAntiFun B repGauge + (fun n : Fin 2 → Fin 2 => h.barLLBlk f f' q l c c' (n 0) (n 1)) := + isSU2FunAntiFun_mul hrepGauge_mul (fun V w => h.repGauge_su2_barL V f ![] l.2 w) + (fun V w => h.repGauge_su2_L V f' ![q] l.1 w) + +/-- A hypercharge transformation fixes the `barL ∂ L` block, the hypercharges of a + species and its conjugate cancelling. -/ +lemma repGauge_u1_barLLBlk (t : unitary ℂ) (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) + (l : Fin 2 × Fin 2) (c c' w w' : _) : + repGauge ((1, 1, t) : GaugeGroupI) (h.barLLBlk f f' q l c c' w w') + = h.barLLBlk f f' q l c c' w w' := + repGauge_mul_smul_fixed hrepGauge_mul (by rw [← mul_pow, unitary_star_mul_coe, one_pow]) + (h.repGauge_u1_barL t f ![] l.2 w) + (h.repGauge_u1_L t f' ![q] (l.1, w')) + +/-- The colour stage of the `barL ∂ L` block. -/ +noncomputable def barLLColourStep (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) + (w w' : Fin 2) : + Step (fun U : specialUnitaryGroup (Fin 3) ℂ => repGauge ((U, 1, 1) : GaugeGroupI)) + (⨆ n : Fin 2 → Fin 3, ℂ ∙ h.barLLBlk f f' q l (n 0) (n 1) w w') := + Step.ofFixedFamily (h.barLLBlk f f' q l 0 0 w w') (fun _ => rfl) + (fun U => h.repGauge_su3_barLLBlk U f f' q l 0 0 w w') + +/-- The colour contraction of the `barL ∂ L` block, written out. -/ +lemma barLLColourStep_contraction (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) + (w w' : Fin 2) : + (h.barLLColourStep f f' q l w w').contraction + = h.barLLBlk f f' q l 0 0 w w' := rfl + +/-- The isospin stage of the `barL ∂ L` block. -/ +noncomputable def barLLIsospinStep (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) + (l : Fin 2 × Fin 2) : + Step (fun V : specialUnitaryGroup (Fin 2) ℂ => repGauge ((1, V, 1) : GaugeGroupI)) + (⨆ n : Fin 2 → Fin 2, ℂ ∙ (h.barLLColourStep f f' q l (n 0) (n 1)).contraction) := + Step.ofSU2FunAntiFun (by + simp only [barLLColourStep_contraction] + exact h.isSU2FunAntiFun_barLLBlk f f' q l 0 0) + +/-- The doubly contracted `barL ∂ L` block carries one four-vector index and a pair of + dual opposite-chirality Weyl indices. -/ +lemma isVectorDualLeftRightWeyl_barLL (f f' : Fin 3) : + IsVectorDualLeftRightWeyl B repLorentz + (fun p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2 => + (h.barLLIsospinStep f f' p.1 p.2).contraction) := by + have hsum : ∀ p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2, + (h.barLLIsospinStep f f' p.1 p.2).contraction + = ∑ i : Fin 2, h.barLLBlk f f' p.1 p.2 0 0 i i := by + intro p + show h.barLLBlk f f' p.1 p.2 0 0 0 0 + h.barLLBlk f f' p.1 p.2 0 0 1 1 = _ + rw [Fin.sum_univ_two] + simp only [hsum] + exact isVectorDualLeftRightWeyl_sum fun i : Fin 2 => isVectorDualLeftRightWeyl_mul_swap + hrepLorentz_mul (h.isDualRightWeyl_rightComp (.barL f i)) + (h.isVectorDualLeftWeyl_leftComp (.L f' i)) + +/-- The Lorentz stage of the `barL ∂ L` block. -/ +noncomputable def barLLLorentzStep (f f' : Fin 3) : + Step (fun Λ : SL(2,ℂ) => repLorentz Λ) + (⨆ p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2, + ℂ ∙ (h.barLLIsospinStep f f' p.1 p.2).contraction) := + Step.ofVectorDualLeftRightWeyl (h.isVectorDualLeftRightWeyl_barLL f f') + +/-- The `barL ∂ L` block as a kinetic block. -/ +noncomputable def barLLKineticBlock (f f' : Fin 3) : KineticBlock repGauge repLorentz where + blk := h.barLLBlk f f' + colourStep := h.barLLColourStep f f' + colourStep_mem _ _ _ _ := Submodule.mem_iSup_of_mem ![0, 0] (Submodule.mem_span_singleton_self _) + isospinStep := h.barLLIsospinStep f f' + isospinStep_mem _ _ := IsSU2FunAntiFun.deltaContraction_mem_span _ + lorentzStep := h.barLLLorentzStep f f' + lorentzStep_mem := pauliBarContraction_mem_iSup_span _ + hyper t q l c c' w w' := h.repGauge_u1_barLLBlk t f f' q l c c' w w' + +/-! + +## D. The two lepton-singlet pairings + +The lepton singlet carries only hypercharge and a spinor index, so both gauge stages are +trivial and the whole classification is the Lorentz one. + +-/ + +/-- The components of the block `e ∂ bare`: an underived lepton-singlet symbol against a + once-derived conjugate lepton-singlet symbol. -/ +noncomputable def ebareBlk (f f' : Fin 3) : + (Fin 1 ⊕ Fin 3) → Fin 2 × Fin 2 → Fin 3 → Fin 3 → Fin 2 → Fin 2 → B := + fun q l _ _ _ _ => h.eComponent f ![] l.2 * h.bareComponent f' ![q] l.1 + +/-- A colour transformation fixes the `e ∂ bare` block, neither symbol carrying + colour. -/ +lemma repGauge_su3_ebareBlk (U : specialUnitaryGroup (Fin 3) ℂ) (f f' : Fin 3) + (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) (c c' w w' : _) : + repGauge ((U, 1, 1) : GaugeGroupI) (h.ebareBlk f f' q l c c' w w') + = h.ebareBlk f f' q l c c' w w' := + repGauge_mul_fixed hrepGauge_mul (h.repGauge_su3_e U f ![] l.2) + (h.repGauge_su3_bare U f' ![q] l.1) + +/-- An isospin transformation fixes the `e ∂ bare` block, neither symbol carrying + isospin. -/ +lemma repGauge_su2_ebareBlk (V : specialUnitaryGroup (Fin 2) ℂ) (f f' : Fin 3) + (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) (c c' w w' : _) : + repGauge ((1, V, 1) : GaugeGroupI) (h.ebareBlk f f' q l c c' w w') + = h.ebareBlk f f' q l c c' w w' := + repGauge_mul_fixed hrepGauge_mul (h.repGauge_su2_e V f ![] l.2) + (h.repGauge_su2_bare V f' ![q] l.1) + +/-- A hypercharge transformation fixes the `e ∂ bare` block, the hypercharges of a + species and its conjugate cancelling. -/ +lemma repGauge_u1_ebareBlk (t : unitary ℂ) (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) + (l : Fin 2 × Fin 2) (c c' w w' : _) : + repGauge ((1, 1, t) : GaugeGroupI) (h.ebareBlk f f' q l c c' w w') + = h.ebareBlk f f' q l c c' w w' := + repGauge_mul_smul_fixed hrepGauge_mul (by rw [← mul_pow, unitary_mul_star_coe, one_pow]) + (h.repGauge_u1_e t f ![] l.2) + (h.repGauge_u1_bare t f' ![q] l.1) + +/-- The colour stage of the `e ∂ bare` block. -/ +noncomputable def ebareColourStep (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) + (w w' : Fin 2) : + Step (fun U : specialUnitaryGroup (Fin 3) ℂ => repGauge ((U, 1, 1) : GaugeGroupI)) + (⨆ n : Fin 2 → Fin 3, ℂ ∙ h.ebareBlk f f' q l (n 0) (n 1) w w') := + Step.ofFixedFamily (h.ebareBlk f f' q l 0 0 w w') (fun _ => rfl) + (fun U => h.repGauge_su3_ebareBlk U f f' q l 0 0 w w') + +/-- The colour contraction of the `e ∂ bare` block, written out. -/ +lemma ebareColourStep_contraction (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) + (w w' : Fin 2) : + (h.ebareColourStep f f' q l w w').contraction + = h.ebareBlk f f' q l 0 0 w w' := rfl + +/-- The isospin stage of the `e ∂ bare` block. -/ +noncomputable def ebareIsospinStep (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) + (l : Fin 2 × Fin 2) : + Step (fun V : specialUnitaryGroup (Fin 2) ℂ => repGauge ((1, V, 1) : GaugeGroupI)) + (⨆ n : Fin 2 → Fin 2, ℂ ∙ (h.ebareColourStep f f' q l (n 0) (n 1)).contraction) := + Step.ofFixedFamily (h.ebareColourStep f f' q l 0 0).contraction (fun _ => rfl) + (fun V => isFixedBy_iSup_span_singleton + (fun n V' => h.repGauge_su2_ebareBlk V' f f' q l (n 0) (n 1) 0 0) V _ + (Submodule.mem_iSup_of_mem ![0, 0] (Submodule.mem_span_singleton_self _))) + +/-- The doubly contracted `e ∂ bare` block carries one four-vector index and a pair of + dual opposite-chirality Weyl indices. -/ +lemma isVectorDualLeftRightWeyl_ebare (f f' : Fin 3) : + IsVectorDualLeftRightWeyl B repLorentz + (fun p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2 => + (h.ebareIsospinStep f f' p.1 p.2).contraction) := by + have hsum : ∀ p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2, + (h.ebareIsospinStep f f' p.1 p.2).contraction + = h.ebareBlk f f' p.1 p.2 0 0 0 0 := fun _ => rfl + simp only [hsum] + exact isVectorDualLeftRightWeyl_mul_swap + hrepLorentz_mul (h.isDualRightWeyl_rightComp (.e f)) + (h.isVectorDualLeftWeyl_leftComp (.bare f')) + +/-- The Lorentz stage of the `e ∂ bare` block. -/ +noncomputable def ebareLorentzStep (f f' : Fin 3) : + Step (fun Λ : SL(2,ℂ) => repLorentz Λ) + (⨆ p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2, + ℂ ∙ (h.ebareIsospinStep f f' p.1 p.2).contraction) := + Step.ofVectorDualLeftRightWeyl (h.isVectorDualLeftRightWeyl_ebare f f') + +/-- The `e ∂ bare` block as a kinetic block. -/ +noncomputable def ebareKineticBlock (f f' : Fin 3) : KineticBlock repGauge repLorentz where + blk := h.ebareBlk f f' + colourStep := h.ebareColourStep f f' + colourStep_mem _ _ _ _ := Submodule.mem_iSup_of_mem ![0, 0] (Submodule.mem_span_singleton_self _) + isospinStep := h.ebareIsospinStep f f' + isospinStep_mem _ _ := Submodule.mem_iSup_of_mem ![0, 0] (Submodule.mem_span_singleton_self _) + lorentzStep := h.ebareLorentzStep f f' + lorentzStep_mem := pauliBarContraction_mem_iSup_span _ + hyper t q l c c' w w' := h.repGauge_u1_ebareBlk t f f' q l c c' w w' + +/-- The components of the block `bare ∂ e`: an underived conjugate lepton-singlet symbol against a + once-derived lepton-singlet symbol. -/ +noncomputable def bareeBlk (f f' : Fin 3) : + (Fin 1 ⊕ Fin 3) → Fin 2 × Fin 2 → Fin 3 → Fin 3 → Fin 2 → Fin 2 → B := + fun q l _ _ _ _ => h.bareComponent f ![] l.1 * h.eComponent f' ![q] l.2 + +/-- A colour transformation fixes the `bare ∂ e` block, neither symbol carrying + colour. -/ +lemma repGauge_su3_bareeBlk (U : specialUnitaryGroup (Fin 3) ℂ) (f f' : Fin 3) + (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) (c c' w w' : _) : + repGauge ((U, 1, 1) : GaugeGroupI) (h.bareeBlk f f' q l c c' w w') + = h.bareeBlk f f' q l c c' w w' := + repGauge_mul_fixed hrepGauge_mul (h.repGauge_su3_bare U f ![] l.1) + (h.repGauge_su3_e U f' ![q] l.2) + +/-- An isospin transformation fixes the `bare ∂ e` block, neither symbol carrying + isospin. -/ +lemma repGauge_su2_bareeBlk (V : specialUnitaryGroup (Fin 2) ℂ) (f f' : Fin 3) + (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) (c c' w w' : _) : + repGauge ((1, V, 1) : GaugeGroupI) (h.bareeBlk f f' q l c c' w w') + = h.bareeBlk f f' q l c c' w w' := + repGauge_mul_fixed hrepGauge_mul (h.repGauge_su2_bare V f ![] l.1) + (h.repGauge_su2_e V f' ![q] l.2) + +/-- A hypercharge transformation fixes the `bare ∂ e` block, the hypercharges of a + species and its conjugate cancelling. -/ +lemma repGauge_u1_bareeBlk (t : unitary ℂ) (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) + (l : Fin 2 × Fin 2) (c c' w w' : _) : + repGauge ((1, 1, t) : GaugeGroupI) (h.bareeBlk f f' q l c c' w w') + = h.bareeBlk f f' q l c c' w w' := + repGauge_mul_smul_fixed hrepGauge_mul (by rw [← mul_pow, unitary_star_mul_coe, one_pow]) + (h.repGauge_u1_bare t f ![] l.1) + (h.repGauge_u1_e t f' ![q] l.2) + +/-- The colour stage of the `bare ∂ e` block. -/ +noncomputable def bareeColourStep (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) + (w w' : Fin 2) : + Step (fun U : specialUnitaryGroup (Fin 3) ℂ => repGauge ((U, 1, 1) : GaugeGroupI)) + (⨆ n : Fin 2 → Fin 3, ℂ ∙ h.bareeBlk f f' q l (n 0) (n 1) w w') := + Step.ofFixedFamily (h.bareeBlk f f' q l 0 0 w w') (fun _ => rfl) + (fun U => h.repGauge_su3_bareeBlk U f f' q l 0 0 w w') + +/-- The colour contraction of the `bare ∂ e` block, written out. -/ +lemma bareeColourStep_contraction (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) + (w w' : Fin 2) : + (h.bareeColourStep f f' q l w w').contraction + = h.bareeBlk f f' q l 0 0 w w' := rfl + +/-- The isospin stage of the `bare ∂ e` block. -/ +noncomputable def bareeIsospinStep (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) + (l : Fin 2 × Fin 2) : + Step (fun V : specialUnitaryGroup (Fin 2) ℂ => repGauge ((1, V, 1) : GaugeGroupI)) + (⨆ n : Fin 2 → Fin 2, ℂ ∙ (h.bareeColourStep f f' q l (n 0) (n 1)).contraction) := + Step.ofFixedFamily (h.bareeColourStep f f' q l 0 0).contraction (fun _ => rfl) + (fun V => isFixedBy_iSup_span_singleton + (fun n V' => h.repGauge_su2_bareeBlk V' f f' q l (n 0) (n 1) 0 0) V _ + (Submodule.mem_iSup_of_mem ![0, 0] (Submodule.mem_span_singleton_self _))) + +/-- The doubly contracted `bare ∂ e` block carries one four-vector index and a pair of + dual opposite-chirality Weyl indices. -/ +lemma isVectorDualLeftRightWeyl_baree (f f' : Fin 3) : + IsVectorDualLeftRightWeyl B repLorentz + (fun p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2 => + (h.bareeIsospinStep f f' p.1 p.2).contraction) := by + have hsum : ∀ p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2, + (h.bareeIsospinStep f f' p.1 p.2).contraction + = h.bareeBlk f f' p.1 p.2 0 0 0 0 := fun _ => rfl + simp only [hsum] + exact isVectorDualLeftRightWeyl_mul + hrepLorentz_mul (h.isDualLeftWeyl_leftComp (.bare f)) + (h.isVectorDualRightWeyl_rightComp (.e f')) + +/-- The Lorentz stage of the `bare ∂ e` block. -/ +noncomputable def bareeLorentzStep (f f' : Fin 3) : + Step (fun Λ : SL(2,ℂ) => repLorentz Λ) + (⨆ p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2, + ℂ ∙ (h.bareeIsospinStep f f' p.1 p.2).contraction) := + Step.ofVectorDualLeftRightWeyl (h.isVectorDualLeftRightWeyl_baree f f') + +/-- The `bare ∂ e` block as a kinetic block. -/ +noncomputable def bareeKineticBlock (f f' : Fin 3) : KineticBlock repGauge repLorentz where + blk := h.bareeBlk f f' + colourStep := h.bareeColourStep f f' + colourStep_mem _ _ _ _ := Submodule.mem_iSup_of_mem ![0, 0] (Submodule.mem_span_singleton_self _) + isospinStep := h.bareeIsospinStep f f' + isospinStep_mem _ _ := Submodule.mem_iSup_of_mem ![0, 0] (Submodule.mem_span_singleton_self _) + lorentzStep := h.bareeLorentzStep f f' + lorentzStep_mem := pauliBarContraction_mem_iSup_span _ + hyper t q l c c' w w' := h.repGauge_u1_bareeBlk t f f' q l c c' w w' + +end IsFermionSector + +end StandardModel diff --git a/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/MassDimEight.lean b/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/MassDimEight.lean new file mode 100644 index 000000000..397381f07 --- /dev/null +++ b/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/MassDimEight.lean @@ -0,0 +1,1351 @@ +/- +Copyright (c) 2026 Joseph Tooby-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.KineticTerms +public import Mathlib.RepresentationTheory.Invariants +/-! +# The kinetic terms at mass weight eight + +Mass weight eight is the first weight at which the fermion sector carries an invariant, +and what it carries is the kinetic terms. The submodule is +`derivSubmodule 0 * derivSubmodule 1`, one underived tower against one once-derived one, +and the single derivative is exactly what mass weight six was missing: it supplies a +four-vector index, and a four-vector index together with a dotted and an undotted spinor +index has one invariant contraction, against the conjugate Pauli matrices. That +contraction is `ψ̄ σ̄^μ ∂_μ ψ`. + +The classification runs the four stages every sector runs. Hypercharge first, through the +gauge weight decomposition: `massWeightSubmoduleGaugeWeightEight_piece_zero` cuts the +hundred pairings of two fermion symbols down to the ten conjugate ones, every other +pairing having hypercharges that cannot cancel. Then colour, then isospin, then Lorentz, +one classification each, chained by the `Peels` relation of `StandardModel.Peeling` and +supplied by the `KineticBlock` packages of `KineticTerms`. What is left is the kinetic +span: one term for each of the ten pairings and each of the nine pairs of generations. + +- A. Symbol ranges and their stability +- B. The block submodules +- C. The symbol ranges inside the derivative submodules, and the mass weight +- D. The kinetic span +- E. The blocks peel to the kinetic terms +- F. The classification as an equivalence + +-/ + +@[expose] public section + +namespace StandardModel + +open 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) + +/-! + +## A. Symbol ranges and their stability + +The peeling asks two things of the submodule a block is read from: that the two groups +carry it into itself, and that it lies in the span of the block's components. Both come +from the symbol maps. A gauge transformation moves only the covector a symbol is evaluated +at, so a symbol range is gauge stable at any number of derivative slots. The Lorentz group +moves the covector too, but it also mixes the derivative slots, so an underived range is +Lorentz stable on its own while a once-derived one is stable only after joining over the +derivative direction — which is why a block submodule carries that join. + +-/ + +/-- The two groups read as one family of maps respect multiplication, each of the two + representations doing so. -/ +lemma gaugeLorentzMaps_mul + (hG : ∀ (g : GaugeGroupI) (b₁ b₂ : B), + repGauge g (b₁ * b₂) = repGauge g b₁ * repGauge g b₂) + (hL : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂) + (p : GaugeGroupI ⊕ SL(2,ℂ)) (a b : B) : + gaugeLorentzMaps repGauge repLorentz p (a * b) + = gaugeLorentzMaps repGauge repLorentz p a + * gaugeLorentzMaps repGauge repLorentz p b := by + cases p with + | inl g => exact hG g a b + | inr Λ => exact hL Λ a b + +/-- The join, over the derivative direction, of the ranges of a once-derived symbol map is + carried into itself by the Lorentz group: a Lorentz transformation mixes the derivative + slot into the other directions and moves the covector, and both stay inside the join. -/ +lemma isStableUnder_iSup_range_deriv_one {M : Type} [AddCommGroup M] [Module ℂ M] + {ρ : Representation ℂ SL(2,ℂ) M} + {F : {n : ℕ} → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ M →ₗ[ℂ] B} + (hF : IsLorentzCovDerivTransforms repLorentz ρ F) (Λ : SL(2,ℂ)) : + ∀ y ∈ (⨆ μ : Fin 1 ⊕ Fin 3, LinearMap.range (F ![μ])), + repLorentz Λ y ∈ ⨆ μ : Fin 1 ⊕ Fin 3, LinearMap.range (F ![μ]) := by + intro y hy + have key : (⨆ μ : Fin 1 ⊕ Fin 3, LinearMap.range (F ![μ])) + ≤ Submodule.comap (repLorentz Λ) + (⨆ μ : Fin 1 ⊕ Fin 3, LinearMap.range (F ![μ])) := by + refine iSup_le fun μ => ?_ + rintro _ ⟨φ, rfl⟩ + rw [Submodule.mem_comap, repLorentz_symbol_deriv_one hF Λ μ φ] + exact Submodule.sum_mem _ fun ν _ => Submodule.smul_mem _ _ + (Submodule.mem_iSup_of_mem ν ⟨_, rfl⟩) + exact key hy + +/-- The range of an underived symbol map is carried into itself by both groups. -/ +lemma isStableUnder_range_underived {M : Type} [AddCommGroup M] [Module ℂ M] + {ρG : Representation ℂ GaugeGroupI M} {ρL : Representation ℂ SL(2,ℂ) M} + {F : {n : ℕ} → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ M →ₗ[ℂ] B} + (hG : ∀ (g : GaugeGroupI) (φ : Module.Dual ℂ M), + repGauge g (F (![] : Fin 0 → Fin 1 ⊕ Fin 3) φ) + = F (![] : Fin 0 → Fin 1 ⊕ Fin 3) (ρG.dual g φ)) + (hL : IsLorentzCovDerivTransforms repLorentz ρL F) : + IsStableUnder (gaugeLorentzMaps repGauge repLorentz) + (LinearMap.range (F (![] : Fin 0 → Fin 1 ⊕ Fin 3))) := + isStableUnder_gaugeLorentzMaps_iff.2 + ⟨isStableUnder_range_repGauge hG, fun Λ => isStableUnder_range_repLorentz hL Λ⟩ + +/-- The join, over the derivative direction, of the ranges of a once-derived symbol map is + carried into itself by both groups. -/ +lemma isStableUnder_iSup_range_derived {M : Type} [AddCommGroup M] [Module ℂ M] + {ρG : Representation ℂ GaugeGroupI M} {ρL : Representation ℂ SL(2,ℂ) M} + {F : {n : ℕ} → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ M →ₗ[ℂ] B} + (hG : ∀ (g : GaugeGroupI) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ M), + repGauge g (F ![μ] φ) = F ![μ] (ρG.dual g φ)) + (hL : IsLorentzCovDerivTransforms repLorentz ρL F) : + IsStableUnder (gaugeLorentzMaps repGauge repLorentz) + (⨆ μ : Fin 1 ⊕ Fin 3, LinearMap.range (F ![μ])) := + isStableUnder_gaugeLorentzMaps_iff.2 + ⟨isStableUnder_iSup fun μ => isStableUnder_range_repGauge (hG · μ), + isStableUnder_iSup_range_deriv_one hL⟩ + +/-! + +## B. The block submodules + +Each of the ten conjugate pairings gives one submodule per pair of generations: the +underived range of one species against the once-derived ranges of its conjugate, joined +over the derivative direction so that the Lorentz group has somewhere to move it. Each is +carried into itself by both groups and lies in the span of the components of the matching +kinetic block, which is all the peeling asks. + +-/ + +set_option linter.unusedVariables false in +/-- The submodule of the `d ∂ bard` block of a generation pair: an underived + down-singlet range against the once-derived conjugate down-singlet ranges, + joined over the derivative direction. -/ +noncomputable def dbardPairSubmodule (h : IsFermionSector B repGauge hrepGauge_mul repLorentz + hrepLorentz_mul d bard u baru Q barQ L barL e bare massWeightPoly) (f f' : Fin 3) : + Submodule ℂ B := + LinearMap.range (d f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) + * ⨆ μ : Fin 1 ⊕ Fin 3, LinearMap.range (bard f' ![μ]) + +include h in +/-- The `d ∂ bard` block submodule is carried into itself by both groups. -/ +lemma isStableUnder_dbardPairSubmodule (f f' : Fin 3) : + IsStableUnder (gaugeLorentzMaps repGauge repLorentz) (h.dbardPairSubmodule f f') := by + rw [dbardPairSubmodule] + exact IsStableUnder.mul (gaugeLorentzMaps_mul hrepGauge_mul hrepLorentz_mul) + (isStableUnder_range_underived (F := d f) (fun g φ => h.repGauge_d g f ![] φ) + (h.repLorentz_d f)) + (isStableUnder_iSup_range_derived (F := bard f') + (fun g μ φ => h.repGauge_bard g f' ![μ] φ) (h.repLorentz_bard f')) + +include h in +/-- The `d ∂ bard` block submodule lies in the span of the block's components. -/ +lemma dbardPairSubmodule_le_blockSpan (f f' : Fin 3) : + h.dbardPairSubmodule f f' ≤ (h.dbardKineticBlock f f').blockSpan := by + rw [dbardPairSubmodule, KineticBlock.blockSpan] + refine mul_le_of_le + (A := fun k => d f (![] : Fin 0 → Fin 1 ⊕ Fin 3) (DownSinglet.basis.dualBasis k)) + (C := fun k : (Fin 1 ⊕ Fin 3) × (Fin 2 × Fin 3) => + bard f' ![k.1] (DownSinglet.basis.conj.dualBasis k.2)) + (le_of_eq (range_eq_iSup_span_dualBasis DownSinglet.basis _)) (iSup_le fun μ => ?_) ?_ + · rw [range_eq_iSup_span_dualBasis DownSinglet.basis.conj (bard f' ![μ])] + exact iSup_le fun k => le_iSup_of_le (μ, k) le_rfl + · intro i j + exact Submodule.mem_iSup_of_mem (j.1, (j.2.1, i.1), (0, 0)) + (Submodule.mem_iSup_of_mem ![j.2.2, i.2] (Submodule.mem_span_singleton_self _)) + +include h in +/-- The `d ∂ bard` block peels to its kinetic term. -/ +lemma peels_dbard (f f' : Fin 3) : + Peels (gaugeLorentzMaps repGauge repLorentz) (h.dbardPairSubmodule f f') + (ℂ ∙ (h.dbardKineticBlock f f').kineticTerm) := + ((h.dbardKineticBlock f f').peels).mono_left (h.dbardPairSubmodule_le_blockSpan f f') + +set_option linter.unusedVariables false in +/-- The submodule of the `bard ∂ d` block of a generation pair: an underived + conjugate down-singlet range against the once-derived down-singlet ranges, + joined over the derivative direction. -/ +noncomputable def barddPairSubmodule (h : IsFermionSector B repGauge hrepGauge_mul repLorentz + hrepLorentz_mul d bard u baru Q barQ L barL e bare massWeightPoly) (f f' : Fin 3) : + Submodule ℂ B := + LinearMap.range (bard f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) + * ⨆ μ : Fin 1 ⊕ Fin 3, LinearMap.range (d f' ![μ]) + +include h in +/-- The `bard ∂ d` block submodule is carried into itself by both groups. -/ +lemma isStableUnder_barddPairSubmodule (f f' : Fin 3) : + IsStableUnder (gaugeLorentzMaps repGauge repLorentz) (h.barddPairSubmodule f f') := by + rw [barddPairSubmodule] + exact IsStableUnder.mul (gaugeLorentzMaps_mul hrepGauge_mul hrepLorentz_mul) + (isStableUnder_range_underived (F := bard f) (fun g φ => h.repGauge_bard g f ![] φ) + (h.repLorentz_bard f)) + (isStableUnder_iSup_range_derived (F := d f') + (fun g μ φ => h.repGauge_d g f' ![μ] φ) (h.repLorentz_d f')) + +include h in +/-- The `bard ∂ d` block submodule lies in the span of the block's components. -/ +lemma barddPairSubmodule_le_blockSpan (f f' : Fin 3) : + h.barddPairSubmodule f f' ≤ (h.barddKineticBlock f f').blockSpan := by + rw [barddPairSubmodule, KineticBlock.blockSpan] + refine mul_le_of_le + (A := fun k => bard f (![] : Fin 0 → Fin 1 ⊕ Fin 3) (DownSinglet.basis.conj.dualBasis k)) + (C := fun k : (Fin 1 ⊕ Fin 3) × (Fin 2 × Fin 3) => + d f' ![k.1] (DownSinglet.basis.dualBasis k.2)) + (le_of_eq (range_eq_iSup_span_dualBasis DownSinglet.basis.conj _)) (iSup_le fun μ => ?_) ?_ + · rw [range_eq_iSup_span_dualBasis DownSinglet.basis (d f' ![μ])] + exact iSup_le fun k => le_iSup_of_le (μ, k) le_rfl + · intro i j + exact Submodule.mem_iSup_of_mem (j.1, (i.1, j.2.1), (0, 0)) + (Submodule.mem_iSup_of_mem ![i.2, j.2.2] (Submodule.mem_span_singleton_self _)) + +include h in +/-- The `bard ∂ d` block peels to its kinetic term. -/ +lemma peels_bardd (f f' : Fin 3) : + Peels (gaugeLorentzMaps repGauge repLorentz) (h.barddPairSubmodule f f') + (ℂ ∙ (h.barddKineticBlock f f').kineticTerm) := + ((h.barddKineticBlock f f').peels).mono_left (h.barddPairSubmodule_le_blockSpan f f') + +set_option linter.unusedVariables false in +/-- The submodule of the `u ∂ baru` block of a generation pair: an underived + up-singlet range against the once-derived conjugate up-singlet ranges, + joined over the derivative direction. -/ +noncomputable def ubaruPairSubmodule (h : IsFermionSector B repGauge hrepGauge_mul repLorentz + hrepLorentz_mul d bard u baru Q barQ L barL e bare massWeightPoly) (f f' : Fin 3) : + Submodule ℂ B := + LinearMap.range (u f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) + * ⨆ μ : Fin 1 ⊕ Fin 3, LinearMap.range (baru f' ![μ]) + +include h in +/-- The `u ∂ baru` block submodule is carried into itself by both groups. -/ +lemma isStableUnder_ubaruPairSubmodule (f f' : Fin 3) : + IsStableUnder (gaugeLorentzMaps repGauge repLorentz) (h.ubaruPairSubmodule f f') := by + rw [ubaruPairSubmodule] + exact IsStableUnder.mul (gaugeLorentzMaps_mul hrepGauge_mul hrepLorentz_mul) + (isStableUnder_range_underived (F := u f) (fun g φ => h.repGauge_u g f ![] φ) + (h.repLorentz_u f)) + (isStableUnder_iSup_range_derived (F := baru f') + (fun g μ φ => h.repGauge_baru g f' ![μ] φ) (h.repLorentz_baru f')) + +include h in +/-- The `u ∂ baru` block submodule lies in the span of the block's components. -/ +lemma ubaruPairSubmodule_le_blockSpan (f f' : Fin 3) : + h.ubaruPairSubmodule f f' ≤ (h.ubaruKineticBlock f f').blockSpan := by + rw [ubaruPairSubmodule, KineticBlock.blockSpan] + refine mul_le_of_le + (A := fun k => u f (![] : Fin 0 → Fin 1 ⊕ Fin 3) (UpSinglet.basis.dualBasis k)) + (C := fun k : (Fin 1 ⊕ Fin 3) × (Fin 2 × Fin 3) => + baru f' ![k.1] (UpSinglet.basis.conj.dualBasis k.2)) + (le_of_eq (range_eq_iSup_span_dualBasis UpSinglet.basis _)) (iSup_le fun μ => ?_) ?_ + · rw [range_eq_iSup_span_dualBasis UpSinglet.basis.conj (baru f' ![μ])] + exact iSup_le fun k => le_iSup_of_le (μ, k) le_rfl + · intro i j + exact Submodule.mem_iSup_of_mem (j.1, (j.2.1, i.1), (0, 0)) + (Submodule.mem_iSup_of_mem ![j.2.2, i.2] (Submodule.mem_span_singleton_self _)) + +include h in +/-- The `u ∂ baru` block peels to its kinetic term. -/ +lemma peels_ubaru (f f' : Fin 3) : + Peels (gaugeLorentzMaps repGauge repLorentz) (h.ubaruPairSubmodule f f') + (ℂ ∙ (h.ubaruKineticBlock f f').kineticTerm) := + ((h.ubaruKineticBlock f f').peels).mono_left (h.ubaruPairSubmodule_le_blockSpan f f') + +set_option linter.unusedVariables false in +/-- The submodule of the `baru ∂ u` block of a generation pair: an underived + conjugate up-singlet range against the once-derived up-singlet ranges, + joined over the derivative direction. -/ +noncomputable def baruuPairSubmodule (h : IsFermionSector B repGauge hrepGauge_mul repLorentz + hrepLorentz_mul d bard u baru Q barQ L barL e bare massWeightPoly) (f f' : Fin 3) : + Submodule ℂ B := + LinearMap.range (baru f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) + * ⨆ μ : Fin 1 ⊕ Fin 3, LinearMap.range (u f' ![μ]) + +include h in +/-- The `baru ∂ u` block submodule is carried into itself by both groups. -/ +lemma isStableUnder_baruuPairSubmodule (f f' : Fin 3) : + IsStableUnder (gaugeLorentzMaps repGauge repLorentz) (h.baruuPairSubmodule f f') := by + rw [baruuPairSubmodule] + exact IsStableUnder.mul (gaugeLorentzMaps_mul hrepGauge_mul hrepLorentz_mul) + (isStableUnder_range_underived (F := baru f) (fun g φ => h.repGauge_baru g f ![] φ) + (h.repLorentz_baru f)) + (isStableUnder_iSup_range_derived (F := u f') + (fun g μ φ => h.repGauge_u g f' ![μ] φ) (h.repLorentz_u f')) + +include h in +/-- The `baru ∂ u` block submodule lies in the span of the block's components. -/ +lemma baruuPairSubmodule_le_blockSpan (f f' : Fin 3) : + h.baruuPairSubmodule f f' ≤ (h.baruuKineticBlock f f').blockSpan := by + rw [baruuPairSubmodule, KineticBlock.blockSpan] + refine mul_le_of_le + (A := fun k => baru f (![] : Fin 0 → Fin 1 ⊕ Fin 3) (UpSinglet.basis.conj.dualBasis k)) + (C := fun k : (Fin 1 ⊕ Fin 3) × (Fin 2 × Fin 3) => + u f' ![k.1] (UpSinglet.basis.dualBasis k.2)) + (le_of_eq (range_eq_iSup_span_dualBasis UpSinglet.basis.conj _)) (iSup_le fun μ => ?_) ?_ + · rw [range_eq_iSup_span_dualBasis UpSinglet.basis (u f' ![μ])] + exact iSup_le fun k => le_iSup_of_le (μ, k) le_rfl + · intro i j + exact Submodule.mem_iSup_of_mem (j.1, (i.1, j.2.1), (0, 0)) + (Submodule.mem_iSup_of_mem ![i.2, j.2.2] (Submodule.mem_span_singleton_self _)) + +include h in +/-- The `baru ∂ u` block peels to its kinetic term. -/ +lemma peels_baruu (f f' : Fin 3) : + Peels (gaugeLorentzMaps repGauge repLorentz) (h.baruuPairSubmodule f f') + (ℂ ∙ (h.baruuKineticBlock f f').kineticTerm) := + ((h.baruuKineticBlock f f').peels).mono_left (h.baruuPairSubmodule_le_blockSpan f f') + +set_option linter.unusedVariables false in +/-- The submodule of the `Q ∂ barQ` block of a generation pair: an underived + quark-doublet range against the once-derived conjugate quark-doublet ranges, + joined over the derivative direction. -/ +noncomputable def QbarQPairSubmodule (h : IsFermionSector B repGauge hrepGauge_mul repLorentz + hrepLorentz_mul d bard u baru Q barQ L barL e bare massWeightPoly) (f f' : Fin 3) : + Submodule ℂ B := + LinearMap.range (Q f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) + * ⨆ μ : Fin 1 ⊕ Fin 3, LinearMap.range (barQ f' ![μ]) + +include h in +/-- The `Q ∂ barQ` block submodule is carried into itself by both groups. -/ +lemma isStableUnder_QbarQPairSubmodule (f f' : Fin 3) : + IsStableUnder (gaugeLorentzMaps repGauge repLorentz) (h.QbarQPairSubmodule f f') := by + rw [QbarQPairSubmodule] + exact IsStableUnder.mul (gaugeLorentzMaps_mul hrepGauge_mul hrepLorentz_mul) + (isStableUnder_range_underived (F := Q f) (fun g φ => h.repGauge_Q g f ![] φ) + (h.repLorentz_Q f)) + (isStableUnder_iSup_range_derived (F := barQ f') + (fun g μ φ => h.repGauge_barQ g f' ![μ] φ) (h.repLorentz_barQ f')) + +include h in +/-- The `Q ∂ barQ` block submodule lies in the span of the block's components. -/ +lemma QbarQPairSubmodule_le_blockSpan (f f' : Fin 3) : + h.QbarQPairSubmodule f f' ≤ (h.QbarQKineticBlock f f').blockSpan := by + rw [QbarQPairSubmodule, KineticBlock.blockSpan] + refine mul_le_of_le + (A := fun k => Q f (![] : Fin 0 → Fin 1 ⊕ Fin 3) (QuarkDoublet.basis.dualBasis k)) + (C := fun k : (Fin 1 ⊕ Fin 3) × (Fin 2 × Fin 3 × Fin 2) => + barQ f' ![k.1] (QuarkDoublet.basis.conj.dualBasis k.2)) + (le_of_eq (range_eq_iSup_span_dualBasis QuarkDoublet.basis _)) (iSup_le fun μ => ?_) ?_ + · rw [range_eq_iSup_span_dualBasis QuarkDoublet.basis.conj (barQ f' ![μ])] + exact iSup_le fun k => le_iSup_of_le (μ, k) le_rfl + · intro i j + exact Submodule.mem_iSup_of_mem (j.1, (i.1, j.2.1), (j.2.2.2, i.2.2)) + (Submodule.mem_iSup_of_mem ![j.2.2.1, i.2.1] (Submodule.mem_span_singleton_self _)) + +include h in +/-- The `Q ∂ barQ` block peels to its kinetic term. -/ +lemma peels_QbarQ (f f' : Fin 3) : + Peels (gaugeLorentzMaps repGauge repLorentz) (h.QbarQPairSubmodule f f') + (ℂ ∙ (h.QbarQKineticBlock f f').kineticTerm) := + ((h.QbarQKineticBlock f f').peels).mono_left (h.QbarQPairSubmodule_le_blockSpan f f') + +set_option linter.unusedVariables false in +/-- The submodule of the `barQ ∂ Q` block of a generation pair: an underived + conjugate quark-doublet range against the once-derived quark-doublet ranges, + joined over the derivative direction. -/ +noncomputable def barQQPairSubmodule (h : IsFermionSector B repGauge hrepGauge_mul repLorentz + hrepLorentz_mul d bard u baru Q barQ L barL e bare massWeightPoly) (f f' : Fin 3) : + Submodule ℂ B := + LinearMap.range (barQ f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) + * ⨆ μ : Fin 1 ⊕ Fin 3, LinearMap.range (Q f' ![μ]) + +include h in +/-- The `barQ ∂ Q` block submodule is carried into itself by both groups. -/ +lemma isStableUnder_barQQPairSubmodule (f f' : Fin 3) : + IsStableUnder (gaugeLorentzMaps repGauge repLorentz) (h.barQQPairSubmodule f f') := by + rw [barQQPairSubmodule] + exact IsStableUnder.mul (gaugeLorentzMaps_mul hrepGauge_mul hrepLorentz_mul) + (isStableUnder_range_underived (F := barQ f) (fun g φ => h.repGauge_barQ g f ![] φ) + (h.repLorentz_barQ f)) + (isStableUnder_iSup_range_derived (F := Q f') + (fun g μ φ => h.repGauge_Q g f' ![μ] φ) (h.repLorentz_Q f')) + +include h in +/-- The `barQ ∂ Q` block submodule lies in the span of the block's components. -/ +lemma barQQPairSubmodule_le_blockSpan (f f' : Fin 3) : + h.barQQPairSubmodule f f' ≤ (h.barQQKineticBlock f f').blockSpan := by + rw [barQQPairSubmodule, KineticBlock.blockSpan] + refine mul_le_of_le + (A := fun k => barQ f (![] : Fin 0 → Fin 1 ⊕ Fin 3) (QuarkDoublet.basis.conj.dualBasis k)) + (C := fun k : (Fin 1 ⊕ Fin 3) × (Fin 2 × Fin 3 × Fin 2) => + Q f' ![k.1] (QuarkDoublet.basis.dualBasis k.2)) + (le_of_eq (range_eq_iSup_span_dualBasis QuarkDoublet.basis.conj _)) (iSup_le fun μ => ?_) ?_ + · rw [range_eq_iSup_span_dualBasis QuarkDoublet.basis (Q f' ![μ])] + exact iSup_le fun k => le_iSup_of_le (μ, k) le_rfl + · intro i j + exact Submodule.mem_iSup_of_mem (j.1, (j.2.1, i.1), (i.2.2, j.2.2.2)) + (Submodule.mem_iSup_of_mem ![i.2.1, j.2.2.1] (Submodule.mem_span_singleton_self _)) + +include h in +/-- The `barQ ∂ Q` block peels to its kinetic term. -/ +lemma peels_barQQ (f f' : Fin 3) : + Peels (gaugeLorentzMaps repGauge repLorentz) (h.barQQPairSubmodule f f') + (ℂ ∙ (h.barQQKineticBlock f f').kineticTerm) := + ((h.barQQKineticBlock f f').peels).mono_left (h.barQQPairSubmodule_le_blockSpan f f') + +set_option linter.unusedVariables false in +/-- The submodule of the `L ∂ barL` block of a generation pair: an underived + lepton-doublet range against the once-derived conjugate lepton-doublet ranges, + joined over the derivative direction. -/ +noncomputable def LbarLPairSubmodule (h : IsFermionSector B repGauge hrepGauge_mul repLorentz + hrepLorentz_mul d bard u baru Q barQ L barL e bare massWeightPoly) (f f' : Fin 3) : + Submodule ℂ B := + LinearMap.range (L f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) + * ⨆ μ : Fin 1 ⊕ Fin 3, LinearMap.range (barL f' ![μ]) + +include h in +/-- The `L ∂ barL` block submodule is carried into itself by both groups. -/ +lemma isStableUnder_LbarLPairSubmodule (f f' : Fin 3) : + IsStableUnder (gaugeLorentzMaps repGauge repLorentz) (h.LbarLPairSubmodule f f') := by + rw [LbarLPairSubmodule] + exact IsStableUnder.mul (gaugeLorentzMaps_mul hrepGauge_mul hrepLorentz_mul) + (isStableUnder_range_underived (F := L f) (fun g φ => h.repGauge_L g f ![] φ) + (h.repLorentz_L f)) + (isStableUnder_iSup_range_derived (F := barL f') + (fun g μ φ => h.repGauge_barL g f' ![μ] φ) (h.repLorentz_barL f')) + +include h in +/-- The `L ∂ barL` block submodule lies in the span of the block's components. -/ +lemma LbarLPairSubmodule_le_blockSpan (f f' : Fin 3) : + h.LbarLPairSubmodule f f' ≤ (h.LbarLKineticBlock f f').blockSpan := by + rw [LbarLPairSubmodule, KineticBlock.blockSpan] + refine mul_le_of_le + (A := fun k => L f (![] : Fin 0 → Fin 1 ⊕ Fin 3) (LeptonDoublet.basis.dualBasis k)) + (C := fun k : (Fin 1 ⊕ Fin 3) × (Fin 2 × Fin 2) => + barL f' ![k.1] (LeptonDoublet.basis.conj.dualBasis k.2)) + (le_of_eq (range_eq_iSup_span_dualBasis LeptonDoublet.basis _)) (iSup_le fun μ => ?_) ?_ + · rw [range_eq_iSup_span_dualBasis LeptonDoublet.basis.conj (barL f' ![μ])] + exact iSup_le fun k => le_iSup_of_le (μ, k) le_rfl + · intro i j + exact Submodule.mem_iSup_of_mem (j.1, (i.1, j.2.1), (j.2.2, i.2)) + (Submodule.mem_iSup_of_mem ![0, 0] (Submodule.mem_span_singleton_self _)) + +include h in +/-- The `L ∂ barL` block peels to its kinetic term. -/ +lemma peels_LbarL (f f' : Fin 3) : + Peels (gaugeLorentzMaps repGauge repLorentz) (h.LbarLPairSubmodule f f') + (ℂ ∙ (h.LbarLKineticBlock f f').kineticTerm) := + ((h.LbarLKineticBlock f f').peels).mono_left (h.LbarLPairSubmodule_le_blockSpan f f') + +set_option linter.unusedVariables false in +/-- The submodule of the `barL ∂ L` block of a generation pair: an underived + conjugate lepton-doublet range against the once-derived lepton-doublet ranges, + joined over the derivative direction. -/ +noncomputable def barLLPairSubmodule (h : IsFermionSector B repGauge hrepGauge_mul repLorentz + hrepLorentz_mul d bard u baru Q barQ L barL e bare massWeightPoly) (f f' : Fin 3) : + Submodule ℂ B := + LinearMap.range (barL f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) + * ⨆ μ : Fin 1 ⊕ Fin 3, LinearMap.range (L f' ![μ]) + +include h in +/-- The `barL ∂ L` block submodule is carried into itself by both groups. -/ +lemma isStableUnder_barLLPairSubmodule (f f' : Fin 3) : + IsStableUnder (gaugeLorentzMaps repGauge repLorentz) (h.barLLPairSubmodule f f') := by + rw [barLLPairSubmodule] + exact IsStableUnder.mul (gaugeLorentzMaps_mul hrepGauge_mul hrepLorentz_mul) + (isStableUnder_range_underived (F := barL f) (fun g φ => h.repGauge_barL g f ![] φ) + (h.repLorentz_barL f)) + (isStableUnder_iSup_range_derived (F := L f') + (fun g μ φ => h.repGauge_L g f' ![μ] φ) (h.repLorentz_L f')) + +include h in +/-- The `barL ∂ L` block submodule lies in the span of the block's components. -/ +lemma barLLPairSubmodule_le_blockSpan (f f' : Fin 3) : + h.barLLPairSubmodule f f' ≤ (h.barLLKineticBlock f f').blockSpan := by + rw [barLLPairSubmodule, KineticBlock.blockSpan] + refine mul_le_of_le + (A := fun k => barL f (![] : Fin 0 → Fin 1 ⊕ Fin 3) (LeptonDoublet.basis.conj.dualBasis k)) + (C := fun k : (Fin 1 ⊕ Fin 3) × (Fin 2 × Fin 2) => + L f' ![k.1] (LeptonDoublet.basis.dualBasis k.2)) + (le_of_eq (range_eq_iSup_span_dualBasis LeptonDoublet.basis.conj _)) (iSup_le fun μ => ?_) ?_ + · rw [range_eq_iSup_span_dualBasis LeptonDoublet.basis (L f' ![μ])] + exact iSup_le fun k => le_iSup_of_le (μ, k) le_rfl + · intro i j + exact Submodule.mem_iSup_of_mem (j.1, (j.2.1, i.1), (i.2, j.2.2)) + (Submodule.mem_iSup_of_mem ![0, 0] (Submodule.mem_span_singleton_self _)) + +include h in +/-- The `barL ∂ L` block peels to its kinetic term. -/ +lemma peels_barLL (f f' : Fin 3) : + Peels (gaugeLorentzMaps repGauge repLorentz) (h.barLLPairSubmodule f f') + (ℂ ∙ (h.barLLKineticBlock f f').kineticTerm) := + ((h.barLLKineticBlock f f').peels).mono_left (h.barLLPairSubmodule_le_blockSpan f f') + +set_option linter.unusedVariables false in +/-- The submodule of the `e ∂ bare` block of a generation pair: an underived + lepton-singlet range against the once-derived conjugate lepton-singlet ranges, + joined over the derivative direction. -/ +noncomputable def ebarePairSubmodule (h : IsFermionSector B repGauge hrepGauge_mul repLorentz + hrepLorentz_mul d bard u baru Q barQ L barL e bare massWeightPoly) (f f' : Fin 3) : + Submodule ℂ B := + LinearMap.range (e f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) + * ⨆ μ : Fin 1 ⊕ Fin 3, LinearMap.range (bare f' ![μ]) + +include h in +/-- The `e ∂ bare` block submodule is carried into itself by both groups. -/ +lemma isStableUnder_ebarePairSubmodule (f f' : Fin 3) : + IsStableUnder (gaugeLorentzMaps repGauge repLorentz) (h.ebarePairSubmodule f f') := by + rw [ebarePairSubmodule] + exact IsStableUnder.mul (gaugeLorentzMaps_mul hrepGauge_mul hrepLorentz_mul) + (isStableUnder_range_underived (F := e f) (fun g φ => h.repGauge_e g f ![] φ) + (h.repLorentz_e f)) + (isStableUnder_iSup_range_derived (F := bare f') + (fun g μ φ => h.repGauge_bare g f' ![μ] φ) (h.repLorentz_bare f')) + +include h in +/-- The `e ∂ bare` block submodule lies in the span of the block's components. -/ +lemma ebarePairSubmodule_le_blockSpan (f f' : Fin 3) : + h.ebarePairSubmodule f f' ≤ (h.ebareKineticBlock f f').blockSpan := by + rw [ebarePairSubmodule, KineticBlock.blockSpan] + refine mul_le_of_le + (A := fun k => e f (![] : Fin 0 → Fin 1 ⊕ Fin 3) (LeptonSinglet.basis.dualBasis k)) + (C := fun k : (Fin 1 ⊕ Fin 3) × (Fin 2) => + bare f' ![k.1] (LeptonSinglet.basis.conj.dualBasis k.2)) + (le_of_eq (range_eq_iSup_span_dualBasis LeptonSinglet.basis _)) (iSup_le fun μ => ?_) ?_ + · rw [range_eq_iSup_span_dualBasis LeptonSinglet.basis.conj (bare f' ![μ])] + exact iSup_le fun k => le_iSup_of_le (μ, k) le_rfl + · intro i j + exact Submodule.mem_iSup_of_mem (j.1, (j.2, i), (0, 0)) + (Submodule.mem_iSup_of_mem ![0, 0] (Submodule.mem_span_singleton_self _)) + +include h in +/-- The `e ∂ bare` block peels to its kinetic term. -/ +lemma peels_ebare (f f' : Fin 3) : + Peels (gaugeLorentzMaps repGauge repLorentz) (h.ebarePairSubmodule f f') + (ℂ ∙ (h.ebareKineticBlock f f').kineticTerm) := + ((h.ebareKineticBlock f f').peels).mono_left (h.ebarePairSubmodule_le_blockSpan f f') + +set_option linter.unusedVariables false in +/-- The submodule of the `bare ∂ e` block of a generation pair: an underived + conjugate lepton-singlet range against the once-derived lepton-singlet ranges, + joined over the derivative direction. -/ +noncomputable def bareePairSubmodule (h : IsFermionSector B repGauge hrepGauge_mul repLorentz + hrepLorentz_mul d bard u baru Q barQ L barL e bare massWeightPoly) (f f' : Fin 3) : + Submodule ℂ B := + LinearMap.range (bare f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) + * ⨆ μ : Fin 1 ⊕ Fin 3, LinearMap.range (e f' ![μ]) + +include h in +/-- The `bare ∂ e` block submodule is carried into itself by both groups. -/ +lemma isStableUnder_bareePairSubmodule (f f' : Fin 3) : + IsStableUnder (gaugeLorentzMaps repGauge repLorentz) (h.bareePairSubmodule f f') := by + rw [bareePairSubmodule] + exact IsStableUnder.mul (gaugeLorentzMaps_mul hrepGauge_mul hrepLorentz_mul) + (isStableUnder_range_underived (F := bare f) (fun g φ => h.repGauge_bare g f ![] φ) + (h.repLorentz_bare f)) + (isStableUnder_iSup_range_derived (F := e f') + (fun g μ φ => h.repGauge_e g f' ![μ] φ) (h.repLorentz_e f')) + +include h in +/-- The `bare ∂ e` block submodule lies in the span of the block's components. -/ +lemma bareePairSubmodule_le_blockSpan (f f' : Fin 3) : + h.bareePairSubmodule f f' ≤ (h.bareeKineticBlock f f').blockSpan := by + rw [bareePairSubmodule, KineticBlock.blockSpan] + refine mul_le_of_le + (A := fun k => bare f (![] : Fin 0 → Fin 1 ⊕ Fin 3) (LeptonSinglet.basis.conj.dualBasis k)) + (C := fun k : (Fin 1 ⊕ Fin 3) × (Fin 2) => + e f' ![k.1] (LeptonSinglet.basis.dualBasis k.2)) + (le_of_eq (range_eq_iSup_span_dualBasis LeptonSinglet.basis.conj _)) (iSup_le fun μ => ?_) ?_ + · rw [range_eq_iSup_span_dualBasis LeptonSinglet.basis (e f' ![μ])] + exact iSup_le fun k => le_iSup_of_le (μ, k) le_rfl + · intro i j + exact Submodule.mem_iSup_of_mem (j.1, (i, j.2), (0, 0)) + (Submodule.mem_iSup_of_mem ![0, 0] (Submodule.mem_span_singleton_self _)) + +include h in +/-- The `bare ∂ e` block peels to its kinetic term. -/ +lemma peels_baree (f f' : Fin 3) : + Peels (gaugeLorentzMaps repGauge repLorentz) (h.bareePairSubmodule f f') + (ℂ ∙ (h.bareeKineticBlock f f').kineticTerm) := + ((h.bareeKineticBlock f f').peels).mono_left (h.bareePairSubmodule_le_blockSpan f f') + +/-! + +## C. The symbol ranges inside the derivative submodules, and the mass weight + +An underived symbol range lies in `derivSubmodule 0` and a once-derived one in +`derivSubmodule 1`, so every component of a kinetic block is a product of the two, which +is `massWeightSubmodule 8`. Each stage of a block's classification stays inside the span +of the stage before it, so the kinetic term is there too. + +-/ + +/-- A family of one derivative direction is the tuple of its own entry. -/ +lemma etaExpand_deriv_one (l : Fin 1 → Fin 1 ⊕ Fin 3) : ![l 0] = l := by + funext i + fin_cases i + rfl + +include h in +/-- The range of the down-singlet symbols lies in the derivative + submodule of its slots. -/ +lemma range_d_le_derivSubmodule {n : ℕ} (f : Fin 3) (l : Fin n → Fin 1 ⊕ Fin 3) : + LinearMap.range (d f l) ≤ h.derivSubmodule n := by + rw [derivSubmodule] + refine le_iSup_of_le f (le_iSup_of_le l ?_) + exact le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left + (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left + (le_sup_of_le_left (le_rfl))))))))) + +include h in +/-- The range of the conjugate down-singlet symbols lies in the derivative + submodule of its slots. -/ +lemma range_bard_le_derivSubmodule {n : ℕ} (f : Fin 3) (l : Fin n → Fin 1 ⊕ Fin 3) : + LinearMap.range (bard f l) ≤ h.derivSubmodule n := by + rw [derivSubmodule] + refine le_iSup_of_le f (le_iSup_of_le l ?_) + exact le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left + (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left + (le_sup_of_le_right (le_rfl))))))))) + +include h in +/-- The range of the up-singlet symbols lies in the derivative + submodule of its slots. -/ +lemma range_u_le_derivSubmodule {n : ℕ} (f : Fin 3) (l : Fin n → Fin 1 ⊕ Fin 3) : + LinearMap.range (u f l) ≤ h.derivSubmodule n := by + rw [derivSubmodule] + refine le_iSup_of_le f (le_iSup_of_le l ?_) + exact le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left + (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_right + (le_rfl)))))))) + +include h in +/-- The range of the conjugate up-singlet symbols lies in the derivative + submodule of its slots. -/ +lemma range_baru_le_derivSubmodule {n : ℕ} (f : Fin 3) (l : Fin n → Fin 1 ⊕ Fin 3) : + LinearMap.range (baru f l) ≤ h.derivSubmodule n := by + rw [derivSubmodule] + refine le_iSup_of_le f (le_iSup_of_le l ?_) + exact le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left + (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_right (le_rfl))))))) + +include h in +/-- The range of the quark-doublet symbols lies in the derivative + submodule of its slots. -/ +lemma range_Q_le_derivSubmodule {n : ℕ} (f : Fin 3) (l : Fin n → Fin 1 ⊕ Fin 3) : + LinearMap.range (Q f l) ≤ h.derivSubmodule n := by + rw [derivSubmodule] + refine le_iSup_of_le f (le_iSup_of_le l ?_) + exact le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left + (le_sup_of_le_left (le_sup_of_le_right (le_rfl)))))) + +include h in +/-- The range of the conjugate quark-doublet symbols lies in the derivative + submodule of its slots. -/ +lemma range_barQ_le_derivSubmodule {n : ℕ} (f : Fin 3) (l : Fin n → Fin 1 ⊕ Fin 3) : + LinearMap.range (barQ f l) ≤ h.derivSubmodule n := by + rw [derivSubmodule] + refine le_iSup_of_le f (le_iSup_of_le l ?_) + exact le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left + (le_sup_of_le_right (le_rfl))))) + +include h in +/-- The range of the lepton-doublet symbols lies in the derivative + submodule of its slots. -/ +lemma range_L_le_derivSubmodule {n : ℕ} (f : Fin 3) (l : Fin n → Fin 1 ⊕ Fin 3) : + LinearMap.range (L f l) ≤ h.derivSubmodule n := by + rw [derivSubmodule] + refine le_iSup_of_le f (le_iSup_of_le l ?_) + exact le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_right (le_rfl)))) + +include h in +/-- The range of the conjugate lepton-doublet symbols lies in the derivative + submodule of its slots. -/ +lemma range_barL_le_derivSubmodule {n : ℕ} (f : Fin 3) (l : Fin n → Fin 1 ⊕ Fin 3) : + LinearMap.range (barL f l) ≤ h.derivSubmodule n := by + rw [derivSubmodule] + refine le_iSup_of_le f (le_iSup_of_le l ?_) + exact le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_right (le_rfl))) + +include h in +/-- The range of the lepton-singlet symbols lies in the derivative + submodule of its slots. -/ +lemma range_e_le_derivSubmodule {n : ℕ} (f : Fin 3) (l : Fin n → Fin 1 ⊕ Fin 3) : + LinearMap.range (e f l) ≤ h.derivSubmodule n := by + rw [derivSubmodule] + refine le_iSup_of_le f (le_iSup_of_le l ?_) + exact le_sup_of_le_left (le_sup_of_le_right (le_rfl)) + +include h in +/-- The range of the conjugate lepton-singlet symbols lies in the derivative + submodule of its slots. -/ +lemma range_bare_le_derivSubmodule {n : ℕ} (f : Fin 3) (l : Fin n → Fin 1 ⊕ Fin 3) : + LinearMap.range (bare f l) ≤ h.derivSubmodule n := by + rw [derivSubmodule] + refine le_iSup_of_le f (le_iSup_of_le l ?_) + exact le_sup_of_le_right (le_rfl) + +include h in +/-- The kinetic term of the `d ∂ bard` block has mass weight eight: every component of the + block is an underived tower against a once-derived one. -/ +lemma dbardKineticTerm_mem_massWeightSubmodule (f f' : Fin 3) : + (h.dbardKineticBlock f f').kineticTerm ∈ h.massWeightSubmodule 8 := by + refine KineticBlock.kineticTerm_mem _ fun q l c c' w w' => ?_ + rw [h.massWeightSubmodule_eight_eq] + exact Submodule.mul_mem_mul (h.range_d_le_derivSubmodule f ![] ⟨_, rfl⟩) + (h.range_bard_le_derivSubmodule f' ![q] ⟨_, rfl⟩) + +include h in +/-- The kinetic term of the `bard ∂ d` block has mass weight eight: every component of the + block is an underived tower against a once-derived one. -/ +lemma barddKineticTerm_mem_massWeightSubmodule (f f' : Fin 3) : + (h.barddKineticBlock f f').kineticTerm ∈ h.massWeightSubmodule 8 := by + refine KineticBlock.kineticTerm_mem _ fun q l c c' w w' => ?_ + rw [h.massWeightSubmodule_eight_eq] + exact Submodule.mul_mem_mul (h.range_bard_le_derivSubmodule f ![] ⟨_, rfl⟩) + (h.range_d_le_derivSubmodule f' ![q] ⟨_, rfl⟩) + +include h in +/-- The kinetic term of the `u ∂ baru` block has mass weight eight: every component of the + block is an underived tower against a once-derived one. -/ +lemma ubaruKineticTerm_mem_massWeightSubmodule (f f' : Fin 3) : + (h.ubaruKineticBlock f f').kineticTerm ∈ h.massWeightSubmodule 8 := by + refine KineticBlock.kineticTerm_mem _ fun q l c c' w w' => ?_ + rw [h.massWeightSubmodule_eight_eq] + exact Submodule.mul_mem_mul (h.range_u_le_derivSubmodule f ![] ⟨_, rfl⟩) + (h.range_baru_le_derivSubmodule f' ![q] ⟨_, rfl⟩) + +include h in +/-- The kinetic term of the `baru ∂ u` block has mass weight eight: every component of the + block is an underived tower against a once-derived one. -/ +lemma baruuKineticTerm_mem_massWeightSubmodule (f f' : Fin 3) : + (h.baruuKineticBlock f f').kineticTerm ∈ h.massWeightSubmodule 8 := by + refine KineticBlock.kineticTerm_mem _ fun q l c c' w w' => ?_ + rw [h.massWeightSubmodule_eight_eq] + exact Submodule.mul_mem_mul (h.range_baru_le_derivSubmodule f ![] ⟨_, rfl⟩) + (h.range_u_le_derivSubmodule f' ![q] ⟨_, rfl⟩) + +include h in +/-- The kinetic term of the `Q ∂ barQ` block has mass weight eight: every component of the + block is an underived tower against a once-derived one. -/ +lemma QbarQKineticTerm_mem_massWeightSubmodule (f f' : Fin 3) : + (h.QbarQKineticBlock f f').kineticTerm ∈ h.massWeightSubmodule 8 := by + refine KineticBlock.kineticTerm_mem _ fun q l c c' w w' => ?_ + rw [h.massWeightSubmodule_eight_eq] + exact Submodule.mul_mem_mul (h.range_Q_le_derivSubmodule f ![] ⟨_, rfl⟩) + (h.range_barQ_le_derivSubmodule f' ![q] ⟨_, rfl⟩) + +include h in +/-- The kinetic term of the `barQ ∂ Q` block has mass weight eight: every component of the + block is an underived tower against a once-derived one. -/ +lemma barQQKineticTerm_mem_massWeightSubmodule (f f' : Fin 3) : + (h.barQQKineticBlock f f').kineticTerm ∈ h.massWeightSubmodule 8 := by + refine KineticBlock.kineticTerm_mem _ fun q l c c' w w' => ?_ + rw [h.massWeightSubmodule_eight_eq] + exact Submodule.mul_mem_mul (h.range_barQ_le_derivSubmodule f ![] ⟨_, rfl⟩) + (h.range_Q_le_derivSubmodule f' ![q] ⟨_, rfl⟩) + +include h in +/-- The kinetic term of the `L ∂ barL` block has mass weight eight: every component of the + block is an underived tower against a once-derived one. -/ +lemma LbarLKineticTerm_mem_massWeightSubmodule (f f' : Fin 3) : + (h.LbarLKineticBlock f f').kineticTerm ∈ h.massWeightSubmodule 8 := by + refine KineticBlock.kineticTerm_mem _ fun q l c c' w w' => ?_ + rw [h.massWeightSubmodule_eight_eq] + exact Submodule.mul_mem_mul (h.range_L_le_derivSubmodule f ![] ⟨_, rfl⟩) + (h.range_barL_le_derivSubmodule f' ![q] ⟨_, rfl⟩) + +include h in +/-- The kinetic term of the `barL ∂ L` block has mass weight eight: every component of the + block is an underived tower against a once-derived one. -/ +lemma barLLKineticTerm_mem_massWeightSubmodule (f f' : Fin 3) : + (h.barLLKineticBlock f f').kineticTerm ∈ h.massWeightSubmodule 8 := by + refine KineticBlock.kineticTerm_mem _ fun q l c c' w w' => ?_ + rw [h.massWeightSubmodule_eight_eq] + exact Submodule.mul_mem_mul (h.range_barL_le_derivSubmodule f ![] ⟨_, rfl⟩) + (h.range_L_le_derivSubmodule f' ![q] ⟨_, rfl⟩) + +include h in +/-- The kinetic term of the `e ∂ bare` block has mass weight eight: every component of the + block is an underived tower against a once-derived one. -/ +lemma ebareKineticTerm_mem_massWeightSubmodule (f f' : Fin 3) : + (h.ebareKineticBlock f f').kineticTerm ∈ h.massWeightSubmodule 8 := by + refine KineticBlock.kineticTerm_mem _ fun q l c c' w w' => ?_ + rw [h.massWeightSubmodule_eight_eq] + exact Submodule.mul_mem_mul (h.range_e_le_derivSubmodule f ![] ⟨_, rfl⟩) + (h.range_bare_le_derivSubmodule f' ![q] ⟨_, rfl⟩) + +include h in +/-- The kinetic term of the `bare ∂ e` block has mass weight eight: every component of the + block is an underived tower against a once-derived one. -/ +lemma bareeKineticTerm_mem_massWeightSubmodule (f f' : Fin 3) : + (h.bareeKineticBlock f f').kineticTerm ∈ h.massWeightSubmodule 8 := by + refine KineticBlock.kineticTerm_mem _ fun q l c c' w w' => ?_ + rw [h.massWeightSubmodule_eight_eq] + exact Submodule.mul_mem_mul (h.range_bare_le_derivSubmodule f ![] ⟨_, rfl⟩) + (h.range_e_le_derivSubmodule f' ![q] ⟨_, rfl⟩) + +/-! + +## D. The kinetic span + +The kinetic span of the fermion sector at mass weight eight: the join, over the ten +conjugate pairings and the nine pairs of generations, of the lines through the kinetic +terms. Each generator is a gauge and Lorentz invariant of mass weight eight, which is the +easy direction of the classification and what makes it an equivalence rather than an +inclusion. + +-/ + +set_option linter.unusedVariables false in +/-- The kinetic span of the fermion sector at mass weight eight: the join of the ten + conjugate pairings, each over the nine pairs of generations. -/ +noncomputable def kineticSpan (h : IsFermionSector B repGauge hrepGauge_mul repLorentz + hrepLorentz_mul d bard u baru Q barQ L barL e bare massWeightPoly) : Submodule ℂ B := + ⨆ (f : Fin 3) (f' : Fin 3), + ℂ ∙ (h.dbardKineticBlock f f').kineticTerm + ⊔ ℂ ∙ (h.barddKineticBlock f f').kineticTerm + ⊔ ℂ ∙ (h.ubaruKineticBlock f f').kineticTerm + ⊔ ℂ ∙ (h.baruuKineticBlock f f').kineticTerm + ⊔ ℂ ∙ (h.QbarQKineticBlock f f').kineticTerm + ⊔ ℂ ∙ (h.barQQKineticBlock f f').kineticTerm + ⊔ ℂ ∙ (h.LbarLKineticBlock f f').kineticTerm + ⊔ ℂ ∙ (h.barLLKineticBlock f f').kineticTerm + ⊔ ℂ ∙ (h.ebareKineticBlock f f').kineticTerm + ⊔ ℂ ∙ (h.bareeKineticBlock f f').kineticTerm + +include h in +/-- The line through the `dbard` kinetic term lies in the kinetic span. -/ +lemma span_dbard_le_kineticSpan (f f' : Fin 3) : + ℂ ∙ (h.dbardKineticBlock f f').kineticTerm ≤ h.kineticSpan := by + rw [kineticSpan] + refine le_iSup₂_of_le f f' ?_ + exact le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left + (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left + (le_sup_of_le_left (le_rfl))))))))) + +include h in +/-- The line through the `bardd` kinetic term lies in the kinetic span. -/ +lemma span_bardd_le_kineticSpan (f f' : Fin 3) : + ℂ ∙ (h.barddKineticBlock f f').kineticTerm ≤ h.kineticSpan := by + rw [kineticSpan] + refine le_iSup₂_of_le f f' ?_ + exact le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left + (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left + (le_sup_of_le_right (le_rfl))))))))) + +include h in +/-- The line through the `ubaru` kinetic term lies in the kinetic span. -/ +lemma span_ubaru_le_kineticSpan (f f' : Fin 3) : + ℂ ∙ (h.ubaruKineticBlock f f').kineticTerm ≤ h.kineticSpan := by + rw [kineticSpan] + refine le_iSup₂_of_le f f' ?_ + exact le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left + (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_right (le_rfl)))))))) + +include h in +/-- The line through the `baruu` kinetic term lies in the kinetic span. -/ +lemma span_baruu_le_kineticSpan (f f' : Fin 3) : + ℂ ∙ (h.baruuKineticBlock f f').kineticTerm ≤ h.kineticSpan := by + rw [kineticSpan] + refine le_iSup₂_of_le f f' ?_ + exact le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left + (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_right (le_rfl))))))) + +include h in +/-- The line through the `QbarQ` kinetic term lies in the kinetic span. -/ +lemma span_QbarQ_le_kineticSpan (f f' : Fin 3) : + ℂ ∙ (h.QbarQKineticBlock f f').kineticTerm ≤ h.kineticSpan := by + rw [kineticSpan] + refine le_iSup₂_of_le f f' ?_ + exact le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left + (le_sup_of_le_left (le_sup_of_le_right (le_rfl)))))) + +include h in +/-- The line through the `barQQ` kinetic term lies in the kinetic span. -/ +lemma span_barQQ_le_kineticSpan (f f' : Fin 3) : + ℂ ∙ (h.barQQKineticBlock f f').kineticTerm ≤ h.kineticSpan := by + rw [kineticSpan] + refine le_iSup₂_of_le f f' ?_ + exact le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left + (le_sup_of_le_right (le_rfl))))) + +include h in +/-- The line through the `LbarL` kinetic term lies in the kinetic span. -/ +lemma span_LbarL_le_kineticSpan (f f' : Fin 3) : + ℂ ∙ (h.LbarLKineticBlock f f').kineticTerm ≤ h.kineticSpan := by + rw [kineticSpan] + refine le_iSup₂_of_le f f' ?_ + exact le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_right (le_rfl)))) + +include h in +/-- The line through the `barLL` kinetic term lies in the kinetic span. -/ +lemma span_barLL_le_kineticSpan (f f' : Fin 3) : + ℂ ∙ (h.barLLKineticBlock f f').kineticTerm ≤ h.kineticSpan := by + rw [kineticSpan] + refine le_iSup₂_of_le f f' ?_ + exact le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_right (le_rfl))) + +include h in +/-- The line through the `ebare` kinetic term lies in the kinetic span. -/ +lemma span_ebare_le_kineticSpan (f f' : Fin 3) : + ℂ ∙ (h.ebareKineticBlock f f').kineticTerm ≤ h.kineticSpan := by + rw [kineticSpan] + refine le_iSup₂_of_le f f' ?_ + exact le_sup_of_le_left (le_sup_of_le_right (le_rfl)) + +include h in +/-- The line through the `baree` kinetic term lies in the kinetic span. -/ +lemma span_baree_le_kineticSpan (f f' : Fin 3) : + ℂ ∙ (h.bareeKineticBlock f f').kineticTerm ≤ h.kineticSpan := by + rw [kineticSpan] + refine le_iSup₂_of_le f f' ?_ + exact le_sup_of_le_right (le_rfl) + +include h in +/-- The kinetic span is fixed pointwise by both groups, each of its generators being a + gauge and Lorentz invariant. -/ +lemma isFixedBy_kineticSpan : + IsFixedBy (gaugeLorentzMaps repGauge repLorentz) h.kineticSpan := by + rw [kineticSpan] + refine isFixedBy_iSup fun f => isFixedBy_iSup fun f' => ?_ + exact IsFixedBy.sup + (IsFixedBy.sup + (IsFixedBy.sup + (IsFixedBy.sup + (IsFixedBy.sup + (IsFixedBy.sup + (IsFixedBy.sup + (IsFixedBy.sup + (IsFixedBy.sup + (isFixedBy_span_singleton (forall_gaugeLorentzMaps_eq_self_iff.2 + ⟨(h.dbardKineticBlock f f').repGauge_kineticTerm, + (h.dbardKineticBlock f f').repLorentz_kineticTerm⟩)) + (isFixedBy_span_singleton (forall_gaugeLorentzMaps_eq_self_iff.2 + ⟨(h.barddKineticBlock f f').repGauge_kineticTerm, + (h.barddKineticBlock f f').repLorentz_kineticTerm⟩))) + (isFixedBy_span_singleton (forall_gaugeLorentzMaps_eq_self_iff.2 + ⟨(h.ubaruKineticBlock f f').repGauge_kineticTerm, + (h.ubaruKineticBlock f f').repLorentz_kineticTerm⟩))) + (isFixedBy_span_singleton (forall_gaugeLorentzMaps_eq_self_iff.2 + ⟨(h.baruuKineticBlock f f').repGauge_kineticTerm, + (h.baruuKineticBlock f f').repLorentz_kineticTerm⟩))) + (isFixedBy_span_singleton (forall_gaugeLorentzMaps_eq_self_iff.2 + ⟨(h.QbarQKineticBlock f f').repGauge_kineticTerm, + (h.QbarQKineticBlock f f').repLorentz_kineticTerm⟩))) + (isFixedBy_span_singleton (forall_gaugeLorentzMaps_eq_self_iff.2 + ⟨(h.barQQKineticBlock f f').repGauge_kineticTerm, + (h.barQQKineticBlock f f').repLorentz_kineticTerm⟩))) + (isFixedBy_span_singleton (forall_gaugeLorentzMaps_eq_self_iff.2 + ⟨(h.LbarLKineticBlock f f').repGauge_kineticTerm, + (h.LbarLKineticBlock f f').repLorentz_kineticTerm⟩))) + (isFixedBy_span_singleton (forall_gaugeLorentzMaps_eq_self_iff.2 + ⟨(h.barLLKineticBlock f f').repGauge_kineticTerm, + (h.barLLKineticBlock f f').repLorentz_kineticTerm⟩))) + (isFixedBy_span_singleton (forall_gaugeLorentzMaps_eq_self_iff.2 + ⟨(h.ebareKineticBlock f f').repGauge_kineticTerm, + (h.ebareKineticBlock f f').repLorentz_kineticTerm⟩))) + (isFixedBy_span_singleton (forall_gaugeLorentzMaps_eq_self_iff.2 + ⟨(h.bareeKineticBlock f f').repGauge_kineticTerm, + (h.bareeKineticBlock f f').repLorentz_kineticTerm⟩)) + +include h in +/-- The kinetic span lies at mass weight eight. -/ +lemma kineticSpan_le_massWeightSubmodule : h.kineticSpan ≤ h.massWeightSubmodule 8 := by + rw [kineticSpan] + refine iSup_le fun f => iSup_le fun f' => ?_ + refine sup_le (sup_le (sup_le (sup_le (sup_le (sup_le (sup_le (sup_le (sup_le + ?_ ?_) ?_) ?_) ?_) ?_) ?_) ?_) ?_) ?_ + · exact (Submodule.span_singleton_le_iff_mem _ _).2 + (h.dbardKineticTerm_mem_massWeightSubmodule f f') + · exact (Submodule.span_singleton_le_iff_mem _ _).2 + (h.barddKineticTerm_mem_massWeightSubmodule f f') + · exact (Submodule.span_singleton_le_iff_mem _ _).2 + (h.ubaruKineticTerm_mem_massWeightSubmodule f f') + · exact (Submodule.span_singleton_le_iff_mem _ _).2 + (h.baruuKineticTerm_mem_massWeightSubmodule f f') + · exact (Submodule.span_singleton_le_iff_mem _ _).2 + (h.QbarQKineticTerm_mem_massWeightSubmodule f f') + · exact (Submodule.span_singleton_le_iff_mem _ _).2 + (h.barQQKineticTerm_mem_massWeightSubmodule f f') + · exact (Submodule.span_singleton_le_iff_mem _ _).2 + (h.LbarLKineticTerm_mem_massWeightSubmodule f f') + · exact (Submodule.span_singleton_le_iff_mem _ _).2 + (h.barLLKineticTerm_mem_massWeightSubmodule f f') + · exact (Submodule.span_singleton_le_iff_mem _ _).2 + (h.ebareKineticTerm_mem_massWeightSubmodule f f') + · exact (Submodule.span_singleton_le_iff_mem _ _).2 + (h.bareeKineticTerm_mem_massWeightSubmodule f f') + +include h in +/-- The kinetic span is a space of gauge invariants. -/ +lemma kineticSpan_le_invariants : h.kineticSpan ≤ repGauge.invariants := by + rw [kineticSpan] + refine iSup_le fun f => iSup_le fun f' => ?_ + refine sup_le (sup_le (sup_le (sup_le (sup_le (sup_le (sup_le (sup_le (sup_le + ?_ ?_) ?_) ?_) ?_) ?_) ?_) ?_) ?_) ?_ + · exact (Submodule.span_singleton_le_iff_mem _ _).2 + ((Representation.mem_invariants _ _).2 + (h.dbardKineticBlock f f').repGauge_kineticTerm) + · exact (Submodule.span_singleton_le_iff_mem _ _).2 + ((Representation.mem_invariants _ _).2 + (h.barddKineticBlock f f').repGauge_kineticTerm) + · exact (Submodule.span_singleton_le_iff_mem _ _).2 + ((Representation.mem_invariants _ _).2 + (h.ubaruKineticBlock f f').repGauge_kineticTerm) + · exact (Submodule.span_singleton_le_iff_mem _ _).2 + ((Representation.mem_invariants _ _).2 + (h.baruuKineticBlock f f').repGauge_kineticTerm) + · exact (Submodule.span_singleton_le_iff_mem _ _).2 + ((Representation.mem_invariants _ _).2 + (h.QbarQKineticBlock f f').repGauge_kineticTerm) + · exact (Submodule.span_singleton_le_iff_mem _ _).2 + ((Representation.mem_invariants _ _).2 + (h.barQQKineticBlock f f').repGauge_kineticTerm) + · exact (Submodule.span_singleton_le_iff_mem _ _).2 + ((Representation.mem_invariants _ _).2 + (h.LbarLKineticBlock f f').repGauge_kineticTerm) + · exact (Submodule.span_singleton_le_iff_mem _ _).2 + ((Representation.mem_invariants _ _).2 + (h.barLLKineticBlock f f').repGauge_kineticTerm) + · exact (Submodule.span_singleton_le_iff_mem _ _).2 + ((Representation.mem_invariants _ _).2 + (h.ebareKineticBlock f f').repGauge_kineticTerm) + · exact (Submodule.span_singleton_le_iff_mem _ _).2 + ((Representation.mem_invariants _ _).2 + (h.bareeKineticBlock f f').repGauge_kineticTerm) + +include h in +/-- The kinetic span is a space of Lorentz invariants. -/ +lemma kineticSpan_le_lorentzInvariants : h.kineticSpan ≤ repLorentz.invariants := by + rw [kineticSpan] + refine iSup_le fun f => iSup_le fun f' => ?_ + refine sup_le (sup_le (sup_le (sup_le (sup_le (sup_le (sup_le (sup_le (sup_le + ?_ ?_) ?_) ?_) ?_) ?_) ?_) ?_) ?_) ?_ + · exact (Submodule.span_singleton_le_iff_mem _ _).2 + ((Representation.mem_invariants _ _).2 + (h.dbardKineticBlock f f').repLorentz_kineticTerm) + · exact (Submodule.span_singleton_le_iff_mem _ _).2 + ((Representation.mem_invariants _ _).2 + (h.barddKineticBlock f f').repLorentz_kineticTerm) + · exact (Submodule.span_singleton_le_iff_mem _ _).2 + ((Representation.mem_invariants _ _).2 + (h.ubaruKineticBlock f f').repLorentz_kineticTerm) + · exact (Submodule.span_singleton_le_iff_mem _ _).2 + ((Representation.mem_invariants _ _).2 + (h.baruuKineticBlock f f').repLorentz_kineticTerm) + · exact (Submodule.span_singleton_le_iff_mem _ _).2 + ((Representation.mem_invariants _ _).2 + (h.QbarQKineticBlock f f').repLorentz_kineticTerm) + · exact (Submodule.span_singleton_le_iff_mem _ _).2 + ((Representation.mem_invariants _ _).2 + (h.barQQKineticBlock f f').repLorentz_kineticTerm) + · exact (Submodule.span_singleton_le_iff_mem _ _).2 + ((Representation.mem_invariants _ _).2 + (h.LbarLKineticBlock f f').repLorentz_kineticTerm) + · exact (Submodule.span_singleton_le_iff_mem _ _).2 + ((Representation.mem_invariants _ _).2 + (h.barLLKineticBlock f f').repLorentz_kineticTerm) + · exact (Submodule.span_singleton_le_iff_mem _ _).2 + ((Representation.mem_invariants _ _).2 + (h.ebareKineticBlock f f').repLorentz_kineticTerm) + · exact (Submodule.span_singleton_le_iff_mem _ _).2 + ((Representation.mem_invariants _ _).2 + (h.bareeKineticBlock f f').repLorentz_kineticTerm) + +/-! + +## E. The blocks peel to the kinetic terms + +The weight-zero piece of the gauge weight decomposition lies in the join of the ten block +submodules, hypercharge having already cut the hundred pairings down to ten; and each +block peels to its kinetic term, by the three stages its `KineticBlock` package supplies. +Joining the ten and then the nine generation pairs is `Peels.sup` and `Peels.iSup`, which +is where the stability of the blocks and of the kinetic span is spent. + +-/ + +set_option linter.unusedVariables false in +/-- The join of the ten block submodules over the nine pairs of generations. -/ +noncomputable def kineticBlockSubmodule (h : IsFermionSector B repGauge hrepGauge_mul + repLorentz hrepLorentz_mul d bard u baru Q barQ L barL e bare massWeightPoly) : + Submodule ℂ B := + ⨆ (f : Fin 3) (f' : Fin 3), + h.dbardPairSubmodule f f' + ⊔ h.barddPairSubmodule f f' + ⊔ h.ubaruPairSubmodule f f' + ⊔ h.baruuPairSubmodule f f' + ⊔ h.QbarQPairSubmodule f f' + ⊔ h.barQQPairSubmodule f f' + ⊔ h.LbarLPairSubmodule f f' + ⊔ h.barLLPairSubmodule f f' + ⊔ h.ebarePairSubmodule f f' + ⊔ h.bareePairSubmodule f f' + +include h in +/-- The weight-zero piece at mass weight eight lies in the join of the ten block + submodules: each of the ten conjugate pairings of + `massWeightSubmoduleGaugeWeightEight_piece_zero` is an underived range against a + once-derived one, and the derivative direction is joined over. -/ +lemma massWeightSubmoduleGaugeWeightEight_piece_zero_le : + (h.massWeightSubmoduleGaugeWeightEight).piece 0 ≤ h.kineticBlockSubmodule := by + rw [h.massWeightSubmoduleGaugeWeightEight_piece_zero, kineticBlockSubmodule] + simp only [dbardPairSubmodule, + barddPairSubmodule, + ubaruPairSubmodule, + baruuPairSubmodule, + QbarQPairSubmodule, + barQQPairSubmodule, + LbarLPairSubmodule, + barLLPairSubmodule, + ebarePairSubmodule, + bareePairSubmodule] + refine iSup_le fun f => iSup_le fun f' => iSup_le fun l' => ?_ + obtain ⟨μ, rfl⟩ : ∃ μ, l' = ![μ] := ⟨l' 0, (etaExpand_deriv_one l').symm⟩ + refine sup_le (sup_le (sup_le (sup_le (sup_le (sup_le (sup_le (sup_le (sup_le + ?_ ?_) ?_) ?_) ?_) ?_) ?_) ?_) ?_) ?_ + · refine (GaugeWeightDecomposition.piece_le_self _ 0).trans + (le_iSup₂_of_le f f' ?_) + exact le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left + (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left + (le_sup_of_le_left (mul_le_mul' le_rfl (le_iSup (fun ν : Fin 1 ⊕ Fin 3 => LinearMap.range + (bard f' ![ν])) μ)))))))))) + · refine (GaugeWeightDecomposition.piece_le_self _ 0).trans + (le_iSup₂_of_le f f' ?_) + exact le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left + (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left + (le_sup_of_le_right (mul_le_mul' le_rfl (le_iSup (fun ν : Fin 1 ⊕ Fin 3 => LinearMap.range + (d f' ![ν])) μ)))))))))) + · refine (GaugeWeightDecomposition.piece_le_self _ 0).trans + (le_iSup₂_of_le f f' ?_) + exact le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left + (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_right (mul_le_mul' + le_rfl (le_iSup (fun ν : Fin 1 ⊕ Fin 3 => LinearMap.range (baru f' ![ν])) μ))))))))) + · refine (GaugeWeightDecomposition.piece_le_self _ 0).trans + (le_iSup₂_of_le f f' ?_) + exact le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left + (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_right (mul_le_mul' le_rfl (le_iSup + (fun ν : Fin 1 ⊕ Fin 3 => LinearMap.range (u f' ![ν])) μ)))))))) + · refine (GaugeWeightDecomposition.piece_le_self _ 0).trans + (le_iSup₂_of_le f f' ?_) + exact le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left + (le_sup_of_le_left (le_sup_of_le_right (mul_le_mul' le_rfl (le_iSup (fun ν : Fin 1 ⊕ Fin 3 + => LinearMap.range (barQ f' ![ν])) μ))))))) + · refine (GaugeWeightDecomposition.piece_le_self _ 0).trans + (le_iSup₂_of_le f f' ?_) + exact le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left + (le_sup_of_le_right (mul_le_mul' le_rfl (le_iSup (fun ν : Fin 1 ⊕ Fin 3 => LinearMap.range + (Q f' ![ν])) μ)))))) + · refine (GaugeWeightDecomposition.piece_le_self _ 0).trans + (le_iSup₂_of_le f f' ?_) + exact le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_right + (mul_le_mul' le_rfl (le_iSup (fun ν : Fin 1 ⊕ Fin 3 => LinearMap.range (barL f' ![ν])) + μ))))) + · refine (GaugeWeightDecomposition.piece_le_self _ 0).trans + (le_iSup₂_of_le f f' ?_) + exact le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_right (mul_le_mul' le_rfl (le_iSup + (fun ν : Fin 1 ⊕ Fin 3 => LinearMap.range (L f' ![ν])) μ)))) + · refine (GaugeWeightDecomposition.piece_le_self _ 0).trans + (le_iSup₂_of_le f f' ?_) + exact le_sup_of_le_left (le_sup_of_le_right (mul_le_mul' le_rfl (le_iSup (fun ν : Fin 1 ⊕ + Fin 3 => LinearMap.range (bare f' ![ν])) μ))) + · refine (GaugeWeightDecomposition.piece_le_self _ 0).trans + (le_iSup₂_of_le f f' ?_) + exact le_sup_of_le_right (mul_le_mul' le_rfl (le_iSup (fun ν : Fin 1 ⊕ Fin 3 => + LinearMap.range (e f' ![ν])) μ)) + +include h in +/-- The join of the ten block submodules peels to the kinetic span. -/ +lemma peels_kineticBlockSubmodule : + Peels (gaugeLorentzMaps repGauge repLorentz) h.kineticBlockSubmodule h.kineticSpan := by + have hW : IsStableUnder (gaugeLorentzMaps repGauge repLorentz) h.kineticSpan := + h.isFixedBy_kineticSpan.isStableUnder + have hS : ∀ f f' : Fin 3, IsStableUnder (gaugeLorentzMaps repGauge repLorentz) + ( + h.dbardPairSubmodule f f' + ⊔ h.barddPairSubmodule f f' + ⊔ h.ubaruPairSubmodule f f' + ⊔ h.baruuPairSubmodule f f' + ⊔ h.QbarQPairSubmodule f f' + ⊔ h.barQQPairSubmodule f f' + ⊔ h.LbarLPairSubmodule f f' + ⊔ h.barLLPairSubmodule f f' + ⊔ h.ebarePairSubmodule f f' + ⊔ h.bareePairSubmodule f f') := fun f f' => + IsStableUnder.sup + (IsStableUnder.sup + (IsStableUnder.sup + (IsStableUnder.sup + (IsStableUnder.sup + (IsStableUnder.sup + (IsStableUnder.sup + (IsStableUnder.sup + (IsStableUnder.sup + (h.isStableUnder_dbardPairSubmodule f f') + (h.isStableUnder_barddPairSubmodule f f')) + (h.isStableUnder_ubaruPairSubmodule f f')) + (h.isStableUnder_baruuPairSubmodule f f')) + (h.isStableUnder_QbarQPairSubmodule f f')) + (h.isStableUnder_barQQPairSubmodule f f')) + (h.isStableUnder_LbarLPairSubmodule f f')) + (h.isStableUnder_barLLPairSubmodule f f')) + (h.isStableUnder_ebarePairSubmodule f f')) + (h.isStableUnder_bareePairSubmodule f f') + have hP : ∀ f f' : Fin 3, Peels (gaugeLorentzMaps repGauge repLorentz) + ( + h.dbardPairSubmodule f f' + ⊔ h.barddPairSubmodule f f' + ⊔ h.ubaruPairSubmodule f f' + ⊔ h.baruuPairSubmodule f f' + ⊔ h.QbarQPairSubmodule f f' + ⊔ h.barQQPairSubmodule f f' + ⊔ h.LbarLPairSubmodule f f' + ⊔ h.barLLPairSubmodule f f' + ⊔ h.ebarePairSubmodule f f' + ⊔ h.bareePairSubmodule f f') h.kineticSpan := fun f f' => + Peels.sup + (Peels.sup + (Peels.sup + (Peels.sup + (Peels.sup + (Peels.sup + (Peels.sup + (Peels.sup + (Peels.sup + ((h.peels_dbard f f').mono_right (h.span_dbard_le_kineticSpan f f')) + ((h.peels_bardd f f').mono_right (h.span_bardd_le_kineticSpan f f')) + (h.isStableUnder_barddPairSubmodule f f') hW) + ((h.peels_ubaru f f').mono_right (h.span_ubaru_le_kineticSpan f f')) + (h.isStableUnder_ubaruPairSubmodule f f') hW) + ((h.peels_baruu f f').mono_right (h.span_baruu_le_kineticSpan f f')) + (h.isStableUnder_baruuPairSubmodule f f') hW) + ((h.peels_QbarQ f f').mono_right (h.span_QbarQ_le_kineticSpan f f')) + (h.isStableUnder_QbarQPairSubmodule f f') hW) + ((h.peels_barQQ f f').mono_right (h.span_barQQ_le_kineticSpan f f')) + (h.isStableUnder_barQQPairSubmodule f f') hW) + ((h.peels_LbarL f f').mono_right (h.span_LbarL_le_kineticSpan f f')) + (h.isStableUnder_LbarLPairSubmodule f f') hW) + ((h.peels_barLL f f').mono_right (h.span_barLL_le_kineticSpan f f')) + (h.isStableUnder_barLLPairSubmodule f f') hW) + ((h.peels_ebare f f').mono_right (h.span_ebare_le_kineticSpan f f')) + (h.isStableUnder_ebarePairSubmodule f f') hW) + ((h.peels_baree f f').mono_right (h.span_baree_le_kineticSpan f f')) + (h.isStableUnder_bareePairSubmodule f f') hW + rw [kineticBlockSubmodule] + exact Peels.iSup (fun f => Peels.iSup (hP f) (hS f) hW) + (fun f => isStableUnder_iSup fun f' => hS f f') hW + +/-! + +## F. The classification as an equivalence + +The two directions meet. Forwards: hypercharge puts a gauge invariant in the weight-zero +piece, section E peels that down to the kinetic span, and what is left over is in `S` and +is itself invariant, the kinetic span being made of invariants. Backwards: the kinetic +span is a space of gauge and Lorentz invariants of mass weight eight, so splitting `x` as +`(x - y) + y` puts it back together. + +So the fermion sector at mass weight eight carries exactly the kinetic terms — one for +each species, each pair of generations and each placement of the derivative — and nothing +else. Compare mass weight six, where the same argument leaves nothing at all: without a +derivative there is no four-vector index for the conjugate Pauli matrices to carry, and +the Dirac mass term does not exist. + +-/ + +include h in +/-- The classification of the mass-weight eight invariants: an element of + `massWeightSubmodule 8 ⊔ S` fixed by both groups is a combination of the kinetic terms + up to a remainder in `S` that is itself fixed by both groups. -/ +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) + (hG : ∀ g : GaugeGroupI, repGauge g x = x) + (hL : ∀ 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.kineticSpan := by + have hzero : x ∈ (h.massWeightSubmoduleGaugeWeightEight).piece 0 ⊔ S := + mem_piece_zero_sup_of_invariant _ (fun i y hy => hS _ y hy) hx hG + have hblk : x ∈ h.kineticBlockSubmodule ⊔ S := + sup_le_sup_right h.massWeightSubmoduleGaugeWeightEight_piece_zero_le S hzero + have hSstab : IsStableUnder (gaugeLorentzMaps repGauge repLorentz) S := + isStableUnder_gaugeLorentzMaps_iff.2 ⟨hS, hSL⟩ + have hxinv : ∀ p, gaugeLorentzMaps repGauge repLorentz p x = x := + forall_gaugeLorentzMaps_eq_self_iff.2 ⟨hG, hL⟩ + obtain ⟨z, hz, y, hy, hzy⟩ := Submodule.mem_sup.1 + (h.peels_kineticBlockSubmodule S hSstab x hblk hxinv) + have hzG := (Representation.mem_invariants _ _).1 (h.kineticSpan_le_invariants hz) + have hzL := (Representation.mem_invariants _ _).1 (h.kineticSpan_le_lorentzInvariants hz) + refine ⟨y, hy, fun g => ?_, fun g => ?_, ?_⟩ + · have hxg := hG g + rw [← hzy, map_add, hzG g] at hxg + exact add_left_cancel hxg + · have hxg := hL g + rw [← hzy, map_add, hzL g] at hxg + exact add_left_cancel hxg + · rw [← hzy] + simpa using hz + +include h in +/-- The classification of mass weight eight as an equivalence, in the shape of the + sibling sectors: an element of `massWeightSubmodule 8 ⊔ S` is fixed by both groups + exactly when it is a combination of the kinetic terms 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 an invariant of mass weight eight by + section D. -/ +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.kineticSpan := 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.kineticSpan_le_massWeightSubmodule hxy + have hzG := (Representation.mem_invariants _ _).1 (h.kineticSpan_le_invariants hxy) + have hzL := (Representation.mem_invariants _ _).1 (h.kineticSpan_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, hzG g, hyG g] + simpa using hstep + · have hstep : repLorentz g (x - y + y) = x - y + y := by rw [map_add, hzL g, hyL g] + simpa using hstep + + +end IsFermionSector + +end StandardModel diff --git a/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/MassDimLTEight.lean b/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/MassDimLTEight.lean new file mode 100644 index 000000000..ad93bdaf1 --- /dev/null +++ b/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/MassDimLTEight.lean @@ -0,0 +1,792 @@ +/- +Copyright (c) 2026 Joseph Tooby-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.Components +public import Physlib.Particles.StandardModel.IsFermionSector.MassWeight.GaugeWeightDecomposition +public import Physlib.Relativity.LorentzGroup.Invariants.IsVectorLeftRightWeyl +public import Physlib.Particles.StandardModel.Peeling +/-! +# The invariants below mass weight eight + +The fermion sector carries nothing invariant below mass weight eight. Weights one, two +and four are trivial submodules and weights three, five and seven are single fermion +towers, which carry a nonzero hypercharge and so no gauge singlet. That leaves mass +weight six, the products of two underived towers, and it is the interesting one: it is +where a Dirac mass term `ψ̄ ψ` would sit, and the statement proved here is that no such +term exists. + +The two symmetries cooperate. Gauge invariance cuts the hundred pairings of two fermion +symbols down to the ten conjugate ones, `d bard`, `bard d`, `u baru`, ..., `bare e`, +every other pairing having hypercharges that cannot cancel; this is +`massWeightSubmoduleGaugeWeightSix_piece_zero` of the gauge weight decomposition. Each +surviving pairing is then a product of two symbols of opposite chirality, one dotted and +one undotted, since a species and its conjugate always sit in opposite Weyl +representations. A pair of opposite-chirality spinor indices with nothing else to +contract against admits no invariant at all — `Lorentz.IsDualLeftRightWeyl.eq_zero_of_invariant` +— so each pairing contributes nothing and mass weight six is left empty. + +That is the absence of a Dirac mass term in the Standard Model, and it is why the fermion +masses have to come from the Yukawa sector instead: the Higgs doublet supplies the missing +index, and its own mass weight makes the Yukawa terms weight eight. + +The chirality bookkeeping is done once and reused at mass weight eight, in +`MassDimEight`, which imports this file: the five undotted species are indexed by +`LeftIdx` and the five dotted ones by `RightIdx`, and `leftComp` and `rightComp` list +their components with the spinor index singled out. + +- A. Chiral component families +- B. The products of an opposite-chirality pair +- C. Peeling the pair spans off a Lorentz-stable submodule +- D. The five undotted and the five dotted species +- E. The ranges of the symbol maps inside the chirality spans +- F. Gauge invariants and the weight-zero piece +- G. Mass weight six: no Dirac mass term +- 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 IsFermionSector + +/-! + +## A. Chiral component families + +A fermion symbol carries exactly one spinor index, and which of the two Weyl +representations it sits in is fixed by the species. Freezing every other index leaves a +two-element family of elements of `B`, and the two possible transformation laws are +recorded here. Both are contragredient, the symbols eating a covector of their value +space; the dotted law carries the extra complex conjugation. + +-/ + +section ChiralFamilies + +variable {B : Type} [Ring B] [Algebra ℂ B] {repLorentz : Representation ℂ SL(2,ℂ) B} + +/-- A two-element family `X` of elements of `B` carries a dual undotted spinor index: it + transforms by the contragredient of the left-handed Weyl representation. -/ +def IsDualLeftWeyl (repLorentz : Representation ℂ SL(2,ℂ) B) (X : Fin 2 → B) : Prop := + ∀ (Λ : SL(2,ℂ)) (a : Fin 2), repLorentz Λ (X a) = ∑ β, (Λ⁻¹).1 a β • X β + +/-- A two-element family `Y` of elements of `B` carries a dual dotted spinor index: it + transforms by the contragredient of the right-handed Weyl representation, which is the + conjugate of the undotted law. -/ +def IsDualRightWeyl (repLorentz : Representation ℂ SL(2,ℂ) B) (Y : Fin 2 → B) : Prop := + ∀ (Λ : SL(2,ℂ)) (a : Fin 2), repLorentz Λ (Y a) = ∑ β, star ((Λ⁻¹).1 a β) • Y β + +/-- A family `X` carrying one four-vector index and one dual undotted spinor index: the + once-derived form of `IsDualLeftWeyl`, the derivative slot moving by the columns of the + Lorentz matrix. Only the value index of a fermion symbol is dualised, so the derivative + slot keeps the plain Lorentz law. -/ +def IsVectorDualLeftWeyl (repLorentz : Representation ℂ SL(2,ℂ) B) + (X : (Fin 1 ⊕ Fin 3) → Fin 2 → B) : Prop := + ∀ (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) (a : Fin 2), repLorentz Λ (X μ a) + = ∑ ν, ∑ β, ((((SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * (Λ⁻¹).1 a β) • X ν β + +/-- A family `Y` carrying one four-vector index and one dual dotted spinor index: the + once-derived form of `IsDualRightWeyl`. -/ +def IsVectorDualRightWeyl (repLorentz : Representation ℂ SL(2,ℂ) B) + (Y : (Fin 1 ⊕ Fin 3) → Fin 2 → B) : Prop := + ∀ (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) (a : Fin 2), repLorentz Λ (Y μ a) + = ∑ ν, ∑ β, ((((SL2C.toLorentzGroup Λ).1 ν μ : ℝ) : ℂ) * star ((Λ⁻¹).1 a β)) • Y ν β + +/-! + +## B. The products of an opposite-chirality pair + +Multiplying an undotted family by a dotted one gives a family of two opposite-chirality +spinor indices, which is what `Lorentz.IsDualLeftRightWeyl` classifies, and the four +lemmas here supply that classification in each of the four arrangements that the fermion +sector produces: the two orders of the product, each with and without a derivative on the +second factor. The representation being multiplicative is all that is needed, the two +factors transforming independently. + +-/ + +variable (hrepLorentz_mul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂) + +include hrepLorentz_mul + +/-- An undotted family times a dotted one is a dual left-right Weyl family. -/ +lemma isDualLeftRightWeyl_mul {X Y : Fin 2 → B} (hX : IsDualLeftWeyl repLorentz X) + (hY : IsDualRightWeyl repLorentz Y) : + IsDualLeftRightWeyl B repLorentz (fun l => X l.1 * Y l.2) where + repLorentz_T g l := by + rw [hrepLorentz_mul, hX g l.1, hY g l.2, Finset.sum_mul_sum, Fintype.sum_prod_type] + refine Finset.sum_congr rfl fun a _ => Finset.sum_congr rfl fun b _ => ?_ + rw [smul_mul_smul_comm] + congr 1 + rw [Matrix.transpose_apply, Matrix.conjTranspose_apply, ← SL2C.inverse_coe] + +/-- A dotted family times an undotted one is a dual left-right Weyl family, the two + spinor slots exchanged. -/ +lemma isDualLeftRightWeyl_mul_swap {X Y : Fin 2 → B} (hX : IsDualRightWeyl repLorentz X) + (hY : IsDualLeftWeyl repLorentz Y) : + IsDualLeftRightWeyl B repLorentz (fun l => X l.2 * Y l.1) where + repLorentz_T g l := by + rw [hrepLorentz_mul, hX g l.2, hY g l.1, Finset.sum_mul_sum, Fintype.sum_prod_type, + Finset.sum_comm] + refine Finset.sum_congr rfl fun a _ => Finset.sum_congr rfl fun b _ => ?_ + rw [smul_mul_smul_comm] + congr 1 + rw [Matrix.transpose_apply, Matrix.conjTranspose_apply, ← SL2C.inverse_coe] + ring + +/-- An undotted family times a once-derived dotted one is a vector dual left-right Weyl + family: the derivative supplies the four-vector index. -/ +lemma isVectorDualLeftRightWeyl_mul {X : Fin 2 → B} {Y : (Fin 1 ⊕ Fin 3) → Fin 2 → B} + (hX : IsDualLeftWeyl repLorentz X) (hY : IsVectorDualRightWeyl repLorentz Y) : + IsVectorDualLeftRightWeyl B repLorentz (fun p => X p.2.1 * Y p.1 p.2.2) where + repLorentz_T g μ l := by + rw [hrepLorentz_mul, hX g l.1, hY g μ l.2, Finset.sum_mul_sum, Finset.sum_comm] + refine Finset.sum_congr rfl fun ν _ => ?_ + rw [Fintype.sum_prod_type] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [Finset.mul_sum] + refine Finset.sum_congr rfl fun b _ => ?_ + rw [smul_mul_smul_comm] + congr 1 + rw [Matrix.transpose_apply, Matrix.conjTranspose_apply, ← SL2C.inverse_coe] + ring + +/-- A dotted family times a once-derived undotted one is a vector dual left-right Weyl + family, the two spinor slots exchanged. -/ +lemma isVectorDualLeftRightWeyl_mul_swap {X : Fin 2 → B} {Y : (Fin 1 ⊕ Fin 3) → Fin 2 → B} + (hX : IsDualRightWeyl repLorentz X) (hY : IsVectorDualLeftWeyl repLorentz Y) : + IsVectorDualLeftRightWeyl B repLorentz (fun p => X p.2.2 * Y p.1 p.2.1) where + repLorentz_T g μ l := by + rw [hrepLorentz_mul, hX g l.2, hY g μ l.1, Finset.sum_mul_sum, Finset.sum_comm] + refine Finset.sum_congr rfl fun ν _ => ?_ + rw [Fintype.sum_prod_type, Finset.sum_comm] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [Finset.mul_sum] + refine Finset.sum_congr rfl fun b _ => ?_ + rw [smul_mul_smul_comm] + congr 1 + rw [Matrix.transpose_apply, Matrix.conjTranspose_apply, ← SL2C.inverse_coe] + ring + +end ChiralFamilies + + +/-! + +## C. Peeling the pair spans off a Lorentz-stable submodule + +A dual left-right Weyl family carries no invariant, so its span can be discarded from a +Lorentz-stable submodule; iterating over a finite family of them discards a whole join. +The induction is the same one the gauge sector runs in `IsGaugeSector`, the span of the +components of each family being stable under the Lorentz group. + +-/ + +section Peeling + +variable {B : Type} [AddCommGroup B] [Module ℂ B] {repLorentz : Representation ℂ SL(2,ℂ) B} + +/-- The span of the components of a dual left-right Weyl family is stable under the + Lorentz group: each component transforms into a combination of components. -/ +lemma isDualLeftRightWeyl_span_stable {T : Fin 2 × Fin 2 → B} + (hT : IsDualLeftRightWeyl B repLorentz T) (g : SL(2,ℂ)) {y : B} + (hy : y ∈ ⨆ l, ℂ ∙ T l) : repLorentz g y ∈ ⨆ l, ℂ ∙ T l := by + have key : (⨆ l, ℂ ∙ T l) ≤ Submodule.comap (repLorentz g) (⨆ l, ℂ ∙ T l) := by + refine iSup_le fun l => ?_ + rw [Submodule.span_singleton_le_iff_mem, Submodule.mem_comap, hT.repLorentz_T] + exact Submodule.sum_mem _ fun a _ => Submodule.smul_mem _ _ + (Submodule.mem_iSup_of_mem a (Submodule.mem_span_singleton_self _)) + exact key hy + +/-- Peeling a finite join of the spans of dual left-right Weyl families off a + Lorentz-stable submodule: such a family has no invariant, so a Lorentz invariant of the + join together with `S` lies in `S`. -/ +lemma mem_of_lorentz_invariant_biSup_dualLeftRightWeyl_span {ι : Type} [DecidableEq ι] + {T : ι → Fin 2 × Fin 2 → B} (hT : ∀ i, IsDualLeftRightWeyl 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, ⨆ l, ℂ ∙ T i l) ⊔ 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 ι), ⨆ l, ℂ ∙ T i l) = ⊥ 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, ⨆ l, ℂ ∙ T i l) ⊔ S, + repLorentz g y ∈ (⨆ i ∈ s, ⨆ l, ℂ ∙ T i l) ⊔ S := by + intro g y hy + have key : ((⨆ i ∈ s, ⨆ l, ℂ ∙ T i l) ⊔ S) + ≤ Submodule.comap (repLorentz g) ((⨆ i ∈ s, ⨆ l, ℂ ∙ T i l) ⊔ 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 (isDualLeftRightWeyl_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 + +/-- The version of `mem_of_lorentz_invariant_biSup_dualLeftRightWeyl_span` joining over a + whole finite index type. -/ +lemma mem_of_lorentz_invariant_iSup_dualLeftRightWeyl_span {ι : Type} [Fintype ι] + [DecidableEq ι] {T : ι → Fin 2 × Fin 2 → B} + (hT : ∀ i, IsDualLeftRightWeyl B repLorentz (T i)) (S : Submodule ℂ B) + (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) {x : B} + (hx : x ∈ (⨆ i, ⨆ l, ℂ ∙ T i l) ⊔ S) + (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by + refine mem_of_lorentz_invariant_biSup_dualLeftRightWeyl_span hT S hS Finset.univ ?_ hinv + refine sup_le_sup_right (iSup_le fun i => ?_) S hx + exact le_iSup₂_of_le i (Finset.mem_univ i) le_rfl + +end Peeling + + +/-! + +## D. The five undotted and the five dotted species + +Each of the ten fermion species sits in one of the two Weyl representations, and a +species and its conjugate always sit in opposite ones. The five undotted species are +`bard`, `baru`, `Q`, `L` and `bare`, the five dotted ones `d`, `u`, `barQ`, `barL` and +`e`. Indexing each list by the generation and the remaining internal indices, `leftComp` +and `rightComp` present every fermion component as a two-element family in its spinor +index, which is the shape section A asks for. + +-/ + +/-- An index for the components of the five undotted fermion species: the generation + together with the colour and isospin the species carries. -/ +inductive LeftIdx + | bard (f : Fin 3) (c : Fin 3) + | baru (f : Fin 3) (c : Fin 3) + | Q (f : Fin 3) (c : Fin 3) (s : Fin 2) + | L (f : Fin 3) (s : Fin 2) + | bare (f : Fin 3) + deriving DecidableEq, Fintype + +/-- An index for the components of the five dotted fermion species: the generation + together with the colour and isospin the species carries. -/ +inductive RightIdx + | d (f : Fin 3) (c : Fin 3) + | u (f : Fin 3) (c : Fin 3) + | barQ (f : Fin 3) (c : Fin 3) (s : Fin 2) + | barL (f : Fin 3) (s : Fin 2) + | e (f : Fin 3) + deriving DecidableEq, Fintype + +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 components of the five undotted species at the derivative slots `l`, presented as + a two-element family in the spinor index. -/ +noncomputable def leftComp (h : IsFermionSector B repGauge hrepGauge_mul repLorentz + hrepLorentz_mul d bard u baru Q barQ L barL e bare massWeightPoly) + {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : LeftIdx → Fin 2 → B + | .bard f c => fun a => h.bardComponent f l (a, c) + | .baru f c => fun a => h.baruComponent f l (a, c) + | .Q f c s => fun a => h.QComponent f l (a, c, s) + | .L f s => fun a => h.LComponent f l (a, s) + | .bare f => fun a => h.bareComponent f l a + +set_option linter.unusedVariables false in +/-- The components of the five dotted species at the derivative slots `l`, presented as a + two-element family in the spinor index. -/ +noncomputable def rightComp (h : IsFermionSector B repGauge hrepGauge_mul repLorentz + hrepLorentz_mul d bard u baru Q barQ L barL e bare massWeightPoly) + {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : RightIdx → Fin 2 → B + | .d f c => fun a => h.dComponent f l (a, c) + | .u f c => fun a => h.uComponent f l (a, c) + | .barQ f c s => fun a => h.barQComponent f l (a, c, s) + | .barL f s => fun a => h.barLComponent f l (a, s) + | .e f => fun a => h.eComponent f l a + +/-- Every undotted component family carries a dual undotted spinor index, at zero + covariant derivatives. -/ +lemma isDualLeftWeyl_leftComp (i : LeftIdx) : + IsDualLeftWeyl repLorentz (h.leftComp ![] i) := by + cases i with + | bard f c => exact fun Λ a => h.repLorentz_bardComponent Λ f ![] (a, c) + | baru f c => exact fun Λ a => h.repLorentz_baruComponent Λ f ![] (a, c) + | Q f c s => exact fun Λ a => h.repLorentz_QComponent Λ f ![] (a, c, s) + | L f s => exact fun Λ a => h.repLorentz_LComponent Λ f ![] (a, s) + | bare f => exact fun Λ a => h.repLorentz_bareComponent Λ f ![] a + +/-- Every dotted component family carries a dual dotted spinor index, at zero covariant + derivatives. -/ +lemma isDualRightWeyl_rightComp (i : RightIdx) : + IsDualRightWeyl repLorentz (h.rightComp ![] i) := by + cases i with + | d f c => exact fun Λ a => h.repLorentz_dComponent Λ f ![] (a, c) + | u f c => exact fun Λ a => h.repLorentz_uComponent Λ f ![] (a, c) + | barQ f c s => exact fun Λ a => h.repLorentz_barQComponent Λ f ![] (a, c, s) + | barL f s => exact fun Λ a => h.repLorentz_barLComponent Λ f ![] (a, s) + | e f => exact fun Λ a => h.repLorentz_eComponent Λ f ![] a + + +/-! + +## E. The ranges of the symbol maps inside the chirality spans + +A symbol map is determined by its values on a basis of the dual of its value space, so +its range is the join of the lines through its components; `range_eq_iSup_span` says so. +Collecting the ten ranges into the two chirality spans is then a matter of naming the +right index. + +-/ + +/-- The join of the lines through the components of the five undotted species. -/ +noncomputable def leftSpan (h : IsFermionSector B repGauge hrepGauge_mul repLorentz + hrepLorentz_mul d bard u baru Q barQ L barL e bare massWeightPoly) + {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : Submodule ℂ B := + ⨆ (i : LeftIdx) (a : Fin 2), ℂ ∙ h.leftComp l i a + +/-- The join of the lines through the components of the five dotted species. -/ +noncomputable def rightSpan (h : IsFermionSector B repGauge hrepGauge_mul repLorentz + hrepLorentz_mul d bard u baru Q barQ L barL e bare massWeightPoly) + {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : Submodule ℂ B := + ⨆ (i : RightIdx) (a : Fin 2), ℂ ∙ h.rightComp l i a + +/-- A basis vector of the dual basis is the matching coordinate functional. -/ +lemma dualBasis_apply {ι M : Type} [AddCommGroup M] [Module ℂ M] [Fintype ι] + [DecidableEq ι] (b : Module.Basis ι ℂ M) (j : ι) : b.dualBasis j = b.coord j := + congrFun (Module.Basis.coe_dualBasis b) j + +/-- The range of the `bard` symbols lies in the undotted span. -/ +lemma range_bard_le_leftSpan (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : + LinearMap.range (bard f l) ≤ h.leftSpan l := by + rw [range_eq_iSup_span (DownSinglet.basis.conj) (bard f l)] + refine iSup_le fun j => ?_ + rw [Submodule.span_singleton_le_iff_mem, ← dualBasis_apply] + exact Submodule.mem_iSup_of_mem (.bard f j.2) + (Submodule.mem_iSup_of_mem j.1 (Submodule.mem_span_singleton_self _)) + +/-- The range of the `baru` symbols lies in the undotted span. -/ +lemma range_baru_le_leftSpan (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : + LinearMap.range (baru f l) ≤ h.leftSpan l := by + rw [range_eq_iSup_span (UpSinglet.basis.conj) (baru f l)] + refine iSup_le fun j => ?_ + rw [Submodule.span_singleton_le_iff_mem, ← dualBasis_apply] + exact Submodule.mem_iSup_of_mem (.baru f j.2) + (Submodule.mem_iSup_of_mem j.1 (Submodule.mem_span_singleton_self _)) + +/-- The range of the `Q` symbols lies in the undotted span. -/ +lemma range_Q_le_leftSpan (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : + LinearMap.range (Q f l) ≤ h.leftSpan l := by + rw [range_eq_iSup_span (QuarkDoublet.basis) (Q f l)] + refine iSup_le fun j => ?_ + rw [Submodule.span_singleton_le_iff_mem, ← dualBasis_apply] + exact Submodule.mem_iSup_of_mem (.Q f j.2.1 j.2.2) + (Submodule.mem_iSup_of_mem j.1 (Submodule.mem_span_singleton_self _)) + +/-- The range of the `L` symbols lies in the undotted span. -/ +lemma range_L_le_leftSpan (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : + LinearMap.range (L f l) ≤ h.leftSpan l := by + rw [range_eq_iSup_span (LeptonDoublet.basis) (L f l)] + refine iSup_le fun j => ?_ + rw [Submodule.span_singleton_le_iff_mem, ← dualBasis_apply] + exact Submodule.mem_iSup_of_mem (.L f j.2) + (Submodule.mem_iSup_of_mem j.1 (Submodule.mem_span_singleton_self _)) + +/-- The range of the `bare` symbols lies in the undotted span. -/ +lemma range_bare_le_leftSpan (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : + LinearMap.range (bare f l) ≤ h.leftSpan l := by + rw [range_eq_iSup_span (LeptonSinglet.basis.conj) (bare f l)] + refine iSup_le fun j => ?_ + rw [Submodule.span_singleton_le_iff_mem, ← dualBasis_apply] + exact Submodule.mem_iSup_of_mem (.bare f) + (Submodule.mem_iSup_of_mem j (Submodule.mem_span_singleton_self _)) + +/-- The range of the `d` symbols lies in the dotted span. -/ +lemma range_d_le_rightSpan (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : + LinearMap.range (d f l) ≤ h.rightSpan l := by + rw [range_eq_iSup_span (DownSinglet.basis) (d f l)] + refine iSup_le fun j => ?_ + rw [Submodule.span_singleton_le_iff_mem, ← dualBasis_apply] + exact Submodule.mem_iSup_of_mem (.d f j.2) + (Submodule.mem_iSup_of_mem j.1 (Submodule.mem_span_singleton_self _)) + +/-- The range of the `u` symbols lies in the dotted span. -/ +lemma range_u_le_rightSpan (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : + LinearMap.range (u f l) ≤ h.rightSpan l := by + rw [range_eq_iSup_span (UpSinglet.basis) (u f l)] + refine iSup_le fun j => ?_ + rw [Submodule.span_singleton_le_iff_mem, ← dualBasis_apply] + exact Submodule.mem_iSup_of_mem (.u f j.2) + (Submodule.mem_iSup_of_mem j.1 (Submodule.mem_span_singleton_self _)) + +/-- The range of the `barQ` symbols lies in the dotted span. -/ +lemma range_barQ_le_rightSpan (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : + LinearMap.range (barQ f l) ≤ h.rightSpan l := by + rw [range_eq_iSup_span (QuarkDoublet.basis.conj) (barQ f l)] + refine iSup_le fun j => ?_ + rw [Submodule.span_singleton_le_iff_mem, ← dualBasis_apply] + exact Submodule.mem_iSup_of_mem (.barQ f j.2.1 j.2.2) + (Submodule.mem_iSup_of_mem j.1 (Submodule.mem_span_singleton_self _)) + +/-- The range of the `barL` symbols lies in the dotted span. -/ +lemma range_barL_le_rightSpan (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : + LinearMap.range (barL f l) ≤ h.rightSpan l := by + rw [range_eq_iSup_span (LeptonDoublet.basis.conj) (barL f l)] + refine iSup_le fun j => ?_ + rw [Submodule.span_singleton_le_iff_mem, ← dualBasis_apply] + exact Submodule.mem_iSup_of_mem (.barL f j.2) + (Submodule.mem_iSup_of_mem j.1 (Submodule.mem_span_singleton_self _)) + +/-- The range of the `e` symbols lies in the dotted span. -/ +lemma range_e_le_rightSpan (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : + LinearMap.range (e f l) ≤ h.rightSpan l := by + rw [range_eq_iSup_span (LeptonSinglet.basis) (e f l)] + refine iSup_le fun j => ?_ + rw [Submodule.span_singleton_le_iff_mem, ← dualBasis_apply] + exact Submodule.mem_iSup_of_mem (.e f) + (Submodule.mem_iSup_of_mem j (Submodule.mem_span_singleton_self _)) + + +/-! + +## F. Gauge invariants and the weight-zero piece + +Gauge invariance is what selects the conjugate pairings. A gauge-invariant element lies +in the weight-zero piece of the gauge weight decomposition, and modulo a gauge-stable +submodule the same holds with the submodule joined on: the torus generators scale every +other weight, and the induction of `mem_of_invariant_of_mem_biSup_piece_sup` deletes them +one at a time. Unlike the single-tower case, the generator has to be chosen weight by +weight: a product like `Q barQ` at two different colours has vanishing hypercharge and +nonzero colour, so no one generator sees every weight. + +-/ + +/-- The one-weight-at-a-time refinement, with the separating generator chosen per weight. + Let `S` be closed under the four torus generators and let `s` be a finite set of gauge + weights, each seen by some generator. 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_of_ne_zero {V S : Submodule ℂ B} + (dV : GaugeWeightDecomposition repGauge V) + (hS : ∀ (i : Fin 4) (y : B), y ∈ S → repGauge (gaugeTorusGen i) y ∈ S) : + ∀ (s : Finset GaugeWeight), (∀ w ∈ s, ∃ i, 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 + obtain ⟨i, hi⟩ := hs w₀ (Finset.mem_insert_self w₀ s') + 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 hi (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 i 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 `V ⊔ S`, for `S` closed under the four torus generators, + already lies in the weight-zero piece joined with `S`: every other weight is seen by + some generator and is scaled away by it. -/ +lemma mem_piece_zero_sup_of_invariant {V S : Submodule ℂ B} + (dV : GaugeWeightDecomposition repGauge V) + (hS : ∀ (i : Fin 4) (y : B), y ∈ S → repGauge (gaugeTorusGen i) y ∈ S) + {x : B} (hx : x ∈ V ⊔ S) (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : + x ∈ dV.piece 0 ⊔ S := by + refine mem_of_invariant_of_mem_biSup_piece_sup_of_ne_zero dV ?_ (dV.supp.erase 0) ?_ x ?_ + hinv + · intro i y hy + rw [Submodule.mem_sup] at hy ⊢ + obtain ⟨a, ha, b, hb, rfl⟩ := hy + refine ⟨repGauge (gaugeTorusGen i) a, ?_, repGauge (gaugeTorusGen i) b, hS i b hb, ?_⟩ + · rw [dV.piece_le 0 a ha i] + exact (dV.piece 0).smul_mem _ ha + · rw [map_add] + · intro w hw + have hw0 : w ≠ 0 := (Finset.mem_erase.mp hw).1 + by_contra hcon + refine hw0 (GaugeWeight.coord_injective (funext fun i => ?_)) + have hi := not_not.mp (not_exists.mp hcon i) + rw [hi, GaugeWeight.zero_coord i] + · have hVle : V ≤ (⨆ w ∈ dV.supp.erase 0, dV.piece w) ⊔ dV.piece 0 := by + refine le_trans (le_of_eq dV.iSup_piece.symm) (iSup_le fun w => ?_) + by_cases hw0 : w = 0 + · subst hw0 + exact le_sup_right + · by_cases hw : w ∈ dV.supp + · exact le_sup_of_le_left (le_iSup₂_of_le w (Finset.mem_erase.mpr ⟨hw0, hw⟩) le_rfl) + · rw [dV.piece_eq_bot w hw] + exact bot_le + exact ((sup_le_sup_right hVle S).trans (le_of_eq (sup_assoc _ _ _))) hx + + +/-! + +## G. Mass weight six: no Dirac mass term + +Mass weight six is the product of two underived fermion towers. Gauge invariance puts +such an invariant in the weight-zero piece, which section F of the gauge weight +decomposition writes as the ten conjugate pairings, and every one of those is an undotted +component times a dotted one. Section B turns each into a dual left-right Weyl family and +section C peels the lot off, leaving nothing. + +The physics is that the Standard Model has no Dirac mass term. A mass term pairs a +left-handed field with a right-handed one, and while such a pair is exactly what survives +the gauge cut, its two spinor indices have nothing to contract against: a dotted index +and an undotted one carry no invariant pairing, only the symplectic form pairs two indices +of the same chirality. The fermion masses have to come from somewhere else, and they do — +from the Yukawa sector, where the Higgs doublet supplies the missing index. + +-/ + +/-- If `V` lies in the join of the lines through an undotted family and `W` in the join + for a dotted one, the product lies in the join of the spans of the pair families. -/ +lemma mul_le_iSup_span_pair {ι κ : Type} {X : ι → Fin 2 → B} {Y : κ → Fin 2 → B} + {V W : Submodule ℂ B} (hV : V ≤ ⨆ (i : ι) (a : Fin 2), ℂ ∙ X i a) + (hW : W ≤ ⨆ (j : κ) (a : Fin 2), ℂ ∙ Y j a) : + V * W ≤ ⨆ (p : ι × κ) (l : Fin 2 × Fin 2), ℂ ∙ (X p.1 l.1 * Y p.2 l.2) := by + refine le_trans (mul_le_mul' hV hW) ?_ + simp only [Submodule.iSup_mul, Submodule.mul_iSup] + refine iSup_le fun j => iSup_le fun b => iSup_le fun i => iSup_le fun a => ?_ + rw [Submodule.span_mul_span, Set.singleton_mul_singleton] + exact le_iSup₂_of_le (i, j) (a, b) le_rfl + +/-- The mirror of `mul_le_iSup_span_pair` with the two spinor slots exchanged, for a + product whose left factor is the dotted one. -/ +lemma mul_le_iSup_span_pair_swap {ι κ : Type} {X : ι → Fin 2 → B} {Y : κ → Fin 2 → B} + {V W : Submodule ℂ B} (hV : V ≤ ⨆ (i : ι) (a : Fin 2), ℂ ∙ X i a) + (hW : W ≤ ⨆ (j : κ) (a : Fin 2), ℂ ∙ Y j a) : + V * W ≤ ⨆ (p : ι × κ) (l : Fin 2 × Fin 2), ℂ ∙ (X p.1 l.2 * Y p.2 l.1) := by + refine le_trans (mul_le_mul' hV hW) ?_ + simp only [Submodule.iSup_mul, Submodule.mul_iSup] + refine iSup_le fun j => iSup_le fun b => iSup_le fun i => iSup_le fun a => ?_ + rw [Submodule.span_mul_span, Set.singleton_mul_singleton] + exact le_iSup₂_of_le (i, j) (b, a) le_rfl + +set_option linter.unusedVariables false in +/-- The mass-weight six families: a product of two underived components of opposite + chirality, in either order. -/ +noncomputable def sixFamily (h : IsFermionSector B repGauge hrepGauge_mul repLorentz + hrepLorentz_mul d bard u baru Q barQ L barL e bare massWeightPoly) : + (LeftIdx × RightIdx) ⊕ (RightIdx × LeftIdx) → Fin 2 × Fin 2 → B + | .inl p => fun l => h.leftComp ![] p.1 l.1 * h.rightComp ![] p.2 l.2 + | .inr p => fun l => h.rightComp ![] p.1 l.2 * h.leftComp ![] p.2 l.1 + +/-- The join of the spans of the mass-weight six families. -/ +noncomputable def sixSpan (h : IsFermionSector B repGauge hrepGauge_mul repLorentz + hrepLorentz_mul d bard u baru Q barQ L barL e bare massWeightPoly) : + Submodule ℂ B := + ⨆ (i : (LeftIdx × RightIdx) ⊕ (RightIdx × LeftIdx)) (l : Fin 2 × Fin 2), + ℂ ∙ h.sixFamily i l + +include h in +/-- Each mass-weight six family carries one dual undotted and one dual dotted spinor + index. -/ +lemma isDualLeftRightWeyl_sixFamily + (i : (LeftIdx × RightIdx) ⊕ (RightIdx × LeftIdx)) : + IsDualLeftRightWeyl B repLorentz (h.sixFamily i) := by + cases i with + | inl p => + exact isDualLeftRightWeyl_mul hrepLorentz_mul (h.isDualLeftWeyl_leftComp p.1) + (h.isDualRightWeyl_rightComp p.2) + | inr p => + exact isDualLeftRightWeyl_mul_swap hrepLorentz_mul (h.isDualRightWeyl_rightComp p.1) + (h.isDualLeftWeyl_leftComp p.2) + +include h in +/-- An undotted range times a dotted one lies in the mass-weight six span. -/ +lemma mul_le_sixSpan_left {V W : Submodule ℂ B} (hV : V ≤ h.leftSpan ![]) + (hW : W ≤ h.rightSpan ![]) : V * W ≤ h.sixSpan := + (mul_le_iSup_span_pair hV hW).trans + (iSup_le fun p => le_iSup (fun i => ⨆ l, ℂ ∙ h.sixFamily i l) (.inl p)) + +include h in +/-- A dotted range times an undotted one lies in the mass-weight six span. -/ +lemma mul_le_sixSpan_right {V W : Submodule ℂ B} (hV : V ≤ h.rightSpan ![]) + (hW : W ≤ h.leftSpan ![]) : V * W ≤ h.sixSpan := + (mul_le_iSup_span_pair_swap hV hW).trans + (iSup_le fun p => le_iSup (fun i => ⨆ l, ℂ ∙ h.sixFamily i l) (.inr p)) + +include h in +/-- The weight-zero piece at mass weight six lies in the span of the mass-weight six + families: each of the ten conjugate pairings is a product of an undotted range with a + dotted one, in one order or the other. -/ +lemma massWeightSubmoduleGaugeWeightSix_piece_zero_le : + (h.massWeightSubmoduleGaugeWeightSix).piece 0 ≤ h.sixSpan := by + rw [h.massWeightSubmoduleGaugeWeightSix_piece_zero] + refine iSup_le fun f => iSup_le fun f' => sup_le (sup_le (sup_le (sup_le (sup_le + (sup_le (sup_le (sup_le (sup_le ?_ ?_) ?_) ?_) ?_) ?_) ?_) ?_) ?_) ?_ + · exact (GaugeWeightDecomposition.piece_le_self _ 0).trans (h.mul_le_sixSpan_right + (h.range_d_le_rightSpan f ![]) (h.range_bard_le_leftSpan f' ![])) + · exact (GaugeWeightDecomposition.piece_le_self _ 0).trans (h.mul_le_sixSpan_left + (h.range_bard_le_leftSpan f ![]) (h.range_d_le_rightSpan f' ![])) + · exact (GaugeWeightDecomposition.piece_le_self _ 0).trans (h.mul_le_sixSpan_right + (h.range_u_le_rightSpan f ![]) (h.range_baru_le_leftSpan f' ![])) + · exact (GaugeWeightDecomposition.piece_le_self _ 0).trans (h.mul_le_sixSpan_left + (h.range_baru_le_leftSpan f ![]) (h.range_u_le_rightSpan f' ![])) + · exact (GaugeWeightDecomposition.piece_le_self _ 0).trans (h.mul_le_sixSpan_left + (h.range_Q_le_leftSpan f ![]) (h.range_barQ_le_rightSpan f' ![])) + · exact (GaugeWeightDecomposition.piece_le_self _ 0).trans (h.mul_le_sixSpan_right + (h.range_barQ_le_rightSpan f ![]) (h.range_Q_le_leftSpan f' ![])) + · exact (GaugeWeightDecomposition.piece_le_self _ 0).trans (h.mul_le_sixSpan_left + (h.range_L_le_leftSpan f ![]) (h.range_barL_le_rightSpan f' ![])) + · exact (GaugeWeightDecomposition.piece_le_self _ 0).trans (h.mul_le_sixSpan_right + (h.range_barL_le_rightSpan f ![]) (h.range_L_le_leftSpan f' ![])) + · exact (GaugeWeightDecomposition.piece_le_self _ 0).trans (h.mul_le_sixSpan_right + (h.range_e_le_rightSpan f ![]) (h.range_bare_le_leftSpan f' ![])) + · exact (GaugeWeightDecomposition.piece_le_self _ 0).trans (h.mul_le_sixSpan_left + (h.range_bare_le_leftSpan f ![]) (h.range_e_le_rightSpan f' ![])) + +include h in +/-- Mass weight six carries no invariant modulo a stable submodule: there is no Dirac + mass term. A gauge- and Lorentz-invariant element of `massWeightSubmodule 6 ⊔ S` lies + in `S`, gauge invariance cutting the hundred pairings of two fermion symbols down to + the ten conjugate ones and Lorentz invariance killing each of those, its two spinor + indices being of opposite chirality. -/ +theorem mem_of_invariant_of_mem_massWeightSubmoduleSix_sup {S : Submodule ℂ B} + (hS : ∀ (g : GaugeGroupI) (y : B), y ∈ S → repGauge g y ∈ S) + (hSL : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) {x : B} + (hx : x ∈ h.massWeightSubmodule 6 ⊔ S) + (hG : ∀ g : GaugeGroupI, repGauge g x = x) + (hL : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by + have hzero : x ∈ (h.massWeightSubmoduleGaugeWeightSix).piece 0 ⊔ S := + mem_piece_zero_sup_of_invariant _ (fun i y hy => hS _ y hy) hx hG + refine mem_of_lorentz_invariant_iSup_dualLeftRightWeyl_span + h.isDualLeftRightWeyl_sixFamily S hSL ?_ hL + exact sup_le_sup_right h.massWeightSubmoduleGaugeWeightSix_piece_zero_le S hzero + + +/-! + +## H. The classification below mass weight eight + +The seven weights between zero and eight are now settled: weights one, two and four are +trivial submodules, weights three, five and seven are single fermion towers and carry a +nonzero hypercharge, and weight six is section G. So between weight zero and weight eight +the fermion sector has 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 the fermion sector carries no + invariant: an element of `massWeightSubmodule w ⊔ S` for `0 < w < 8` fixed by both + groups lies in `S`. Weights one, two and four are trivial, weights three, five and + seven carry no gauge singlet, and weight six is the missing Dirac mass term. -/ +theorem mem_of_invariant_massWeightSubmodule_lt_eight_sup (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} + (hx : x ∈ h.massWeightSubmodule w ⊔ S) + (hG : ∀ g : GaugeGroupI, repGauge g x = x) + (hL : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by + interval_cases w + · exact h.mem_of_mem_massWeightSubmoduleOne_sup hx + · exact h.mem_of_mem_massWeightSubmoduleTwo_sup hx + · exact h.mem_of_invariant_of_mem_massWeightSubmoduleThree_sup hS hx hG + · exact h.mem_of_mem_massWeightSubmoduleFour_sup hx + · exact h.mem_of_invariant_of_mem_massWeightSubmoduleFive_sup hS hx hG + · exact h.mem_of_invariant_of_mem_massWeightSubmoduleSix_sup hS hSL hx hG hL + · exact h.mem_of_invariant_of_mem_massWeightSubmoduleSeven_sup hS hx hG + +include h 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`. -/ +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_invariant_massWeightSubmodule_lt_eight_sup w hw0 hw S hS hSL hx hG + hL, hG, hL, rfl⟩ + · rintro ⟨y, hyS, hyG, hyL, rfl⟩ + exact ⟨Submodule.mem_sup_right hyS, hyG, hyL⟩ + +include h 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) := + ⟨fun hx => ⟨h.mem_of_invariant_massWeightSubmodule_lt_eight_sup w hw0 hw S hS hSL hx.1 + hx.2.1 hx.2.2, hx.2⟩, fun hx => ⟨Submodule.mem_sup_right hx.1, hx.2⟩⟩ + +end IsFermionSector + +end StandardModel diff --git a/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/GaugeWeightDecomposition.lean b/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/GaugeWeightDecomposition.lean index 36e9cec4b..ac336eaa1 100644 --- a/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/GaugeWeightDecomposition.lean +++ b/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/GaugeWeightDecomposition.lean @@ -7,6 +7,8 @@ module public import Physlib.Particles.StandardModel.IsHiggsSector.MassWeight.Basic public import Physlib.Particles.StandardModel.IsHiggsSector.DerivSubmodule.GaugeWeightDecomposition +public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU2AntiFundamental +public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU2QuadFundamental /-! # The gauge weight decomposition of the Higgs mass-weight submodules @@ -23,19 +25,32 @@ is what makes the weight-zero pieces small: at mass weight four and six they are 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. +weight. That separation is `SU(2)` mathematics and belongs to the isospin classifiers of +`GaugeGroup.Invariants` rather than here. What is left for this file is to present each +surviving piece as a family those classifiers know. A conjugate Higgs symbol against a +Higgs symbol is an `IsSU2FunAntiFun` family — the conjugate symbol carries the fundamental +isospin index and the Higgs symbol the anti-fundamental one, so it goes second — and the +sole invariant of `2 ⊗ 2̄`, the delta contraction, is the isospin contraction +`dotGaugeHiggs`. The quartic is an `IsSU2QuadFundamental` family once its two Higgs +symbols are re-indexed by the antisymmetric symbol, and of its two independent +contractions one is the square of the isospin contraction and the other vanishes, pairing +commuting factors antisymmetrically. + +- A. The decompositions +- B. The pieces of a derivative submodule +- C. The weight-zero pieces of the products +- D. The weight-zero pieces of the mass-weight submodules +- E. The gauge sieve +- F. The Higgs symbols as isospin families +- G. Peeling the gauge invariants off a stable submodule +- H. The gauge classification up to mass weight eight +- I. The gauge-invariant submodules up to mass weight eight + +Everything from section G on is stated modulo a submodule `S` stable under the gauge +group, which is what lets the other sectors be carried along; taking `S` trivial in +section I recovers the statements about the mass-weight submodules themselves. -/ @@ -43,7 +58,7 @@ the resulting descriptions of the gauge invariants up to mass weight eight. namespace StandardModel -open TensorProduct Matrix MatrixGroups Lorentz +open TensorProduct Matrix MatrixGroups Lorentz ComplexConjugate namespace IsHiggsSector @@ -447,543 +462,728 @@ lemma mem_of_invariant_massWeightSubmodule_eight {x : B} /-! -## F. The Weyl refinement of the pairing spans +## F. The Higgs symbols as isospin families + +The gauge weight has done all it can. What it cannot see is the difference between the +isospin singlet `∇H · ∇H̄` and the neutral component of the isospin triplet: both are +neutral under the torus, so both sit in the weight-zero piece, and only the non-abelian +part of `SU(2)` tells them apart. That is what the isospin classifiers of +`GaugeGroup.Invariants` are for, and this section presents the surviving pieces as +families they classify. + +The variance has to be read off correctly, and it is opposite to what the notation +suggests. A conjugate Higgs symbol carries a fundamental isospin index — an isospin +transformation moves it by the matrix of the `SU(2)` element, with the summed index in the +row slot — and a Higgs symbol carries an anti-fundamental one, moved by the conjugate +matrix. So the pairing span of section C is the span of the components of +`fun l => h.barHiggs d' (l 0) * h.higgs d (l 1)`, conjugate symbol first, which is an +`IsSU2FunAntiFun` family; and its delta contraction, the sole invariant of `2 ⊗ 2̄`, is the +isospin contraction `dotGaugeHiggs`. That identification is the whole point of the +section: `dotSpan` is the span of delta contractions, and nothing else survives. + +The quartic needs four fundamental indices, so its two Higgs symbols must be re-indexed by +the antisymmetric symbol first. `tildeHiggs` is that re-index, `H̃⁰ = H¹` and +`H̃¹ = -H⁰`, and it is fundamental because `SU(2)` is pseudo-real. The quartic family is +then a product of four fundamental families, and `IsSU2QuadFundamental` classifies it. Its +two independent contractions come out as the square of the isospin contraction and zero: +the second pairs the two conjugate symbols with each other and the two Higgs symbols with +each other, and an antisymmetric contraction of two commuting factors vanishes. -/ +/-- The entries of the inverse of an `SU(2)` element are the conjugated transposed + entries, the inverse of a unitary matrix being its conjugate transpose. -/ +lemma su2_inv_apply (V : specialUnitaryGroup (Fin 2) ℂ) (a b : Fin 2) : + (V⁻¹).1 a b = conj (V.1 b a) := by + rw [← Matrix.star_eq_inv, Matrix.specialUnitaryGroup.coe_star] + simp [Matrix.star_apply] + +include h in +/-- An isospin transformation moves the isospin index of a Higgs symbol by the conjugate + matrix: the index of a Higgs symbol is anti-fundamental. -/ +lemma rep_su2_higgs (V : specialUnitaryGroup (Fin 2) ℂ) {n : ℕ} + (d : Fin n → (Fin 1 ⊕ Fin 3)) (i : Fin 2) : + rep ((1, V, 1) : GaugeGroupI) (h.higgs d i) + = ∑ a, conj (V.1 a i) • h.higgs d a := by + rw [h.rep_higgsComponent] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [show ((1, V, 1) : GaugeGroupI)⁻¹ = ((1, V⁻¹, 1) : GaugeGroupI) from by simp, + show GaugeGroupI.toSU2 ((1, V⁻¹, 1) : GaugeGroupI) = V⁻¹ from rfl, + show GaugeGroupI.toU1 ((1, V⁻¹, 1) : GaugeGroupI) = 1 from rfl, su2_inv_apply] + simp + +include h in +/-- An isospin transformation moves the isospin index of a conjugate Higgs symbol by the + matrix itself: the index of a conjugate Higgs symbol is fundamental. -/ +lemma rep_su2_barHiggs (V : specialUnitaryGroup (Fin 2) ℂ) {n : ℕ} + (d : Fin n → (Fin 1 ⊕ Fin 3)) (i : Fin 2) : + rep ((1, V, 1) : GaugeGroupI) (h.barHiggs d i) + = ∑ a, V.1 a i • h.barHiggs d a := by + rw [h.rep_barHiggsComponent] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [show ((1, V, 1) : GaugeGroupI)⁻¹ = ((1, V⁻¹, 1) : GaugeGroupI) from by simp, + show GaugeGroupI.toSU2 ((1, V⁻¹, 1) : GaugeGroupI) = V⁻¹ from rfl, + show GaugeGroupI.toU1 ((1, V⁻¹, 1) : GaugeGroupI) = 1 from rfl, su2_inv_apply] + simp + +include h in +/-- A product of two symbols each moving by given coefficients moves by the product of + those coefficients. -/ +lemma rep_mul_pair (g : GaugeGroupI) {ι κ : Type} [Fintype ι] [Fintype κ] + {X : ι → B} {Y : κ → B} {x₀ : ι} {y₀ : κ} {cX : ι → ℂ} {cY : κ → ℂ} + (hX : rep g (X x₀) = ∑ x, cX x • X x) (hY : rep g (Y y₀) = ∑ y, cY y • Y y) : + rep g (X x₀ * Y y₀) = ∑ x, ∑ y, (cX x * cY y) • (X x * Y y) := by + rw [h.rep_mul, hX, hY, Finset.sum_mul] + simp only [Finset.mul_sum, smul_mul_smul_comm] + +include h in +/-- A Higgs symbol commutes with a conjugate Higgs symbol, in the components. -/ +lemma higgs_mul_barHiggs_comm {n m : ℕ} (d : Fin n → (Fin 1 ⊕ Fin 3)) + (d' : Fin m → (Fin 1 ⊕ Fin 3)) (i j : Fin 2) : + h.higgs d i * h.barHiggs d' j = h.barHiggs d' j * h.higgs d i := + (h.H_comm_barH _ _ _ _ _ _).eq + +include h in +/-- Two Higgs symbols commute, in the components. -/ +lemma higgs_mul_higgs_comm {n m : ℕ} (d : Fin n → (Fin 1 ⊕ Fin 3)) + (d' : Fin m → (Fin 1 ⊕ Fin 3)) (i j : Fin 2) : + h.higgs d i * h.higgs d' j = h.higgs d' j * h.higgs d i := + (h.H_comm_H _ _ _ _ _ _).eq + +include h in +/-- Two conjugate Higgs symbols commute, in the components. -/ +lemma barHiggs_mul_barHiggs_comm {n m : ℕ} (d : Fin n → (Fin 1 ⊕ Fin 3)) + (d' : Fin m → (Fin 1 ⊕ Fin 3)) (i j : Fin 2) : + h.barHiggs d i * h.barHiggs d' j = h.barHiggs d' j * h.barHiggs d i := + (h.barH_comm_barH _ _ _ _ _ _).eq + +/-- The isospin family of a Higgs tower carrying `n` derivatives against a conjugate tower + carrying `m`: the conjugate symbol supplies the fundamental index and so goes in the + first slot, the Higgs symbol the anti-fundamental one. -/ +noncomputable def isoFamily (h : IsHiggsSector B rep hrep_mul repLorentz + hrepLorentz_mul H barH massWeightPoly) {n m : ℕ} (d : Fin n → (Fin 1 ⊕ Fin 3)) + (d' : Fin m → (Fin 1 ⊕ Fin 3)) : (Fin 2 → Fin 2) → B := + fun l => h.barHiggs d' (l 0) * h.higgs d (l 1) + +include h in +/-- The isospin family carries one fundamental and one anti-fundamental isospin index. -/ +lemma isSU2FunAntiFun_isoFamily {n m : ℕ} (d : Fin n → (Fin 1 ⊕ Fin 3)) + (d' : Fin m → (Fin 1 ⊕ Fin 3)) : IsSU2FunAntiFun B rep (h.isoFamily d d') where + repGauge_T V l := by + rw [isoFamily, h.rep_mul_pair (1, V, 1) (h.rep_su2_barHiggs V d' (l 0)) + (h.rep_su2_higgs V d (l 1)), IsSU2BiFundamental.sum_pi_two] + simp only [isoFamily, Matrix.cons_val_zero, Matrix.cons_val_one] + +/-- The delta contraction of the isospin family is the isospin contraction: the sole + invariant of `2 ⊗ 2̄` is the Higgs mass term of the two towers. -/ +lemma deltaContraction_isoFamily {n m : ℕ} (d : Fin n → (Fin 1 ⊕ Fin 3)) + (d' : Fin m → (Fin 1 ⊕ Fin 3)) : + IsSU2FunAntiFun.deltaContraction (h.isoFamily d d') = h.dotGaugeHiggs d d' := by + rw [IsSU2FunAntiFun.deltaContraction, dotGaugeHiggs, isoFamily, isoFamily] + simp only [Matrix.cons_val_zero, Matrix.cons_val_one] + rw [h.higgs_mul_barHiggs_comm d d' 0 0, h.higgs_mul_barHiggs_comm d d' 1 1] + /-- The span of the isospin contractions of a Higgs tower carrying `n` derivatives against - a conjugate tower carrying `m`. -/ + a conjugate tower carrying `m`: the gauge invariants the isospin classification leaves + at those two derivative orders. -/ 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')) +include h in +/-- The span of the isospin family is stable under the whole gauge group: each factor of a + component goes to a combination of the factors of components. -/ +lemma isoFamily_span_stable {n m : ℕ} (d : Fin n → (Fin 1 ⊕ Fin 3)) + (d' : Fin m → (Fin 1 ⊕ Fin 3)) (g : GaugeGroupI) {y : B} + (hy : y ∈ IsSU2BiFundamental.span (h.isoFamily d d')) : + rep g y ∈ IsSU2BiFundamental.span (h.isoFamily d d') := by + obtain ⟨c, rfl⟩ := (IsSU2BiFundamental.mem_span_iff y).1 hy + rw [map_sum] + refine Submodule.sum_mem _ fun l _ => ?_ + rw [map_smul, isoFamily, h.rep_mul_pair g (X := fun a => h.barHiggs d' a) + (Y := fun a => h.higgs d a) (h.rep_barHiggsComponent g d' (l 0)) + (h.rep_higgsComponent g d (l 1))] + refine Submodule.smul_mem _ _ (Submodule.sum_mem _ fun a _ => + Submodule.sum_mem _ fun b _ => Submodule.smul_mem _ _ ?_) + exact Submodule.mem_iSup_of_mem ![a, b] (Submodule.mem_span_singleton_self _) + +/-- The isospin-diagonal pairing spans of section C sit inside the span of the isospin + family: a diagonal pairing is one of the four components, the two factors commuting. -/ +lemma higgsBarHiggsSpan_le_isoFamily_span (n m : ℕ) : + h.higgsBarHiggsSpan n m 0 ⊔ h.higgsBarHiggsSpan n m 1 + ≤ ⨆ (d : Fin n → (Fin 1 ⊕ Fin 3)) (d' : Fin m → (Fin 1 ⊕ Fin 3)), + IsSU2BiFundamental.span (h.isoFamily d d') := by + have key : ∀ (i : Fin 2), h.higgsBarHiggsSpan n m i + ≤ ⨆ (d : Fin n → (Fin 1 ⊕ Fin 3)) (d' : Fin m → (Fin 1 ⊕ Fin 3)), + IsSU2BiFundamental.span (h.isoFamily d d') := by + intro i + rw [higgsBarHiggsSpan] + refine iSup_le fun d => iSup_le fun d' => ?_ + rw [Submodule.span_singleton_le_iff_mem] + refine Submodule.mem_iSup_of_mem d (Submodule.mem_iSup_of_mem d' ?_) + rw [h.higgs_mul_barHiggs_comm d d' i i] + exact Submodule.mem_iSup_of_mem ![i, i] (Submodule.mem_span_singleton_self _) + exact sup_le (key 0) (key 1) + +/-- The re-index of an underived Higgs symbol by the antisymmetric symbol, `H̃⁰ = H¹` and + `H̃¹ = -H⁰`. `SU(2)` is pseudo-real, so this turns the anti-fundamental index of a Higgs + symbol into a fundamental one, which is what the quartic family needs. -/ +noncomputable def tildeHiggs (h : IsHiggsSector B rep hrep_mul repLorentz + hrepLorentz_mul H barH massWeightPoly) (i : Fin 2) : B := + ∑ m : Fin 2, IsSU2BiFundamental.epsilon i m • h.higgs (![] : Fin 0 → (Fin 1 ⊕ Fin 3)) m + +/-- The re-index at isospin zero is the Higgs symbol of isospin one. -/ +@[simp] lemma tildeHiggs_zero : + h.tildeHiggs 0 = h.higgs (![] : Fin 0 → (Fin 1 ⊕ Fin 3)) 1 := by + simp [tildeHiggs, Fin.sum_univ_two] + +/-- The re-index at isospin one is minus the Higgs symbol of isospin zero. -/ +@[simp] lemma tildeHiggs_one : + h.tildeHiggs 1 = -h.higgs (![] : Fin 0 → (Fin 1 ⊕ Fin 3)) 0 := by + simp [tildeHiggs, Fin.sum_univ_two] + +include h in +/-- The re-indexed Higgs symbol carries a fundamental isospin index: the four entry + identities of `IsSU2BiFundamental` remove every complex conjugate. -/ +lemma rep_su2_tildeHiggs (V : specialUnitaryGroup (Fin 2) ℂ) (i : Fin 2) : + rep ((1, V, 1) : GaugeGroupI) (h.tildeHiggs i) + = ∑ a, V.1 a i • h.tildeHiggs a := by + have hi : ∀ j : Fin 2, j = 0 ∨ j = 1 := by decide + rcases hi i with rfl | rfl + · rw [tildeHiggs_zero, h.rep_su2_higgs, Fin.sum_univ_two, Fin.sum_univ_two, + tildeHiggs_zero, tildeHiggs_one] + simp only [IsSU2BiFundamental.conj_apply_zero_one, + IsSU2BiFundamental.conj_apply_one_one] + module + · rw [tildeHiggs_one, map_neg, h.rep_su2_higgs, Fin.sum_univ_two, Fin.sum_univ_two, + tildeHiggs_zero, tildeHiggs_one] + simp only [IsSU2BiFundamental.conj_apply_zero_zero, + IsSU2BiFundamental.conj_apply_one_zero] + module + +/-- The quartic isospin family: two conjugate Higgs symbols against two re-indexed Higgs + symbols, each of the four carrying a fundamental isospin index. -/ +noncomputable def quadFamily (h : IsHiggsSector B rep hrep_mul repLorentz + hrepLorentz_mul H barH massWeightPoly) : (Fin 4 → Fin 2) → B := + fun l => h.barHiggs (![] : Fin 0 → (Fin 1 ⊕ Fin 3)) (l 0) + * (h.tildeHiggs (l 1) + * (h.barHiggs (![] : Fin 0 → (Fin 1 ⊕ Fin 3)) (l 2) * h.tildeHiggs (l 3))) + +include h in +/-- The quartic family carries four fundamental isospin indices. -/ +lemma isSU2QuadFundamental_quadFamily : IsSU2QuadFundamental B rep h.quadFamily where + repGauge_T V l := by + simp only [quadFamily] + rw [h.rep_mul, h.rep_mul, h.rep_mul, h.rep_su2_barHiggs V ![] (l 0), + h.rep_su2_tildeHiggs V (l 1), h.rep_su2_barHiggs V ![] (l 2), + h.rep_su2_tildeHiggs V (l 3), IsSU2QuadFundamental.sum_pi_four] + simp only [Finset.sum_mul] + simp only [Finset.mul_sum] + simp only [smul_mul_smul_comm, 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, mul_assoc] + +section Quartic + +/-- Moving a Higgs symbol past a conjugate one, at no derivatives and inside a product: + the normalisation used to compare quartic monomials. -/ +private lemma barHiggs_higgs_left_comm_zero (i j : Fin 2) (y : B) : + h.barHiggs (![] : Fin 0 → (Fin 1 ⊕ Fin 3)) i * (h.higgs ![] j * y) + = h.higgs ![] j * (h.barHiggs ![] i * y) := by + rw [← mul_assoc, ← h.higgs_mul_barHiggs_comm ![] ![] j i, mul_assoc] + +/-- Moving a Higgs symbol past a conjugate one, at no derivatives. -/ +private lemma barHiggs_mul_higgs_comm_zero (i j : Fin 2) : + h.barHiggs (![] : Fin 0 → (Fin 1 ⊕ Fin 3)) i * h.higgs ![] j + = h.higgs ![] j * h.barHiggs ![] i := + (h.higgs_mul_barHiggs_comm ![] ![] j i).symm + +/-- Sorting two Higgs symbols inside a product. -/ +private lemma higgs_left_comm_zero (y : B) : + h.higgs (![] : Fin 0 → (Fin 1 ⊕ Fin 3)) 1 * (h.higgs ![] 0 * y) + = h.higgs ![] 0 * (h.higgs ![] 1 * y) := by + rw [← mul_assoc, h.higgs_mul_higgs_comm ![] ![] 1 0, mul_assoc] + +/-- The first epsilon contraction of the quartic family is the square of the isospin + contraction: pairing the first conjugate symbol with the first Higgs symbol, and the + second with the second, is pairing each `H̄` with an `H`. -/ +lemma epsilonContraction₁₂_quadFamily : + IsSU2QuadFundamental.epsilonContraction₁₂ h.quadFamily + = h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![] := by + simp only [IsSU2QuadFundamental.epsilonContraction₁₂, quadFamily, dotGaugeHiggs, + Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, Matrix.cons_val_two, + Matrix.tail_cons, Matrix.cons_val_three, tildeHiggs_zero, tildeHiggs_one, neg_mul, + mul_neg, neg_neg, add_mul, mul_add, mul_assoc, h.barHiggs_higgs_left_comm_zero, + h.barHiggs_mul_higgs_comm_zero, h.higgs_left_comm_zero, + h.barHiggs_mul_barHiggs_comm ![] ![] 1 0] + abel + +/-- The second epsilon contraction of the quartic family vanishes: it pairs the two + conjugate symbols with each other and the two Higgs symbols with each other, and an + antisymmetric contraction of two commuting factors is zero. -/ +lemma epsilonContraction₁₃_quadFamily : + IsSU2QuadFundamental.epsilonContraction₁₃ h.quadFamily = 0 := by + simp only [IsSU2QuadFundamental.epsilonContraction₁₃, quadFamily, Matrix.cons_val_zero, + Matrix.cons_val_one, Matrix.head_cons, Matrix.cons_val_two, Matrix.tail_cons, + Matrix.cons_val_three, tildeHiggs_zero, tildeHiggs_one, neg_mul, mul_neg, + h.barHiggs_higgs_left_comm_zero, h.barHiggs_mul_higgs_comm_zero, + h.higgs_left_comm_zero, h.barHiggs_mul_barHiggs_comm ![] ![] 1 0] + abel + +/-- The three quartic monomials of section C lie in the span of the components of the + quartic family, each being one of those components up to a sign. -/ +lemma quarticSpan_le_quadFamily_span : + h.quarticSpan 0 0 ⊔ h.quarticSpan 0 1 ⊔ h.quarticSpan 1 1 + ≤ IsSU2QuadFundamental.span h.quadFamily := by + refine sup_le (sup_le ?_ ?_) ?_ <;> + rw [quarticSpan, Submodule.span_singleton_le_iff_mem] + · rw [show h.higgs (![] : Fin 0 → (Fin 1 ⊕ Fin 3)) 0 * h.barHiggs ![] 0 * h.higgs ![] 0 + * h.barHiggs ![] 0 = h.quadFamily ![0, 1, 0, 1] from by + simp only [quadFamily, Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, + Matrix.cons_val_two, Matrix.tail_cons, Matrix.cons_val_three, tildeHiggs_one, + neg_mul, mul_neg, neg_neg, mul_assoc, h.barHiggs_higgs_left_comm_zero, + h.barHiggs_mul_higgs_comm_zero]] + exact IsSU2QuadFundamental.mem_span _ + · rw [show h.higgs (![] : Fin 0 → (Fin 1 ⊕ Fin 3)) 0 * h.barHiggs ![] 0 * h.higgs ![] 1 + * h.barHiggs ![] 1 = -h.quadFamily ![0, 1, 1, 0] from by + simp only [quadFamily, Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, + Matrix.cons_val_two, Matrix.tail_cons, Matrix.cons_val_three, tildeHiggs_zero, + tildeHiggs_one, neg_mul, mul_neg, neg_neg, mul_assoc, + h.barHiggs_higgs_left_comm_zero, h.barHiggs_mul_higgs_comm_zero]] + exact neg_mem (IsSU2QuadFundamental.mem_span _) + · rw [show h.higgs (![] : Fin 0 → (Fin 1 ⊕ Fin 3)) 1 * h.barHiggs ![] 1 * h.higgs ![] 1 + * h.barHiggs ![] 1 = h.quadFamily ![1, 0, 1, 0] from by + simp only [quadFamily, Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, + Matrix.cons_val_two, Matrix.tail_cons, Matrix.cons_val_three, tildeHiggs_zero, + mul_assoc, h.barHiggs_higgs_left_comm_zero, h.barHiggs_mul_higgs_comm_zero]] + exact IsSU2QuadFundamental.mem_span _ + +end Quartic /-! -## G. The Weyl grading at mass weights four and six +## G. Peeling the gauge invariants off a stable submodule --/ +The classification is wanted not for the mass-weight submodule alone but modulo a +submodule `S` gathering the other sectors, so every step has to run for `x` in +`M ⊔ S` rather than `x` in `M`. Two things are needed for that. -/-- 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 first is that a gauge invariant of `V ⊔ S` still lies in the weight-zero piece of `V` +joined with `S`. The weight-eight part of such an element need not itself be invariant, so +nothing places it in the weight-zero piece directly; what does is that every non-zero +weight is seen by one of the four torus generators, which scales that part and fixes +nothing else, so the part can be removed one weight at a time. -/-- 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]) +The second is the peeling itself. The weight-zero piece is a finite join of isospin family +spans, and `IsSU2FunAntiFun.mem_span_sup_invariant_iff` removes one span at a time, +each time with the spans not yet removed adjoined to `S`. That is why the spans have to be +gauge stable, which is `isoFamily_span_stable`, and why the enlargement is `isoSpan` rather +than the pairing span of section C: the pairing span keeps only the diagonal components and +a gauge transformation does not. -/-- 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 +/-- The one-weight-at-a-time refinement, with the separating torus generator chosen per + weight. Let `S` be closed under the four torus generators and let `s` be a finite set of + non-zero gauge weights, each seen by some generator. 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_of_ne_zero {V S : Submodule ℂ B} + (dV : GaugeWeightDecomposition rep V) + (hS : ∀ (i : Fin 4) (y : B), y ∈ S → rep (gaugeTorusGen i) y ∈ S) : + ∀ (s : Finset GaugeWeight), (∀ w ∈ s, ∃ i, w.coord i ≠ 0) → + ∀ x ∈ (⨆ w ∈ s, dV.piece w) ⊔ S, (∀ g : GaugeGroupI, rep 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 + obtain ⟨i, hi⟩ := hs w₀ (Finset.mem_insert_self w₀ s') + 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 hi (expI_zpow_injective + (show (expI : ℂ) ^ w₀.coord i = (expI : ℂ) ^ (0 : ℤ) by rw [zpow_zero]; exact hcc)) + have hpiece : ∀ w, ∀ z ∈ dV.piece w, rep (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 (rep (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 i z hz + have hsum : ((expI : ℂ) ^ w₀.coord i) • a + rep (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 - rep (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 `V ⊔ S`, for `S` closed under the four torus generators, + already lies in the weight-zero piece joined with `S`: every other weight is seen by some + generator and is scaled away by it. -/ +lemma mem_piece_zero_sup_of_invariant {V S : Submodule ℂ B} + (dV : GaugeWeightDecomposition rep V) + (hS : ∀ (i : Fin 4) (y : B), y ∈ S → rep (gaugeTorusGen i) y ∈ S) + {x : B} (hx : x ∈ V ⊔ S) (hinv : ∀ g : GaugeGroupI, rep g x = x) : + x ∈ dV.piece 0 ⊔ S := by + refine mem_of_invariant_of_mem_biSup_piece_sup_of_ne_zero dV ?_ (dV.supp.erase 0) ?_ x ?_ + hinv + · intro i y hy + rw [Submodule.mem_sup] at hy ⊢ + obtain ⟨a, ha, b, hb, rfl⟩ := hy + refine ⟨rep (gaugeTorusGen i) a, ?_, rep (gaugeTorusGen i) b, hS i b hb, ?_⟩ + · rw [dV.piece_le 0 a ha i] + exact (dV.piece 0).smul_mem _ ha + · rw [map_add] + · intro w hw + have hw0 : w ≠ 0 := (Finset.mem_erase.mp hw).1 + by_contra hcon + refine hw0 (GaugeWeight.coord_injective (funext fun i => ?_)) + have hi := not_not.mp (not_exists.mp hcon i) + rw [hi, GaugeWeight.zero_coord i] + · have hVle : V ≤ (⨆ w ∈ dV.supp.erase 0, dV.piece w) ⊔ dV.piece 0 := by + refine le_trans (le_of_eq dV.iSup_piece.symm) (iSup_le fun w => ?_) + by_cases hw0 : w = 0 + · subst hw0 + exact le_sup_right + · by_cases hw : w ∈ dV.supp + · exact le_sup_of_le_left (le_iSup₂_of_le w (Finset.mem_erase.mpr ⟨hw0, hw⟩) le_rfl) + · rw [dV.piece_eq_bot w hw] + exact bot_le + exact ((sup_le_sup_right hVle S).trans (le_of_eq (sup_assoc _ _ _))) hx + +/-- Peeling a finite join of the spans of families with one fundamental and one + anti-fundamental isospin index off a gauge-stable submodule: a gauge invariant of the + join together with `S` is a combination of the delta contractions of the families plus a + gauge-invariant remainder in `S`. -/ +lemma exists_mem_of_invariant_biSup_isSU2FunAntiFun_span {ι : Type} [DecidableEq ι] + {T : ι → (Fin 2 → Fin 2) → B} (hT : ∀ i, IsSU2FunAntiFun B rep (T i)) + (hstab : ∀ (i : ι) (g : GaugeGroupI), ∀ y ∈ IsSU2BiFundamental.span (T i), + rep g y ∈ IsSU2BiFundamental.span (T i)) + (hdc : ∀ (i : ι) (g : GaugeGroupI), + rep g (IsSU2FunAntiFun.deltaContraction (T i)) + = IsSU2FunAntiFun.deltaContraction (T i)) + (S : Submodule ℂ B) (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, rep g y ∈ S) (s : Finset ι) + {x : B} (hx : x ∈ (⨆ i ∈ s, IsSU2BiFundamental.span (T i)) ⊔ S) + (hinv : ∀ g : GaugeGroupI, rep g x = x) : + ∃ y ∈ S, (∀ g : GaugeGroupI, rep g y = y) + ∧ x - y ∈ ⨆ i ∈ s, ℂ ∙ IsSU2FunAntiFun.deltaContraction (T i) := by + induction s using Finset.induction_on generalizing x with + | empty => + rw [show (⨆ i ∈ (∅ : Finset ι), IsSU2BiFundamental.span (T i)) = ⊥ 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, IsSU2BiFundamental.span (T i)) ⊔ S, + rep g y ∈ (⨆ i ∈ s, IsSU2BiFundamental.span (T i)) ⊔ S := by + intro g y hy + have key : ((⨆ i ∈ s, IsSU2BiFundamental.span (T i)) ⊔ S) + ≤ Submodule.comap (rep g) ((⨆ i ∈ s, IsSU2BiFundamental.span (T i)) ⊔ 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 (hstab i g z 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 x _ hstab' (hdc a) hx hinv + obtain ⟨y, hyS, hyinv, hy'y⟩ := ih hy' hy'inv + refine ⟨y, hyS, hyinv, ?_⟩ + rw [Finset.iSup_insert, + show x - y = c • IsSU2FunAntiFun.deltaContraction (T a) + (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 span of the components of all the isospin families of a Higgs tower carrying `n` + derivatives against a conjugate tower carrying `m`. This is the gauge-stable + enlargement of the pairing span of section C. -/ +noncomputable def isoSpan (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)), + IsSU2BiFundamental.span (h.isoFamily d d') + +include h in +/-- The isospin span is stable under the gauge group. -/ +lemma isoSpan_stable (n m : ℕ) (g : GaugeGroupI) {y : B} (hy : y ∈ h.isoSpan n m) : + rep g y ∈ h.isoSpan n m := by + have key : h.isoSpan n m ≤ Submodule.comap (rep g) (h.isoSpan n m) := + iSup_le fun d => iSup_le fun d' => fun z hz => + Submodule.mem_iSup_of_mem d (Submodule.mem_iSup_of_mem d' + (h.isoFamily_span_stable d d' g hz)) + exact key hy + +/-- Each isospin-diagonal pairing span of section C sits inside the isospin span. -/ +lemma higgsBarHiggsSpan_le_isoSpan' (n m : ℕ) (i : Fin 2) : + h.higgsBarHiggsSpan n m i ≤ h.isoSpan n m := by + rw [higgsBarHiggsSpan] + refine iSup_le fun d => iSup_le fun d' => ?_ + rw [Submodule.span_singleton_le_iff_mem] + refine Submodule.mem_iSup_of_mem d (Submodule.mem_iSup_of_mem d' ?_) + rw [h.higgs_mul_barHiggs_comm d d' i i] + exact Submodule.mem_iSup_of_mem ![i, i] (Submodule.mem_span_singleton_self _) + +/-- The pairing span of section C sits inside the isospin span. -/ +lemma higgsBarHiggsSpan_le_isoSpan (n m : ℕ) : + h.higgsBarHiggsSpan n m 0 ⊔ h.higgsBarHiggsSpan n m 1 ≤ h.isoSpan n m := + h.higgsBarHiggsSpan_le_isoFamily_span n m + +include h in +/-- A gauge invariant of the isospin span together with a gauge-stable submodule is a + combination of the isospin contractions plus a gauge-invariant remainder in `S`. -/ +lemma exists_mem_of_invariant_isoSpan_sup (n m : ℕ) (S : Submodule ℂ B) + (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, rep g y ∈ S) {x : B} (hx : x ∈ h.isoSpan n m ⊔ S) + (hinv : ∀ g : GaugeGroupI, rep g x = x) : + ∃ y ∈ S, (∀ g : GaugeGroupI, rep g y = y) ∧ x - y ∈ h.dotSpan n m := by + obtain ⟨y, hyS, hyinv, hxy⟩ := + exists_mem_of_invariant_biSup_isSU2FunAntiFun_span + (T := fun p : (Fin n → (Fin 1 ⊕ Fin 3)) × (Fin m → (Fin 1 ⊕ Fin 3)) => + h.isoFamily p.1 p.2) + (fun p => h.isSU2FunAntiFun_isoFamily p.1 p.2) + (fun p g _ hy => h.isoFamily_span_stable p.1 p.2 g hy) + (fun p g => by + rw [h.deltaContraction_isoFamily p.1 p.2, h.rep_dotGaugeHiggs_invariant]) + S hS Finset.univ (by + rw [show (⨆ p ∈ (Finset.univ : + Finset ((Fin n → (Fin 1 ⊕ Fin 3)) × (Fin m → (Fin 1 ⊕ Fin 3)))), + IsSU2BiFundamental.span (h.isoFamily p.1 p.2)) + = h.isoSpan n m from by + rw [isoSpan] + simp only [Finset.mem_univ, iSup_pos] + exact iSup_prod] + exact hx) hinv + refine ⟨y, hyS, hyinv, ?_⟩ + rw [show h.dotSpan n m = ⨆ p ∈ (Finset.univ : + Finset ((Fin n → (Fin 1 ⊕ Fin 3)) × (Fin m → (Fin 1 ⊕ Fin 3)))), + ℂ ∙ IsSU2FunAntiFun.deltaContraction (h.isoFamily p.1 p.2) from by + simp only [Finset.mem_univ, iSup_pos, h.deltaContraction_isoFamily] + rw [dotSpan, iSup_prod]] + exact hxy /-! -## H. The Weyl grading at mass weight eight +## H. The gauge classification up to mass weight eight + +Section G is now run at each weight in turn. Weight two dies outright, its weight-zero +piece being trivial: a single Higgs symbol carries hypercharge. Weights four and six are +joins of isospin spans and nothing else, so peeling leaves the isospin contractions of the +towers occurring at that weight — the Higgs mass term at weight four, and its once-derived +companions at weight six. -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. +Weight eight adds the quartic. It is peeled off first, so that the isospin spans not yet +touched can serve as the stable submodule and no stability of the quartic span is needed; +what it leaves is a multiple of the square of the underived isospin contraction, the +second contraction of the quartic family being zero. The three isospin spans then peel off +one after another exactly as at the lower weights. -/ -/-- 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 +/-- A join of two gauge-stable submodules is gauge stable. -/ +lemma stable_sup {S₁ S₂ : Submodule ℂ B} + (h₁ : ∀ g : GaugeGroupI, ∀ y ∈ S₁, rep g y ∈ S₁) + (h₂ : ∀ g : GaugeGroupI, ∀ y ∈ S₂, rep g y ∈ S₂) : + ∀ g : GaugeGroupI, ∀ y ∈ S₁ ⊔ S₂, rep g y ∈ S₁ ⊔ S₂ := by + intro g y hy + have key : (S₁ ⊔ S₂) ≤ Submodule.comap (rep g) (S₁ ⊔ S₂) := + sup_le (fun z hz => Submodule.mem_sup_left (h₁ g z hz)) + (fun z hz => Submodule.mem_sup_right (h₂ g z hz)) + exact key hy + +include h in +/-- Mass weight two carries no gauge invariant modulo a gauge-stable submodule: a single + Higgs symbol carries hypercharge, so the weight-zero piece is trivial. -/ +theorem mem_of_invariant_massWeightSubmodule_two_sup (S : Submodule ℂ B) + (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, rep g y ∈ S) {x : B} + (hx : x ∈ h.massWeightSubmodule 2 ⊔ S) (hinv : ∀ g : GaugeGroupI, rep g x = x) : + x ∈ S := by + have hmem := mem_piece_zero_sup_of_invariant h.massWeightSubmoduleGaugeWeightTwo + (fun i y hy => hS (gaugeTorusGen i) y hy) hx hinv + rwa [h.massWeightSubmoduleGaugeWeightTwo_piece_zero, bot_sup_eq] at hmem + +include h in +/-- Mass weight four modulo a gauge-stable submodule: a gauge invariant is a multiple of + the underived isospin contraction, the Higgs mass term, plus a gauge-invariant remainder + in `S`. -/ +theorem exists_mem_of_invariant_massWeightSubmodule_four_sup (S : Submodule ℂ B) + (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, rep g y ∈ S) {x : B} + (hx : x ∈ h.massWeightSubmodule 4 ⊔ S) (hinv : ∀ g : GaugeGroupI, rep g x = x) : + ∃ y ∈ S, (∀ g : GaugeGroupI, rep g y = y) ∧ x - y ∈ h.dotSpan 0 0 := by + have hmem := mem_piece_zero_sup_of_invariant h.massWeightSubmoduleGaugeWeightFour + (fun i y hy => hS (gaugeTorusGen i) y hy) hx hinv + rw [h.massWeightSubmoduleGaugeWeightFour_piece_zero] at hmem + exact h.exists_mem_of_invariant_isoSpan_sup 0 0 S hS + (sup_le_sup_right (h.higgsBarHiggsSpan_le_isoSpan 0 0) S hmem) hinv + +include h in +/-- Mass weight six modulo a gauge-stable submodule: a gauge invariant is a combination of + the isospin contractions carrying one derivative, on either factor, plus a + gauge-invariant remainder in `S`. -/ +theorem exists_mem_of_invariant_massWeightSubmodule_six_sup (S : Submodule ℂ B) + (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, rep g y ∈ S) {x : B} + (hx : x ∈ h.massWeightSubmodule 6 ⊔ S) (hinv : ∀ g : GaugeGroupI, rep g x = x) : + ∃ y ∈ S, (∀ g : GaugeGroupI, rep g y = y) + ∧ x - y ∈ h.dotSpan 1 0 ⊔ h.dotSpan 0 1 := by + have hmem := mem_piece_zero_sup_of_invariant h.massWeightSubmoduleGaugeWeightSix + (fun i y hy => hS (gaugeTorusGen i) y hy) hx hinv + rw [h.massWeightSubmoduleGaugeWeightSix_piece_zero] at hmem + have hle : h.higgsBarHiggsSpan 1 0 0 ⊔ h.higgsBarHiggsSpan 1 0 1 + ⊔ h.higgsBarHiggsSpan 0 1 0 ⊔ h.higgsBarHiggsSpan 0 1 1 + ≤ h.isoSpan 1 0 ⊔ h.isoSpan 0 1 := by + rw [show h.higgsBarHiggsSpan 1 0 0 ⊔ h.higgsBarHiggsSpan 1 0 1 + ⊔ h.higgsBarHiggsSpan 0 1 0 ⊔ h.higgsBarHiggsSpan 0 1 1 + = (h.higgsBarHiggsSpan 1 0 0 ⊔ h.higgsBarHiggsSpan 1 0 1) + ⊔ (h.higgsBarHiggsSpan 0 1 0 ⊔ h.higgsBarHiggsSpan 0 1 1) from by + rw [sup_assoc]] + exact sup_le_sup (h.higgsBarHiggsSpan_le_isoSpan 1 0) (h.higgsBarHiggsSpan_le_isoSpan 0 1) + obtain ⟨y₁, hy₁, hy₁inv, hxy₁⟩ := + h.exists_mem_of_invariant_isoSpan_sup 1 0 (h.isoSpan 0 1 ⊔ S) + (stable_sup (fun g y hy => h.isoSpan_stable 0 1 g hy) hS) + (by + refine le_trans (sup_le_sup_right hle S) (le_of_eq (sup_assoc _ _ _)) hmem) + hinv + obtain ⟨y, hyS, hyinv, hy₁y⟩ := + h.exists_mem_of_invariant_isoSpan_sup 0 1 S hS hy₁ hy₁inv + refine ⟨y, hyS, hyinv, ?_⟩ + rw [show x - y = (x - y₁) + (y₁ - y) from by abel] + exact Submodule.add_mem _ (Submodule.mem_sup_left hxy₁) (Submodule.mem_sup_right hy₁y) + +include h in +/-- Mass weight eight modulo a gauge-stable submodule: a gauge invariant is a combination + of the isospin contractions carrying two derivatives and of the square of the underived + one — the quartic potential — plus a gauge-invariant remainder in `S`. -/ +theorem exists_mem_of_invariant_massWeightSubmodule_eight_sup (S : Submodule ℂ B) + (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, rep g y ∈ S) {x : B} + (hx : x ∈ h.massWeightSubmodule 8 ⊔ S) (hinv : ∀ g : GaugeGroupI, rep g x = x) : + ∃ y ∈ S, (∀ g : GaugeGroupI, rep g y = y) + ∧ x - y ∈ h.dotSpan 2 0 ⊔ h.dotSpan 0 2 ⊔ h.dotSpan 1 1 + ⊔ ℂ ∙ (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![]) := by + have hmem := mem_piece_zero_sup_of_invariant h.massWeightSubmoduleGaugeWeightEight + (fun i y hy => hS (gaugeTorusGen i) y hy) hx hinv + rw [h.massWeightSubmoduleGaugeWeightEight_piece_zero] at hmem + set S₃ := h.isoSpan 1 1 ⊔ S with hS₃def + set S₂ := h.isoSpan 0 2 ⊔ S₃ with hS₂def + set S₁ := h.isoSpan 2 0 ⊔ S₂ with hS₁def + have hS₃ : ∀ g : GaugeGroupI, ∀ y ∈ S₃, rep g y ∈ S₃ := + stable_sup (fun g y hy => h.isoSpan_stable 1 1 g hy) hS + have hS₂ : ∀ g : GaugeGroupI, ∀ y ∈ S₂, rep g y ∈ S₂ := + stable_sup (fun g y hy => h.isoSpan_stable 0 2 g hy) hS₃ + have hS₁ : ∀ g : GaugeGroupI, ∀ y ∈ S₁, rep g y ∈ S₁ := + stable_sup (fun g y hy => h.isoSpan_stable 2 0 g hy) hS₂ + have hQ : IsSU2QuadFundamental.span h.quadFamily + ≤ IsSU2QuadFundamental.span h.quadFamily ⊔ S₁ := le_sup_left + have hA20 : h.isoSpan 2 0 ≤ IsSU2QuadFundamental.span h.quadFamily ⊔ S₁ := + le_sup_of_le_right le_sup_left + have hA02 : h.isoSpan 0 2 ≤ IsSU2QuadFundamental.span h.quadFamily ⊔ S₁ := + le_sup_of_le_right (le_sup_of_le_right le_sup_left) + have hA11 : h.isoSpan 1 1 ≤ IsSU2QuadFundamental.span h.quadFamily ⊔ S₁ := + le_sup_of_le_right (le_sup_of_le_right (le_sup_of_le_right le_sup_left)) + have hSle : S ≤ IsSU2QuadFundamental.span h.quadFamily ⊔ S₁ := + le_sup_of_le_right (le_sup_of_le_right (le_sup_of_le_right le_sup_right)) + have hquad : x ∈ IsSU2QuadFundamental.span h.quadFamily ⊔ S₁ := + sup_le (sup_le (sup_le (sup_le (sup_le (sup_le + ((h.higgsBarHiggsSpan_le_isoSpan' 2 0 0).trans hA20) + ((h.higgsBarHiggsSpan_le_isoSpan' 2 0 1).trans hA20)) + ((h.higgsBarHiggsSpan_le_isoSpan' 0 2 0).trans hA02)) + ((h.higgsBarHiggsSpan_le_isoSpan' 0 2 1).trans hA02)) + (sup_le ((h.higgsBarHiggsSpan_le_isoSpan' 1 1 0).trans hA11) + ((h.higgsBarHiggsSpan_le_isoSpan' 1 1 1).trans hA11))) + (h.quarticSpan_le_quadFamily_span.trans hQ)) hSle hmem + obtain ⟨c₁, c₂, y₁, hy₁, hxy₁, hy₁inv⟩ := + h.isSU2QuadFundamental_quadFamily.mem_span_sup_invariant_iff x S₁ hS₁ + (fun g => by + rw [epsilonContraction₁₂_quadFamily, h.rep_mul, h.rep_dotGaugeHiggs_invariant]) + (fun g => by rw [epsilonContraction₁₃_quadFamily, map_zero]) hquad hinv + have hxy₁' : x - y₁ ∈ ℂ ∙ (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![]) := by + rw [show x - y₁ = c₁ • IsSU2QuadFundamental.epsilonContraction₁₂ h.quadFamily + + c₂ • IsSU2QuadFundamental.epsilonContraction₁₃ h.quadFamily from by + rw [hxy₁]; abel, epsilonContraction₁₂_quadFamily, epsilonContraction₁₃_quadFamily, + smul_zero, add_zero] + exact Submodule.smul_mem _ _ (Submodule.mem_span_singleton_self _) + obtain ⟨y₂, hy₂, hy₂inv, hy₁y₂⟩ := + h.exists_mem_of_invariant_isoSpan_sup 2 0 S₂ hS₂ hy₁ hy₁inv + obtain ⟨y₃, hy₃, hy₃inv, hy₂y₃⟩ := + h.exists_mem_of_invariant_isoSpan_sup 0 2 S₃ hS₃ hy₂ hy₂inv + obtain ⟨y, hyS, hyinv, hy₃y⟩ := + h.exists_mem_of_invariant_isoSpan_sup 1 1 S hS hy₃ hy₃inv + refine ⟨y, hyS, hyinv, ?_⟩ + rw [show x - y = (y₁ - y₂) + ((y₂ - y₃) + ((y₃ - y) + (x - y₁))) from by abel] + exact Submodule.add_mem _ + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_left hy₁y₂))) + (Submodule.add_mem _ + (Submodule.mem_sup_left (Submodule.mem_sup_left (Submodule.mem_sup_right hy₂y₃))) + (Submodule.add_mem _ + (Submodule.mem_sup_left (Submodule.mem_sup_right hy₃y)) + (Submodule.mem_sup_right hxy₁'))) /-! -## I. Completing the gauge argument at mass weight eight +## I. The gauge-invariant submodules up to 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. +Taking the stable submodule to be the trivial one turns section H into a statement about +the mass-weight submodules themselves, and both inclusions are then available: section H +bounds the invariants from above, and the isospin contractions are themselves gauge +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. -/ -/-- 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 _))) +include h in +/-- 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 + obtain ⟨y, hy, -, hxy⟩ := h.exists_mem_of_invariant_massWeightSubmodule_four_sup ⊥ + (fun g z hz => by rw [Submodule.mem_bot] at hz; simp [hz]) + (Submodule.mem_sup_left hx) hg + rw [Submodule.mem_bot] at hy + rwa [hy, sub_zero] at hxy -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. -/ +include h in +/-- 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 + obtain ⟨y, hy, -, hxy⟩ := h.exists_mem_of_invariant_massWeightSubmodule_six_sup ⊥ + (fun g z hz => by rw [Submodule.mem_bot] at hz; simp [hz]) + (Submodule.mem_sup_left hx) hg + rw [Submodule.mem_bot] at hy + rwa [hy, sub_zero] at hxy + +include h in +/-- A gauge-invariant term of mass weight eight is a combination of the isospin + contractions carrying two derivatives and of the square of the underived contraction. -/ 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. - --/ + obtain ⟨y, hy, -, hxy⟩ := h.exists_mem_of_invariant_massWeightSubmodule_eight_sup ⊥ + (fun g z hz => by rw [Submodule.mem_bot] at hz; simp [hz]) + (Submodule.mem_sup_left hx) hg + rw [Submodule.mem_bot] at hy + rwa [hy, sub_zero] at hxy +include h in /-- 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)) : @@ -1024,7 +1224,7 @@ lemma gaugeInvariantOfMassDim_six_eq_dotSpan : /-- 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. -/ + contraction — the quartic potential. -/ 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 diff --git a/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/MassDimEight.lean b/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/MassDimEight.lean new file mode 100644 index 000000000..e77787b74 --- /dev/null +++ b/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/MassDimEight.lean @@ -0,0 +1,513 @@ +/- +Copyright (c) 2026 Joseph Tooby-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.MassDimLTEight +public import Physlib.Relativity.LorentzGroup.Invariants.IsBiLorentz +/-! +# The Higgs invariants of mass weight eight + +Mass weight eight is where the Higgs sector says what it is for. The gauge classification +of `exists_mem_of_invariant_massWeightSubmodule_eight_sup` leaves four things: the isospin +contractions carrying two derivatives on one tower or one on each, and the square of the +underived contraction. The Lorentz classification then contracts the derivative indices. + +The Higgs is a Lorentz scalar, so the only covector indices at this weight are the two +derivative slots, and two covector indices admit exactly one invariant contraction, the +metric trace, which is `IsBiLorentz`. Contracting the mixed family gives the kinetic term +`∂^μ H† ∂_μ H`; contracting the two families carrying both derivatives on one tower gives +`□H† H` and `H† □H`. The square of the underived contraction has no index to contract and +survives as it stands: it is the quartic potential `(H† H)²`. + +So the four surviving terms are the quartic potential, the kinetic term and the two +box terms, and `lorentzContractionEightSpan` is their span. + +- A. Sums over pairs of covector indices +- B. The isospin contractions with two derivatives as bi-Lorentz tensors +- C. The metric contraction is fixed by both groups +- D. Peeling a bi-Lorentz span off a stable submodule +- E. The invariants of mass weight eight +- F. The span consists of invariants of mass weight eight +- G. The classification as an equivalence + +Everything is stated modulo a submodule `S` stable under both groups, which is what lets +the other sectors be carried along. + +-/ + +@[expose] public section + +namespace StandardModel + +open TensorProduct Matrix MatrixGroups Lorentz ComplexConjugate + +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. Sums over pairs of covector indices + +A bi-Lorentz family is indexed by a pair of covector indices, while the transformation law +of the Higgs tower presents its sums one derivative slot at a time. These two lemmas turn +a sum over pairs 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 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 + +/-! + +## B. The isospin contractions with two derivatives as bi-Lorentz tensors + +Two derivatives can sit both on the Higgs tower, both on the conjugate tower, or one on +each. In each case the isospin contraction is a Lorentz scalar carrying two derivative +slots, so read as a family indexed by those two slots it is a bi-Lorentz tensor, the +Lorentz group moving each slot by the Lorentz matrix of the `SL(2,ℂ)` element. + +-/ + +include h in +/-- Both derivatives on the Higgs tower: a bi-Lorentz tensor in the two derivative + slots. -/ +lemma isBiLorentz_dotGaugeHiggs_left : + IsBiLorentz B repLorentz + (fun d : Fin 2 → Fin 1 ⊕ Fin 3 => h.dotGaugeHiggs d ![]) where + repLorentz_T g l := by + rw [h.repLorentz_dotGaugeHiggs g l (![] : Fin 0 → Fin 1 ⊕ Fin 3)] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [sum_cov_zero, Fin.prod_univ_zero, mul_one] + +include h in +/-- Both derivatives on the conjugate tower: a bi-Lorentz tensor in the same way. -/ +lemma isBiLorentz_dotGaugeHiggs_right : + IsBiLorentz B repLorentz + (fun d : Fin 2 → Fin 1 ⊕ Fin 3 => h.dotGaugeHiggs ![] d) where + repLorentz_T g l := by + rw [h.repLorentz_dotGaugeHiggs g (![] : Fin 0 → Fin 1 ⊕ Fin 3) l, sum_cov_zero] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [Fin.prod_univ_zero, one_mul] + +include h in +/-- One derivative on each tower: the family whose metric contraction is the kinetic + term. -/ +lemma isBiLorentz_dotGaugeHiggs_mixed : + IsBiLorentz B repLorentz + (fun d : Fin 2 → Fin 1 ⊕ Fin 3 => h.dotGaugeHiggs ![d 0] ![d 1]) where + repLorentz_T g l := by + rw [h.repLorentz_dotGaugeHiggs g ![l 0] ![l 1], sum_cov_one, sum_cov_two] + refine Finset.sum_congr rfl fun x _ => ?_ + rw [sum_cov_one] + refine Finset.sum_congr rfl fun y _ => ?_ + simp only [Fin.prod_univ_one, Fin.prod_univ_two, Matrix.cons_val_zero, + Matrix.cons_val_one] + +/-- The span of the isospin contractions with both derivatives on the Higgs tower is the + span of the components of the corresponding bi-Lorentz tensor. -/ +lemma dotSpan_two_zero_eq : + h.dotSpan 2 0 = (h.isBiLorentz_dotGaugeHiggs_left).span := by + rw [dotSpan, IsBiLorentz.span] + refine iSup_congr fun d => le_antisymm (iSup_le fun d' => ?_) (le_iSup_of_le ![] le_rfl) + rw [Subsingleton.elim d' (![] : Fin 0 → Fin 1 ⊕ Fin 3)] + +/-- The span of the isospin contractions with both derivatives on the conjugate tower is + the span of the components of the corresponding bi-Lorentz tensor. -/ +lemma dotSpan_zero_two_eq : + h.dotSpan 0 2 = (h.isBiLorentz_dotGaugeHiggs_right).span := by + rw [dotSpan, IsBiLorentz.span] + refine le_antisymm (iSup_le fun d => iSup_le fun d' => le_iSup_of_le d' ?_) + (iSup_le fun d => le_iSup_of_le ![] (le_iSup_of_le d le_rfl)) + rw [Subsingleton.elim d (![] : Fin 0 → Fin 1 ⊕ Fin 3)] + +/-- The span of the isospin contractions with one derivative on each tower is the span of + the components of the mixed bi-Lorentz tensor. -/ +lemma dotSpan_one_one_eq : + h.dotSpan 1 1 = (h.isBiLorentz_dotGaugeHiggs_mixed).span := by + rw [dotSpan, IsBiLorentz.span] + refine le_antisymm (iSup_le fun d => iSup_le fun d' => le_iSup_of_le ![d 0, d' 0] ?_) + (iSup_le fun d => le_iSup_of_le ![d 0] (le_iSup_of_le ![d 1] le_rfl)) + simp only [Matrix.cons_val_zero, Matrix.cons_val_one, etaExpand_cov_one] + exact le_rfl + +/-! + +## C. The metric contraction is fixed by both groups + +Two covector indices admit one invariant contraction, the metric trace, and the metric is +carried to itself by a Lorentz matrix — that is the defining property of the Lorentz group, +recorded as `IsQuadLorentz.sum_etaZ_mul` — so the trace of a bi-Lorentz family is a Lorentz +invariant. It is a gauge invariant too whenever the components are, and the components +here are isospin contractions, which the gauge group fixes. + +-/ + +/-- The metric trace of a bi-Lorentz family is a Lorentz invariant. -/ +lemma repLorentz_metricContraction {T : (Fin 2 → Fin 1 ⊕ Fin 3) → B} + (hT : IsBiLorentz B repLorentz T) (g : SL(2,ℂ)) : + repLorentz g (IsBiLorentz.metricContraction (T := T)) + = IsBiLorentz.metricContraction (T := T) := by + rw [IsBiLorentz.metricContraction, map_sum] + have step : ∀ d : Fin 2 → Fin 1 ⊕ Fin 3, + repLorentz g (((IsQuadLorentz.etaZ (d 0) (d 1) : ℤ) : ℂ) • T d) + = ∑ a : Fin 2 → Fin 1 ⊕ Fin 3, + (((IsQuadLorentz.etaZ (d 0) (d 1) : ℤ) : ℂ) + * ∏ i : Fin 2, (((SL2C.toLorentzGroup g).1 (a i) (d i) : ℝ) : ℂ)) • T a := by + intro d + rw [map_smul, hT.repLorentz_T g d, Finset.smul_sum] + exact Finset.sum_congr rfl fun a _ => by rw [smul_smul] + rw [Finset.sum_congr rfl fun d _ => step d, Finset.sum_comm] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [← Finset.sum_smul] + congr 1 + rw [sum_cov_two] + simp only [Fin.prod_univ_two, Matrix.cons_val_zero, Matrix.cons_val_one] + exact IsQuadLorentz.sum_etaZ_mul (SL2C.toLorentzGroup g) (a 0) (a 1) + +/-- The metric trace of a family of gauge invariants is a gauge invariant. -/ +lemma rep_metricContraction {T : (Fin 2 → Fin 1 ⊕ Fin 3) → B} + (hTG : ∀ (g : GaugeGroupI) (d : Fin 2 → Fin 1 ⊕ Fin 3), rep g (T d) = T d) + (g : GaugeGroupI) : + rep g (IsBiLorentz.metricContraction (T := T)) + = IsBiLorentz.metricContraction (T := T) := by + rw [IsBiLorentz.metricContraction, map_sum] + exact Finset.sum_congr rfl fun d _ => by rw [map_smul, hTG g d] + +/-! + +## D. Peeling a bi-Lorentz span off a stable submodule + +`IsBiLorentz.exists_smul_metricContraction_of_invariant_subset` removes one family at a +time from a join, leaving a multiple of the metric trace and a remainder in the stable +submodule. Section C makes that multiple fixed by both groups, so the remainder inherits +both invariances from the element peeled and the peeling can be iterated. A submodule of +vectors already fixed by both groups needs no classification at all and is removed by the +same bookkeeping. + +-/ + +/-- 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 _))) + +/-- Peeling one bi-Lorentz span off a Lorentz-stable submodule: an element of the span + together with `S` fixed by both groups is a multiple of the metric trace plus a remainder + in `S` fixed by both groups. -/ +lemma exists_mem_of_invariant_isBiLorentz_span_sup {T : (Fin 2 → Fin 1 ⊕ Fin 3) → B} + (hT : IsBiLorentz B repLorentz T) + (hTG : ∀ (g : GaugeGroupI) (d : Fin 2 → Fin 1 ⊕ Fin 3), rep 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) (hL : ∀ g : SL(2,ℂ), repLorentz g x = x) + (hG : ∀ g : GaugeGroupI, rep g x = x) : + ∃ y ∈ S, (∀ g : SL(2,ℂ), repLorentz g y = y) ∧ (∀ g : GaugeGroupI, rep g y = y) + ∧ x - y ∈ ℂ ∙ IsBiLorentz.metricContraction (T := T) := by + obtain ⟨a, y, hyS, hxy⟩ := + hT.exists_smul_metricContraction_of_invariant_subset S hS hx hL + have hmem : x - y ∈ ℂ ∙ IsBiLorentz.metricContraction (T := T) := by + rw [hxy, add_sub_cancel_right] + exact Submodule.smul_mem _ _ (Submodule.mem_span_singleton_self _) + refine ⟨y, hyS, fun g => ?_, fun g => ?_, hmem⟩ + · have hfix : repLorentz g (x - y) = x - y := by + rw [hxy, add_sub_cancel_right, map_smul, repLorentz_metricContraction hT] + rw [map_sub, hL g] at hfix + exact sub_right_injective hfix + · have hfix : rep g (x - y) = x - y := by + rw [hxy, add_sub_cancel_right, map_smul, rep_metricContraction hTG] + rw [map_sub, hG g] at hfix + exact sub_right_injective hfix + +/-- Peeling off a submodule of vectors already fixed by both groups: no classification is + needed, only the splitting of the join. -/ +lemma exists_mem_of_invariant_sup_fixed (V S : Submodule ℂ B) + (hVL : ∀ g : SL(2,ℂ), ∀ v ∈ V, repLorentz g v = v) + (hVG : ∀ g : GaugeGroupI, ∀ v ∈ V, rep g v = v) {x : B} (hx : x ∈ V ⊔ S) + (hL : ∀ g : SL(2,ℂ), repLorentz g x = x) (hG : ∀ g : GaugeGroupI, rep g x = x) : + ∃ y ∈ S, (∀ g : SL(2,ℂ), repLorentz g y = y) ∧ (∀ g : GaugeGroupI, rep g y = y) + ∧ x - y ∈ V := by + obtain ⟨v, hv, s, hs, rfl⟩ := Submodule.mem_sup.1 hx + refine ⟨s, hs, fun g => ?_, fun g => ?_, by simpa using hv⟩ + · have hg := hL g + rw [map_add, hVL g v hv, add_right_inj] at hg + exact hg + · have hg := hG g + rw [map_add, hVG g v hv, add_right_inj] at hg + exact hg + +/-! + +## E. The invariants of mass weight eight + +The gauge classification puts a gauge invariant of mass weight eight in the three spans of +twice-derived isospin contractions and the line through the square of the underived one, up +to a remainder in `S`. Section D peels the three spans off in turn, each time with the +spans not yet peeled adjoined to `S`, and the line through the square needs no peeling. +What is left is a combination of the three metric traces and the square: the two box terms, +the kinetic term and the quartic potential. + +-/ + +/-- The gauge and Lorentz invariants of the Higgs sector at mass weight eight: the two box + terms `□H† H` and `H† □H`, the kinetic term `∂^μ H† ∂_μ H`, and the quartic potential + `(H† H)²`. -/ +noncomputable def lorentzContractionEightSpan + (h : IsHiggsSector B rep hrep_mul repLorentz hrepLorentz_mul H barH massWeightPoly) : + Submodule ℂ B := + ℂ ∙ IsBiLorentz.metricContraction + (T := fun d : Fin 2 → Fin 1 ⊕ Fin 3 => h.dotGaugeHiggs d ![]) + ⊔ (ℂ ∙ IsBiLorentz.metricContraction + (T := fun d : Fin 2 → Fin 1 ⊕ Fin 3 => h.dotGaugeHiggs ![] d) + ⊔ (ℂ ∙ IsBiLorentz.metricContraction + (T := fun d : Fin 2 → Fin 1 ⊕ Fin 3 => h.dotGaugeHiggs ![d 0] ![d 1]) + ⊔ ℂ ∙ (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![]))) + +include h in +/-- The square of the underived isospin contraction is fixed by both groups: it is a + product of two invariants and both representations are multiplicative. -/ +lemma invariant_dotGaugeHiggs_sq : + (∀ g : SL(2,ℂ), repLorentz g (h.dotGaugeHiggs (![] : Fin 0 → Fin 1 ⊕ Fin 3) ![] + * h.dotGaugeHiggs ![] ![]) + = h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![]) + ∧ ∀ g : GaugeGroupI, rep g (h.dotGaugeHiggs (![] : Fin 0 → Fin 1 ⊕ Fin 3) ![] + * h.dotGaugeHiggs ![] ![]) + = h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![] := + ⟨fun g => by rw [h.repLorentz_mul, h.repLorentz_dotGaugeHiggs_zero], + fun g => by rw [h.rep_mul, h.rep_dotGaugeHiggs_invariant]⟩ + +include h in +/-- The gauge and Lorentz invariants of mass weight eight, modulo a submodule `S` stable + under both groups: such an invariant is a combination of the two box terms, the kinetic + term and the quartic potential, plus a remainder in `S` fixed by both groups. -/ +theorem exists_mem_of_gauge_and_lorentz_invariant (S : Submodule ℂ B) + (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, rep g y ∈ S) + (hSL : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) {x : B} + (hx : x ∈ h.massWeightSubmodule 8 ⊔ S) (hG : ∀ g : GaugeGroupI, rep g x = x) + (hL : ∀ g : SL(2,ℂ), repLorentz g x = x) : + ∃ y ∈ S, (∀ g : GaugeGroupI, rep 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 hG + set Q : Submodule ℂ B := ℂ ∙ (h.dotGaugeHiggs (![] : Fin 0 → Fin 1 ⊕ Fin 3) ![] + * h.dotGaugeHiggs ![] ![]) with hQdef + have hQL : ∀ g : SL(2,ℂ), ∀ v ∈ Q, repLorentz g v = v := by + intro g v hv + obtain ⟨c, rfl⟩ := Submodule.mem_span_singleton.1 hv + rw [map_smul, h.invariant_dotGaugeHiggs_sq.1 g] + have hQG : ∀ g : GaugeGroupI, ∀ v ∈ Q, rep g v = v := by + intro g v hv + obtain ⟨c, rfl⟩ := Submodule.mem_span_singleton.1 hv + rw [map_smul, h.invariant_dotGaugeHiggs_sq.2 g] + set S₃ : Submodule ℂ B := Q ⊔ S with hS₃def + set S₂ : Submodule ℂ B := h.dotSpan 1 1 ⊔ S₃ with hS₂def + set S₁ : Submodule ℂ B := h.dotSpan 0 2 ⊔ S₂ with hS₁def + have hS₃L : ∀ g : SL(2,ℂ), ∀ y ∈ S₃, repLorentz g y ∈ S₃ := + stable_sup_lorentz (fun g v hv => by rw [hQL g v hv]; exact hv) hSL + have hS₂L : ∀ g : SL(2,ℂ), ∀ y ∈ S₂, repLorentz g y ∈ S₂ := by + refine stable_sup_lorentz (fun g y hy => ?_) hS₃L + rw [h.dotSpan_one_one_eq] at hy ⊢ + exact isBiLorentz_span_stable _ g hy + have hS₁L : ∀ g : SL(2,ℂ), ∀ y ∈ S₁, repLorentz g y ∈ S₁ := by + refine stable_sup_lorentz (fun g y hy => ?_) hS₂L + rw [h.dotSpan_zero_two_eq] at hy ⊢ + exact isBiLorentz_span_stable _ g hy + have hx₁ : x ∈ (h.isBiLorentz_dotGaugeHiggs_left).span ⊔ S₁ := by + rw [← h.dotSpan_two_zero_eq, hS₁def, hS₂def, hS₃def] + have hstep : x ∈ (h.dotSpan 2 0 ⊔ h.dotSpan 0 2 ⊔ h.dotSpan 1 1 ⊔ Q) ⊔ S := by + rw [show x = (x - y₀) + y₀ from by abel] + exact Submodule.add_mem _ (Submodule.mem_sup_left hxy₀) + (Submodule.mem_sup_right hy₀S) + have hle : (h.dotSpan 2 0 ⊔ h.dotSpan 0 2 ⊔ h.dotSpan 1 1 ⊔ Q) ⊔ S + ≤ h.dotSpan 2 0 ⊔ (h.dotSpan 0 2 ⊔ (h.dotSpan 1 1 ⊔ (Q ⊔ S))) := + sup_le (sup_le (sup_le (sup_le le_sup_left (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)))) + (le_sup_of_le_right (le_sup_of_le_right (le_sup_of_le_right le_sup_right))) + exact hle hstep + obtain ⟨y₁, hy₁, hy₁L, hy₁G, hxy₁⟩ := + exists_mem_of_invariant_isBiLorentz_span_sup h.isBiLorentz_dotGaugeHiggs_left + (fun g d => h.rep_dotGaugeHiggs_invariant g d ![]) S₁ hS₁L hx₁ hL hG + rw [hS₁def, h.dotSpan_zero_two_eq] at hy₁ + obtain ⟨y₂, hy₂, hy₂L, hy₂G, hxy₂⟩ := + exists_mem_of_invariant_isBiLorentz_span_sup h.isBiLorentz_dotGaugeHiggs_right + (fun g d => h.rep_dotGaugeHiggs_invariant g ![] d) S₂ hS₂L hy₁ hy₁L hy₁G + rw [hS₂def, h.dotSpan_one_one_eq] at hy₂ + obtain ⟨y₃, hy₃, hy₃L, hy₃G, hxy₃⟩ := + exists_mem_of_invariant_isBiLorentz_span_sup h.isBiLorentz_dotGaugeHiggs_mixed + (fun g d => h.rep_dotGaugeHiggs_invariant g ![d 0] ![d 1]) S₃ hS₃L hy₂ hy₂L hy₂G + obtain ⟨y, hyS, hyL, hyG, hxy⟩ := + exists_mem_of_invariant_sup_fixed Q S hQL hQG hy₃ hy₃L hy₃G + refine ⟨y, hyS, hyG, hyL, ?_⟩ + 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))))) + +/-! + +## F. The span consists of invariants of mass weight eight + +The classification of section E is one-directional as stated, and the converse is easy: +each of the four generators is built from isospin contractions of the right mass weight, +which both groups fix, so the span is made of invariants of mass weight eight already. +The metric trace inherits the mass weight of the components and both invariances from +section C, and the square of the underived contraction is a product of two invariants of +mass weight four. + +-/ + +include h in +/-- The metric trace of a family of elements of mass weight eight has mass weight + eight. -/ +lemma metricContraction_mem_massWeightSubmodule {T : (Fin 2 → Fin 1 ⊕ Fin 3) → B} + (hT : ∀ d, T d ∈ h.massWeightSubmodule 8) : + IsBiLorentz.metricContraction (T := T) ∈ h.massWeightSubmodule 8 := by + rw [IsBiLorentz.metricContraction] + exact Submodule.sum_mem _ fun d _ => Submodule.smul_mem _ _ (hT d) + +include h in +/-- The weight-eight span lies in the mass-weight submodule of weight eight. -/ +lemma lorentzContractionEightSpan_le_massWeightSubmodule : + h.lorentzContractionEightSpan ≤ h.massWeightSubmodule 8 := by + rw [lorentzContractionEightSpan] + refine sup_le ?_ (sup_le ?_ (sup_le ?_ ?_)) <;> + rw [Submodule.span_singleton_le_iff_mem] + · exact h.metricContraction_mem_massWeightSubmodule fun d => + h.dotGaugeHiggs_mem_massWeightSubmodule d ![] + · exact h.metricContraction_mem_massWeightSubmodule fun d => + h.dotGaugeHiggs_mem_massWeightSubmodule ![] d + · exact h.metricContraction_mem_massWeightSubmodule fun d => + h.dotGaugeHiggs_mem_massWeightSubmodule ![d 0] ![d 1] + · exact h.massWeightSubmodule_mul_le 4 4 (Submodule.mul_mem_mul + (h.dotGaugeHiggs_mem_massWeightSubmodule ![] ![]) + (h.dotGaugeHiggs_mem_massWeightSubmodule ![] ![])) + +include h in +/-- Every element of the weight-eight span is a gauge invariant. -/ +lemma rep_of_mem_lorentzContractionEightSpan (g : GaugeGroupI) {y : B} + (hy : y ∈ h.lorentzContractionEightSpan) : rep g y = y := by + have key : h.lorentzContractionEightSpan ≤ LinearMap.ker (rep g - LinearMap.id) := by + rw [lorentzContractionEightSpan] + refine sup_le ?_ (sup_le ?_ (sup_le ?_ ?_)) <;> + rw [Submodule.span_singleton_le_iff_mem] <;> + simp only [LinearMap.mem_ker, LinearMap.sub_apply, LinearMap.id_apply, sub_eq_zero] + · exact rep_metricContraction (fun k d => h.rep_dotGaugeHiggs_invariant k d ![]) g + · exact rep_metricContraction (fun k d => h.rep_dotGaugeHiggs_invariant k ![] d) g + · exact rep_metricContraction + (fun k d => h.rep_dotGaugeHiggs_invariant k ![d 0] ![d 1]) g + · exact h.invariant_dotGaugeHiggs_sq.2 g + have hy' := key hy + simp only [LinearMap.mem_ker, LinearMap.sub_apply, LinearMap.id_apply, sub_eq_zero] at hy' + exact hy' + +include h in +/-- Every element of the weight-eight span is a Lorentz invariant. -/ +lemma repLorentz_of_mem_lorentzContractionEightSpan (g : SL(2,ℂ)) {y : B} + (hy : y ∈ h.lorentzContractionEightSpan) : repLorentz g y = y := by + have key : h.lorentzContractionEightSpan + ≤ LinearMap.ker (repLorentz g - LinearMap.id) := by + rw [lorentzContractionEightSpan] + refine sup_le ?_ (sup_le ?_ (sup_le ?_ ?_)) <;> + rw [Submodule.span_singleton_le_iff_mem] <;> + simp only [LinearMap.mem_ker, LinearMap.sub_apply, LinearMap.id_apply, sub_eq_zero] + · exact repLorentz_metricContraction h.isBiLorentz_dotGaugeHiggs_left g + · exact repLorentz_metricContraction h.isBiLorentz_dotGaugeHiggs_right g + · exact repLorentz_metricContraction h.isBiLorentz_dotGaugeHiggs_mixed g + · exact h.invariant_dotGaugeHiggs_sq.1 g + have hy' := key hy + simp only [LinearMap.mem_ker, LinearMap.sub_apply, LinearMap.id_apply, sub_eq_zero] at hy' + exact hy' + +/-! + +## G. The classification as an equivalence + +The two directions meet. Forwards, section E puts an invariant of mass weight eight in the +span up to a remainder in `S`; backwards, section F 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. + +-/ + +include h in +/-- 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 two box terms, the kinetic term and the quartic potential, up to a remainder in `S` + fixed by both groups. -/ +theorem mem_massWeightSubmodule_eight_sup_and_gauge_lorentz_invariant_iff + (S : Submodule ℂ B) (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, rep g y ∈ S) + (hSL : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) (x : B) : + (x ∈ h.massWeightSubmodule 8 ⊔ S ∧ (∀ g : GaugeGroupI, rep g x = x) + ∧ ∀ g : SL(2,ℂ), repLorentz g x = x) + ↔ ∃ y ∈ S, (∀ g : GaugeGroupI, rep 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⟩ + refine ⟨?_, fun g => ?_, fun g => ?_⟩ + · have hsum : x - y + y ∈ h.massWeightSubmodule 8 ⊔ S := + Submodule.add_mem _ + (Submodule.mem_sup_left (h.lorentzContractionEightSpan_le_massWeightSubmodule hxy)) + (Submodule.mem_sup_right hyS) + simpa using hsum + · have hstep : rep g (x - y + y) = x - y + y := by + rw [map_add, h.rep_of_mem_lorentzContractionEightSpan g hxy, hyG g] + simpa using hstep + · have hstep : repLorentz g (x - y + y) = x - y + y := by + rw [map_add, h.repLorentz_of_mem_lorentzContractionEightSpan g hxy, hyL g] + simpa using hstep + +end IsHiggsSector + +end StandardModel diff --git a/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/MassDimLTEight.lean b/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/MassDimLTEight.lean new file mode 100644 index 000000000..ae2663697 --- /dev/null +++ b/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/MassDimLTEight.lean @@ -0,0 +1,407 @@ +/- +Copyright (c) 2026 Joseph Tooby-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.GaugeWeightDecomposition +public import Physlib.Relativity.LorentzGroup.Invariants.IsSingleLorentz +/-! +# The Higgs invariants below mass weight eight + +The Higgs sector is the one sector of the Standard Model already carrying an invariant +below mass weight eight, and it is the most familiar of all: the mass term `H† H`, of mass +weight four. Everything else below weight eight dies, and for three different reasons. + +The odd weights are trivial submodules, every Higgs tower carrying even mass weight. +Weight two dies on hypercharge: a single Higgs symbol carries `6Y = ∓3`, so nothing at that +weight is neutral, which is the gauge classification of +`mem_of_invariant_massWeightSubmodule_two_sup`. Weight six dies on Lorentz counting. Its +gauge invariants are the isospin contractions with one derivative, `∂_μ H† H` and +`H† ∂_μ H`, and a single covector index admits no invariant contraction at all — the metric +ties two indices and the Levi-Civita symbol four — which is `IsSingleLorentz`. + +Weight four survives because the Higgs is a Lorentz scalar. Its gauge invariants are the +multiples of `H† H`, and with no derivative slot there is no Lorentz index to contract, so +the Lorentz group fixes the contraction outright and the whole line survives. That is why +the conclusion here is membership in a span rather than in `S`, unlike the gauge and Yukawa +sectors: the surviving span is the Higgs mass term at weight four and trivial at every +other weight below eight. + +- A. Sums over the empty tuple of covector indices +- B. The isospin contractions with one derivative as Lorentz vectors +- C. The underived isospin contraction as a Lorentz scalar +- D. Mass weight six +- E. The classification below mass weight eight + +As in the gauge sector the final statement 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 TensorProduct Matrix MatrixGroups Lorentz ComplexConjugate + +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. Sums over the empty tuple of covector indices + +An underived tower is indexed by the empty tuple of covector indices, of which there is +exactly one, so the Lorentz transformation law of such a tower collapses: the sum over its +derivative indices has a single term and the product of Lorentz matrix entries over its +slots is empty. Both collapses are this one lemma. + +-/ + +/-- A sum over families of no covector indices is its single term. -/ +lemma sum_cov_zero {M : Type*} [AddCommMonoid M] (f : (Fin 0 → Fin 1 ⊕ Fin 3) → M) : + ∑ d : Fin 0 → Fin 1 ⊕ Fin 3, f d = f ![] := + 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) + +/-! + +## B. The isospin contractions with one derivative as Lorentz vectors + +At mass weight six the gauge classification leaves the isospin contractions carrying one +derivative, on either of the two towers. The Higgs is a Lorentz scalar, so the only +Lorentz index such a contraction has is that derivative slot, and read as a family indexed +by it the contraction is a Lorentz vector. `IsSingleLorentz` says that one covector index +admits no invariant contraction, so a Lorentz invariant of the span together with a stable +submodule already lies in the submodule; the spans are themselves stable, so the two of +them peel off one after the other. + +-/ + +include h in +/-- The isospin contraction of a once-derived Higgs tower against an underived conjugate + tower, read as a family indexed by its derivative slot, is a Lorentz vector. -/ +lemma isSingleLorentz_dotGaugeHiggs_left : + IsSingleLorentz B repLorentz + (fun d : Fin 1 → Fin 1 ⊕ Fin 3 => h.dotGaugeHiggs d ![]) where + repLorentz_T g l := by + rw [h.repLorentz_dotGaugeHiggs g l (![] : Fin 0 → Fin 1 ⊕ Fin 3)] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [sum_cov_zero, Fin.prod_univ_zero, mul_one] + +include h in +/-- The isospin contraction of an underived Higgs tower against a once-derived conjugate + tower is a Lorentz vector in the same way. -/ +lemma isSingleLorentz_dotGaugeHiggs_right : + IsSingleLorentz B repLorentz + (fun d : Fin 1 → Fin 1 ⊕ Fin 3 => h.dotGaugeHiggs ![] d) where + repLorentz_T g l := by + rw [h.repLorentz_dotGaugeHiggs g (![] : Fin 0 → Fin 1 ⊕ Fin 3) l, sum_cov_zero] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [Fin.prod_univ_zero, one_mul] + +/-- The span of the isospin contractions with one derivative on the Higgs tower is the + span of the components of the corresponding Lorentz vector. -/ +lemma dotSpan_one_zero_eq : + h.dotSpan 1 0 = (h.isSingleLorentz_dotGaugeHiggs_left).span := by + rw [dotSpan, IsSingleLorentz.span] + refine iSup_congr fun d => le_antisymm (iSup_le fun d' => ?_) (le_iSup_of_le ![] le_rfl) + rw [Subsingleton.elim d' (![] : Fin 0 → Fin 1 ⊕ Fin 3)] + +/-- The span of the isospin contractions with one derivative on the conjugate tower is the + span of the components of the corresponding Lorentz vector. -/ +lemma dotSpan_zero_one_eq : + h.dotSpan 0 1 = (h.isSingleLorentz_dotGaugeHiggs_right).span := by + rw [dotSpan, IsSingleLorentz.span] + refine le_antisymm (iSup_le fun d => iSup_le fun d' => le_iSup_of_le d' ?_) + (iSup_le fun d => le_iSup_of_le ![] (le_iSup_of_le d le_rfl)) + rw [Subsingleton.elim d (![] : Fin 0 → Fin 1 ⊕ Fin 3)] + +/-- The span of the components of a Lorentz vector is stable under the Lorentz group: + each component goes to a combination of components. -/ +lemma isSingleLorentz_span_stable {T : (Fin 1 → Fin 1 ⊕ Fin 3) → B} + (hT : IsSingleLorentz 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 join of two Lorentz-stable submodules is Lorentz stable. -/ +lemma stable_sup_lorentz {S₁ S₂ : Submodule ℂ B} + (h₁ : ∀ g : SL(2,ℂ), ∀ y ∈ S₁, repLorentz g y ∈ S₁) + (h₂ : ∀ g : SL(2,ℂ), ∀ y ∈ S₂, repLorentz g y ∈ S₂) : + ∀ g : SL(2,ℂ), ∀ y ∈ S₁ ⊔ S₂, repLorentz g y ∈ S₁ ⊔ S₂ := by + intro g y hy + have key : (S₁ ⊔ S₂) ≤ Submodule.comap (repLorentz g) (S₁ ⊔ S₂) := + sup_le (fun z hz => Submodule.mem_sup_left (h₁ g z hz)) + (fun z hz => Submodule.mem_sup_right (h₂ g z hz)) + exact key hy + +/-! + +## C. The underived isospin contraction as a Lorentz scalar + +At mass weight four the gauge classification leaves the multiples of `H† H`. An underived +Higgs symbol carries no derivative slot, so the Lorentz group moves it by an empty product +of Lorentz matrix entries, that is not at all, and the contraction and the whole line +through it are fixed. Nothing peels off here; the line is the answer. + +-/ + +include h in +/-- The underived isospin contraction is a Lorentz scalar. -/ +lemma repLorentz_dotGaugeHiggs_zero (g : SL(2,ℂ)) : + repLorentz g (h.dotGaugeHiggs (![] : Fin 0 → Fin 1 ⊕ Fin 3) ![]) + = h.dotGaugeHiggs ![] ![] := by + rw [h.repLorentz_dotGaugeHiggs, sum_cov_zero, sum_cov_zero] + simp + +/-- The span of the underived isospin contractions is the line through the mass term. -/ +lemma dotSpan_zero_zero_eq : + h.dotSpan 0 0 = ℂ ∙ h.dotGaugeHiggs (![] : Fin 0 → Fin 1 ⊕ Fin 3) ![] := by + rw [dotSpan] + refine le_antisymm (iSup_le fun d => iSup_le fun d' => ?_) + (le_iSup_of_le ![] (le_iSup_of_le ![] le_rfl)) + rw [Subsingleton.elim d (![] : Fin 0 → Fin 1 ⊕ Fin 3), + Subsingleton.elim d' (![] : Fin 0 → Fin 1 ⊕ Fin 3)] + +include h in +/-- Every element of the line through the underived isospin contraction is a Lorentz + invariant. -/ +lemma repLorentz_of_mem_dotSpan_zero_zero (g : SL(2,ℂ)) {y : B} (hy : y ∈ h.dotSpan 0 0) : + repLorentz g y = y := by + rw [h.dotSpan_zero_zero_eq] at hy + obtain ⟨c, rfl⟩ := Submodule.mem_span_singleton.1 hy + rw [map_smul, h.repLorentz_dotGaugeHiggs_zero] + +include h in +/-- Every element of a span of isospin contractions is a gauge invariant. -/ +lemma rep_of_mem_dotSpan {n m : ℕ} (g : GaugeGroupI) {y : B} (hy : y ∈ h.dotSpan n m) : + rep g y = y := by + have key : h.dotSpan n m ≤ LinearMap.ker (rep g - LinearMap.id) := by + rw [dotSpan] + refine iSup_le fun d => iSup_le fun d' => ?_ + rw [Submodule.span_singleton_le_iff_mem] + simp only [LinearMap.mem_ker, LinearMap.sub_apply, LinearMap.id_apply, sub_eq_zero] + exact h.rep_dotGaugeHiggs_invariant g d d' + have hy' := key hy + simp only [LinearMap.mem_ker, LinearMap.sub_apply, LinearMap.id_apply, sub_eq_zero] at hy' + exact hy' + +include h in +/-- The line through the underived isospin contraction lies in mass weight four. -/ +lemma dotSpan_zero_zero_le_massWeightSubmodule : + h.dotSpan 0 0 ≤ h.massWeightSubmodule 4 := by + rw [dotSpan] + refine iSup_le fun d => iSup_le fun d' => ?_ + rw [Submodule.span_singleton_le_iff_mem] + exact h.dotGaugeHiggs_mem_massWeightSubmodule d d' + +/-! + +## D. Mass weight six + +The gauge classification puts a gauge invariant of mass weight six in the two spans of +once-derived isospin contractions up to a remainder in `S`, so the element itself lies in +those two spans joined with `S`. Section B then peels them off one after the other, and +since a single covector index carries no invariant contraction nothing is left behind: the +invariant lies in `S`. + +-/ + +include h in +/-- Mass weight six carries no gauge and Lorentz invariant modulo a stable submodule: such + an invariant of `massWeightSubmodule 6 ⊔ S` lies in `S`. -/ +theorem mem_of_gauge_lorentz_invariant_massWeightSubmodule_six_sup (S : Submodule ℂ B) + (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, rep g y ∈ S) + (hSL : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) {x : B} + (hx : x ∈ h.massWeightSubmodule 6 ⊔ S) (hG : ∀ g : GaugeGroupI, rep g x = x) + (hL : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by + obtain ⟨y₀, hy₀S, hy₀G, hxy₀⟩ := + h.exists_mem_of_invariant_massWeightSubmodule_six_sup S hS hx hG + have hxmem : x ∈ (h.dotSpan 1 0 ⊔ h.dotSpan 0 1) ⊔ S := by + rw [show x = (x - y₀) + y₀ from by abel] + exact Submodule.add_mem _ (Submodule.mem_sup_left hxy₀) (Submodule.mem_sup_right hy₀S) + have hstab : ∀ g : SL(2,ℂ), ∀ y ∈ h.dotSpan 0 1 ⊔ S, + repLorentz g y ∈ h.dotSpan 0 1 ⊔ S := by + refine stable_sup_lorentz (fun g y hy => ?_) hSL + rw [h.dotSpan_zero_one_eq] at hy ⊢ + exact isSingleLorentz_span_stable _ g hy + have hstep : x ∈ (h.isSingleLorentz_dotGaugeHiggs_left).span ⊔ (h.dotSpan 0 1 ⊔ S) := by + rw [← h.dotSpan_one_zero_eq, ← sup_assoc] + exact hxmem + have hnext := (h.isSingleLorentz_dotGaugeHiggs_left).mem_of_invariant_of_mem_sup _ + hstab hstep hL + rw [h.dotSpan_zero_one_eq] at hnext + exact (h.isSingleLorentz_dotGaugeHiggs_right).mem_of_invariant_of_mem_sup S hSL hnext hL + +/-! + +## E. The classification below mass weight eight + +The seven weights between zero and eight are now settled: weights one, three, five and +seven are trivial submodules, weight two is killed by hypercharge, weight six by section D, +and weight four leaves the line through the mass term. `lorentzContractionLTEightSpan` +records that answer as a single submodule depending on the weight, so the statement has the +shape of the weight-eight one and of the other sectors' below-eight ones, whose spans +happen to be trivial. + +-/ + +/-- The gauge and Lorentz invariants of the Higgs sector at mass weight `w` for + `0 < w < 8`: the line through the Higgs mass term at weight four, and nothing at any + other weight. -/ +noncomputable def lorentzContractionLTEightSpan + (h : IsHiggsSector B rep hrep_mul repLorentz hrepLorentz_mul H barH massWeightPoly) + (w : ℕ) : Submodule ℂ B := + if w = 4 then h.dotSpan 0 0 else ⊥ + +include h in +/-- The surviving span at weight `w` lies in the mass-weight submodule of weight `w`. -/ +lemma lorentzContractionLTEightSpan_le_massWeightSubmodule (w : ℕ) : + h.lorentzContractionLTEightSpan w ≤ h.massWeightSubmodule w := by + rw [lorentzContractionLTEightSpan] + split_ifs with hw + · subst hw + exact h.dotSpan_zero_zero_le_massWeightSubmodule + · exact bot_le + +include h in +/-- Every element of the surviving span is a gauge invariant. -/ +lemma rep_of_mem_lorentzContractionLTEightSpan (w : ℕ) (g : GaugeGroupI) {y : B} + (hy : y ∈ h.lorentzContractionLTEightSpan w) : rep g y = y := by + rw [lorentzContractionLTEightSpan] at hy + split_ifs at hy with hw + · exact h.rep_of_mem_dotSpan g hy + · rw [Submodule.mem_bot] at hy + rw [hy, map_zero] + +include h in +/-- Every element of the surviving span is a Lorentz invariant. -/ +lemma repLorentz_of_mem_lorentzContractionLTEightSpan (w : ℕ) (g : SL(2,ℂ)) {y : B} + (hy : y ∈ h.lorentzContractionLTEightSpan w) : repLorentz g y = y := by + rw [lorentzContractionLTEightSpan] at hy + split_ifs at hy with hw + · exact h.repLorentz_of_mem_dotSpan_zero_zero g hy + · rw [Submodule.mem_bot] at hy + rw [hy, map_zero] + +include h in +/-- Below mass weight eight a gauge and Lorentz invariant of `massWeightSubmodule w ⊔ S` + is an element of the surviving span up to a remainder in `S` fixed by both groups. The + four odd weights are trivial submodules, weight two dies on hypercharge, weight six is + section D, and weight four leaves the Higgs mass term. -/ +theorem exists_mem_of_gauge_lorentz_invariant_massWeightSubmodule_lt_eight_sup (w : ℕ) + (hw0 : 0 < w) (hw : w < 8) (S : Submodule ℂ B) + (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, rep g y ∈ S) + (hSL : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) {x : B} + (hx : x ∈ h.massWeightSubmodule w ⊔ S) (hG : ∀ g : GaugeGroupI, rep g x = x) + (hL : ∀ g : SL(2,ℂ), repLorentz g x = x) : + ∃ y ∈ S, (∀ g : GaugeGroupI, rep g y = y) ∧ (∀ g : SL(2,ℂ), repLorentz g y = y) + ∧ x - y ∈ h.lorentzContractionLTEightSpan w := by + have htriv : ∀ v : ℕ, x ∈ S → ∃ y ∈ S, (∀ g : GaugeGroupI, rep g y = y) + ∧ (∀ g : SL(2,ℂ), repLorentz g y = y) + ∧ x - y ∈ h.lorentzContractionLTEightSpan v := fun v hxS => + ⟨x, hxS, hG, hL, by rw [sub_self]; exact Submodule.zero_mem _⟩ + interval_cases w + · exact htriv 1 (by rwa [h.massWeightSubmodule_odd_eq_bot 1 (by decide), bot_sup_eq] at hx) + · exact htriv 2 (h.mem_of_invariant_massWeightSubmodule_two_sup S hS hx hG) + · exact htriv 3 (by rwa [h.massWeightSubmodule_odd_eq_bot 3 (by decide), bot_sup_eq] at hx) + · obtain ⟨y, hyS, hyG, hxy⟩ := + h.exists_mem_of_invariant_massWeightSubmodule_four_sup S hS hx hG + have hxy' : x - y ∈ h.lorentzContractionLTEightSpan 4 := by + rw [lorentzContractionLTEightSpan, if_pos rfl] + exact hxy + refine ⟨y, hyS, hyG, fun g => ?_, hxy'⟩ + have hfix : repLorentz g (x - y) = x - y := + h.repLorentz_of_mem_dotSpan_zero_zero g hxy + rw [map_sub, hL g] at hfix + exact sub_right_injective hfix + · exact htriv 5 (by rwa [h.massWeightSubmodule_odd_eq_bot 5 (by decide), bot_sup_eq] at hx) + · exact htriv 6 + (h.mem_of_gauge_lorentz_invariant_massWeightSubmodule_six_sup S hS hSL hx hG hL) + · exact htriv 7 (by rwa [h.massWeightSubmodule_odd_eq_bot 7 (by decide), 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 an + element of the surviving span up to a remainder in `S` fixed by both groups. That span + is the line through the Higgs mass term at weight four and trivial elsewhere, so at every + weight but four this says `x = y`, as in the gauge and Yukawa sectors. -/ +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, rep g y ∈ S) + (hSL : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) (x : B) : + (x ∈ h.massWeightSubmodule w ⊔ S ∧ (∀ g : GaugeGroupI, rep g x = x) + ∧ ∀ g : SL(2,ℂ), repLorentz g x = x) + ↔ ∃ y ∈ S, (∀ g : GaugeGroupI, rep g y = y) + ∧ (∀ g : SL(2,ℂ), repLorentz g y = y) + ∧ x - y ∈ h.lorentzContractionLTEightSpan w := by + constructor + · rintro ⟨hxm, hG, hL⟩ + exact h.exists_mem_of_gauge_lorentz_invariant_massWeightSubmodule_lt_eight_sup w hw0 hw + S hS hSL hxm hG hL + · rintro ⟨y, hyS, hyG, hyL, hxy⟩ + refine ⟨?_, fun g => ?_, fun g => ?_⟩ + · have hsum : x - y + y ∈ h.massWeightSubmodule w ⊔ S := + Submodule.add_mem _ + (Submodule.mem_sup_left (h.lorentzContractionLTEightSpan_le_massWeightSubmodule + w hxy)) + (Submodule.mem_sup_right hyS) + simpa using hsum + · have hstep : rep g (x - y + y) = x - y + y := by + rw [map_add, h.rep_of_mem_lorentzContractionLTEightSpan w g hxy, hyG g] + simpa using hstep + · have hstep : repLorentz g (x - y + y) = x - y + y := by + rw [map_add, h.repLorentz_of_mem_lorentzContractionLTEightSpan w g hxy, hyL g] + simpa using hstep + +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 the surviving span + joined with `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, rep g y ∈ S) + (hSL : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) (x : B) : + (x ∈ h.massWeightSubmodule w ⊔ S ∧ (∀ g : GaugeGroupI, rep g x = x) + ∧ ∀ g : SL(2,ℂ), repLorentz g x = x) + ↔ (x ∈ h.lorentzContractionLTEightSpan w ⊔ S ∧ (∀ g : GaugeGroupI, rep g x = x) + ∧ ∀ g : SL(2,ℂ), repLorentz g x = x) := by + constructor + · rintro ⟨hxm, hG, hL⟩ + obtain ⟨y, hyS, -, -, hxy⟩ := + h.exists_mem_of_gauge_lorentz_invariant_massWeightSubmodule_lt_eight_sup w hw0 hw S + hS hSL hxm hG hL + refine ⟨?_, hG, hL⟩ + have hsum : x - y + y ∈ h.lorentzContractionLTEightSpan w ⊔ S := + Submodule.add_mem _ (Submodule.mem_sup_left hxy) (Submodule.mem_sup_right hyS) + simpa using hsum + · rintro ⟨hxm, hG, hL⟩ + exact ⟨sup_le_sup_right (h.lorentzContractionLTEightSpan_le_massWeightSubmodule w) S + hxm, hG, hL⟩ + +end IsHiggsSector + +end StandardModel diff --git a/Physlib/Particles/StandardModel/IsStandardModel/MassWeight/Filtration.lean b/Physlib/Particles/StandardModel/IsStandardModel/MassWeight/Filtration.lean new file mode 100644 index 000000000..482dbdc93 --- /dev/null +++ b/Physlib/Particles/StandardModel/IsStandardModel/MassWeight/Filtration.lean @@ -0,0 +1,421 @@ +/- +Copyright (c) 2026 Joseph Tooby-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.Filtration +public import Physlib.Particles.StandardModel.IsStandardModel.CovStandardModel +/-! +# The mass-weight filtration of the jet Standard Model + +`IsStandardModel` is written in the bare symbols, on which the whole jet gauge group acts; +`IsCovStandardModel` is written in the covariant towers, on which only the global gauge +group acts. [`CovStandardModel.lean`](../CovStandardModel.lean) shows that these are one +theory seen twice: `isCovStandardModel` builds the covariant form on the same algebra with +the same `massWeightPoly`, unconditionally, and `forall_repJet_and_repLorentz_eq_iff` says +that inside the field algebra jet-gauge invariance is membership of the covariant +subalgebra together with global-gauge invariance. This file carries the classification of +Lagrangians across that bridge. No invariant is classified here that was not classified +there; passing to the covariant form loses nothing. + +Section A repeats the mass-weight grading and its filtration for the jet form. The +definitions are word for word those of the covariant form, only over the field algebra +generated by the gauge potential `A` rather than by the field strength `F`. + +Section B compares the two. The covariant subalgebra is the field algebra of the covariant +form on the nose, and it sits inside the jet field algebra, so a covariant weight piece is +exactly a weight piece that happens to be covariant. + +Section C is the one point needing an argument. Invariance crosses the bridge for free, +but membership does not: `⊔` does not distribute over `⊓`, so a decomposition `x = v + s` +of an element of `massWeightSubmoduleLE w ⊔ S` need not have `v` covariant even when `x` +is. What makes it go through is that the weight decomposition is canonical — the weight-`k` +part of `x` is the `X ^ k` coefficient of `massWeightPoly x`, and reading off a coefficient +does not leave the covariant algebra. Hence a covariant element of the filtration lies in +the covariant filtration, and the decomposition can be repaired as soon as `S` is itself +covariant. That is the one hypothesis this file adds to the covariant statement, and the +reduction offers nothing without it: a non-covariant summand contributed by `S` is invisible +to the classification of the covariant form. + +The `S` to have in mind is the tail of the filtration. To read the classification as a +statement about a theory that also carries operators of higher dimension, take `S` to be +the terms of mass weight above eight: the theorem then says that modulo those, an +invariant of dimension at most four is a combination of the terms listed below. Such an +`S` satisfies `hScov` as soon as the higher operators are themselves written in the +covariant towers, which is the case of interest. Taking `S = ⊥` discharges all three +hypotheses at once and gives the classification with nothing set aside, which is section +E. + +Section D is then bookkeeping. The answer at bound eight is the answer of the covariant +form: the constant term, the Higgs mass term, and the dimension-four Lagrangian. + +- A. The mass-weight filtration +- B. The covariant subalgebra inside the field algebra +- C. Moving the filtration to the covariant form +- D. The classification up to mass dimension four +- E. The classification with nothing set aside + +-/ + +@[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 mass-weight filtration + +-/ + +/-- All elements of the field algebra of mass weight exactly `n`: the intersection of the + algebra generated by the bare symbols with the part on which `massWeightPoly` is the + monomial `X ^ n`. This is the jet-form counterpart of + `IsCovStandardModel.massWeightSubmodule`. -/ +noncomputable def massWeightSubmodule + (h : IsStandardModel B repJet repLorentz massWeightPoly H barH A + 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 ℂ) + +/-- On the mass-weight submodule of weight `n` the map `massWeightPoly` is the monomial + `X ^ n`, which is what the kernel condition says. -/ +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, LinearMap.mem_ker] at hx + simpa [sub_eq_zero] using hx.2 + +/-- Each graded piece lies in the field algebra. -/ +lemma massWeightSubmodule_le_fieldAlgebra (w : ℕ) : + h.massWeightSubmodule w ≤ h.fieldAlgebra.toSubmodule := inf_le_left + +/-- The elements of the field algebra of mass weight at most `w`: the join of the + mass-weight submodules of weight `0` through `w`. This is where a Lagrangian lives, a + sum of terms of every mass dimension up to a cut-off rather than of a single one. -/ +noncomputable def massWeightSubmoduleLE (w : ℕ) : Submodule ℂ B := + ⨆ k ∈ Finset.range (w + 1), h.massWeightSubmodule k + +/-- Each graded piece of weight at most `w` sits inside the filtration at `w`. -/ +lemma massWeightSubmodule_le_massWeightSubmoduleLE {k w : ℕ} (hk : k ≤ w) : + h.massWeightSubmodule k ≤ h.massWeightSubmoduleLE w := + le_iSup₂_of_le k (Finset.mem_range.2 (Nat.lt_succ_of_le hk)) le_rfl + +/-- An element of a graded piece of weight at most `w` lies in the filtration at `w`. -/ +lemma mem_massWeightSubmoduleLE {k w : ℕ} (hk : k ≤ w) {x : B} + (hx : x ∈ h.massWeightSubmodule k) : x ∈ h.massWeightSubmoduleLE w := + h.massWeightSubmodule_le_massWeightSubmoduleLE hk hx + +/-- A submodule containing every graded piece of weight at most `w` contains the + filtration at `w`: the join is taken over exactly those pieces. -/ +lemma massWeightSubmoduleLE_le {w : ℕ} {V : Submodule ℂ B} + (hV : ∀ k ≤ w, h.massWeightSubmodule k ≤ V) : h.massWeightSubmoduleLE w ≤ V := + iSup₂_le fun k hk => hV k (Nat.lt_succ_iff.1 (Finset.mem_range.1 hk)) + +/-- The filtration grows with the bound. -/ +lemma massWeightSubmoduleLE_mono {w w' : ℕ} (hw : w ≤ w') : + h.massWeightSubmoduleLE w ≤ h.massWeightSubmoduleLE w' := + h.massWeightSubmoduleLE_le fun _ hk => + h.massWeightSubmodule_le_massWeightSubmoduleLE (hk.trans hw) + +/-- The filtration lies in the field algebra, being a join of pieces that do. -/ +lemma massWeightSubmoduleLE_le_fieldAlgebra (w : ℕ) : + h.massWeightSubmoduleLE w ≤ h.fieldAlgebra.toSubmodule := + h.massWeightSubmoduleLE_le fun k _ => h.massWeightSubmodule_le_fieldAlgebra k + +/-! + +## B. The covariant subalgebra inside the field algebra + +-/ + +include h in +/-- The covariant subalgebra sits inside the field algebra: the field-strength tower is a + polynomial in the gauge-field symbols, and the matter towers generate the same algebra + as the bare matter symbols. -/ +lemma covAlgebra_le_fieldAlgebra : h.covAlgebra ≤ h.fieldAlgebra := by + rw [covAlgebra, h.fieldAlgebra_eq_covDeriv] + refine Algebra.adjoin_le ?_ + rintro x ((hx | hx) | hx) + · simp only [Set.mem_iUnion, Set.mem_range] at hx + obtain ⟨n, l, μ, ν, φ, rfl⟩ := hx + refine Algebra.adjoin_mono ?_ (h.covF_mem_adjoin_gaugeSymbols l μ ν φ) + rintro y ⟨s, ρ, ψ, rfl⟩ + exact Set.mem_union_left _ (Set.mem_union_left _ + (Set.mem_iUnion.2 ⟨s, Set.mem_iUnion.2 ⟨ρ, ψ, rfl⟩⟩)) + · exact Algebra.subset_adjoin (Set.mem_union_left _ (Set.mem_union_right _ hx)) + · exact Algebra.subset_adjoin (Set.mem_union_right _ hx) + +include h in +/-- The covariant subalgebra as a submodule sits inside the field algebra. -/ +lemma covAlgebra_toSubmodule_le_fieldAlgebra : + h.covAlgebra.toSubmodule ≤ h.fieldAlgebra.toSubmodule := + fun _ hy => h.covAlgebra_le_fieldAlgebra hy + +include h in +/-- The field algebra of the covariant form of the theory is the covariant subalgebra: + the two are generated by the same set of covariant towers. -/ +lemma isCovStandardModel_fieldAlgebra : + h.isCovStandardModel.fieldAlgebra = h.covAlgebra := rfl + +include h in +/-- A covariant weight piece is a weight piece that happens to be covariant: the two + submodules cut the same kernel of `massWeightPoly` out of the two algebras, and one + algebra sits inside the other. -/ +lemma covMassWeightSubmodule_eq (w : ℕ) : + h.isCovStandardModel.massWeightSubmodule w + = h.massWeightSubmodule w ⊓ h.covAlgebra.toSubmodule := by + rw [IsCovStandardModel.massWeightSubmodule, massWeightSubmodule, inf_right_comm, + inf_eq_right.2 h.covAlgebra_toSubmodule_le_fieldAlgebra] + rfl + +include h in +/-- A covariant weight piece lies in the weight piece of the field algebra. -/ +lemma covMassWeightSubmodule_le (w : ℕ) : + h.isCovStandardModel.massWeightSubmodule w ≤ h.massWeightSubmodule w := by + rw [h.covMassWeightSubmodule_eq] + exact inf_le_left + +include h in +/-- The covariant filtration lies in the filtration of the field algebra. -/ +lemma covMassWeightSubmoduleLE_le (w : ℕ) : + h.isCovStandardModel.massWeightSubmoduleLE w ≤ h.massWeightSubmoduleLE w := + h.isCovStandardModel.massWeightSubmoduleLE_le fun k hk => + (h.covMassWeightSubmodule_le k).trans (h.massWeightSubmodule_le_massWeightSubmoduleLE hk) + +include h in +/-- The covariant filtration lies in the covariant subalgebra. -/ +lemma covMassWeightSubmoduleLE_le_covAlgebra (w : ℕ) : + h.isCovStandardModel.massWeightSubmoduleLE w ≤ h.covAlgebra.toSubmodule := + h.isCovStandardModel.massWeightSubmoduleLE_le fun _ _ => inf_le_left + +/-! + +## C. Moving the filtration to the covariant form + +-/ + +include h in +/-- The weight decomposition of an element of the filtration is canonical: an element of + mass weight at most `w` is the sum of the coefficients of `X ^ 0, …, X ^ w` in its image + under `massWeightPoly`. Both sides are linear in the element, so it is enough to check + it on a single graded piece, where `massWeightPoly` is a monomial. -/ +lemma eq_sum_coeff_massWeightPoly {w : ℕ} {x : B} (hx : x ∈ h.massWeightSubmoduleLE w) : + x = ∑ k ∈ Finset.range (w + 1), (massWeightPoly x).coeff k := by + have key : h.massWeightSubmoduleLE w ≤ LinearMap.ker + (LinearMap.id (R := ℂ) (M := B) - ∑ k ∈ Finset.range (w + 1), + (Polynomial.lcoeff B k).restrictScalars ℂ ∘ₗ massWeightPoly.toLinearMap) := by + refine h.massWeightSubmoduleLE_le fun j hj y hy => ?_ + simp only [LinearMap.mem_ker, LinearMap.sub_apply, LinearMap.id_apply, + LinearMap.coe_sum, Finset.sum_apply, LinearMap.coe_comp, Function.comp_apply, + LinearMap.coe_restrictScalars, Polynomial.lcoeff_apply, AlgHom.toLinearMap_apply, + h.massWeightPoly_of_mem_massWeightSubmodule hy, Polynomial.coeff_monomial, + Finset.sum_ite_eq, Finset.mem_range, Nat.lt_succ_of_le hj, if_true, sub_self] + have h2 := key hx + simp only [LinearMap.mem_ker, LinearMap.sub_apply, LinearMap.id_apply, + LinearMap.coe_sum, Finset.sum_apply, LinearMap.coe_comp, Function.comp_apply, + LinearMap.coe_restrictScalars, Polynomial.lcoeff_apply, AlgHom.toLinearMap_apply, + sub_eq_zero] at h2 + exact h2 + +include h in +/-- A covariant element of the filtration lies in the covariant filtration. Its weight + components are the coefficients of `massWeightPoly`, and reading off a coefficient does + not leave the covariant algebra: on the covariant algebra the coefficient of `X ^ k` + lands in the span of the covariant words of weight `k`. -/ +lemma mem_covMassWeightSubmoduleLE {w : ℕ} {x : B} (hx : x ∈ h.massWeightSubmoduleLE w) + (hcov : x ∈ h.covAlgebra) : x ∈ h.isCovStandardModel.massWeightSubmoduleLE w := by + rw [h.eq_sum_coeff_massWeightPoly hx] + refine Submodule.sum_mem _ fun k hk => ?_ + refine h.isCovStandardModel.massWeightSubmodule_le_massWeightSubmoduleLE + (Nat.lt_succ_iff.1 (Finset.mem_range.1 hk)) ?_ + rw [h.isCovStandardModel.massWeightSubmodule_eq_span] + exact h.isCovStandardModel.coeff_massWeightPoly_mem_span k hcov + +/-! + +## D. The classification up to mass dimension four + +-/ + +include h in +/-- The span of the covariant filtration lies in the covariant subalgebra. -/ +lemma covStandardModelSpanLE_le_covAlgebra (w : ℕ) : + h.isCovStandardModel.standardModelSpanLE w ≤ h.covAlgebra.toSubmodule := + (h.isCovStandardModel.standardModelSpanLE_le_massWeightSubmoduleLE w).trans + (h.covMassWeightSubmoduleLE_le_covAlgebra w) + +include h in +/-- Every element of the span of the covariant filtration is invariant under the whole jet + gauge group, not just the global one: it is covariant and globally invariant, which is + what the reduction theorem asks for. -/ +lemma forall_repJet_of_mem_covStandardModelSpanLE {w : ℕ} {y : B} + (hy : y ∈ h.isCovStandardModel.standardModelSpanLE w) (U : JetGaugeGroupI) : + repJet U y = y := by + have hycov : y ∈ h.covAlgebra := h.covStandardModelSpanLE_le_covAlgebra w hy + exact (h.forall_repJet_eq_iff (h.covAlgebra_le_fieldAlgebra hycov)).2 + ⟨hycov, fun g => h.isCovStandardModel.repGauge_of_mem_standardModelSpanLE w g hy⟩ U + +include h in +/-- The classification of the Standard Model up to mass dimension four in its jet form: an + element of `massWeightSubmoduleLE 8 ⊔ S`, for `S` a covariant submodule stable under the + jet gauge group and the Lorentz group, is fixed by both groups exactly when it lies in + the span of the covariant filtration up to a remainder in `S` fixed by both groups. + + The hypothesis `hScov` has no counterpart in the covariant statement. It is what repairs + a decomposition `x = v + s`: the reduction puts `x` in the covariant algebra, and `v` is + then covariant only because `s` is. Jet-gauge stability of `S` gives global stability for + free, `repGlobal` being `repJet` at a constant jet. -/ +theorem mem_massWeightSubmoduleLE_eight_sup_and_invariant_iff (S : Submodule ℂ B) + (hS : ∀ U : JetGaugeGroupI, ∀ y ∈ S, repJet U y ∈ S) + (hSL : ∀ Λ : SL(2,ℂ), ∀ y ∈ S, repLorentz Λ y ∈ S) + (hScov : S ≤ h.covAlgebra.toSubmodule) (x : B) : + (x ∈ h.massWeightSubmoduleLE 8 ⊔ S ∧ (∀ U : JetGaugeGroupI, repJet U x = x) + ∧ ∀ Λ : SL(2,ℂ), repLorentz Λ x = x) + ↔ ∃ y ∈ S, (∀ U : JetGaugeGroupI, repJet U y = y) + ∧ (∀ Λ : SL(2,ℂ), repLorentz Λ y = y) + ∧ x - y ∈ h.isCovStandardModel.standardModelSpanLE 8 := by + have hSglobal : ∀ g : GaugeGroupI, ∀ y ∈ S, repGlobal repJet g y ∈ S := + fun g y hy => hS _ y hy + constructor + · rintro ⟨hxm, hG, hL⟩ + have hxfield : x ∈ h.fieldAlgebra := + sup_le (h.massWeightSubmoduleLE_le_fieldAlgebra 8) + (hScov.trans h.covAlgebra_toSubmodule_le_fieldAlgebra) hxm + obtain ⟨hxcov, hglob, -⟩ := (h.forall_repJet_and_repLorentz_eq_iff hxfield).1 ⟨hG, hL⟩ + obtain ⟨v, hv, s, hs, hvs⟩ := Submodule.mem_sup.1 hxm + have hvcov : v ∈ h.covAlgebra := by + have hveq : v = x - s := by rw [← hvs, add_sub_cancel_right] + rw [hveq] + exact sub_mem hxcov (hScov hs) + have hxcovLE : x ∈ h.isCovStandardModel.massWeightSubmoduleLE 8 ⊔ S := by + rw [← hvs] + exact Submodule.add_mem _ + (Submodule.mem_sup_left (h.mem_covMassWeightSubmoduleLE hv hvcov)) + (Submodule.mem_sup_right hs) + obtain ⟨y, hyS, hyG, hyL, hxy⟩ := + (h.isCovStandardModel.mem_massWeightSubmoduleLE_eight_sup_and_gauge_lorentz_invariant_iff + S hSglobal hSL x).1 ⟨hxcovLE, hglob, hL⟩ + exact ⟨y, hyS, fun U => (h.forall_repJet_eq_iff + (h.covAlgebra_le_fieldAlgebra (hScov hyS))).2 ⟨hScov hyS, hyG⟩ U, hyL, hxy⟩ + · rintro ⟨y, hyS, hyG, hyL, hxy⟩ + refine ⟨?_, fun U => ?_, fun Λ => ?_⟩ + · have hsum : x - y + y ∈ h.massWeightSubmoduleLE 8 ⊔ S := + Submodule.add_mem _ (Submodule.mem_sup_left (h.covMassWeightSubmoduleLE_le 8 + (h.isCovStandardModel.standardModelSpanLE_le_massWeightSubmoduleLE 8 hxy))) + (Submodule.mem_sup_right hyS) + simpa using hsum + · have hstep : repJet U (x - y + y) = x - y + y := by + rw [map_add, h.forall_repJet_of_mem_covStandardModelSpanLE hxy U, hyG U] + simpa using hstep + · have hstep : repLorentz Λ (x - y + y) = x - y + y := by + rw [map_add, h.isCovStandardModel.repLorentz_of_mem_standardModelSpanLE 8 Λ hxy, + hyL Λ] + simpa using hstep + +include h in +/-- The invariant content of the Standard Model up to mass dimension four, in its jet + form. An element of `massWeightSubmoduleLE 8 ⊔ S`, for `S` a covariant submodule stable + under both groups, is fixed by the jet gauge group and the Lorentz group exactly when it + is a combination of + the constant term, of mass dimension zero, + the Higgs mass term `H† H`, of mass dimension two (`IsHiggsSector.dotSpan`), + and the Standard-Model Lagrangian of mass dimension four — the gauge kinetic and theta + terms of the three gauge groups (`IsGaugeSector.lorentzContractionEightSpan`), the Higgs + kinetic term, its quartic potential and its two box terms + (`IsHiggsSector.lorentzContractionEightSpan`), the kinetic terms of the ten fermion + species over the nine family pairs (`IsFermionSector.kineticSpan`), and the six Yukawa + couplings over the nine family pairs (`yukawaSpan`) — + up to a remainder in `S` fixed by both groups, and nothing else. -/ +theorem mem_massWeightSubmoduleLE_eight_sup_and_invariant_iff_lagrangian (S : Submodule ℂ B) + (hS : ∀ U : JetGaugeGroupI, ∀ y ∈ S, repJet U y ∈ S) + (hSL : ∀ Λ : SL(2,ℂ), ∀ y ∈ S, repLorentz Λ y ∈ S) + (hScov : S ≤ h.covAlgebra.toSubmodule) (x : B) : + (x ∈ h.massWeightSubmoduleLE 8 ⊔ S ∧ (∀ U : JetGaugeGroupI, repJet U x = x) + ∧ ∀ Λ : SL(2,ℂ), repLorentz Λ x = x) + ↔ ∃ y ∈ S, (∀ U : JetGaugeGroupI, repJet U y = y) + ∧ (∀ Λ : SL(2,ℂ), repLorentz Λ y = y) + ∧ x - y ∈ (1 : Submodule ℂ B) ⊔ (h.isCovStandardModel.isHiggsSector.dotSpan 0 0 + ⊔ (h.isCovStandardModel.isGaugeSector.lorentzContractionEightSpan + ⊔ h.isCovStandardModel.isHiggsSector.lorentzContractionEightSpan + ⊔ (h.isCovStandardModel.isFermionSector.kineticSpan + ⊔ h.isCovStandardModel.yukawaSpan))) := by + rw [← h.isCovStandardModel.standardModelSpanLE_eight] + exact h.mem_massWeightSubmoduleLE_eight_sup_and_invariant_iff S hS hSL hScov x + +/-! + +## E. The classification with nothing set aside + +Taking `S = ⊥` discharges every hypothesis of section D: the trivial submodule is stable +under both groups and is trivially covariant. What is left is the classification itself, +with no remainder to quotient by. + +-/ + +include h in +/-- The invariants of the filtration, with nothing set aside: an element of mass weight at + most eight is fixed by the jet gauge group and the Lorentz group exactly when it lies in + the span of the covariant filtration. This is + `mem_massWeightSubmoduleLE_eight_sup_and_invariant_iff` at `S = ⊥`, where the stability + and covariance hypotheses hold vacuously. -/ +theorem mem_massWeightSubmoduleLE_eight_and_invariant_iff (x : B) : + (x ∈ h.massWeightSubmoduleLE 8 ∧ (∀ U : JetGaugeGroupI, repJet U x = x) + ∧ ∀ Λ : SL(2,ℂ), repLorentz Λ x = x) + ↔ x ∈ h.isCovStandardModel.standardModelSpanLE 8 := by + have key := h.mem_massWeightSubmoduleLE_eight_sup_and_invariant_iff ⊥ + (fun U y hy => by rw [Submodule.mem_bot] at hy; simp [hy]) + (fun Λ y hy => by rw [Submodule.mem_bot] at hy; simp [hy]) bot_le x + rw [sup_bot_eq] at key + rw [key] + constructor + · rintro ⟨y, hy, -, -, hxy⟩ + rwa [(Submodule.mem_bot ℂ).1 hy, sub_zero] at hxy + · intro hx + exact ⟨0, Submodule.zero_mem _, by simp, by simp, by simpa using hx⟩ + +include h in +/-- The invariant content of the Standard Model up to mass dimension four, with nothing set + aside: an element of mass weight at most eight is fixed by the jet gauge group and the + Lorentz group exactly when it is a combination of the constant term, the Higgs mass term + `H† H`, and the Standard-Model Lagrangian of mass dimension four, and nothing else. -/ +theorem mem_massWeightSubmoduleLE_eight_and_invariant_iff_lagrangian (x : B) : + (x ∈ h.massWeightSubmoduleLE 8 ∧ (∀ U : JetGaugeGroupI, repJet U x = x) + ∧ ∀ Λ : SL(2,ℂ), repLorentz Λ x = x) + ↔ x ∈ (1 : Submodule ℂ B) ⊔ (h.isCovStandardModel.isHiggsSector.dotSpan 0 0 + ⊔ (h.isCovStandardModel.isGaugeSector.lorentzContractionEightSpan + ⊔ h.isCovStandardModel.isHiggsSector.lorentzContractionEightSpan + ⊔ (h.isCovStandardModel.isFermionSector.kineticSpan + ⊔ h.isCovStandardModel.yukawaSpan))) := by + rw [← h.isCovStandardModel.standardModelSpanLE_eight] + exact h.mem_massWeightSubmoduleLE_eight_and_invariant_iff x + +end IsStandardModel + +end StandardModel diff --git a/Physlib/Particles/StandardModel/Peeling.lean b/Physlib/Particles/StandardModel/Peeling.lean new file mode 100644 index 000000000..97012ce52 --- /dev/null +++ b/Physlib/Particles/StandardModel/Peeling.lean @@ -0,0 +1,839 @@ +/- +Copyright (c) 2026 Joseph Tooby-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.Invariants.IsSU3FunAntiFun +public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU2AntiFundamental +public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU2BiFundamental +public import Physlib.Relativity.LorentzGroup.Invariants.IsBiLeftWeyl +public import Physlib.Relativity.LorentzGroup.Invariants.IsVectorLeftRightWeyl +/-! +# Peeling invariants off a stable submodule + +Every sector of the Standard Model is classified the same way. A submodule of the algebra +is cut down by one index law at a time — colour, then isospin, then Lorentz — and at each +stage a classification theorem says that an invariant of the submodule is a multiple of a +single contraction, up to an error term in a submodule that the group carries into itself. +This file is the machinery that runs those stages, shared by every sector so that they all +tell the same story. + +The relation is `Peels σ V W`: every `σ`-invariant of `V ⊔ S` lies in `W ⊔ S`, for every +`σ`-stable `S`. It is transitive, monotone in both arguments and closed under joins in its +source, and those four moves are all a sector-level argument ever needs: stages chain by +`Peels.trans`, a sum of blocks is handled by `Peels.sup`, and a family of blocks by +`Peels.biSup` and `Peels.iSup`. + +The maps `σ` are a bare family of linear maps indexed by any type, not a representation. +That is what lets one relation serve three stages: colour is `fun U => repGauge (U, 1, 1)`, +isospin is `fun V => repGauge (1, V, 1)`, Lorentz is `fun Λ => repLorentz Λ`, and both +groups at once is the family indexed by `GaugeGroupI ⊕ SL(2,ℂ)`. A peeling for one of the +three transports to a peeling for all of them by `Peels.comp`. + +A `Step` packages one classification theorem: the submodule, the contraction its invariants +are multiples of, and the three facts the peeling consumes. The constructors wrap the +classifiers of the colour, isospin and Lorentz index laws, together with `Step.ofFixed` for +a stage that has nothing to do — a lepton block has no colour index, and rather than making +it an exception it is given the trivial colour step. + +Three further groups of shared facts ride along, for the same reason: they are used by +every sector and belong to none. A gauge transformation is a triple, so an element fixed by +its colour, isospin and hypercharge factors separately is gauge invariant, and each index +law constrains one factor and says nothing about the others (E). A contraction of one pair +of indices is a sum, or a difference, of components, so each index law has to be known +closed under those before the next contraction can be formed (F). And a weight piece lies +inside the submodule it decomposes, a symbol range is the span of its components, and a +product of stable submodules is stable (G). + +- A. Stable and fixed submodules +- B. The peeling relation +- C. The classification steps +- D. The two groups at once +- E. The three factors of a gauge transformation +- F. Sums and differences of classified families +- G. Weight pieces, symbol ranges and stability + +-/ + +@[expose] public section + +namespace StandardModel + +open TensorProduct Matrix MatrixGroups Lorentz Pointwise ComplexConjugate + +/-! + +## A. Stable and fixed submodules + +The peeling argument never uses a group structure, only a family of linear maps `σ` indexed +by a type `G`, and two properties of a submodule with respect to it: being carried into +itself, and being fixed pointwise. Both are needed. Stability is what lets a submodule be +adjoined to the error term `S` of a classification, and it is exactly the hypothesis the +classification theorems ask of `S`; fixedness is the stronger property the spans of the +contractions have, and it implies stability. + +-/ + +section Stability + +variable {B : Type*} [AddCommGroup B] [Module ℂ B] {G : Type*} + +/-- A submodule carried into itself by every map of the family `σ`. This is the hypothesis + every classification modulo a submodule asks of that submodule. -/ +def IsStableUnder (σ : G → B →ₗ[ℂ] B) (V : Submodule ℂ B) : Prop := + ∀ g, ∀ y ∈ V, σ g y ∈ V + +/-- A submodule fixed pointwise by every map of the family `σ`. -/ +def IsFixedBy (σ : G → B →ₗ[ℂ] B) (V : Submodule ℂ B) : Prop := + ∀ g, ∀ y ∈ V, σ g y = y + +/-- Stability read as an inclusion of images, which is the form the lattice operations + are handled in. -/ +lemma isStableUnder_iff_map {σ : G → B →ₗ[ℂ] B} {V : Submodule ℂ B} : + IsStableUnder σ V ↔ ∀ g, Submodule.map (σ g) V ≤ V := by + constructor + · rintro hV g _ ⟨y, hy, rfl⟩ + exact hV g y hy + · exact fun hV g y hy => hV g ⟨y, hy, rfl⟩ + +/-- A submodule fixed pointwise is stable. -/ +lemma IsFixedBy.isStableUnder {σ : G → B →ₗ[ℂ] B} {V : Submodule ℂ B} (hV : IsFixedBy σ V) : + IsStableUnder σ V := fun g y hy => by rw [hV g y hy]; exact hy + +/-- A join of two pointwise-fixed submodules is pointwise fixed. -/ +lemma IsFixedBy.sup {σ : G → B →ₗ[ℂ] B} {V V' : Submodule ℂ B} (hV : IsFixedBy σ V) + (hV' : IsFixedBy σ V') : IsFixedBy σ (V ⊔ V') := by + intro g y hy + obtain ⟨a, ha, b, hb, rfl⟩ := Submodule.mem_sup.1 hy + rw [map_add, hV g a ha, hV' g b hb] + +/-- The zero submodule is stable. -/ +lemma isStableUnder_bot {σ : G → B →ₗ[ℂ] B} : IsStableUnder σ (⊥ : Submodule ℂ B) := by + intro g y hy + rw [Submodule.mem_bot] at hy + simp [hy] + +/-- A join of two stable submodules is stable. -/ +lemma IsStableUnder.sup {σ : G → B →ₗ[ℂ] B} {V V' : Submodule ℂ B} (hV : IsStableUnder σ V) + (hV' : IsStableUnder σ V') : IsStableUnder σ (V ⊔ V') := + isStableUnder_iff_map.2 fun g => by + rw [Submodule.map_sup] + exact sup_le_sup (isStableUnder_iff_map.1 hV g) (isStableUnder_iff_map.1 hV' g) + +/-- An indexed join of stable submodules is stable. The index is a `Sort`, so this covers + the join over a proposition and with it the bounded join `⨆ i ∈ s, V i`. -/ +lemma isStableUnder_iSup {σ : G → B →ₗ[ℂ] B} {ι : Sort*} {V : ι → Submodule ℂ B} + (hV : ∀ i, IsStableUnder σ (V i)) : IsStableUnder σ (⨆ i, V i) := + isStableUnder_iff_map.2 fun g => by + rw [Submodule.map_iSup] + exact iSup_mono fun i => isStableUnder_iff_map.1 (hV i) g + +/-- The line through a fixed vector is fixed, hence stable. -/ +lemma isFixedBy_span_singleton {σ : G → B →ₗ[ℂ] B} {b : B} (hb : ∀ g, σ g b = b) : + IsFixedBy σ (ℂ ∙ b) := by + intro g y hy + obtain ⟨c, rfl⟩ := Submodule.mem_span_singleton.1 hy + rw [map_smul, hb] + +/-- An indexed join of pointwise-fixed submodules is pointwise fixed. -/ +lemma isFixedBy_iSup {σ : G → B →ₗ[ℂ] B} {ι : Sort*} {V : ι → Submodule ℂ B} + (hV : ∀ i, IsFixedBy σ (V i)) : IsFixedBy σ (⨆ i, V i) := by + intro g y hy + refine Submodule.iSup_induction (motive := fun z => σ g z = z) V hy (fun i z hz => hV i g z hz) + (map_zero _) fun z z' hz hz' => by rw [map_add, hz, hz'] + +/-- A join of lines through fixed vectors is pointwise fixed: the form in which a family of + contractions supplies the fixedness of its span. -/ +lemma isFixedBy_iSup_span_singleton {σ : G → B →ₗ[ℂ] B} {ι : Sort*} {T : ι → B} + (hT : ∀ i g, σ g (T i) = T i) : IsFixedBy σ (⨆ i, ℂ ∙ T i) := + isFixedBy_iSup fun i => isFixedBy_span_singleton (hT i) + +/-- The span of a family whose members transform into combinations of the family is + stable. -/ +lemma isStableUnder_iSup_span_singleton {σ : G → B →ₗ[ℂ] B} {ι : Type*} {T : ι → B} + (hT : ∀ g i, σ g (T i) ∈ ⨆ j, ℂ ∙ T j) : IsStableUnder σ (⨆ i, ℂ ∙ T i) := + isStableUnder_iff_map.2 fun g => by + rw [Submodule.map_iSup] + exact iSup_le fun i => by + rw [Submodule.map_span, Set.image_singleton, Submodule.span_singleton_le_iff_mem] + exact hT g i + +/-- The span of a family transforming by a finite combination of itself is stable: the + form in which the three index laws supply stability. -/ +lemma isStableUnder_iSup_span_singleton_of_sum {σ : G → B →ₗ[ℂ] B} {ι : Type*} [Fintype ι] + {T : ι → B} (hT : ∀ g i, ∃ c : ι → ℂ, σ g (T i) = ∑ a, c a • T a) : + IsStableUnder σ (⨆ i, ℂ ∙ T i) := by + refine isStableUnder_iSup_span_singleton fun g i => ?_ + obtain ⟨c, hc⟩ := hT g i + rw [hc] + exact sum_mem fun a _ => Submodule.smul_mem _ _ + (Submodule.mem_iSup_of_mem a (Submodule.mem_span_singleton_self _)) + +end Stability + +/-! + +## B. The peeling relation + +`Peels σ V W` says that a `σ`-invariant of `V` joined with a `σ`-stable submodule `S` lies +in `W` joined with `S`, for every such `S`. It is the shape every classification modulo a +stable submodule takes, and everything the argument does with those classifications is one +of four moves: enlarging the target, shrinking the source, composing two of them in +sequence, and — the one that does real work — joining two of them. + +The join is where stability is spent. To peel `V₁ ⊔ V₂` down to `W` the second summand is +put into the error term, which asks that `V₂` be stable; what comes back out is an element +of `W ⊔ (V₂ ⊔ S)`, and peeling `V₂` off that in turn asks that `W` be stable, since `W` is +now part of the error term. Both hypotheses are met in practice, `V₂` being a span of +symbol components and `W` a span of invariants. + +-/ + +section Peeling + +variable {B : Type*} [AddCommGroup B] [Module ℂ B] {G : Type*} + +/-- The peeling relation: every `σ`-invariant of `V ⊔ S`, for `S` a `σ`-stable submodule, + lies in `W ⊔ S`. This is the conclusion each classification modulo a stable submodule + reaches, in a form that composes. -/ +def Peels (σ : G → B →ₗ[ℂ] B) (V W : Submodule ℂ B) : Prop := + ∀ S : Submodule ℂ B, IsStableUnder σ S → ∀ x ∈ V ⊔ S, (∀ g, σ g x = x) → x ∈ W ⊔ S + +/-- An inclusion peels: nothing has to be classified. -/ +lemma peels_of_le {σ : G → B →ₗ[ℂ] B} {V W : Submodule ℂ B} (hVW : V ≤ W) : Peels σ V W := + fun S _ _ hx _ => sup_le_sup_right hVW S hx + +/-- Peeling a smaller source. -/ +lemma Peels.mono_left {σ : G → B →ₗ[ℂ] B} {V V' W : Submodule ℂ B} (hP : Peels σ V' W) + (hV : V ≤ V') : Peels σ V W := + fun S hS x hx hinv => hP S hS x (sup_le_sup_right hV S hx) hinv + +/-- Peeling to a larger target. -/ +lemma Peels.mono_right {σ : G → B →ₗ[ℂ] B} {V W W' : Submodule ℂ B} (hP : Peels σ V W') + (hW : W' ≤ W) : Peels σ V W := + fun S hS x hx hinv => sup_le_sup_right hW S (hP S hS x hx hinv) + +/-- Two peelings in sequence. This is what turns the colour, isospin and Lorentz + classifications of a block into a single one. -/ +lemma Peels.trans {σ : G → B →ₗ[ℂ] B} {V W W' : Submodule ℂ B} (hP : Peels σ V W) + (hQ : Peels σ W W') : Peels σ V W' := + fun S hS x hx hinv => hQ S hS x (hP S hS x hx hinv) hinv + +/-- Peeling a join, one summand at a time: the second summand joins the error term while + the first is classified, and the roles are then exchanged. -/ +lemma Peels.sup {σ : G → B →ₗ[ℂ] B} {V V' W : Submodule ℂ B} (hP : Peels σ V W) + (hQ : Peels σ V' W) (hV' : IsStableUnder σ V') (hW : IsStableUnder σ W) : + Peels σ (V ⊔ V') W := by + intro S hS x hx hinv + have h1 : x ∈ W ⊔ (V' ⊔ S) := + hP (V' ⊔ S) (hV'.sup hS) x (by rwa [← sup_assoc]) hinv + have h2 : x ∈ V' ⊔ (W ⊔ S) := by + have hcomm : W ⊔ (V' ⊔ S) = V' ⊔ (W ⊔ S) := sup_left_comm W V' S + rwa [hcomm] at h1 + have h3 : x ∈ W ⊔ (W ⊔ S) := hQ (W ⊔ S) (hW.sup hS) x h2 hinv + rwa [← sup_assoc, sup_idem] at h3 + +/-- Peeling a join over a finite set, by induction on the set. -/ +lemma Peels.biSup {σ : G → B →ₗ[ℂ] B} {ι : Type*} [DecidableEq ι] {V : ι → Submodule ℂ B} + {W : Submodule ℂ B} (hP : ∀ i, Peels σ (V i) W) (hV : ∀ i, IsStableUnder σ (V i)) + (hW : IsStableUnder σ W) : ∀ s : Finset ι, Peels σ (⨆ i ∈ s, V i) W := by + intro s + induction s using Finset.induction_on with + | empty => + refine peels_of_le (le_trans (le_of_eq ?_) bot_le) + simp + | @insert a s _ ih => + rw [Finset.iSup_insert] + exact (hP a).sup ih (isStableUnder_iSup fun i => isStableUnder_iSup fun _ => hV i) hW + +/-- Peeling a join over a finite index type. -/ +lemma Peels.iSup {σ : G → B →ₗ[ℂ] B} {ι : Type*} [Fintype ι] [DecidableEq ι] + {V : ι → Submodule ℂ B} {W : Submodule ℂ B} (hP : ∀ i, Peels σ (V i) W) + (hV : ∀ i, IsStableUnder σ (V i)) (hW : IsStableUnder σ W) : Peels σ (⨆ i, V i) W := by + have hs := Peels.biSup hP hV hW Finset.univ + refine hs.mono_left (iSup_le fun i => le_iSup₂_of_le i (Finset.mem_univ i) le_rfl) + +/-- Peeling under a reindexing of the family of maps: an invariant of the larger family is + an invariant of the smaller one and a stable submodule for the larger is stable for the + smaller, so a peeling for the smaller family is one for the larger. This is what lets the + colour, isospin and Lorentz peelings, each stated for its own group, be read as peelings + for the gauge and Lorentz groups together. -/ +lemma Peels.comp {σ : G → B →ₗ[ℂ] B} {G' : Type*} (ι : G' → G) {V W : Submodule ℂ B} + (hP : Peels (fun g' => σ (ι g')) V W) : Peels σ V W := + fun S hS x hx hinv => hP S (fun g' y hy => hS (ι g') y hy) x hx fun g' => hinv (ι g') + +end Peeling + +/-! + +## C. The classification steps + +A `Step` packages what one classification theorem provides: a submodule, the single +contraction its invariants are multiples of, and the three facts the peeling needs — that +the submodule is stable, that the contraction is fixed, and that an invariant of the +submodule joined with a stable error term is a multiple of the contraction plus an error. + +Six constructors cover the file. Five wrap the classification theorems of the colour, +isospin and Lorentz index laws. The sixth wraps no theorem at all: a line through a fixed +vector is classified by that vector, and it is what stands in for the colour step of a +lepton block, whose three symbols carry no colour index between them. With it the two +lepton couplings are peeled in the same three stages as the four quark ones. + +-/ + +section Steps + +variable {B : Type*} [AddCommGroup B] [Module ℂ B] {G : Type*} + +/-- One classification of the invariants of a submodule, in the form the peeling consumes: + the submodule is stable, the contraction it classifies down to is fixed, and every + invariant of the submodule joined with a stable error term is a multiple of the + contraction up to an error. -/ +structure Step (σ : G → B →ₗ[ℂ] B) (V : Submodule ℂ B) where + /-- The single invariant the classification produces. -/ + contraction : B + /-- The submodule being classified is carried into itself. -/ + stable : IsStableUnder σ V + /-- The contraction is fixed by the whole family. -/ + contraction_fixed : ∀ g, σ g contraction = contraction + /-- The classification itself, modulo a stable error term. -/ + classify : ∀ S : Submodule ℂ B, IsStableUnder σ S → ∀ x ∈ V ⊔ S, (∀ g, σ g x = x) → + ∃ c : ℂ, ∃ y ∈ S, x = c • contraction + y + +/-- A step peels its submodule down to the line through its contraction. -/ +lemma Step.peels {σ : G → B →ₗ[ℂ] B} {V : Submodule ℂ B} (st : Step σ V) : + Peels σ V (ℂ ∙ st.contraction) := by + intro S hS x hx hinv + obtain ⟨c, y, hy, rfl⟩ := st.classify S hS x hx hinv + exact Submodule.mem_sup.2 ⟨c • st.contraction, + Submodule.mem_span_singleton.2 ⟨c, rfl⟩, y, hy, rfl⟩ + +/-- The line through a step's contraction is fixed, hence stable: the form in which a + step supplies the stability of the target of a peeling. -/ +lemma Step.span_contraction_stable {σ : G → B →ₗ[ℂ] B} {V : Submodule ℂ B} + (st : Step σ V) : IsStableUnder σ (ℂ ∙ st.contraction) := + (isFixedBy_span_singleton st.contraction_fixed).isStableUnder + +/-- A family of steps peels the join of their submodules down to the join of their + contractions. This is the whole of one stage of a block's classification: one index law + holds at each value of the indices it does not see, and the classification is applied at + each of those values in turn. -/ +lemma Peels.iSup_step {σ : G → B →ₗ[ℂ] B} {κ : Type*} [Fintype κ] [DecidableEq κ] + {V : κ → Submodule ℂ B} (st : ∀ k, Step σ (V k)) : + Peels σ (⨆ k, V k) (⨆ k, ℂ ∙ (st k).contraction) := + Peels.iSup (fun k => ((st k).peels).mono_right + (le_iSup (fun k' => ℂ ∙ (st k').contraction) k)) (fun k => (st k).stable) + (isStableUnder_iSup fun k => (st k).span_contraction_stable) + +/-- The trivial step: a line through a vector that the family fixes is already classified, + by that vector itself. This is the colour step of a lepton block, whose symbols carry no + colour index, and it is what makes those blocks a case of the general argument rather + than an exception to it. -/ +noncomputable def Step.ofFixed {σ : G → B →ₗ[ℂ] B} (b : B) (hb : ∀ g, σ g b = b) : + Step σ (ℂ ∙ b) where + contraction := b + stable := (isFixedBy_span_singleton hb).isStableUnder + contraction_fixed := hb + classify S _ x hx _ := by + obtain ⟨a, ha, y, hy, rfl⟩ := Submodule.mem_sup.1 hx + obtain ⟨c, rfl⟩ := Submodule.mem_span_singleton.1 ha + exact ⟨c, y, hy, rfl⟩ + +/-- The trivial step on a family that does not move at all: if every member of the family + is the same fixed vector, the join of the lines through the family is the line through + that vector, and it is classified by it. This is the colour step of a block whose symbols + carry no colour index, and the isospin step of one whose symbols carry no isospin. -/ +noncomputable def Step.ofFixedFamily {σ : G → B →ₗ[ℂ] B} {ι : Type*} [Nonempty ι] + {T : ι → B} (b : B) (hTb : ∀ i, T i = b) (hb : ∀ g, σ g b = b) : + Step σ (⨆ i, ℂ ∙ T i) where + contraction := b + stable := by + refine (isFixedBy_iSup fun i => ?_).isStableUnder + rw [hTb i] + exact isFixedBy_span_singleton hb + contraction_fixed := hb + classify S _ x hx _ := by + obtain ⟨a, ha, y, hy, rfl⟩ := Submodule.mem_sup.1 hx + have hspan : (⨆ i, ℂ ∙ T i) = ℂ ∙ b := by + refine le_antisymm (iSup_le fun i => ?_) (le_iSup_of_le (Classical.arbitrary ι) ?_) + · rw [hTb i] + · rw [hTb (Classical.arbitrary ι)] + rw [hspan] at ha + obtain ⟨c, rfl⟩ := Submodule.mem_span_singleton.1 ha + exact ⟨c, y, hy, rfl⟩ + +end Steps + +section GaugeSteps + +variable {B : Type*} [AddCommGroup B] [Module ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} + {repLorentz : Representation ℂ SL(2,ℂ) B} + +/-- The colour step of a family carrying one fundamental and one anti-fundamental colour + index: its invariants are the multiples of the delta contraction. -/ +noncomputable def Step.ofSU3FunAntiFun {T : (Fin 2 → Fin 3) → B} + (hT : IsSU3FunAntiFun B repGauge T) : + Step (fun U : specialUnitaryGroup (Fin 3) ℂ => repGauge (U, 1, 1)) + (IsSU3FunAntiFun.span T) where + contraction := IsSU3FunAntiFun.deltaContraction T + stable := isStableUnder_iSup_span_singleton_of_sum fun U l => ⟨_, hT.repGauge_T U l⟩ + contraction_fixed U := IsSU3FunAntiFun.repGauge_deltaContraction hT U + classify S hS x hx hinv := by + obtain ⟨c, y, hy, hxy, _⟩ := hT.mem_span_sup_su3_invariant_iff x S hS hx hinv + exact ⟨c, y, hy, hxy⟩ + +/-- The isospin step of a family carrying one fundamental and one anti-fundamental isospin + index: its invariants are the multiples of the delta contraction. -/ +noncomputable def Step.ofSU2FunAntiFun {T : (Fin 2 → Fin 2) → B} + (hT : IsSU2FunAntiFun B repGauge T) : + Step (fun V : specialUnitaryGroup (Fin 2) ℂ => repGauge (1, V, 1)) + (IsSU2BiFundamental.span T) where + contraction := IsSU2FunAntiFun.deltaContraction T + stable := isStableUnder_iSup_span_singleton_of_sum fun V l => ⟨_, hT.repGauge_T V l⟩ + contraction_fixed V := IsSU2FunAntiFun.repGauge_deltaContraction hT V + classify S hS x hx hinv := by + obtain ⟨c, y, hy, hxy, _⟩ := hT.mem_span_sup_su2_invariant_iff x S hS hx hinv + exact ⟨c, y, hy, hxy⟩ + +/-- The isospin step of a family carrying two anti-fundamental isospin indices: its + invariants are the multiples of the epsilon contraction, a pair of anti-fundamental + indices admitting no trace. -/ +noncomputable def Step.ofSU2BiAntiFun {T : (Fin 2 → Fin 2) → B} + (hT : IsSU2BiAntiFun B repGauge T) : + Step (fun V : specialUnitaryGroup (Fin 2) ℂ => repGauge (1, V, 1)) + (IsSU2BiFundamental.span T) where + contraction := IsSU2BiFundamental.epsilonContraction T + stable := isStableUnder_iSup_span_singleton_of_sum fun V l => ⟨_, hT.repGauge_T V l⟩ + contraction_fixed V := IsSU2BiAntiFun.repGauge_epsilonContraction hT V + classify S hS x hx hinv := by + obtain ⟨c, y, hy, hxy, _⟩ := hT.mem_span_sup_su2_invariant_iff x S hS hx hinv + exact ⟨c, y, hy, hxy⟩ + +/-- The isospin step of a family carrying two fundamental isospin indices. -/ +noncomputable def Step.ofSU2BiFundamental {T : (Fin 2 → Fin 2) → B} + (hT : IsSU2BiFundamental B repGauge T) : + Step (fun V : specialUnitaryGroup (Fin 2) ℂ => repGauge (1, V, 1)) + (IsSU2BiFundamental.span T) where + contraction := IsSU2BiFundamental.epsilonContraction T + stable := isStableUnder_iSup_span_singleton_of_sum fun V l => ⟨_, hT.repGauge_T V l⟩ + contraction_fixed V := IsSU2BiFundamental.repGauge_epsilonContraction hT V + classify S hS x hx hinv := by + obtain ⟨c, y, hy, hxy, _⟩ := hT.mem_span_sup_su2_invariant_iff x S hS hx hinv + exact ⟨c, y, hy, hxy⟩ + +/-- The Lorentz step of a family carrying two dual left-handed Weyl indices: its invariants + are the multiples of the epsilon contraction. -/ +noncomputable def Step.ofBiDualLeftWeyl {T : Fin 2 × Fin 2 → B} + (hT : IsBiDualLeftWeyl B repLorentz T) : + Step (fun Λ : SL(2,ℂ) => repLorentz Λ) (⨆ l, ℂ ∙ T l) where + contraction := IsBiLeftWeyl.epsilonContraction (T := T) + stable := isStableUnder_iSup_span_singleton_of_sum fun Λ l => ⟨_, hT.repLorentz_T Λ l⟩ + contraction_fixed Λ := hT.repLorentz_epsilonContraction Λ + classify S hS _ hx hinv := + hT.exists_smul_epsilonContraction_of_invariant_subset S hS hx hinv + +/-- The Lorentz step of a family carrying two dual right-handed Weyl indices. -/ +noncomputable def Step.ofBiDualRightWeyl {T : Fin 2 × Fin 2 → B} + (hT : IsBiDualRightWeyl B repLorentz T) : + Step (fun Λ : SL(2,ℂ) => repLorentz Λ) (⨆ l, ℂ ∙ T l) where + contraction := IsBiLeftWeyl.epsilonContraction (T := T) + stable := isStableUnder_iSup_span_singleton_of_sum fun Λ l => ⟨_, hT.repLorentz_T Λ l⟩ + contraction_fixed Λ := hT.repLorentz_epsilonContraction Λ + classify S hS _ hx hinv := + hT.exists_smul_epsilonContraction_of_invariant_subset S hS hx hinv + +/-- The Lorentz step of a family carrying one four-vector index and a pair of dual + opposite-chirality Weyl indices: its invariants are the multiples of the conjugate Pauli + contraction. This is the kinetic term of a Weyl fermion. -/ +noncomputable def Step.ofVectorDualLeftRightWeyl {B : Type*} [AddCommGroup B] [Module ℂ B] + {repLorentz : Representation ℂ SL(2,ℂ) B} + {T : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2 → B} + (hT : IsVectorDualLeftRightWeyl B repLorentz T) : + Step (fun Λ : SL(2,ℂ) => repLorentz Λ) (⨆ q, ℂ ∙ T q) where + contraction := IsVectorDualLeftRightWeyl.pauliBarContraction (T := T) + stable := isStableUnder_iSup_span_singleton_of_sum fun Λ q => by + refine ⟨fun a => ((((SL2C.toLorentzGroup Λ).1 a.1 q.1 : ℝ) : ℂ) + * ((Λ.1⁻¹)ᵀ a.2.1 q.2.1 * (Λ.1⁻¹)ᴴ a.2.2 q.2.2)), ?_⟩ + rw [show q = (q.1, q.2) from rfl, hT.repLorentz_T, Fintype.sum_prod_type] + contraction_fixed Λ := hT.repLorentz_pauliBarContraction Λ + classify S hS _ hx hinv := + hT.exists_smul_pauliBarContraction_of_invariant_subset S hS hx hinv + +end GaugeSteps + +/-! + +## D. The two groups at once + +The three classifications of a block are read at three different groups, and the twelve +blocks have to be peeled apart under the gauge and Lorentz groups together. Both are +handled by one device: the family of maps indexed by the disjoint union of the two groups, +whose invariants are the elements fixed by both and whose stable submodules are those +stable under both. Each stage is then a peeling for a subfamily, transported by +`Peels.comp`. + +-/ + +section BothGroups + +variable {B : Type*} [AddCommGroup B] [Module ℂ B] + (repGauge : Representation ℂ GaugeGroupI B) + (repLorentz : Representation ℂ SL(2,ℂ) B) + +/-- The gauge and Lorentz groups read as a single family of linear maps, indexed by their + disjoint union. -/ +def gaugeLorentzMaps : GaugeGroupI ⊕ SL(2,ℂ) → B →ₗ[ℂ] B := + Sum.elim (fun g => repGauge g) (fun Λ => repLorentz Λ) + +variable {repGauge repLorentz} + +/-- A submodule stable under both groups is stable under the combined family, and + conversely. -/ +lemma isStableUnder_gaugeLorentzMaps_iff {V : Submodule ℂ B} : + IsStableUnder (gaugeLorentzMaps repGauge repLorentz) V + ↔ (∀ g : GaugeGroupI, ∀ y ∈ V, repGauge g y ∈ V) + ∧ ∀ Λ : SL(2,ℂ), ∀ y ∈ V, repLorentz Λ y ∈ V := by + constructor + · exact fun hV => ⟨fun g => hV (Sum.inl g), fun Λ => hV (Sum.inr Λ)⟩ + · rintro ⟨hg, hL⟩ (g | Λ) + · exact hg g + · exact hL Λ + +/-- An element fixed by both groups is fixed by the combined family, and conversely. -/ +lemma forall_gaugeLorentzMaps_eq_self_iff {x : B} : + (∀ p, gaugeLorentzMaps repGauge repLorentz p x = x) + ↔ (∀ g : GaugeGroupI, repGauge g x = x) ∧ ∀ Λ : SL(2,ℂ), repLorentz Λ x = x := by + constructor + · exact fun hx => ⟨fun g => hx (Sum.inl g), fun Λ => hx (Sum.inr Λ)⟩ + · rintro ⟨hg, hL⟩ (g | Λ) + · exact hg g + · exact hL Λ + +/-- A colour peeling is a peeling for the gauge and Lorentz groups together. -/ +lemma Peels.ofSU3 {V W : Submodule ℂ B} + (hP : Peels (fun U : specialUnitaryGroup (Fin 3) ℂ => repGauge (U, 1, 1)) V W) : + Peels (gaugeLorentzMaps repGauge repLorentz) V W := + Peels.comp (fun U : specialUnitaryGroup (Fin 3) ℂ => Sum.inl ((U, 1, 1) : GaugeGroupI)) hP + +/-- An isospin peeling is a peeling for the gauge and Lorentz groups together. -/ +lemma Peels.ofSU2 {V W : Submodule ℂ B} + (hP : Peels (fun U : specialUnitaryGroup (Fin 2) ℂ => repGauge (1, U, 1)) V W) : + Peels (gaugeLorentzMaps repGauge repLorentz) V W := + Peels.comp (fun U : specialUnitaryGroup (Fin 2) ℂ => Sum.inl ((1, U, 1) : GaugeGroupI)) hP + +/-- A Lorentz peeling is a peeling for the gauge and Lorentz groups together. -/ +lemma Peels.ofLorentz {V W : Submodule ℂ B} + (hP : Peels (fun Λ : SL(2,ℂ) => repLorentz Λ) V W) : + Peels (gaugeLorentzMaps repGauge repLorentz) V W := + Peels.comp (Sum.inr (α := GaugeGroupI)) hP + +end BothGroups + +/-! + +## E. The three factors of a gauge transformation + +A gauge transformation is a triple, and the three index laws below each constrain one +factor of it and say nothing about the other two. This section reads a representation at +each factor separately: the entries of an inverse in the two unitary groups, the three +one-parameter embeddings `(U, 1, 1)`, `(1, V, 1)` and `(1, 1, t)` together with their +inverses, and the factorisation of an arbitrary gauge transformation into the three, which +is what turns three separate invariances into gauge invariance. + +-/ + +/-- The entries of the inverse of an `SU(3)` element are the conjugated transposed + entries, the inverse of a unitary matrix being its conjugate transpose. -/ +lemma su3_inv_apply (U : specialUnitaryGroup (Fin 3) ℂ) (a b : Fin 3) : + (U⁻¹).1 a b = conj (U.1 b a) := by + rw [← Matrix.star_eq_inv, Matrix.specialUnitaryGroup.coe_star] + simp [Matrix.star_apply] + +/-- The entries of the inverse of an `SU(2)` element are the conjugated transposed + entries. -/ +lemma su2_inv_apply (U : specialUnitaryGroup (Fin 2) ℂ) (a b : Fin 2) : + (U⁻¹).1 a b = conj (U.1 b a) := by + rw [← Matrix.star_eq_inv, Matrix.specialUnitaryGroup.coe_star] + simp [Matrix.star_apply] + +/-- The inverse of a unitary scalar is its conjugate. -/ +lemma unitary_inv_coe (t : unitary ℂ) : ((t⁻¹ : unitary ℂ) : ℂ) = star (t : ℂ) := rfl + +/-- The colour factor of a colour gauge transformation. -/ +@[simp] lemma toSU3_su3Elt (U : specialUnitaryGroup (Fin 3) ℂ) : + GaugeGroupI.toSU3 ((U, 1, 1) : GaugeGroupI) = U := rfl + +/-- The isospin factor of a colour gauge transformation is trivial. -/ +@[simp] lemma toSU2_su3Elt (U : specialUnitaryGroup (Fin 3) ℂ) : + GaugeGroupI.toSU2 ((U, 1, 1) : GaugeGroupI) = 1 := rfl + +/-- The hypercharge factor of a colour gauge transformation is trivial. -/ +@[simp] lemma toU1_su3Elt (U : specialUnitaryGroup (Fin 3) ℂ) : + GaugeGroupI.toU1 ((U, 1, 1) : GaugeGroupI) = 1 := rfl + +/-- The inverse of a colour gauge transformation is the colour transformation of the + inverse. -/ +@[simp] lemma inv_su3Elt (U : specialUnitaryGroup (Fin 3) ℂ) : + ((U, 1, 1) : GaugeGroupI)⁻¹ = ((U⁻¹, 1, 1) : GaugeGroupI) := by + simp + +/-- The colour factor of an isospin gauge transformation is trivial. -/ +@[simp] lemma toSU3_su2Elt (V : specialUnitaryGroup (Fin 2) ℂ) : + GaugeGroupI.toSU3 ((1, V, 1) : GaugeGroupI) = 1 := rfl + +/-- The isospin factor of an isospin gauge transformation. -/ +@[simp] lemma toSU2_su2Elt (V : specialUnitaryGroup (Fin 2) ℂ) : + GaugeGroupI.toSU2 ((1, V, 1) : GaugeGroupI) = V := rfl + +/-- The hypercharge factor of an isospin gauge transformation is trivial. -/ +@[simp] lemma toU1_su2Elt (V : specialUnitaryGroup (Fin 2) ℂ) : + GaugeGroupI.toU1 ((1, V, 1) : GaugeGroupI) = 1 := rfl + +/-- The inverse of an isospin gauge transformation is the isospin transformation of the + inverse. -/ +@[simp] lemma inv_su2Elt (V : specialUnitaryGroup (Fin 2) ℂ) : + ((1, V, 1) : GaugeGroupI)⁻¹ = ((1, V⁻¹, 1) : GaugeGroupI) := by + simp + + +/-- The colour factor of a hypercharge gauge transformation is trivial. -/ +@[simp] lemma toSU3_u1Elt (t : unitary ℂ) : + GaugeGroupI.toSU3 ((1, 1, t) : GaugeGroupI) = 1 := rfl + +/-- The isospin factor of a hypercharge gauge transformation is trivial. -/ +@[simp] lemma toSU2_u1Elt (t : unitary ℂ) : + GaugeGroupI.toSU2 ((1, 1, t) : GaugeGroupI) = 1 := rfl + +/-- The hypercharge factor of a hypercharge gauge transformation. -/ +@[simp] lemma toU1_u1Elt (t : unitary ℂ) : + GaugeGroupI.toU1 ((1, 1, t) : GaugeGroupI) = t := rfl + +/-- The inverse of a hypercharge gauge transformation is the hypercharge transformation of + the inverse. -/ +@[simp] lemma inv_u1Elt (t : unitary ℂ) : + ((1, 1, t) : GaugeGroupI)⁻¹ = ((1, 1, t⁻¹) : GaugeGroupI) := by + simp + +/-- A gauge transformation is the product of its colour, isospin and hypercharge parts, so + an element fixed by each of the three factors separately is gauge invariant. -/ +lemma forall_repGauge_eq_self {B : Type*} [AddCommGroup B] [Module ℂ B] + {rep : Representation ℂ GaugeGroupI B} {x : B} + (h3 : ∀ U : specialUnitaryGroup (Fin 3) ℂ, rep (U, 1, 1) x = x) + (h2 : ∀ V : specialUnitaryGroup (Fin 2) ℂ, rep (1, V, 1) x = x) + (h1 : ∀ t : unitary ℂ, rep (1, 1, t) x = x) (g : GaugeGroupI) : rep g x = x := by + have hg : g = ((g.1, 1, 1) : GaugeGroupI) * (((1, g.2.1, 1) : GaugeGroupI) + * ((1, 1, g.2.2) : GaugeGroupI)) := by + simp [Prod.ext_iff] + rw [hg, map_mul, Module.End.mul_apply, map_mul, Module.End.mul_apply, h1, h2, h3] + +/-! + +## F. Sums and differences of classified families + +Contracting one pair of indices of a block leaves a family in the remaining pairs, and that +family is a finite sum — or, where the contraction is by the antisymmetric symbol, a +difference — of the block's own components. So each index law has to be known closed under +those operations before the second and third contractions can be formed. + +-/ + +/-- A finite sum of families carrying one fundamental and one anti-fundamental colour index + is such a family again. -/ +lemma IsSU3FunAntiFun.sum {M : Type*} [AddCommGroup M] [Module ℂ M] + {rep : Representation ℂ GaugeGroupI M} {ι : Type} [Fintype ι] + {T : ι → (Fin 2 → Fin 3) → M} (hT : ∀ i, IsSU3FunAntiFun M rep (T i)) : + IsSU3FunAntiFun M rep (fun l => ∑ i, T i l) where + repGauge_T U l := by + rw [map_sum, Finset.sum_congr rfl fun i (_ : i ∈ Finset.univ) => (hT i).repGauge_T U l, + Finset.sum_comm] + exact Finset.sum_congr rfl fun a _ => Finset.smul_sum.symm + +/-- A finite sum of families carrying one fundamental and one anti-fundamental isospin + index is such a family again. -/ +lemma IsSU2FunAntiFun.sum {M : Type*} [AddCommGroup M] [Module ℂ M] + {rep : Representation ℂ GaugeGroupI M} {ι : Type} [Fintype ι] + {T : ι → (Fin 2 → Fin 2) → M} (hT : ∀ i, IsSU2FunAntiFun M rep (T i)) : + IsSU2FunAntiFun M rep (fun l => ∑ i, T i l) where + repGauge_T V l := by + rw [map_sum, Finset.sum_congr rfl fun i (_ : i ∈ Finset.univ) => (hT i).repGauge_T V l, + Finset.sum_comm] + exact Finset.sum_congr rfl fun a _ => Finset.smul_sum.symm + +/-- A finite sum of families carrying two anti-fundamental isospin indices is such a family + again. -/ +lemma IsSU2BiAntiFun.sum {M : Type*} [AddCommGroup M] [Module ℂ M] + {rep : Representation ℂ GaugeGroupI M} {ι : Type} [Fintype ι] + {T : ι → (Fin 2 → Fin 2) → M} (hT : ∀ i, IsSU2BiAntiFun M rep (T i)) : + IsSU2BiAntiFun M rep (fun l => ∑ i, T i l) where + repGauge_T V l := by + rw [map_sum, Finset.sum_congr rfl fun i (_ : i ∈ Finset.univ) => (hT i).repGauge_T V l, + Finset.sum_comm] + exact Finset.sum_congr rfl fun a _ => Finset.smul_sum.symm + +/-- A finite sum of families carrying two dual right-handed Weyl indices is such a family + again. -/ +lemma isBiDualRightWeyl_sum {M : Type*} [AddCommGroup M] [Module ℂ M] + {rep : Representation ℂ SL(2,ℂ) M} {ι : Type} [Fintype ι] + {T : ι → Fin 2 × Fin 2 → M} (hT : ∀ i, IsBiDualRightWeyl M rep (T i)) : + IsBiDualRightWeyl M rep (fun l => ∑ i, T i l) where + repLorentz_T Λ l := by + rw [map_sum, Finset.sum_congr rfl fun i (_ : i ∈ Finset.univ) => (hT i).repLorentz_T Λ l, + Finset.sum_comm] + exact Finset.sum_congr rfl fun a _ => Finset.smul_sum.symm + +/-- A finite sum of families carrying two dual left-handed Weyl indices is such a family + again. -/ +lemma isBiDualLeftWeyl_sum {M : Type*} [AddCommGroup M] [Module ℂ M] + {rep : Representation ℂ SL(2,ℂ) M} {ι : Type} [Fintype ι] + {T : ι → Fin 2 × Fin 2 → M} (hT : ∀ i, IsBiDualLeftWeyl M rep (T i)) : + IsBiDualLeftWeyl M rep (fun l => ∑ i, T i l) where + repLorentz_T Λ l := by + rw [map_sum, Finset.sum_congr rfl fun i (_ : i ∈ Finset.univ) => (hT i).repLorentz_T Λ l, + Finset.sum_comm] + exact Finset.sum_congr rfl fun a _ => Finset.smul_sum.symm + +/-- A difference of two families carrying two dual left-handed Weyl indices is such a + family again. -/ +lemma isBiDualLeftWeyl_sub {M : Type*} [AddCommGroup M] [Module ℂ M] + {rep : Representation ℂ SL(2,ℂ) M} {T T' : Fin 2 × Fin 2 → M} + (hT : IsBiDualLeftWeyl M rep T) (hT' : IsBiDualLeftWeyl M rep T') : + IsBiDualLeftWeyl M rep (fun l => T l - T' l) where + repLorentz_T Λ l := by + rw [map_sub, hT.repLorentz_T Λ l, hT'.repLorentz_T Λ l, ← Finset.sum_sub_distrib] + exact Finset.sum_congr rfl fun a _ => (smul_sub _ _ _).symm + +/-- A finite sum of bi-fundamental isospin families is such a family again. -/ +lemma IsSU2BiFundamental.sum {M : Type*} [AddCommGroup M] [Module ℂ M] + {rep : Representation ℂ GaugeGroupI M} {ι : Type} [Fintype ι] + {T : ι → (Fin 2 → Fin 2) → M} (hT : ∀ i, IsSU2BiFundamental M rep (T i)) : + IsSU2BiFundamental M rep (fun l => ∑ i, T i l) where + repGauge_T V l := by + rw [map_sum, Finset.sum_congr rfl fun i (_ : i ∈ Finset.univ) => (hT i).repGauge_T V l, + Finset.sum_comm] + exact Finset.sum_congr rfl fun a _ => Finset.smul_sum.symm + +/-- A difference of two families carrying two dual right-handed Weyl indices is such a + family again. -/ +lemma isBiDualRightWeyl_sub {M : Type*} [AddCommGroup M] [Module ℂ M] + {rep : Representation ℂ SL(2,ℂ) M} {T T' : Fin 2 × Fin 2 → M} + (hT : IsBiDualRightWeyl M rep T) (hT' : IsBiDualRightWeyl M rep T') : + IsBiDualRightWeyl M rep (fun l => T l - T' l) where + repLorentz_T Λ l := by + rw [map_sub, hT.repLorentz_T Λ l, hT'.repLorentz_T Λ l, ← Finset.sum_sub_distrib] + exact Finset.sum_congr rfl fun a _ => (smul_sub _ _ _).symm + +/-! + +## G. Weight pieces, symbol ranges and stability + +The last group of shared facts is about the objects a sector-level argument hands the +peeling: a weight piece of a gauge weight decomposition lies in the submodule it +decomposes, a symbol range is the span of the symbol's components against a dual basis, and +the product of two stable submodules is stable. None of them mentions a particular sector. + +-/ + +section Bridges + +variable {B : Type} [Ring B] [Algebra ℂ B] + +/-- A weight piece lies inside the submodule it decomposes. -/ +lemma GaugeWeightDecomposition.piece_le_self {rep : Representation ℂ GaugeGroupI B} + {V : Submodule ℂ B} (d : GaugeWeightDecomposition rep V) (w : GaugeWeight) : + d.piece w ≤ V := le_trans (le_iSup d.piece w) (le_of_eq d.iSup_piece) + +/-- The range of a symbol map is the span of its components against the dual basis of the + value space. This is the companion of `range_eq_iSup_span`, which reads the same range off + `Module.Basis.coord`; the two families of components are equal, but the components of the + `Families` files are the ones written here. -/ +lemma range_eq_iSup_span_dualBasis {V M : Type} [AddCommGroup V] [Module ℂ V] + [AddCommGroup M] [Module ℂ M] {ι : Type} [Fintype ι] [DecidableEq ι] + (b : Module.Basis ι ℂ V) (F : Module.Dual ℂ V →ₗ[ℂ] M) : + LinearMap.range F = ⨆ j, ℂ ∙ F (b.dualBasis j) := by + rw [LinearMap.range_eq_map, ← b.dualBasis.span_eq, Submodule.map_span, ← Set.range_comp, + Submodule.span_range_eq_iSup] + rfl + +/-- The product of two lines is the line through the product. -/ +lemma span_singleton_mul_span_singleton (a b : B) : (ℂ ∙ a) * (ℂ ∙ b) = ℂ ∙ (a * b) := by + rw [Submodule.span_mul_span, Set.singleton_mul_singleton] + +/-- A product of three spans of families is the span of the products, which is the form in + which a block submodule is compared with the span of its components. -/ +lemma mul_mul_le_of_le {ιa ιb ιc : Type} {VA VB VC X : Submodule ℂ B} {A : ιa → B} + {C : ιb → B} {D : ιc → B} (hA : VA ≤ ⨆ i, ℂ ∙ A i) (hC : VB ≤ ⨆ j, ℂ ∙ C j) + (hD : VC ≤ ⨆ k, ℂ ∙ D k) (hX : ∀ i j k, A i * (C j * D k) ∈ X) : + VA * (VB * VC) ≤ X := by + refine le_trans (mul_le_mul' hA (mul_le_mul' hC hD)) ?_ + rw [Submodule.iSup_mul] + refine iSup_le fun i => ?_ + rw [Submodule.iSup_mul, Submodule.mul_iSup] + refine iSup_le fun j => ?_ + rw [Submodule.mul_iSup, Submodule.mul_iSup] + refine iSup_le fun k => ?_ + rw [span_singleton_mul_span_singleton, span_singleton_mul_span_singleton, + Submodule.span_singleton_le_iff_mem] + exact hX i j k + +/-- A product of two submodules, each inside the join of the lines through a family, lies + in any submodule containing the products of the two families. -/ +lemma mul_le_of_le {ιa ιb : Type} {VA VB X : Submodule ℂ B} {A : ιa → B} {C : ιb → B} + (hA : VA ≤ ⨆ i, ℂ ∙ A i) (hC : VB ≤ ⨆ j, ℂ ∙ C j) (hX : ∀ i j, A i * C j ∈ X) : + VA * VB ≤ X := by + refine le_trans (mul_le_mul' hA hC) ?_ + rw [Submodule.iSup_mul] + refine iSup_le fun i => ?_ + rw [Submodule.mul_iSup] + refine iSup_le fun j => ?_ + rw [span_singleton_mul_span_singleton, Submodule.span_singleton_le_iff_mem] + exact hX i j + +/-- The range of a symbol map is carried into itself by the gauge group: the symbol is + equivariant, so a gauge transformation only moves the dual vector it is evaluated at. -/ +lemma isStableUnder_range_repGauge {M : Type} [AddCommGroup M] [Module ℂ M] + {repGauge : Representation ℂ GaugeGroupI B} {ρ : Representation ℂ GaugeGroupI M} + {F : Module.Dual ℂ M →ₗ[ℂ] B} (hF : ∀ g φ, repGauge g (F φ) = F (ρ.dual g φ)) : + ∀ g : GaugeGroupI, ∀ y ∈ LinearMap.range F, repGauge g y ∈ LinearMap.range F := by + rintro g _ ⟨φ, rfl⟩ + exact ⟨ρ.dual g φ, (hF g φ).symm⟩ + +/-- At zero derivative slots the assignments of derivative directions form a one-element + type, so a sum over them has a single term. -/ +lemma univ_deriv_slots_zero (l : Fin 0 → Fin 1 ⊕ Fin 3) : + (Finset.univ : Finset (Fin 0 → Fin 1 ⊕ Fin 3)) = {l} := + Finset.eq_singleton_iff_unique_mem.mpr + ⟨Finset.mem_univ l, fun x _ => Subsingleton.elim x l⟩ + +/-- The range of an underived symbol map is carried into itself by the Lorentz group: with + no derivative slots to mix, the transformation law moves the dual vector alone. -/ +lemma isStableUnder_range_repLorentz {M : Type} [AddCommGroup M] [Module ℂ M] + {repLorentz : Representation ℂ SL(2,ℂ) B} {ρ : Representation ℂ SL(2,ℂ) M} + {F : {n : ℕ} → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ M →ₗ[ℂ] B} + (hF : IsLorentzCovDerivTransforms repLorentz ρ F) (Λ : SL(2,ℂ)) : + ∀ y ∈ LinearMap.range (F (![] : Fin 0 → Fin 1 ⊕ Fin 3)), + repLorentz Λ y ∈ LinearMap.range (F (![] : Fin 0 → Fin 1 ⊕ Fin 3)) := by + rintro _ ⟨φ, rfl⟩ + rw [hF Λ 0 ![] φ, univ_deriv_slots_zero (![] : Fin 0 → Fin 1 ⊕ Fin 3), + Finset.sum_singleton] + simp only [Finset.univ_eq_empty, Finset.prod_empty, one_smul] + exact ⟨ρ.dual Λ φ, rfl⟩ + +/-- A product of two stable submodules is stable, the maps of the family respecting + multiplication. -/ +lemma IsStableUnder.mul {G : Type*} {σ : G → B →ₗ[ℂ] B} + (hσ : ∀ g (a b : B), σ g (a * b) = σ g a * σ g b) {V V' : Submodule ℂ B} + (hV : IsStableUnder σ V) (hV' : IsStableUnder σ V') : IsStableUnder σ (V * V') := + isStableUnder_iff_map.2 fun g => by + rw [Submodule.map_le_iff_le_comap] + refine Submodule.mul_le.2 fun a ha b hb => ?_ + show σ g (a * b) ∈ V * V' + rw [hσ] + exact Submodule.mul_mem_mul (hV g a ha) (hV' g b hb) + +end Bridges + +end StandardModel diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsBiLeftWeyl.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsBiLeftWeyl.lean index 86a7b86a0..fe0309251 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsBiLeftWeyl.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsBiLeftWeyl.lean @@ -6,6 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Relativity.LorentzGroup.Invariants.IsLeftRightWeyl +public import Physlib.Relativity.Fermions.Weyl.Metric /-! # Lorentz invariants of two left-handed Weyl indices @@ -28,11 +29,24 @@ three axes now gives `M = 2 - swap`, whose eigenvalue `3` is simple and carried 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. +A family carrying dual Weyl indices transforms by the contragredient `(Λ⁻¹)ᵀ`, or, for +a barred species, by its complex conjugate `(Λ⁻¹)ᴴ`; neither is the fundamental law, so +neither is an `IsBiLeftWeyl` family on the nose. Two independent mechanisms bridge the +gap. The contragredient is inner, `(Λ⁻¹)ᵀ = ε Λ ε⁻¹`, so re-indexing the two index slots +by `ε` turns a contragredient family into a fundamental one without touching the +representation. Entrywise conjugation is instead a genuine automorphism of `SL(2,ℂ)`, so +a conjugated family is a fundamental family for the twisted representation +`repLorentz.comp conjHom`; since the twist is by a surjection, invariance is the same +condition for both, and the whole classification carries over. + 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). +and the linear certificate which produces it (E), the classification modulo a +Lorentz-stable submodule (F), the symplectic form and the contragredient as an inner +twist (G), the conjugation automorphism of `SL(2,ℂ)` (H), transfer of invariance along a +surjective endomorphism (I), dual-index families and the `ε` re-index (J), and the +classification of the invariants of a dual-index family (K). -/ @[expose] public section @@ -475,4 +489,466 @@ lemma exists_smul_epsilonContraction_of_invariant_subset {x : B} (S : Submodule end IsBiLeftWeyl +/-! + +## G. The symplectic form and the contragredient as an inner twist + +The antisymmetric form `ε = !![0, 1; -1, 0]` has determinant one, so it is itself an +element of `SL(2,ℂ)`, and `Λᵀ ε Λ = ε` holds for every `Λ ∈ SL(2,ℂ)`: this is the +statement that `ε` is the invariant symplectic form, and it is nothing but the condition +`det Λ = 1` written out. Rearranged it reads `(Λ⁻¹)ᵀ = ε Λ ε⁻¹`, so the contragredient +matrix is the fundamental one conjugated by a fixed group element. That is a change of +basis on the index type, not a change of representation. + +-/ + +namespace SL2C + +/-- The antisymmetric symplectic form `ε = !![0, 1; -1, 0]`, whose underlying matrix is + the Weyl metric `Fermion.metricRaw`, as an element of `SL(2,ℂ)`. -/ +def epsilon : SL(2,ℂ) := + ⟨Fermion.metricRaw, by simp [Fermion.metricRaw, Matrix.det_fin_two_of]⟩ + +/-- The matrix underlying `epsilon`. -/ +lemma epsilon_coe : (epsilon : Matrix (Fin 2) (Fin 2) ℂ) = !![0, 1; -1, 0] := rfl + +/-- The matrix underlying `epsilon` is the Weyl metric `Fermion.metricRaw`. -/ +lemma epsilon_coe_metricRaw : + (epsilon : Matrix (Fin 2) (Fin 2) ℂ) = Fermion.metricRaw := rfl + +/-- The form `ε` is the invariant symplectic form of `SL(2,ℂ)`: `Λᵀ ε Λ = ε`, which is + the determinant condition `det Λ = 1` written out entrywise. -/ +lemma transpose_mul_epsilon_mul (g : SL(2,ℂ)) : + g.1ᵀ * epsilon.1 * g.1 = epsilon.1 := 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 + ext i j + fin_cases i <;> fin_cases j <;> + simp [epsilon_coe, Matrix.mul_apply, Fin.sum_univ_two] <;> + first | linear_combination | linear_combination hdet | linear_combination -hdet + +/-- The matrix of `ε` times the matrix of its group inverse is the identity. -/ +lemma epsilon_mul_epsilon_inv : epsilon.1 * (epsilon⁻¹ : SL(2,ℂ)).1 = 1 := by + rw [← SpecialLinearGroup.coe_mul, mul_inv_cancel] + rfl + +/-- The contragredient is inner: conjugation by `ε` carries the fundamental matrix `Λ` + to the inverse transpose `(Λ⁻¹)ᵀ`. -/ +lemma inv_transpose_eq_epsilon_conj (g : SL(2,ℂ)) : + (g.1⁻¹)ᵀ = epsilon.1 * g.1 * (epsilon⁻¹ : SL(2,ℂ)).1 := by + symm + calc epsilon.1 * g.1 * (epsilon⁻¹ : SL(2,ℂ)).1 + = ((g.1⁻¹)ᵀ * Fermion.metricRaw) * (epsilon⁻¹ : SL(2,ℂ)).1 := by + rw [epsilon_coe_metricRaw, Fermion.metricRaw_comm] + _ = (g.1⁻¹)ᵀ * (epsilon.1 * (epsilon⁻¹ : SL(2,ℂ)).1) := by + rw [epsilon_coe_metricRaw, Matrix.mul_assoc] + _ = (g.1⁻¹)ᵀ := by rw [epsilon_mul_epsilon_inv, Matrix.mul_one] + +/-- The form of the symplectic identity used to re-index: `ε Λ⁻¹ = Λᵀ ε`. -/ +lemma epsilon_mul_inv_eq_transpose_mul_epsilon (g : SL(2,ℂ)) : + epsilon.1 * g.1⁻¹ = g.1ᵀ * epsilon.1 := by + have hg : g.1 * g.1⁻¹ = 1 := by + rw [SL2C.inverse_coe, ← SpecialLinearGroup.coe_mul, mul_inv_cancel] + rfl + calc epsilon.1 * g.1⁻¹ = (g.1ᵀ * epsilon.1 * g.1) * g.1⁻¹ := by + rw [transpose_mul_epsilon_mul] + _ = g.1ᵀ * epsilon.1 * (g.1 * g.1⁻¹) := by rw [Matrix.mul_assoc] + _ = g.1ᵀ * epsilon.1 := by rw [hg, Matrix.mul_one] + +/-! + +## H. The conjugation automorphism of `SL(2,ℂ)` + +Entrywise complex conjugation is a monoid homomorphism `SL(2,ℂ) → SL(2,ℂ)`: it is +multiplicative because conjugation is a ring homomorphism of `ℂ`, and it lands back in +`SL(2,ℂ)` because `det (conj Λ) = conj (det Λ) = 1`. It is its own inverse, hence +bijective. Unlike the `ε` twist of section G this is a genuine automorphism of the +group, so twisting a representation along it gives a genuinely different representation +rather than a re-indexing. + +-/ + +/-- Entrywise conjugation of an element of `SL(2,ℂ)` again has determinant one. -/ +lemma det_map_star (g : SL(2,ℂ)) : (g.1.map star).det = 1 := 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 [Matrix.det_fin_two] + simp only [Matrix.map_apply] + rw [← star_mul', ← star_mul', ← star_sub, hdet, star_one] + +/-- Entrywise complex conjugation as a monoid endomorphism of `SL(2,ℂ)`. -/ +def conjHom : SL(2,ℂ) →* SL(2,ℂ) where + toFun g := ⟨g.1.map star, det_map_star g⟩ + map_one' := by + apply Subtype.ext + ext i j + simp [Matrix.map_apply, Matrix.one_apply] + map_mul' g h := by + apply Subtype.ext + ext i j + simp [Matrix.map_apply, Matrix.mul_apply] + +/-- The matrix underlying `conjHom g` is the entrywise conjugate of that of `g`. -/ +lemma conjHom_coe (g : SL(2,ℂ)) : (conjHom g).1 = g.1.map star := rfl + +/-- Conjugation is an involution. -/ +lemma conjHom_conjHom (g : SL(2,ℂ)) : conjHom (conjHom g) = g := by + apply Subtype.ext + ext i j + simp [conjHom_coe, Matrix.map_apply] + +/-- Being an involution, conjugation is surjective. -/ +lemma conjHom_surjective : Function.Surjective conjHom := + fun g => ⟨conjHom g, conjHom_conjHom g⟩ + +/-- Being an involution, conjugation is bijective. -/ +lemma conjHom_bijective : Function.Bijective conjHom := + Function.bijective_iff_has_inverse.2 ⟨conjHom, conjHom_conjHom, conjHom_conjHom⟩ + +end SL2C + +/-! + +## I. Transfer of invariance along a surjective endomorphism + +Twisting a representation by a monoid endomorphism `σ` of the group does not change what +it means for a vector to be invariant, provided `σ` is surjective: the two families of +conditions `rep g x = x` and `rep (σ g) x = x` range over the very same set of group +elements. This is what makes the conjugation twist of section H free of charge. + +-/ + +/-- Invariance under a representation and invariance under its twist by a surjective + monoid endomorphism of the group are the same condition. -/ +lemma forall_comp_apply_eq_self_iff {k G V : Type*} [CommSemiring k] [Monoid G] + [AddCommMonoid V] [Module k V] (rep : Representation k G V) {σ : G →* G} + (hσ : Function.Surjective σ) (x : V) : + (∀ g : G, (rep.comp σ) g x = x) ↔ ∀ g : G, rep g x = x := by + constructor + · intro h g + obtain ⟨g', rfl⟩ := hσ g + exact h g' + · intro h g + exact h (σ g) + +/-! + +## J. Dual-index families and the `ε` re-index + +`IsBiDualLeftWeyl` and `IsBiDualRightWeyl` are the two index laws actually carried by +the Standard Model's fermion symbols: one factor of the contragredient `(Λ⁻¹)ᵀ` per +index for an undotted pair, and one factor of its complex conjugate `(Λ⁻¹)ᴴ` per index +for a dotted pair. The re-index `epsReindex` transports both index slots through the +symplectic form. By section G it converts the contragredient law into the fundamental +one and leaves the representation alone; it is an involution, so it does not change the +span of the components; and it leaves the `ε` contraction strictly unchanged, with +neither a sign nor a scalar appearing. For a dotted family the same re-index works once +the representation has been twisted by `conjHom`, because conjugating the group argument +undoes the conjugation of the matrix entries. The two laws are not vacuous: +`isBiDualLeftWeyl_dualLeftHandedWeyl` and `isBiDualRightWeyl_dualRightHandedWeyl` check +that they are exactly the laws carried by the tensor squares of the repo's dual Weyl +representations. + +-/ + +/-- A family `T` of elements of `B`, indexed by two dual left-handed Weyl indices, + transforms as a tensor `T_{α₁ α₂}` under `repLorentz`: each index carries a factor of + the contragredient matrix `(Λ⁻¹)ᵀ`. -/ +structure IsBiDualLeftWeyl (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 + +/-- A family `T` of elements of `B`, indexed by two dual right-handed Weyl indices, + transforms as a tensor `T_{α̇₁ α̇₂}` under `repLorentz`: each index carries a factor of + the conjugate contragredient matrix `(Λ⁻¹)ᴴ`. -/ +structure IsBiDualRightWeyl (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 + +open Fermion in +/-- The tensor square of the dual left-handed Weyl representation, on the products of + basis vectors, is the basic example of a family with the contragredient index law. -/ +lemma isBiDualLeftWeyl_dualLeftHandedWeyl : + IsBiDualLeftWeyl (DualLeftHandedWeyl ⊗[ℂ] DualLeftHandedWeyl) + (DualLeftHandedWeyl.rep.tprod DualLeftHandedWeyl.rep) + (fun l => DualLeftHandedWeyl.basis l.1 ⊗ₜ[ℂ] DualLeftHandedWeyl.basis l.2) where + repLorentz_T g l := by + rw [Representation.tprod_apply, TensorProduct.map_tmul, + DualLeftHandedWeyl.rep_apply_basis, DualLeftHandedWeyl.rep_apply_basis, + TensorProduct.sum_tmul] + simp only [TensorProduct.smul_tmul', TensorProduct.tmul_sum, TensorProduct.tmul_smul, + smul_smul, Fintype.sum_prod_type, Matrix.transpose_apply] + exact Finset.sum_congr rfl fun x _ => Finset.sum_congr rfl fun y _ => by + rw [mul_comm] + +open Fermion in +/-- The tensor square of the dual right-handed Weyl representation, on the products of + basis vectors, is the basic example of a family with the conjugate contragredient + index law. -/ +lemma isBiDualRightWeyl_dualRightHandedWeyl : + IsBiDualRightWeyl (DualRightHandedWeyl ⊗[ℂ] DualRightHandedWeyl) + (DualRightHandedWeyl.rep.tprod DualRightHandedWeyl.rep) + (fun l => DualRightHandedWeyl.basis l.1 ⊗ₜ[ℂ] DualRightHandedWeyl.basis l.2) where + repLorentz_T g l := by + rw [Representation.tprod_apply, TensorProduct.map_tmul, + DualRightHandedWeyl.rep_apply_basis, DualRightHandedWeyl.rep_apply_basis, + TensorProduct.sum_tmul] + simp only [TensorProduct.smul_tmul', TensorProduct.tmul_sum, TensorProduct.tmul_smul, + smul_smul, Fintype.sum_prod_type] + exact Finset.sum_congr rfl fun x _ => Finset.sum_congr rfl fun y _ => by + rw [mul_comm] + +/-- The `ε` re-index of a family indexed by two Weyl indices: both index slots are + transported through the symplectic form. -/ +noncomputable def epsReindex {B : Type*} [AddCommMonoid B] [Module ℂ B] + (T : Fin 2 × Fin 2 → B) : Fin 2 × Fin 2 → B := + fun l => ∑ k : Fin 2 × Fin 2, (epsilon.1 l.1 k.1 * epsilon.1 l.2 k.2) • T k + +section Reindex + +variable {B : Type*} [AddCommGroup B] [Module ℂ B] (T : Fin 2 × Fin 2 → B) + +/-- The re-index written out on the diagonal component `(0, 0)`. -/ +lemma epsReindex_zero_zero : epsReindex T (0, 0) = T (1, 1) := by + simp [epsReindex, Fintype.sum_prod_type, Fin.sum_univ_two, SL2C.epsilon_coe] + +/-- The re-index written out on the mixed component `(0, 1)`. -/ +lemma epsReindex_zero_one : epsReindex T (0, 1) = - T (1, 0) := by + simp [epsReindex, Fintype.sum_prod_type, Fin.sum_univ_two, SL2C.epsilon_coe] + +/-- The re-index written out on the mixed component `(1, 0)`. -/ +lemma epsReindex_one_zero : epsReindex T (1, 0) = - T (0, 1) := by + simp [epsReindex, Fintype.sum_prod_type, Fin.sum_univ_two, SL2C.epsilon_coe] + +/-- The re-index written out on the diagonal component `(1, 1)`. -/ +lemma epsReindex_one_one : epsReindex T (1, 1) = T (0, 0) := by + simp [epsReindex, Fintype.sum_prod_type, Fin.sum_univ_two, SL2C.epsilon_coe] + +/-- The `ε` re-index is an involution, because `ε² = -1` on each index slot. -/ +lemma epsReindex_epsReindex : epsReindex (epsReindex T) = T := by + funext l + obtain ⟨l₁, l₂⟩ := l + fin_cases l₁ <;> fin_cases l₂ <;> + simp [epsReindex_zero_zero, epsReindex_zero_one, epsReindex_one_zero, + epsReindex_one_one] + +/-- The `ε` re-index leaves the `ε` contraction unchanged: no sign and no scalar are + introduced, so a conclusion about the re-indexed family is literally a conclusion + about the original one. -/ +lemma epsilonContraction_epsReindex : + IsBiLeftWeyl.epsilonContraction (T := epsReindex T) + = IsBiLeftWeyl.epsilonContraction (T := T) := by + rw [IsBiLeftWeyl.epsilonContraction_eq, IsBiLeftWeyl.epsilonContraction_eq, + epsReindex_zero_one, epsReindex_one_zero] + abel + +/-- Every re-indexed component lies in the span of the original components. -/ +lemma epsReindex_mem_iSup (d : Fin 2 × Fin 2) : epsReindex T d ∈ ⨆ e, ℂ ∙ T e := + sum_mem fun k _ => Submodule.smul_mem _ _ + (Submodule.mem_iSup_of_mem k (Submodule.mem_span_singleton_self _)) + +/-- The re-index does not change the span of the components. -/ +lemma iSup_span_epsReindex : (⨆ d, ℂ ∙ epsReindex T d) = ⨆ d, ℂ ∙ T d := by + refine le_antisymm (iSup_le fun d => ?_) (iSup_le fun d => ?_) + · rw [Submodule.span_singleton_le_iff_mem] + exact epsReindex_mem_iSup T d + · rw [Submodule.span_singleton_le_iff_mem] + have h : T d = epsReindex (epsReindex T) d := by rw [epsReindex_epsReindex] + rw [h] + exact epsReindex_mem_iSup (epsReindex T) d + +end Reindex + +/-- The single-index form of the symplectic identity: moving a contragredient factor + across `ε` turns it into a fundamental factor acting on the other slot. -/ +lemma sum_epsilon_mul_inv_transpose (g : SL(2,ℂ)) (l a : Fin 2) : + ∑ k : Fin 2, epsilon.1 l k * (g.1⁻¹)ᵀ a k + = ∑ b : Fin 2, g.1 b l * epsilon.1 b a := by + have h : (epsilon.1 * g.1⁻¹) l a = (g.1ᵀ * epsilon.1) l a := by + rw [SL2C.epsilon_mul_inv_eq_transpose_mul_epsilon] + simpa [Matrix.mul_apply, Matrix.transpose_apply] using h + +/-- The two-index form of the symplectic identity, obtained from the single-index form + by factorising each sum over the two slots. -/ +lemma sum_biEpsilon_mul_inv_transpose (g : SL(2,ℂ)) (l a : Fin 2 × Fin 2) : + ∑ k : Fin 2 × Fin 2, (epsilon.1 l.1 k.1 * epsilon.1 l.2 k.2) + * ((g.1⁻¹)ᵀ a.1 k.1 * (g.1⁻¹)ᵀ a.2 k.2) + = ∑ b : Fin 2 × Fin 2, (g.1 b.1 l.1 * g.1 b.2 l.2) + * (epsilon.1 b.1 a.1 * epsilon.1 b.2 a.2) := by + have hL : (∑ k₁, epsilon.1 l.1 k₁ * (g.1⁻¹)ᵀ a.1 k₁) + * (∑ k₂, epsilon.1 l.2 k₂ * (g.1⁻¹)ᵀ a.2 k₂) + = ∑ k : Fin 2 × Fin 2, (epsilon.1 l.1 k.1 * epsilon.1 l.2 k.2) + * ((g.1⁻¹)ᵀ a.1 k.1 * (g.1⁻¹)ᵀ a.2 k.2) := by + rw [Finset.sum_mul_sum, Fintype.sum_prod_type] + exact Finset.sum_congr rfl fun k₁ _ => Finset.sum_congr rfl fun k₂ _ => by ring + have hR : (∑ b₁, g.1 b₁ l.1 * epsilon.1 b₁ a.1) + * (∑ b₂, g.1 b₂ l.2 * epsilon.1 b₂ a.2) + = ∑ b : Fin 2 × Fin 2, (g.1 b.1 l.1 * g.1 b.2 l.2) + * (epsilon.1 b.1 a.1 * epsilon.1 b.2 a.2) := by + rw [Finset.sum_mul_sum, Fintype.sum_prod_type] + exact Finset.sum_congr rfl fun b₁ _ => Finset.sum_congr rfl fun b₂ _ => by ring + rw [← hL, ← hR, sum_epsilon_mul_inv_transpose, sum_epsilon_mul_inv_transpose] + +/-- The `ε` re-index turns a family with the contragredient index law into a family with + the fundamental index law, for the very same representation: the twist is a change of + basis on the index type, not a change of representation. -/ +lemma IsBiDualLeftWeyl.isBiLeftWeyl_epsReindex {B : Type*} [AddCommGroup B] [Module ℂ B] + {repLorentz : Representation ℂ SL(2,ℂ) B} {T : Fin 2 × Fin 2 → B} + (hT : IsBiDualLeftWeyl B repLorentz T) : + IsBiLeftWeyl B repLorentz (epsReindex T) where + repLorentz_T g l := by + have hstep : ∀ k : Fin 2 × Fin 2, + (epsilon.1 l.1 k.1 * epsilon.1 l.2 k.2) • repLorentz g (T k) + = ∑ a : Fin 2 × Fin 2, ((epsilon.1 l.1 k.1 * epsilon.1 l.2 k.2) + * ((g.1⁻¹)ᵀ a.1 k.1 * (g.1⁻¹)ᵀ a.2 k.2)) • T a := by + intro k + rw [hT.repLorentz_T, Finset.smul_sum] + exact Finset.sum_congr rfl fun a _ => smul_smul _ _ _ + calc repLorentz g (epsReindex T l) + = ∑ k : Fin 2 × Fin 2, (epsilon.1 l.1 k.1 * epsilon.1 l.2 k.2) + • repLorentz g (T k) := by + simp only [epsReindex, map_sum, map_smul] + _ = ∑ a : Fin 2 × Fin 2, (∑ k : Fin 2 × Fin 2, + (epsilon.1 l.1 k.1 * epsilon.1 l.2 k.2) + * ((g.1⁻¹)ᵀ a.1 k.1 * (g.1⁻¹)ᵀ a.2 k.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, (∑ b : Fin 2 × Fin 2, (g.1 b.1 l.1 * g.1 b.2 l.2) + * (epsilon.1 b.1 a.1 * epsilon.1 b.2 a.2)) • T a := + Finset.sum_congr rfl fun a _ => by + rw [sum_biEpsilon_mul_inv_transpose] + _ = ∑ b : Fin 2 × Fin 2, (g.1 b.1 l.1 * g.1 b.2 l.2) • epsReindex T b := by + symm + simp only [epsReindex, Finset.smul_sum, smul_smul] + rw [Finset.sum_comm] + exact Finset.sum_congr rfl fun a _ => (Finset.sum_smul).symm + +/-- Conjugating the group argument undoes the conjugation of the matrix entries: the + inverse conjugate transpose at `conjHom g` is the plain inverse transpose at `g`. -/ +lemma conjHom_inv_conjTranspose (g : SL(2,ℂ)) : + (((SL2C.conjHom g).1)⁻¹)ᴴ = (g.1⁻¹)ᵀ := by + have h1 : ((SL2C.conjHom g).1)⁻¹ = (g.1⁻¹).map star := by + rw [SL2C.inverse_coe, ← map_inv, SL2C.conjHom_coe, SL2C.inverse_coe] + rw [h1] + ext i j + simp [Matrix.conjTranspose_apply, Matrix.map_apply] + +/-- A family with the conjugate contragredient index law is a family with the plain + contragredient index law for the representation twisted by `conjHom`. -/ +lemma IsBiDualRightWeyl.isBiDualLeftWeyl_comp {B : Type*} [AddCommGroup B] [Module ℂ B] + {repLorentz : Representation ℂ SL(2,ℂ) B} {T : Fin 2 × Fin 2 → B} + (hT : IsBiDualRightWeyl B repLorentz T) : + IsBiDualLeftWeyl B (repLorentz.comp SL2C.conjHom) T where + repLorentz_T g l := by + have h := hT.repLorentz_T (SL2C.conjHom g) l + rwa [conjHom_inv_conjTranspose] at h + +/-- The `ε` re-index turns a family with the conjugate contragredient index law into a + family with the fundamental index law for the conjugation-twisted representation. -/ +lemma IsBiDualRightWeyl.isBiLeftWeyl_epsReindex {B : Type*} [AddCommGroup B] + [Module ℂ B] {repLorentz : Representation ℂ SL(2,ℂ) B} {T : Fin 2 × Fin 2 → B} + (hT : IsBiDualRightWeyl B repLorentz T) : + IsBiLeftWeyl B (repLorentz.comp SL2C.conjHom) (epsReindex T) := + hT.isBiDualLeftWeyl_comp.isBiLeftWeyl_epsReindex + +/-! + +## K. The classification of the invariants of a dual-index family + +Sections G to J assemble into contragredient and conjugate contragredient analogues of +`IsBiLeftWeyl.exists_smul_epsilonContraction_of_invariant` and of its version modulo a +Lorentz-stable submodule. Nothing in the classification had to be redone: the whole +argument, and in particular `mem_boostWeightSubmodule_zero_of_invariant`, is generic in +the representation, so it applies verbatim to the conjugation-twisted one. Because the +re-index leaves the `ε` contraction alone, the contraction named in the conclusions is +the contraction of the original family, `T (0, 1) - T (1, 0)`, with no sign and no +scalar attached. + +-/ + +section DualClassification + +variable {B : Type*} [AddCommGroup B] [Module ℂ B] + {repLorentz : Representation ℂ SL(2,ℂ) B} {T : Fin 2 × Fin 2 → B} + +/-- The `ε` contraction of a family with the contragredient index law is Lorentz + invariant. -/ +lemma IsBiDualLeftWeyl.repLorentz_epsilonContraction + (hT : IsBiDualLeftWeyl B repLorentz T) (g : SL(2,ℂ)) : + repLorentz g (IsBiLeftWeyl.epsilonContraction (T := T)) + = IsBiLeftWeyl.epsilonContraction (T := T) := by + have h := hT.isBiLeftWeyl_epsReindex.repLorentz_epsilonContraction g + rwa [epsilonContraction_epsReindex] at h + +/-- The `ε` contraction of a family with the conjugate contragredient index law is + Lorentz invariant. -/ +lemma IsBiDualRightWeyl.repLorentz_epsilonContraction + (hT : IsBiDualRightWeyl B repLorentz T) (g : SL(2,ℂ)) : + repLorentz g (IsBiLeftWeyl.epsilonContraction (T := T)) + = IsBiLeftWeyl.epsilonContraction (T := T) := by + have h := hT.isBiLeftWeyl_epsReindex.repLorentz_epsilonContraction + rw [epsilonContraction_epsReindex] at h + exact (forall_comp_apply_eq_self_iff repLorentz SL2C.conjHom_surjective _).1 h g + +/-- The classification of the Lorentz invariants of a family with the contragredient + index law: every element of the span of the components fixed by the Lorentz group is a + scalar multiple of the `ε` contraction of that family. -/ +theorem IsBiDualLeftWeyl.exists_smul_epsilonContraction_of_invariant + (hT : IsBiDualLeftWeyl B repLorentz T) {x : B} (hx : x ∈ ⨆ d, ℂ ∙ T d) + (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : + ∃ a : ℂ, x = a • IsBiLeftWeyl.epsilonContraction (T := T) := by + have hT' := hT.isBiLeftWeyl_epsReindex + have hx' : x ∈ hT'.span := by + rw [IsBiLeftWeyl.span, iSup_span_epsReindex] + exact hx + obtain ⟨a, ha⟩ := hT'.exists_smul_epsilonContraction_of_invariant hx' hinv + exact ⟨a, by rwa [epsilonContraction_epsReindex] at ha⟩ + +/-- The classification of the Lorentz invariants of a family with the contragredient + index law, modulo a Lorentz-stable submodule `S`. -/ +theorem IsBiDualLeftWeyl.exists_smul_epsilonContraction_of_invariant_subset + (hT : IsBiDualLeftWeyl B repLorentz T) {x : B} (S : Submodule ℂ B) + (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) + (hx : x ∈ (⨆ d, ℂ ∙ T d) ⊔ S) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : + ∃ a : ℂ, ∃ y ∈ S, x = a • IsBiLeftWeyl.epsilonContraction (T := T) + y := by + have hT' := hT.isBiLeftWeyl_epsReindex + have hx' : x ∈ hT'.span ⊔ S := by + rw [IsBiLeftWeyl.span, iSup_span_epsReindex] + exact hx + obtain ⟨a, y, hy, ha⟩ := + hT'.exists_smul_epsilonContraction_of_invariant_subset S hS hx' hinv + exact ⟨a, y, hy, by rwa [epsilonContraction_epsReindex] at ha⟩ + +/-- The classification of the Lorentz invariants of a family with the conjugate + contragredient index law: every element of the span of the components fixed by the + Lorentz group is a scalar multiple of the `ε` contraction of that family. -/ +theorem IsBiDualRightWeyl.exists_smul_epsilonContraction_of_invariant + (hT : IsBiDualRightWeyl B repLorentz T) {x : B} (hx : x ∈ ⨆ d, ℂ ∙ T d) + (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : + ∃ a : ℂ, x = a • IsBiLeftWeyl.epsilonContraction (T := T) := + hT.isBiDualLeftWeyl_comp.exists_smul_epsilonContraction_of_invariant hx + ((forall_comp_apply_eq_self_iff repLorentz SL2C.conjHom_surjective x).2 hinv) + +/-- The classification of the Lorentz invariants of a family with the conjugate + contragredient index law, modulo a Lorentz-stable submodule `S`. -/ +theorem IsBiDualRightWeyl.exists_smul_epsilonContraction_of_invariant_subset + (hT : IsBiDualRightWeyl B repLorentz T) {x : B} (S : Submodule ℂ B) + (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) + (hx : x ∈ (⨆ d, ℂ ∙ T d) ⊔ S) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : + ∃ a : ℂ, ∃ y ∈ S, x = a • IsBiLeftWeyl.epsilonContraction (T := T) + y := + hT.isBiDualLeftWeyl_comp.exists_smul_epsilonContraction_of_invariant_subset S + (fun g y hy => hS (SL2C.conjHom g) y hy) hx + ((forall_comp_apply_eq_self_iff repLorentz SL2C.conjHom_surjective x).2 hinv) + +end DualClassification + end Lorentz diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsLeftRightWeyl.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsLeftRightWeyl.lean index dbace2ec6..8ba82d801 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsLeftRightWeyl.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsLeftRightWeyl.lean @@ -29,6 +29,12 @@ carry the weights `2`, `0`, `0` and `-2`. Averaging the weight-zero projection o 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. +A family carrying dual Weyl indices transforms by the contragredient `(Λ⁻¹)ᵀ` on the +undotted slot and by its complex conjugate `(Λ⁻¹)ᴴ` on the dotted one. That law is +`IsDualLeftRightWeyl`, and its classification — still that there is no invariant at all, +so there is no Dirac mass term — lives in `IsVectorLeftRightWeyl`, downstream of the `ε` +re-index of `IsBiLeftWeyl` which bridges the two laws. + 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 diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsVectorLeftRightWeyl.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsVectorLeftRightWeyl.lean new file mode 100644 index 000000000..1ea3c44d2 --- /dev/null +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsVectorLeftRightWeyl.lean @@ -0,0 +1,813 @@ +/- +Copyright (c) 2026 Joseph Tooby-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.IsBiLeftWeyl +public import Physlib.Relativity.LorentzGroup.Invariants.IsBiLorentz +public import Physlib.Relativity.PauliMatrices.AsTensor +/-! +# Lorentz invariants of a four-vector index and a left-right Weyl pair + +`IsVectorLeftRightWeyl repLorentz T` says that a family `T`, indexed by one four-vector +index and 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 tensor `T^{μ α α'}`. + +This is the shape of the fermion kinetic term, and it is the reason the classifier +exists: the kinetic term is the one Standard Model invariant that ties a vector index to +a pair of opposite-chirality spinor indices, `ψ̄_{α'} σ̄^{μ α' α} ∂_μ ψ_α`. No other +classifier covers that combination, and it is what the fermion sector needs at mass +weight eight, where the invariants of `derivSubmodule 0 * derivSubmodule 1` are +classified. + +There is exactly one invariant here, the contraction against the Pauli matrices: a pair +of opposite-chirality Weyl indices carries the `(1/2, 1/2)` representation, which is the +four-vector representation, so the three indices together are two four-vector indices, +and two four-vector indices admit only the metric trace. The main theorem +`exists_smul_pauliContraction_of_invariant` says accordingly that every Lorentz invariant +in the span of the components is a scalar multiple of `pauliContraction`, and +`repLorentz_pauliContraction` checks that this contraction really is invariant. + +The proof makes that argument literal rather than redoing the boost-weight analysis. The +covariant Pauli matrices `σ_μ` intertwine the two index laws — this is +`SL2C.toSelfAdjointMap_basis`, read entrywise — so contracting the Weyl pair against them +turns `T` into a genuine bi-Lorentz tensor, and the Fierz completeness relation makes that +contraction invertible, so the span is unchanged. `IsBiLorentz` then supplies the whole +classification, and its metric trace is on the nose the Pauli contraction of `T`. + +The Standard Model's fermion symbols are `Module.Dual`-valued, so their spinor indices +carry the contragredient of the laws above. Following `IsBiLeftWeyl`, the symplectic form +`ε` bridges the gap: it is inner for `SL(2,ℂ)`, so re-indexing the two spinor slots by `ε` +converts the contragredient law into the fundamental one without touching the +representation. Here no conjugation twist is needed either, because the mixed law already +carries one conjugate factor and `ε` has real entries. The derivative slot keeps the plain +Lorentz law, since in the Standard Model only the value index of a symbol is dualised. The +re-index does move the contraction: it sends the Pauli matrices to their transposes, so +the invariant named in the dual conclusions is the conjugate Pauli contraction +`pauliBarContraction`, with the scalar `+1`. + +The section headings tell the story: the covariant and conjugate Pauli matrices and the +two identities they satisfy (A), the families and the span of their components (B), the +reduction which turns the Weyl pair into a second four-vector index (C), the +classification it buys (D), the model family whose Pauli contraction is +`PauliMatrix.asTensor` (E), the dual index laws and the `ε` re-index which straightens +them out (F, G), and the classification of the invariants of the dual families (H). The +mass-weight-six statement lives in F and H too: a dual left-right Weyl pair with no vector +index has no invariant at all, so there is no Dirac mass term. +-/ + +@[expose] public section + +namespace Lorentz + +open TensorProduct Matrix MatrixGroups SL2C BoostWeight +open IsQuadLorentz (etaZ etaZ_cast minkowskiSignZ sum_etaZ_mul + mem_boostWeightSubmodule_zero_of_invariant quotRep quotRep_mkQ) + +/-! + +## A. The covariant Pauli matrices + +-/ + +/-- The Pauli matrices with the vector index lowered by the Minkowski metric. -/ +def pauliLower (μ : Fin 1 ⊕ Fin 3) : Matrix (Fin 2) (Fin 2) ℂ := + (PauliMatrix.pauliSelfAdjoint' μ).1 + +/-- The covariant Pauli matrices are the basis vectors of `PauliMatrix.pauliBasis'`. -/ +lemma pauliBasis'_coe (μ : Fin 1 ⊕ Fin 3) : + (PauliMatrix.pauliBasis' μ).1 = pauliLower μ := by + rw [PauliMatrix.pauliBasis', Module.Basis.coe_mk, pauliLower] + +/-- Lowering the vector index multiplies by the Minkowski sign. -/ +lemma pauliLower_eq_smul (μ : Fin 1 ⊕ Fin 3) : + pauliLower μ = ((minkowskiSignZ μ : ℤ) : ℂ) • PauliMatrix.pauliMatrix μ := by + rcases μ with μ | μ <;> fin_cases μ <;> + simp [pauliLower, PauliMatrix.pauliSelfAdjoint', minkowskiSignZ] + +/-- The conjugate Pauli matrices, the transposes of the covariant ones. These are the + matrices `σ̄_μ` carrying two dual spinor indices. -/ +def pauliBar (μ : Fin 1 ⊕ Fin 3) : Matrix (Fin 2) (Fin 2) ℂ := (pauliLower μ)ᵀ + +/-- The Fierz completeness relation for the covariant Pauli matrices: they form a basis + of the two by two matrices, with the trace pairing as the duality. -/ +lemma sum_pauliLower_mul_pauliLower (α α' β β' : Fin 2) : + ∑ ρ : Fin 1 ⊕ Fin 3, pauliLower ρ β' β * pauliLower ρ α α' + = 2 * ((if α = β then 1 else 0) * (if α' = β' then 1 else 0)) := by + fin_cases α <;> fin_cases α' <;> fin_cases β <;> fin_cases β' <;> + simp [pauliLower, PauliMatrix.pauliSelfAdjoint', PauliMatrix.pauliMatrix, + Fintype.sum_sum_type, Fin.sum_univ_three] <;> + norm_num [Complex.ext_iff] + +/-- The intertwining property of the covariant Pauli matrices, in components: sandwiching + `σ_μ` between `g` and `gᴴ` mixes the covariant Pauli matrices by the column of the + Lorentz matrix of `g`. This is `SL2C.toSelfAdjointMap_basis` read entrywise. -/ +lemma sum_pauliLower_mul_sl2c (g : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) (β β' : Fin 2) : + ∑ p : Fin 2 × Fin 2, pauliLower μ p.1 p.2 * (g.1 β p.1 * star (g.1 β' p.2)) + = ∑ ν : Fin 1 ⊕ Fin 3, (((SL2C.toLorentzGroup g).1 ν μ : ℝ) : ℂ) + * pauliLower ν β β' := by + have h := congrArg (fun A : selfAdjoint (Matrix (Fin 2) (Fin 2) ℂ) => A.1 β β') + (SL2C.toSelfAdjointMap_basis (M := g) μ) + simp only [SL2C.toSelfAdjointMap_apply_coe, AddSubmonoidClass.coe_finsetSum, + Matrix.sum_apply, selfAdjoint.val_smul, Matrix.smul_apply, Complex.real_smul, + pauliBasis'_coe] at h + rw [← h, Matrix.mul_apply, Fintype.sum_prod_type_right] + refine Finset.sum_congr rfl fun p₂ _ => ?_ + rw [Matrix.mul_apply, Finset.sum_mul] + exact Finset.sum_congr rfl fun p₁ _ => by + rw [Matrix.conjTranspose_apply] + ring + +/-! + +## B. Vector-Weyl families and the span of their components + +-/ + +/-- A sum over families of two four-vector indices is a double sum. -/ +lemma sum_pi_fin_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 family `T` of elements of `B`, indexed by one four-vector index, one left-handed + and one right-handed Weyl index, transforms as a tensor `T^{μ α α'}` under the + representation `repLorentz` of `SL(2,ℂ)`: the vector index moves by the Lorentz matrix + of the `SL(2,ℂ)` element, the left index by the matrix itself and the right index by + its complex conjugate. -/ +structure IsVectorLeftRightWeyl (B : Type*) [AddCommMonoid B] [Module ℂ B] + (repLorentz : Representation ℂ SL(2,ℂ) B) + (T : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2 → B) : Prop where + repLorentz_T : ∀ (g : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2), + repLorentz g (T (μ, l)) = ∑ (ν : Fin 1 ⊕ Fin 3), ∑ (a : Fin 2 × Fin 2), + ((((SL2C.toLorentzGroup g).1 ν μ : ℝ) : ℂ) + * (g.1 a.1 l.1 * star (g.1 a.2 l.2))) • T (ν, a) + +namespace IsVectorLeftRightWeyl +set_option linter.unusedVariables false + +variable {B : Type*} [AddCommGroup B] [Module ℂ B] + {repLorentz : Representation ℂ SL(2,ℂ) B} + {T : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2 → B} + (hT : IsVectorLeftRightWeyl B repLorentz T) + +/-- The span of all the components. -/ +def span (hT : IsVectorLeftRightWeyl 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 3) × 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 1 ⊕ Fin 3) × 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 _)) + +/-- The Pauli contraction `σ_μ^{α α'} T^μ_{α α'}`, the kinetic-term contraction of a + four-vector index against a pair of opposite-chirality Weyl indices. -/ +noncomputable def pauliContraction : B := + ∑ μ : Fin 1 ⊕ Fin 3, ∑ a : Fin 2 × Fin 2, + PauliMatrix.pauliMatrix μ a.1 a.2 • T (μ, a) + +end IsVectorLeftRightWeyl + +/-! + +## C. The reduction to a pair of four-vector indices + +-/ + +namespace IsVectorLeftRightWeyl + +variable {B : Type*} [AddCommGroup B] [Module ℂ B] + {repLorentz : Representation ℂ SL(2,ℂ) B} + {T : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2 → B} + (hT : IsVectorLeftRightWeyl B repLorentz T) + +/-- The family of two four-vector indices obtained by contracting the Weyl pair of `T` + against the covariant Pauli matrices. -/ +noncomputable def vectorPair : (Fin 2 → Fin 1 ⊕ Fin 3) → B := + fun d => ∑ a : Fin 2 × Fin 2, pauliLower (d 1) a.1 a.2 • T (d 0, a) + +include hT in +/-- The Pauli contraction of the Weyl pair carries the two spinor indices into a second + four-vector index: the resulting family is a bi-Lorentz tensor. -/ +lemma isBiLorentz_vectorPair : IsBiLorentz B repLorentz (vectorPair (T := T)) where + repLorentz_T g l := by + have hstep : ∀ p : Fin 2 × Fin 2, + pauliLower (l 1) p.1 p.2 • repLorentz g (T (l 0, p)) + = ∑ ν : Fin 1 ⊕ Fin 3, ∑ q : Fin 2 × Fin 2, + (pauliLower (l 1) p.1 p.2 * ((((SL2C.toLorentzGroup g).1 ν (l 0) : ℝ) : ℂ) + * (g.1 q.1 p.1 * star (g.1 q.2 p.2)))) • T (ν, q) := by + intro p + rw [hT.repLorentz_T g (l 0) p, Finset.smul_sum] + exact Finset.sum_congr rfl fun ν _ => by + rw [Finset.smul_sum] + exact Finset.sum_congr rfl fun q _ => smul_smul _ _ _ + calc repLorentz g (vectorPair (T := T) l) + = ∑ p : Fin 2 × Fin 2, + pauliLower (l 1) p.1 p.2 • repLorentz g (T (l 0, p)) := by + simp only [vectorPair, map_sum, map_smul] + _ = ∑ ν : Fin 1 ⊕ Fin 3, ∑ q : Fin 2 × Fin 2, + (∑ p : Fin 2 × Fin 2, pauliLower (l 1) p.1 p.2 + * ((((SL2C.toLorentzGroup g).1 ν (l 0) : ℝ) : ℂ) + * (g.1 q.1 p.1 * star (g.1 q.2 p.2)))) • T (ν, q) := by + simp only [hstep] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun ν _ => ?_ + rw [Finset.sum_comm] + exact Finset.sum_congr rfl fun q _ => (Finset.sum_smul).symm + _ = ∑ ν : Fin 1 ⊕ Fin 3, ∑ ρ : Fin 1 ⊕ Fin 3, + ((((SL2C.toLorentzGroup g).1 ν (l 0) : ℝ) : ℂ) + * (((SL2C.toLorentzGroup g).1 ρ (l 1) : ℝ) : ℂ)) + • vectorPair (T := T) ![ν, ρ] := by + refine Finset.sum_congr rfl fun ν _ => ?_ + have hinner : ∀ q : Fin 2 × Fin 2, + (∑ p : Fin 2 × Fin 2, pauliLower (l 1) p.1 p.2 + * ((((SL2C.toLorentzGroup g).1 ν (l 0) : ℝ) : ℂ) + * (g.1 q.1 p.1 * star (g.1 q.2 p.2)))) + = (((SL2C.toLorentzGroup g).1 ν (l 0) : ℝ) : ℂ) + * ∑ ρ : Fin 1 ⊕ Fin 3, (((SL2C.toLorentzGroup g).1 ρ (l 1) : ℝ) : ℂ) + * pauliLower ρ q.1 q.2 := by + intro q + rw [← sum_pauliLower_mul_sl2c g (l 1) q.1 q.2, Finset.mul_sum] + exact Finset.sum_congr rfl fun p _ => by ring + simp only [hinner] + symm + simp only [vectorPair, Matrix.cons_val_zero, Matrix.cons_val_one, + Finset.smul_sum, smul_smul] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun q _ => ?_ + rw [← Finset.sum_smul, Finset.mul_sum] + exact congrArg (· • T (ν, q)) (Finset.sum_congr rfl fun ρ _ => by ring) + _ = ∑ a : Fin 2 → Fin 1 ⊕ Fin 3, + (∏ i : Fin 2, (((SL2C.toLorentzGroup g).1 (a i) (l i) : ℝ) : ℂ)) + • vectorPair (T := T) a := by + rw [sum_pi_fin_two] + refine Finset.sum_congr rfl fun ν _ => Finset.sum_congr rfl fun ρ _ => ?_ + simp only [Fin.prod_univ_two, Matrix.cons_val_zero, Matrix.cons_val_one] + +/-- Every component of the reduced family lies in the span of the components of `T`. -/ +lemma vectorPair_mem_span (d : Fin 2 → Fin 1 ⊕ Fin 3) : + vectorPair (T := T) d ∈ hT.span := + sum_mem fun a _ => Submodule.smul_mem _ _ + (Submodule.mem_iSup_of_mem (d 0, a) (Submodule.mem_span_singleton_self _)) + +/-- The reduction is invertible: by the Fierz completeness relation each component of + `T` is recovered from the reduced family. -/ +lemma eq_sum_vectorPair (μ : Fin 1 ⊕ Fin 3) (b : Fin 2 × Fin 2) : + T (μ, b) = ∑ ρ : Fin 1 ⊕ Fin 3, + ((2 : ℂ)⁻¹ * pauliLower ρ b.2 b.1) • vectorPair (T := T) ![μ, ρ] := by + calc T (μ, b) = ∑ a : Fin 2 × Fin 2, + ((if a.1 = b.1 then (1 : ℂ) else 0) * (if a.2 = b.2 then 1 else 0)) • T (μ, a) := by + rw [Fintype.sum_prod_type] + simp [ite_smul, Finset.sum_ite_eq'] + _ = ∑ a : Fin 2 × Fin 2, (∑ ρ : Fin 1 ⊕ Fin 3, + (2 : ℂ)⁻¹ * pauliLower ρ b.2 b.1 * pauliLower ρ a.1 a.2) • T (μ, a) := by + refine Finset.sum_congr rfl fun a _ => ?_ + congr 1 + rw [show (∑ ρ : Fin 1 ⊕ Fin 3, + (2 : ℂ)⁻¹ * pauliLower ρ b.2 b.1 * pauliLower ρ a.1 a.2) + = (2 : ℂ)⁻¹ * ∑ ρ : Fin 1 ⊕ Fin 3, + pauliLower ρ b.2 b.1 * pauliLower ρ a.1 a.2 from by + rw [Finset.mul_sum] + exact Finset.sum_congr rfl fun ρ _ => (mul_assoc _ _ _), + sum_pauliLower_mul_pauliLower a.1 a.2 b.1 b.2] + field_simp + _ = _ := by + simp only [vectorPair, Matrix.cons_val_zero, Matrix.cons_val_one, + Finset.smul_sum, smul_smul] + rw [Finset.sum_comm] + exact Finset.sum_congr rfl fun a _ => Finset.sum_smul + +omit hT in +/-- Every component of `T` lies in the span of the components of the reduced family. -/ +lemma mem_span_vectorPair (d : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2) : + T d ∈ ⨆ e, ℂ ∙ vectorPair (T := T) e := by + rw [show T d = T (d.1, d.2) from rfl, eq_sum_vectorPair (T := T) d.1 d.2] + exact sum_mem fun ρ _ => Submodule.smul_mem _ _ + (Submodule.mem_iSup_of_mem _ (Submodule.mem_span_singleton_self _)) + +include hT in +/-- The reduction does not change the span of the components. -/ +lemma iSup_span_vectorPair : (⨆ e, ℂ ∙ vectorPair (T := T) e) = hT.span := by + refine le_antisymm (iSup_le fun e => ?_) (iSup_le fun d => ?_) + · rw [Submodule.span_singleton_le_iff_mem] + exact hT.vectorPair_mem_span e + · rw [Submodule.span_singleton_le_iff_mem] + exact mem_span_vectorPair (T := T) d + +/-- The metric trace of the reduced family is exactly the Pauli contraction of `T`: the + two lowerings of the vector index cancel, so no sign and no scalar appear. -/ +lemma metricContraction_vectorPair : + IsBiLorentz.metricContraction (T := vectorPair (T := T)) = pauliContraction (T := T) := by + rw [IsBiLorentz.metricContraction, sum_pi_fin_two, pauliContraction] + refine Finset.sum_congr rfl fun ν _ => ?_ + rw [Finset.sum_eq_single ν (fun ρ _ hρ => ?_) (fun hν => absurd (Finset.mem_univ ν) hν)] + · simp only [vectorPair, Matrix.cons_val_zero, Matrix.cons_val_one, Finset.smul_sum, + smul_smul] + refine Finset.sum_congr rfl fun a _ => ?_ + congr 1 + rw [pauliLower_eq_smul, Matrix.smul_apply, smul_eq_mul, ← mul_assoc] + rcases ν with ν | ν <;> fin_cases ν <;> norm_num [etaZ, minkowskiSignZ] + · rw [show etaZ (![ν, ρ] 0) (![ν, ρ] 1) = 0 from by + simp only [Matrix.cons_val_zero, Matrix.cons_val_one] + simp [etaZ, Ne.symm hρ]] + simp + +/-! + +## D. The classification of the Lorentz invariants + +-/ + +include hT in +/-- The Pauli contraction really is a Lorentz invariant: this is the metric invariance + `Λ η Λᵀ = η` read through the reduction of section C. -/ +lemma repLorentz_pauliContraction (g : SL(2,ℂ)) : + repLorentz g (pauliContraction (T := T)) = pauliContraction (T := T) := by + have hV := hT.isBiLorentz_vectorPair + have hstep : ∀ d : Fin 2 → Fin 1 ⊕ Fin 3, + repLorentz g (((etaZ (d 0) (d 1) : ℤ) : ℂ) • vectorPair (T := T) d) + = ∑ a : Fin 2 → Fin 1 ⊕ Fin 3, + (((etaZ (d 0) (d 1) : ℤ) : ℂ) + * ∏ i : Fin 2, (((SL2C.toLorentzGroup g).1 (a i) (d i) : ℝ) : ℂ)) + • vectorPair (T := T) a := by + intro d + rw [map_smul, hV.repLorentz_T g d, Finset.smul_sum] + exact Finset.sum_congr rfl fun a _ => smul_smul _ _ _ + rw [← metricContraction_vectorPair (T := T), IsBiLorentz.metricContraction, map_sum] + calc ∑ d : Fin 2 → Fin 1 ⊕ Fin 3, + repLorentz g (((etaZ (d 0) (d 1) : ℤ) : ℂ) • vectorPair (T := T) d) + = ∑ a : Fin 2 → Fin 1 ⊕ Fin 3, (∑ d : Fin 2 → Fin 1 ⊕ Fin 3, + ((etaZ (d 0) (d 1) : ℤ) : ℂ) + * ∏ i : Fin 2, (((SL2C.toLorentzGroup g).1 (a i) (d i) : ℝ) : ℂ)) + • vectorPair (T := 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, + ((etaZ (a 0) (a 1) : ℤ) : ℂ) • vectorPair (T := T) a := by + refine Finset.sum_congr rfl fun a _ => ?_ + congr 1 + rw [sum_pi_fin_two] + rw [← sum_etaZ_mul (SL2C.toLorentzGroup g) (a 0) (a 1)] + refine Finset.sum_congr rfl fun x _ => Finset.sum_congr rfl fun y _ => ?_ + simp only [Fin.prod_univ_two, Matrix.cons_val_zero, Matrix.cons_val_one] + +include hT in +/-- The classification of the Lorentz invariants: a four-vector index together with a + left-handed and a right-handed Weyl index admit the single invariant contraction + against the Pauli matrices, so every element of the span of the components fixed by the + Lorentz group is a scalar multiple of `pauliContraction`. -/ +theorem exists_smul_pauliContraction_of_invariant {x : B} (hx : x ∈ hT.span) + (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : + ∃ a : ℂ, x = a • pauliContraction (T := T) := by + have hV := hT.isBiLorentz_vectorPair + have hx' : x ∈ hV.span := by + rw [IsBiLorentz.span, hT.iSup_span_vectorPair] + exact hx + obtain ⟨a, ha⟩ := hV.exists_smul_metricContraction_of_invariant hx' hinv + exact ⟨a, by rwa [metricContraction_vectorPair] at ha⟩ + +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 Pauli contraction up to an error in `S`. -/ +lemma exists_smul_pauliContraction_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 • pauliContraction (T := T) + y := by + have hV := hT.isBiLorentz_vectorPair + have hx' : x ∈ hV.span ⊔ S := by + rw [IsBiLorentz.span, hT.iSup_span_vectorPair] + exact hx + obtain ⟨a, y, hy, ha⟩ := + hV.exists_smul_metricContraction_of_invariant_subset S hS hx' hinv + exact ⟨a, y, hy, by rwa [metricContraction_vectorPair] at ha⟩ + +end IsVectorLeftRightWeyl + +/-! + +## E. The Pauli tensor as the model example + +The tensor product of the complex four-vector representation with the two Weyl +representations carries exactly this index law on the products of basis vectors, and the +Pauli contraction of that family is the repo's `PauliMatrix.asTensor`. So the classifier +is not vacuous, and on the model family the invariant line is spanned by a tensor already +known to be nonzero. + + +-/ + +open Fermion in +/-- The tensor product of the complex four-vector representation with the left-handed and + the right-handed Weyl representations, on the products of basis vectors, is the basic + example of a family with this index law. -/ +lemma isVectorLeftRightWeyl_pauli : + IsVectorLeftRightWeyl (ContrℂModule ⊗[ℂ] (LeftHandedWeyl ⊗[ℂ] RightHandedWeyl)) + (ContrℂModule.SL2CRep.tprod (LeftHandedWeyl.rep.tprod RightHandedWeyl.rep)) + (fun d => complexContrBasis d.1 ⊗ₜ[ℂ] + (LeftHandedWeyl.basis d.2.1 ⊗ₜ[ℂ] RightHandedWeyl.basis d.2.2)) where + repLorentz_T g μ l := by + have hC : (ContrℂModule.SL2CRep g) (complexContrBasis μ) + = ∑ ν, (((SL2C.toLorentzGroup g).1 ν μ : ℝ) : ℂ) • complexContrBasis ν := by + rw [SL2CRep_ρ_basis] + exact Finset.sum_congr rfl fun ν _ => (algebraMap_smul ℂ _ _).symm + have hR : (RightHandedWeyl.rep g) (RightHandedWeyl.basis l.2) + = ∑ y, star (g.1 y l.2) • RightHandedWeyl.basis y := by + rw [RightHandedWeyl.rep_apply_basis] + exact Finset.sum_congr rfl fun y _ => by rw [Matrix.map_apply] + have hinner : (∑ x, g.1 x l.1 • LeftHandedWeyl.basis x) ⊗ₜ[ℂ] + (∑ y, star (g.1 y l.2) • RightHandedWeyl.basis y) + = ∑ a : Fin 2 × Fin 2, (g.1 a.1 l.1 * star (g.1 a.2 l.2)) + • (LeftHandedWeyl.basis a.1 ⊗ₜ[ℂ] RightHandedWeyl.basis a.2) := by + rw [TensorProduct.sum_tmul, Fintype.sum_prod_type] + refine Finset.sum_congr rfl fun x _ => ?_ + rw [TensorProduct.tmul_sum] + exact Finset.sum_congr rfl fun y _ => by + rw [← TensorProduct.smul_tmul', TensorProduct.tmul_smul, smul_smul] + rw [Representation.tprod_apply, TensorProduct.map_tmul, Representation.tprod_apply, + TensorProduct.map_tmul, hC, hR, LeftHandedWeyl.rep_apply_basis, hinner, + TensorProduct.sum_tmul] + refine Finset.sum_congr rfl fun ν _ => ?_ + rw [TensorProduct.tmul_sum] + exact Finset.sum_congr rfl fun a _ => by + rw [TensorProduct.tmul_smul, ← TensorProduct.smul_tmul', smul_smul] + module + +open PauliMatrix Fermion in +/-- The Pauli contraction of the model family is the Pauli tensor `σ^μ{}^α{}^{α'}` of + `PauliMatrix.asTensor`: the classification of section D says that this tensor spans + the invariants, so the invariant space really is one dimensional here. -/ +lemma pauliContraction_pauli : + IsVectorLeftRightWeyl.pauliContraction + (T := fun d : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2 => complexContrBasis d.1 ⊗ₜ[ℂ] + (LeftHandedWeyl.basis d.2.1 ⊗ₜ[ℂ] RightHandedWeyl.basis d.2.2)) + = PauliMatrix.asTensor := by + rw [IsVectorLeftRightWeyl.pauliContraction, asTensor_expand] + simp only [Fintype.sum_sum_type, Finset.univ_unique, Fin.default_eq_zero, + Finset.sum_singleton, Fin.sum_univ_three, Fintype.sum_prod_type, Fin.sum_univ_two, + pauliMatrix, Matrix.one_fin_two, Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.of_apply, Matrix.cons_val', Matrix.empty_val', Matrix.cons_val_fin_one] + module + +/-! + +## F. Dual Weyl indices and the `ε` re-index + +-/ + +/-- A family `T` of elements of `B`, indexed by one dual left-handed and one dual + right-handed Weyl index, transforms as a tensor `T_{α α'}` under `repLorentz`: the + undotted index carries the contragredient matrix and the dotted one its complex + conjugate. -/ +structure IsDualLeftRightWeyl (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 + +/-- A family `T` of elements of `B`, indexed by one four-vector index, one dual + left-handed and one dual right-handed Weyl index, transforms as a tensor + `T^μ{}_{α α'}` under `repLorentz`. The vector index still carries the plain Lorentz + matrix: in the Standard Model it is a derivative slot, and only the value index of a + symbol is dualised. -/ +structure IsVectorDualLeftRightWeyl (B : Type*) [AddCommMonoid B] [Module ℂ B] + (repLorentz : Representation ℂ SL(2,ℂ) B) + (T : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2 → B) : Prop where + repLorentz_T : ∀ (g : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2), + repLorentz g (T (μ, l)) = ∑ (ν : Fin 1 ⊕ Fin 3), ∑ (a : Fin 2 × Fin 2), + ((((SL2C.toLorentzGroup g).1 ν μ : ℝ) : ℂ) + * ((g.1⁻¹)ᵀ a.1 l.1 * (g.1⁻¹)ᴴ a.2 l.2)) • T (ν, a) + +open Fermion in +/-- The tensor product of the dual left-handed and the dual right-handed Weyl + representations, on the products of basis vectors, is the basic example of a family + with the mixed contragredient index law. -/ +lemma isDualLeftRightWeyl_dualWeyl : + IsDualLeftRightWeyl (DualLeftHandedWeyl ⊗[ℂ] DualRightHandedWeyl) + (DualLeftHandedWeyl.rep.tprod DualRightHandedWeyl.rep) + (fun l => DualLeftHandedWeyl.basis l.1 ⊗ₜ[ℂ] DualRightHandedWeyl.basis l.2) where + repLorentz_T g l := by + rw [Representation.tprod_apply, TensorProduct.map_tmul, + DualLeftHandedWeyl.rep_apply_basis, DualRightHandedWeyl.rep_apply_basis, + TensorProduct.sum_tmul] + simp only [TensorProduct.smul_tmul', TensorProduct.tmul_sum, TensorProduct.tmul_smul, + smul_smul, Fintype.sum_prod_type, Matrix.transpose_apply] + exact Finset.sum_congr rfl fun x _ => Finset.sum_congr rfl fun y _ => by + rw [mul_comm] + +/-- The entries of the symplectic form are real. -/ +lemma star_epsilon_apply (l k : Fin 2) : star (epsilon.1 l k) = epsilon.1 l k := by + fin_cases l <;> fin_cases k <;> simp [SL2C.epsilon_coe] + +/-- The conjugate single-index form of the symplectic identity: moving a conjugate + contragredient factor across `ε` turns it into a conjugate fundamental factor. -/ +lemma sum_epsilon_mul_inv_conjTranspose (g : SL(2,ℂ)) (l a : Fin 2) : + ∑ k : Fin 2, epsilon.1 l k * (g.1⁻¹)ᴴ a k + = ∑ b : Fin 2, star (g.1 b l) * epsilon.1 b a := by + have h := congrArg star (sum_epsilon_mul_inv_transpose g l a) + simp only [star_sum, star_mul', star_epsilon_apply] at h + rw [← h] + exact Finset.sum_congr rfl fun k _ => by + rw [Matrix.conjTranspose_apply, Matrix.transpose_apply] + +/-- The mixed two-index form of the symplectic identity, obtained from the plain and the + conjugate single-index forms by factorising each sum over the two slots. -/ +lemma sum_mixedEpsilon_mul_inv (g : SL(2,ℂ)) (l a : Fin 2 × Fin 2) : + ∑ k : Fin 2 × Fin 2, (epsilon.1 l.1 k.1 * epsilon.1 l.2 k.2) + * ((g.1⁻¹)ᵀ a.1 k.1 * (g.1⁻¹)ᴴ a.2 k.2) + = ∑ b : Fin 2 × Fin 2, (g.1 b.1 l.1 * star (g.1 b.2 l.2)) + * (epsilon.1 b.1 a.1 * epsilon.1 b.2 a.2) := by + have hL : (∑ k₁, epsilon.1 l.1 k₁ * (g.1⁻¹)ᵀ a.1 k₁) + * (∑ k₂, epsilon.1 l.2 k₂ * (g.1⁻¹)ᴴ a.2 k₂) + = ∑ k : Fin 2 × Fin 2, (epsilon.1 l.1 k.1 * epsilon.1 l.2 k.2) + * ((g.1⁻¹)ᵀ a.1 k.1 * (g.1⁻¹)ᴴ a.2 k.2) := by + rw [Finset.sum_mul_sum, Fintype.sum_prod_type] + exact Finset.sum_congr rfl fun k₁ _ => Finset.sum_congr rfl fun k₂ _ => by ring + have hR : (∑ b₁, g.1 b₁ l.1 * epsilon.1 b₁ a.1) + * (∑ b₂, star (g.1 b₂ l.2) * epsilon.1 b₂ a.2) + = ∑ b : Fin 2 × Fin 2, (g.1 b.1 l.1 * star (g.1 b.2 l.2)) + * (epsilon.1 b.1 a.1 * epsilon.1 b.2 a.2) := by + rw [Finset.sum_mul_sum, Fintype.sum_prod_type] + exact Finset.sum_congr rfl fun b₁ _ => Finset.sum_congr rfl fun b₂ _ => by ring + rw [← hL, ← hR, sum_epsilon_mul_inv_transpose, sum_epsilon_mul_inv_conjTranspose] + +/-- The `ε` re-index turns a family with the mixed contragredient index law into a family + with the mixed fundamental index law, for the very same representation. -/ +lemma IsDualLeftRightWeyl.isLeftRightWeyl_epsReindex {B : Type*} [AddCommGroup B] + [Module ℂ B] {repLorentz : Representation ℂ SL(2,ℂ) B} {T : Fin 2 × Fin 2 → B} + (hT : IsDualLeftRightWeyl B repLorentz T) : + IsLeftRightWeyl B repLorentz (epsReindex T) where + repLorentz_T g l := by + have hstep : ∀ k : Fin 2 × Fin 2, + (epsilon.1 l.1 k.1 * epsilon.1 l.2 k.2) • repLorentz g (T k) + = ∑ a : Fin 2 × Fin 2, ((epsilon.1 l.1 k.1 * epsilon.1 l.2 k.2) + * ((g.1⁻¹)ᵀ a.1 k.1 * (g.1⁻¹)ᴴ a.2 k.2)) • T a := by + intro k + rw [hT.repLorentz_T, Finset.smul_sum] + exact Finset.sum_congr rfl fun a _ => smul_smul _ _ _ + calc repLorentz g (epsReindex T l) + = ∑ k : Fin 2 × Fin 2, (epsilon.1 l.1 k.1 * epsilon.1 l.2 k.2) + • repLorentz g (T k) := by + simp only [epsReindex, map_sum, map_smul] + _ = ∑ a : Fin 2 × Fin 2, (∑ k : Fin 2 × Fin 2, + (epsilon.1 l.1 k.1 * epsilon.1 l.2 k.2) + * ((g.1⁻¹)ᵀ a.1 k.1 * (g.1⁻¹)ᴴ a.2 k.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, (∑ b : Fin 2 × Fin 2, (g.1 b.1 l.1 * star (g.1 b.2 l.2)) + * (epsilon.1 b.1 a.1 * epsilon.1 b.2 a.2)) • T a := + Finset.sum_congr rfl fun a _ => by rw [sum_mixedEpsilon_mul_inv] + _ = ∑ b : Fin 2 × Fin 2, (g.1 b.1 l.1 * star (g.1 b.2 l.2)) • epsReindex T b := by + symm + simp only [epsReindex, Finset.smul_sum, smul_smul] + rw [Finset.sum_comm] + exact Finset.sum_congr rfl fun a _ => (Finset.sum_smul).symm + +/-! + +## G. The `ε` re-index of a vector-Weyl family + +-/ + +/-- Conjugating a Pauli matrix by the symplectic form on both spinor slots produces the + conjugate Pauli matrix of the same vector index. -/ +lemma sum_pauliMatrix_mul_epsilon (μ : Fin 1 ⊕ Fin 3) (k₁ k₂ : Fin 2) : + ∑ a : Fin 2 × Fin 2, PauliMatrix.pauliMatrix μ a.1 a.2 + * (epsilon.1 a.1 k₁ * epsilon.1 a.2 k₂) = pauliBar μ k₁ k₂ := by + rcases μ with μ | μ <;> fin_cases μ <;> fin_cases k₁ <;> fin_cases k₂ <;> + simp [Fintype.sum_prod_type, Fin.sum_univ_two, PauliMatrix.pauliMatrix, + pauliBar, pauliLower, PauliMatrix.pauliSelfAdjoint', SL2C.epsilon_coe] + +/-- The `ε` re-index of a family carrying a four-vector index and a Weyl pair: the + vector index is left alone and both spinor slots are transported through the + symplectic form. -/ +noncomputable def vectorEpsReindex {B : Type*} [AddCommMonoid B] [Module ℂ B] + (T : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2 → B) : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2 → B := + fun d => ∑ k : Fin 2 × Fin 2, (epsilon.1 d.2.1 k.1 * epsilon.1 d.2.2 k.2) • T (d.1, k) + +section VectorReindex + +variable {B : Type*} [AddCommGroup B] [Module ℂ B] + (T : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2 → B) + +/-- At a fixed vector index the re-index is the `ε` re-index of the Weyl pair. -/ +lemma vectorEpsReindex_eq_epsReindex (μ : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) : + vectorEpsReindex T (μ, l) = epsReindex (fun k => T (μ, k)) l := rfl + +/-- The re-index is an involution, slot by slot. -/ +lemma vectorEpsReindex_vectorEpsReindex : + vectorEpsReindex (vectorEpsReindex T) = T := by + funext d + obtain ⟨μ, l⟩ := d + have h : (fun k => vectorEpsReindex T (μ, k)) = epsReindex (fun k => T (μ, k)) := rfl + rw [vectorEpsReindex_eq_epsReindex, h, epsReindex_epsReindex] + +/-- Every re-indexed component lies in the span of the original components. -/ +lemma vectorEpsReindex_mem_iSup (d : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2) : + vectorEpsReindex T d ∈ ⨆ e, ℂ ∙ T e := + sum_mem fun k _ => Submodule.smul_mem _ _ + (Submodule.mem_iSup_of_mem (d.1, k) (Submodule.mem_span_singleton_self _)) + +/-- The re-index does not change the span of the components. -/ +lemma iSup_span_vectorEpsReindex : + (⨆ d, ℂ ∙ vectorEpsReindex T d) = ⨆ d, ℂ ∙ T d := by + refine le_antisymm (iSup_le fun d => ?_) (iSup_le fun d => ?_) + · rw [Submodule.span_singleton_le_iff_mem] + exact vectorEpsReindex_mem_iSup T d + · rw [Submodule.span_singleton_le_iff_mem] + have h : T d = vectorEpsReindex (vectorEpsReindex T) d := by + rw [vectorEpsReindex_vectorEpsReindex] + rw [h] + exact vectorEpsReindex_mem_iSup (vectorEpsReindex T) d + +end VectorReindex + +namespace IsVectorDualLeftRightWeyl + +variable {B : Type*} [AddCommGroup B] [Module ℂ B] + {repLorentz : Representation ℂ SL(2,ℂ) B} + {T : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2 → B} + +/-- The conjugate Pauli contraction `σ̄_μ^{α' α} T^μ{}_{α α'}`, the kinetic-term + contraction of a four-vector index against a pair of dual opposite-chirality Weyl + indices. -/ +noncomputable def pauliBarContraction : B := + ∑ μ : Fin 1 ⊕ Fin 3, ∑ a : Fin 2 × Fin 2, pauliBar μ a.1 a.2 • T (μ, a) + +/-- The `ε` re-index turns a family with the mixed contragredient index law into a family + with the mixed fundamental index law, for the very same representation. -/ +lemma isVectorLeftRightWeyl_vectorEpsReindex + (hT : IsVectorDualLeftRightWeyl B repLorentz T) : + IsVectorLeftRightWeyl B repLorentz (vectorEpsReindex T) where + repLorentz_T g μ l := by + have hstep : ∀ k : Fin 2 × Fin 2, + (epsilon.1 l.1 k.1 * epsilon.1 l.2 k.2) • repLorentz g (T (μ, k)) + = ∑ ν : Fin 1 ⊕ Fin 3, ∑ b : Fin 2 × Fin 2, + ((epsilon.1 l.1 k.1 * epsilon.1 l.2 k.2) + * ((((SL2C.toLorentzGroup g).1 ν μ : ℝ) : ℂ) + * ((g.1⁻¹)ᵀ b.1 k.1 * (g.1⁻¹)ᴴ b.2 k.2))) • T (ν, b) := by + intro k + rw [hT.repLorentz_T g μ k, Finset.smul_sum] + exact Finset.sum_congr rfl fun ν _ => by + rw [Finset.smul_sum] + exact Finset.sum_congr rfl fun b _ => smul_smul _ _ _ + calc repLorentz g (vectorEpsReindex T (μ, l)) + = ∑ k : Fin 2 × Fin 2, (epsilon.1 l.1 k.1 * epsilon.1 l.2 k.2) + • repLorentz g (T (μ, k)) := by + simp only [vectorEpsReindex, map_sum, map_smul] + _ = ∑ ν : Fin 1 ⊕ Fin 3, ∑ b : Fin 2 × Fin 2, (∑ k : Fin 2 × Fin 2, + (epsilon.1 l.1 k.1 * epsilon.1 l.2 k.2) + * ((((SL2C.toLorentzGroup g).1 ν μ : ℝ) : ℂ) + * ((g.1⁻¹)ᵀ b.1 k.1 * (g.1⁻¹)ᴴ b.2 k.2))) • T (ν, b) := by + simp only [hstep] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun ν _ => ?_ + rw [Finset.sum_comm] + exact Finset.sum_congr rfl fun b _ => (Finset.sum_smul).symm + _ = ∑ ν : Fin 1 ⊕ Fin 3, ∑ a : Fin 2 × Fin 2, + ((((SL2C.toLorentzGroup g).1 ν μ : ℝ) : ℂ) + * (g.1 a.1 l.1 * star (g.1 a.2 l.2))) • vectorEpsReindex T (ν, a) := by + refine Finset.sum_congr rfl fun ν _ => ?_ + have hinner : ∀ b : Fin 2 × Fin 2, + (∑ k : Fin 2 × Fin 2, (epsilon.1 l.1 k.1 * epsilon.1 l.2 k.2) + * ((((SL2C.toLorentzGroup g).1 ν μ : ℝ) : ℂ) + * ((g.1⁻¹)ᵀ b.1 k.1 * (g.1⁻¹)ᴴ b.2 k.2))) + = (((SL2C.toLorentzGroup g).1 ν μ : ℝ) : ℂ) + * ∑ a : Fin 2 × Fin 2, (g.1 a.1 l.1 * star (g.1 a.2 l.2)) + * (epsilon.1 a.1 b.1 * epsilon.1 a.2 b.2) := by + intro b + rw [← sum_mixedEpsilon_mul_inv g l b, Finset.mul_sum] + exact Finset.sum_congr rfl fun k _ => by ring + simp only [hinner] + symm + simp only [vectorEpsReindex, Finset.smul_sum, smul_smul] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun b _ => ?_ + rw [← Finset.sum_smul, Finset.mul_sum] + exact congrArg (· • T (ν, b)) (Finset.sum_congr rfl fun a _ => by ring) + +/-- The `ε` re-index carries the Pauli contraction of the re-indexed family to the + conjugate Pauli contraction of the original one, with neither a sign nor a scalar + appearing. -/ +lemma pauliContraction_vectorEpsReindex : + IsVectorLeftRightWeyl.pauliContraction (T := vectorEpsReindex T) + = pauliBarContraction (T := T) := by + rw [IsVectorLeftRightWeyl.pauliContraction, pauliBarContraction] + refine Finset.sum_congr rfl fun μ _ => ?_ + simp only [vectorEpsReindex, Finset.smul_sum, smul_smul] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun k _ => ?_ + rw [← Finset.sum_smul, ← sum_pauliMatrix_mul_epsilon μ k.1 k.2] + +end IsVectorDualLeftRightWeyl + +/-! + +## H. The classification of the invariants of the dual families + +-/ + +section DualClassification + +variable {B : Type*} [AddCommGroup B] [Module ℂ B] + {repLorentz : Representation ℂ SL(2,ℂ) B} + +/-- The classification of the Lorentz invariants of a family with the mixed + contragredient index law: there is no invariant contraction of a dual left-handed + against a dual right-handed Weyl index, so every element of the span of the components + fixed by the Lorentz group is zero. This is the absence of a Dirac mass term. -/ +theorem IsDualLeftRightWeyl.eq_zero_of_invariant {T : Fin 2 × Fin 2 → B} + (hT : IsDualLeftRightWeyl B repLorentz T) {x : B} (hx : x ∈ ⨆ d, ℂ ∙ T d) + (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x = 0 := by + have hT' := hT.isLeftRightWeyl_epsReindex + have hx' : x ∈ hT'.span := by + rw [IsLeftRightWeyl.span, iSup_span_epsReindex] + exact hx + exact hT'.eq_zero_of_invariant hx' hinv + +/-- The classification of the Lorentz invariants of a family with the mixed + contragredient index law, modulo a Lorentz-stable submodule `S`: such an invariant + already lies in `S`. -/ +theorem IsDualLeftRightWeyl.mem_of_invariant_of_mem_sup {T : Fin 2 × Fin 2 → B} + (hT : IsDualLeftRightWeyl B repLorentz T) {x : B} (S : Submodule ℂ B) + (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) + (hx : x ∈ (⨆ d, ℂ ∙ T d) ⊔ S) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by + have hT' := hT.isLeftRightWeyl_epsReindex + have hx' : x ∈ hT'.span ⊔ S := by + rw [IsLeftRightWeyl.span, iSup_span_epsReindex] + exact hx + exact hT'.mem_of_invariant_of_mem_sup S hS hx' hinv + +namespace IsVectorDualLeftRightWeyl + +variable {T : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2 → B} + +/-- The conjugate Pauli contraction of a family with the mixed contragredient index law + is Lorentz invariant. -/ +lemma repLorentz_pauliBarContraction (hT : IsVectorDualLeftRightWeyl B repLorentz T) + (g : SL(2,ℂ)) : + repLorentz g (pauliBarContraction (T := T)) = pauliBarContraction (T := T) := by + have h := hT.isVectorLeftRightWeyl_vectorEpsReindex.repLorentz_pauliContraction g + rwa [pauliContraction_vectorEpsReindex] at h + +/-- The classification of the Lorentz invariants of a family with the mixed + contragredient index law: every element of the span of the components fixed by the + Lorentz group is a scalar multiple of the conjugate Pauli contraction of that family. + This is the kinetic term of a Weyl fermion. -/ +theorem exists_smul_pauliBarContraction_of_invariant + (hT : IsVectorDualLeftRightWeyl B repLorentz T) {x : B} (hx : x ∈ ⨆ d, ℂ ∙ T d) + (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : + ∃ a : ℂ, x = a • pauliBarContraction (T := T) := by + have hT' := hT.isVectorLeftRightWeyl_vectorEpsReindex + have hx' : x ∈ hT'.span := by + rw [IsVectorLeftRightWeyl.span, iSup_span_vectorEpsReindex] + exact hx + obtain ⟨a, ha⟩ := hT'.exists_smul_pauliContraction_of_invariant hx' hinv + exact ⟨a, by rwa [pauliContraction_vectorEpsReindex] at ha⟩ + +/-- The classification of the Lorentz invariants of a family with the mixed + contragredient index law, modulo a Lorentz-stable submodule `S`. -/ +theorem exists_smul_pauliBarContraction_of_invariant_subset + (hT : IsVectorDualLeftRightWeyl B repLorentz T) {x : B} (S : Submodule ℂ B) + (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) + (hx : x ∈ (⨆ d, ℂ ∙ T d) ⊔ S) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : + ∃ a : ℂ, ∃ y ∈ S, x = a • pauliBarContraction (T := T) + y := by + have hT' := hT.isVectorLeftRightWeyl_vectorEpsReindex + have hx' : x ∈ hT'.span ⊔ S := by + rw [IsVectorLeftRightWeyl.span, iSup_span_vectorEpsReindex] + exact hx + obtain ⟨a, y, hy, ha⟩ := + hT'.exists_smul_pauliContraction_of_invariant_subset S hS hx' hinv + exact ⟨a, y, hy, by rwa [pauliContraction_vectorEpsReindex] at ha⟩ + +end IsVectorDualLeftRightWeyl + +end DualClassification + +end Lorentz + From f7c6aa4bf36705849fa8d5c78d1bc5ddf9bf5656 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 2 Sep 2026 10:15:17 +0100 Subject: [PATCH 256/367] feat: Full remainder jet algebra argument --- Physlib.lean | 11 + .../Fermions/JetAlgebra/Species.lean | 559 ++++++++ .../GaugeJetAlgebra/GaugeAction.lean | 93 +- .../GaugeJetAlgebra/MassWeightPoly.lean | 241 ++++ .../JetAlgebra/FieldAlgebra.lean | 485 +++++++ .../StandardModel/JetAlgebra/Generators.lean | 598 +++++++++ .../JetAlgebra/IsStandardModel.lean | 1162 +++++++++++++++++ .../StandardModel/JetAlgebra/JetDeriv.lean | 93 +- .../JetAlgebra/MassWeightPoly.lean | 434 ++++++ .../Matter/BosonicAlgebra/MassWeightPoly.lean | 250 ++++ .../Matter/BosonicAlgebra/TransformsIn.lean | 185 +++ .../FermionicAlgebra/MassWeightPoly.lean | 352 +++++ .../Matter/FermionicAlgebra/TransformsIn.lean | 183 +++ .../JetComponentSpace/TransformsIn.lean | 232 ++++ Physlib/Relativity/DerivAlgebra.lean | 179 +++ Physlib/Relativity/JetRing/Basic.lean | 85 ++ 16 files changed, 5045 insertions(+), 97 deletions(-) create mode 100644 Physlib/Particles/StandardModel/Fermions/JetAlgebra/Species.lean create mode 100644 Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/MassWeightPoly.lean create mode 100644 Physlib/Particles/StandardModel/JetAlgebra/FieldAlgebra.lean create mode 100644 Physlib/Particles/StandardModel/JetAlgebra/Generators.lean create mode 100644 Physlib/Particles/StandardModel/JetAlgebra/IsStandardModel.lean create mode 100644 Physlib/Particles/StandardModel/JetAlgebra/MassWeightPoly.lean create mode 100644 Physlib/Particles/StandardModel/Matter/BosonicAlgebra/MassWeightPoly.lean create mode 100644 Physlib/Particles/StandardModel/Matter/BosonicAlgebra/TransformsIn.lean create mode 100644 Physlib/Particles/StandardModel/Matter/FermionicAlgebra/MassWeightPoly.lean create mode 100644 Physlib/Particles/StandardModel/Matter/FermionicAlgebra/TransformsIn.lean create mode 100644 Physlib/Particles/StandardModel/Matter/JetComponentSpace/TransformsIn.lean diff --git a/Physlib.lean b/Physlib.lean index 4a6a6e2ab..15c79d252 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -234,6 +234,7 @@ 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.JetAlgebra.Species public import Physlib.Particles.StandardModel.Fermions.LeptonDoublet public import Physlib.Particles.StandardModel.Fermions.LeptonDoublet.GaugeAlgebraAction public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.Basic @@ -256,6 +257,7 @@ 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.GaugeJetAlgebra.MassWeightPoly public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU2Adjoint public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU2AntiFundamental @@ -320,25 +322,34 @@ public import Physlib.Particles.StandardModel.IsHiggsSector.MassWeight.MassDimLT public import Physlib.Particles.StandardModel.IsStandardModel.CovStandardModel public import Physlib.Particles.StandardModel.IsStandardModel.MassWeight.Filtration public import Physlib.Particles.StandardModel.JetAlgebra.Basic +public import Physlib.Particles.StandardModel.JetAlgebra.FieldAlgebra public import Physlib.Particles.StandardModel.JetAlgebra.GaugeAction +public import Physlib.Particles.StandardModel.JetAlgebra.Generators public import Physlib.Particles.StandardModel.JetAlgebra.Invariants +public import Physlib.Particles.StandardModel.JetAlgebra.IsStandardModel 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.JetAlgebra.MassWeightPoly 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.MassWeightPoly public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.Prod +public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.TransformsIn 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.MassWeightPoly public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.Prod +public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.TransformsIn public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.Basic public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.CovariantDeriv +public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.TransformsIn public import Physlib.Particles.StandardModel.Peeling public import Physlib.Particles.StandardModel.Representations public import Physlib.Particles.SuperSymmetry.MSSMNu.AnomalyCancellation.B3 diff --git a/Physlib/Particles/StandardModel/Fermions/JetAlgebra/Species.lean b/Physlib/Particles/StandardModel/Fermions/JetAlgebra/Species.lean new file mode 100644 index 000000000..c75d140ce --- /dev/null +++ b/Physlib/Particles/StandardModel/Fermions/JetAlgebra/Species.lean @@ -0,0 +1,559 @@ +/- +Copyright (c) 2026 Joseph Tooby-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.JetAlgebra.Basic +public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.CovariantDeriv +/-! +# Species compatibility inside the fermionic target space + +## i. Overview + +The fermionic jet algebra is built on `FermionSpace`, the product of the five fermion +species; but each species carries its own Lorentz and jet gauge representation, and the +Standard Model obligations are stated against those. This file is the bridge between the +two levels. + +Everything rests on one fact: both actions on `FermionSpace` are species-diagonal — the +jet gauge action through `FermionSpace.jetActionMap`, the Lorentz action through +`Representation.pi` and `Representation.prod`. So each projection +`FermionSpace →ₗ[ℂ] Species` intertwines the total action with the species' own, and hence +also the base-point Taylor coefficients `IsGaugeField.repCoeff` of the two. + +The third bridge runs the other way. Component functions are covectors, and a covector on +the species pulls back along the projection to a covector on `FermionSpace`; since +`FermionSpace` is a finite product, the identity is the sum over species and generations of +inclusion after projection, so every covector is a sum of pulled-back ones. The pulled-back +covectors therefore span, which is what lets an adjoin over the species covectors reach an +adjoin over all of them. + +## ii. Key results + +- `StandardModel.repCoeff_comp` : naturality of the base-point Taylor coefficients along a + map of value spaces intertwining the two jet gauge actions. +- `FermionSpace.leptonDoubletProj_comp_repCoeff`, … : the gauge compatibility of the five + species. +- `FermionSpace.leptonDoubletProj_comp_repLorentzGroup`, … : the Lorentz compatibility. +- `FermionSpace.span_speciesDual_eq_top`, `span_speciesConjDual_eq_top` : the covectors + pulled back from the species span every covector. + +## iii. Table of contents + +- A. Naturality of the value-space jet toolkit + - A.1. The pieces of `repCoeff` + - A.2. Naturality of `repCoeff` and `repDualCoeff` +- B. The jet gauge action is species-diagonal + - B.1. The species components of the splitting of the jets + - B.2. The projections intertwine the jet gauge actions + - B.3. The species compatibility of `repCoeff` +- C. The Lorentz action is species-diagonal +- D. Covectors pulled back from the species + - D.1. The decomposition of the identity + - D.2. Covectors + - D.3. Conjugate covectors + +-/ + +@[expose] public section + +set_option maxHeartbeats 1000000 +set_option synthInstance.maxHeartbeats 400000 +set_option maxRecDepth 4000 + +namespace StandardModel + +open TensorProduct Matrix MatrixGroups + +variable {V W : Type} [AddCommGroup V] [Module ℂ V] [AddCommGroup W] [Module ℂ W] + +/-! + +## A. Naturality of the value-space jet toolkit + +-/ + +/-! + +### A.1. The pieces of `repCoeff` + +-/ + +/-- Including a constant into value-space jets is natural in the value space. -/ +lemma lTensor_comp_jetOfConstant (p : V →ₗ[ℂ] W) : + (LinearMap.lTensor JetRing p).comp jetOfConstant = jetOfConstant.comp p := + LinearMap.ext fun _ => rfl + +/-- The formal derivative on value-space jets is natural in the value space: it touches + only the jet factor. -/ +lemma lTensor_comp_jetDeriv (p : V →ₗ[ℂ] W) (μ : Fin 1 ⊕ Fin 3) : + (LinearMap.lTensor JetRing p).comp (jetDeriv μ) + = (jetDeriv μ).comp (LinearMap.lTensor JetRing p) := + TensorProduct.ext' fun _ _ => rfl + +/-- The iterated formal derivative on value-space jets is natural in the value space. -/ +lemma lTensor_comp_jetIteratedDeriv (p : V →ₗ[ℂ] W) (s : Multiset (Fin 1 ⊕ Fin 3)) : + (LinearMap.lTensor JetRing p).comp (jetIteratedDeriv s) + = (jetIteratedDeriv s).comp (LinearMap.lTensor JetRing p) := by + induction s using Multiset.induction_on with + | empty => + rw [jetIteratedDeriv_zero, LinearMap.comp_id, jetIteratedDeriv_zero, + LinearMap.id_comp] + | cons μ s ih => + rw [jetIteratedDeriv_cons, jetIteratedDeriv_cons, ← LinearMap.comp_assoc, + lTensor_comp_jetDeriv, LinearMap.comp_assoc, ih, ← LinearMap.comp_assoc] + +/-- Evaluation of a value-space jet at the base point is natural in the value space. -/ +lemma jetEval_comp_lTensor (p : V →ₗ[ℂ] W) : + (jetEval (V := W)).comp (LinearMap.lTensor JetRing p) = p.comp jetEval := + TensorProduct.ext' fun f v => by + rw [LinearMap.comp_apply, LinearMap.lTensor_tmul, jetEval_tmul, LinearMap.comp_apply, + jetEval_tmul, map_smul] + +/-! + +### A.2. Naturality of `repCoeff` and `repDualCoeff` + +-/ + +/-- The base-point Taylor coefficients of two jet gauge actions are intertwined by any map + of value spaces intertwining the actions themselves: `repCoeff` is built from + `jetOfConstant`, `jetIteratedDeriv` and `jetEval`, and each of those is natural. -/ +lemma repCoeff_comp {repV : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)} + {repW : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] W)} (p : V →ₗ[ℂ] W) + (hp : ∀ U : JetGaugeGroupI, (LinearMap.lTensor JetRing p).comp (repV U) + = (repW U).comp (LinearMap.lTensor JetRing p)) + (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) : + p.comp (IsGaugeField.repCoeff repV U s) + = (IsGaugeField.repCoeff repW U s).comp p := by + refine LinearMap.ext fun v => ?_ + have h1 := LinearMap.congr_fun (lTensor_comp_jetOfConstant p) v + have h2 := LinearMap.congr_fun (hp U) (jetOfConstant v) + have h3 := LinearMap.congr_fun (lTensor_comp_jetIteratedDeriv p s) + (repV U (jetOfConstant v)) + have h4 := LinearMap.congr_fun (jetEval_comp_lTensor p) + (jetIteratedDeriv s (repV U (jetOfConstant v))) + simp only [LinearMap.comp_apply] at h1 h2 h3 h4 ⊢ + simp only [IsGaugeField.repCoeff, LinearMap.comp_apply] + rw [← h4, h3, h2, h1] + +/-- The transposed form of `repCoeff_comp`: the dual coefficients, which act on the + component-function index, are intertwined the other way round. -/ +lemma repDualCoeff_comp {repV : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)} + {repW : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] W)} (p : V →ₗ[ℂ] W) + (hp : ∀ U : JetGaugeGroupI, (LinearMap.lTensor JetRing p).comp (repV U) + = (repW U).comp (LinearMap.lTensor JetRing p)) + (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) : + (IsGaugeField.repDualCoeff repV U s).comp (Module.Dual.transpose p) + = (Module.Dual.transpose p).comp (IsGaugeField.repDualCoeff repW U s) := + LinearMap.ext fun φ => LinearMap.ext fun v => + congrArg φ (LinearMap.congr_fun (repCoeff_comp p hp U s) v) + +/-! + +## B. The jet gauge action is species-diagonal + +-/ + +namespace FermionSpace + +/-! + +### B.1. The species components of the splitting of the jets + +The splitting `FermionSpace.jetEquiv` of the jets of the total fermionic field is, in each +species-and-generation slot, nothing but the projection applied to the value factor. + +-/ + +/-- The lepton-doublet slot of the splitting of the jets is the projection on the value + factor. -/ +lemma jetEquiv_leptonDoublet (i : Fin 3) (z : JetRing ⊗[ℂ] FermionSpace) : + (jetEquiv z).1 i = LinearMap.lTensor JetRing (leptonDoubletProj i) z := by + induction z using TensorProduct.induction_on with + | zero => simp + | add x y hx hy => simp [hx, hy] + | tmul f v => rfl + +/-- The charged-lepton-singlet slot of the splitting of the jets is the projection on the value + factor. -/ +lemma jetEquiv_leptonSinglet (i : Fin 3) (z : JetRing ⊗[ℂ] FermionSpace) : + (jetEquiv z).2.1 i = LinearMap.lTensor JetRing (leptonSingletProj i) z := by + induction z using TensorProduct.induction_on with + | zero => simp + | add x y hx hy => simp [hx, hy] + | tmul f v => rfl + +/-- The quark-doublet slot of the splitting of the jets is the projection on the value + factor. -/ +lemma jetEquiv_quarkDoublet (i : Fin 3) (z : JetRing ⊗[ℂ] FermionSpace) : + (jetEquiv z).2.2.1 i = LinearMap.lTensor JetRing (quarkDoubletProj i) z := by + induction z using TensorProduct.induction_on with + | zero => simp + | add x y hx hy => simp [hx, hy] + | tmul f v => rfl + +/-- The up-type-quark-singlet slot of the splitting of the jets is the projection on the value + factor. -/ +lemma jetEquiv_upSinglet (i : Fin 3) (z : JetRing ⊗[ℂ] FermionSpace) : + (jetEquiv z).2.2.2.1 i = LinearMap.lTensor JetRing (upSingletProj i) z := by + induction z using TensorProduct.induction_on with + | zero => simp + | add x y hx hy => simp [hx, hy] + | tmul f v => rfl + +/-- The down-type-quark-singlet slot of the splitting of the jets is the projection on the value + factor. -/ +lemma jetEquiv_downSinglet (i : Fin 3) (z : JetRing ⊗[ℂ] FermionSpace) : + (jetEquiv z).2.2.2.2 i = LinearMap.lTensor JetRing (downSingletProj i) z := by + induction z using TensorProduct.induction_on with + | zero => simp + | add x y hx hy => simp [hx, hy] + | tmul f v => rfl + +/-! + +### B.2. The projections intertwine the jet gauge actions + +`FermionSpace.jetActionMap` is a product of the species actions, slot by slot, so through +the splitting of B.1 each projection carries the total jet gauge action to the species' +own. + +-/ + +/-- The lepton-doublet projection intertwines the total jet gauge action with the + lepton doublet's own. -/ +lemma lTensor_leptonDoubletProj_repJetGaugeGroupI (i : Fin 3) (U : JetGaugeGroupI) : + (LinearMap.lTensor JetRing (leptonDoubletProj i)).comp (repJetGaugeGroupI U) + = (LeptonDoublet.repJetGaugeGroupI U).comp + (LinearMap.lTensor JetRing (leptonDoubletProj i)) := by + refine LinearMap.ext fun z => ?_ + have hz : jetEquiv (repJetGaugeGroupI U z) = jetActionMap U (jetEquiv z) := by + show (jetEquiv.restrictScalars ℂ) ((jetEquiv.restrictScalars ℂ).symm + (jetActionMap U ((jetEquiv.restrictScalars ℂ) z))) + = jetActionMap U (jetEquiv z) + rw [(jetEquiv.restrictScalars ℂ).apply_symm_apply] + rfl + rw [LinearMap.comp_apply, LinearMap.comp_apply, ← jetEquiv_leptonDoublet, + ← jetEquiv_leptonDoublet, hz] + rfl + +/-- The charged-lepton-singlet projection intertwines the total jet gauge action with the + charged-lepton singlet's own. -/ +lemma lTensor_leptonSingletProj_repJetGaugeGroupI (i : Fin 3) (U : JetGaugeGroupI) : + (LinearMap.lTensor JetRing (leptonSingletProj i)).comp (repJetGaugeGroupI U) + = (LeptonSinglet.repJetGaugeGroupI U).comp + (LinearMap.lTensor JetRing (leptonSingletProj i)) := by + refine LinearMap.ext fun z => ?_ + have hz : jetEquiv (repJetGaugeGroupI U z) = jetActionMap U (jetEquiv z) := by + show (jetEquiv.restrictScalars ℂ) ((jetEquiv.restrictScalars ℂ).symm + (jetActionMap U ((jetEquiv.restrictScalars ℂ) z))) + = jetActionMap U (jetEquiv z) + rw [(jetEquiv.restrictScalars ℂ).apply_symm_apply] + rfl + rw [LinearMap.comp_apply, LinearMap.comp_apply, ← jetEquiv_leptonSinglet, + ← jetEquiv_leptonSinglet, hz] + rfl + +/-- The quark-doublet projection intertwines the total jet gauge action with the + quark doublet's own. -/ +lemma lTensor_quarkDoubletProj_repJetGaugeGroupI (i : Fin 3) (U : JetGaugeGroupI) : + (LinearMap.lTensor JetRing (quarkDoubletProj i)).comp (repJetGaugeGroupI U) + = (QuarkDoublet.repJetGaugeGroupI U).comp + (LinearMap.lTensor JetRing (quarkDoubletProj i)) := by + refine LinearMap.ext fun z => ?_ + have hz : jetEquiv (repJetGaugeGroupI U z) = jetActionMap U (jetEquiv z) := by + show (jetEquiv.restrictScalars ℂ) ((jetEquiv.restrictScalars ℂ).symm + (jetActionMap U ((jetEquiv.restrictScalars ℂ) z))) + = jetActionMap U (jetEquiv z) + rw [(jetEquiv.restrictScalars ℂ).apply_symm_apply] + rfl + rw [LinearMap.comp_apply, LinearMap.comp_apply, ← jetEquiv_quarkDoublet, + ← jetEquiv_quarkDoublet, hz] + rfl + +/-- The up-type-quark-singlet projection intertwines the total jet gauge action with the + up-type quark singlet's own. -/ +lemma lTensor_upSingletProj_repJetGaugeGroupI (i : Fin 3) (U : JetGaugeGroupI) : + (LinearMap.lTensor JetRing (upSingletProj i)).comp (repJetGaugeGroupI U) + = (UpSinglet.repJetGaugeGroupI U).comp + (LinearMap.lTensor JetRing (upSingletProj i)) := by + refine LinearMap.ext fun z => ?_ + have hz : jetEquiv (repJetGaugeGroupI U z) = jetActionMap U (jetEquiv z) := by + show (jetEquiv.restrictScalars ℂ) ((jetEquiv.restrictScalars ℂ).symm + (jetActionMap U ((jetEquiv.restrictScalars ℂ) z))) + = jetActionMap U (jetEquiv z) + rw [(jetEquiv.restrictScalars ℂ).apply_symm_apply] + rfl + rw [LinearMap.comp_apply, LinearMap.comp_apply, ← jetEquiv_upSinglet, + ← jetEquiv_upSinglet, hz] + rfl + +/-- The down-type-quark-singlet projection intertwines the total jet gauge action with the + down-type quark singlet's own. -/ +lemma lTensor_downSingletProj_repJetGaugeGroupI (i : Fin 3) (U : JetGaugeGroupI) : + (LinearMap.lTensor JetRing (downSingletProj i)).comp (repJetGaugeGroupI U) + = (DownSinglet.repJetGaugeGroupI U).comp + (LinearMap.lTensor JetRing (downSingletProj i)) := by + refine LinearMap.ext fun z => ?_ + have hz : jetEquiv (repJetGaugeGroupI U z) = jetActionMap U (jetEquiv z) := by + show (jetEquiv.restrictScalars ℂ) ((jetEquiv.restrictScalars ℂ).symm + (jetActionMap U ((jetEquiv.restrictScalars ℂ) z))) + = jetActionMap U (jetEquiv z) + rw [(jetEquiv.restrictScalars ℂ).apply_symm_apply] + rfl + rw [LinearMap.comp_apply, LinearMap.comp_apply, ← jetEquiv_downSinglet, + ← jetEquiv_downSinglet, hz] + rfl + +/-! + +### B.3. The species compatibility of `repCoeff` + +-/ + +/-- The lepton-doublet projection intertwines the base-point Taylor coefficients of + the total jet gauge action with those of the lepton doublet's own. -/ +lemma leptonDoubletProj_comp_repCoeff (i : Fin 3) (U : JetGaugeGroupI) + (s : Multiset (Fin 1 ⊕ Fin 3)) : + (leptonDoubletProj i).comp (IsGaugeField.repCoeff repJetGaugeGroupI U s) + = (IsGaugeField.repCoeff LeptonDoublet.repJetGaugeGroupI U s).comp (leptonDoubletProj i) := + repCoeff_comp _ (lTensor_leptonDoubletProj_repJetGaugeGroupI i) U s + +/-- The charged-lepton-singlet projection intertwines the base-point Taylor coefficients of + the total jet gauge action with those of the charged-lepton singlet's own. -/ +lemma leptonSingletProj_comp_repCoeff (i : Fin 3) (U : JetGaugeGroupI) + (s : Multiset (Fin 1 ⊕ Fin 3)) : + (leptonSingletProj i).comp (IsGaugeField.repCoeff repJetGaugeGroupI U s) + = (IsGaugeField.repCoeff LeptonSinglet.repJetGaugeGroupI U s).comp (leptonSingletProj i) := + repCoeff_comp _ (lTensor_leptonSingletProj_repJetGaugeGroupI i) U s + +/-- The quark-doublet projection intertwines the base-point Taylor coefficients of + the total jet gauge action with those of the quark doublet's own. -/ +lemma quarkDoubletProj_comp_repCoeff (i : Fin 3) (U : JetGaugeGroupI) + (s : Multiset (Fin 1 ⊕ Fin 3)) : + (quarkDoubletProj i).comp (IsGaugeField.repCoeff repJetGaugeGroupI U s) + = (IsGaugeField.repCoeff QuarkDoublet.repJetGaugeGroupI U s).comp (quarkDoubletProj i) := + repCoeff_comp _ (lTensor_quarkDoubletProj_repJetGaugeGroupI i) U s + +/-- The up-type-quark-singlet projection intertwines the base-point Taylor coefficients of + the total jet gauge action with those of the up-type quark singlet's own. -/ +lemma upSingletProj_comp_repCoeff (i : Fin 3) (U : JetGaugeGroupI) + (s : Multiset (Fin 1 ⊕ Fin 3)) : + (upSingletProj i).comp (IsGaugeField.repCoeff repJetGaugeGroupI U s) + = (IsGaugeField.repCoeff UpSinglet.repJetGaugeGroupI U s).comp (upSingletProj i) := + repCoeff_comp _ (lTensor_upSingletProj_repJetGaugeGroupI i) U s + +/-- The down-type-quark-singlet projection intertwines the base-point Taylor coefficients of + the total jet gauge action with those of the down-type quark singlet's own. -/ +lemma downSingletProj_comp_repCoeff (i : Fin 3) (U : JetGaugeGroupI) + (s : Multiset (Fin 1 ⊕ Fin 3)) : + (downSingletProj i).comp (IsGaugeField.repCoeff repJetGaugeGroupI U s) + = (IsGaugeField.repCoeff DownSinglet.repJetGaugeGroupI U s).comp (downSingletProj i) := + repCoeff_comp _ (lTensor_downSingletProj_repJetGaugeGroupI i) U s + +/-! + +## C. The Lorentz action is species-diagonal + +`FermionSpace.repLorentzGroup` is a `Representation.prod` of `Representation.pi`s of the +species representations, so each projection intertwines it with the species' own Lorentz +action on the nose. + +-/ + +/-- The lepton-doublet projection intertwines the total Lorentz action with the + lepton doublet's own. -/ +lemma leptonDoubletProj_comp_repLorentzGroup (i : Fin 3) (Λ : SL(2,ℂ)) : + (leptonDoubletProj i).comp (repLorentzGroup Λ) + = (LeptonDoublet.repLorentzGroup Λ).comp (leptonDoubletProj i) := rfl + +/-- The charged-lepton-singlet projection intertwines the total Lorentz action with the + charged-lepton singlet's own. -/ +lemma leptonSingletProj_comp_repLorentzGroup (i : Fin 3) (Λ : SL(2,ℂ)) : + (leptonSingletProj i).comp (repLorentzGroup Λ) + = (LeptonSinglet.repLorentzGroup Λ).comp (leptonSingletProj i) := rfl + +/-- The quark-doublet projection intertwines the total Lorentz action with the + quark doublet's own. -/ +lemma quarkDoubletProj_comp_repLorentzGroup (i : Fin 3) (Λ : SL(2,ℂ)) : + (quarkDoubletProj i).comp (repLorentzGroup Λ) + = (QuarkDoublet.repLorentzGroup Λ).comp (quarkDoubletProj i) := rfl + +/-- The up-type-quark-singlet projection intertwines the total Lorentz action with the + up-type quark singlet's own. -/ +lemma upSingletProj_comp_repLorentzGroup (i : Fin 3) (Λ : SL(2,ℂ)) : + (upSingletProj i).comp (repLorentzGroup Λ) + = (UpSinglet.repLorentzGroup Λ).comp (upSingletProj i) := rfl + +/-- The down-type-quark-singlet projection intertwines the total Lorentz action with the + down-type quark singlet's own. -/ +lemma downSingletProj_comp_repLorentzGroup (i : Fin 3) (Λ : SL(2,ℂ)) : + (downSingletProj i).comp (repLorentzGroup Λ) + = (DownSinglet.repLorentzGroup Λ).comp (downSingletProj i) := rfl + +/-! + +## D. Covectors pulled back from the species + +-/ + +/-! + +### D.1. The decomposition of the identity + +-/ + +/-- The identity on the total fermionic target space is the sum, over the five species and + the three generations, of the inclusion after the projection. -/ +lemma sum_incl_proj (v : FermionSpace) : + (∑ i, leptonDoubletIncl i (leptonDoubletProj i v)) + + (∑ i, leptonSingletIncl i (leptonSingletProj i v)) + + (∑ i, quarkDoubletIncl i (quarkDoubletProj i v)) + + (∑ i, upSingletIncl i (upSingletProj i v)) + + (∑ i, downSingletIncl i (downSingletProj i v)) = v := by + refine Prod.ext ?_ (Prod.ext ?_ (Prod.ext ?_ (Prod.ext ?_ ?_))) <;> + · funext j + simp [leptonDoubletIncl, leptonSingletIncl, quarkDoubletIncl, upSingletIncl, + downSingletIncl, leptonDoubletProj, leptonSingletProj, quarkDoubletProj, + upSingletProj, downSingletProj, Prod.fst_sum, Prod.snd_sum, Finset.sum_apply, + Pi.single_apply] + +/-- The conjugate form of `sum_incl_proj`: conjugation leaves the underlying additive + group and the underlying maps alone. -/ +lemma sum_conj_incl_proj (v : ConjModule FermionSpace) : + (∑ i, ConjModule.map (leptonDoubletIncl i) + (ConjModule.map (leptonDoubletProj i) v)) + + (∑ i, ConjModule.map (leptonSingletIncl i) + (ConjModule.map (leptonSingletProj i) v)) + + (∑ i, ConjModule.map (quarkDoubletIncl i) + (ConjModule.map (quarkDoubletProj i) v)) + + (∑ i, ConjModule.map (upSingletIncl i) + (ConjModule.map (upSingletProj i) v)) + + (∑ i, ConjModule.map (downSingletIncl i) + (ConjModule.map (downSingletProj i) v)) = v := + sum_incl_proj v + +/-! + +### D.2. Covectors + +-/ + +/-- Every covector on the total fermionic target space is the sum, over the five species + and the three generations, of its restriction to that species and generation pulled back + along the corresponding projection. -/ +lemma dual_eq_sum (φ : Module.Dual ℂ FermionSpace) : + φ = (∑ i, Module.Dual.transpose (leptonDoubletProj i) + (Module.Dual.transpose (leptonDoubletIncl i) φ)) + + (∑ i, Module.Dual.transpose (leptonSingletProj i) + (Module.Dual.transpose (leptonSingletIncl i) φ)) + + (∑ i, Module.Dual.transpose (quarkDoubletProj i) + (Module.Dual.transpose (quarkDoubletIncl i) φ)) + + (∑ i, Module.Dual.transpose (upSingletProj i) + (Module.Dual.transpose (upSingletIncl i) φ)) + + (∑ i, Module.Dual.transpose (downSingletProj i) + (Module.Dual.transpose (downSingletIncl i) φ)) := by + refine LinearMap.ext fun v => ?_ + have h := congrArg φ (sum_incl_proj v) + simp only [map_add, map_sum] at h + simp only [LinearMap.add_apply, LinearMap.sum_apply] + exact h.symm + +/-- The covectors on the total fermionic target space that are pulled back from a single + species and generation. -/ +def speciesDual : Set (Module.Dual ℂ FermionSpace) := + {φ | (∃ (i : Fin 3) (ψ : Module.Dual ℂ LeptonDoublet), + φ = Module.Dual.transpose (leptonDoubletProj i) ψ) + ∨ (∃ (i : Fin 3) (ψ : Module.Dual ℂ LeptonSinglet), + φ = Module.Dual.transpose (leptonSingletProj i) ψ) + ∨ (∃ (i : Fin 3) (ψ : Module.Dual ℂ QuarkDoublet), + φ = Module.Dual.transpose (quarkDoubletProj i) ψ) + ∨ (∃ (i : Fin 3) (ψ : Module.Dual ℂ UpSinglet), + φ = Module.Dual.transpose (upSingletProj i) ψ) + ∨ (∃ (i : Fin 3) (ψ : Module.Dual ℂ DownSinglet), + φ = Module.Dual.transpose (downSingletProj i) ψ)} + +/-- The covectors pulled back from the individual species and generations span every + covector on the total fermionic target space. This is what lets an adjoin taken over the + species covectors reach an adjoin taken over all of them. -/ +lemma span_speciesDual_eq_top : Submodule.span ℂ speciesDual = ⊤ := by + refine Submodule.eq_top_iff'.mpr fun φ => ?_ + rw [dual_eq_sum φ] + refine Submodule.add_mem _ (Submodule.add_mem _ (Submodule.add_mem _ + (Submodule.add_mem _ ?_ ?_) ?_) ?_) ?_ + · exact Submodule.sum_mem _ fun i _ => + Submodule.subset_span (Or.inl ⟨i, _, rfl⟩) + · exact Submodule.sum_mem _ fun i _ => + Submodule.subset_span (Or.inr (Or.inl ⟨i, _, rfl⟩)) + · exact Submodule.sum_mem _ fun i _ => + Submodule.subset_span (Or.inr (Or.inr (Or.inl ⟨i, _, rfl⟩))) + · exact Submodule.sum_mem _ fun i _ => + Submodule.subset_span (Or.inr (Or.inr (Or.inr (Or.inl ⟨i, _, rfl⟩)))) + · exact Submodule.sum_mem _ fun i _ => + Submodule.subset_span (Or.inr (Or.inr (Or.inr (Or.inr ⟨i, _, rfl⟩)))) + +/-! + +### D.3. Conjugate covectors + +-/ + +/-- The conjugate form of `dual_eq_sum`: every covector on the conjugate of the total + fermionic target space is the sum of the covectors pulled back from the species and + generations. -/ +lemma conjDual_eq_sum (φ : Module.Dual ℂ (ConjModule FermionSpace)) : + φ = (∑ i, Module.Dual.transpose (ConjModule.map (leptonDoubletProj i)) + (Module.Dual.transpose (ConjModule.map (leptonDoubletIncl i)) φ)) + + (∑ i, Module.Dual.transpose (ConjModule.map (leptonSingletProj i)) + (Module.Dual.transpose (ConjModule.map (leptonSingletIncl i)) φ)) + + (∑ i, Module.Dual.transpose (ConjModule.map (quarkDoubletProj i)) + (Module.Dual.transpose (ConjModule.map (quarkDoubletIncl i)) φ)) + + (∑ i, Module.Dual.transpose (ConjModule.map (upSingletProj i)) + (Module.Dual.transpose (ConjModule.map (upSingletIncl i)) φ)) + + (∑ i, Module.Dual.transpose (ConjModule.map (downSingletProj i)) + (Module.Dual.transpose (ConjModule.map (downSingletIncl i)) φ)) := by + refine LinearMap.ext fun v => ?_ + have h := congrArg φ (sum_conj_incl_proj v) + simp only [map_add, map_sum] at h + simp only [LinearMap.add_apply, LinearMap.sum_apply] + exact h.symm + +/-- The covectors on the conjugate of the total fermionic target space that are pulled + back from a single species and generation. -/ +def speciesConjDual : Set (Module.Dual ℂ (ConjModule FermionSpace)) := + {φ | (∃ (i : Fin 3) (ψ : Module.Dual ℂ (ConjModule LeptonDoublet)), + φ = Module.Dual.transpose (ConjModule.map (leptonDoubletProj i)) ψ) + ∨ (∃ (i : Fin 3) (ψ : Module.Dual ℂ (ConjModule LeptonSinglet)), + φ = Module.Dual.transpose (ConjModule.map (leptonSingletProj i)) ψ) + ∨ (∃ (i : Fin 3) (ψ : Module.Dual ℂ (ConjModule QuarkDoublet)), + φ = Module.Dual.transpose (ConjModule.map (quarkDoubletProj i)) ψ) + ∨ (∃ (i : Fin 3) (ψ : Module.Dual ℂ (ConjModule UpSinglet)), + φ = Module.Dual.transpose (ConjModule.map (upSingletProj i)) ψ) + ∨ (∃ (i : Fin 3) (ψ : Module.Dual ℂ (ConjModule DownSinglet)), + φ = Module.Dual.transpose (ConjModule.map (downSingletProj i)) ψ)} + +/-- The conjugate covectors pulled back from the individual species and generations span + every covector on the conjugate of the total fermionic target space. -/ +lemma span_speciesConjDual_eq_top : Submodule.span ℂ speciesConjDual = ⊤ := by + refine Submodule.eq_top_iff'.mpr fun φ => ?_ + rw [conjDual_eq_sum φ] + refine Submodule.add_mem _ (Submodule.add_mem _ (Submodule.add_mem _ + (Submodule.add_mem _ ?_ ?_) ?_) ?_) ?_ + · exact Submodule.sum_mem _ fun i _ => + Submodule.subset_span (Or.inl ⟨i, _, rfl⟩) + · exact Submodule.sum_mem _ fun i _ => + Submodule.subset_span (Or.inr (Or.inl ⟨i, _, rfl⟩)) + · exact Submodule.sum_mem _ fun i _ => + Submodule.subset_span (Or.inr (Or.inr (Or.inl ⟨i, _, rfl⟩))) + · exact Submodule.sum_mem _ fun i _ => + Submodule.subset_span (Or.inr (Or.inr (Or.inr (Or.inl ⟨i, _, rfl⟩)))) + · exact Submodule.sum_mem _ fun i _ => + Submodule.subset_span (Or.inr (Or.inr (Or.inr (Or.inr ⟨i, _, rfl⟩)))) + +end FermionSpace + +end StandardModel + diff --git a/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/GaugeAction.lean b/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/GaugeAction.lean index 3bb1418f6..271629b63 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/GaugeAction.lean +++ b/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/GaugeAction.lean @@ -43,8 +43,7 @@ cocycle identity for the Maurer–Cartan shift are both corollaries. ## 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 + - A.1. 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 @@ -72,95 +71,7 @@ open TensorProduct MvPowerSeries /-! -### 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 +### A.1. The matrix Leibniz rule at the base point -/ diff --git a/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/MassWeightPoly.lean b/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/MassWeightPoly.lean new file mode 100644 index 000000000..c66cb9fd0 --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/MassWeightPoly.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.GaugeBosons.GaugeJetAlgebra.MassDim +/-! +# The mass-weight polynomial on the gauge-boson jet algebra + +## i. Overview + +The mass-weight scaling of +`Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.MassDim` records the mass +dimension of a homogeneous element in a scalar. Replacing that scalar by a formal variable +turns the scaling into a grading: the generator `∂_s A_μ^φ` is sent to `X ^ (2 + 2 |s|)` +times itself, the gauge field carrying mass weight two and each derivative two more. + +The gauge-boson jet algebra is real, but the jet algebra of the Standard Model uses its +complexification `ℂ ⊗[ℝ] GaugeJetAlgebra`. So the grading is built in two steps: the +universal property of the symmetric algebra gives a real algebra map landing in +`Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra)` — a commutative target, so there is no side +condition — and the universal property of the tensor product extends it along the scalars +to `complexMassWeightPoly`, which is what the ambient theory sees. + +## ii. Key results + +- `GaugeJetAlgebra.massWeightPoly` : the mass-weight grading on the real jet algebra. +- `GaugeJetAlgebra.massWeightPoly_iteratedJetDeriv_ofA` : `∂_s A_μ^φ` is a monomial + eigenvector of weight `2 + 2 |s|`. +- `GaugeJetAlgebra.complexMassWeightPoly` : the grading on the complexification. +- `GaugeJetAlgebra.complexMassWeightPoly_tmul_iteratedJetDeriv_ofA` : the generator lemma + on the complexification. +- `GaugeJetAlgebra.complexMassWeightPoly_eval_one` : setting the variable to one recovers + the element. + +## iii. Table of contents + +- A. The mass-weight polynomial of a component function +- B. The mass-weight polynomial on the real jet algebra +- C. The mass-weight polynomial on the complexification +- D. Recovering an element from its mass-weight polynomial + +-/ + +@[expose] public section + +namespace StandardModel + +namespace GaugeJetAlgebra + +open TensorProduct + +/-! + +## A. The mass-weight polynomial of a component function + +-/ + +/-- The monomial map into polynomials over the complexified jet algebra, as a map of + `ℝ`-modules rather than of `ℂ ⊗[ℝ] GaugeJetAlgebra`-modules. -/ +noncomputable def monomialₗ (n : ℕ) : + (ℂ ⊗[ℝ] GaugeJetAlgebra) →ₗ[ℝ] Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra) := + (Polynomial.monomial n).restrictScalars ℝ + +@[simp] +lemma monomialₗ_apply (n : ℕ) (x : ℂ ⊗[ℝ] GaugeJetAlgebra) : + monomialₗ n x = Polynomial.monomial n x := rfl + +/-- A component function, viewed inside the complexified jet algebra: the generator + `∂_s A_μ^φ` tensored with the scalar one. -/ +noncomputable def ιComplex : + GaugeBoson.JetComponentSpace →ₗ[ℝ] ℂ ⊗[ℝ] GaugeJetAlgebra := + Algebra.TensorProduct.includeRight.toLinearMap.comp + (SymmetricAlgebra.ι ℝ GaugeBoson.JetComponentSpace) + +@[simp] +lemma ιComplex_apply (x : GaugeBoson.JetComponentSpace) : + ιComplex x = (1 : ℂ) ⊗ₜ[ℝ] SymmetricAlgebra.ι ℝ GaugeBoson.JetComponentSpace x := rfl + +/-- The mass-weight polynomial of a component function: the linear map sending the symbol + `∂_s A^φ` to `X ^ (2 + 2 |s|)` times itself, read off from the multiset basis of the real + derivative symbols. -/ +noncomputable def jetComponentPoly : + GaugeBoson.JetComponentSpace →ₗ[ℝ] Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra) := + TensorProduct.lift (DerivAlgebraReal.basisMultiset.constr ℝ fun s => + (monomialₗ (2 + 2 * Multiset.card s)).comp + (ιComplex.comp (TensorProduct.mk ℝ DerivAlgebraReal (Module.Dual ℝ GaugeBoson) + (DerivAlgebraReal.basisMultiset s)))) + +/-- On the symbol `∂_s A^φ` the component map is the monomial of degree `2 + 2 |s|`: the + gauge field contributes two and each derivative two more. -/ +lemma jetComponentPoly_basisMultiset_tmul (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℝ GaugeBoson) : + jetComponentPoly (DerivAlgebraReal.basisMultiset s ⊗ₜ[ℝ] φ) = + Polynomial.monomial (2 + 2 * Multiset.card s) + (ιComplex (DerivAlgebraReal.basisMultiset s ⊗ₜ[ℝ] φ)) := by + rw [jetComponentPoly, TensorProduct.lift.tmul, Module.Basis.constr_basis] + rfl + +/-! + +## B. The mass-weight polynomial on the real jet algebra + +-/ + +/-- The mass-weight polynomial on the gauge-boson jet algebra: the `ℝ`-algebra map sending + a generator of mass weight `n` to `X ^ n` times its image in the complexification. It is + `GaugeJetAlgebra.massWeightScale` with the scalar replaced by the formal variable `X`, and + needs no side condition because the target is commutative. -/ +noncomputable def massWeightPoly : + GaugeJetAlgebra →ₐ[ℝ] Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra) := by + exact SymmetricAlgebra.lift (R := ℝ) (M := GaugeBoson.JetComponentSpace) + (A := Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra)) jetComponentPoly + +/-- On a component function the mass-weight polynomial is the component-function map. -/ +@[simp] +lemma massWeightPoly_ι (x : GaugeBoson.JetComponentSpace) : + massWeightPoly (SymmetricAlgebra.ι ℝ GaugeBoson.JetComponentSpace x) = + jetComponentPoly x := by + rw [massWeightPoly, SymmetricAlgebra.lift_ι_apply] + +/-- The generator `∂_s A_μ^φ` is a monomial eigenvector of mass weight `2 + 2 |s|`. -/ +@[simp] +lemma massWeightPoly_iteratedJetDeriv_ofA (s : Multiset (Fin 1 ⊕ Fin 3)) + (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : + massWeightPoly (iteratedJetDeriv s (ofA μ φ)) = + Polynomial.monomial (2 + 2 * Multiset.card s) + ((1 : ℂ) ⊗ₜ[ℝ] iteratedJetDeriv s (ofA μ φ)) := by + rw [iteratedJetDeriv_ofA, massWeightPoly_ι, + show LagrangianTheory.dualRealJetAlgebraBasis s = DerivAlgebraReal.basisMultiset s from rfl, + jetComponentPoly_basisMultiset_tmul, ιComplex_apply] + +/-- The undifferentiated gauge field has mass weight two — mass dimension one. -/ +lemma massWeightPoly_ofA (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : + massWeightPoly (ofA μ φ) = Polynomial.monomial 2 ((1 : ℂ) ⊗ₜ[ℝ] ofA μ φ) := by + have h := massWeightPoly_iteratedJetDeriv_ofA (0 : Multiset (Fin 1 ⊕ Fin 3)) μ φ + rwa [iteratedJetDeriv_zero, LinearMap.id_apply, Multiset.card_zero, Nat.mul_zero, + Nat.add_zero] at h + +/-! + +## C. The mass-weight polynomial on the complexification + +-/ + +/-- The mass-weight polynomial on the complexified gauge-boson jet algebra: the `ℂ`-algebra + map obtained from the real one by extending the scalars, the grading the jet algebra of + the Standard Model sees on its gauge sector. -/ +noncomputable def complexMassWeightPoly : + (ℂ ⊗[ℝ] GaugeJetAlgebra) →ₐ[ℂ] Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra) := by + refine Algebra.TensorProduct.lift (R := ℝ) (S := ℂ) (A := ℂ) (B := GaugeJetAlgebra) + (C := Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra)) + (Algebra.ofId ℂ (Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra))) massWeightPoly ?_ + intro x y + exact Commute.all (S := Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra)) _ _ + +/-- On a pure tensor the complexified grading is the scalar times the real grading. -/ +lemma complexMassWeightPoly_tmul (z : ℂ) (x : GaugeJetAlgebra) : + complexMassWeightPoly (z ⊗ₜ[ℝ] x) = + Polynomial.C (z ⊗ₜ[ℝ] (1 : GaugeJetAlgebra)) * massWeightPoly x := by + rw [complexMassWeightPoly, Algebra.TensorProduct.lift_tmul] + congr 1 + +set_option maxHeartbeats 400000 in +/-- The generator `∂_s A_μ^φ` of the complexified jet algebra, with any complex coefficient, + is a monomial eigenvector of mass weight `2 + 2 |s|`. -/ +@[simp] +lemma complexMassWeightPoly_tmul_iteratedJetDeriv_ofA (z : ℂ) + (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : + complexMassWeightPoly (z ⊗ₜ[ℝ] iteratedJetDeriv s (ofA μ φ)) = + Polynomial.monomial (2 + 2 * Multiset.card s) + (z ⊗ₜ[ℝ] iteratedJetDeriv s (ofA μ φ)) := by + rw [complexMassWeightPoly_tmul, massWeightPoly_iteratedJetDeriv_ofA, + ← Polynomial.monomial_zero_left, Polynomial.monomial_mul_monomial, Nat.zero_add, + Algebra.TensorProduct.tmul_mul_tmul, mul_one, one_mul] + +/-! + +## D. Recovering an element from its mass-weight polynomial + +-/ + +/-- Setting the formal variable to one collapses the component map back to the component + function it graded. The derivative monomials span, so it is enough to check this on the + multiset basis. -/ +lemma jetComponentPoly_eval_one (x : GaugeBoson.JetComponentSpace) : + (jetComponentPoly x).eval 1 = ιComplex x := by + induction x using TensorProduct.induction_on with + | zero => rw [map_zero, Polynomial.eval_zero, map_zero] + | add a b ha hb => rw [map_add, Polynomial.eval_add, ha, hb, map_add] + | 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 + rw [jetComponentPoly_basisMultiset_tmul, Polynomial.eval_monomial, one_pow, mul_one] + | zero => rw [TensorProduct.zero_tmul, map_zero, Polynomial.eval_zero, map_zero] + | add b c _ _ hb hc => + rw [TensorProduct.add_tmul, map_add, Polynomial.eval_add, hb, hc, map_add] + | smul c b _ hb => + rw [← TensorProduct.smul_tmul', map_smul, Polynomial.eval_smul, hb, map_smul] + +set_option maxHeartbeats 400000 in +/-- Setting the formal variable to one recovers the original element, viewed in the + complexification. -/ +lemma massWeightPoly_eval_one (x : GaugeJetAlgebra) : + (massWeightPoly x).eval 1 = + Algebra.TensorProduct.includeRight (R := ℝ) (A := ℂ) (B := GaugeJetAlgebra) x := by + have h : (Polynomial.eval₂AlgHom (AlgHom.id ℝ (ℂ ⊗[ℝ] GaugeJetAlgebra)) 1 + fun b => Commute.one_right b).comp massWeightPoly = + (Algebra.TensorProduct.includeRight : + GaugeJetAlgebra →ₐ[ℝ] ℂ ⊗[ℝ] GaugeJetAlgebra) := by + refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun y => ?_) + simpa using jetComponentPoly_eval_one y + exact AlgHom.congr_fun h x + +/-- Setting the formal variable to one recovers the original element of the complexified + jet algebra: the mass-weight pieces sum back to it. -/ +lemma complexMassWeightPoly_eval_one (y : ℂ ⊗[ℝ] GaugeJetAlgebra) : + (complexMassWeightPoly y).eval 1 = y := by + induction y using TensorProduct.induction_on with + | zero => rw [map_zero, Polynomial.eval_zero] + | add a b ha hb => rw [map_add, Polynomial.eval_add, ha, hb] + | tmul z x => + rw [complexMassWeightPoly_tmul, Polynomial.eval_mul, Polynomial.eval_C, + massWeightPoly_eval_one, Algebra.TensorProduct.includeRight_apply, + Algebra.TensorProduct.tmul_mul_tmul, mul_one, one_mul] + +/-- The mass-weight polynomial on the complexification is injective: an element is + recovered from its graded pieces. -/ +lemma complexMassWeightPoly_injective : Function.Injective complexMassWeightPoly := by + intro x y h + rw [← complexMassWeightPoly_eval_one x, ← complexMassWeightPoly_eval_one y, h] + +end GaugeJetAlgebra + +end StandardModel diff --git a/Physlib/Particles/StandardModel/JetAlgebra/FieldAlgebra.lean b/Physlib/Particles/StandardModel/JetAlgebra/FieldAlgebra.lean new file mode 100644 index 000000000..dcfb4202b --- /dev/null +++ b/Physlib/Particles/StandardModel/JetAlgebra/FieldAlgebra.lean @@ -0,0 +1,485 @@ +/- +Copyright (c) 2026 Joseph Tooby-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.Generators +public import Physlib.Particles.StandardModel.Fermions.JetAlgebra.Species +/-! +# The field algebra of the Standard Model is everything + +## i. Overview + +The thirteen generator families of `JetAlgebra.Generators` — the gauge field, the Higgs and +its conjugate, and the five fermion species in three generations each with a conjugate — +generate the whole jet algebra of the Standard Model. Physically: every element of the +algebra in which a Standard Model Lagrangian lives is a polynomial in the fields and their +derivatives, because there is nothing else to write down. + +The set adjoined is `JetAlgebra.generators`, written to match the body of +`IsStandardModel.fieldAlgebra` verbatim, so that once the `IsStandardModel` instance on the +jet algebra exists the two are identified by `rfl`. + +The proof factors along the two tensor products. `Algebra.TensorProduct.adjoin_tmul_eq_top` +reduces the whole algebra to its pure tensors, and a pure tensor is the product of the +three sector inclusions applied to its factors; so it is enough that each sector inclusion +lands in the adjoined algebra. Each of those is the sector's own generation theorem — +`FermionicAlgebra.adjoin_iteratedJetDeriv_eq_top`, its bosonic counterpart, and +`GaugeJetAlgebra.adjoin_iteratedJetDeriv_eq_top` — pushed through the inclusion. + +Two things do not come for free. The fermion families are indexed by covectors on the +*individual species*, while the fermionic generation theorem produces every covector on the +total target space `FermionSpace`; the gap is closed by +`FermionSpace.span_speciesDual_eq_top`, which says the pulled-back covectors span. And the +gauge sector's generation theorem is a statement over `ℝ` about `GaugeJetAlgebra`, whereas +the gauge tensor factor is the complexification `ℂ ⊗[ℝ] GaugeJetAlgebra`; the extra complex +scalar is supplied by the algebra map, since `z ⊗ₜ x = (z ⊗ₜ 1) * (1 ⊗ₜ x)` and the first +factor is the image of `z` under `algebraMap`. + +## ii. Key results + +- `JetAlgebra.generators` : the derivative symbols of every field of the Standard Model. +- `JetAlgebra.adjoin_generators_eq_top` : they generate the whole jet algebra. + +## iii. Table of contents + +- A. The generating set + - A.1. Membership of the generating set +- B. The three sectors lie in the generated algebra + - B.1. Adjoining through an algebra map + - B.2. The Higgs sector + - B.3. The fermionic sector + - B.4. The gauge sector +- C. The generation theorem + +-/ + +@[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 generating set + +-/ + +/-- The derivative symbols of every field of the Standard Model: the gauge field, the Higgs + and its conjugate, and the three generations of each of the five fermion species with + their conjugates. The set is written in exactly the shape of the body of + `IsStandardModel.fieldAlgebra`, so that the field algebra of the eventual + `IsStandardModel` instance on the jet algebra is this set adjoined. -/ +noncomputable def generators : Set JetAlgebra := + (⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (gaugeField s μ)) ∪ + (⋃ (s : Multiset (Fin 1 ⊕ Fin 3)), + Set.range (higgsField s) ∪ Set.range (conjHiggsField s)) ∪ + (⋃ (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)), + Set.range (downSingletField i s) ∪ Set.range (conjDownSingletField i s) ∪ + Set.range (upSingletField i s) ∪ Set.range (conjUpSingletField i s) ∪ + Set.range (quarkDoubletField i s) ∪ Set.range (conjQuarkDoubletField i s) ∪ + Set.range (leptonDoubletField i s) ∪ Set.range (conjLeptonDoubletField i s) ∪ + Set.range (leptonSingletField i s) ∪ Set.range (conjLeptonSingletField i s)) + +/-! + +### A.1. Membership of the generating set + +-/ + +/-- The gauge-field symbols are generators. -/ +lemma gaugeField_mem_generators (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra) : gaugeField s μ φ ∈ generators := + Or.inl (Or.inl (Set.mem_iUnion.mpr ⟨s, Set.mem_iUnion.mpr ⟨μ, ⟨φ, rfl⟩⟩⟩)) + +/-- The Higgs symbols are generators. -/ +lemma higgsField_mem_generators (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ HiggsVec) : higgsField s φ ∈ generators := + Or.inl (Or.inr (Set.mem_iUnion.mpr ⟨s, Or.inl ⟨φ, rfl⟩⟩)) + +/-- The conjugate Higgs symbols are generators. -/ +lemma conjHiggsField_mem_generators (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule HiggsVec)) : conjHiggsField s φ ∈ generators := + Or.inl (Or.inr (Set.mem_iUnion.mpr ⟨s, Or.inr ⟨φ, rfl⟩⟩)) + +/-- The symbols of the `i`-th generation down-type quark singlet are + generators. -/ +lemma downSingletField_mem_generators (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ DownSinglet) : downSingletField i s φ ∈ generators := + Or.inr (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨s, + Or.inl (Or.inl (Or.inl (Or.inl (Or.inl (Or.inl (Or.inl (Or.inl (Or.inl (⟨φ, rfl⟩)))))))))⟩⟩) + +/-- The conjugate symbols of the `i`-th generation down-type quark singlet are + generators. -/ +lemma conjDownSingletField_mem_generators (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule DownSinglet)) : conjDownSingletField i s φ ∈ generators := + Or.inr (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨s, + Or.inl (Or.inl (Or.inl (Or.inl (Or.inl (Or.inl (Or.inl (Or.inl (Or.inr ⟨φ, rfl⟩))))))))⟩⟩) + +/-- The symbols of the `i`-th generation up-type quark singlet are + generators. -/ +lemma upSingletField_mem_generators (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ UpSinglet) : upSingletField i s φ ∈ generators := + Or.inr (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨s, + Or.inl (Or.inl (Or.inl (Or.inl (Or.inl (Or.inl (Or.inl (Or.inr ⟨φ, rfl⟩)))))))⟩⟩) + +/-- The conjugate symbols of the `i`-th generation up-type quark singlet are + generators. -/ +lemma conjUpSingletField_mem_generators (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule UpSinglet)) : conjUpSingletField i s φ ∈ generators := + Or.inr (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨s, + Or.inl (Or.inl (Or.inl (Or.inl (Or.inl (Or.inl (Or.inr ⟨φ, rfl⟩))))))⟩⟩) + +/-- The symbols of the `i`-th generation quark doublet are + generators. -/ +lemma quarkDoubletField_mem_generators (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ QuarkDoublet) : quarkDoubletField i s φ ∈ generators := + Or.inr (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨s, + Or.inl (Or.inl (Or.inl (Or.inl (Or.inl (Or.inr ⟨φ, rfl⟩)))))⟩⟩) + +/-- The conjugate symbols of the `i`-th generation quark doublet are + generators. -/ +lemma conjQuarkDoubletField_mem_generators (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) : conjQuarkDoubletField i s φ ∈ generators := + Or.inr (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨s, + Or.inl (Or.inl (Or.inl (Or.inl (Or.inr ⟨φ, rfl⟩))))⟩⟩) + +/-- The symbols of the `i`-th generation lepton doublet are + generators. -/ +lemma leptonDoubletField_mem_generators (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ LeptonDoublet) : leptonDoubletField i s φ ∈ generators := + Or.inr (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨s, + Or.inl (Or.inl (Or.inl (Or.inr ⟨φ, rfl⟩)))⟩⟩) + +/-- The conjugate symbols of the `i`-th generation lepton doublet are + generators. -/ +lemma conjLeptonDoubletField_mem_generators (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule LeptonDoublet)) : conjLeptonDoubletField i s φ ∈ generators := + Or.inr (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨s, + Or.inl (Or.inl (Or.inr ⟨φ, rfl⟩))⟩⟩) + +/-- The symbols of the `i`-th generation charged-lepton singlet are + generators. -/ +lemma leptonSingletField_mem_generators (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ LeptonSinglet) : leptonSingletField i s φ ∈ generators := + Or.inr (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨s, + Or.inl (Or.inr ⟨φ, rfl⟩)⟩⟩) + +/-- The conjugate symbols of the `i`-th generation charged-lepton singlet are + generators. -/ +lemma conjLeptonSingletField_mem_generators (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule LeptonSinglet)) : conjLeptonSingletField i s φ ∈ generators := + Or.inr (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨s, + Or.inr ⟨φ, rfl⟩⟩⟩) + +/-! + +## B. The three sectors lie in the generated algebra + +-/ + +/-! + +### B.1. Adjoining through an algebra map + +-/ + +/-- If a set generates an algebra, then every image of that algebra under an algebra map + lies in any subalgebra of the target containing the image of the generating set. This is + the step that transports each sector's own generation theorem into the jet algebra. -/ +private lemma mem_of_adjoin_eq_top {R A B : Type*} [CommSemiring R] [Semiring A] + [Algebra R A] [Semiring B] [Algebra R B] (f : A →ₐ[R] B) {T : Set A} + (hT : Algebra.adjoin R T = ⊤) {C : Subalgebra R B} (hfT : f '' T ⊆ (C : Set B)) + (x : A) : f x ∈ C := by + have hmap : (Algebra.adjoin R T).map f ≤ C := by + rw [AlgHom.map_adjoin] + exact Algebra.adjoin_le hfT + refine hmap ⟨x, ?_, rfl⟩ + rw [hT] + exact Algebra.mem_top + +/-! + +### B.2. The Higgs sector + +-/ + +/-- A Higgs symbol is the Higgs sector's own derivative symbol, included. -/ +lemma higgsField_eq_includeHiggs (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ HiggsVec) : + higgsField s φ + = includeHiggs (BosonicAlgebra.iteratedJetDeriv s (BosonicAlgebra.ofField φ)) := by + rw [higgsField_apply, BosonicAlgebra.iteratedJetDeriv_ofField] + +/-- A conjugate Higgs symbol is the Higgs sector's own conjugate derivative symbol, + included. -/ +lemma conjHiggsField_eq_includeHiggs (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule HiggsVec)) : + conjHiggsField s φ + = includeHiggs (BosonicAlgebra.iteratedJetDeriv s + (BosonicAlgebra.ofConjField φ)) := by + rw [conjHiggsField_apply, BosonicAlgebra.iteratedJetDeriv_ofConjField] + +/-- Every element of the Higgs sector lies in the algebra generated by the symbols: the + Higgs jet algebra is generated by the Higgs field, its conjugate and their derivatives, + and those are exactly the two Higgs families. -/ +lemma includeHiggs_mem_adjoin_generators (h : HiggsJetAlgebra) : + includeHiggs h ∈ Algebra.adjoin ℂ generators := by + refine mem_of_adjoin_eq_top includeHiggs + (BosonicAlgebra.adjoin_iteratedJetDeriv_eq_top (V := HiggsVec)) ?_ h + rintro _ ⟨y, hy, rfl⟩ + rw [Set.mem_iUnion] at hy + obtain ⟨s, hs⟩ := hy + rcases hs with ⟨φ, rfl⟩ | ⟨φ, rfl⟩ + · rw [← higgsField_eq_includeHiggs] + exact Algebra.subset_adjoin (higgsField_mem_generators s φ) + · rw [← conjHiggsField_eq_includeHiggs] + exact Algebra.subset_adjoin (conjHiggsField_mem_generators s φ) + +/-! + +### B.3. The fermionic sector + +The fermionic generation theorem produces the symbols of every covector on the total target +space `FermionSpace`, while the ten families supply only the covectors pulled back from a +single species and generation. Those span, by `FermionSpace.span_speciesDual_eq_top`, and +the symbol map is linear, so the families reach every symbol. + +-/ + +/-- A fermionic symbol is the fermionic sector's own derivative symbol, included. -/ +lemma fermionSymbol_eq_includeFermion (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ FermionSpace) : + fermionSymbol s φ + = includeFermion (FermionicAlgebra.iteratedJetDeriv s + (FermionicAlgebra.ofField φ)) := by + rw [fermionSymbol_apply, FermionicAlgebra.iteratedJetDeriv_ofField] + +/-- A conjugate fermionic symbol is the fermionic sector's own conjugate derivative symbol, + included. -/ +lemma conjFermionSymbol_eq_includeFermion (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule FermionSpace)) : + conjFermionSymbol s φ + = includeFermion (FermionicAlgebra.iteratedJetDeriv s + (FermionicAlgebra.ofConjField φ)) := by + rw [conjFermionSymbol_apply, FermionicAlgebra.iteratedJetDeriv_ofConjField] + +/-- Every fermionic symbol lies in the generated algebra. The families give the symbols of + the covectors pulled back from a single species and generation; those span every covector + on the total fermionic target space, and the symbol map is linear. -/ +lemma fermionSymbol_mem_adjoin_generators (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ FermionSpace) : + fermionSymbol s φ ∈ Algebra.adjoin ℂ generators := by + have hφ : φ ∈ Submodule.span ℂ FermionSpace.speciesDual := by + rw [FermionSpace.span_speciesDual_eq_top] + trivial + induction hφ using Submodule.span_induction with + | mem ψ hψ => + rcases hψ with ⟨i, χ, rfl⟩ | ⟨i, χ, rfl⟩ | ⟨i, χ, rfl⟩ | ⟨i, χ, rfl⟩ | ⟨i, χ, rfl⟩ + · rw [← leptonDoubletField_eq_fermionSymbol] + exact Algebra.subset_adjoin (leptonDoubletField_mem_generators i s χ) + · rw [← leptonSingletField_eq_fermionSymbol] + exact Algebra.subset_adjoin (leptonSingletField_mem_generators i s χ) + · rw [← quarkDoubletField_eq_fermionSymbol] + exact Algebra.subset_adjoin (quarkDoubletField_mem_generators i s χ) + · rw [← upSingletField_eq_fermionSymbol] + exact Algebra.subset_adjoin (upSingletField_mem_generators i s χ) + · rw [← downSingletField_eq_fermionSymbol] + exact Algebra.subset_adjoin (downSingletField_mem_generators i s χ) + | zero => rw [map_zero]; exact zero_mem _ + | add x y _ _ hx hy => rw [map_add]; exact add_mem hx hy + | smul c x _ hx => rw [map_smul]; exact Subalgebra.smul_mem _ hx c + +/-- Every conjugate fermionic symbol lies in the generated algebra, by the conjugate form + of the spanning argument. -/ +lemma conjFermionSymbol_mem_adjoin_generators (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule FermionSpace)) : + conjFermionSymbol s φ ∈ Algebra.adjoin ℂ generators := by + have hφ : φ ∈ Submodule.span ℂ FermionSpace.speciesConjDual := by + rw [FermionSpace.span_speciesConjDual_eq_top] + trivial + induction hφ using Submodule.span_induction with + | mem ψ hψ => + rcases hψ with ⟨i, χ, rfl⟩ | ⟨i, χ, rfl⟩ | ⟨i, χ, rfl⟩ | ⟨i, χ, rfl⟩ | ⟨i, χ, rfl⟩ + · rw [← conjLeptonDoubletField_eq_conjFermionSymbol] + exact Algebra.subset_adjoin (conjLeptonDoubletField_mem_generators i s χ) + · rw [← conjLeptonSingletField_eq_conjFermionSymbol] + exact Algebra.subset_adjoin (conjLeptonSingletField_mem_generators i s χ) + · rw [← conjQuarkDoubletField_eq_conjFermionSymbol] + exact Algebra.subset_adjoin (conjQuarkDoubletField_mem_generators i s χ) + · rw [← conjUpSingletField_eq_conjFermionSymbol] + exact Algebra.subset_adjoin (conjUpSingletField_mem_generators i s χ) + · rw [← conjDownSingletField_eq_conjFermionSymbol] + exact Algebra.subset_adjoin (conjDownSingletField_mem_generators i s χ) + | zero => rw [map_zero]; exact zero_mem _ + | add x y _ _ hx hy => rw [map_add]; exact add_mem hx hy + | smul c x _ hx => rw [map_smul]; exact Subalgebra.smul_mem _ hx c + +/-- Every element of the fermionic sector lies in the algebra generated by the symbols. -/ +lemma includeFermion_mem_adjoin_generators (f : FermionJetAlgebra) : + includeFermion f ∈ Algebra.adjoin ℂ generators := by + refine mem_of_adjoin_eq_top includeFermion + (FermionicAlgebra.adjoin_iteratedJetDeriv_eq_top (V := FermionSpace)) ?_ f + rintro _ ⟨y, hy, rfl⟩ + rw [Set.mem_iUnion] at hy + obtain ⟨s, hs⟩ := hy + rcases hs with ⟨φ, rfl⟩ | ⟨φ, rfl⟩ + · rw [← fermionSymbol_eq_includeFermion] + exact fermionSymbol_mem_adjoin_generators s φ + · rw [← conjFermionSymbol_eq_includeFermion] + exact conjFermionSymbol_mem_adjoin_generators s φ + + +/-! + +### B.4. The gauge sector + +The gauge tensor factor is the complexification `ℂ ⊗[ℝ] GaugeJetAlgebra`, while the gauge +sector's generation theorem is a statement over `ℝ` about `GaugeJetAlgebra` itself. The +real part of the factor is handled by that theorem transported along the real algebra map +`x ↦ 1 ⊗ₜ x`; the complex scalar is then supplied by `z ⊗ₜ x = (z ⊗ₜ 1) * (1 ⊗ₜ x)`, whose +first factor is the image of `z` under `algebraMap` and so lies in every subalgebra. + +-/ + +/-- The iterated derivative of the complexification acts on a pure tensor through the + gauge sector's own iterated derivative. -/ +lemma iteratedD_complexJetDeriv_tmul (s : Multiset (Fin 1 ⊕ Fin 3)) (z : ℂ) + (x : GaugeJetAlgebra) : + Lorentz.iteratedD GaugeJetAlgebra.complexJetDeriv + GaugeJetAlgebra.complexJetDeriv_comm s (z ⊗ₜ[ℝ] x) + = z ⊗ₜ[ℝ] GaugeJetAlgebra.iteratedJetDeriv s x := by + induction s using Multiset.induction_on with + | empty => + rw [Lorentz.iteratedD_zero, GaugeJetAlgebra.iteratedJetDeriv_zero, LinearMap.id_apply, + LinearMap.id_apply] + | cons μ s ih => + rw [Lorentz.iteratedD_cons, GaugeJetAlgebra.iteratedJetDeriv_cons, + LinearMap.comp_apply, LinearMap.comp_apply, ih, + GaugeJetAlgebra.complexJetDeriv_tmul] + +/-- The real gauge-boson jet algebra inside the jet algebra of the Standard Model: the + inclusion of the gauge sector precomposed with the inclusion of the real part of the + complexification. It is a map of `ℝ`-algebras, which is the level at which the gauge + sector's generation theorem is stated. -/ +noncomputable def includeGaugeReal : GaugeJetAlgebra →ₐ[ℝ] JetAlgebra := + (AlgHom.restrictScalars ℝ includeGauge).comp + (Algebra.TensorProduct.includeRight (R := ℝ) (A := ℂ) (B := GaugeJetAlgebra)) + +/-- The real gauge inclusion is the gauge inclusion of the pure tensor with complex part + one. -/ +@[simp] +lemma includeGaugeReal_apply (x : GaugeJetAlgebra) : + includeGaugeReal x = includeGauge ((1 : ℂ) ⊗ₜ[ℝ] x) := rfl + +/-- A gauge-field symbol is the gauge sector's own derivative symbol, included through the + real part of the complexification. -/ +lemma gaugeField_eq_includeGaugeReal (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra) : + gaugeField s μ φ + = includeGaugeReal (GaugeJetAlgebra.iteratedJetDeriv s + (GaugeJetAlgebra.ofA μ φ)) := by + rw [gaugeField_apply, includeGaugeReal_apply, GaugeJetAlgebra.gaugeField_apply, + iteratedD_complexJetDeriv_tmul] + +/-- Every element of the real gauge sector lies in the algebra generated by the symbols: + the gauge-boson jet algebra is generated over `ℝ` by the derivative symbols of the gauge + field, and those are the gauge family. -/ +lemma includeGaugeReal_mem_adjoin_generators (x : GaugeJetAlgebra) : + includeGaugeReal x ∈ Algebra.adjoin ℂ generators := by + have h : includeGaugeReal x ∈ (Algebra.adjoin ℂ generators).restrictScalars ℝ := by + refine mem_of_adjoin_eq_top includeGaugeReal + GaugeJetAlgebra.adjoin_iteratedJetDeriv_eq_top ?_ x + rintro _ ⟨y, hy, rfl⟩ + simp only [Set.mem_iUnion, Set.mem_range] at hy + obtain ⟨s, μ, φ, rfl⟩ := hy + rw [← gaugeField_eq_includeGaugeReal] + exact Algebra.subset_adjoin (gaugeField_mem_generators s μ φ) + exact h + +/-- Every element of the complexified gauge sector lies in the algebra generated by the + symbols: a pure tensor splits as a complex scalar times the image of its real part. -/ +lemma includeGauge_mem_adjoin_generators (y : ℂ ⊗[ℝ] GaugeJetAlgebra) : + includeGauge y ∈ Algebra.adjoin ℂ generators := by + induction y using TensorProduct.induction_on with + | zero => rw [map_zero]; exact zero_mem _ + | add a b ha hb => rw [map_add]; exact add_mem ha hb + | tmul z x => + have hsplit : (z ⊗ₜ[ℝ] x : ℂ ⊗[ℝ] GaugeJetAlgebra) + = algebraMap ℂ (ℂ ⊗[ℝ] GaugeJetAlgebra) z * ((1 : ℂ) ⊗ₜ[ℝ] x) := by + rw [show algebraMap ℂ (ℂ ⊗[ℝ] GaugeJetAlgebra) z + = z ⊗ₜ[ℝ] (1 : GaugeJetAlgebra) from rfl, + Algebra.TensorProduct.tmul_mul_tmul, mul_one, one_mul] + rw [hsplit, map_mul, AlgHom.commutes] + exact mul_mem (Subalgebra.algebraMap_mem _ z) + (includeGaugeReal_mem_adjoin_generators x) + +/-! + +## C. The generation theorem + +-/ + +/-- A triple pure tensor is the product of the three factors placed in their own slots: + the abstract statement, proved at abstract types so that it can be instantiated on the + jet algebra without rewriting inside it. -/ +private lemma tensor_tmul_tmul {A B C : Type*} [Ring A] [Algebra ℂ A] [Ring B] + [Algebra ℂ B] [Ring C] [Algebra ℂ C] (a : A) (b : B) (c : C) : + ((a ⊗ₜ[ℂ] (1 : B)) ⊗ₜ[ℂ] (1 : C)) * (((1 : A) ⊗ₜ[ℂ] b) ⊗ₜ[ℂ] (1 : C)) + * (((1 : A) ⊗ₜ[ℂ] (1 : B)) ⊗ₜ[ℂ] c) + = (a ⊗ₜ[ℂ] b) ⊗ₜ[ℂ] c := by + simp only [Algebra.TensorProduct.tmul_mul_tmul, mul_one, one_mul] + +/-- A pure tensor of the jet algebra is the product of the three sector inclusions applied + to its factors. -/ +lemma includeFermion_mul_includeHiggs_mul_includeGauge (a : FermionJetAlgebra) + (b : HiggsJetAlgebra) (c : ℂ ⊗[ℝ] GaugeJetAlgebra) : + includeFermion a * includeHiggs b * includeGauge c = (a ⊗ₜ[ℂ] b) ⊗ₜ[ℂ] c := + tensor_tmul_tmul a b c + +/-- Every pure tensor of the jet algebra lies in the algebra generated by the symbols. -/ +lemma tmul_mem_adjoin_generators (w : FermionJetAlgebra ⊗[ℂ] HiggsJetAlgebra) + (y : ℂ ⊗[ℝ] GaugeJetAlgebra) : + (w ⊗ₜ[ℂ] y : JetAlgebra) ∈ Algebra.adjoin ℂ generators := by + induction w using TensorProduct.induction_on with + | zero => rw [TensorProduct.zero_tmul]; exact zero_mem _ + | add a b ha hb => rw [TensorProduct.add_tmul]; exact add_mem ha hb + | tmul a b => + rw [← includeFermion_mul_includeHiggs_mul_includeGauge] + exact mul_mem + (mul_mem (includeFermion_mem_adjoin_generators a) + (includeHiggs_mem_adjoin_generators b)) + (includeGauge_mem_adjoin_generators y) + +/-- The fields of the Standard Model generate its jet algebra. As a `ℂ`-algebra, + `JetAlgebra` is adjoined by the derivative symbols of the gauge field, the Higgs and its + conjugate, and the three generations of each of the five fermion species with their + conjugates. + + Physically: every element of the algebra in which a Standard Model Lagrangian lives is a + polynomial in the fields and their spacetime derivatives — nothing else is available to + write down. Formally it is the statement that the field algebra of the eventual + `IsStandardModel` instance on the jet algebra is the whole of it. -/ +theorem adjoin_generators_eq_top : + Algebra.adjoin ℂ generators = (⊤ : Subalgebra ℂ JetAlgebra) := by + refine top_le_iff.mp ?_ + rw [← Algebra.TensorProduct.adjoin_tmul_eq_top ℂ + (FermionJetAlgebra ⊗[ℂ] HiggsJetAlgebra) (ℂ ⊗[ℝ] GaugeJetAlgebra)] + refine Algebra.adjoin_le ?_ + rintro _ ⟨w, y, rfl⟩ + exact tmul_mem_adjoin_generators w y + + +end JetAlgebra + +end StandardModel diff --git a/Physlib/Particles/StandardModel/JetAlgebra/Generators.lean b/Physlib/Particles/StandardModel/JetAlgebra/Generators.lean new file mode 100644 index 000000000..bd4e923c5 --- /dev/null +++ b/Physlib/Particles/StandardModel/JetAlgebra/Generators.lean @@ -0,0 +1,598 @@ +/- +Copyright (c) 2026 Joseph Tooby-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.Invariants +/-! +# The generators of the jet algebra of the Standard Model + +## i. Overview + +The jet algebra of the Standard Model is generated by thirteen families of derivative +symbols: the gauge field `∂_s A_μ^φ`, the Higgs field `∂_s H_φ` and its conjugate, and the +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 each with a +conjugate. They are the families the structure `IsStandardModel` asks for. + +Every one of them has the same shape: take the undifferentiated component function of the +sector, push it into the full jet algebra along that sector's inclusion, and differentiate +it `s` times, + +`X s φ = ∂_s (include (of… φ))`. + +The gauge family is `JetAlgebra.gaugeField`, already built in `JetAlgebra.Invariants`; the +other twelve are built here. + +The point of the file is not the definitions but their reduction: because the iterated +total derivative restricts to each sector's own derivative, and each sector's own iterated +derivative of an undifferentiated symbol is a single degree-one element carrying the +derivative label `s`, every family collapses to a *single generator* — one `ι` of the +component space, included. That is what makes the statistics of the symbols visible: the +gauge symbols are central, the Higgs symbols commute with everything bosonic and with the +fermions (they sit in a different tensor factor), and any two fermion symbols anticommute +because they are degree-one elements of an exterior algebra. + +## ii. Key results + +- `JetAlgebra.higgsField`, `JetAlgebra.conjHiggsField` : the Higgs families. +- `JetAlgebra.fermionSymbol`, `JetAlgebra.conjFermionSymbol` : the fermion symbols on the + total fermionic target space, of which the ten species families are restrictions. +- `JetAlgebra.downSingletField`, … : the ten fermion families. +- `JetAlgebra.gaugeField_commute` : the gauge symbols commute with everything. +- `JetAlgebra.MemHiggsSector.commute`, `MemHiggsSector.commute_of_memFermionSector` : the + Higgs symbols commute with the Higgs and with the fermions. +- `JetAlgebra.IsFermionGenerator.anticomm` : two fermion symbols anticommute. + +## iii. Table of contents + +- A. The Higgs generators +- B. The fermion generators + - B.1. The symbols on the total fermionic target space + - B.2. The ten species families + - B.3. The reduction of the species families +- C. The statistics of the generators + - C.1. The gauge symbols are central + - C.2. The Higgs sector + - C.3. The fermionic sector + +-/ + +@[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 Higgs generators + +The Higgs sector enters the full jet algebra through `includeHiggs`; differentiating the +undifferentiated component functions `HiggsJetAlgebra.ofHiggs` and `ofConjHiggs` there +gives the two Higgs families. Since `iteratedD_includeHiggs` turns the full derivative into +the Higgs sector's own, and `BosonicAlgebra.iteratedJetDeriv_ofField` evaluates that on an +undifferentiated symbol, each family is a single included degree-one element. + +-/ + +/-- The derivative symbols `∂_s H_φ` of the Higgs field inside the jet algebra of the + Standard Model. -/ +noncomputable def higgsField (s : Multiset (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ HiggsVec →ₗ[ℂ] JetAlgebra := + (Lorentz.iteratedD (A := JetAlgebra) jetDeriv jetDeriv_comm s).comp + (includeHiggs.toLinearMap.comp HiggsJetAlgebra.ofHiggs) + +/-- The derivative symbols `∂_s H̄_φ` of the conjugate Higgs field inside the jet algebra + of the Standard Model. -/ +noncomputable def conjHiggsField (s : Multiset (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (ConjModule HiggsVec) →ₗ[ℂ] JetAlgebra := + (Lorentz.iteratedD (A := JetAlgebra) jetDeriv jetDeriv_comm s).comp + (includeHiggs.toLinearMap.comp HiggsJetAlgebra.ofConjHiggs) + +/-- A Higgs symbol is a single generator of the Higgs sector, included: the derivative + label `s` sits in the derivative factor of the unconjugated half of the component + space. -/ +lemma higgsField_apply (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ HiggsVec) : + higgsField s φ = includeHiggs (SymmetricAlgebra.ι ℂ _ + ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace HiggsVec)) := by + rw [higgsField, LinearMap.comp_apply, LinearMap.comp_apply, + show includeHiggs.toLinearMap (HiggsJetAlgebra.ofHiggs φ) + = includeHiggs (BosonicAlgebra.ofField φ) from rfl, + iteratedD_includeHiggs, BosonicAlgebra.iteratedJetDeriv_ofField] + +/-- A conjugate Higgs symbol is a single generator of the Higgs sector, included: the + derivative label `s` sits in the derivative factor of the conjugate half of the component + space. -/ +lemma conjHiggsField_apply (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule HiggsVec)) : + conjHiggsField s φ = includeHiggs (SymmetricAlgebra.ι ℂ _ + ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace HiggsVec)) := by + rw [conjHiggsField, LinearMap.comp_apply, LinearMap.comp_apply, + show includeHiggs.toLinearMap (HiggsJetAlgebra.ofConjHiggs φ) + = includeHiggs (BosonicAlgebra.ofConjField φ) from rfl, + iteratedD_includeHiggs, BosonicAlgebra.iteratedJetDeriv_ofConjField] + +/-! + +## B. The fermion generators + +-/ + +/-! + +### B.1. The symbols on the total fermionic target space + +The fermionic jet algebra is built on `FermionSpace`, the product of the five species; a +covector there gives a symbol of the full algebra. The ten species families of the next +section are these symbols restricted along the projections onto a species and generation, +so it is worth reducing them once here. + +-/ + +/-- The derivative symbols `∂_s ψ_φ` of a covector `φ` on the total fermionic target + space, inside the jet algebra of the Standard Model. -/ +noncomputable def fermionSymbol (s : Multiset (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ FermionSpace →ₗ[ℂ] JetAlgebra := + (Lorentz.iteratedD (A := JetAlgebra) jetDeriv jetDeriv_comm s).comp + (includeFermion.toLinearMap.comp FermionicAlgebra.ofField) + +/-- The conjugate derivative symbols `∂_s ψ̄_φ` of a covector `φ` on the conjugate of the + total fermionic target space. -/ +noncomputable def conjFermionSymbol (s : Multiset (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (ConjModule FermionSpace) →ₗ[ℂ] JetAlgebra := + (Lorentz.iteratedD (A := JetAlgebra) jetDeriv jetDeriv_comm s).comp + (includeFermion.toLinearMap.comp FermionicAlgebra.ofConjField) + +/-- A fermionic symbol is a single generator of the fermionic sector, included: the + derivative label `s` sits in the derivative factor of the unconjugated half of the + component space. -/ +lemma fermionSymbol_apply (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ FermionSpace) : + fermionSymbol s φ = includeFermion (ExteriorAlgebra.ι ℂ + ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace FermionSpace)) := by + rw [fermionSymbol, LinearMap.comp_apply, LinearMap.comp_apply, + show includeFermion.toLinearMap (FermionicAlgebra.ofField φ) + = includeFermion (FermionicAlgebra.ofField φ) from rfl, + iteratedD_includeFermion, FermionicAlgebra.iteratedJetDeriv_ofField] + +/-- A conjugate fermionic symbol is a single generator of the fermionic sector, included: + the derivative label `s` sits in the derivative factor of the conjugate half of the + component space. -/ +lemma conjFermionSymbol_apply (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule FermionSpace)) : + conjFermionSymbol s φ = includeFermion (ExteriorAlgebra.ι ℂ + ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace FermionSpace)) := by + rw [conjFermionSymbol, LinearMap.comp_apply, LinearMap.comp_apply, + show includeFermion.toLinearMap (FermionicAlgebra.ofConjField φ) + = includeFermion (FermionicAlgebra.ofConjField φ) from rfl, + iteratedD_includeFermion, FermionicAlgebra.iteratedJetDeriv_ofConjField] + +/-! + +### B.2. The ten species families + +-/ + +/-- The derivative symbols `∂_s ψ_φ` of the `i`-th generation lepton doublet inside the jet + algebra of the Standard Model. -/ +noncomputable def leptonDoubletField (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ LeptonDoublet →ₗ[ℂ] JetAlgebra := + (Lorentz.iteratedD (A := JetAlgebra) jetDeriv jetDeriv_comm s).comp + (includeFermion.toLinearMap.comp (FermionJetAlgebra.ofLeptonDoublet i)) + +/-- The conjugate derivative symbols `∂_s ψ̄_φ` of the `i`-th generation lepton doublet + inside the jet algebra of the Standard Model. -/ +noncomputable def conjLeptonDoubletField (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (ConjModule LeptonDoublet) →ₗ[ℂ] JetAlgebra := + (Lorentz.iteratedD (A := JetAlgebra) jetDeriv jetDeriv_comm s).comp + (includeFermion.toLinearMap.comp (FermionJetAlgebra.ofConjLeptonDoublet i)) + +/-- The derivative symbols `∂_s ψ_φ` of the `i`-th generation charged-lepton singlet inside the jet + algebra of the Standard Model. -/ +noncomputable def leptonSingletField (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ LeptonSinglet →ₗ[ℂ] JetAlgebra := + (Lorentz.iteratedD (A := JetAlgebra) jetDeriv jetDeriv_comm s).comp + (includeFermion.toLinearMap.comp (FermionJetAlgebra.ofLeptonSinglet i)) + +/-- The conjugate derivative symbols `∂_s ψ̄_φ` of the `i`-th generation charged-lepton singlet + inside the jet algebra of the Standard Model. -/ +noncomputable def conjLeptonSingletField (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (ConjModule LeptonSinglet) →ₗ[ℂ] JetAlgebra := + (Lorentz.iteratedD (A := JetAlgebra) jetDeriv jetDeriv_comm s).comp + (includeFermion.toLinearMap.comp (FermionJetAlgebra.ofConjLeptonSinglet i)) + +/-- The derivative symbols `∂_s ψ_φ` of the `i`-th generation quark doublet inside the jet + algebra of the Standard Model. -/ +noncomputable def quarkDoubletField (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ QuarkDoublet →ₗ[ℂ] JetAlgebra := + (Lorentz.iteratedD (A := JetAlgebra) jetDeriv jetDeriv_comm s).comp + (includeFermion.toLinearMap.comp (FermionJetAlgebra.ofQuarkDoublet i)) + +/-- The conjugate derivative symbols `∂_s ψ̄_φ` of the `i`-th generation quark doublet + inside the jet algebra of the Standard Model. -/ +noncomputable def conjQuarkDoubletField (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (ConjModule QuarkDoublet) →ₗ[ℂ] JetAlgebra := + (Lorentz.iteratedD (A := JetAlgebra) jetDeriv jetDeriv_comm s).comp + (includeFermion.toLinearMap.comp (FermionJetAlgebra.ofConjQuarkDoublet i)) + +/-- The derivative symbols `∂_s ψ_φ` of the `i`-th generation up-type quark singlet inside the jet + algebra of the Standard Model. -/ +noncomputable def upSingletField (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ UpSinglet →ₗ[ℂ] JetAlgebra := + (Lorentz.iteratedD (A := JetAlgebra) jetDeriv jetDeriv_comm s).comp + (includeFermion.toLinearMap.comp (FermionJetAlgebra.ofUpSinglet i)) + +/-- The conjugate derivative symbols `∂_s ψ̄_φ` of the `i`-th generation up-type quark singlet + inside the jet algebra of the Standard Model. -/ +noncomputable def conjUpSingletField (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (ConjModule UpSinglet) →ₗ[ℂ] JetAlgebra := + (Lorentz.iteratedD (A := JetAlgebra) jetDeriv jetDeriv_comm s).comp + (includeFermion.toLinearMap.comp (FermionJetAlgebra.ofConjUpSinglet i)) + +/-- The derivative symbols `∂_s ψ_φ` of the `i`-th generation down-type quark singlet inside the jet + algebra of the Standard Model. -/ +noncomputable def downSingletField (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ DownSinglet →ₗ[ℂ] JetAlgebra := + (Lorentz.iteratedD (A := JetAlgebra) jetDeriv jetDeriv_comm s).comp + (includeFermion.toLinearMap.comp (FermionJetAlgebra.ofDownSinglet i)) + +/-- The conjugate derivative symbols `∂_s ψ̄_φ` of the `i`-th generation down-type quark singlet + inside the jet algebra of the Standard Model. -/ +noncomputable def conjDownSingletField (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (ConjModule DownSinglet) →ₗ[ℂ] JetAlgebra := + (Lorentz.iteratedD (A := JetAlgebra) jetDeriv jetDeriv_comm s).comp + (includeFermion.toLinearMap.comp (FermionJetAlgebra.ofConjDownSinglet i)) + +/-! + +### B.3. The reduction of the species families + +Each species family is the total fermionic symbol of the covector pulled back along the +projection onto that species and generation, and hence — by `fermionSymbol_apply` — a +single included generator. Both facts are recorded: the first is what identifies the +generating sets in the proof that the families generate the whole algebra, the second is +what fixes their statistics. + +-/ + +/-- The symbols of the `i`-th generation lepton doublet are the total fermionic symbols + of the covectors pulled back along the projection onto that species and generation. -/ +lemma leptonDoubletField_eq_fermionSymbol (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ LeptonDoublet) : + leptonDoubletField i s φ + = fermionSymbol s (Module.Dual.transpose (FermionSpace.leptonDoubletProj i) φ) := rfl + +/-- The conjugate symbols of the `i`-th generation lepton doublet are the total conjugate + fermionic symbols of the covectors pulled back along the projection. -/ +lemma conjLeptonDoubletField_eq_conjFermionSymbol (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule LeptonDoublet)) : + conjLeptonDoubletField i s φ = conjFermionSymbol s + (Module.Dual.transpose (ConjModule.map (FermionSpace.leptonDoubletProj i)) φ) := rfl + +/-- A symbol of the `i`-th generation lepton doublet is a single generator of the + fermionic sector, included. -/ +lemma leptonDoubletField_apply (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ LeptonDoublet) : + leptonDoubletField i s φ = includeFermion (ExteriorAlgebra.ι ℂ + (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] + Module.Dual.transpose (FermionSpace.leptonDoubletProj i) φ, 0)) := by + rw [leptonDoubletField_eq_fermionSymbol, fermionSymbol_apply] + +/-- A conjugate symbol of the `i`-th generation lepton doublet is a single generator of + the fermionic sector, included. -/ +lemma conjLeptonDoubletField_apply (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule LeptonDoublet)) : + conjLeptonDoubletField i s φ = includeFermion (ExteriorAlgebra.ι ℂ + (0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] + Module.Dual.transpose (ConjModule.map (FermionSpace.leptonDoubletProj i)) φ)) := by + rw [conjLeptonDoubletField_eq_conjFermionSymbol, conjFermionSymbol_apply] + +/-- The symbols of the `i`-th generation charged-lepton singlet are the total fermionic symbols + of the covectors pulled back along the projection onto that species and generation. -/ +lemma leptonSingletField_eq_fermionSymbol (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ LeptonSinglet) : + leptonSingletField i s φ + = fermionSymbol s (Module.Dual.transpose (FermionSpace.leptonSingletProj i) φ) := rfl + +/-- The conjugate symbols of the `i`-th generation charged-lepton singlet are the total conjugate + fermionic symbols of the covectors pulled back along the projection. -/ +lemma conjLeptonSingletField_eq_conjFermionSymbol (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule LeptonSinglet)) : + conjLeptonSingletField i s φ = conjFermionSymbol s + (Module.Dual.transpose (ConjModule.map (FermionSpace.leptonSingletProj i)) φ) := rfl + +/-- A symbol of the `i`-th generation charged-lepton singlet is a single generator of the + fermionic sector, included. -/ +lemma leptonSingletField_apply (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ LeptonSinglet) : + leptonSingletField i s φ = includeFermion (ExteriorAlgebra.ι ℂ + (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] + Module.Dual.transpose (FermionSpace.leptonSingletProj i) φ, 0)) := by + rw [leptonSingletField_eq_fermionSymbol, fermionSymbol_apply] + +/-- A conjugate symbol of the `i`-th generation charged-lepton singlet is a single generator of + the fermionic sector, included. -/ +lemma conjLeptonSingletField_apply (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule LeptonSinglet)) : + conjLeptonSingletField i s φ = includeFermion (ExteriorAlgebra.ι ℂ + (0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] + Module.Dual.transpose (ConjModule.map (FermionSpace.leptonSingletProj i)) φ)) := by + rw [conjLeptonSingletField_eq_conjFermionSymbol, conjFermionSymbol_apply] + +/-- The symbols of the `i`-th generation quark doublet are the total fermionic symbols + of the covectors pulled back along the projection onto that species and generation. -/ +lemma quarkDoubletField_eq_fermionSymbol (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ QuarkDoublet) : + quarkDoubletField i s φ + = fermionSymbol s (Module.Dual.transpose (FermionSpace.quarkDoubletProj i) φ) := rfl + +/-- The conjugate symbols of the `i`-th generation quark doublet are the total conjugate + fermionic symbols of the covectors pulled back along the projection. -/ +lemma conjQuarkDoubletField_eq_conjFermionSymbol (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) : + conjQuarkDoubletField i s φ = conjFermionSymbol s + (Module.Dual.transpose (ConjModule.map (FermionSpace.quarkDoubletProj i)) φ) := rfl + +/-- A symbol of the `i`-th generation quark doublet is a single generator of the + fermionic sector, included. -/ +lemma quarkDoubletField_apply (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ QuarkDoublet) : + quarkDoubletField i s φ = includeFermion (ExteriorAlgebra.ι ℂ + (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] + Module.Dual.transpose (FermionSpace.quarkDoubletProj i) φ, 0)) := by + rw [quarkDoubletField_eq_fermionSymbol, fermionSymbol_apply] + +/-- A conjugate symbol of the `i`-th generation quark doublet is a single generator of + the fermionic sector, included. -/ +lemma conjQuarkDoubletField_apply (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) : + conjQuarkDoubletField i s φ = includeFermion (ExteriorAlgebra.ι ℂ + (0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] + Module.Dual.transpose (ConjModule.map (FermionSpace.quarkDoubletProj i)) φ)) := by + rw [conjQuarkDoubletField_eq_conjFermionSymbol, conjFermionSymbol_apply] + +/-- The symbols of the `i`-th generation up-type quark singlet are the total fermionic symbols + of the covectors pulled back along the projection onto that species and generation. -/ +lemma upSingletField_eq_fermionSymbol (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ UpSinglet) : + upSingletField i s φ + = fermionSymbol s (Module.Dual.transpose (FermionSpace.upSingletProj i) φ) := rfl + +/-- The conjugate symbols of the `i`-th generation up-type quark singlet are the total conjugate + fermionic symbols of the covectors pulled back along the projection. -/ +lemma conjUpSingletField_eq_conjFermionSymbol (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule UpSinglet)) : + conjUpSingletField i s φ = conjFermionSymbol s + (Module.Dual.transpose (ConjModule.map (FermionSpace.upSingletProj i)) φ) := rfl + +/-- A symbol of the `i`-th generation up-type quark singlet is a single generator of the + fermionic sector, included. -/ +lemma upSingletField_apply (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ UpSinglet) : + upSingletField i s φ = includeFermion (ExteriorAlgebra.ι ℂ + (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] + Module.Dual.transpose (FermionSpace.upSingletProj i) φ, 0)) := by + rw [upSingletField_eq_fermionSymbol, fermionSymbol_apply] + +/-- A conjugate symbol of the `i`-th generation up-type quark singlet is a single generator of + the fermionic sector, included. -/ +lemma conjUpSingletField_apply (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule UpSinglet)) : + conjUpSingletField i s φ = includeFermion (ExteriorAlgebra.ι ℂ + (0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] + Module.Dual.transpose (ConjModule.map (FermionSpace.upSingletProj i)) φ)) := by + rw [conjUpSingletField_eq_conjFermionSymbol, conjFermionSymbol_apply] + +/-- The symbols of the `i`-th generation down-type quark singlet are the total fermionic symbols + of the covectors pulled back along the projection onto that species and generation. -/ +lemma downSingletField_eq_fermionSymbol (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ DownSinglet) : + downSingletField i s φ + = fermionSymbol s (Module.Dual.transpose (FermionSpace.downSingletProj i) φ) := rfl + +/-- The conjugate symbols of the `i`-th generation down-type quark singlet are the total conjugate + fermionic symbols of the covectors pulled back along the projection. -/ +lemma conjDownSingletField_eq_conjFermionSymbol (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule DownSinglet)) : + conjDownSingletField i s φ = conjFermionSymbol s + (Module.Dual.transpose (ConjModule.map (FermionSpace.downSingletProj i)) φ) := rfl + +/-- A symbol of the `i`-th generation down-type quark singlet is a single generator of the + fermionic sector, included. -/ +lemma downSingletField_apply (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ DownSinglet) : + downSingletField i s φ = includeFermion (ExteriorAlgebra.ι ℂ + (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] + Module.Dual.transpose (FermionSpace.downSingletProj i) φ, 0)) := by + rw [downSingletField_eq_fermionSymbol, fermionSymbol_apply] + +/-- A conjugate symbol of the `i`-th generation down-type quark singlet is a single generator of + the fermionic sector, included. -/ +lemma conjDownSingletField_apply (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule DownSinglet)) : + conjDownSingletField i s φ = includeFermion (ExteriorAlgebra.ι ℂ + (0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] + Module.Dual.transpose (ConjModule.map (FermionSpace.downSingletProj i)) φ)) := by + rw [conjDownSingletField_eq_conjFermionSymbol, conjFermionSymbol_apply] + +/-! + +## C. The statistics of the generators + +Every commutation obligation of `IsStandardModel` is one of three facts, and none of them +mentions the derivative label: the gauge symbols are central, the Higgs symbols commute +with the Higgs sector and with the fermionic sector, and the fermionic symbols anticommute. +They are stated here once, about arbitrary elements with the relevant sector membership, +together with the membership of each family; the instance then instantiates them. + +-/ + +/-! + +### C.1. The gauge symbols are central + +-/ + +/-- The gauge-field symbols commute with everything in the jet algebra: they lie in the + gauge tensor factor, which is central. -/ +lemma gaugeField_commute (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra) (x : JetAlgebra) : + Commute (gaugeField s μ ψ) x := + (includeGauge_commute (GaugeJetAlgebra.gaugeField s μ ψ) x).symm + +/-! + +### C.2. The Higgs sector + +-/ + +/-- An element of the jet algebra lies in the Higgs sector when it is the image of the + Higgs jet algebra under the Higgs inclusion. -/ +def MemHiggsSector (x : JetAlgebra) : Prop := + ∃ h : HiggsJetAlgebra, x = includeHiggs h + +/-- An element of the jet algebra lies in the fermionic sector when it is the image of the + fermionic jet algebra under the fermionic inclusion. -/ +def MemFermionSector (x : JetAlgebra) : Prop := + ∃ f : FermionJetAlgebra, x = includeFermion f + +/-- The Higgs symbols lie in the Higgs sector. -/ +lemma memHiggsSector_higgsField (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ HiggsVec) : MemHiggsSector (higgsField s φ) := + ⟨_, higgsField_apply s φ⟩ + +/-- The conjugate Higgs symbols lie in the Higgs sector. -/ +lemma memHiggsSector_conjHiggsField (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule HiggsVec)) : MemHiggsSector (conjHiggsField s φ) := + ⟨_, conjHiggsField_apply s φ⟩ + +/-- Two elements of the Higgs sector commute: the Higgs jet algebra is a symmetric + algebra, hence commutative, and the inclusion is an algebra map. -/ +lemma MemHiggsSector.commute {x y : JetAlgebra} (hx : MemHiggsSector x) + (hy : MemHiggsSector y) : Commute x y := by + obtain ⟨h, rfl⟩ := hx + obtain ⟨h', rfl⟩ := hy + show includeHiggs h * includeHiggs h' = includeHiggs h' * includeHiggs h + rw [← map_mul, ← map_mul, mul_comm] + +/-- The right factor of a tensor product commutes with the left: the abstract statement, + proved at abstract types so that it can be instantiated on the jet algebra without + rewriting inside it. -/ +private lemma tensor_left_comm_right {A B C : Type*} [Ring A] [Algebra ℂ A] + [Ring B] [Algebra ℂ B] [Ring C] [Algebra ℂ C] (a : A) (b : B) : + (((1 : A) ⊗ₜ[ℂ] b) ⊗ₜ[ℂ] (1 : C)) * ((a ⊗ₜ[ℂ] (1 : B)) ⊗ₜ[ℂ] (1 : C)) + = ((a ⊗ₜ[ℂ] (1 : B)) ⊗ₜ[ℂ] (1 : C)) * (((1 : A) ⊗ₜ[ℂ] b) ⊗ₜ[ℂ] (1 : C)) := by + rw [Algebra.TensorProduct.tmul_mul_tmul, Algebra.TensorProduct.tmul_mul_tmul, + Algebra.TensorProduct.tmul_mul_tmul, Algebra.TensorProduct.tmul_mul_tmul, + one_mul, mul_one, mul_one, one_mul, mul_one] + +/-- An element of the Higgs sector commutes with an element of the fermionic sector: they + sit in different factors of the tensor product, so their product is the same pure tensor + in either order. This is the statement that the Higgs is a boson — it carries no + statistics against the fermions. -/ +lemma MemHiggsSector.commute_of_memFermionSector {x y : JetAlgebra} + (hx : MemHiggsSector x) (hy : MemFermionSector y) : Commute x y := by + obtain ⟨h, rfl⟩ := hx + obtain ⟨f, rfl⟩ := hy + exact tensor_left_comm_right (C := ℂ ⊗[ℝ] GaugeJetAlgebra) f h + +/-! + +### C.3. The fermionic sector + +-/ + +/-- An element of the jet algebra is a fermionic generator when it is the image, under the + fermionic inclusion, of a degree-one element of the fermionic jet algebra. Every one of + the ten fermion families consists of such elements, by the reductions of section B.3. -/ +def IsFermionGenerator (x : JetAlgebra) : Prop := + ∃ v : JetComponentSpace FermionSpace, x = includeFermion (ExteriorAlgebra.ι ℂ v) + +/-- A fermionic generator lies in the fermionic sector. -/ +lemma IsFermionGenerator.memFermionSector {x : JetAlgebra} (hx : IsFermionGenerator x) : + MemFermionSector x := by + obtain ⟨v, rfl⟩ := hx + exact ⟨_, rfl⟩ + +/-- Two fermionic generators anticommute: they are degree-one elements of an exterior + algebra, pushed through an algebra map. This single fact is the Fermi statistics of every + matter symbol of the Standard Model, across species and generations alike. -/ +lemma IsFermionGenerator.anticomm {x y : JetAlgebra} (hx : IsFermionGenerator x) + (hy : IsFermionGenerator y) : x * y = -(y * x) := by + obtain ⟨v, rfl⟩ := hx + obtain ⟨w, rfl⟩ := hy + rw [← map_mul, FermionicAlgebra.ι_mul_ι_swap, map_neg, map_mul] + +/-- The symbols of the `i`-th generation lepton doublet are fermionic generators. -/ +lemma isFermionGenerator_leptonDoubletField (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ LeptonDoublet) : IsFermionGenerator (leptonDoubletField i s φ) := + ⟨_, leptonDoubletField_apply i s φ⟩ + +/-- The conjugate symbols of the `i`-th generation lepton doublet are fermionic + generators. -/ +lemma isFermionGenerator_conjLeptonDoubletField (i : Fin 3) + (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule LeptonDoublet)) : + IsFermionGenerator (conjLeptonDoubletField i s φ) := + ⟨_, conjLeptonDoubletField_apply i s φ⟩ + +/-- The symbols of the `i`-th generation charged-lepton singlet are fermionic generators. -/ +lemma isFermionGenerator_leptonSingletField (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ LeptonSinglet) : IsFermionGenerator (leptonSingletField i s φ) := + ⟨_, leptonSingletField_apply i s φ⟩ + +/-- The conjugate symbols of the `i`-th generation charged-lepton singlet are fermionic + generators. -/ +lemma isFermionGenerator_conjLeptonSingletField (i : Fin 3) + (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule LeptonSinglet)) : + IsFermionGenerator (conjLeptonSingletField i s φ) := + ⟨_, conjLeptonSingletField_apply i s φ⟩ + +/-- The symbols of the `i`-th generation quark doublet are fermionic generators. -/ +lemma isFermionGenerator_quarkDoubletField (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ QuarkDoublet) : IsFermionGenerator (quarkDoubletField i s φ) := + ⟨_, quarkDoubletField_apply i s φ⟩ + +/-- The conjugate symbols of the `i`-th generation quark doublet are fermionic + generators. -/ +lemma isFermionGenerator_conjQuarkDoubletField (i : Fin 3) + (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) : + IsFermionGenerator (conjQuarkDoubletField i s φ) := + ⟨_, conjQuarkDoubletField_apply i s φ⟩ + +/-- The symbols of the `i`-th generation up-type quark singlet are fermionic generators. -/ +lemma isFermionGenerator_upSingletField (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ UpSinglet) : IsFermionGenerator (upSingletField i s φ) := + ⟨_, upSingletField_apply i s φ⟩ + +/-- The conjugate symbols of the `i`-th generation up-type quark singlet are fermionic + generators. -/ +lemma isFermionGenerator_conjUpSingletField (i : Fin 3) + (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule UpSinglet)) : + IsFermionGenerator (conjUpSingletField i s φ) := + ⟨_, conjUpSingletField_apply i s φ⟩ + +/-- The symbols of the `i`-th generation down-type quark singlet are fermionic generators. -/ +lemma isFermionGenerator_downSingletField (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ DownSinglet) : IsFermionGenerator (downSingletField i s φ) := + ⟨_, downSingletField_apply i s φ⟩ + +/-- The conjugate symbols of the `i`-th generation down-type quark singlet are fermionic + generators. -/ +lemma isFermionGenerator_conjDownSingletField (i : Fin 3) + (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule DownSinglet)) : + IsFermionGenerator (conjDownSingletField i s φ) := + ⟨_, conjDownSingletField_apply i s φ⟩ + +end JetAlgebra + +end StandardModel diff --git a/Physlib/Particles/StandardModel/JetAlgebra/IsStandardModel.lean b/Physlib/Particles/StandardModel/JetAlgebra/IsStandardModel.lean new file mode 100644 index 000000000..a9f09b111 --- /dev/null +++ b/Physlib/Particles/StandardModel/JetAlgebra/IsStandardModel.lean @@ -0,0 +1,1162 @@ +/- +Copyright (c) 2026 Joseph Tooby-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.MassWeightPoly +public import Physlib.Particles.StandardModel.JetAlgebra.FieldAlgebra +public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.TransformsIn +public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.TransformsIn +public import Physlib.Particles.StandardModel.IsStandardModel.MassWeight.Filtration +/-! +# The jet algebra of the Standard Model is a Standard Model + +## i. Overview + +Everything the abstract theory of `IsStandardModel` asks of an algebra — thirteen families +of derivative symbols, their gauge and Lorentz transformation laws, their mass weights and +their statistics — has been established for the concrete jet algebra +`StandardModel.JetAlgebra` one sector at a time. This file collects those facts into the +single statement `JetAlgebra.isStandardModel`, and then draws the two consequences that +make the statement worth having. + +The assembly is mechanical but for one point, which is the content of section A. The three +sector inclusions `includeFermion`, `includeHiggs`, `includeGauge` are equivariant for the +jet gauge action and for the Lorentz action, because both actions are tensor products of +the sector actions and each sector action fixes the unit. `includeGauge` was treated when +the gauge sector was shown to be a gauge field; the other two are proved here, and with +them every transformation law of a matter symbol is its sector's own law, pushed through an +algebra map. + +Once the instance exists, two things follow. The field algebra it generates is the whole +algebra — the fields of the Standard Model generate the algebra in which its Lagrangian +lives, since nothing else is available to write down — so the mass-weight submodules stop +being intersections with the field algebra and become the honest eigenspaces of +`massWeightPoly` on the whole of `JetAlgebra`, and are worth defining on `JetAlgebra` +directly. + +And then the classification of invariants of mass dimension at most four applies to *every* +element of the algebra of that dimension, with no side condition left to check. That is +the result this whole chain of files exists for, and section F states it: for an arbitrary +`x : JetAlgebra` of mass weight at most eight, + +`x` is fixed by the jet gauge group and by the Lorentz group + ↔ `x` is a combination of the constant term, the Higgs mass term `H† H`, and the + dimension-four Standard Model Lagrangian. + +Nothing is assumed of `x` beyond its mass weight: not membership of a subalgebra, not +covariance, not a bound of the form `0 < w`. Every hypothesis of the abstract statement has +discharged against the concrete algebra. The `⊔ S` form, which sets aside a submodule of +higher-dimension operators, follows as a generalization for a reader who wants one. + +## ii. Key results + +- `JetAlgebra.mem_massWeightSubmoduleLE_eight_and_invariant_iff_lagrangian` : the theorem + the chain exists for. For every element of the jet algebra of mass weight at most eight + — with no other hypothesis of any kind — invariance under the jet gauge group and the + Lorentz group holds exactly when the element is a combination of the constant term, the + Higgs mass term `H† H`, and the dimension-four Standard Model Lagrangian. +- `JetAlgebra.mem_massWeightSubmoduleLE_eight_sup_and_invariant_iff_lagrangian` : the same + classification modulo a submodule of higher-dimension operators set aside. +- `JetAlgebra.isStandardModel` : the jet algebra of the Standard Model is a Standard Model. +- `JetAlgebra.isStandardModel_fieldAlgebra_eq_top` : its field algebra is everything. +- `JetAlgebra.massWeightSubmodule`, `JetAlgebra.massWeightSubmoduleLE` : the mass-weight + grading and its filtration, on the jet algebra itself. + +## iii. Table of contents + +- A. The sector inclusions are equivariant + - A.1. The sector inclusions on pure tensors + - A.2. The unit of the gauge sector + - A.3. Equivariance for the jet gauge action + - A.4. Equivariance for the Lorentz action +- B. The jet gauge transformation of the field symbols + - B.1. The Higgs families + - B.2. The fermion families +- C. The Lorentz transformation of the field symbols + - C.1. The Higgs families + - C.2. The fermion families +- D. The Standard Model instance +- E. The field algebra is everything + - E.1. The field algebra + - E.2. The collapse of the graded pieces + - E.3. The mass-weight filtration of the jet algebra +- F. The Standard Model Lagrangian + +-/ + +@[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 Lorentz + +/-! + +## A. The sector inclusions are equivariant + +Both the jet gauge action and the Lorentz action on the jet algebra are tensor products of +the three sector actions. A sector inclusion puts the unit in the other two factors, so +equivariance is exactly the statement that the other two actions fix their units, which +they do — they are actions by algebra maps. + +-/ + +/-! + +### A.1. The sector inclusions on pure tensors + +-/ + +/-- The fermionic inclusion puts the unit in the Higgs and gauge factors. -/ +lemma includeFermion_apply (f : FermionJetAlgebra) : + includeFermion f = ((f ⊗ₜ[ℂ] (1 : HiggsJetAlgebra)) ⊗ₜ[ℂ] + (1 : ℂ ⊗[ℝ] GaugeJetAlgebra)) := rfl + +/-- The Higgs inclusion puts the unit in the fermionic and gauge factors. -/ +lemma includeHiggs_apply (h : HiggsJetAlgebra) : + includeHiggs h = (((1 : FermionJetAlgebra) ⊗ₜ[ℂ] h) ⊗ₜ[ℂ] + (1 : ℂ ⊗[ℝ] GaugeJetAlgebra)) := rfl + +/-! + +### A.2. The unit of the gauge sector + +-/ + +/-- The jet gauge action on the complexified gauge sector fixes the unit. -/ +lemma complexRepJetGaugeGroupI_apply_one (U : JetGaugeGroupI) : + GaugeJetAlgebra.complexRepJetGaugeGroupI U (1 : ℂ ⊗[ℝ] GaugeJetAlgebra) = 1 := by + rw [Algebra.TensorProduct.one_def, GaugeJetAlgebra.complexRepJetGaugeGroupI_tmul, + GaugeJetAlgebra.repJetGaugeGroupI_apply_one] + +/-- The Lorentz action on the complexified gauge sector fixes the unit. -/ +lemma complexRepLorentzGroup_apply_one (Λ : SL(2,ℂ)) : + GaugeJetAlgebra.complexRepLorentzGroup Λ (1 : ℂ ⊗[ℝ] GaugeJetAlgebra) = 1 := by + rw [Algebra.TensorProduct.one_def, GaugeJetAlgebra.complexRepLorentzGroup_tmul, + GaugeJetAlgebra.repLorentzGroup_apply_one] + +/-! + +### A.3. Equivariance for the jet gauge action + +-/ + +/-- The jet gauge action restricts to the fermionic sector's own action. -/ +lemma repJetGaugeGroupI_includeFermion (U : JetGaugeGroupI) (f : FermionJetAlgebra) : + repJetGaugeGroupI U (includeFermion f) + = includeFermion (FermionJetAlgebra.repJetGaugeGroupI U f) := by + rw [includeFermion_apply, repJetGaugeGroupI_tmul, + show (FermionJetAlgebra.repJetGaugeGroupI.tprod HiggsJetAlgebra.repJetGaugeGroupI) U + (f ⊗ₜ[ℂ] (1 : HiggsJetAlgebra)) + = (FermionJetAlgebra.repJetGaugeGroupI U f) ⊗ₜ[ℂ] + (HiggsJetAlgebra.repJetGaugeGroupI U (1 : HiggsJetAlgebra)) from rfl, + show HiggsJetAlgebra.repJetGaugeGroupI U (1 : HiggsJetAlgebra) = 1 from + BosonicAlgebra.repJetGaugeGroupI_apply_one _ _ U, + complexRepJetGaugeGroupI_apply_one, includeFermion_apply] + +/-- The jet gauge action restricts to the Higgs sector's own action. -/ +lemma repJetGaugeGroupI_includeHiggs (U : JetGaugeGroupI) (h : HiggsJetAlgebra) : + repJetGaugeGroupI U (includeHiggs h) + = includeHiggs (HiggsJetAlgebra.repJetGaugeGroupI U h) := by + rw [includeHiggs_apply, repJetGaugeGroupI_tmul, + show (FermionJetAlgebra.repJetGaugeGroupI.tprod HiggsJetAlgebra.repJetGaugeGroupI) U + ((1 : FermionJetAlgebra) ⊗ₜ[ℂ] h) + = (FermionJetAlgebra.repJetGaugeGroupI U (1 : FermionJetAlgebra)) ⊗ₜ[ℂ] + (HiggsJetAlgebra.repJetGaugeGroupI U h) from rfl, + show FermionJetAlgebra.repJetGaugeGroupI U (1 : FermionJetAlgebra) = 1 from + FermionicAlgebra.repJetGaugeGroupI_apply_one _ _ U, + complexRepJetGaugeGroupI_apply_one, includeHiggs_apply] + +/-! + +### A.4. Equivariance for the Lorentz action + +-/ + +/-- The Lorentz action restricts to the fermionic sector's own action. -/ +lemma repLorentzGroup_includeFermion (Λ : SL(2,ℂ)) (f : FermionJetAlgebra) : + repLorentzGroup Λ (includeFermion f) + = includeFermion (FermionJetAlgebra.repLorentzGroup Λ f) := by + rw [includeFermion_apply, repLorentzGroup_tmul, + show (FermionJetAlgebra.repLorentzGroup.tprod HiggsJetAlgebra.repLorentzGroup) Λ + (f ⊗ₜ[ℂ] (1 : HiggsJetAlgebra)) + = (FermionJetAlgebra.repLorentzGroup Λ f) ⊗ₜ[ℂ] + (HiggsJetAlgebra.repLorentzGroup Λ (1 : HiggsJetAlgebra)) from rfl, + show HiggsJetAlgebra.repLorentzGroup Λ (1 : HiggsJetAlgebra) = 1 from + BosonicAlgebra.repLorentzGroup_apply_one _ Λ, + complexRepLorentzGroup_apply_one, includeFermion_apply] + +/-- The Lorentz action restricts to the Higgs sector's own action. -/ +lemma repLorentzGroup_includeHiggs (Λ : SL(2,ℂ)) (h : HiggsJetAlgebra) : + repLorentzGroup Λ (includeHiggs h) + = includeHiggs (HiggsJetAlgebra.repLorentzGroup Λ h) := by + rw [includeHiggs_apply, repLorentzGroup_tmul, + show (FermionJetAlgebra.repLorentzGroup.tprod HiggsJetAlgebra.repLorentzGroup) Λ + ((1 : FermionJetAlgebra) ⊗ₜ[ℂ] h) + = (FermionJetAlgebra.repLorentzGroup Λ (1 : FermionJetAlgebra)) ⊗ₜ[ℂ] + (HiggsJetAlgebra.repLorentzGroup Λ h) from rfl, + show FermionJetAlgebra.repLorentzGroup Λ (1 : FermionJetAlgebra) = 1 from + FermionicAlgebra.repLorentzGroup_apply_one _ Λ, + complexRepLorentzGroup_apply_one, includeHiggs_apply] + +/-! + +## B. The jet gauge transformation of the field symbols + +`TransformsIn` asks that a jet of gauge transformations mix a derivative symbol with the +lower symbols by the all-orders Leibniz convolution of the base-point Taylor coefficients +of the gauge jet. Each sector proves that law for its own symbols; the inclusions of +section A carry it to the full algebra, and the species bridge of +`Physlib.Particles.StandardModel.Fermions.JetAlgebra.Species` moves the fermionic law from +the total target space `FermionSpace` down to the individual species. + +-/ + +/-! + +### B.1. The Higgs families + +-/ + +/-- The Higgs symbols transform in the jet gauge representation carried by the jets of the + Higgs field. -/ +theorem transformsIn_higgsField : + TransformsIn (B := JetAlgebra) repJetGaugeGroupI HiggsVec.repJetGaugeGroupI + higgsField := by + intro U φ s + rw [higgsField_eq_includeHiggs, repJetGaugeGroupI_includeHiggs, + show HiggsJetAlgebra.repJetGaugeGroupI U + (BosonicAlgebra.iteratedJetDeriv s (BosonicAlgebra.ofField φ)) + = _ from BosonicAlgebra.repJetGaugeGroupI_iteratedJetDeriv_ofField + HiggsVec.repJetGaugeGroupI HiggsVec.repJetGaugeGroupI_smul U φ s, + map_multiset_sum, Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p _ => ?_) + rw [Function.comp_apply, ← higgsField_eq_includeHiggs] + +/-- The conjugate Higgs symbols transform in the conjugate of the jet gauge representation + carried by the jets of the Higgs field. -/ +theorem transformsIn_conjHiggsField : + TransformsIn (B := JetAlgebra) repJetGaugeGroupI (repConj HiggsVec.repJetGaugeGroupI) + conjHiggsField := by + intro U φ s + rw [conjHiggsField_eq_includeHiggs, repJetGaugeGroupI_includeHiggs, + show HiggsJetAlgebra.repJetGaugeGroupI U + (BosonicAlgebra.iteratedJetDeriv s (BosonicAlgebra.ofConjField φ)) + = _ from BosonicAlgebra.repJetGaugeGroupI_iteratedJetDeriv_ofConjField + HiggsVec.repJetGaugeGroupI HiggsVec.repJetGaugeGroupI_smul U φ s, + map_multiset_sum, Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p _ => ?_) + rw [Function.comp_apply, ← conjHiggsField_eq_includeHiggs] + +/-! + +### B.2. The fermion families + +-/ + +/-- The jet gauge transformation law of a fermion species: a family of symbols obtained + from the total fermionic symbols by pulling covectors back along a projection + intertwining the two jet gauge actions transforms in the species' own representation. -/ +private lemma transformsIn_species {W : Type} [AddCommGroup W] [Module ℂ W] + (repW : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] W)) (p : FermionSpace →ₗ[ℂ] W) + (hp : ∀ U : JetGaugeGroupI, (LinearMap.lTensor JetRing p).comp + (FermionSpace.repJetGaugeGroupI U) + = (repW U).comp (LinearMap.lTensor JetRing p)) + {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ W →ₗ[ℂ] JetAlgebra} + (hF : ∀ s φ, F s φ = fermionSymbol s (Module.Dual.transpose p φ)) : + TransformsIn (B := JetAlgebra) repJetGaugeGroupI repW F := by + intro U φ s + rw [hF, fermionSymbol_eq_includeFermion, repJetGaugeGroupI_includeFermion, + show FermionJetAlgebra.repJetGaugeGroupI U + (FermionicAlgebra.iteratedJetDeriv s + (FermionicAlgebra.ofField (Module.Dual.transpose p φ))) + = _ from FermionicAlgebra.repJetGaugeGroupI_iteratedJetDeriv_ofField + FermionSpace.repJetGaugeGroupI FermionSpace.repJetGaugeGroupI_smul U _ s, + map_multiset_sum, Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun q _ => ?_) + rw [Function.comp_apply, ← fermionSymbol_eq_includeFermion, hF] + exact congrArg (fermionSymbol q.2) + (LinearMap.congr_fun (repDualCoeff_comp p hp U⁻¹ q.1) φ) + +/-- The base-point Taylor coefficients of two conjugate jet gauge actions are intertwined, + on the component-function index, by the conjugate of any map of value spaces intertwining + the unconjugated coefficients: conjugation changes neither the underlying maps nor the + real directions in which the coefficients are taken. -/ +private lemma repDualCoeff_repConj_transpose {V W : Type} [AddCommGroup V] [Module ℂ V] + [AddCommGroup W] [Module ℂ W] + {repV : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)} + {repW : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] W)} (p : V →ₗ[ℂ] W) + (hp : ∀ (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)), + p.comp (IsGaugeField.repCoeff repV U s) = (IsGaugeField.repCoeff repW U s).comp p) + (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule W)) : + IsGaugeField.repDualCoeff (repConj repV) U s + (Module.Dual.transpose (ConjModule.map p) φ) + = Module.Dual.transpose (ConjModule.map p) + (IsGaugeField.repDualCoeff (repConj repW) U s φ) := by + refine LinearMap.ext fun v => ?_ + show φ (ConjModule.map p (IsGaugeField.repCoeff (repConj repV) U s v)) + = φ (IsGaugeField.repCoeff (repConj repW) U s (ConjModule.map p v)) + rw [GaugeAlgebra.repCoeff_repConj, GaugeAlgebra.repCoeff_repConj] + exact congrArg φ (LinearMap.congr_fun (hp U s) v) + +/-- The jet gauge transformation law of the conjugate symbols of a fermion species: the law + of the species itself, read on the conjugate representations. -/ +private lemma transformsIn_conjSpecies {W : Type} [AddCommGroup W] [Module ℂ W] + (repW : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] W)) (p : FermionSpace →ₗ[ℂ] W) + (hp : ∀ U : JetGaugeGroupI, (LinearMap.lTensor JetRing p).comp + (FermionSpace.repJetGaugeGroupI U) + = (repW U).comp (LinearMap.lTensor JetRing p)) + {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule W) →ₗ[ℂ] JetAlgebra} + (hF : ∀ s φ, F s φ = conjFermionSymbol s + (Module.Dual.transpose (ConjModule.map p) φ)) : + TransformsIn (B := JetAlgebra) repJetGaugeGroupI (repConj repW) F := by + intro U φ s + rw [hF, conjFermionSymbol_eq_includeFermion, repJetGaugeGroupI_includeFermion, + show FermionJetAlgebra.repJetGaugeGroupI U + (FermionicAlgebra.iteratedJetDeriv s + (FermionicAlgebra.ofConjField (Module.Dual.transpose (ConjModule.map p) φ))) + = _ from FermionicAlgebra.repJetGaugeGroupI_iteratedJetDeriv_ofConjField + FermionSpace.repJetGaugeGroupI FermionSpace.repJetGaugeGroupI_smul U _ s, + map_multiset_sum, Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun q _ => ?_) + rw [Function.comp_apply, ← conjFermionSymbol_eq_includeFermion, hF] + exact congrArg (conjFermionSymbol q.2) + (repDualCoeff_repConj_transpose p (fun U' s' => repCoeff_comp p hp U' s') U⁻¹ q.1 φ) + + +/-- The symbols of the `i`-th generation down-type quark singlet transform in the jet gauge + representation carried by the jets of that species. -/ +theorem transformsIn_downSingletField (i : Fin 3) : + TransformsIn (B := JetAlgebra) repJetGaugeGroupI DownSinglet.repJetGaugeGroupI + (downSingletField i) := + transformsIn_species _ _ (FermionSpace.lTensor_downSingletProj_repJetGaugeGroupI i) + (downSingletField_eq_fermionSymbol i) + +/-- The conjugate symbols of the `i`-th generation down-type quark singlet transform in the + conjugate of the jet gauge representation carried by the jets of that species. -/ +theorem transformsIn_conjDownSingletField (i : Fin 3) : + TransformsIn (B := JetAlgebra) repJetGaugeGroupI + (repConj DownSinglet.repJetGaugeGroupI) (conjDownSingletField i) := + transformsIn_conjSpecies _ _ (FermionSpace.lTensor_downSingletProj_repJetGaugeGroupI i) + (conjDownSingletField_eq_conjFermionSymbol i) + + +/-- The symbols of the `i`-th generation up-type quark singlet transform in the jet gauge + representation carried by the jets of that species. -/ +theorem transformsIn_upSingletField (i : Fin 3) : + TransformsIn (B := JetAlgebra) repJetGaugeGroupI UpSinglet.repJetGaugeGroupI + (upSingletField i) := + transformsIn_species _ _ (FermionSpace.lTensor_upSingletProj_repJetGaugeGroupI i) + (upSingletField_eq_fermionSymbol i) + +/-- The conjugate symbols of the `i`-th generation up-type quark singlet transform in the + conjugate of the jet gauge representation carried by the jets of that species. -/ +theorem transformsIn_conjUpSingletField (i : Fin 3) : + TransformsIn (B := JetAlgebra) repJetGaugeGroupI + (repConj UpSinglet.repJetGaugeGroupI) (conjUpSingletField i) := + transformsIn_conjSpecies _ _ (FermionSpace.lTensor_upSingletProj_repJetGaugeGroupI i) + (conjUpSingletField_eq_conjFermionSymbol i) + + +/-- The symbols of the `i`-th generation quark doublet transform in the jet gauge + representation carried by the jets of that species. -/ +theorem transformsIn_quarkDoubletField (i : Fin 3) : + TransformsIn (B := JetAlgebra) repJetGaugeGroupI QuarkDoublet.repJetGaugeGroupI + (quarkDoubletField i) := + transformsIn_species _ _ (FermionSpace.lTensor_quarkDoubletProj_repJetGaugeGroupI i) + (quarkDoubletField_eq_fermionSymbol i) + +/-- The conjugate symbols of the `i`-th generation quark doublet transform in the + conjugate of the jet gauge representation carried by the jets of that species. -/ +theorem transformsIn_conjQuarkDoubletField (i : Fin 3) : + TransformsIn (B := JetAlgebra) repJetGaugeGroupI + (repConj QuarkDoublet.repJetGaugeGroupI) (conjQuarkDoubletField i) := + transformsIn_conjSpecies _ _ (FermionSpace.lTensor_quarkDoubletProj_repJetGaugeGroupI i) + (conjQuarkDoubletField_eq_conjFermionSymbol i) + + +/-- The symbols of the `i`-th generation lepton doublet transform in the jet gauge + representation carried by the jets of that species. -/ +theorem transformsIn_leptonDoubletField (i : Fin 3) : + TransformsIn (B := JetAlgebra) repJetGaugeGroupI LeptonDoublet.repJetGaugeGroupI + (leptonDoubletField i) := + transformsIn_species _ _ (FermionSpace.lTensor_leptonDoubletProj_repJetGaugeGroupI i) + (leptonDoubletField_eq_fermionSymbol i) + +/-- The conjugate symbols of the `i`-th generation lepton doublet transform in the + conjugate of the jet gauge representation carried by the jets of that species. -/ +theorem transformsIn_conjLeptonDoubletField (i : Fin 3) : + TransformsIn (B := JetAlgebra) repJetGaugeGroupI + (repConj LeptonDoublet.repJetGaugeGroupI) (conjLeptonDoubletField i) := + transformsIn_conjSpecies _ _ (FermionSpace.lTensor_leptonDoubletProj_repJetGaugeGroupI i) + (conjLeptonDoubletField_eq_conjFermionSymbol i) + + +/-- The symbols of the `i`-th generation charged-lepton singlet transform in the jet gauge + representation carried by the jets of that species. -/ +theorem transformsIn_leptonSingletField (i : Fin 3) : + TransformsIn (B := JetAlgebra) repJetGaugeGroupI LeptonSinglet.repJetGaugeGroupI + (leptonSingletField i) := + transformsIn_species _ _ (FermionSpace.lTensor_leptonSingletProj_repJetGaugeGroupI i) + (leptonSingletField_eq_fermionSymbol i) + +/-- The conjugate symbols of the `i`-th generation charged-lepton singlet transform in the + conjugate of the jet gauge representation carried by the jets of that species. -/ +theorem transformsIn_conjLeptonSingletField (i : Fin 3) : + TransformsIn (B := JetAlgebra) repJetGaugeGroupI + (repConj LeptonSinglet.repJetGaugeGroupI) (conjLeptonSingletField i) := + transformsIn_conjSpecies _ _ (FermionSpace.lTensor_leptonSingletProj_repJetGaugeGroupI i) + (conjLeptonSingletField_eq_conjFermionSymbol i) +/-! + +## C. The Lorentz transformation of the field symbols + +`IsLorentzDerivTransforms` asks that each derivative slot of a symbol mix into all tuples +of directions by the columns of the Lorentz matrix, while the value index transforms by the +contragredient of the species' Lorentz representation. The mixing of the slots is +`IsLorentzDeriv.rep_iteratedD_ofFn`, available because the total derivative on the jet +algebra is a Lorentz vector; what is left is the undifferentiated law at `n = 0`, which is +the equivariance of the component functions of each sector. + +-/ + +/-! + +### C.1. The Higgs families + +The Higgs is a Lorentz scalar, so its value index carries the trivial representation and +the conjugate index its conjugate. + +-/ + +/-- The Higgs symbols transform as the derivative symbols of a Lorentz scalar. -/ +theorem isLorentzDerivTransforms_higgsField : + IsLorentzDerivTransforms (A := JetAlgebra) repLorentzGroup + (Representation.trivial ℂ SL(2,ℂ) HiggsVec) higgsField := by + intro Λ n l φ + refine (Lorentz.IsLorentzDeriv.rep_iteratedD_ofFn jetDeriv_comm Λ l + (includeHiggs (BosonicAlgebra.ofField φ))).trans ?_ + refine Finset.sum_congr rfl fun p _ => ?_ + rw [repLorentzGroup_includeHiggs, + show HiggsJetAlgebra.repLorentzGroup Λ (BosonicAlgebra.ofField φ) + = BosonicAlgebra.ofField ((Representation.trivial ℂ SL(2,ℂ) HiggsVec).dual Λ φ) from + BosonicAlgebra.repLorentzGroup_ofField _ Λ φ] + rfl + +/-- The conjugate Higgs symbols transform as the derivative symbols of the conjugate of a + Lorentz scalar. -/ +theorem isLorentzDerivTransforms_conjHiggsField : + IsLorentzDerivTransforms (A := JetAlgebra) repLorentzGroup + (Representation.trivial ℂ SL(2,ℂ) HiggsVec).conj conjHiggsField := by + intro Λ n l φ + refine (Lorentz.IsLorentzDeriv.rep_iteratedD_ofFn jetDeriv_comm Λ l + (includeHiggs (BosonicAlgebra.ofConjField φ))).trans ?_ + refine Finset.sum_congr rfl fun p _ => ?_ + rw [repLorentzGroup_includeHiggs, + show HiggsJetAlgebra.repLorentzGroup Λ (BosonicAlgebra.ofConjField φ) + = BosonicAlgebra.ofConjField + ((Representation.trivial ℂ SL(2,ℂ) HiggsVec).conj.dual Λ φ) from + BosonicAlgebra.repLorentzGroup_ofConjField _ Λ φ] + rfl + +/-! + +### C.2. The fermion families + +The Lorentz action on `FermionSpace` is species-diagonal, so the contragredient action on a +covector pulled back from a species is the pullback of the species' own contragredient +action; that identity is definitional, and it is the only input the species need beyond the +law for the total fermionic symbols. + +-/ + +/-- The Lorentz transformation law of a fermion species: a family of symbols obtained from + the total fermionic symbols by pulling covectors back along a projection whose + contragredient is species-diagonal transforms in the species' own Weyl representation. -/ +private lemma isLorentzDerivTransforms_species {W : Type} [AddCommGroup W] [Module ℂ W] + (repW : Representation ℂ SL(2,ℂ) W) (p : FermionSpace →ₗ[ℂ] W) + (hdual : ∀ (Λ : SL(2,ℂ)) (φ : Module.Dual ℂ W), + FermionSpace.repLorentzGroup.dual Λ (Module.Dual.transpose p φ) + = Module.Dual.transpose p (repW.dual Λ φ)) + {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ W →ₗ[ℂ] JetAlgebra} + (hF : ∀ s φ, F s φ = fermionSymbol s (Module.Dual.transpose p φ)) : + IsLorentzDerivTransforms (A := JetAlgebra) repLorentzGroup repW F := by + intro Λ n l φ + rw [hF] + refine (Lorentz.IsLorentzDeriv.rep_iteratedD_ofFn jetDeriv_comm Λ l + (includeFermion (FermionicAlgebra.ofField (Module.Dual.transpose p φ)))).trans ?_ + refine Finset.sum_congr rfl fun q _ => ?_ + rw [repLorentzGroup_includeFermion, + show FermionJetAlgebra.repLorentzGroup Λ + (FermionicAlgebra.ofField (Module.Dual.transpose p φ)) + = FermionicAlgebra.ofField + (FermionSpace.repLorentzGroup.dual Λ (Module.Dual.transpose p φ)) from + FermionicAlgebra.repLorentzGroup_ofField _ Λ _, + hdual, hF] + rfl + +/-- The Lorentz transformation law of the conjugate symbols of a fermion species: the law + of the species itself, read on the conjugate representations. -/ +private lemma isLorentzDerivTransforms_conjSpecies {W : Type} [AddCommGroup W] + [Module ℂ W] (repW : Representation ℂ SL(2,ℂ) W) (p : FermionSpace →ₗ[ℂ] W) + (hdual : ∀ (Λ : SL(2,ℂ)) (φ : Module.Dual ℂ (ConjModule W)), + FermionSpace.repLorentzGroup.conj.dual Λ + (Module.Dual.transpose (ConjModule.map p) φ) + = Module.Dual.transpose (ConjModule.map p) (repW.conj.dual Λ φ)) + {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule W) →ₗ[ℂ] JetAlgebra} + (hF : ∀ s φ, F s φ = conjFermionSymbol s + (Module.Dual.transpose (ConjModule.map p) φ)) : + IsLorentzDerivTransforms (A := JetAlgebra) repLorentzGroup repW.conj F := by + intro Λ n l φ + rw [hF] + refine (Lorentz.IsLorentzDeriv.rep_iteratedD_ofFn jetDeriv_comm Λ l + (includeFermion (FermionicAlgebra.ofConjField + (Module.Dual.transpose (ConjModule.map p) φ)))).trans ?_ + refine Finset.sum_congr rfl fun q _ => ?_ + rw [repLorentzGroup_includeFermion, + show FermionJetAlgebra.repLorentzGroup Λ + (FermionicAlgebra.ofConjField (Module.Dual.transpose (ConjModule.map p) φ)) + = FermionicAlgebra.ofConjField (FermionSpace.repLorentzGroup.conj.dual Λ + (Module.Dual.transpose (ConjModule.map p) φ)) from + FermionicAlgebra.repLorentzGroup_ofConjField _ Λ _, + hdual, hF] + rfl + + +/-- The symbols of the `i`-th generation down-type quark singlet transform as the derivative + symbols of a Weyl spinor in that species' Lorentz representation. -/ +theorem isLorentzDerivTransforms_downSingletField (i : Fin 3) : + IsLorentzDerivTransforms (A := JetAlgebra) repLorentzGroup + DownSinglet.repLorentzGroup (downSingletField i) := + isLorentzDerivTransforms_species _ _ (fun _ _ => rfl) + (downSingletField_eq_fermionSymbol i) + +/-- The conjugate symbols of the `i`-th generation down-type quark singlet transform as the + derivative symbols of the conjugate Weyl spinor. -/ +theorem isLorentzDerivTransforms_conjDownSingletField (i : Fin 3) : + IsLorentzDerivTransforms (A := JetAlgebra) repLorentzGroup + DownSinglet.repLorentzGroup.conj (conjDownSingletField i) := + isLorentzDerivTransforms_conjSpecies _ _ (fun _ _ => rfl) + (conjDownSingletField_eq_conjFermionSymbol i) + + +/-- The symbols of the `i`-th generation up-type quark singlet transform as the derivative + symbols of a Weyl spinor in that species' Lorentz representation. -/ +theorem isLorentzDerivTransforms_upSingletField (i : Fin 3) : + IsLorentzDerivTransforms (A := JetAlgebra) repLorentzGroup + UpSinglet.repLorentzGroup (upSingletField i) := + isLorentzDerivTransforms_species _ _ (fun _ _ => rfl) + (upSingletField_eq_fermionSymbol i) + +/-- The conjugate symbols of the `i`-th generation up-type quark singlet transform as the + derivative symbols of the conjugate Weyl spinor. -/ +theorem isLorentzDerivTransforms_conjUpSingletField (i : Fin 3) : + IsLorentzDerivTransforms (A := JetAlgebra) repLorentzGroup + UpSinglet.repLorentzGroup.conj (conjUpSingletField i) := + isLorentzDerivTransforms_conjSpecies _ _ (fun _ _ => rfl) + (conjUpSingletField_eq_conjFermionSymbol i) + + +/-- The symbols of the `i`-th generation quark doublet transform as the derivative + symbols of a Weyl spinor in that species' Lorentz representation. -/ +theorem isLorentzDerivTransforms_quarkDoubletField (i : Fin 3) : + IsLorentzDerivTransforms (A := JetAlgebra) repLorentzGroup + QuarkDoublet.repLorentzGroup (quarkDoubletField i) := + isLorentzDerivTransforms_species _ _ (fun _ _ => rfl) + (quarkDoubletField_eq_fermionSymbol i) + +/-- The conjugate symbols of the `i`-th generation quark doublet transform as the + derivative symbols of the conjugate Weyl spinor. -/ +theorem isLorentzDerivTransforms_conjQuarkDoubletField (i : Fin 3) : + IsLorentzDerivTransforms (A := JetAlgebra) repLorentzGroup + QuarkDoublet.repLorentzGroup.conj (conjQuarkDoubletField i) := + isLorentzDerivTransforms_conjSpecies _ _ (fun _ _ => rfl) + (conjQuarkDoubletField_eq_conjFermionSymbol i) + + +/-- The symbols of the `i`-th generation lepton doublet transform as the derivative + symbols of a Weyl spinor in that species' Lorentz representation. -/ +theorem isLorentzDerivTransforms_leptonDoubletField (i : Fin 3) : + IsLorentzDerivTransforms (A := JetAlgebra) repLorentzGroup + LeptonDoublet.repLorentzGroup (leptonDoubletField i) := + isLorentzDerivTransforms_species _ _ (fun _ _ => rfl) + (leptonDoubletField_eq_fermionSymbol i) + +/-- The conjugate symbols of the `i`-th generation lepton doublet transform as the + derivative symbols of the conjugate Weyl spinor. -/ +theorem isLorentzDerivTransforms_conjLeptonDoubletField (i : Fin 3) : + IsLorentzDerivTransforms (A := JetAlgebra) repLorentzGroup + LeptonDoublet.repLorentzGroup.conj (conjLeptonDoubletField i) := + isLorentzDerivTransforms_conjSpecies _ _ (fun _ _ => rfl) + (conjLeptonDoubletField_eq_conjFermionSymbol i) + + +/-- The symbols of the `i`-th generation charged-lepton singlet transform as the derivative + symbols of a Weyl spinor in that species' Lorentz representation. -/ +theorem isLorentzDerivTransforms_leptonSingletField (i : Fin 3) : + IsLorentzDerivTransforms (A := JetAlgebra) repLorentzGroup + LeptonSinglet.repLorentzGroup (leptonSingletField i) := + isLorentzDerivTransforms_species _ _ (fun _ _ => rfl) + (leptonSingletField_eq_fermionSymbol i) + +/-- The conjugate symbols of the `i`-th generation charged-lepton singlet transform as the + derivative symbols of the conjugate Weyl spinor. -/ +theorem isLorentzDerivTransforms_conjLeptonSingletField (i : Fin 3) : + IsLorentzDerivTransforms (A := JetAlgebra) repLorentzGroup + LeptonSinglet.repLorentzGroup.conj (conjLeptonSingletField i) := + isLorentzDerivTransforms_conjSpecies _ _ (fun _ _ => rfl) + (conjLeptonSingletField_eq_conjFermionSymbol i) + +/-! + +## D. The Standard Model instance + +Every obligation of `IsStandardModel` is now in hand: the gauge field is a gauge field, the +twelve matter families transform in their jet gauge representations and their Lorentz +representations, the fifteen generating families are monomial eigenvectors of +`massWeightPoly` at the mass weights the structure predicts, and the statistics of the +symbols are the three facts of `JetAlgebra.Generators` — the gauge symbols are central, the +Higgs symbols commute with everything, and the fermion symbols anticommute. + +-/ + +/-- The jet algebra of the Standard Model is a Standard Model: with the jet gauge action, + the Lorentz action, the mass-weight grading and the thirteen families of derivative + symbols built in the preceding files, it satisfies every axiom of `IsStandardModel`. + + This is the point at which the abstract theory of `IsStandardModel` — its covariant + reduction, its mass-weight filtration and its classification of invariants — becomes a + theory of the concrete algebra in which a Standard Model Lagrangian is written. -/ +theorem isStandardModel : IsStandardModel JetAlgebra repJetGaugeGroupI repLorentzGroup + massWeightPoly higgsField conjHiggsField gaugeField + downSingletField conjDownSingletField upSingletField conjUpSingletField + quarkDoubletField conjQuarkDoubletField leptonDoubletField conjLeptonDoubletField + leptonSingletField conjLeptonSingletField where + repJet_A := isGaugeField + repJet_H := transformsIn_higgsField + repJet_barH := transformsIn_conjHiggsField + repJet_d := transformsIn_downSingletField + repJet_bard := transformsIn_conjDownSingletField + repJet_u := transformsIn_upSingletField + repJet_baru := transformsIn_conjUpSingletField + repJet_Q := transformsIn_quarkDoubletField + repJet_barQ := transformsIn_conjQuarkDoubletField + repJet_L := transformsIn_leptonDoubletField + repJet_barL := transformsIn_conjLeptonDoubletField + repJet_e := transformsIn_leptonSingletField + repJet_bare := transformsIn_conjLeptonSingletField + repLorentz_H := isLorentzDerivTransforms_higgsField + repLorentz_barH := isLorentzDerivTransforms_conjHiggsField + repLorentz_d := isLorentzDerivTransforms_downSingletField + repLorentz_bard := isLorentzDerivTransforms_conjDownSingletField + repLorentz_u := isLorentzDerivTransforms_upSingletField + repLorentz_baru := isLorentzDerivTransforms_conjUpSingletField + repLorentz_Q := isLorentzDerivTransforms_quarkDoubletField + repLorentz_barQ := isLorentzDerivTransforms_conjQuarkDoubletField + repLorentz_L := isLorentzDerivTransforms_leptonDoubletField + repLorentz_barL := isLorentzDerivTransforms_conjLeptonDoubletField + repLorentz_e := isLorentzDerivTransforms_leptonSingletField + repLorentz_bare := isLorentzDerivTransforms_conjLeptonSingletField + massWeight_H := massWeightPoly_higgsField + massWeight_barH := massWeightPoly_conjHiggsField + massWeight_A := massWeightPoly_gaugeField + massWeight_d := massWeightPoly_downSingletField + massWeight_bard := massWeightPoly_conjDownSingletField + massWeight_u := massWeightPoly_upSingletField + massWeight_baru := massWeightPoly_conjUpSingletField + massWeight_Q := massWeightPoly_quarkDoubletField + massWeight_barQ := massWeightPoly_conjQuarkDoubletField + massWeight_L := massWeightPoly_leptonDoubletField + massWeight_barL := massWeightPoly_conjLeptonDoubletField + massWeight_e := massWeightPoly_leptonSingletField + massWeight_bare := massWeightPoly_conjLeptonSingletField + A_comm_A := fun s _ μ _ ψ _ => gaugeField_commute s μ ψ _ + A_comm_H := fun s μ ψ _ _ => gaugeField_commute s μ ψ _ + A_comm_barH := fun s μ ψ _ _ => gaugeField_commute s μ ψ _ + A_comm_d := fun s μ ψ _ _ _ => gaugeField_commute s μ ψ _ + A_comm_bard := fun s μ ψ _ _ _ => gaugeField_commute s μ ψ _ + A_comm_u := fun s μ ψ _ _ _ => gaugeField_commute s μ ψ _ + A_comm_baru := fun s μ ψ _ _ _ => gaugeField_commute s μ ψ _ + A_comm_Q := fun s μ ψ _ _ _ => gaugeField_commute s μ ψ _ + A_comm_barQ := fun s μ ψ _ _ _ => gaugeField_commute s μ ψ _ + A_comm_L := fun s μ ψ _ _ _ => gaugeField_commute s μ ψ _ + A_comm_barL := fun s μ ψ _ _ _ => gaugeField_commute s μ ψ _ + A_comm_e := fun s μ ψ _ _ _ => gaugeField_commute s μ ψ _ + A_comm_bare := fun s μ ψ _ _ _ => gaugeField_commute s μ ψ _ + repLorentz_mul := repLorentzGroup_apply_mul + H_comm_H := fun s s' φ φ' => + (memHiggsSector_higgsField s φ).commute (memHiggsSector_higgsField s' φ') + H_comm_barH := fun s s' φ φ' => + (memHiggsSector_higgsField s φ).commute (memHiggsSector_conjHiggsField s' φ') + barH_comm_barH := fun s s' φ φ' => + (memHiggsSector_conjHiggsField s φ).commute (memHiggsSector_conjHiggsField s' φ') + H_comm_d := fun s φ i s' φ' => + (memHiggsSector_higgsField s φ).commute_of_memFermionSector + (isFermionGenerator_downSingletField i s' φ').memFermionSector + H_comm_bard := fun s φ i s' φ' => + (memHiggsSector_higgsField s φ).commute_of_memFermionSector + (isFermionGenerator_conjDownSingletField i s' φ').memFermionSector + H_comm_u := fun s φ i s' φ' => + (memHiggsSector_higgsField s φ).commute_of_memFermionSector + (isFermionGenerator_upSingletField i s' φ').memFermionSector + H_comm_baru := fun s φ i s' φ' => + (memHiggsSector_higgsField s φ).commute_of_memFermionSector + (isFermionGenerator_conjUpSingletField i s' φ').memFermionSector + H_comm_Q := fun s φ i s' φ' => + (memHiggsSector_higgsField s φ).commute_of_memFermionSector + (isFermionGenerator_quarkDoubletField i s' φ').memFermionSector + H_comm_barQ := fun s φ i s' φ' => + (memHiggsSector_higgsField s φ).commute_of_memFermionSector + (isFermionGenerator_conjQuarkDoubletField i s' φ').memFermionSector + H_comm_L := fun s φ i s' φ' => + (memHiggsSector_higgsField s φ).commute_of_memFermionSector + (isFermionGenerator_leptonDoubletField i s' φ').memFermionSector + H_comm_barL := fun s φ i s' φ' => + (memHiggsSector_higgsField s φ).commute_of_memFermionSector + (isFermionGenerator_conjLeptonDoubletField i s' φ').memFermionSector + H_comm_e := fun s φ i s' φ' => + (memHiggsSector_higgsField s φ).commute_of_memFermionSector + (isFermionGenerator_leptonSingletField i s' φ').memFermionSector + H_comm_bare := fun s φ i s' φ' => + (memHiggsSector_higgsField s φ).commute_of_memFermionSector + (isFermionGenerator_conjLeptonSingletField i s' φ').memFermionSector + barH_comm_d := fun s φ i s' φ' => + (memHiggsSector_conjHiggsField s φ).commute_of_memFermionSector + (isFermionGenerator_downSingletField i s' φ').memFermionSector + barH_comm_bard := fun s φ i s' φ' => + (memHiggsSector_conjHiggsField s φ).commute_of_memFermionSector + (isFermionGenerator_conjDownSingletField i s' φ').memFermionSector + barH_comm_u := fun s φ i s' φ' => + (memHiggsSector_conjHiggsField s φ).commute_of_memFermionSector + (isFermionGenerator_upSingletField i s' φ').memFermionSector + barH_comm_baru := fun s φ i s' φ' => + (memHiggsSector_conjHiggsField s φ).commute_of_memFermionSector + (isFermionGenerator_conjUpSingletField i s' φ').memFermionSector + barH_comm_Q := fun s φ i s' φ' => + (memHiggsSector_conjHiggsField s φ).commute_of_memFermionSector + (isFermionGenerator_quarkDoubletField i s' φ').memFermionSector + barH_comm_barQ := fun s φ i s' φ' => + (memHiggsSector_conjHiggsField s φ).commute_of_memFermionSector + (isFermionGenerator_conjQuarkDoubletField i s' φ').memFermionSector + barH_comm_L := fun s φ i s' φ' => + (memHiggsSector_conjHiggsField s φ).commute_of_memFermionSector + (isFermionGenerator_leptonDoubletField i s' φ').memFermionSector + barH_comm_barL := fun s φ i s' φ' => + (memHiggsSector_conjHiggsField s φ).commute_of_memFermionSector + (isFermionGenerator_conjLeptonDoubletField i s' φ').memFermionSector + barH_comm_e := fun s φ i s' φ' => + (memHiggsSector_conjHiggsField s φ).commute_of_memFermionSector + (isFermionGenerator_leptonSingletField i s' φ').memFermionSector + barH_comm_bare := fun s φ i s' φ' => + (memHiggsSector_conjHiggsField s φ).commute_of_memFermionSector + (isFermionGenerator_conjLeptonSingletField i s' φ').memFermionSector + d_anticomm_d := fun i j s s' φ φ' => + (isFermionGenerator_downSingletField i s φ).anticomm + (isFermionGenerator_downSingletField j s' φ') + d_anticomm_bard := fun i j s s' φ φ' => + (isFermionGenerator_downSingletField i s φ).anticomm + (isFermionGenerator_conjDownSingletField j s' φ') + d_anticomm_u := fun i j s s' φ φ' => + (isFermionGenerator_downSingletField i s φ).anticomm (isFermionGenerator_upSingletField j s' φ') + d_anticomm_baru := fun i j s s' φ φ' => + (isFermionGenerator_downSingletField i s φ).anticomm + (isFermionGenerator_conjUpSingletField j s' φ') + d_anticomm_Q := fun i j s s' φ φ' => + (isFermionGenerator_downSingletField i s φ).anticomm + (isFermionGenerator_quarkDoubletField j s' φ') + d_anticomm_barQ := fun i j s s' φ φ' => + (isFermionGenerator_downSingletField i s φ).anticomm + (isFermionGenerator_conjQuarkDoubletField j s' φ') + d_anticomm_L := fun i j s s' φ φ' => + (isFermionGenerator_downSingletField i s φ).anticomm + (isFermionGenerator_leptonDoubletField j s' φ') + d_anticomm_barL := fun i j s s' φ φ' => + (isFermionGenerator_downSingletField i s φ).anticomm + (isFermionGenerator_conjLeptonDoubletField j s' φ') + d_anticomm_e := fun i j s s' φ φ' => + (isFermionGenerator_downSingletField i s φ).anticomm + (isFermionGenerator_leptonSingletField j s' φ') + d_anticomm_bare := fun i j s s' φ φ' => + (isFermionGenerator_downSingletField i s φ).anticomm + (isFermionGenerator_conjLeptonSingletField j s' φ') + bard_anticomm_bard := fun i j s s' φ φ' => + (isFermionGenerator_conjDownSingletField i s φ).anticomm + (isFermionGenerator_conjDownSingletField j s' φ') + bard_anticomm_u := fun i j s s' φ φ' => + (isFermionGenerator_conjDownSingletField i s φ).anticomm + (isFermionGenerator_upSingletField j s' φ') + bard_anticomm_baru := fun i j s s' φ φ' => + (isFermionGenerator_conjDownSingletField i s φ).anticomm + (isFermionGenerator_conjUpSingletField j s' φ') + bard_anticomm_Q := fun i j s s' φ φ' => + (isFermionGenerator_conjDownSingletField i s φ).anticomm + (isFermionGenerator_quarkDoubletField j s' φ') + bard_anticomm_barQ := fun i j s s' φ φ' => + (isFermionGenerator_conjDownSingletField i s φ).anticomm + (isFermionGenerator_conjQuarkDoubletField j s' φ') + bard_anticomm_L := fun i j s s' φ φ' => + (isFermionGenerator_conjDownSingletField i s φ).anticomm + (isFermionGenerator_leptonDoubletField j s' φ') + bard_anticomm_barL := fun i j s s' φ φ' => + (isFermionGenerator_conjDownSingletField i s φ).anticomm + (isFermionGenerator_conjLeptonDoubletField j s' φ') + bard_anticomm_e := fun i j s s' φ φ' => + (isFermionGenerator_conjDownSingletField i s φ).anticomm + (isFermionGenerator_leptonSingletField j s' φ') + bard_anticomm_bare := fun i j s s' φ φ' => + (isFermionGenerator_conjDownSingletField i s φ).anticomm + (isFermionGenerator_conjLeptonSingletField j s' φ') + u_anticomm_u := fun i j s s' φ φ' => + (isFermionGenerator_upSingletField i s φ).anticomm (isFermionGenerator_upSingletField j s' φ') + u_anticomm_baru := fun i j s s' φ φ' => + (isFermionGenerator_upSingletField i s φ).anticomm + (isFermionGenerator_conjUpSingletField j s' φ') + u_anticomm_Q := fun i j s s' φ φ' => + (isFermionGenerator_upSingletField i s φ).anticomm + (isFermionGenerator_quarkDoubletField j s' φ') + u_anticomm_barQ := fun i j s s' φ φ' => + (isFermionGenerator_upSingletField i s φ).anticomm + (isFermionGenerator_conjQuarkDoubletField j s' φ') + u_anticomm_L := fun i j s s' φ φ' => + (isFermionGenerator_upSingletField i s φ).anticomm + (isFermionGenerator_leptonDoubletField j s' φ') + u_anticomm_barL := fun i j s s' φ φ' => + (isFermionGenerator_upSingletField i s φ).anticomm + (isFermionGenerator_conjLeptonDoubletField j s' φ') + u_anticomm_e := fun i j s s' φ φ' => + (isFermionGenerator_upSingletField i s φ).anticomm + (isFermionGenerator_leptonSingletField j s' φ') + u_anticomm_bare := fun i j s s' φ φ' => + (isFermionGenerator_upSingletField i s φ).anticomm + (isFermionGenerator_conjLeptonSingletField j s' φ') + baru_anticomm_baru := fun i j s s' φ φ' => + (isFermionGenerator_conjUpSingletField i s φ).anticomm + (isFermionGenerator_conjUpSingletField j s' φ') + baru_anticomm_Q := fun i j s s' φ φ' => + (isFermionGenerator_conjUpSingletField i s φ).anticomm + (isFermionGenerator_quarkDoubletField j s' φ') + baru_anticomm_barQ := fun i j s s' φ φ' => + (isFermionGenerator_conjUpSingletField i s φ).anticomm + (isFermionGenerator_conjQuarkDoubletField j s' φ') + baru_anticomm_L := fun i j s s' φ φ' => + (isFermionGenerator_conjUpSingletField i s φ).anticomm + (isFermionGenerator_leptonDoubletField j s' φ') + baru_anticomm_barL := fun i j s s' φ φ' => + (isFermionGenerator_conjUpSingletField i s φ).anticomm + (isFermionGenerator_conjLeptonDoubletField j s' φ') + baru_anticomm_e := fun i j s s' φ φ' => + (isFermionGenerator_conjUpSingletField i s φ).anticomm + (isFermionGenerator_leptonSingletField j s' φ') + baru_anticomm_bare := fun i j s s' φ φ' => + (isFermionGenerator_conjUpSingletField i s φ).anticomm + (isFermionGenerator_conjLeptonSingletField j s' φ') + Q_anticomm_Q := fun i j s s' φ φ' => + (isFermionGenerator_quarkDoubletField i s φ).anticomm + (isFermionGenerator_quarkDoubletField j s' φ') + Q_anticomm_barQ := fun i j s s' φ φ' => + (isFermionGenerator_quarkDoubletField i s φ).anticomm + (isFermionGenerator_conjQuarkDoubletField j s' φ') + Q_anticomm_L := fun i j s s' φ φ' => + (isFermionGenerator_quarkDoubletField i s φ).anticomm + (isFermionGenerator_leptonDoubletField j s' φ') + Q_anticomm_barL := fun i j s s' φ φ' => + (isFermionGenerator_quarkDoubletField i s φ).anticomm + (isFermionGenerator_conjLeptonDoubletField j s' φ') + Q_anticomm_e := fun i j s s' φ φ' => + (isFermionGenerator_quarkDoubletField i s φ).anticomm + (isFermionGenerator_leptonSingletField j s' φ') + Q_anticomm_bare := fun i j s s' φ φ' => + (isFermionGenerator_quarkDoubletField i s φ).anticomm + (isFermionGenerator_conjLeptonSingletField j s' φ') + barQ_anticomm_barQ := fun i j s s' φ φ' => + (isFermionGenerator_conjQuarkDoubletField i s φ).anticomm + (isFermionGenerator_conjQuarkDoubletField j s' φ') + barQ_anticomm_L := fun i j s s' φ φ' => + (isFermionGenerator_conjQuarkDoubletField i s φ).anticomm + (isFermionGenerator_leptonDoubletField j s' φ') + barQ_anticomm_barL := fun i j s s' φ φ' => + (isFermionGenerator_conjQuarkDoubletField i s φ).anticomm + (isFermionGenerator_conjLeptonDoubletField j s' φ') + barQ_anticomm_e := fun i j s s' φ φ' => + (isFermionGenerator_conjQuarkDoubletField i s φ).anticomm + (isFermionGenerator_leptonSingletField j s' φ') + barQ_anticomm_bare := fun i j s s' φ φ' => + (isFermionGenerator_conjQuarkDoubletField i s φ).anticomm + (isFermionGenerator_conjLeptonSingletField j s' φ') + L_anticomm_L := fun i j s s' φ φ' => + (isFermionGenerator_leptonDoubletField i s φ).anticomm + (isFermionGenerator_leptonDoubletField j s' φ') + L_anticomm_barL := fun i j s s' φ φ' => + (isFermionGenerator_leptonDoubletField i s φ).anticomm + (isFermionGenerator_conjLeptonDoubletField j s' φ') + L_anticomm_e := fun i j s s' φ φ' => + (isFermionGenerator_leptonDoubletField i s φ).anticomm + (isFermionGenerator_leptonSingletField j s' φ') + L_anticomm_bare := fun i j s s' φ φ' => + (isFermionGenerator_leptonDoubletField i s φ).anticomm + (isFermionGenerator_conjLeptonSingletField j s' φ') + barL_anticomm_barL := fun i j s s' φ φ' => + (isFermionGenerator_conjLeptonDoubletField i s φ).anticomm + (isFermionGenerator_conjLeptonDoubletField j s' φ') + barL_anticomm_e := fun i j s s' φ φ' => + (isFermionGenerator_conjLeptonDoubletField i s φ).anticomm + (isFermionGenerator_leptonSingletField j s' φ') + barL_anticomm_bare := fun i j s s' φ φ' => + (isFermionGenerator_conjLeptonDoubletField i s φ).anticomm + (isFermionGenerator_conjLeptonSingletField j s' φ') + e_anticomm_e := fun i j s s' φ φ' => + (isFermionGenerator_leptonSingletField i s φ).anticomm + (isFermionGenerator_leptonSingletField j s' φ') + e_anticomm_bare := fun i j s s' φ φ' => + (isFermionGenerator_leptonSingletField i s φ).anticomm + (isFermionGenerator_conjLeptonSingletField j s' φ') + bare_anticomm_bare := fun i j s s' φ φ' => + (isFermionGenerator_conjLeptonSingletField i s φ).anticomm + (isFermionGenerator_conjLeptonSingletField j s' φ') + +/-! + +## E. The field algebra is everything + +The field algebra of an `IsStandardModel` is the algebra generated by the thirteen families +of derivative symbols. On the jet algebra it is everything: a Standard Model Lagrangian +lives in an algebra in which there is nothing to write down but the fields and their +derivatives. + +The consequence is that the mass-weight filtration simplifies. The graded piece +`IsStandardModel.massWeightSubmodule n` is by definition the intersection of the field +algebra with the kernel of `massWeightPoly - X ^ n`; with the field algebra the whole +algebra the intersection is idle, and what is left is the honest weight-`n` eigenspace of +`massWeightPoly` on the whole algebra. That collapse is section E.2, stated for an +arbitrary `IsStandardModel` whose field algebra is everything. + +The weight pieces and the filtration are therefore worth having on `JetAlgebra` directly, +with no mention of an `IsStandardModel` instance, and section E.3 gives them: a reader of +the classification of section F should not have to know that an instance exists. They are +defined by the eigenvalue equation rather than as a kernel because `Polynomial JetAlgebra` +carries no synthesizable `Ring` instance — the search does not close at this concrete +type — so the subtraction `massWeightPoly - X ^ n` can only be written at an abstract type. +The bridges of section E.3 identify the two. + +-/ + +/-! + +### E.1. The field algebra + +-/ + +/-- The fields of the Standard Model generate its jet algebra: the field algebra of the + instance is the whole of `JetAlgebra`. -/ +theorem isStandardModel_fieldAlgebra_eq_top : isStandardModel.fieldAlgebra = ⊤ := + adjoin_generators_eq_top + +end JetAlgebra + +/-! + +### E.2. The collapse of the graded pieces + +-/ + +namespace IsStandardModel + +open TensorProduct Matrix MatrixGroups Lorentz + +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) + +/-- When the field algebra is everything the graded piece of mass weight `n` is the + weight-`n` eigenspace of `massWeightPoly` on the whole algebra: the intersection with the + field algebra in the definition of `massWeightSubmodule` cuts nothing away. -/ +theorem massWeightSubmodule_eq_ker (htop : h.fieldAlgebra = ⊤) (n : ℕ) : + h.massWeightSubmodule n + = LinearMap.ker (massWeightPoly.toLinearMap + - (Polynomial.monomial n : B →ₗ[B] Polynomial B).restrictScalars ℂ) := by + show h.fieldAlgebra.toSubmodule ⊓ _ = _ + rw [htop, Algebra.top_toSubmodule, top_inf_eq] + +/-- When the field algebra is everything the filtration by mass weight at most `w` is the + join of the eigenspaces of `massWeightPoly` of weight `0` through `w`, taken over the + whole algebra. -/ +theorem massWeightSubmoduleLE_eq_iSup_ker (htop : h.fieldAlgebra = ⊤) (w : ℕ) : + h.massWeightSubmoduleLE w + = ⨆ k ∈ Finset.range (w + 1), LinearMap.ker (massWeightPoly.toLinearMap + - (Polynomial.monomial k : B →ₗ[B] Polynomial B).restrictScalars ℂ) := + iSup_congr fun k => iSup_congr fun _ => h.massWeightSubmodule_eq_ker htop k + +end IsStandardModel + +namespace JetAlgebra + +open TensorProduct Matrix MatrixGroups Lorentz + +/-! + +### E.3. The mass-weight filtration of the jet algebra + +-/ + +/-- The weight-`n` piece of the jet algebra, defined on the algebra itself: the eigenspace + on which `massWeightPoly` is the monomial `X ^ n`. Nothing about `IsStandardModel` enters + the definition; that it agrees with the instance's graded piece is + `isStandardModel_massWeightSubmodule`. -/ +noncomputable def massWeightSubmodule (n : ℕ) : Submodule ℂ JetAlgebra where + carrier := {x | massWeightPoly x = Polynomial.monomial n x} + zero_mem' := by simp + add_mem' hx hy := by + simp only [Set.mem_setOf_eq] at hx hy ⊢ + rw [map_add, hx, hy, map_add] + smul_mem' c x hx := by + simp only [Set.mem_setOf_eq] at hx ⊢ + rw [map_smul, hx, ← Polynomial.smul_monomial] + +/-- Membership of the weight-`n` piece is the eigenvalue equation. -/ +@[simp] +lemma mem_massWeightSubmodule {n : ℕ} {x : JetAlgebra} : + x ∈ massWeightSubmodule n ↔ massWeightPoly x = Polynomial.monomial n x := Iff.rfl + +/-- The mass-weight filtration of the jet algebra, defined on the algebra itself: the join + of the weight pieces of weight at most `w`. An element lies in it exactly when it is a + sum of eigenvectors of `massWeightPoly` of weight at most `w`. -/ +noncomputable def massWeightSubmoduleLE (w : ℕ) : Submodule ℂ JetAlgebra := + ⨆ k ∈ Finset.range (w + 1), massWeightSubmodule k + +/-- The graded piece defined on the jet algebra is the graded piece of the instance: the + two differ only by the intersection with the field algebra, which is everything. -/ +lemma isStandardModel_massWeightSubmodule (n : ℕ) : + isStandardModel.massWeightSubmodule n = massWeightSubmodule n := by + rw [isStandardModel.massWeightSubmodule_eq_ker isStandardModel_fieldAlgebra_eq_top] + ext x + rw [LinearMap.mem_ker, mem_massWeightSubmodule] + simp [sub_eq_zero] + +/-- The filtration defined on the jet algebra is the filtration of the instance. -/ +lemma isStandardModel_massWeightSubmoduleLE (w : ℕ) : + isStandardModel.massWeightSubmoduleLE w = massWeightSubmoduleLE w := by + show ⨆ k ∈ Finset.range (w + 1), isStandardModel.massWeightSubmodule k = _ + exact iSup_congr fun k => iSup_congr fun _ => isStandardModel_massWeightSubmodule k + +/-! + +## F. The Standard Model Lagrangian + +This is what the chain was built for, and the first theorem below is the headline. Take +any element `x` of the jet algebra of mass weight at most eight — that is, of mass +dimension at most four; by section E that is a condition on `x` alone, and it is the only +hypothesis there is. Then `x` is invariant under the jet gauge group and under the Lorentz +group if and only if it is a combination of + +* the constant term, of mass dimension zero; +* the Higgs mass term `H† H`, of mass dimension two; +* and the dimension-four Standard Model Lagrangian — the gauge kinetic and theta terms of + the three gauge groups, the Higgs kinetic term, its quartic potential and its two box + terms, the kinetic terms of the ten fermion species over the nine family pairs, and the + six Yukawa couplings over the nine family pairs — + +and nothing else. No further term of dimension four is invariant, and none of these is +forced to vanish. + +The second theorem is the same classification with a submodule `S` set aside — the +operators of mass dimension above four, for a reader who wants to work modulo them. It is +strictly more general and strictly less readable, which is why it comes second. It keeps its +hypothesis `hScov : S ≤ covAlgebra.toSubmodule`, and that is not an oversight of the +simplification of section E. The field algebra is everything, but the covariant subalgebra +is not: a covariant element is fixed by the pure gauge jets, while the gauge potential +picks up the Maurer–Cartan shift and so is not. `covAlgebra` therefore stays a proper +subalgebra of `JetAlgebra`, and a set-aside `S` still has to be written in the covariant +towers for the classification to say anything about it. + +-/ + +/-- The invariant content of the Standard Model up to mass dimension four, on the jet + algebra of the Standard Model itself, with nothing set aside. An element of mass weight + at most eight is fixed by the jet gauge group and by the Lorentz group exactly when it is + a combination of the constant term, the Higgs mass term `H† H`, and the Standard Model + Lagrangian of mass dimension four: the gauge kinetic and theta terms + (`IsGaugeSector.lorentzContractionEightSpan`), the Higgs kinetic term, quartic potential + and box terms (`IsHiggsSector.lorentzContractionEightSpan`), the fermion kinetic terms + (`IsFermionSector.kineticSpan`) and the Yukawa couplings (`yukawaSpan`) — and nothing + else. + + There are no other hypotheses. The mass-weight condition is a condition on `x` alone: by + `mem_massWeightSubmodule` it says that `x` is a sum of eigenvectors of `massWeightPoly` + of weight at most eight, with no demand that `x` lie in any subalgebra. -/ +theorem mem_massWeightSubmoduleLE_eight_and_invariant_iff_lagrangian (x : JetAlgebra) : + (x ∈ massWeightSubmoduleLE 8 + ∧ (∀ U : JetGaugeGroupI, repJetGaugeGroupI U x = x) + ∧ ∀ Λ : SL(2,ℂ), repLorentzGroup Λ x = x) + ↔ x ∈ 1 + ⊔ (isStandardModel.isCovStandardModel.isHiggsSector.dotSpan 0 0 + ⊔ (isStandardModel.isCovStandardModel.isGaugeSector.lorentzContractionEightSpan + ⊔ isStandardModel.isCovStandardModel.isHiggsSector.lorentzContractionEightSpan + ⊔ (isStandardModel.isCovStandardModel.isFermionSector.kineticSpan + ⊔ isStandardModel.isCovStandardModel.yukawaSpan))) := by + rw [← isStandardModel_massWeightSubmoduleLE] + exact isStandardModel.mem_massWeightSubmoduleLE_eight_and_invariant_iff_lagrangian x + +set_option maxHeartbeats 40000000 in +/-- The same classification as + `mem_massWeightSubmoduleLE_eight_and_invariant_iff_lagrangian`, with a submodule `S` set + aside — the operators of mass dimension above four, say. An element of + `massWeightSubmoduleLE 8 ⊔ S` is fixed by the jet gauge group and the Lorentz group + exactly when it is the Standard Model Lagrangian, the Higgs mass term and a constant, up + to a remainder in `S` fixed by both groups. + + The hypothesis `hScov` does not disappear when the field algebra becomes everything: the + covariant subalgebra `covAlgebra` remains a proper subalgebra, because a covariant + element is fixed by the pure gauge jets whereas the gauge potential picks up the + Maurer–Cartan shift. A set-aside `S` therefore still has to be written in the covariant + towers, which is the case of interest — higher-dimension operators are built from + covariant derivatives and the field strength. -/ +theorem mem_massWeightSubmoduleLE_eight_sup_and_invariant_iff_lagrangian + (S : Submodule ℂ JetAlgebra) + (hS : ∀ U : JetGaugeGroupI, ∀ y ∈ S, repJetGaugeGroupI U y ∈ S) + (hSL : ∀ Λ : SL(2,ℂ), ∀ y ∈ S, repLorentzGroup Λ y ∈ S) + (hScov : S ≤ isStandardModel.covAlgebra.toSubmodule) (x : JetAlgebra) : + (x ∈ massWeightSubmoduleLE 8 ⊔ S + ∧ (∀ U : JetGaugeGroupI, repJetGaugeGroupI U x = x) + ∧ ∀ Λ : SL(2,ℂ), repLorentzGroup Λ x = x) + ↔ ∃ y ∈ S, (∀ U : JetGaugeGroupI, repJetGaugeGroupI U y = y) + ∧ (∀ Λ : SL(2,ℂ), repLorentzGroup Λ y = y) + ∧ x - y ∈ 1 + ⊔ (isStandardModel.isCovStandardModel.isHiggsSector.dotSpan 0 0 + ⊔ (isStandardModel.isCovStandardModel.isGaugeSector.lorentzContractionEightSpan + ⊔ isStandardModel.isCovStandardModel.isHiggsSector.lorentzContractionEightSpan + ⊔ (isStandardModel.isCovStandardModel.isFermionSector.kineticSpan + ⊔ isStandardModel.isCovStandardModel.yukawaSpan))) := by + rw [← isStandardModel_massWeightSubmoduleLE] + exact isStandardModel.mem_massWeightSubmoduleLE_eight_sup_and_invariant_iff_lagrangian + S hS hSL hScov x + +end JetAlgebra + +end StandardModel diff --git a/Physlib/Particles/StandardModel/JetAlgebra/JetDeriv.lean b/Physlib/Particles/StandardModel/JetAlgebra/JetDeriv.lean index 8e1549152..09361dd22 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/JetDeriv.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/JetDeriv.lean @@ -16,8 +16,9 @@ public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.JetDer 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. +obeys the Leibniz rule, its components commute, and through each sector inclusion it +restricts to that sector's own derivative — for a single direction and for an iterated +multiset of directions alike. 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 @@ -28,15 +29,20 @@ product is prohibitively slow. - `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. +- `JetAlgebra.jetDeriv_includeGauge`, `jetDeriv_includeFermion`, `jetDeriv_includeHiggs` : + the restrictions to the three sectors. +- `JetAlgebra.iteratedD_includeFermion`, `iteratedD_includeHiggs` : the same for the + iterated derivative. ## iii. Table of contents - A. The formal total derivative - - A.1. The action on pure tensors and the gauge sector + - A.1. The action on pure tensors + - A.2. The action on the three sectors - B. Derivations on tensor products - C. The Leibniz rule - D. Commutativity +- E. The iterated derivative -/ @@ -70,7 +76,7 @@ noncomputable def jetDeriv (μ : Fin 1 ⊕ Fin 3) : JetAlgebra →ₗ[ℂ] JetAl /-! -### A.1. The action on pure tensors and the gauge sector +### A.1. The action on pure tensors -/ @@ -81,6 +87,51 @@ lemma jetDeriv_tmul (μ : Fin 1 ⊕ Fin 3) (f : FermionJetAlgebra) (h : HiggsJet + (f ⊗ₜ[ℂ] (BosonicAlgebra.jetDeriv μ h)) ⊗ₜ[ℂ] g + (f ⊗ₜ[ℂ] h) ⊗ₜ[ℂ] (GaugeJetAlgebra.complexJetDeriv μ g) := rfl +/-! + +### A.2. The action on the three sectors + +Each sector inclusion sends a sector element to a pure tensor whose other two factors are +`1`, and the total derivative annihilates `1` in every factor; so only the sector's own +derivative survives, and each inclusion intertwines the two derivatives. + +-/ + +/-- The gauge sector's derivative annihilates the unit of the complexified gauge jet + algebra. -/ +private lemma complexJetDeriv_one (μ : Fin 1 ⊕ Fin 3) : + GaugeJetAlgebra.complexJetDeriv μ (1 : ℂ ⊗[ℝ] GaugeJetAlgebra) = 0 := by + rw [show (1 : ℂ ⊗[ℝ] GaugeJetAlgebra) = (1 : ℂ) ⊗ₜ[ℝ] (1 : GaugeJetAlgebra) from rfl, + GaugeJetAlgebra.complexJetDeriv_tmul, GaugeJetAlgebra.jetDeriv_one, + TensorProduct.tmul_zero] + +/-- The derivative acts on the fermionic sector through the fermionic sector's own + derivative. -/ +lemma jetDeriv_includeFermion (μ : Fin 1 ⊕ Fin 3) (f : FermionJetAlgebra) : + jetDeriv μ (includeFermion f) = includeFermion (FermionicAlgebra.jetDeriv μ f) := by + have hincl : ∀ x : FermionJetAlgebra, includeFermion x + = (x ⊗ₜ[ℂ] (1 : HiggsJetAlgebra)) ⊗ₜ[ℂ] (1 : ℂ ⊗[ℝ] GaugeJetAlgebra) := + fun _ => rfl + rw [hincl f, jetDeriv_tmul, + show BosonicAlgebra.jetDeriv (V := HiggsVec) μ (1 : HiggsJetAlgebra) = 0 from + BosonicAlgebra.jetDeriv_one μ, + complexJetDeriv_one, TensorProduct.tmul_zero, TensorProduct.zero_tmul, + TensorProduct.tmul_zero, add_zero, add_zero] + exact (hincl (FermionicAlgebra.jetDeriv μ f)).symm + +/-- The derivative acts on the Higgs sector through the Higgs sector's own derivative. -/ +lemma jetDeriv_includeHiggs (μ : Fin 1 ⊕ Fin 3) (h : HiggsJetAlgebra) : + jetDeriv μ (includeHiggs h) = includeHiggs (BosonicAlgebra.jetDeriv μ h) := by + have hincl : ∀ x : HiggsJetAlgebra, includeHiggs x + = ((1 : FermionJetAlgebra) ⊗ₜ[ℂ] x) ⊗ₜ[ℂ] (1 : ℂ ⊗[ℝ] GaugeJetAlgebra) := + fun _ => rfl + rw [hincl h, jetDeriv_tmul, + show FermionicAlgebra.jetDeriv (V := FermionSpace) μ (1 : FermionJetAlgebra) = 0 from + FermionicAlgebra.jetDeriv_one μ, + complexJetDeriv_one, TensorProduct.zero_tmul, TensorProduct.zero_tmul, + TensorProduct.tmul_zero, zero_add, add_zero] + exact (hincl (BosonicAlgebra.jetDeriv μ h)).symm + /-- 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 @@ -272,10 +323,40 @@ lemma jetDeriv_comm (μ ν : Fin 1 ⊕ Fin 3) : /-! -## The iterated derivative +## E. The iterated derivative + +Iterating the sector restrictions of section A.2 along a multiset of directions: the +iterated total derivative restricts to the sector's own iterated derivative. These are the +forms the generator families of each sector consume. -/ +/-- The iterated total derivative acts on the fermionic sector through the fermionic + sector's own iterated derivative. -/ +lemma iteratedD_includeFermion (s : Multiset (Fin 1 ⊕ Fin 3)) (f : FermionJetAlgebra) : + Lorentz.iteratedD jetDeriv jetDeriv_comm s (includeFermion f) + = includeFermion (FermionicAlgebra.iteratedJetDeriv s f) := by + induction s using Multiset.induction_on with + | empty => + rw [Lorentz.iteratedD_zero, FermionicAlgebra.iteratedJetDeriv_zero, + LinearMap.id_apply, LinearMap.id_apply] + | cons κ s ih => + rw [Lorentz.iteratedD_cons, FermionicAlgebra.iteratedJetDeriv_cons, + LinearMap.comp_apply, LinearMap.comp_apply, ih, jetDeriv_includeFermion] + +/-- The iterated total derivative acts on the Higgs sector through the Higgs sector's own + iterated derivative. -/ +lemma iteratedD_includeHiggs (s : Multiset (Fin 1 ⊕ Fin 3)) (h : HiggsJetAlgebra) : + Lorentz.iteratedD jetDeriv jetDeriv_comm s (includeHiggs h) + = includeHiggs (BosonicAlgebra.iteratedJetDeriv s h) := by + induction s using Multiset.induction_on with + | empty => + rw [Lorentz.iteratedD_zero, BosonicAlgebra.iteratedJetDeriv_zero, + LinearMap.id_apply, LinearMap.id_apply] + | cons κ s ih => + rw [Lorentz.iteratedD_cons, BosonicAlgebra.iteratedJetDeriv_cons, + LinearMap.comp_apply, LinearMap.comp_apply, ih, jetDeriv_includeHiggs] + end JetAlgebra end StandardModel diff --git a/Physlib/Particles/StandardModel/JetAlgebra/MassWeightPoly.lean b/Physlib/Particles/StandardModel/JetAlgebra/MassWeightPoly.lean new file mode 100644 index 000000000..79e9c6457 --- /dev/null +++ b/Physlib/Particles/StandardModel/JetAlgebra/MassWeightPoly.lean @@ -0,0 +1,434 @@ +/- +Copyright (c) 2026 Joseph Tooby-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.Generators +public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.MassWeightPoly +public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.MassWeightPoly +public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.MassWeightPoly +/-! +# The mass-weight polynomial on the jet algebra of the Standard Model + +## i. Overview + +Each of the three sectors of the jet algebra of the Standard Model carries its own +mass-weight grading: `FermionicAlgebra.massWeightPoly 3` on the fermions, whose symbols have +mass dimension `3/2`, `BosonicAlgebra.massWeightPoly 2` on the Higgs and +`GaugeJetAlgebra.complexMassWeightPoly` on the gauge bosons, whose symbols have mass +dimension one. This file assembles them into a single grading + +`massWeightPoly : JetAlgebra →ₐ[ℂ] Polynomial JetAlgebra` + +and computes it on every generating family. + +The assembly is two applications of the universal property of the tensor product of +algebras. Each sector grading is first transported into `Polynomial JetAlgebra` along +`Polynomial.mapAlgHom` of that sector's inclusion; the two matter gradings are then lifted +over `FermionJetAlgebra ⊗[ℂ] HiggsJetAlgebra`, and that lift over the whole algebra. Both +lifts need a commutation side condition, and both reduce to the statistics already proved +in `Physlib.Particles.StandardModel.JetAlgebra.Generators`: two polynomials commute as soon +as their coefficients do, the Higgs sector commutes with the fermionic sector, and the +gauge sector is central. + +Because each sector's generator lemma has the shape `massWeightPoly g = monomial n g` — the +generator *itself* as the coefficient — transporting it along `Polynomial.mapAlgHom` is a +single rewrite by `Polynomial.mapAlgHom_monomial`. So every generating family of the full +algebra is again a monomial eigenvector, of exactly the weight `IsStandardModel` predicts: +`2 * (1 + |s|)` for the bosons, `3 + 2 * |s|` for the fermions. + +## ii. Key results + +- `JetAlgebra.massWeightPoly` : the mass-weight grading on the jet algebra of the Standard + Model. +- `JetAlgebra.massWeightPoly_includeFermion`, `massWeightPoly_includeHiggs`, + `massWeightPoly_includeGauge` : the grading restricted to each sector. +- `JetAlgebra.massWeightPoly_higgsField`, `massWeightPoly_gaugeField`, + `massWeightPoly_leptonDoubletField`, … : the fifteen generator families are monomial + eigenvectors. + +## iii. Table of contents + +- A. Commuting polynomials over the jet algebra +- B. The mass-weight polynomial on the jet algebra +- C. The grading through the sector inclusions +- D. The mass weight of the Higgs symbols +- E. The mass weight of the gauge-field symbols +- F. The mass weight of the fermion symbols + - F.1. The symbols on the total fermionic target space + - F.2. The ten species families + +-/ + +@[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. Commuting polynomials over the jet algebra + +The two lifts that assemble the grading each demand that the images of the two factors +commute. Both images consist of polynomials, and in both cases the commutation is already +known one coefficient at a time — so the work of this section is to promote a commutation +of coefficients to a commutation of polynomials, which is an induction over monomials. + +-/ + +/-- Two monomials with commuting coefficients commute: the variable is central, so the two + products are the same monomial. -/ +lemma commute_monomial {C : Type*} [Semiring C] {a b : C} (h : Commute a b) + (n m : ℕ) : Commute (Polynomial.monomial n a) (Polynomial.monomial m b) := by + show Polynomial.monomial n a * Polynomial.monomial m b + = Polynomial.monomial m b * Polynomial.monomial n a + rw [Polynomial.monomial_mul_monomial, Polynomial.monomial_mul_monomial, h.eq, + Nat.add_comm] + +/-- Polynomials pushed forward along two algebra maps with commuting images commute: every + polynomial is a sum of monomials, and monomials with commuting coefficients commute. -/ +lemma commute_mapAlgHom {A B C : Type*} [Semiring A] [Algebra ℂ A] [Semiring B] + [Algebra ℂ B] [Semiring C] [Algebra ℂ C] (f : A →ₐ[ℂ] C) (g : B →ₐ[ℂ] C) + (h : ∀ (a : A) (b : B), Commute (f a) (g b)) (p : Polynomial A) (q : Polynomial B) : + Commute (Polynomial.mapAlgHom f p) (Polynomial.mapAlgHom g q) := by + induction p using Polynomial.induction_on' with + | add p₁ p₂ h₁ h₂ => rw [map_add]; exact h₁.add_left h₂ + | monomial n a => + induction q using Polynomial.induction_on' with + | add q₁ q₂ h₁ h₂ => rw [map_add]; exact h₁.add_right h₂ + | monomial m b => + rw [Polynomial.mapAlgHom_monomial, Polynomial.mapAlgHom_monomial] + exact commute_monomial (h a b) n m + +/-- Every polynomial over the jet algebra commutes with a polynomial whose coefficients lie + in the gauge sector: the gauge sector is central, so the commutation holds coefficient by + coefficient. -/ +lemma commute_mapAlgHom_includeGauge (p : Polynomial JetAlgebra) + (q : Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra)) : + Commute p (Polynomial.mapAlgHom includeGauge q) := by + induction q using Polynomial.induction_on' with + | add q₁ q₂ h₁ h₂ => rw [map_add]; exact h₁.add_right h₂ + | monomial m b => + rw [Polynomial.mapAlgHom_monomial] + induction p using Polynomial.induction_on' with + | add p₁ p₂ h₁ h₂ => exact h₁.add_left h₂ + | monomial n a => + have hc : Commute a (includeGauge b) := includeGauge_commute b a + exact commute_monomial hc n m + +/-! + +## B. The mass-weight polynomial on the jet algebra + +Each sector's grading is transported into `Polynomial JetAlgebra` along +`Polynomial.mapAlgHom` of that sector's inclusion, and the three transported gradings are +assembled by the universal property of the tensor product — first over the matter factor, +then over the whole algebra. + +-/ + +/-- The fermionic mass-weight grading, transported into the full jet algebra. The fermionic + symbols have mass dimension `3/2`, hence mass weight three. -/ +noncomputable def fermionMassWeightPoly : + FermionJetAlgebra →ₐ[ℂ] Polynomial JetAlgebra := + (Polynomial.mapAlgHom includeFermion).comp (FermionicAlgebra.massWeightPoly 3) + +/-- The Higgs mass-weight grading, transported into the full jet algebra. The Higgs symbols + have mass dimension one, hence mass weight two. -/ +noncomputable def higgsMassWeightPoly : HiggsJetAlgebra →ₐ[ℂ] Polynomial JetAlgebra := + (Polynomial.mapAlgHom includeHiggs).comp (BosonicAlgebra.massWeightPoly 2) + +/-- The gauge-boson mass-weight grading, transported into the full jet algebra. The gauge + symbols have mass dimension one, hence mass weight two. -/ +noncomputable def gaugeMassWeightPoly : + (ℂ ⊗[ℝ] GaugeJetAlgebra) →ₐ[ℂ] Polynomial JetAlgebra := + (Polynomial.mapAlgHom includeGauge).comp GaugeJetAlgebra.complexMassWeightPoly + +/-- The mass-weight grading on the matter factor of the jet algebra: the fermionic and + Higgs gradings, lifted over their tensor product. The side condition is that the two + images commute, which they do because the Higgs sector commutes with the fermionic + sector. -/ +noncomputable def matterMassWeightPoly : + (FermionJetAlgebra ⊗[ℂ] HiggsJetAlgebra) →ₐ[ℂ] Polynomial JetAlgebra := + Algebra.TensorProduct.lift (R := ℂ) (S := ℂ) (A := FermionJetAlgebra) + (B := HiggsJetAlgebra) (C := Polynomial JetAlgebra) + fermionMassWeightPoly higgsMassWeightPoly fun _ _ => + commute_mapAlgHom _ _ (fun a b => + (MemHiggsSector.commute_of_memFermionSector ⟨b, rfl⟩ ⟨a, rfl⟩).symm) _ _ + +/-- The mass-weight polynomial on the jet algebra of the Standard Model: the `ℂ`-algebra + map sending a generator of mass weight `n` to `X ^ n` times itself, so that the + coefficient of `X ^ n` in `massWeightPoly a` is the part of `a` of mass weight `n`. It is + the three sector gradings lifted over the tensor product, the side condition for the + outer lift being the centrality of the gauge sector. -/ +noncomputable def massWeightPoly : JetAlgebra →ₐ[ℂ] Polynomial JetAlgebra := + Algebra.TensorProduct.lift (R := ℂ) (S := ℂ) + (A := FermionJetAlgebra ⊗[ℂ] HiggsJetAlgebra) (B := ℂ ⊗[ℝ] GaugeJetAlgebra) + (C := Polynomial JetAlgebra) matterMassWeightPoly gaugeMassWeightPoly + fun _ _ => commute_mapAlgHom_includeGauge _ _ + +/-! + +## C. The grading through the sector inclusions + +The lift is computed on pure tensors by construction, and each sector inclusion is a pure +tensor with ones in the other factors. So on each sector the full grading is that sector's +own grading, transported. These three lemmas are the whole content of the assembly: every +generator computation below is one of them followed by a sector generator lemma. + +-/ + +/-- On a pure tensor the grading is the product of the matter and gauge gradings. -/ +lemma massWeightPoly_tmul (x : FermionJetAlgebra ⊗[ℂ] HiggsJetAlgebra) + (y : ℂ ⊗[ℝ] GaugeJetAlgebra) : + massWeightPoly (x ⊗ₜ[ℂ] y) = matterMassWeightPoly x * gaugeMassWeightPoly y := rfl + +/-- On a pure tensor the matter grading is the product of the fermionic and Higgs + gradings. -/ +lemma matterMassWeightPoly_tmul (a : FermionJetAlgebra) (h : HiggsJetAlgebra) : + matterMassWeightPoly (a ⊗ₜ[ℂ] h) = fermionMassWeightPoly a * higgsMassWeightPoly h := + rfl + +/-- On the fermionic sector the grading is the fermionic sector's own grading, pushed + forward along the fermionic inclusion. -/ +lemma massWeightPoly_includeFermion (a : FermionJetAlgebra) : + massWeightPoly (includeFermion a) + = Polynomial.mapAlgHom includeFermion (FermionicAlgebra.massWeightPoly 3 a) := by + rw [show includeFermion a = (a ⊗ₜ[ℂ] (1 : HiggsJetAlgebra)) ⊗ₜ[ℂ] + (1 : ℂ ⊗[ℝ] GaugeJetAlgebra) from rfl, massWeightPoly_tmul, + matterMassWeightPoly_tmul, map_one, map_one, mul_one, mul_one] + rfl + +/-- On the Higgs sector the grading is the Higgs sector's own grading, pushed forward along + the Higgs inclusion. -/ +lemma massWeightPoly_includeHiggs (h : HiggsJetAlgebra) : + massWeightPoly (includeHiggs h) + = Polynomial.mapAlgHom includeHiggs (BosonicAlgebra.massWeightPoly 2 h) := by + rw [show includeHiggs h = ((1 : FermionJetAlgebra) ⊗ₜ[ℂ] h) ⊗ₜ[ℂ] + (1 : ℂ ⊗[ℝ] GaugeJetAlgebra) from rfl, massWeightPoly_tmul, + matterMassWeightPoly_tmul, map_one, map_one, mul_one, one_mul] + rfl + +/-- On the gauge sector the grading is the gauge sector's own grading, pushed forward along + the gauge inclusion. -/ +lemma massWeightPoly_includeGauge (y : ℂ ⊗[ℝ] GaugeJetAlgebra) : + massWeightPoly (includeGauge y) + = Polynomial.mapAlgHom includeGauge (GaugeJetAlgebra.complexMassWeightPoly y) := by + rw [show includeGauge y = ((1 : FermionJetAlgebra) ⊗ₜ[ℂ] (1 : HiggsJetAlgebra)) + ⊗ₜ[ℂ] y from rfl, massWeightPoly_tmul, + show ((1 : FermionJetAlgebra) ⊗ₜ[ℂ] (1 : HiggsJetAlgebra)) + = (1 : FermionJetAlgebra ⊗[ℂ] HiggsJetAlgebra) from rfl, map_one, one_mul] + rfl + +/-! + +## D. The mass weight of the Higgs symbols + +The Higgs field has mass dimension one, so the symbol `∂_s H_φ` has mass dimension +`1 + |s|` and mass weight twice that. The exponent is written in the form +`2 * (1 + |s|)` that `IsStandardModel` asks for. + +-/ + +/-- The Higgs symbol `∂_s H_φ` is a monomial eigenvector of mass weight `2 * (1 + |s|)`: + the Higgs field has mass dimension one and each derivative adds one more. -/ +lemma massWeightPoly_higgsField (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ HiggsVec) : + massWeightPoly (higgsField s φ) + = Polynomial.monomial (2 * (1 + Multiset.card s)) (higgsField s φ) := by + rw [show 2 * (1 + Multiset.card s) = 2 + 2 * Multiset.card s from by ring, + higgsField_apply, massWeightPoly_includeHiggs, BosonicAlgebra.massWeightPoly_ι, + BosonicAlgebra.jetComponentPoly_inl, Polynomial.mapAlgHom_monomial] + +/-- The conjugate Higgs symbol `∂_s H̄_φ` is a monomial eigenvector of the same mass weight + `2 * (1 + |s|)` as the symbol it conjugates. -/ +lemma massWeightPoly_conjHiggsField (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule HiggsVec)) : + massWeightPoly (conjHiggsField s φ) + = Polynomial.monomial (2 * (1 + Multiset.card s)) (conjHiggsField s φ) := by + rw [show 2 * (1 + Multiset.card s) = 2 + 2 * Multiset.card s from by ring, + conjHiggsField_apply, massWeightPoly_includeHiggs, BosonicAlgebra.massWeightPoly_ι, + BosonicAlgebra.jetComponentPoly_inr, Polynomial.mapAlgHom_monomial] + +/-! + +## E. The mass weight of the gauge-field symbols + +The gauge field, like the Higgs, has mass dimension one. Its symbols reach the full jet +algebra through the complexification of the real gauge-boson jet algebra, so the +computation passes through the complexified grading of that sector. + +-/ + +/-- The gauge-field symbol `∂_s A_μ^φ` is a monomial eigenvector of mass weight + `2 * (1 + |s|)`: the gauge field has mass dimension one and each derivative adds one + more. -/ +lemma massWeightPoly_gaugeField (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra) : + massWeightPoly (gaugeField s μ φ) + = Polynomial.monomial (2 * (1 + Multiset.card s)) (gaugeField s μ φ) := by + rw [show 2 * (1 + Multiset.card s) = 2 + 2 * Multiset.card s from by ring, + gaugeField_apply, GaugeJetAlgebra.gaugeField_apply, + GaugeJetAlgebra.iteratedD_complexJetDeriv_one_tmul, massWeightPoly_includeGauge, + GaugeJetAlgebra.complexMassWeightPoly_tmul_iteratedJetDeriv_ofA, + Polynomial.mapAlgHom_monomial] + +/-! + +## F. The mass weight of the fermion symbols + +Every fermion of the Standard Model has mass dimension `3/2`, so a fermionic symbol +`∂_s ψ_φ` has mass dimension `3/2 + |s|` and mass weight `3 + 2 |s|` — the exponent form +`IsStandardModel` asks for. The computation is the same for all ten species families, +because each of them reduces, by the lemmas of +`Physlib.Particles.StandardModel.JetAlgebra.Generators`, to a single included generator of +the fermionic sector. + +-/ + +/-! + +### F.1. The symbols on the total fermionic target space + +-/ + +/-- A fermionic symbol `∂_s ψ_φ` on the total fermionic target space is a monomial + eigenvector of mass weight `3 + 2 |s|`: a fermion has mass dimension `3/2` and each + derivative adds one more. -/ +lemma massWeightPoly_fermionSymbol (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ FermionSpace) : + massWeightPoly (fermionSymbol s φ) + = Polynomial.monomial (3 + 2 * Multiset.card s) (fermionSymbol s φ) := by + rw [fermionSymbol_apply, massWeightPoly_includeFermion, + FermionicAlgebra.massWeightPoly_ι, FermionicAlgebra.jetComponentPoly_inl, + Polynomial.mapAlgHom_monomial] + +/-- A conjugate fermionic symbol `∂_s ψ̄_φ` on the total fermionic target space is a + monomial eigenvector of the same mass weight `3 + 2 |s|` as the symbol it conjugates. -/ +lemma massWeightPoly_conjFermionSymbol (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule FermionSpace)) : + massWeightPoly (conjFermionSymbol s φ) + = Polynomial.monomial (3 + 2 * Multiset.card s) (conjFermionSymbol s φ) := by + rw [conjFermionSymbol_apply, massWeightPoly_includeFermion, + FermionicAlgebra.massWeightPoly_ι, FermionicAlgebra.jetComponentPoly_inr, + Polynomial.mapAlgHom_monomial] + +/-! + +### F.2. The ten species families + +-/ + +/-- The symbol `∂_s ψ_φ` of the `i`-th generation lepton doublet is a monomial eigenvector + of mass weight `3 + 2 |s|`. -/ +lemma massWeightPoly_leptonDoubletField (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ LeptonDoublet) : + massWeightPoly (leptonDoubletField i s φ) + = Polynomial.monomial (3 + 2 * Multiset.card s) (leptonDoubletField i s φ) := by + rw [leptonDoubletField_apply, massWeightPoly_includeFermion, + FermionicAlgebra.massWeightPoly_ι, FermionicAlgebra.jetComponentPoly_inl, + Polynomial.mapAlgHom_monomial] + +/-- The conjugate symbol `∂_s ψ̄_φ` of the `i`-th generation lepton doublet is a monomial + eigenvector of mass weight `3 + 2 |s|`. -/ +lemma massWeightPoly_conjLeptonDoubletField (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule LeptonDoublet)) : + massWeightPoly (conjLeptonDoubletField i s φ) + = Polynomial.monomial (3 + 2 * Multiset.card s) (conjLeptonDoubletField i s φ) := by + rw [conjLeptonDoubletField_apply, massWeightPoly_includeFermion, + FermionicAlgebra.massWeightPoly_ι, FermionicAlgebra.jetComponentPoly_inr, + Polynomial.mapAlgHom_monomial] + +/-- The symbol `∂_s ψ_φ` of the `i`-th generation charged-lepton singlet is a monomial eigenvector + of mass weight `3 + 2 |s|`. -/ +lemma massWeightPoly_leptonSingletField (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ LeptonSinglet) : + massWeightPoly (leptonSingletField i s φ) + = Polynomial.monomial (3 + 2 * Multiset.card s) (leptonSingletField i s φ) := by + rw [leptonSingletField_apply, massWeightPoly_includeFermion, + FermionicAlgebra.massWeightPoly_ι, FermionicAlgebra.jetComponentPoly_inl, + Polynomial.mapAlgHom_monomial] + +/-- The conjugate symbol `∂_s ψ̄_φ` of the `i`-th generation charged-lepton singlet is a monomial + eigenvector of mass weight `3 + 2 |s|`. -/ +lemma massWeightPoly_conjLeptonSingletField (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule LeptonSinglet)) : + massWeightPoly (conjLeptonSingletField i s φ) + = Polynomial.monomial (3 + 2 * Multiset.card s) (conjLeptonSingletField i s φ) := by + rw [conjLeptonSingletField_apply, massWeightPoly_includeFermion, + FermionicAlgebra.massWeightPoly_ι, FermionicAlgebra.jetComponentPoly_inr, + Polynomial.mapAlgHom_monomial] + +/-- The symbol `∂_s ψ_φ` of the `i`-th generation quark doublet is a monomial eigenvector + of mass weight `3 + 2 |s|`. -/ +lemma massWeightPoly_quarkDoubletField (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ QuarkDoublet) : + massWeightPoly (quarkDoubletField i s φ) + = Polynomial.monomial (3 + 2 * Multiset.card s) (quarkDoubletField i s φ) := by + rw [quarkDoubletField_apply, massWeightPoly_includeFermion, + FermionicAlgebra.massWeightPoly_ι, FermionicAlgebra.jetComponentPoly_inl, + Polynomial.mapAlgHom_monomial] + +/-- The conjugate symbol `∂_s ψ̄_φ` of the `i`-th generation quark doublet is a monomial + eigenvector of mass weight `3 + 2 |s|`. -/ +lemma massWeightPoly_conjQuarkDoubletField (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) : + massWeightPoly (conjQuarkDoubletField i s φ) + = Polynomial.monomial (3 + 2 * Multiset.card s) (conjQuarkDoubletField i s φ) := by + rw [conjQuarkDoubletField_apply, massWeightPoly_includeFermion, + FermionicAlgebra.massWeightPoly_ι, FermionicAlgebra.jetComponentPoly_inr, + Polynomial.mapAlgHom_monomial] + +/-- The symbol `∂_s ψ_φ` of the `i`-th generation up-type quark singlet is a monomial eigenvector + of mass weight `3 + 2 |s|`. -/ +lemma massWeightPoly_upSingletField (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ UpSinglet) : + massWeightPoly (upSingletField i s φ) + = Polynomial.monomial (3 + 2 * Multiset.card s) (upSingletField i s φ) := by + rw [upSingletField_apply, massWeightPoly_includeFermion, + FermionicAlgebra.massWeightPoly_ι, FermionicAlgebra.jetComponentPoly_inl, + Polynomial.mapAlgHom_monomial] + +/-- The conjugate symbol `∂_s ψ̄_φ` of the `i`-th generation up-type quark singlet is a monomial + eigenvector of mass weight `3 + 2 |s|`. -/ +lemma massWeightPoly_conjUpSingletField (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule UpSinglet)) : + massWeightPoly (conjUpSingletField i s φ) + = Polynomial.monomial (3 + 2 * Multiset.card s) (conjUpSingletField i s φ) := by + rw [conjUpSingletField_apply, massWeightPoly_includeFermion, + FermionicAlgebra.massWeightPoly_ι, FermionicAlgebra.jetComponentPoly_inr, + Polynomial.mapAlgHom_monomial] + +/-- The symbol `∂_s ψ_φ` of the `i`-th generation down-type quark singlet is a monomial eigenvector + of mass weight `3 + 2 |s|`. -/ +lemma massWeightPoly_downSingletField (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ DownSinglet) : + massWeightPoly (downSingletField i s φ) + = Polynomial.monomial (3 + 2 * Multiset.card s) (downSingletField i s φ) := by + rw [downSingletField_apply, massWeightPoly_includeFermion, + FermionicAlgebra.massWeightPoly_ι, FermionicAlgebra.jetComponentPoly_inl, + Polynomial.mapAlgHom_monomial] + +/-- The conjugate symbol `∂_s ψ̄_φ` of the `i`-th generation down-type quark singlet is a monomial + eigenvector of mass weight `3 + 2 |s|`. -/ +lemma massWeightPoly_conjDownSingletField (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule DownSinglet)) : + massWeightPoly (conjDownSingletField i s φ) + = Polynomial.monomial (3 + 2 * Multiset.card s) (conjDownSingletField i s φ) := by + rw [conjDownSingletField_apply, massWeightPoly_includeFermion, + FermionicAlgebra.massWeightPoly_ι, FermionicAlgebra.jetComponentPoly_inr, + Polynomial.mapAlgHom_monomial] + +end JetAlgebra + +end StandardModel diff --git a/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/MassWeightPoly.lean b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/MassWeightPoly.lean new file mode 100644 index 000000000..3791f621b --- /dev/null +++ b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/MassWeightPoly.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.Matter.BosonicAlgebra.MassDim +/-! +# The mass-weight polynomial on the bosonic algebra + +## i. Overview + +The mass-weight scaling of `Physlib.Particles.StandardModel.Matter.BosonicAlgebra.MassDim` +records the mass dimension of a homogeneous element in a scalar. Replacing that scalar by a +formal variable turns the scaling into a grading: `massWeightPoly w` is the algebra map +sending a generator `∂_s ψ_φ` of a field of mass weight `w` to `X ^ (w + 2 |s|)` times +itself, so the coefficient of `X ^ n` in `massWeightPoly w a` is the part of `a` of mass +weight `n`. + +The target `Polynomial (BosonicAlgebra V)` is commutative, so the universal property of the +symmetric algebra applies with no side condition: the grading is the lift of a single linear +map on the jet component space. That map is assembled from the two halves of the component +space, and on each half from the multiset basis of the derivative symbols, which is where +the exponent `w + 2 |s|` is read off. + +## ii. Key results + +- `BosonicAlgebra.massWeightPoly` : the mass-weight polynomial grading. +- `BosonicAlgebra.massWeightPoly_iteratedJetDeriv_ofField` : `∂_s ψ_φ` is a monomial + eigenvector of weight `w + 2 |s|`. +- `BosonicAlgebra.massWeightPoly_iteratedJetDeriv_ofConjField` : the same for the conjugate + field. +- `BosonicAlgebra.massWeightPoly_eval_one` : setting the variable to one recovers the + element. + +## iii. Table of contents + +- A. The mass-weight polynomial of a component function +- B. The mass-weight polynomial on the bosonic algebra +- C. The mass weight of the field and its derivatives +- D. Recovering an element from its mass-weight polynomial + +-/ + +@[expose] public section + +namespace StandardModel + +namespace BosonicAlgebra + +open TensorProduct + +variable {V : Type} [AddCommGroup V] [Module ℂ V] + +/-! + +## A. The mass-weight polynomial of a component function + +-/ + +/-- The monomial map into polynomials over the bosonic algebra, as a map of `ℂ`-modules + rather than of `BosonicAlgebra V`-modules. -/ +noncomputable def monomialₗ (n : ℕ) : + BosonicAlgebra V →ₗ[ℂ] Polynomial (BosonicAlgebra V) := + (Polynomial.monomial n).restrictScalars ℂ + +@[simp] +lemma monomialₗ_apply (n : ℕ) (x : BosonicAlgebra V) : + monomialₗ n x = Polynomial.monomial n x := rfl + +/-- One half of the mass-weight polynomial on the jet component space, for a field of mass + weight `w`: the linear map sending the symbol `∂_s φ` to `X ^ (w + 2 |s|)` times its + image under `k`. The two halves of the component space differ only in the inclusion `k` + of the symbols into the bosonic algebra, so both are instances of this map. -/ +noncomputable def halfPoly {W : Type} [AddCommGroup W] [Module ℂ W] (w : ℕ) + (k : DerivAlgebraComplex ⊗[ℂ] W →ₗ[ℂ] BosonicAlgebra V) : + DerivAlgebraComplex ⊗[ℂ] W →ₗ[ℂ] Polynomial (BosonicAlgebra V) := + TensorProduct.lift (DerivAlgebraComplex.basis.constr ℂ fun s => + (monomialₗ (w + 2 * Multiset.card s)).comp + (k.comp (TensorProduct.mk ℂ DerivAlgebraComplex W (DerivAlgebraComplex.basis s)))) + +/-- On the symbol `∂_s φ` the half mass-weight polynomial is the monomial of degree + `w + 2 |s|`: the field contributes `w` and each derivative two. -/ +lemma halfPoly_basis_tmul {W : Type} [AddCommGroup W] [Module ℂ W] (w : ℕ) + (k : DerivAlgebraComplex ⊗[ℂ] W →ₗ[ℂ] BosonicAlgebra V) + (s : Multiset (Fin 1 ⊕ Fin 3)) (x : W) : + halfPoly w k (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] x) = + Polynomial.monomial (w + 2 * Multiset.card s) + (k (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] x)) := by + rw [halfPoly, TensorProduct.lift.tmul, Module.Basis.constr_basis] + rfl + +/-- The inclusion of the unconjugated symbols into the bosonic algebra. -/ +noncomputable def ιFst : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ V →ₗ[ℂ] BosonicAlgebra V := + (SymmetricAlgebra.ι ℂ (JetComponentSpace V)).comp (LinearMap.inl ℂ _ _) + +/-- The inclusion of the conjugate symbols into the bosonic algebra. -/ +noncomputable def ιSnd : + DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule V) →ₗ[ℂ] BosonicAlgebra V := + (SymmetricAlgebra.ι ℂ (JetComponentSpace V)).comp (LinearMap.inr ℂ _ _) + +/-- The mass-weight polynomial of a component function of a field of mass weight `w`: the + sum of the two half maps, one for the field and one for its conjugate. -/ +noncomputable def jetComponentPoly (w : ℕ) : + JetComponentSpace V →ₗ[ℂ] Polynomial (BosonicAlgebra V) := + (halfPoly w ιFst).comp (LinearMap.fst ℂ _ _) + + (halfPoly w ιSnd).comp (LinearMap.snd ℂ _ _) + +lemma jetComponentPoly_apply (w : ℕ) (x : JetComponentSpace V) : + jetComponentPoly w x = halfPoly w ιFst x.1 + halfPoly w ιSnd x.2 := rfl + +/-- On an unconjugated derivative monomial the component map is a monomial eigenvector. -/ +@[simp] +lemma jetComponentPoly_inl (w : ℕ) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V) : + jetComponentPoly w ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace V) = + Polynomial.monomial (w + 2 * Multiset.card s) + (SymmetricAlgebra.ι ℂ (JetComponentSpace V) + ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace V)) := by + rw [jetComponentPoly_apply, halfPoly_basis_tmul, map_zero, add_zero] + rfl + +/-- On a conjugate derivative monomial the component map is a monomial eigenvector. -/ +@[simp] +lemma jetComponentPoly_inr (w : ℕ) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule V)) : + jetComponentPoly w ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace V) = + Polynomial.monomial (w + 2 * Multiset.card s) + (SymmetricAlgebra.ι ℂ (JetComponentSpace V) + ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace V)) := by + rw [jetComponentPoly_apply, halfPoly_basis_tmul, map_zero, zero_add] + rfl + +/-! + +## B. The mass-weight polynomial on the bosonic algebra + +-/ + +/-- The mass-weight polynomial on the bosonic algebra of a field of mass weight `w`: the + `ℂ`-algebra map sending a generator of mass weight `n` to `X ^ n` times itself. It is + `BosonicAlgebra.massWeightScale` with the scalar replaced by the formal variable `X`, and + needs no side condition because `Polynomial (BosonicAlgebra V)` is commutative. -/ +noncomputable def massWeightPoly (w : ℕ) : + BosonicAlgebra V →ₐ[ℂ] Polynomial (BosonicAlgebra V) := + SymmetricAlgebra.lift (jetComponentPoly w) + +/-- On a component function the mass-weight polynomial is the component-function map. -/ +@[simp] +lemma massWeightPoly_ι (w : ℕ) (x : JetComponentSpace V) : + massWeightPoly w (SymmetricAlgebra.ι ℂ (JetComponentSpace V) x) = + jetComponentPoly w x := + SymmetricAlgebra.lift_ι_apply _ x + +/-! + +## C. The mass weight of the field and its derivatives + +-/ + +/-- The generator `∂_s ψ_φ` is a monomial eigenvector of mass weight `w + 2 |s|`: the field + carries its own mass weight and each derivative adds two. -/ +lemma massWeightPoly_iteratedJetDeriv_ofField (w : ℕ) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ V) : + massWeightPoly w (iteratedJetDeriv s (ofField φ)) = + Polynomial.monomial (w + 2 * Multiset.card s) (iteratedJetDeriv s (ofField φ)) := by + rw [iteratedJetDeriv_ofField, massWeightPoly_ι, jetComponentPoly_inl] + +/-- The conjugate generator `∂_s ψ̄_φ` is a monomial eigenvector of the same mass weight + `w + 2 |s|` as the generator it conjugates. -/ +lemma massWeightPoly_iteratedJetDeriv_ofConjField (w : ℕ) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule V)) : + massWeightPoly w (iteratedJetDeriv s (ofConjField φ)) = + Polynomial.monomial (w + 2 * Multiset.card s) + (iteratedJetDeriv s (ofConjField φ)) := by + rw [iteratedJetDeriv_ofConjField, massWeightPoly_ι, jetComponentPoly_inr] + +/-- The undifferentiated field has mass weight `w`. -/ +lemma massWeightPoly_ofField (w : ℕ) (φ : Module.Dual ℂ V) : + massWeightPoly w (ofField φ) = Polynomial.monomial w (ofField φ) := by + have h := massWeightPoly_iteratedJetDeriv_ofField w (0 : Multiset (Fin 1 ⊕ Fin 3)) φ + rwa [iteratedJetDeriv_zero, LinearMap.id_apply, Multiset.card_zero, Nat.mul_zero, + Nat.add_zero] at h + +/-- The undifferentiated conjugate field has mass weight `w`. -/ +lemma massWeightPoly_ofConjField (w : ℕ) (φ : Module.Dual ℂ (ConjModule V)) : + massWeightPoly w (ofConjField φ) = Polynomial.monomial w (ofConjField φ) := by + have h := massWeightPoly_iteratedJetDeriv_ofConjField w (0 : Multiset (Fin 1 ⊕ Fin 3)) φ + rwa [iteratedJetDeriv_zero, LinearMap.id_apply, Multiset.card_zero, Nat.mul_zero, + Nat.add_zero] at h + +/-! + +## D. Recovering an element from its mass-weight polynomial + +-/ + +/-- Setting the formal variable to one collapses a half mass-weight polynomial back to the + symbol it graded. The derivative monomials span, so it is enough to check this on the + multiset basis. -/ +lemma halfPoly_eval_one {W : Type} [AddCommGroup W] [Module ℂ W] (w : ℕ) + (k : DerivAlgebraComplex ⊗[ℂ] W →ₗ[ℂ] BosonicAlgebra V) + (y : DerivAlgebraComplex ⊗[ℂ] W) : (halfPoly w k y).eval 1 = k y := by + induction y using TensorProduct.induction_on with + | zero => rw [map_zero, Polynomial.eval_zero, map_zero] + | add a b ha hb => rw [map_add, Polynomial.eval_add, ha, hb, map_add] + | tmul a x => + 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 + rw [halfPoly_basis_tmul, Polynomial.eval_monomial, one_pow, mul_one] + | zero => rw [TensorProduct.zero_tmul, map_zero, Polynomial.eval_zero, map_zero] + | add b c _ _ hb hc => + rw [TensorProduct.add_tmul, map_add, Polynomial.eval_add, hb, hc, map_add] + | smul c b _ hb => + rw [← TensorProduct.smul_tmul', map_smul, Polynomial.eval_smul, hb, map_smul] + +/-- Setting the formal variable to one recovers the component function. -/ +lemma jetComponentPoly_eval_one (w : ℕ) (x : JetComponentSpace V) : + (jetComponentPoly w x).eval 1 = SymmetricAlgebra.ι ℂ (JetComponentSpace V) x := by + rw [jetComponentPoly_apply, Polynomial.eval_add, halfPoly_eval_one, halfPoly_eval_one, + ιFst, ιSnd, LinearMap.comp_apply, LinearMap.comp_apply, ← map_add] + congr 1 + exact Prod.ext (by simp) (by simp) + +/-- Setting the formal variable to one recovers the original element: the mass-weight + pieces of an element sum back to it. -/ +lemma massWeightPoly_eval_one (w : ℕ) (a : BosonicAlgebra V) : + (massWeightPoly w a).eval 1 = a := by + have h : (Polynomial.eval₂AlgHom (AlgHom.id ℂ (BosonicAlgebra V)) 1 + fun b => Commute.one_right b).comp (massWeightPoly w) = + AlgHom.id ℂ (BosonicAlgebra V) := by + refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun x => ?_) + simpa using jetComponentPoly_eval_one w x + exact AlgHom.congr_fun h a + +/-- The mass-weight polynomial is injective: an element is recovered from its graded + pieces. It is not surjective, since a monomial of the wrong degree is not the grading of + anything. -/ +lemma massWeightPoly_injective (w : ℕ) : + Function.Injective (massWeightPoly (V := V) w) := by + intro x y h + rw [← massWeightPoly_eval_one w x, ← massWeightPoly_eval_one w y, h] + +end BosonicAlgebra + +end StandardModel diff --git a/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/TransformsIn.lean b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/TransformsIn.lean new file mode 100644 index 000000000..d111b31ad --- /dev/null +++ b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/TransformsIn.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.BosonicAlgebra.GaugeAction +public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.JetDeriv +public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.TransformsIn +/-! +# The transformation law of the bosonic generators + +## i. Overview + +`BosonicAlgebra.repJetGaugeGroupI_ofField` records that the undifferentiated generator +`ψ_φ` transforms by the value of the gauge transformation at the base point. Its derivatives +do not: a jet of gauge transformations mixes `∂_s ψ_φ` with the lower generators +`∂_{s₂} ψ_φ`, weighted by the base-point Taylor coefficients `IsGaugeField.repDualCoeff` of +the gauge jet at the complementary multiset `s₁`. This file proves that all-orders Leibniz +law, in the form `StandardModel.TransformsIn` demands. + +All the work is in `StandardModel.repDual_basis_tmul`, the corresponding statement on the +jet component space. The symmetric algebra contributes only linearity: the generators are +the image of the component space under `SymmetricAlgebra.ι`, and a multiset sum passes +through a linear map. + +The conjugate generators are the same statement for the conjugate action `repConj rep` on +the jets of the conjugate field, which is what the conjugate half of the component space +carries; so they are an instance of the same lemma, not a second proof. + +## ii. Key results + +- `BosonicAlgebra.repJetGaugeGroupI_iteratedJetDeriv_ofField` : the transformation law of + the derivative generators `∂_s ψ_φ`. +- `BosonicAlgebra.repJetGaugeGroupI_iteratedJetDeriv_ofConjField` : the transformation + law of the conjugate derivative generators `∂_s ψ̄_φ`. +- `BosonicAlgebra.transformsIn_iteratedJetDeriv_ofField`, + `BosonicAlgebra.transformsIn_iteratedJetDeriv_ofConjField` : the same, packaged as + `StandardModel.TransformsIn`. + +## iii. Table of contents + +- A. Multiset sums of generators +- B. The transformation law of the derivative generators + - B.1. The field + - B.2. The conjugate field + +-/ + +@[expose] public section + +namespace StandardModel + +namespace BosonicAlgebra + +open Matrix MatrixGroups TensorProduct + +variable {V : Type} [AddCommGroup V] [Module ℂ V] + +/-! + +## A. Multiset sums of generators + +-/ + +/-- A multiset sum in the unconjugated half of the component space passes through the + inclusion of the generators. -/ +private lemma sum_inl (m : Multiset (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ V)) : + SymmetricAlgebra.ι ℂ _ ((m.sum, 0) : JetComponentSpace V) + = (m.map fun a => + SymmetricAlgebra.ι ℂ _ ((a, 0) : JetComponentSpace V)).sum := by + rw [show SymmetricAlgebra.ι ℂ (JetComponentSpace V) ((m.sum, 0) : JetComponentSpace V) + = ((SymmetricAlgebra.ι ℂ (JetComponentSpace V)).comp + (LinearMap.inl ℂ (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ V) + (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule V)))) m.sum from rfl, + map_multiset_sum] + rfl + +/-- A multiset sum in the conjugate half of the component space passes through the + inclusion of the generators. -/ +private lemma sum_inr (m : Multiset (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule V))) : + SymmetricAlgebra.ι ℂ _ ((0, m.sum) : JetComponentSpace V) + = (m.map fun a => + SymmetricAlgebra.ι ℂ _ ((0, a) : JetComponentSpace V)).sum := by + rw [show SymmetricAlgebra.ι ℂ (JetComponentSpace V) ((0, m.sum) : JetComponentSpace V) + = ((SymmetricAlgebra.ι ℂ (JetComponentSpace V)).comp + (LinearMap.inr ℂ (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ V) + (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule V)))) m.sum from rfl, + map_multiset_sum] + rfl + +/-! + +## B. The transformation law of the derivative generators + +-/ + +variable [Module.Free ℂ V] [Module.Finite ℂ V] + +/-! + +### B.1. The field + +-/ + +/-- The transformation law of the derivative generators of a matter field: a jet of gauge + transformations mixes `∂_s ψ_φ` with the lower generators, each splitting `s = s₁ + s₂` of + the derivative multiset contributing the base-point Taylor coefficient of the gauge jet at + `s₁` acting on the target index of `∂_{s₂} ψ_φ`. There is no inhomogeneous term: unlike a + gauge field, a matter field transforms linearly. -/ +lemma repJetGaugeGroupI_iteratedJetDeriv_ofField + (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) + (U : JetGaugeGroupI) (φ : Module.Dual ℂ V) (s : Multiset (Fin 1 ⊕ Fin 3)) : + repJetGaugeGroupI rep hlin U (iteratedJetDeriv s (ofField φ)) = + (s.antidiagonal.map fun p => + iteratedJetDeriv p.2 (ofField (IsGaugeField.repDualCoeff rep U⁻¹ p.1 φ))).sum := by + rw [iteratedJetDeriv_ofField, repJetGaugeGroupI_ι, + show JetComponentSpace.repJetGaugeGroupI rep hlin U + ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace V) + = (repDual rep hlin U (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ), 0) from by + refine Prod.ext rfl ?_ + rw [JetComponentSpace.repJetGaugeGroupI_snd] + exact map_zero _, + repDual_basis_tmul, sum_inl, Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p _ => ?_) + rw [Function.comp_apply, iteratedJetDeriv_ofField] + +/-- The derivative generators of a matter field transform in the representation `rep` + carried by its jets, in the sense demanded by `StandardModel.TransformsIn`. -/ +theorem transformsIn_iteratedJetDeriv_ofField + (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) : + TransformsIn (repJetGaugeGroupI rep hlin) rep + fun s => (iteratedJetDeriv s).comp (ofField (V := V)) := + fun U φ s => repJetGaugeGroupI_iteratedJetDeriv_ofField rep hlin U φ s + +/-! + +### B.2. The conjugate field + +-/ + +/-- The transformation law of the derivative generators of the conjugate matter field. It + is the law of the field itself for the conjugate action `repConj rep` on the jets of the + conjugate field — the physicists' `ψ̄ ↦ ψ̄ U†` and its derivatives. -/ +lemma repJetGaugeGroupI_iteratedJetDeriv_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)) + (s : Multiset (Fin 1 ⊕ Fin 3)) : + repJetGaugeGroupI rep hlin U (iteratedJetDeriv s (ofConjField φ)) = + (s.antidiagonal.map fun p => + iteratedJetDeriv p.2 + (ofConjField (IsGaugeField.repDualCoeff (repConj rep) U⁻¹ p.1 φ))).sum := by + rw [iteratedJetDeriv_ofConjField, repJetGaugeGroupI_ι, + show JetComponentSpace.repJetGaugeGroupI rep hlin U + ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace V) + = (0, repDual (repConj rep) (repConj_smul_comm hlin) U + (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ)) from by + refine Prod.ext ?_ rfl + rw [JetComponentSpace.repJetGaugeGroupI_fst] + exact map_zero _, + repDual_basis_tmul, sum_inr, Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p _ => ?_) + rw [Function.comp_apply, iteratedJetDeriv_ofConjField] + +/-- The derivative generators of the conjugate matter field transform in the conjugate + representation `repConj rep`, in the sense demanded by + `StandardModel.TransformsIn`. -/ +theorem transformsIn_iteratedJetDeriv_ofConjField + (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) : + TransformsIn (repJetGaugeGroupI rep hlin) (repConj rep) + fun s => (iteratedJetDeriv s).comp (ofConjField (V := V)) := + fun U φ s => repJetGaugeGroupI_iteratedJetDeriv_ofConjField rep hlin U φ s + +end BosonicAlgebra + +end StandardModel diff --git a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/MassWeightPoly.lean b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/MassWeightPoly.lean new file mode 100644 index 000000000..79dadea12 --- /dev/null +++ b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/MassWeightPoly.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.StandardModel.Matter.FermionicAlgebra.MassDim +/-! +# The mass-weight polynomial on the fermionic algebra + +## i. Overview + +The mass-weight scaling of +`Physlib.Particles.StandardModel.Matter.FermionicAlgebra.MassDim` records the mass +dimension of a homogeneous element in a scalar. Replacing that scalar by a formal variable +turns the scaling into a grading: `massWeightPoly w` is the algebra map sending a generator +`∂_s ψ_φ` of a field of mass weight `w` to `X ^ (w + 2 |s|)` times itself, so the +coefficient of `X ^ n` in `massWeightPoly w a` is the part of `a` of mass weight `n`. + +Unlike the bosonic case the target `Polynomial (FermionicAlgebra V)` is not commutative, so +the universal property of the exterior algebra comes with a side condition: the linear map +on the jet component space must square to zero. That is proved by the standard bilinear-form +argument — the symmetrised square vanishes, and two is invertible in `ℂ` — with the +symmetrised square checked on the derivative monomials, which span the component space. + +## ii. Key results + +- `FermionicAlgebra.massWeightPoly` : the mass-weight polynomial grading. +- `FermionicAlgebra.massWeightPoly_iteratedJetDeriv_ofField` : `∂_s ψ_φ` is a monomial + eigenvector of weight `w + 2 |s|`. +- `FermionicAlgebra.massWeightPoly_iteratedJetDeriv_ofConjField` : the same for the + conjugate field. +- `FermionicAlgebra.massWeightPoly_eval_one` : setting the variable to one recovers the + element. + +## iii. Table of contents + +- A. The mass-weight polynomial of a component function +- B. The square-zero condition +- C. The mass-weight polynomial on the fermionic algebra +- D. The mass weight of the field and its derivatives +- E. Recovering an element from its mass-weight polynomial + +-/ + +@[expose] public section + +namespace StandardModel + +namespace FermionicAlgebra + +open TensorProduct + +variable {V : Type} [AddCommGroup V] [Module ℂ V] + +/-! + +## A. The mass-weight polynomial of a component function + +-/ + +/-- The monomial map into polynomials over the fermionic algebra, as a map of `ℂ`-modules + rather than of `FermionicAlgebra V`-modules. -/ +noncomputable def monomialₗ (n : ℕ) : + FermionicAlgebra V →ₗ[ℂ] Polynomial (FermionicAlgebra V) := + (Polynomial.monomial n).restrictScalars ℂ + +@[simp] +lemma monomialₗ_apply (n : ℕ) (x : FermionicAlgebra V) : + monomialₗ n x = Polynomial.monomial n x := rfl + +/-- One half of the mass-weight polynomial on the jet component space, for a field of mass + weight `w`: the linear map sending the symbol `∂_s ψ` to `X ^ (w + 2 |s|)` times its image + under `k`. The two halves of the component space differ only in the inclusion `k` of the + symbols into the fermionic algebra, so both are instances of this map. -/ +noncomputable def halfPoly {W : Type} [AddCommGroup W] [Module ℂ W] (w : ℕ) + (k : DerivAlgebraComplex ⊗[ℂ] W →ₗ[ℂ] FermionicAlgebra V) : + DerivAlgebraComplex ⊗[ℂ] W →ₗ[ℂ] Polynomial (FermionicAlgebra V) := + TensorProduct.lift (DerivAlgebraComplex.basis.constr ℂ fun s => + (monomialₗ (w + 2 * Multiset.card s)).comp + (k.comp (TensorProduct.mk ℂ DerivAlgebraComplex W (DerivAlgebraComplex.basis s)))) + +/-- On the symbol `∂_s ψ` the half mass-weight polynomial is the monomial of degree + `w + 2 |s|`: the field contributes `w` and each derivative two. -/ +lemma halfPoly_basis_tmul {W : Type} [AddCommGroup W] [Module ℂ W] (w : ℕ) + (k : DerivAlgebraComplex ⊗[ℂ] W →ₗ[ℂ] FermionicAlgebra V) + (s : Multiset (Fin 1 ⊕ Fin 3)) (x : W) : + halfPoly w k (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] x) = + Polynomial.monomial (w + 2 * Multiset.card s) + (k (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] x)) := by + rw [halfPoly, TensorProduct.lift.tmul, Module.Basis.constr_basis] + rfl + +/-- The inclusion of the unconjugated symbols into the fermionic algebra. -/ +noncomputable def ιFst : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ V →ₗ[ℂ] FermionicAlgebra V := + (ExteriorAlgebra.ι ℂ).comp (LinearMap.inl ℂ _ _) + +/-- The inclusion of the conjugate symbols into the fermionic algebra. -/ +noncomputable def ιSnd : + DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule V) →ₗ[ℂ] FermionicAlgebra V := + (ExteriorAlgebra.ι ℂ).comp (LinearMap.inr ℂ _ _) + +/-- The mass-weight polynomial of a component function of a field of mass weight `w`: the + sum of the two half maps, one for the field and one for its conjugate. -/ +noncomputable def jetComponentPoly (w : ℕ) : + JetComponentSpace V →ₗ[ℂ] Polynomial (FermionicAlgebra V) := + (halfPoly w ιFst).comp (LinearMap.fst ℂ _ _) + + (halfPoly w ιSnd).comp (LinearMap.snd ℂ _ _) + +lemma jetComponentPoly_apply (w : ℕ) (x : JetComponentSpace V) : + jetComponentPoly w x = halfPoly w ιFst x.1 + halfPoly w ιSnd x.2 := rfl + +/-- On an unconjugated derivative monomial the component map is a monomial eigenvector. -/ +@[simp] +lemma jetComponentPoly_inl (w : ℕ) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V) : + jetComponentPoly w ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace V) = + Polynomial.monomial (w + 2 * Multiset.card s) + (ExteriorAlgebra.ι ℂ + ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace V)) := by + rw [jetComponentPoly_apply, halfPoly_basis_tmul, map_zero, add_zero] + rfl + +/-- On a conjugate derivative monomial the component map is a monomial eigenvector. -/ +@[simp] +lemma jetComponentPoly_inr (w : ℕ) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule V)) : + jetComponentPoly w ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace V) = + Polynomial.monomial (w + 2 * Multiset.card s) + (ExteriorAlgebra.ι ℂ + ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace V)) := by + rw [jetComponentPoly_apply, halfPoly_basis_tmul, map_zero, zero_add] + rfl + +/-! + +## B. The square-zero condition + +-/ + +/-- The derivative monomials span a tensor product with the derivative algebra: this is the + spanning set on which the square-zero condition is checked. -/ +private lemma basisTmul_span_top {W : Type} [AddCommGroup W] [Module ℂ W] : + Submodule.span ℂ (Set.range fun p : Multiset (Fin 1 ⊕ Fin 3) × W => + DerivAlgebraComplex.basis p.1 ⊗ₜ[ℂ] p.2) = ⊤ := by + rw [eq_top_iff] + rintro y - + induction y using TensorProduct.induction_on with + | zero => exact Submodule.zero_mem _ + | add a b ha hb => exact Submodule.add_mem _ ha hb + | tmul a x => + 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 Submodule.subset_span ⟨(s, x), rfl⟩ + | zero => rw [TensorProduct.zero_tmul]; exact Submodule.zero_mem _ + | add b c _ _ hb hc => rw [TensorProduct.add_tmul]; exact Submodule.add_mem _ hb hc + | smul c b _ hb => rw [← TensorProduct.smul_tmul']; exact Submodule.smul_mem _ c hb + +/-- The set of derivative monomials in the jet component space: the unconjugated symbols + `∂_s ψ_φ` together with the conjugate symbols `∂_s ψ̄_φ`. -/ +def generators (V : Type) [AddCommGroup V] [Module ℂ V] : Set (JetComponentSpace V) := + (Set.range fun p : Multiset (Fin 1 ⊕ Fin 3) × Module.Dual ℂ V => + ((DerivAlgebraComplex.basis p.1 ⊗ₜ[ℂ] p.2, 0) : JetComponentSpace V)) ∪ + Set.range fun p : Multiset (Fin 1 ⊕ Fin 3) × Module.Dual ℂ (ConjModule V) => + ((0, DerivAlgebraComplex.basis p.1 ⊗ₜ[ℂ] p.2) : JetComponentSpace V) + +/-- The derivative monomials span the jet component space: every component function is the + sum of its two halves, and each half is spanned by derivative monomials. -/ +lemma span_generators_eq_top : Submodule.span ℂ (generators V) = ⊤ := by + rw [eq_top_iff] + rintro v - + have hv : v = LinearMap.inl ℂ _ _ v.1 + LinearMap.inr ℂ _ _ v.2 := + Prod.ext (by simp) (by simp) + rw [hv] + refine Submodule.add_mem _ ?_ ?_ + · have hle : Submodule.span ℂ (Set.range fun p : Multiset (Fin 1 ⊕ Fin 3) × + Module.Dual ℂ V => DerivAlgebraComplex.basis p.1 ⊗ₜ[ℂ] p.2) ≤ + Submodule.comap (LinearMap.inl ℂ (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ V) + (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule V))) + (Submodule.span ℂ (generators V)) := by + rw [Submodule.span_le] + rintro _ ⟨p, rfl⟩ + exact Submodule.subset_span (Or.inl ⟨p, rfl⟩) + exact hle (by rw [basisTmul_span_top]; trivial) + · have hle : Submodule.span ℂ (Set.range fun p : Multiset (Fin 1 ⊕ Fin 3) × + Module.Dual ℂ (ConjModule V) => DerivAlgebraComplex.basis p.1 ⊗ₜ[ℂ] p.2) ≤ + Submodule.comap (LinearMap.inr ℂ (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ V) + (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule V))) + (Submodule.span ℂ (generators V)) := by + rw [Submodule.span_le] + rintro _ ⟨p, rfl⟩ + exact Submodule.subset_span (Or.inr ⟨p, rfl⟩) + exact hle (by rw [basisTmul_span_top]; trivial) + +/-- Every derivative monomial is a monomial eigenvector of the component map: this is the + only property of the component map that the square-zero argument uses. -/ +lemma exists_jetComponentPoly_eq_monomial (w : ℕ) {v : JetComponentSpace V} + (hv : v ∈ generators V) : + ∃ n : ℕ, jetComponentPoly w v = Polynomial.monomial n (ExteriorAlgebra.ι ℂ v) := by + rcases hv with ⟨p, rfl⟩ | ⟨p, rfl⟩ + · exact ⟨w + 2 * Multiset.card p.1, jetComponentPoly_inl w p.1 p.2⟩ + · exact ⟨w + 2 * Multiset.card p.1, jetComponentPoly_inr w p.1 p.2⟩ + +set_option maxHeartbeats 800000 in +/-- The component map squares to zero, as the universal property of the exterior algebra + demands. The symmetrised square is a bilinear form, so it is enough to check that it + vanishes on the derivative monomials, where it is a monomial multiple of + `ExteriorAlgebra.ι_add_mul_swap`; halving then gives the square itself. -/ +lemma jetComponentPoly_mul_self (w : ℕ) (v : JetComponentSpace V) : + jetComponentPoly w v * jetComponentPoly w v = 0 := by + have key : ((LinearMap.mul ℂ (Polynomial (FermionicAlgebra V))).compl₁₂ + (jetComponentPoly (V := V) w) (jetComponentPoly (V := V) w)) + + ((LinearMap.mul ℂ (Polynomial (FermionicAlgebra V))).compl₁₂ + (jetComponentPoly (V := V) w) (jetComponentPoly (V := V) w)).flip = 0 := by + refine LinearMap.ext_on span_generators_eq_top fun x hx => ?_ + refine LinearMap.ext_on span_generators_eq_top fun y hy => ?_ + obtain ⟨n, hn⟩ := exists_jetComponentPoly_eq_monomial w hx + obtain ⟨m, hm⟩ := exists_jetComponentPoly_eq_monomial w hy + simp only [LinearMap.add_apply, LinearMap.compl₁₂_apply, LinearMap.flip_apply, + LinearMap.mul_apply', LinearMap.zero_apply] + rw [hn, hm, Polynomial.monomial_mul_monomial, Polynomial.monomial_mul_monomial, + Nat.add_comm m n, ← map_add, ExteriorAlgebra.ι_add_mul_swap, map_zero] + have h2 := LinearMap.congr_fun (LinearMap.congr_fun key v) v + simp only [LinearMap.add_apply, LinearMap.compl₁₂_apply, LinearMap.flip_apply, + LinearMap.mul_apply', LinearMap.zero_apply] at h2 + have h3 : (2 : ℂ) • (jetComponentPoly w v * jetComponentPoly w v) = 0 := by + rw [two_smul] + exact h2 + have h4 : (2⁻¹ : ℂ) • ((2 : ℂ) • (jetComponentPoly w v * jetComponentPoly w v)) = + jetComponentPoly w v * jetComponentPoly w v := by + rw [smul_smul, show ((2 : ℂ)⁻¹ * 2) = 1 by norm_num, one_smul] + rw [← h4, h3, smul_zero] + +/-! + +## C. The mass-weight polynomial on the fermionic algebra + +-/ + +/-- The mass-weight polynomial on the fermionic algebra of a field of mass weight `w`: the + `ℂ`-algebra map sending a generator of mass weight `n` to `X ^ n` times itself. It is + `FermionicAlgebra.massWeightScale` with the scalar replaced by the formal variable `X`. -/ +noncomputable def massWeightPoly (w : ℕ) : + FermionicAlgebra V →ₐ[ℂ] Polynomial (FermionicAlgebra V) := + ExteriorAlgebra.lift ℂ ⟨jetComponentPoly w, jetComponentPoly_mul_self w⟩ + +/-- On a component function the mass-weight polynomial is the component-function map. -/ +@[simp] +lemma massWeightPoly_ι (w : ℕ) (x : JetComponentSpace V) : + massWeightPoly w (ExteriorAlgebra.ι ℂ x) = jetComponentPoly w x := by + rw [massWeightPoly, ExteriorAlgebra.lift_ι_apply] + +/-! + +## D. The mass weight of the field and its derivatives + +-/ + +/-- The generator `∂_s ψ_φ` is a monomial eigenvector of mass weight `w + 2 |s|`: the field + carries its own mass weight and each derivative adds two. -/ +lemma massWeightPoly_iteratedJetDeriv_ofField (w : ℕ) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ V) : + massWeightPoly w (iteratedJetDeriv s (ofField φ)) = + Polynomial.monomial (w + 2 * Multiset.card s) (iteratedJetDeriv s (ofField φ)) := by + rw [iteratedJetDeriv_ofField, massWeightPoly_ι, jetComponentPoly_inl] + +/-- The conjugate generator `∂_s ψ̄_φ` is a monomial eigenvector of the same mass weight + `w + 2 |s|` as the generator it conjugates. -/ +lemma massWeightPoly_iteratedJetDeriv_ofConjField (w : ℕ) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule V)) : + massWeightPoly w (iteratedJetDeriv s (ofConjField φ)) = + Polynomial.monomial (w + 2 * Multiset.card s) + (iteratedJetDeriv s (ofConjField φ)) := by + rw [iteratedJetDeriv_ofConjField, massWeightPoly_ι, jetComponentPoly_inr] + +/-- The undifferentiated field has mass weight `w`. -/ +lemma massWeightPoly_ofField (w : ℕ) (φ : Module.Dual ℂ V) : + massWeightPoly w (ofField φ) = Polynomial.monomial w (ofField φ) := by + have h := massWeightPoly_iteratedJetDeriv_ofField w (0 : Multiset (Fin 1 ⊕ Fin 3)) φ + rwa [iteratedJetDeriv_zero, LinearMap.id_apply, Multiset.card_zero, Nat.mul_zero, + Nat.add_zero] at h + +/-- The undifferentiated conjugate field has mass weight `w`. -/ +lemma massWeightPoly_ofConjField (w : ℕ) (φ : Module.Dual ℂ (ConjModule V)) : + massWeightPoly w (ofConjField φ) = Polynomial.monomial w (ofConjField φ) := by + have h := massWeightPoly_iteratedJetDeriv_ofConjField w (0 : Multiset (Fin 1 ⊕ Fin 3)) φ + rwa [iteratedJetDeriv_zero, LinearMap.id_apply, Multiset.card_zero, Nat.mul_zero, + Nat.add_zero] at h + +/-! + +## E. Recovering an element from its mass-weight polynomial + +-/ + +/-- Setting the formal variable to one collapses a half mass-weight polynomial back to the + symbol it graded. The derivative monomials span, so it is enough to check this on the + multiset basis. -/ +lemma halfPoly_eval_one {W : Type} [AddCommGroup W] [Module ℂ W] (w : ℕ) + (k : DerivAlgebraComplex ⊗[ℂ] W →ₗ[ℂ] FermionicAlgebra V) + (y : DerivAlgebraComplex ⊗[ℂ] W) : (halfPoly w k y).eval 1 = k y := by + induction y using TensorProduct.induction_on with + | zero => rw [map_zero, Polynomial.eval_zero, map_zero] + | add a b ha hb => rw [map_add, Polynomial.eval_add, ha, hb, map_add] + | tmul a x => + 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 + rw [halfPoly_basis_tmul, Polynomial.eval_monomial, one_pow, mul_one] + | zero => rw [TensorProduct.zero_tmul, map_zero, Polynomial.eval_zero, map_zero] + | add b c _ _ hb hc => + rw [TensorProduct.add_tmul, map_add, Polynomial.eval_add, hb, hc, map_add] + | smul c b _ hb => + rw [← TensorProduct.smul_tmul', map_smul, Polynomial.eval_smul, hb, map_smul] + +/-- Setting the formal variable to one recovers the component function. -/ +lemma jetComponentPoly_eval_one (w : ℕ) (x : JetComponentSpace V) : + (jetComponentPoly w x).eval 1 = ExteriorAlgebra.ι ℂ x := by + rw [jetComponentPoly_apply, Polynomial.eval_add, halfPoly_eval_one, halfPoly_eval_one, + ιFst, ιSnd, LinearMap.comp_apply, LinearMap.comp_apply, ← map_add] + congr 1 + exact Prod.ext (by simp) (by simp) + +/-- Setting the formal variable to one recovers the original element: the mass-weight + pieces of an element sum back to it. -/ +lemma massWeightPoly_eval_one (w : ℕ) (a : FermionicAlgebra V) : + (massWeightPoly w a).eval 1 = a := by + have h : (Polynomial.eval₂AlgHom (AlgHom.id ℂ (FermionicAlgebra V)) 1 + fun b => Commute.one_right b).comp (massWeightPoly w) = + AlgHom.id ℂ (FermionicAlgebra V) := by + refine ExteriorAlgebra.hom_ext (LinearMap.ext fun x => ?_) + simpa using jetComponentPoly_eval_one w x + exact AlgHom.congr_fun h a + +/-- The mass-weight polynomial is injective: an element is recovered from its graded + pieces. It is not surjective, since a monomial of the wrong degree is not the grading of + anything. -/ +lemma massWeightPoly_injective (w : ℕ) : + Function.Injective (massWeightPoly (V := V) w) := by + intro x y h + rw [← massWeightPoly_eval_one w x, ← massWeightPoly_eval_one w y, h] + +end FermionicAlgebra + +end StandardModel diff --git a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/TransformsIn.lean b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/TransformsIn.lean new file mode 100644 index 000000000..42ebf1f4f --- /dev/null +++ b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/TransformsIn.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.FermionicAlgebra.GaugeAction +public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.JetDeriv +public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.TransformsIn +/-! +# The transformation law of the fermionic generators + +## i. Overview + +`FermionicAlgebra.repJetGaugeGroupI_ofField` records that the undifferentiated generator +`ψ_φ` transforms by the value of the gauge transformation at the base point. Its derivatives +do not: a jet of gauge transformations mixes `∂_s ψ_φ` with the lower generators +`∂_{s₂} ψ_φ`, weighted by the base-point Taylor coefficients `IsGaugeField.repDualCoeff` of +the gauge jet at the complementary multiset `s₁`. This file proves that all-orders Leibniz +law, in the form `StandardModel.TransformsIn` demands. + +All the work is in `StandardModel.repDual_basis_tmul`, the corresponding statement on the +jet component space. The exterior algebra contributes only linearity: the generators are +the image of the component space under `ExteriorAlgebra.ι`, and a multiset sum passes +through a linear map. + +The conjugate generators are the same statement for the conjugate action `repConj rep` on +the jets of the conjugate field, which is what the conjugate half of the component space +carries; so they are an instance of the same lemma, not a second proof. + +## ii. Key results + +- `FermionicAlgebra.repJetGaugeGroupI_iteratedJetDeriv_ofField` : the transformation law of + the derivative generators `∂_s ψ_φ`. +- `FermionicAlgebra.repJetGaugeGroupI_iteratedJetDeriv_ofConjField` : the transformation + law of the conjugate derivative generators `∂_s ψ̄_φ`. +- `FermionicAlgebra.transformsIn_iteratedJetDeriv_ofField`, + `FermionicAlgebra.transformsIn_iteratedJetDeriv_ofConjField` : the same, packaged as + `StandardModel.TransformsIn`. + +## iii. Table of contents + +- A. Multiset sums of generators +- B. The transformation law of the derivative generators + - B.1. The field + - B.2. The conjugate field + +-/ + +@[expose] public section + +namespace StandardModel + +namespace FermionicAlgebra + +open Matrix MatrixGroups TensorProduct + +variable {V : Type} [AddCommGroup V] [Module ℂ V] + +/-! + +## A. Multiset sums of generators + +-/ + +/-- A multiset sum in the unconjugated half of the component space passes through the + inclusion of the generators. -/ +private lemma sum_inl (m : Multiset (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ V)) : + ExteriorAlgebra.ι ℂ ((m.sum, 0) : JetComponentSpace V) + = (m.map fun a => ExteriorAlgebra.ι ℂ ((a, 0) : JetComponentSpace V)).sum := by + rw [show ExteriorAlgebra.ι ℂ ((m.sum, 0) : JetComponentSpace V) + = ((ExteriorAlgebra.ι ℂ).comp + (LinearMap.inl ℂ (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ V) + (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule V)))) m.sum from rfl, + map_multiset_sum] + rfl + +/-- A multiset sum in the conjugate half of the component space passes through the + inclusion of the generators. -/ +private lemma sum_inr (m : Multiset (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule V))) : + ExteriorAlgebra.ι ℂ ((0, m.sum) : JetComponentSpace V) + = (m.map fun a => ExteriorAlgebra.ι ℂ ((0, a) : JetComponentSpace V)).sum := by + rw [show ExteriorAlgebra.ι ℂ ((0, m.sum) : JetComponentSpace V) + = ((ExteriorAlgebra.ι ℂ).comp + (LinearMap.inr ℂ (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ V) + (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule V)))) m.sum from rfl, + map_multiset_sum] + rfl + +/-! + +## B. The transformation law of the derivative generators + +-/ + +variable [Module.Free ℂ V] [Module.Finite ℂ V] + +/-! + +### B.1. The field + +-/ + +/-- The transformation law of the derivative generators of a matter field: a jet of gauge + transformations mixes `∂_s ψ_φ` with the lower generators, each splitting `s = s₁ + s₂` of + the derivative multiset contributing the base-point Taylor coefficient of the gauge jet at + `s₁` acting on the target index of `∂_{s₂} ψ_φ`. There is no inhomogeneous term: unlike a + gauge field, a matter field transforms linearly. -/ +lemma repJetGaugeGroupI_iteratedJetDeriv_ofField + (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) + (U : JetGaugeGroupI) (φ : Module.Dual ℂ V) (s : Multiset (Fin 1 ⊕ Fin 3)) : + repJetGaugeGroupI rep hlin U (iteratedJetDeriv s (ofField φ)) = + (s.antidiagonal.map fun p => + iteratedJetDeriv p.2 (ofField (IsGaugeField.repDualCoeff rep U⁻¹ p.1 φ))).sum := by + rw [iteratedJetDeriv_ofField, repJetGaugeGroupI_ι, + show JetComponentSpace.repJetGaugeGroupI rep hlin U + ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace V) + = (repDual rep hlin U (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ), 0) from by + refine Prod.ext rfl ?_ + rw [JetComponentSpace.repJetGaugeGroupI_snd] + exact map_zero _, + repDual_basis_tmul, sum_inl, Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p _ => ?_) + rw [Function.comp_apply, iteratedJetDeriv_ofField] + +/-- The derivative generators of a matter field transform in the representation `rep` + carried by its jets, in the sense demanded by `StandardModel.TransformsIn`. -/ +theorem transformsIn_iteratedJetDeriv_ofField + (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) : + TransformsIn (repJetGaugeGroupI rep hlin) rep + fun s => (iteratedJetDeriv s).comp (ofField (V := V)) := + fun U φ s => repJetGaugeGroupI_iteratedJetDeriv_ofField rep hlin U φ s + +/-! + +### B.2. The conjugate field + +-/ + +/-- The transformation law of the derivative generators of the conjugate matter field. It + is the law of the field itself for the conjugate action `repConj rep` on the jets of the + conjugate field — the physicists' `ψ̄ ↦ ψ̄ U†` and its derivatives. -/ +lemma repJetGaugeGroupI_iteratedJetDeriv_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)) + (s : Multiset (Fin 1 ⊕ Fin 3)) : + repJetGaugeGroupI rep hlin U (iteratedJetDeriv s (ofConjField φ)) = + (s.antidiagonal.map fun p => + iteratedJetDeriv p.2 + (ofConjField (IsGaugeField.repDualCoeff (repConj rep) U⁻¹ p.1 φ))).sum := by + rw [iteratedJetDeriv_ofConjField, repJetGaugeGroupI_ι, + show JetComponentSpace.repJetGaugeGroupI rep hlin U + ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace V) + = (0, repDual (repConj rep) (repConj_smul_comm hlin) U + (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ)) from by + refine Prod.ext ?_ rfl + rw [JetComponentSpace.repJetGaugeGroupI_fst] + exact map_zero _, + repDual_basis_tmul, sum_inr, Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p _ => ?_) + rw [Function.comp_apply, iteratedJetDeriv_ofConjField] + +/-- The derivative generators of the conjugate matter field transform in the conjugate + representation `repConj rep`, in the sense demanded by + `StandardModel.TransformsIn`. -/ +theorem transformsIn_iteratedJetDeriv_ofConjField + (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + rep U (χ • z) = χ • rep U z) : + TransformsIn (repJetGaugeGroupI rep hlin) (repConj rep) + fun s => (iteratedJetDeriv s).comp (ofConjField (V := V)) := + fun U φ s => repJetGaugeGroupI_iteratedJetDeriv_ofConjField rep hlin U φ s + +end FermionicAlgebra + +end StandardModel diff --git a/Physlib/Particles/StandardModel/Matter/JetComponentSpace/TransformsIn.lean b/Physlib/Particles/StandardModel/Matter/JetComponentSpace/TransformsIn.lean new file mode 100644 index 000000000..fe91b9356 --- /dev/null +++ b/Physlib/Particles/StandardModel/Matter/JetComponentSpace/TransformsIn.lean @@ -0,0 +1,232 @@ +/- +Copyright (c) 2026 Joseph Tooby-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 +/-! +# The transformation law of a derivative symbol + +## i. Overview + +`StandardModel.TransformsIn` demands of a family of component functions that each +derivative symbol transform by the all-orders Leibniz convolution of the base-point Taylor +coefficients `IsGaugeField.repDualCoeff` of the gauge jet. What the gauge action on the jet +component space is *built* from is `symbolAction`, the action of the coefficient +`jetCoeff rep U⁻¹ : JetRing ⊗ End V` through `DerivAlgebraComplex.jetRingAction` on the +derivative label. This file identifies the two. + +The bridge is `DerivAlgebraComplex.jetRingAction_basis_multiset`, which puts the action of +a jet on a derivative monomial into the convolution form that `TransformsIn` wants. What +remains is to recognise the scalars it produces — the base-point Taylor coefficients of the +jet-ring factor of the gauge coefficient — as `IsGaugeField.repCoeff`. That is done by +`jetCoeffAt`, the base-point Taylor coefficient of a jet of endomorphisms, which on the +gauge coefficient reproduces `repCoeff` because `jetCoeff` reproduces `rep U` on constant +jets. + +The result, `repDual_basis_tmul`, is stated for an arbitrary fibrewise gauge action `rep`. +The conjugate half of the component space is the same construction at `repConj rep`, so it +is an instance of the same lemma rather than a second proof. + +## ii. Key results + +- `StandardModel.jetCoeffAt` : the base-point Taylor coefficient of a jet of endomorphisms. +- `StandardModel.jetCoeffAt_jetCoeff` : on the gauge coefficient it is + `IsGaugeField.repCoeff`. +- `StandardModel.symbolAction_basis_tmul` : a coefficient acts on a derivative monomial by + the Leibniz convolution of its base-point Taylor coefficients. +- `StandardModel.repDual_basis_tmul` : the transformation law of the derivative symbol + `∂_s ψ_φ`, in the form demanded by `StandardModel.TransformsIn`. + +## iii. Table of contents + +- A. Taylor coefficients of a jet of endomorphisms + - A.1. Iterated derivatives of a pure tensor + - A.2. The coefficient at a multiset of directions +- B. The transformation law of a derivative symbol + - B.1. Bookkeeping for transposes and multiset sums + - B.2. The action of a coefficient on a derivative monomial + - B.3. The gauge action on a derivative symbol + +-/ + +@[expose] public section + +namespace StandardModel + +open Matrix MatrixGroups TensorProduct MvPowerSeries + +variable {V : Type} [AddCommGroup V] [Module ℂ V] + +/-! + +## A. Taylor coefficients of a jet of endomorphisms + +-/ + +/-! + +### A.1. Iterated derivatives of a pure tensor + +-/ + +/-- The iterated formal derivative of a `V`-valued jet acts on the jet-ring factor of a + pure tensor: the value factor carries no spacetime dependence. -/ +lemma jetIteratedDeriv_tmul (x : Multiset (Fin 1 ⊕ Fin 3)) (f : JetRing) (v : V) : + jetIteratedDeriv x (f ⊗ₜ[ℂ] v) = (x.foldl (fun h ρ => pderiv ℂ ρ h) f) ⊗ₜ[ℂ] v := 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] + +/-! + +### A.2. The coefficient at a multiset of directions + +-/ + +/-- The base-point Taylor coefficient at `x` derivatives of a jet of endomorphisms of `V`: + differentiate `x` times and evaluate at the base point. It is the `V`-valued jet toolkit + applied to the value space `Module.End ℂ V`, and it is what a coefficient in + `JetRing ⊗ End V` contributes to the derivative symbol `∂_x`. -/ +noncomputable def jetCoeffAt (x : Multiset (Fin 1 ⊕ Fin 3)) : + JetRing ⊗[ℂ] Module.End ℂ V →ₗ[ℂ] Module.End ℂ V := + jetEval ∘ₗ jetIteratedDeriv x + +/-- On a pure coefficient `f ⊗ T` the Taylor coefficient is the base-point Taylor + coefficient of `f` times `T`. -/ +@[simp] +lemma jetCoeffAt_tmul (x : Multiset (Fin 1 ⊕ Fin 3)) (f : JetRing) (T : Module.End ℂ V) : + jetCoeffAt x (f ⊗ₜ[ℂ] T) + = constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f) • T := by + rw [jetCoeffAt, LinearMap.comp_apply, jetIteratedDeriv_tmul, jetEval_tmul] + +/-- The Taylor coefficient of a jet of endomorphisms, evaluated at a vector, is the Taylor + coefficient of the `V`-valued jet obtained by feeding that vector to the coefficient. -/ +lemma jetCoeffAt_apply (x : Multiset (Fin 1 ⊕ Fin 3)) + (c : JetRing ⊗[ℂ] Module.End ℂ V) (v : V) : + jetCoeffAt x c v = jetEval (jetIteratedDeriv x (TensorProduct.lift + ((LinearMap.llcomp ℂ V V (JetRing ⊗[ℂ] V)).comp + (TensorProduct.mk ℂ JetRing V)) c v)) := 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.add_apply, map_add, + map_add] + | tmul f T => + rw [jetCoeffAt_tmul, LinearMap.smul_apply, + show TensorProduct.lift ((LinearMap.llcomp ℂ V V (JetRing ⊗[ℂ] V)).comp + (TensorProduct.mk ℂ JetRing V)) (f ⊗ₜ[ℂ] T) v = f ⊗ₜ[ℂ] T v from rfl, + jetIteratedDeriv_tmul, jetEval_tmul] + +/-- The Taylor coefficients of the gauge coefficient are the Taylor coefficients of the + representation: `jetCoeff rep U` reproduces `rep U` on constant jets, and both sides of + this identity read off the same derivative of that. -/ +lemma jetCoeffAt_jetCoeff [Module.Free ℂ V] [Module.Finite ℂ V] + (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) (U : JetGaugeGroupI) + (x : Multiset (Fin 1 ⊕ Fin 3)) : + jetCoeffAt x (jetCoeff rep U) = IsGaugeField.repCoeff rep U x := by + refine LinearMap.ext fun v => ?_ + rw [jetCoeffAt_apply, jetCoeff_spec] + rfl + +/-! + +## B. The transformation law of a derivative symbol + +-/ + +/-! + +### B.1. Bookkeeping for transposes and multiset sums + +-/ + +/-- The transpose is additive in the endomorphism. -/ +private lemma dualMap_add_apply (A B : Module.End ℂ V) (φ : Module.Dual ℂ V) : + (A + B).dualMap φ = A.dualMap φ + B.dualMap φ := by + ext v + simp + +/-- The transpose is homogeneous in the endomorphism. -/ +private lemma dualMap_smul_apply (c : ℂ) (T : Module.End ℂ V) (φ : Module.Dual ℂ V) : + (c • T).dualMap φ = c • T.dualMap φ := by + ext v + simp + +/-- A multiset sum in the derivative label distributes out of a pure symbol. -/ +private lemma sum_tmul_right (m : Multiset DerivAlgebraComplex) (w : Module.Dual ℂ V) : + m.sum ⊗ₜ[ℂ] w = (m.map fun a => a ⊗ₜ[ℂ] w).sum := by + rw [show m.sum ⊗ₜ[ℂ] w + = ((TensorProduct.mk ℂ DerivAlgebraComplex (Module.Dual ℂ V)).flip w) m.sum from rfl, + map_multiset_sum] + rfl + +/-! + +### B.2. The action of a coefficient on a derivative monomial + +-/ + +/-- A coefficient acts on the derivative symbol `∂_s ψ_φ` by the all-orders Leibniz + convolution of its base-point Taylor coefficients: each splitting `s = s₁ + s₂` of the + derivative multiset contributes the Taylor coefficient at `s₁` acting on the target index + of the lower symbol `∂_{s₂} ψ_φ`. + + This is `DerivAlgebraComplex.jetRingAction_basis_multiset` in the derivative label, + together with the identification of the scalars it produces as `jetCoeffAt`; both sides + are additive in the coefficient, so it suffices to check it on a pure tensor. -/ +lemma symbolAction_basis_tmul (c : JetRing ⊗[ℂ] Module.End ℂ V) + (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V) : + symbolAction c (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) + = (s.antidiagonal.map fun p => + DerivAlgebraComplex.basis p.2 ⊗ₜ[ℂ] (jetCoeffAt p.1 c).dualMap φ).sum := by + induction c using TensorProduct.induction_on with + | zero => + rw [map_zero, LinearMap.zero_apply] + refine (Multiset.sum_eq_zero fun x hx => ?_).symm + obtain ⟨p, _, rfl⟩ := Multiset.mem_map.mp hx + rw [map_zero, show (0 : Module.End ℂ V).dualMap φ = 0 from LinearMap.ext fun v => by simp, + TensorProduct.tmul_zero] + | add c₁ c₂ h₁ h₂ => + rw [map_add, LinearMap.add_apply, h₁, h₂, ← Multiset.sum_map_add] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p _ => ?_) + rw [map_add, dualMap_add_apply, TensorProduct.tmul_add] + | tmul f T => + rw [symbolAction_tmul, TensorProduct.map_tmul, + DerivAlgebraComplex.jetRingAction_basis_multiset, sum_tmul_right, Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p _ => ?_) + rw [Function.comp_apply, TensorProduct.smul_tmul, jetCoeffAt_tmul, dualMap_smul_apply] + rfl + +/-! + +### B.3. The gauge action on a derivative symbol + +-/ + +/-- The transformation law of the derivative symbol `∂_s ψ_φ` under the jet gauge group: + the all-orders Leibniz convolution of the dual representation coefficients + `IsGaugeField.repDualCoeff` against lower symbols, with no inhomogeneous term. This is + the identity the `StandardModel.TransformsIn` obligations of a matter field rest on. + + Nothing here is special to the unconjugated half of the component space: the conjugate + half is this lemma at `repConj rep`. -/ +lemma repDual_basis_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) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V) : + repDual rep hlin U (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) + = (s.antidiagonal.map fun p => + DerivAlgebraComplex.basis p.2 ⊗ₜ[ℂ] + IsGaugeField.repDualCoeff rep U⁻¹ p.1 φ).sum := by + rw [show repDual rep hlin U = symbolAction (jetCoeff rep U⁻¹) from rfl, + symbolAction_basis_tmul] + exact congrArg Multiset.sum (Multiset.map_congr rfl fun p _ => by + rw [jetCoeffAt_jetCoeff, IsGaugeField.repDualCoeff]) + +end StandardModel diff --git a/Physlib/Relativity/DerivAlgebra.lean b/Physlib/Relativity/DerivAlgebra.lean index 12d69bbcc..b7aa98bb7 100644 --- a/Physlib/Relativity/DerivAlgebra.lean +++ b/Physlib/Relativity/DerivAlgebra.lean @@ -147,6 +147,28 @@ lemma deriv_apply_eq_mul (μ : Fin 1 ⊕ Fin 3) (a : DerivAlgebraComplex) : -/ open Nat +/-- Formal partial derivatives of a multivariate power series commute: each is given on + coefficients by a shift and a multiplication, and the two shifts commute. -/ +lemma _root_.MvPowerSeries.pderiv_comm {σ R : Type*} [CommSemiring R] (i j : σ) + (f : MvPowerSeries σ R) : + MvPowerSeries.pderiv R i (MvPowerSeries.pderiv R j f) = + MvPowerSeries.pderiv R j (MvPowerSeries.pderiv R i f) := by + ext n + rw [MvPowerSeries.coeff_pderiv, MvPowerSeries.coeff_pderiv, MvPowerSeries.coeff_pderiv, + MvPowerSeries.coeff_pderiv, add_right_comm n (Finsupp.single i 1) (Finsupp.single j 1)] + rcases eq_or_ne i j with rfl | h + · ring + · rw [Finsupp.add_apply, Finsupp.add_apply, Finsupp.single_eq_of_ne h, + Finsupp.single_eq_of_ne h.symm] + push_cast + ring + +/-- Differentiating a jet along a multiset of directions is well defined: the partial + derivatives commute, so the fold over a multiset does not depend on the order. -/ +instance : RightCommutative + (fun (f : JetRing) (μ : Fin 1 ⊕ Fin 3) => MvPowerSeries.pderiv ℂ μ f) where + right_comm f μ ν := MvPowerSeries.pderiv_comm ν μ f + /-- The evaluation map taking a function `f : JetRing` to `∂_μ f`. -/ noncomputable def eval : DerivAlgebraComplex →ₗ[ℂ] JetRing →ₗ[ℂ] ℂ := Lorentz.complexCoBasis.dualBasis.symmetricAlgebra.constr ℂ fun m => @@ -212,6 +234,31 @@ lemma eval_deriv (ν : Fin 1 ⊕ Fin 3) (p : DerivAlgebraComplex) (f : JetRing) ring exact LinearMap.congr_fun h p +/-- The pairing of the unit derivative symbol with a jet is its value at the base + point: the empty derivative multiset reads off the constant term. -/ +lemma eval_one (f : JetRing) : + eval (1 : DerivAlgebraComplex) f = MvPowerSeries.constantCoeff f := by + rw [show (1 : DerivAlgebraComplex) = basis (0 : Multiset (Fin 1 ⊕ Fin 3)) from basis_nil.symm, + basis_apply] + simp + +/-- Iterating adjointness: the pairing of the basis monomial `∂_s` with a jet is the + constant term of the iterated formal partial derivative `∂_s f`. This is the concrete + description of the divided-power pairing that `eval_deriv` encodes one derivative at a + time. -/ +lemma eval_basis_eq_constantCoeff_foldl_pderiv (s : Multiset (Fin 1 ⊕ Fin 3)) (f : JetRing) : + eval (basis s) f = + MvPowerSeries.constantCoeff (s.foldl (fun g μ => MvPowerSeries.pderiv ℂ μ g) f) := by + induction s using Multiset.induction_on generalizing f with + | empty => + rw [Multiset.foldl_zero, show (0 : Multiset (Fin 1 ⊕ Fin 3)) = {} from rfl, basis_nil, + eval_one] + | cons μ t ih => + rw [Multiset.foldl_cons, ← ih, + show basis (μ ::ₘ t) = deriv μ (basis t) by + rw [deriv_basis_multiset, ← Multiset.singleton_add, add_comm], + eval_deriv] + /-! ### B.2. The action of the Jet ring @@ -261,6 +308,34 @@ lemma eval_jetRingAction (χ f : JetRing) (p : DerivAlgebraComplex) : ring exact LinearMap.congr_fun h p +/-- The action of a jet on a derivative monomial, in multiset form: `∂_s` is sent to the + all-orders Leibniz convolution, each splitting `s = s₁ + s₂` of the derivative multiset + contributing the base-point Taylor coefficient `(∂_{s₁} χ)(0)` against the lower monomial + `∂_{s₂}`. + + This is `jetRingAction_basis` with the `Nat.choose` bookkeeping traded for the + divided-power pairing: both sides are compared through `eval`, where the identity is the + Leibniz rule `JetRing.constantCoeff_foldl_pderiv_mul` at the base point. It is the form + in which the transformation law of a matter field is stated. -/ +lemma jetRingAction_basis_multiset (χ : JetRing) (s : Multiset (Fin 1 ⊕ Fin 3)) : + jetRingAction χ (basis s) = + (s.antidiagonal.map fun p => + MvPowerSeries.constantCoeff + (p.1.foldl (fun h ρ => MvPowerSeries.pderiv ℂ ρ h) χ) • basis p.2).sum := by + refine eval_injective fun f => ?_ + rw [eval_jetRingAction, eval_basis_eq_constantCoeff_foldl_pderiv, + JetRing.constantCoeff_foldl_pderiv_mul, + show eval ((s.antidiagonal.map fun p => + MvPowerSeries.constantCoeff + (p.1.foldl (fun h ρ => MvPowerSeries.pderiv ℂ ρ h) χ) • basis p.2).sum) f + = (eval.flip f) ((s.antidiagonal.map fun p => + MvPowerSeries.constantCoeff + (p.1.foldl (fun h ρ => MvPowerSeries.pderiv ℂ ρ h) χ) • basis p.2).sum) from rfl, + map_multiset_sum, Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p _ => ?_) + rw [Function.comp_apply, map_smul, LinearMap.flip_apply, smul_eq_mul, + eval_basis_eq_constantCoeff_foldl_pderiv] + /-- Constant jets act on the derivative symbols by their value: `C c` has no derivative coordinates. -/ @[simp] @@ -545,6 +620,54 @@ lemma gradeScale_repLorentzGroup (t : ℂ) (Λ : SL(2,ℂ)) (a : DerivAlgebraCom simp exact DFunLike.congr_fun h a +/-! + +### B.7. The derivative-degree polynomial + +The degree scaling of the previous section records the derivative degree in a scalar. The +same construction with the scalar replaced by a formal variable records it in a polynomial: +`gradePoly` is the linear map sending the basis monomial `∂_s` to `X ^ |s| ∂_s`, so the +coefficient of `X ^ n` in `gradePoly a` is the part of `a` of derivative degree `n`. + +-/ + +/-- The derivative-degree polynomial on the algebra of derivative symbols: the linear map + sending the basis monomial `∂_s` to `X ^ |s|` times itself. It is `gradeScale` with the + scalar replaced by the formal variable `X`. -/ +noncomputable def gradePoly : DerivAlgebraComplex →ₗ[ℂ] Polynomial DerivAlgebraComplex := + basis.constr ℂ fun s => Polynomial.monomial (Multiset.card s) (basis s) + +/-- The derivative-degree polynomial of a basis monomial is the monomial of degree `|s|`. -/ +@[simp] +lemma gradePoly_basis (s : Multiset (Fin 1 ⊕ Fin 3)) : + gradePoly (basis s) = Polynomial.monomial (Multiset.card s) (basis s) := by + rw [gradePoly, Module.Basis.constr_basis] + +/-- Evaluating the derivative-degree polynomial at a scalar is the derivative-degree + scaling by that scalar: the two descriptions of the grading agree. -/ +lemma eval_algebraMap_gradePoly (t : ℂ) (a : DerivAlgebraComplex) : + (gradePoly a).eval (algebraMap ℂ DerivAlgebraComplex t) = gradeScale t a := by + have h : (Polynomial.eval₂AlgHom (AlgHom.id ℂ DerivAlgebraComplex) + (algebraMap ℂ DerivAlgebraComplex t) + (fun b => (Algebra.commutes t b).symm)).toLinearMap ∘ₗ gradePoly = + (gradeScale t).toLinearMap := by + refine basis.ext fun s => ?_ + simp only [LinearMap.coe_comp, Function.comp_apply, gradePoly_basis, + AlgHom.toLinearMap_apply, gradeScale_basis] + show (Polynomial.monomial (Multiset.card s) (basis s)).eval + (algebraMap ℂ DerivAlgebraComplex t) = _ + rw [Polynomial.eval_monomial, ← map_pow, ← Algebra.commutes, ← Algebra.smul_def] + exact LinearMap.congr_fun h a + +/-- Setting the formal variable to one recovers the original element: the pieces of a + graded decomposition sum to the element. -/ +lemma gradePoly_eval_one (a : DerivAlgebraComplex) : (gradePoly a).eval 1 = a := by + have h := eval_algebraMap_gradePoly 1 a + rw [map_one] at h + rw [h, gradeScale, show (1 : ℂ) • SymmetricAlgebra.ι ℂ (Module.Dual ℂ Lorentz.CoℂModule) + = SymmetricAlgebra.ι ℂ (Module.Dual ℂ Lorentz.CoℂModule) from one_smul _ _, + SymmetricAlgebra.lift_ι, AlgHom.id_apply] + end DerivAlgebraComplex @@ -719,4 +842,60 @@ lemma basisMultiset_singleton (μ : Fin 1 ⊕ Fin 3) : Basis.symmetricAlgebra, Basis.map_apply, h] simp +/-! + +## The derivative-degree polynomial on the real derivative algebra + +-/ + +/-- The degree scaling multiplies the real basis monomial at `s` by `t ^ |s|`. -/ +lemma gradeScale_basisMultiset (t : ℝ) (s : Multiset (Fin 1 ⊕ Fin 3)) : + gradeScale t (basisMultiset s) = t ^ Multiset.card s • basisMultiset s := by + induction s using Multiset.induction_on with + | empty => + rw [show basisMultiset (0 : Multiset (Fin 1 ⊕ Fin 3)) = 1 from basisMultiset_nil, map_one] + simp + | cons a s ih => + rw [← Multiset.singleton_add, ← basisMultiset_mul, map_mul, ih, basisMultiset_singleton, + gradeScale_ι, smul_mul_smul_comm, ← _root_.pow_succ', ← basisMultiset_singleton, + basisMultiset_mul, Multiset.singleton_add, Multiset.card_cons] + +/-- The derivative-degree polynomial on the real algebra of derivative symbols: the linear + map sending the basis monomial `∂_s` to `X ^ |s|` times itself. -/ +noncomputable def gradePoly : DerivAlgebraReal →ₗ[ℝ] Polynomial DerivAlgebraReal := + basisMultiset.constr ℝ fun s => Polynomial.monomial (Multiset.card s) (basisMultiset s) + +/-- The derivative-degree polynomial of a real basis monomial is the monomial of degree + `|s|`. -/ +@[simp] +lemma gradePoly_basisMultiset (s : Multiset (Fin 1 ⊕ Fin 3)) : + gradePoly (basisMultiset s) = + Polynomial.monomial (Multiset.card s) (basisMultiset s) := by + rw [gradePoly, Module.Basis.constr_basis] + +/-- Evaluating the real derivative-degree polynomial at a scalar is the derivative-degree + scaling by that scalar. -/ +lemma eval_algebraMap_gradePoly (t : ℝ) (a : DerivAlgebraReal) : + (gradePoly a).eval (algebraMap ℝ DerivAlgebraReal t) = gradeScale t a := by + have h : (Polynomial.eval₂AlgHom (AlgHom.id ℝ DerivAlgebraReal) + (algebraMap ℝ DerivAlgebraReal t) + (fun b => (Algebra.commutes t b).symm)).toLinearMap ∘ₗ gradePoly = + (gradeScale t).toLinearMap := by + refine basisMultiset.ext fun s => ?_ + simp only [LinearMap.coe_comp, Function.comp_apply, gradePoly_basisMultiset, + AlgHom.toLinearMap_apply, gradeScale_basisMultiset] + show (Polynomial.monomial (Multiset.card s) (basisMultiset s)).eval + (algebraMap ℝ DerivAlgebraReal t) = _ + rw [Polynomial.eval_monomial, ← map_pow, ← Algebra.commutes, ← Algebra.smul_def] + exact LinearMap.congr_fun h a + +/-- Setting the formal variable to one recovers the original element of the real + derivative algebra. -/ +lemma gradePoly_eval_one (a : DerivAlgebraReal) : (gradePoly a).eval 1 = a := by + have h := eval_algebraMap_gradePoly 1 a + rw [map_one] at h + rw [h, gradeScale, show (1 : ℝ) • SymmetricAlgebra.ι ℝ (Module.Dual ℝ Lorentz.CoVector) + = SymmetricAlgebra.ι ℝ (Module.Dual ℝ Lorentz.CoVector) from one_smul _ _, + SymmetricAlgebra.lift_ι, AlgHom.id_apply] + end DerivAlgebraReal diff --git a/Physlib/Relativity/JetRing/Basic.lean b/Physlib/Relativity/JetRing/Basic.lean index d1317bbc1..aef5658c6 100644 --- a/Physlib/Relativity/JetRing/Basic.lean +++ b/Physlib/Relativity/JetRing/Basic.lean @@ -192,6 +192,91 @@ lemma foldl_pderiv_pderiv (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3 /-! +### The all-orders Leibniz rule for iterated derivatives + +-/ + +/-- 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] + +/-- The iterated formal derivative of the zero jet vanishes. -/ +@[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] + +/-! + ### Truncation of jets -/ From 2c9040b477272f8ae56575ed136764922476df9c Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Wed, 2 Sep 2026 14:24:30 +0400 Subject: [PATCH 257/367] refactor(IsQuadLorentz): remove decide from the null-swap sign --- .../Invariants/IsQuadLorentz.lean | 94 +++++++++++++++++-- 1 file changed, 85 insertions(+), 9 deletions(-) diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean index 2934c54ea..299a6a9e8 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean @@ -1023,7 +1023,67 @@ lemma exists_coeffZ_eq_zero_of_odd : exact (Nat.not_even_iff_odd.2 hodd) (even_card_null_of_sum_lightConeWeight_eq_zero c'' hc'') -set_option maxRecDepth 40000 in +/-- On a supported slot, `nuZ` factors into the sign of the outer row and the sign of + the coordinate column. -/ +lemma nuZ_eq_row_sign_mul_column_sign (a : Fin 4) (μ : Fin 1 ⊕ Fin 3) + (h : ∃ κ, lightConeTransitionZ 1 2 a κ * lightConeCoeffZ 2 κ μ ≠ 0) : + nuZ a μ = + (if a = 0 ∨ a = 1 then -1 else 1) * + (if μ = Sum.inl 0 ∨ μ = Sum.inr 1 then -1 else 1) := by + obtain ⟨κ, hκ⟩ := h + rcases μ with b | j + · rw [Subsingleton.elim b 0] at hκ ⊢ + fin_cases a <;> fin_cases κ <;> + simp_all [nuZ, lightConeTransitionZ, lightConeCoeffZ] + · fin_cases j <;> fin_cases a <;> fin_cases κ <;> + simp_all [nuZ, lightConeTransitionZ, lightConeCoeffZ] + +/-- A bad coordinate-index pattern with even null-sector multiplicity has odd + multiplicity in the column-sign sector. -/ +lemma odd_card_inl_zero_or_inr_one_of_not_isPairedOrDistinct + (d : Fin 4 → Fin 1 ⊕ Fin 3) (hd : ¬IsPairedOrDistinct d) + (hC : ¬Odd (Finset.univ.filter fun s => d s = Sum.inl 0 ∨ d s = Sum.inr 2).card) : + Odd (Finset.univ.filter fun s => d s = Sum.inl 0 ∨ d s = Sum.inr 1).card := by + rw [isPairedOrDistinct_iff_card_parity] at hd + let n0 := (Finset.univ.filter fun s => d s = Sum.inl 0).card + let n1 := (Finset.univ.filter fun s => d s = Sum.inr 0).card + let n2 := (Finset.univ.filter fun s => d s = Sum.inr 1).card + let n3 := (Finset.univ.filter fun s => d s = Sum.inr 2).card + have hsplit (μ ν : Fin 1 ⊕ Fin 3) (hne : μ ≠ ν) : + (Finset.univ.filter fun s => d s = μ ∨ d s = ν).card + = (Finset.univ.filter fun s => d s = μ).card + + (Finset.univ.filter fun s => d s = ν).card := by + rw [Finset.filter_or, Finset.card_union_of_disjoint] + exact Finset.disjoint_filter.2 fun s _ hμ hν => hne (hμ.symm.trans hν) + have hsum : n0 + n1 + n2 + n3 = 4 := by + have h : ∑ μ : 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 h + simpa [n0, n1, n2, n3, Nat.add_assoc] using h + have hnullEven : Even (n0 + n3) := by + rw [← hsplit (Sum.inl 0) (Sum.inr 2) (by simp)] + exact Nat.not_odd_iff_even.mp hC + rw [hsplit (Sum.inl 0) (Sum.inr 1) (by simp), ← Nat.not_even_iff_odd] + intro hcolumnEven + apply hd + have h03 := Nat.even_iff.1 hnullEven + have h02 := Nat.even_iff.1 hcolumnEven + have hparity : ∀ μ, (Finset.univ.filter fun s => d s = μ).card % 2 = n0 % 2 := by + rintro (b | j) + · rw [Subsingleton.elim b 0] + · fin_cases j + · change n1 % 2 = n0 % 2 + omega + · change n2 % 2 = n0 % 2 + omega + · change n3 % 2 = n0 % 2 + omega + rcases Nat.even_or_odd n0 with h0 | h0 + · exact Or.inl fun μ => Nat.even_iff.2 (by rw [hparity μ]; exact Nat.even_iff.1 h0) + · exact Or.inr fun μ => Nat.odd_iff.2 (by rw [hparity μ]; exact Nat.odd_iff.1 h0) + /-- 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`. -/ @@ -1033,14 +1093,30 @@ lemma prod_nuZ_eq_neg_one : ¬(∃ 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 + intro c' hc' d hd hA hC + push Not at hA + have hcolumn := + odd_card_inl_zero_or_inr_one_of_not_isPairedOrDistinct d hd hC + have hrow : Even (Finset.univ.filter fun s => c' s = 0 ∨ c' s = 1).card := + even_card_null_of_sum_lightConeWeight_eq_zero c' hc' + have hfactor (s : Fin 4) : + nuZ (c' s) (d s) = + (if c' s = 0 ∨ c' s = 1 then -1 else 1) * + (if d s = Sum.inl 0 ∨ d s = Sum.inr 1 then -1 else 1) := + nuZ_eq_row_sign_mul_column_sign (c' s) (d s) (hA s) + calc + (∏ s, nuZ (c' s) (d s)) = + (∏ s, if c' s = 0 ∨ c' s = 1 then (-1 : ℤ) else 1) * + (∏ s, if d s = Sum.inl 0 ∨ d s = Sum.inr 1 then (-1 : ℤ) else 1) := by + rw [← Finset.prod_mul_distrib] + exact Finset.prod_congr rfl fun s _ => hfactor s + _ = (-1 : ℤ) ^ + ((Finset.univ.filter fun s => c' s = 0 ∨ c' s = 1).card + + (Finset.univ.filter fun s => d s = Sum.inl 0 ∨ d s = Sum.inr 1).card) := by + rw [pow_add] + congr 1 <;> + rw [Finset.prod_ite, Finset.prod_const, Finset.prod_const, one_pow, mul_one] + _ = -1 := Odd.neg_one_pow (Even.add_odd hrow hcolumn) /-- 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 From 8362dddc8d78e5fb69b836a0c573cb79992ef3c6 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 2 Sep 2026 14:18:22 +0100 Subject: [PATCH 258/367] add draft.md --- Draft.md | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 Draft.md diff --git a/Draft.md b/Draft.md new file mode 100644 index 000000000..faf50ab29 --- /dev/null +++ b/Draft.md @@ -0,0 +1,11 @@ +# Title: Formalization of the Standard Model + +## Abstract + +## 1. Introduction + +## 2. Overview + +## 3. The details + +## 4. Future work From 37587a1364ce09a292c38a718df0e877738ec057 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 2 Sep 2026 14:20:59 +0100 Subject: [PATCH 259/367] feat: Some text --- Draft.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Draft.md b/Draft.md index faf50ab29..a78fa92fb 100644 --- a/Draft.md +++ b/Draft.md @@ -1,7 +1,12 @@ # Title: Formalization of the Standard Model +authors: Jinzheng Li, Nathaneal Sajan, Joseph Tooby-Smith + +JTS: (Author list alphabetical by last name matching conventions in this area.) ## Abstract +The Standard Model of particle physics is our most successful theory of elementary physics. The key ingredient is the Standard Model Lagrangian. We formalize this in the interactive theorem prover Lean 4. This opens the door to ..... + ## 1. Introduction ## 2. Overview From b1a41d776c1064474370b732dbdef20862dc1277 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 3 Sep 2026 13:52:29 +0100 Subject: [PATCH 260/367] feat: UPdate draft --- Draft.md | 147 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 147 insertions(+) diff --git a/Draft.md b/Draft.md index a78fa92fb..0a28e30a7 100644 --- a/Draft.md +++ b/Draft.md @@ -9,8 +9,155 @@ The Standard Model of particle physics is our most successful theory of elementa ## 1. Introduction +The Standard Model of particle physics consists of the gauge group +G +: += +S +U +( +3 +) +× +S +U +( +2 +) +× +U +( +1 +) +G:=SU(3)×SU(2)×U(1) acting on a matter content consisting of 45 Weyl-fermions which collect into 15 irreducible representations of +G +G, conventionally written as +Q +i +Q +i +​ + , +u +i +u +i +​ + , +d +i +d +i +​ + , +L +i +L +i +​ + , and +e +i +e +i +​ + for +i +∈ +{ +0 +, +1 +, +2 +} +i∈{0,1,2}. The gauge group itself contributes the gauge bosons +G +μ +a +G +μ +a +​ + , +W +μ +a +W +μ +a +​ + and +B +μ +a +B +μ +a +​ + . There is also the Higgs boson +H +H which is a complex scalar. +At each point +x +x in space the Lagrangian is a polynomial function in the values of these fields at +x +x as well as all of their derivatives at +x +x which is invariant under the local action of the gauge group and the (global) action of the Lorentz group. The aim of this project is to formally verify that the only terms which can appear in such a Lagrangian are those known to appear in the SM Lagrangian, up-to total derivatives. In this sense we 'formally verify the Standard Model'. +Along the way we will also prove another theorem about the SM Lagrangian. In any oder of an EFT expansion gauge invariance implies that the lagrangian can be written as a polynomial in terms of just the field strengths, the matter fields, including the Higgs and their covariant derivatives. In other words, the gauge bosons must come packaged as a field strength or a covariant derivative. After this, only the global action of the gauge group matters for invariance. +Of course, there is no question of the actual correctness of these theorems. Thus we want the reader of this project to take away two things: 1) That we are now at a stage where we can formally verify the standard model Lagrangian, and 2) That we have built a reusable API so that one can formally verify (with the help of AI or by hand) other similar problems in high-energy physics, such as EFT expansions, or allowed terms in BSM theories. + + + ## 2. Overview +**The data structures** + +The main story is carried by three data structures. The first two are predicates — conditions on an arbitrary algebra B and a family of operators in it — while the third is a concrete algebra. + +- `IsStandardModel`: the condition that a family of operators in an algebra `B` behaves like the Standard Model fields — the gauge bosons, fermions and Higgs, together with their conjugates and all their derivatives, at a single implicit space-time point. It records how these operators commute, and how the full gauge group and the Lorentz group act on them. +- `IsCovStandardModel`: the same in covariant form. The gauge bosons are replaced by their field strengths, every derivative by a covariant derivative, and correspondingly only the global gauge group acts rather than the full one. +- `JetAlgebra`: the smallest concrete `B` containing all of these operators, subject to no relations beyond their statistics — bosonic generators commute, fermionic ones anticommute. + +**The connecting theorems** + +These three structures are interconnected to one another through a series of theorems: +1. `IsStandardModel.isCovStandardModel` — Every `IsStandardModel` defines a `IsCovStandardModel`, through the field strengths and the covariant derivatives. +2. `JetAlgebra.isStandardModel` — Within `JetAlgebra` there is an instance of `IsStandardModel`. +3. `JetAlgebra.isStandardModel_fieldAlgebra_eq_top` — Furthermore, the adjoin of the fields in `IsStandardModel` fully describe `JetAlgebra`. + + +**The reduction of invariants** + +These connecting theorems can be used +to form a reduction in the invariances: +1. `IsStandardModel.forall_repJet_and_repLorentz_eq_iff` — Every invariant under the full gauge group and the Lorentz group defined through the fields in `IsStandardModel` descends from an invariant of `IsCovStandardModel` under the global gauge group and the Lorentz group. This means we only have to deal with covariant derivatives, the field strengths, the global gauge group, and the Lorentz group when looking for invariants. +2. `JetAlgebra.isStandardModel_fieldAlgebra_eq_top`(corollary of this) — Every invariant of `JetAlgebra` is an invariant defined through `IsStandardModel`. + + +**The invariants theorems** + +Working back up the chain, we get an explict form of the invariants. Each of these give the explicit classification of the terms in the SM lagrangian up to total-derivatives, in the corresponding (general) contexts. +1. `IsCovStandardModel.mem_massWeightSubmoduleLE_eight_sup_and_gauge_lorentz_invariant_iff_lagrangian` — The full classification of the invariants of `IsCovStandardModel` up to mass-dimension 4. They are spanned by + - the constant `1`; + - the Higgs mass term `H†H`; + - the Higgs quartic `(H†H)²`, the Higgs kinetic term `∂^μH† ∂_μH`, and the two box terms `(□H†)H` and `H†□H`; + - the gauge kinetic terms `G^a_μν G^a^μν`, `W^a_μν W^a^μν`, `B_μν B^μν`, the corresponding θ-terms `ε^μνρσ G^a_μν G^a_ρσ` and its `W`, `B` analogues, and the contractions of the twice-derived hypercharge field `∂_μ∂_ν B_ρσ`; + - the fermion kinetic terms `ψ̄ σ̄^μ ∂_μ ψ`, one for each of the ten species and each pair of generations; + - the Yukawa couplings `H†Q d̄`, `ε H Q ū`, `H†L ē` and their conjugates, over each pair of generations. +2. `IsStandardModel.mem_massWeightSubmoduleLE_eight_and_invariant_iff_lagrangian` — From this, the full classification of the invariants of `IsStandardModel` up to mass-dimension 4. +3. `JetAlgebra.mem_massWeightSubmoduleLE_eight_and_invariant_iff_lagrangian` — Then, from this, the full classification of the invariants of `JetAlgebra`. + + +**Supporting API** +All of the above are supported by API around the Gauge group, the Lorentz group, and the individual matter fields. We discuss the main API here: +- *Lorentz group invariants*: Explicit classification of the full-group invariants in an algebra of terms which transform in certain representations. +- *Global gauge group invariants*: Explicit classification of the full-group invariants in an algebra of terms which transform in certain representations. +- *Fermions*: Specification of the underlying vector spaces, the Lorentz group action, the local and global gauge group actions on them. +- *Higgs*: Specification of the underlying vector space of the Higgs, the Lorentz group action, the local and global gauge group actions on it. +- *Gauge boson*: Specification of the Gauge algebra, the adjoint action, Maurer-Cartan terms etc, in this specific setting. + ## 3. The details ## 4. Future work From 7d503bcafd57475d0d07da3b4975f0287010d474 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 3 Sep 2026 13:55:13 +0100 Subject: [PATCH 261/367] feat: Fix formatting --- Draft.md | 101 +++---------------------------------------------------- 1 file changed, 5 insertions(+), 96 deletions(-) diff --git a/Draft.md b/Draft.md index 0a28e30a7..49d23c348 100644 --- a/Draft.md +++ b/Draft.md @@ -9,103 +9,12 @@ The Standard Model of particle physics is our most successful theory of elementa ## 1. Introduction -The Standard Model of particle physics consists of the gauge group -G -: -= -S -U -( -3 -) -× -S -U -( -2 -) -× -U -( -1 -) -G:=SU(3)×SU(2)×U(1) acting on a matter content consisting of 45 Weyl-fermions which collect into 15 irreducible representations of -G -G, conventionally written as -Q -i -Q -i -​ - , -u -i -u -i -​ - , -d -i -d -i -​ - , -L -i -L -i -​ - , and -e -i -e -i -​ - for -i -∈ -{ -0 -, -1 -, -2 -} -i∈{0,1,2}. The gauge group itself contributes the gauge bosons -G -μ -a -G -μ -a -​ - , -W -μ -a -W -μ -a -​ - and -B -μ -a -B -μ -a -​ - . There is also the Higgs boson -H -H which is a complex scalar. -At each point -x -x in space the Lagrangian is a polynomial function in the values of these fields at -x -x as well as all of their derivatives at -x -x which is invariant under the local action of the gauge group and the (global) action of the Lorentz group. The aim of this project is to formally verify that the only terms which can appear in such a Lagrangian are those known to appear in the SM Lagrangian, up-to total derivatives. In this sense we 'formally verify the Standard Model'. +The Standard Model of particle physics consists of the gauge group `G := SU(3) × SU(2) × U(1)` acting on a matter content consisting of 45 Weyl-fermions which collect into 15 irreducible representations of `G`, conventionally written as `Q_i`, `u_i`, `d_i`, `L_i`, and `e_i` for `i ∈ {0, 1, 2}`. The gauge group itself contributes the gauge bosons `G^a_μ`, `W^a_μ` and `B^a_μ`. There is also the Higgs boson `H` which is a complex scalar. + +At each point `x` in space the Lagrangian is a polynomial function in the values of these fields at `x` as well as all of their derivatives at `x` which is invariant under the local action of the gauge group and the (global) action of the Lorentz group. The aim of this project is to formally verify that the only terms which can appear in such a Lagrangian are those known to appear in the SM Lagrangian, up-to total derivatives. In this sense we 'formally verify the Standard Model'. + Along the way we will also prove another theorem about the SM Lagrangian. In any oder of an EFT expansion gauge invariance implies that the lagrangian can be written as a polynomial in terms of just the field strengths, the matter fields, including the Higgs and their covariant derivatives. In other words, the gauge bosons must come packaged as a field strength or a covariant derivative. After this, only the global action of the gauge group matters for invariance. + Of course, there is no question of the actual correctness of these theorems. Thus we want the reader of this project to take away two things: 1) That we are now at a stage where we can formally verify the standard model Lagrangian, and 2) That we have built a reusable API so that one can formally verify (with the help of AI or by hand) other similar problems in high-energy physics, such as EFT expansions, or allowed terms in BSM theories. From ed671e9451de630efa9cc02a3893fa1bd678d7c6 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 3 Sep 2026 14:53:35 +0100 Subject: [PATCH 262/367] feat: Different start to overview --- Draft.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/Draft.md b/Draft.md index 49d23c348..7a50940ba 100644 --- a/Draft.md +++ b/Draft.md @@ -21,6 +21,26 @@ Of course, there is no question of the actual correctness of these theorems. Thu ## 2. Overview +In this paper we formalize the Standard Model Lagrangian. To do that we must first say what a Lagrangian is, and it is worth building that up from what is actually in front of us. + +At the point `x` we have the fields: the gauge bosons, the fermions and the Higgs. We also have their conjugates, and all of their derivatives — `∂_μ H`, `∂_μ∂_ν H`, and so on. These are the ingredients, and a Lagrangian is built from nothing else. + +To build one we add these ingredients, scale them by complex numbers, and multiply them together. Those three operations are exactly what an associative algebra over `ℂ` provides — so whatever the fields are, they are elements of such an algebra, which we call `B`. + +Nothing further about B is ever used: no norm, no topology, no involution, and no commitment as to what its elements are. We therefore do not fix it. B is an arbitrary `ℂ`-algebra, and the fields are an arbitrary family of its elements, labelled the way the Standard Model fields are labelled. + +What we do need to know is how those elements behave inside `B`: + +- how they multiply past one another — the fermionic ones anticommute, the bosonic ones commute; +- how the gauge group acts on them; +- how the Lorentz group acts on them; +- what mass dimension each one carries. + +`IsStandardModel` is precisely this package: an algebra `B`, a family of elements in it, an action of the gauge group and an action of the Lorentz group, together with the requirement that they fit together as the Standard Model fields do. + + + + **The data structures** The main story is carried by three data structures. The first two are predicates — conditions on an arbitrary algebra B and a family of operators in it — while the third is a concrete algebra. @@ -70,3 +90,11 @@ All of the above are supported by API around the Gauge group, the Lorentz group, ## 3. The details ## 4. Future work + +- BSM +- EFTs +- Improvements to group theory & algebra +- Symmetry breaking +- Connection to Feynman diagrams +- QED and the connection to EM +- Appropaite inclusion of total derivative removals. From 9b8484f0ca798ad8ace12c3f98d9d8e2417091b6 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Fri, 4 Sep 2026 08:47:27 +0100 Subject: [PATCH 263/367] feat: Update definition of IsStandardModel --- Physlib.lean | 1 + .../StandardModel/IsStandardModel/Basic.lean | 2396 +++++++++++------ .../IsStandardModel/CovStandardModel.lean | 548 ++-- .../MassWeight/Filtration.lean | 19 +- .../JetAlgebra/IsStandardModel.lean | 930 +------ .../JetAlgebra/TransformsIn.lean | 591 ++++ 6 files changed, 2500 insertions(+), 1985 deletions(-) create mode 100644 Physlib/Particles/StandardModel/JetAlgebra/TransformsIn.lean diff --git a/Physlib.lean b/Physlib.lean index cc5293005..c9583e25a 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -355,6 +355,7 @@ 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.JetAlgebra.MassWeightPoly +public import Physlib.Particles.StandardModel.JetAlgebra.TransformsIn public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.Basic public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.GaugeAction public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.JetDeriv diff --git a/Physlib/Particles/StandardModel/IsStandardModel/Basic.lean b/Physlib/Particles/StandardModel/IsStandardModel/Basic.lean index b0c5703f0..8d1fc852f 100644 --- a/Physlib/Particles/StandardModel/IsStandardModel/Basic.lean +++ b/Physlib/Particles/StandardModel/IsStandardModel/Basic.lean @@ -11,531 +11,1291 @@ 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.JetAlgebra.TransformsIn /-! # 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. - -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. +## i. Overview + +An algebra `B` carries a Standard Model when the fields of the Standard Model, and every +polynomial expression in them, sit inside it compatibly with the gauge action, the Lorentz +action and the mass-weight grading. The jet algebra `StandardModel.JetAlgebra` is the +universal object with those fields, so the statement is a single one: an algebra map +`JetAlgebra →ₐ[ℂ] B`, equivariant for the jet gauge group and the Lorentz group and +compatible with `massWeightPoly`. That is the structure `IsStandardModel`, together with +the two demands that the group actions be multiplicative on the whole of `B` and not +merely on the image of the map — the covariant derivative of a matter field needs them +there. + +The thirteen families of derivative symbols are then derived: `h.A`, `h.H`, `h.barH` and +the ten fermion families are the jet algebra's own families pushed along the map. Every +transformation law, mass weight and commutation rule they satisfy is likewise the jet +algebra's own fact pushed along the map, and sections C to F prove them, one section per +shape of law. They carry the names they carried when they were axioms, so they are used +exactly as before. + +The rest of the file is the covariant reduction. Sections G to L develop 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. Sections M onwards work +inside a Standard Model: the field algebra, the covariant derivative towers, their gauge +covariance, and the classification of jet-gauge invariants that the covariant form of the +theory consumes. + +## ii. Key results + +- `StandardModel.IsStandardModel` : an algebra is a Standard Model when it receives an + equivariant algebra map from the jet algebra. +- `IsStandardModel.A`, `IsStandardModel.H` and their companions : the thirteen families of + derivative symbols of a Standard Model. +- `IsStandardModel.repJet_A`, `IsStandardModel.repLorentz_H`, + `IsStandardModel.massWeight_d`, `IsStandardModel.d_anticomm_bard` and their companions : + the transformation laws, mass weights and statistics of those families. +- `IsStandardModel.fieldAlgebra` : the algebra the fields generate. +- `IsStandardModel.covDerivH` and its companions : the covariant derivative towers. +- `IsStandardModel.invariant_mem_adjoin_covDeriv` : the classification of jet-gauge + invariants of the field algebra. + +## iii. Table of contents + +- A. The fields of a Standard Model +- B. Transporting a fact along the defining map +- C. The gauge transformation of the fields +- D. The Lorentz transformation of the fields +- E. The mass weights of the fields +- F. The statistics of the fields +- G. The Lorentz mixing of derivative slots +- H. The Leibniz convolution and the mixing operator +- I. The gauge action commutes with the Lorentz action on the value spaces +- J. The Lorentz law of the covariant matter towers +- K. The Lorentz law of the covariant field-strength tower +- L. The antisymmetry of the field strength +- M. The field algebra +- N. Covariant derivatives +- O. The algebra written in terms of covariant derivatives +- P. Gauge covariance of the covariant derivatives +- Q. The field strength and its covariant derivatives +- R. The matter covariant derivatives transform through the base point +- S. Pure gauge jets fix the matter covariant derivatives +- T. The classification of gauge invariants +- U. The Lorentz laws of the covariant matter towers -/ @[expose] public section +set_option maxHeartbeats 4000000 +set_option synthInstance.maxHeartbeats 1000000 +set_option synthInstance.maxSize 2048 +set_option maxRecDepth 8000 + namespace StandardModel open TensorProduct Matrix MatrixGroups Lorentz +/-- The algebra `B`, with a jet gauge action, a Lorentz action and a mass-weight grading, + is a Standard Model when it receives an algebra map from the jet algebra of the Standard + Model which is equivariant for both actions and compatible with the grading. The fields + of the Standard Model then sit inside `B` as the images of the jet algebra's own, and + every law they satisfy there is the jet algebra's own law pushed along the map. + + The last two fields are not consequences of the first four: an equivariant map forces the + two actions to be multiplicative only on its image, whereas the covariant derivative of a + matter field needs them multiplicative on the whole of `B`. -/ structure IsStandardModel (B : Type) [Ring 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 - -- *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 φ) - -- **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) + (repJet : Representation ℂ JetGaugeGroupI B) + (repLorentz : Representation ℂ SL(2,ℂ) B) + (massWeightPoly : B →ₐ[ℂ] Polynomial B) where + /-- The algebra map out of the jet algebra of the Standard Model: it is what places the + fields of the Standard Model, and every polynomial expression in them, inside `B`. -/ + toAlgHom : JetAlgebra →ₐ[ℂ] B + /-- The map is equivariant for the jet gauge group: the gauge action on `B` restricts + along it to the jet algebra's own. -/ + map_repJet : ∀ (U : JetGaugeGroupI) (x : JetAlgebra), + toAlgHom (JetAlgebra.repJetGaugeGroupI U x) = repJet U (toAlgHom x) + /-- The map is equivariant for the Lorentz group: the Lorentz action on `B` restricts + along it to the jet algebra's own. -/ + map_repLorentz : ∀ (Λ : SL(2,ℂ)) (x : JetAlgebra), + toAlgHom (JetAlgebra.repLorentzGroup Λ x) = repLorentz Λ (toAlgHom x) + /-- The map carries the mass-weight grading of the jet algebra to that of `B`: the + mass-weight polynomial of an image is the image of the mass-weight polynomial. -/ + map_massWeight : ∀ x : JetAlgebra, massWeightPoly (toAlgHom x) + = Polynomial.mapAlgHom toAlgHom (JetAlgebra.massWeightPoly x) + /-- The jet gauge action preserves products on the whole of `B`, not merely on the image + of the jet algebra: gauge transformations act by algebra endomorphisms. -/ + repJet_mul : ∀ (U : JetGaugeGroupI) (b₁ b₂ : B), + repJet U (b₁ * b₂) = repJet U b₁ * repJet U b₂ + /-- 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₂ + +namespace IsStandardModel + +variable {B : Type} [Ring B] [Algebra ℂ B] + {repJet : Representation ℂ JetGaugeGroupI B} + {repLorentz : Representation ℂ SL(2,ℂ) B} + {massWeightPoly : B →ₐ[ℂ] Polynomial B} + (h : IsStandardModel B repJet repLorentz massWeightPoly) + +/-! + +## A. The fields of a Standard Model + +The thirteen families of derivative symbols the theory is written in — the gauge field, +the Higgs field and its conjugate, and the five fermion species in three generations with +their conjugates — are no longer data of the structure. They are the corresponding +families of the jet algebra, carried into `B` along the defining algebra map. The gauge +family is real-linear in its value index, so the map is restricted to `ℝ` there. + +-/ + +/-- The derivative symbols `∂_s A_μ^ψ` of the gauge field inside `B`. -/ +noncomputable def A (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : + Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B := + h.toAlgHom.toLinearMap.restrictScalars ℝ ∘ₗ JetAlgebra.gaugeField s μ + +/-- The derivative symbols `∂_s H_φ` of the Higgs field inside `B`. -/ +noncomputable def H (s : Multiset (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ HiggsVec →ₗ[ℂ] B := + h.toAlgHom.toLinearMap ∘ₗ JetAlgebra.higgsField s + +/-- The derivative symbols `∂_s H̄_φ` of the conjugate Higgs field inside `B`. -/ +noncomputable def barH (s : Multiset (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (ConjModule HiggsVec) →ₗ[ℂ] B := + h.toAlgHom.toLinearMap ∘ₗ JetAlgebra.conjHiggsField s + +/-- The derivative symbols of the `i`-th generation down-type quark singlet inside `B`. -/ +noncomputable def d (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ DownSinglet →ₗ[ℂ] B := + h.toAlgHom.toLinearMap ∘ₗ JetAlgebra.downSingletField i s + +/-- The derivative symbols of the `i`-th generation conjugate down-type quark singlet + inside `B`. -/ +noncomputable def bard (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (ConjModule DownSinglet) →ₗ[ℂ] B := + h.toAlgHom.toLinearMap ∘ₗ JetAlgebra.conjDownSingletField i s + +/-- The derivative symbols of the `i`-th generation up-type quark singlet inside `B`. -/ +noncomputable def u (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ UpSinglet →ₗ[ℂ] B := + h.toAlgHom.toLinearMap ∘ₗ JetAlgebra.upSingletField i s + +/-- The derivative symbols of the `i`-th generation conjugate up-type quark singlet + inside `B`. -/ +noncomputable def baru (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (ConjModule UpSinglet) →ₗ[ℂ] B := + h.toAlgHom.toLinearMap ∘ₗ JetAlgebra.conjUpSingletField i s + +/-- The derivative symbols of the `i`-th generation quark doublet inside `B`. -/ +noncomputable def Q (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ QuarkDoublet →ₗ[ℂ] B := + h.toAlgHom.toLinearMap ∘ₗ JetAlgebra.quarkDoubletField i s + +/-- The derivative symbols of the `i`-th generation conjugate quark doublet inside `B`. -/ +noncomputable def barQ (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (ConjModule QuarkDoublet) →ₗ[ℂ] B := + h.toAlgHom.toLinearMap ∘ₗ JetAlgebra.conjQuarkDoubletField i s + +/-- The derivative symbols of the `i`-th generation lepton doublet inside `B`. -/ +noncomputable def L (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ LeptonDoublet →ₗ[ℂ] B := + h.toAlgHom.toLinearMap ∘ₗ JetAlgebra.leptonDoubletField i s + +/-- The derivative symbols of the `i`-th generation conjugate lepton doublet inside `B`. -/ +noncomputable def barL (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (ConjModule LeptonDoublet) →ₗ[ℂ] B := + h.toAlgHom.toLinearMap ∘ₗ JetAlgebra.conjLeptonDoubletField i s + +/-- The derivative symbols of the `i`-th generation charged-lepton singlet inside `B`. -/ +noncomputable def e (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ LeptonSinglet →ₗ[ℂ] B := + h.toAlgHom.toLinearMap ∘ₗ JetAlgebra.leptonSingletField i s + +/-- The derivative symbols of the `i`-th generation conjugate charged-lepton singlet + inside `B`. -/ +noncomputable def bare (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (ConjModule LeptonSinglet) →ₗ[ℂ] B := + h.toAlgHom.toLinearMap ∘ₗ JetAlgebra.conjLeptonSingletField i s + +/-! + +## B. Transporting a fact along the defining map + +Every law the old structure demanded as an axiom is now a theorem, proved once for the jet +algebra and transported along `toAlgHom`. The transport is the same in each of the five +shapes the laws take — a Leibniz convolution for the gauge action, a slot-mixing sum for +the Lorentz action, a monomial eigenvalue equation for the mass weights, a commutation and +an anticommutation — so each shape is done once here. + +-/ + +/-- A jet gauge transformation law transports along the defining map: the convolution is a + multiset sum, and the map is additive and equivariant. -/ +private lemma map_family_repJet {V : Type} [AddCommGroup V] [Module ℂ V] + {rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)} + {G : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] JetAlgebra} + (hG : TransformsIn (B := JetAlgebra) JetAlgebra.repJetGaugeGroupI rep G) : + TransformsIn repJet rep fun s => h.toAlgHom.toLinearMap ∘ₗ G s := by + intro U φ s + show repJet U (h.toAlgHom _) = _ + rw [← h.map_repJet, hG U φ s, map_multiset_sum, Multiset.map_map] + rfl + +/-- A Lorentz transformation law transports along the defining map: the slot mixing is a + finite sum of scalar multiples, and the map is linear and equivariant. -/ +private lemma map_family_repLorentz {V : Type} [AddCommGroup V] [Module ℂ V] + {rep : Representation ℂ SL(2,ℂ) V} + {G : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] JetAlgebra} + (hG : IsLorentzDerivTransforms (A := JetAlgebra) JetAlgebra.repLorentzGroup rep G) : + IsLorentzDerivTransforms repLorentz rep fun s => h.toAlgHom.toLinearMap ∘ₗ G s := by + intro Λ n l φ + show repLorentz Λ (h.toAlgHom _) = _ + rw [← h.map_repLorentz, hG Λ n l φ, map_sum] + exact Finset.sum_congr rfl fun p _ => map_smul h.toAlgHom _ _ + +/-- A monomial mass-weight eigenvalue transports along the defining map: the map carries + the mass-weight polynomial to the mass-weight polynomial, and a monomial to a monomial. -/ +private lemma map_massWeight_monomial {x : JetAlgebra} {n : ℕ} + (hx : JetAlgebra.massWeightPoly x = Polynomial.monomial n x) : + massWeightPoly (h.toAlgHom x) = Polynomial.monomial n (h.toAlgHom x) := by + rw [h.map_massWeight, hx, Polynomial.mapAlgHom_monomial] + +/-- An anticommutation transports along the defining map: the map preserves products and + negation. -/ +private lemma map_anticomm {x y : JetAlgebra} (hxy : x * y = -(y * x)) : + h.toAlgHom x * h.toAlgHom y = -(h.toAlgHom y * h.toAlgHom x) := by + rw [← map_mul h.toAlgHom, hxy, map_neg h.toAlgHom, map_mul h.toAlgHom] + +/-! + +## C. The gauge transformation of the fields + +The gauge field is a gauge field — Lorentz covector symbols, the all-orders adjoint +Leibniz convolution with the Maurer–Cartan shift, and a multiplicative gauge action — and +each of the twelve matter families transforms in its own jet gauge representation, the +barred families in the conjugate of it. + +-/ + +/-- The law `repJet_A` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma repJet_A : IsGaugeField repLorentz repJet h.A where + lorentz_apply := by + intro Λ n l μ φ + have key := congrArg h.toAlgHom (JetAlgebra.isGaugeField.lorentz_apply Λ n l μ φ) + rw [h.map_repLorentz] at key + refine key.trans ?_ + rw [map_sum] + refine Finset.sum_congr rfl fun p _ => ?_ + rw [map_smul, map_sum] + congr 1 + exact Finset.sum_congr rfl fun a _ => map_smul h.toAlgHom _ _ + gauge_apply_deriv := by + intro U s μ φ + have key := congrArg h.toAlgHom (JetAlgebra.isGaugeField.gauge_apply_deriv U s μ φ) + rw [h.map_repJet] at key + refine key.trans ?_ + rw [map_add, map_multiset_sum, Multiset.map_map, AlgHom.commutes] + rfl + gauge_mul := h.repJet_mul + +/-- The law `repJet_H` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma repJet_H : TransformsIn repJet HiggsVec.repJetGaugeGroupI h.H := + h.map_family_repJet JetAlgebra.transformsIn_higgsField + +/-- The law `repJet_barH` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma repJet_barH : TransformsIn repJet (repConj HiggsVec.repJetGaugeGroupI) h.barH := + h.map_family_repJet JetAlgebra.transformsIn_conjHiggsField + +/-- The law `repJet_d` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma repJet_d : ∀ i, TransformsIn repJet DownSinglet.repJetGaugeGroupI (h.d i) := + fun i => h.map_family_repJet (JetAlgebra.transformsIn_downSingletField i) + +/-- The law `repJet_bard` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma repJet_bard : ∀ i, TransformsIn repJet (repConj DownSinglet.repJetGaugeGroupI) (h.bard i) := + fun i => h.map_family_repJet (JetAlgebra.transformsIn_conjDownSingletField i) + +/-- The law `repJet_u` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma repJet_u : ∀ i, TransformsIn repJet UpSinglet.repJetGaugeGroupI (h.u i) := + fun i => h.map_family_repJet (JetAlgebra.transformsIn_upSingletField i) + +/-- The law `repJet_baru` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma repJet_baru : ∀ i, TransformsIn repJet (repConj UpSinglet.repJetGaugeGroupI) (h.baru i) := + fun i => h.map_family_repJet (JetAlgebra.transformsIn_conjUpSingletField i) + +/-- The law `repJet_Q` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma repJet_Q : ∀ i, TransformsIn repJet QuarkDoublet.repJetGaugeGroupI (h.Q i) := + fun i => h.map_family_repJet (JetAlgebra.transformsIn_quarkDoubletField i) + +/-- The law `repJet_barQ` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma repJet_barQ : ∀ i, TransformsIn repJet (repConj QuarkDoublet.repJetGaugeGroupI) (h.barQ i) := + fun i => h.map_family_repJet (JetAlgebra.transformsIn_conjQuarkDoubletField i) + +/-- The law `repJet_L` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma repJet_L : ∀ i, TransformsIn repJet LeptonDoublet.repJetGaugeGroupI (h.L i) := + fun i => h.map_family_repJet (JetAlgebra.transformsIn_leptonDoubletField i) + +/-- The law `repJet_barL` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma repJet_barL : ∀ i, TransformsIn repJet (repConj LeptonDoublet.repJetGaugeGroupI) (h.barL i) := + fun i => h.map_family_repJet (JetAlgebra.transformsIn_conjLeptonDoubletField i) + +/-- The law `repJet_e` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma repJet_e : ∀ i, TransformsIn repJet LeptonSinglet.repJetGaugeGroupI (h.e i) := + fun i => h.map_family_repJet (JetAlgebra.transformsIn_leptonSingletField i) + +/-- The law `repJet_bare` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma repJet_bare : ∀ i, TransformsIn repJet (repConj LeptonSinglet.repJetGaugeGroupI) (h.bare i) := + fun i => h.map_family_repJet (JetAlgebra.transformsIn_conjLeptonSingletField i) + +/-! + +## D. The Lorentz transformation of the fields + +The derivative slots of every field mix by per-slot Lorentz matrices, and 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. + +-/ + +/-- The law `repLorentz_H` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma repLorentz_H : IsLorentzDerivTransforms repLorentz + (Representation.trivial ℂ SL(2,ℂ) HiggsVec) h.H := + h.map_family_repLorentz JetAlgebra.isLorentzDerivTransforms_higgsField + +/-- The law `repLorentz_barH` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma repLorentz_barH : IsLorentzDerivTransforms repLorentz + (Representation.trivial ℂ SL(2,ℂ) HiggsVec).conj h.barH := + h.map_family_repLorentz JetAlgebra.isLorentzDerivTransforms_conjHiggsField + +/-- The law `repLorentz_d` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma repLorentz_d : ∀ i, IsLorentzDerivTransforms repLorentz + DownSinglet.repLorentzGroup (h.d i) := + fun i => h.map_family_repLorentz (JetAlgebra.isLorentzDerivTransforms_downSingletField i) + +/-- The law `repLorentz_bard` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma repLorentz_bard : ∀ i, IsLorentzDerivTransforms repLorentz + DownSinglet.repLorentzGroup.conj (h.bard i) := + fun i => h.map_family_repLorentz (JetAlgebra.isLorentzDerivTransforms_conjDownSingletField i) + +/-- The law `repLorentz_u` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma repLorentz_u : ∀ i, IsLorentzDerivTransforms repLorentz + UpSinglet.repLorentzGroup (h.u i) := + fun i => h.map_family_repLorentz (JetAlgebra.isLorentzDerivTransforms_upSingletField i) + +/-- The law `repLorentz_baru` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma repLorentz_baru : ∀ i, IsLorentzDerivTransforms repLorentz + UpSinglet.repLorentzGroup.conj (h.baru i) := + fun i => h.map_family_repLorentz (JetAlgebra.isLorentzDerivTransforms_conjUpSingletField i) + +/-- The law `repLorentz_Q` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma repLorentz_Q : ∀ i, IsLorentzDerivTransforms repLorentz + QuarkDoublet.repLorentzGroup (h.Q i) := + fun i => h.map_family_repLorentz (JetAlgebra.isLorentzDerivTransforms_quarkDoubletField i) + +/-- The law `repLorentz_barQ` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma repLorentz_barQ : ∀ i, IsLorentzDerivTransforms repLorentz + QuarkDoublet.repLorentzGroup.conj (h.barQ i) := + fun i => h.map_family_repLorentz (JetAlgebra.isLorentzDerivTransforms_conjQuarkDoubletField i) + +/-- The law `repLorentz_L` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma repLorentz_L : ∀ i, IsLorentzDerivTransforms repLorentz + LeptonDoublet.repLorentzGroup (h.L i) := + fun i => h.map_family_repLorentz (JetAlgebra.isLorentzDerivTransforms_leptonDoubletField i) + +/-- The law `repLorentz_barL` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma repLorentz_barL : ∀ i, IsLorentzDerivTransforms repLorentz + LeptonDoublet.repLorentzGroup.conj (h.barL i) := + fun i => h.map_family_repLorentz (JetAlgebra.isLorentzDerivTransforms_conjLeptonDoubletField i) + +/-- The law `repLorentz_e` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma repLorentz_e : ∀ i, IsLorentzDerivTransforms repLorentz + LeptonSinglet.repLorentzGroup (h.e i) := + fun i => h.map_family_repLorentz (JetAlgebra.isLorentzDerivTransforms_leptonSingletField i) + +/-- The law `repLorentz_bare` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma repLorentz_bare : ∀ i, IsLorentzDerivTransforms repLorentz + LeptonSinglet.repLorentzGroup.conj (h.bare i) := + fun i => h.map_family_repLorentz (JetAlgebra.isLorentzDerivTransforms_conjLeptonSingletField i) + +/-! + +## E. The mass weights of the fields + +Every derivative symbol is a `massWeightPoly`-eigenvector of pure monomial weight — twice +its mass dimension. The bosons have mass dimension `1 + |s|`, the fermions `3/2 + |s|`. + +-/ + +/-- The law `massWeight_H` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma massWeight_H : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) φ, + massWeightPoly (h.H s φ) = Polynomial.monomial (2 * (1 + Multiset.card s)) (h.H s φ) := + fun s φ => h.map_massWeight_monomial (JetAlgebra.massWeightPoly_higgsField s φ) + +/-- The law `massWeight_barH` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma massWeight_barH : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) φ, + massWeightPoly (h.barH s φ) = Polynomial.monomial (2 * (1 + Multiset.card s)) (h.barH s φ) := + fun s φ => h.map_massWeight_monomial (JetAlgebra.massWeightPoly_conjHiggsField s φ) + +/-- The law `massWeight_A` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma massWeight_A : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) μ φ, + massWeightPoly (h.A s μ φ) = Polynomial.monomial (2 * (1 + Multiset.card s)) (h.A s μ φ) := + fun s μ φ => h.map_massWeight_monomial (JetAlgebra.massWeightPoly_gaugeField s μ φ) + +/-- The law `massWeight_d` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma massWeight_d : ∀ i (s : Multiset (Fin 1 ⊕ Fin 3)) φ, + massWeightPoly (h.d i s φ) = Polynomial.monomial (3 + 2 * Multiset.card s) (h.d i s φ) := + fun i s φ => h.map_massWeight_monomial (JetAlgebra.massWeightPoly_downSingletField i s φ) + +/-- The law `massWeight_bard` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma massWeight_bard : ∀ i (s : Multiset (Fin 1 ⊕ Fin 3)) φ, + massWeightPoly (h.bard i s φ) = Polynomial.monomial (3 + 2 * Multiset.card s) (h.bard i s φ) := + fun i s φ => h.map_massWeight_monomial (JetAlgebra.massWeightPoly_conjDownSingletField i s φ) + +/-- The law `massWeight_u` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma massWeight_u : ∀ i (s : Multiset (Fin 1 ⊕ Fin 3)) φ, + massWeightPoly (h.u i s φ) = Polynomial.monomial (3 + 2 * Multiset.card s) (h.u i s φ) := + fun i s φ => h.map_massWeight_monomial (JetAlgebra.massWeightPoly_upSingletField i s φ) + +/-- The law `massWeight_baru` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma massWeight_baru : ∀ i (s : Multiset (Fin 1 ⊕ Fin 3)) φ, + massWeightPoly (h.baru i s φ) = Polynomial.monomial (3 + 2 * Multiset.card s) (h.baru i s φ) := + fun i s φ => h.map_massWeight_monomial (JetAlgebra.massWeightPoly_conjUpSingletField i s φ) + +/-- The law `massWeight_Q` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma massWeight_Q : ∀ i (s : Multiset (Fin 1 ⊕ Fin 3)) φ, + massWeightPoly (h.Q i s φ) = Polynomial.monomial (3 + 2 * Multiset.card s) (h.Q i s φ) := + fun i s φ => h.map_massWeight_monomial (JetAlgebra.massWeightPoly_quarkDoubletField i s φ) + +/-- The law `massWeight_barQ` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma massWeight_barQ : ∀ i (s : Multiset (Fin 1 ⊕ Fin 3)) φ, + massWeightPoly (h.barQ i s φ) = Polynomial.monomial (3 + 2 * Multiset.card s) (h.barQ i s φ) := + fun i s φ => h.map_massWeight_monomial (JetAlgebra.massWeightPoly_conjQuarkDoubletField i s φ) + +/-- The law `massWeight_L` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma massWeight_L : ∀ i (s : Multiset (Fin 1 ⊕ Fin 3)) φ, + massWeightPoly (h.L i s φ) = Polynomial.monomial (3 + 2 * Multiset.card s) (h.L i s φ) := + fun i s φ => h.map_massWeight_monomial (JetAlgebra.massWeightPoly_leptonDoubletField i s φ) + +/-- The law `massWeight_barL` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma massWeight_barL : ∀ i (s : Multiset (Fin 1 ⊕ Fin 3)) φ, + massWeightPoly (h.barL i s φ) = Polynomial.monomial (3 + 2 * Multiset.card s) (h.barL i s φ) := + fun i s φ => h.map_massWeight_monomial (JetAlgebra.massWeightPoly_conjLeptonDoubletField i s φ) + +/-- The law `massWeight_e` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma massWeight_e : ∀ i (s : Multiset (Fin 1 ⊕ Fin 3)) φ, + massWeightPoly (h.e i s φ) = Polynomial.monomial (3 + 2 * Multiset.card s) (h.e i s φ) := + fun i s φ => h.map_massWeight_monomial (JetAlgebra.massWeightPoly_leptonSingletField i s φ) + +/-- The law `massWeight_bare` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma massWeight_bare : ∀ i (s : Multiset (Fin 1 ⊕ Fin 3)) φ, + massWeightPoly (h.bare i s φ) = Polynomial.monomial (3 + 2 * Multiset.card s) (h.bare i s φ) := + fun i s φ => h.map_massWeight_monomial (JetAlgebra.massWeightPoly_conjLeptonSingletField i s φ) + +/-! + +## F. The statistics of the fields + +The gauge field is bosonic: its symbols commute with each other and with every matter +symbol. The Higgs symbols commute with each other and with every fermion symbol, and the +fermion symbols anticommute among themselves. Together these fix the statistics of every +symbol of the theory. + +-/ + +/-- The law `A_comm_A` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma A_comm_A : ∀ (s s' : Multiset (Fin 1 ⊕ Fin 3)) (μ μ' : Fin 1 ⊕ Fin 3) + (ψ ψ' : Module.Dual ℝ GaugeAlgebra), Commute (h.A s μ ψ) (h.A s' μ' ψ') := + fun s _ μ _ ψ _ => (JetAlgebra.gaugeField_commute s μ ψ _).map h.toAlgHom + +/-- The law `A_comm_H` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma 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) + Commute (h.A s μ ψ) (h.H s' φ) := + fun s μ ψ _ _ => (JetAlgebra.gaugeField_commute s μ ψ _).map h.toAlgHom + +/-- The law `A_comm_barH` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma 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) + Commute (h.A s μ ψ) (h.barH s' φ) := + fun s μ ψ _ _ => (JetAlgebra.gaugeField_commute s μ ψ _).map h.toAlgHom + +/-- The law `A_comm_d` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma 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) + Commute (h.A s μ ψ) (h.d i s' φ) := + fun s μ ψ _ _ _ => (JetAlgebra.gaugeField_commute s μ ψ _).map h.toAlgHom + +/-- The law `A_comm_bard` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma 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) + Commute (h.A s μ ψ) (h.bard i s' φ) := + fun s μ ψ _ _ _ => (JetAlgebra.gaugeField_commute s μ ψ _).map h.toAlgHom + +/-- The law `A_comm_u` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma 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) + Commute (h.A s μ ψ) (h.u i s' φ) := + fun s μ ψ _ _ _ => (JetAlgebra.gaugeField_commute s μ ψ _).map h.toAlgHom + +/-- The law `A_comm_baru` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma 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) + Commute (h.A s μ ψ) (h.baru i s' φ) := + fun s μ ψ _ _ _ => (JetAlgebra.gaugeField_commute s μ ψ _).map h.toAlgHom + +/-- The law `A_comm_Q` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma 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) + Commute (h.A s μ ψ) (h.Q i s' φ) := + fun s μ ψ _ _ _ => (JetAlgebra.gaugeField_commute s μ ψ _).map h.toAlgHom + +/-- The law `A_comm_barQ` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma 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) + Commute (h.A s μ ψ) (h.barQ i s' φ) := + fun s μ ψ _ _ _ => (JetAlgebra.gaugeField_commute s μ ψ _).map h.toAlgHom + +/-- The law `A_comm_L` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma 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) + Commute (h.A s μ ψ) (h.L i s' φ) := + fun s μ ψ _ _ _ => (JetAlgebra.gaugeField_commute s μ ψ _).map h.toAlgHom + +/-- The law `A_comm_barL` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma 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) + Commute (h.A s μ ψ) (h.barL i s' φ) := + fun s μ ψ _ _ _ => (JetAlgebra.gaugeField_commute s μ ψ _).map h.toAlgHom + +/-- The law `A_comm_e` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma 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) + Commute (h.A s μ ψ) (h.e i s' φ) := + fun s μ ψ _ _ _ => (JetAlgebra.gaugeField_commute s μ ψ _).map h.toAlgHom + +/-- The law `A_comm_bare` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma 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)) + Commute (h.A s μ ψ) (h.bare i s' φ) := + fun s μ ψ _ _ _ => (JetAlgebra.gaugeField_commute s μ ψ _).map h.toAlgHom + +/-- The Higgs is bosonic: two Higgs symbols commute. -/ +lemma H_comm_H : ∀ (s s' : Multiset (Fin 1 ⊕ Fin 3)) (φ φ' : Module.Dual ℂ HiggsVec), + Commute (h.H s φ) (h.H s' φ') := + fun s s' φ φ' => ((JetAlgebra.memHiggsSector_higgsField s φ).commute + (JetAlgebra.memHiggsSector_higgsField s' φ')).map h.toAlgHom + +/-- A Higgs symbol commutes with a conjugate Higgs symbol. -/ +lemma H_comm_barH : ∀ (s s' : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ HiggsVec) + (φ' : Module.Dual ℂ (ConjModule HiggsVec)), + Commute (h.H s φ) (h.barH s' φ') := + fun s s' φ φ' => ((JetAlgebra.memHiggsSector_higgsField s φ).commute + (JetAlgebra.memHiggsSector_conjHiggsField s' φ')).map h.toAlgHom + +/-- Two conjugate Higgs symbols commute. -/ +lemma barH_comm_barH : ∀ (s s' : Multiset (Fin 1 ⊕ Fin 3)) (φ φ' : Module.Dual ℂ + (ConjModule HiggsVec)), + Commute (h.barH s φ) (h.barH s' φ') := + fun s s' φ φ' => ((JetAlgebra.memHiggsSector_conjHiggsField s φ).commute + (JetAlgebra.memHiggsSector_conjHiggsField s' φ')).map h.toAlgHom + +/-- The Higgs symbols commute with the down-type quark symbols: the Higgs is a boson, so it + carries no statistics against the fermions. -/ +lemma 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.H s φ) (h.d i s' φ') := + fun s φ i s' φ' => + ((JetAlgebra.memHiggsSector_higgsField s φ).commute_of_memFermionSector + (JetAlgebra.isFermionGenerator_downSingletField i s' φ').memFermionSector).map h.toAlgHom + +/-- The Higgs symbols commute with the conjugate down-type quark symbols: the Higgs is a boson, so + it carries no statistics against the fermions. -/ +lemma 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.H s φ) (h.bard i s' φ') := + fun s φ i s' φ' => + ((JetAlgebra.memHiggsSector_higgsField s φ).commute_of_memFermionSector + (JetAlgebra.isFermionGenerator_conjDownSingletField i s' φ').memFermionSector).map h.toAlgHom + +/-- The Higgs symbols commute with the up-type quark symbols: the Higgs is a boson, so it carries + no statistics against the fermions. -/ +lemma 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.H s φ) (h.u i s' φ') := + fun s φ i s' φ' => + ((JetAlgebra.memHiggsSector_higgsField s φ).commute_of_memFermionSector + (JetAlgebra.isFermionGenerator_upSingletField i s' φ').memFermionSector).map h.toAlgHom + +/-- The Higgs symbols commute with the conjugate up-type quark symbols: the Higgs is a boson, so + it carries no statistics against the fermions. -/ +lemma 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.H s φ) (h.baru i s' φ') := + fun s φ i s' φ' => + ((JetAlgebra.memHiggsSector_higgsField s φ).commute_of_memFermionSector + (JetAlgebra.isFermionGenerator_conjUpSingletField i s' φ').memFermionSector).map h.toAlgHom + +/-- The Higgs symbols commute with the quark doublet symbols: the Higgs is a boson, so it carries + no statistics against the fermions. -/ +lemma 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.H s φ) (h.Q i s' φ') := + fun s φ i s' φ' => + ((JetAlgebra.memHiggsSector_higgsField s φ).commute_of_memFermionSector + (JetAlgebra.isFermionGenerator_quarkDoubletField i s' φ').memFermionSector).map h.toAlgHom + +/-- The Higgs symbols commute with the conjugate quark doublet symbols: the Higgs is a boson, so + it carries no statistics against the fermions. -/ +lemma 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.H s φ) (h.barQ i s' φ') := + fun s φ i s' φ' => + ((JetAlgebra.memHiggsSector_higgsField s φ).commute_of_memFermionSector + (JetAlgebra.isFermionGenerator_conjQuarkDoubletField i s' φ').memFermionSector).map h.toAlgHom + +/-- The Higgs symbols commute with the lepton doublet symbols: the Higgs is a boson, so it carries + no statistics against the fermions. -/ +lemma 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.H s φ) (h.L i s' φ') := + fun s φ i s' φ' => + ((JetAlgebra.memHiggsSector_higgsField s φ).commute_of_memFermionSector + (JetAlgebra.isFermionGenerator_leptonDoubletField i s' φ').memFermionSector).map h.toAlgHom + +/-- The Higgs symbols commute with the conjugate lepton doublet symbols: the Higgs is a boson, so + it carries no statistics against the fermions. -/ +lemma 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.H s φ) (h.barL i s' φ') := + fun s φ i s' φ' => + ((JetAlgebra.memHiggsSector_higgsField s φ).commute_of_memFermionSector + (JetAlgebra.isFermionGenerator_conjLeptonDoubletField i s' φ').memFermionSector).map + h.toAlgHom + +/-- The Higgs symbols commute with the lepton singlet symbols: the Higgs is a boson, so it carries + no statistics against the fermions. -/ +lemma 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.H s φ) (h.e i s' φ') := + fun s φ i s' φ' => + ((JetAlgebra.memHiggsSector_higgsField s φ).commute_of_memFermionSector + (JetAlgebra.isFermionGenerator_leptonSingletField i s' φ').memFermionSector).map h.toAlgHom + +/-- The Higgs symbols commute with the conjugate lepton singlet symbols: the Higgs is a boson, so + it carries no statistics against the fermions. -/ +lemma 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.H s φ) (h.bare i s' φ') := + fun s φ i s' φ' => + ((JetAlgebra.memHiggsSector_higgsField s φ).commute_of_memFermionSector + (JetAlgebra.isFermionGenerator_conjLeptonSingletField i s' φ').memFermionSector).map + h.toAlgHom + +/-- The conjugate Higgs symbols commute with the down-type quark symbols: the Higgs is a boson, so + it carries no statistics against the fermions. -/ +lemma 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 (h.barH s φ) (h.d i s' φ') := + fun s φ i s' φ' => + ((JetAlgebra.memHiggsSector_conjHiggsField s φ).commute_of_memFermionSector + (JetAlgebra.isFermionGenerator_downSingletField i s' φ').memFermionSector).map h.toAlgHom + +/-- 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. -/ +lemma 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 (h.barH s φ) (h.bard i s' φ') := + fun s φ i s' φ' => + ((JetAlgebra.memHiggsSector_conjHiggsField s φ).commute_of_memFermionSector + (JetAlgebra.isFermionGenerator_conjDownSingletField i s' φ').memFermionSector).map h.toAlgHom + +/-- The conjugate Higgs symbols commute with the up-type quark symbols: the Higgs is a boson, so + it carries no statistics against the fermions. -/ +lemma 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 (h.barH s φ) (h.u i s' φ') := + fun s φ i s' φ' => + ((JetAlgebra.memHiggsSector_conjHiggsField s φ).commute_of_memFermionSector + (JetAlgebra.isFermionGenerator_upSingletField i s' φ').memFermionSector).map h.toAlgHom + +/-- 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. -/ +lemma 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 (h.barH s φ) (h.baru i s' φ') := + fun s φ i s' φ' => + ((JetAlgebra.memHiggsSector_conjHiggsField s φ).commute_of_memFermionSector + (JetAlgebra.isFermionGenerator_conjUpSingletField i s' φ').memFermionSector).map h.toAlgHom + +/-- The conjugate Higgs symbols commute with the quark doublet symbols: the Higgs is a boson, so + it carries no statistics against the fermions. -/ +lemma 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 (h.barH s φ) (h.Q i s' φ') := + fun s φ i s' φ' => + ((JetAlgebra.memHiggsSector_conjHiggsField s φ).commute_of_memFermionSector + (JetAlgebra.isFermionGenerator_quarkDoubletField i s' φ').memFermionSector).map h.toAlgHom + +/-- The conjugate Higgs symbols commute with the conjugate quark doublet symbols: the Higgs is a + boson, so it carries no statistics against the fermions. -/ +lemma 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 (h.barH s φ) (h.barQ i s' φ') := + fun s φ i s' φ' => + ((JetAlgebra.memHiggsSector_conjHiggsField s φ).commute_of_memFermionSector + (JetAlgebra.isFermionGenerator_conjQuarkDoubletField i s' φ').memFermionSector).map h.toAlgHom + +/-- The conjugate Higgs symbols commute with the lepton doublet symbols: the Higgs is a boson, so + it carries no statistics against the fermions. -/ +lemma 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 (h.barH s φ) (h.L i s' φ') := + fun s φ i s' φ' => + ((JetAlgebra.memHiggsSector_conjHiggsField s φ).commute_of_memFermionSector + (JetAlgebra.isFermionGenerator_leptonDoubletField i s' φ').memFermionSector).map h.toAlgHom + +/-- The conjugate Higgs symbols commute with the conjugate lepton doublet symbols: the Higgs is a + boson, so it carries no statistics against the fermions. -/ +lemma 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 (h.barH s φ) (h.barL i s' φ') := + fun s φ i s' φ' => + ((JetAlgebra.memHiggsSector_conjHiggsField s φ).commute_of_memFermionSector + (JetAlgebra.isFermionGenerator_conjLeptonDoubletField i s' φ').memFermionSector).map + h.toAlgHom + +/-- The conjugate Higgs symbols commute with the lepton singlet symbols: the Higgs is a boson, so + it carries no statistics against the fermions. -/ +lemma 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 (h.barH s φ) (h.e i s' φ') := + fun s φ i s' φ' => + ((JetAlgebra.memHiggsSector_conjHiggsField s φ).commute_of_memFermionSector + (JetAlgebra.isFermionGenerator_leptonSingletField i s' φ').memFermionSector).map h.toAlgHom + +/-- The conjugate Higgs symbols commute with the conjugate lepton singlet symbols: the Higgs is a + boson, so it carries no statistics against the fermions. -/ +lemma 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 (h.barH s φ) (h.bare i s' φ') := + fun s φ i s' φ' => + ((JetAlgebra.memHiggsSector_conjHiggsField s φ).commute_of_memFermionSector + (JetAlgebra.isFermionGenerator_conjLeptonSingletField i s' φ').memFermionSector).map + h.toAlgHom + +/-- The down-type quark symbols anticommute among themselves. -/ +lemma d_anticomm_d : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ φ' : Module.Dual ℂ DownSinglet), + h.d i s φ * h.d j s' φ' = -(h.d j s' φ' * h.d i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_downSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_downSingletField j s' φ')) + +/-- The down-type quark symbols anticommute with the conjugate down-type quark symbols. -/ +lemma d_anticomm_bard : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ DownSinglet) (φ' : Module.Dual ℂ (ConjModule DownSinglet)), + h.d i s φ * h.bard j s' φ' = -(h.bard j s' φ' * h.d i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_downSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjDownSingletField j s' φ')) + +/-- The down-type quark symbols anticommute with the up-type quark symbols. -/ +lemma d_anticomm_u : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ DownSinglet) + (φ' : Module.Dual ℂ UpSinglet), + h.d i s φ * h.u j s' φ' = -(h.u j s' φ' * h.d i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_downSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_upSingletField j s' φ')) + +/-- The down-type quark symbols anticommute with the conjugate up-type quark symbols. -/ +lemma d_anticomm_baru : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ DownSinglet) (φ' : Module.Dual ℂ (ConjModule UpSinglet)), + h.d i s φ * h.baru j s' φ' = -(h.baru j s' φ' * h.d i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_downSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjUpSingletField j s' φ')) + +/-- The down-type quark symbols anticommute with the quark doublet symbols. -/ +lemma d_anticomm_Q : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ DownSinglet) + (φ' : Module.Dual ℂ QuarkDoublet), + h.d i s φ * h.Q j s' φ' = -(h.Q j s' φ' * h.d i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_downSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_quarkDoubletField j s' φ')) + +/-- The down-type quark symbols anticommute with the conjugate quark doublet symbols. -/ +lemma d_anticomm_barQ : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ DownSinglet) (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)), + h.d i s φ * h.barQ j s' φ' = -(h.barQ j s' φ' * h.d i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_downSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjQuarkDoubletField j s' φ')) + +/-- The down-type quark symbols anticommute with the lepton doublet symbols. -/ +lemma d_anticomm_L : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ DownSinglet) + (φ' : Module.Dual ℂ LeptonDoublet), + h.d i s φ * h.L j s' φ' = -(h.L j s' φ' * h.d i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_downSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_leptonDoubletField j s' φ')) + +/-- The down-type quark symbols anticommute with the conjugate lepton doublet symbols. -/ +lemma d_anticomm_barL : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ DownSinglet) (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), + h.d i s φ * h.barL j s' φ' = -(h.barL j s' φ' * h.d i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_downSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjLeptonDoubletField j s' φ')) + +/-- The down-type quark symbols anticommute with the lepton singlet symbols. -/ +lemma d_anticomm_e : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ DownSinglet) + (φ' : Module.Dual ℂ LeptonSinglet), + h.d i s φ * h.e j s' φ' = -(h.e j s' φ' * h.d i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_downSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_leptonSingletField j s' φ')) + +/-- The down-type quark symbols anticommute with the conjugate lepton singlet symbols. -/ +lemma d_anticomm_bare : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ DownSinglet) (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), + h.d i s φ * h.bare j s' φ' = -(h.bare j s' φ' * h.d i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_downSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjLeptonSingletField j s' φ')) + +/-- The conjugate down-type quark symbols anticommute among themselves. -/ +lemma bard_anticomm_bard : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ φ' : Module.Dual ℂ (ConjModule DownSinglet)), + h.bard i s φ * h.bard j s' φ' = -(h.bard j s' φ' * h.bard i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_conjDownSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjDownSingletField j s' φ')) + +/-- The conjugate down-type quark symbols anticommute with the up-type quark symbols. -/ +lemma bard_anticomm_u : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule DownSinglet)) (φ' : Module.Dual ℂ UpSinglet), + h.bard i s φ * h.u j s' φ' = -(h.u j s' φ' * h.bard i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_conjDownSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_upSingletField j s' φ')) + +/-- The conjugate down-type quark symbols anticommute with the conjugate up-type quark symbols. -/ +lemma bard_anticomm_baru : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule DownSinglet)) (φ' : Module.Dual ℂ (ConjModule UpSinglet)), + h.bard i s φ * h.baru j s' φ' = -(h.baru j s' φ' * h.bard i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_conjDownSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjUpSingletField j s' φ')) + +/-- The conjugate down-type quark symbols anticommute with the quark doublet symbols. -/ +lemma bard_anticomm_Q : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule DownSinglet)) (φ' : Module.Dual ℂ QuarkDoublet), + h.bard i s φ * h.Q j s' φ' = -(h.Q j s' φ' * h.bard i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_conjDownSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_quarkDoubletField j s' φ')) + +/-- The conjugate down-type quark symbols anticommute with the conjugate quark doublet symbols. -/ +lemma bard_anticomm_barQ : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule DownSinglet)) (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)), + h.bard i s φ * h.barQ j s' φ' = -(h.barQ j s' φ' * h.bard i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_conjDownSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjQuarkDoubletField j s' φ')) + +/-- The conjugate down-type quark symbols anticommute with the lepton doublet symbols. -/ +lemma bard_anticomm_L : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule DownSinglet)) (φ' : Module.Dual ℂ LeptonDoublet), + h.bard i s φ * h.L j s' φ' = -(h.L j s' φ' * h.bard i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_conjDownSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_leptonDoubletField j s' φ')) + +/-- The conjugate down-type quark symbols anticommute with the conjugate lepton doublet symbols. + -/ +lemma bard_anticomm_barL : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule DownSinglet)) (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), + h.bard i s φ * h.barL j s' φ' = -(h.barL j s' φ' * h.bard i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_conjDownSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjLeptonDoubletField j s' φ')) + +/-- The conjugate down-type quark symbols anticommute with the lepton singlet symbols. -/ +lemma bard_anticomm_e : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule DownSinglet)) (φ' : Module.Dual ℂ LeptonSinglet), + h.bard i s φ * h.e j s' φ' = -(h.e j s' φ' * h.bard i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_conjDownSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_leptonSingletField j s' φ')) + +/-- The conjugate down-type quark symbols anticommute with the conjugate lepton singlet symbols. + -/ +lemma bard_anticomm_bare : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule DownSinglet)) (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), + h.bard i s φ * h.bare j s' φ' = -(h.bare j s' φ' * h.bard i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_conjDownSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjLeptonSingletField j s' φ')) + +/-- The up-type quark symbols anticommute among themselves. -/ +lemma u_anticomm_u : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ φ' : Module.Dual ℂ UpSinglet), + h.u i s φ * h.u j s' φ' = -(h.u j s' φ' * h.u i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_upSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_upSingletField j s' φ')) + +/-- The up-type quark symbols anticommute with the conjugate up-type quark symbols. -/ +lemma u_anticomm_baru : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ UpSinglet) + (φ' : Module.Dual ℂ (ConjModule UpSinglet)), + h.u i s φ * h.baru j s' φ' = -(h.baru j s' φ' * h.u i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_upSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjUpSingletField j s' φ')) + +/-- The up-type quark symbols anticommute with the quark doublet symbols. -/ +lemma u_anticomm_Q : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ UpSinglet) + (φ' : Module.Dual ℂ QuarkDoublet), + h.u i s φ * h.Q j s' φ' = -(h.Q j s' φ' * h.u i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_upSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_quarkDoubletField j s' φ')) + +/-- The up-type quark symbols anticommute with the conjugate quark doublet symbols. -/ +lemma u_anticomm_barQ : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ UpSinglet) + (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)), + h.u i s φ * h.barQ j s' φ' = -(h.barQ j s' φ' * h.u i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_upSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjQuarkDoubletField j s' φ')) + +/-- The up-type quark symbols anticommute with the lepton doublet symbols. -/ +lemma u_anticomm_L : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ UpSinglet) + (φ' : Module.Dual ℂ LeptonDoublet), + h.u i s φ * h.L j s' φ' = -(h.L j s' φ' * h.u i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_upSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_leptonDoubletField j s' φ')) + +/-- The up-type quark symbols anticommute with the conjugate lepton doublet symbols. -/ +lemma u_anticomm_barL : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ UpSinglet) + (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), + h.u i s φ * h.barL j s' φ' = -(h.barL j s' φ' * h.u i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_upSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjLeptonDoubletField j s' φ')) + +/-- The up-type quark symbols anticommute with the lepton singlet symbols. -/ +lemma u_anticomm_e : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ UpSinglet) + (φ' : Module.Dual ℂ LeptonSinglet), + h.u i s φ * h.e j s' φ' = -(h.e j s' φ' * h.u i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_upSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_leptonSingletField j s' φ')) + +/-- The up-type quark symbols anticommute with the conjugate lepton singlet symbols. -/ +lemma u_anticomm_bare : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ UpSinglet) + (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), + h.u i s φ * h.bare j s' φ' = -(h.bare j s' φ' * h.u i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_upSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjLeptonSingletField j s' φ')) + +/-- The conjugate up-type quark symbols anticommute among themselves. -/ +lemma baru_anticomm_baru : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ φ' : Module.Dual ℂ (ConjModule UpSinglet)), + h.baru i s φ * h.baru j s' φ' = -(h.baru j s' φ' * h.baru i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_conjUpSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjUpSingletField j s' φ')) + +/-- The conjugate up-type quark symbols anticommute with the quark doublet symbols. -/ +lemma baru_anticomm_Q : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule UpSinglet)) (φ' : Module.Dual ℂ QuarkDoublet), + h.baru i s φ * h.Q j s' φ' = -(h.Q j s' φ' * h.baru i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_conjUpSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_quarkDoubletField j s' φ')) + +/-- The conjugate up-type quark symbols anticommute with the conjugate quark doublet symbols. -/ +lemma baru_anticomm_barQ : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule UpSinglet)) (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)), + h.baru i s φ * h.barQ j s' φ' = -(h.barQ j s' φ' * h.baru i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_conjUpSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjQuarkDoubletField j s' φ')) + +/-- The conjugate up-type quark symbols anticommute with the lepton doublet symbols. -/ +lemma baru_anticomm_L : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule UpSinglet)) (φ' : Module.Dual ℂ LeptonDoublet), + h.baru i s φ * h.L j s' φ' = -(h.L j s' φ' * h.baru i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_conjUpSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_leptonDoubletField j s' φ')) + +/-- The conjugate up-type quark symbols anticommute with the conjugate lepton doublet symbols. -/ +lemma baru_anticomm_barL : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule UpSinglet)) (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), + h.baru i s φ * h.barL j s' φ' = -(h.barL j s' φ' * h.baru i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_conjUpSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjLeptonDoubletField j s' φ')) + +/-- The conjugate up-type quark symbols anticommute with the lepton singlet symbols. -/ +lemma baru_anticomm_e : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule UpSinglet)) (φ' : Module.Dual ℂ LeptonSinglet), + h.baru i s φ * h.e j s' φ' = -(h.e j s' φ' * h.baru i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_conjUpSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_leptonSingletField j s' φ')) + +/-- The conjugate up-type quark symbols anticommute with the conjugate lepton singlet symbols. -/ +lemma baru_anticomm_bare : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule UpSinglet)) (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), + h.baru i s φ * h.bare j s' φ' = -(h.bare j s' φ' * h.baru i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_conjUpSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjLeptonSingletField j s' φ')) + +/-- The quark doublet symbols anticommute among themselves. -/ +lemma Q_anticomm_Q : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ φ' : Module.Dual ℂ QuarkDoublet), + h.Q i s φ * h.Q j s' φ' = -(h.Q j s' φ' * h.Q i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_quarkDoubletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_quarkDoubletField j s' φ')) + +/-- The quark doublet symbols anticommute with the conjugate quark doublet symbols. -/ +lemma Q_anticomm_barQ : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ QuarkDoublet) (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)), + h.Q i s φ * h.barQ j s' φ' = -(h.barQ j s' φ' * h.Q i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_quarkDoubletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjQuarkDoubletField j s' φ')) + +/-- The quark doublet symbols anticommute with the lepton doublet symbols. -/ +lemma Q_anticomm_L : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ QuarkDoublet) + (φ' : Module.Dual ℂ LeptonDoublet), + h.Q i s φ * h.L j s' φ' = -(h.L j s' φ' * h.Q i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_quarkDoubletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_leptonDoubletField j s' φ')) + +/-- The quark doublet symbols anticommute with the conjugate lepton doublet symbols. -/ +lemma Q_anticomm_barL : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ QuarkDoublet) (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), + h.Q i s φ * h.barL j s' φ' = -(h.barL j s' φ' * h.Q i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_quarkDoubletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjLeptonDoubletField j s' φ')) + +/-- The quark doublet symbols anticommute with the lepton singlet symbols. -/ +lemma Q_anticomm_e : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ QuarkDoublet) + (φ' : Module.Dual ℂ LeptonSinglet), + h.Q i s φ * h.e j s' φ' = -(h.e j s' φ' * h.Q i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_quarkDoubletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_leptonSingletField j s' φ')) + +/-- The quark doublet symbols anticommute with the conjugate lepton singlet symbols. -/ +lemma Q_anticomm_bare : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ QuarkDoublet) (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), + h.Q i s φ * h.bare j s' φ' = -(h.bare j s' φ' * h.Q i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_quarkDoubletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjLeptonSingletField j s' φ')) + +/-- The conjugate quark doublet symbols anticommute among themselves. -/ +lemma barQ_anticomm_barQ : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ φ' : Module.Dual ℂ (ConjModule QuarkDoublet)), + h.barQ i s φ * h.barQ j s' φ' = -(h.barQ j s' φ' * h.barQ i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_conjQuarkDoubletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjQuarkDoubletField j s' φ')) + +/-- The conjugate quark doublet symbols anticommute with the lepton doublet symbols. -/ +lemma barQ_anticomm_L : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) (φ' : Module.Dual ℂ LeptonDoublet), + h.barQ i s φ * h.L j s' φ' = -(h.L j s' φ' * h.barQ i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_conjQuarkDoubletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_leptonDoubletField j s' φ')) + +/-- The conjugate quark doublet symbols anticommute with the conjugate lepton doublet symbols. -/ +lemma barQ_anticomm_barL : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), + h.barQ i s φ * h.barL j s' φ' = -(h.barL j s' φ' * h.barQ i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_conjQuarkDoubletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjLeptonDoubletField j s' φ')) + +/-- The conjugate quark doublet symbols anticommute with the lepton singlet symbols. -/ +lemma barQ_anticomm_e : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) (φ' : Module.Dual ℂ LeptonSinglet), + h.barQ i s φ * h.e j s' φ' = -(h.e j s' φ' * h.barQ i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_conjQuarkDoubletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_leptonSingletField j s' φ')) + +/-- The conjugate quark doublet symbols anticommute with the conjugate lepton singlet symbols. -/ +lemma barQ_anticomm_bare : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), + h.barQ i s φ * h.bare j s' φ' = -(h.bare j s' φ' * h.barQ i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_conjQuarkDoubletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjLeptonSingletField j s' φ')) + +/-- The lepton doublet symbols anticommute among themselves. -/ +lemma L_anticomm_L : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ φ' : Module.Dual ℂ LeptonDoublet), + h.L i s φ * h.L j s' φ' = -(h.L j s' φ' * h.L i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_leptonDoubletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_leptonDoubletField j s' φ')) + +/-- The lepton doublet symbols anticommute with the conjugate lepton doublet symbols. -/ +lemma L_anticomm_barL : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ LeptonDoublet) (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), + h.L i s φ * h.barL j s' φ' = -(h.barL j s' φ' * h.L i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_leptonDoubletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjLeptonDoubletField j s' φ')) + +/-- The lepton doublet symbols anticommute with the lepton singlet symbols. -/ +lemma L_anticomm_e : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ LeptonDoublet) + (φ' : Module.Dual ℂ LeptonSinglet), + h.L i s φ * h.e j s' φ' = -(h.e j s' φ' * h.L i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_leptonDoubletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_leptonSingletField j s' φ')) + +/-- The lepton doublet symbols anticommute with the conjugate lepton singlet symbols. -/ +lemma L_anticomm_bare : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ LeptonDoublet) (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), + h.L i s φ * h.bare j s' φ' = -(h.bare j s' φ' * h.L i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_leptonDoubletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjLeptonSingletField j s' φ')) + +/-- The conjugate lepton doublet symbols anticommute among themselves. -/ +lemma barL_anticomm_barL : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), + h.barL i s φ * h.barL j s' φ' = -(h.barL j s' φ' * h.barL i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_conjLeptonDoubletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjLeptonDoubletField j s' φ')) + +/-- The conjugate lepton doublet symbols anticommute with the lepton singlet symbols. -/ +lemma barL_anticomm_e : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule LeptonDoublet)) (φ' : Module.Dual ℂ LeptonSinglet), + h.barL i s φ * h.e j s' φ' = -(h.e j s' φ' * h.barL i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_conjLeptonDoubletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_leptonSingletField j s' φ')) + +/-- The conjugate lepton doublet symbols anticommute with the conjugate lepton singlet symbols. -/ +lemma 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 φ) + h.barL i s φ * h.bare j s' φ' = -(h.bare j s' φ' * h.barL i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_conjLeptonDoubletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjLeptonSingletField j s' φ')) + +/-- The lepton singlet symbols anticommute among themselves. -/ +lemma e_anticomm_e : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ φ' : Module.Dual ℂ LeptonSinglet), + h.e i s φ * h.e j s' φ' = -(h.e j s' φ' * h.e i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_leptonSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_leptonSingletField j s' φ')) + +/-- The lepton singlet symbols anticommute with the conjugate lepton singlet symbols. -/ +lemma e_anticomm_bare : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ LeptonSinglet) (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), + h.e i s φ * h.bare j s' φ' = -(h.bare j s' φ' * h.e i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_leptonSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjLeptonSingletField j s' φ')) + +/-- The conjugate lepton singlet symbols anticommute among themselves. -/ +lemma bare_anticomm_bare : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), + h.bare i s φ * h.bare j s' φ' = -(h.bare j s' φ' * h.bare i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_conjLeptonSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjLeptonSingletField j s' φ')) + +end IsStandardModel + /-! -## The Lorentz mixing of derivative slots +## G. 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 @@ -729,7 +1489,7 @@ end LorentzMixGroup /-! -## The Leibniz convolution and the mixing operator +## H. 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 @@ -853,7 +1613,7 @@ end DerivConv /-! -## The gauge action commutes with the Lorentz action on the value spaces +## I. 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 @@ -984,7 +1744,7 @@ end GaugeLorentzComm /-! -## The Lorentz law of the covariant matter towers +## J. 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 @@ -1384,7 +2144,7 @@ end IsGaugeField /-! -## The Lorentz law of the covariant field-strength tower +## K. 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 @@ -1762,7 +2522,7 @@ lemma repLorentz_iteratedCovDerivAdjoint_fieldStrength /-! -## The antisymmetry of the field strength +## L. 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 @@ -1840,138 +2600,118 @@ 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) + (h : IsStandardModel B repJet repLorentz massWeightPoly) /-! -## A. The field algebra +## M. 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 := +def fieldAlgebra (h : IsStandardModel B repJet repLorentz massWeightPoly): 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)) ∪ + ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.A s μ)) ∪ + (⋃ (s : Multiset (Fin 1 ⊕ Fin 3)), Set.range (h.H s) ∪ Set.range (h.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))) + Set.range (h.d i s) ∪ Set.range (h.bard i s) ∪ + Set.range (h.u i s) ∪ Set.range (h.baru i s) ∪ + Set.range (h.Q i s) ∪ Set.range (h.barQ i s) ∪ + Set.range (h.L i s) ∪ Set.range (h.barL i s) ∪ + Set.range (h.e i s) ∪ Set.range (h.bare i s))) /-! -## B. Covariant derivatives +## N. 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)) : +/-- The iterated covariant derivative of the down-type quarks. -/ +noncomputable def covDerivD (h : IsStandardModel B repJet repLorentz massWeightPoly) + (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 + IsGaugeField.covDerivIter h.A DownSinglet.gaugeAlgebraAction (h.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)) : +/-- The iterated covariant derivative of the conjugate down-type quarks. -/ +noncomputable def covDerivBarD (h : IsStandardModel B repJet repLorentz massWeightPoly) + (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 + IsGaugeField.covDerivIter h.A (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) + (h.bard i) n l 0 /-- 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)) : +noncomputable def covDerivH (h : IsStandardModel B repJet repLorentz massWeightPoly) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) : Module.Dual ℂ HiggsVec →ₗ[ℂ] B := - IsGaugeField.covDerivIter A HiggsVec.gaugeAlgebraAction H n l 0 + IsGaugeField.covDerivIter h.A HiggsVec.gaugeAlgebraAction h.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)) : +noncomputable def covDerivBarH (h : IsStandardModel B repJet repLorentz massWeightPoly) {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.covDerivIter h.A (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) + h.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)) : +noncomputable def covDerivU (h : IsStandardModel B repJet repLorentz massWeightPoly) + (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 + IsGaugeField.covDerivIter h.A UpSinglet.gaugeAlgebraAction (h.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)) : +noncomputable def covDerivBarU (h : IsStandardModel B repJet repLorentz massWeightPoly) + (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 + IsGaugeField.covDerivIter h.A (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) + (h.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)) : +noncomputable def covDerivQ (h : IsStandardModel B repJet repLorentz massWeightPoly) + (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 + IsGaugeField.covDerivIter h.A QuarkDoublet.gaugeAlgebraAction (h.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)) : +noncomputable def covDerivBarQ (h : IsStandardModel B repJet repLorentz massWeightPoly) + (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 + IsGaugeField.covDerivIter h.A (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) + (h.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)) : +noncomputable def covDerivL (h : IsStandardModel B repJet repLorentz massWeightPoly) + (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 + IsGaugeField.covDerivIter h.A LeptonDoublet.gaugeAlgebraAction (h.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)) : +noncomputable def covDerivBarL (h : IsStandardModel B repJet repLorentz massWeightPoly) + (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 + IsGaugeField.covDerivIter h.A (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) + (h.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)) : +noncomputable def covDerivE (h : IsStandardModel B repJet repLorentz massWeightPoly) + (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 + IsGaugeField.covDerivIter h.A LeptonSinglet.gaugeAlgebraAction (h.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)) : +noncomputable def covDerivBarE (h : IsStandardModel B repJet repLorentz massWeightPoly) + (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 - --/ + IsGaugeField.covDerivIter h.A (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) + (h.bare i) n l 0 /-! -## The algebra written in terms of covariant derivatives +## O. The algebra written in terms of covariant derivatives -/ @@ -1983,7 +2723,7 @@ noncomputable def covDerivBarE (h : IsStandardModel B repJet repLorentz massWeig 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)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.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)), @@ -1996,163 +2736,182 @@ lemma fieldAlgebra_eq_covDeriv : have hATH : Algebra.adjoin ℂ ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (HiggsVec)), - b = H s φ}) = + b = h.H s φ}) = Algebra.adjoin ℂ ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.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 φ}) := - IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter (HiggsVec.gaugeAlgebraAction) H + b = IsGaugeField.covDerivIter h.A (HiggsVec.gaugeAlgebraAction) h.H n l 0 φ}) := + IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter (HiggsVec.gaugeAlgebraAction) h.H have hATbarH : Algebra.adjoin ℂ ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule HiggsVec)), - b = barH s φ}) = + b = h.barH s φ}) = Algebra.adjoin ℂ ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.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 + b = IsGaugeField.covDerivIter h.A + (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.barH n l 0 φ}) := + IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter + (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.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 μ ψ} ∪ + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (DownSinglet)), - b = d i s φ}) = + b = h.d i s φ}) = Algebra.adjoin ℂ ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.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) + b = IsGaugeField.covDerivIter h.A (DownSinglet.gaugeAlgebraAction) (h.d i) n l 0 φ}) := + fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter (DownSinglet.gaugeAlgebraAction) + (h.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 μ ψ} ∪ + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule DownSinglet)), - b = bard i s φ}) = + b = h.bard i s φ}) = Algebra.adjoin ℂ ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.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) + b = IsGaugeField.covDerivIter h.A + (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (h.bard i) n l 0 φ}) := + fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter + (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (h.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 μ ψ} ∪ + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (UpSinglet)), - b = u i s φ}) = + b = h.u i s φ}) = Algebra.adjoin ℂ ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.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) + b = IsGaugeField.covDerivIter h.A (UpSinglet.gaugeAlgebraAction) (h.u i) n l 0 φ}) := + fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter (UpSinglet.gaugeAlgebraAction) + (h.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 μ ψ} ∪ + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule UpSinglet)), - b = baru i s φ}) = + b = h.baru i s φ}) = Algebra.adjoin ℂ ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.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) + b = IsGaugeField.covDerivIter h.A + (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (h.baru i) n l 0 φ}) := + fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter + (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (h.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 μ ψ} ∪ + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (QuarkDoublet)), - b = Q i s φ}) = + b = h.Q i s φ}) = Algebra.adjoin ℂ ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.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) + b = IsGaugeField.covDerivIter h.A (QuarkDoublet.gaugeAlgebraAction) (h.Q i) n l 0 φ}) := + fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter (QuarkDoublet.gaugeAlgebraAction) + (h.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 μ ψ} ∪ + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule QuarkDoublet)), - b = barQ i s φ}) = + b = h.barQ i s φ}) = Algebra.adjoin ℂ ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.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) + b = IsGaugeField.covDerivIter h.A + (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (h.barQ i) n l 0 φ}) := + fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter + (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (h.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 μ ψ} ∪ + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (LeptonDoublet)), - b = L i s φ}) = + b = h.L i s φ}) = Algebra.adjoin ℂ ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.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) + b = IsGaugeField.covDerivIter h.A (LeptonDoublet.gaugeAlgebraAction) + (h.L i) n l 0 φ}) := + fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter (LeptonDoublet.gaugeAlgebraAction) + (h.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 μ ψ} ∪ + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule LeptonDoublet)), - b = barL i s φ}) = + b = h.barL i s φ}) = Algebra.adjoin ℂ ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.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) + b = IsGaugeField.covDerivIter h.A + (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (h.barL i) n l 0 φ}) := + fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter + (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (h.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 μ ψ} ∪ + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (LeptonSinglet)), - b = e i s φ}) = + b = h.e i s φ}) = Algebra.adjoin ℂ ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.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) + b = IsGaugeField.covDerivIter h.A (LeptonSinglet.gaugeAlgebraAction) + (h.e i) n l 0 φ}) := + fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter (LeptonSinglet.gaugeAlgebraAction) + (h.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 μ ψ} ∪ + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule LeptonSinglet)), - b = bare i s φ}) = + b = h.bare i s φ}) = Algebra.adjoin ℂ ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.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) + b = IsGaugeField.covDerivIter h.A + (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (h.bare i) n l 0 φ}) := + fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter + (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (h.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 μ)) ∪ + h.H s φ ∈ Algebra.adjoin ℂ + ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.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)), @@ -2162,25 +2921,25 @@ lemma fieldAlgebra_eq_covDeriv : 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 ℂ + have h1 : h.H s φ ∈ Algebra.adjoin ℂ ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.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 φ}) := + b = IsGaugeField.covDerivIter h.A (HiggsVec.gaugeAlgebraAction) h.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 φ' + have hmem : IsGaugeField.covDerivIter h.A (HiggsVec.gaugeAlgebraAction) h.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 μ)) ∪ + h.barH s φ ∈ Algebra.adjoin ℂ + ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.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)), @@ -2190,26 +2949,28 @@ lemma fieldAlgebra_eq_covDeriv : 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 ℂ + have h1 : h.barH s φ ∈ Algebra.adjoin ℂ ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.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 φ}) := + b = IsGaugeField.covDerivIter h.A + (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.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 φ' + have hmem : IsGaugeField.covDerivIter h.A + (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.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 μ)) ∪ + h.d i s φ ∈ Algebra.adjoin ℂ + ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.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)), @@ -2219,12 +2980,12 @@ lemma fieldAlgebra_eq_covDeriv : 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 ℂ + have h1 : h.d i s φ ∈ Algebra.adjoin ℂ ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.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 φ}) := + b = IsGaugeField.covDerivIter h.A (DownSinglet.gaugeAlgebraAction) (h.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⟩) @@ -2232,14 +2993,14 @@ lemma fieldAlgebra_eq_covDeriv : (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 φ' + have hmem : IsGaugeField.covDerivIter h.A (DownSinglet.gaugeAlgebraAction) (h.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 μ)) ∪ + h.bard i s φ ∈ Algebra.adjoin ℂ + ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.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)), @@ -2249,12 +3010,13 @@ lemma fieldAlgebra_eq_covDeriv : 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 ℂ + have h1 : h.bard i s φ ∈ Algebra.adjoin ℂ ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.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 φ}) := + b = IsGaugeField.covDerivIter h.A + (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (h.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⟩) @@ -2262,14 +3024,15 @@ lemma fieldAlgebra_eq_covDeriv : (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 φ' + have hmem : IsGaugeField.covDerivIter h.A + (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (h.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 μ)) ∪ + h.u i s φ ∈ Algebra.adjoin ℂ + ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.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)), @@ -2279,12 +3042,12 @@ lemma fieldAlgebra_eq_covDeriv : 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 ℂ + have h1 : h.u i s φ ∈ Algebra.adjoin ℂ ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.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 φ}) := + b = IsGaugeField.covDerivIter h.A (UpSinglet.gaugeAlgebraAction) (h.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⟩) @@ -2292,14 +3055,14 @@ lemma fieldAlgebra_eq_covDeriv : (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 φ' + have hmem : IsGaugeField.covDerivIter h.A (UpSinglet.gaugeAlgebraAction) (h.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 μ)) ∪ + h.baru i s φ ∈ Algebra.adjoin ℂ + ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.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)), @@ -2309,12 +3072,13 @@ lemma fieldAlgebra_eq_covDeriv : 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 ℂ + have h1 : h.baru i s φ ∈ Algebra.adjoin ℂ ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.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 φ}) := + b = IsGaugeField.covDerivIter h.A + (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (h.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⟩) @@ -2322,14 +3086,15 @@ lemma fieldAlgebra_eq_covDeriv : (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 φ' + have hmem : IsGaugeField.covDerivIter h.A + (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (h.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 μ)) ∪ + h.Q i s φ ∈ Algebra.adjoin ℂ + ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.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)), @@ -2339,12 +3104,12 @@ lemma fieldAlgebra_eq_covDeriv : 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 ℂ + have h1 : h.Q i s φ ∈ Algebra.adjoin ℂ ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.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 φ}) := + b = IsGaugeField.covDerivIter h.A (QuarkDoublet.gaugeAlgebraAction) (h.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⟩) @@ -2352,14 +3117,14 @@ lemma fieldAlgebra_eq_covDeriv : (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 φ' + have hmem : IsGaugeField.covDerivIter h.A (QuarkDoublet.gaugeAlgebraAction) (h.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 μ)) ∪ + h.barQ i s φ ∈ Algebra.adjoin ℂ + ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.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)), @@ -2369,12 +3134,13 @@ lemma fieldAlgebra_eq_covDeriv : 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 ℂ + have h1 : h.barQ i s φ ∈ Algebra.adjoin ℂ ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.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 φ}) := + b = IsGaugeField.covDerivIter h.A + (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (h.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⟩) @@ -2382,14 +3148,15 @@ lemma fieldAlgebra_eq_covDeriv : (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 φ' + have hmem : IsGaugeField.covDerivIter h.A + (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (h.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 μ)) ∪ + h.L i s φ ∈ Algebra.adjoin ℂ + ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.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)), @@ -2399,12 +3166,13 @@ lemma fieldAlgebra_eq_covDeriv : 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 ℂ + have h1 : h.L i s φ ∈ Algebra.adjoin ℂ ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.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 φ}) := + b = IsGaugeField.covDerivIter h.A (LeptonDoublet.gaugeAlgebraAction) + (h.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⟩) @@ -2412,14 +3180,14 @@ lemma fieldAlgebra_eq_covDeriv : (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 φ' + have hmem : IsGaugeField.covDerivIter h.A (LeptonDoublet.gaugeAlgebraAction) (h.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 μ)) ∪ + h.barL i s φ ∈ Algebra.adjoin ℂ + ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.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)), @@ -2429,12 +3197,13 @@ lemma fieldAlgebra_eq_covDeriv : 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 ℂ + have h1 : h.barL i s φ ∈ Algebra.adjoin ℂ ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.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 φ}) := + b = IsGaugeField.covDerivIter h.A + (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (h.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⟩) @@ -2442,14 +3211,15 @@ lemma fieldAlgebra_eq_covDeriv : (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 φ' + have hmem : IsGaugeField.covDerivIter h.A + (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (h.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 μ)) ∪ + h.e i s φ ∈ Algebra.adjoin ℂ + ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.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)), @@ -2459,12 +3229,13 @@ lemma fieldAlgebra_eq_covDeriv : 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 ℂ + have h1 : h.e i s φ ∈ Algebra.adjoin ℂ ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.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 φ}) := + b = IsGaugeField.covDerivIter h.A (LeptonSinglet.gaugeAlgebraAction) + (h.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⟩) @@ -2472,14 +3243,14 @@ lemma fieldAlgebra_eq_covDeriv : (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 φ' + have hmem : IsGaugeField.covDerivIter h.A (LeptonSinglet.gaugeAlgebraAction) (h.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 μ)) ∪ + h.bare i s φ ∈ Algebra.adjoin ℂ + ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.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)), @@ -2489,12 +3260,13 @@ lemma fieldAlgebra_eq_covDeriv : 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 ℂ + have h1 : h.bare i s φ ∈ Algebra.adjoin ℂ ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = A s μ ψ} ∪ + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.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 φ}) := + b = IsGaugeField.covDerivIter h.A + (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (h.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⟩) @@ -2502,7 +3274,8 @@ lemma fieldAlgebra_eq_covDeriv : (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 φ' + have hmem : IsGaugeField.covDerivIter h.A + (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (h.bare i) n l 0 φ' ∈ Set.range (h.covDerivBarE i l) := ⟨φ', rfl⟩ simp only [Set.mem_union] tauto @@ -2534,12 +3307,12 @@ lemma fieldAlgebra_eq_covDeriv : · 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 φ + · have h1 : IsGaugeField.covDerivIter h.A (HiggsVec.gaugeAlgebraAction) h.H 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 = h.A s μ ψ} ∪ {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (HiggsVec)), b = H s φ}) := + (φ : Module.Dual ℂ (HiggsVec)), b = h.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⟩) @@ -2547,12 +3320,13 @@ lemma fieldAlgebra_eq_covDeriv : (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 φ + · have h1 : IsGaugeField.covDerivIter h.A + (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.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 = h.A s μ ψ} ∪ {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule HiggsVec)), b = barH s φ}) := + (φ : Module.Dual ℂ (ConjModule HiggsVec)), b = h.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⟩) @@ -2564,160 +3338,165 @@ lemma fieldAlgebra_eq_covDeriv : 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 φ + · have h1 : IsGaugeField.covDerivIter h.A (DownSinglet.gaugeAlgebraAction) (h.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 μ ψ} ∪ + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (DownSinglet)), b = d i s φ}) := + (φ : Module.Dual ℂ (DownSinglet)), b = h.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 (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⟩ + have hmem : h.d i s' φ' ∈ Set.range (h.d i s') := ⟨φ', rfl⟩ simp only [Set.mem_union] tauto - · have h1 : IsGaugeField.covDerivIter A (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (bard i) n l 0 φ + · have h1 : IsGaugeField.covDerivIter h.A + (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (h.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 = h.A s μ ψ} ∪ {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule DownSinglet)), b = bard i s φ}) := + (φ : Module.Dual ℂ (ConjModule DownSinglet)), b = h.bard i s φ}) := (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 (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⟩ + have hmem : h.bard i s' φ' ∈ Set.range (h.bard i s') := ⟨φ', rfl⟩ simp only [Set.mem_union] tauto - · have h1 : IsGaugeField.covDerivIter A (UpSinglet.gaugeAlgebraAction) (u i) n l 0 φ + · have h1 : IsGaugeField.covDerivIter h.A (UpSinglet.gaugeAlgebraAction) (h.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 μ ψ} ∪ + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (UpSinglet)), b = u i s φ}) := + (φ : Module.Dual ℂ (UpSinglet)), b = h.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⟩ + have hmem : h.u i s' φ' ∈ Set.range (h.u i s') := ⟨φ', rfl⟩ simp only [Set.mem_union] tauto - · have h1 : IsGaugeField.covDerivIter A (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (baru i) n l 0 φ + · have h1 : IsGaugeField.covDerivIter h.A + (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (h.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 μ ψ} ∪ + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule UpSinglet)), b = baru i s φ}) := + (φ : Module.Dual ℂ (ConjModule UpSinglet)), b = h.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⟩ + have hmem : h.baru i s' φ' ∈ Set.range (h.baru i s') := ⟨φ', rfl⟩ simp only [Set.mem_union] tauto - · have h1 : IsGaugeField.covDerivIter A (QuarkDoublet.gaugeAlgebraAction) (Q i) n l 0 φ + · have h1 : IsGaugeField.covDerivIter h.A (QuarkDoublet.gaugeAlgebraAction) (h.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 μ ψ} ∪ + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (QuarkDoublet)), b = Q i s φ}) := + (φ : Module.Dual ℂ (QuarkDoublet)), b = h.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⟩ + have hmem : h.Q i s' φ' ∈ Set.range (h.Q i s') := ⟨φ', rfl⟩ simp only [Set.mem_union] tauto - · have h1 : IsGaugeField.covDerivIter A (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (barQ i) n l 0 φ + · have h1 : IsGaugeField.covDerivIter h.A + (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (h.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 μ ψ} ∪ + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule QuarkDoublet)), b = barQ i s φ}) := + (φ : Module.Dual ℂ (ConjModule QuarkDoublet)), b = h.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⟩ + have hmem : h.barQ i s' φ' ∈ Set.range (h.barQ i s') := ⟨φ', rfl⟩ simp only [Set.mem_union] tauto - · have h1 : IsGaugeField.covDerivIter A (LeptonDoublet.gaugeAlgebraAction) (L i) n l 0 φ + · have h1 : IsGaugeField.covDerivIter h.A (LeptonDoublet.gaugeAlgebraAction) (h.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 μ ψ} ∪ + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (LeptonDoublet)), b = L i s φ}) := + (φ : Module.Dual ℂ (LeptonDoublet)), b = h.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⟩ + have hmem : h.L i s' φ' ∈ Set.range (h.L i s') := ⟨φ', rfl⟩ simp only [Set.mem_union] tauto - · have h1 : IsGaugeField.covDerivIter A (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (barL i) n l 0 φ + · have h1 : IsGaugeField.covDerivIter h.A + (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (h.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 μ ψ} ∪ + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule LeptonDoublet)), b = barL i s φ}) := + (φ : Module.Dual ℂ (ConjModule LeptonDoublet)), b = h.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⟩ + have hmem : h.barL i s' φ' ∈ Set.range (h.barL i s') := ⟨φ', rfl⟩ simp only [Set.mem_union] tauto - · have h1 : IsGaugeField.covDerivIter A (LeptonSinglet.gaugeAlgebraAction) (e i) n l 0 φ + · have h1 : IsGaugeField.covDerivIter h.A (LeptonSinglet.gaugeAlgebraAction) (h.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 μ ψ} ∪ + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (LeptonSinglet)), b = e i s φ}) := + (φ : Module.Dual ℂ (LeptonSinglet)), b = h.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⟩ + have hmem : h.e i s' φ' ∈ Set.range (h.e i s') := ⟨φ', rfl⟩ simp only [Set.mem_union] tauto - · have h1 : IsGaugeField.covDerivIter A (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (bare i) n l 0 φ + · have h1 : IsGaugeField.covDerivIter h.A + (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (h.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 μ ψ} ∪ + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule LeptonSinglet)), b = bare i s φ}) := + (φ : Module.Dual ℂ (ConjModule LeptonSinglet)), b = h.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⟩ + have hmem : h.bare i s' φ' ∈ Set.range (h.bare i s') := ⟨φ', rfl⟩ simp only [Set.mem_union] tauto /-! -## C. Gauge covariance of the covariant derivatives +## P. Gauge covariance of the covariant derivatives -/ @@ -2727,7 +3506,7 @@ include h in 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) := + (IsGaugeField.covDerivIter h.A (HiggsVec.gaugeAlgebraAction) h.H n l) := TransformsIn.covDerivIter h.repJet_A h.repJet_H (HiggsVec.isInfinitesimalActionOf) n l include h in @@ -2736,7 +3515,8 @@ include h in 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) := + (IsGaugeField.covDerivIter h.A + (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.barH n l) := TransformsIn.covDerivIter h.repJet_A h.repJet_barH (HiggsVec.isInfinitesimalActionOf.conj) n l include h in @@ -2745,7 +3525,7 @@ include h in 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) := + (IsGaugeField.covDerivIter h.A (DownSinglet.gaugeAlgebraAction) (h.d i) n l) := TransformsIn.covDerivIter h.repJet_A (h.repJet_d i) (DownSinglet.isInfinitesimalActionOf) n l include h in @@ -2754,7 +3534,8 @@ include h in 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) := + (IsGaugeField.covDerivIter h.A (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) + (h.bard i) n l) := TransformsIn.covDerivIter h.repJet_A (h.repJet_bard i) (DownSinglet.isInfinitesimalActionOf.conj) n l include h in @@ -2763,7 +3544,7 @@ include h in 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) := + (IsGaugeField.covDerivIter h.A (UpSinglet.gaugeAlgebraAction) (h.u i) n l) := TransformsIn.covDerivIter h.repJet_A (h.repJet_u i) (UpSinglet.isInfinitesimalActionOf) n l include h in @@ -2772,7 +3553,8 @@ include h in 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) := + (IsGaugeField.covDerivIter h.A (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) + (h.baru i) n l) := TransformsIn.covDerivIter h.repJet_A (h.repJet_baru i) (UpSinglet.isInfinitesimalActionOf.conj) n l include h in @@ -2781,7 +3563,7 @@ include h in 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) := + (IsGaugeField.covDerivIter h.A (QuarkDoublet.gaugeAlgebraAction) (h.Q i) n l) := TransformsIn.covDerivIter h.repJet_A (h.repJet_Q i) (QuarkDoublet.isInfinitesimalActionOf) n l include h in @@ -2790,7 +3572,8 @@ include h in 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) := + (IsGaugeField.covDerivIter h.A (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) + (h.barQ i) n l) := TransformsIn.covDerivIter h.repJet_A (h.repJet_barQ i) (QuarkDoublet.isInfinitesimalActionOf.conj) n l include h in @@ -2799,7 +3582,7 @@ include h in 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) := + (IsGaugeField.covDerivIter h.A (LeptonDoublet.gaugeAlgebraAction) (h.L i) n l) := TransformsIn.covDerivIter h.repJet_A (h.repJet_L i) (LeptonDoublet.isInfinitesimalActionOf) n l include h in @@ -2808,7 +3591,8 @@ include h in 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) := + (IsGaugeField.covDerivIter h.A (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) + (h.barL i) n l) := TransformsIn.covDerivIter h.repJet_A (h.repJet_barL i) (LeptonDoublet.isInfinitesimalActionOf.conj) n l include h in @@ -2817,7 +3601,7 @@ include h in 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) := + (IsGaugeField.covDerivIter h.A (LeptonSinglet.gaugeAlgebraAction) (h.e i) n l) := TransformsIn.covDerivIter h.repJet_A (h.repJet_e i) (LeptonSinglet.isInfinitesimalActionOf) n l include h in @@ -2826,22 +3610,22 @@ include h in 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) := + (IsGaugeField.covDerivIter h.A (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) + (h.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 +## Q. 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) +noncomputable def covDerivFieldStrength (h : IsStandardModel B repJet repLorentz massWeightPoly) (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B := - IsGaugeField.iteratedCovDerivAdjoint A l (IsGaugeField.fieldStrength A μ ν) 0 + IsGaugeField.iteratedCovDerivAdjoint h.A l (IsGaugeField.fieldStrength h.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 @@ -2851,8 +3635,8 @@ lemma covDerivFieldStrength_swap (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ (φ : Module.Dual ℝ GaugeAlgebra) : h.covDerivFieldStrength l ν μ φ = - h.covDerivFieldStrength l μ ν φ := by rw [covDerivFieldStrength, covDerivFieldStrength, - show IsGaugeField.fieldStrength A ν μ = - fun t => - IsGaugeField.fieldStrength A μ ν t from + show IsGaugeField.fieldStrength h.A ν μ = + fun t => - IsGaugeField.fieldStrength h.A μ ν t from funext fun t => IsGaugeField.fieldStrength_swap h.A_comm_A μ ν t, IsGaugeField.iteratedCovDerivAdjoint_neg_fam] @@ -2863,7 +3647,7 @@ include h in lemma transformsInAdjoint_covDerivFieldStrength (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : IsGaugeField.TransformsInAdjoint repJet - (IsGaugeField.iteratedCovDerivAdjoint A l (IsGaugeField.fieldStrength A μ ν)) := + (IsGaugeField.iteratedCovDerivAdjoint h.A l (IsGaugeField.fieldStrength h.A μ ν)) := IsGaugeField.transformsInAdjoint_iteratedCovDerivAdjoint h.repJet_A l μ ν include h in @@ -2892,7 +3676,7 @@ lemma repJet_covDerivFieldStrength_of_mem_truncationKer_zero /-! -## E. The matter covariant derivatives transform through the base point +## R. The matter covariant derivatives transform through the base point -/ @@ -3054,7 +3838,7 @@ lemma repJet_covDerivBarE (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3) /-! -## F. Pure gauge jets fix the matter covariant derivatives +## S. Pure gauge jets fix the matter covariant derivatives -/ @@ -3180,7 +3964,7 @@ lemma repJet_covDerivBarE_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} /-! -## G. The classification of gauge invariants +## T. The classification of gauge invariants -/ @@ -3216,7 +4000,7 @@ theorem invariant_mem_adjoin_covDeriv {x : B} 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 + (ψ : Module.Dual ℝ GaugeAlgebra), ∀ y ∈ S, Commute y (h.A p μ ψ) := by intro p μ ψ y hy rw [hSdef] at hy rcases hy with hy | hy @@ -3225,13 +4009,13 @@ theorem invariant_mem_adjoin_covDeriv {x : B} rcases hy with ⟨φ', rfl⟩ | ⟨φ', rfl⟩ · refine IsGaugeField.commute_of_mem_adjoin ?_ (IsGaugeField.covDerivIter_mem_adjoin_symbols - (HiggsVec.gaugeAlgebraAction) H n l 0 φ') + (HiggsVec.gaugeAlgebraAction) h.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 φ') + (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.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 @@ -3241,61 +4025,61 @@ theorem invariant_mem_adjoin_covDeriv {x : B} ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) · refine IsGaugeField.commute_of_mem_adjoin ?_ (IsGaugeField.covDerivIter_mem_adjoin_symbols - (DownSinglet.gaugeAlgebraAction) (d i) n l 0 φ') + (DownSinglet.gaugeAlgebraAction) (h.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 φ') + (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (h.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 φ') + (UpSinglet.gaugeAlgebraAction) (h.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 φ') + (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (h.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 φ') + (QuarkDoublet.gaugeAlgebraAction) (h.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 φ') + (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (h.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 φ') + (LeptonDoublet.gaugeAlgebraAction) (h.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 φ') + (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (h.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 φ') + (LeptonSinglet.gaugeAlgebraAction) (h.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 φ') + (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (h.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 @@ -3326,7 +4110,7 @@ theorem invariant_mem_adjoin_covDeriv {x : B} -- 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 + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.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) @@ -3350,7 +4134,7 @@ theorem invariant_mem_adjoin_covDeriv {x : B} /-! -## H. The Lorentz laws of the covariant matter towers +## U. 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 @@ -3367,7 +4151,7 @@ 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 + HiggsVec.gaugeAlgebraAction_comm_repLorentz h.H h.repLorentz_H include h in /-- The covariant tower of the conjugate Higgs transforms as a Lorentz scalar. -/ @@ -3377,7 +4161,7 @@ lemma repLorentz_covDerivBarH : (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 + HiggsVec.gaugeAlgebraAction_comm_repLorentz) h.barH h.repLorentz_barH include h in /-- The covariant tower of the down-type quarks transforms as a right-handed Weyl @@ -3386,7 +4170,7 @@ 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) + DownSinglet.gaugeAlgebraAction_comm_repLorentzGroup (h.d i) (h.repLorentz_d i) include h in /-- The covariant tower of the conjugate down-type quarks transforms in the conjugate @@ -3396,7 +4180,7 @@ lemma repLorentz_covDerivBarD (i : Fin 3) : (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) + DownSinglet.gaugeAlgebraAction_comm_repLorentzGroup) (h.bard i) (h.repLorentz_bard i) include h in /-- The covariant tower of the up-type quarks transforms as a right-handed Weyl spinor. -/ @@ -3404,7 +4188,7 @@ 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) + UpSinglet.gaugeAlgebraAction_comm_repLorentzGroup (h.u i) (h.repLorentz_u i) include h in /-- The covariant tower of the conjugate up-type quarks transforms in the conjugate Weyl @@ -3414,7 +4198,7 @@ lemma repLorentz_covDerivBarU (i : Fin 3) : (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) + UpSinglet.gaugeAlgebraAction_comm_repLorentzGroup) (h.baru i) (h.repLorentz_baru i) include h in /-- The covariant tower of the quark doublets transforms as a left-handed Weyl spinor. -/ @@ -3422,7 +4206,7 @@ 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) + QuarkDoublet.gaugeAlgebraAction_comm_repLorentzGroup (h.Q i) (h.repLorentz_Q i) include h in /-- The covariant tower of the conjugate quark doublets transforms in the conjugate Weyl @@ -3432,7 +4216,7 @@ lemma repLorentz_covDerivBarQ (i : Fin 3) : (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) + QuarkDoublet.gaugeAlgebraAction_comm_repLorentzGroup) (h.barQ i) (h.repLorentz_barQ i) include h in /-- The covariant tower of the lepton doublets transforms as a left-handed Weyl spinor. -/ @@ -3440,7 +4224,7 @@ 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) + LeptonDoublet.gaugeAlgebraAction_comm_repLorentzGroup (h.L i) (h.repLorentz_L i) include h in /-- The covariant tower of the conjugate lepton doublets transforms in the conjugate Weyl @@ -3450,7 +4234,7 @@ lemma repLorentz_covDerivBarL (i : Fin 3) : (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) + LeptonDoublet.gaugeAlgebraAction_comm_repLorentzGroup) (h.barL i) (h.repLorentz_barL i) include h in /-- The covariant tower of the lepton singlets transforms as a right-handed Weyl spinor. -/ @@ -3458,7 +4242,7 @@ 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) + LeptonSinglet.gaugeAlgebraAction_comm_repLorentzGroup (h.e i) (h.repLorentz_e i) include h in /-- The covariant tower of the conjugate lepton singlets transforms in the conjugate Weyl @@ -3468,7 +4252,7 @@ lemma repLorentz_covDerivBarE (i : Fin 3) : (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) + LeptonSinglet.gaugeAlgebraAction_comm_repLorentzGroup) (h.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 a67c62bab..17cf7b8b8 100644 --- a/Physlib/Particles/StandardModel/IsStandardModel/CovStandardModel.lean +++ b/Physlib/Particles/StandardModel/IsStandardModel/CovStandardModel.lean @@ -34,7 +34,7 @@ which grades the algebra by the weight eigenspaces of `massWeightPoly` and pushe 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. Their Lorentz transformation laws -are section H of [`Basic.lean`](Basic.lean): each follows from the Lorentz law +are section U 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. @@ -106,21 +106,7 @@ 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) + (h : IsStandardModel B repJet repLorentz massWeightPoly) /-! @@ -147,7 +133,7 @@ lemma repGlobal_apply (repJet : Representation ℂ JetGaugeGroupI B) (g : GaugeG ## B. The covariant generators and the covariant algebra -The covariant towers of section B and section D of `IsStandardModel.Basic` are indexed +The covariant towers of section N and section Q 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. @@ -156,23 +142,22 @@ 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)) +noncomputable def covF (h : IsStandardModel B repJet repLorentz massWeightPoly) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (μ ν : 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)) +lemma covF_swap (h : IsStandardModel B repJet repLorentz massWeightPoly) {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 - d bard u baru Q barQ L barL e bare) : Set B := +def covGenerators (h : IsStandardModel B repJet repLorentz massWeightPoly) : 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), @@ -186,8 +171,7 @@ def covGenerators (h : IsStandardModel B repJet repLorentz massWeightPoly H barH /-- 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 := +def covAlgebra (h : IsStandardModel B repJet repLorentz massWeightPoly) : Subalgebra ℂ B := Algebra.adjoin ℂ h.covGenerators /-! @@ -202,8 +186,7 @@ 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 := +def covGeneratorsList (h : IsStandardModel B repJet repLorentz massWeightPoly) : 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), @@ -233,7 +216,7 @@ lemma covGenerators_eq_covGeneratorsList : h.covGenerators = h.covGeneratorsList ## C. Pure gauge jets fix the covariant algebra -Section F of `IsStandardModel.Basic` shows that a gauge jet with trivial base-point +Section S 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. @@ -255,8 +238,8 @@ lemma repJet_algebraMap (U : JetGaugeGroupI) (c : ℂ) : 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. -/ +/-- Pure gauge jets fix the covariant generators: this is section S of + `IsStandardModel.Basic` together with the field-strength case of section Q. -/ 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 @@ -304,7 +287,7 @@ lemma repJet_eq_of_mem_covAlgebra_of_mem_truncationKer_zero 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 +In the other direction the classification of section T 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. @@ -351,7 +334,7 @@ theorem forall_repJet_and_repLorentz_eq_iff {x : B} (hx : x ∈ h.fieldAlgebra) ## E. The covariant generators are globally equivariant -Section E of `IsStandardModel.Basic` shows that a gauge jet acts on a covariant tower +Section R 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) @@ -556,11 +539,11 @@ the whole covariant algebra. This discharges the `F_comm_F` obligation of /-- 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)) +lemma covF_mem_adjoin_gaugeSymbols (h : IsStandardModel B repJet repLorentz massWeightPoly) + {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 ρ ψ} := + (ρ : Fin 1 ⊕ Fin 3) (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s ρ ψ} := IsGaugeField.iteratedCovDerivAdjoint_fieldStrength_mem_adjoin_symbols (List.ofFn l) μ ν φ @@ -570,7 +553,7 @@ include h in 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 + (hy : y ∈ h.covGenerators) : Commute y (h.A p ρ ψ) := by rw [covGenerators] at hy rcases hy with hy | hy · rcases hy with hy | hy @@ -584,13 +567,13 @@ lemma commute_gaugeSymbol_of_mem_covGenerators (p : Multiset (Fin 1 ⊕ Fin 3)) rcases hy with ⟨φ, rfl⟩ | ⟨φ, rfl⟩ · refine IsGaugeField.commute_of_mem_adjoin ?_ (IsGaugeField.covDerivIter_mem_adjoin_symbols - (HiggsVec.gaugeAlgebraAction) H n l 0 φ) + (HiggsVec.gaugeAlgebraAction) h.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 φ) + (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.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 @@ -600,61 +583,61 @@ lemma commute_gaugeSymbol_of_mem_covGenerators (p : Multiset (Fin 1 ⊕ Fin 3)) ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) · refine IsGaugeField.commute_of_mem_adjoin ?_ (IsGaugeField.covDerivIter_mem_adjoin_symbols - (DownSinglet.gaugeAlgebraAction) (d i) n l 0 φ) + (DownSinglet.gaugeAlgebraAction) (h.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 φ) + (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (h.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 φ) + (UpSinglet.gaugeAlgebraAction) (h.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 φ) + (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (h.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 φ) + (QuarkDoublet.gaugeAlgebraAction) (h.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 φ) + (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (h.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 φ) + (LeptonDoublet.gaugeAlgebraAction) (h.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 φ) + (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (h.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 φ) + (LeptonSinglet.gaugeAlgebraAction) (h.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 φ) + (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (h.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 @@ -784,12 +767,12 @@ lemma covDerivIter_mem_massWeightEigenspace {V : Type} [AddCommGroup V] [Module (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))) + h.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 φ ∈ + IsGaugeField.covDerivIter h.A act F n l s φ ∈ massWeightEigenspace massWeightPoly (c + 2 * n + 2 * Multiset.card s) := by induction n generalizing s φ with | zero => @@ -819,10 +802,10 @@ lemma covDerivIter_mem_massWeightEigenspace {V : Type} [AddCommGroup V] [Module 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))) + h.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 φ ∈ + IsGaugeField.fieldStrength h.A μ ν s φ ∈ massWeightEigenspace massWeightPoly (4 + 2 * Multiset.card s) := by rw [IsGaugeField.fieldStrength_apply] refine add_mem (sub_mem ?_ ?_) ?_ @@ -849,22 +832,22 @@ lemma fieldStrength_mem_massWeightEigenspace 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))) + h.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 φ ∈ + IsGaugeField.iteratedCovDerivAdjoint h.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 + rw [show IsGaugeField.iteratedCovDerivAdjoint h.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) ρ + rw [show IsGaugeField.iteratedCovDerivAdjoint h.A (ρ :: l) G + = IsGaugeField.covDerivAdjoint h.A (IsGaugeField.iteratedCovDerivAdjoint h.A l G) ρ from rfl, IsGaugeField.covDerivAdjoint_apply] refine add_mem ?_ ?_ · have hstep := ih (ρ ::ₘ s) φ @@ -891,13 +874,13 @@ lemma covDerivIter_zero_mem_massWeightEigenspace {V : Type} [AddCommGroup V] [Mo (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))) + h.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 φ ∈ + IsGaugeField.covDerivIter h.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 φ + have hmem := h.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 @@ -905,14 +888,14 @@ lemma covDerivIter_zero_mem_massWeightEigenspace {V : Type} [AddCommGroup V] [Mo 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))) + h.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 φ ∈ + IsGaugeField.iteratedCovDerivAdjoint h.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 φ + have hmem := h.iteratedCovDerivAdjoint_mem_massWeightEigenspace c hA G hG (List.ofFn l) 0 φ rwa [List.length_ofFn, Multiset.card_zero, mul_zero, add_zero] at hmem @@ -935,13 +918,13 @@ lemma massWeight_covF {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 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)) := + h.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 φ) + (h.iteratedCovDerivAdjoint_ofFn_zero_mem_massWeightEigenspace 4 hA + (IsGaugeField.fieldStrength h.A μ ν) + (fun t χ => h.fieldStrength_mem_massWeightEigenspace hA μ ν t χ) l φ) include h in /-- The mass weight of the Higgs tower is `2 * (1 + n)`. -/ @@ -950,7 +933,7 @@ lemma massWeight_covDerivH {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Mod 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 + (h.covDerivIter_zero_mem_massWeightEigenspace HiggsVec.gaugeAlgebraAction h.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] @@ -964,8 +947,8 @@ lemma massWeight_covDerivBarH {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) 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 + (h.covDerivIter_zero_mem_massWeightEigenspace + (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.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] @@ -978,7 +961,7 @@ lemma massWeight_covDerivD (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3 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 + (h.covDerivIter_zero_mem_massWeightEigenspace DownSinglet.gaugeAlgebraAction (h.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 φ) @@ -989,8 +972,8 @@ lemma massWeight_covDerivBarD (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fi 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 + (h.covDerivIter_zero_mem_massWeightEigenspace + (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (h.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 φ) @@ -1001,7 +984,7 @@ lemma massWeight_covDerivU (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3 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 + (h.covDerivIter_zero_mem_massWeightEigenspace UpSinglet.gaugeAlgebraAction (h.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 φ) @@ -1012,8 +995,8 @@ lemma massWeight_covDerivBarU (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fi 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 + (h.covDerivIter_zero_mem_massWeightEigenspace + (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (h.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 φ) @@ -1024,7 +1007,7 @@ lemma massWeight_covDerivQ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3 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 + (h.covDerivIter_zero_mem_massWeightEigenspace QuarkDoublet.gaugeAlgebraAction (h.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 φ) @@ -1035,8 +1018,8 @@ lemma massWeight_covDerivBarQ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fi 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 + (h.covDerivIter_zero_mem_massWeightEigenspace + (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (h.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 φ) @@ -1047,7 +1030,7 @@ lemma massWeight_covDerivL (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3 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 + (h.covDerivIter_zero_mem_massWeightEigenspace LeptonDoublet.gaugeAlgebraAction (h.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 φ) @@ -1058,8 +1041,8 @@ lemma massWeight_covDerivBarL (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fi 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 + (h.covDerivIter_zero_mem_massWeightEigenspace + (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (h.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 φ) @@ -1070,7 +1053,7 @@ lemma massWeight_covDerivE (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3 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 + (h.covDerivIter_zero_mem_massWeightEigenspace LeptonSinglet.gaugeAlgebraAction (h.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 φ) @@ -1081,8 +1064,8 @@ lemma massWeight_covDerivBarE (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fi 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 + (h.covDerivIter_zero_mem_massWeightEigenspace + (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (h.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 φ) @@ -1105,11 +1088,11 @@ 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) + (ψ : Module.Dual ℝ GaugeAlgebra), Commute (h.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 + Commute (IsGaugeField.covDerivIter h.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⟩) @@ -1125,25 +1108,25 @@ lemma commute_covDerivIter_covDerivIter {V W : Type} [AddCommGroup V] [Module (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' μ' ψ')) + (ψ ψ' : Module.Dual ℝ GaugeAlgebra), Commute (h.A p μ ψ) (h.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 χ)) + (χ : Module.Dual ℂ V), Commute (h.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 χ)) + (χ : Module.Dual ℂ W), Commute (h.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 μ' μ ψ' ψ) + Commute (IsGaugeField.covDerivIter h.A act₁ F₁ n l s φ) + (IsGaugeField.covDerivIter h.A act₂ F₂ m l' s' φ') := by + refine h.commute_covDerivIter act₁ F₁ (fun p μ ψ => ?_) (fun t χ => ?_) n l s φ + · exact (h.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 χ) + · exact (h.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, @@ -1182,16 +1165,16 @@ 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 μ ψ)) + (ψ : Module.Dual ℝ GaugeAlgebra), Commute x (h.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 + x * IsGaugeField.covDerivIter h.A act F n l s φ + = -(IsGaugeField.covDerivIter h.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 + IsGaugeField.covDerivIter h.A act F n l s φ ∈ anticommuteSubmodule x := by intro n induction n with | zero => exact fun l s φ => hxF s φ @@ -1216,27 +1199,27 @@ lemma anticommute_covDerivIter_covDerivIter {V W : Type} [AddCommGroup V] [Modul (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' μ' ψ')) + (ψ ψ' : Module.Dual ℝ GaugeAlgebra), Commute (h.A p μ ψ) (h.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 χ)) + (χ : Module.Dual ℂ V), Commute (h.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 χ)) + (χ : Module.Dual ℂ W), Commute (h.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 μ' μ ψ' ψ) + IsGaugeField.covDerivIter h.A act₁ F₁ n l s φ * + IsGaugeField.covDerivIter h.A act₂ F₂ m l' s' φ' = + -(IsGaugeField.covDerivIter h.A act₂ F₂ m l' s' φ' * + IsGaugeField.covDerivIter h.A act₁ F₁ n l s φ) := by + have step := h.anticommute_covDerivIter act₁ F₁ + (fun p μ ψ => (h.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 t χ => anticomm_symm (h.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 @@ -1261,14 +1244,14 @@ lemma commute_covF_covDerivIter {V : Type} [AddCommGroup V] [Module ℂ 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 χ)) + (χ : Module.Dual ℂ V), Commute (h.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 + Commute (h.covF l μ ν ψ) (IsGaugeField.covDerivIter h.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 μ' ρ ψ'' ψ') + exact (h.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 @@ -1290,7 +1273,7 @@ include h in 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 φ + h.commute_covF_covDerivIter HiggsVec.gaugeAlgebraAction h.H h.A_comm_H l μ ν ψ m l' 0 φ include h in /-- The field-strength tower commutes with the conjugate Higgs tower. -/ @@ -1298,7 +1281,7 @@ lemma covF_comm_covBarH {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (μ ν : F (ψ : 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.commute_covF_covDerivIter (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.barH h.A_comm_barH l μ ν ψ m l' 0 φ include h in @@ -1307,7 +1290,7 @@ lemma covF_comm_covD {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (μ ν : Fin (ψ : 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) + h.commute_covF_covDerivIter DownSinglet.gaugeAlgebraAction (h.d i) (fun p μ ψ t χ => h.A_comm_d p μ ψ i t χ) l μ ν ψ m l' 0 φ include h in @@ -1316,7 +1299,7 @@ lemma covF_comm_covBarD {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (μ ν : F (ψ : 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) + h.commute_covF_covDerivIter (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (h.bard i) (fun p μ ψ t χ => h.A_comm_bard p μ ψ i t χ) l μ ν ψ m l' 0 φ include h in @@ -1325,7 +1308,7 @@ lemma covF_comm_covU {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (μ ν : Fin (ψ : 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) + h.commute_covF_covDerivIter UpSinglet.gaugeAlgebraAction (h.u i) (fun p μ ψ t χ => h.A_comm_u p μ ψ i t χ) l μ ν ψ m l' 0 φ include h in @@ -1334,7 +1317,7 @@ lemma covF_comm_covBarU {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (μ ν : F (ψ : 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) + h.commute_covF_covDerivIter (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (h.baru i) (fun p μ ψ t χ => h.A_comm_baru p μ ψ i t χ) l μ ν ψ m l' 0 φ include h in @@ -1343,7 +1326,7 @@ lemma covF_comm_covQ {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (μ ν : Fin (ψ : 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) + h.commute_covF_covDerivIter QuarkDoublet.gaugeAlgebraAction (h.Q i) (fun p μ ψ t χ => h.A_comm_Q p μ ψ i t χ) l μ ν ψ m l' 0 φ include h in @@ -1352,7 +1335,7 @@ lemma covF_comm_covBarQ {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (μ ν : F (ψ : 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) + h.commute_covF_covDerivIter (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (h.barQ i) (fun p μ ψ t χ => h.A_comm_barQ p μ ψ i t χ) l μ ν ψ m l' 0 φ include h in @@ -1361,7 +1344,7 @@ lemma covF_comm_covL {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (μ ν : Fin (ψ : 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) + h.commute_covF_covDerivIter LeptonDoublet.gaugeAlgebraAction (h.L i) (fun p μ ψ t χ => h.A_comm_L p μ ψ i t χ) l μ ν ψ m l' 0 φ include h in @@ -1370,7 +1353,7 @@ lemma covF_comm_covBarL {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (μ ν : F (ψ : 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) + h.commute_covF_covDerivIter (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (h.barL i) (fun p μ ψ t χ => h.A_comm_barL p μ ψ i t χ) l μ ν ψ m l' 0 φ include h in @@ -1379,7 +1362,7 @@ lemma covF_comm_covE {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (μ ν : Fin (ψ : 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) + h.commute_covF_covDerivIter LeptonSinglet.gaugeAlgebraAction (h.e i) (fun p μ ψ t χ => h.A_comm_e p μ ψ i t χ) l μ ν ψ m l' 0 φ include h in @@ -1388,7 +1371,7 @@ lemma covF_comm_covBarE {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (μ ν : F (ψ : 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) + h.commute_covF_covDerivIter (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (h.bare i) (fun p μ ψ t χ => h.A_comm_bare p μ ψ i t χ) l μ ν ψ m l' 0 φ include h in @@ -1396,7 +1379,8 @@ include h in 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.commute_covDerivIter_covDerivIter HiggsVec.gaugeAlgebraAction h.H + HiggsVec.gaugeAlgebraAction h.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 @@ -1404,8 +1388,8 @@ include h in 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 + h.commute_covDerivIter_covDerivIter HiggsVec.gaugeAlgebraAction h.H + (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.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 @@ -1413,8 +1397,8 @@ include h in 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.commute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.barH + (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.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 @@ -1422,8 +1406,8 @@ include h in 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 χ) + h.commute_covDerivIter_covDerivIter HiggsVec.gaugeAlgebraAction h.H DownSinglet.gaugeAlgebraAction + (h.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 @@ -1432,8 +1416,8 @@ 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 + h.commute_covDerivIter_covDerivIter HiggsVec.gaugeAlgebraAction h.H + (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (h.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 φ' @@ -1442,7 +1426,8 @@ include h in 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.commute_covDerivIter_covDerivIter HiggsVec.gaugeAlgebraAction h.H + UpSinglet.gaugeAlgebraAction (h.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 φ' @@ -1452,8 +1437,8 @@ 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 + h.commute_covDerivIter_covDerivIter HiggsVec.gaugeAlgebraAction h.H + (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (h.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 φ' @@ -1462,8 +1447,9 @@ include h in 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 χ) + h.commute_covDerivIter_covDerivIter HiggsVec.gaugeAlgebraAction h.H + QuarkDoublet.gaugeAlgebraAction + (h.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 @@ -1472,8 +1458,8 @@ 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 + h.commute_covDerivIter_covDerivIter HiggsVec.gaugeAlgebraAction h.H + (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (h.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 φ' @@ -1482,8 +1468,9 @@ include h in 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 χ) + h.commute_covDerivIter_covDerivIter HiggsVec.gaugeAlgebraAction h.H + LeptonDoublet.gaugeAlgebraAction + (h.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 @@ -1492,8 +1479,8 @@ 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 + h.commute_covDerivIter_covDerivIter HiggsVec.gaugeAlgebraAction h.H + (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (h.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 φ' @@ -1502,8 +1489,9 @@ include h in 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 χ) + h.commute_covDerivIter_covDerivIter HiggsVec.gaugeAlgebraAction h.H + LeptonSinglet.gaugeAlgebraAction + (h.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 @@ -1512,8 +1500,8 @@ 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 + h.commute_covDerivIter_covDerivIter HiggsVec.gaugeAlgebraAction h.H + (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (h.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 φ' @@ -1523,8 +1511,8 @@ 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 + h.commute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.barH + DownSinglet.gaugeAlgebraAction (h.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 φ' @@ -1534,8 +1522,8 @@ lemma covBarH_comm_covBarD {n m : ℕ} (i : Fin 3) (l : Fin n → (Fin 1 ⊕ Fin (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 + h.commute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.barH + (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (h.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 φ' @@ -1545,8 +1533,8 @@ 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 + h.commute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.barH + UpSinglet.gaugeAlgebraAction (h.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 φ' @@ -1556,8 +1544,8 @@ lemma covBarH_comm_covBarU {n m : ℕ} (i : Fin 3) (l : Fin n → (Fin 1 ⊕ Fin (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 + h.commute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.barH + (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (h.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 φ' @@ -1567,8 +1555,8 @@ 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 + h.commute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.barH + QuarkDoublet.gaugeAlgebraAction (h.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 φ' @@ -1578,8 +1566,8 @@ lemma covBarH_comm_covBarQ {n m : ℕ} (i : Fin 3) (l : Fin n → (Fin 1 ⊕ Fin (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 + h.commute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.barH + (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (h.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 φ' @@ -1589,8 +1577,8 @@ 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 + h.commute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.barH + LeptonDoublet.gaugeAlgebraAction (h.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 φ' @@ -1600,8 +1588,8 @@ lemma covBarH_comm_covBarL {n m : ℕ} (i : Fin 3) (l : Fin n → (Fin 1 ⊕ Fin (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 + h.commute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.barH + (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (h.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 φ' @@ -1611,8 +1599,8 @@ 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 + h.commute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.barH + LeptonSinglet.gaugeAlgebraAction (h.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 φ' @@ -1622,8 +1610,8 @@ lemma covBarH_comm_covBarE {n m : ℕ} (i : Fin 3) (l : Fin n → (Fin 1 ⊕ Fin (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 + h.commute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.barH + (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (h.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 φ' @@ -1634,8 +1622,8 @@ lemma covD_anticomm_covD (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin (φ' : 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 χ) + h.anticommute_covDerivIter_covDerivIter DownSinglet.gaugeAlgebraAction (h.d i) + DownSinglet.gaugeAlgebraAction (h.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 φ' @@ -1646,8 +1634,8 @@ lemma covD_anticomm_covBarD (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ (φ' : 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 + h.anticommute_covDerivIter_covDerivIter DownSinglet.gaugeAlgebraAction (h.d i) + (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (h.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 φ' @@ -1657,8 +1645,8 @@ lemma covD_anticomm_covU (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin (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 χ) + h.anticommute_covDerivIter_covDerivIter DownSinglet.gaugeAlgebraAction (h.d i) + UpSinglet.gaugeAlgebraAction (h.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 φ' @@ -1669,8 +1657,8 @@ lemma covD_anticomm_covBarU (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ (φ' : 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 + h.anticommute_covDerivIter_covDerivIter DownSinglet.gaugeAlgebraAction (h.d i) + (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (h.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 φ' @@ -1681,8 +1669,8 @@ lemma covD_anticomm_covQ (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin (φ' : 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 χ) + h.anticommute_covDerivIter_covDerivIter DownSinglet.gaugeAlgebraAction (h.d i) + QuarkDoublet.gaugeAlgebraAction (h.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 φ' @@ -1693,8 +1681,8 @@ lemma covD_anticomm_covBarQ (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ (φ' : 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 + h.anticommute_covDerivIter_covDerivIter DownSinglet.gaugeAlgebraAction (h.d i) + (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (h.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 φ' @@ -1705,8 +1693,8 @@ lemma covD_anticomm_covL (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin (φ' : 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 χ) + h.anticommute_covDerivIter_covDerivIter DownSinglet.gaugeAlgebraAction (h.d i) + LeptonDoublet.gaugeAlgebraAction (h.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 φ' @@ -1717,8 +1705,8 @@ lemma covD_anticomm_covBarL (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ (φ' : 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 + h.anticommute_covDerivIter_covDerivIter DownSinglet.gaugeAlgebraAction (h.d i) + (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (h.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 φ' @@ -1729,8 +1717,8 @@ lemma covD_anticomm_covE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin (φ' : 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 χ) + h.anticommute_covDerivIter_covDerivIter DownSinglet.gaugeAlgebraAction (h.d i) + LeptonSinglet.gaugeAlgebraAction (h.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 φ' @@ -1741,8 +1729,8 @@ lemma covD_anticomm_covBarE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ (φ' : 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 + h.anticommute_covDerivIter_covDerivIter DownSinglet.gaugeAlgebraAction (h.d i) + (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (h.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 φ' @@ -1753,8 +1741,8 @@ lemma covBarD_anticomm_covBarD (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 (φ' : 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 + h.anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) + (h.bard i) (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (h.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 φ' @@ -1765,8 +1753,8 @@ lemma covBarD_anticomm_covU (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ (φ' : 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 + h.anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) + (h.bard i) UpSinglet.gaugeAlgebraAction (h.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 φ' @@ -1777,8 +1765,8 @@ lemma covBarD_anticomm_covBarU (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 (φ' : 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 + h.anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) + (h.bard i) (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (h.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 φ' @@ -1789,8 +1777,8 @@ lemma covBarD_anticomm_covQ (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ (φ' : 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 + h.anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) + (h.bard i) QuarkDoublet.gaugeAlgebraAction (h.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 φ' @@ -1801,8 +1789,8 @@ lemma covBarD_anticomm_covBarQ (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 (φ' : 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 + h.anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) + (h.bard i) (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (h.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 φ' @@ -1813,8 +1801,8 @@ lemma covBarD_anticomm_covL (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ (φ' : 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 + h.anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) + (h.bard i) LeptonDoublet.gaugeAlgebraAction (h.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 φ' @@ -1825,8 +1813,8 @@ lemma covBarD_anticomm_covBarL (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 (φ' : 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 + h.anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) + (h.bard i) (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (h.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 φ' @@ -1837,8 +1825,8 @@ lemma covBarD_anticomm_covE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ (φ' : 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 + h.anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) + (h.bard i) LeptonSinglet.gaugeAlgebraAction (h.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 φ' @@ -1849,8 +1837,8 @@ lemma covBarD_anticomm_covBarE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 (φ' : 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 + h.anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) + (h.bard i) (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (h.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 φ' @@ -1860,8 +1848,8 @@ lemma covU_anticomm_covU (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin (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 χ) + h.anticommute_covDerivIter_covDerivIter UpSinglet.gaugeAlgebraAction (h.u i) + UpSinglet.gaugeAlgebraAction (h.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 φ' @@ -1872,8 +1860,8 @@ lemma covU_anticomm_covBarU (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ (φ' : 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 + h.anticommute_covDerivIter_covDerivIter UpSinglet.gaugeAlgebraAction (h.u i) + (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (h.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 φ' @@ -1883,8 +1871,8 @@ lemma covU_anticomm_covQ (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin (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 χ) + h.anticommute_covDerivIter_covDerivIter UpSinglet.gaugeAlgebraAction (h.u i) + QuarkDoublet.gaugeAlgebraAction (h.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 φ' @@ -1895,8 +1883,8 @@ lemma covU_anticomm_covBarQ (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ (φ' : 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 + h.anticommute_covDerivIter_covDerivIter UpSinglet.gaugeAlgebraAction (h.u i) + (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (h.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 φ' @@ -1907,8 +1895,8 @@ lemma covU_anticomm_covL (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin (φ' : 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 χ) + h.anticommute_covDerivIter_covDerivIter UpSinglet.gaugeAlgebraAction (h.u i) + LeptonDoublet.gaugeAlgebraAction (h.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 φ' @@ -1919,8 +1907,8 @@ lemma covU_anticomm_covBarL (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ (φ' : 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 + h.anticommute_covDerivIter_covDerivIter UpSinglet.gaugeAlgebraAction (h.u i) + (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (h.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 φ' @@ -1931,8 +1919,8 @@ lemma covU_anticomm_covE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin (φ' : 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 χ) + h.anticommute_covDerivIter_covDerivIter UpSinglet.gaugeAlgebraAction (h.u i) + LeptonSinglet.gaugeAlgebraAction (h.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 φ' @@ -1943,8 +1931,8 @@ lemma covU_anticomm_covBarE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ (φ' : 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 + h.anticommute_covDerivIter_covDerivIter UpSinglet.gaugeAlgebraAction (h.u i) + (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (h.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 φ' @@ -1955,8 +1943,8 @@ lemma covBarU_anticomm_covBarU (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 (φ' : 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 + h.anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) + (h.baru i) (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (h.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 φ' @@ -1967,8 +1955,8 @@ lemma covBarU_anticomm_covQ (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ (φ' : 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 + h.anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) + (h.baru i) QuarkDoublet.gaugeAlgebraAction (h.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 φ' @@ -1979,8 +1967,8 @@ lemma covBarU_anticomm_covBarQ (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 (φ' : 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 + h.anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) + (h.baru i) (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (h.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 φ' @@ -1991,8 +1979,8 @@ lemma covBarU_anticomm_covL (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ (φ' : 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 + h.anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) + (h.baru i) LeptonDoublet.gaugeAlgebraAction (h.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 φ' @@ -2003,8 +1991,8 @@ lemma covBarU_anticomm_covBarL (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 (φ' : 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 + h.anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) + (h.baru i) (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (h.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 φ' @@ -2015,8 +2003,8 @@ lemma covBarU_anticomm_covE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ (φ' : 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 + h.anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) + (h.baru i) LeptonSinglet.gaugeAlgebraAction (h.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 φ' @@ -2027,8 +2015,8 @@ lemma covBarU_anticomm_covBarE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 (φ' : 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 + h.anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) + (h.baru i) (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (h.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 φ' @@ -2039,8 +2027,8 @@ lemma covQ_anticomm_covQ (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin (φ' : 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 χ) + h.anticommute_covDerivIter_covDerivIter QuarkDoublet.gaugeAlgebraAction (h.Q i) + QuarkDoublet.gaugeAlgebraAction (h.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 φ' @@ -2051,8 +2039,8 @@ lemma covQ_anticomm_covBarQ (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ (φ' : 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 + h.anticommute_covDerivIter_covDerivIter QuarkDoublet.gaugeAlgebraAction (h.Q i) + (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (h.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 φ' @@ -2063,8 +2051,8 @@ lemma covQ_anticomm_covL (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin (φ' : 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 χ) + h.anticommute_covDerivIter_covDerivIter QuarkDoublet.gaugeAlgebraAction (h.Q i) + LeptonDoublet.gaugeAlgebraAction (h.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 φ' @@ -2075,8 +2063,8 @@ lemma covQ_anticomm_covBarL (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ (φ' : 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 + h.anticommute_covDerivIter_covDerivIter QuarkDoublet.gaugeAlgebraAction (h.Q i) + (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (h.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 φ' @@ -2087,8 +2075,8 @@ lemma covQ_anticomm_covE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin (φ' : 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 χ) + h.anticommute_covDerivIter_covDerivIter QuarkDoublet.gaugeAlgebraAction (h.Q i) + LeptonSinglet.gaugeAlgebraAction (h.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 φ' @@ -2099,8 +2087,8 @@ lemma covQ_anticomm_covBarE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ (φ' : 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 + h.anticommute_covDerivIter_covDerivIter QuarkDoublet.gaugeAlgebraAction (h.Q i) + (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (h.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 φ' @@ -2111,8 +2099,8 @@ lemma covBarQ_anticomm_covBarQ (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 (φ' : 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 + h.anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) + (h.barQ i) (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (h.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 φ' @@ -2123,8 +2111,8 @@ lemma covBarQ_anticomm_covL (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ (φ' : 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 + h.anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) + (h.barQ i) LeptonDoublet.gaugeAlgebraAction (h.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 φ' @@ -2135,8 +2123,8 @@ lemma covBarQ_anticomm_covBarL (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 (φ' : 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 + h.anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) + (h.barQ i) (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (h.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 φ' @@ -2147,8 +2135,8 @@ lemma covBarQ_anticomm_covE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ (φ' : 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 + h.anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) + (h.barQ i) LeptonSinglet.gaugeAlgebraAction (h.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 φ' @@ -2159,8 +2147,8 @@ lemma covBarQ_anticomm_covBarE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 (φ' : 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 + h.anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) + (h.barQ i) (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (h.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 φ' @@ -2171,8 +2159,8 @@ lemma covL_anticomm_covL (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin (φ' : 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 χ) + h.anticommute_covDerivIter_covDerivIter LeptonDoublet.gaugeAlgebraAction (h.L i) + LeptonDoublet.gaugeAlgebraAction (h.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 φ' @@ -2183,8 +2171,8 @@ lemma covL_anticomm_covBarL (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ (φ' : 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 + h.anticommute_covDerivIter_covDerivIter LeptonDoublet.gaugeAlgebraAction (h.L i) + (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (h.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 φ' @@ -2195,8 +2183,8 @@ lemma covL_anticomm_covE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin (φ' : 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 χ) + h.anticommute_covDerivIter_covDerivIter LeptonDoublet.gaugeAlgebraAction (h.L i) + LeptonSinglet.gaugeAlgebraAction (h.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 φ' @@ -2207,8 +2195,8 @@ lemma covL_anticomm_covBarE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ (φ' : 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 + h.anticommute_covDerivIter_covDerivIter LeptonDoublet.gaugeAlgebraAction (h.L i) + (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (h.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 φ' @@ -2219,8 +2207,8 @@ lemma covBarL_anticomm_covBarL (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 (φ' : 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 + h.anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) + (h.barL i) (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (h.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 φ' @@ -2231,8 +2219,8 @@ lemma covBarL_anticomm_covE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ (φ' : 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 + h.anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) + (h.barL i) LeptonSinglet.gaugeAlgebraAction (h.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 φ' @@ -2243,8 +2231,8 @@ lemma covBarL_anticomm_covBarE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 (φ' : 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 + h.anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) + (h.barL i) (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (h.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 φ' @@ -2255,8 +2243,8 @@ lemma covE_anticomm_covE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin (φ' : 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 χ) + h.anticommute_covDerivIter_covDerivIter LeptonSinglet.gaugeAlgebraAction (h.e i) + LeptonSinglet.gaugeAlgebraAction (h.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 φ' @@ -2267,8 +2255,8 @@ lemma covE_anticomm_covBarE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ (φ' : 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 + h.anticommute_covDerivIter_covDerivIter LeptonSinglet.gaugeAlgebraAction (h.e i) + (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (h.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 φ' @@ -2279,8 +2267,8 @@ lemma covBarE_anticomm_covBarE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 (φ' : 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 + h.anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) + (h.bare i) (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (h.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 φ' @@ -2291,7 +2279,7 @@ lemma covBarE_anticomm_covBarE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 Everything above assembles into an `IsCovStandardModel` for the covariant towers, 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 +matter towers are section U 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. @@ -2315,7 +2303,7 @@ lemma repLorentz_covF (Λ : SL(2,ℂ)) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3 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 + `IsStandardModel`: the Lorentz laws of the matter towers are section U 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 diff --git a/Physlib/Particles/StandardModel/IsStandardModel/MassWeight/Filtration.lean b/Physlib/Particles/StandardModel/IsStandardModel/MassWeight/Filtration.lean index 482dbdc93..f19442662 100644 --- a/Physlib/Particles/StandardModel/IsStandardModel/MassWeight/Filtration.lean +++ b/Physlib/Particles/StandardModel/IsStandardModel/MassWeight/Filtration.lean @@ -71,21 +71,7 @@ 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) + (h : IsStandardModel B repJet repLorentz massWeightPoly) /-! @@ -98,8 +84,7 @@ variable {B : Type} [Ring B] [Algebra ℂ B] monomial `X ^ n`. This is the jet-form counterpart of `IsCovStandardModel.massWeightSubmodule`. -/ noncomputable def massWeightSubmodule - (h : IsStandardModel B repJet repLorentz massWeightPoly H barH A - d bard u baru Q barQ L barL e bare) (n : ℕ) : Submodule ℂ B := + (h : IsStandardModel B repJet repLorentz massWeightPoly) (n : ℕ) : Submodule ℂ B := h.fieldAlgebra.toSubmodule ⊓ LinearMap.ker (massWeightPoly.toLinearMap - (Polynomial.monomial n : B →ₗ[B] Polynomial B).restrictScalars ℂ) diff --git a/Physlib/Particles/StandardModel/JetAlgebra/IsStandardModel.lean b/Physlib/Particles/StandardModel/JetAlgebra/IsStandardModel.lean index a9f09b111..2a19c661f 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/IsStandardModel.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/IsStandardModel.lean @@ -5,41 +5,29 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.JetAlgebra.MassWeightPoly -public import Physlib.Particles.StandardModel.JetAlgebra.FieldAlgebra -public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.TransformsIn -public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.TransformsIn +public import Physlib.Particles.StandardModel.JetAlgebra.TransformsIn public import Physlib.Particles.StandardModel.IsStandardModel.MassWeight.Filtration /-! # The jet algebra of the Standard Model is a Standard Model ## i. Overview -Everything the abstract theory of `IsStandardModel` asks of an algebra — thirteen families -of derivative symbols, their gauge and Lorentz transformation laws, their mass weights and -their statistics — has been established for the concrete jet algebra -`StandardModel.JetAlgebra` one sector at a time. This file collects those facts into the -single statement `JetAlgebra.isStandardModel`, and then draws the two consequences that -make the statement worth having. - -The assembly is mechanical but for one point, which is the content of section A. The three -sector inclusions `includeFermion`, `includeHiggs`, `includeGauge` are equivariant for the -jet gauge action and for the Lorentz action, because both actions are tensor products of -the sector actions and each sector action fixes the unit. `includeGauge` was treated when -the gauge sector was shown to be a gauge field; the other two are proved here, and with -them every transformation law of a matter symbol is its sector's own law, pushed through an -algebra map. - -Once the instance exists, two things follow. The field algebra it generates is the whole -algebra — the fields of the Standard Model generate the algebra in which its Lagrangian -lives, since nothing else is available to write down — so the mass-weight submodules stop -being intersections with the field algebra and become the honest eigenspaces of -`massWeightPoly` on the whole of `JetAlgebra`, and are worth defining on `JetAlgebra` -directly. +The abstract theory of `IsStandardModel` asks an algebra for an equivariant algebra map out +of the jet algebra of the Standard Model. The jet algebra therefore carries one for free — +the identity — and `JetAlgebra.isStandardModel` records it. The four compatibility laws are +definitional; the two multiplicativity laws are the ones the jet gauge action and the +Lorentz action were shown to satisfy when they were built. + +That is the whole of section A. Once the instance exists, two things follow that make it +worth having. The field algebra it generates is the whole algebra — the fields of the +Standard Model generate the algebra in which its Lagrangian lives, since nothing else is +available to write down — so the mass-weight submodules stop being intersections with the +field algebra and become the honest eigenspaces of `massWeightPoly` on the whole of +`JetAlgebra`, and are worth defining on `JetAlgebra` directly. And then the classification of invariants of mass dimension at most four applies to *every* element of the algebra of that dimension, with no side condition left to check. That is -the result this whole chain of files exists for, and section F states it: for an arbitrary +the result this whole chain of files exists for, and section C states it: for an arbitrary `x : JetAlgebra` of mass weight at most eight, `x` is fixed by the jet gauge group and by the Lorentz group @@ -67,23 +55,12 @@ higher-dimension operators, follows as a generalization for a reader who wants o ## iii. Table of contents -- A. The sector inclusions are equivariant - - A.1. The sector inclusions on pure tensors - - A.2. The unit of the gauge sector - - A.3. Equivariance for the jet gauge action - - A.4. Equivariance for the Lorentz action -- B. The jet gauge transformation of the field symbols - - B.1. The Higgs families - - B.2. The fermion families -- C. The Lorentz transformation of the field symbols - - C.1. The Higgs families - - C.2. The fermion families -- D. The Standard Model instance -- E. The field algebra is everything - - E.1. The field algebra - - E.2. The collapse of the graded pieces - - E.3. The mass-weight filtration of the jet algebra -- F. The Standard Model Lagrangian +- A. The Standard Model instance +- B. The field algebra is everything + - B.1. The field algebra + - B.2. The collapse of the graded pieces + - B.3. The mass-weight filtration of the jet algebra +- C. The Standard Model Lagrangian -/ @@ -102,832 +79,35 @@ open TensorProduct Matrix MatrixGroups Lorentz /-! -## A. The sector inclusions are equivariant - -Both the jet gauge action and the Lorentz action on the jet algebra are tensor products of -the three sector actions. A sector inclusion puts the unit in the other two factors, so -equivariance is exactly the statement that the other two actions fix their units, which -they do — they are actions by algebra maps. - --/ - -/-! - -### A.1. The sector inclusions on pure tensors - --/ - -/-- The fermionic inclusion puts the unit in the Higgs and gauge factors. -/ -lemma includeFermion_apply (f : FermionJetAlgebra) : - includeFermion f = ((f ⊗ₜ[ℂ] (1 : HiggsJetAlgebra)) ⊗ₜ[ℂ] - (1 : ℂ ⊗[ℝ] GaugeJetAlgebra)) := rfl - -/-- The Higgs inclusion puts the unit in the fermionic and gauge factors. -/ -lemma includeHiggs_apply (h : HiggsJetAlgebra) : - includeHiggs h = (((1 : FermionJetAlgebra) ⊗ₜ[ℂ] h) ⊗ₜ[ℂ] - (1 : ℂ ⊗[ℝ] GaugeJetAlgebra)) := rfl - -/-! - -### A.2. The unit of the gauge sector - --/ - -/-- The jet gauge action on the complexified gauge sector fixes the unit. -/ -lemma complexRepJetGaugeGroupI_apply_one (U : JetGaugeGroupI) : - GaugeJetAlgebra.complexRepJetGaugeGroupI U (1 : ℂ ⊗[ℝ] GaugeJetAlgebra) = 1 := by - rw [Algebra.TensorProduct.one_def, GaugeJetAlgebra.complexRepJetGaugeGroupI_tmul, - GaugeJetAlgebra.repJetGaugeGroupI_apply_one] - -/-- The Lorentz action on the complexified gauge sector fixes the unit. -/ -lemma complexRepLorentzGroup_apply_one (Λ : SL(2,ℂ)) : - GaugeJetAlgebra.complexRepLorentzGroup Λ (1 : ℂ ⊗[ℝ] GaugeJetAlgebra) = 1 := by - rw [Algebra.TensorProduct.one_def, GaugeJetAlgebra.complexRepLorentzGroup_tmul, - GaugeJetAlgebra.repLorentzGroup_apply_one] - -/-! - -### A.3. Equivariance for the jet gauge action - --/ - -/-- The jet gauge action restricts to the fermionic sector's own action. -/ -lemma repJetGaugeGroupI_includeFermion (U : JetGaugeGroupI) (f : FermionJetAlgebra) : - repJetGaugeGroupI U (includeFermion f) - = includeFermion (FermionJetAlgebra.repJetGaugeGroupI U f) := by - rw [includeFermion_apply, repJetGaugeGroupI_tmul, - show (FermionJetAlgebra.repJetGaugeGroupI.tprod HiggsJetAlgebra.repJetGaugeGroupI) U - (f ⊗ₜ[ℂ] (1 : HiggsJetAlgebra)) - = (FermionJetAlgebra.repJetGaugeGroupI U f) ⊗ₜ[ℂ] - (HiggsJetAlgebra.repJetGaugeGroupI U (1 : HiggsJetAlgebra)) from rfl, - show HiggsJetAlgebra.repJetGaugeGroupI U (1 : HiggsJetAlgebra) = 1 from - BosonicAlgebra.repJetGaugeGroupI_apply_one _ _ U, - complexRepJetGaugeGroupI_apply_one, includeFermion_apply] - -/-- The jet gauge action restricts to the Higgs sector's own action. -/ -lemma repJetGaugeGroupI_includeHiggs (U : JetGaugeGroupI) (h : HiggsJetAlgebra) : - repJetGaugeGroupI U (includeHiggs h) - = includeHiggs (HiggsJetAlgebra.repJetGaugeGroupI U h) := by - rw [includeHiggs_apply, repJetGaugeGroupI_tmul, - show (FermionJetAlgebra.repJetGaugeGroupI.tprod HiggsJetAlgebra.repJetGaugeGroupI) U - ((1 : FermionJetAlgebra) ⊗ₜ[ℂ] h) - = (FermionJetAlgebra.repJetGaugeGroupI U (1 : FermionJetAlgebra)) ⊗ₜ[ℂ] - (HiggsJetAlgebra.repJetGaugeGroupI U h) from rfl, - show FermionJetAlgebra.repJetGaugeGroupI U (1 : FermionJetAlgebra) = 1 from - FermionicAlgebra.repJetGaugeGroupI_apply_one _ _ U, - complexRepJetGaugeGroupI_apply_one, includeHiggs_apply] - -/-! - -### A.4. Equivariance for the Lorentz action - --/ - -/-- The Lorentz action restricts to the fermionic sector's own action. -/ -lemma repLorentzGroup_includeFermion (Λ : SL(2,ℂ)) (f : FermionJetAlgebra) : - repLorentzGroup Λ (includeFermion f) - = includeFermion (FermionJetAlgebra.repLorentzGroup Λ f) := by - rw [includeFermion_apply, repLorentzGroup_tmul, - show (FermionJetAlgebra.repLorentzGroup.tprod HiggsJetAlgebra.repLorentzGroup) Λ - (f ⊗ₜ[ℂ] (1 : HiggsJetAlgebra)) - = (FermionJetAlgebra.repLorentzGroup Λ f) ⊗ₜ[ℂ] - (HiggsJetAlgebra.repLorentzGroup Λ (1 : HiggsJetAlgebra)) from rfl, - show HiggsJetAlgebra.repLorentzGroup Λ (1 : HiggsJetAlgebra) = 1 from - BosonicAlgebra.repLorentzGroup_apply_one _ Λ, - complexRepLorentzGroup_apply_one, includeFermion_apply] - -/-- The Lorentz action restricts to the Higgs sector's own action. -/ -lemma repLorentzGroup_includeHiggs (Λ : SL(2,ℂ)) (h : HiggsJetAlgebra) : - repLorentzGroup Λ (includeHiggs h) - = includeHiggs (HiggsJetAlgebra.repLorentzGroup Λ h) := by - rw [includeHiggs_apply, repLorentzGroup_tmul, - show (FermionJetAlgebra.repLorentzGroup.tprod HiggsJetAlgebra.repLorentzGroup) Λ - ((1 : FermionJetAlgebra) ⊗ₜ[ℂ] h) - = (FermionJetAlgebra.repLorentzGroup Λ (1 : FermionJetAlgebra)) ⊗ₜ[ℂ] - (HiggsJetAlgebra.repLorentzGroup Λ h) from rfl, - show FermionJetAlgebra.repLorentzGroup Λ (1 : FermionJetAlgebra) = 1 from - FermionicAlgebra.repLorentzGroup_apply_one _ Λ, - complexRepLorentzGroup_apply_one, includeHiggs_apply] - -/-! - -## B. The jet gauge transformation of the field symbols - -`TransformsIn` asks that a jet of gauge transformations mix a derivative symbol with the -lower symbols by the all-orders Leibniz convolution of the base-point Taylor coefficients -of the gauge jet. Each sector proves that law for its own symbols; the inclusions of -section A carry it to the full algebra, and the species bridge of -`Physlib.Particles.StandardModel.Fermions.JetAlgebra.Species` moves the fermionic law from -the total target space `FermionSpace` down to the individual species. - --/ - -/-! - -### B.1. The Higgs families - --/ - -/-- The Higgs symbols transform in the jet gauge representation carried by the jets of the - Higgs field. -/ -theorem transformsIn_higgsField : - TransformsIn (B := JetAlgebra) repJetGaugeGroupI HiggsVec.repJetGaugeGroupI - higgsField := by - intro U φ s - rw [higgsField_eq_includeHiggs, repJetGaugeGroupI_includeHiggs, - show HiggsJetAlgebra.repJetGaugeGroupI U - (BosonicAlgebra.iteratedJetDeriv s (BosonicAlgebra.ofField φ)) - = _ from BosonicAlgebra.repJetGaugeGroupI_iteratedJetDeriv_ofField - HiggsVec.repJetGaugeGroupI HiggsVec.repJetGaugeGroupI_smul U φ s, - map_multiset_sum, Multiset.map_map] - refine congrArg Multiset.sum (Multiset.map_congr rfl fun p _ => ?_) - rw [Function.comp_apply, ← higgsField_eq_includeHiggs] - -/-- The conjugate Higgs symbols transform in the conjugate of the jet gauge representation - carried by the jets of the Higgs field. -/ -theorem transformsIn_conjHiggsField : - TransformsIn (B := JetAlgebra) repJetGaugeGroupI (repConj HiggsVec.repJetGaugeGroupI) - conjHiggsField := by - intro U φ s - rw [conjHiggsField_eq_includeHiggs, repJetGaugeGroupI_includeHiggs, - show HiggsJetAlgebra.repJetGaugeGroupI U - (BosonicAlgebra.iteratedJetDeriv s (BosonicAlgebra.ofConjField φ)) - = _ from BosonicAlgebra.repJetGaugeGroupI_iteratedJetDeriv_ofConjField - HiggsVec.repJetGaugeGroupI HiggsVec.repJetGaugeGroupI_smul U φ s, - map_multiset_sum, Multiset.map_map] - refine congrArg Multiset.sum (Multiset.map_congr rfl fun p _ => ?_) - rw [Function.comp_apply, ← conjHiggsField_eq_includeHiggs] - -/-! - -### B.2. The fermion families - --/ - -/-- The jet gauge transformation law of a fermion species: a family of symbols obtained - from the total fermionic symbols by pulling covectors back along a projection - intertwining the two jet gauge actions transforms in the species' own representation. -/ -private lemma transformsIn_species {W : Type} [AddCommGroup W] [Module ℂ W] - (repW : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] W)) (p : FermionSpace →ₗ[ℂ] W) - (hp : ∀ U : JetGaugeGroupI, (LinearMap.lTensor JetRing p).comp - (FermionSpace.repJetGaugeGroupI U) - = (repW U).comp (LinearMap.lTensor JetRing p)) - {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ W →ₗ[ℂ] JetAlgebra} - (hF : ∀ s φ, F s φ = fermionSymbol s (Module.Dual.transpose p φ)) : - TransformsIn (B := JetAlgebra) repJetGaugeGroupI repW F := by - intro U φ s - rw [hF, fermionSymbol_eq_includeFermion, repJetGaugeGroupI_includeFermion, - show FermionJetAlgebra.repJetGaugeGroupI U - (FermionicAlgebra.iteratedJetDeriv s - (FermionicAlgebra.ofField (Module.Dual.transpose p φ))) - = _ from FermionicAlgebra.repJetGaugeGroupI_iteratedJetDeriv_ofField - FermionSpace.repJetGaugeGroupI FermionSpace.repJetGaugeGroupI_smul U _ s, - map_multiset_sum, Multiset.map_map] - refine congrArg Multiset.sum (Multiset.map_congr rfl fun q _ => ?_) - rw [Function.comp_apply, ← fermionSymbol_eq_includeFermion, hF] - exact congrArg (fermionSymbol q.2) - (LinearMap.congr_fun (repDualCoeff_comp p hp U⁻¹ q.1) φ) - -/-- The base-point Taylor coefficients of two conjugate jet gauge actions are intertwined, - on the component-function index, by the conjugate of any map of value spaces intertwining - the unconjugated coefficients: conjugation changes neither the underlying maps nor the - real directions in which the coefficients are taken. -/ -private lemma repDualCoeff_repConj_transpose {V W : Type} [AddCommGroup V] [Module ℂ V] - [AddCommGroup W] [Module ℂ W] - {repV : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)} - {repW : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] W)} (p : V →ₗ[ℂ] W) - (hp : ∀ (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)), - p.comp (IsGaugeField.repCoeff repV U s) = (IsGaugeField.repCoeff repW U s).comp p) - (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule W)) : - IsGaugeField.repDualCoeff (repConj repV) U s - (Module.Dual.transpose (ConjModule.map p) φ) - = Module.Dual.transpose (ConjModule.map p) - (IsGaugeField.repDualCoeff (repConj repW) U s φ) := by - refine LinearMap.ext fun v => ?_ - show φ (ConjModule.map p (IsGaugeField.repCoeff (repConj repV) U s v)) - = φ (IsGaugeField.repCoeff (repConj repW) U s (ConjModule.map p v)) - rw [GaugeAlgebra.repCoeff_repConj, GaugeAlgebra.repCoeff_repConj] - exact congrArg φ (LinearMap.congr_fun (hp U s) v) - -/-- The jet gauge transformation law of the conjugate symbols of a fermion species: the law - of the species itself, read on the conjugate representations. -/ -private lemma transformsIn_conjSpecies {W : Type} [AddCommGroup W] [Module ℂ W] - (repW : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] W)) (p : FermionSpace →ₗ[ℂ] W) - (hp : ∀ U : JetGaugeGroupI, (LinearMap.lTensor JetRing p).comp - (FermionSpace.repJetGaugeGroupI U) - = (repW U).comp (LinearMap.lTensor JetRing p)) - {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule W) →ₗ[ℂ] JetAlgebra} - (hF : ∀ s φ, F s φ = conjFermionSymbol s - (Module.Dual.transpose (ConjModule.map p) φ)) : - TransformsIn (B := JetAlgebra) repJetGaugeGroupI (repConj repW) F := by - intro U φ s - rw [hF, conjFermionSymbol_eq_includeFermion, repJetGaugeGroupI_includeFermion, - show FermionJetAlgebra.repJetGaugeGroupI U - (FermionicAlgebra.iteratedJetDeriv s - (FermionicAlgebra.ofConjField (Module.Dual.transpose (ConjModule.map p) φ))) - = _ from FermionicAlgebra.repJetGaugeGroupI_iteratedJetDeriv_ofConjField - FermionSpace.repJetGaugeGroupI FermionSpace.repJetGaugeGroupI_smul U _ s, - map_multiset_sum, Multiset.map_map] - refine congrArg Multiset.sum (Multiset.map_congr rfl fun q _ => ?_) - rw [Function.comp_apply, ← conjFermionSymbol_eq_includeFermion, hF] - exact congrArg (conjFermionSymbol q.2) - (repDualCoeff_repConj_transpose p (fun U' s' => repCoeff_comp p hp U' s') U⁻¹ q.1 φ) - - -/-- The symbols of the `i`-th generation down-type quark singlet transform in the jet gauge - representation carried by the jets of that species. -/ -theorem transformsIn_downSingletField (i : Fin 3) : - TransformsIn (B := JetAlgebra) repJetGaugeGroupI DownSinglet.repJetGaugeGroupI - (downSingletField i) := - transformsIn_species _ _ (FermionSpace.lTensor_downSingletProj_repJetGaugeGroupI i) - (downSingletField_eq_fermionSymbol i) - -/-- The conjugate symbols of the `i`-th generation down-type quark singlet transform in the - conjugate of the jet gauge representation carried by the jets of that species. -/ -theorem transformsIn_conjDownSingletField (i : Fin 3) : - TransformsIn (B := JetAlgebra) repJetGaugeGroupI - (repConj DownSinglet.repJetGaugeGroupI) (conjDownSingletField i) := - transformsIn_conjSpecies _ _ (FermionSpace.lTensor_downSingletProj_repJetGaugeGroupI i) - (conjDownSingletField_eq_conjFermionSymbol i) - - -/-- The symbols of the `i`-th generation up-type quark singlet transform in the jet gauge - representation carried by the jets of that species. -/ -theorem transformsIn_upSingletField (i : Fin 3) : - TransformsIn (B := JetAlgebra) repJetGaugeGroupI UpSinglet.repJetGaugeGroupI - (upSingletField i) := - transformsIn_species _ _ (FermionSpace.lTensor_upSingletProj_repJetGaugeGroupI i) - (upSingletField_eq_fermionSymbol i) - -/-- The conjugate symbols of the `i`-th generation up-type quark singlet transform in the - conjugate of the jet gauge representation carried by the jets of that species. -/ -theorem transformsIn_conjUpSingletField (i : Fin 3) : - TransformsIn (B := JetAlgebra) repJetGaugeGroupI - (repConj UpSinglet.repJetGaugeGroupI) (conjUpSingletField i) := - transformsIn_conjSpecies _ _ (FermionSpace.lTensor_upSingletProj_repJetGaugeGroupI i) - (conjUpSingletField_eq_conjFermionSymbol i) - - -/-- The symbols of the `i`-th generation quark doublet transform in the jet gauge - representation carried by the jets of that species. -/ -theorem transformsIn_quarkDoubletField (i : Fin 3) : - TransformsIn (B := JetAlgebra) repJetGaugeGroupI QuarkDoublet.repJetGaugeGroupI - (quarkDoubletField i) := - transformsIn_species _ _ (FermionSpace.lTensor_quarkDoubletProj_repJetGaugeGroupI i) - (quarkDoubletField_eq_fermionSymbol i) - -/-- The conjugate symbols of the `i`-th generation quark doublet transform in the - conjugate of the jet gauge representation carried by the jets of that species. -/ -theorem transformsIn_conjQuarkDoubletField (i : Fin 3) : - TransformsIn (B := JetAlgebra) repJetGaugeGroupI - (repConj QuarkDoublet.repJetGaugeGroupI) (conjQuarkDoubletField i) := - transformsIn_conjSpecies _ _ (FermionSpace.lTensor_quarkDoubletProj_repJetGaugeGroupI i) - (conjQuarkDoubletField_eq_conjFermionSymbol i) - - -/-- The symbols of the `i`-th generation lepton doublet transform in the jet gauge - representation carried by the jets of that species. -/ -theorem transformsIn_leptonDoubletField (i : Fin 3) : - TransformsIn (B := JetAlgebra) repJetGaugeGroupI LeptonDoublet.repJetGaugeGroupI - (leptonDoubletField i) := - transformsIn_species _ _ (FermionSpace.lTensor_leptonDoubletProj_repJetGaugeGroupI i) - (leptonDoubletField_eq_fermionSymbol i) - -/-- The conjugate symbols of the `i`-th generation lepton doublet transform in the - conjugate of the jet gauge representation carried by the jets of that species. -/ -theorem transformsIn_conjLeptonDoubletField (i : Fin 3) : - TransformsIn (B := JetAlgebra) repJetGaugeGroupI - (repConj LeptonDoublet.repJetGaugeGroupI) (conjLeptonDoubletField i) := - transformsIn_conjSpecies _ _ (FermionSpace.lTensor_leptonDoubletProj_repJetGaugeGroupI i) - (conjLeptonDoubletField_eq_conjFermionSymbol i) - - -/-- The symbols of the `i`-th generation charged-lepton singlet transform in the jet gauge - representation carried by the jets of that species. -/ -theorem transformsIn_leptonSingletField (i : Fin 3) : - TransformsIn (B := JetAlgebra) repJetGaugeGroupI LeptonSinglet.repJetGaugeGroupI - (leptonSingletField i) := - transformsIn_species _ _ (FermionSpace.lTensor_leptonSingletProj_repJetGaugeGroupI i) - (leptonSingletField_eq_fermionSymbol i) - -/-- The conjugate symbols of the `i`-th generation charged-lepton singlet transform in the - conjugate of the jet gauge representation carried by the jets of that species. -/ -theorem transformsIn_conjLeptonSingletField (i : Fin 3) : - TransformsIn (B := JetAlgebra) repJetGaugeGroupI - (repConj LeptonSinglet.repJetGaugeGroupI) (conjLeptonSingletField i) := - transformsIn_conjSpecies _ _ (FermionSpace.lTensor_leptonSingletProj_repJetGaugeGroupI i) - (conjLeptonSingletField_eq_conjFermionSymbol i) -/-! - -## C. The Lorentz transformation of the field symbols - -`IsLorentzDerivTransforms` asks that each derivative slot of a symbol mix into all tuples -of directions by the columns of the Lorentz matrix, while the value index transforms by the -contragredient of the species' Lorentz representation. The mixing of the slots is -`IsLorentzDeriv.rep_iteratedD_ofFn`, available because the total derivative on the jet -algebra is a Lorentz vector; what is left is the undifferentiated law at `n = 0`, which is -the equivariance of the component functions of each sector. - --/ - -/-! - -### C.1. The Higgs families - -The Higgs is a Lorentz scalar, so its value index carries the trivial representation and -the conjugate index its conjugate. - --/ - -/-- The Higgs symbols transform as the derivative symbols of a Lorentz scalar. -/ -theorem isLorentzDerivTransforms_higgsField : - IsLorentzDerivTransforms (A := JetAlgebra) repLorentzGroup - (Representation.trivial ℂ SL(2,ℂ) HiggsVec) higgsField := by - intro Λ n l φ - refine (Lorentz.IsLorentzDeriv.rep_iteratedD_ofFn jetDeriv_comm Λ l - (includeHiggs (BosonicAlgebra.ofField φ))).trans ?_ - refine Finset.sum_congr rfl fun p _ => ?_ - rw [repLorentzGroup_includeHiggs, - show HiggsJetAlgebra.repLorentzGroup Λ (BosonicAlgebra.ofField φ) - = BosonicAlgebra.ofField ((Representation.trivial ℂ SL(2,ℂ) HiggsVec).dual Λ φ) from - BosonicAlgebra.repLorentzGroup_ofField _ Λ φ] - rfl - -/-- The conjugate Higgs symbols transform as the derivative symbols of the conjugate of a - Lorentz scalar. -/ -theorem isLorentzDerivTransforms_conjHiggsField : - IsLorentzDerivTransforms (A := JetAlgebra) repLorentzGroup - (Representation.trivial ℂ SL(2,ℂ) HiggsVec).conj conjHiggsField := by - intro Λ n l φ - refine (Lorentz.IsLorentzDeriv.rep_iteratedD_ofFn jetDeriv_comm Λ l - (includeHiggs (BosonicAlgebra.ofConjField φ))).trans ?_ - refine Finset.sum_congr rfl fun p _ => ?_ - rw [repLorentzGroup_includeHiggs, - show HiggsJetAlgebra.repLorentzGroup Λ (BosonicAlgebra.ofConjField φ) - = BosonicAlgebra.ofConjField - ((Representation.trivial ℂ SL(2,ℂ) HiggsVec).conj.dual Λ φ) from - BosonicAlgebra.repLorentzGroup_ofConjField _ Λ φ] - rfl - -/-! - -### C.2. The fermion families - -The Lorentz action on `FermionSpace` is species-diagonal, so the contragredient action on a -covector pulled back from a species is the pullback of the species' own contragredient -action; that identity is definitional, and it is the only input the species need beyond the -law for the total fermionic symbols. - --/ - -/-- The Lorentz transformation law of a fermion species: a family of symbols obtained from - the total fermionic symbols by pulling covectors back along a projection whose - contragredient is species-diagonal transforms in the species' own Weyl representation. -/ -private lemma isLorentzDerivTransforms_species {W : Type} [AddCommGroup W] [Module ℂ W] - (repW : Representation ℂ SL(2,ℂ) W) (p : FermionSpace →ₗ[ℂ] W) - (hdual : ∀ (Λ : SL(2,ℂ)) (φ : Module.Dual ℂ W), - FermionSpace.repLorentzGroup.dual Λ (Module.Dual.transpose p φ) - = Module.Dual.transpose p (repW.dual Λ φ)) - {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ W →ₗ[ℂ] JetAlgebra} - (hF : ∀ s φ, F s φ = fermionSymbol s (Module.Dual.transpose p φ)) : - IsLorentzDerivTransforms (A := JetAlgebra) repLorentzGroup repW F := by - intro Λ n l φ - rw [hF] - refine (Lorentz.IsLorentzDeriv.rep_iteratedD_ofFn jetDeriv_comm Λ l - (includeFermion (FermionicAlgebra.ofField (Module.Dual.transpose p φ)))).trans ?_ - refine Finset.sum_congr rfl fun q _ => ?_ - rw [repLorentzGroup_includeFermion, - show FermionJetAlgebra.repLorentzGroup Λ - (FermionicAlgebra.ofField (Module.Dual.transpose p φ)) - = FermionicAlgebra.ofField - (FermionSpace.repLorentzGroup.dual Λ (Module.Dual.transpose p φ)) from - FermionicAlgebra.repLorentzGroup_ofField _ Λ _, - hdual, hF] - rfl - -/-- The Lorentz transformation law of the conjugate symbols of a fermion species: the law - of the species itself, read on the conjugate representations. -/ -private lemma isLorentzDerivTransforms_conjSpecies {W : Type} [AddCommGroup W] - [Module ℂ W] (repW : Representation ℂ SL(2,ℂ) W) (p : FermionSpace →ₗ[ℂ] W) - (hdual : ∀ (Λ : SL(2,ℂ)) (φ : Module.Dual ℂ (ConjModule W)), - FermionSpace.repLorentzGroup.conj.dual Λ - (Module.Dual.transpose (ConjModule.map p) φ) - = Module.Dual.transpose (ConjModule.map p) (repW.conj.dual Λ φ)) - {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule W) →ₗ[ℂ] JetAlgebra} - (hF : ∀ s φ, F s φ = conjFermionSymbol s - (Module.Dual.transpose (ConjModule.map p) φ)) : - IsLorentzDerivTransforms (A := JetAlgebra) repLorentzGroup repW.conj F := by - intro Λ n l φ - rw [hF] - refine (Lorentz.IsLorentzDeriv.rep_iteratedD_ofFn jetDeriv_comm Λ l - (includeFermion (FermionicAlgebra.ofConjField - (Module.Dual.transpose (ConjModule.map p) φ)))).trans ?_ - refine Finset.sum_congr rfl fun q _ => ?_ - rw [repLorentzGroup_includeFermion, - show FermionJetAlgebra.repLorentzGroup Λ - (FermionicAlgebra.ofConjField (Module.Dual.transpose (ConjModule.map p) φ)) - = FermionicAlgebra.ofConjField (FermionSpace.repLorentzGroup.conj.dual Λ - (Module.Dual.transpose (ConjModule.map p) φ)) from - FermionicAlgebra.repLorentzGroup_ofConjField _ Λ _, - hdual, hF] - rfl - - -/-- The symbols of the `i`-th generation down-type quark singlet transform as the derivative - symbols of a Weyl spinor in that species' Lorentz representation. -/ -theorem isLorentzDerivTransforms_downSingletField (i : Fin 3) : - IsLorentzDerivTransforms (A := JetAlgebra) repLorentzGroup - DownSinglet.repLorentzGroup (downSingletField i) := - isLorentzDerivTransforms_species _ _ (fun _ _ => rfl) - (downSingletField_eq_fermionSymbol i) - -/-- The conjugate symbols of the `i`-th generation down-type quark singlet transform as the - derivative symbols of the conjugate Weyl spinor. -/ -theorem isLorentzDerivTransforms_conjDownSingletField (i : Fin 3) : - IsLorentzDerivTransforms (A := JetAlgebra) repLorentzGroup - DownSinglet.repLorentzGroup.conj (conjDownSingletField i) := - isLorentzDerivTransforms_conjSpecies _ _ (fun _ _ => rfl) - (conjDownSingletField_eq_conjFermionSymbol i) - - -/-- The symbols of the `i`-th generation up-type quark singlet transform as the derivative - symbols of a Weyl spinor in that species' Lorentz representation. -/ -theorem isLorentzDerivTransforms_upSingletField (i : Fin 3) : - IsLorentzDerivTransforms (A := JetAlgebra) repLorentzGroup - UpSinglet.repLorentzGroup (upSingletField i) := - isLorentzDerivTransforms_species _ _ (fun _ _ => rfl) - (upSingletField_eq_fermionSymbol i) - -/-- The conjugate symbols of the `i`-th generation up-type quark singlet transform as the - derivative symbols of the conjugate Weyl spinor. -/ -theorem isLorentzDerivTransforms_conjUpSingletField (i : Fin 3) : - IsLorentzDerivTransforms (A := JetAlgebra) repLorentzGroup - UpSinglet.repLorentzGroup.conj (conjUpSingletField i) := - isLorentzDerivTransforms_conjSpecies _ _ (fun _ _ => rfl) - (conjUpSingletField_eq_conjFermionSymbol i) - - -/-- The symbols of the `i`-th generation quark doublet transform as the derivative - symbols of a Weyl spinor in that species' Lorentz representation. -/ -theorem isLorentzDerivTransforms_quarkDoubletField (i : Fin 3) : - IsLorentzDerivTransforms (A := JetAlgebra) repLorentzGroup - QuarkDoublet.repLorentzGroup (quarkDoubletField i) := - isLorentzDerivTransforms_species _ _ (fun _ _ => rfl) - (quarkDoubletField_eq_fermionSymbol i) - -/-- The conjugate symbols of the `i`-th generation quark doublet transform as the - derivative symbols of the conjugate Weyl spinor. -/ -theorem isLorentzDerivTransforms_conjQuarkDoubletField (i : Fin 3) : - IsLorentzDerivTransforms (A := JetAlgebra) repLorentzGroup - QuarkDoublet.repLorentzGroup.conj (conjQuarkDoubletField i) := - isLorentzDerivTransforms_conjSpecies _ _ (fun _ _ => rfl) - (conjQuarkDoubletField_eq_conjFermionSymbol i) - - -/-- The symbols of the `i`-th generation lepton doublet transform as the derivative - symbols of a Weyl spinor in that species' Lorentz representation. -/ -theorem isLorentzDerivTransforms_leptonDoubletField (i : Fin 3) : - IsLorentzDerivTransforms (A := JetAlgebra) repLorentzGroup - LeptonDoublet.repLorentzGroup (leptonDoubletField i) := - isLorentzDerivTransforms_species _ _ (fun _ _ => rfl) - (leptonDoubletField_eq_fermionSymbol i) - -/-- The conjugate symbols of the `i`-th generation lepton doublet transform as the - derivative symbols of the conjugate Weyl spinor. -/ -theorem isLorentzDerivTransforms_conjLeptonDoubletField (i : Fin 3) : - IsLorentzDerivTransforms (A := JetAlgebra) repLorentzGroup - LeptonDoublet.repLorentzGroup.conj (conjLeptonDoubletField i) := - isLorentzDerivTransforms_conjSpecies _ _ (fun _ _ => rfl) - (conjLeptonDoubletField_eq_conjFermionSymbol i) - - -/-- The symbols of the `i`-th generation charged-lepton singlet transform as the derivative - symbols of a Weyl spinor in that species' Lorentz representation. -/ -theorem isLorentzDerivTransforms_leptonSingletField (i : Fin 3) : - IsLorentzDerivTransforms (A := JetAlgebra) repLorentzGroup - LeptonSinglet.repLorentzGroup (leptonSingletField i) := - isLorentzDerivTransforms_species _ _ (fun _ _ => rfl) - (leptonSingletField_eq_fermionSymbol i) - -/-- The conjugate symbols of the `i`-th generation charged-lepton singlet transform as the - derivative symbols of the conjugate Weyl spinor. -/ -theorem isLorentzDerivTransforms_conjLeptonSingletField (i : Fin 3) : - IsLorentzDerivTransforms (A := JetAlgebra) repLorentzGroup - LeptonSinglet.repLorentzGroup.conj (conjLeptonSingletField i) := - isLorentzDerivTransforms_conjSpecies _ _ (fun _ _ => rfl) - (conjLeptonSingletField_eq_conjFermionSymbol i) - -/-! - -## D. The Standard Model instance +## A. The Standard Model instance -Every obligation of `IsStandardModel` is now in hand: the gauge field is a gauge field, the -twelve matter families transform in their jet gauge representations and their Lorentz -representations, the fifteen generating families are monomial eigenvectors of -`massWeightPoly` at the mass weights the structure predicts, and the statistics of the -symbols are the three facts of `JetAlgebra.Generators` — the gauge symbols are central, the -Higgs symbols commute with everything, and the fermion symbols anticommute. +The abstract theory `IsStandardModel` is written in terms of an equivariant algebra map out +of the jet algebra, so the jet algebra is a Standard Model along the identity map. The four +compatibility laws hold by definition, and the two multiplicativity laws are the ones the +jet gauge action and the Lorentz action were shown to satisfy when they were built. -/ -/-- The jet algebra of the Standard Model is a Standard Model: with the jet gauge action, - the Lorentz action, the mass-weight grading and the thirteen families of derivative - symbols built in the preceding files, it satisfies every axiom of `IsStandardModel`. +/-- The jet algebra of the Standard Model is a Standard Model: it is one along the identity + algebra map, since `IsStandardModel` asks precisely for an equivariant algebra map out of + the jet algebra. This is the point at which the abstract theory of `IsStandardModel` — its covariant reduction, its mass-weight filtration and its classification of invariants — becomes a theory of the concrete algebra in which a Standard Model Lagrangian is written. -/ -theorem isStandardModel : IsStandardModel JetAlgebra repJetGaugeGroupI repLorentzGroup - massWeightPoly higgsField conjHiggsField gaugeField - downSingletField conjDownSingletField upSingletField conjUpSingletField - quarkDoubletField conjQuarkDoubletField leptonDoubletField conjLeptonDoubletField - leptonSingletField conjLeptonSingletField where - repJet_A := isGaugeField - repJet_H := transformsIn_higgsField - repJet_barH := transformsIn_conjHiggsField - repJet_d := transformsIn_downSingletField - repJet_bard := transformsIn_conjDownSingletField - repJet_u := transformsIn_upSingletField - repJet_baru := transformsIn_conjUpSingletField - repJet_Q := transformsIn_quarkDoubletField - repJet_barQ := transformsIn_conjQuarkDoubletField - repJet_L := transformsIn_leptonDoubletField - repJet_barL := transformsIn_conjLeptonDoubletField - repJet_e := transformsIn_leptonSingletField - repJet_bare := transformsIn_conjLeptonSingletField - repLorentz_H := isLorentzDerivTransforms_higgsField - repLorentz_barH := isLorentzDerivTransforms_conjHiggsField - repLorentz_d := isLorentzDerivTransforms_downSingletField - repLorentz_bard := isLorentzDerivTransforms_conjDownSingletField - repLorentz_u := isLorentzDerivTransforms_upSingletField - repLorentz_baru := isLorentzDerivTransforms_conjUpSingletField - repLorentz_Q := isLorentzDerivTransforms_quarkDoubletField - repLorentz_barQ := isLorentzDerivTransforms_conjQuarkDoubletField - repLorentz_L := isLorentzDerivTransforms_leptonDoubletField - repLorentz_barL := isLorentzDerivTransforms_conjLeptonDoubletField - repLorentz_e := isLorentzDerivTransforms_leptonSingletField - repLorentz_bare := isLorentzDerivTransforms_conjLeptonSingletField - massWeight_H := massWeightPoly_higgsField - massWeight_barH := massWeightPoly_conjHiggsField - massWeight_A := massWeightPoly_gaugeField - massWeight_d := massWeightPoly_downSingletField - massWeight_bard := massWeightPoly_conjDownSingletField - massWeight_u := massWeightPoly_upSingletField - massWeight_baru := massWeightPoly_conjUpSingletField - massWeight_Q := massWeightPoly_quarkDoubletField - massWeight_barQ := massWeightPoly_conjQuarkDoubletField - massWeight_L := massWeightPoly_leptonDoubletField - massWeight_barL := massWeightPoly_conjLeptonDoubletField - massWeight_e := massWeightPoly_leptonSingletField - massWeight_bare := massWeightPoly_conjLeptonSingletField - A_comm_A := fun s _ μ _ ψ _ => gaugeField_commute s μ ψ _ - A_comm_H := fun s μ ψ _ _ => gaugeField_commute s μ ψ _ - A_comm_barH := fun s μ ψ _ _ => gaugeField_commute s μ ψ _ - A_comm_d := fun s μ ψ _ _ _ => gaugeField_commute s μ ψ _ - A_comm_bard := fun s μ ψ _ _ _ => gaugeField_commute s μ ψ _ - A_comm_u := fun s μ ψ _ _ _ => gaugeField_commute s μ ψ _ - A_comm_baru := fun s μ ψ _ _ _ => gaugeField_commute s μ ψ _ - A_comm_Q := fun s μ ψ _ _ _ => gaugeField_commute s μ ψ _ - A_comm_barQ := fun s μ ψ _ _ _ => gaugeField_commute s μ ψ _ - A_comm_L := fun s μ ψ _ _ _ => gaugeField_commute s μ ψ _ - A_comm_barL := fun s μ ψ _ _ _ => gaugeField_commute s μ ψ _ - A_comm_e := fun s μ ψ _ _ _ => gaugeField_commute s μ ψ _ - A_comm_bare := fun s μ ψ _ _ _ => gaugeField_commute s μ ψ _ +noncomputable def isStandardModel : IsStandardModel JetAlgebra repJetGaugeGroupI repLorentzGroup + massWeightPoly where + toAlgHom := AlgHom.id ℂ JetAlgebra + map_repJet _ _ := rfl + map_repLorentz _ _ := rfl + map_massWeight x := by + simp [Polynomial.mapAlgHom] + repJet_mul := isGaugeField.gauge_mul repLorentz_mul := repLorentzGroup_apply_mul - H_comm_H := fun s s' φ φ' => - (memHiggsSector_higgsField s φ).commute (memHiggsSector_higgsField s' φ') - H_comm_barH := fun s s' φ φ' => - (memHiggsSector_higgsField s φ).commute (memHiggsSector_conjHiggsField s' φ') - barH_comm_barH := fun s s' φ φ' => - (memHiggsSector_conjHiggsField s φ).commute (memHiggsSector_conjHiggsField s' φ') - H_comm_d := fun s φ i s' φ' => - (memHiggsSector_higgsField s φ).commute_of_memFermionSector - (isFermionGenerator_downSingletField i s' φ').memFermionSector - H_comm_bard := fun s φ i s' φ' => - (memHiggsSector_higgsField s φ).commute_of_memFermionSector - (isFermionGenerator_conjDownSingletField i s' φ').memFermionSector - H_comm_u := fun s φ i s' φ' => - (memHiggsSector_higgsField s φ).commute_of_memFermionSector - (isFermionGenerator_upSingletField i s' φ').memFermionSector - H_comm_baru := fun s φ i s' φ' => - (memHiggsSector_higgsField s φ).commute_of_memFermionSector - (isFermionGenerator_conjUpSingletField i s' φ').memFermionSector - H_comm_Q := fun s φ i s' φ' => - (memHiggsSector_higgsField s φ).commute_of_memFermionSector - (isFermionGenerator_quarkDoubletField i s' φ').memFermionSector - H_comm_barQ := fun s φ i s' φ' => - (memHiggsSector_higgsField s φ).commute_of_memFermionSector - (isFermionGenerator_conjQuarkDoubletField i s' φ').memFermionSector - H_comm_L := fun s φ i s' φ' => - (memHiggsSector_higgsField s φ).commute_of_memFermionSector - (isFermionGenerator_leptonDoubletField i s' φ').memFermionSector - H_comm_barL := fun s φ i s' φ' => - (memHiggsSector_higgsField s φ).commute_of_memFermionSector - (isFermionGenerator_conjLeptonDoubletField i s' φ').memFermionSector - H_comm_e := fun s φ i s' φ' => - (memHiggsSector_higgsField s φ).commute_of_memFermionSector - (isFermionGenerator_leptonSingletField i s' φ').memFermionSector - H_comm_bare := fun s φ i s' φ' => - (memHiggsSector_higgsField s φ).commute_of_memFermionSector - (isFermionGenerator_conjLeptonSingletField i s' φ').memFermionSector - barH_comm_d := fun s φ i s' φ' => - (memHiggsSector_conjHiggsField s φ).commute_of_memFermionSector - (isFermionGenerator_downSingletField i s' φ').memFermionSector - barH_comm_bard := fun s φ i s' φ' => - (memHiggsSector_conjHiggsField s φ).commute_of_memFermionSector - (isFermionGenerator_conjDownSingletField i s' φ').memFermionSector - barH_comm_u := fun s φ i s' φ' => - (memHiggsSector_conjHiggsField s φ).commute_of_memFermionSector - (isFermionGenerator_upSingletField i s' φ').memFermionSector - barH_comm_baru := fun s φ i s' φ' => - (memHiggsSector_conjHiggsField s φ).commute_of_memFermionSector - (isFermionGenerator_conjUpSingletField i s' φ').memFermionSector - barH_comm_Q := fun s φ i s' φ' => - (memHiggsSector_conjHiggsField s φ).commute_of_memFermionSector - (isFermionGenerator_quarkDoubletField i s' φ').memFermionSector - barH_comm_barQ := fun s φ i s' φ' => - (memHiggsSector_conjHiggsField s φ).commute_of_memFermionSector - (isFermionGenerator_conjQuarkDoubletField i s' φ').memFermionSector - barH_comm_L := fun s φ i s' φ' => - (memHiggsSector_conjHiggsField s φ).commute_of_memFermionSector - (isFermionGenerator_leptonDoubletField i s' φ').memFermionSector - barH_comm_barL := fun s φ i s' φ' => - (memHiggsSector_conjHiggsField s φ).commute_of_memFermionSector - (isFermionGenerator_conjLeptonDoubletField i s' φ').memFermionSector - barH_comm_e := fun s φ i s' φ' => - (memHiggsSector_conjHiggsField s φ).commute_of_memFermionSector - (isFermionGenerator_leptonSingletField i s' φ').memFermionSector - barH_comm_bare := fun s φ i s' φ' => - (memHiggsSector_conjHiggsField s φ).commute_of_memFermionSector - (isFermionGenerator_conjLeptonSingletField i s' φ').memFermionSector - d_anticomm_d := fun i j s s' φ φ' => - (isFermionGenerator_downSingletField i s φ).anticomm - (isFermionGenerator_downSingletField j s' φ') - d_anticomm_bard := fun i j s s' φ φ' => - (isFermionGenerator_downSingletField i s φ).anticomm - (isFermionGenerator_conjDownSingletField j s' φ') - d_anticomm_u := fun i j s s' φ φ' => - (isFermionGenerator_downSingletField i s φ).anticomm (isFermionGenerator_upSingletField j s' φ') - d_anticomm_baru := fun i j s s' φ φ' => - (isFermionGenerator_downSingletField i s φ).anticomm - (isFermionGenerator_conjUpSingletField j s' φ') - d_anticomm_Q := fun i j s s' φ φ' => - (isFermionGenerator_downSingletField i s φ).anticomm - (isFermionGenerator_quarkDoubletField j s' φ') - d_anticomm_barQ := fun i j s s' φ φ' => - (isFermionGenerator_downSingletField i s φ).anticomm - (isFermionGenerator_conjQuarkDoubletField j s' φ') - d_anticomm_L := fun i j s s' φ φ' => - (isFermionGenerator_downSingletField i s φ).anticomm - (isFermionGenerator_leptonDoubletField j s' φ') - d_anticomm_barL := fun i j s s' φ φ' => - (isFermionGenerator_downSingletField i s φ).anticomm - (isFermionGenerator_conjLeptonDoubletField j s' φ') - d_anticomm_e := fun i j s s' φ φ' => - (isFermionGenerator_downSingletField i s φ).anticomm - (isFermionGenerator_leptonSingletField j s' φ') - d_anticomm_bare := fun i j s s' φ φ' => - (isFermionGenerator_downSingletField i s φ).anticomm - (isFermionGenerator_conjLeptonSingletField j s' φ') - bard_anticomm_bard := fun i j s s' φ φ' => - (isFermionGenerator_conjDownSingletField i s φ).anticomm - (isFermionGenerator_conjDownSingletField j s' φ') - bard_anticomm_u := fun i j s s' φ φ' => - (isFermionGenerator_conjDownSingletField i s φ).anticomm - (isFermionGenerator_upSingletField j s' φ') - bard_anticomm_baru := fun i j s s' φ φ' => - (isFermionGenerator_conjDownSingletField i s φ).anticomm - (isFermionGenerator_conjUpSingletField j s' φ') - bard_anticomm_Q := fun i j s s' φ φ' => - (isFermionGenerator_conjDownSingletField i s φ).anticomm - (isFermionGenerator_quarkDoubletField j s' φ') - bard_anticomm_barQ := fun i j s s' φ φ' => - (isFermionGenerator_conjDownSingletField i s φ).anticomm - (isFermionGenerator_conjQuarkDoubletField j s' φ') - bard_anticomm_L := fun i j s s' φ φ' => - (isFermionGenerator_conjDownSingletField i s φ).anticomm - (isFermionGenerator_leptonDoubletField j s' φ') - bard_anticomm_barL := fun i j s s' φ φ' => - (isFermionGenerator_conjDownSingletField i s φ).anticomm - (isFermionGenerator_conjLeptonDoubletField j s' φ') - bard_anticomm_e := fun i j s s' φ φ' => - (isFermionGenerator_conjDownSingletField i s φ).anticomm - (isFermionGenerator_leptonSingletField j s' φ') - bard_anticomm_bare := fun i j s s' φ φ' => - (isFermionGenerator_conjDownSingletField i s φ).anticomm - (isFermionGenerator_conjLeptonSingletField j s' φ') - u_anticomm_u := fun i j s s' φ φ' => - (isFermionGenerator_upSingletField i s φ).anticomm (isFermionGenerator_upSingletField j s' φ') - u_anticomm_baru := fun i j s s' φ φ' => - (isFermionGenerator_upSingletField i s φ).anticomm - (isFermionGenerator_conjUpSingletField j s' φ') - u_anticomm_Q := fun i j s s' φ φ' => - (isFermionGenerator_upSingletField i s φ).anticomm - (isFermionGenerator_quarkDoubletField j s' φ') - u_anticomm_barQ := fun i j s s' φ φ' => - (isFermionGenerator_upSingletField i s φ).anticomm - (isFermionGenerator_conjQuarkDoubletField j s' φ') - u_anticomm_L := fun i j s s' φ φ' => - (isFermionGenerator_upSingletField i s φ).anticomm - (isFermionGenerator_leptonDoubletField j s' φ') - u_anticomm_barL := fun i j s s' φ φ' => - (isFermionGenerator_upSingletField i s φ).anticomm - (isFermionGenerator_conjLeptonDoubletField j s' φ') - u_anticomm_e := fun i j s s' φ φ' => - (isFermionGenerator_upSingletField i s φ).anticomm - (isFermionGenerator_leptonSingletField j s' φ') - u_anticomm_bare := fun i j s s' φ φ' => - (isFermionGenerator_upSingletField i s φ).anticomm - (isFermionGenerator_conjLeptonSingletField j s' φ') - baru_anticomm_baru := fun i j s s' φ φ' => - (isFermionGenerator_conjUpSingletField i s φ).anticomm - (isFermionGenerator_conjUpSingletField j s' φ') - baru_anticomm_Q := fun i j s s' φ φ' => - (isFermionGenerator_conjUpSingletField i s φ).anticomm - (isFermionGenerator_quarkDoubletField j s' φ') - baru_anticomm_barQ := fun i j s s' φ φ' => - (isFermionGenerator_conjUpSingletField i s φ).anticomm - (isFermionGenerator_conjQuarkDoubletField j s' φ') - baru_anticomm_L := fun i j s s' φ φ' => - (isFermionGenerator_conjUpSingletField i s φ).anticomm - (isFermionGenerator_leptonDoubletField j s' φ') - baru_anticomm_barL := fun i j s s' φ φ' => - (isFermionGenerator_conjUpSingletField i s φ).anticomm - (isFermionGenerator_conjLeptonDoubletField j s' φ') - baru_anticomm_e := fun i j s s' φ φ' => - (isFermionGenerator_conjUpSingletField i s φ).anticomm - (isFermionGenerator_leptonSingletField j s' φ') - baru_anticomm_bare := fun i j s s' φ φ' => - (isFermionGenerator_conjUpSingletField i s φ).anticomm - (isFermionGenerator_conjLeptonSingletField j s' φ') - Q_anticomm_Q := fun i j s s' φ φ' => - (isFermionGenerator_quarkDoubletField i s φ).anticomm - (isFermionGenerator_quarkDoubletField j s' φ') - Q_anticomm_barQ := fun i j s s' φ φ' => - (isFermionGenerator_quarkDoubletField i s φ).anticomm - (isFermionGenerator_conjQuarkDoubletField j s' φ') - Q_anticomm_L := fun i j s s' φ φ' => - (isFermionGenerator_quarkDoubletField i s φ).anticomm - (isFermionGenerator_leptonDoubletField j s' φ') - Q_anticomm_barL := fun i j s s' φ φ' => - (isFermionGenerator_quarkDoubletField i s φ).anticomm - (isFermionGenerator_conjLeptonDoubletField j s' φ') - Q_anticomm_e := fun i j s s' φ φ' => - (isFermionGenerator_quarkDoubletField i s φ).anticomm - (isFermionGenerator_leptonSingletField j s' φ') - Q_anticomm_bare := fun i j s s' φ φ' => - (isFermionGenerator_quarkDoubletField i s φ).anticomm - (isFermionGenerator_conjLeptonSingletField j s' φ') - barQ_anticomm_barQ := fun i j s s' φ φ' => - (isFermionGenerator_conjQuarkDoubletField i s φ).anticomm - (isFermionGenerator_conjQuarkDoubletField j s' φ') - barQ_anticomm_L := fun i j s s' φ φ' => - (isFermionGenerator_conjQuarkDoubletField i s φ).anticomm - (isFermionGenerator_leptonDoubletField j s' φ') - barQ_anticomm_barL := fun i j s s' φ φ' => - (isFermionGenerator_conjQuarkDoubletField i s φ).anticomm - (isFermionGenerator_conjLeptonDoubletField j s' φ') - barQ_anticomm_e := fun i j s s' φ φ' => - (isFermionGenerator_conjQuarkDoubletField i s φ).anticomm - (isFermionGenerator_leptonSingletField j s' φ') - barQ_anticomm_bare := fun i j s s' φ φ' => - (isFermionGenerator_conjQuarkDoubletField i s φ).anticomm - (isFermionGenerator_conjLeptonSingletField j s' φ') - L_anticomm_L := fun i j s s' φ φ' => - (isFermionGenerator_leptonDoubletField i s φ).anticomm - (isFermionGenerator_leptonDoubletField j s' φ') - L_anticomm_barL := fun i j s s' φ φ' => - (isFermionGenerator_leptonDoubletField i s φ).anticomm - (isFermionGenerator_conjLeptonDoubletField j s' φ') - L_anticomm_e := fun i j s s' φ φ' => - (isFermionGenerator_leptonDoubletField i s φ).anticomm - (isFermionGenerator_leptonSingletField j s' φ') - L_anticomm_bare := fun i j s s' φ φ' => - (isFermionGenerator_leptonDoubletField i s φ).anticomm - (isFermionGenerator_conjLeptonSingletField j s' φ') - barL_anticomm_barL := fun i j s s' φ φ' => - (isFermionGenerator_conjLeptonDoubletField i s φ).anticomm - (isFermionGenerator_conjLeptonDoubletField j s' φ') - barL_anticomm_e := fun i j s s' φ φ' => - (isFermionGenerator_conjLeptonDoubletField i s φ).anticomm - (isFermionGenerator_leptonSingletField j s' φ') - barL_anticomm_bare := fun i j s s' φ φ' => - (isFermionGenerator_conjLeptonDoubletField i s φ).anticomm - (isFermionGenerator_conjLeptonSingletField j s' φ') - e_anticomm_e := fun i j s s' φ φ' => - (isFermionGenerator_leptonSingletField i s φ).anticomm - (isFermionGenerator_leptonSingletField j s' φ') - e_anticomm_bare := fun i j s s' φ φ' => - (isFermionGenerator_leptonSingletField i s φ).anticomm - (isFermionGenerator_conjLeptonSingletField j s' φ') - bare_anticomm_bare := fun i j s s' φ φ' => - (isFermionGenerator_conjLeptonSingletField i s φ).anticomm - (isFermionGenerator_conjLeptonSingletField j s' φ') /-! -## E. The field algebra is everything +## B. The field algebra is everything The field algebra of an `IsStandardModel` is the algebra generated by the thirteen families of derivative symbols. On the jet algebra it is everything: a Standard Model Lagrangian @@ -938,22 +118,22 @@ The consequence is that the mass-weight filtration simplifies. The graded piece `IsStandardModel.massWeightSubmodule n` is by definition the intersection of the field algebra with the kernel of `massWeightPoly - X ^ n`; with the field algebra the whole algebra the intersection is idle, and what is left is the honest weight-`n` eigenspace of -`massWeightPoly` on the whole algebra. That collapse is section E.2, stated for an +`massWeightPoly` on the whole algebra. That collapse is section B.2, stated for an arbitrary `IsStandardModel` whose field algebra is everything. The weight pieces and the filtration are therefore worth having on `JetAlgebra` directly, -with no mention of an `IsStandardModel` instance, and section E.3 gives them: a reader of -the classification of section F should not have to know that an instance exists. They are +with no mention of an `IsStandardModel` instance, and section B.3 gives them: a reader of +the classification of section C should not have to know that an instance exists. They are defined by the eigenvalue equation rather than as a kernel because `Polynomial JetAlgebra` carries no synthesizable `Ring` instance — the search does not close at this concrete type — so the subtraction `massWeightPoly - X ^ n` can only be written at an abstract type. -The bridges of section E.3 identify the two. +The bridges of section B.3 identify the two. -/ /-! -### E.1. The field algebra +### B.1. The field algebra -/ @@ -966,7 +146,7 @@ end JetAlgebra /-! -### E.2. The collapse of the graded pieces +### B.2. The collapse of the graded pieces -/ @@ -978,21 +158,7 @@ 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) + (h : IsStandardModel B repJet repLorentz massWeightPoly) /-- When the field algebra is everything the graded piece of mass weight `n` is the weight-`n` eigenspace of `massWeightPoly` on the whole algebra: the intersection with the @@ -1021,7 +187,7 @@ open TensorProduct Matrix MatrixGroups Lorentz /-! -### E.3. The mass-weight filtration of the jet algebra +### B.3. The mass-weight filtration of the jet algebra -/ @@ -1067,11 +233,11 @@ lemma isStandardModel_massWeightSubmoduleLE (w : ℕ) : /-! -## F. The Standard Model Lagrangian +## C. The Standard Model Lagrangian This is what the chain was built for, and the first theorem below is the headline. Take any element `x` of the jet algebra of mass weight at most eight — that is, of mass -dimension at most four; by section E that is a condition on `x` alone, and it is the only +dimension at most four; by section B that is a condition on `x` alone, and it is the only hypothesis there is. Then `x` is invariant under the jet gauge group and under the Lorentz group if and only if it is a combination of @@ -1089,7 +255,7 @@ The second theorem is the same classification with a submodule `S` set aside — operators of mass dimension above four, for a reader who wants to work modulo them. It is strictly more general and strictly less readable, which is why it comes second. It keeps its hypothesis `hScov : S ≤ covAlgebra.toSubmodule`, and that is not an oversight of the -simplification of section E. The field algebra is everything, but the covariant subalgebra +simplification of section B. The field algebra is everything, but the covariant subalgebra is not: a covariant element is fixed by the pure gauge jets, while the gauge potential picks up the Maurer–Cartan shift and so is not. `covAlgebra` therefore stays a proper subalgebra of `JetAlgebra`, and a set-aside `S` still has to be written in the covariant diff --git a/Physlib/Particles/StandardModel/JetAlgebra/TransformsIn.lean b/Physlib/Particles/StandardModel/JetAlgebra/TransformsIn.lean new file mode 100644 index 000000000..9f0c714fe --- /dev/null +++ b/Physlib/Particles/StandardModel/JetAlgebra/TransformsIn.lean @@ -0,0 +1,591 @@ +/- +Copyright (c) 2026 Joseph Tooby-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.MassWeightPoly +public import Physlib.Particles.StandardModel.JetAlgebra.FieldAlgebra +public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.TransformsIn +public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.TransformsIn +/-! +# The transformation laws of the field symbols of the jet algebra + +## i. Overview + +The thirteen families of derivative symbols of the jet algebra of the Standard Model +carry two group actions: the jet gauge action `JetAlgebra.repJetGaugeGroupI` and the +Lorentz action `JetAlgebra.repLorentzGroup`. This file establishes how each family +transforms under each of them. + +The work is mechanical but for one point, which is the content of section A. The three +sector inclusions `includeFermion`, `includeHiggs`, `includeGauge` are equivariant for the +jet gauge action and for the Lorentz action, because both actions are tensor products of +the sector actions and each sector action fixes the unit. `includeGauge` was treated when +the gauge sector was shown to be a gauge field; the other two are proved here, and with +them every transformation law of a matter symbol is its sector's own law, pushed through an +algebra map. + +These are the facts from which the transformation laws of an arbitrary Standard Model +are obtained, by pushing them along the defining algebra map out of the jet algebra. + +## ii. Key results + +- `JetAlgebra.repJetGaugeGroupI_includeHiggs`, `JetAlgebra.repLorentzGroup_includeFermion` + and their companions : the sector inclusions are equivariant. +- `JetAlgebra.transformsIn_higgsField` and its companions : the jet gauge transformation + of the thirteen families. +- `JetAlgebra.isLorentzDerivTransforms_higgsField` and its companions : the Lorentz + transformation of the thirteen families. + +## iii. Table of contents + +- A. The sector inclusions are equivariant + - A.1. The sector inclusions on pure tensors + - A.2. The unit of the gauge sector + - A.3. Equivariance for the jet gauge action + - A.4. Equivariance for the Lorentz action +- B. The jet gauge transformation of the field symbols + - B.1. The Higgs families + - B.2. The fermion families +- C. The Lorentz transformation of the field symbols + - C.1. The Higgs families + - C.2. The fermion families + +-/ + +@[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 Lorentz + +/-! + +## A. The sector inclusions are equivariant + +Both the jet gauge action and the Lorentz action on the jet algebra are tensor products of +the three sector actions. A sector inclusion puts the unit in the other two factors, so +equivariance is exactly the statement that the other two actions fix their units, which +they do — they are actions by algebra maps. + +-/ + +/-! + +### A.1. The sector inclusions on pure tensors + +-/ + +/-- The fermionic inclusion puts the unit in the Higgs and gauge factors. -/ +lemma includeFermion_apply (f : FermionJetAlgebra) : + includeFermion f = ((f ⊗ₜ[ℂ] (1 : HiggsJetAlgebra)) ⊗ₜ[ℂ] + (1 : ℂ ⊗[ℝ] GaugeJetAlgebra)) := rfl + +/-- The Higgs inclusion puts the unit in the fermionic and gauge factors. -/ +lemma includeHiggs_apply (h : HiggsJetAlgebra) : + includeHiggs h = (((1 : FermionJetAlgebra) ⊗ₜ[ℂ] h) ⊗ₜ[ℂ] + (1 : ℂ ⊗[ℝ] GaugeJetAlgebra)) := rfl + +/-! + +### A.2. The unit of the gauge sector + +-/ + +/-- The jet gauge action on the complexified gauge sector fixes the unit. -/ +lemma complexRepJetGaugeGroupI_apply_one (U : JetGaugeGroupI) : + GaugeJetAlgebra.complexRepJetGaugeGroupI U (1 : ℂ ⊗[ℝ] GaugeJetAlgebra) = 1 := by + rw [Algebra.TensorProduct.one_def, GaugeJetAlgebra.complexRepJetGaugeGroupI_tmul, + GaugeJetAlgebra.repJetGaugeGroupI_apply_one] + +/-- The Lorentz action on the complexified gauge sector fixes the unit. -/ +lemma complexRepLorentzGroup_apply_one (Λ : SL(2,ℂ)) : + GaugeJetAlgebra.complexRepLorentzGroup Λ (1 : ℂ ⊗[ℝ] GaugeJetAlgebra) = 1 := by + rw [Algebra.TensorProduct.one_def, GaugeJetAlgebra.complexRepLorentzGroup_tmul, + GaugeJetAlgebra.repLorentzGroup_apply_one] + +/-! + +### A.3. Equivariance for the jet gauge action + +-/ + +/-- The jet gauge action restricts to the fermionic sector's own action. -/ +lemma repJetGaugeGroupI_includeFermion (U : JetGaugeGroupI) (f : FermionJetAlgebra) : + repJetGaugeGroupI U (includeFermion f) + = includeFermion (FermionJetAlgebra.repJetGaugeGroupI U f) := by + rw [includeFermion_apply, repJetGaugeGroupI_tmul, + show (FermionJetAlgebra.repJetGaugeGroupI.tprod HiggsJetAlgebra.repJetGaugeGroupI) U + (f ⊗ₜ[ℂ] (1 : HiggsJetAlgebra)) + = (FermionJetAlgebra.repJetGaugeGroupI U f) ⊗ₜ[ℂ] + (HiggsJetAlgebra.repJetGaugeGroupI U (1 : HiggsJetAlgebra)) from rfl, + show HiggsJetAlgebra.repJetGaugeGroupI U (1 : HiggsJetAlgebra) = 1 from + BosonicAlgebra.repJetGaugeGroupI_apply_one _ _ U, + complexRepJetGaugeGroupI_apply_one, includeFermion_apply] + +/-- The jet gauge action restricts to the Higgs sector's own action. -/ +lemma repJetGaugeGroupI_includeHiggs (U : JetGaugeGroupI) (h : HiggsJetAlgebra) : + repJetGaugeGroupI U (includeHiggs h) + = includeHiggs (HiggsJetAlgebra.repJetGaugeGroupI U h) := by + rw [includeHiggs_apply, repJetGaugeGroupI_tmul, + show (FermionJetAlgebra.repJetGaugeGroupI.tprod HiggsJetAlgebra.repJetGaugeGroupI) U + ((1 : FermionJetAlgebra) ⊗ₜ[ℂ] h) + = (FermionJetAlgebra.repJetGaugeGroupI U (1 : FermionJetAlgebra)) ⊗ₜ[ℂ] + (HiggsJetAlgebra.repJetGaugeGroupI U h) from rfl, + show FermionJetAlgebra.repJetGaugeGroupI U (1 : FermionJetAlgebra) = 1 from + FermionicAlgebra.repJetGaugeGroupI_apply_one _ _ U, + complexRepJetGaugeGroupI_apply_one, includeHiggs_apply] + +/-! + +### A.4. Equivariance for the Lorentz action + +-/ + +/-- The Lorentz action restricts to the fermionic sector's own action. -/ +lemma repLorentzGroup_includeFermion (Λ : SL(2,ℂ)) (f : FermionJetAlgebra) : + repLorentzGroup Λ (includeFermion f) + = includeFermion (FermionJetAlgebra.repLorentzGroup Λ f) := by + rw [includeFermion_apply, repLorentzGroup_tmul, + show (FermionJetAlgebra.repLorentzGroup.tprod HiggsJetAlgebra.repLorentzGroup) Λ + (f ⊗ₜ[ℂ] (1 : HiggsJetAlgebra)) + = (FermionJetAlgebra.repLorentzGroup Λ f) ⊗ₜ[ℂ] + (HiggsJetAlgebra.repLorentzGroup Λ (1 : HiggsJetAlgebra)) from rfl, + show HiggsJetAlgebra.repLorentzGroup Λ (1 : HiggsJetAlgebra) = 1 from + BosonicAlgebra.repLorentzGroup_apply_one _ Λ, + complexRepLorentzGroup_apply_one, includeFermion_apply] + +/-- The Lorentz action restricts to the Higgs sector's own action. -/ +lemma repLorentzGroup_includeHiggs (Λ : SL(2,ℂ)) (h : HiggsJetAlgebra) : + repLorentzGroup Λ (includeHiggs h) + = includeHiggs (HiggsJetAlgebra.repLorentzGroup Λ h) := by + rw [includeHiggs_apply, repLorentzGroup_tmul, + show (FermionJetAlgebra.repLorentzGroup.tprod HiggsJetAlgebra.repLorentzGroup) Λ + ((1 : FermionJetAlgebra) ⊗ₜ[ℂ] h) + = (FermionJetAlgebra.repLorentzGroup Λ (1 : FermionJetAlgebra)) ⊗ₜ[ℂ] + (HiggsJetAlgebra.repLorentzGroup Λ h) from rfl, + show FermionJetAlgebra.repLorentzGroup Λ (1 : FermionJetAlgebra) = 1 from + FermionicAlgebra.repLorentzGroup_apply_one _ Λ, + complexRepLorentzGroup_apply_one, includeHiggs_apply] + +/-! + +## B. The jet gauge transformation of the field symbols + +`TransformsIn` asks that a jet of gauge transformations mix a derivative symbol with the +lower symbols by the all-orders Leibniz convolution of the base-point Taylor coefficients +of the gauge jet. Each sector proves that law for its own symbols; the inclusions of +section A carry it to the full algebra, and the species bridge of +`Physlib.Particles.StandardModel.Fermions.JetAlgebra.Species` moves the fermionic law from +the total target space `FermionSpace` down to the individual species. + +-/ + +/-! + +### B.1. The Higgs families + +-/ + +/-- The Higgs symbols transform in the jet gauge representation carried by the jets of the + Higgs field. -/ +theorem transformsIn_higgsField : + TransformsIn (B := JetAlgebra) repJetGaugeGroupI HiggsVec.repJetGaugeGroupI + higgsField := by + intro U φ s + rw [higgsField_eq_includeHiggs, repJetGaugeGroupI_includeHiggs, + show HiggsJetAlgebra.repJetGaugeGroupI U + (BosonicAlgebra.iteratedJetDeriv s (BosonicAlgebra.ofField φ)) + = _ from BosonicAlgebra.repJetGaugeGroupI_iteratedJetDeriv_ofField + HiggsVec.repJetGaugeGroupI HiggsVec.repJetGaugeGroupI_smul U φ s, + map_multiset_sum, Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p _ => ?_) + rw [Function.comp_apply, ← higgsField_eq_includeHiggs] + +/-- The conjugate Higgs symbols transform in the conjugate of the jet gauge representation + carried by the jets of the Higgs field. -/ +theorem transformsIn_conjHiggsField : + TransformsIn (B := JetAlgebra) repJetGaugeGroupI (repConj HiggsVec.repJetGaugeGroupI) + conjHiggsField := by + intro U φ s + rw [conjHiggsField_eq_includeHiggs, repJetGaugeGroupI_includeHiggs, + show HiggsJetAlgebra.repJetGaugeGroupI U + (BosonicAlgebra.iteratedJetDeriv s (BosonicAlgebra.ofConjField φ)) + = _ from BosonicAlgebra.repJetGaugeGroupI_iteratedJetDeriv_ofConjField + HiggsVec.repJetGaugeGroupI HiggsVec.repJetGaugeGroupI_smul U φ s, + map_multiset_sum, Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p _ => ?_) + rw [Function.comp_apply, ← conjHiggsField_eq_includeHiggs] + +/-! + +### B.2. The fermion families + +-/ + +/-- The jet gauge transformation law of a fermion species: a family of symbols obtained + from the total fermionic symbols by pulling covectors back along a projection + intertwining the two jet gauge actions transforms in the species' own representation. -/ +private lemma transformsIn_species {W : Type} [AddCommGroup W] [Module ℂ W] + (repW : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] W)) (p : FermionSpace →ₗ[ℂ] W) + (hp : ∀ U : JetGaugeGroupI, (LinearMap.lTensor JetRing p).comp + (FermionSpace.repJetGaugeGroupI U) + = (repW U).comp (LinearMap.lTensor JetRing p)) + {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ W →ₗ[ℂ] JetAlgebra} + (hF : ∀ s φ, F s φ = fermionSymbol s (Module.Dual.transpose p φ)) : + TransformsIn (B := JetAlgebra) repJetGaugeGroupI repW F := by + intro U φ s + rw [hF, fermionSymbol_eq_includeFermion, repJetGaugeGroupI_includeFermion, + show FermionJetAlgebra.repJetGaugeGroupI U + (FermionicAlgebra.iteratedJetDeriv s + (FermionicAlgebra.ofField (Module.Dual.transpose p φ))) + = _ from FermionicAlgebra.repJetGaugeGroupI_iteratedJetDeriv_ofField + FermionSpace.repJetGaugeGroupI FermionSpace.repJetGaugeGroupI_smul U _ s, + map_multiset_sum, Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun q _ => ?_) + rw [Function.comp_apply, ← fermionSymbol_eq_includeFermion, hF] + exact congrArg (fermionSymbol q.2) + (LinearMap.congr_fun (repDualCoeff_comp p hp U⁻¹ q.1) φ) + +/-- The base-point Taylor coefficients of two conjugate jet gauge actions are intertwined, + on the component-function index, by the conjugate of any map of value spaces intertwining + the unconjugated coefficients: conjugation changes neither the underlying maps nor the + real directions in which the coefficients are taken. -/ +private lemma repDualCoeff_repConj_transpose {V W : Type} [AddCommGroup V] [Module ℂ V] + [AddCommGroup W] [Module ℂ W] + {repV : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)} + {repW : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] W)} (p : V →ₗ[ℂ] W) + (hp : ∀ (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)), + p.comp (IsGaugeField.repCoeff repV U s) = (IsGaugeField.repCoeff repW U s).comp p) + (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule W)) : + IsGaugeField.repDualCoeff (repConj repV) U s + (Module.Dual.transpose (ConjModule.map p) φ) + = Module.Dual.transpose (ConjModule.map p) + (IsGaugeField.repDualCoeff (repConj repW) U s φ) := by + refine LinearMap.ext fun v => ?_ + show φ (ConjModule.map p (IsGaugeField.repCoeff (repConj repV) U s v)) + = φ (IsGaugeField.repCoeff (repConj repW) U s (ConjModule.map p v)) + rw [GaugeAlgebra.repCoeff_repConj, GaugeAlgebra.repCoeff_repConj] + exact congrArg φ (LinearMap.congr_fun (hp U s) v) + +/-- The jet gauge transformation law of the conjugate symbols of a fermion species: the law + of the species itself, read on the conjugate representations. -/ +private lemma transformsIn_conjSpecies {W : Type} [AddCommGroup W] [Module ℂ W] + (repW : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] W)) (p : FermionSpace →ₗ[ℂ] W) + (hp : ∀ U : JetGaugeGroupI, (LinearMap.lTensor JetRing p).comp + (FermionSpace.repJetGaugeGroupI U) + = (repW U).comp (LinearMap.lTensor JetRing p)) + {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule W) →ₗ[ℂ] JetAlgebra} + (hF : ∀ s φ, F s φ = conjFermionSymbol s + (Module.Dual.transpose (ConjModule.map p) φ)) : + TransformsIn (B := JetAlgebra) repJetGaugeGroupI (repConj repW) F := by + intro U φ s + rw [hF, conjFermionSymbol_eq_includeFermion, repJetGaugeGroupI_includeFermion, + show FermionJetAlgebra.repJetGaugeGroupI U + (FermionicAlgebra.iteratedJetDeriv s + (FermionicAlgebra.ofConjField (Module.Dual.transpose (ConjModule.map p) φ))) + = _ from FermionicAlgebra.repJetGaugeGroupI_iteratedJetDeriv_ofConjField + FermionSpace.repJetGaugeGroupI FermionSpace.repJetGaugeGroupI_smul U _ s, + map_multiset_sum, Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun q _ => ?_) + rw [Function.comp_apply, ← conjFermionSymbol_eq_includeFermion, hF] + exact congrArg (conjFermionSymbol q.2) + (repDualCoeff_repConj_transpose p (fun U' s' => repCoeff_comp p hp U' s') U⁻¹ q.1 φ) + + +/-- The symbols of the `i`-th generation down-type quark singlet transform in the jet gauge + representation carried by the jets of that species. -/ +theorem transformsIn_downSingletField (i : Fin 3) : + TransformsIn (B := JetAlgebra) repJetGaugeGroupI DownSinglet.repJetGaugeGroupI + (downSingletField i) := + transformsIn_species _ _ (FermionSpace.lTensor_downSingletProj_repJetGaugeGroupI i) + (downSingletField_eq_fermionSymbol i) + +/-- The conjugate symbols of the `i`-th generation down-type quark singlet transform in the + conjugate of the jet gauge representation carried by the jets of that species. -/ +theorem transformsIn_conjDownSingletField (i : Fin 3) : + TransformsIn (B := JetAlgebra) repJetGaugeGroupI + (repConj DownSinglet.repJetGaugeGroupI) (conjDownSingletField i) := + transformsIn_conjSpecies _ _ (FermionSpace.lTensor_downSingletProj_repJetGaugeGroupI i) + (conjDownSingletField_eq_conjFermionSymbol i) + + +/-- The symbols of the `i`-th generation up-type quark singlet transform in the jet gauge + representation carried by the jets of that species. -/ +theorem transformsIn_upSingletField (i : Fin 3) : + TransformsIn (B := JetAlgebra) repJetGaugeGroupI UpSinglet.repJetGaugeGroupI + (upSingletField i) := + transformsIn_species _ _ (FermionSpace.lTensor_upSingletProj_repJetGaugeGroupI i) + (upSingletField_eq_fermionSymbol i) + +/-- The conjugate symbols of the `i`-th generation up-type quark singlet transform in the + conjugate of the jet gauge representation carried by the jets of that species. -/ +theorem transformsIn_conjUpSingletField (i : Fin 3) : + TransformsIn (B := JetAlgebra) repJetGaugeGroupI + (repConj UpSinglet.repJetGaugeGroupI) (conjUpSingletField i) := + transformsIn_conjSpecies _ _ (FermionSpace.lTensor_upSingletProj_repJetGaugeGroupI i) + (conjUpSingletField_eq_conjFermionSymbol i) + + +/-- The symbols of the `i`-th generation quark doublet transform in the jet gauge + representation carried by the jets of that species. -/ +theorem transformsIn_quarkDoubletField (i : Fin 3) : + TransformsIn (B := JetAlgebra) repJetGaugeGroupI QuarkDoublet.repJetGaugeGroupI + (quarkDoubletField i) := + transformsIn_species _ _ (FermionSpace.lTensor_quarkDoubletProj_repJetGaugeGroupI i) + (quarkDoubletField_eq_fermionSymbol i) + +/-- The conjugate symbols of the `i`-th generation quark doublet transform in the + conjugate of the jet gauge representation carried by the jets of that species. -/ +theorem transformsIn_conjQuarkDoubletField (i : Fin 3) : + TransformsIn (B := JetAlgebra) repJetGaugeGroupI + (repConj QuarkDoublet.repJetGaugeGroupI) (conjQuarkDoubletField i) := + transformsIn_conjSpecies _ _ (FermionSpace.lTensor_quarkDoubletProj_repJetGaugeGroupI i) + (conjQuarkDoubletField_eq_conjFermionSymbol i) + + +/-- The symbols of the `i`-th generation lepton doublet transform in the jet gauge + representation carried by the jets of that species. -/ +theorem transformsIn_leptonDoubletField (i : Fin 3) : + TransformsIn (B := JetAlgebra) repJetGaugeGroupI LeptonDoublet.repJetGaugeGroupI + (leptonDoubletField i) := + transformsIn_species _ _ (FermionSpace.lTensor_leptonDoubletProj_repJetGaugeGroupI i) + (leptonDoubletField_eq_fermionSymbol i) + +/-- The conjugate symbols of the `i`-th generation lepton doublet transform in the + conjugate of the jet gauge representation carried by the jets of that species. -/ +theorem transformsIn_conjLeptonDoubletField (i : Fin 3) : + TransformsIn (B := JetAlgebra) repJetGaugeGroupI + (repConj LeptonDoublet.repJetGaugeGroupI) (conjLeptonDoubletField i) := + transformsIn_conjSpecies _ _ (FermionSpace.lTensor_leptonDoubletProj_repJetGaugeGroupI i) + (conjLeptonDoubletField_eq_conjFermionSymbol i) + + +/-- The symbols of the `i`-th generation charged-lepton singlet transform in the jet gauge + representation carried by the jets of that species. -/ +theorem transformsIn_leptonSingletField (i : Fin 3) : + TransformsIn (B := JetAlgebra) repJetGaugeGroupI LeptonSinglet.repJetGaugeGroupI + (leptonSingletField i) := + transformsIn_species _ _ (FermionSpace.lTensor_leptonSingletProj_repJetGaugeGroupI i) + (leptonSingletField_eq_fermionSymbol i) + +/-- The conjugate symbols of the `i`-th generation charged-lepton singlet transform in the + conjugate of the jet gauge representation carried by the jets of that species. -/ +theorem transformsIn_conjLeptonSingletField (i : Fin 3) : + TransformsIn (B := JetAlgebra) repJetGaugeGroupI + (repConj LeptonSinglet.repJetGaugeGroupI) (conjLeptonSingletField i) := + transformsIn_conjSpecies _ _ (FermionSpace.lTensor_leptonSingletProj_repJetGaugeGroupI i) + (conjLeptonSingletField_eq_conjFermionSymbol i) +/-! + +## C. The Lorentz transformation of the field symbols + +`IsLorentzDerivTransforms` asks that each derivative slot of a symbol mix into all tuples +of directions by the columns of the Lorentz matrix, while the value index transforms by the +contragredient of the species' Lorentz representation. The mixing of the slots is +`IsLorentzDeriv.rep_iteratedD_ofFn`, available because the total derivative on the jet +algebra is a Lorentz vector; what is left is the undifferentiated law at `n = 0`, which is +the equivariance of the component functions of each sector. + +-/ + +/-! + +### C.1. The Higgs families + +The Higgs is a Lorentz scalar, so its value index carries the trivial representation and +the conjugate index its conjugate. + +-/ + +/-- The Higgs symbols transform as the derivative symbols of a Lorentz scalar. -/ +theorem isLorentzDerivTransforms_higgsField : + IsLorentzDerivTransforms (A := JetAlgebra) repLorentzGroup + (Representation.trivial ℂ SL(2,ℂ) HiggsVec) higgsField := by + intro Λ n l φ + refine (Lorentz.IsLorentzDeriv.rep_iteratedD_ofFn jetDeriv_comm Λ l + (includeHiggs (BosonicAlgebra.ofField φ))).trans ?_ + refine Finset.sum_congr rfl fun p _ => ?_ + rw [repLorentzGroup_includeHiggs, + show HiggsJetAlgebra.repLorentzGroup Λ (BosonicAlgebra.ofField φ) + = BosonicAlgebra.ofField ((Representation.trivial ℂ SL(2,ℂ) HiggsVec).dual Λ φ) from + BosonicAlgebra.repLorentzGroup_ofField _ Λ φ] + rfl + +/-- The conjugate Higgs symbols transform as the derivative symbols of the conjugate of a + Lorentz scalar. -/ +theorem isLorentzDerivTransforms_conjHiggsField : + IsLorentzDerivTransforms (A := JetAlgebra) repLorentzGroup + (Representation.trivial ℂ SL(2,ℂ) HiggsVec).conj conjHiggsField := by + intro Λ n l φ + refine (Lorentz.IsLorentzDeriv.rep_iteratedD_ofFn jetDeriv_comm Λ l + (includeHiggs (BosonicAlgebra.ofConjField φ))).trans ?_ + refine Finset.sum_congr rfl fun p _ => ?_ + rw [repLorentzGroup_includeHiggs, + show HiggsJetAlgebra.repLorentzGroup Λ (BosonicAlgebra.ofConjField φ) + = BosonicAlgebra.ofConjField + ((Representation.trivial ℂ SL(2,ℂ) HiggsVec).conj.dual Λ φ) from + BosonicAlgebra.repLorentzGroup_ofConjField _ Λ φ] + rfl + +/-! + +### C.2. The fermion families + +The Lorentz action on `FermionSpace` is species-diagonal, so the contragredient action on a +covector pulled back from a species is the pullback of the species' own contragredient +action; that identity is definitional, and it is the only input the species need beyond the +law for the total fermionic symbols. + +-/ + +/-- The Lorentz transformation law of a fermion species: a family of symbols obtained from + the total fermionic symbols by pulling covectors back along a projection whose + contragredient is species-diagonal transforms in the species' own Weyl representation. -/ +private lemma isLorentzDerivTransforms_species {W : Type} [AddCommGroup W] [Module ℂ W] + (repW : Representation ℂ SL(2,ℂ) W) (p : FermionSpace →ₗ[ℂ] W) + (hdual : ∀ (Λ : SL(2,ℂ)) (φ : Module.Dual ℂ W), + FermionSpace.repLorentzGroup.dual Λ (Module.Dual.transpose p φ) + = Module.Dual.transpose p (repW.dual Λ φ)) + {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ W →ₗ[ℂ] JetAlgebra} + (hF : ∀ s φ, F s φ = fermionSymbol s (Module.Dual.transpose p φ)) : + IsLorentzDerivTransforms (A := JetAlgebra) repLorentzGroup repW F := by + intro Λ n l φ + rw [hF] + refine (Lorentz.IsLorentzDeriv.rep_iteratedD_ofFn jetDeriv_comm Λ l + (includeFermion (FermionicAlgebra.ofField (Module.Dual.transpose p φ)))).trans ?_ + refine Finset.sum_congr rfl fun q _ => ?_ + rw [repLorentzGroup_includeFermion, + show FermionJetAlgebra.repLorentzGroup Λ + (FermionicAlgebra.ofField (Module.Dual.transpose p φ)) + = FermionicAlgebra.ofField + (FermionSpace.repLorentzGroup.dual Λ (Module.Dual.transpose p φ)) from + FermionicAlgebra.repLorentzGroup_ofField _ Λ _, + hdual, hF] + rfl + +/-- The Lorentz transformation law of the conjugate symbols of a fermion species: the law + of the species itself, read on the conjugate representations. -/ +private lemma isLorentzDerivTransforms_conjSpecies {W : Type} [AddCommGroup W] + [Module ℂ W] (repW : Representation ℂ SL(2,ℂ) W) (p : FermionSpace →ₗ[ℂ] W) + (hdual : ∀ (Λ : SL(2,ℂ)) (φ : Module.Dual ℂ (ConjModule W)), + FermionSpace.repLorentzGroup.conj.dual Λ + (Module.Dual.transpose (ConjModule.map p) φ) + = Module.Dual.transpose (ConjModule.map p) (repW.conj.dual Λ φ)) + {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule W) →ₗ[ℂ] JetAlgebra} + (hF : ∀ s φ, F s φ = conjFermionSymbol s + (Module.Dual.transpose (ConjModule.map p) φ)) : + IsLorentzDerivTransforms (A := JetAlgebra) repLorentzGroup repW.conj F := by + intro Λ n l φ + rw [hF] + refine (Lorentz.IsLorentzDeriv.rep_iteratedD_ofFn jetDeriv_comm Λ l + (includeFermion (FermionicAlgebra.ofConjField + (Module.Dual.transpose (ConjModule.map p) φ)))).trans ?_ + refine Finset.sum_congr rfl fun q _ => ?_ + rw [repLorentzGroup_includeFermion, + show FermionJetAlgebra.repLorentzGroup Λ + (FermionicAlgebra.ofConjField (Module.Dual.transpose (ConjModule.map p) φ)) + = FermionicAlgebra.ofConjField (FermionSpace.repLorentzGroup.conj.dual Λ + (Module.Dual.transpose (ConjModule.map p) φ)) from + FermionicAlgebra.repLorentzGroup_ofConjField _ Λ _, + hdual, hF] + rfl + + +/-- The symbols of the `i`-th generation down-type quark singlet transform as the derivative + symbols of a Weyl spinor in that species' Lorentz representation. -/ +theorem isLorentzDerivTransforms_downSingletField (i : Fin 3) : + IsLorentzDerivTransforms (A := JetAlgebra) repLorentzGroup + DownSinglet.repLorentzGroup (downSingletField i) := + isLorentzDerivTransforms_species _ _ (fun _ _ => rfl) + (downSingletField_eq_fermionSymbol i) + +/-- The conjugate symbols of the `i`-th generation down-type quark singlet transform as the + derivative symbols of the conjugate Weyl spinor. -/ +theorem isLorentzDerivTransforms_conjDownSingletField (i : Fin 3) : + IsLorentzDerivTransforms (A := JetAlgebra) repLorentzGroup + DownSinglet.repLorentzGroup.conj (conjDownSingletField i) := + isLorentzDerivTransforms_conjSpecies _ _ (fun _ _ => rfl) + (conjDownSingletField_eq_conjFermionSymbol i) + + +/-- The symbols of the `i`-th generation up-type quark singlet transform as the derivative + symbols of a Weyl spinor in that species' Lorentz representation. -/ +theorem isLorentzDerivTransforms_upSingletField (i : Fin 3) : + IsLorentzDerivTransforms (A := JetAlgebra) repLorentzGroup + UpSinglet.repLorentzGroup (upSingletField i) := + isLorentzDerivTransforms_species _ _ (fun _ _ => rfl) + (upSingletField_eq_fermionSymbol i) + +/-- The conjugate symbols of the `i`-th generation up-type quark singlet transform as the + derivative symbols of the conjugate Weyl spinor. -/ +theorem isLorentzDerivTransforms_conjUpSingletField (i : Fin 3) : + IsLorentzDerivTransforms (A := JetAlgebra) repLorentzGroup + UpSinglet.repLorentzGroup.conj (conjUpSingletField i) := + isLorentzDerivTransforms_conjSpecies _ _ (fun _ _ => rfl) + (conjUpSingletField_eq_conjFermionSymbol i) + + +/-- The symbols of the `i`-th generation quark doublet transform as the derivative + symbols of a Weyl spinor in that species' Lorentz representation. -/ +theorem isLorentzDerivTransforms_quarkDoubletField (i : Fin 3) : + IsLorentzDerivTransforms (A := JetAlgebra) repLorentzGroup + QuarkDoublet.repLorentzGroup (quarkDoubletField i) := + isLorentzDerivTransforms_species _ _ (fun _ _ => rfl) + (quarkDoubletField_eq_fermionSymbol i) + +/-- The conjugate symbols of the `i`-th generation quark doublet transform as the + derivative symbols of the conjugate Weyl spinor. -/ +theorem isLorentzDerivTransforms_conjQuarkDoubletField (i : Fin 3) : + IsLorentzDerivTransforms (A := JetAlgebra) repLorentzGroup + QuarkDoublet.repLorentzGroup.conj (conjQuarkDoubletField i) := + isLorentzDerivTransforms_conjSpecies _ _ (fun _ _ => rfl) + (conjQuarkDoubletField_eq_conjFermionSymbol i) + + +/-- The symbols of the `i`-th generation lepton doublet transform as the derivative + symbols of a Weyl spinor in that species' Lorentz representation. -/ +theorem isLorentzDerivTransforms_leptonDoubletField (i : Fin 3) : + IsLorentzDerivTransforms (A := JetAlgebra) repLorentzGroup + LeptonDoublet.repLorentzGroup (leptonDoubletField i) := + isLorentzDerivTransforms_species _ _ (fun _ _ => rfl) + (leptonDoubletField_eq_fermionSymbol i) + +/-- The conjugate symbols of the `i`-th generation lepton doublet transform as the + derivative symbols of the conjugate Weyl spinor. -/ +theorem isLorentzDerivTransforms_conjLeptonDoubletField (i : Fin 3) : + IsLorentzDerivTransforms (A := JetAlgebra) repLorentzGroup + LeptonDoublet.repLorentzGroup.conj (conjLeptonDoubletField i) := + isLorentzDerivTransforms_conjSpecies _ _ (fun _ _ => rfl) + (conjLeptonDoubletField_eq_conjFermionSymbol i) + + +/-- The symbols of the `i`-th generation charged-lepton singlet transform as the derivative + symbols of a Weyl spinor in that species' Lorentz representation. -/ +theorem isLorentzDerivTransforms_leptonSingletField (i : Fin 3) : + IsLorentzDerivTransforms (A := JetAlgebra) repLorentzGroup + LeptonSinglet.repLorentzGroup (leptonSingletField i) := + isLorentzDerivTransforms_species _ _ (fun _ _ => rfl) + (leptonSingletField_eq_fermionSymbol i) + +/-- The conjugate symbols of the `i`-th generation charged-lepton singlet transform as the + derivative symbols of the conjugate Weyl spinor. -/ +theorem isLorentzDerivTransforms_conjLeptonSingletField (i : Fin 3) : + IsLorentzDerivTransforms (A := JetAlgebra) repLorentzGroup + LeptonSinglet.repLorentzGroup.conj (conjLeptonSingletField i) := + isLorentzDerivTransforms_conjSpecies _ _ (fun _ _ => rfl) + (conjLeptonSingletField_eq_conjFermionSymbol i) + +end JetAlgebra + +end StandardModel From 475ce5b63e3c816f1a0e5a92ea40281e82654628 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Fri, 4 Sep 2026 09:08:57 +0100 Subject: [PATCH 264/367] feat: Seperate out commutators --- Physlib.lean | 2 + .../StandardModel/IsStandardModel/Basic.lean | 3783 +---------------- .../IsStandardModel/Commutations.lean | 834 ++++ .../IsStandardModel/CovStandardModel.lean | 50 +- .../IsStandardModel/CovariantDeriv.lean | 3057 +++++++++++++ 5 files changed, 3935 insertions(+), 3791 deletions(-) create mode 100644 Physlib/Particles/StandardModel/IsStandardModel/Commutations.lean create mode 100644 Physlib/Particles/StandardModel/IsStandardModel/CovariantDeriv.lean diff --git a/Physlib.lean b/Physlib.lean index c9583e25a..73921c4ac 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -343,7 +343,9 @@ public import Physlib.Particles.StandardModel.IsHiggsSector.MassWeight.Basic public import Physlib.Particles.StandardModel.IsHiggsSector.MassWeight.GaugeWeightDecomposition public import Physlib.Particles.StandardModel.IsHiggsSector.MassWeight.MassDimEight public import Physlib.Particles.StandardModel.IsHiggsSector.MassWeight.MassDimLTEight +public import Physlib.Particles.StandardModel.IsStandardModel.Commutations public import Physlib.Particles.StandardModel.IsStandardModel.CovStandardModel +public import Physlib.Particles.StandardModel.IsStandardModel.CovariantDeriv public import Physlib.Particles.StandardModel.IsStandardModel.MassWeight.Filtration public import Physlib.Particles.StandardModel.JetAlgebra.Basic public import Physlib.Particles.StandardModel.JetAlgebra.FieldAlgebra diff --git a/Physlib/Particles/StandardModel/IsStandardModel/Basic.lean b/Physlib/Particles/StandardModel/IsStandardModel/Basic.lean index 8d1fc852f..847404aff 100644 --- a/Physlib/Particles/StandardModel/IsStandardModel/Basic.lean +++ b/Physlib/Particles/StandardModel/IsStandardModel/Basic.lean @@ -30,19 +30,16 @@ there. The thirteen families of derivative symbols are then derived: `h.A`, `h.H`, `h.barH` and the ten fermion families are the jet algebra's own families pushed along the map. Every transformation law, mass weight and commutation rule they satisfy is likewise the jet -algebra's own fact pushed along the map, and sections C to F prove them, one section per -shape of law. They carry the names they carried when they were axioms, so they are used -exactly as before. +algebra's own fact pushed along the map. Section B does that transport once for each shape +a law takes, and sections C to E prove the gauge laws, the Lorentz laws and the mass +weights, one section per shape. They carry the names they carried when they were axioms, +so they are used exactly as before. -The rest of the file is the covariant reduction. Sections G to L develop 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. Sections M onwards work -inside a Standard Model: the field algebra, the covariant derivative towers, their gauge -covariance, and the classification of jet-gauge invariants that the covariant form of the -theory consumes. +The statistics of the fields — the commutation and anticommutation laws of the thirteen +families — are proved the same way in [`Commutations.lean`](Commutations.lean). The +covariant reduction, which rests on both, is [`CovariantDeriv.lean`](CovariantDeriv.lean): +the Lorentz mixing of derivative slots, the field algebra, the covariant derivative towers, +their gauge covariance and the classification of jet-gauge invariants. ## ii. Key results @@ -51,12 +48,8 @@ theory consumes. - `IsStandardModel.A`, `IsStandardModel.H` and their companions : the thirteen families of derivative symbols of a Standard Model. - `IsStandardModel.repJet_A`, `IsStandardModel.repLorentz_H`, - `IsStandardModel.massWeight_d`, `IsStandardModel.d_anticomm_bard` and their companions : - the transformation laws, mass weights and statistics of those families. -- `IsStandardModel.fieldAlgebra` : the algebra the fields generate. -- `IsStandardModel.covDerivH` and its companions : the covariant derivative towers. -- `IsStandardModel.invariant_mem_adjoin_covDeriv` : the classification of jet-gauge - invariants of the field algebra. + `IsStandardModel.massWeight_d` and their companions : the transformation laws and mass + weights of those families. ## iii. Table of contents @@ -65,22 +58,6 @@ theory consumes. - C. The gauge transformation of the fields - D. The Lorentz transformation of the fields - E. The mass weights of the fields -- F. The statistics of the fields -- G. The Lorentz mixing of derivative slots -- H. The Leibniz convolution and the mixing operator -- I. The gauge action commutes with the Lorentz action on the value spaces -- J. The Lorentz law of the covariant matter towers -- K. The Lorentz law of the covariant field-strength tower -- L. The antisymmetry of the field strength -- M. The field algebra -- N. Covariant derivatives -- O. The algebra written in terms of covariant derivatives -- P. Gauge covariance of the covariant derivatives -- Q. The field strength and its covariant derivatives -- R. The matter covariant derivatives transform through the base point -- S. Pure gauge jets fix the matter covariant derivatives -- T. The classification of gauge invariants -- U. The Lorentz laws of the covariant matter towers -/ @@ -225,10 +202,11 @@ noncomputable def bare (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : ## B. Transporting a fact along the defining map Every law the old structure demanded as an axiom is now a theorem, proved once for the jet -algebra and transported along `toAlgHom`. The transport is the same in each of the five -shapes the laws take — a Leibniz convolution for the gauge action, a slot-mixing sum for -the Lorentz action, a monomial eigenvalue equation for the mass weights, a commutation and -an anticommutation — so each shape is done once here. +algebra and transported along `toAlgHom`. The transport is the same in each of the shapes +the laws take, so each shape is done once. The three shapes used here are a Leibniz +convolution for the gauge action, a slot-mixing sum for the Lorentz action and a monomial +eigenvalue equation for the mass weights; the anticommutation shape is transported in +[`Commutations.lean`](Commutations.lean), beside the laws that use it. -/ @@ -263,12 +241,6 @@ private lemma map_massWeight_monomial {x : JetAlgebra} {n : ℕ} massWeightPoly (h.toAlgHom x) = Polynomial.monomial n (h.toAlgHom x) := by rw [h.map_massWeight, hx, Polynomial.mapAlgHom_monomial] -/-- An anticommutation transports along the defining map: the map preserves products and - negation. -/ -private lemma map_anticomm {x y : JetAlgebra} (hxy : x * y = -(y * x)) : - h.toAlgHom x * h.toAlgHom y = -(h.toAlgHom y * h.toAlgHom x) := by - rw [← map_mul h.toAlgHom, hxy, map_neg h.toAlgHom, map_mul h.toAlgHom] - /-! ## C. The gauge transformation of the fields @@ -531,3729 +503,6 @@ lemma massWeight_bare : ∀ i (s : Multiset (Fin 1 ⊕ Fin 3)) φ, massWeightPoly (h.bare i s φ) = Polynomial.monomial (3 + 2 * Multiset.card s) (h.bare i s φ) := fun i s φ => h.map_massWeight_monomial (JetAlgebra.massWeightPoly_conjLeptonSingletField i s φ) -/-! - -## F. The statistics of the fields - -The gauge field is bosonic: its symbols commute with each other and with every matter -symbol. The Higgs symbols commute with each other and with every fermion symbol, and the -fermion symbols anticommute among themselves. Together these fix the statistics of every -symbol of the theory. - --/ - -/-- The law `A_comm_A` of a Standard Model, obtained from the corresponding law of the - jet algebra by pushing it along the defining algebra map. -/ -lemma A_comm_A : ∀ (s s' : Multiset (Fin 1 ⊕ Fin 3)) (μ μ' : Fin 1 ⊕ Fin 3) - (ψ ψ' : Module.Dual ℝ GaugeAlgebra), Commute (h.A s μ ψ) (h.A s' μ' ψ') := - fun s _ μ _ ψ _ => (JetAlgebra.gaugeField_commute s μ ψ _).map h.toAlgHom - -/-- The law `A_comm_H` of a Standard Model, obtained from the corresponding law of the - jet algebra by pushing it along the defining algebra map. -/ -lemma 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 (h.A s μ ψ) (h.H s' φ) := - fun s μ ψ _ _ => (JetAlgebra.gaugeField_commute s μ ψ _).map h.toAlgHom - -/-- The law `A_comm_barH` of a Standard Model, obtained from the corresponding law of the - jet algebra by pushing it along the defining algebra map. -/ -lemma 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 (h.A s μ ψ) (h.barH s' φ) := - fun s μ ψ _ _ => (JetAlgebra.gaugeField_commute s μ ψ _).map h.toAlgHom - -/-- The law `A_comm_d` of a Standard Model, obtained from the corresponding law of the - jet algebra by pushing it along the defining algebra map. -/ -lemma 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 (h.A s μ ψ) (h.d i s' φ) := - fun s μ ψ _ _ _ => (JetAlgebra.gaugeField_commute s μ ψ _).map h.toAlgHom - -/-- The law `A_comm_bard` of a Standard Model, obtained from the corresponding law of the - jet algebra by pushing it along the defining algebra map. -/ -lemma 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 (h.A s μ ψ) (h.bard i s' φ) := - fun s μ ψ _ _ _ => (JetAlgebra.gaugeField_commute s μ ψ _).map h.toAlgHom - -/-- The law `A_comm_u` of a Standard Model, obtained from the corresponding law of the - jet algebra by pushing it along the defining algebra map. -/ -lemma 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 (h.A s μ ψ) (h.u i s' φ) := - fun s μ ψ _ _ _ => (JetAlgebra.gaugeField_commute s μ ψ _).map h.toAlgHom - -/-- The law `A_comm_baru` of a Standard Model, obtained from the corresponding law of the - jet algebra by pushing it along the defining algebra map. -/ -lemma 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 (h.A s μ ψ) (h.baru i s' φ) := - fun s μ ψ _ _ _ => (JetAlgebra.gaugeField_commute s μ ψ _).map h.toAlgHom - -/-- The law `A_comm_Q` of a Standard Model, obtained from the corresponding law of the - jet algebra by pushing it along the defining algebra map. -/ -lemma 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 (h.A s μ ψ) (h.Q i s' φ) := - fun s μ ψ _ _ _ => (JetAlgebra.gaugeField_commute s μ ψ _).map h.toAlgHom - -/-- The law `A_comm_barQ` of a Standard Model, obtained from the corresponding law of the - jet algebra by pushing it along the defining algebra map. -/ -lemma 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 (h.A s μ ψ) (h.barQ i s' φ) := - fun s μ ψ _ _ _ => (JetAlgebra.gaugeField_commute s μ ψ _).map h.toAlgHom - -/-- The law `A_comm_L` of a Standard Model, obtained from the corresponding law of the - jet algebra by pushing it along the defining algebra map. -/ -lemma 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 (h.A s μ ψ) (h.L i s' φ) := - fun s μ ψ _ _ _ => (JetAlgebra.gaugeField_commute s μ ψ _).map h.toAlgHom - -/-- The law `A_comm_barL` of a Standard Model, obtained from the corresponding law of the - jet algebra by pushing it along the defining algebra map. -/ -lemma 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 (h.A s μ ψ) (h.barL i s' φ) := - fun s μ ψ _ _ _ => (JetAlgebra.gaugeField_commute s μ ψ _).map h.toAlgHom - -/-- The law `A_comm_e` of a Standard Model, obtained from the corresponding law of the - jet algebra by pushing it along the defining algebra map. -/ -lemma 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 (h.A s μ ψ) (h.e i s' φ) := - fun s μ ψ _ _ _ => (JetAlgebra.gaugeField_commute s μ ψ _).map h.toAlgHom - -/-- The law `A_comm_bare` of a Standard Model, obtained from the corresponding law of the - jet algebra by pushing it along the defining algebra map. -/ -lemma 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 (h.A s μ ψ) (h.bare i s' φ) := - fun s μ ψ _ _ _ => (JetAlgebra.gaugeField_commute s μ ψ _).map h.toAlgHom - -/-- The Higgs is bosonic: two Higgs symbols commute. -/ -lemma H_comm_H : ∀ (s s' : Multiset (Fin 1 ⊕ Fin 3)) (φ φ' : Module.Dual ℂ HiggsVec), - Commute (h.H s φ) (h.H s' φ') := - fun s s' φ φ' => ((JetAlgebra.memHiggsSector_higgsField s φ).commute - (JetAlgebra.memHiggsSector_higgsField s' φ')).map h.toAlgHom - -/-- A Higgs symbol commutes with a conjugate Higgs symbol. -/ -lemma H_comm_barH : ∀ (s s' : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ HiggsVec) - (φ' : Module.Dual ℂ (ConjModule HiggsVec)), - Commute (h.H s φ) (h.barH s' φ') := - fun s s' φ φ' => ((JetAlgebra.memHiggsSector_higgsField s φ).commute - (JetAlgebra.memHiggsSector_conjHiggsField s' φ')).map h.toAlgHom - -/-- Two conjugate Higgs symbols commute. -/ -lemma barH_comm_barH : ∀ (s s' : Multiset (Fin 1 ⊕ Fin 3)) (φ φ' : Module.Dual ℂ - (ConjModule HiggsVec)), - Commute (h.barH s φ) (h.barH s' φ') := - fun s s' φ φ' => ((JetAlgebra.memHiggsSector_conjHiggsField s φ).commute - (JetAlgebra.memHiggsSector_conjHiggsField s' φ')).map h.toAlgHom - -/-- The Higgs symbols commute with the down-type quark symbols: the Higgs is a boson, so it - carries no statistics against the fermions. -/ -lemma 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.H s φ) (h.d i s' φ') := - fun s φ i s' φ' => - ((JetAlgebra.memHiggsSector_higgsField s φ).commute_of_memFermionSector - (JetAlgebra.isFermionGenerator_downSingletField i s' φ').memFermionSector).map h.toAlgHom - -/-- The Higgs symbols commute with the conjugate down-type quark symbols: the Higgs is a boson, so - it carries no statistics against the fermions. -/ -lemma 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.H s φ) (h.bard i s' φ') := - fun s φ i s' φ' => - ((JetAlgebra.memHiggsSector_higgsField s φ).commute_of_memFermionSector - (JetAlgebra.isFermionGenerator_conjDownSingletField i s' φ').memFermionSector).map h.toAlgHom - -/-- The Higgs symbols commute with the up-type quark symbols: the Higgs is a boson, so it carries - no statistics against the fermions. -/ -lemma 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.H s φ) (h.u i s' φ') := - fun s φ i s' φ' => - ((JetAlgebra.memHiggsSector_higgsField s φ).commute_of_memFermionSector - (JetAlgebra.isFermionGenerator_upSingletField i s' φ').memFermionSector).map h.toAlgHom - -/-- The Higgs symbols commute with the conjugate up-type quark symbols: the Higgs is a boson, so - it carries no statistics against the fermions. -/ -lemma 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.H s φ) (h.baru i s' φ') := - fun s φ i s' φ' => - ((JetAlgebra.memHiggsSector_higgsField s φ).commute_of_memFermionSector - (JetAlgebra.isFermionGenerator_conjUpSingletField i s' φ').memFermionSector).map h.toAlgHom - -/-- The Higgs symbols commute with the quark doublet symbols: the Higgs is a boson, so it carries - no statistics against the fermions. -/ -lemma 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.H s φ) (h.Q i s' φ') := - fun s φ i s' φ' => - ((JetAlgebra.memHiggsSector_higgsField s φ).commute_of_memFermionSector - (JetAlgebra.isFermionGenerator_quarkDoubletField i s' φ').memFermionSector).map h.toAlgHom - -/-- The Higgs symbols commute with the conjugate quark doublet symbols: the Higgs is a boson, so - it carries no statistics against the fermions. -/ -lemma 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.H s φ) (h.barQ i s' φ') := - fun s φ i s' φ' => - ((JetAlgebra.memHiggsSector_higgsField s φ).commute_of_memFermionSector - (JetAlgebra.isFermionGenerator_conjQuarkDoubletField i s' φ').memFermionSector).map h.toAlgHom - -/-- The Higgs symbols commute with the lepton doublet symbols: the Higgs is a boson, so it carries - no statistics against the fermions. -/ -lemma 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.H s φ) (h.L i s' φ') := - fun s φ i s' φ' => - ((JetAlgebra.memHiggsSector_higgsField s φ).commute_of_memFermionSector - (JetAlgebra.isFermionGenerator_leptonDoubletField i s' φ').memFermionSector).map h.toAlgHom - -/-- The Higgs symbols commute with the conjugate lepton doublet symbols: the Higgs is a boson, so - it carries no statistics against the fermions. -/ -lemma 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.H s φ) (h.barL i s' φ') := - fun s φ i s' φ' => - ((JetAlgebra.memHiggsSector_higgsField s φ).commute_of_memFermionSector - (JetAlgebra.isFermionGenerator_conjLeptonDoubletField i s' φ').memFermionSector).map - h.toAlgHom - -/-- The Higgs symbols commute with the lepton singlet symbols: the Higgs is a boson, so it carries - no statistics against the fermions. -/ -lemma 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.H s φ) (h.e i s' φ') := - fun s φ i s' φ' => - ((JetAlgebra.memHiggsSector_higgsField s φ).commute_of_memFermionSector - (JetAlgebra.isFermionGenerator_leptonSingletField i s' φ').memFermionSector).map h.toAlgHom - -/-- The Higgs symbols commute with the conjugate lepton singlet symbols: the Higgs is a boson, so - it carries no statistics against the fermions. -/ -lemma 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.H s φ) (h.bare i s' φ') := - fun s φ i s' φ' => - ((JetAlgebra.memHiggsSector_higgsField s φ).commute_of_memFermionSector - (JetAlgebra.isFermionGenerator_conjLeptonSingletField i s' φ').memFermionSector).map - h.toAlgHom - -/-- The conjugate Higgs symbols commute with the down-type quark symbols: the Higgs is a boson, so - it carries no statistics against the fermions. -/ -lemma 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 (h.barH s φ) (h.d i s' φ') := - fun s φ i s' φ' => - ((JetAlgebra.memHiggsSector_conjHiggsField s φ).commute_of_memFermionSector - (JetAlgebra.isFermionGenerator_downSingletField i s' φ').memFermionSector).map h.toAlgHom - -/-- 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. -/ -lemma 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 (h.barH s φ) (h.bard i s' φ') := - fun s φ i s' φ' => - ((JetAlgebra.memHiggsSector_conjHiggsField s φ).commute_of_memFermionSector - (JetAlgebra.isFermionGenerator_conjDownSingletField i s' φ').memFermionSector).map h.toAlgHom - -/-- The conjugate Higgs symbols commute with the up-type quark symbols: the Higgs is a boson, so - it carries no statistics against the fermions. -/ -lemma 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 (h.barH s φ) (h.u i s' φ') := - fun s φ i s' φ' => - ((JetAlgebra.memHiggsSector_conjHiggsField s φ).commute_of_memFermionSector - (JetAlgebra.isFermionGenerator_upSingletField i s' φ').memFermionSector).map h.toAlgHom - -/-- 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. -/ -lemma 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 (h.barH s φ) (h.baru i s' φ') := - fun s φ i s' φ' => - ((JetAlgebra.memHiggsSector_conjHiggsField s φ).commute_of_memFermionSector - (JetAlgebra.isFermionGenerator_conjUpSingletField i s' φ').memFermionSector).map h.toAlgHom - -/-- The conjugate Higgs symbols commute with the quark doublet symbols: the Higgs is a boson, so - it carries no statistics against the fermions. -/ -lemma 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 (h.barH s φ) (h.Q i s' φ') := - fun s φ i s' φ' => - ((JetAlgebra.memHiggsSector_conjHiggsField s φ).commute_of_memFermionSector - (JetAlgebra.isFermionGenerator_quarkDoubletField i s' φ').memFermionSector).map h.toAlgHom - -/-- The conjugate Higgs symbols commute with the conjugate quark doublet symbols: the Higgs is a - boson, so it carries no statistics against the fermions. -/ -lemma 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 (h.barH s φ) (h.barQ i s' φ') := - fun s φ i s' φ' => - ((JetAlgebra.memHiggsSector_conjHiggsField s φ).commute_of_memFermionSector - (JetAlgebra.isFermionGenerator_conjQuarkDoubletField i s' φ').memFermionSector).map h.toAlgHom - -/-- The conjugate Higgs symbols commute with the lepton doublet symbols: the Higgs is a boson, so - it carries no statistics against the fermions. -/ -lemma 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 (h.barH s φ) (h.L i s' φ') := - fun s φ i s' φ' => - ((JetAlgebra.memHiggsSector_conjHiggsField s φ).commute_of_memFermionSector - (JetAlgebra.isFermionGenerator_leptonDoubletField i s' φ').memFermionSector).map h.toAlgHom - -/-- The conjugate Higgs symbols commute with the conjugate lepton doublet symbols: the Higgs is a - boson, so it carries no statistics against the fermions. -/ -lemma 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 (h.barH s φ) (h.barL i s' φ') := - fun s φ i s' φ' => - ((JetAlgebra.memHiggsSector_conjHiggsField s φ).commute_of_memFermionSector - (JetAlgebra.isFermionGenerator_conjLeptonDoubletField i s' φ').memFermionSector).map - h.toAlgHom - -/-- The conjugate Higgs symbols commute with the lepton singlet symbols: the Higgs is a boson, so - it carries no statistics against the fermions. -/ -lemma 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 (h.barH s φ) (h.e i s' φ') := - fun s φ i s' φ' => - ((JetAlgebra.memHiggsSector_conjHiggsField s φ).commute_of_memFermionSector - (JetAlgebra.isFermionGenerator_leptonSingletField i s' φ').memFermionSector).map h.toAlgHom - -/-- The conjugate Higgs symbols commute with the conjugate lepton singlet symbols: the Higgs is a - boson, so it carries no statistics against the fermions. -/ -lemma 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 (h.barH s φ) (h.bare i s' φ') := - fun s φ i s' φ' => - ((JetAlgebra.memHiggsSector_conjHiggsField s φ).commute_of_memFermionSector - (JetAlgebra.isFermionGenerator_conjLeptonSingletField i s' φ').memFermionSector).map - h.toAlgHom - -/-- The down-type quark symbols anticommute among themselves. -/ -lemma d_anticomm_d : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (φ φ' : Module.Dual ℂ DownSinglet), - h.d i s φ * h.d j s' φ' = -(h.d j s' φ' * h.d i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_downSingletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_downSingletField j s' φ')) - -/-- The down-type quark symbols anticommute with the conjugate down-type quark symbols. -/ -lemma d_anticomm_bard : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ DownSinglet) (φ' : Module.Dual ℂ (ConjModule DownSinglet)), - h.d i s φ * h.bard j s' φ' = -(h.bard j s' φ' * h.d i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_downSingletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_conjDownSingletField j s' φ')) - -/-- The down-type quark symbols anticommute with the up-type quark symbols. -/ -lemma d_anticomm_u : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ DownSinglet) - (φ' : Module.Dual ℂ UpSinglet), - h.d i s φ * h.u j s' φ' = -(h.u j s' φ' * h.d i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_downSingletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_upSingletField j s' φ')) - -/-- The down-type quark symbols anticommute with the conjugate up-type quark symbols. -/ -lemma d_anticomm_baru : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ DownSinglet) (φ' : Module.Dual ℂ (ConjModule UpSinglet)), - h.d i s φ * h.baru j s' φ' = -(h.baru j s' φ' * h.d i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_downSingletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_conjUpSingletField j s' φ')) - -/-- The down-type quark symbols anticommute with the quark doublet symbols. -/ -lemma d_anticomm_Q : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ DownSinglet) - (φ' : Module.Dual ℂ QuarkDoublet), - h.d i s φ * h.Q j s' φ' = -(h.Q j s' φ' * h.d i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_downSingletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_quarkDoubletField j s' φ')) - -/-- The down-type quark symbols anticommute with the conjugate quark doublet symbols. -/ -lemma d_anticomm_barQ : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ DownSinglet) (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)), - h.d i s φ * h.barQ j s' φ' = -(h.barQ j s' φ' * h.d i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_downSingletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_conjQuarkDoubletField j s' φ')) - -/-- The down-type quark symbols anticommute with the lepton doublet symbols. -/ -lemma d_anticomm_L : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ DownSinglet) - (φ' : Module.Dual ℂ LeptonDoublet), - h.d i s φ * h.L j s' φ' = -(h.L j s' φ' * h.d i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_downSingletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_leptonDoubletField j s' φ')) - -/-- The down-type quark symbols anticommute with the conjugate lepton doublet symbols. -/ -lemma d_anticomm_barL : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ DownSinglet) (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), - h.d i s φ * h.barL j s' φ' = -(h.barL j s' φ' * h.d i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_downSingletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_conjLeptonDoubletField j s' φ')) - -/-- The down-type quark symbols anticommute with the lepton singlet symbols. -/ -lemma d_anticomm_e : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ DownSinglet) - (φ' : Module.Dual ℂ LeptonSinglet), - h.d i s φ * h.e j s' φ' = -(h.e j s' φ' * h.d i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_downSingletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_leptonSingletField j s' φ')) - -/-- The down-type quark symbols anticommute with the conjugate lepton singlet symbols. -/ -lemma d_anticomm_bare : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ DownSinglet) (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), - h.d i s φ * h.bare j s' φ' = -(h.bare j s' φ' * h.d i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_downSingletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_conjLeptonSingletField j s' φ')) - -/-- The conjugate down-type quark symbols anticommute among themselves. -/ -lemma bard_anticomm_bard : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (φ φ' : Module.Dual ℂ (ConjModule DownSinglet)), - h.bard i s φ * h.bard j s' φ' = -(h.bard j s' φ' * h.bard i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_conjDownSingletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_conjDownSingletField j s' φ')) - -/-- The conjugate down-type quark symbols anticommute with the up-type quark symbols. -/ -lemma bard_anticomm_u : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule DownSinglet)) (φ' : Module.Dual ℂ UpSinglet), - h.bard i s φ * h.u j s' φ' = -(h.u j s' φ' * h.bard i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_conjDownSingletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_upSingletField j s' φ')) - -/-- The conjugate down-type quark symbols anticommute with the conjugate up-type quark symbols. -/ -lemma bard_anticomm_baru : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule DownSinglet)) (φ' : Module.Dual ℂ (ConjModule UpSinglet)), - h.bard i s φ * h.baru j s' φ' = -(h.baru j s' φ' * h.bard i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_conjDownSingletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_conjUpSingletField j s' φ')) - -/-- The conjugate down-type quark symbols anticommute with the quark doublet symbols. -/ -lemma bard_anticomm_Q : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule DownSinglet)) (φ' : Module.Dual ℂ QuarkDoublet), - h.bard i s φ * h.Q j s' φ' = -(h.Q j s' φ' * h.bard i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_conjDownSingletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_quarkDoubletField j s' φ')) - -/-- The conjugate down-type quark symbols anticommute with the conjugate quark doublet symbols. -/ -lemma bard_anticomm_barQ : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule DownSinglet)) (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)), - h.bard i s φ * h.barQ j s' φ' = -(h.barQ j s' φ' * h.bard i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_conjDownSingletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_conjQuarkDoubletField j s' φ')) - -/-- The conjugate down-type quark symbols anticommute with the lepton doublet symbols. -/ -lemma bard_anticomm_L : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule DownSinglet)) (φ' : Module.Dual ℂ LeptonDoublet), - h.bard i s φ * h.L j s' φ' = -(h.L j s' φ' * h.bard i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_conjDownSingletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_leptonDoubletField j s' φ')) - -/-- The conjugate down-type quark symbols anticommute with the conjugate lepton doublet symbols. - -/ -lemma bard_anticomm_barL : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule DownSinglet)) (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), - h.bard i s φ * h.barL j s' φ' = -(h.barL j s' φ' * h.bard i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_conjDownSingletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_conjLeptonDoubletField j s' φ')) - -/-- The conjugate down-type quark symbols anticommute with the lepton singlet symbols. -/ -lemma bard_anticomm_e : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule DownSinglet)) (φ' : Module.Dual ℂ LeptonSinglet), - h.bard i s φ * h.e j s' φ' = -(h.e j s' φ' * h.bard i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_conjDownSingletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_leptonSingletField j s' φ')) - -/-- The conjugate down-type quark symbols anticommute with the conjugate lepton singlet symbols. - -/ -lemma bard_anticomm_bare : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule DownSinglet)) (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), - h.bard i s φ * h.bare j s' φ' = -(h.bare j s' φ' * h.bard i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_conjDownSingletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_conjLeptonSingletField j s' φ')) - -/-- The up-type quark symbols anticommute among themselves. -/ -lemma u_anticomm_u : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (φ φ' : Module.Dual ℂ UpSinglet), - h.u i s φ * h.u j s' φ' = -(h.u j s' φ' * h.u i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_upSingletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_upSingletField j s' φ')) - -/-- The up-type quark symbols anticommute with the conjugate up-type quark symbols. -/ -lemma u_anticomm_baru : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ UpSinglet) - (φ' : Module.Dual ℂ (ConjModule UpSinglet)), - h.u i s φ * h.baru j s' φ' = -(h.baru j s' φ' * h.u i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_upSingletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_conjUpSingletField j s' φ')) - -/-- The up-type quark symbols anticommute with the quark doublet symbols. -/ -lemma u_anticomm_Q : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ UpSinglet) - (φ' : Module.Dual ℂ QuarkDoublet), - h.u i s φ * h.Q j s' φ' = -(h.Q j s' φ' * h.u i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_upSingletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_quarkDoubletField j s' φ')) - -/-- The up-type quark symbols anticommute with the conjugate quark doublet symbols. -/ -lemma u_anticomm_barQ : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ UpSinglet) - (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)), - h.u i s φ * h.barQ j s' φ' = -(h.barQ j s' φ' * h.u i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_upSingletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_conjQuarkDoubletField j s' φ')) - -/-- The up-type quark symbols anticommute with the lepton doublet symbols. -/ -lemma u_anticomm_L : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ UpSinglet) - (φ' : Module.Dual ℂ LeptonDoublet), - h.u i s φ * h.L j s' φ' = -(h.L j s' φ' * h.u i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_upSingletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_leptonDoubletField j s' φ')) - -/-- The up-type quark symbols anticommute with the conjugate lepton doublet symbols. -/ -lemma u_anticomm_barL : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ UpSinglet) - (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), - h.u i s φ * h.barL j s' φ' = -(h.barL j s' φ' * h.u i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_upSingletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_conjLeptonDoubletField j s' φ')) - -/-- The up-type quark symbols anticommute with the lepton singlet symbols. -/ -lemma u_anticomm_e : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ UpSinglet) - (φ' : Module.Dual ℂ LeptonSinglet), - h.u i s φ * h.e j s' φ' = -(h.e j s' φ' * h.u i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_upSingletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_leptonSingletField j s' φ')) - -/-- The up-type quark symbols anticommute with the conjugate lepton singlet symbols. -/ -lemma u_anticomm_bare : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ UpSinglet) - (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), - h.u i s φ * h.bare j s' φ' = -(h.bare j s' φ' * h.u i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_upSingletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_conjLeptonSingletField j s' φ')) - -/-- The conjugate up-type quark symbols anticommute among themselves. -/ -lemma baru_anticomm_baru : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (φ φ' : Module.Dual ℂ (ConjModule UpSinglet)), - h.baru i s φ * h.baru j s' φ' = -(h.baru j s' φ' * h.baru i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_conjUpSingletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_conjUpSingletField j s' φ')) - -/-- The conjugate up-type quark symbols anticommute with the quark doublet symbols. -/ -lemma baru_anticomm_Q : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule UpSinglet)) (φ' : Module.Dual ℂ QuarkDoublet), - h.baru i s φ * h.Q j s' φ' = -(h.Q j s' φ' * h.baru i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_conjUpSingletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_quarkDoubletField j s' φ')) - -/-- The conjugate up-type quark symbols anticommute with the conjugate quark doublet symbols. -/ -lemma baru_anticomm_barQ : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule UpSinglet)) (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)), - h.baru i s φ * h.barQ j s' φ' = -(h.barQ j s' φ' * h.baru i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_conjUpSingletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_conjQuarkDoubletField j s' φ')) - -/-- The conjugate up-type quark symbols anticommute with the lepton doublet symbols. -/ -lemma baru_anticomm_L : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule UpSinglet)) (φ' : Module.Dual ℂ LeptonDoublet), - h.baru i s φ * h.L j s' φ' = -(h.L j s' φ' * h.baru i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_conjUpSingletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_leptonDoubletField j s' φ')) - -/-- The conjugate up-type quark symbols anticommute with the conjugate lepton doublet symbols. -/ -lemma baru_anticomm_barL : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule UpSinglet)) (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), - h.baru i s φ * h.barL j s' φ' = -(h.barL j s' φ' * h.baru i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_conjUpSingletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_conjLeptonDoubletField j s' φ')) - -/-- The conjugate up-type quark symbols anticommute with the lepton singlet symbols. -/ -lemma baru_anticomm_e : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule UpSinglet)) (φ' : Module.Dual ℂ LeptonSinglet), - h.baru i s φ * h.e j s' φ' = -(h.e j s' φ' * h.baru i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_conjUpSingletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_leptonSingletField j s' φ')) - -/-- The conjugate up-type quark symbols anticommute with the conjugate lepton singlet symbols. -/ -lemma baru_anticomm_bare : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule UpSinglet)) (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), - h.baru i s φ * h.bare j s' φ' = -(h.bare j s' φ' * h.baru i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_conjUpSingletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_conjLeptonSingletField j s' φ')) - -/-- The quark doublet symbols anticommute among themselves. -/ -lemma Q_anticomm_Q : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (φ φ' : Module.Dual ℂ QuarkDoublet), - h.Q i s φ * h.Q j s' φ' = -(h.Q j s' φ' * h.Q i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_quarkDoubletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_quarkDoubletField j s' φ')) - -/-- The quark doublet symbols anticommute with the conjugate quark doublet symbols. -/ -lemma Q_anticomm_barQ : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ QuarkDoublet) (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)), - h.Q i s φ * h.barQ j s' φ' = -(h.barQ j s' φ' * h.Q i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_quarkDoubletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_conjQuarkDoubletField j s' φ')) - -/-- The quark doublet symbols anticommute with the lepton doublet symbols. -/ -lemma Q_anticomm_L : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ QuarkDoublet) - (φ' : Module.Dual ℂ LeptonDoublet), - h.Q i s φ * h.L j s' φ' = -(h.L j s' φ' * h.Q i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_quarkDoubletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_leptonDoubletField j s' φ')) - -/-- The quark doublet symbols anticommute with the conjugate lepton doublet symbols. -/ -lemma Q_anticomm_barL : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ QuarkDoublet) (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), - h.Q i s φ * h.barL j s' φ' = -(h.barL j s' φ' * h.Q i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_quarkDoubletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_conjLeptonDoubletField j s' φ')) - -/-- The quark doublet symbols anticommute with the lepton singlet symbols. -/ -lemma Q_anticomm_e : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ QuarkDoublet) - (φ' : Module.Dual ℂ LeptonSinglet), - h.Q i s φ * h.e j s' φ' = -(h.e j s' φ' * h.Q i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_quarkDoubletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_leptonSingletField j s' φ')) - -/-- The quark doublet symbols anticommute with the conjugate lepton singlet symbols. -/ -lemma Q_anticomm_bare : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ QuarkDoublet) (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), - h.Q i s φ * h.bare j s' φ' = -(h.bare j s' φ' * h.Q i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_quarkDoubletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_conjLeptonSingletField j s' φ')) - -/-- The conjugate quark doublet symbols anticommute among themselves. -/ -lemma barQ_anticomm_barQ : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (φ φ' : Module.Dual ℂ (ConjModule QuarkDoublet)), - h.barQ i s φ * h.barQ j s' φ' = -(h.barQ j s' φ' * h.barQ i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_conjQuarkDoubletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_conjQuarkDoubletField j s' φ')) - -/-- The conjugate quark doublet symbols anticommute with the lepton doublet symbols. -/ -lemma barQ_anticomm_L : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) (φ' : Module.Dual ℂ LeptonDoublet), - h.barQ i s φ * h.L j s' φ' = -(h.L j s' φ' * h.barQ i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_conjQuarkDoubletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_leptonDoubletField j s' φ')) - -/-- The conjugate quark doublet symbols anticommute with the conjugate lepton doublet symbols. -/ -lemma barQ_anticomm_barL : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), - h.barQ i s φ * h.barL j s' φ' = -(h.barL j s' φ' * h.barQ i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_conjQuarkDoubletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_conjLeptonDoubletField j s' φ')) - -/-- The conjugate quark doublet symbols anticommute with the lepton singlet symbols. -/ -lemma barQ_anticomm_e : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) (φ' : Module.Dual ℂ LeptonSinglet), - h.barQ i s φ * h.e j s' φ' = -(h.e j s' φ' * h.barQ i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_conjQuarkDoubletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_leptonSingletField j s' φ')) - -/-- The conjugate quark doublet symbols anticommute with the conjugate lepton singlet symbols. -/ -lemma barQ_anticomm_bare : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), - h.barQ i s φ * h.bare j s' φ' = -(h.bare j s' φ' * h.barQ i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_conjQuarkDoubletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_conjLeptonSingletField j s' φ')) - -/-- The lepton doublet symbols anticommute among themselves. -/ -lemma L_anticomm_L : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (φ φ' : Module.Dual ℂ LeptonDoublet), - h.L i s φ * h.L j s' φ' = -(h.L j s' φ' * h.L i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_leptonDoubletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_leptonDoubletField j s' φ')) - -/-- The lepton doublet symbols anticommute with the conjugate lepton doublet symbols. -/ -lemma L_anticomm_barL : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ LeptonDoublet) (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), - h.L i s φ * h.barL j s' φ' = -(h.barL j s' φ' * h.L i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_leptonDoubletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_conjLeptonDoubletField j s' φ')) - -/-- The lepton doublet symbols anticommute with the lepton singlet symbols. -/ -lemma L_anticomm_e : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ LeptonDoublet) - (φ' : Module.Dual ℂ LeptonSinglet), - h.L i s φ * h.e j s' φ' = -(h.e j s' φ' * h.L i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_leptonDoubletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_leptonSingletField j s' φ')) - -/-- The lepton doublet symbols anticommute with the conjugate lepton singlet symbols. -/ -lemma L_anticomm_bare : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ LeptonDoublet) (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), - h.L i s φ * h.bare j s' φ' = -(h.bare j s' φ' * h.L i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_leptonDoubletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_conjLeptonSingletField j s' φ')) - -/-- The conjugate lepton doublet symbols anticommute among themselves. -/ -lemma barL_anticomm_barL : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (φ φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), - h.barL i s φ * h.barL j s' φ' = -(h.barL j s' φ' * h.barL i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_conjLeptonDoubletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_conjLeptonDoubletField j s' φ')) - -/-- The conjugate lepton doublet symbols anticommute with the lepton singlet symbols. -/ -lemma barL_anticomm_e : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule LeptonDoublet)) (φ' : Module.Dual ℂ LeptonSinglet), - h.barL i s φ * h.e j s' φ' = -(h.e j s' φ' * h.barL i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_conjLeptonDoubletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_leptonSingletField j s' φ')) - -/-- The conjugate lepton doublet symbols anticommute with the conjugate lepton singlet symbols. -/ -lemma barL_anticomm_bare : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule LeptonDoublet)) (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)) - , - h.barL i s φ * h.bare j s' φ' = -(h.bare j s' φ' * h.barL i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_conjLeptonDoubletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_conjLeptonSingletField j s' φ')) - -/-- The lepton singlet symbols anticommute among themselves. -/ -lemma e_anticomm_e : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (φ φ' : Module.Dual ℂ LeptonSinglet), - h.e i s φ * h.e j s' φ' = -(h.e j s' φ' * h.e i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_leptonSingletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_leptonSingletField j s' φ')) - -/-- The lepton singlet symbols anticommute with the conjugate lepton singlet symbols. -/ -lemma e_anticomm_bare : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ LeptonSinglet) (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), - h.e i s φ * h.bare j s' φ' = -(h.bare j s' φ' * h.e i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_leptonSingletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_conjLeptonSingletField j s' φ')) - -/-- The conjugate lepton singlet symbols anticommute among themselves. -/ -lemma bare_anticomm_bare : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) - (φ φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), - h.bare i s φ * h.bare j s' φ' = -(h.bare j s' φ' * h.bare i s φ) := - fun i j s s' φ φ' => h.map_anticomm - ((JetAlgebra.isFermionGenerator_conjLeptonSingletField i s φ).anticomm - (JetAlgebra.isFermionGenerator_conjLeptonSingletField j s' φ')) - -end IsStandardModel - - -/-! - -## G. 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 - - -/-! - -## H. 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 - -/-! - -## I. 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 - -/-! - -## J. 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 - -/-! - -## K. 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 φ] - -/-! - -## L. 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 -namespace IsStandardModel - -variable {B : Type} [Ring B] [Algebra ℂ B] - {repJet : Representation ℂ JetGaugeGroupI B} - {repLorentz : Representation ℂ SL(2,ℂ) B} - {massWeightPoly : B →ₐ[ℂ] Polynomial B} - (h : IsStandardModel B repJet repLorentz massWeightPoly) - - -/-! - -## M. 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): Subalgebra ℂ B := - Algebra.adjoin ℂ - ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.A s μ)) ∪ - (⋃ (s : Multiset (Fin 1 ⊕ Fin 3)), Set.range (h.H s) ∪ Set.range (h.barH s)) ∪ - (⋃ (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)), - Set.range (h.d i s) ∪ Set.range (h.bard i s) ∪ - Set.range (h.u i s) ∪ Set.range (h.baru i s) ∪ - Set.range (h.Q i s) ∪ Set.range (h.barQ i s) ∪ - Set.range (h.L i s) ∪ Set.range (h.barL i s) ∪ - Set.range (h.e i s) ∪ Set.range (h.bare i s))) - -/-! - -## N. Covariant derivatives - --/ - -include h in -/-- The iterated covariant derivative of the down-type quarks. -/ -noncomputable def covDerivD (h : IsStandardModel B repJet repLorentz massWeightPoly) - (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : - Module.Dual ℂ DownSinglet →ₗ[ℂ] B := - IsGaugeField.covDerivIter h.A DownSinglet.gaugeAlgebraAction (h.d i) n l 0 - -/-- The iterated covariant derivative of the conjugate down-type quarks. -/ -noncomputable def covDerivBarD (h : IsStandardModel B repJet repLorentz massWeightPoly) - (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : - Module.Dual ℂ (ConjModule DownSinglet) →ₗ[ℂ] B := - IsGaugeField.covDerivIter h.A (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) - (h.bard i) n l 0 - -/-- The iterated covariant derivative of the Higgs field. -/ -noncomputable def covDerivH (h : IsStandardModel B repJet repLorentz massWeightPoly) {n : ℕ} - (l : Fin n → (Fin 1 ⊕ Fin 3)) : - Module.Dual ℂ HiggsVec →ₗ[ℂ] B := - IsGaugeField.covDerivIter h.A HiggsVec.gaugeAlgebraAction h.H n l 0 - -/-- The iterated covariant derivative of the conjugate Higgs field. -/ -noncomputable def covDerivBarH (h : IsStandardModel B repJet repLorentz massWeightPoly) {n : ℕ} - (l : Fin n → (Fin 1 ⊕ Fin 3)) : - Module.Dual ℂ (ConjModule HiggsVec) →ₗ[ℂ] B := - IsGaugeField.covDerivIter h.A (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) - h.barH n l 0 - -/-- The iterated covariant derivative of the up-type quarks. -/ -noncomputable def covDerivU (h : IsStandardModel B repJet repLorentz massWeightPoly) - (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : - Module.Dual ℂ UpSinglet →ₗ[ℂ] B := - IsGaugeField.covDerivIter h.A UpSinglet.gaugeAlgebraAction (h.u i) n l 0 - -/-- The iterated covariant derivative of the conjugate up-type quarks. -/ -noncomputable def covDerivBarU (h : IsStandardModel B repJet repLorentz massWeightPoly) - (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : - Module.Dual ℂ (ConjModule UpSinglet) →ₗ[ℂ] B := - IsGaugeField.covDerivIter h.A (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) - (h.baru i) n l 0 - -/-- The iterated covariant derivative of the quark doublets. -/ -noncomputable def covDerivQ (h : IsStandardModel B repJet repLorentz massWeightPoly) - (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : - Module.Dual ℂ QuarkDoublet →ₗ[ℂ] B := - IsGaugeField.covDerivIter h.A QuarkDoublet.gaugeAlgebraAction (h.Q i) n l 0 - -/-- The iterated covariant derivative of the conjugate quark doublets. -/ -noncomputable def covDerivBarQ (h : IsStandardModel B repJet repLorentz massWeightPoly) - (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : - Module.Dual ℂ (ConjModule QuarkDoublet) →ₗ[ℂ] B := - IsGaugeField.covDerivIter h.A (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) - (h.barQ i) n l 0 - -/-- The iterated covariant derivative of the lepton doublets. -/ -noncomputable def covDerivL (h : IsStandardModel B repJet repLorentz massWeightPoly) - (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : - Module.Dual ℂ LeptonDoublet →ₗ[ℂ] B := - IsGaugeField.covDerivIter h.A LeptonDoublet.gaugeAlgebraAction (h.L i) n l 0 - -/-- The iterated covariant derivative of the conjugate lepton doublets. -/ -noncomputable def covDerivBarL (h : IsStandardModel B repJet repLorentz massWeightPoly) - (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : - Module.Dual ℂ (ConjModule LeptonDoublet) →ₗ[ℂ] B := - IsGaugeField.covDerivIter h.A (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) - (h.barL i) n l 0 - -/-- The iterated covariant derivative of the lepton singlets. -/ -noncomputable def covDerivE (h : IsStandardModel B repJet repLorentz massWeightPoly) - (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : - Module.Dual ℂ LeptonSinglet →ₗ[ℂ] B := - IsGaugeField.covDerivIter h.A LeptonSinglet.gaugeAlgebraAction (h.e i) n l 0 - -/-- The iterated covariant derivative of the conjugate lepton singlets. -/ -noncomputable def covDerivBarE (h : IsStandardModel B repJet repLorentz massWeightPoly) - (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : - Module.Dual ℂ (ConjModule LeptonSinglet) →ₗ[ℂ] B := - IsGaugeField.covDerivIter h.A (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) - (h.bare i) n l 0 - - -/-! - -## O. 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 (h.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 - -- 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 = h.A s μ ψ} ∪ - {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (HiggsVec)), - b = h.H s φ}) = - Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (HiggsVec)), - b = IsGaugeField.covDerivIter h.A (HiggsVec.gaugeAlgebraAction) h.H n l 0 φ}) := - IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter (HiggsVec.gaugeAlgebraAction) h.H - have hATbarH : - Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule HiggsVec)), - b = h.barH s φ}) = - Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule HiggsVec)), - b = IsGaugeField.covDerivIter h.A - (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.barH n l 0 φ}) := - IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter - (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.barH - have hATd : ∀ i : Fin 3, - Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (DownSinglet)), - b = h.d i s φ}) = - Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (DownSinglet)), - b = IsGaugeField.covDerivIter h.A (DownSinglet.gaugeAlgebraAction) (h.d i) n l 0 φ}) := - fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter (DownSinglet.gaugeAlgebraAction) - (h.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 = h.A s μ ψ} ∪ - {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule DownSinglet)), - b = h.bard i s φ}) = - Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule DownSinglet)), - b = IsGaugeField.covDerivIter h.A - (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (h.bard i) n l 0 φ}) := - fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter - (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (h.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 = h.A s μ ψ} ∪ - {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (UpSinglet)), - b = h.u i s φ}) = - Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (UpSinglet)), - b = IsGaugeField.covDerivIter h.A (UpSinglet.gaugeAlgebraAction) (h.u i) n l 0 φ}) := - fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter (UpSinglet.gaugeAlgebraAction) - (h.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 = h.A s μ ψ} ∪ - {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule UpSinglet)), - b = h.baru i s φ}) = - Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule UpSinglet)), - b = IsGaugeField.covDerivIter h.A - (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (h.baru i) n l 0 φ}) := - fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter - (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (h.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 = h.A s μ ψ} ∪ - {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (QuarkDoublet)), - b = h.Q i s φ}) = - Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (QuarkDoublet)), - b = IsGaugeField.covDerivIter h.A (QuarkDoublet.gaugeAlgebraAction) (h.Q i) n l 0 φ}) := - fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter (QuarkDoublet.gaugeAlgebraAction) - (h.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 = h.A s μ ψ} ∪ - {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule QuarkDoublet)), - b = h.barQ i s φ}) = - Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule QuarkDoublet)), - b = IsGaugeField.covDerivIter h.A - (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (h.barQ i) n l 0 φ}) := - fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter - (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (h.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 = h.A s μ ψ} ∪ - {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (LeptonDoublet)), - b = h.L i s φ}) = - Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (LeptonDoublet)), - b = IsGaugeField.covDerivIter h.A (LeptonDoublet.gaugeAlgebraAction) - (h.L i) n l 0 φ}) := - fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter (LeptonDoublet.gaugeAlgebraAction) - (h.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 = h.A s μ ψ} ∪ - {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule LeptonDoublet)), - b = h.barL i s φ}) = - Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule LeptonDoublet)), - b = IsGaugeField.covDerivIter h.A - (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (h.barL i) n l 0 φ}) := - fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter - (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (h.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 = h.A s μ ψ} ∪ - {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (LeptonSinglet)), - b = h.e i s φ}) = - Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (LeptonSinglet)), - b = IsGaugeField.covDerivIter h.A (LeptonSinglet.gaugeAlgebraAction) - (h.e i) n l 0 φ}) := - fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter (LeptonSinglet.gaugeAlgebraAction) - (h.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 = h.A s μ ψ} ∪ - {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule LeptonSinglet)), - b = h.bare i s φ}) = - Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule LeptonSinglet)), - b = IsGaugeField.covDerivIter h.A - (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (h.bare i) n l 0 φ}) := - fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter - (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (h.bare i) - -- every plain matter symbol lies in the covariant algebra - have hmem_H : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (HiggsVec)), - h.H s φ ∈ Algebra.adjoin ℂ - ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.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.H s φ ∈ Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (HiggsVec)), - b = IsGaugeField.covDerivIter h.A (HiggsVec.gaugeAlgebraAction) h.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 h.A (HiggsVec.gaugeAlgebraAction) h.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)), - h.barH s φ ∈ Algebra.adjoin ℂ - ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.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.barH s φ ∈ Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule HiggsVec)), - b = IsGaugeField.covDerivIter h.A - (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.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 h.A - (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.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)), - h.d i s φ ∈ Algebra.adjoin ℂ - ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.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 : h.d i s φ ∈ Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (DownSinglet)), - b = IsGaugeField.covDerivIter h.A (DownSinglet.gaugeAlgebraAction) (h.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 - (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 h.A (DownSinglet.gaugeAlgebraAction) (h.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)), - h.bard i s φ ∈ Algebra.adjoin ℂ - ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.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 : h.bard i s φ ∈ Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule DownSinglet)), - b = IsGaugeField.covDerivIter h.A - (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (h.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 h.A - (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (h.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)), - h.u i s φ ∈ Algebra.adjoin ℂ - ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.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 : h.u i s φ ∈ Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (UpSinglet)), - b = IsGaugeField.covDerivIter h.A (UpSinglet.gaugeAlgebraAction) (h.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 h.A (UpSinglet.gaugeAlgebraAction) (h.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)), - h.baru i s φ ∈ Algebra.adjoin ℂ - ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.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 : h.baru i s φ ∈ Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule UpSinglet)), - b = IsGaugeField.covDerivIter h.A - (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (h.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 h.A - (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (h.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)), - h.Q i s φ ∈ Algebra.adjoin ℂ - ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.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 : h.Q i s φ ∈ Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (QuarkDoublet)), - b = IsGaugeField.covDerivIter h.A (QuarkDoublet.gaugeAlgebraAction) (h.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 h.A (QuarkDoublet.gaugeAlgebraAction) (h.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)), - h.barQ i s φ ∈ Algebra.adjoin ℂ - ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.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 : h.barQ i s φ ∈ Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule QuarkDoublet)), - b = IsGaugeField.covDerivIter h.A - (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (h.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 - (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 h.A - (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (h.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)), - h.L i s φ ∈ Algebra.adjoin ℂ - ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.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 : h.L i s φ ∈ Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (LeptonDoublet)), - b = IsGaugeField.covDerivIter h.A (LeptonDoublet.gaugeAlgebraAction) - (h.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 h.A (LeptonDoublet.gaugeAlgebraAction) (h.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)), - h.barL i s φ ∈ Algebra.adjoin ℂ - ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.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 : h.barL i s φ ∈ Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule LeptonDoublet)), - b = IsGaugeField.covDerivIter h.A - (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (h.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 h.A - (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (h.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)), - h.e i s φ ∈ Algebra.adjoin ℂ - ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.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 : h.e i s φ ∈ Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (LeptonSinglet)), - b = IsGaugeField.covDerivIter h.A (LeptonSinglet.gaugeAlgebraAction) - (h.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 h.A (LeptonSinglet.gaugeAlgebraAction) (h.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)), - h.bare i s φ ∈ Algebra.adjoin ℂ - ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.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 : h.bare i s φ ∈ Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule LeptonSinglet)), - b = IsGaugeField.covDerivIter h.A - (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (h.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 h.A - (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (h.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) - · 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 - 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 h.A (HiggsVec.gaugeAlgebraAction) h.H n l 0 φ - ∈ Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (HiggsVec)), b = h.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 h.A - (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.barH n l 0 φ - ∈ Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule HiggsVec)), b = h.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 h.A (DownSinglet.gaugeAlgebraAction) (h.d i) n l 0 φ - ∈ Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (DownSinglet)), b = h.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 - (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 : h.d i s' φ' ∈ Set.range (h.d i s') := ⟨φ', rfl⟩ - simp only [Set.mem_union] - tauto - · have h1 : IsGaugeField.covDerivIter h.A - (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (h.bard i) n l 0 φ - ∈ Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule DownSinglet)), b = h.bard i s φ}) := - (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 - (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 : h.bard i s' φ' ∈ Set.range (h.bard i s') := ⟨φ', rfl⟩ - simp only [Set.mem_union] - tauto - · have h1 : IsGaugeField.covDerivIter h.A (UpSinglet.gaugeAlgebraAction) (h.u i) n l 0 φ - ∈ Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (UpSinglet)), b = h.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 : h.u i s' φ' ∈ Set.range (h.u i s') := ⟨φ', rfl⟩ - simp only [Set.mem_union] - tauto - · have h1 : IsGaugeField.covDerivIter h.A - (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (h.baru i) n l 0 φ - ∈ Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule UpSinglet)), b = h.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 : h.baru i s' φ' ∈ Set.range (h.baru i s') := ⟨φ', rfl⟩ - simp only [Set.mem_union] - tauto - · have h1 : IsGaugeField.covDerivIter h.A (QuarkDoublet.gaugeAlgebraAction) (h.Q i) n l 0 φ - ∈ Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (QuarkDoublet)), b = h.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 : h.Q i s' φ' ∈ Set.range (h.Q i s') := ⟨φ', rfl⟩ - simp only [Set.mem_union] - tauto - · have h1 : IsGaugeField.covDerivIter h.A - (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (h.barQ i) n l 0 φ - ∈ Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule QuarkDoublet)), b = h.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 : h.barQ i s' φ' ∈ Set.range (h.barQ i s') := ⟨φ', rfl⟩ - simp only [Set.mem_union] - tauto - · have h1 : IsGaugeField.covDerivIter h.A (LeptonDoublet.gaugeAlgebraAction) (h.L i) n l 0 φ - ∈ Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (LeptonDoublet)), b = h.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 : h.L i s' φ' ∈ Set.range (h.L i s') := ⟨φ', rfl⟩ - simp only [Set.mem_union] - tauto - · have h1 : IsGaugeField.covDerivIter h.A - (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (h.barL i) n l 0 φ - ∈ Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule LeptonDoublet)), b = h.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 : h.barL i s' φ' ∈ Set.range (h.barL i s') := ⟨φ', rfl⟩ - simp only [Set.mem_union] - tauto - · have h1 : IsGaugeField.covDerivIter h.A (LeptonSinglet.gaugeAlgebraAction) (h.e i) n l 0 φ - ∈ Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (LeptonSinglet)), b = h.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 : h.e i s' φ' ∈ Set.range (h.e i s') := ⟨φ', rfl⟩ - simp only [Set.mem_union] - tauto - · have h1 : IsGaugeField.covDerivIter h.A - (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (h.bare i) n l 0 φ - ∈ Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule LeptonSinglet)), b = h.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 : h.bare i s' φ' ∈ Set.range (h.bare i s') := ⟨φ', rfl⟩ - simp only [Set.mem_union] - tauto - -/-! - -## P. 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 h.A (HiggsVec.gaugeAlgebraAction) h.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 h.A - (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.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 h.A (DownSinglet.gaugeAlgebraAction) (h.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 h.A (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) - (h.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 h.A (UpSinglet.gaugeAlgebraAction) (h.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 h.A (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) - (h.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 h.A (QuarkDoublet.gaugeAlgebraAction) (h.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 h.A (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) - (h.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 h.A (LeptonDoublet.gaugeAlgebraAction) (h.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 h.A (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) - (h.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 h.A (LeptonSinglet.gaugeAlgebraAction) (h.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 h.A (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) - (h.bare i) n l) := - TransformsIn.covDerivIter h.repJet_A (h.repJet_bare i) (LeptonSinglet.isInfinitesimalActionOf.conj) n l - -/-! - -## Q. 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) - (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : - Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B := - IsGaugeField.iteratedCovDerivAdjoint h.A l (IsGaugeField.fieldStrength h.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 h.A ν μ = - fun t => - IsGaugeField.fieldStrength h.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 - term. -/ -lemma transformsInAdjoint_covDerivFieldStrength (l : List (Fin 1 ⊕ Fin 3)) - (μ ν : Fin 1 ⊕ Fin 3) : - IsGaugeField.TransformsInAdjoint repJet - (IsGaugeField.iteratedCovDerivAdjoint h.A l (IsGaugeField.fieldStrength h.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 μ ν φ - -/-! - -## R. 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 - -/-! - -## S. 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 φ - -/-! - -## T. 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 (h.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.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) h.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) (h.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) (h.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) (h.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) (h.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) (h.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) (h.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) (h.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) (h.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) (h.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) (h.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 = h.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 - - -/-! - -## U. 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 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) h.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 (h.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) (h.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 (h.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) (h.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 (h.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) (h.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 (h.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) (h.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 (h.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) (h.bare i) (h.repLorentz_bare i) - end IsStandardModel end StandardModel diff --git a/Physlib/Particles/StandardModel/IsStandardModel/Commutations.lean b/Physlib/Particles/StandardModel/IsStandardModel/Commutations.lean new file mode 100644 index 000000000..3e973e3fe --- /dev/null +++ b/Physlib/Particles/StandardModel/IsStandardModel/Commutations.lean @@ -0,0 +1,834 @@ +/- +Copyright (c) 2026 Joseph Tooby-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.IsStandardModel.Basic +/-! +# The statistics of the Standard Model fields + +## i. Overview + +The thirteen families of derivative symbols of a Standard Model are the jet algebra's own +families pushed along the defining map, so their statistics are the jet algebra's own +statistics pushed along the same map. The gauge field is bosonic: its symbols commute with +each other and with every matter symbol. The Higgs symbols commute with each other and +with every fermion symbol, and the fermion symbols anticommute among themselves. Together +these fix the statistics of every symbol of the theory. + +Each law is one line: the corresponding jet algebra fact, transported. A commutation +transports by `Commute.map`, an anticommutation by the private helper `map_anticomm` at +the head of the section, which is the fourth of the transport shapes of section B of +[`Basic.lean`](Basic.lean) and is needed only here. The laws carry the names they carried +when they were axioms of `IsStandardModel`, so they are used exactly as before. + +These are the last of the laws of the bare symbols; the covariant reduction that uses them +is [`CovariantDeriv.lean`](CovariantDeriv.lean). + +## ii. Key results + +- `IsStandardModel.A_comm_A`, `IsStandardModel.A_comm_H` and their companions : the + gauge-field symbols commute with every symbol of the theory. +- `IsStandardModel.H_comm_H` and its companions : the Higgs symbols commute with each + other and with every fermion symbol. +- `IsStandardModel.d_anticomm_bard` and its companions : the fermion symbols anticommute + among themselves. + +## iii. Table of contents + +- A. The statistics of the fields + +-/ + +@[expose] public section + +set_option maxHeartbeats 4000000 +set_option synthInstance.maxHeartbeats 1000000 +set_option synthInstance.maxSize 2048 +set_option maxRecDepth 8000 + +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 : IsStandardModel B repJet repLorentz massWeightPoly) + +/-! + +## A. The statistics of the fields + +The gauge field is bosonic: its symbols commute with each other and with every matter +symbol. The Higgs symbols commute with each other and with every fermion symbol, and the +fermion symbols anticommute among themselves. Together these fix the statistics of every +symbol of the theory. + +The commutations are the jet algebra's own, pushed along `toAlgHom` by `Commute.map`. The +anticommutations need the transport helper that opens the section: the defining map +preserves products and negation, so an anticommutation in the jet algebra is one in `B`. + +-/ + +/-- An anticommutation transports along the defining map: the map preserves products and + negation. -/ +private lemma map_anticomm {x y : JetAlgebra} (hxy : x * y = -(y * x)) : + h.toAlgHom x * h.toAlgHom y = -(h.toAlgHom y * h.toAlgHom x) := by + rw [← map_mul h.toAlgHom, hxy, map_neg h.toAlgHom, map_mul h.toAlgHom] + +/-- The law `A_comm_A` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma A_comm_A : ∀ (s s' : Multiset (Fin 1 ⊕ Fin 3)) (μ μ' : Fin 1 ⊕ Fin 3) + (ψ ψ' : Module.Dual ℝ GaugeAlgebra), Commute (h.A s μ ψ) (h.A s' μ' ψ') := + fun s _ μ _ ψ _ => (JetAlgebra.gaugeField_commute s μ ψ _).map h.toAlgHom + +/-- The law `A_comm_H` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma 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 (h.A s μ ψ) (h.H s' φ) := + fun s μ ψ _ _ => (JetAlgebra.gaugeField_commute s μ ψ _).map h.toAlgHom + +/-- The law `A_comm_barH` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma 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 (h.A s μ ψ) (h.barH s' φ) := + fun s μ ψ _ _ => (JetAlgebra.gaugeField_commute s μ ψ _).map h.toAlgHom + +/-- The law `A_comm_d` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma 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 (h.A s μ ψ) (h.d i s' φ) := + fun s μ ψ _ _ _ => (JetAlgebra.gaugeField_commute s μ ψ _).map h.toAlgHom + +/-- The law `A_comm_bard` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma 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 (h.A s μ ψ) (h.bard i s' φ) := + fun s μ ψ _ _ _ => (JetAlgebra.gaugeField_commute s μ ψ _).map h.toAlgHom + +/-- The law `A_comm_u` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma 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 (h.A s μ ψ) (h.u i s' φ) := + fun s μ ψ _ _ _ => (JetAlgebra.gaugeField_commute s μ ψ _).map h.toAlgHom + +/-- The law `A_comm_baru` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma 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 (h.A s μ ψ) (h.baru i s' φ) := + fun s μ ψ _ _ _ => (JetAlgebra.gaugeField_commute s μ ψ _).map h.toAlgHom + +/-- The law `A_comm_Q` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma 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 (h.A s μ ψ) (h.Q i s' φ) := + fun s μ ψ _ _ _ => (JetAlgebra.gaugeField_commute s μ ψ _).map h.toAlgHom + +/-- The law `A_comm_barQ` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma 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 (h.A s μ ψ) (h.barQ i s' φ) := + fun s μ ψ _ _ _ => (JetAlgebra.gaugeField_commute s μ ψ _).map h.toAlgHom + +/-- The law `A_comm_L` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma 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 (h.A s μ ψ) (h.L i s' φ) := + fun s μ ψ _ _ _ => (JetAlgebra.gaugeField_commute s μ ψ _).map h.toAlgHom + +/-- The law `A_comm_barL` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma 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 (h.A s μ ψ) (h.barL i s' φ) := + fun s μ ψ _ _ _ => (JetAlgebra.gaugeField_commute s μ ψ _).map h.toAlgHom + +/-- The law `A_comm_e` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma 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 (h.A s μ ψ) (h.e i s' φ) := + fun s μ ψ _ _ _ => (JetAlgebra.gaugeField_commute s μ ψ _).map h.toAlgHom + +/-- The law `A_comm_bare` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma 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 (h.A s μ ψ) (h.bare i s' φ) := + fun s μ ψ _ _ _ => (JetAlgebra.gaugeField_commute s μ ψ _).map h.toAlgHom + +/-- The Higgs is bosonic: two Higgs symbols commute. -/ +lemma H_comm_H : ∀ (s s' : Multiset (Fin 1 ⊕ Fin 3)) (φ φ' : Module.Dual ℂ HiggsVec), + Commute (h.H s φ) (h.H s' φ') := + fun s s' φ φ' => ((JetAlgebra.memHiggsSector_higgsField s φ).commute + (JetAlgebra.memHiggsSector_higgsField s' φ')).map h.toAlgHom + +/-- A Higgs symbol commutes with a conjugate Higgs symbol. -/ +lemma H_comm_barH : ∀ (s s' : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ HiggsVec) + (φ' : Module.Dual ℂ (ConjModule HiggsVec)), + Commute (h.H s φ) (h.barH s' φ') := + fun s s' φ φ' => ((JetAlgebra.memHiggsSector_higgsField s φ).commute + (JetAlgebra.memHiggsSector_conjHiggsField s' φ')).map h.toAlgHom + +/-- Two conjugate Higgs symbols commute. -/ +lemma barH_comm_barH : ∀ (s s' : Multiset (Fin 1 ⊕ Fin 3)) (φ φ' : Module.Dual ℂ + (ConjModule HiggsVec)), + Commute (h.barH s φ) (h.barH s' φ') := + fun s s' φ φ' => ((JetAlgebra.memHiggsSector_conjHiggsField s φ).commute + (JetAlgebra.memHiggsSector_conjHiggsField s' φ')).map h.toAlgHom + +/-- The Higgs symbols commute with the down-type quark symbols: the Higgs is a boson, so it + carries no statistics against the fermions. -/ +lemma 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.H s φ) (h.d i s' φ') := + fun s φ i s' φ' => + ((JetAlgebra.memHiggsSector_higgsField s φ).commute_of_memFermionSector + (JetAlgebra.isFermionGenerator_downSingletField i s' φ').memFermionSector).map h.toAlgHom + +/-- The Higgs symbols commute with the conjugate down-type quark symbols: the Higgs is a boson, so + it carries no statistics against the fermions. -/ +lemma 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.H s φ) (h.bard i s' φ') := + fun s φ i s' φ' => + ((JetAlgebra.memHiggsSector_higgsField s φ).commute_of_memFermionSector + (JetAlgebra.isFermionGenerator_conjDownSingletField i s' φ').memFermionSector).map h.toAlgHom + +/-- The Higgs symbols commute with the up-type quark symbols: the Higgs is a boson, so it carries + no statistics against the fermions. -/ +lemma 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.H s φ) (h.u i s' φ') := + fun s φ i s' φ' => + ((JetAlgebra.memHiggsSector_higgsField s φ).commute_of_memFermionSector + (JetAlgebra.isFermionGenerator_upSingletField i s' φ').memFermionSector).map h.toAlgHom + +/-- The Higgs symbols commute with the conjugate up-type quark symbols: the Higgs is a boson, so + it carries no statistics against the fermions. -/ +lemma 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.H s φ) (h.baru i s' φ') := + fun s φ i s' φ' => + ((JetAlgebra.memHiggsSector_higgsField s φ).commute_of_memFermionSector + (JetAlgebra.isFermionGenerator_conjUpSingletField i s' φ').memFermionSector).map h.toAlgHom + +/-- The Higgs symbols commute with the quark doublet symbols: the Higgs is a boson, so it carries + no statistics against the fermions. -/ +lemma 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.H s φ) (h.Q i s' φ') := + fun s φ i s' φ' => + ((JetAlgebra.memHiggsSector_higgsField s φ).commute_of_memFermionSector + (JetAlgebra.isFermionGenerator_quarkDoubletField i s' φ').memFermionSector).map h.toAlgHom + +/-- The Higgs symbols commute with the conjugate quark doublet symbols: the Higgs is a boson, so + it carries no statistics against the fermions. -/ +lemma 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.H s φ) (h.barQ i s' φ') := + fun s φ i s' φ' => + ((JetAlgebra.memHiggsSector_higgsField s φ).commute_of_memFermionSector + (JetAlgebra.isFermionGenerator_conjQuarkDoubletField i s' φ').memFermionSector).map h.toAlgHom + +/-- The Higgs symbols commute with the lepton doublet symbols: the Higgs is a boson, so it carries + no statistics against the fermions. -/ +lemma 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.H s φ) (h.L i s' φ') := + fun s φ i s' φ' => + ((JetAlgebra.memHiggsSector_higgsField s φ).commute_of_memFermionSector + (JetAlgebra.isFermionGenerator_leptonDoubletField i s' φ').memFermionSector).map h.toAlgHom + +/-- The Higgs symbols commute with the conjugate lepton doublet symbols: the Higgs is a boson, so + it carries no statistics against the fermions. -/ +lemma 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.H s φ) (h.barL i s' φ') := + fun s φ i s' φ' => + ((JetAlgebra.memHiggsSector_higgsField s φ).commute_of_memFermionSector + (JetAlgebra.isFermionGenerator_conjLeptonDoubletField i s' φ').memFermionSector).map + h.toAlgHom + +/-- The Higgs symbols commute with the lepton singlet symbols: the Higgs is a boson, so it carries + no statistics against the fermions. -/ +lemma 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.H s φ) (h.e i s' φ') := + fun s φ i s' φ' => + ((JetAlgebra.memHiggsSector_higgsField s φ).commute_of_memFermionSector + (JetAlgebra.isFermionGenerator_leptonSingletField i s' φ').memFermionSector).map h.toAlgHom + +/-- The Higgs symbols commute with the conjugate lepton singlet symbols: the Higgs is a boson, so + it carries no statistics against the fermions. -/ +lemma 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.H s φ) (h.bare i s' φ') := + fun s φ i s' φ' => + ((JetAlgebra.memHiggsSector_higgsField s φ).commute_of_memFermionSector + (JetAlgebra.isFermionGenerator_conjLeptonSingletField i s' φ').memFermionSector).map + h.toAlgHom + +/-- The conjugate Higgs symbols commute with the down-type quark symbols: the Higgs is a boson, so + it carries no statistics against the fermions. -/ +lemma 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 (h.barH s φ) (h.d i s' φ') := + fun s φ i s' φ' => + ((JetAlgebra.memHiggsSector_conjHiggsField s φ).commute_of_memFermionSector + (JetAlgebra.isFermionGenerator_downSingletField i s' φ').memFermionSector).map h.toAlgHom + +/-- 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. -/ +lemma 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 (h.barH s φ) (h.bard i s' φ') := + fun s φ i s' φ' => + ((JetAlgebra.memHiggsSector_conjHiggsField s φ).commute_of_memFermionSector + (JetAlgebra.isFermionGenerator_conjDownSingletField i s' φ').memFermionSector).map h.toAlgHom + +/-- The conjugate Higgs symbols commute with the up-type quark symbols: the Higgs is a boson, so + it carries no statistics against the fermions. -/ +lemma 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 (h.barH s φ) (h.u i s' φ') := + fun s φ i s' φ' => + ((JetAlgebra.memHiggsSector_conjHiggsField s φ).commute_of_memFermionSector + (JetAlgebra.isFermionGenerator_upSingletField i s' φ').memFermionSector).map h.toAlgHom + +/-- 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. -/ +lemma 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 (h.barH s φ) (h.baru i s' φ') := + fun s φ i s' φ' => + ((JetAlgebra.memHiggsSector_conjHiggsField s φ).commute_of_memFermionSector + (JetAlgebra.isFermionGenerator_conjUpSingletField i s' φ').memFermionSector).map h.toAlgHom + +/-- The conjugate Higgs symbols commute with the quark doublet symbols: the Higgs is a boson, so + it carries no statistics against the fermions. -/ +lemma 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 (h.barH s φ) (h.Q i s' φ') := + fun s φ i s' φ' => + ((JetAlgebra.memHiggsSector_conjHiggsField s φ).commute_of_memFermionSector + (JetAlgebra.isFermionGenerator_quarkDoubletField i s' φ').memFermionSector).map h.toAlgHom + +/-- The conjugate Higgs symbols commute with the conjugate quark doublet symbols: the Higgs is a + boson, so it carries no statistics against the fermions. -/ +lemma 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 (h.barH s φ) (h.barQ i s' φ') := + fun s φ i s' φ' => + ((JetAlgebra.memHiggsSector_conjHiggsField s φ).commute_of_memFermionSector + (JetAlgebra.isFermionGenerator_conjQuarkDoubletField i s' φ').memFermionSector).map h.toAlgHom + +/-- The conjugate Higgs symbols commute with the lepton doublet symbols: the Higgs is a boson, so + it carries no statistics against the fermions. -/ +lemma 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 (h.barH s φ) (h.L i s' φ') := + fun s φ i s' φ' => + ((JetAlgebra.memHiggsSector_conjHiggsField s φ).commute_of_memFermionSector + (JetAlgebra.isFermionGenerator_leptonDoubletField i s' φ').memFermionSector).map h.toAlgHom + +/-- The conjugate Higgs symbols commute with the conjugate lepton doublet symbols: the Higgs is a + boson, so it carries no statistics against the fermions. -/ +lemma 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 (h.barH s φ) (h.barL i s' φ') := + fun s φ i s' φ' => + ((JetAlgebra.memHiggsSector_conjHiggsField s φ).commute_of_memFermionSector + (JetAlgebra.isFermionGenerator_conjLeptonDoubletField i s' φ').memFermionSector).map + h.toAlgHom + +/-- The conjugate Higgs symbols commute with the lepton singlet symbols: the Higgs is a boson, so + it carries no statistics against the fermions. -/ +lemma 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 (h.barH s φ) (h.e i s' φ') := + fun s φ i s' φ' => + ((JetAlgebra.memHiggsSector_conjHiggsField s φ).commute_of_memFermionSector + (JetAlgebra.isFermionGenerator_leptonSingletField i s' φ').memFermionSector).map h.toAlgHom + +/-- The conjugate Higgs symbols commute with the conjugate lepton singlet symbols: the Higgs is a + boson, so it carries no statistics against the fermions. -/ +lemma 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 (h.barH s φ) (h.bare i s' φ') := + fun s φ i s' φ' => + ((JetAlgebra.memHiggsSector_conjHiggsField s φ).commute_of_memFermionSector + (JetAlgebra.isFermionGenerator_conjLeptonSingletField i s' φ').memFermionSector).map + h.toAlgHom + +/-- The down-type quark symbols anticommute among themselves. -/ +lemma d_anticomm_d : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ φ' : Module.Dual ℂ DownSinglet), + h.d i s φ * h.d j s' φ' = -(h.d j s' φ' * h.d i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_downSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_downSingletField j s' φ')) + +/-- The down-type quark symbols anticommute with the conjugate down-type quark symbols. -/ +lemma d_anticomm_bard : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ DownSinglet) (φ' : Module.Dual ℂ (ConjModule DownSinglet)), + h.d i s φ * h.bard j s' φ' = -(h.bard j s' φ' * h.d i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_downSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjDownSingletField j s' φ')) + +/-- The down-type quark symbols anticommute with the up-type quark symbols. -/ +lemma d_anticomm_u : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ DownSinglet) + (φ' : Module.Dual ℂ UpSinglet), + h.d i s φ * h.u j s' φ' = -(h.u j s' φ' * h.d i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_downSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_upSingletField j s' φ')) + +/-- The down-type quark symbols anticommute with the conjugate up-type quark symbols. -/ +lemma d_anticomm_baru : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ DownSinglet) (φ' : Module.Dual ℂ (ConjModule UpSinglet)), + h.d i s φ * h.baru j s' φ' = -(h.baru j s' φ' * h.d i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_downSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjUpSingletField j s' φ')) + +/-- The down-type quark symbols anticommute with the quark doublet symbols. -/ +lemma d_anticomm_Q : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ DownSinglet) + (φ' : Module.Dual ℂ QuarkDoublet), + h.d i s φ * h.Q j s' φ' = -(h.Q j s' φ' * h.d i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_downSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_quarkDoubletField j s' φ')) + +/-- The down-type quark symbols anticommute with the conjugate quark doublet symbols. -/ +lemma d_anticomm_barQ : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ DownSinglet) (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)), + h.d i s φ * h.barQ j s' φ' = -(h.barQ j s' φ' * h.d i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_downSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjQuarkDoubletField j s' φ')) + +/-- The down-type quark symbols anticommute with the lepton doublet symbols. -/ +lemma d_anticomm_L : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ DownSinglet) + (φ' : Module.Dual ℂ LeptonDoublet), + h.d i s φ * h.L j s' φ' = -(h.L j s' φ' * h.d i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_downSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_leptonDoubletField j s' φ')) + +/-- The down-type quark symbols anticommute with the conjugate lepton doublet symbols. -/ +lemma d_anticomm_barL : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ DownSinglet) (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), + h.d i s φ * h.barL j s' φ' = -(h.barL j s' φ' * h.d i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_downSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjLeptonDoubletField j s' φ')) + +/-- The down-type quark symbols anticommute with the lepton singlet symbols. -/ +lemma d_anticomm_e : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ DownSinglet) + (φ' : Module.Dual ℂ LeptonSinglet), + h.d i s φ * h.e j s' φ' = -(h.e j s' φ' * h.d i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_downSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_leptonSingletField j s' φ')) + +/-- The down-type quark symbols anticommute with the conjugate lepton singlet symbols. -/ +lemma d_anticomm_bare : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ DownSinglet) (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), + h.d i s φ * h.bare j s' φ' = -(h.bare j s' φ' * h.d i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_downSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjLeptonSingletField j s' φ')) + +/-- The conjugate down-type quark symbols anticommute among themselves. -/ +lemma bard_anticomm_bard : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ φ' : Module.Dual ℂ (ConjModule DownSinglet)), + h.bard i s φ * h.bard j s' φ' = -(h.bard j s' φ' * h.bard i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_conjDownSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjDownSingletField j s' φ')) + +/-- The conjugate down-type quark symbols anticommute with the up-type quark symbols. -/ +lemma bard_anticomm_u : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule DownSinglet)) (φ' : Module.Dual ℂ UpSinglet), + h.bard i s φ * h.u j s' φ' = -(h.u j s' φ' * h.bard i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_conjDownSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_upSingletField j s' φ')) + +/-- The conjugate down-type quark symbols anticommute with the conjugate up-type quark symbols. -/ +lemma bard_anticomm_baru : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule DownSinglet)) (φ' : Module.Dual ℂ (ConjModule UpSinglet)), + h.bard i s φ * h.baru j s' φ' = -(h.baru j s' φ' * h.bard i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_conjDownSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjUpSingletField j s' φ')) + +/-- The conjugate down-type quark symbols anticommute with the quark doublet symbols. -/ +lemma bard_anticomm_Q : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule DownSinglet)) (φ' : Module.Dual ℂ QuarkDoublet), + h.bard i s φ * h.Q j s' φ' = -(h.Q j s' φ' * h.bard i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_conjDownSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_quarkDoubletField j s' φ')) + +/-- The conjugate down-type quark symbols anticommute with the conjugate quark doublet symbols. -/ +lemma bard_anticomm_barQ : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule DownSinglet)) (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)), + h.bard i s φ * h.barQ j s' φ' = -(h.barQ j s' φ' * h.bard i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_conjDownSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjQuarkDoubletField j s' φ')) + +/-- The conjugate down-type quark symbols anticommute with the lepton doublet symbols. -/ +lemma bard_anticomm_L : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule DownSinglet)) (φ' : Module.Dual ℂ LeptonDoublet), + h.bard i s φ * h.L j s' φ' = -(h.L j s' φ' * h.bard i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_conjDownSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_leptonDoubletField j s' φ')) + +/-- The conjugate down-type quark symbols anticommute with the conjugate lepton doublet symbols. + -/ +lemma bard_anticomm_barL : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule DownSinglet)) (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), + h.bard i s φ * h.barL j s' φ' = -(h.barL j s' φ' * h.bard i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_conjDownSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjLeptonDoubletField j s' φ')) + +/-- The conjugate down-type quark symbols anticommute with the lepton singlet symbols. -/ +lemma bard_anticomm_e : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule DownSinglet)) (φ' : Module.Dual ℂ LeptonSinglet), + h.bard i s φ * h.e j s' φ' = -(h.e j s' φ' * h.bard i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_conjDownSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_leptonSingletField j s' φ')) + +/-- The conjugate down-type quark symbols anticommute with the conjugate lepton singlet symbols. + -/ +lemma bard_anticomm_bare : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule DownSinglet)) (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), + h.bard i s φ * h.bare j s' φ' = -(h.bare j s' φ' * h.bard i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_conjDownSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjLeptonSingletField j s' φ')) + +/-- The up-type quark symbols anticommute among themselves. -/ +lemma u_anticomm_u : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ φ' : Module.Dual ℂ UpSinglet), + h.u i s φ * h.u j s' φ' = -(h.u j s' φ' * h.u i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_upSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_upSingletField j s' φ')) + +/-- The up-type quark symbols anticommute with the conjugate up-type quark symbols. -/ +lemma u_anticomm_baru : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ UpSinglet) + (φ' : Module.Dual ℂ (ConjModule UpSinglet)), + h.u i s φ * h.baru j s' φ' = -(h.baru j s' φ' * h.u i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_upSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjUpSingletField j s' φ')) + +/-- The up-type quark symbols anticommute with the quark doublet symbols. -/ +lemma u_anticomm_Q : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ UpSinglet) + (φ' : Module.Dual ℂ QuarkDoublet), + h.u i s φ * h.Q j s' φ' = -(h.Q j s' φ' * h.u i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_upSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_quarkDoubletField j s' φ')) + +/-- The up-type quark symbols anticommute with the conjugate quark doublet symbols. -/ +lemma u_anticomm_barQ : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ UpSinglet) + (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)), + h.u i s φ * h.barQ j s' φ' = -(h.barQ j s' φ' * h.u i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_upSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjQuarkDoubletField j s' φ')) + +/-- The up-type quark symbols anticommute with the lepton doublet symbols. -/ +lemma u_anticomm_L : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ UpSinglet) + (φ' : Module.Dual ℂ LeptonDoublet), + h.u i s φ * h.L j s' φ' = -(h.L j s' φ' * h.u i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_upSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_leptonDoubletField j s' φ')) + +/-- The up-type quark symbols anticommute with the conjugate lepton doublet symbols. -/ +lemma u_anticomm_barL : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ UpSinglet) + (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), + h.u i s φ * h.barL j s' φ' = -(h.barL j s' φ' * h.u i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_upSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjLeptonDoubletField j s' φ')) + +/-- The up-type quark symbols anticommute with the lepton singlet symbols. -/ +lemma u_anticomm_e : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ UpSinglet) + (φ' : Module.Dual ℂ LeptonSinglet), + h.u i s φ * h.e j s' φ' = -(h.e j s' φ' * h.u i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_upSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_leptonSingletField j s' φ')) + +/-- The up-type quark symbols anticommute with the conjugate lepton singlet symbols. -/ +lemma u_anticomm_bare : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ UpSinglet) + (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), + h.u i s φ * h.bare j s' φ' = -(h.bare j s' φ' * h.u i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_upSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjLeptonSingletField j s' φ')) + +/-- The conjugate up-type quark symbols anticommute among themselves. -/ +lemma baru_anticomm_baru : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ φ' : Module.Dual ℂ (ConjModule UpSinglet)), + h.baru i s φ * h.baru j s' φ' = -(h.baru j s' φ' * h.baru i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_conjUpSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjUpSingletField j s' φ')) + +/-- The conjugate up-type quark symbols anticommute with the quark doublet symbols. -/ +lemma baru_anticomm_Q : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule UpSinglet)) (φ' : Module.Dual ℂ QuarkDoublet), + h.baru i s φ * h.Q j s' φ' = -(h.Q j s' φ' * h.baru i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_conjUpSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_quarkDoubletField j s' φ')) + +/-- The conjugate up-type quark symbols anticommute with the conjugate quark doublet symbols. -/ +lemma baru_anticomm_barQ : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule UpSinglet)) (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)), + h.baru i s φ * h.barQ j s' φ' = -(h.barQ j s' φ' * h.baru i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_conjUpSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjQuarkDoubletField j s' φ')) + +/-- The conjugate up-type quark symbols anticommute with the lepton doublet symbols. -/ +lemma baru_anticomm_L : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule UpSinglet)) (φ' : Module.Dual ℂ LeptonDoublet), + h.baru i s φ * h.L j s' φ' = -(h.L j s' φ' * h.baru i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_conjUpSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_leptonDoubletField j s' φ')) + +/-- The conjugate up-type quark symbols anticommute with the conjugate lepton doublet symbols. -/ +lemma baru_anticomm_barL : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule UpSinglet)) (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), + h.baru i s φ * h.barL j s' φ' = -(h.barL j s' φ' * h.baru i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_conjUpSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjLeptonDoubletField j s' φ')) + +/-- The conjugate up-type quark symbols anticommute with the lepton singlet symbols. -/ +lemma baru_anticomm_e : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule UpSinglet)) (φ' : Module.Dual ℂ LeptonSinglet), + h.baru i s φ * h.e j s' φ' = -(h.e j s' φ' * h.baru i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_conjUpSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_leptonSingletField j s' φ')) + +/-- The conjugate up-type quark symbols anticommute with the conjugate lepton singlet symbols. -/ +lemma baru_anticomm_bare : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule UpSinglet)) (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), + h.baru i s φ * h.bare j s' φ' = -(h.bare j s' φ' * h.baru i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_conjUpSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjLeptonSingletField j s' φ')) + +/-- The quark doublet symbols anticommute among themselves. -/ +lemma Q_anticomm_Q : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ φ' : Module.Dual ℂ QuarkDoublet), + h.Q i s φ * h.Q j s' φ' = -(h.Q j s' φ' * h.Q i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_quarkDoubletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_quarkDoubletField j s' φ')) + +/-- The quark doublet symbols anticommute with the conjugate quark doublet symbols. -/ +lemma Q_anticomm_barQ : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ QuarkDoublet) (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)), + h.Q i s φ * h.barQ j s' φ' = -(h.barQ j s' φ' * h.Q i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_quarkDoubletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjQuarkDoubletField j s' φ')) + +/-- The quark doublet symbols anticommute with the lepton doublet symbols. -/ +lemma Q_anticomm_L : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ QuarkDoublet) + (φ' : Module.Dual ℂ LeptonDoublet), + h.Q i s φ * h.L j s' φ' = -(h.L j s' φ' * h.Q i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_quarkDoubletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_leptonDoubletField j s' φ')) + +/-- The quark doublet symbols anticommute with the conjugate lepton doublet symbols. -/ +lemma Q_anticomm_barL : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ QuarkDoublet) (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), + h.Q i s φ * h.barL j s' φ' = -(h.barL j s' φ' * h.Q i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_quarkDoubletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjLeptonDoubletField j s' φ')) + +/-- The quark doublet symbols anticommute with the lepton singlet symbols. -/ +lemma Q_anticomm_e : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ QuarkDoublet) + (φ' : Module.Dual ℂ LeptonSinglet), + h.Q i s φ * h.e j s' φ' = -(h.e j s' φ' * h.Q i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_quarkDoubletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_leptonSingletField j s' φ')) + +/-- The quark doublet symbols anticommute with the conjugate lepton singlet symbols. -/ +lemma Q_anticomm_bare : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ QuarkDoublet) (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), + h.Q i s φ * h.bare j s' φ' = -(h.bare j s' φ' * h.Q i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_quarkDoubletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjLeptonSingletField j s' φ')) + +/-- The conjugate quark doublet symbols anticommute among themselves. -/ +lemma barQ_anticomm_barQ : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ φ' : Module.Dual ℂ (ConjModule QuarkDoublet)), + h.barQ i s φ * h.barQ j s' φ' = -(h.barQ j s' φ' * h.barQ i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_conjQuarkDoubletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjQuarkDoubletField j s' φ')) + +/-- The conjugate quark doublet symbols anticommute with the lepton doublet symbols. -/ +lemma barQ_anticomm_L : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) (φ' : Module.Dual ℂ LeptonDoublet), + h.barQ i s φ * h.L j s' φ' = -(h.L j s' φ' * h.barQ i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_conjQuarkDoubletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_leptonDoubletField j s' φ')) + +/-- The conjugate quark doublet symbols anticommute with the conjugate lepton doublet symbols. -/ +lemma barQ_anticomm_barL : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), + h.barQ i s φ * h.barL j s' φ' = -(h.barL j s' φ' * h.barQ i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_conjQuarkDoubletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjLeptonDoubletField j s' φ')) + +/-- The conjugate quark doublet symbols anticommute with the lepton singlet symbols. -/ +lemma barQ_anticomm_e : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) (φ' : Module.Dual ℂ LeptonSinglet), + h.barQ i s φ * h.e j s' φ' = -(h.e j s' φ' * h.barQ i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_conjQuarkDoubletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_leptonSingletField j s' φ')) + +/-- The conjugate quark doublet symbols anticommute with the conjugate lepton singlet symbols. -/ +lemma barQ_anticomm_bare : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), + h.barQ i s φ * h.bare j s' φ' = -(h.bare j s' φ' * h.barQ i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_conjQuarkDoubletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjLeptonSingletField j s' φ')) + +/-- The lepton doublet symbols anticommute among themselves. -/ +lemma L_anticomm_L : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ φ' : Module.Dual ℂ LeptonDoublet), + h.L i s φ * h.L j s' φ' = -(h.L j s' φ' * h.L i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_leptonDoubletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_leptonDoubletField j s' φ')) + +/-- The lepton doublet symbols anticommute with the conjugate lepton doublet symbols. -/ +lemma L_anticomm_barL : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ LeptonDoublet) (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), + h.L i s φ * h.barL j s' φ' = -(h.barL j s' φ' * h.L i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_leptonDoubletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjLeptonDoubletField j s' φ')) + +/-- The lepton doublet symbols anticommute with the lepton singlet symbols. -/ +lemma L_anticomm_e : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ LeptonDoublet) + (φ' : Module.Dual ℂ LeptonSinglet), + h.L i s φ * h.e j s' φ' = -(h.e j s' φ' * h.L i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_leptonDoubletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_leptonSingletField j s' φ')) + +/-- The lepton doublet symbols anticommute with the conjugate lepton singlet symbols. -/ +lemma L_anticomm_bare : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ LeptonDoublet) (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), + h.L i s φ * h.bare j s' φ' = -(h.bare j s' φ' * h.L i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_leptonDoubletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjLeptonSingletField j s' φ')) + +/-- The conjugate lepton doublet symbols anticommute among themselves. -/ +lemma barL_anticomm_barL : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ φ' : Module.Dual ℂ (ConjModule LeptonDoublet)), + h.barL i s φ * h.barL j s' φ' = -(h.barL j s' φ' * h.barL i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_conjLeptonDoubletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjLeptonDoubletField j s' φ')) + +/-- The conjugate lepton doublet symbols anticommute with the lepton singlet symbols. -/ +lemma barL_anticomm_e : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule LeptonDoublet)) (φ' : Module.Dual ℂ LeptonSinglet), + h.barL i s φ * h.e j s' φ' = -(h.e j s' φ' * h.barL i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_conjLeptonDoubletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_leptonSingletField j s' φ')) + +/-- The conjugate lepton doublet symbols anticommute with the conjugate lepton singlet symbols. -/ +lemma barL_anticomm_bare : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule LeptonDoublet)) (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)) + , + h.barL i s φ * h.bare j s' φ' = -(h.bare j s' φ' * h.barL i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_conjLeptonDoubletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjLeptonSingletField j s' φ')) + +/-- The lepton singlet symbols anticommute among themselves. -/ +lemma e_anticomm_e : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ φ' : Module.Dual ℂ LeptonSinglet), + h.e i s φ * h.e j s' φ' = -(h.e j s' φ' * h.e i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_leptonSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_leptonSingletField j s' φ')) + +/-- The lepton singlet symbols anticommute with the conjugate lepton singlet symbols. -/ +lemma e_anticomm_bare : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ LeptonSinglet) (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), + h.e i s φ * h.bare j s' φ' = -(h.bare j s' φ' * h.e i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_leptonSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjLeptonSingletField j s' φ')) + +/-- The conjugate lepton singlet symbols anticommute among themselves. -/ +lemma bare_anticomm_bare : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) + (φ φ' : Module.Dual ℂ (ConjModule LeptonSinglet)), + h.bare i s φ * h.bare j s' φ' = -(h.bare j s' φ' * h.bare i s φ) := + fun i j s s' φ φ' => h.map_anticomm + ((JetAlgebra.isFermionGenerator_conjLeptonSingletField i s φ).anticomm + (JetAlgebra.isFermionGenerator_conjLeptonSingletField j s' φ')) + +end IsStandardModel + +end StandardModel diff --git a/Physlib/Particles/StandardModel/IsStandardModel/CovStandardModel.lean b/Physlib/Particles/StandardModel/IsStandardModel/CovStandardModel.lean index 17cf7b8b8..67675b4ac 100644 --- a/Physlib/Particles/StandardModel/IsStandardModel/CovStandardModel.lean +++ b/Physlib/Particles/StandardModel/IsStandardModel/CovStandardModel.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module public import Physlib.Particles.StandardModel.IsCovStandardModel.Basic -public import Physlib.Particles.StandardModel.IsStandardModel.Basic +public import Physlib.Particles.StandardModel.IsStandardModel.CovariantDeriv /-! # From the jet Standard Model to its covariant form @@ -34,7 +34,8 @@ which grades the algebra by the weight eigenspaces of `massWeightPoly` and pushe 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. Their Lorentz transformation laws -are section U of [`Basic.lean`](Basic.lean): each follows from the Lorentz law +are section O of [`CovariantDeriv.lean`](CovariantDeriv.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. @@ -84,8 +85,9 @@ it. So `isCovStandardModel` is unconditional. 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 +[`IsStandardModel/CovariantDeriv.lean`](CovariantDeriv.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), @@ -133,10 +135,10 @@ lemma repGlobal_apply (repJet : Representation ℂ JetGaugeGroupI B) (g : GaugeG ## B. The covariant generators and the covariant algebra -The covariant towers of section N and section Q 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 towers of section H and section K of `IsStandardModel.CovariantDeriv` 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. -/ @@ -216,9 +218,9 @@ lemma covGenerators_eq_covGeneratorsList : h.covGenerators = h.covGeneratorsList ## C. Pure gauge jets fix the covariant algebra -Section S 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. +Section M of `IsStandardModel.CovariantDeriv` 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. -/ @@ -238,8 +240,8 @@ lemma repJet_algebraMap (U : JetGaugeGroupI) (c : ℂ) : rw [Algebra.algebraMap_eq_smul_one, map_smul, hone] include h in -/-- Pure gauge jets fix the covariant generators: this is section S of - `IsStandardModel.Basic` together with the field-strength case of section Q. -/ +/-- Pure gauge jets fix the covariant generators: this is section M of + `IsStandardModel.CovariantDeriv` together with the field-strength case of section K. -/ 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 @@ -287,10 +289,10 @@ lemma repJet_eq_of_mem_covAlgebra_of_mem_truncationKer_zero 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 T 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. +In the other direction the classification of section N of +`IsStandardModel.CovariantDeriv` 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. -/ @@ -334,9 +336,9 @@ theorem forall_repJet_and_repLorentz_eq_iff {x : B} (hx : x ∈ h.fieldAlgebra) ## E. The covariant generators are globally equivariant -Section R 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, +Section L of `IsStandardModel.CovariantDeriv` 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`. @@ -2279,8 +2281,8 @@ lemma covBarE_anticomm_covBarE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 Everything above assembles into an `IsCovStandardModel` for the covariant towers, acted on by the global gauge group and the Lorentz group. The Lorentz laws of the -matter towers are section U of [`Basic.lean`](Basic.lean); the one for the -field-strength tower is `repLorentz_covF` just below, which is +matter towers are section O of [`CovariantDeriv.lean`](CovariantDeriv.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. @@ -2303,8 +2305,8 @@ lemma repLorentz_covF (Λ : SL(2,ℂ)) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3 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 U of - `Basic.lean`, the one of the field-strength tower is `repLorentz_covF`. -/ + `IsStandardModel`: the Lorentz laws of the matter towers are section O of + `CovariantDeriv.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) diff --git a/Physlib/Particles/StandardModel/IsStandardModel/CovariantDeriv.lean b/Physlib/Particles/StandardModel/IsStandardModel/CovariantDeriv.lean new file mode 100644 index 000000000..41ce2db3d --- /dev/null +++ b/Physlib/Particles/StandardModel/IsStandardModel/CovariantDeriv.lean @@ -0,0 +1,3057 @@ +/- +Copyright (c) 2026 Joseph Tooby-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.IsStandardModel.Commutations +/-! +# The covariant derivatives of a Standard Model + +## i. Overview + +The fields of a Standard Model are the bare derivative symbols `[∂_s A_μ^a]`, `[∂_s H^i]` +and `[∂_s ψ^α]` of [`Basic.lean`](Basic.lean), with the statistics proved in +[`Commutations.lean`](Commutations.lean). The whole jet gauge group acts on those — a +gauge transformation together with all of its derivatives at the base point — and the +transformation of a matter symbol carries an inhomogeneous term built from the gauge +field. This file replaces them by the covariant towers `∇_l H`, `∇_l ψ` and `∇_l F_{μν}`, +on which a gauge jet acts through its base point alone, and shows that nothing is lost in +the exchange: the two sets of generators generate the same algebra, and a jet-gauge +invariant of it is a polynomial in the covariant towers. + +Sections A to F are the Lorentz machinery the towers need, stated for an arbitrary +`IsGaugeField` rather than for a Standard Model. A Lorentz transformation mixes each +derivative slot of a symbol through a column of the Lorentz matrix; the bare symbols are +indexed by multisets of directions, where no ordering is available, so that mixing is +written as an operator `lorentzMix` on multiset-indexed families. It is a morphism for +the Leibniz convolution out of which the correction terms of a covariant derivative are +built, and the infinitesimal gauge action on a value space commutes with the Lorentz +action there, the two acting on different tensor factors. Together those give the Lorentz +law of `IsGaugeField.covDerivIter`, the Lorentz law of the covariant tower of the field +strength, and the antisymmetry of the field strength in its two covector indices. + +Sections G onwards work inside a Standard Model. The field algebra is the algebra +generated by every symbol of the theory; the covariant towers are the iterated covariant +derivatives of the twelve matter families and of the field strength; and +`fieldAlgebra_eq_covDeriv` says that swapping the bare matter symbols for their towers, +the gauge-field symbols being kept in both, does not change the algebra generated. The +towers are then shown to be gauge covariant, to transform through the base point of a +gauge jet alone, and to be fixed by a pure gauge jet. Those combine into +`invariant_mem_adjoin_covDeriv`: a jet-gauge invariant of the field algebra lies in the +algebra generated by the covariant towers, gauge invariance having eliminated the bare +gauge-field symbols. The last section records the Lorentz laws of the covariant matter +towers, which the covariant form of the theory consumes. + +## ii. Key results + +- `StandardModel.lorentzMix` : the Lorentz mixing operator on multiset-indexed families of + derivative symbols. +- `IsGaugeField.isLorentzCovDerivTransforms_covDerivIter` and + `IsGaugeField.repLorentz_iteratedCovDerivAdjoint` : the Lorentz laws of the covariant + matter towers and of the covariant field-strength tower. +- `IsStandardModel.fieldAlgebra` : the algebra the fields generate. +- `IsStandardModel.covDerivH`, `IsStandardModel.covDerivFieldStrength` and their + companions : the covariant derivative towers. +- `IsStandardModel.fieldAlgebra_eq_covDeriv` : the covariant towers generate the field + algebra. +- `IsStandardModel.invariant_mem_adjoin_covDeriv` : the classification of jet-gauge + invariants of the field algebra. +- `IsStandardModel.repLorentz_covDerivH` and its companions : the Lorentz laws of the + covariant matter towers. + +## iii. Table of contents + +- A. The Lorentz mixing of derivative slots +- B. The Leibniz convolution and the mixing operator +- C. The gauge action commutes with the Lorentz action on the value spaces +- D. The Lorentz law of the covariant matter towers +- E. The Lorentz law of the covariant field-strength tower +- F. The antisymmetry of the field strength +- G. The field algebra +- H. Covariant derivatives +- I. The algebra written in terms of covariant derivatives +- J. Gauge covariance of the covariant derivatives +- K. The field strength and its covariant derivatives +- L. The matter covariant derivatives transform through the base point +- M. Pure gauge jets fix the matter covariant derivatives +- N. The classification of gauge invariants +- O. The Lorentz laws of the covariant matter towers + +-/ + +@[expose] public section + +set_option maxHeartbeats 4000000 +set_option synthInstance.maxHeartbeats 1000000 +set_option synthInstance.maxSize 2048 +set_option maxRecDepth 8000 + +namespace StandardModel + +open TensorProduct Matrix MatrixGroups Lorentz + +/-! + +## A. 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 + + +/-! + +## B. 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 + +/-! + +## C. 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 + +/-! + +## D. 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 + +/-! + +## E. 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 φ] + +/-! + +## F. 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 +namespace IsStandardModel + +variable {B : Type} [Ring B] [Algebra ℂ B] + {repJet : Representation ℂ JetGaugeGroupI B} + {repLorentz : Representation ℂ SL(2,ℂ) B} + {massWeightPoly : B →ₐ[ℂ] Polynomial B} + (h : IsStandardModel B repJet repLorentz massWeightPoly) + + +/-! + +## G. 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): Subalgebra ℂ B := + Algebra.adjoin ℂ + ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.A s μ)) ∪ + (⋃ (s : Multiset (Fin 1 ⊕ Fin 3)), Set.range (h.H s) ∪ Set.range (h.barH s)) ∪ + (⋃ (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)), + Set.range (h.d i s) ∪ Set.range (h.bard i s) ∪ + Set.range (h.u i s) ∪ Set.range (h.baru i s) ∪ + Set.range (h.Q i s) ∪ Set.range (h.barQ i s) ∪ + Set.range (h.L i s) ∪ Set.range (h.barL i s) ∪ + Set.range (h.e i s) ∪ Set.range (h.bare i s))) + +/-! + +## H. Covariant derivatives + +-/ + +include h in +/-- The iterated covariant derivative of the down-type quarks. -/ +noncomputable def covDerivD (h : IsStandardModel B repJet repLorentz massWeightPoly) + (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ DownSinglet →ₗ[ℂ] B := + IsGaugeField.covDerivIter h.A DownSinglet.gaugeAlgebraAction (h.d i) n l 0 + +/-- The iterated covariant derivative of the conjugate down-type quarks. -/ +noncomputable def covDerivBarD (h : IsStandardModel B repJet repLorentz massWeightPoly) + (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (ConjModule DownSinglet) →ₗ[ℂ] B := + IsGaugeField.covDerivIter h.A (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) + (h.bard i) n l 0 + +/-- The iterated covariant derivative of the Higgs field. -/ +noncomputable def covDerivH (h : IsStandardModel B repJet repLorentz massWeightPoly) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ HiggsVec →ₗ[ℂ] B := + IsGaugeField.covDerivIter h.A HiggsVec.gaugeAlgebraAction h.H n l 0 + +/-- The iterated covariant derivative of the conjugate Higgs field. -/ +noncomputable def covDerivBarH (h : IsStandardModel B repJet repLorentz massWeightPoly) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (ConjModule HiggsVec) →ₗ[ℂ] B := + IsGaugeField.covDerivIter h.A (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) + h.barH n l 0 + +/-- The iterated covariant derivative of the up-type quarks. -/ +noncomputable def covDerivU (h : IsStandardModel B repJet repLorentz massWeightPoly) + (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ UpSinglet →ₗ[ℂ] B := + IsGaugeField.covDerivIter h.A UpSinglet.gaugeAlgebraAction (h.u i) n l 0 + +/-- The iterated covariant derivative of the conjugate up-type quarks. -/ +noncomputable def covDerivBarU (h : IsStandardModel B repJet repLorentz massWeightPoly) + (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (ConjModule UpSinglet) →ₗ[ℂ] B := + IsGaugeField.covDerivIter h.A (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) + (h.baru i) n l 0 + +/-- The iterated covariant derivative of the quark doublets. -/ +noncomputable def covDerivQ (h : IsStandardModel B repJet repLorentz massWeightPoly) + (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ QuarkDoublet →ₗ[ℂ] B := + IsGaugeField.covDerivIter h.A QuarkDoublet.gaugeAlgebraAction (h.Q i) n l 0 + +/-- The iterated covariant derivative of the conjugate quark doublets. -/ +noncomputable def covDerivBarQ (h : IsStandardModel B repJet repLorentz massWeightPoly) + (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (ConjModule QuarkDoublet) →ₗ[ℂ] B := + IsGaugeField.covDerivIter h.A (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) + (h.barQ i) n l 0 + +/-- The iterated covariant derivative of the lepton doublets. -/ +noncomputable def covDerivL (h : IsStandardModel B repJet repLorentz massWeightPoly) + (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ LeptonDoublet →ₗ[ℂ] B := + IsGaugeField.covDerivIter h.A LeptonDoublet.gaugeAlgebraAction (h.L i) n l 0 + +/-- The iterated covariant derivative of the conjugate lepton doublets. -/ +noncomputable def covDerivBarL (h : IsStandardModel B repJet repLorentz massWeightPoly) + (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (ConjModule LeptonDoublet) →ₗ[ℂ] B := + IsGaugeField.covDerivIter h.A (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) + (h.barL i) n l 0 + +/-- The iterated covariant derivative of the lepton singlets. -/ +noncomputable def covDerivE (h : IsStandardModel B repJet repLorentz massWeightPoly) + (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ LeptonSinglet →ₗ[ℂ] B := + IsGaugeField.covDerivIter h.A LeptonSinglet.gaugeAlgebraAction (h.e i) n l 0 + +/-- The iterated covariant derivative of the conjugate lepton singlets. -/ +noncomputable def covDerivBarE (h : IsStandardModel B repJet repLorentz massWeightPoly) + (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (ConjModule LeptonSinglet) →ₗ[ℂ] B := + IsGaugeField.covDerivIter h.A (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) + (h.bare i) n l 0 + + +/-! + +## I. 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 (h.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 + -- 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 = h.A s μ ψ} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (HiggsVec)), + b = h.H s φ}) = + Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ + {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (HiggsVec)), + b = IsGaugeField.covDerivIter h.A (HiggsVec.gaugeAlgebraAction) h.H n l 0 φ}) := + IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter (HiggsVec.gaugeAlgebraAction) h.H + have hATbarH : + Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule HiggsVec)), + b = h.barH s φ}) = + Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ + {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule HiggsVec)), + b = IsGaugeField.covDerivIter h.A + (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.barH n l 0 φ}) := + IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter + (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.barH + have hATd : ∀ i : Fin 3, + Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (DownSinglet)), + b = h.d i s φ}) = + Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ + {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (DownSinglet)), + b = IsGaugeField.covDerivIter h.A (DownSinglet.gaugeAlgebraAction) (h.d i) n l 0 φ}) := + fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter (DownSinglet.gaugeAlgebraAction) + (h.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 = h.A s μ ψ} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule DownSinglet)), + b = h.bard i s φ}) = + Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ + {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule DownSinglet)), + b = IsGaugeField.covDerivIter h.A + (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (h.bard i) n l 0 φ}) := + fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter + (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (h.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 = h.A s μ ψ} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (UpSinglet)), + b = h.u i s φ}) = + Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ + {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (UpSinglet)), + b = IsGaugeField.covDerivIter h.A (UpSinglet.gaugeAlgebraAction) (h.u i) n l 0 φ}) := + fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter (UpSinglet.gaugeAlgebraAction) + (h.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 = h.A s μ ψ} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule UpSinglet)), + b = h.baru i s φ}) = + Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ + {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule UpSinglet)), + b = IsGaugeField.covDerivIter h.A + (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (h.baru i) n l 0 φ}) := + fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter + (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (h.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 = h.A s μ ψ} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (QuarkDoublet)), + b = h.Q i s φ}) = + Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ + {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (QuarkDoublet)), + b = IsGaugeField.covDerivIter h.A (QuarkDoublet.gaugeAlgebraAction) (h.Q i) n l 0 φ}) := + fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter (QuarkDoublet.gaugeAlgebraAction) + (h.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 = h.A s μ ψ} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule QuarkDoublet)), + b = h.barQ i s φ}) = + Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ + {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule QuarkDoublet)), + b = IsGaugeField.covDerivIter h.A + (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (h.barQ i) n l 0 φ}) := + fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter + (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (h.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 = h.A s μ ψ} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (LeptonDoublet)), + b = h.L i s φ}) = + Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ + {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (LeptonDoublet)), + b = IsGaugeField.covDerivIter h.A (LeptonDoublet.gaugeAlgebraAction) + (h.L i) n l 0 φ}) := + fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter (LeptonDoublet.gaugeAlgebraAction) + (h.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 = h.A s μ ψ} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule LeptonDoublet)), + b = h.barL i s φ}) = + Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ + {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule LeptonDoublet)), + b = IsGaugeField.covDerivIter h.A + (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (h.barL i) n l 0 φ}) := + fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter + (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (h.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 = h.A s μ ψ} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (LeptonSinglet)), + b = h.e i s φ}) = + Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ + {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (LeptonSinglet)), + b = IsGaugeField.covDerivIter h.A (LeptonSinglet.gaugeAlgebraAction) + (h.e i) n l 0 φ}) := + fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter (LeptonSinglet.gaugeAlgebraAction) + (h.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 = h.A s μ ψ} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule LeptonSinglet)), + b = h.bare i s φ}) = + Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ + {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule LeptonSinglet)), + b = IsGaugeField.covDerivIter h.A + (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (h.bare i) n l 0 φ}) := + fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter + (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (h.bare i) + -- every plain matter symbol lies in the covariant algebra + have hmem_H : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (HiggsVec)), + h.H s φ ∈ Algebra.adjoin ℂ + ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.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.H s φ ∈ Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ + {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (HiggsVec)), + b = IsGaugeField.covDerivIter h.A (HiggsVec.gaugeAlgebraAction) h.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 h.A (HiggsVec.gaugeAlgebraAction) h.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)), + h.barH s φ ∈ Algebra.adjoin ℂ + ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.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.barH s φ ∈ Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ + {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule HiggsVec)), + b = IsGaugeField.covDerivIter h.A + (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.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 h.A + (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.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)), + h.d i s φ ∈ Algebra.adjoin ℂ + ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.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 : h.d i s φ ∈ Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ + {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (DownSinglet)), + b = IsGaugeField.covDerivIter h.A (DownSinglet.gaugeAlgebraAction) (h.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 + (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 h.A (DownSinglet.gaugeAlgebraAction) (h.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)), + h.bard i s φ ∈ Algebra.adjoin ℂ + ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.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 : h.bard i s φ ∈ Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ + {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule DownSinglet)), + b = IsGaugeField.covDerivIter h.A + (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (h.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 h.A + (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (h.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)), + h.u i s φ ∈ Algebra.adjoin ℂ + ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.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 : h.u i s φ ∈ Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ + {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (UpSinglet)), + b = IsGaugeField.covDerivIter h.A (UpSinglet.gaugeAlgebraAction) (h.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 h.A (UpSinglet.gaugeAlgebraAction) (h.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)), + h.baru i s φ ∈ Algebra.adjoin ℂ + ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.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 : h.baru i s φ ∈ Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ + {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule UpSinglet)), + b = IsGaugeField.covDerivIter h.A + (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (h.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 h.A + (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (h.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)), + h.Q i s φ ∈ Algebra.adjoin ℂ + ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.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 : h.Q i s φ ∈ Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ + {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (QuarkDoublet)), + b = IsGaugeField.covDerivIter h.A (QuarkDoublet.gaugeAlgebraAction) (h.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 h.A (QuarkDoublet.gaugeAlgebraAction) (h.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)), + h.barQ i s φ ∈ Algebra.adjoin ℂ + ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.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 : h.barQ i s φ ∈ Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ + {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule QuarkDoublet)), + b = IsGaugeField.covDerivIter h.A + (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (h.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 + (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 h.A + (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (h.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)), + h.L i s φ ∈ Algebra.adjoin ℂ + ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.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 : h.L i s φ ∈ Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ + {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (LeptonDoublet)), + b = IsGaugeField.covDerivIter h.A (LeptonDoublet.gaugeAlgebraAction) + (h.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 h.A (LeptonDoublet.gaugeAlgebraAction) (h.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)), + h.barL i s φ ∈ Algebra.adjoin ℂ + ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.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 : h.barL i s φ ∈ Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ + {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule LeptonDoublet)), + b = IsGaugeField.covDerivIter h.A + (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (h.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 h.A + (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (h.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)), + h.e i s φ ∈ Algebra.adjoin ℂ + ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.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 : h.e i s φ ∈ Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ + {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (LeptonSinglet)), + b = IsGaugeField.covDerivIter h.A (LeptonSinglet.gaugeAlgebraAction) + (h.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 h.A (LeptonSinglet.gaugeAlgebraAction) (h.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)), + h.bare i s φ ∈ Algebra.adjoin ℂ + ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.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 : h.bare i s φ ∈ Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ + {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule LeptonSinglet)), + b = IsGaugeField.covDerivIter h.A + (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (h.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 h.A + (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (h.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) + · 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 + 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 h.A (HiggsVec.gaugeAlgebraAction) h.H n l 0 φ + ∈ Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (HiggsVec)), b = h.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 h.A + (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.barH n l 0 φ + ∈ Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule HiggsVec)), b = h.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 h.A (DownSinglet.gaugeAlgebraAction) (h.d i) n l 0 φ + ∈ Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (DownSinglet)), b = h.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 + (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 : h.d i s' φ' ∈ Set.range (h.d i s') := ⟨φ', rfl⟩ + simp only [Set.mem_union] + tauto + · have h1 : IsGaugeField.covDerivIter h.A + (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (h.bard i) n l 0 φ + ∈ Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule DownSinglet)), b = h.bard i s φ}) := + (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 + (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 : h.bard i s' φ' ∈ Set.range (h.bard i s') := ⟨φ', rfl⟩ + simp only [Set.mem_union] + tauto + · have h1 : IsGaugeField.covDerivIter h.A (UpSinglet.gaugeAlgebraAction) (h.u i) n l 0 φ + ∈ Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (UpSinglet)), b = h.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 : h.u i s' φ' ∈ Set.range (h.u i s') := ⟨φ', rfl⟩ + simp only [Set.mem_union] + tauto + · have h1 : IsGaugeField.covDerivIter h.A + (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (h.baru i) n l 0 φ + ∈ Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule UpSinglet)), b = h.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 : h.baru i s' φ' ∈ Set.range (h.baru i s') := ⟨φ', rfl⟩ + simp only [Set.mem_union] + tauto + · have h1 : IsGaugeField.covDerivIter h.A (QuarkDoublet.gaugeAlgebraAction) (h.Q i) n l 0 φ + ∈ Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (QuarkDoublet)), b = h.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 : h.Q i s' φ' ∈ Set.range (h.Q i s') := ⟨φ', rfl⟩ + simp only [Set.mem_union] + tauto + · have h1 : IsGaugeField.covDerivIter h.A + (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (h.barQ i) n l 0 φ + ∈ Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule QuarkDoublet)), b = h.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 : h.barQ i s' φ' ∈ Set.range (h.barQ i s') := ⟨φ', rfl⟩ + simp only [Set.mem_union] + tauto + · have h1 : IsGaugeField.covDerivIter h.A (LeptonDoublet.gaugeAlgebraAction) (h.L i) n l 0 φ + ∈ Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (LeptonDoublet)), b = h.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 : h.L i s' φ' ∈ Set.range (h.L i s') := ⟨φ', rfl⟩ + simp only [Set.mem_union] + tauto + · have h1 : IsGaugeField.covDerivIter h.A + (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (h.barL i) n l 0 φ + ∈ Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule LeptonDoublet)), b = h.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 : h.barL i s' φ' ∈ Set.range (h.barL i s') := ⟨φ', rfl⟩ + simp only [Set.mem_union] + tauto + · have h1 : IsGaugeField.covDerivIter h.A (LeptonSinglet.gaugeAlgebraAction) (h.e i) n l 0 φ + ∈ Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (LeptonSinglet)), b = h.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 : h.e i s' φ' ∈ Set.range (h.e i s') := ⟨φ', rfl⟩ + simp only [Set.mem_union] + tauto + · have h1 : IsGaugeField.covDerivIter h.A + (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (h.bare i) n l 0 φ + ∈ Algebra.adjoin ℂ + ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ + {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule LeptonSinglet)), b = h.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 : h.bare i s' φ' ∈ Set.range (h.bare i s') := ⟨φ', rfl⟩ + simp only [Set.mem_union] + tauto + +/-! + +## J. 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 h.A (HiggsVec.gaugeAlgebraAction) h.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 h.A + (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.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 h.A (DownSinglet.gaugeAlgebraAction) (h.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 h.A (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) + (h.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 h.A (UpSinglet.gaugeAlgebraAction) (h.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 h.A (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) + (h.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 h.A (QuarkDoublet.gaugeAlgebraAction) (h.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 h.A (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) + (h.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 h.A (LeptonDoublet.gaugeAlgebraAction) (h.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 h.A (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) + (h.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 h.A (LeptonSinglet.gaugeAlgebraAction) (h.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 h.A (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) + (h.bare i) n l) := + TransformsIn.covDerivIter h.repJet_A (h.repJet_bare i) (LeptonSinglet.isInfinitesimalActionOf.conj) n l + +/-! + +## K. 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) + (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : + Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B := + IsGaugeField.iteratedCovDerivAdjoint h.A l (IsGaugeField.fieldStrength h.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 h.A ν μ = + fun t => - IsGaugeField.fieldStrength h.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 + term. -/ +lemma transformsInAdjoint_covDerivFieldStrength (l : List (Fin 1 ⊕ Fin 3)) + (μ ν : Fin 1 ⊕ Fin 3) : + IsGaugeField.TransformsInAdjoint repJet + (IsGaugeField.iteratedCovDerivAdjoint h.A l (IsGaugeField.fieldStrength h.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 μ ν φ + +/-! + +## L. 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 + +/-! + +## M. 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 φ + +/-! + +## N. 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 (h.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.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) h.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) (h.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) (h.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) (h.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) (h.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) (h.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) (h.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) (h.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) (h.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) (h.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) (h.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 = h.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 + + +/-! + +## O. 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 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) h.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 (h.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) (h.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 (h.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) (h.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 (h.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) (h.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 (h.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) (h.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 (h.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) (h.bare i) (h.repLorentz_bare i) + +end IsStandardModel + +end StandardModel From 26d911a71171c16f794001cb78c21cbb7df489a2 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Fri, 4 Sep 2026 09:53:27 +0100 Subject: [PATCH 265/367] feat: AlgebraRealization --- Physlib.lean | 11 +- .../GaugeTheory/Matter/CovariantDeriv.lean | 2 +- .../Basic.lean | 111 ++------------ .../Commutations.lean | 16 +-- .../CovStandardModel.lean | 71 ++++----- .../CovariantDeriv.lean | 48 +++---- .../AlgebraRealization/MassWeight/Basic.lean | 136 ++++++++++++++++++ .../MassWeight/Filtration.lean | 12 +- ...dardModel.lean => AlgebraRealization.lean} | 82 +++++------ .../JetAlgebra/FieldAlgebra.lean | 8 +- .../StandardModel/JetAlgebra/Generators.lean | 4 +- .../JetAlgebra/MassWeightPoly.lean | 6 +- .../JetComponentSpace/CovariantDeriv.lean | 2 +- 13 files changed, 277 insertions(+), 232 deletions(-) rename Physlib/Particles/StandardModel/{IsStandardModel => AlgebraRealization}/Basic.lean (76%) rename Physlib/Particles/StandardModel/{IsStandardModel => AlgebraRealization}/Commutations.lean (98%) rename Physlib/Particles/StandardModel/{IsStandardModel => AlgebraRealization}/CovStandardModel.lean (97%) rename Physlib/Particles/StandardModel/{IsStandardModel => AlgebraRealization}/CovariantDeriv.lean (98%) create mode 100644 Physlib/Particles/StandardModel/AlgebraRealization/MassWeight/Basic.lean rename Physlib/Particles/StandardModel/{IsStandardModel => AlgebraRealization}/MassWeight/Filtration.lean (98%) rename Physlib/Particles/StandardModel/JetAlgebra/{IsStandardModel.lean => AlgebraRealization.lean} (80%) diff --git a/Physlib.lean b/Physlib.lean index 73921c4ac..bf1ec229e 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -248,6 +248,11 @@ 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.AlgebraRealization.Commutations +public import Physlib.Particles.StandardModel.AlgebraRealization.CovStandardModel +public import Physlib.Particles.StandardModel.AlgebraRealization.CovariantDeriv +public import Physlib.Particles.StandardModel.AlgebraRealization.MassWeight.Basic +public import Physlib.Particles.StandardModel.AlgebraRealization.MassWeight.Filtration public import Physlib.Particles.StandardModel.AnomalyCancellation.Basic public import Physlib.Particles.StandardModel.AnomalyCancellation.FamilyMaps public import Physlib.Particles.StandardModel.AnomalyCancellation.NoGrav.Basic @@ -343,16 +348,12 @@ public import Physlib.Particles.StandardModel.IsHiggsSector.MassWeight.Basic public import Physlib.Particles.StandardModel.IsHiggsSector.MassWeight.GaugeWeightDecomposition public import Physlib.Particles.StandardModel.IsHiggsSector.MassWeight.MassDimEight public import Physlib.Particles.StandardModel.IsHiggsSector.MassWeight.MassDimLTEight -public import Physlib.Particles.StandardModel.IsStandardModel.Commutations -public import Physlib.Particles.StandardModel.IsStandardModel.CovStandardModel -public import Physlib.Particles.StandardModel.IsStandardModel.CovariantDeriv -public import Physlib.Particles.StandardModel.IsStandardModel.MassWeight.Filtration +public import Physlib.Particles.StandardModel.JetAlgebra.AlgebraRealization public import Physlib.Particles.StandardModel.JetAlgebra.Basic public import Physlib.Particles.StandardModel.JetAlgebra.FieldAlgebra public import Physlib.Particles.StandardModel.JetAlgebra.GaugeAction public import Physlib.Particles.StandardModel.JetAlgebra.Generators public import Physlib.Particles.StandardModel.JetAlgebra.Invariants -public import Physlib.Particles.StandardModel.JetAlgebra.IsStandardModel public import Physlib.Particles.StandardModel.JetAlgebra.JetDeriv public import Physlib.Particles.StandardModel.JetAlgebra.LorentzAction public import Physlib.Particles.StandardModel.JetAlgebra.MassDim diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/Matter/CovariantDeriv.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/Matter/CovariantDeriv.lean index ef6026afc..4cb2fb3c5 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/Matter/CovariantDeriv.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/Matter/CovariantDeriv.lean @@ -113,7 +113,7 @@ noncomputable def repDualCoeff (rep : Representation ℂ G (JetRing ⊗[ℂ] V)) `[∂_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`. -/ + the form consumed by `AlgebraRealization`. -/ def _root_.TransformsIn (repGauge : Representation ℂ G B) (rep : Representation ℂ G (JetRing ⊗[ℂ] V)) (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B) : Prop := diff --git a/Physlib/Particles/StandardModel/IsStandardModel/Basic.lean b/Physlib/Particles/StandardModel/AlgebraRealization/Basic.lean similarity index 76% rename from Physlib/Particles/StandardModel/IsStandardModel/Basic.lean rename to Physlib/Particles/StandardModel/AlgebraRealization/Basic.lean index 847404aff..972884b22 100644 --- a/Physlib/Particles/StandardModel/IsStandardModel/Basic.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/Basic.lean @@ -22,7 +22,7 @@ polynomial expression in them, sit inside it compatibly with the gauge action, t action and the mass-weight grading. The jet algebra `StandardModel.JetAlgebra` is the universal object with those fields, so the statement is a single one: an algebra map `JetAlgebra →ₐ[ℂ] B`, equivariant for the jet gauge group and the Lorentz group and -compatible with `massWeightPoly`. That is the structure `IsStandardModel`, together with +compatible with `massWeightPoly`. That is the structure `AlgebraRealization`, together with the two demands that the group actions be multiplicative on the whole of `B` and not merely on the image of the map — the covariant derivative of a matter field needs them there. @@ -43,12 +43,12 @@ their gauge covariance and the classification of jet-gauge invariants. ## ii. Key results -- `StandardModel.IsStandardModel` : an algebra is a Standard Model when it receives an +- `StandardModel.AlgebraRealization` : an algebra is a Standard Model when it receives an equivariant algebra map from the jet algebra. -- `IsStandardModel.A`, `IsStandardModel.H` and their companions : the thirteen families of +- `AlgebraRealization.A`, `AlgebraRealization.H` and their companions : the thirteen families of derivative symbols of a Standard Model. -- `IsStandardModel.repJet_A`, `IsStandardModel.repLorentz_H`, - `IsStandardModel.massWeight_d` and their companions : the transformation laws and mass +- `AlgebraRealization.repJet_A`, `AlgebraRealization.repLorentz_H`, + `AlgebraRealization.massWeight_d` and their companions : the transformation laws and mass weights of those families. ## iii. Table of contents @@ -81,7 +81,7 @@ open TensorProduct Matrix MatrixGroups Lorentz The last two fields are not consequences of the first four: an equivariant map forces the two actions to be multiplicative only on its image, whereas the covariant derivative of a matter field needs them multiplicative on the whole of `B`. -/ -structure IsStandardModel (B : Type) [Ring B] [Algebra ℂ B] +structure AlgebraRealization (B : Type) [Ring B] [Algebra ℂ B] (repJet : Representation ℂ JetGaugeGroupI B) (repLorentz : Representation ℂ SL(2,ℂ) B) (massWeightPoly : B →ₐ[ℂ] Polynomial B) where @@ -109,13 +109,13 @@ structure IsStandardModel (B : Type) [Ring B] [Algebra ℂ B] repLorentz_mul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂ -namespace IsStandardModel +namespace AlgebraRealization variable {B : Type} [Ring B] [Algebra ℂ B] {repJet : Representation ℂ JetGaugeGroupI B} {repLorentz : Representation ℂ SL(2,ℂ) B} {massWeightPoly : B →ₐ[ℂ] Polynomial B} - (h : IsStandardModel B repJet repLorentz massWeightPoly) + (h : AlgebraRealization B repJet repLorentz massWeightPoly) /-! @@ -234,13 +234,6 @@ private lemma map_family_repLorentz {V : Type} [AddCommGroup V] [Module ℂ V] rw [← h.map_repLorentz, hG Λ n l φ, map_sum] exact Finset.sum_congr rfl fun p _ => map_smul h.toAlgHom _ _ -/-- A monomial mass-weight eigenvalue transports along the defining map: the map carries - the mass-weight polynomial to the mass-weight polynomial, and a monomial to a monomial. -/ -private lemma map_massWeight_monomial {x : JetAlgebra} {n : ℕ} - (hx : JetAlgebra.massWeightPoly x = Polynomial.monomial n x) : - massWeightPoly (h.toAlgHom x) = Polynomial.monomial n (h.toAlgHom x) := by - rw [h.map_massWeight, hx, Polynomial.mapAlgHom_monomial] - /-! ## C. The gauge transformation of the fields @@ -416,93 +409,7 @@ lemma repLorentz_bare : ∀ i, IsLorentzDerivTransforms repLorentz LeptonSinglet.repLorentzGroup.conj (h.bare i) := fun i => h.map_family_repLorentz (JetAlgebra.isLorentzDerivTransforms_conjLeptonSingletField i) -/-! - -## E. The mass weights of the fields - -Every derivative symbol is a `massWeightPoly`-eigenvector of pure monomial weight — twice -its mass dimension. The bosons have mass dimension `1 + |s|`, the fermions `3/2 + |s|`. - --/ - -/-- The law `massWeight_H` of a Standard Model, obtained from the corresponding law of the - jet algebra by pushing it along the defining algebra map. -/ -lemma massWeight_H : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) φ, - massWeightPoly (h.H s φ) = Polynomial.monomial (2 * (1 + Multiset.card s)) (h.H s φ) := - fun s φ => h.map_massWeight_monomial (JetAlgebra.massWeightPoly_higgsField s φ) - -/-- The law `massWeight_barH` of a Standard Model, obtained from the corresponding law of the - jet algebra by pushing it along the defining algebra map. -/ -lemma massWeight_barH : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) φ, - massWeightPoly (h.barH s φ) = Polynomial.monomial (2 * (1 + Multiset.card s)) (h.barH s φ) := - fun s φ => h.map_massWeight_monomial (JetAlgebra.massWeightPoly_conjHiggsField s φ) - -/-- The law `massWeight_A` of a Standard Model, obtained from the corresponding law of the - jet algebra by pushing it along the defining algebra map. -/ -lemma massWeight_A : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) μ φ, - massWeightPoly (h.A s μ φ) = Polynomial.monomial (2 * (1 + Multiset.card s)) (h.A s μ φ) := - fun s μ φ => h.map_massWeight_monomial (JetAlgebra.massWeightPoly_gaugeField s μ φ) - -/-- The law `massWeight_d` of a Standard Model, obtained from the corresponding law of the - jet algebra by pushing it along the defining algebra map. -/ -lemma massWeight_d : ∀ i (s : Multiset (Fin 1 ⊕ Fin 3)) φ, - massWeightPoly (h.d i s φ) = Polynomial.monomial (3 + 2 * Multiset.card s) (h.d i s φ) := - fun i s φ => h.map_massWeight_monomial (JetAlgebra.massWeightPoly_downSingletField i s φ) - -/-- The law `massWeight_bard` of a Standard Model, obtained from the corresponding law of the - jet algebra by pushing it along the defining algebra map. -/ -lemma massWeight_bard : ∀ i (s : Multiset (Fin 1 ⊕ Fin 3)) φ, - massWeightPoly (h.bard i s φ) = Polynomial.monomial (3 + 2 * Multiset.card s) (h.bard i s φ) := - fun i s φ => h.map_massWeight_monomial (JetAlgebra.massWeightPoly_conjDownSingletField i s φ) - -/-- The law `massWeight_u` of a Standard Model, obtained from the corresponding law of the - jet algebra by pushing it along the defining algebra map. -/ -lemma massWeight_u : ∀ i (s : Multiset (Fin 1 ⊕ Fin 3)) φ, - massWeightPoly (h.u i s φ) = Polynomial.monomial (3 + 2 * Multiset.card s) (h.u i s φ) := - fun i s φ => h.map_massWeight_monomial (JetAlgebra.massWeightPoly_upSingletField i s φ) - -/-- The law `massWeight_baru` of a Standard Model, obtained from the corresponding law of the - jet algebra by pushing it along the defining algebra map. -/ -lemma massWeight_baru : ∀ i (s : Multiset (Fin 1 ⊕ Fin 3)) φ, - massWeightPoly (h.baru i s φ) = Polynomial.monomial (3 + 2 * Multiset.card s) (h.baru i s φ) := - fun i s φ => h.map_massWeight_monomial (JetAlgebra.massWeightPoly_conjUpSingletField i s φ) - -/-- The law `massWeight_Q` of a Standard Model, obtained from the corresponding law of the - jet algebra by pushing it along the defining algebra map. -/ -lemma massWeight_Q : ∀ i (s : Multiset (Fin 1 ⊕ Fin 3)) φ, - massWeightPoly (h.Q i s φ) = Polynomial.monomial (3 + 2 * Multiset.card s) (h.Q i s φ) := - fun i s φ => h.map_massWeight_monomial (JetAlgebra.massWeightPoly_quarkDoubletField i s φ) - -/-- The law `massWeight_barQ` of a Standard Model, obtained from the corresponding law of the - jet algebra by pushing it along the defining algebra map. -/ -lemma massWeight_barQ : ∀ i (s : Multiset (Fin 1 ⊕ Fin 3)) φ, - massWeightPoly (h.barQ i s φ) = Polynomial.monomial (3 + 2 * Multiset.card s) (h.barQ i s φ) := - fun i s φ => h.map_massWeight_monomial (JetAlgebra.massWeightPoly_conjQuarkDoubletField i s φ) - -/-- The law `massWeight_L` of a Standard Model, obtained from the corresponding law of the - jet algebra by pushing it along the defining algebra map. -/ -lemma massWeight_L : ∀ i (s : Multiset (Fin 1 ⊕ Fin 3)) φ, - massWeightPoly (h.L i s φ) = Polynomial.monomial (3 + 2 * Multiset.card s) (h.L i s φ) := - fun i s φ => h.map_massWeight_monomial (JetAlgebra.massWeightPoly_leptonDoubletField i s φ) - -/-- The law `massWeight_barL` of a Standard Model, obtained from the corresponding law of the - jet algebra by pushing it along the defining algebra map. -/ -lemma massWeight_barL : ∀ i (s : Multiset (Fin 1 ⊕ Fin 3)) φ, - massWeightPoly (h.barL i s φ) = Polynomial.monomial (3 + 2 * Multiset.card s) (h.barL i s φ) := - fun i s φ => h.map_massWeight_monomial (JetAlgebra.massWeightPoly_conjLeptonDoubletField i s φ) - -/-- The law `massWeight_e` of a Standard Model, obtained from the corresponding law of the - jet algebra by pushing it along the defining algebra map. -/ -lemma massWeight_e : ∀ i (s : Multiset (Fin 1 ⊕ Fin 3)) φ, - massWeightPoly (h.e i s φ) = Polynomial.monomial (3 + 2 * Multiset.card s) (h.e i s φ) := - fun i s φ => h.map_massWeight_monomial (JetAlgebra.massWeightPoly_leptonSingletField i s φ) - -/-- The law `massWeight_bare` of a Standard Model, obtained from the corresponding law of the - jet algebra by pushing it along the defining algebra map. -/ -lemma massWeight_bare : ∀ i (s : Multiset (Fin 1 ⊕ Fin 3)) φ, - massWeightPoly (h.bare i s φ) = Polynomial.monomial (3 + 2 * Multiset.card s) (h.bare i s φ) := - fun i s φ => h.map_massWeight_monomial (JetAlgebra.massWeightPoly_conjLeptonSingletField i s φ) -end IsStandardModel +end AlgebraRealization end StandardModel diff --git a/Physlib/Particles/StandardModel/IsStandardModel/Commutations.lean b/Physlib/Particles/StandardModel/AlgebraRealization/Commutations.lean similarity index 98% rename from Physlib/Particles/StandardModel/IsStandardModel/Commutations.lean rename to Physlib/Particles/StandardModel/AlgebraRealization/Commutations.lean index 3e973e3fe..eccca2de6 100644 --- a/Physlib/Particles/StandardModel/IsStandardModel/Commutations.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/Commutations.lean @@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE. Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.IsStandardModel.Basic +public import Physlib.Particles.StandardModel.AlgebraRealization.Basic /-! # The statistics of the Standard Model fields @@ -21,18 +21,18 @@ Each law is one line: the corresponding jet algebra fact, transported. A commuta transports by `Commute.map`, an anticommutation by the private helper `map_anticomm` at the head of the section, which is the fourth of the transport shapes of section B of [`Basic.lean`](Basic.lean) and is needed only here. The laws carry the names they carried -when they were axioms of `IsStandardModel`, so they are used exactly as before. +when they were axioms of `AlgebraRealization`, so they are used exactly as before. These are the last of the laws of the bare symbols; the covariant reduction that uses them is [`CovariantDeriv.lean`](CovariantDeriv.lean). ## ii. Key results -- `IsStandardModel.A_comm_A`, `IsStandardModel.A_comm_H` and their companions : the +- `AlgebraRealization.A_comm_A`, `AlgebraRealization.A_comm_H` and their companions : the gauge-field symbols commute with every symbol of the theory. -- `IsStandardModel.H_comm_H` and its companions : the Higgs symbols commute with each +- `AlgebraRealization.H_comm_H` and its companions : the Higgs symbols commute with each other and with every fermion symbol. -- `IsStandardModel.d_anticomm_bard` and its companions : the fermion symbols anticommute +- `AlgebraRealization.d_anticomm_bard` and its companions : the fermion symbols anticommute among themselves. ## iii. Table of contents @@ -52,13 +52,13 @@ namespace StandardModel open TensorProduct Matrix MatrixGroups Lorentz -namespace IsStandardModel +namespace AlgebraRealization variable {B : Type} [Ring B] [Algebra ℂ B] {repJet : Representation ℂ JetGaugeGroupI B} {repLorentz : Representation ℂ SL(2,ℂ) B} {massWeightPoly : B →ₐ[ℂ] Polynomial B} - (h : IsStandardModel B repJet repLorentz massWeightPoly) + (h : AlgebraRealization B repJet repLorentz massWeightPoly) /-! @@ -829,6 +829,6 @@ lemma bare_anticomm_bare : ∀ (i j : Fin 3) (s s' : Multiset (Fin 1 ⊕ Fin 3)) ((JetAlgebra.isFermionGenerator_conjLeptonSingletField i s φ).anticomm (JetAlgebra.isFermionGenerator_conjLeptonSingletField j s' φ')) -end IsStandardModel +end AlgebraRealization end StandardModel diff --git a/Physlib/Particles/StandardModel/IsStandardModel/CovStandardModel.lean b/Physlib/Particles/StandardModel/AlgebraRealization/CovStandardModel.lean similarity index 97% rename from Physlib/Particles/StandardModel/IsStandardModel/CovStandardModel.lean rename to Physlib/Particles/StandardModel/AlgebraRealization/CovStandardModel.lean index 67675b4ac..b51ecdadd 100644 --- a/Physlib/Particles/StandardModel/IsStandardModel/CovStandardModel.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/CovStandardModel.lean @@ -5,13 +5,14 @@ Authors: Joseph Tooby-Smith -/ module public import Physlib.Particles.StandardModel.IsCovStandardModel.Basic -public import Physlib.Particles.StandardModel.IsStandardModel.CovariantDeriv +public import Physlib.Particles.StandardModel.AlgebraRealization.CovariantDeriv +public import Physlib.Particles.StandardModel.AlgebraRealization.MassWeight.Basic /-! # From the jet Standard Model to its covariant form ## i. Overview -`IsStandardModel` records the Standard Model in terms of the *bare* symbols +`AlgebraRealization` 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 @@ -20,7 +21,7 @@ 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 +The first half names the covariant generators of an `AlgebraRealization` 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 @@ -36,33 +37,33 @@ section J, which reads them off the statistics of the bare symbols because each of a tower carries exactly one bare matter symbol. Their Lorentz transformation laws are section O of [`CovariantDeriv.lean`](CovariantDeriv.lean): each follows from the Lorentz law -`IsStandardModel` records for the corresponding bare symbols, together with the fact +`AlgebraRealization` 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 -- `IsStandardModel.repGlobal` : the global gauge action, the jet action restricted +- `AlgebraRealization.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 +- `AlgebraRealization.covAlgebra` : the subalgebra generated by the covariant towers. +- `AlgebraRealization.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 +- `AlgebraRealization.forall_repJet_eq_iff` : the reduction theorem for the gauge group. +- `AlgebraRealization.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 +- `AlgebraRealization.repGlobal_covF`, `AlgebraRealization.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 +- `AlgebraRealization.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 +- `AlgebraRealization.covDerivIter_mem_massWeightEigenspace` and + `AlgebraRealization.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 +- `AlgebraRealization.commute_covDerivIter_covDerivIter` and + `AlgebraRealization.anticommute_covDerivIter_covDerivIter` : the statistics of a pair of towers is the statistics of the pair of bare families. -- `IsStandardModel.repLorentz_covF` : the Lorentz law of the field-strength tower. -- `IsStandardModel.isCovStandardModel` : the covariant form of the theory. +- `AlgebraRealization.repLorentz_covF` : the Lorentz law of the field-strength tower. +- `AlgebraRealization.isCovStandardModel` : the covariant form of the theory. ## iii. Table of contents @@ -84,8 +85,8 @@ it. So `isCovStandardModel` is unconditional. ## iv. References The classification of jet-gauge invariants that section D consumes is -`IsStandardModel.invariant_mem_adjoin_covDeriv`, proved in -[`IsStandardModel/CovariantDeriv.lean`](CovariantDeriv.lean); the splitting of a gauge +`AlgebraRealization.invariant_mem_adjoin_covDeriv`, proved in +[`AlgebraRealization/CovariantDeriv.lean`](CovariantDeriv.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 @@ -102,13 +103,13 @@ namespace StandardModel open TensorProduct Matrix MatrixGroups Lorentz -namespace IsStandardModel +namespace AlgebraRealization variable {B : Type} [Ring B] [Algebra ℂ B] {repJet : Representation ℂ JetGaugeGroupI B} {repLorentz : Representation ℂ SL(2,ℂ) B} {massWeightPoly : B →ₐ[ℂ] Polynomial B} - (h : IsStandardModel B repJet repLorentz massWeightPoly) + (h : AlgebraRealization B repJet repLorentz massWeightPoly) /-! @@ -135,7 +136,7 @@ lemma repGlobal_apply (repJet : Representation ℂ JetGaugeGroupI B) (g : GaugeG ## B. The covariant generators and the covariant algebra -The covariant towers of section H and section K of `IsStandardModel.CovariantDeriv` are +The covariant towers of section H and section K of `AlgebraRealization.CovariantDeriv` 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. @@ -144,14 +145,14 @@ the field-strength tower in that indexing, and the matter towers already carry i /-- The covariant derivatives of the field strength in the ordered-tuple indexing used by `IsCovStandardModel`. -/ -noncomputable def covF (h : IsStandardModel B repJet repLorentz massWeightPoly) {n : ℕ} +noncomputable def covF (h : AlgebraRealization B repJet repLorentz massWeightPoly) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (μ ν : 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) {n : ℕ} +lemma covF_swap (h : AlgebraRealization B repJet repLorentz massWeightPoly) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : h.covF l ν μ φ = - h.covF l μ ν φ := @@ -159,7 +160,7 @@ lemma covF_swap (h : IsStandardModel B repJet repLorentz massWeightPoly) {n : /-- 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) : Set B := +def covGenerators (h : AlgebraRealization B repJet repLorentz massWeightPoly) : 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), @@ -173,7 +174,7 @@ def covGenerators (h : IsStandardModel B repJet repLorentz massWeightPoly) : Set /-- 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) : Subalgebra ℂ B := +def covAlgebra (h : AlgebraRealization B repJet repLorentz massWeightPoly) : Subalgebra ℂ B := Algebra.adjoin ℂ h.covGenerators /-! @@ -188,7 +189,7 @@ 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) : Set B := +def covGeneratorsList (h : AlgebraRealization B repJet repLorentz massWeightPoly) : 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), @@ -218,7 +219,7 @@ lemma covGenerators_eq_covGeneratorsList : h.covGenerators = h.covGeneratorsList ## C. Pure gauge jets fix the covariant algebra -Section M of `IsStandardModel.CovariantDeriv` shows that a gauge jet with trivial +Section M of `AlgebraRealization.CovariantDeriv` 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. @@ -241,7 +242,7 @@ lemma repJet_algebraMap (U : JetGaugeGroupI) (c : ℂ) : include h in /-- Pure gauge jets fix the covariant generators: this is section M of - `IsStandardModel.CovariantDeriv` together with the field-strength case of section K. -/ + `AlgebraRealization.CovariantDeriv` together with the field-strength case of section K. -/ 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 @@ -290,7 +291,7 @@ lemma repJet_eq_of_mem_covAlgebra_of_mem_truncationKer_zero 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 N of -`IsStandardModel.CovariantDeriv` puts every jet-invariant of the field algebra inside the +`AlgebraRealization.CovariantDeriv` 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. @@ -336,7 +337,7 @@ theorem forall_repJet_and_repLorentz_eq_iff {x : B} (hx : x ∈ h.fieldAlgebra) ## E. The covariant generators are globally equivariant -Section L of `IsStandardModel.CovariantDeriv` shows that a gauge jet acts on a covariant +Section L of `AlgebraRealization.CovariantDeriv` 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) @@ -541,7 +542,7 @@ the whole covariant algebra. This discharges the `F_comm_F` obligation of /-- 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) +lemma covF_mem_adjoin_gaugeSymbols (h : AlgebraRealization B repJet repLorentz massWeightPoly) {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)) @@ -2305,7 +2306,7 @@ lemma repLorentz_covF (Λ : SL(2,ℂ)) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3 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 O of + `AlgebraRealization`: the Lorentz laws of the matter towers are section O of `CovariantDeriv.lean`, the one of the field-strength tower is `repLorentz_covF`. -/ theorem isCovStandardModel : IsCovStandardModel B (repGlobal repJet) h.repGlobal_mul repLorentz h.repLorentz_mul @@ -2454,9 +2455,9 @@ theorem isCovStandardModel : 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 + invariance of the algebra generaged by `AlgebraRealization` to the (global) invariance of the algebra generated by `IsCovStandardModel`." -end IsStandardModel +end AlgebraRealization end StandardModel diff --git a/Physlib/Particles/StandardModel/IsStandardModel/CovariantDeriv.lean b/Physlib/Particles/StandardModel/AlgebraRealization/CovariantDeriv.lean similarity index 98% rename from Physlib/Particles/StandardModel/IsStandardModel/CovariantDeriv.lean rename to Physlib/Particles/StandardModel/AlgebraRealization/CovariantDeriv.lean index 41ce2db3d..56027a717 100644 --- a/Physlib/Particles/StandardModel/IsStandardModel/CovariantDeriv.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/CovariantDeriv.lean @@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE. Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.IsStandardModel.Commutations +public import Physlib.Particles.StandardModel.AlgebraRealization.Commutations /-! # The covariant derivatives of a Standard Model @@ -50,14 +50,14 @@ towers, which the covariant form of the theory consumes. - `IsGaugeField.isLorentzCovDerivTransforms_covDerivIter` and `IsGaugeField.repLorentz_iteratedCovDerivAdjoint` : the Lorentz laws of the covariant matter towers and of the covariant field-strength tower. -- `IsStandardModel.fieldAlgebra` : the algebra the fields generate. -- `IsStandardModel.covDerivH`, `IsStandardModel.covDerivFieldStrength` and their +- `AlgebraRealization.fieldAlgebra` : the algebra the fields generate. +- `AlgebraRealization.covDerivH`, `AlgebraRealization.covDerivFieldStrength` and their companions : the covariant derivative towers. -- `IsStandardModel.fieldAlgebra_eq_covDeriv` : the covariant towers generate the field +- `AlgebraRealization.fieldAlgebra_eq_covDeriv` : the covariant towers generate the field algebra. -- `IsStandardModel.invariant_mem_adjoin_covDeriv` : the classification of jet-gauge +- `AlgebraRealization.invariant_mem_adjoin_covDeriv` : the classification of jet-gauge invariants of the field algebra. -- `IsStandardModel.repLorentz_covDerivH` and its companions : the Lorentz laws of the +- `AlgebraRealization.repLorentz_covDerivH` and its companions : the Lorentz laws of the covariant matter towers. ## iii. Table of contents @@ -1392,13 +1392,13 @@ lemma iteratedCovDerivAdjoint_neg_fam end IsGaugeField set_option linter.unusedVariables false -namespace IsStandardModel +namespace AlgebraRealization variable {B : Type} [Ring B] [Algebra ℂ B] {repJet : Representation ℂ JetGaugeGroupI B} {repLorentz : Representation ℂ SL(2,ℂ) B} {massWeightPoly : B →ₐ[ℂ] Polynomial B} - (h : IsStandardModel B repJet repLorentz massWeightPoly) + (h : AlgebraRealization B repJet repLorentz massWeightPoly) /-! @@ -1410,7 +1410,7 @@ variable {B : Type} [Ring B] [Algebra ℂ B] /-- 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): Subalgebra ℂ B := +def fieldAlgebra (h : AlgebraRealization B repJet repLorentz massWeightPoly): Subalgebra ℂ B := Algebra.adjoin ℂ ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.A s μ)) ∪ (⋃ (s : Multiset (Fin 1 ⊕ Fin 3)), Set.range (h.H s) ∪ Set.range (h.barH s)) ∪ @@ -1429,78 +1429,78 @@ def fieldAlgebra (h : IsStandardModel B repJet repLorentz massWeightPoly): Subal include h in /-- The iterated covariant derivative of the down-type quarks. -/ -noncomputable def covDerivD (h : IsStandardModel B repJet repLorentz massWeightPoly) +noncomputable def covDerivD (h : AlgebraRealization B repJet repLorentz massWeightPoly) (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : Module.Dual ℂ DownSinglet →ₗ[ℂ] B := IsGaugeField.covDerivIter h.A DownSinglet.gaugeAlgebraAction (h.d i) n l 0 /-- The iterated covariant derivative of the conjugate down-type quarks. -/ -noncomputable def covDerivBarD (h : IsStandardModel B repJet repLorentz massWeightPoly) +noncomputable def covDerivBarD (h : AlgebraRealization B repJet repLorentz massWeightPoly) (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : Module.Dual ℂ (ConjModule DownSinglet) →ₗ[ℂ] B := IsGaugeField.covDerivIter h.A (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (h.bard i) n l 0 /-- The iterated covariant derivative of the Higgs field. -/ -noncomputable def covDerivH (h : IsStandardModel B repJet repLorentz massWeightPoly) {n : ℕ} +noncomputable def covDerivH (h : AlgebraRealization B repJet repLorentz massWeightPoly) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : Module.Dual ℂ HiggsVec →ₗ[ℂ] B := IsGaugeField.covDerivIter h.A HiggsVec.gaugeAlgebraAction h.H n l 0 /-- The iterated covariant derivative of the conjugate Higgs field. -/ -noncomputable def covDerivBarH (h : IsStandardModel B repJet repLorentz massWeightPoly) {n : ℕ} +noncomputable def covDerivBarH (h : AlgebraRealization B repJet repLorentz massWeightPoly) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : Module.Dual ℂ (ConjModule HiggsVec) →ₗ[ℂ] B := IsGaugeField.covDerivIter h.A (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.barH n l 0 /-- The iterated covariant derivative of the up-type quarks. -/ -noncomputable def covDerivU (h : IsStandardModel B repJet repLorentz massWeightPoly) +noncomputable def covDerivU (h : AlgebraRealization B repJet repLorentz massWeightPoly) (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : Module.Dual ℂ UpSinglet →ₗ[ℂ] B := IsGaugeField.covDerivIter h.A UpSinglet.gaugeAlgebraAction (h.u i) n l 0 /-- The iterated covariant derivative of the conjugate up-type quarks. -/ -noncomputable def covDerivBarU (h : IsStandardModel B repJet repLorentz massWeightPoly) +noncomputable def covDerivBarU (h : AlgebraRealization B repJet repLorentz massWeightPoly) (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : Module.Dual ℂ (ConjModule UpSinglet) →ₗ[ℂ] B := IsGaugeField.covDerivIter h.A (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (h.baru i) n l 0 /-- The iterated covariant derivative of the quark doublets. -/ -noncomputable def covDerivQ (h : IsStandardModel B repJet repLorentz massWeightPoly) +noncomputable def covDerivQ (h : AlgebraRealization B repJet repLorentz massWeightPoly) (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : Module.Dual ℂ QuarkDoublet →ₗ[ℂ] B := IsGaugeField.covDerivIter h.A QuarkDoublet.gaugeAlgebraAction (h.Q i) n l 0 /-- The iterated covariant derivative of the conjugate quark doublets. -/ -noncomputable def covDerivBarQ (h : IsStandardModel B repJet repLorentz massWeightPoly) +noncomputable def covDerivBarQ (h : AlgebraRealization B repJet repLorentz massWeightPoly) (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : Module.Dual ℂ (ConjModule QuarkDoublet) →ₗ[ℂ] B := IsGaugeField.covDerivIter h.A (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (h.barQ i) n l 0 /-- The iterated covariant derivative of the lepton doublets. -/ -noncomputable def covDerivL (h : IsStandardModel B repJet repLorentz massWeightPoly) +noncomputable def covDerivL (h : AlgebraRealization B repJet repLorentz massWeightPoly) (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : Module.Dual ℂ LeptonDoublet →ₗ[ℂ] B := IsGaugeField.covDerivIter h.A LeptonDoublet.gaugeAlgebraAction (h.L i) n l 0 /-- The iterated covariant derivative of the conjugate lepton doublets. -/ -noncomputable def covDerivBarL (h : IsStandardModel B repJet repLorentz massWeightPoly) +noncomputable def covDerivBarL (h : AlgebraRealization B repJet repLorentz massWeightPoly) (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : Module.Dual ℂ (ConjModule LeptonDoublet) →ₗ[ℂ] B := IsGaugeField.covDerivIter h.A (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (h.barL i) n l 0 /-- The iterated covariant derivative of the lepton singlets. -/ -noncomputable def covDerivE (h : IsStandardModel B repJet repLorentz massWeightPoly) +noncomputable def covDerivE (h : AlgebraRealization B repJet repLorentz massWeightPoly) (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : Module.Dual ℂ LeptonSinglet →ₗ[ℂ] B := IsGaugeField.covDerivIter h.A LeptonSinglet.gaugeAlgebraAction (h.e i) n l 0 /-- The iterated covariant derivative of the conjugate lepton singlets. -/ -noncomputable def covDerivBarE (h : IsStandardModel B repJet repLorentz massWeightPoly) +noncomputable def covDerivBarE (h : AlgebraRealization B repJet repLorentz massWeightPoly) (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : Module.Dual ℂ (ConjModule LeptonSinglet) →ₗ[ℂ] B := IsGaugeField.covDerivIter h.A (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) @@ -2420,7 +2420,7 @@ lemma transformsIn_covDerivBarE (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ /-- 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) +noncomputable def covDerivFieldStrength (h : AlgebraRealization B repJet repLorentz massWeightPoly) (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B := IsGaugeField.iteratedCovDerivAdjoint h.A l (IsGaugeField.fieldStrength h.A μ ν) 0 @@ -2936,7 +2936,7 @@ theorem invariant_mem_adjoin_covDeriv {x : B} 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 +Lorentz law recorded by `AlgebraRealization` 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`. @@ -3052,6 +3052,6 @@ lemma repLorentz_covDerivBarE (i : Fin 3) : (actionConj_comm_repConj LeptonSinglet.gaugeAlgebraAction _ LeptonSinglet.gaugeAlgebraAction_comm_repLorentzGroup) (h.bare i) (h.repLorentz_bare i) -end IsStandardModel +end AlgebraRealization end StandardModel diff --git a/Physlib/Particles/StandardModel/AlgebraRealization/MassWeight/Basic.lean b/Physlib/Particles/StandardModel/AlgebraRealization/MassWeight/Basic.lean new file mode 100644 index 000000000..fec4804e5 --- /dev/null +++ b/Physlib/Particles/StandardModel/AlgebraRealization/MassWeight/Basic.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.Particles.StandardModel.AlgebraRealization.Basic +/-! +# The mass weights of the fields of an algebra realization + +Every derivative symbol of an algebra realization is an eigenvector of `massWeightPoly`, of +pure monomial weight equal to twice its mass dimension. The bosons have mass dimension +`1 + |s|` and the fermions `3/2 + |s|`, where `|s|` counts the derivatives. Each law is the +corresponding law of the jet algebra, pushed along the defining algebra map. + +- A. The mass weights of the fields + +-/ + +@[expose] public section + +set_option maxHeartbeats 4000000 +set_option synthInstance.maxHeartbeats 1000000 +set_option synthInstance.maxSize 2048 +set_option maxRecDepth 8000 + +namespace StandardModel + +open TensorProduct Matrix MatrixGroups Lorentz + +namespace AlgebraRealization + +variable {B : Type} [Ring B] [Algebra ℂ B] + {repJet : Representation ℂ JetGaugeGroupI B} + {repLorentz : Representation ℂ SL(2,ℂ) B} + {massWeightPoly : B →ₐ[ℂ] Polynomial B} + (h : AlgebraRealization B repJet repLorentz massWeightPoly) + +/-! + +## A. The mass weights of the fields + +Every derivative symbol is a `massWeightPoly`-eigenvector of pure monomial weight — twice +its mass dimension. The bosons have mass dimension `1 + |s|`, the fermions `3/2 + |s|`. + +-/ + +/-- A monomial mass-weight eigenvalue transports along the defining map: the map carries + the mass-weight polynomial to the mass-weight polynomial, and a monomial to a monomial. -/ +private lemma map_massWeight_monomial {x : JetAlgebra} {n : ℕ} + (hx : JetAlgebra.massWeightPoly x = Polynomial.monomial n x) : + massWeightPoly (h.toAlgHom x) = Polynomial.monomial n (h.toAlgHom x) := by + rw [h.map_massWeight, hx, Polynomial.mapAlgHom_monomial] + +/-- The law `massWeight_H` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma massWeight_H : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) φ, + massWeightPoly (h.H s φ) = Polynomial.monomial (2 * (1 + Multiset.card s)) (h.H s φ) := + fun s φ => h.map_massWeight_monomial (JetAlgebra.massWeightPoly_higgsField s φ) + +/-- The law `massWeight_barH` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma massWeight_barH : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) φ, + massWeightPoly (h.barH s φ) = Polynomial.monomial (2 * (1 + Multiset.card s)) (h.barH s φ) := + fun s φ => h.map_massWeight_monomial (JetAlgebra.massWeightPoly_conjHiggsField s φ) + +/-- The law `massWeight_A` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma massWeight_A : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) μ φ, + massWeightPoly (h.A s μ φ) = Polynomial.monomial (2 * (1 + Multiset.card s)) (h.A s μ φ) := + fun s μ φ => h.map_massWeight_monomial (JetAlgebra.massWeightPoly_gaugeField s μ φ) + +/-- The law `massWeight_d` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma massWeight_d : ∀ i (s : Multiset (Fin 1 ⊕ Fin 3)) φ, + massWeightPoly (h.d i s φ) = Polynomial.monomial (3 + 2 * Multiset.card s) (h.d i s φ) := + fun i s φ => h.map_massWeight_monomial (JetAlgebra.massWeightPoly_downSingletField i s φ) + +/-- The law `massWeight_bard` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma massWeight_bard : ∀ i (s : Multiset (Fin 1 ⊕ Fin 3)) φ, + massWeightPoly (h.bard i s φ) = Polynomial.monomial (3 + 2 * Multiset.card s) (h.bard i s φ) := + fun i s φ => h.map_massWeight_monomial (JetAlgebra.massWeightPoly_conjDownSingletField i s φ) + +/-- The law `massWeight_u` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma massWeight_u : ∀ i (s : Multiset (Fin 1 ⊕ Fin 3)) φ, + massWeightPoly (h.u i s φ) = Polynomial.monomial (3 + 2 * Multiset.card s) (h.u i s φ) := + fun i s φ => h.map_massWeight_monomial (JetAlgebra.massWeightPoly_upSingletField i s φ) + +/-- The law `massWeight_baru` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma massWeight_baru : ∀ i (s : Multiset (Fin 1 ⊕ Fin 3)) φ, + massWeightPoly (h.baru i s φ) = Polynomial.monomial (3 + 2 * Multiset.card s) (h.baru i s φ) := + fun i s φ => h.map_massWeight_monomial (JetAlgebra.massWeightPoly_conjUpSingletField i s φ) + +/-- The law `massWeight_Q` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma massWeight_Q : ∀ i (s : Multiset (Fin 1 ⊕ Fin 3)) φ, + massWeightPoly (h.Q i s φ) = Polynomial.monomial (3 + 2 * Multiset.card s) (h.Q i s φ) := + fun i s φ => h.map_massWeight_monomial (JetAlgebra.massWeightPoly_quarkDoubletField i s φ) + +/-- The law `massWeight_barQ` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma massWeight_barQ : ∀ i (s : Multiset (Fin 1 ⊕ Fin 3)) φ, + massWeightPoly (h.barQ i s φ) = Polynomial.monomial (3 + 2 * Multiset.card s) (h.barQ i s φ) := + fun i s φ => h.map_massWeight_monomial (JetAlgebra.massWeightPoly_conjQuarkDoubletField i s φ) + +/-- The law `massWeight_L` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma massWeight_L : ∀ i (s : Multiset (Fin 1 ⊕ Fin 3)) φ, + massWeightPoly (h.L i s φ) = Polynomial.monomial (3 + 2 * Multiset.card s) (h.L i s φ) := + fun i s φ => h.map_massWeight_monomial (JetAlgebra.massWeightPoly_leptonDoubletField i s φ) + +/-- The law `massWeight_barL` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma massWeight_barL : ∀ i (s : Multiset (Fin 1 ⊕ Fin 3)) φ, + massWeightPoly (h.barL i s φ) = Polynomial.monomial (3 + 2 * Multiset.card s) (h.barL i s φ) := + fun i s φ => h.map_massWeight_monomial (JetAlgebra.massWeightPoly_conjLeptonDoubletField i s φ) + +/-- The law `massWeight_e` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma massWeight_e : ∀ i (s : Multiset (Fin 1 ⊕ Fin 3)) φ, + massWeightPoly (h.e i s φ) = Polynomial.monomial (3 + 2 * Multiset.card s) (h.e i s φ) := + fun i s φ => h.map_massWeight_monomial (JetAlgebra.massWeightPoly_leptonSingletField i s φ) + +/-- The law `massWeight_bare` of a Standard Model, obtained from the corresponding law of the + jet algebra by pushing it along the defining algebra map. -/ +lemma massWeight_bare : ∀ i (s : Multiset (Fin 1 ⊕ Fin 3)) φ, + massWeightPoly (h.bare i s φ) = Polynomial.monomial (3 + 2 * Multiset.card s) (h.bare i s φ) := + fun i s φ => h.map_massWeight_monomial (JetAlgebra.massWeightPoly_conjLeptonSingletField i s φ) + +end AlgebraRealization + +end StandardModel diff --git a/Physlib/Particles/StandardModel/IsStandardModel/MassWeight/Filtration.lean b/Physlib/Particles/StandardModel/AlgebraRealization/MassWeight/Filtration.lean similarity index 98% rename from Physlib/Particles/StandardModel/IsStandardModel/MassWeight/Filtration.lean rename to Physlib/Particles/StandardModel/AlgebraRealization/MassWeight/Filtration.lean index f19442662..fedc5f55c 100644 --- a/Physlib/Particles/StandardModel/IsStandardModel/MassWeight/Filtration.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/MassWeight/Filtration.lean @@ -6,11 +6,11 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.IsCovStandardModel.MassWeight.Filtration -public import Physlib.Particles.StandardModel.IsStandardModel.CovStandardModel +public import Physlib.Particles.StandardModel.AlgebraRealization.CovStandardModel /-! # The mass-weight filtration of the jet Standard Model -`IsStandardModel` is written in the bare symbols, on which the whole jet gauge group acts; +`AlgebraRealization` is written in the bare symbols, on which the whole jet gauge group acts; `IsCovStandardModel` is written in the covariant towers, on which only the global gauge group acts. [`CovStandardModel.lean`](../CovStandardModel.lean) shows that these are one theory seen twice: `isCovStandardModel` builds the covariant form on the same algebra with @@ -65,13 +65,13 @@ namespace StandardModel open TensorProduct Matrix MatrixGroups Lorentz -namespace IsStandardModel +namespace AlgebraRealization variable {B : Type} [Ring B] [Algebra ℂ B] {repJet : Representation ℂ JetGaugeGroupI B} {repLorentz : Representation ℂ SL(2,ℂ) B} {massWeightPoly : B →ₐ[ℂ] Polynomial B} - (h : IsStandardModel B repJet repLorentz massWeightPoly) + (h : AlgebraRealization B repJet repLorentz massWeightPoly) /-! @@ -84,7 +84,7 @@ variable {B : Type} [Ring B] [Algebra ℂ B] monomial `X ^ n`. This is the jet-form counterpart of `IsCovStandardModel.massWeightSubmodule`. -/ noncomputable def massWeightSubmodule - (h : IsStandardModel B repJet repLorentz massWeightPoly) (n : ℕ) : Submodule ℂ B := + (h : AlgebraRealization B repJet repLorentz massWeightPoly) (n : ℕ) : Submodule ℂ B := h.fieldAlgebra.toSubmodule ⊓ LinearMap.ker (massWeightPoly.toLinearMap - (Polynomial.monomial n : B →ₗ[B] Polynomial B).restrictScalars ℂ) @@ -401,6 +401,6 @@ theorem mem_massWeightSubmoduleLE_eight_and_invariant_iff_lagrangian (x : B) : rw [← h.isCovStandardModel.standardModelSpanLE_eight] exact h.mem_massWeightSubmoduleLE_eight_and_invariant_iff x -end IsStandardModel +end AlgebraRealization end StandardModel diff --git a/Physlib/Particles/StandardModel/JetAlgebra/IsStandardModel.lean b/Physlib/Particles/StandardModel/JetAlgebra/AlgebraRealization.lean similarity index 80% rename from Physlib/Particles/StandardModel/JetAlgebra/IsStandardModel.lean rename to Physlib/Particles/StandardModel/JetAlgebra/AlgebraRealization.lean index 2a19c661f..3a65efe7b 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/IsStandardModel.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/AlgebraRealization.lean @@ -6,15 +6,15 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.JetAlgebra.TransformsIn -public import Physlib.Particles.StandardModel.IsStandardModel.MassWeight.Filtration +public import Physlib.Particles.StandardModel.AlgebraRealization.MassWeight.Filtration /-! # The jet algebra of the Standard Model is a Standard Model ## i. Overview -The abstract theory of `IsStandardModel` asks an algebra for an equivariant algebra map out +The abstract theory of `AlgebraRealization` asks an algebra for an equivariant algebra map out of the jet algebra of the Standard Model. The jet algebra therefore carries one for free — -the identity — and `JetAlgebra.isStandardModel` records it. The four compatibility laws are +the identity — and `JetAlgebra.algebraRealization` records it. The four compatibility laws are definitional; the two multiplicativity laws are the ones the jet gauge action and the Lorentz action were shown to satisfy when they were built. @@ -48,8 +48,8 @@ higher-dimension operators, follows as a generalization for a reader who wants o Higgs mass term `H† H`, and the dimension-four Standard Model Lagrangian. - `JetAlgebra.mem_massWeightSubmoduleLE_eight_sup_and_invariant_iff_lagrangian` : the same classification modulo a submodule of higher-dimension operators set aside. -- `JetAlgebra.isStandardModel` : the jet algebra of the Standard Model is a Standard Model. -- `JetAlgebra.isStandardModel_fieldAlgebra_eq_top` : its field algebra is everything. +- `JetAlgebra.algebraRealization` : the jet algebra of the Standard Model is a Standard Model. +- `JetAlgebra.algebraRealization_fieldAlgebra_eq_top` : its field algebra is everything. - `JetAlgebra.massWeightSubmodule`, `JetAlgebra.massWeightSubmoduleLE` : the mass-weight grading and its filtration, on the jet algebra itself. @@ -81,7 +81,7 @@ open TensorProduct Matrix MatrixGroups Lorentz ## A. The Standard Model instance -The abstract theory `IsStandardModel` is written in terms of an equivariant algebra map out +The abstract theory `AlgebraRealization` is written in terms of an equivariant algebra map out of the jet algebra, so the jet algebra is a Standard Model along the identity map. The four compatibility laws hold by definition, and the two multiplicativity laws are the ones the jet gauge action and the Lorentz action were shown to satisfy when they were built. @@ -89,13 +89,13 @@ jet gauge action and the Lorentz action were shown to satisfy when they were bui -/ /-- The jet algebra of the Standard Model is a Standard Model: it is one along the identity - algebra map, since `IsStandardModel` asks precisely for an equivariant algebra map out of + algebra map, since `AlgebraRealization` asks precisely for an equivariant algebra map out of the jet algebra. - This is the point at which the abstract theory of `IsStandardModel` — its covariant + This is the point at which the abstract theory of `AlgebraRealization` — its covariant reduction, its mass-weight filtration and its classification of invariants — becomes a theory of the concrete algebra in which a Standard Model Lagrangian is written. -/ -noncomputable def isStandardModel : IsStandardModel JetAlgebra repJetGaugeGroupI repLorentzGroup +noncomputable def algebraRealization : AlgebraRealization JetAlgebra repJetGaugeGroupI repLorentzGroup massWeightPoly where toAlgHom := AlgHom.id ℂ JetAlgebra map_repJet _ _ := rfl @@ -109,20 +109,20 @@ noncomputable def isStandardModel : IsStandardModel JetAlgebra repJetGaugeGroupI ## B. The field algebra is everything -The field algebra of an `IsStandardModel` is the algebra generated by the thirteen families +The field algebra of an `AlgebraRealization` is the algebra generated by the thirteen families of derivative symbols. On the jet algebra it is everything: a Standard Model Lagrangian lives in an algebra in which there is nothing to write down but the fields and their derivatives. The consequence is that the mass-weight filtration simplifies. The graded piece -`IsStandardModel.massWeightSubmodule n` is by definition the intersection of the field +`AlgebraRealization.massWeightSubmodule n` is by definition the intersection of the field algebra with the kernel of `massWeightPoly - X ^ n`; with the field algebra the whole algebra the intersection is idle, and what is left is the honest weight-`n` eigenspace of `massWeightPoly` on the whole algebra. That collapse is section B.2, stated for an -arbitrary `IsStandardModel` whose field algebra is everything. +arbitrary `AlgebraRealization` whose field algebra is everything. The weight pieces and the filtration are therefore worth having on `JetAlgebra` directly, -with no mention of an `IsStandardModel` instance, and section B.3 gives them: a reader of +with no mention of an `AlgebraRealization` instance, and section B.3 gives them: a reader of the classification of section C should not have to know that an instance exists. They are defined by the eigenvalue equation rather than as a kernel because `Polynomial JetAlgebra` carries no synthesizable `Ring` instance — the search does not close at this concrete @@ -139,7 +139,7 @@ The bridges of section B.3 identify the two. /-- The fields of the Standard Model generate its jet algebra: the field algebra of the instance is the whole of `JetAlgebra`. -/ -theorem isStandardModel_fieldAlgebra_eq_top : isStandardModel.fieldAlgebra = ⊤ := +theorem algebraRealization_fieldAlgebra_eq_top : algebraRealization.fieldAlgebra = ⊤ := adjoin_generators_eq_top end JetAlgebra @@ -150,7 +150,7 @@ end JetAlgebra -/ -namespace IsStandardModel +namespace AlgebraRealization open TensorProduct Matrix MatrixGroups Lorentz @@ -158,7 +158,7 @@ variable {B : Type} [Ring B] [Algebra ℂ B] {repJet : Representation ℂ JetGaugeGroupI B} {repLorentz : Representation ℂ SL(2,ℂ) B} {massWeightPoly : B →ₐ[ℂ] Polynomial B} - (h : IsStandardModel B repJet repLorentz massWeightPoly) + (h : AlgebraRealization B repJet repLorentz massWeightPoly) /-- When the field algebra is everything the graded piece of mass weight `n` is the weight-`n` eigenspace of `massWeightPoly` on the whole algebra: the intersection with the @@ -179,7 +179,7 @@ theorem massWeightSubmoduleLE_eq_iSup_ker (htop : h.fieldAlgebra = ⊤) (w : ℕ - (Polynomial.monomial k : B →ₗ[B] Polynomial B).restrictScalars ℂ) := iSup_congr fun k => iSup_congr fun _ => h.massWeightSubmodule_eq_ker htop k -end IsStandardModel +end AlgebraRealization namespace JetAlgebra @@ -192,9 +192,9 @@ open TensorProduct Matrix MatrixGroups Lorentz -/ /-- The weight-`n` piece of the jet algebra, defined on the algebra itself: the eigenspace - on which `massWeightPoly` is the monomial `X ^ n`. Nothing about `IsStandardModel` enters + on which `massWeightPoly` is the monomial `X ^ n`. Nothing about `AlgebraRealization` enters the definition; that it agrees with the instance's graded piece is - `isStandardModel_massWeightSubmodule`. -/ + `algebraRealization_massWeightSubmodule`. -/ noncomputable def massWeightSubmodule (n : ℕ) : Submodule ℂ JetAlgebra where carrier := {x | massWeightPoly x = Polynomial.monomial n x} zero_mem' := by simp @@ -218,18 +218,18 @@ noncomputable def massWeightSubmoduleLE (w : ℕ) : Submodule ℂ JetAlgebra := /-- The graded piece defined on the jet algebra is the graded piece of the instance: the two differ only by the intersection with the field algebra, which is everything. -/ -lemma isStandardModel_massWeightSubmodule (n : ℕ) : - isStandardModel.massWeightSubmodule n = massWeightSubmodule n := by - rw [isStandardModel.massWeightSubmodule_eq_ker isStandardModel_fieldAlgebra_eq_top] +lemma algebraRealization_massWeightSubmodule (n : ℕ) : + algebraRealization.massWeightSubmodule n = massWeightSubmodule n := by + rw [algebraRealization.massWeightSubmodule_eq_ker algebraRealization_fieldAlgebra_eq_top] ext x rw [LinearMap.mem_ker, mem_massWeightSubmodule] simp [sub_eq_zero] /-- The filtration defined on the jet algebra is the filtration of the instance. -/ -lemma isStandardModel_massWeightSubmoduleLE (w : ℕ) : - isStandardModel.massWeightSubmoduleLE w = massWeightSubmoduleLE w := by - show ⨆ k ∈ Finset.range (w + 1), isStandardModel.massWeightSubmodule k = _ - exact iSup_congr fun k => iSup_congr fun _ => isStandardModel_massWeightSubmodule k +lemma algebraRealization_massWeightSubmoduleLE (w : ℕ) : + algebraRealization.massWeightSubmoduleLE w = massWeightSubmoduleLE w := by + show ⨆ k ∈ Finset.range (w + 1), algebraRealization.massWeightSubmodule k = _ + exact iSup_congr fun k => iSup_congr fun _ => algebraRealization_massWeightSubmodule k /-! @@ -281,13 +281,13 @@ theorem mem_massWeightSubmoduleLE_eight_and_invariant_iff_lagrangian (x : JetAlg ∧ (∀ U : JetGaugeGroupI, repJetGaugeGroupI U x = x) ∧ ∀ Λ : SL(2,ℂ), repLorentzGroup Λ x = x) ↔ x ∈ 1 - ⊔ (isStandardModel.isCovStandardModel.isHiggsSector.dotSpan 0 0 - ⊔ (isStandardModel.isCovStandardModel.isGaugeSector.lorentzContractionEightSpan - ⊔ isStandardModel.isCovStandardModel.isHiggsSector.lorentzContractionEightSpan - ⊔ (isStandardModel.isCovStandardModel.isFermionSector.kineticSpan - ⊔ isStandardModel.isCovStandardModel.yukawaSpan))) := by - rw [← isStandardModel_massWeightSubmoduleLE] - exact isStandardModel.mem_massWeightSubmoduleLE_eight_and_invariant_iff_lagrangian x + ⊔ (algebraRealization.isCovStandardModel.isHiggsSector.dotSpan 0 0 + ⊔ (algebraRealization.isCovStandardModel.isGaugeSector.lorentzContractionEightSpan + ⊔ algebraRealization.isCovStandardModel.isHiggsSector.lorentzContractionEightSpan + ⊔ (algebraRealization.isCovStandardModel.isFermionSector.kineticSpan + ⊔ algebraRealization.isCovStandardModel.yukawaSpan))) := by + rw [← algebraRealization_massWeightSubmoduleLE] + exact algebraRealization.mem_massWeightSubmoduleLE_eight_and_invariant_iff_lagrangian x set_option maxHeartbeats 40000000 in /-- The same classification as @@ -307,20 +307,20 @@ theorem mem_massWeightSubmoduleLE_eight_sup_and_invariant_iff_lagrangian (S : Submodule ℂ JetAlgebra) (hS : ∀ U : JetGaugeGroupI, ∀ y ∈ S, repJetGaugeGroupI U y ∈ S) (hSL : ∀ Λ : SL(2,ℂ), ∀ y ∈ S, repLorentzGroup Λ y ∈ S) - (hScov : S ≤ isStandardModel.covAlgebra.toSubmodule) (x : JetAlgebra) : + (hScov : S ≤ algebraRealization.covAlgebra.toSubmodule) (x : JetAlgebra) : (x ∈ massWeightSubmoduleLE 8 ⊔ S ∧ (∀ U : JetGaugeGroupI, repJetGaugeGroupI U x = x) ∧ ∀ Λ : SL(2,ℂ), repLorentzGroup Λ x = x) ↔ ∃ y ∈ S, (∀ U : JetGaugeGroupI, repJetGaugeGroupI U y = y) ∧ (∀ Λ : SL(2,ℂ), repLorentzGroup Λ y = y) ∧ x - y ∈ 1 - ⊔ (isStandardModel.isCovStandardModel.isHiggsSector.dotSpan 0 0 - ⊔ (isStandardModel.isCovStandardModel.isGaugeSector.lorentzContractionEightSpan - ⊔ isStandardModel.isCovStandardModel.isHiggsSector.lorentzContractionEightSpan - ⊔ (isStandardModel.isCovStandardModel.isFermionSector.kineticSpan - ⊔ isStandardModel.isCovStandardModel.yukawaSpan))) := by - rw [← isStandardModel_massWeightSubmoduleLE] - exact isStandardModel.mem_massWeightSubmoduleLE_eight_sup_and_invariant_iff_lagrangian + ⊔ (algebraRealization.isCovStandardModel.isHiggsSector.dotSpan 0 0 + ⊔ (algebraRealization.isCovStandardModel.isGaugeSector.lorentzContractionEightSpan + ⊔ algebraRealization.isCovStandardModel.isHiggsSector.lorentzContractionEightSpan + ⊔ (algebraRealization.isCovStandardModel.isFermionSector.kineticSpan + ⊔ algebraRealization.isCovStandardModel.yukawaSpan))) := by + rw [← algebraRealization_massWeightSubmoduleLE] + exact algebraRealization.mem_massWeightSubmoduleLE_eight_sup_and_invariant_iff_lagrangian S hS hSL hScov x end JetAlgebra diff --git a/Physlib/Particles/StandardModel/JetAlgebra/FieldAlgebra.lean b/Physlib/Particles/StandardModel/JetAlgebra/FieldAlgebra.lean index dcfb4202b..cfb5062fb 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/FieldAlgebra.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/FieldAlgebra.lean @@ -19,7 +19,7 @@ algebra in which a Standard Model Lagrangian lives is a polynomial in the fields derivatives, because there is nothing else to write down. The set adjoined is `JetAlgebra.generators`, written to match the body of -`IsStandardModel.fieldAlgebra` verbatim, so that once the `IsStandardModel` instance on the +`AlgebraRealization.fieldAlgebra` verbatim, so that once the `AlgebraRealization` instance on the jet algebra exists the two are identified by `rfl`. The proof factors along the two tensor products. `Algebra.TensorProduct.adjoin_tmul_eq_top` @@ -78,8 +78,8 @@ open TensorProduct Matrix MatrixGroups /-- The derivative symbols of every field of the Standard Model: the gauge field, the Higgs and its conjugate, and the three generations of each of the five fermion species with their conjugates. The set is written in exactly the shape of the body of - `IsStandardModel.fieldAlgebra`, so that the field algebra of the eventual - `IsStandardModel` instance on the jet algebra is this set adjoined. -/ + `AlgebraRealization.fieldAlgebra`, so that the field algebra of the eventual + `AlgebraRealization` instance on the jet algebra is this set adjoined. -/ noncomputable def generators : Set JetAlgebra := (⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (gaugeField s μ)) ∪ (⋃ (s : Multiset (Fin 1 ⊕ Fin 3)), @@ -469,7 +469,7 @@ lemma tmul_mem_adjoin_generators (w : FermionJetAlgebra ⊗[ℂ] HiggsJetAlgebra Physically: every element of the algebra in which a Standard Model Lagrangian lives is a polynomial in the fields and their spacetime derivatives — nothing else is available to write down. Formally it is the statement that the field algebra of the eventual - `IsStandardModel` instance on the jet algebra is the whole of it. -/ + `AlgebraRealization` instance on the jet algebra is the whole of it. -/ theorem adjoin_generators_eq_top : Algebra.adjoin ℂ generators = (⊤ : Subalgebra ℂ JetAlgebra) := by refine top_le_iff.mp ?_ diff --git a/Physlib/Particles/StandardModel/JetAlgebra/Generators.lean b/Physlib/Particles/StandardModel/JetAlgebra/Generators.lean index bd4e923c5..77b1dda11 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/Generators.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/Generators.lean @@ -15,7 +15,7 @@ The jet algebra of the Standard Model is generated by thirteen families of deriv symbols: the gauge field `∂_s A_μ^φ`, the Higgs field `∂_s H_φ` and its conjugate, and the 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 each with a -conjugate. They are the families the structure `IsStandardModel` asks for. +conjugate. They are the families the structure `AlgebraRealization` asks for. Every one of them has the same shape: take the undifferentiated component function of the sector, push it into the full jet algebra along that sector's inclusion, and differentiate @@ -429,7 +429,7 @@ lemma conjDownSingletField_apply (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) ## C. The statistics of the generators -Every commutation obligation of `IsStandardModel` is one of three facts, and none of them +Every commutation obligation of `AlgebraRealization` is one of three facts, and none of them mentions the derivative label: the gauge symbols are central, the Higgs symbols commute with the Higgs sector and with the fermionic sector, and the fermionic symbols anticommute. They are stated here once, about arbitrary elements with the relevant sector membership, diff --git a/Physlib/Particles/StandardModel/JetAlgebra/MassWeightPoly.lean b/Physlib/Particles/StandardModel/JetAlgebra/MassWeightPoly.lean index 79e9c6457..a3dc8c69e 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/MassWeightPoly.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/MassWeightPoly.lean @@ -36,7 +36,7 @@ gauge sector is central. Because each sector's generator lemma has the shape `massWeightPoly g = monomial n g` — the generator *itself* as the coefficient — transporting it along `Polynomial.mapAlgHom` is a single rewrite by `Polynomial.mapAlgHom_monomial`. So every generating family of the full -algebra is again a monomial eigenvector, of exactly the weight `IsStandardModel` predicts: +algebra is again a monomial eigenvector, of exactly the weight `AlgebraRealization` predicts: `2 * (1 + |s|)` for the bosons, `3 + 2 * |s|` for the fermions. ## ii. Key results @@ -236,7 +236,7 @@ lemma massWeightPoly_includeGauge (y : ℂ ⊗[ℝ] GaugeJetAlgebra) : The Higgs field has mass dimension one, so the symbol `∂_s H_φ` has mass dimension `1 + |s|` and mass weight twice that. The exponent is written in the form -`2 * (1 + |s|)` that `IsStandardModel` asks for. +`2 * (1 + |s|)` that `AlgebraRealization` asks for. -/ @@ -289,7 +289,7 @@ lemma massWeightPoly_gaugeField (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Every fermion of the Standard Model has mass dimension `3/2`, so a fermionic symbol `∂_s ψ_φ` has mass dimension `3/2 + |s|` and mass weight `3 + 2 |s|` — the exponent form -`IsStandardModel` asks for. The computation is the same for all ten species families, +`AlgebraRealization` asks for. The computation is the same for all ten species families, because each of them reduces, by the lemmas of `Physlib.Particles.StandardModel.JetAlgebra.Generators`, to a single included generator of the fermionic sector. diff --git a/Physlib/Particles/StandardModel/Matter/JetComponentSpace/CovariantDeriv.lean b/Physlib/Particles/StandardModel/Matter/JetComponentSpace/CovariantDeriv.lean index cf251ff09..634eba788 100644 --- a/Physlib/Particles/StandardModel/Matter/JetComponentSpace/CovariantDeriv.lean +++ b/Physlib/Particles/StandardModel/Matter/JetComponentSpace/CovariantDeriv.lean @@ -205,7 +205,7 @@ noncomputable def repDualCoeff (rep : Representation ℂ JetGaugeGroupI (JetRing `[∂_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`. -/ + the form consumed by `AlgebraRealization`. -/ def _root_.StandardModel.TransformsIn (repGauge : Representation ℂ JetGaugeGroupI B) (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B) : Prop := From 45945a4f3bbf83035ca857efe87d7b715b0bbd7a Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Fri, 4 Sep 2026 16:23:15 +0400 Subject: [PATCH 266/367] refactor(IsQuadLorentz): remove decide from orbit lemma --- .../Invariants/IsQuadLorentz.lean | 153 +++++++++++++++++- 1 file changed, 150 insertions(+), 3 deletions(-) diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean index 4b8c04222..d177f1ede 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean @@ -1674,24 +1674,171 @@ 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) +/-- Cycles every Lorentz direction in an index vector. -/ +private abbrev rotateIndex {ι : Type*} (d : ι → Fin 1 ⊕ Fin 3) := + fun s => cycDir (d s) + +/-- Cycling every direction three times fixes an index vector. -/ +private lemma rotateIndex_three {ι : Type*} (d : ι → Fin 1 ⊕ Fin 3) : + rotateIndex (rotateIndex (rotateIndex d)) = d := by + funext s + exact cycDir_cycDir_cycDir (d s) + +/-- Two consecutive members of a rotation orbit can both be canonical only when they coincide. -/ +private lemma isOrbitRep_rotateIndex_eq_self {d : Fin 4 → Fin 1 ⊕ Fin 3} + (hd : IsOrbitRep d) (hr : IsOrbitRep (rotateIndex d)) : rotateIndex d = d := by + rcases hd with hall | ⟨s, hs, hbefore⟩ + · funext s + simp [rotateIndex, hall s] + · exfalso + rcases hr with hall | ⟨t, ht, htbefore⟩ + · have h := hall s + simp [rotateIndex, hs] at h + · obtain hlt | heq | hgt := lt_trichotomy t s + · have h := ht + simp [rotateIndex, hbefore t hlt] at h + · subst t + simp [rotateIndex, hs] at ht + · have h := htbefore s hgt + simp [rotateIndex, hs] at h + +/-- Canonical representatives two rotations apart coincide. -/ +private lemma isOrbitRep_rotateIndex_rotateIndex_eq_self {d : Fin 4 → Fin 1 ⊕ Fin 3} + (hd : IsOrbitRep d) (hr : IsOrbitRep (rotateIndex (rotateIndex d))) : + rotateIndex (rotateIndex d) = d := by + have h := isOrbitRep_rotateIndex_eq_self hr + (show IsOrbitRep (rotateIndex (rotateIndex (rotateIndex d))) by + simpa only [rotateIndex_three] using hd) + rw [rotateIndex_three] at h + exact h.symm + +/-- A canonical index is its own chosen orbit representative. -/ +private lemma orbitRepOf_eq_self {d : Fin 4 → Fin 1 ⊕ Fin 3} (hd : IsOrbitRep d) : + orbitRepOf d = d := by + simp [orbitRepOf, hd] + +/-- The representative chosen from the first rotation of a canonical index is that index. -/ +private lemma orbitRepOf_rotateIndex_eq_self {d : Fin 4 → Fin 1 ⊕ Fin 3} + (hd : IsOrbitRep d) : orbitRepOf (rotateIndex d) = d := by + rw [orbitRepOf] + split_ifs with h1 h2 + · exact isOrbitRep_rotateIndex_eq_self hd h1 + · exact isOrbitRep_rotateIndex_rotateIndex_eq_self hd h2 + · exact rotateIndex_three d + +/-- The representative chosen from the second rotation of a canonical index is that index. -/ +private lemma orbitRepOf_rotateIndex_rotateIndex_eq_self {d : Fin 4 → Fin 1 ⊕ Fin 3} + (hd : IsOrbitRep d) : orbitRepOf (rotateIndex (rotateIndex d)) = d := by + rw [orbitRepOf] + split_ifs with h1 h2 + · exact isOrbitRep_rotateIndex_rotateIndex_eq_self hd h1 + · exact rotateIndex_three d + · exfalso + apply h2 + rw [show (fun s => cycDir (cycDir (cycDir (d s)))) = d from + funext fun s => cycDir_cycDir_cycDir (d s)] + exact hd + +/-- Cyclically shifting the three displayed members of a rotation orbit does not change its set. -/ +private lemma rotationIndexSet_rotateIndex (d : Fin 4 → Fin 1 ⊕ Fin 3) : + rotationIndexSet (rotateIndex d) = rotationIndexSet d := by + change rotationIndexSet (fun s => cycDir (d s)) = rotationIndexSet d + ext e + simp only [rotationIndexSet, Finset.mem_insert, Finset.mem_singleton] + rw [show (fun s => cycDir (cycDir (cycDir (d s)))) = d from + funext fun s => cycDir_cycDir_cycDir (d s)] + constructor + · rintro (h | h | h) + · exact Or.inr (Or.inl h) + · exact Or.inr (Or.inr h) + · exact Or.inl h + · rintro (h | h | h) + · exact Or.inr (Or.inr h) + · exact Or.inl h + · exact Or.inr (Or.inl h) + +/-- A rotation-fixed index has no spatial directions and is therefore canonical. -/ +private lemma isOrbitRep_of_rotateIndex_eq_self {d : Fin 4 → Fin 1 ⊕ Fin 3} + (h : rotateIndex d = d) : IsOrbitRep d := by + left + intro s + have hs := congrFun h s + rcases hds : d s with x | x + · congr 1 + exact Subsingleton.elim _ _ + · simp only [rotateIndex, hds, cycDir_inr, Sum.inr.injEq] at hs + fin_cases x <;> norm_num at hs + +/-- A nonzero orbit coefficient says that the index is one of the three displayed rotations. -/ +private lemma eq_or_eq_rotateIndex_or_eq_rotateIndex_rotateIndex_of_rotationOrbitCoeff_ne_zero + {e d : Fin 4 → Fin 1 ⊕ Fin 3} (h : rotationOrbitCoeff e d ≠ 0) : + d = e ∨ d = rotateIndex e ∨ d = rotateIndex (rotateIndex e) := by + by_contra hn + push Not at hn + simp [rotationOrbitCoeff, hn] at h + +/-- Every explicitly listed representative satisfies the structural canonicality predicate. -/ +private lemma isOrbitRep_of_mem_rotationSubset : + ∀ r ∈ rotationSubset, IsOrbitRep r := by + set_option maxRecDepth 10000 in + decide + +/-- Every index in the rotation orbit of a canonical representative chooses that representative. -/ +private lemma orbitRepOf_eq_of_isOrbitRep_of_rotationOrbitCoeff_ne_zero + {r d : Fin 4 → Fin 1 ⊕ Fin 3} (hr : IsOrbitRep r) + (h : rotationOrbitCoeff r d ≠ 0) : orbitRepOf d = r := by + rcases eq_or_eq_rotateIndex_or_eq_rotateIndex_rotateIndex_of_rotationOrbitCoeff_ne_zero h + with rfl | rfl | rfl + · exact orbitRepOf_eq_self hr + · exact orbitRepOf_rotateIndex_eq_self hr + · exact orbitRepOf_rotateIndex_rotateIndex_eq_self hr + /-- 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 + intro r hr d h + exact orbitRepOf_eq_of_isOrbitRep_of_rotationOrbitCoeff_ne_zero + (isOrbitRep_of_mem_rotationSubset r hr) h /-- 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 + intro d + rw [orbitRepOf] + split_ifs + · rfl + · exact rotationIndexSet_rotateIndex d + · exact (rotationIndexSet_rotateIndex (rotateIndex d)).trans (rotationIndexSet_rotateIndex d) /-- 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 + intro d + by_cases hfix : (fun s => cycDir (d s)) = d + · rw [if_pos hfix, orbitRepOf_eq_self (isOrbitRep_of_rotateIndex_eq_self hfix)] + have h2 : (fun s => cycDir (cycDir (d s))) = d := by + funext s + exact (congrArg cycDir (congrFun hfix s)).trans (congrFun hfix s) + simp [rotationOrbitCoeff, hfix, h2] + · rw [if_neg hfix] + obtain ⟨h2, _⟩ := cycDir_orbit_distinct d hfix + have hfix' : d ≠ (fun s => cycDir (d s)) := Ne.symm hfix + have h2' : d ≠ (fun s => cycDir (cycDir (d s))) := Ne.symm h2 + have h3 : (fun s => cycDir (cycDir (cycDir (d s)))) = d := + funext fun s => cycDir_cycDir_cycDir (d s) + have h4 : (fun s => cycDir (cycDir (cycDir (cycDir (d s))))) = + (fun s => cycDir (d s)) := by + funext s + rw [cycDir_cycDir_cycDir] + rw [orbitRepOf] + split_ifs + · simp [rotationOrbitCoeff, hfix', h2'] + · simp [rotationOrbitCoeff, hfix', h2', h3] + · simp [rotationOrbitCoeff, hfix', h2', h3, h4] /-- The orbit indicator of a good index vanishes on every bad index. -/ lemma rotationOrbitCoeff_eq_zero {r d : Fin 4 → Fin 1 ⊕ Fin 3} From 66ac69e5c6e4693451b7fc82f84ec3682105b16a Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Fri, 4 Sep 2026 18:36:07 +0400 Subject: [PATCH 267/367] refactor(IsQuadLorentz): simplify lemma declarations after removing decide --- .../Invariants/IsQuadLorentz.lean | 57 ++++++++----------- Physlib/Relativity/SL2C/AxisRotations.lean | 13 ++--- 2 files changed, 30 insertions(+), 40 deletions(-) diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean index d177f1ede..3f943ce22 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean @@ -1010,12 +1010,10 @@ lemma null_iff_of_lightConeCoeffZ_ne_zero (κ : Fin 4) (μ : Fin 1 ⊕ Fin 3) /-- 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 - intro d hodd c'' hc'' +lemma exists_coeffZ_eq_zero_of_odd (d : Fin 4 → Fin 1 ⊕ Fin 3) + (hodd : Odd (Finset.univ.filter fun s => d s = Sum.inl 0 ∨ d s = Sum.inr 2).card) + (c'' : Fin 4 → Fin 4) (hc'' : (∑ s, lightConeWeight (c'' s)) = 0) : + ∃ s, lightConeCoeffZ 2 (c'' s) (d s) = 0 := by by_contra hne push Not at hne rw [Finset.filter_congr fun s _ => @@ -1087,13 +1085,13 @@ lemma odd_card_inl_zero_or_inr_one_of_not_isPairedOrDistinct /-- 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 → +lemma prod_nuZ_eq_neg_one (c' : Fin 4 → Fin 4) + (hc' : (∑ s, lightConeWeight (c' s)) = 0) (d : Fin 4 → Fin 1 ⊕ Fin 3) + (hd : ¬IsPairedOrDistinct d) + (hA : ¬(∃ s, ∀ κ, + lightConeTransitionZ 1 2 (c' s) κ * lightConeCoeffZ 2 κ (d s) = 0)) + (hC : ¬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 - intro c' hc' d hd hA hC push Not at hA have hcolumn := odd_card_inl_zero_or_inr_one_of_not_isPairedOrDistinct d hd hC @@ -1248,12 +1246,10 @@ lemma prod_nuSignZ_eq_pow (i : Fin 3) (d e : Fin 4 → Fin 1 ⊕ Fin 3) : /-- 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)) → +lemma prod_nuSignZ_eq_neg_one (i : Fin 3) (e : Fin 4 → Fin 1 ⊕ Fin 3) + (he : IsPairedOrDistinct e) (d : Fin 4 → Fin 1 ⊕ Fin 3) + (hd : ¬IsPairedOrDistinct d) (hs : ∀ s, SameSlotSector i (e s) (d s)) : (∏ s, nuSignZ i (e s) (d s)) = -1 := by - intro i e he d hd hs rw [prod_nuSignZ_eq_pow] refine Odd.neg_one_pow ?_ rw [Nat.odd_iff] @@ -1660,10 +1656,9 @@ lemma isPairedOrDistinct_of_mem_rotationSubset : 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 - rintro d (⟨h01, h23⟩ | ⟨h02, h13⟩ | ⟨h03, h12⟩ | hinj) +lemma isPairedOrDistinct_cycDir (d : Fin 4 → Fin 1 ⊕ Fin 3) + (hd : IsPairedOrDistinct d) : IsPairedOrDistinct (fun s => cycDir (d s)) := by + rcases hd with ⟨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⟩)) @@ -1794,18 +1789,15 @@ private lemma orbitRepOf_eq_of_isOrbitRep_of_rotationOrbitCoeff_ne_zero · exact orbitRepOf_rotateIndex_rotateIndex_eq_self hr /-- 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 - intro r hr d h +lemma orbitRepOf_eq_of_rotationOrbitCoeff_ne_zero (r : Fin 4 → Fin 1 ⊕ Fin 3) + (hr : r ∈ rotationSubset) (d : Fin 4 → Fin 1 ⊕ Fin 3) + (h : rotationOrbitCoeff r d ≠ 0) : orbitRepOf d = r := by exact orbitRepOf_eq_of_isOrbitRep_of_rotationOrbitCoeff_ne_zero (isOrbitRep_of_mem_rotationSubset r hr) h /-- 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 - intro d +lemma rotationIndexSet_orbitRepOf (d : Fin 4 → Fin 1 ⊕ Fin 3) : + rotationIndexSet (orbitRepOf d) = rotationIndexSet d := by rw [orbitRepOf] split_ifs · rfl @@ -1814,10 +1806,9 @@ lemma rotationIndexSet_orbitRepOf : /-- 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 - intro d +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 by_cases hfix : (fun s => cycDir (d s)) = d · rw [if_pos hfix, orbitRepOf_eq_self (isOrbitRep_of_rotateIndex_eq_self hfix)] have h2 : (fun s => cycDir (cycDir (d s))) = d := by diff --git a/Physlib/Relativity/SL2C/AxisRotations.lean b/Physlib/Relativity/SL2C/AxisRotations.lean index 0383b59b6..e290ca09f 100644 --- a/Physlib/Relativity/SL2C/AxisRotations.lean +++ b/Physlib/Relativity/SL2C/AxisRotations.lean @@ -67,8 +67,8 @@ lemma cycDir_comp_nil : (fun j : Fin 0 => cycDir (![] j)) = ![] := by 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 - rintro (μ | μ) +lemma cycDir_cycDir_cycDir (μ : Fin 1 ⊕ Fin 3) : cycDir (cycDir (cycDir μ)) = μ := by + rcases μ with μ | μ · rfl · simp only [cycDir, Sum.map_inr] congr 1 @@ -83,11 +83,10 @@ 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 {ι : 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 +lemma cycDir_orbit_distinct {ι : Type*} (d : ι → Fin 1 ⊕ Fin 3) + (hd : (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 constructor · refine fun h => hd (funext fun s => ?_) have h3 := congrArg cycDir (congrFun h s) From 91902a92fd924e18d76678f45b2e32b985899062 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Sat, 5 Sep 2026 07:50:29 +0100 Subject: [PATCH 268/367] feat: Fable 5.1. clean up of IsSu3BiAdjoint --- Physlib.lean | 24 + .../Fermions/LeptonSector/Basic.lean | 7 + .../GaugeGroup/Invariants/IsSU3BiAdjoint.lean | 3433 +++++------------ 3 files changed, 979 insertions(+), 2485 deletions(-) diff --git a/Physlib.lean b/Physlib.lean index bf1ec229e..54c513f7d 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -167,6 +167,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.MultisetAntidiagonal public import Physlib.Mathematics.MvPolynomialTranslation public import Physlib.Mathematics.OneParameterSubgroups.Basic public import Physlib.Mathematics.OneParameterSubgroups.Unitary @@ -235,6 +236,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.LagrangianTheory.Basic public import Physlib.Particles.NeutrinoPhysics.Basic public import Physlib.Particles.QED.Basic public import Physlib.Particles.QED.CurrentCoupling @@ -248,6 +250,7 @@ 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.AlgebraRealization.Basic public import Physlib.Particles.StandardModel.AlgebraRealization.Commutations public import Physlib.Particles.StandardModel.AlgebraRealization.CovStandardModel public import Physlib.Particles.StandardModel.AlgebraRealization.CovariantDeriv @@ -266,6 +269,7 @@ public import Physlib.Particles.StandardModel.Fermions.JetAlgebra.Basic public import Physlib.Particles.StandardModel.Fermions.JetAlgebra.Species public import Physlib.Particles.StandardModel.Fermions.LeptonDoublet public import Physlib.Particles.StandardModel.Fermions.LeptonDoublet.GaugeAlgebraAction +public import Physlib.Particles.StandardModel.Fermions.LeptonSector.Basic 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 @@ -278,8 +282,16 @@ 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.Basic +public import Physlib.Particles.StandardModel.GaugeAlgebra.Basis public import Physlib.Particles.StandardModel.GaugeAlgebra.InfinitesimalAction +public import Physlib.Particles.StandardModel.GaugeAlgebra.JetGaugeAlgebra public import Physlib.Particles.StandardModel.GaugeAlgebra.RootDecomposition +public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.Basic +public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.FieldStrength +public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.Symmeterized +public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.TransformsInAdjoint +public import Physlib.Particles.StandardModel.GaugeBosons.FieldStrength.Basic public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.Basic public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.GaugeAction public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.Invariants @@ -298,6 +310,11 @@ public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU3BiAdjoi 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.Jet.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Truncation +public import Physlib.Particles.StandardModel.GaugeGroup.MaurerCartan +public import Physlib.Particles.StandardModel.GaugeGroup.MaurerCartan.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.MaurerCartan.Truncation public import Physlib.Particles.StandardModel.GaugeGroup.SU2PermDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.SU3PermDecomposition public import Physlib.Particles.StandardModel.HiggsBoson.Basic @@ -341,6 +358,7 @@ public import Physlib.Particles.StandardModel.IsGaugeSector.MassWeight.GaugeWeig 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.Basic public import Physlib.Particles.StandardModel.IsHiggsSector.DerivSubmodule.Basic public import Physlib.Particles.StandardModel.IsHiggsSector.DerivSubmodule.BoostWeightDecomposition public import Physlib.Particles.StandardModel.IsHiggsSector.DerivSubmodule.GaugeWeightDecomposition @@ -534,7 +552,9 @@ public import Physlib.QuantumMechanics.RectangularBarrier.Basic public import Physlib.QuantumMechanics.SpaceDQuantumSystem public import Physlib.Relativity.Bispinors.Basic public import Physlib.Relativity.CliffordAlgebra +public import Physlib.Relativity.DerivAlgebra public import Physlib.Relativity.Fermions.Dirac.Basic +public import Physlib.Relativity.Fermions.Weyl.BoostWeight public import Physlib.Relativity.Fermions.Weyl.Contraction public import Physlib.Relativity.Fermions.Weyl.DualLeftHanded public import Physlib.Relativity.Fermions.Weyl.DualRightHanded @@ -544,6 +564,10 @@ 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.IsLorentzDeriv +public import Physlib.Relativity.JetRing.Basic +public import Physlib.Relativity.JetRing.Matrix +public import Physlib.Relativity.LightConeDeriv public import Physlib.Relativity.LorentzAlgebra.Basic public import Physlib.Relativity.LorentzAlgebra.Basis public import Physlib.Relativity.LorentzAlgebra.ExponentialMap diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSector/Basic.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSector/Basic.lean index 4c74b650e..4a1ede0b7 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonSector/Basic.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonSector/Basic.lean @@ -1,3 +1,10 @@ +/- +Copyright (c) 2026 Joseph Tooby-Smith. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Joseph Tooby-Smith +-/ +module + /-! ## Lepton sector diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiAdjoint.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiAdjoint.lean index a0cb5fbe3..619d7abf0 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiAdjoint.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiAdjoint.lean @@ -5,64 +5,62 @@ Authors: Joseph Tooby-Smith -/ 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 +public import Mathlib.Analysis.InnerProductSpace.Projection.Basic /-! # 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. - -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 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 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 -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_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`. +A gluon field strength `F^a` carries one colour index `a`, running over the eight Gell-Mann +directions of `su(3)`. A product of two field strengths carries two, and the combination +that enters the Yang–Mills Lagrangian is the colour trace `∑ a, F^a F^a`. This file proves +the group theory behind that choice, in the form the Standard Model files consume: among +all combinations of the components of such a product, the multiples of the trace are the +only ones every colour rotation leaves alone. In the language of representation theory, +`8 ⊗ 8 = 1 ⊕ 8 ⊕ 8 ⊕ 10 ⊕ 10̄ ⊕ 27` contains exactly one singlet, the Kronecker delta. + +`IsSU3BiAdjoint B repGauge T` records the hypothesis. `T` is a family indexed by two colour +indices and valued in a module `B` carrying a representation `repGauge` of the gauge group, +and a colour rotation `U ∈ SU(3)` moves its components by two copies of the adjoint matrix +of `U`, as a rank two tensor `T^{a b}` should. Nothing is asked of the isospin and +hypercharge factors: a product of coloured fields may well carry hypercharge, and the +conclusions are accordingly about invariance under colour. + +The theorem, `mem_span_sup_su3_invariant_iff`, is stated modulo a colour-stable submodule +`S`, because the Standard Model files handle many families at once and peel them off one +at a time: a colour invariant in the span of the components joined with `S` is a multiple +of the trace contraction up to a colour-invariant error in `S`. + +The proof has two halves, and neither needs more than the module structure of `B`. + +The first half is linear algebra. A vector of the span is `∑ l, c l • T l` for a +coefficient function `c` on pairs of colour indices, and a colour rotation acts on `c` by +the Kronecker square of its adjoint matrix. The coefficients contracting to zero form a +subspace stable under all these actions; the actions are orthogonal for the standard inner +product, so the orthogonal complement is stable too. Projecting the coefficient of an +invariant vector onto that complement leaves the vector alone and makes the coefficient +itself invariant. One inner product thus replaces every averaging argument. + +The second half is a finite computation. An invariant coefficient is a bilinear form on +colour coordinates fixed by every colour rotation, and a handful of explicit rotations pin +it down. The colour parities, the diagonal sign matrices of `SU(3)`, scale each Gell-Mann +direction by a sign and kill every entry joining two directions of different sign pattern. +The cyclic permutation and the transposition of colours, the Weyl group, equate the diagonal +entries along the root directions, equate them in the Cartan plane and kill the +antisymmetric entries. Two rotations inside the `SU(2)` of the first two colours carry a +Cartan direction onto the two members of a root pair and tie the Cartan entries to the root +entries. So the form is a multiple of the Kronecker delta and the vector a multiple of the +trace. + +Section A sets up the adjoint matrix, the transformation law and the colour part of a +representation. Section B has the span, the contraction against a coefficient function, the +action on coefficients and the trace contraction. Section C has the coordinate vectors of +one index, section D computes the rotations on them, section E is the finite computation, +section F the inner product argument, and section G divides out a stable submodule and +proves the theorem. An aside at the end holds what other files import from here and the +theorem does not use: the weight basis of the adjoint, the trivial square-zero extension +and the gauge form of the theorem. -/ @[expose] public section @@ -73,50 +71,61 @@ open Matrix /-! -## A. The `SU(3)` adjoint matrix and bi-adjoint families +## A. The adjoint action of `SU(3)` on a colour index -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 -## 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. +Conjugating a Gell-Mann matrix by `U ∈ SU(3)` gives another traceless hermitian matrix, +and `su3AdjointMatrix U` holds its coordinates in the Gell-Mann basis, read off with the +trace pairing. By definition it is the `su(3)` block of `GaugeAlgebra.adjointMatrix` at the +colour rotation `(U, 1, 1)`, so it is orthogonal, the identity at `U = 1` and transposed at +`U⁻¹`, all of which is inherited from there. -/ -/-- 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. -/ +/-- The adjoint matrix of `U ∈ SU(3)`: the trace pairing of the Gell-Mann basis with the + Gell-Mann basis conjugated by `U`. -/ 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)`. -/ +/-- The entries of the adjoint matrix. -/ @[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 + = 2⁻¹ * (Matrix.trace (gellMannMatrix i * (U.1 * gellMannMatrix j * star U.1))).re := + 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. -/ +/-- The rows of the adjoint matrix are orthonormal. -/ 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. -/ +/-- The adjoint matrix of the identity is the identity. -/ +lemma su3AdjointMatrix_one (a b : Fin 8) : + su3AdjointMatrix 1 a b = if a = b then 1 else 0 := by + have h := congrFun (congrFun GaugeAlgebra.adjointMatrix_one (Sum.inl a)) (Sum.inl b) + rw [Matrix.one_apply] at h + simpa [su3AdjointMatrix_apply] using h + +/-- The adjoint matrix of the inverse is the transpose. -/ +lemma su3AdjointMatrix_inv (U : specialUnitaryGroup (Fin 3) ℂ) (a b : Fin 8) : + su3AdjointMatrix U⁻¹ a b = su3AdjointMatrix U b a := by + have h := GaugeAlgebra.adjointMatrix_inv_apply (U, 1, 1) (Sum.inl a) (Sum.inl b) + rwa [show ((U, 1, 1) : GaugeGroupI)⁻¹ = (U⁻¹, 1, 1) from by simp] at h + +/-- The Gell-Mann matrices are orthonormal for the trace pairing: this is the adjoint + matrix of the identity, read entry by entry. -/ +lemma re_trace_gellMannMatrix_mul (a b : Fin 8) : + 2⁻¹ * (Matrix.trace (gellMannMatrix a * gellMannMatrix b)).re + = if a = b then 1 else 0 := by + rw [← su3AdjointMatrix_one a b, su3AdjointMatrix_apply] + simp + +/-- An entry of the adjoint matrix is a Gell-Mann coordinate of a 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 @@ -125,26 +134,18 @@ lemma su3AdjointMatrix_eq_gellMannCoeff (U : specialUnitaryGroup (Fin 3) ℂ) (a /-! -## 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`. +## A.2. Bi-adjoint families -`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. +The transformation law carries one factor of the adjoint matrix per index, with the summed +index in the row slot. `IsSU3BiAdjointMat` records it for one linear map and one element +of `SU(3)`, and `IsSU3BiAdjoint` asks it of the colour rotation `(U, 1, 1)` for every `U`. +Since `U ↦ (U, 1, 1)` is a homomorphism this is an action of `SU(3)`, and it is all that +is assumed. -/ -/-- 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. -/ +/-- The linear map `f` moves the components of `T` as `U ∈ SU(3)` moves a tensor with two + adjoint indices: one factor of the adjoint matrix per index. -/ def IsSU3BiAdjointMat {B : Type*} [AddCommMonoid B] [Module ℂ B] (U : specialUnitaryGroup (Fin 3) ℂ) (f : B →ₗ[ℂ] B) (T : (Fin 2 → Fin 8) → B) : Prop := @@ -153,9 +154,8 @@ 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: a colour - transformation moves the components by the `SU(3)` element it is built from. Nothing is - asked of the isospin or hypercharge factors. -/ + as a tensor `T^{a b}` under the colour factor of the gauge group. Nothing is asked of the + isospin and hypercharge factors. -/ structure IsSU3BiAdjoint (B : Type*) [AddCommMonoid B] [Module ℂ B] (repGauge : Representation ℂ GaugeGroupI B) (T : (Fin 2 → Fin 8) → B) : Prop where @@ -167,28 +167,16 @@ structure IsSU3BiAdjoint (B : Type*) [AddCommMonoid B] [Module ℂ B] ## A.3. The colour part of a representation 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. 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`. +gives `repSU3`, again a representation of the whole gauge group. Invariance under it is +invariance under colour, `∀ U, repGauge (U, 1, 1) x = x`, stability of a submodule under it +is stability under colour, and a bi-adjoint family for `repGauge` is one for +`repSU3 repGauge`. Section G uses it to divide out a submodule that is only known to be +stable under colour. -/ -/-- 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. -/ +/-- The colour part of a representation of the gauge group: it reads only the `SU(3)` + factor of its argument. -/ 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) @@ -202,96 +190,79 @@ noncomputable def repSU3 {B : Type*} [AddCommMonoid B] [Module ℂ B] 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. -/ +/-- The colour part acts by the representation at the colour rotation with the same + `SU(3)` factor. -/ 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. -/ +/-- Invariance under the colour part is invariance under the colour rotations. -/ 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. -/ +/-- Stability under the colour part is stability under the colour rotations. -/ 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)⟩ -/-- 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 + +/- `span`, `contract`, `traceContraction` and `biVec` take the hypothesis `hT` only to hang +off it by dot notation, and `mem_span_sup_invariant_iff` keeps a hypothesis for its caller; +each is marked `nolint unusedArguments` where it is declared. -/ 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) - -/-- 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. -/ + {repGauge : Representation ℂ GaugeGroupI B} {T : (Fin 2 → Fin 8) → B} + +/-- A bi-adjoint family for a representation is one for its colour part: the law reads only + the colour factor to begin with. -/ lemma toRepSU3 (hT : IsSU3BiAdjoint B repGauge T) : IsSU3BiAdjoint B (repSU3 repGauge) T where 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 - -/-- 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. The trace contraction +## B. Coefficients, the contraction and the trace + +A vector of the span of the components is a contraction `∑ l, c l • T l` against a +coefficient function `c` on pairs of colour indices. The transformation law says exactly +that a colour rotation moves such a contraction by moving `c` with the Kronecker square of +its adjoint matrix, `act U`, and orthogonality of the adjoint matrix says that `act U⁻¹` is +the transpose of `act U`. The trace contraction `∑ a, T ![a, a]` is the contraction against +the Kronecker delta `traceCoeff`, and it is colour invariant because the delta is. -/ -/-- A sum over families of two `su(3)` adjoint indices is a double sum. -/ +/-- The span of the components. -/ +@[nolint unusedArguments] +def span (hT : IsSU3BiAdjoint B repGauge T) : Submodule ℂ B := ⨆ d, ℂ ∙ T d + +/-- The contraction of the family against a coefficient function, `c ↦ ∑ l, c l • T l`. -/ +@[nolint unusedArguments] +noncomputable def contract (hT : IsSU3BiAdjoint B repGauge T) : + ((Fin 2 → Fin 8) → ℂ) →ₗ[ℂ] B := + Fintype.linearCombination ℂ T + +/-- The contraction, written out. -/ +lemma contract_apply (hT : IsSU3BiAdjoint B repGauge T) (c : (Fin 2 → Fin 8) → ℂ) : + hT.contract c = ∑ l, c l • T l := + Fintype.linearCombination_apply _ _ _ + +/-- The span of the components is the range of the contraction: a vector lies in it + precisely when it is a linear combination of the components. -/ +lemma mem_span_iff (hT : IsSU3BiAdjoint B repGauge T) (x : B) : + x ∈ hT.span ↔ ∃ (c : (Fin 2 → Fin 8) → ℂ), x = ∑ d, c d • T d := by + rw [span, ← Submodule.span_range_eq_iSup, ← Fintype.range_linearCombination, + LinearMap.mem_range] + simp only [Fintype.linearCombination_apply, eq_comm] + +/-- A sum over pairs of colour 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 @@ -301,807 +272,201 @@ lemma sum_pi_two {M : Type*} [AddCommMonoid M] (F : (Fin 2 → Fin 8) → M) : 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. -/ +/-- The action of `U ∈ SU(3)` on coefficient functions: the Kronecker square of its + adjoint matrix. -/ +noncomputable def act (U : specialUnitaryGroup (Fin 3) ℂ) : + ((Fin 2 → Fin 8) → ℂ) →ₗ[ℂ] (Fin 2 → Fin 8) → ℂ := + Matrix.toLin' (Matrix.of fun a l => + ∏ i : Fin 2, ((su3AdjointMatrix U (a i) (l i) : ℝ) : ℂ)) + +/-- The action on coefficients, written out. -/ +lemma act_apply (U : specialUnitaryGroup (Fin 3) ℂ) (c : (Fin 2 → Fin 8) → ℂ) + (a : Fin 2 → Fin 8) : + act U c a = ∑ l, (∏ i : Fin 2, ((su3AdjointMatrix U (a i) (l i) : ℝ) : ℂ)) * c l := by + simp [act, Matrix.mulVec, dotProduct] + +/-- The transformation law in coefficient form: a map moving the components by `U` moves a + contraction by `act U` on its coefficients. -/ +lemma map_contract (hT : IsSU3BiAdjoint B repGauge T) {U : specialUnitaryGroup (Fin 3) ℂ} + {f : B →ₗ[ℂ] B} (hf : IsSU3BiAdjointMat U f T) (c : (Fin 2 → Fin 8) → ℂ) : + f (hT.contract c) = hT.contract (act U c) := by + simp only [contract_apply, map_sum, map_smul, act_apply, Finset.sum_smul] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun l _ => ?_ + rw [hf l, Finset.smul_sum] + exact Finset.sum_congr rfl fun a _ => by rw [smul_smul, mul_comm] + +/-- The action of `U⁻¹` is the transpose of the action of `U`, the adjoint matrix being + orthogonal. -/ +lemma sum_act_mul (U : specialUnitaryGroup (Fin 3) ℂ) (c d : (Fin 2 → Fin 8) → ℂ) : + ∑ a, act U c a * d a = ∑ l, c l * act U⁻¹ d l := by + simp only [act_apply, su3AdjointMatrix_inv, Finset.sum_mul, Finset.mul_sum] + rw [Finset.sum_comm] + exact Finset.sum_congr rfl fun l _ => Finset.sum_congr rfl fun a _ => by ring + +/-- The Kronecker delta on pairs of colour indices: the coefficients of the trace. -/ +def traceCoeff : (Fin 2 → Fin 8) → ℂ := fun l => if l 0 = l 1 then 1 else 0 + +/-- The Kronecker delta is an invariant coefficient: the rows of the adjoint matrix are + orthonormal. -/ +lemma act_traceCoeff (U : specialUnitaryGroup (Fin 3) ℂ) : act U traceCoeff = traceCoeff := by + funext a + rw [act_apply, sum_pi_two] + have key : ∀ x y : Fin 8, + (∏ i : Fin 2, ((su3AdjointMatrix U (a i) (![x, y] i) : ℝ) : ℂ)) * traceCoeff ![x, y] + = if y = x then + ((su3AdjointMatrix U (a 0) x * su3AdjointMatrix U (a 1) x : ℝ) : ℂ) else 0 := by + intro x y + by_cases h : y = x + · subst h + simp [traceCoeff, Fin.prod_univ_two] + · simp [traceCoeff, Fin.prod_univ_two, h, Ne.symm h] + simp only [key, Finset.sum_ite_eq', Finset.mem_univ, if_true, ← Complex.ofReal_sum, + sum_su3AdjointMatrix_row_mul] + by_cases h : a 0 = a 1 <;> simp [traceCoeff, h] + +/-- The trace contraction: the Kronecker contraction of the two colour indices. -/ +@[nolint unusedArguments] 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 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. -/ +/-- The trace contraction is the contraction against the Kronecker delta. -/ +lemma contract_traceCoeff (hT : IsSU3BiAdjoint B repGauge T) : + hT.contract traceCoeff = hT.traceContraction := by + rw [contract_apply, sum_pi_two] + simp [traceCoeff, traceContraction, ite_smul] + +/-- Any map moving the components by an `SU(3)` matrix fixes the trace contraction. -/ lemma map_traceContraction (hT : IsSU3BiAdjoint B repGauge T) - {U : specialUnitaryGroup (Fin 3) ℂ} {f : B →ₗ[ℂ] B} - (hf : IsSU3BiAdjointMat U f 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 f (∑ c : Fin 8, T ![c, c]) = _ - rw [map_sum] - have h1 : ∀ c : Fin 8, f (T ![c, c]) - = ∑ b : Fin 2 → Fin 8, - ((su3AdjointMatrix U (b 0) c * su3AdjointMatrix U (b 1) c : ℝ) : ℂ) • T b := by - intro c - rw [hf ![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_su3AdjointMatrix_row_mul] - simp [apply_ite] - rw [step, ← hT.traceContraction_eq_sum] - -/-- 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. -/ + rw [← hT.contract_traceCoeff, hT.map_contract hf, act_traceCoeff] + +/-- The trace contraction is colour invariant. Nothing constrains the isospin and + hypercharge factors, which may well move it. -/ 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 - -/-! - -## 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`. 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 -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. - --/ - -namespace IsSU3BiAdjoint - -set_option linter.unusedVariables false - -/-! - -## C.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 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 (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 = GaugeAlgebra.su3CartanId c := by - revert a - decide - -TODO (lines := 405-445) "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 - --/ - -/-- 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 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) - (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 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) - (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 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)) - rw [dualMap_coord_apply] at e - rw [e] - simp [Finsupp.single_apply] - -/-! +## C. Coordinate vectors of one index -## C.3. The weight vectors of one adjoint index +The action of `U` on a single adjoint index is the row action `rowAct U` of its adjoint +matrix on coordinate vectors `Fin 8 → ℂ`, and `unitVec a` is the coordinate vector of the +Gell-Mann direction `a`. Sections D and E work entirely with these. -/ -/-- 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 = GaugeAlgebra.su3CartanId 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 an element of `SU(3)` on the coordinates of one `su(3)` adjoint - index. -/ +/-- The action of `U ∈ SU(3)` on the coordinates of one adjoint index. -/ 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 : ℂ) : - ∑ 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 (GaugeGroupI.toSU3 (gaugeTorusGen i)) (wtCoeff k) - = ((expI : ℂ) ^ GaugeWeight.coord (wtWeight k) i) • wtCoeff k := by +/-- The row action is additive. -/ +lemma rowAct_add (U : specialUnitaryGroup (Fin 3) ℂ) (c c' : Fin 8 → ℂ) : + rowAct U (c + c') = rowAct U c + rowAct U c' := by funext a - match k with - | Sum.inl r => - 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 [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) * _ - rw [pair_add_eq] - rfl - | Sum.inr (Sum.inl r) => - 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 [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) - = (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) => - have hw : ∀ x : Fin 8, wtCoeff (Sum.inr (Sum.inr c)) x - = 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 - simp - 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, su3AdjointMatrix_cartanId, one_smul] - simp only [apply_ite (fun x : ℝ => (x : ℂ)), Complex.ofReal_one, Complex.ofReal_zero] - -/-! - -## C.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] - -/-- 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] - simp [unitVec, ite_smul] - rw [Finset.sum_eq_single_of_mem a (Finset.mem_univ a) fun x _ hx => by simp [hx]] - simp - -/-- 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)) * - (((su3AdjointMatrix U (a 0) (d 0) : ℝ) : ℂ) * - ((su3AdjointMatrix U (a 1) (d 1) : ℝ) : ℂ))) - • T a := by - intro d - 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] - 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 - -/-- 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.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.repSU3_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 (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. -/ -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 _)) - -/-! + simp only [rowAct, Pi.add_apply, mul_add, Finset.sum_add_distrib] -## C.5. The decomposition +/-- The row action respects differences. -/ +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. -/ +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 -/-- 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 (repSU3 repGauge) hT.span := - GaugeWeightDecomposition.copy - (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.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 - 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, 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), - (-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 +kernel +/-- The row action on a Gell-Mann direction is a column of the adjoint matrix. -/ +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] /-! -## C.6. The zero-weight piece +## D. A handful of colour rotations on coordinate 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. +The classification of section E tests an invariant form against a few elements of `SU(3)`, +and this section computes what each does to the coordinate vectors of one index. Each +computation is the same: conjugate the Gell-Mann matrices by the element, read off the +adjoint matrix, and hence the row action on `unitVec`. --/ - -/-- 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 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 - ((repSU3_invariant_iff_su3 repGauge _).2 hT.repGauge_traceContraction) +## D.1. The colour parities -/-! - -## 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 diagonal matrices of `SU(3)` with entries `±1` are the identity and the three parities +`su3Parity k`, which fix the colour `k` and reverse the other two. Conjugation by a parity +scales a Gell-Mann matrix by the product of the two diagonal entries it pairs, which is a +sign `paritySign`, so each Gell-Mann direction is an eigenvector of every parity. -/ -/-- 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]) +/-- The colour parity fixing the colour `k` and reversing the other two. -/ +noncomputable def su3Parity (k : Fin 3) : specialUnitaryGroup (Fin 3) ℂ := + ⟨Matrix.diagonal fun i => if i = k then 1 else -1, + Matrix.mem_specialUnitaryGroup_diagonal _ (fun i => by split_ifs <;> simp) + (by fin_cases k <;> simp [Fin.prod_univ_three])⟩ + +/-- The sign by which the parity `k` scales each Gell-Mann direction: `-1` on the four root + directions pairing the colour `k` with another, `1` on the rest. -/ +def paritySign : 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] + +/-- Conjugation by a parity scales each Gell-Mann matrix by its sign. -/ +lemma conj_gellMannMatrix_su3Parity (k : Fin 3) (b : Fin 8) : + (su3Parity k).1 * gellMannMatrix b * star (su3Parity k).1 + = ((paritySign k b : ℤ) : ℂ) • gellMannMatrix b := by + rw [show (su3Parity k).1 = Matrix.diagonal fun i => if i = k then (1 : ℂ) else -1 from rfl, + Matrix.star_eq_conjTranspose, Matrix.diagonal_conjTranspose] + ext i j + rw [Matrix.mul_diagonal, Matrix.diagonal_mul] + fin_cases k <;> fin_cases b <;> fin_cases i <;> fin_cases j <;> + simp [paritySign, gellMannMatrix_zero, gellMannMatrix_one, gellMannMatrix_two, + gellMannMatrix_three, gellMannMatrix_four, gellMannMatrix_five, gellMannMatrix_six, + gellMannMatrix_seven] + +/-- The adjoint matrix of a parity is diagonal, with the signs on the diagonal. -/ +lemma su3AdjointMatrix_su3Parity (k : Fin 3) (a b : Fin 8) : + su3AdjointMatrix (su3Parity k) a b = if a = b then (paritySign k b : ℝ) else 0 := by + rw [su3AdjointMatrix_apply, conj_gellMannMatrix_su3Parity, Matrix.mul_smul, + Matrix.trace_smul, smul_eq_mul, ← Complex.ofReal_intCast, Complex.re_ofReal_mul, + mul_left_comm, re_trace_gellMannMatrix_mul] + by_cases h : a = b <;> simp [h] + +/-- A parity scales each Gell-Mann direction by its sign. -/ +lemma rowAct_su3Parity_unitVec (k : Fin 3) (b : Fin 8) : + rowAct (su3Parity k) (unitVec b) = ((paritySign k b : ℤ) : ℂ) • unitVec b := by + funext a + rw [rowAct_unitVec, su3AdjointMatrix_su3Parity] + by_cases h : a = b <;> simp [unitVec, h] /-! -## 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. 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, -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 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. +## D.2. The cyclic colour rotation -## 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`. +Conjugation by the cyclic permutation matrix `su3Perm` permutes the matrix units, hence the +Gell-Mann matrices up to signs; only the two Cartan directions are mixed, by a rotation +through `2 π / 3`. On the Cartan plane the rotation is diagonalised by the combinations +`x₂ ∓ i x₇`, recorded in `cartanVec`, with eigenvalues `ω` and `ω ^ 2`. -/ -/-- The star of the cyclic colour matrix is the permutation matrix of the inverse - three-cycle. -/ +/-- The star of the cyclic colour matrix is the matrix of the inverse 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 -/-- 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) ℂ | 0 => !![0, 0, 0; 0, 0, 1; 0, 1, 0] @@ -1125,9 +490,8 @@ lemma conj_gellMannMatrix_su3Perm (b : Fin 8) : 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. -/ +/-- The image of each Gell-Mann direction under the cyclic colour rotation: the six root + directions are permuted up to sign, the two Cartan directions rotated into each other. -/ noncomputable def permCol : Fin 8 → Fin 8 → ℂ | 0 => unitVec 5 | 1 => unitVec 6 @@ -1138,14 +502,7 @@ noncomputable def permCol : Fin 8 → Fin 8 → ℂ | 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 (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. -/ +/-- The cyclic colour rotation on the Gell-Mann directions. -/ lemma rowAct_su3Perm_unitVec (b : Fin 8) : rowAct su3Perm (unitVec b) = permCol b := by have h3 : ((Real.sqrt 3 : ℝ) : ℂ) * ((Real.sqrt 3 : ℝ) : ℂ) = 3 := by @@ -1158,61 +515,13 @@ lemma rowAct_su3Perm_unitVec (b : Fin 8) : | 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 (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 (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 (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 - -/-- 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_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_su3Perm_unitVec, permCol] - all_goals module - -/-- The two eigenvectors of the cyclic colour rotation in the Cartan plane. -/ +/-- The two eigenvectors of the cyclic colour rotation in the Cartan plane, the + combinations `x₂ ∓ i x₇` of the two Cartan coordinates. -/ 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)) + | 0 => unitVec 2 - Complex.I • unitVec 7 + | 1 => unitVec 2 + Complex.I • unitVec 7 -/-- The grade of each Cartan eigenvector. -/ +/-- The grade of each Cartan eigenvector: its eigenvalue is `ω ^ cartanGrade`. -/ def cartanGrade : Fin 2 → ZMod 3 | 0 => 1 | 1 => 2 @@ -1238,38 +547,37 @@ lemma su3Omega_sq : su3Omega ^ 2 = -2⁻¹ - ((Real.sqrt 3 / 2 : ℝ) : ℂ) * C push_cast linear_combination (((Real.sqrt 3 : ℝ) : ℂ) ^ 2 / 4) * Complex.I_sq + (-(1 : ℂ) / 4) * h3 -/-- The grade-one sign, written out. -/ +/-- 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. -/ +/-- The grade two sign `ω ^ 2`, 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. -/ +/-- The cyclic colour rotation scales each Cartan eigenvector by the cube root of unity of + its grade. -/ 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_su3Perm_unitVec, permCol, - su3PermSign_one_eq, su3PermSign_two_eq] <;> + simp only [cartanVec, cartanGrade, rowAct_sub, rowAct_add, rowAct_smul, + rowAct_su3Perm_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 +/-- The first Cartan direction in the eigenbasis of the cyclic colour rotation. -/ +lemma unitVec_two_eq_cartanVec_add : + unitVec 2 = (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 +/-- The second Cartan direction in the eigenbasis of the cyclic colour rotation. -/ +lemma unitVec_seven_eq_cartanVec_sub : + unitVec 7 = (Complex.I / 2) • (cartanVec 0 - cartanVec 1) := by simp only [cartanVec] match_scalars all_goals first @@ -1278,463 +586,22 @@ lemma wtCoeff_cartan_one : /-! -## D.3. The ten zero-weight products under the rotation +## D.3. The colour transposition -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. +Conjugation by the transposition `su3Transp` of the first two colours permutes the +Gell-Mann matrices up to signs, without mixing any two of them: 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. -/ -/-- 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 - -/-- 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 su3Perm - -/-- 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) := - 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) : - 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 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 := - 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) : - 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 - -/-- 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] - 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 - (map_cycleEigen _ (hT.repGauge_gaugeSU3Perm_prodCycle 0) k) - · rw [Submodule.span_le, Set.singleton_subset_iff] - exact Module.End.mem_eigenspace_iff.mpr - (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] - -/-- 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, 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 - 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. -/ -@[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 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 - 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; 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 - ⊔ (ℂ ∙ 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. 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 - -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. -/ +/-- The transposition 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. -/ +/-- The conjugate of each Gell-Mann matrix by the transposition. -/ noncomputable def transpGellMann : Fin 8 → Matrix (Fin 3) (Fin 3) ℂ | 0 => gellMannMatrix 0 | 1 => -gellMannMatrix 1 @@ -1745,10 +612,6 @@ 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_su3Transp (b : Fin 8) : su3Transp.1 * gellMannMatrix b * star su3Transp.1 = transpGellMann b := by @@ -1758,10 +621,7 @@ lemma conj_gellMannMatrix_su3Transp (b : Fin 8) : 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. -/ +/-- The image of each Gell-Mann direction under the transposition. -/ noncomputable def transpCol : Fin 8 → Fin 8 → ℂ | 0 => unitVec 0 | 1 => -unitVec 1 @@ -1772,15 +632,14 @@ noncomputable def transpCol : Fin 8 → Fin 8 → ℂ | 6 => unitVec 4 | 7 => unitVec 7 -/-- The transposition on the Gell-Mann coordinate directions. -/ +/-- The transposition on the Gell-Mann directions. -/ 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, su3AdjointMatrix_eq_gellMannCoeff, - conj_gellMannMatrix_su3Transp] + 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, @@ -1789,481 +648,33 @@ lemma rowAct_su3Transp_unitVec (b : Fin 8) : | 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_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_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_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_su3Transp_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. - --/ - -/-- 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 su3Transp - -/-- 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.map_biVec hf, rowAct_su3Transp_wtCoeff] <;> - rfl - -/-- 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) := - 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 := - 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) : - 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 - -/-- 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 := - 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 := - 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 := - 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 := - 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. -/ -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 +## D.4. Two turns in the `SU(2)` of the first two colours -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. +Everything so far normalises the colour torus, and nothing in the normaliser can tell the +Cartan plane from the root directions. The directions `λ₁`, `λ₂`, `λ₃` span an `su(2)` +acting on the first two colours, on which the corresponding `SU(2)` acts by rotations, and +the turn `su3Turn v` with `u = (1 + i) / 2` and `|v| = |u|` carries `λ₃` onto the root +direction `-2 u v`. Two turns are used: `su3TurnFst` lands on `-λ₁` and `su3TurnSnd` on +`λ₂`, since the Weyl group never mixes the two members of a root pair. -/ -/-- Symmetrizing an element of the grade zero piece over the transposition lands in the - join of the two symmetric lines. -/ -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 + (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.map_su3Transp_cycleEigen_zero hf] - exact Submodule.mem_sup_left (Submodule.mem_span_singleton_self _) - · 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.map_su3Transp_cartanEigenProd hf] - exact Submodule.mem_sup_right (Submodule.mem_span_singleton_self _) - · 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 _) - 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 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 - (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.map_su3Transp_cycleEigen_zero hf] - exact Submodule.mem_sup_left (Submodule.mem_span_singleton_self _) - · 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.map_su3Transp_cartanEigenProd hf] - exact Submodule.mem_sup_right (Submodule.mem_span_singleton_self _) - · 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 _)) - 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.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 - 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) := - (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, - repSU3_gaugeSU3Transp] - 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.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 - · 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, - repSU3_gaugeSU3Transp] - 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.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 - · 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 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) - ((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 - 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 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] - 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 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 - -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. -/ +/-- 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. -/ +/-- The star of a turn matrix. -/ 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. -/ +/-- A turn matrix lies in `SU(3)` when its off-diagonal entry has the modulus of the + diagonal one. -/ lemma su3TurnMatrix_mem {v : ℂ} (hv : v * (starRingEnd ℂ) v = 2⁻¹) : su3TurnMatrix v ∈ specialUnitaryGroup (Fin 3) ℂ := by rw [Matrix.mem_specialUnitaryGroup_iff] @@ -2281,17 +692,12 @@ lemma su3TurnMatrix_mem {v : ℂ} (hv : v * (starRingEnd ℂ) v = 2⁻¹) : | ring1 | linear_combination hv - (1 / 4 : ℂ) * Complex.I_sq -/-- A quarter turn as an element of `SU(3)`. -/ +/-- A 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. -/ +/-- Conjugating the first Cartan direction by a turn: the diagonal cancels, and what is left + is a combination of the two members of the first root pair. -/ 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; @@ -2308,55 +714,20 @@ lemma conj_gellMannMatrix_two_su3Turn {v : ℂ} (hv : v * (starRingEnd ℂ) v = | 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_su3Turn {v : ℂ} (hv : v * (starRingEnd ℂ) v = 2⁻¹) : - (su3Turn v hv).1 * gellMannMatrix 7 * star (su3Turn v hv).1 - = gellMannMatrix 7 := by - 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 `-λ₁`. -/ +/-- The first turn, at `v = (1 - 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 `λ₂`. -/ +/-- The second turn, at `v = (1 + 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. -/ +/-- The first turn carries the first Cartan direction to minus the first member of the + first root pair. -/ lemma rowAct_su3TurnFst_unitVec_two : rowAct su3TurnFst (unitVec 2) = -unitVec 0 := by funext a @@ -2365,9 +736,8 @@ lemma rowAct_su3TurnFst_unitVec_two : 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. -/ +/-- The second turn carries the first Cartan direction to the second member of the first + root pair. -/ lemma rowAct_su3TurnSnd_unitVec_two : rowAct su3TurnSnd (unitVec 2) = unitVec 1 := by funext a @@ -2376,396 +746,623 @@ lemma rowAct_su3TurnSnd_unitVec_two : fin_cases a <;> simp [gellMannCoeff, unitVec] all_goals norm_num -/-- A quarter turn fixes the second Cartan coordinate direction. -/ -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, 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_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_su3TurnSnd_unitVec_seven : - rowAct su3TurnSnd (unitVec 7) = unitVec 7 := by - rw [su3TurnSnd] - exact rowAct_su3Turn_unitVec_seven _ +/-! + +## E. An invariant coefficient is a multiple of the Kronecker delta + +A coefficient `c` is a bilinear form `form c` on coordinate vectors, with `c ![a, b]` the +value on two Gell-Mann directions. If `c` is fixed by every `act U`, the form is fixed by +every row action, and the rotations of section D read off its entries: the parities +kill the entries joining directions of different sign pattern, the transposition and the +cyclic rotation kill the remaining off-diagonal entries and equate the diagonal ones within +the root directions and within the Cartan plane, and the two turns equate a Cartan diagonal +entry with a root one. What is left is a multiple of the delta. + +-/ +/-- The bilinear form on coordinate vectors with coefficients `c`. -/ +def form (c : (Fin 2 → Fin 8) → ℂ) (v w : Fin 8 → ℂ) : ℂ := + ∑ l, v (l 0) * w (l 1) * c l + +/-- The form on two Gell-Mann directions is an entry of `c`. -/ +lemma form_unitVec (c : (Fin 2 → Fin 8) → ℂ) (a b : Fin 8) : + form c (unitVec a) (unitVec b) = c ![a, b] := by + rw [form, sum_pi_two, Finset.sum_eq_single a, Finset.sum_eq_single b] + · simp [unitVec] + · intro y _ hy + simp [unitVec, hy] + · simp + · intro x _ hx + simp [unitVec, hx] + · simp + +/-- The form is additive on the left. -/ +lemma form_add_left (c : (Fin 2 → Fin 8) → ℂ) (v v' w : Fin 8 → ℂ) : + form c (v + v') w = form c v w + form c v' w := by + simp only [form, Pi.add_apply, add_mul, Finset.sum_add_distrib] + +/-- The form is additive on the right. -/ +lemma form_add_right (c : (Fin 2 → Fin 8) → ℂ) (v w w' : Fin 8 → ℂ) : + form c v (w + w') = form c v w + form c v w' := by + simp only [form, Pi.add_apply, mul_add, add_mul, Finset.sum_add_distrib] + +/-- The form respects differences on the left. -/ +lemma form_sub_left (c : (Fin 2 → Fin 8) → ℂ) (v v' w : Fin 8 → ℂ) : + form c (v - v') w = form c v w - form c v' w := by + simp only [form, Pi.sub_apply, sub_mul, Finset.sum_sub_distrib] + +/-- The form respects differences on the right. -/ +lemma form_sub_right (c : (Fin 2 → Fin 8) → ℂ) (v w w' : Fin 8 → ℂ) : + form c v (w - w') = form c v w - form c v w' := by + simp only [form, Pi.sub_apply, mul_sub, sub_mul, Finset.sum_sub_distrib] + +/-- The form is homogeneous on the left. -/ +lemma form_smul_left (c : (Fin 2 → Fin 8) → ℂ) (z : ℂ) (v w : Fin 8 → ℂ) : + form c (z • v) w = z * form c v w := by + simp only [form, Pi.smul_apply, smul_eq_mul, Finset.mul_sum, mul_assoc] + +/-- The form is homogeneous on the right. -/ +lemma form_smul_right (c : (Fin 2 → Fin 8) → ℂ) (z : ℂ) (v w : Fin 8 → ℂ) : + form c v (z • w) = z * form c v w := by + simp only [form, Pi.smul_apply, smul_eq_mul, Finset.mul_sum] + exact Finset.sum_congr rfl fun l _ => by ring + +/-- The form on a negated left argument. -/ +lemma form_neg_left (c : (Fin 2 → Fin 8) → ℂ) (v w : Fin 8 → ℂ) : + form c (-v) w = -form c v w := by + simp only [form, Pi.neg_apply, neg_mul, Finset.sum_neg_distrib] + +/-- The form on a negated right argument. -/ +lemma form_neg_right (c : (Fin 2 → Fin 8) → ℂ) (v w : Fin 8 → ℂ) : + form c v (-w) = -form c v w := by + simp only [form, Pi.neg_apply, mul_neg, neg_mul, Finset.sum_neg_distrib] + +/-- The form of an invariant coefficient is fixed by every row action: the row action on a + product of coordinate vectors is `act U` on the product coefficient, and `act U⁻¹` is the + transpose of `act U`. -/ +lemma form_rowAct {c : (Fin 2 → Fin 8) → ℂ} + (hc : ∀ U : specialUnitaryGroup (Fin 3) ℂ, act U c = c) + (U : specialUnitaryGroup (Fin 3) ℂ) (v w : Fin 8 → ℂ) : + form c (rowAct U v) (rowAct U w) = form c v w := by + have key : ∀ l : Fin 2 → Fin 8, + rowAct U v (l 0) * rowAct U w (l 1) = act U (fun m => v (m 0) * w (m 1)) l := by + intro l + simp only [rowAct, act_apply, Fin.prod_univ_two] + rw [sum_pi_two, Finset.sum_mul_sum] + refine Finset.sum_congr rfl fun x _ => Finset.sum_congr rfl fun y _ => ?_ + simp only [Matrix.cons_val_zero, Matrix.cons_val_one] + ring + simp only [form, key] + rw [sum_act_mul, hc] + +/-- An invariant coefficient is a multiple of the Kronecker delta. -/ +theorem exists_smul_traceCoeff_of_act_eq {c : (Fin 2 → Fin 8) → ℂ} + (hc : ∀ U : specialUnitaryGroup (Fin 3) ℂ, act U c = c) : + ∃ z : ℂ, c = z • traceCoeff := by + have hβ := form_rowAct hc + -- the parities kill every entry joining two directions of different sign pattern + have hpar : ∀ (k : Fin 3) (a b : Fin 8), + paritySign k a ≠ paritySign k b → c ![a, b] = 0 := by + intro k a b hab + have h := hβ (su3Parity k) (unitVec a) (unitVec b) + rw [rowAct_su3Parity_unitVec, rowAct_su3Parity_unitVec, form_smul_left, form_smul_right, + form_unitVec, ← mul_assoc] at h + have hpm : ∀ (k : Fin 3) (a : Fin 8), paritySign k a = 1 ∨ paritySign k a = -1 := by + decide + rcases hpm k a with ha | ha <;> rcases hpm k b with hb | hb <;> rw [ha, hb] at h hab <;> + push_cast at h + · exact absurd rfl hab + · linear_combination (-1 / 2 : ℂ) * h + · linear_combination (-1 / 2 : ℂ) * h + · exact absurd rfl hab + -- the transposition and the cyclic rotation, on Gell-Mann directions + have hτ : ∀ a b, form c (transpCol a) (transpCol b) = c ![a, b] := fun a b => by + have h := hβ su3Transp (unitVec a) (unitVec b) + rwa [rowAct_su3Transp_unitVec, rowAct_su3Transp_unitVec, form_unitVec] at h + have hπ : ∀ a b, form c (permCol a) (permCol b) = c ![a, b] := fun a b => by + have h := hβ su3Perm (unitVec a) (unitVec b) + rwa [rowAct_su3Perm_unitVec, rowAct_su3Perm_unitVec, form_unitVec] at h + -- the remaining off-diagonal entries: within a root pair or within the Cartan plane + have h01 : c ![0, 1] = 0 := by + have h := hτ 0 1 + simp only [transpCol, form_neg_right, form_unitVec] at h + linear_combination (-1 / 2 : ℂ) * h + have h10 : c ![1, 0] = 0 := by + have h := hτ 1 0 + simp only [transpCol, form_neg_left, form_unitVec] at h + linear_combination (-1 / 2 : ℂ) * h + have h27 : c ![2, 7] = 0 := by + have h := hτ 2 7 + simp only [transpCol, form_neg_left, form_unitVec] at h + linear_combination (-1 / 2 : ℂ) * h + have h72 : c ![7, 2] = 0 := by + have h := hτ 7 2 + simp only [transpCol, form_neg_right, form_unitVec] at h + linear_combination (-1 / 2 : ℂ) * h + have h34 : c ![3, 4] = 0 := by + have h := hπ 3 4 + simp only [permCol, form_neg_right, form_unitVec] at h + rw [← h, h01, neg_zero] + have h43 : c ![4, 3] = 0 := by + have h := hπ 4 3 + simp only [permCol, form_neg_left, form_unitVec] at h + rw [← h, h10, neg_zero] + have h56 : c ![5, 6] = 0 := by + have h := hπ 5 6 + simp only [permCol, form_neg_right, form_unitVec] at h + rw [← h, h34, neg_zero] + have h65 : c ![6, 5] = 0 := by + have h := hπ 6 5 + simp only [permCol, form_neg_left, form_unitVec] at h + rw [← h, h43, neg_zero] + have hoff : ∀ a b : Fin 8, a ≠ b → c ![a, b] = 0 := by + intro a b hab + have key : (∃ k, paritySign k a ≠ paritySign k b) + ∨ (a = 0 ∧ b = 1) ∨ (a = 1 ∧ b = 0) ∨ (a = 2 ∧ b = 7) ∨ (a = 7 ∧ b = 2) + ∨ (a = 3 ∧ b = 4) ∨ (a = 4 ∧ b = 3) ∨ (a = 5 ∧ b = 6) + ∨ (a = 6 ∧ b = 5) := by + revert a b + decide + rcases key with ⟨k, hk⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ + | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ + · exact hpar k a b hk + all_goals assumption + -- the diagonal entries along the root directions, moved around by the cyclic rotation + have h55 : c ![5, 5] = c ![0, 0] := by + simpa only [permCol, form_unitVec] using hπ 0 0 + have h66 : c ![6, 6] = c ![1, 1] := by + simpa only [permCol, form_unitVec] using hπ 1 1 + have h33 : c ![3, 3] = c ![5, 5] := by + simpa only [permCol, form_unitVec] using hπ 5 5 + have h44 : c ![4, 4] = c ![6, 6] := by + simpa only [permCol, form_neg_left, form_neg_right, neg_neg, form_unitVec] using hπ 6 6 + -- the two turns tie the Cartan entry `c ![2, 2]` to `c ![0, 0]` and `c ![1, 1]` + have hQ : c ![0, 0] = c ![2, 2] := by + have h := hβ su3TurnFst (unitVec 2) (unitVec 2) + rwa [rowAct_su3TurnFst_unitVec_two, form_neg_left, form_neg_right, neg_neg, form_unitVec, + form_unitVec] at h + have hQ' : c ![1, 1] = c ![2, 2] := by + have h := hβ su3TurnSnd (unitVec 2) (unitVec 2) + rwa [rowAct_su3TurnSnd_unitVec_two, form_unitVec, form_unitVec] at h + -- the Cartan plane: the eigenvectors of the cyclic rotation are isotropic + have hω : ∀ a : Fin 2, form c (cartanVec a) (cartanVec a) = 0 := by + intro a + have h := hβ su3Perm (cartanVec a) (cartanVec a) + rw [rowAct_su3Perm_cartanVec, form_smul_left, form_smul_right, ← mul_assoc, + ← su3PermSign_add] at h + have hs : su3PermSign (cartanGrade a + cartanGrade a) ≠ 1 := by + fin_cases a + · exact su3Omega_isPrimitiveRoot.pow_ne_one_of_pos_of_lt (by decide) (by decide) + · exact su3Omega_isPrimitiveRoot.pow_ne_one_of_pos_of_lt (by decide) (by decide) + exact (mul_left_eq_self₀.1 h).resolve_left hs + have h77 : c ![7, 7] = c ![2, 2] := by + rw [← form_unitVec c 7 7, ← form_unitVec c 2 2, unitVec_two_eq_cartanVec_add, + unitVec_seven_eq_cartanVec_sub] + simp only [form_smul_left, form_smul_right, form_add_left, form_add_right, form_sub_left, + form_sub_right, hω] + linear_combination + (-(form c (cartanVec 0) (cartanVec 1) + form c (cartanVec 1) (cartanVec 0)) / 4) + * Complex.I_sq + have hdiag : ∀ a : Fin 8, c ![a, a] = c ![2, 2] := by + intro a + have ha : a = 0 ∨ a = 1 ∨ a = 2 ∨ a = 3 ∨ a = 4 ∨ a = 5 ∨ a = 6 ∨ a = 7 := by + revert a + decide + rcases ha with rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl + · exact hQ + · exact hQ' + · rfl + · rw [h33, h55, hQ] + · rw [h44, h66, hQ'] + · rw [h55, hQ] + · rw [h66, hQ'] + · exact h77 + refine ⟨c ![2, 2], funext fun l => ?_⟩ + obtain ⟨a, b, rfl⟩ : ∃ a b, l = ![a, b] := ⟨l 0, l 1, by ext i; fin_cases i <;> rfl⟩ + by_cases h : a = b + · subst h + simp [traceCoeff, hdiag] + · simp [traceCoeff, h, hoff a b h] /-! -## F.2. The two turns on the two trivial lines +## F. An invariant of the span is the contraction of an invariant coefficient + +Give the coefficient functions their standard inner product. The coefficients contracting to +zero form the kernel `K` of the contraction, stable under every `act U` by the +transformation law; and since `act U⁻¹` is the transpose of `act U` and the adjoint matrix +is real, `act U⁻¹` is the adjoint of `act U`, so the orthogonal complement `Kᗮ` is stable +as well. Write the coefficient of an invariant vector `x` as `k + k'` with `k ∈ K` and +`k' ∈ Kᗮ`. Then `x` is the contraction of `k'`, and `act U k' - k'` contracts to +`repGauge (U, 1, 1) x - x = 0` while lying in `Kᗮ`, so it is zero: `k'` is invariant. + +-/ + +/-- The action on coefficients commutes with complex conjugation, the adjoint matrix being + real. -/ +lemma act_star (U : specialUnitaryGroup (Fin 3) ℂ) (c : (Fin 2 → Fin 8) → ℂ) : + act U (star c) = star (act U c) := by + funext a + simp [act_apply, star_sum, star_mul', Complex.conj_ofReal] + +/-- The contraction, on the coefficient space with its standard inner product. -/ +noncomputable def contractₗ (hT : IsSU3BiAdjoint B repGauge T) : + EuclideanSpace ℂ (Fin 2 → Fin 8) →ₗ[ℂ] B where + toFun c := hT.contract c.ofLp + map_add' c c' := by simp only [WithLp.ofLp_add, map_add] + map_smul' z c := by simp only [WithLp.ofLp_smul, map_smul, RingHom.id_apply] + +/-- The action on coefficients, on the coefficient space with its standard inner product. -/ +noncomputable def actₗ (U : specialUnitaryGroup (Fin 3) ℂ) : + EuclideanSpace ℂ (Fin 2 → Fin 8) →ₗ[ℂ] EuclideanSpace ℂ (Fin 2 → Fin 8) where + toFun c := WithLp.toLp 2 (act U c.ofLp) + map_add' c c' := by simp only [WithLp.ofLp_add, map_add, WithLp.toLp_add] + map_smul' z c := by + simp only [WithLp.ofLp_smul, map_smul, RingHom.id_apply, WithLp.toLp_smul] + +/-- The transformation law in coefficient form, on the inner product space. -/ +lemma contractₗ_actₗ (hT : IsSU3BiAdjoint B repGauge T) {U : specialUnitaryGroup (Fin 3) ℂ} + {f : B →ₗ[ℂ] B} (hf : IsSU3BiAdjointMat U f T) + (c : EuclideanSpace ℂ (Fin 2 → Fin 8)) : + hT.contractₗ (actₗ U c) = f (hT.contractₗ c) := by + simp only [contractₗ, actₗ, LinearMap.coe_mk, AddHom.coe_mk] + exact (hT.map_contract hf _).symm + +open scoped InnerProductSpace in +/-- The action of `U⁻¹` is the adjoint of the action of `U`. -/ +lemma inner_actₗ (U : specialUnitaryGroup (Fin 3) ℂ) + (a b : EuclideanSpace ℂ (Fin 2 → Fin 8)) : + ⟪a, actₗ U b⟫_ℂ = ⟪actₗ U⁻¹ a, b⟫_ℂ := by + have h := sum_act_mul U b.ofLp (star a.ofLp) + rw [act_star] at h + simpa only [PiLp.inner_apply, RCLike.inner_apply, actₗ, LinearMap.coe_mk, AddHom.coe_mk, + PiLp.toLp_apply, Pi.star_apply, Complex.star_def] using h + +/-- A colour invariant of the span is the contraction of an invariant coefficient. -/ +theorem exists_eq_contract_of_su3_invariant (hT : IsSU3BiAdjoint B repGauge T) {x : B} + (hx : x ∈ hT.span) + (hinv : ∀ U : specialUnitaryGroup (Fin 3) ℂ, repGauge (U, 1, 1) x = x) : + ∃ c : (Fin 2 → Fin 8) → ℂ, x = hT.contract c + ∧ ∀ U : specialUnitaryGroup (Fin 3) ℂ, act U c = c := by + obtain ⟨c, rfl⟩ := (hT.mem_span_iff x).1 hx + rw [← hT.contract_apply] at hinv ⊢ + set K := LinearMap.ker hT.contractₗ with hK + have hKstab : ∀ (V : specialUnitaryGroup (Fin 3) ℂ), ∀ u ∈ K, actₗ V u ∈ K := by + intro V u hu + rw [hK, LinearMap.mem_ker] at hu ⊢ + rw [hT.contractₗ_actₗ (hT.repGauge_T V), hu, map_zero] + obtain ⟨k, hk, k', hk', hkk'⟩ := K.exists_add_mem_mem_orthogonal (WithLp.toLp 2 c) + have hx' : hT.contract c = hT.contractₗ k' := by + have h := congrArg hT.contractₗ hkk' + rw [map_add, LinearMap.mem_ker.1 hk, zero_add] at h + exact h + refine ⟨k'.ofLp, hx', fun U => ?_⟩ + have h1 : actₗ U k' - k' ∈ K := by + rw [hK, LinearMap.mem_ker, map_sub, sub_eq_zero, hT.contractₗ_actₗ (hT.repGauge_T U), + ← hx', hinv] + have h2 : actₗ U k' ∈ Kᗮ := by + rw [Submodule.mem_orthogonal] + intro u hu + rw [inner_actₗ] + exact Submodule.inner_right_of_mem_orthogonal (hKstab _ u hu) hk' + have h3 : actₗ U k' - k' ∈ K ⊓ Kᗮ := ⟨h1, Submodule.sub_mem _ h2 hk'⟩ + rw [Submodule.inf_orthogonal_eq_bot, Submodule.mem_bot, sub_eq_zero] at h3 + exact congrArg WithLp.ofLp h3 + +/-- Every colour invariant in the span of the components is a multiple of the trace + contraction: the one singlet of `8 ⊗ 8`. -/ +theorem exists_smul_traceContraction_of_su3_invariant (hT : IsSU3BiAdjoint B repGauge T) {x : B} + (hx : x ∈ hT.span) + (hinv : ∀ U : specialUnitaryGroup (Fin 3) ℂ, repGauge (U, 1, 1) x = x) : + ∃ z : ℂ, x = z • hT.traceContraction := by + obtain ⟨c, rfl, hc⟩ := hT.exists_eq_contract_of_su3_invariant hx hinv + obtain ⟨z, hz⟩ := exists_smul_traceCoeff_of_act_eq hc + exact ⟨z, by rw [hz, map_smul, contract_traceCoeff]⟩ + +/-! -`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. +## G. The invariants modulo a stable submodule -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 Standard Model files handle many families at once and peel them off one at a time, so +the classification of section F is wanted modulo a submodule `S` in which the other families +are parked. A submodule stable under a representation carries the quotient representation +`quotRep`, and the images of the components form a bi-adjoint family for it, with the image +of the trace contraction as trace contraction; so section F applies in the quotient, and +the theorem lifts the result back. Stability of `S` is what makes the quotient +representation exist, and it cannot be dropped: an unstable line has no invariant but `0`, +while its sum with the span may carry invariants outside the span. Only stability under +colour is assumed, which is stability under the colour part `repSU3` of the +representation, and that is the representation the quotient is taken for. -/ -/-- 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 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 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 su3TurnSnd - -/-- 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] := - 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]) := - 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]) := - 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 representation induced on the quotient by a stable submodule. -/ +noncomputable def quotRep (ρ : Representation ℂ GaugeGroupI B) (S : Submodule ℂ B) + (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, ρ g y ∈ S) : + Representation ℂ GaugeGroupI (B ⧸ 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 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]) := - 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.map_traceContraction hf, - hT.map_su3TurnSnd_cartanTriv hf, hT.cartanTriv_eq] - module +/-- The quotient representation on a class is the class of the representation. -/ +lemma quotRep_mkQ {ρ : Representation ℂ GaugeGroupI B} (S : Submodule ℂ B) + (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, ρ g y ∈ S) (g : GaugeGroupI) (y : B) : + quotRep ρ S hS g (S.mkQ y) = S.mkQ (ρ g y) := rfl -/-- 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]) := - 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. -/ -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_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 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 su3Perm (cartanTurn 2) = cartanTurn 0 - simp only [cartanTurn, rowAct_sub, rowAct_smul, rowAct_su3Perm_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 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. All four elements used are colour transformations, which is all - the transformation law constrains. -/ -lemma smul_traceContraction_eq_of_invariant (f : ℂ) - (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₀) - = 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.map_biVec hT.repGauge_T_gaugeSU3Perm, - hT.map_biVec hT.repGauge_T_gaugeSU3Perm] at h' - 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 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 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 - 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_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_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_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 - 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 +/-- The images of the components in the quotient by a stable submodule form a bi-adjoint + family. -/ +lemma isSU3BiAdjoint_quotRep (hT : IsSU3BiAdjoint B repGauge T) (S : Submodule ℂ B) + (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, repGauge g y ∈ S) : + IsSU3BiAdjoint (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 _ _ _ + +/-- The quotient map carries the trace contraction to the trace contraction of the + images. -/ +lemma mkQ_traceContraction (hT : IsSU3BiAdjoint B repGauge T) (S : Submodule ℂ B) + (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, repGauge g y ∈ S) : + S.mkQ hT.traceContraction = (hT.isSU3BiAdjoint_quotRep S hS).traceContraction := by + simp only [traceContraction, map_sum] +/-- A colour invariant of the span of the components joined with a colour-stable submodule + `S` is a multiple of the trace contraction up to a colour-invariant remainder in `S`. The + remainder is invariant for free, being the difference of two invariants. -/ +theorem mem_span_sup_su3_invariant_iff (hT : IsSU3BiAdjoint 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) : + ∃ c : ℂ, ∃ y ∈ S, x = c • hT.traceContraction + y + ∧ ∀ U : specialUnitaryGroup (Fin 3) ℂ, repGauge (U, 1, 1) y = y := by + have hS' : ∀ g : GaugeGroupI, ∀ y ∈ S, repSU3 repGauge g y ∈ S := + (repSU3_stable_iff_su3 repGauge S).2 hS + have hQ := hT.toRepSU3.isSU3BiAdjoint_quotRep S hS' + have hmk : S.mkQ x ∈ hQ.span := by + obtain ⟨u, hu, z, hz, huz⟩ := Submodule.mem_sup.1 hx + obtain ⟨c, hc⟩ := (hT.mem_span_iff u).1 hu + refine (hQ.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 _ _ _ + obtain ⟨c, hc⟩ := hQ.exists_smul_traceContraction_of_su3_invariant hmk + fun U => by rw [quotRep_mkQ, repSU3_apply, hinv] + rw [← hT.toRepSU3.mkQ_traceContraction S hS'] at hc + change S.mkQ x = c • S.mkQ hT.traceContraction at hc + refine ⟨c, x - c • hT.traceContraction, ?_, by abel, fun U => ?_⟩ + · 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 U, hT.repGauge_traceContraction U] /-! -## F.3. The colour invariants in the span +## Aside: what other files import from here + +Nothing from here on is used by the theorem above. Each item exists because another file +imports it under this name, and each says which. `isMulRep_repSU3` and +`repSU3_gaugeSU3Perm` serve the siblings `IsSU3BiFundamental` and `IsSU3FunAntiFun`, which +build the gauge weight decomposition for the colour part of a representation. -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 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. +end IsSU3BiAdjoint + +/-- The colour part of a multiplicative representation is multiplicative. -/ +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 + +/-- The colour part agrees with the representation at the cyclic colour rotation, which is + trivial on isospin and hypercharge. -/ +lemma repSU3_gaugeSU3Perm {B : Type*} [AddCommMonoid B] [Module ℂ B] + (repGauge : Representation ℂ GaugeGroupI B) : + repSU3 repGauge gaugeSU3Perm = repGauge gaugeSU3Perm := rfl + +namespace IsSU3BiAdjoint + +set_option linter.unusedVariables false + +variable {B : Type*} [AddCommGroup B] [Module ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} {T : (Fin 2 → Fin 8) → B} + +/-! + +## Aside: the weight basis of the adjoint, for `MassDimEight` and `IsSU3Adjoint` + +The Gell-Mann directions carry no definite colour charge; the eigenvectors of the colour +torus do. They are, 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: eight coordinate vectors `wtCoeff`, indexed by `WeightIdx`. `MassDimEight` matches +the gluon field strengths with the components of a bi-adjoint family through this basis, +using that its root pairs and Cartan indices are those of the whole gauge algebra, +`rootIdx_castSucc` and `cartanIdx_castSucc`, and that the sixty four contractions `biVec` +of `T` against two weight vectors span the components, `span_eq_wtSpan`. `IsSU3Adjoint` +reads the two Cartan directions in the eigenbasis `cartanVec`, `wtCoeff_cartan_zero` and +`wtCoeff_cartan_one`. -/ -/-- 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. 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 : ∀ 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' - 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 : ∀ 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 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⟩ - -/-- 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 : ∀ g : GaugeGroupI, repGauge g x = x) : - ∃ c : ℂ, x = c • hT.traceContraction := - 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 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 - 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]⟩ - -/-- 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) - (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, htc] +/-- The index type of the 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. -/ +def rootPair : Fin 3 → Fin 8 × Fin 8 + | 0 => (0, 1) + | 1 => (3, 4) + | 2 => (5, 6) + +/-- The root pairs are the `su(3)` root pairs of the whole 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 Cartan indices are the `su(3)` Cartan indices of the whole gauge algebra. -/ +lemma cartanIdx_castSucc (c : Fin 2) : + GaugeAlgebra.cartanIdx c.castSucc.castSucc = Sum.inl (GaugeAlgebra.su3CartanId c) := by + fin_cases c <;> rfl + +/-- Every Gell-Mann index is a member 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 = GaugeAlgebra.su3CartanId c := by + revert a + decide + +/-- The weight basis of the adjoint in Gell-Mann coordinates: `x₁ ± i x₂` on each root + pair, and the Cartan directions themselves. -/ +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 = GaugeAlgebra.su3CartanId c then 1 else 0 + +/-- 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 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 (GaugeAlgebra.su3CartanId c) = wtCoeff (Sum.inr (Sum.inr c)) := rfl + +/-- The first Cartan direction in the eigenbasis of the cyclic colour rotation. -/ +lemma wtCoeff_cartan_zero : + wtCoeff (Sum.inr (Sum.inr 0)) = (2 : ℂ)⁻¹ • (cartanVec 0 + cartanVec 1) := + unitVec_two_eq_cartanVec_add + +/-- The second Cartan direction in the eigenbasis of the cyclic colour rotation. -/ +lemma wtCoeff_cartan_one : + wtCoeff (Sum.inr (Sum.inr 1)) = (Complex.I / 2) • (cartanVec 0 - cartanVec 1) := + unitVec_seven_eq_cartanVec_sub + +/-- The contraction of the two indices of `T` against a pair of coordinate vectors. -/ +@[nolint unusedArguments] +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) + +/-- Scaling the left coordinate vector. -/ +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] + +/-- Scaling the right coordinate vector. -/ +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 + +/-- Adding 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] + +/-- Subtracting 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] + +/-- Adding 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] + +/-- Subtracting 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 Gell-Mann directions returns a component. -/ +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] + rw [Finset.sum_eq_single_of_mem a (Finset.mem_univ a) fun x _ hx => by simp [hx]] + simp + +/-- The join of the lines through 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) + +/-- A weight vector contracted against a Gell-Mann direction lies in `wtSpan`. -/ +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 lies in `wtSpan`. -/ +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 bi-adjoint weight vectors span the components: the change of basis from the + Gell-Mann basis to the weight basis is invertible. -/ +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 _)) /-! -## F.4. The trivial square-zero extension of a module +## Aside: the trivial square-zero extension, for `MassDimEight` -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_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. +`MassDimEight` needs a transport in the opposite direction to `quotRep`, from a module to an +algebra: the trivial square-zero extension `TrivSqZeroExt ℂ M` is a commutative algebra on +which any representation of `M` acts multiplicatively, `sqZeroRep`. It belongs with +`GaugeWeightDecomposition`. -/ 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`, @@ -2819,131 +1416,29 @@ lemma sqZeroRep_inr (ρ : Representation ℂ GaugeGroupI M) (g : GaugeGroupI) (m 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. -/ + extends. -/ 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] - -/-- 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 /-! -## 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. +## Aside: the gauge form of the theorem, for `MassDimEight` -/ -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 - 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) +/-- The gauge form on an algebra: a gauge invariant of the span joined with a gauge-stable + submodule is a multiple of the trace contraction up to a gauge-invariant remainder, once + the trace contraction is known to be gauge invariant. The multiplicativity hypothesis + `hmul` is not used; `MassDimEight` passes it. -/ +@[nolint unusedArguments] +theorem mem_span_sup_invariant_iff {B : Type*} [Ring B] [Algebra ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} {T : (Fin 2 → Fin 8) → B} + (hT : IsSU3BiAdjoint 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) @@ -2951,43 +1446,11 @@ lemma mem_span_sup_invariant_iff (hT : IsSU3BiAdjoint B repGauge T) (hmul : IsMu (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, 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 - 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) - ((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⟩ - -end Decomposition + obtain ⟨c, y, hyS, hxy, -⟩ := + hT.mem_span_sup_su3_invariant_iff x S (fun U => hS (U, 1, 1)) hx fun U => hinv (U, 1, 1) + refine ⟨c, y, hyS, hxy, fun g => ?_⟩ + rw [show y = x - c • hT.traceContraction from by rw [hxy]; abel, map_sub, map_smul, + hinv g, htc g] end IsSU3BiAdjoint From e3363813672577299942308a604759a9f94349df Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Sat, 5 Sep 2026 09:42:16 +0100 Subject: [PATCH 269/367] feat: Clean up other gauge invariant files (Fable 5.1) --- Physlib.lean | 1 + .../GaugeGroup/Invariants/Basic.lean | 233 +++ .../GaugeGroup/Invariants/IsSU2Adjoint.lean | 481 ++--- .../Invariants/IsSU2AntiFundamental.lean | 460 ++--- .../GaugeGroup/Invariants/IsSU2BiAdjoint.lean | 1769 +++++------------ .../Invariants/IsSU2BiFundamental.lean | 1226 +++--------- .../Invariants/IsSU2QuadFundamental.lean | 1685 ++++------------ .../GaugeGroup/Invariants/IsSU3Adjoint.lean | 675 ++----- .../GaugeGroup/Invariants/IsSU3BiAdjoint.lean | 406 ++-- .../Invariants/IsSU3BiFundamental.lean | 587 ++---- .../Invariants/IsSU3FunAntiFun.lean | 1235 +++--------- .../GaugeGroup/Invariants/IsU1BiAdjoint.lean | 353 +--- 12 files changed, 2270 insertions(+), 6841 deletions(-) create mode 100644 Physlib/Particles/StandardModel/GaugeGroup/Invariants/Basic.lean diff --git a/Physlib.lean b/Physlib.lean index 54c513f7d..576af3c9c 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -300,6 +300,7 @@ public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.Lorent public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.MassDim public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.MassWeightPoly public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition +public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.Basic public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU2Adjoint public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU2AntiFundamental public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU2BiAdjoint diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/Basic.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/Basic.lean new file mode 100644 index 000000000..fd1607792 --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/Basic.lean @@ -0,0 +1,233 @@ +/- +Copyright (c) 2026 Joseph 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.InnerProductSpace.PiL2 +public import Mathlib.Analysis.InnerProductSpace.Projection.Basic +public import Mathlib.LinearAlgebra.Finsupp.LinearCombination +/-! +# Families of components and their invariants + +Every file of this folder studies a family `T : ι → B` of vectors in a module `B`: the +components of a tensor with a fixed set of gauge indices, such as a product of two gluon +field strengths `F^a F^b` indexed by `ι = Fin 2 → Fin 8`. A gauge transformation moves the +components into one another by a fixed matrix, and the question is always the same: which +linear combinations of the components does every transformation leave alone? The answer, +file by file, is a specific contraction, the trace `∑ a, T ![a, a]` or an epsilon symbol, +and this file holds the three steps of the argument that do not depend on the family. + +The first is bookkeeping: a vector lies in the span of the components precisely when it is a +linear combination `∑ i, c i • T i`, so the span is described by coefficient functions +`c : ι → ℂ`, on which the transformations act by the matrix of the law. + +The second is the heart of the matter. An invariant vector of the span need not have an +invariant coefficient function, because the components may be linearly dependent. But the +coefficients contracting to zero form a subspace stable under the action, and when the action +preserves the standard inner product, so does its orthogonal complement. Projecting the +coefficient of an invariant vector onto that complement leaves the vector alone and makes +the coefficient invariant. So an invariant of the span is the contraction of an invariant +coefficient, and classifying invariants of the span reduces to classifying invariant +coefficient functions, a finite linear-algebra problem: `Family.exists_invariant_coeff`. + +The third is peeling. The Standard Model files handle many families at once and remove them +one at a time modulo a stable submodule `S` in which the other families are parked. A +classification of the invariants of a family, valid in every module, applies in the quotient +`B ⧸ S`, and `Family.exists_smul_add_of_mem_sup` lifts it back: an invariant of the span +joined with `S` is a multiple of the contraction up to an invariant remainder in `S`. +-/ + +@[expose] public section + +namespace StandardModel + +namespace Family + +variable {B : Type*} [AddCommGroup B] [Module ℂ B] {ι : Type*} [Fintype ι] + +/-! + +## A. The span of a family + +-/ + +/-- A vector lies in the span of the components precisely when it is a linear combination + of them. -/ +lemma mem_iSup_span_singleton_iff (T : ι → B) (x : B) : + x ∈ (⨆ i, ℂ ∙ T i) ↔ ∃ c : ι → ℂ, x = ∑ i, c i • T i := by + rw [← Submodule.span_range_eq_iSup, ← Fintype.range_linearCombination, LinearMap.mem_range] + simp only [Fintype.linearCombination_apply, eq_comm] + +omit [Fintype ι] in +/-- Every component lies in the span. -/ +lemma mem_iSup_span_singleton (T : ι → B) (i : ι) : T i ∈ ⨆ i, ℂ ∙ T i := + Submodule.mem_iSup_of_mem i (Submodule.mem_span_singleton_self _) + +/-- A sum over pairs of indices is a double sum. -/ +lemma sum_pi_two {n : ℕ} {M : Type*} [AddCommMonoid M] (F : (Fin 2 → Fin n) → M) : + ∑ d : Fin 2 → Fin n, F d = ∑ x : Fin n, ∑ y : Fin n, F ![x, y] := by + rw [show (∑ d : Fin 2 → Fin n, F d) = ∑ p : Fin n × Fin n, F ![p.1, p.2] from + Fintype.sum_equiv (piFinTwoEquiv fun _ => Fin n) _ _ fun d => by + congr 1 + funext i + fin_cases i <;> simp, + Fintype.sum_prod_type] + +/-! + +## B. An invariant of the span is the contraction of an invariant coefficient + +The transformations are a family of linear maps `φ g` on `B`, indexed by a group `G`, and +the law says that `φ g` moves a contraction `∑ i, c i • T i` to the contraction against +`A g c`, for a linear action `A g` on coefficient functions. One property of `A` is needed: +`A g⁻¹` is the adjoint of `A g` for the standard inner product on coefficients, which is to +say that `A` is unitary. For an action by real matrices this follows from `A g⁻¹` being the +transpose of `A g` and `A g` commuting with conjugation, `sum_star_mul_of_transpose`. + +-/ + +section Complement + +variable {G : Type*} [Group G] (T : ι → B) (φ : G → B →ₗ[ℂ] B) + (A : G → (ι → ℂ) →ₗ[ℂ] (ι → ℂ)) + +/-- The contraction, as a linear map on the coefficient space with its standard inner + product. -/ +noncomputable def contractₗ : EuclideanSpace ℂ ι →ₗ[ℂ] B where + toFun c := ∑ i, c.ofLp i • T i + map_add' c c' := by + simp only [WithLp.ofLp_add, Pi.add_apply, add_smul, Finset.sum_add_distrib] + map_smul' z c := by + simp only [WithLp.ofLp_smul, Pi.smul_apply, smul_eq_mul, RingHom.id_apply, Finset.smul_sum, + smul_smul] + +/-- The action on coefficients, on the coefficient space with its standard inner + product. -/ +noncomputable def actₗ (g : G) : EuclideanSpace ℂ ι →ₗ[ℂ] EuclideanSpace ℂ ι where + toFun c := WithLp.toLp 2 (A g c.ofLp) + map_add' c c' := by simp only [WithLp.ofLp_add, map_add, WithLp.toLp_add] + map_smul' z c := by + simp only [WithLp.ofLp_smul, map_smul, RingHom.id_apply, WithLp.toLp_smul] + +/-- For an action by real matrices, `A g⁻¹` being the transpose of `A g` and `A g` + commuting with conjugation make `A g⁻¹` the adjoint of `A g`. -/ +lemma sum_star_mul_of_transpose + (hA : ∀ g (c d : ι → ℂ), ∑ i, A g c i * d i = ∑ i, c i * A g⁻¹ d i) + (hstar : ∀ g (c : ι → ℂ), A g (star c) = star (A g c)) (g : G) (c d : ι → ℂ) : + ∑ i, star (c i) * A g d i = ∑ i, star (A g⁻¹ c i) * d i := by + have h := hA g d (star c) + rw [hstar] at h + simp only [Pi.star_apply] at h + calc ∑ i, star (c i) * A g d i = ∑ i, A g d i * star (c i) := by simp_rw [mul_comm] + _ = ∑ i, d i * star (A g⁻¹ c i) := h + _ = ∑ i, star (A g⁻¹ c i) * d i := by simp_rw [mul_comm] + +open scoped InnerProductSpace in +/-- The adjoint property, read on the coefficient space with its standard inner product. -/ +lemma inner_actₗ + (hA : ∀ g (c d : ι → ℂ), ∑ i, star (c i) * A g d i = ∑ i, star (A g⁻¹ c i) * d i) + (g : G) (a b : EuclideanSpace ℂ ι) : + ⟪a, actₗ A g b⟫_ℂ = ⟪actₗ A g⁻¹ a, b⟫_ℂ := by + have h := hA g a.ofLp b.ofLp + simp only [PiLp.inner_apply, RCLike.inner_apply, actₗ, LinearMap.coe_mk, AddHom.coe_mk, + Complex.star_def] at h ⊢ + rw [Finset.sum_congr rfl fun i _ => mul_comm (A g b.ofLp i) _, h] + exact Finset.sum_congr rfl fun i _ => mul_comm _ _ + +/-- An invariant of the span of a family is the contraction of an invariant coefficient + function, provided the transformations act on coefficients by a unitary action. -/ +theorem exists_invariant_coeff + (hφ : ∀ g (c : ι → ℂ), φ g (∑ i, c i • T i) = ∑ i, A g c i • T i) + (hA : ∀ g (c d : ι → ℂ), ∑ i, star (c i) * A g d i = ∑ i, star (A g⁻¹ c i) * d i) + {x : B} (hx : x ∈ ⨆ i, ℂ ∙ T i) (hinv : ∀ g, φ g x = x) : + ∃ c : ι → ℂ, x = ∑ i, c i • T i ∧ ∀ g, A g c = c := by + obtain ⟨c, rfl⟩ := (mem_iSup_span_singleton_iff T x).1 hx + have hΦ : ∀ (g : G) (u : EuclideanSpace ℂ ι), + contractₗ T (actₗ A g u) = φ g (contractₗ T u) := fun g u => (hφ g u.ofLp).symm + set K := LinearMap.ker (contractₗ T) with hK + have hKstab : ∀ g, ∀ u ∈ K, actₗ A g u ∈ K := by + intro g u hu + rw [hK, LinearMap.mem_ker] at hu ⊢ + rw [hΦ, hu, map_zero] + obtain ⟨k, hk, k', hk', hkk'⟩ := K.exists_add_mem_mem_orthogonal (WithLp.toLp 2 c) + have hx' : ∑ i, c i • T i = contractₗ T k' := by + have h := congrArg (contractₗ T) hkk' + rw [map_add, LinearMap.mem_ker.1 hk, zero_add] at h + exact h + refine ⟨k'.ofLp, hx', fun g => ?_⟩ + have h1 : actₗ A g k' - k' ∈ K := by + rw [hK, LinearMap.mem_ker, map_sub, sub_eq_zero, hΦ, ← hx', hinv] + have h2 : actₗ A g k' ∈ Kᗮ := by + rw [Submodule.mem_orthogonal] + intro u hu + rw [inner_actₗ A hA] + exact Submodule.inner_right_of_mem_orthogonal (hKstab _ u hu) hk' + have h3 : actₗ A g k' - k' ∈ K ⊓ Kᗮ := ⟨h1, Submodule.sub_mem _ h2 hk'⟩ + rw [Submodule.inf_orthogonal_eq_bot, Submodule.mem_bot, sub_eq_zero] at h3 + exact congrArg WithLp.ofLp h3 + +end Complement + +/-! + +## C. Peeling a family off a stable submodule + +A submodule `S` stable under the transformations carries the induced maps +`S.mapQ S (φ g) _` on the quotient, and the classes of the components form a family in the +quotient. When the invariants of that family are known to be the classes of a submodule `W` +of invariant vectors, typically the multiples of one contraction `v`, an invariant of the +span joined with `S` lies in `W` up to a remainder in `S`, and the remainder is invariant for +free, being the difference of two invariants. Stability of `S` cannot be dropped: an unstable +line has no invariant but `0`, while its sum with the span may well carry invariants outside +the span. + +-/ + +/-- Peeling one family off a stable submodule, when its invariants in the quotient are + known to be the classes of a submodule `W` of invariant vectors. -/ +theorem exists_mem_add_of_mem_sup {G : Type*} (T : ι → B) (φ : G → B →ₗ[ℂ] B) + (S : Submodule ℂ B) (hS : ∀ g, ∀ y ∈ S, φ g y ∈ S) (W : Submodule ℂ B) + (hW : ∀ w ∈ W, ∀ g, φ g w = w) + (hclass : ∀ x : B ⧸ S, x ∈ (⨆ i, ℂ ∙ S.mkQ (T i)) → + (∀ g, S.mapQ S (φ g) (hS g) x = x) → x ∈ W.map S.mkQ) + {x : B} (hx : x ∈ (⨆ i, ℂ ∙ T i) ⊔ S) (hinv : ∀ g, φ g x = x) : + ∃ w ∈ W, ∃ y ∈ S, x = w + y ∧ ∀ g, φ g y = y := by + have hmk : S.mkQ x ∈ ⨆ i, ℂ ∙ S.mkQ (T i) := by + obtain ⟨u, hu, z, hz, huz⟩ := Submodule.mem_sup.1 hx + obtain ⟨c, hc⟩ := (mem_iSup_span_singleton_iff T u).1 hu + refine (mem_iSup_span_singleton_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 i _ => map_smul _ _ _ + obtain ⟨w, hw, hwx⟩ := hclass _ hmk fun g => by + rw [Submodule.mkQ_apply, Submodule.mapQ_apply, hinv] + refine ⟨w, hw, x - w, ?_, by abel, fun g => ?_⟩ + · have hker : x - w ∈ LinearMap.ker S.mkQ := by + rw [LinearMap.mem_ker, map_sub, hwx, sub_self] + rwa [Submodule.ker_mkQ] at hker + · rw [map_sub, hinv g, hW w hw g] + +/-- Peeling one family off a stable submodule, when its invariants in the quotient are + known to be the multiples of the class of an invariant vector `v`. -/ +theorem exists_smul_add_of_mem_sup {G : Type*} (T : ι → B) (φ : G → B →ₗ[ℂ] B) + (S : Submodule ℂ B) (hS : ∀ g, ∀ y ∈ S, φ g y ∈ S) (v : B) (hv : ∀ g, φ g v = v) + (hclass : ∀ x : B ⧸ S, x ∈ (⨆ i, ℂ ∙ S.mkQ (T i)) → + (∀ g, S.mapQ S (φ g) (hS g) x = x) → ∃ c : ℂ, x = c • S.mkQ v) + {x : B} (hx : x ∈ (⨆ i, ℂ ∙ T i) ⊔ S) (hinv : ∀ g, φ g x = x) : + ∃ c : ℂ, ∃ y ∈ S, x = c • v + y ∧ ∀ g, φ g y = y := by + obtain ⟨w, hw, y, hyS, hxy, hyinv⟩ := exists_mem_add_of_mem_sup T φ S hS (ℂ ∙ v) + (fun w hw g => by + obtain ⟨c, rfl⟩ := Submodule.mem_span_singleton.1 hw + rw [map_smul, hv]) + (fun x hx hinv => by + obtain ⟨c, hc⟩ := hclass x hx hinv + exact ⟨c • v, Submodule.smul_mem _ _ (Submodule.mem_span_singleton_self _), + by rw [map_smul, hc]⟩) hx hinv + obtain ⟨c, rfl⟩ := Submodule.mem_span_singleton.1 hw + exact ⟨c, y, hyS, hxy, hyinv⟩ + +end Family + +end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2Adjoint.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2Adjoint.lean index 8873b5faa..226a6e7c9 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2Adjoint.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2Adjoint.lean @@ -9,76 +9,54 @@ public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU2BiAdjoi /-! # 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. +A single `W`-boson field strength `W^a` carries one isospin index, running over the three +Pauli directions of `su(2)`, and transforms in the adjoint representation, which is the vector +representation `3` of the rotation group. That representation contains no singlet: no linear +combination of the three components is left alone by every isospin rotation, which is why a +Lagrangian never contains a term linear in a field strength. This file proves that fact in +the form the Standard Model files consume, modulo an isospin-stable submodule in which other +families are parked. + +`IsSU2Adjoint B repGauge T` records the hypothesis. `T` is a family indexed by one isospin +index and valued in a module `B` carrying a representation of the gauge group, and an isospin +rotation `U ∈ SU(2)` moves its components by the adjoint matrix of `U`. Nothing is asked of +the colour and hypercharge factors. + +The argument is the one of `IsSU2BiAdjoint` with one index instead of two. An isospin +invariant of the span is the contraction of an invariant coefficient vector, by +`Family.exists_invariant_coeff`, since the adjoint matrix is orthogonal. The three isospin +flips then kill the coefficient vector: the half turn about the axis `a + 1` reverses the +direction `a`, so an invariant coefficient vector is its own negative in every coordinate. + +Section A gives the transformation law and the span, section B the action on coefficient +vectors, section C the vanishing of an invariant coefficient vector, and section D the +vanishing of the invariants of the span and its form modulo a stable submodule. -/ @[expose] public section namespace StandardModel -open Matrix PauliMatrix IsSU2BiAdjoint +open Matrix 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 law carries one factor of the adjoint 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. -/ +/-- The linear map `f` moves the components of `T` as `U ∈ SU(2)` moves a tensor with one + adjoint index. -/ 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. -/ + tensor `T^a` under the isospin factor of the gauge group. Nothing is asked of the colour + and 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) ℂ, @@ -86,356 +64,155 @@ structure IsSU2Adjoint (B : Type*) [AddCommMonoid B] [Module ℂ B] namespace IsSU2Adjoint +/- `span` takes the hypothesis `hT` only to hang off it by dot notation. -/ 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) + {repGauge : Representation ℂ GaugeGroupI B} {T : Fin 3 → B} -/-- 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. -/ +/-- The span of the components. -/ +@[nolint unusedArguments] 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 _)) +/-- A vector lies in the span precisely when it is a linear combination of the + components. -/ +lemma mem_span_iff (hT : IsSU2Adjoint B repGauge T) (x : B) : + x ∈ hT.span ↔ ∃ c : Fin 3 → ℂ, x = ∑ d, c d • T d := + Family.mem_iSup_span_singleton_iff T x /-! -## B. The contraction against a coordinate vector +## B. The action on coefficient vectors -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. +A vector of the span is a contraction `∑ a, c a • T a` against a coefficient vector +`c : Fin 3 → ℂ`, and the law says that an isospin rotation moves it by the adjoint matrix +acting on `c`. That action is unitary for the standard inner product, the matrix being real +and orthogonal. -/ -/-- 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. +/-- The adjoint matrix as a linear map on coefficient vectors. -/ +noncomputable def act (U : specialUnitaryGroup (Fin 2) ℂ) : (Fin 3 → ℂ) →ₗ[ℂ] (Fin 3 → ℂ) := + Matrix.toLin' (Matrix.of fun a x => ((su2AdjointMatrix U a x : ℝ) : ℂ)) -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. +/-- The action on coefficient vectors, written out. -/ +lemma act_apply (U : specialUnitaryGroup (Fin 2) ℂ) (c : Fin 3 → ℂ) (a : Fin 3) : + act U c a = ∑ x, ((su2AdjointMatrix U a x : ℝ) : ℂ) * c x := by + simp [act, Matrix.mulVec, dotProduct] -## C.1. The three isospin flips - --/ +/-- The transformation law in coefficient form. -/ +lemma map_sum_smul {U : specialUnitaryGroup (Fin 2) ℂ} {f : B →ₗ[ℂ] B} + (hf : IsSU2AdjointMat U f T) (c : Fin 3 → ℂ) : + f (∑ l, c l • T l) = ∑ a, act U c a • T a := by + simp only [map_sum, map_smul, act_apply, Finset.sum_smul] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun l _ => ?_ + rw [hf l, Finset.smul_sum] + exact Finset.sum_congr rfl fun a _ => by rw [smul_smul, mul_comm] + +/-- The action of `U⁻¹` is the transpose of the action of `U`. -/ +lemma sum_act_mul (U : specialUnitaryGroup (Fin 2) ℂ) (c d : Fin 3 → ℂ) : + ∑ a, act U c a * d a = ∑ l, c l * act U⁻¹ d l := by + simp only [act_apply, su2AdjointMatrix_inv, Finset.sum_mul, Finset.mul_sum] + rw [Finset.sum_comm] + exact Finset.sum_congr rfl fun l _ => Finset.sum_congr rfl fun a _ => by ring -/-- 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] +/-- The action on coefficient vectors commutes with complex conjugation. -/ +lemma act_star (U : specialUnitaryGroup (Fin 2) ℂ) (c : Fin 3 → ℂ) : + act U (star c) = star (act U c) := by + funext a + simp [act_apply, star_sum, star_mul', Complex.conj_ofReal] /-! -## C.2. The adjoint matrices of the flips +## C. An invariant coefficient vector vanishes -/ -/-- 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 = _ +/-- An isospin flip scales each coordinate by the sign of its Pauli direction. -/ +lemma act_su2Flip (k : Fin 3) (c : Fin 3 → ℂ) (a : Fin 3) : + act (su2Flip k) c a = ((su2FlipSign k a : ℤ) : ℂ) * c a := by + rw [act_apply] 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 + Complex.ofReal_zero, ite_mul, zero_mul, Finset.sum_ite_eq, Finset.mem_univ, if_true, + Complex.ofReal_intCast] --/ - -/-- 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 +/-- A coefficient vector fixed by every isospin rotation is zero: the flip about the axis + `a + 1` reverses the direction `a`. -/ +theorem eq_zero_of_act_eq {c : Fin 3 → ℂ} + (hc : ∀ U : specialUnitaryGroup (Fin 2) ℂ, act U c = c) : c = 0 := by funext a - simp only [Pi.add_apply, Pi.zero_apply, rowAct_su2Flip_apply] - fin_cases a <;> simp [su2FlipSign] + have hs : su2FlipSign (a + 1) a = -1 := by + revert a + decide + have h := congrFun (hc (su2Flip (a + 1))) a + rw [act_su2Flip, hs] at h + push_cast at h + rw [Pi.zero_apply] + linear_combination (-1 / 2 : ℂ) * h /-! ## 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 +The action on coefficients is unitary, so `Family.exists_invariant_coeff` writes an +invariant of the span as the contraction of an invariant coefficient vector, which section C +makes zero. The statement is made for any family of linear maps obeying the law, so that it +applies in a quotient, and `Family.exists_smul_add_of_mem_sup` then gives the form modulo a +stable submodule: an invariant of the span joined with `S` lies in `S`. -/ -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. -/ +/-- An invariant of the span of a family obeying the law for a family of linear maps + `φ U` is zero: the adjoint representation of `SU(2)` contains no singlet. -/ +theorem eq_zero_of_invariant' {φ : specialUnitaryGroup (Fin 2) ℂ → B →ₗ[ℂ] B} + (hT : ∀ U, IsSU2AdjointMat U (φ U) T) {x : B} (hx : x ∈ ⨆ d, ℂ ∙ T d) + (hinv : ∀ U, φ U x = x) : x = 0 := by + obtain ⟨c, rfl, hc⟩ := Family.exists_invariant_coeff T φ act + (fun U c => map_sum_smul (hT U) c) + (Family.sum_star_mul_of_transpose act sum_act_mul act_star) hx hinv + simp [eq_zero_of_act_eq hc] + +/-- An isospin invariant in the span of the components is zero. -/ 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 _ _ _ + (hinv : ∀ U : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, U, 1) x = x) : x = 0 := + eq_zero_of_invariant' hT.repGauge_T hx hinv + +/-- The law descends to the quotient by a submodule stable under the map. -/ +lemma isSU2AdjointMat_mapQ {U : specialUnitaryGroup (Fin 2) ℂ} {f : B →ₗ[ℂ] B} + (hf : IsSU2AdjointMat U f T) (S : Submodule ℂ B) (hS : ∀ y ∈ S, f y ∈ S) : + IsSU2AdjointMat U (S.mapQ S f hS) fun l => S.mkQ (T l) := by + intro l + dsimp only + rw [← LinearMap.comp_apply, Submodule.mapQ_mkQ, LinearMap.comp_apply, hf 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. -/ + submodule `S` lies in `S`: an `su(2)` adjoint index contributes nothing to the + invariants. -/ 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') + obtain ⟨c, y, hyS, hxy, -⟩ := Family.exists_smul_add_of_mem_sup T + (fun U => repGauge (1, U, 1)) S hS 0 (fun U => map_zero _) + (fun x hx hinv => ⟨0, by + rw [eq_zero_of_invariant' (fun U => isSU2AdjointMat_mapQ (hT.repGauge_T U) S (hS U)) + hx hinv, zero_smul]⟩) hx hinv + rwa [hxy, smul_zero, zero_add] /-- 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. -/ + submodule are exactly the isospin invariants of the submodule. -/ 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) + ↔ x ∈ S ∧ ∀ U : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, U, 1) x = x := + ⟨fun ⟨hx, hinv⟩ => ⟨hT.mem_of_mem_span_sup_su2_invariant x S hS hx hinv, hinv⟩, + fun ⟨hx, hinv⟩ => ⟨Submodule.mem_sup_right hx, hinv⟩⟩ end IsSU2Adjoint diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2AntiFundamental.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2AntiFundamental.lean index ad3dbc489..9b278a560 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2AntiFundamental.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2AntiFundamental.lean @@ -9,41 +9,28 @@ public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU2BiFunda /-! # Gauge tensors carrying anti-fundamental `su(2)` indices -`IsSU2FunAntiFun B repGauge T` and `IsSU2BiAntiFun B repGauge T` are the two twisted -companions of `IsSU2BiFundamental`: a family indexed by one fundamental and one -anti-fundamental `su(2)` index, and a family indexed by two anti-fundamental ones. Between -them and `IsSU2BiFundamental` they cover the isospin content of every surviving term of the -Standard Model Yukawa sector, `2 ⊗ 2̄` for the down and lepton couplings and their -conjugates, `2̄ ⊗ 2̄` for the up coupling, `2 ⊗ 2` for its conjugate. - -Neither needs a classification of its own, and that is the point of the file. `SU(2)` is -pseudo-real: for `U` in `SU(2)` and `ε` the antisymmetric symbol, `conj U = ε U ε⁻¹`, and -because `U` is unitary the matrix moving an anti-fundamental index, `(U⁻¹)ᵀ`, is `conj U`. -Those two identities are proved in section E of `IsSU2BiFundamental`, and they say that the -anti-fundamental representation is the fundamental one in a different basis. So re-indexing -an anti-fundamental slot by `ε` turns the law into the bi-fundamental one, for the very same -representation: no twisted representation, no transfer of invariance along a group -automorphism, nothing but a change of basis in one slot. `SU(3)` has no analogue, which is -why the colour side needs a separate `IsSU3FunAntiFun` and the isospin side does not. - -Each re-index is invertible, so it leaves the span of the components alone, and every -conclusion of `IsSU2BiFundamental` — the classification of the isospin invariants, its -module-valued form, and its form modulo a stable submodule — transfers to the original -family. All that has to be tracked is which contraction of the original family the epsilon -contraction of the re-indexed one turns out to be. For `2 ⊗ 2̄` it is minus the delta -contraction `T^{0}{}_{0} + T^{1}{}_{1}`; for `2̄ ⊗ 2̄` it is the epsilon contraction itself, -with no sign at all. Those two factors are stated rather than absorbed into the definitions, -so that a re-index stays the plain re-index by `ε` and a contraction stays the plain trace -or the plain antisymmetric combination. - -Both propositions inherit the weakness of `IsSU2BiFundamental`: they constrain the isospin -transformation `(1, U, 1)` alone and say nothing whatever about the colour and hypercharge -factors, so the conclusions are about invariance under the isospin factor, and every -statement about gauge invariance carries the invariance of the contraction as an explicit -hypothesis. - -Section A is the `2 ⊗ 2̄` case, with its epsilon re-index, its delta contraction and the -classifications that follow, and section B the `2̄ ⊗ 2̄` case in the same order. +The conjugate of an isospin doublet carries an anti-fundamental index, moved by the complex +conjugate of the `SU(2)` matrix rather than by the matrix itself. A Yukawa coupling `H̄ Q d` +carries one fundamental and one anti-fundamental index, `2 ⊗ 2̄`; the up-type coupling +`ε H Q u` carries two anti-fundamental ones, `2̄ ⊗ 2̄`. This file classifies the isospin +invariants in both cases, in the form the Standard Model files consume: modulo an +isospin-stable submodule, the invariants of `2 ⊗ 2̄` are the multiples of the trace +`T ![0, 0] + T ![1, 1]`, and those of `2̄ ⊗ 2̄` the multiples of the same epsilon contraction +as for `2 ⊗ 2`. + +Neither needs a classification of its own. `SU(2)` is pseudo-real: for `U ∈ SU(2)` the +conjugate matrix is `ε U ε⁻¹`, with `ε` the antisymmetric symbol, so an anti-fundamental index +is a fundamental index in another basis. Re-indexing each anti-fundamental slot by `ε` turns +either law into the bi-fundamental law of `IsSU2BiFundamental`, for the very same +representation, and the theorem of that file applies. The re-index is invertible, so it +leaves the span of the components alone, and all that has to be tracked is which contraction +of the original family the epsilon contraction of the re-indexed family is: minus the trace +for `2 ⊗ 2̄`, and the epsilon contraction itself for `2̄ ⊗ 2̄`. `SU(3)` has no such identity, +which is why the colour side needs a separate `IsSU3FunAntiFun`. + +Section A treats one fundamental and one anti-fundamental index, section B two +anti-fundamental ones; each gives the law, the re-index, the contraction and the theorem. An +aside at the end holds the gauge form of the first theorem, which the Higgs sector uses. -/ @[expose] public section @@ -54,45 +41,17 @@ open Matrix ComplexConjugate /-! -## A. One fundamental and one anti-fundamental isospin index - -Four of the six surviving Yukawa terms contract a Higgs doublet against a quark or lepton -doublet of the opposite variance, so their isospin content is `2 ⊗ 2̄` rather than `2 ⊗ 2`. -`IsSU2FunAntiFun` records that law: a factor of `U` for the first index and a factor of -`conj U` for the second, the summed index in the row slot as always, and, as in -`IsSU2BiFundamental`, only the isospin transformation `(1, U, 1)` is constrained. It is the -law obeyed by `fun l => h.barHiggs d (l 0) * h.higgs d (l 1)` for `h : IsHiggsSector`, a -conjugate Higgs symbol and then a Higgs symbol, once the hypercharge character is set -aside; the anti-fundamental slot is the second one, so a family carrying its indices the -other way round must be presented with its two slots exchanged. - -Section E of `IsSU2BiFundamental` is what makes this cheap. Because `conj U = ε U ε⁻¹`, -re-indexing the anti-fundamental slot by the antisymmetric symbol turns the law into the -bi-fundamental one, with the very same representation: no twisted representation, no transfer of -invariance along a group automorphism, nothing but a change of basis in one slot. The -re-index is invertible, so the span is unchanged, and every conclusion of -`IsSU2BiFundamental` is available for the original family once one knows which of its -contractions the epsilon contraction of the re-indexed family is. - -That contraction is the delta contraction `T^{0}{}_{0} + T^{1}{}_{1}`, the only invariant -`2 ⊗ 2̄` admits, and the identification carries a sign: `epsilonContraction (reindex T)` is -`-deltaContraction T`. The sign is stated rather than absorbed into the definition, so that -`reindex` stays the plain re-index by `ε` and the delta contraction stays the plain trace. -Every classification below is the corresponding one of `IsSU2BiFundamental` read through -that sign, and each is stated for a family valued in a mere module, the square-zero -extension of that file having already removed the algebra hypotheses. - -`of_isSU2BiFundamental` runs the re-index the other way and is the check that the variance -is the right way round: it produces genuine `IsSU2FunAntiFun` families out of the -bi-fundamental families the file already has, and it would fail if the conjugate had been -put on the wrong slot. +## A. One fundamental and one anti-fundamental index + +The law carries a factor of `U` for the first index and a factor of `conj U` for the second, +with the summed index in the row slot. It is the law obeyed by a conjugate Higgs symbol times +a Higgs symbol, once the hypercharge character is set aside. -/ -/-- The linear map `f` moves the components of the family `T` as the `SU(2)` matrix `U` - moves a tensor with one fundamental and one anti-fundamental isospin index: a factor of - `U` for the first index, a factor of its complex conjugate for the second, with the - summed index in the row slot. -/ +/-- The linear map `f` moves the components of `T` as `U ∈ SU(2)` moves a tensor with one + fundamental and one anti-fundamental isospin index: a factor of `U` for the first index + and a factor of its complex conjugate for the second. -/ def IsSU2FunAntiFunMat {B : Type*} [AddCommMonoid B] [Module ℂ B] (U : specialUnitaryGroup (Fin 2) ℂ) (f : B →ₗ[ℂ] B) (T : (Fin 2 → Fin 2) → B) : Prop := @@ -100,10 +59,8 @@ def IsSU2FunAntiFunMat {B : Type*} [AddCommMonoid B] [Module ℂ B] f (T l) = ∑ a : Fin 2 → Fin 2, (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(2)` fundamental index and one - anti-fundamental one, transforms as a tensor `T^{a}{}_{b}` under the representation - `repGauge` of the gauge group: an isospin transformation moves the components by the - `SU(2)` element it is built from. As with `IsSU2BiFundamental`, nothing is asked of the - colour or hypercharge factors. -/ + anti-fundamental one, transforms as a tensor `T^a_b` under the isospin factor of the gauge + group. Nothing is asked of the colour and hypercharge factors. -/ structure IsSU2FunAntiFun (B : Type*) [AddCommMonoid B] [Module ℂ B] (repGauge : Representation ℂ GaugeGroupI B) (T : (Fin 2 → Fin 2) → B) : Prop where @@ -111,7 +68,7 @@ structure IsSU2FunAntiFun (B : Type*) [AddCommMonoid B] [Module ℂ B] IsSU2FunAntiFunMat g (repGauge (1, g, 1)) T namespace IsSU2FunAntiFun -set_option linter.unusedVariables false + open IsSU2BiFundamental variable {B : Type*} [AddCommGroup B] [Module ℂ B] @@ -122,28 +79,30 @@ variable {B : Type*} [AddCommGroup B] [Module ℂ B] ## A.1. The epsilon re-index of the anti-fundamental slot +Re-indexing the second slot by the antisymmetric symbol turns the law into the +bi-fundamental one: the four conjugation identities of `IsSU2BiFundamental` remove every +complex conjugate, after which the two sides agree. The re-index is invertible, so the span +of the components is unchanged. + -/ /-- The family obtained by re-indexing the anti-fundamental slot with the antisymmetric - symbol. This is the change of basis of section E of `IsSU2BiFundamental` applied to the second - index alone, and it is what turns the anti-fundamental law into the bi-fundamental one. -/ + symbol. -/ def reindex (T : (Fin 2 → Fin 2) → B) : (Fin 2 → Fin 2) → B := fun l => ∑ m : Fin 2, epsilon (l 1) m • T ![l 0, m] -/-- The re-index at a second index `0` picks out the component with second index `1`. -/ +/-- The re-index at second index `0` picks out the component with second index `1`. -/ @[simp] lemma reindex_apply_zero (T : (Fin 2 → Fin 2) → B) (p : Fin 2) : reindex T ![p, 0] = T ![p, 1] := by simp [reindex, Fin.sum_univ_two] -/-- The re-index at a second index `1` picks out minus the component with second index +/-- The re-index at second index `1` picks out minus the component with second index `0`. -/ @[simp] lemma reindex_apply_one (T : (Fin 2 → Fin 2) → B) (p : Fin 2) : reindex T ![p, 1] = -T ![p, 0] := by simp [reindex, Fin.sum_univ_two] -/-- The re-indexed family obeys the bi-fundamental law. This is the whole content of the - section: the four entry identities of `IsSU2BiFundamental` remove every complex conjugate, - after which the two sides differ by nothing at all. -/ +/-- The re-indexed family obeys the bi-fundamental law. -/ lemma map_reindex {T : (Fin 2 → Fin 2) → B} (hf : IsSU2FunAntiFunMat U f T) : IsSU2BiFundamentalMat U f (reindex T) := by have hl : ∀ a : Fin 2, a = 0 ∨ a = 1 := by decide @@ -165,37 +124,7 @@ lemma isSU2BiFundamental_reindex {T : (Fin 2 → Fin 2) → B} IsSU2BiFundamental B repGauge (reindex T) where repGauge_T g := map_reindex (hT.repGauge_T g) -/-- The re-index run the other way: the second index of a bi-fundamental family, re-indexed - by the antisymmetric symbol, is an anti-fundamental index. Together with - `map_reindex` this says that the two laws are the same law in two bases, and it is what - exhibits families obeying the anti-fundamental law: any bi-fundamental family gives - one. -/ -lemma map_reindex_of_biFundamental {T : (Fin 2 → Fin 2) → B} - (hf : IsSU2BiFundamentalMat U f T) : - IsSU2FunAntiFunMat U f (reindex T) := by - have hl : ∀ a : Fin 2, a = 0 ∨ a = 1 := by decide - have hf' : ∀ k : Fin 2 → Fin 2, f (T k) - = ∑ a : Fin 2 → Fin 2, (∏ i : Fin 2, U.1 (a i) (k i)) • T a := hf - intro l - simp only [reindex, map_add, map_smul, hf', sum_pi_two, Fin.sum_univ_two, - Fin.prod_univ_two, Matrix.cons_val_zero, Matrix.cons_val_one] - rcases hl (l 0) with h0 | h0 <;> rcases hl (l 1) with h1 | h1 <;> rw [h0, h1] <;> - simp only [epsilon_zero_zero, epsilon_zero_one, epsilon_one_zero, epsilon_one_one, - conj_apply_zero_zero, conj_apply_zero_one, conj_apply_one_zero, - conj_apply_one_one] <;> - module - -/-- Every bi-fundamental family yields a fundamental and anti-fundamental one, by the same - re-index. This is the non-vacuity of the proposition: the products of conjugate Higgs - doublet symbols that obey `IsSU2BiFundamental` obey this law once one of their slots is - re-indexed. -/ -lemma of_isSU2BiFundamental {T : (Fin 2 → Fin 2) → B} - (hT : IsSU2BiFundamental B repGauge T) : - IsSU2FunAntiFun B repGauge (reindex T) where - repGauge_T g := map_reindex_of_biFundamental (hT.repGauge_T g) - -/-- Every component of the original family lies in the span of the re-indexed one, the - re-index being invertible. -/ +/-- Every component of the original family lies in the span of the re-indexed one. -/ lemma self_mem_span_reindex (T : (Fin 2 → Fin 2) → B) (d : Fin 2 → Fin 2) : T d ∈ span (reindex T) := by have hl : ∀ a : Fin 2, a = 0 ∨ a = 1 := by decide @@ -208,8 +137,7 @@ lemma self_mem_span_reindex (T : (Fin 2 → Fin 2) → B) (d : Fin 2 → Fin 2) · rw [← reindex_apply_zero T (d 0)] exact mem_span _ -/-- The re-index does not change the span of the components, being invertible. This is what - lets every conclusion below be stated with the span of the original family. -/ +/-- The re-index does not change the span of the components. -/ lemma span_reindex (T : (Fin 2 → Fin 2) → B) : span (reindex T) = span T := by refine le_antisymm (iSup_le fun d => ?_) (iSup_le fun d => ?_) · rw [Submodule.span_singleton_le_iff_mem, reindex] @@ -221,40 +149,37 @@ lemma span_reindex (T : (Fin 2 → Fin 2) → B) : span (reindex T) = span T := ## A.2. The delta contraction +The one invariant of `2 ⊗ 2̄` is the trace `T ![0, 0] + T ![1, 1]`. It is the epsilon +contraction of the re-indexed family up to a sign, which is stated rather than absorbed into +a definition, so that the re-index stays the plain re-index and the trace the plain trace. + -/ -/-- The delta contraction of a family carrying one fundamental and one anti-fundamental - isospin index: the trace, which is the only invariant `2 ⊗ 2̄` admits. -/ +/-- The delta contraction: the trace of a family with one fundamental and one + anti-fundamental index. -/ def deltaContraction (T : (Fin 2 → Fin 2) → B) : B := T ![0, 0] + T ![1, 1] /-- The delta contraction lies in the span of the components. -/ lemma deltaContraction_mem_span (T : (Fin 2 → Fin 2) → B) : - deltaContraction T ∈ span T := by - rw [deltaContraction] - exact add_mem (mem_span _) (mem_span _) + deltaContraction T ∈ span T := + add_mem (mem_span _) (mem_span _) /-- The epsilon contraction of the re-indexed family is minus the delta contraction of the - original one. This is the sign the re-index introduces, and it is stated here rather than - hidden in the definitions: the re-index sends the pair `(0, 1)` to `-T ![0,0]` and the - pair `(1, 0)` to `T ![1,1]`, and the antisymmetric combination of those is minus the - trace. -/ + original one. -/ lemma epsilonContraction_reindex (T : (Fin 2 → Fin 2) → B) : epsilonContraction (reindex T) = -deltaContraction T := by rw [epsilonContraction, reindex_apply_zero, reindex_apply_one, deltaContraction] abel -/-- The delta contraction is fixed by any linear map moving the components by an element of - `SU(2)`. It is the epsilon contraction of the re-indexed family up to sign, and that is - fixed by `IsSU2BiFundamental.map_epsilonContraction`. -/ +/-- Any map moving the components by an element of `SU(2)` fixes the delta contraction. -/ lemma map_deltaContraction {T : (Fin 2 → Fin 2) → B} (hf : IsSU2FunAntiFunMat U f T) : f (deltaContraction T) = deltaContraction T := by have h := map_epsilonContraction (map_reindex hf) rw [epsilonContraction_reindex, map_neg, neg_inj] at h exact h -/-- The delta contraction of a family with one fundamental and one anti-fundamental index - is fixed by the isospin factor. That is all the transformation law constrains, the colour - and hypercharge factors being free to move it. -/ +/-- The delta contraction is isospin invariant. Nothing constrains the colour and + hypercharge factors, which may well move it. -/ lemma repGauge_deltaContraction {T : (Fin 2 → Fin 2) → B} (hT : IsSU2FunAntiFun B repGauge T) (V : specialUnitaryGroup (Fin 2) ℂ) : repGauge (1, V, 1) (deltaContraction T) = deltaContraction T := @@ -262,69 +187,15 @@ lemma repGauge_deltaContraction {T : (Fin 2 → Fin 2) → B} /-! -## A.3. The classification +## A.3. The invariants modulo a stable submodule -/ -/-- Every isospin invariant in the span of the components is a multiple of the delta - contraction. This is the classification of `IsSU2BiFundamental`, read through the re-index - and the sign it carries, and it asks for no algebra structure on `B`, the square-zero - extension having removed that. -/ -lemma exists_smul_deltaContraction_of_su2_invariant {T : (Fin 2 → Fin 2) → B} - (hT : IsSU2FunAntiFun B repGauge T) {x : B} (hx : x ∈ span T) - (hinv : ∀ V : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, V, 1) x = x) : - ∃ c : ℂ, x = c • deltaContraction T := by - obtain ⟨c, hc⟩ := - hT.isSU2BiFundamental_reindex.exists_smul_epsilonContraction_of_su2_invariant_module - (by rw [span_reindex]; exact hx) hinv - refine ⟨-c, ?_⟩ - rw [hc, epsilonContraction_reindex, smul_neg, neg_smul] - -/-- Every gauge invariant in the span of the components is a multiple of the delta - contraction, a gauge invariant being in particular fixed by the isospin factor. -/ -lemma exists_smul_deltaContraction_of_invariant {T : (Fin 2 → Fin 2) → B} - (hT : IsSU2FunAntiFun B repGauge T) {x : B} (hx : x ∈ span T) - (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : - ∃ c : ℂ, x = c • deltaContraction T := - hT.exists_smul_deltaContraction_of_su2_invariant hx fun V => hinv (1, V, 1) - -/-- The isospin invariants in the span of the components are exactly the multiples of the - delta contraction. This is the one singlet of `2 ⊗ 2̄`. -/ -lemma mem_span_and_su2_invariant_iff {T : (Fin 2 → Fin 2) → B} - (hT : IsSU2FunAntiFun B repGauge T) (x : B) : - (x ∈ span T ∧ ∀ V : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, V, 1) x = x) - ↔ x ∈ ℂ ∙ deltaContraction T := by - refine ⟨fun h => ?_, fun hx => ?_⟩ - · obtain ⟨c, rfl⟩ := hT.exists_smul_deltaContraction_of_su2_invariant 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 _ _ (deltaContraction_mem_span T), - fun V => by rw [map_smul, repGauge_deltaContraction hT]⟩ - -/-- The gauge invariants in the span of the components are exactly the multiples of the - delta contraction, once the delta contraction is known to be gauge invariant. That - hypothesis cannot be dropped, for the reason given at - `IsSU2BiFundamental.mem_span_and_invariant_iff`: the transformation law says nothing about - the colour and hypercharge factors, and the hypercharge factor by itself can scale the - contraction. -/ -lemma mem_span_and_invariant_iff {T : (Fin 2 → Fin 2) → B} - (hT : IsSU2FunAntiFun B repGauge T) (x : B) - (hdc : ∀ g : GaugeGroupI, - repGauge g (deltaContraction T) = deltaContraction T) : - (x ∈ span T ∧ ∀ g : GaugeGroupI, repGauge g x = x) - ↔ x ∈ ℂ ∙ deltaContraction T := by - refine ⟨fun h => ?_, fun hx => ?_⟩ - · obtain ⟨c, rfl⟩ := hT.exists_smul_deltaContraction_of_invariant 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 _ _ (deltaContraction_mem_span T), - fun g => by rw [map_smul, hdc]⟩ - -/-- The isospin invariants of the span of the components together with an isospin-stable - submodule `S`: such an element is a multiple of the delta contraction up to an error in - `S`, and the error is fixed by the isospin factor too. This is the form in which one - family at a time is peeled off a join. -/ -lemma mem_span_sup_su2_invariant_iff {T : (Fin 2 → Fin 2) → B} +/-- An isospin invariant of the span of the components joined with an isospin-stable + submodule `S` is a multiple of the delta contraction up to an isospin-invariant remainder + in `S`: the theorem of `IsSU2BiFundamental` for the re-indexed family, read through the + sign of `epsilonContraction_reindex`. -/ +theorem mem_span_sup_su2_invariant_iff {T : (Fin 2 → Fin 2) → B} (hT : IsSU2FunAntiFun B repGauge T) (x : B) (S : Submodule ℂ B) (hS : ∀ V : specialUnitaryGroup (Fin 2) ℂ, ∀ y ∈ S, repGauge (1, V, 1) y ∈ S) (hx : x ∈ span T ⊔ S) @@ -337,55 +208,19 @@ lemma mem_span_sup_su2_invariant_iff {T : (Fin 2 → Fin 2) → B} refine ⟨-c, y, hyS, ?_, hyinv⟩ rw [hxy, epsilonContraction_reindex, smul_neg, neg_smul] -/-- The same modulo a gauge-stable submodule, which needs the gauge invariance of the delta - contraction for the error term to be a gauge invariant rather than merely an isospin - one. -/ -lemma mem_span_sup_invariant_iff {T : (Fin 2 → Fin 2) → B} - (hT : IsSU2FunAntiFun B repGauge T) (x : B) (S : Submodule ℂ B) - (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, repGauge g y ∈ S) - (hdc : ∀ g : GaugeGroupI, - repGauge g (deltaContraction T) = deltaContraction T) - (hx : x ∈ span T ⊔ S) - (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : - ∃ c : ℂ, ∃ y ∈ S, x = c • deltaContraction T + y - ∧ ∀ g : GaugeGroupI, repGauge g y = y := by - obtain ⟨c, y, hyS, hxy, hyinv⟩ := - hT.isSU2BiFundamental_reindex.mem_span_sup_invariant_iff x S hS - (fun g => by rw [epsilonContraction_reindex, map_neg, hdc g]) - (by rw [span_reindex]; exact hx) hinv - refine ⟨-c, y, hyS, ?_, hyinv⟩ - rw [hxy, epsilonContraction_reindex, smul_neg, neg_smul] - end IsSU2FunAntiFun /-! -## B. Two anti-fundamental isospin indices - -The up-type Yukawa `ε H Q ū` carries both of its doublet indices in the anti-fundamental, -so its isospin content is `2̄ ⊗ 2̄`. `IsSU2BiAntiFun` records that law, a factor of `conj U` -per index, and again only for the isospin transformation `(1, U, 1)`. It is the law obeyed -by `fun l => h.higgs d (l 0) * h.higgs d (l 1)` for `h : IsHiggsSector`, once the -hypercharge character is set aside; the corresponding product of two conjugate Higgs -symbols, `h.barHiggs`, obeys `IsSU2BiFundamental` instead. - -The re-index of section E of `IsSU2BiFundamental` is applied to both slots at once, and -this time it costs nothing -at all: `epsilonContraction (reindex T)` is `epsilonContraction T` on the nose, the two -signs the re-index puts on the mixed components cancelling in their antisymmetric -combination. So the invariant of `2̄ ⊗ 2̄` is the same epsilon contraction as that of -`2 ⊗ 2`, and every conclusion of `IsSU2BiFundamental` transfers with no factor to keep -track of. -As with the re-index of one slot, the map is invertible, so the span is unchanged, and the -conclusions are stated with the span of the original family. `of_isSU2BiFundamental` again -runs the re-index the other way, which exhibits families obeying the law and checks that -the conjugates sit on the slots they should. +## B. Two anti-fundamental indices + +The law carries a factor of `conj U` per index. It is the law obeyed by a product of two +Higgs symbols, once the hypercharge character is set aside. -/ -/-- The linear map `f` moves the components of the family `T` as the `SU(2)` matrix `U` - moves a tensor with two anti-fundamental isospin indices: one factor of the complex - conjugate of `U` per index, with the summed index in the row slot. -/ +/-- The linear map `f` moves the components of `T` as `U ∈ SU(2)` moves a tensor with two + anti-fundamental isospin indices: one factor of the complex conjugate of `U` per index. -/ def IsSU2BiAntiFunMat {B : Type*} [AddCommMonoid B] [Module ℂ B] (U : specialUnitaryGroup (Fin 2) ℂ) (f : B →ₗ[ℂ] B) (T : (Fin 2 → Fin 2) → B) : Prop := @@ -394,9 +229,8 @@ def IsSU2BiAntiFunMat {B : Type*} [AddCommMonoid B] [Module ℂ B] (conj (U.1 (a 0) (l 0)) * conj (U.1 (a 1) (l 1))) • T a /-- A family `T` of elements of `B`, indexed by two `su(2)` anti-fundamental indices, - transforms as a tensor `T_{a₁ a₂}` under the representation `repGauge` of the gauge - group: an isospin transformation moves the components by the conjugate of the `SU(2)` - element it is built from. Nothing is asked of the colour or hypercharge factors. -/ + transforms as a tensor `T_{a b}` under the isospin factor of the gauge group. Nothing is + asked of the colour and hypercharge factors. -/ structure IsSU2BiAntiFun (B : Type*) [AddCommMonoid B] [Module ℂ B] (repGauge : Representation ℂ GaugeGroupI B) (T : (Fin 2 → Fin 2) → B) : Prop where @@ -404,7 +238,7 @@ structure IsSU2BiAntiFun (B : Type*) [AddCommMonoid B] [Module ℂ B] IsSU2BiAntiFunMat g (repGauge (1, g, 1)) T namespace IsSU2BiAntiFun -set_option linter.unusedVariables false + open IsSU2BiFundamental variable {B : Type*} [AddCommGroup B] [Module ℂ B] @@ -417,8 +251,7 @@ variable {B : Type*} [AddCommGroup B] [Module ℂ B] -/ -/-- The family obtained by re-indexing both slots with the antisymmetric symbol: the change - of basis of section E of `IsSU2BiFundamental` applied to each index in turn. -/ +/-- The family obtained by re-indexing both slots with the antisymmetric symbol. -/ def reindex (T : (Fin 2 → Fin 2) → B) : (Fin 2 → Fin 2) → B := fun l => ∑ m : Fin 2, ∑ n : Fin 2, (epsilon (l 0) m * epsilon (l 1) n) • T ![m, n] @@ -442,8 +275,7 @@ def reindex (T : (Fin 2 → Fin 2) → B) : (Fin 2 → Fin 2) → B := reindex T ![1, 1] = T ![0, 0] := by simp [reindex, Fin.sum_univ_two] -/-- The re-indexed family obeys the bi-fundamental law: the four entry identities of - `IsSU2BiFundamental` remove both complex conjugates, leaving the two sides identical. -/ +/-- The re-indexed family obeys the bi-fundamental law. -/ lemma map_reindex {T : (Fin 2 → Fin 2) → B} (hf : IsSU2BiAntiFunMat U f T) : IsSU2BiFundamentalMat U f (reindex T) := by have hl : ∀ a : Fin 2, a = 0 ∨ a = 1 := by decide @@ -466,32 +298,7 @@ lemma isSU2BiFundamental_reindex {T : (Fin 2 → Fin 2) → B} IsSU2BiFundamental B repGauge (reindex T) where repGauge_T g := map_reindex (hT.repGauge_T g) -/-- The re-index run the other way: both indices of a bi-fundamental family, re-indexed by - the antisymmetric symbol, are anti-fundamental. -/ -lemma map_reindex_of_biFundamental {T : (Fin 2 → Fin 2) → B} - (hf : IsSU2BiFundamentalMat U f T) : - IsSU2BiAntiFunMat U f (reindex T) := by - have hl : ∀ a : Fin 2, a = 0 ∨ a = 1 := by decide - have hf' : ∀ k : Fin 2 → Fin 2, f (T k) - = ∑ a : Fin 2 → Fin 2, (∏ i : Fin 2, U.1 (a i) (k i)) • T a := hf - intro l - simp only [reindex, map_add, map_smul, hf', sum_pi_two, Fin.sum_univ_two, - Fin.prod_univ_two, Matrix.cons_val_zero, Matrix.cons_val_one] - rcases hl (l 0) with h0 | h0 <;> rcases hl (l 1) with h1 | h1 <;> rw [h0, h1] <;> - simp only [epsilon_zero_zero, epsilon_zero_one, epsilon_one_zero, epsilon_one_one, - conj_apply_zero_zero, conj_apply_zero_one, conj_apply_one_zero, - conj_apply_one_one] <;> - module - -/-- Every bi-fundamental family yields one with two anti-fundamental indices, by the same - re-index. This is the non-vacuity of the proposition. -/ -lemma of_isSU2BiFundamental {T : (Fin 2 → Fin 2) → B} - (hT : IsSU2BiFundamental B repGauge T) : - IsSU2BiAntiFun B repGauge (reindex T) where - repGauge_T g := map_reindex_of_biFundamental (hT.repGauge_T g) - -/-- Every component of the original family lies in the span of the re-indexed one, the - re-index being an involution up to signs. -/ +/-- Every component of the original family lies in the span of the re-indexed one. -/ lemma self_mem_span_reindex (T : (Fin 2 → Fin 2) → B) (d : Fin 2 → Fin 2) : T d ∈ span (reindex T) := by have hl : ∀ a : Fin 2, a = 0 ∨ a = 1 := by decide @@ -521,26 +328,26 @@ lemma span_reindex (T : (Fin 2 → Fin 2) → B) : span (reindex T) = span T := ## B.2. The epsilon contraction +The re-index exchanges the two mixed components and negates each, and the two signs cancel +in their antisymmetric combination: the invariant of `2̄ ⊗ 2̄` is the very epsilon +contraction of `IsSU2BiFundamental`. + -/ -/-- The re-index leaves the epsilon contraction alone: it exchanges the two mixed - components and negates each, and the two signs cancel in their antisymmetric combination. - So the invariant of `2̄ ⊗ 2̄` is the very `IsSU2BiFundamental.epsilonContraction`, with no - sign and no scalar to carry. -/ +/-- The re-index leaves the epsilon contraction alone. -/ lemma epsilonContraction_reindex (T : (Fin 2 → Fin 2) → B) : epsilonContraction (reindex T) = epsilonContraction T := by rw [epsilonContraction, reindex_zero_one, reindex_one_zero, epsilonContraction] abel -/-- The epsilon contraction is fixed by any linear map moving the components by an element - of `SU(2)` in the anti-fundamental. -/ +/-- Any map moving the components by an element of `SU(2)` in the anti-fundamental fixes + the epsilon contraction. -/ lemma map_epsilonContraction {T : (Fin 2 → Fin 2) → B} (hf : IsSU2BiAntiFunMat U f T) : f (epsilonContraction T) = epsilonContraction T := by have h := IsSU2BiFundamental.map_epsilonContraction (map_reindex hf) rwa [epsilonContraction_reindex] at h -/-- The epsilon contraction of a family with two anti-fundamental indices is fixed by the - isospin factor, which is all the transformation law constrains. -/ +/-- The epsilon contraction is isospin invariant. -/ lemma repGauge_epsilonContraction {T : (Fin 2 → Fin 2) → B} (hT : IsSU2BiAntiFun B repGauge T) (V : specialUnitaryGroup (Fin 2) ℂ) : repGauge (1, V, 1) (epsilonContraction T) = epsilonContraction T := @@ -548,64 +355,14 @@ lemma repGauge_epsilonContraction {T : (Fin 2 → Fin 2) → B} /-! -## B.3. The classification +## B.3. The invariants modulo a stable submodule -/ -/-- Every isospin invariant in the span of the components is a multiple of the epsilon - contraction. This is the classification of `IsSU2BiFundamental` read through the re-index, - which this time contributes nothing at all. -/ -lemma exists_smul_epsilonContraction_of_su2_invariant {T : (Fin 2 → Fin 2) → B} - (hT : IsSU2BiAntiFun B repGauge T) {x : B} (hx : x ∈ span T) - (hinv : ∀ V : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, V, 1) x = x) : - ∃ c : ℂ, x = c • epsilonContraction T := by - obtain ⟨c, hc⟩ := - hT.isSU2BiFundamental_reindex.exists_smul_epsilonContraction_of_su2_invariant_module - (by rw [span_reindex]; exact hx) hinv - exact ⟨c, by rw [hc, epsilonContraction_reindex]⟩ - -/-- Every gauge invariant in the span of the components is a multiple of the epsilon - contraction. -/ -lemma exists_smul_epsilonContraction_of_invariant {T : (Fin 2 → Fin 2) → B} - (hT : IsSU2BiAntiFun B repGauge T) {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 hx fun V => hinv (1, V, 1) - -/-- The isospin invariants in the span of the components are exactly the multiples of the - epsilon contraction. This is the one singlet of `2̄ ⊗ 2̄`. -/ -lemma mem_span_and_su2_invariant_iff {T : (Fin 2 → Fin 2) → B} - (hT : IsSU2BiAntiFun B repGauge T) (x : B) : - (x ∈ span T ∧ ∀ V : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, V, 1) x = x) - ↔ x ∈ ℂ ∙ epsilonContraction T := by - refine ⟨fun h => ?_, fun hx => ?_⟩ - · obtain ⟨c, rfl⟩ := hT.exists_smul_epsilonContraction_of_su2_invariant 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 V => 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. The - hypothesis cannot be dropped: the transformation law leaves the colour and hypercharge - factors free, and the hypercharge factor by itself can scale the contraction. -/ -lemma mem_span_and_invariant_iff {T : (Fin 2 → Fin 2) → B} - (hT : IsSU2BiAntiFun B repGauge T) (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 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]⟩ - -/-- The isospin invariants of the span of the components together with an isospin-stable - submodule `S`: such an element is a multiple of the epsilon contraction up to an error in - `S`, and the error is fixed by the isospin factor too. -/ -lemma mem_span_sup_su2_invariant_iff {T : (Fin 2 → Fin 2) → B} +/-- An isospin invariant of the span of the components joined with an isospin-stable + submodule `S` is a multiple of the epsilon contraction up to an isospin-invariant + remainder in `S`. -/ +theorem mem_span_sup_su2_invariant_iff {T : (Fin 2 → Fin 2) → B} (hT : IsSU2BiAntiFun B repGauge T) (x : B) (S : Submodule ℂ B) (hS : ∀ V : specialUnitaryGroup (Fin 2) ℂ, ∀ y ∈ S, repGauge (1, V, 1) y ∈ S) (hx : x ∈ span T ⊔ S) @@ -617,24 +374,37 @@ lemma mem_span_sup_su2_invariant_iff {T : (Fin 2 → Fin 2) → B} (by rw [span_reindex]; exact hx) hinv exact ⟨c, y, hyS, by rw [hxy, epsilonContraction_reindex], hyinv⟩ -/-- The same modulo a gauge-stable submodule, which needs the gauge invariance of the - epsilon contraction for the error term to be a gauge invariant rather than merely an - isospin one. -/ -lemma mem_span_sup_invariant_iff {T : (Fin 2 → Fin 2) → B} - (hT : IsSU2BiAntiFun B repGauge T) (x : B) (S : Submodule ℂ B) +end IsSU2BiAntiFun + +/-! + +## Aside: the gauge form of the theorem of section A, for the Higgs sector + +-/ + +namespace IsSU2FunAntiFun + +variable {B : Type*} [AddCommGroup B] [Module ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} + +/-- A gauge invariant of the span joined with a gauge-stable submodule is a multiple of the + delta contraction up to a gauge-invariant remainder, once the delta contraction is known to + be gauge invariant. The hypothesis on the delta contraction cannot be dropped: the law says + nothing about the hypercharge factor, which may scale it. -/ +theorem mem_span_sup_invariant_iff {T : (Fin 2 → Fin 2) → B} + (hT : IsSU2FunAntiFun B repGauge T) (x : B) (S : Submodule ℂ B) (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, repGauge g y ∈ S) - (hec : ∀ g : GaugeGroupI, - repGauge g (epsilonContraction T) = epsilonContraction T) - (hx : x ∈ span T ⊔ S) + (hdc : ∀ g : GaugeGroupI, repGauge g (deltaContraction T) = deltaContraction T) + (hx : x ∈ IsSU2BiFundamental.span T ⊔ S) (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : - ∃ c : ℂ, ∃ y ∈ S, x = c • epsilonContraction T + y + ∃ c : ℂ, ∃ y ∈ S, x = c • deltaContraction T + y ∧ ∀ g : GaugeGroupI, repGauge g y = y := by - obtain ⟨c, y, hyS, hxy, hyinv⟩ := - hT.isSU2BiFundamental_reindex.mem_span_sup_invariant_iff x S hS - (fun g => by rw [epsilonContraction_reindex, hec g]) - (by rw [span_reindex]; exact hx) hinv - exact ⟨c, y, hyS, by rw [hxy, epsilonContraction_reindex], hyinv⟩ + obtain ⟨c, y, hyS, hxy, -⟩ := + hT.mem_span_sup_su2_invariant_iff x S (fun V => hS (1, V, 1)) hx fun V => hinv (1, V, 1) + refine ⟨c, y, hyS, hxy, fun g => ?_⟩ + rw [show y = x - c • deltaContraction T from by rw [hxy]; abel, map_sub, map_smul, + hinv g, hdc g] -end IsSU2BiAntiFun +end IsSU2FunAntiFun end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiAdjoint.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiAdjoint.lean index 90f2fa6ff..221c3bfe9 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiAdjoint.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiAdjoint.lean @@ -5,58 +5,54 @@ Authors: Joseph Tooby-Smith -/ 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 +public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.Basic /-! # 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. - -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`. +A `W`-boson field strength `W^a` carries one isospin index `a`, running over the three Pauli +directions of `su(2)`. A product of two field strengths carries two, and the combination that +enters the Yang–Mills Lagrangian is the isospin trace `∑ a, W^a W^a`. This file proves the +group theory behind that choice, in the form the Standard Model files consume: among all +combinations of the components of such a product, the multiples of the trace are the only +ones every isospin rotation leaves alone. In the language of representation theory, the +adjoint of `SU(2)` is the vector representation of the rotation group, +`3 ⊗ 3 = 1 ⊕ 3 ⊕ 5` contains exactly one singlet, and that singlet is the dot product. + +`IsSU2BiAdjoint B repGauge T` records the hypothesis. `T` is a family indexed by two isospin +indices and valued in a module `B` carrying a representation `repGauge` of the gauge group, +and an isospin rotation `U ∈ SU(2)` moves its components by two copies of the adjoint matrix +of `U`, as a rank two tensor `T^{a b}` should. Nothing is asked of the colour and hypercharge +factors, and the conclusions are accordingly about invariance under isospin. + +The theorem, `mem_span_sup_su2_invariant_iff`, is stated modulo an isospin-stable submodule +`S`, because the Standard Model files handle many families at once and peel them off one at +a time: an isospin invariant in the span of the components joined with `S` is a multiple of +the trace contraction up to an isospin-invariant error in `S`. + +The proof has two halves, and neither needs more than the module structure of `B`. + +The first half is the linear algebra of `Invariants.Basic`. A vector of the span is +`∑ l, c l • T l` for a coefficient function `c` on pairs of isospin indices, and an isospin +rotation acts on `c` by the Kronecker square of its adjoint matrix, a unitary action. So an +invariant vector of the span is the contraction of an invariant coefficient +(`Family.exists_invariant_coeff`), and the question becomes a finite one. + +The second half is a finite computation with four rotations. An invariant coefficient is a +`3 × 3` matrix fixed by every rotation. The three half turns about the isospin axes, the +elements `i σ₁`, `i σ₂`, `i σ₃` of `SU(2)`, each fix one Pauli direction and reverse the +other two, so they change the sign of every entry `c ![a, b]` with `a ≠ b`: the matrix is +diagonal. A third of a turn about the diagonal axis cycles the three Pauli directions, so the +diagonal entries agree. The matrix is a multiple of the identity and the vector a multiple +of the trace. + +Section A sets up the adjoint matrix and the transformation law. Section B has the span, the +action on coefficients and the trace contraction. Section C computes the four rotations on +coefficients, section D is the finite computation, section E classifies the invariants of +the span, and section F divides out a stable submodule and proves the theorem. An aside at +the end holds what `MassDimEight` imports from here and the theorem does not use: the weight +basis of the adjoint and the gauge form of the theorem. -/ @[expose] public section @@ -67,20 +63,15 @@ open Matrix PauliMatrix /-! -## A. The `SU(2)` adjoint matrix and bi-adjoint families +## A. The adjoint action of `SU(2)` on an isospin index -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 -## 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. +An isospin rotation `U` acts on the Lie algebra `su(2)` by conjugation, `X ↦ U X U⁻¹`, and +its adjoint matrix is the matrix of that action in the Pauli basis, read off with the trace +pairing `(X, Y) ↦ ½ tr (X Y)`. The matrix is real, and orthogonal because conjugation +preserves the trace pairing; it is the `su(2)` block of `GaugeAlgebra.adjointMatrix` at the +gauge element `(1, U, 1)`, which is where those two facts are proved. -/ @@ -92,50 +83,41 @@ noncomputable def su2AdjointMatrix (U : specialUnitaryGroup (Fin 2) ℂ) : 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)`. -/ +/-- The entries of the adjoint matrix. -/ @[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. -/ +/-- The rows of the adjoint matrix are orthonormal. -/ 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 -/-! +/-- The adjoint matrix of the inverse is the transpose. -/ +lemma su2AdjointMatrix_inv (U : specialUnitaryGroup (Fin 2) ℂ) (a b : Fin 3) : + su2AdjointMatrix U⁻¹ a b = su2AdjointMatrix U b a := by + have h := GaugeAlgebra.adjointMatrix_inv_apply (1, U, 1) (Sum.inr (Sum.inl a)) + (Sum.inr (Sum.inl b)) + rwa [show ((1, U, 1) : GaugeGroupI)⁻¹ = (1, U⁻¹, 1) from by simp] at h -## 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 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`. +## A.2. Bi-adjoint families -`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 transformation law carries one factor of the adjoint matrix per index, with the summed +index in the row slot. It is recorded as `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, so +that it can be applied to the maps a representation induces on a quotient. `IsSU2BiAdjoint` +asks it of the isospin rotations `repGauge (1, U, 1)` alone. -/ -/-- 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. -/ +/-- The linear map `f` moves the components of `T` as `U ∈ SU(2)` 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 := @@ -143,244 +125,418 @@ def IsSU2BiAdjointMat {B : Type*} [AddCommMonoid B] [Module ℂ B] 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: an - isospin transformation moves the components by the `SU(2)` element it is built from. - Nothing is asked of the colour or hypercharge factors. -/ +/-- A family `T` of elements of `B`, indexed by two `su(2)` adjoint indices, transforms as a + tensor `T^{a b}` under the isospin factor of the gauge group. Nothing is asked of the + colour and 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 : specialUnitaryGroup (Fin 2) ℂ, IsSU2BiAdjointMat g (repGauge (1, g, 1)) T -/-! +namespace IsSU2BiAdjoint -## A.3. The isospin part of a representation +/- `span`, `traceContraction` and `biVec` take the hypothesis `hT` only to hang off it by +dot notation, and `mem_span_sup_invariant_iff` keeps a hypothesis for its caller; each is +marked `nolint unusedArguments` where it is declared. -/ +set_option linter.unusedVariables false -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. +variable {B : Type*} [AddCommGroup B] [Module ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} {T : (Fin 2 → Fin 3) → B} -`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. +/-! --/ +## B. Coefficients, their action and the trace -/-- 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)⟩ +A vector of the span of the components is a contraction `∑ l, c l • T l` against a +coefficient function `c` on pairs of isospin indices, and the transformation law says exactly +that an isospin rotation moves such a contraction by moving `c` with the Kronecker square of +its adjoint matrix, `act U`. Orthogonality of the adjoint matrix makes `act U⁻¹` the +transpose of `act U`, and the matrix being real, `act U` commutes with conjugation: these are +the two hypotheses of `Family.exists_invariant_coeff`. The trace contraction +`∑ a, T ![a, a]` is the contraction against the Kronecker delta `traceCoeff`, and it is +isospin invariant because the delta is an invariant coefficient. -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) - -/-- 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. -/ +/-- The span of the components. -/ +@[nolint unusedArguments] 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 _)) +/-- A vector lies in the span precisely when it is a linear combination of the + components. -/ +lemma mem_span_iff (hT : IsSU2BiAdjoint B repGauge T) (x : B) : + x ∈ hT.span ↔ ∃ (c : (Fin 2 → Fin 3) → ℂ), x = ∑ d, c d • T d := + Family.mem_iSup_span_singleton_iff T x -/-! +/-- A sum over pairs of isospin 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] := + Family.sum_pi_two F + +/-- The action of `U ∈ SU(2)` on coefficient functions: the Kronecker square of its + adjoint matrix. -/ +noncomputable def act (U : specialUnitaryGroup (Fin 2) ℂ) : + ((Fin 2 → Fin 3) → ℂ) →ₗ[ℂ] (Fin 2 → Fin 3) → ℂ := + Matrix.toLin' (Matrix.of fun a l => + ∏ i : Fin 2, ((su2AdjointMatrix U (a i) (l i) : ℝ) : ℂ)) + +/-- The action on coefficients, written out. -/ +lemma act_apply (U : specialUnitaryGroup (Fin 2) ℂ) (c : (Fin 2 → Fin 3) → ℂ) + (a : Fin 2 → Fin 3) : + act U c a = ∑ l, (∏ i : Fin 2, ((su2AdjointMatrix U (a i) (l i) : ℝ) : ℂ)) * c l := by + simp [act, Matrix.mulVec, dotProduct] + +/-- The transformation law in coefficient form: a map moving the components by `U` moves a + contraction by `act U` on its coefficients. -/ +lemma map_sum_smul {U : specialUnitaryGroup (Fin 2) ℂ} {f : B →ₗ[ℂ] B} + (hf : IsSU2BiAdjointMat U f T) (c : (Fin 2 → Fin 3) → ℂ) : + f (∑ l, c l • T l) = ∑ a, act U c a • T a := by + simp only [map_sum, map_smul, act_apply, Finset.sum_smul] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun l _ => ?_ + rw [hf l, Finset.smul_sum] + exact Finset.sum_congr rfl fun a _ => by rw [smul_smul, mul_comm] + +/-- The action of `U⁻¹` is the transpose of the action of `U`, the adjoint matrix being + orthogonal. -/ +lemma sum_act_mul (U : specialUnitaryGroup (Fin 2) ℂ) (c d : (Fin 2 → Fin 3) → ℂ) : + ∑ a, act U c a * d a = ∑ l, c l * act U⁻¹ d l := by + simp only [act_apply, su2AdjointMatrix_inv, Finset.sum_mul, Finset.mul_sum] + rw [Finset.sum_comm] + exact Finset.sum_congr rfl fun l _ => Finset.sum_congr rfl fun a _ => by ring -## B. The trace contraction +/-- The action on coefficients commutes with complex conjugation, the adjoint matrix being + real. -/ +lemma act_star (U : specialUnitaryGroup (Fin 2) ℂ) (c : (Fin 2 → Fin 3) → ℂ) : + act U (star c) = star (act U c) := by + funext a + simp [act_apply, star_sum, star_mul', Complex.conj_ofReal] --/ +/-- The Kronecker delta on pairs of isospin indices: the coefficients of the trace. -/ +def traceCoeff : (Fin 2 → Fin 3) → ℂ := fun l => if l 0 = l 1 then 1 else 0 -/-- 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. -/ +/-- The Kronecker delta is an invariant coefficient: the rows of the adjoint matrix are + orthonormal. -/ +lemma act_traceCoeff (U : specialUnitaryGroup (Fin 2) ℂ) : act U traceCoeff = traceCoeff := by + funext a + rw [act_apply, sum_pi_two] + have key : ∀ x y : Fin 3, + (∏ i : Fin 2, ((su2AdjointMatrix U (a i) (![x, y] i) : ℝ) : ℂ)) * traceCoeff ![x, y] + = if y = x then + ((su2AdjointMatrix U (a 0) x * su2AdjointMatrix U (a 1) x : ℝ) : ℂ) else 0 := by + intro x y + by_cases h : y = x + · subst h + simp [traceCoeff, Fin.prod_univ_two] + · simp [traceCoeff, Fin.prod_univ_two, h, Ne.symm h] + simp only [key, Finset.sum_ite_eq', Finset.mem_univ, if_true, ← Complex.ofReal_sum, + sum_su2AdjointMatrix_row_mul] + by_cases h : a 0 = a 1 <;> simp [traceCoeff, h] + +/-- The trace contraction: the Kronecker contraction of the two isospin indices. -/ +@[nolint unusedArguments] 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 +/-- The trace is the contraction against the Kronecker delta. -/ +lemma sum_traceCoeff_smul (T : (Fin 2 → Fin 3) → B) : + ∑ l, traceCoeff l • T l = ∑ a : Fin 3, T ![a, a] := 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 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. -/ + simp [traceCoeff, ite_smul] + +/-- Any map moving the components by an `SU(2)` matrix fixes the trace contraction. -/ lemma map_traceContraction (hT : IsSU2BiAdjoint B repGauge T) - {U : specialUnitaryGroup (Fin 2) ℂ} {f : B →ₗ[ℂ] B} - (hf : IsSU2BiAdjointMat U f 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 f (∑ c : Fin 3, T ![c, c]) = _ - rw [map_sum] - have h1 : ∀ c : Fin 3, f (T ![c, c]) - = ∑ b : Fin 2 → Fin 3, - ((su2AdjointMatrix U (b 0) c * su2AdjointMatrix U (b 1) c : ℝ) : ℂ) • T b := by - intro c - rw [hf ![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_su2AdjointMatrix_row_mul] - 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. -/ + rw [traceContraction, ← sum_traceCoeff_smul, map_sum_smul hf, act_traceCoeff] + +/-- The trace contraction is isospin invariant. Nothing constrains the colour and + hypercharge factors, which may well move it. -/ 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 +## C. Four isospin rotations on coefficients + +The adjoint action of `SU(2)` is the rotation group acting on three-dimensional space, and +four rotations suffice for the classification. C.1 has the three half turns about the isospin +axes, and C.2 a third of a turn about the diagonal axis `σ₁ + σ₂ + σ₃`, which cycles the +three Pauli directions. + +## C.1. The isospin flips + +The element `i σ_k` of `SU(2)` conjugates `σ_k` to itself and the other two Pauli matrices +to their negatives: it is the half turn about the `k`-th isospin axis, its adjoint matrix is +diagonal with entries `±1`, and it multiplies a coefficient `c ![a, b]` by the product of +the signs of `a` and `b`. + +-/ + +/-- The matrix of the `k`-th isospin flip, the half turn `i σ_k` 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 conjugate transpose 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)`. -/ +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 conjugate transpose 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] + +/-- The sign by which the `k`-th isospin flip scales each Pauli direction: `1` on its own + axis and `-1` on the other two. -/ +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] + +/-- An isospin flip multiplies a coefficient by the product of the signs of its two + indices. -/ +lemma act_su2Flip (k : Fin 3) (c : (Fin 2 → Fin 3) → ℂ) (a b : Fin 3) : + act (su2Flip k) c ![a, b] + = ((su2FlipSign k a : ℤ) : ℂ) * ((su2FlipSign k b : ℤ) : ℂ) * c ![a, b] := by + rw [act_apply, sum_pi_two, Finset.sum_eq_single a, Finset.sum_eq_single b] + · simp only [Fin.prod_univ_two, Matrix.cons_val_zero, Matrix.cons_val_one, + su2AdjointMatrix_su2Flip, if_true, Complex.ofReal_intCast] + · intro y _ hy + simp [-su2AdjointMatrix_apply, su2AdjointMatrix_su2Flip, Ne.symm hy] + · simp + · intro x _ hx + simp [-su2AdjointMatrix_apply, su2AdjointMatrix_su2Flip, Ne.symm hx] + · simp /-! -## 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 -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 -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. +## C.2. A third of a turn about the diagonal axis + +The element `(1 + i(σ₁ + σ₂ + σ₃))/2` of `SU(2)` is a rotation through a third of a turn +about the axis `σ₁ + σ₂ + σ₃`, and its adjoint matrix is the cyclic permutation of the +three Pauli directions. On coefficients it carries each diagonal entry to the next. -/ -namespace IsSU2BiAdjoint +/-- The `SU(2)` element `(1 + i(σ₁ + σ₂ + σ₃))/2`, a third of a turn about the diagonal + axis of the three Pauli directions. -/ +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⟩ -set_option linter.unusedVariables false +/-- 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 carries the second diagonal coefficient to the first. -/ +lemma act_su2Cyc_zero_zero (c : (Fin 2 → Fin 3) → ℂ) : + act su2Cyc c ![0, 0] = c ![1, 1] := by + rw [act_apply, sum_pi_two, su2AdjointMatrix_su2Cyc] + simp [Fin.sum_univ_three, Fin.prod_univ_two] + +/-- The third of a turn carries the first diagonal coefficient to the third. -/ +lemma act_su2Cyc_two_two (c : (Fin 2 → Fin 3) → ℂ) : + act su2Cyc c ![2, 2] = c ![0, 0] := by + rw [act_apply, sum_pi_two, su2AdjointMatrix_su2Cyc] + simp [Fin.sum_univ_three, Fin.prod_univ_two] + +/-! + +## D. An invariant coefficient is a multiple of the Kronecker delta + +The flip about the axis `a` reverses every other direction, so it changes the sign of +`c ![a, b]` for `b ≠ a`: an invariant coefficient is diagonal. The third of a turn cycles the +diagonal entries, so they agree. + +-/ + +/-- An invariant coefficient is a multiple of the Kronecker delta. -/ +theorem exists_smul_traceCoeff_of_act_eq {c : (Fin 2 → Fin 3) → ℂ} + (hc : ∀ U : specialUnitaryGroup (Fin 2) ℂ, act U c = c) : + ∃ z : ℂ, c = z • traceCoeff := by + have hoff : ∀ a b : Fin 3, a ≠ b → c ![a, b] = 0 := by + intro a b hab + have hs : su2FlipSign a a = 1 ∧ su2FlipSign a b = -1 := by + revert a b + decide + have h := congrFun (hc (su2Flip a)) ![a, b] + rw [act_su2Flip, hs.1, hs.2] at h + push_cast at h + linear_combination (-1 / 2 : ℂ) * h + have hdiag : ∀ a : Fin 3, c ![a, a] = c ![0, 0] := by + have h1 := congrFun (hc su2Cyc) ![0, 0] + have h2 := congrFun (hc su2Cyc) ![2, 2] + rw [act_su2Cyc_zero_zero] at h1 + rw [act_su2Cyc_two_two] at h2 + intro a + have ha : a = 0 ∨ a = 1 ∨ a = 2 := by + revert a + decide + rcases ha with rfl | rfl | rfl + · rfl + · exact h1 + · exact h2.symm + refine ⟨c ![0, 0], funext fun l => ?_⟩ + obtain ⟨a, b, rfl⟩ : ∃ a b, l = ![a, b] := ⟨l 0, l 1, by ext i; fin_cases i <;> rfl⟩ + by_cases h : a = b + · subst h + simp [traceCoeff, hdiag] + · simp [traceCoeff, h, hoff a b h] + +/-! + +## E. The isospin invariants of the span + +The action on coefficients is unitary, by `sum_act_mul` and `act_star`, so +`Family.exists_invariant_coeff` writes an isospin invariant of the span as the contraction +of an invariant coefficient, and section D makes that coefficient a multiple of the delta. +The statement is made for any family of linear maps `φ U` obeying the law, not only for the +isospin rotations `repGauge (1, U, 1)`, so that section F can apply it in a quotient. + +-/ + +/-- Every invariant in the span of a family obeying the law for a family of linear maps + `φ U` is a multiple of the trace: the one singlet of `3 ⊗ 3`. -/ +theorem exists_smul_sum_diag_of_invariant {φ : specialUnitaryGroup (Fin 2) ℂ → B →ₗ[ℂ] B} + (hT : ∀ U, IsSU2BiAdjointMat U (φ U) T) {x : B} (hx : x ∈ ⨆ d, ℂ ∙ T d) + (hinv : ∀ U, φ U x = x) : + ∃ z : ℂ, x = z • ∑ a : Fin 3, T ![a, a] := by + obtain ⟨c, rfl, hc⟩ := Family.exists_invariant_coeff T φ act + (fun U c => map_sum_smul (hT U) c) + (Family.sum_star_mul_of_transpose act sum_act_mul act_star) hx hinv + obtain ⟨z, hz⟩ := exists_smul_traceCoeff_of_act_eq hc + refine ⟨z, ?_⟩ + rw [hz, ← sum_traceCoeff_smul, Finset.smul_sum] + simp only [Pi.smul_apply, smul_eq_mul, mul_smul] + +/-- Every isospin invariant in the span of the components is a multiple of the trace + contraction. -/ +theorem exists_smul_traceContraction_of_su2_invariant (hT : IsSU2BiAdjoint B repGauge T) + {x : B} (hx : x ∈ hT.span) + (hinv : ∀ U : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, U, 1) x = x) : + ∃ z : ℂ, x = z • hT.traceContraction := + exists_smul_sum_diag_of_invariant hT.repGauge_T hx hinv + +/-! + +## F. The invariants modulo a stable submodule + +The Standard Model files handle many families at once and peel them off one at a time, so +the classification is wanted modulo a submodule `S` in which the other families are parked. +The law descends to the quotient by an isospin-stable `S`, so section E applies there, and +`Family.exists_smul_add_of_mem_sup` lifts the result back. + +-/ + +/-- The law descends to the quotient by a submodule stable under the map. -/ +lemma isSU2BiAdjointMat_mapQ {U : specialUnitaryGroup (Fin 2) ℂ} {f : B →ₗ[ℂ] B} + (hf : IsSU2BiAdjointMat U f T) (S : Submodule ℂ B) (hS : ∀ y ∈ S, f y ∈ S) : + IsSU2BiAdjointMat U (S.mapQ S f hS) fun l => S.mkQ (T l) := by + intro l + dsimp only + rw [← LinearMap.comp_apply, Submodule.mapQ_mkQ, LinearMap.comp_apply, hf 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` is a multiple of the trace contraction up to an isospin-invariant remainder + in `S`. -/ +theorem mem_span_sup_su2_invariant_iff (hT : IsSU2BiAdjoint 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) : + ∃ c : ℂ, ∃ y ∈ S, x = c • hT.traceContraction + y + ∧ ∀ U : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, U, 1) y = y := by + refine Family.exists_smul_add_of_mem_sup T (fun U => repGauge (1, U, 1)) S hS + hT.traceContraction hT.repGauge_traceContraction (fun x hx hinv => ?_) hx hinv + obtain ⟨z, hz⟩ := exists_smul_sum_diag_of_invariant + (fun U => isSU2BiAdjointMat_mapQ (hT.repGauge_T U) S (hS U)) hx hinv + exact ⟨z, by rw [hz, traceContraction, map_sum]⟩ /-! -## C.1. The weight basis of the `su(2)` adjoint +## Aside: what `MassDimEight` imports from here + +Nothing from here on is used by the theorem above. Each item exists because `MassDimEight` +imports it under this name. + +## Aside: the weight basis of the adjoint + +The Pauli basis of `su(2)` can be traded for the weight basis: the two root directions +`σ₁ ± i σ₂`, on which the Cartan generator `σ₃` acts by `±2`, and `σ₃` itself. `wtCoeff` +gives the Pauli coordinates of the weight basis, `biVec` contracts a bi-adjoint family +against two coordinate vectors, and `span_eq_wtSpan` says that the contractions against +weight vectors span the same submodule as the components. -/ @@ -391,111 +547,25 @@ 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 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 GaugeAlgebra.su2CartanId) := 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. -/ +/-- Every Pauli index is 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 = GaugeAlgebra.su2CartanId := by revert a decide -/-! - -## C.2. The `SU(2)` 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 `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) - (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 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) - (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 `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))) - rw [dualMap_coord_apply] at e - rw [e] - simp [Finsupp.single_apply] - -/-! - -## C.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. -/ +/-- The Pauli coordinates of the `su(2)` adjoint weight 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) @@ -503,107 +573,34 @@ noncomputable def wtCoeff : WeightIdx → Fin 3 → ℂ - Complex.I * (if a = rootPair.2 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 - | 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 an element of `SU(2)` on the coordinates of one `su(2)` adjoint - index. -/ -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 : ℂ) : - ∑ 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] +/-- The 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 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] +/-- The 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 -/-- 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 (GaugeGroupI.toSU2 (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, 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] - 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, 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] - 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, su2AdjointMatrix_cartanId, Pi.smul_apply, smul_eq_mul, - GaugeWeight.zero_coord, zpow_zero, - apply_ite (fun x : ℝ => (x : ℂ)), Complex.ofReal_one, Complex.ofReal_zero] - -/-! - -## C.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 Cartan direction is already a weight vector. -/ +lemma unitVec_cartanId : + unitVec GaugeAlgebra.su2CartanId = wtCoeff (Sum.inr (Sum.inr 0)) := rfl -/-- The element of `B` obtained by contracting the two `su(2)` adjoint indices of `T` - against a pair of coordinate vectors. -/ +/-- The contraction of the two isospin indices of `T` against a pair of coordinate + vectors. -/ +@[nolint unusedArguments] 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 @@ -640,11 +637,6 @@ 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] @@ -652,90 +644,10 @@ lemma biVec_unitVec (a b : Fin 3) : hT.biVec (unitVec a) (unitVec b) = T ![a, b] rw [Finset.sum_eq_single_of_mem a (Finset.mem_univ a) fun x _ hx => by simp [hx]] simp -/-- 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 U (a 0) (d 0) : ℝ) : ℂ) * - ((su2AdjointMatrix U (a 1) (d 1) : ℝ) : ℂ))) - • T a := by - intro d - 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] - 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 - -/-- 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.repSU2_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. -/ +/-- The join of the lines spanned by the contractions against pairs of 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 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. -/ lemma biVec_wtCoeff_unitVec_mem (k : WeightIdx) (b : Fin 3) : @@ -763,8 +675,8 @@ lemma biVec_unitVec_mem (a b : Fin 3) : · 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. -/ +/-- The weight vectors span the components: the change of basis from the Pauli basis to + the weight basis is invertible. -/ 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 ?_) @@ -780,705 +692,18 @@ lemma span_eq_wtSpan : hT.span = hT.wtSpan := by /-! -## C.5. The decomposition - --/ - -/-- 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 (repSU2 repGauge) hT.span := - GaugeWeightDecomposition.copy - (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.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 - 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, 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), - (0, 0, -4, 0)} := by - rw [hT.gaugeWeightDecomposition_supp_eq hmul] - decide - -/-! - -## 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 - ((repSU2_invariant_iff_su2 repGauge _).2 hT.repGauge_traceContraction) - -/-! - -## 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. - --/ - -/-- 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. +## Aside: the gauge form of the theorem -/ -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) +/-- The gauge form on an algebra: a gauge invariant of the span joined with a gauge-stable + submodule is a multiple of the trace contraction up to a gauge-invariant remainder, once + the trace contraction is known to be gauge invariant. The multiplicativity hypothesis + `hmul` is not used; `MassDimEight` passes it. -/ +@[nolint unusedArguments] +theorem mem_span_sup_invariant_iff {B : Type*} [Ring B] [Algebra ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} {T : (Fin 2 → Fin 3) → B} + (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) @@ -1486,43 +711,11 @@ lemma mem_span_sup_invariant_iff (hT : IsSU2BiAdjoint B repGauge T) (hmul : IsMu (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 + obtain ⟨c, y, hyS, hxy, -⟩ := + hT.mem_span_sup_su2_invariant_iff x S (fun U => hS (1, U, 1)) hx fun U => hinv (1, U, 1) + refine ⟨c, y, hyS, hxy, fun g => ?_⟩ + rw [show y = x - c • hT.traceContraction from by rw [hxy]; abel, map_sub, map_smul, + hinv g, htc g] end IsSU2BiAdjoint diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiFundamental.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiFundamental.lean index efb7cecfb..ef44b343a 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiFundamental.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiFundamental.lean @@ -5,74 +5,41 @@ 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 +public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU2BiAdjoint /-! # 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. - -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. `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 isospin invariants. - -The rest of the file is what the Yukawa sector asks for on top of that. Section E verifies -the two matrix identities that make the anti-fundamental of `SU(2)` the fundamental in -another basis, `conj U = ε U ε⁻¹` and `(U⁻¹)ᵀ = conj U`; `SU(3)` has no analogue, which is -why the colour side needs a separate `IsSU3FunAntiFun` and the isospin side does not. -Section F carries the classification to a family valued in a mere module, through the -square-zero extension, and section G divides out a stable submodule, which together are -what let one family at a time be peeled off a join. - -The two twisted cases, `2 ⊗ 2̄` and `2̄ ⊗ 2̄`, are not here: they are `IsSU2FunAntiFun` and -`IsSU2BiAntiFun` of `IsSU2AntiFundamental`, which imports this file for section E. Neither -needs a classification of its own, the epsilon re-index turning each into a bi-fundamental -family with the same span, so all that is left there is the bookkeeping of which contraction -of the original family the epsilon contraction of the re-indexed one is. +The Higgs field and the left-handed fermions are isospin doublets: each carries one +fundamental `su(2)` index, taking two values. A product of two doublets carries two, and +there is exactly one way to contract them into an isospin singlet: `2 ⊗ 2 = 1 ⊕ 3`, and the +singlet is the antisymmetric combination `ε_{ab} T^{ab} = T^{01} - T^{10}`. It is invariant +because the antisymmetric symbol of a two-dimensional space transforms by the determinant, +and the determinant of an element of `SU(2)` is one. This file proves that the antisymmetric +contraction is the only invariant, in the form the Standard Model files consume, modulo an +isospin-stable submodule in which other families are parked. + +`IsSU2BiFundamental B repGauge T` records the hypothesis. `T` is a family indexed by two +fundamental indices and valued in a module `B` carrying a representation of the gauge group, +and an isospin rotation `U ∈ SU(2)` moves its components by one factor of `U` per index. +Nothing is asked of the colour and hypercharge factors, which may well move the components: +a product of two Higgs fields carries hypercharge. + +The proof follows `IsSU2BiAdjoint`. The action on coefficient functions `c ![a, b]` is +`c ↦ U c Uᵀ`, unitary, so an isospin invariant of the span is the contraction of an +invariant coefficient, by `Family.exists_invariant_coeff`. An invariant coefficient is a +`2 × 2` matrix fixed by every `U ∈ SU(2)`, and two rotations pin it down. The diagonal +element `diag(i, -i)` scales each diagonal entry `c ![a, a]` by `i² = -1`, so the matrix has +zero diagonal, and the Weyl element `su2Perm = !![0, -1; 1, 0]` carries `c ![1, 0]` to +`-c ![0, 1]`, so the matrix is antisymmetric. It is a multiple of the antisymmetric symbol +and the vector a multiple of the epsilon contraction. + +Section A gives the transformation law and the span, section B the antisymmetric symbol and +the epsilon contraction, section C the action on coefficients, section D the classification +of invariant coefficients, section E the invariants of the span, and section F the form +modulo a stable submodule. An aside at the end records how the entries of an `SU(2)` matrix +behave under complex conjugation, which is what `IsSU2AntiFundamental` needs to reduce +anti-fundamental indices to fundamental ones. -/ @[expose] public section @@ -83,45 +50,22 @@ open Matrix ComplexConjugate /-! -## 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 -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 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. +## A. The transformation law and the span of the components -/ -/-- 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. -/ +/-- The linear map `f` moves the components of `T` as `U ∈ SU(2)` 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: an isospin transformation moves the components by the `SU(2)` element it is built - from. Nothing is asked of the colour or hypercharge factors. -/ +/-- A family `T` of elements of `B`, indexed by two `su(2)` fundamental indices, transforms + as a tensor `T^{a b}` under the isospin factor of the gauge group. Nothing is asked of the + colour and hypercharge factors. -/ structure IsSU2BiFundamental (B : Type*) [AddCommMonoid B] [Module ℂ B] (repGauge : Representation ℂ GaugeGroupI B) (T : (Fin 2 → Fin 2) → B) : Prop where @@ -129,121 +73,40 @@ structure IsSU2BiFundamental (B : Type*) [AddCommMonoid B] [Module ℂ B] 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. -/ +/-- The span of the components. -/ 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. -/ +/-- A vector lies in the span precisely when it is a linear combination of the + components. -/ 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 - 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 _)) + x ∈ span T ↔ ∃ (c : (Fin 2 → Fin 2) → ℂ), x = ∑ d, c d • T d := + Family.mem_iSup_span_singleton_iff T x /-- 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 _) + Family.mem_iSup_span_singleton T d -/-! +/-- A sum over pairs of 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] := + Family.sum_pi_two F -## 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 isospin invariant. +## B. The antisymmetric symbol and the epsilon contraction -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; 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. +The antisymmetric symbol `ε` on two indices is the Levi-Civita symbol of `Fin 2`, written +as Physlib writes every Levi-Civita symbol, as a generalized Kronecker delta. Its invariance +under `SU(2)`, `∑ x y, ε x y U b x U c y = ε b c`, is the statement that the determinant of +`U` is one, and it makes the epsilon contraction `T ![0, 1] - T ![1, 0]` 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 +/-- The antisymmetric symbol on a pair of `su(2)` fundamental indices, 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) : ℤ) @@ -273,8 +136,8 @@ private lemma det_fin_two_fun (f : Fin 2 → Fin 2 → ℤ) : @[simp] lemma epsilon_one_one : epsilon 1 1 = 0 := by simp [epsilon, KroneckerDelta.generalizedKroneckerDelta, det_fin_two_fun] -/-- 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. -/ +/-- The antisymmetric symbol is invariant under an element of `SU(2)`, because its + determinant 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 @@ -288,628 +151,235 @@ lemma sum_epsilon_mul (U : specialUnitaryGroup (Fin 2) ℂ) (b c : Fin 2) : · linear_combination -hdet · ring -/-- The epsilon contraction of a family indexed by two `su(2)` fundamental indices: the - antisymmetric contraction of the two indices. -/ +/-- The epsilon contraction: the antisymmetric contraction of the two fundamental + 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 (T : (Fin 2 → Fin 2) → B) : - epsilonContraction T = ∑ d : Fin 2 → Fin 2, epsilon (d 0) (d 1) • T d := by +/-- The antisymmetric symbol as a coefficient function on pairs of indices. -/ +def epsilonCoeff : (Fin 2 → Fin 2) → ℂ := fun l => epsilon (l 0) (l 1) + +/-- The epsilon contraction is the contraction against the antisymmetric symbol. -/ +lemma sum_epsilonCoeff_smul (T : (Fin 2 → Fin 2) → B) : + ∑ l, epsilonCoeff l • T l = epsilonContraction T := by rw [sum_pi_two] - simp [epsilonContraction, Fin.sum_univ_two, sub_eq_add_neg] + simp [epsilonCoeff, epsilonContraction, Fin.sum_univ_two, sub_eq_add_neg] /-- The epsilon contraction lies in the span of the components. -/ lemma epsilonContraction_mem_span (T : (Fin 2 → Fin 2) → B) : - epsilonContraction T ∈ span T := by - rw [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 [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) * (U.1 (b 0) (d 0) * U.1 (b 1) (d 1))) • T b := by - intro d - 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] - 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 U (b 0) (b 1) - rw [step, ← epsilonContraction_eq_sum] - -/-- 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) : - repSU2 repGauge g (epsilonContraction T) = epsilonContraction T := - (repSU2_invariant_iff_su2 repGauge _).2 (repGauge_epsilonContraction hT) g - -/-! - -## 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 `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 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 -`IsSU2BiFundamental` needs, so both appear as extra arguments here. - --/ - -/-! - -## 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) - -/-- 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 `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) + epsilonContraction T ∈ span T := + sub_mem (mem_span _) (mem_span _) /-! -## C.2. The components are weight vectors - --/ - -/-- 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 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) : - repSU2 repGauge (gaugeTorusGen i) (T l) - = ((expI : ℂ) ^ GaugeWeight.coord (wtWeight l) i) • T l := by - 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] - -/-! +## C. The action on coefficients -## C.3. The decomposition +A vector of the span is a contraction `∑ l, c l • T l` against a coefficient function `c` +on pairs of indices, and the law says that an isospin rotation moves it by moving `c` with +the Kronecker square `act U` of `U`. Unitarity of `U` makes `act U⁻¹` the adjoint of +`act U`, which is the hypothesis of `Family.exists_invariant_coeff`. The antisymmetric +symbol is an invariant coefficient, so the epsilon contraction is invariant. -/ -section Decomposition +/-- The action of `U ∈ SU(2)` on coefficient functions: the Kronecker square of `U`. -/ +noncomputable def act (U : specialUnitaryGroup (Fin 2) ℂ) : + ((Fin 2 → Fin 2) → ℂ) →ₗ[ℂ] (Fin 2 → Fin 2) → ℂ := + Matrix.toLin' (Matrix.of fun a l => ∏ i : Fin 2, U.1 (a i) (l i)) + +/-- The action on coefficients, written out. -/ +lemma act_apply (U : specialUnitaryGroup (Fin 2) ℂ) (c : (Fin 2 → Fin 2) → ℂ) + (a : Fin 2 → Fin 2) : + act U c a = ∑ l, (∏ i : Fin 2, U.1 (a i) (l i)) * c l := by + simp [act, Matrix.mulVec, dotProduct] + +/-- The transformation law in coefficient form. -/ +lemma map_sum_smul {T : (Fin 2 → Fin 2) → B} {U : specialUnitaryGroup (Fin 2) ℂ} + {f : B →ₗ[ℂ] B} (hf : IsSU2BiFundamentalMat U f T) (c : (Fin 2 → Fin 2) → ℂ) : + f (∑ l, c l • T l) = ∑ a, act U c a • T a := by + simp only [map_sum, map_smul, act_apply, Finset.sum_smul] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun l _ => ?_ + rw [hf l, Finset.smul_sum] + exact Finset.sum_congr rfl fun a _ => by rw [smul_smul, mul_comm] + +/-- The inverse of a special unitary matrix is its conjugate transpose. -/ +lemma inv_apply (U : specialUnitaryGroup (Fin 2) ℂ) (a b : Fin 2) : + (U⁻¹).1 a b = conj (U.1 b a) := by + rw [← Matrix.star_eq_inv, Matrix.specialUnitaryGroup.coe_star, Matrix.star_apply] + rfl + +/-- The action of `U⁻¹` is the adjoint of the action of `U`. -/ +lemma sum_star_mul_act (U : specialUnitaryGroup (Fin 2) ℂ) (c d : (Fin 2 → Fin 2) → ℂ) : + ∑ a, star (c a) * act U d a = ∑ l, star (act U⁻¹ c l) * d l := by + simp only [act_apply, inv_apply, Fin.prod_univ_two, Finset.mul_sum, Finset.sum_mul, + star_sum, star_mul', Complex.star_def, Complex.conj_conj] + rw [Finset.sum_comm] + exact Finset.sum_congr rfl fun l _ => Finset.sum_congr rfl fun a _ => by ring + +/-- The antisymmetric symbol is an invariant coefficient. -/ +lemma act_epsilonCoeff (U : specialUnitaryGroup (Fin 2) ℂ) : act U epsilonCoeff = epsilonCoeff := by + funext a + rw [act_apply, sum_pi_two] + simp only [epsilonCoeff, Fin.prod_univ_two, Matrix.cons_val_zero, Matrix.cons_val_one] + rw [← sum_epsilon_mul U (a 0) (a 1)] + exact Finset.sum_congr rfl fun x _ => Finset.sum_congr rfl fun y _ => mul_comm _ _ + +/-- Any map moving the components by an element of `SU(2)` fixes the epsilon + contraction. -/ +lemma map_epsilonContraction {T : (Fin 2 → Fin 2) → B} {U : specialUnitaryGroup (Fin 2) ℂ} + {f : B →ₗ[ℂ] B} (hf : IsSU2BiFundamentalMat U f T) : + f (epsilonContraction T) = epsilonContraction T := by + rw [← sum_epsilonCoeff_smul, map_sum_smul hf, act_epsilonCoeff] -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, 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 (repSU2 repGauge) (span T) := - GaugeWeightDecomposition.copy - (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) - -/-- 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, 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 - rw [hT.gaugeWeightDecomposition_supp_eq hmul] - decide +/-- The epsilon contraction is isospin invariant. Nothing constrains the colour and + hypercharge factors, which may well move it. -/ +lemma repGauge_epsilonContraction {T : (Fin 2 → Fin 2) → B} + (hT : IsSU2BiFundamental B repGauge T) (V : specialUnitaryGroup (Fin 2) ℂ) : + repGauge (1, V, 1) (epsilonContraction T) = epsilonContraction T := + map_epsilonContraction (hT.repGauge_T V) /-! -## C.4. The zero-weight piece +## D. An invariant coefficient is a multiple of the antisymmetric symbol -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 -`su(2)` fundamental. +The isospin flip `su2Flip 2` about the third axis is the diagonal matrix `diag(i, -i)`. It +scales `c ![a, b]` by the product of the two diagonal entries, which on the diagonal `a = b` +is `-1`, so an invariant coefficient has zero diagonal. The Weyl element `su2Perm`, the +matrix `!![0, -1; 1, 0]`, carries `c ![1, 0]` to `-c ![0, 1]`, so an invariant coefficient +is antisymmetric. -/ -/-- 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. 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) - (repSU2_epsilonContraction hT) - -end Decomposition +/-- The isospin flip about the third axis is the diagonal matrix `diag(i, -i)`. -/ +lemma su2Flip_two_apply (a b : Fin 2) : + (IsSU2BiAdjoint.su2Flip 2).1 a b + = if a = b then ![Complex.I, -Complex.I] a else 0 := by + rw [IsSU2BiAdjoint.su2Flip_coe] + fin_cases a <;> fin_cases b <;> simp [IsSU2BiAdjoint.su2FlipMatrix] + +/-- The flip about the third axis scales a coefficient by the product of the diagonal + entries at its two indices. -/ +lemma act_su2Flip_two (c : (Fin 2 → Fin 2) → ℂ) (a b : Fin 2) : + act (IsSU2BiAdjoint.su2Flip 2) c ![a, b] + = ![Complex.I, -Complex.I] a * ![Complex.I, -Complex.I] b * c ![a, b] := by + rw [act_apply, sum_pi_two, Finset.sum_eq_single a, Finset.sum_eq_single b] + · simp [su2Flip_two_apply] + · intro y _ hy + simp [su2Flip_two_apply, Ne.symm hy] + · simp + · intro x _ hx + simp [su2Flip_two_apply, Ne.symm hx] + · simp + +/-- The Weyl element carries the lower mixed coefficient to minus the upper one. -/ +lemma act_su2Perm_one_zero (c : (Fin 2 → Fin 2) → ℂ) : + act su2Perm c ![1, 0] = -c ![0, 1] := by + rw [act_apply, sum_pi_two] + simp [su2Perm_coe, Fin.sum_univ_two, Fin.prod_univ_two] + +/-- An invariant coefficient is a multiple of the antisymmetric symbol. -/ +theorem exists_smul_epsilonCoeff_of_act_eq {c : (Fin 2 → Fin 2) → ℂ} + (hc : ∀ U : specialUnitaryGroup (Fin 2) ℂ, act U c = c) : + ∃ z : ℂ, c = z • epsilonCoeff := by + have hdiag : ∀ a : Fin 2, c ![a, a] = 0 := by + intro a + have hsq : ![Complex.I, -Complex.I] a * ![Complex.I, -Complex.I] a = -1 := by + fin_cases a <;> simp + have h := congrFun (hc (IsSU2BiAdjoint.su2Flip 2)) ![a, a] + rw [act_su2Flip_two, hsq] at h + linear_combination (-1 / 2 : ℂ) * h + have hoff : c ![1, 0] = -c ![0, 1] := by + have h := congrFun (hc su2Perm) ![1, 0] + rw [act_su2Perm_one_zero] at h + exact h.symm + refine ⟨c ![0, 1], funext fun l => ?_⟩ + obtain ⟨a, b, rfl⟩ : ∃ a b, l = ![a, b] := ⟨l 0, l 1, by ext i; fin_cases i <;> rfl⟩ + fin_cases a <;> fin_cases b <;> simp [epsilonCoeff, hdiag, hoff] /-! -## 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 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`. 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. 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 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. +## E. The isospin invariants of the span --/ - -/-! - -## 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 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 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 (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 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. 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 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 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 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. -/ -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 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 +The action on coefficients is unitary, so `Family.exists_invariant_coeff` writes an isospin +invariant of the span as the contraction of an invariant coefficient, and section D makes +that coefficient a multiple of the antisymmetric symbol. The statement is made for any +family of linear maps `φ U` obeying the law, so that section F can apply it in a quotient. -/ -section Grading - -variable {B : Type*} [Ring B] [Algebra ℂ B] - {repGauge : Representation ℂ GaugeGroupI B} +/-- Every invariant in the span of a family obeying the law for a family of linear maps + `φ U` is a multiple of the epsilon contraction: the one singlet of `2 ⊗ 2`. -/ +theorem exists_smul_epsilonContraction_of_invariant' {T : (Fin 2 → Fin 2) → B} + {φ : specialUnitaryGroup (Fin 2) ℂ → B →ₗ[ℂ] B} + (hT : ∀ U, IsSU2BiFundamentalMat U (φ U) T) {x : B} (hx : x ∈ span T) + (hinv : ∀ U, φ U x = x) : + ∃ z : ℂ, x = z • epsilonContraction T := by + obtain ⟨c, rfl, hc⟩ := Family.exists_invariant_coeff T φ act + (fun U c => map_sum_smul (hT U) c) sum_star_mul_act hx hinv + obtain ⟨z, hz⟩ := exists_smul_epsilonCoeff_of_act_eq hc + refine ⟨z, ?_⟩ + rw [hz, ← sum_epsilonCoeff_smul, Finset.smul_sum] + simp only [Pi.smul_apply, smul_eq_mul, mul_smul] -/-- 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 (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 : zeroPiece T 0 = ℂ ∙ epsilonContraction T := by - rw [zeroPiece, if_pos rfl] - -/-- The grade one piece is empty. -/ -@[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 : 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 : 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 (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 [zeroPiece_zero, Submodule.span_singleton_le_iff_mem] - exact Module.End.mem_eigenspace_iff.mpr - (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] - exact Module.End.mem_eigenspace_iff.mpr - (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, zeroPiece T k) = (hT.gaugeWeightDecomposition hmul).piece 0 := by - rw [hT.gaugeWeightDecomposition_piece_zero hmul, - ← 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 [zeroPiece_zero] - exact le_sup_left - · rw [zeroPiece_one] - exact bot_le - · rw [zeroPiece_two] - exact le_sup_right - · rw [zeroPiece_three] - exact bot_le - · 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 - 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 (repSU2 repGauge) - ((hT.gaugeWeightDecomposition hmul).piece 0) where - piece := zeroPiece T - 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: 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) (repSU2_epsilonContraction hT) +/-- Every isospin invariant in the span of the components is a multiple of the epsilon + contraction. -/ +theorem exists_smul_epsilonContraction_of_su2_invariant {T : (Fin 2 → Fin 2) → B} + (hT : IsSU2BiFundamental B repGauge T) {x : B} (hx : x ∈ span T) + (hinv : ∀ V : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, V, 1) x = x) : + ∃ z : ℂ, x = z • epsilonContraction T := + exists_smul_epsilonContraction_of_invariant' hT.repGauge_T hx hinv /-! -## D.3. The classification +## F. The invariants modulo a stable submodule -/ -/-- 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. 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' - 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 +/-- The law descends to the quotient by a submodule stable under the map. -/ +lemma isSU2BiFundamentalMat_mapQ {T : (Fin 2 → Fin 2) → B} + {U : specialUnitaryGroup (Fin 2) ℂ} {f : B →ₗ[ℂ] B} (hf : IsSU2BiFundamentalMat U f T) + (S : Submodule ℂ B) (hS : ∀ y ∈ S, f y ∈ S) : + IsSU2BiFundamentalMat U (S.mapQ S f hS) fun l => S.mkQ (T l) := by + intro l + dsimp only + rw [← LinearMap.comp_apply, Submodule.mapQ_mkQ, LinearMap.comp_apply, hf 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` is a multiple of the epsilon contraction up to an isospin-invariant + remainder in `S`. -/ +theorem mem_span_sup_su2_invariant_iff {T : (Fin 2 → Fin 2) → B} + (hT : IsSU2BiFundamental B repGauge T) (x : B) (S : Submodule ℂ B) + (hS : ∀ V : specialUnitaryGroup (Fin 2) ℂ, ∀ y ∈ S, repGauge (1, V, 1) y ∈ S) + (hx : x ∈ span T ⊔ S) + (hinv : ∀ V : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, V, 1) x = x) : + ∃ c : ℂ, ∃ y ∈ S, x = c • epsilonContraction T + y + ∧ ∀ V : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, V, 1) y = y := by + refine Family.exists_smul_add_of_mem_sup T (fun V => repGauge (1, V, 1)) S hS + (epsilonContraction T) (repGauge_epsilonContraction hT) (fun x hx hinv => ?_) hx hinv + obtain ⟨z, hz⟩ := exists_smul_epsilonContraction_of_invariant' + (fun V => isSU2BiFundamentalMat_mapQ (hT.repGauge_T V) S (hS V)) hx hinv + exact ⟨z, by rw [hz, epsilonContraction, epsilonContraction, map_sub]⟩ /-! -## E. The anti-fundamental of `SU(2)` is the fundamental in another basis +## Aside: the entries of an `SU(2)` matrix under conjugation -Everything after this section rests on a single fact about `SU(2)` which has no analogue in -`SU(3)`: the anti-fundamental representation is the fundamental one in a different basis, -the change of basis being the antisymmetric symbol. Concretely, `conj U = ε U ε⁻¹` for -every `U` in `SU(2)`, and `(U⁻¹)ᵀ = conj U` because `U` is unitary. The first identity is -what makes the doublet pseudo-real; the second is the same statement read for the -transposed inverse, which is the matrix an anti-fundamental index is moved by. - -Both come from one computation. An `SU(2)` matrix has determinant one, so its adjugate is -its inverse, and it is unitary, so its inverse is its conjugate transpose; hence its -conjugate transpose is its adjugate, which for a two by two matrix is an explicit -rearrangement of the entries. That gives the four entry identities `conj U₀₀ = U₁₁`, -`conj U₁₁ = U₀₀`, `conj U₀₁ = -U₁₀` and `conj U₁₀ = -U₀₁`, and the two matrix identities -are those four read together. Everything else in this file's later sections is bookkeeping -around them: sections H and I never touch a complex conjugate again, because the entry -identities have already removed every one of them. - -`eq_cons` is a small utility of the same section, used whenever an index pair has to be -split into its two entries so that a computation can be done on concrete indices. +Nothing from here on is used by the theorem above. `SU(2)` is pseudo-real: the conjugate of +an `SU(2)` matrix is its conjugate by the antisymmetric symbol, so an anti-fundamental index +is a fundamental index in another basis. `IsSU2AntiFundamental` reduces its two laws to the +one above by that change of basis, and what it needs is the four identities +`conj U₀₀ = U₁₁`, `conj U₁₁ = U₀₀`, `conj U₀₁ = -U₁₀`, `conj U₁₀ = -U₀₁`. They come from one +computation: the determinant being one, the adjugate of `U` is its inverse, and `U` being +unitary, so is its conjugate transpose. The Higgs sector uses the same four identities. -/ -/-- An index pair is the pair of its own two entries. This is the step that turns a - statement about a general pair of `su(2)` indices into four statements about concrete - ones. -/ +/-- An index pair is the pair of its own two entries. -/ lemma eq_cons (d : Fin 2 → Fin 2) : d = ![d 0, d 1] := funext fun j => by fin_cases j <;> simp -/-- The antisymmetric symbol as a matrix: the change of basis carrying the fundamental - representation of `SU(2)` to its conjugate. -/ -def epsilonMat : Matrix (Fin 2) (Fin 2) ℂ := !![0, 1; -1, 0] - -/-- The conjugate transpose of an `SU(2)` matrix is its adjugate: the determinant being - one, the adjugate is the inverse, and unitarity makes the conjugate transpose the - inverse as well. -/ +/-- The conjugate transpose of an `SU(2)` matrix is its adjugate. -/ lemma star_eq_adjugate (U : specialUnitaryGroup (Fin 2) ℂ) : star U.1 = Matrix.adjugate U.1 := by have hmem := Matrix.mem_specialUnitaryGroup_iff.mp U.2 @@ -952,220 +422,6 @@ lemma conj_apply (U : specialUnitaryGroup (Fin 2) ℂ) (i j : Fin 2) : rw [conj_apply, Matrix.adjugate_fin_two] simp -/-- The inverse of the antisymmetric symbol, which is minus itself. -/ -lemma epsilonMat_inv : epsilonMat⁻¹ = !![0, -1; 1, 0] := by - apply Matrix.inv_eq_right_inv - ext i j - fin_cases i <;> fin_cases j <;> simp [epsilonMat, Matrix.mul_apply, Fin.sum_univ_two] - -/-- The first of the two identities the rest of the file rests on: conjugation of an - `SU(2)` matrix is conjugation by the antisymmetric symbol. This is the pseudo-reality of - the doublet, and it is what `SU(3)` lacks; without it the fundamental and the - anti-fundamental would be inequivalent and each would need its own classification. -/ -lemma map_conj_eq (U : specialUnitaryGroup (Fin 2) ℂ) : - U.1.map conj = epsilonMat * U.1 * epsilonMat⁻¹ := by - rw [epsilonMat_inv] - ext i j - fin_cases i <;> fin_cases j <;> - simp [epsilonMat, Matrix.mul_apply, Matrix.vecMul, Matrix.vecHead, Matrix.vecTail, - Fin.sum_univ_two] - -/-- The second of the two identities: the matrix moving an anti-fundamental index, the - transposed inverse, is the complex conjugate matrix. This is unitarity alone, the inverse - of a unitary matrix being its conjugate transpose. -/ -lemma transpose_inv_eq (U : specialUnitaryGroup (Fin 2) ℂ) : - (U.1⁻¹)ᵀ = U.1.map conj := by - have hu : U.1 * star U.1 = 1 := Matrix.mem_unitaryGroup_iff.mp - (Matrix.mem_specialUnitaryGroup_iff.mp U.2).1 - rw [Matrix.inv_eq_right_inv hu] - ext i j - simp [Matrix.star_apply] - -/-! - -## F. The classification for a family valued in a module - -Downstream a bi-fundamental family is met inside a module that is not an algebra, and the -classification of section D cannot be read there: `GaugeWeightDecomposition` lives in an -algebra and `IsMulRep` is a statement about a product. The square-zero extension supplies -both for free. Adjoining `ℂ` to the module with a zero product makes an algebra whose -representation is multiplicative for the cheapest of reasons, the product being built from -the module structure the representation is already linear for, and the injection of the -module is injective, so a conclusion proved upstairs comes straight back down. - -The extension itself is not rebuilt here. `IsSU2BiAdjoint` declares `sqZeroRep` and its -companions for an arbitrary representation of the gauge group, with no reference to a -bi-adjoint family, and this file imports that one already; only the statements that mention -a bi-fundamental family are new. What is gained is that -`exists_smul_epsilonContraction_of_invariant_module` asks for `[AddCommGroup B]` and -`[Module ℂ B]` and nothing else, no algebra structure and no multiplicativity hypothesis. - --/ - -section SquareZero - -variable {M : Type*} [AddCommGroup M] [Module ℂ M] - {ρ : Representation ℂ GaugeGroupI M} {T : (Fin 2 → Fin 2) → M} - --- The opposite scalar action and its two compatibilities, which make the square-zero --- extension of a complex vector space a ring. They are the instances `IsSU2BiAdjoint` --- states its square-zero lemmas with, and are borrowed rather than restated so that the --- instances here and there are literally the same. -attribute [local instance 100] IsSU2BiAdjoint.opModule - IsSU2BiAdjoint.smulCommClassOpModule IsSU2BiAdjoint.isCentralScalarOpModule - -/-- The images of the components in the square-zero extension again form a bi-fundamental - family, the extended representation acting on them by the representation extended. -/ -lemma isSU2BiFundamental_sqZeroRep (hT : IsSU2BiFundamental M ρ T) : - IsSU2BiFundamental (TrivSqZeroExt ℂ M) (IsSU2BiAdjoint.sqZeroRep ρ) - fun l => TrivSqZeroExt.inr (T l) where - repGauge_T g l := by - rw [IsSU2BiAdjoint.sqZeroRep_inr, hT.repGauge_T g l] - simp only [TrivSqZeroExt.inr_sum, TrivSqZeroExt.inr_smul] - -omit [Module ℂ M] in -/-- The epsilon contraction of the images is the image of the epsilon contraction. -/ -lemma epsilonContraction_inr (T : (Fin 2 → Fin 2) → M) : - epsilonContraction (fun l => (TrivSqZeroExt.inr (T l) : TrivSqZeroExt ℂ M)) - = TrivSqZeroExt.inr (epsilonContraction T) := by - simp only [epsilonContraction, ← TrivSqZeroExt.inr_sub] - -/-- The image of an element of the span lies in the span of the images. -/ -lemma inr_mem_span_sqZeroRep (T : (Fin 2 → Fin 2) → M) {x : M} (hx : x ∈ span T) : - (TrivSqZeroExt.inr x : TrivSqZeroExt ℂ M) - ∈ span fun l => (TrivSqZeroExt.inr (T l) : TrivSqZeroExt ℂ M) := by - obtain ⟨c, rfl⟩ := (mem_span_iff x).1 hx - refine (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 epsilon - 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_epsilonContraction_of_invariant_module (hT : IsSU2BiFundamental M ρ T) - {x : M} (hx : x ∈ span T) (hinv : ∀ g : GaugeGroupI, ρ g x = x) : - ∃ c : ℂ, x = c • epsilonContraction T := by - obtain ⟨c, hc⟩ := - hT.isSU2BiFundamental_sqZeroRep.exists_smul_epsilonContraction_of_invariant - (IsSU2BiAdjoint.isMulRep_sqZeroRep ρ) (inr_mem_span_sqZeroRep T hx) - (fun g => by rw [IsSU2BiAdjoint.sqZeroRep_inr, hinv g]) - refine ⟨c, TrivSqZeroExt.inr_injective (R := ℂ) ?_⟩ - rw [hc, epsilonContraction_inr, TrivSqZeroExt.inr_smul] - -/-- The same classification for a family valued in a mere module, read at the isospin - factor alone, which is all the transformation law constrains. -/ -lemma exists_smul_epsilonContraction_of_su2_invariant_module - (hT : IsSU2BiFundamental M ρ T) {x : M} (hx : x ∈ span T) - (hinv : ∀ V : specialUnitaryGroup (Fin 2) ℂ, ρ (1, V, 1) x = x) : - ∃ c : ℂ, x = c • epsilonContraction T := - hT.toRepSU2.exists_smul_epsilonContraction_of_invariant_module hx - ((repSU2_invariant_iff_su2 ρ x).2 hinv) - -end SquareZero - -/-! - -## G. The invariants modulo a stable submodule - -Peeling one family at a time off a join needs the invariants of the span of that family -together with everything not yet peeled, gathered in a submodule `S`. A stable submodule -can be divided out: the images of the components in the quotient again form a -bi-fundamental family, so section F applies verbatim there and lifts to a classification -modulo `S`. The error term is invariant for free, being the difference of two invariants. - -Stability of `S` cannot be dropped. For an unstable line `ℂ ∙ v` the only invariant of the -line is zero, while an invariant of the sum may well lie outside the span, so the statement -would be false without it. As in section F the quotient representation is the one -`IsSU2BiAdjoint` already declares, and only the statements mentioning a bi-fundamental -family are new. - -`mem_span_sup_su2_invariant_iff` is the isospin form, stable and invariant meaning under -`repGauge (1, V, 1)` throughout, and it is the form the transformation law supports. -`mem_span_sup_invariant_iff`, the gauge form, asks in addition that the epsilon 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} {T : (Fin 2 → Fin 2) → M} - -/-- The images of the components in the quotient by a gauge-stable submodule again form a - bi-fundamental family. -/ -lemma isSU2BiFundamental_quotRep (hT : IsSU2BiFundamental M ρ T) (S : Submodule ℂ M) - (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, ρ g y ∈ S) : - IsSU2BiFundamental (M ⧸ S) (IsSU2BiAdjoint.quotRep ρ S hS) fun l => S.mkQ (T l) where - repGauge_T g l := by - rw [IsSU2BiAdjoint.quotRep_mkQ, hT.repGauge_T g l, map_sum] - exact Finset.sum_congr rfl fun a _ => map_smul _ _ _ - -/-- The quotient map carries the epsilon contraction to the epsilon contraction of the - images. -/ -lemma mkQ_epsilonContraction (T : (Fin 2 → Fin 2) → M) (S : Submodule ℂ M) : - S.mkQ (epsilonContraction T) = epsilonContraction fun l => S.mkQ (T l) := by - simp only [epsilonContraction, map_sub] - -/-- The image of an element of the join of the span with a submodule lies in the span of - the images, the submodule dying in the quotient. -/ -lemma mkQ_mem_span_quotRep (T : (Fin 2 → Fin 2) → M) (S : Submodule ℂ M) {x : M} - (hx : x ∈ span T ⊔ S) : S.mkQ x ∈ span fun l => S.mkQ (T l) := by - obtain ⟨u, hu, z, hz, huz⟩ := Submodule.mem_sup.1 hx - obtain ⟨c, hc⟩ := (mem_span_iff u).1 hu - refine (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 _ _ _ - -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 epsilon 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 `hec` of the epsilon 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. -/ -lemma mem_span_sup_invariant_iff {T : (Fin 2 → Fin 2) → B} - (hT : IsSU2BiFundamental B repGauge T) (x : B) (S : Submodule ℂ B) - (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, repGauge g y ∈ S) - (hec : ∀ g : GaugeGroupI, - repGauge g (epsilonContraction T) = epsilonContraction T) - (hx : x ∈ span T ⊔ S) - (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : - ∃ c : ℂ, ∃ y ∈ S, x = c • epsilonContraction T + y - ∧ ∀ g : GaugeGroupI, repGauge g y = y := by - have hquot := hT.isSU2BiFundamental_quotRep S hS - obtain ⟨c, hc⟩ := hquot.exists_smul_epsilonContraction_of_invariant_module - (mkQ_mem_span_quotRep T S hx) (fun g => by rw [IsSU2BiAdjoint.quotRep_mkQ, hinv g]) - rw [← mkQ_epsilonContraction T S] at hc - refine ⟨c, x - c • epsilonContraction T, ?_, by abel, fun g => ?_⟩ - · have hker : x - c • epsilonContraction T ∈ 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, hec 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 epsilon contraction up to an error in `S`, and the error is fixed by the isospin - factor too. No hypothesis on the epsilon contraction is needed here, the isospin factor - fixing it already. -/ -lemma mem_span_sup_su2_invariant_iff {T : (Fin 2 → Fin 2) → B} - (hT : IsSU2BiFundamental B repGauge T) (x : B) (S : Submodule ℂ B) - (hS : ∀ V : specialUnitaryGroup (Fin 2) ℂ, ∀ y ∈ S, repGauge (1, V, 1) y ∈ S) - (hx : x ∈ span T ⊔ S) - (hinv : ∀ V : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, V, 1) x = x) : - ∃ c : ℂ, ∃ y ∈ S, x = c • epsilonContraction T + y - ∧ ∀ V : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, V, 1) y = y := by - obtain ⟨c, y, hyS, hxy, hyinv⟩ := - hT.toRepSU2.mem_span_sup_invariant_iff x S - ((repSU2_stable_iff_su2 repGauge S).2 hS) (repSU2_epsilonContraction hT) hx - ((repSU2_invariant_iff_su2 repGauge x).2 hinv) - exact ⟨c, y, hyS, hxy, (repSU2_invariant_iff_su2 repGauge y).1 hyinv⟩ - end IsSU2BiFundamental end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2QuadFundamental.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2QuadFundamental.lean index 3d4d2fb38..bf0263c30 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2QuadFundamental.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2QuadFundamental.lean @@ -10,64 +10,38 @@ public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU2BiFunda /-! # 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. - -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. `IsSU2QuadFundamental` 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. 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 the isospin transformation afterwards. - -What stays about `GaugeGroupI` is the bookkeeping of the two decompositions, which -`GaugeWeightDecomposition` and `SU2PermDecomposition` supply only for representations of -the gauge group. They are built for `repSU2 repGauge` of section A.2, the isospin part of -the representation, which is defined where the bi-adjoint case needs it, in -`IsSU2BiAdjoint`, and imported here. A decomposition must know how all four torus -generators act, and of the four only `gaugeTorusGen 2` is an isospin transformation; the -isospin part sends the others to the identity, so the colour and hypercharge coordinates of -every weight vanish by construction rather than by hypothesis. - -Section A gives the transformation law, the proposition, the isospin part of a -representation, the span of the components, and the way a linear combination of them -transforms. Section B builds the three double epsilon contractions, proves each fixed by -the isospin factor, and proves the Schouten relation between them. Section C is the gauge -weight decomposition of the span, for the isospin part of the representation, 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 isospin invariants down to the plane spanned by two of the epsilon -contractions. Each conclusion is stated twice, once for the isospin factor and once for the -whole gauge group, the isospin form being what the transformation law supports on its own -and the gauge form asking in addition that the two contractions be gauge invariant. - -Sections F and G carry those conclusions off the algebra: F reads them for a family valued -in a mere module, through the square-zero extension, and G reads them modulo a gauge-stable -submodule, through the quotient, which is the form in which one family at a time is peeled -off a join. Both mirror the sections of the same names in `IsSU2BiFundamental`. +The quartic Higgs coupling `(H†H)²` is a product of four isospin doublets, so it carries four +fundamental `su(2)` indices. A doublet index can only be contracted against another through +the antisymmetric symbol, so an invariant of four indices is a way of pairing them off, and +there are three pairings: `(12)(34)`, `(13)(24)` and `(14)(23)`. They are not independent. +Antisymmetrizing three indices of a two-dimensional space gives zero, and written out that is +the Schouten identity, one linear relation between the three. So `2 ⊗ 2 ⊗ 2 ⊗ 2` contains +exactly two singlets, and this file proves it in the form the Standard Model files consume: +modulo an isospin-stable submodule, every isospin invariant in the span of the components is +a combination of the first two epsilon contractions. + +`IsSU2QuadFundamental B repGauge T` records the hypothesis. `T` is a family indexed by four +fundamental indices and valued in a module `B` carrying a representation of the gauge group, +and an isospin rotation `U ∈ SU(2)` moves its components by one factor of `U` per index. +Nothing is asked of the colour and hypercharge factors. + +The proof follows `IsSU2BiFundamental`. The action on coefficient functions `c l`, with +`l : Fin 4 → Fin 2`, is the fourth Kronecker power of `U`, unitary, so an isospin invariant of +the span is the contraction of an invariant coefficient, by `Family.exists_invariant_coeff`, +and three rotations pin such a coefficient down. The diagonal matrix `diag(ζ, ζ²)`, with `ζ` a +primitive cube root of unity, lies in `SU(2)` and scales `c l` by `ζ ^ (4 + k)` where `k` is +the number of indices equal to `1`, so only the six balanced entries, with two indices of +each kind, survive. The Weyl element `su2Perm` exchanges `0` and `1` in all four slots and +equates each balanced entry with its complement, leaving three unknowns. The third of a turn +`su2Cyc` has a first row with two equal entries, so it carries `c ![0, 0, 0, 0]` to a multiple +of the sum of all sixteen entries: that sum vanishes, and with it the sum of the three +unknowns. Two remain, and they are the coefficients of the two pairings. + +Section A gives the transformation law and the span, section B the two pairings and their +contractions, section C the action on coefficients, section D the classification of invariant +coefficients, section E the invariants of the span, and section F the form modulo a stable +submodule. An aside at the end holds the gauge form of the theorem, which the Higgs sector +uses. -/ @[expose] public section @@ -75,128 +49,52 @@ off a join. Both mirror the sections of the same names in `IsSU2BiFundamental`. namespace StandardModel open Matrix -open IsSU2BiFundamental (epsilon sum_epsilon_mul fundWeight) -open IsSU2BiFundamental (toSU2_gaugeTorusGen_apply toSU2_gaugeTorusGen_offDiag) -open IsSU2BiFundamental (su2Perm_apply sup_span_sub_add) +open IsSU2BiFundamental (epsilon sum_epsilon_mul inv_apply) +open IsSU2BiAdjoint (su2Cyc su2Cyc_coe) /-! -## A. Quad-fundamental `su(2)` families and the span of their components - -Four `su(2)` fundamental indices are acted on by the `SU(2)` factor of the gauge group -alone. A.1 phrases the transformation law through the fundamental matrix of an `SU(2)` -element and nothing else, so that no other factor of the gauge group appears in the law, -A.2 reads a representation of the gauge group at its isospin factor, which is what carries -the two decompositions of sections C and D, and A.3 says how a linear combination of the -components moves. - -## 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 in `IsSU2BiFundamental`. It is recorded by -`IsSU2QuadFundamentalMat`, which relates one element of `SU(2)` to one linear map on `B` -and mentions no other factor of the gauge group. - -`IsSU2QuadFundamental` then says that the isospin 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. 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. +## A. The transformation law and the span of the components -/ -/-- 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. -/ +/-- The linear map `f` moves the components of `T` as `U ∈ SU(2)` 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: an isospin transformation moves the components by the `SU(2)` element it is built - from. Nothing is asked of the colour or hypercharge factors. -/ +/-- A family `T` of elements of `B`, indexed by four `su(2)` fundamental indices, transforms + as a tensor `T^{a b c d}` under the isospin factor of the gauge group. Nothing is asked of + the colour and hypercharge factors. -/ structure IsSU2QuadFundamental (B : Type*) [AddCommMonoid B] [Module ℂ B] (repGauge : Representation ℂ GaugeGroupI B) (T : (Fin 4 → Fin 2) → B) : Prop where repGauge_T : ∀ g : specialUnitaryGroup (Fin 2) ℂ, IsSU2QuadFundamentalMat g (repGauge (1, g, 1)) T -/-! - -## A.2. The isospin part of a representation, and the span - -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 defined in -`IsSU2BiAdjoint`, together with `repSU2_apply`, `isMulRep_repSU2`, the bridge -`repSU2_invariant_iff_su2` between invariance under it and invariance under the isospin -factor, and the stability bridge `repSU2_stable_iff_su2`. A quad-fundamental family for -`repGauge` is a quad-fundamental family for `repSU2 repGauge`, with the same span and the -same epsilon contractions, which is `toRepSU2`. - -That transport is what carries sections C and D, whose two decompositions need 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 isospin -transformation `(1, U, 1)` spelled out, so that reading one needs no unfolding. The Weyl -element of section D and the third of a turn of section E are isospin transformations, so -the two representations agree at them outright, which is `repSU2_gaugeSU2Perm`. - --/ - namespace IsSU2QuadFundamental -set_option linter.unusedVariables false variable {B : Type*} [AddCommGroup B] [Module ℂ B] {repGauge : Representation ℂ GaugeGroupI B} - {U : specialUnitaryGroup (Fin 2) ℂ} {f : B →ₗ[ℂ] B} - -/-- A quad-fundamental family for a representation is a quad-fundamental family for its - isospin part: the transformation law reads only the isospin factor to begin with. The - span and the three epsilon contractions 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 4 → Fin 2) → B} (hT : IsSU2QuadFundamental B repGauge T) : - IsSU2QuadFundamental B (repSU2 repGauge) T where - repGauge_T g := hT.repGauge_T g - -/-- The isospin part of a representation agrees with the representation at the Weyl - element, that element being trivial on colour and hypercharge. -/ -lemma repSU2_gaugeSU2Perm (repGauge : Representation ℂ GaugeGroupI B) : - repSU2 repGauge gaugeSU2Perm = repGauge gaugeSU2Perm := rfl - -/-- The span of all the components of a family indexed by four `su(2)` fundamental - indices. -/ + +/-- The span of the components. -/ 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. -/ +/-- A vector lies in the span precisely when it is a linear combination of the + components. -/ 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 - 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 _)) + x ∈ span T ↔ ∃ (c : (Fin 4 → Fin 2) → ℂ), x = ∑ d, c d • T d := + Family.mem_iSup_span_singleton_iff T x /-- Every component lies in the 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 _) + Family.mem_iSup_span_singleton T d -/-- A sum over families of four `su(2)` fundamental indices is a fourfold sum. -/ +/-- A sum over families of four 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 @@ -214,1224 +112,423 @@ lemma sum_pi_four {M : Type*} [AddCommMonoid M] (F : (Fin 4 → Fin 2) → M) : /-! -## A.3. Linear combinations of the components +## B. The two epsilon pairings -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 pairing `(12)(34)` has coefficient function `ε (l 0) (l 1) * ε (l 2) (l 3)`, and the +pairing `(13)(24)` has `ε (l 0) (l 2) * ε (l 1) (l 3)`. The third pairing is the difference +of these two by the Schouten identity, so two contractions suffice: `epsilonContraction₁₂` +and `epsilonContraction₁₃`, the contractions of `T` against the two coefficient functions. -/ -/-- 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) → ℂ) : - f (∑ l : Fin 4 → Fin 2, c l • T l) - = ∑ a : Fin 4 → Fin 2, - (∑ 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, 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, hf 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 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] - -/-- An isospin 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) - (V : specialUnitaryGroup (Fin 2) ℂ) (c : (Fin 4 → Fin 2) → ℂ) : - repGauge (1, V, 1) (∑ l : Fin 4 → Fin 2, c l • T l) - = ∑ a : Fin 4 → Fin 2, - (∑ l : Fin 4 → Fin 2, c l * ∏ i, V.1 (a i) (l i)) • T a := - map_sum_smul (hT.repGauge_T V) c - -/-- A linear combination of the components whose coefficient family is fixed by every - `SU(2)` matrix is fixed by the isospin factor. -/ -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) - (V : specialUnitaryGroup (Fin 2) ℂ) : - repGauge (1, V, 1) (∑ 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 V) c (hc V) +/-- The coefficient function of the pairing `(12)(34)`. -/ +def epsilonPair₁₂ (l : Fin 4 → Fin 2) : ℂ := epsilon (l 0) (l 1) * epsilon (l 2) (l 3) -/-! +/-- The coefficient function of the pairing `(13)(24)`. -/ +def epsilonPair₁₃ (l : Fin 4 → Fin 2) : ℂ := epsilon (l 0) (l 2) * epsilon (l 1) (l 3) -## B. The three epsilon pairings +/-- The contraction pairing the first index with the second and the third with the + fourth. -/ +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] -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. -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) ℂ`, isospin -invariance being that statement read at the isospin transformation `(1, U, 1)`. +/-- The contraction pairing the first index with the third and the second with the + fourth. -/ +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 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 isospin invariants in the span of the components, so the count here is sharp. +/-- The first contraction is the contraction against the first pairing. -/ +lemma sum_epsilonPair₁₂_smul (T : (Fin 4 → Fin 2) → B) : + ∑ l, epsilonPair₁₂ l • T l = epsilonContraction₁₂ T := by + rw [sum_pi_four] + simp [epsilonPair₁₂, epsilonContraction₁₂, Fin.sum_univ_two] + abel --/ +/-- The second contraction is the contraction against the second pairing. -/ +lemma sum_epsilonPair₁₃_smul (T : (Fin 4 → Fin 2) → B) : + ∑ l, epsilonPair₁₃ l • T l = epsilonContraction₁₃ T := by + rw [sum_pi_four] + simp [epsilonPair₁₃, epsilonContraction₁₃, Fin.sum_univ_two] + abel -/-- 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) +## C. The action on coefficients + +A vector of the span is a contraction `∑ l, c l • T l` against a coefficient function `c`, +and the law says that an isospin rotation moves it by moving `c` with the fourth Kronecker +power `act U` of `U`. Unitarity of `U` makes `act U⁻¹` the adjoint of `act U`, and the two +pairings are invariant coefficients, each being a product of two invariant antisymmetric +symbols. + +-/ -/-- 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) +/-- The action of `U ∈ SU(2)` on coefficient functions: the fourth Kronecker power of + `U`. -/ +noncomputable def act (U : specialUnitaryGroup (Fin 2) ℂ) : + ((Fin 4 → Fin 2) → ℂ) →ₗ[ℂ] (Fin 4 → Fin 2) → ℂ := + Matrix.toLin' (Matrix.of fun a l => ∏ i : Fin 4, U.1 (a i) (l i)) + +/-- The action on coefficients, written out. -/ +lemma act_apply (U : specialUnitaryGroup (Fin 2) ℂ) (c : (Fin 4 → Fin 2) → ℂ) + (a : Fin 4 → Fin 2) : + act U c a = ∑ l, (∏ i : Fin 4, U.1 (a i) (l i)) * c l := by + simp [act, Matrix.mulVec, dotProduct] + +/-- The transformation law in coefficient form. -/ +lemma map_sum_smul {T : (Fin 4 → Fin 2) → B} {U : specialUnitaryGroup (Fin 2) ℂ} + {f : B →ₗ[ℂ] B} (hf : IsSU2QuadFundamentalMat U f T) (c : (Fin 4 → Fin 2) → ℂ) : + f (∑ l, c l • T l) = ∑ a, act U c a • T a := by + simp only [map_sum, map_smul, act_apply, Finset.sum_smul] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun l _ => ?_ + rw [hf l, Finset.smul_sum] + exact Finset.sum_congr rfl fun a _ => by rw [smul_smul, mul_comm] + +/-- The action of `U⁻¹` is the adjoint of the action of `U`. -/ +lemma sum_star_mul_act (U : specialUnitaryGroup (Fin 2) ℂ) (c d : (Fin 4 → Fin 2) → ℂ) : + ∑ a, star (c a) * act U d a = ∑ l, star (act U⁻¹ c l) * d l := by + simp only [act_apply, inv_apply, Fin.prod_univ_four, Finset.mul_sum, Finset.sum_mul, + star_sum, star_mul', Complex.star_def, Complex.conj_conj] + rw [Finset.sum_comm] + exact Finset.sum_congr rfl fun l _ => Finset.sum_congr rfl fun a _ => by ring + +/-- The first pairing is invariant: the sum over the four indices factors into two + invariant antisymmetric symbols. -/ +lemma act_epsilonPair₁₂ (U : specialUnitaryGroup (Fin 2) ℂ) : + act U epsilonPair₁₂ = epsilonPair₁₂ := by + funext a + have key : act U epsilonPair₁₂ a = (∑ 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] + rw [act_apply, 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) +/-- The second pairing is invariant, by the same factorization with the indices + interleaved. -/ +lemma act_epsilonPair₁₃ (U : specialUnitaryGroup (Fin 2) ℂ) : + act U epsilonPair₁₃ = epsilonPair₁₃ := by + funext a + have key : act U epsilonPair₁₃ a = (∑ 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] + rw [act_apply, 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₁₂ (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₁₃ (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₁₄ (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 (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 (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 (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) : +/-- Any map moving the components by an element of `SU(2)` fixes the first + contraction. -/ +lemma map_epsilonContraction₁₂ {T : (Fin 4 → Fin 2) → B} {U : specialUnitaryGroup (Fin 2) ℂ} + {f : B →ₗ[ℂ] 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) + rw [← sum_epsilonPair₁₂_smul, map_sum_smul hf, act_epsilonPair₁₂] -/-- 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) : +/-- Any map moving the components by an element of `SU(2)` fixes the second + contraction. -/ +lemma map_epsilonContraction₁₃ {T : (Fin 4 → Fin 2) → B} {U : specialUnitaryGroup (Fin 2) ℂ} + {f : B →ₗ[ℂ] 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 fixed by the isospin factor. That is all the transformation law - constrains, the colour and hypercharge factors being free to move it. -/ + rw [← sum_epsilonPair₁₃_smul, map_sum_smul hf, act_epsilonPair₁₃] + +/-- The first contraction is isospin invariant. -/ lemma repGauge_epsilonContraction₁₂ {T : (Fin 4 → Fin 2) → B} (hT : IsSU2QuadFundamental B repGauge T) (V : specialUnitaryGroup (Fin 2) ℂ) : repGauge (1, V, 1) (epsilonContraction₁₂ T) = epsilonContraction₁₂ T := map_epsilonContraction₁₂ (hT.repGauge_T V) -/-- The second contraction is fixed by the isospin factor. That is all the transformation law - constrains, the colour and hypercharge factors being free to move it. -/ +/-- The second contraction is isospin invariant. -/ lemma repGauge_epsilonContraction₁₃ {T : (Fin 4 → Fin 2) → B} (hT : IsSU2QuadFundamental B repGauge T) (V : specialUnitaryGroup (Fin 2) ℂ) : repGauge (1, V, 1) (epsilonContraction₁₃ T) = epsilonContraction₁₃ T := map_epsilonContraction₁₃ (hT.repGauge_T V) -/-- The third contraction is fixed by the isospin factor. That is all the transformation law - constrains, the colour and hypercharge factors being free to move it. -/ -lemma repGauge_epsilonContraction₁₄ {T : (Fin 4 → Fin 2) → B} - (hT : IsSU2QuadFundamental B repGauge T) (V : specialUnitaryGroup (Fin 2) ℂ) : - repGauge (1, V, 1) (epsilonContraction₁₄ T) = epsilonContraction₁₄ T := - map_epsilonContraction₁₄ (hT.repGauge_T V) - -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 (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 (T : (Fin 4 → Fin 2) → B) : - epsilonContraction₁₂ T ∈ span T := by - rw [epsilonContraction₁₂] - 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 (T : (Fin 4 → Fin 2) → B) : - epsilonContraction₁₃ T ∈ span T := by - rw [epsilonContraction₁₃] - 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 (T : (Fin 4 → Fin 2) → B) : - epsilonContraction₁₄ T ∈ span T := by - rw [epsilonContraction₁₄] - exact add_mem (sub_mem (sub_mem (mem_span _) (mem_span _)) (mem_span _)) (mem_span _) - /-! -## 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 `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 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 others to the identity, so their weights -vanish by construction rather than by hypothesis, which is why -`gaugeWeightDecomposition_supp` still lists only weights with vanishing colour and -hypercharge. - -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. +## D. An invariant coefficient is a combination of the two pairings --/ +## D.1. A diagonal element of order three keeps only the balanced entries -/-! - -## C.1. Diagonal matrices and the gauge torus +The matrix `diag(ζ, ζ²)`, with `ζ` a primitive cube root of unity, is unitary of determinant +`ζ³ = 1`. It scales the entry `c l` by `ζ` for each index equal to `0` and by `ζ²` for each +index equal to `1`, so by `ζ ^ (4 + k)` with `k` the number of indices equal to `1`, and that +is `1` only when `3 ∣ 4 + k`, which for `k ≤ 4` means `k = 2`. -/ -/-- 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) : - (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) +/-- A primitive cube root of unity. -/ +noncomputable def cubeRoot : ℂ := Complex.exp (2 * (Real.pi : ℂ) * Complex.I / 3) + +/-- The cube root of unity is primitive. -/ +lemma cubeRoot_isPrimitiveRoot : IsPrimitiveRoot cubeRoot 3 := by + have h := Complex.isPrimitiveRoot_exp 3 (by norm_num) + simpa [cubeRoot] using h + +/-- The cube root of unity has unit modulus. -/ +lemma cubeRoot_mul_star : cubeRoot * star cubeRoot = 1 := by + rw [Complex.star_def, Complex.mul_conj, Complex.normSq_eq_norm_sq, + cubeRoot_isPrimitiveRoot.norm'_eq_one (by norm_num)] + simp + +/-- The diagonal matrix `diag(ζ, ζ²)` as an element of `SU(2)`. -/ +noncomputable def su2Cube : specialUnitaryGroup (Fin 2) ℂ := + ⟨Matrix.diagonal ![cubeRoot, cubeRoot ^ 2], by + have hd : ∀ i : Fin 2, ![cubeRoot, cubeRoot ^ 2] i * star (![cubeRoot, cubeRoot ^ 2] i) + = 1 := by + intro i + fin_cases i + · simpa using cubeRoot_mul_star + · show cubeRoot ^ 2 * star (cubeRoot ^ 2) = 1 + rw [star_pow, ← mul_pow, cubeRoot_mul_star, one_pow] + 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, hd, Matrix.diagonal_one] + · rw [Matrix.det_diagonal, Fin.prod_univ_two] + simp only [Matrix.cons_val_zero, Matrix.cons_val_one] + linear_combination cubeRoot_isPrimitiveRoot.pow_eq_one⟩ + +/-- The entries of the diagonal element. -/ +lemma su2Cube_apply (a b : Fin 2) : + su2Cube.1 a b = if a = b then cubeRoot ^ (1 + (a : ℕ)) else 0 := by + show Matrix.diagonal ![cubeRoot, cubeRoot ^ 2] a b = _ + rw [Matrix.diagonal_apply] + fin_cases a <;> fin_cases b <;> simp + +/-- The diagonal element scales an entry by `ζ ^ (4 + k)`, where `k` is the number of its + indices equal to `1`. -/ +lemma act_su2Cube (c : (Fin 4 → Fin 2) → ℂ) (l : Fin 4 → Fin 2) : + act su2Cube c l = cubeRoot ^ (4 + ∑ i, (l i : ℕ)) * c l := by + rw [act_apply, Finset.sum_eq_single l] + · congr 1 + rw [show (∏ i, su2Cube.1 (l i) (l i)) = ∏ i : Fin 4, cubeRoot ^ (1 + (l i : ℕ)) from + Finset.prod_congr rfl fun i _ => by rw [su2Cube_apply, if_pos rfl], + Finset.prod_pow_eq_pow_sum, Finset.sum_add_distrib] + simp + · intro m _ hm + obtain ⟨i, hi⟩ := Function.ne_iff.1 hm + rw [Finset.prod_eq_zero (Finset.mem_univ i) (by rw [su2Cube_apply, if_neg (Ne.symm hi)]), + zero_mul] + · simp + +/-- An entry of an invariant coefficient vanishes unless exactly two of its indices are + `1`. -/ +lemma eq_zero_of_act_su2Cube_eq {c : (Fin 4 → Fin 2) → ℂ} (hc : act su2Cube c = c) + {l : Fin 4 → Fin 2} (hl : (∑ i, (l i : ℕ)) ≠ 2) : c l = 0 := by + have h := congrFun hc l + rw [act_su2Cube] at h + have hdvd : ∀ l : Fin 4 → Fin 2, (∑ i, (l i : ℕ)) ≠ 2 → ¬ 3 ∣ 4 + ∑ i, (l i : ℕ) := by + decide + refine (mul_left_eq_self₀.1 h).resolve_left fun h1 => hdvd l hl ?_ + exact (cubeRoot_isPrimitiveRoot.pow_eq_one_iff_dvd _).1 h1 /-! -## C.2. The components are weight vectors - --/ - -/-- Any linear map moving the components of a quad-fundamental family by the isospin part - of a torus generator scales every one of them by the character of the sum of the weights - of its four indices. -/ -lemma map_gaugeTorusGen {T : (Fin 4 → Fin 2) → B} {i : Fin 4} - (hf : IsSU2QuadFundamentalMat (GaugeGroupI.toSU2 (gaugeTorusGen i)) f T) - (l : Fin 4 → Fin 2) : - f (T l) = ((expI : ℂ) ^ GaugeWeight.coord (wtWeight l) i) • T l := by - rw [map_of_diagonal hf (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] - -/-- Every component of a quad-fundamental family is a simultaneous eigenvector of the gauge - torus for the isospin part of the representation, at the character of the sum of the - weights of its four indices. -/ -lemma repSU2_gaugeTorusGen {T : (Fin 4 → Fin 2) → B} - (hT : IsSU2QuadFundamental B repGauge T) (l : Fin 4 → Fin 2) (i : Fin 4) : - repSU2 repGauge (gaugeTorusGen i) (T l) - = ((expI : ℂ) ^ GaugeWeight.coord (wtWeight l) i) • T l := - map_gaugeTorusGen (hT.repGauge_T (GaugeGroupI.toSU2 (gaugeTorusGen i))) l - -/-- The isospin part of a torus generator scales every component of a quad-fundamental - family by the character of the sum of the weights of its four indices. This is - `repSU2_gaugeTorusGen` with the isospin transformation spelled out. -/ -lemma repGauge_gaugeTorusGen {T : (Fin 4 → Fin 2) → B} - (hT : IsSU2QuadFundamental B repGauge T) (l : Fin 4 → Fin 2) (i : Fin 4) : - repGauge (1, GaugeGroupI.toSU2 (gaugeTorusGen i), 1) (T l) - = ((expI : ℂ) ^ GaugeWeight.coord (wtWeight l) i) • T l := - hT.repSU2_gaugeTorusGen l i - -/-! +## D.2. The Weyl element and the third of a turn -## C.3. The decomposition +The Weyl element `su2Perm = !![0, -1; 1, 0]` exchanges the two values of every index, and +on a balanced entry the four signs multiply to `1`. The third of a turn `su2Cyc` has both +entries of its first row equal to `(1 + i)/2`, so the entry `c ![0, 0, 0, 0]` of `act su2Cyc c` +is `((1 + i)/2)⁴` times the sum of all sixteen entries of `c`. -/ -section Decomposition - -variable {B : Type*} [Ring B] [Algebra ℂ B] - {repGauge : Representation ℂ GaugeGroupI B} - {T : (Fin 4 → Fin 2) → B} {f : B →ₗ[ℂ] B} - -/-- The gauge weight decomposition of the span of a quad-fundamental `su(2)` family, for - the isospin part of the representation. 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. - - 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 others to the identity, so their - weights vanish by construction. -/ -@[implicit_reducible] -noncomputable def gaugeWeightDecomposition (hT : IsSU2QuadFundamental B repGauge T) - (hmul : IsMulRep repGauge) : GaugeWeightDecomposition (repSU2 repGauge) (span T) := - GaugeWeightDecomposition.copy - (GaugeWeightDecomposition.iSup (isMulRep_repSU2 hmul) fun d : Fin 4 → Fin 2 => - GaugeWeightDecomposition.spanSingleton (isMulRep_repSU2 hmul) (T d) (wtWeight d) - (hT.repSU2_gaugeTorusGen 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) : - (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 +/-- The Weyl element carries `c ![0, 0, 1, 1]` to `c ![1, 1, 0, 0]`. -/ +lemma act_su2Perm_zero_zero_one_one (c : (Fin 4 → Fin 2) → ℂ) : + act su2Perm c ![0, 0, 1, 1] = c ![1, 1, 0, 0] := by + rw [act_apply, sum_pi_four] + simp [su2Perm_coe, Fin.sum_univ_two, Fin.prod_univ_four] + +/-- The Weyl element carries `c ![0, 1, 0, 1]` to `c ![1, 0, 1, 0]`. -/ +lemma act_su2Perm_zero_one_zero_one (c : (Fin 4 → Fin 2) → ℂ) : + act su2Perm c ![0, 1, 0, 1] = c ![1, 0, 1, 0] := by + rw [act_apply, sum_pi_four] + simp [su2Perm_coe, Fin.sum_univ_two, Fin.prod_univ_four] + +/-- The Weyl element carries `c ![0, 1, 1, 0]` to `c ![1, 0, 0, 1]`. -/ +lemma act_su2Perm_zero_one_one_zero (c : (Fin 4 → Fin 2) → ℂ) : + act su2Perm c ![0, 1, 1, 0] = c ![1, 0, 0, 1] := by + rw [act_apply, sum_pi_four] + simp [su2Perm_coe, Fin.sum_univ_two, Fin.prod_univ_four] + +/-- The third of a turn carries the entry with all indices `0` to a nonzero multiple of the + sum of all the entries. -/ +lemma act_su2Cyc_zero (c : (Fin 4 → Fin 2) → ℂ) : + act su2Cyc c (fun _ => 0) = ((1 + Complex.I) / 2) ^ 4 * ∑ m, c m := by + have hrow : ∀ j : Fin 2, su2Cyc.1 0 j = (1 + Complex.I) / 2 := by + intro j + fin_cases j <;> simp [su2Cyc_coe] + rw [act_apply, Finset.mul_sum] + refine Finset.sum_congr rfl fun m _ => ?_ + simp only [hrow, Finset.prod_const, Finset.card_univ, Fintype.card_fin] /-! -## C.4. 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. 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. +## D.3. The classification -/ -/-- 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 fixed by the isospin factor, - 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) - ((repSU2_invariant_iff_su2 repGauge _).2 (repGauge_epsilonContraction₁₂ hT)) - -/-- The second contraction lies in the zero-weight piece. -/ -lemma epsilonContraction₁₃_mem_piece_zero (hmul : IsMulRep repGauge) : - epsilonContraction₁₃ T ∈ (hT.gaugeWeightDecomposition hmul).piece 0 := - GaugeWeightDecomposition.mem_zero_of_invariant _ (epsilonContraction₁₃_mem_span T) - ((repSU2_invariant_iff_su2 repGauge _).2 (repGauge_epsilonContraction₁₃ hT)) +/-- An invariant coefficient is a combination of the two pairings. -/ +theorem exists_eq_smul_add_smul_of_act_eq {c : (Fin 4 → Fin 2) → ℂ} + (hc : ∀ U : specialUnitaryGroup (Fin 2) ℂ, act U c = c) : + ∃ c₁ c₂ : ℂ, c = c₁ • epsilonPair₁₂ + c₂ • epsilonPair₁₃ := by + -- the diagonal element: only the balanced entries survive + have hz : ∀ l : Fin 4 → Fin 2, (∑ i, (l i : ℕ)) ≠ 2 → c l = 0 := + fun l hl => eq_zero_of_act_su2Cube_eq (hc su2Cube) hl + have hz0000 : c ![0, 0, 0, 0] = 0 := hz _ (by decide) + have hz0001 : c ![0, 0, 0, 1] = 0 := hz _ (by decide) + have hz0010 : c ![0, 0, 1, 0] = 0 := hz _ (by decide) + have hz0100 : c ![0, 1, 0, 0] = 0 := hz _ (by decide) + have hz1000 : c ![1, 0, 0, 0] = 0 := hz _ (by decide) + have hz0111 : c ![0, 1, 1, 1] = 0 := hz _ (by decide) + have hz1011 : c ![1, 0, 1, 1] = 0 := hz _ (by decide) + have hz1101 : c ![1, 1, 0, 1] = 0 := hz _ (by decide) + have hz1110 : c ![1, 1, 1, 0] = 0 := hz _ (by decide) + have hz1111 : c ![1, 1, 1, 1] = 0 := hz _ (by decide) + -- the Weyl element: each balanced entry equals its complement + have hw1 : c ![1, 1, 0, 0] = c ![0, 0, 1, 1] := by + have h := congrFun (hc su2Perm) ![0, 0, 1, 1] + rwa [act_su2Perm_zero_zero_one_one] at h + have hw2 : c ![1, 0, 1, 0] = c ![0, 1, 0, 1] := by + have h := congrFun (hc su2Perm) ![0, 1, 0, 1] + rwa [act_su2Perm_zero_one_zero_one] at h + have hw3 : c ![1, 0, 0, 1] = c ![0, 1, 1, 0] := by + have h := congrFun (hc su2Perm) ![0, 1, 1, 0] + rwa [act_su2Perm_zero_one_one_zero] at h + -- the third of a turn: the three remaining unknowns sum to zero + have hcyc : c ![0, 0, 1, 1] + c ![0, 1, 0, 1] + c ![0, 1, 1, 0] = 0 := by + have h := congrFun (hc su2Cyc) (fun _ => 0) + rw [act_su2Cyc_zero, hz (fun _ => 0) (by decide)] at h + have hu : ((1 + Complex.I) / 2) ^ 4 ≠ 0 := by + refine pow_ne_zero _ fun h0 => ?_ + have := congrArg Complex.re h0 + norm_num at this + have hsum := (mul_eq_zero.1 h).resolve_left hu + rw [sum_pi_four] at hsum + simp only [Fin.sum_univ_two, hz0000, hz0001, hz0010, hz0100, hz1000, hz0111, hz1011, + hz1101, hz1110, hz1111, hw1, hw2, hw3] at hsum + linear_combination hsum / 2 + refine ⟨c ![0, 1, 0, 1], c ![0, 0, 1, 1], funext fun l => ?_⟩ + obtain ⟨a, b, d, e, rfl⟩ : ∃ a b d e, l = ![a, b, d, e] := + ⟨l 0, l 1, l 2, l 3, by ext i; fin_cases i <;> rfl⟩ + fin_cases a <;> fin_cases b <;> fin_cases d <;> fin_cases e <;> + simp [epsilonPair₁₂, epsilonPair₁₃, hz0000, hz0001, hz0010, hz0100, hz1000, hz0111, + hz1011, hz1101, hz1110, hz1111, hw1, hw2, hw3] <;> + linear_combination hcyc /-! -## 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 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 -the isospin transformation built from that element. Like the gauge weight decomposition the -grading is read for `repSU2 repGauge`, the isospin part of the representation, which is -where the transformation law constrains every gauge transformation; the Weyl element is -itself an isospin transformation, so the two representations agree at it outright, which is -`repSU2_gaugeSU2Perm`. - -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 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 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 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 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 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 isospin part of the representation at the Weyl element exchanges the two - components of the first - zero-weight pair. -/ -lemma repSU2_gaugeSU2Perm_fst₁ (hT : IsSU2QuadFundamental B repGauge T) : - repSU2 repGauge gaugeSU2Perm (T ![0, 0, 1, 1]) = T ![1, 1, 0, 0] := - map_su2Perm_fst₁ (hT.repGauge_T su2Perm) - -/-- The isospin part of the representation at the Weyl element exchanges the two - components of the first - zero-weight pair, the other way round. -/ -lemma repSU2_gaugeSU2Perm_snd₁ (hT : IsSU2QuadFundamental B repGauge T) : - repSU2 repGauge gaugeSU2Perm (T ![1, 1, 0, 0]) = T ![0, 0, 1, 1] := - map_su2Perm_snd₁ (hT.repGauge_T su2Perm) - -/-- The isospin part of the representation at the Weyl element exchanges the two - components of the second - zero-weight pair. -/ -lemma repSU2_gaugeSU2Perm_fst₂ (hT : IsSU2QuadFundamental B repGauge T) : - repSU2 repGauge gaugeSU2Perm (T ![0, 1, 0, 1]) = T ![1, 0, 1, 0] := - map_su2Perm_fst₂ (hT.repGauge_T su2Perm) - -/-- The isospin part of the representation at the Weyl element exchanges the two - components of the second - zero-weight pair, the other way round. -/ -lemma repSU2_gaugeSU2Perm_snd₂ (hT : IsSU2QuadFundamental B repGauge T) : - repSU2 repGauge gaugeSU2Perm (T ![1, 0, 1, 0]) = T ![0, 1, 0, 1] := - map_su2Perm_snd₂ (hT.repGauge_T su2Perm) - -/-- The isospin part of the representation at the Weyl element exchanges the two - components of the third - zero-weight pair. -/ -lemma repSU2_gaugeSU2Perm_fst₃ (hT : IsSU2QuadFundamental B repGauge T) : - repSU2 repGauge gaugeSU2Perm (T ![0, 1, 1, 0]) = T ![1, 0, 0, 1] := - map_su2Perm_fst₃ (hT.repGauge_T su2Perm) - -/-- The isospin part of the representation at the Weyl element exchanges the two - components of the third - zero-weight pair, the other way round. -/ -lemma repSU2_gaugeSU2Perm_snd₃ (hT : IsSU2QuadFundamental B repGauge T) : - repSU2 repGauge gaugeSU2Perm (T ![1, 0, 0, 1]) = T ![0, 1, 1, 0] := - map_su2Perm_snd₃ (hT.repGauge_T su2Perm) - -/-- The symmetric combination of the first zero-weight pair. -/ -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₂ (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₃ (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 (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 (T : (Fin 4 → Fin 2) → B) : - epsilonContraction₁₂ T = symComb₂ T - symComb₃ T := 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 (repSU2 repGauge) - ((hT.gaugeWeightDecomposition hmul).piece 0) := - SU2PermDecomposition.copy - (((swapPairSU2Perm (repSU2_gaugeSU2Perm_fst₁ hT) - (repSU2_gaugeSU2Perm_snd₁ hT)).sup - (swapPairSU2Perm (repSU2_gaugeSU2Perm_fst₂ hT) - (repSU2_gaugeSU2Perm_snd₂ hT))).sup - (swapPairSU2Perm (repSU2_gaugeSU2Perm_fst₃ hT) - (repSU2_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 - = (ℂ ∙ symComb₁ T ⊔ ℂ ∙ symComb₂ T) ⊔ ℂ ∙ symComb₃ T := rfl - -/-- Every isospin 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. Only the isospin factor is used, which is all the - transformation law constrains. -/ -lemma mem_symComb_of_su2_invariant (hT : IsSU2QuadFundamental B repGauge T) - (hmul : IsMulRep repGauge) {x : B} (hx : x ∈ span T) - (hinv : ∀ V : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, V, 1) x = x) : - x ∈ (ℂ ∙ symComb₁ T ⊔ ℂ ∙ symComb₂ T) ⊔ ℂ ∙ symComb₃ T := by - have hinv' : ∀ g : GaugeGroupI, repSU2 repGauge g x = x := - (repSU2_invariant_iff_su2 repGauge x).2 hinv - rw [← hT.zeroPieceSU2Perm_piece_zero hmul] - exact SU2PermDecomposition.mem_zero_of_invariant (hT.zeroPieceSU2Perm hmul) - (GaugeWeightDecomposition.mem_zero_of_invariant _ hx hinv') hinv' - -/-- The same for a gauge invariant, gauge invariance being invariance under the isospin - factor and more. -/ -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 ∈ (ℂ ∙ symComb₁ T ⊔ ℂ ∙ symComb₂ T) ⊔ ℂ ∙ symComb₃ T := - hT.mem_symComb_of_su2_invariant hmul hx fun V => hinv (1, V, 1) - -/-! +## E. The isospin invariants of the span -## 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 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`, whose three elements are isospin transformations, so an element -the isospin factor fixes is three times its own average. +The action on coefficients is unitary, so `Family.exists_invariant_coeff` writes an isospin +invariant of the span as the contraction of an invariant coefficient, and section D makes +that coefficient a combination of the two pairings. The statement is made for any family of +linear maps `φ U` obeying the law, so that section F can apply it in a quotient. -/ -/-- 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 `SU(2)`. -/ -noncomputable def cycSU2 : specialUnitaryGroup (Fin 2) ℂ := ⟨cycMat, cycMat_mem⟩ - -/-- The matrix of the rotation. -/ -lemma cycSU2_coe : (cycSU2 : specialUnitaryGroup (Fin 2) ℂ).1 = cycMat := 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 - -/-- The rotation by two thirds of a turn, as an element of the gauge group. -/ -noncomputable def cycGaugeSq : GaugeGroupI := ⟨1, cycSU2 * cycSU2, 1⟩ - -/-- The `SU(2)` part of the two thirds turn as a gauge element is the square of the - rotation. -/ -lemma toSU2_cycGaugeSq : GaugeGroupI.toSU2 cycGaugeSq = cycSU2 * cycSU2 := rfl - -/-- The square of the third of a turn is the two thirds turn: the colour and hypercharge - factors are trivial, so they multiply out to the identity and only the isospin factor - moves. This is what makes the average below an average over a cyclic subgroup. -/ -lemma cycGauge_mul_cycGauge : cycGauge * cycGauge = cycGaugeSq := by - simp [cycGauge, cycGaugeSq] - -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 (T : (Fin 4 → Fin 2) → B) : - ∑ l : Fin 4 → Fin 2, symCoeff l • T l - = 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 := - LinearMap.id + repGauge cycGauge + repGauge cycGaugeSq - -/-- The average, written out. -/ -lemma cycAverage_apply (x : B) : - cycAverage repGauge x = x + repGauge cycGauge x + repGauge cycGaugeSq x := rfl - -/-- Averaging annihilates the neutral state of the isospin-two multiplet. -/ -lemma cycAverage_symComb_sum (hT : IsSU2QuadFundamental B repGauge T) : - 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 cycSU2) - (hT.repGauge_T (cycSU2 * cycSU2)) - -/-- Averaging fixes an isospin invariant three times over: the two nontrivial elements of - the cyclic subgroup are isospin transformations, which is all the transformation law - constrains. -/ -lemma cycAverage_of_invariant {x : B} - (hinv : ∀ V : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, V, 1) x = x) : - cycAverage repGauge x = (3 : ℂ) • x := by - have h1 : repGauge cycGauge x = x := hinv cycSU2 - have h2 : repGauge cycGaugeSq x = x := hinv (cycSU2 * cycSU2) - rw [cycAverage_apply, h1, h2] - 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 (symComb₃ T) - = -(epsilonContraction₁₂ T + epsilonContraction₁₃ T) := by - have h0 := cycAverage_symComb_sum hT - rw [map_add, map_add] at h0 - 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 (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 +/-- Every invariant in the span of a family obeying the law for a family of linear maps + `φ U` is a combination of the two epsilon contractions: the two singlets of + `2 ⊗ 2 ⊗ 2 ⊗ 2`. -/ +theorem exists_smul_add_smul_of_invariant' {T : (Fin 4 → Fin 2) → B} + {φ : specialUnitaryGroup (Fin 2) ℂ → B →ₗ[ℂ] B} + (hT : ∀ U, IsSU2QuadFundamentalMat U (φ U) T) {x : B} (hx : x ∈ span T) + (hinv : ∀ U, φ U x = x) : + ∃ c₁ c₂ : ℂ, x = c₁ • epsilonContraction₁₂ T + c₂ • epsilonContraction₁₃ T := by + obtain ⟨c, rfl, hc⟩ := Family.exists_invariant_coeff T φ act + (fun U c => map_sum_smul (hT U) c) sum_star_mul_act hx hinv + obtain ⟨c₁, c₂, hc'⟩ := exists_eq_smul_add_smul_of_act_eq hc + refine ⟨c₁, c₂, ?_⟩ + rw [hc', ← sum_epsilonPair₁₂_smul, ← sum_epsilonPair₁₃_smul, Finset.smul_sum, + Finset.smul_sum, ← Finset.sum_add_distrib] + refine Finset.sum_congr rfl fun l _ => ?_ + simp only [Pi.add_apply, Pi.smul_apply, smul_eq_mul, add_smul, mul_smul] + +/-- Every isospin invariant in the span of the components is a combination of the two epsilon contractions. -/ -lemma cycAverage_symComb₁ (hT : IsSU2QuadFundamental B repGauge T) : - 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 (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 - -/-- Every isospin 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. Only - the isospin factor is used, which is all the transformation law constrains. -/ -lemma mem_sup_epsilonContraction_of_su2_invariant (hT : IsSU2QuadFundamental B repGauge T) - (hmul : IsMulRep repGauge) {x : B} (hx : x ∈ span T) - (hinv : ∀ V : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, V, 1) x = x) : - x ∈ ℂ ∙ epsilonContraction₁₂ T ⊔ ℂ ∙ epsilonContraction₁₃ T := by - have hmem := mem_symComb_of_su2_invariant hT hmul hx hinv - have hI₁₂ : epsilonContraction₁₂ T - ∈ ℂ ∙ epsilonContraction₁₂ T ⊔ ℂ ∙ epsilonContraction₁₃ T := - Submodule.mem_sup_left (Submodule.mem_span_singleton_self _) - have hI₁₃ : epsilonContraction₁₃ T - ∈ ℂ ∙ epsilonContraction₁₂ T ⊔ ℂ ∙ epsilonContraction₁₃ T := - Submodule.mem_sup_right (Submodule.mem_span_singleton_self _) - have hmap : Submodule.map (cycAverage repGauge) - ((ℂ ∙ 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 [cycAverage_symComb₁ hT] - exact sub_mem (Submodule.smul_mem _ _ hI₁₃) (add_mem hI₁₂ hI₁₃) - · rw [cycAverage_symComb₂ hT] - exact sub_mem (Submodule.smul_mem _ _ hI₁₂) (add_mem hI₁₂ hI₁₃) - · rw [cycAverage_symComb₃ hT] - 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' - -/-- The same for a gauge invariant, gauge invariance being invariance under the isospin - factor and more. -/ -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 := - hT.mem_sup_epsilonContraction_of_su2_invariant hmul hx fun V => hinv (1, V, 1) - -/-- Every isospin 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_su2_invariant - (hT : IsSU2QuadFundamental B repGauge T) (hmul : IsMulRep repGauge) {x : B} - (hx : x ∈ span T) +theorem exists_smul_add_smul_of_su2_invariant {T : (Fin 4 → Fin 2) → B} + (hT : IsSU2QuadFundamental B repGauge T) {x : B} (hx : x ∈ span T) (hinv : ∀ V : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, V, 1) x = x) : - ∃ c₁ c₂ : ℂ, - x = c₁ • epsilonContraction₁₂ T + c₂ • epsilonContraction₁₃ T := by - obtain ⟨y, hy, z, hz, rfl⟩ := - Submodule.mem_sup.1 (mem_sup_epsilonContraction_of_su2_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⟩ - -/-- The same for a gauge invariant. -/ -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 := - hT.exists_smul_epsilonContraction_of_su2_invariant hmul hx fun V => hinv (1, V, 1) - -/-- The isospin 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 fixed by the isospin factor and in the - span, which bounds them from below. -/ -lemma mem_span_and_su2_invariant_iff (hT : IsSU2QuadFundamental B repGauge T) - (hmul : IsMulRep repGauge) (x : B) : - (x ∈ span T ∧ ∀ V : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, V, 1) x = x) - ↔ x ∈ ℂ ∙ epsilonContraction₁₂ T ⊔ ℂ ∙ epsilonContraction₁₃ T := by - refine ⟨fun h => mem_sup_epsilonContraction_of_su2_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 _ _ (epsilonContraction₁₂_mem_span T)) - (Submodule.smul_mem _ _ (epsilonContraction₁₃_mem_span T)), fun V => ?_⟩ - rw [map_add, map_smul, map_smul, repGauge_epsilonContraction₁₂ hT V, - repGauge_epsilonContraction₁₃ hT V] - -/-- The gauge invariants in the span of the components are exactly the combinations of the - first two epsilon contractions, once the two contractions are 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 a - contraction, after which the right-hand side has invariants that the left-hand side has - not. Where the two factors do fix them, as they do for a product of four Higgs symbols - whose hypercharges cancel, the hypothesis is supplied from the transformation law of the - underlying field. -/ -lemma mem_span_and_invariant_iff (hT : IsSU2QuadFundamental B repGauge T) - (hmul : IsMulRep repGauge) (x : B) - (hec₁₂ : ∀ g : GaugeGroupI, - repGauge g (epsilonContraction₁₂ T) = epsilonContraction₁₂ T) - (hec₁₃ : ∀ g : GaugeGroupI, - repGauge g (epsilonContraction₁₃ T) = epsilonContraction₁₃ T) : - (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 _ _ (epsilonContraction₁₂_mem_span T)) - (Submodule.smul_mem _ _ (epsilonContraction₁₃_mem_span T)), fun g => ?_⟩ - rw [map_add, map_smul, map_smul, hec₁₂ g, hec₁₃ g] - -/-- Inside the span of the components the two notions of invariance agree, provided the two - epsilon contractions are 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 - combinations of the two contractions. The hypotheses are exactly what the transformation - law no longer supplies, and without them the statement is false, the colour and - hypercharge factors being unconstrained. -/ -lemma su2_invariant_iff_invariant (hT : IsSU2QuadFundamental B repGauge T) - (hmul : IsMulRep repGauge) - (hec₁₂ : ∀ g : GaugeGroupI, - repGauge g (epsilonContraction₁₂ T) = epsilonContraction₁₂ T) - (hec₁₃ : ∀ g : GaugeGroupI, - repGauge g (epsilonContraction₁₃ T) = epsilonContraction₁₃ T) - {x : B} (hx : x ∈ span T) : - (∀ V : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, V, 1) x = x) - ↔ ∀ g : GaugeGroupI, repGauge g x = x := by - refine ⟨fun h g => ?_, fun h V => h (1, V, 1)⟩ - obtain ⟨c₁, c₂, rfl⟩ := hT.exists_smul_epsilonContraction_of_su2_invariant hmul hx h - rw [map_add, map_smul, map_smul, hec₁₂ g, hec₁₃ g] - -end Decomposition + ∃ c₁ c₂ : ℂ, x = c₁ • epsilonContraction₁₂ T + c₂ • epsilonContraction₁₃ T := + exists_smul_add_smul_of_invariant' hT.repGauge_T hx hinv /-! -## F. The classification for a family valued in a module +## F. The invariants modulo a stable submodule -A quad-fundamental family is met downstream inside a module that is not an algebra, and -section E cannot be read there: `GaugeWeightDecomposition` lives in an algebra and -`IsMulRep` is a statement about a product. The square-zero extension supplies both for -free, exactly as it does in section F of `IsSU2BiFundamental`: adjoining `ℂ` to the module -with a zero product makes an algebra whose representation is multiplicative for the -cheapest of reasons, and the injection of the module is injective, so a conclusion proved -upstairs comes straight back down. +The law descends to the quotient by an isospin-stable `S`, so section E applies there, and +`Family.exists_mem_add_of_mem_sup` lifts the result back, the invariants of the quotient +family being the classes of the plane spanned by the two contractions. -/ -section SquareZero - -variable {M : Type*} [AddCommGroup M] [Module ℂ M] - {ρ : Representation ℂ GaugeGroupI M} {T : (Fin 4 → Fin 2) → M} - --- The opposite scalar action and its two compatibilities, which make the square-zero --- extension of a complex vector space a ring. They are borrowed from `IsSU2BiAdjoint` so --- that the instances here and there are literally the same. -attribute [local instance 100] IsSU2BiAdjoint.opModule - IsSU2BiAdjoint.smulCommClassOpModule IsSU2BiAdjoint.isCentralScalarOpModule - -/-- The images of the components in the square-zero extension again form a - quad-fundamental family, the extended representation acting on them by the - representation extended. -/ -lemma isSU2QuadFundamental_sqZeroRep (hT : IsSU2QuadFundamental M ρ T) : - IsSU2QuadFundamental (TrivSqZeroExt ℂ M) (IsSU2BiAdjoint.sqZeroRep ρ) - fun l => TrivSqZeroExt.inr (T l) where - repGauge_T g l := by - rw [IsSU2BiAdjoint.sqZeroRep_inr, hT.repGauge_T g l] - simp only [TrivSqZeroExt.inr_sum, TrivSqZeroExt.inr_smul] - -omit [Module ℂ M] in -/-- The first contraction of the images is the image of the first contraction. -/ -lemma epsilonContraction₁₂_inr (T : (Fin 4 → Fin 2) → M) : - epsilonContraction₁₂ (fun l => (TrivSqZeroExt.inr (T l) : TrivSqZeroExt ℂ M)) - = TrivSqZeroExt.inr (epsilonContraction₁₂ T) := by - simp only [epsilonContraction₁₂, ← TrivSqZeroExt.inr_sub, ← TrivSqZeroExt.inr_add] - -omit [Module ℂ M] in -/-- The second contraction of the images is the image of the second contraction. -/ -lemma epsilonContraction₁₃_inr (T : (Fin 4 → Fin 2) → M) : - epsilonContraction₁₃ (fun l => (TrivSqZeroExt.inr (T l) : TrivSqZeroExt ℂ M)) - = TrivSqZeroExt.inr (epsilonContraction₁₃ T) := by - simp only [epsilonContraction₁₃, ← TrivSqZeroExt.inr_sub, ← TrivSqZeroExt.inr_add] - -/-- The image of an element of the span lies in the span of the images. -/ -lemma inr_mem_span_sqZeroRep (T : (Fin 4 → Fin 2) → M) {x : M} (hx : x ∈ span T) : - (TrivSqZeroExt.inr x : TrivSqZeroExt ℂ M) - ∈ span fun l => (TrivSqZeroExt.inr (T l) : TrivSqZeroExt ℂ M) := by - obtain ⟨c, rfl⟩ := (mem_span_iff x).1 hx - refine (mem_span_iff _).2 ⟨c, ?_⟩ - simp only [TrivSqZeroExt.inr_sum, TrivSqZeroExt.inr_smul] - -/-- Every gauge invariant in the span of the components is a combination of the first two - epsilon contractions, 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_epsilonContraction_of_invariant_module - (hT : IsSU2QuadFundamental M ρ T) {x : M} (hx : x ∈ span T) - (hinv : ∀ g : GaugeGroupI, ρ g x = x) : - ∃ c₁ c₂ : ℂ, - x = c₁ • epsilonContraction₁₂ T + c₂ • epsilonContraction₁₃ T := by - obtain ⟨c₁, c₂, hc⟩ := - hT.isSU2QuadFundamental_sqZeroRep.exists_smul_epsilonContraction_of_invariant - (IsSU2BiAdjoint.isMulRep_sqZeroRep ρ) (inr_mem_span_sqZeroRep T hx) - (fun g => by rw [IsSU2BiAdjoint.sqZeroRep_inr, hinv g]) - refine ⟨c₁, c₂, TrivSqZeroExt.inr_injective (R := ℂ) ?_⟩ - rw [hc, epsilonContraction₁₂_inr, epsilonContraction₁₃_inr, TrivSqZeroExt.inr_add, - TrivSqZeroExt.inr_smul, TrivSqZeroExt.inr_smul] - -end SquareZero +/-- The law descends to the quotient by a submodule stable under the map. -/ +lemma isSU2QuadFundamentalMat_mapQ {T : (Fin 4 → Fin 2) → B} + {U : specialUnitaryGroup (Fin 2) ℂ} {f : B →ₗ[ℂ] B} (hf : IsSU2QuadFundamentalMat U f T) + (S : Submodule ℂ B) (hS : ∀ y ∈ S, f y ∈ S) : + IsSU2QuadFundamentalMat U (S.mapQ S f hS) fun l => S.mkQ (T l) := by + intro l + dsimp only + rw [← LinearMap.comp_apply, Submodule.mapQ_mkQ, LinearMap.comp_apply, hf l, map_sum] + exact Finset.sum_congr rfl fun a _ => map_smul _ _ _ + +/-- The first contraction of the quotient family is the class of the first contraction. -/ +lemma mkQ_epsilonContraction₁₂ (T : (Fin 4 → Fin 2) → B) (S : Submodule ℂ B) : + epsilonContraction₁₂ (fun l => S.mkQ (T l)) = S.mkQ (epsilonContraction₁₂ T) := by + simp only [epsilonContraction₁₂, map_sub, map_add] + +/-- The second contraction of the quotient family is the class of the second + contraction. -/ +lemma mkQ_epsilonContraction₁₃ (T : (Fin 4 → Fin 2) → B) (S : Submodule ℂ B) : + epsilonContraction₁₃ (fun l => S.mkQ (T l)) = S.mkQ (epsilonContraction₁₃ T) := by + simp only [epsilonContraction₁₃, map_sub, map_add] + +/-- An isospin invariant of the span of the components joined with an isospin-stable + submodule `S` is a combination of the two epsilon contractions up to an isospin-invariant + remainder in `S`. -/ +theorem mem_span_sup_su2_invariant_iff {T : (Fin 4 → Fin 2) → B} + (hT : IsSU2QuadFundamental B repGauge T) (x : B) (S : Submodule ℂ B) + (hS : ∀ V : specialUnitaryGroup (Fin 2) ℂ, ∀ y ∈ S, repGauge (1, V, 1) y ∈ S) + (hx : x ∈ span T ⊔ S) + (hinv : ∀ V : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, V, 1) x = x) : + ∃ c₁ c₂ : ℂ, ∃ y ∈ S, + x = c₁ • epsilonContraction₁₂ T + c₂ • epsilonContraction₁₃ T + y + ∧ ∀ V : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, V, 1) y = y := by + obtain ⟨w, hw, y, hyS, hxy, hyinv⟩ := Family.exists_mem_add_of_mem_sup T + (fun V => repGauge (1, V, 1)) S hS + (Submodule.span ℂ {epsilonContraction₁₂ T, epsilonContraction₁₃ T}) + (fun w hw V => by + obtain ⟨c₁, c₂, rfl⟩ := Submodule.mem_span_pair.1 hw + rw [map_add, map_smul, map_smul, repGauge_epsilonContraction₁₂ hT, + repGauge_epsilonContraction₁₃ hT]) + (fun x hx hinv => by + obtain ⟨c₁, c₂, hx'⟩ := exists_smul_add_smul_of_invariant' + (fun V => isSU2QuadFundamentalMat_mapQ (hT.repGauge_T V) S (hS V)) hx hinv + refine ⟨c₁ • epsilonContraction₁₂ T + c₂ • epsilonContraction₁₃ T, + Submodule.mem_span_pair.2 ⟨c₁, c₂, rfl⟩, ?_⟩ + rw [map_add, map_smul, map_smul, ← mkQ_epsilonContraction₁₂, ← mkQ_epsilonContraction₁₃, + hx']) hx hinv + obtain ⟨c₁, c₂, rfl⟩ := Submodule.mem_span_pair.1 hw + exact ⟨c₁, c₂, y, hyS, hxy, hyinv⟩ /-! -## G. The invariants modulo a stable submodule - -Peeling one family at a time off a join needs the invariants of the span of that family -together with everything not yet peeled, gathered in a submodule `S`. A stable submodule -can be divided out: the images of the components in the quotient again form a -quad-fundamental family, so section F applies verbatim there and lifts to a classification -modulo `S`. The error term is invariant for free, being the difference of two invariants. - -Stability of `S` cannot be dropped, for the reason given at the bi-fundamental twin: for -an unstable line the only invariant of the line is zero, while an invariant of the sum may -lie outside the span. The two invariance hypotheses on the contractions are the ones of -`mem_span_and_invariant_iff`, and they are what makes the error term a gauge invariant -rather than merely an isospin one. +## Aside: the gauge form of the theorem, for the Higgs sector -/ -section Quotient - -variable {M : Type*} [AddCommGroup M] [Module ℂ M] - {ρ : Representation ℂ GaugeGroupI M} {T : (Fin 4 → Fin 2) → M} - -/-- The images of the components in the quotient by a gauge-stable submodule again form a - quad-fundamental family. -/ -lemma isSU2QuadFundamental_quotRep (hT : IsSU2QuadFundamental M ρ T) (S : Submodule ℂ M) - (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, ρ g y ∈ S) : - IsSU2QuadFundamental (M ⧸ S) (IsSU2BiAdjoint.quotRep ρ S hS) - fun l => S.mkQ (T l) where - repGauge_T g l := by - rw [IsSU2BiAdjoint.quotRep_mkQ, hT.repGauge_T g l, map_sum] - exact Finset.sum_congr rfl fun a _ => map_smul _ _ _ - -/-- The quotient map carries the first contraction to the first contraction of the - images. -/ -lemma mkQ_epsilonContraction₁₂ (T : (Fin 4 → Fin 2) → M) (S : Submodule ℂ M) : - S.mkQ (epsilonContraction₁₂ T) = epsilonContraction₁₂ fun l => S.mkQ (T l) := by - simp only [epsilonContraction₁₂, map_add, map_sub] - -/-- The quotient map carries the second contraction to the second contraction of the - images. -/ -lemma mkQ_epsilonContraction₁₃ (T : (Fin 4 → Fin 2) → M) (S : Submodule ℂ M) : - S.mkQ (epsilonContraction₁₃ T) = epsilonContraction₁₃ fun l => S.mkQ (T l) := by - simp only [epsilonContraction₁₃, map_add, map_sub] - -/-- The image of an element of the join of the span with a submodule lies in the span of - the images, the submodule dying in the quotient. -/ -lemma mkQ_mem_span_quotRep (T : (Fin 4 → Fin 2) → M) (S : Submodule ℂ M) {x : M} - (hx : x ∈ span T ⊔ S) : S.mkQ x ∈ span fun l => S.mkQ (T l) := by - obtain ⟨u, hu, z, hz, huz⟩ := Submodule.mem_sup.1 hx - obtain ⟨c, hc⟩ := (mem_span_iff u).1 hu - refine (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 _ _ _ - -end Quotient - -/-- The gauge invariants of the span of the components together with a gauge-stable - submodule `S`: such an element is a combination of the first two epsilon contractions up - to an error in `S`, and the error is gauge invariant as well, being the difference of two - invariants. This is the form in which one family at a time is peeled off a join. -/ -lemma mem_span_sup_invariant_iff {B : Type*} [AddCommGroup B] [Module ℂ B] - {repGauge : Representation ℂ GaugeGroupI B} {T : (Fin 4 → Fin 2) → B} +/-- A gauge invariant of the span joined with a gauge-stable submodule is a combination of + the two epsilon contractions up to a gauge-invariant remainder, once the two contractions + are known to be gauge invariant. The hypotheses on the contractions cannot be dropped: the + law says nothing about the hypercharge factor, which may scale them. -/ +theorem mem_span_sup_invariant_iff {T : (Fin 4 → Fin 2) → B} (hT : IsSU2QuadFundamental B repGauge T) (x : B) (S : Submodule ℂ B) (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, repGauge g y ∈ S) (hec₁₂ : ∀ g : GaugeGroupI, @@ -1442,17 +539,11 @@ lemma mem_span_sup_invariant_iff {B : Type*} [AddCommGroup B] [Module ℂ B] ∃ c₁ c₂ : ℂ, ∃ y ∈ S, x = c₁ • epsilonContraction₁₂ T + c₂ • epsilonContraction₁₃ T + y ∧ ∀ g : GaugeGroupI, repGauge g y = y := by - have hquot := hT.isSU2QuadFundamental_quotRep S hS - obtain ⟨c₁, c₂, hc⟩ := hquot.exists_smul_epsilonContraction_of_invariant_module - (mkQ_mem_span_quotRep T S hx) (fun g => by rw [IsSU2BiAdjoint.quotRep_mkQ, hinv g]) - rw [← mkQ_epsilonContraction₁₂ T S, ← mkQ_epsilonContraction₁₃ T S] at hc - refine ⟨c₁, c₂, x - (c₁ • epsilonContraction₁₂ T + c₂ • epsilonContraction₁₃ T), ?_, - by abel, fun g => ?_⟩ - · have hker : x - (c₁ • epsilonContraction₁₂ T + c₂ • epsilonContraction₁₃ T) - ∈ LinearMap.ker S.mkQ := by - rw [LinearMap.mem_ker, map_sub, map_add, map_smul, map_smul, hc, sub_self] - rwa [Submodule.ker_mkQ] at hker - · rw [map_sub, map_add, map_smul, map_smul, hinv g, hec₁₂ g, hec₁₃ g] + obtain ⟨c₁, c₂, y, hyS, hxy, -⟩ := + hT.mem_span_sup_su2_invariant_iff x S (fun V => hS (1, V, 1)) hx fun V => hinv (1, V, 1) + refine ⟨c₁, c₂, y, hyS, hxy, fun g => ?_⟩ + rw [show y = x - (c₁ • epsilonContraction₁₂ T + c₂ • epsilonContraction₁₃ T) from by + rw [hxy]; abel, map_sub, map_add, map_smul, map_smul, hinv g, hec₁₂ g, hec₁₃ g] end IsSU2QuadFundamental diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3Adjoint.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3Adjoint.lean index b8d1cecc8..63ddd7f8d 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3Adjoint.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3Adjoint.lean @@ -9,45 +9,30 @@ public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU3BiAdjoi /-! # 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. +A single gluon field strength `F^a` carries one colour index, running over the eight +Gell-Mann directions of `su(3)`, and transforms in the adjoint representation `8`. That +representation contains no singlet: no linear combination of the eight components is left +alone by every colour rotation, which is why a Lagrangian never contains a term linear in a +field strength. This file proves that fact in the form the Standard Model files consume, +modulo a colour-stable submodule in which other families are parked. + +`IsSU3Adjoint B repGauge T` records the hypothesis. `T` is a family indexed by one colour +index and valued in a module `B` carrying a representation of the gauge group, and a colour +rotation `U ∈ SU(3)` moves its components by the adjoint matrix of `U`. Nothing is asked of +the isospin and hypercharge factors. + +The argument is the one of `IsSU3BiAdjoint` with one index instead of two. A colour +invariant of the span is the contraction of an invariant coefficient vector, by +`Family.exists_invariant_coeff`, since the adjoint matrix is orthogonal. Two colour +rotations then kill the coefficient vector. The colour parities, diagonal sign matrices of +`SU(3)`, reverse the six Gell-Mann directions that mix two colours and fix the two Cartan +directions `λ₃` and `λ₈`, so an invariant coefficient lives in the Cartan plane. The cyclic +permutation of the colours rotates that plane through a third of a turn, and a rotation of a +plane fixes no nonzero vector. + +Section A gives the transformation law and the span, section B the action on coefficient +vectors, section C the vanishing of an invariant coefficient vector, and section D the +vanishing of the invariants of the span and its form modulo a stable submodule. -/ @[expose] public section @@ -60,24 +45,20 @@ 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 law carries one factor of the adjoint 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. -/ +/-- The linear map `f` moves the components of `T` as `U ∈ SU(3)` moves a tensor with one + adjoint index. -/ 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. -/ + tensor `T^a` under the colour factor of the gauge group. Nothing is asked of the isospin + and 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) ℂ, @@ -85,509 +66,187 @@ structure IsSU3Adjoint (B : Type*) [AddCommMonoid B] [Module ℂ B] namespace IsSU3Adjoint +/- `span` takes the hypothesis `hT` only to hang off it by dot notation. -/ 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) + {repGauge : Representation ℂ GaugeGroupI B} {T : Fin 8 → B} -/-- 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. -/ +/-- The span of the components. -/ +@[nolint unusedArguments] 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 _)) +/-- A vector lies in the span precisely when it is a linear combination of the + components. -/ +lemma mem_span_iff (hT : IsSU3Adjoint B repGauge T) (x : B) : + x ∈ hT.span ↔ ∃ c : Fin 8 → ℂ, x = ∑ d, c d • T d := + Family.mem_iSup_span_singleton_iff T x /-! -## 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 +## B. The action on coefficient vectors --/ - -/-- 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 +A vector of the span is a contraction `∑ a, c a • T a` against a coefficient vector +`c : Fin 8 → ℂ`, and the law says that a colour rotation moves it by the row action +`IsSU3BiAdjoint.rowAct U` on `c`, which is the adjoint matrix itself as a linear map. It is +unitary for the standard inner product, the matrix being real and orthogonal. -/ -/-- 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 row action of the adjoint matrix, as a linear map on coefficient vectors. -/ +noncomputable def act (U : specialUnitaryGroup (Fin 3) ℂ) : (Fin 8 → ℂ) →ₗ[ℂ] (Fin 8 → ℂ) := + Matrix.toLin' (Matrix.of fun a x => ((su3AdjointMatrix U a x : ℝ) : ℂ)) --/ - -/-- 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 +/-- The action on coefficient vectors is the row action. -/ +lemma act_apply (U : specialUnitaryGroup (Fin 3) ℂ) (c : Fin 8 → ℂ) : + act U c = rowAct U c := 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 + simp [act, rowAct, Matrix.mulVec, dotProduct] -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 transformation law in coefficient form. -/ +lemma map_sum_smul {U : specialUnitaryGroup (Fin 3) ℂ} {f : B →ₗ[ℂ] B} + (hf : IsSU3AdjointMat U f T) (c : Fin 8 → ℂ) : + f (∑ l, c l • T l) = ∑ a, act U c a • T a := by + simp only [map_sum, map_smul, act_apply, rowAct, Finset.sum_smul] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun l _ => ?_ + rw [hf l, Finset.smul_sum] + exact Finset.sum_congr rfl fun a _ => by rw [smul_smul, mul_comm] + +/-- The action of `U⁻¹` is the transpose of the action of `U`. -/ +lemma sum_act_mul (U : specialUnitaryGroup (Fin 3) ℂ) (c d : Fin 8 → ℂ) : + ∑ a, act U c a * d a = ∑ l, c l * act U⁻¹ d l := by + simp only [act_apply, rowAct, su3AdjointMatrix_inv, Finset.sum_mul, Finset.mul_sum] + rw [Finset.sum_comm] + exact Finset.sum_congr rfl fun l _ => Finset.sum_congr rfl fun a _ => by ring -/-- 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 +/-- The action on coefficient vectors commutes with complex conjugation. -/ +lemma act_star (U : specialUnitaryGroup (Fin 3) ℂ) (c : Fin 8 → ℂ) : + act U (star c) = star (act U c) := by + funext a + simp [act_apply, rowAct, star_sum, star_mul', Complex.conj_ofReal] /-! -## D.2. The symmetriser of the cyclic rotation on the Cartan plane +## C. An invariant coefficient vector vanishes -/ -/-- 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] +/-- A colour parity scales each coordinate by the sign of its Gell-Mann direction. -/ +lemma rowAct_su3Parity_apply (k : Fin 3) (c : Fin 8 → ℂ) (a : Fin 8) : + rowAct (su3Parity k) c a = ((paritySign k a : ℤ) : ℂ) * c a := by + simp only [rowAct, su3AdjointMatrix_su3Parity, apply_ite (fun r : ℝ => (r : ℂ)), + Complex.ofReal_zero, ite_mul, zero_mul, Finset.sum_ite_eq, Finset.mem_univ, if_true, + Complex.ofReal_intCast] + +/-- A coefficient vector fixed by every colour rotation is zero: the parities confine it to + the Cartan plane, which the cyclic rotation turns through a third of a turn. -/ +theorem eq_zero_of_rowAct_eq {c : Fin 8 → ℂ} + (hc : ∀ U : specialUnitaryGroup (Fin 3) ℂ, rowAct U c = c) : c = 0 := by + -- the parities: every direction outside the Cartan plane carries a sign `-1` + have hpar : ∀ (k : Fin 3) (a : Fin 8), paritySign k a = -1 → c a = 0 := by + intro k a hk + have h := congrFun (hc (su3Parity k)) a + rw [rowAct_su3Parity_apply, hk] at h + push_cast at h + linear_combination (-1 / 2 : ℂ) * h + have hroot : ∀ a : Fin 8, a ≠ 2 → a ≠ 7 → c a = 0 := by + intro a h2 h7 + have key : paritySign 0 a = -1 ∨ paritySign 1 a = -1 := by + revert a + decide + rcases key with h | h + · exact hpar 0 a h + · exact hpar 1 a h + -- the Cartan plane: the cyclic rotation turns it, fixing nothing + have hcart : c = c 2 • unitVec 2 + c 7 • unitVec 7 := by + funext a + have ha : a = 2 ∨ a = 7 ∨ (a ≠ 2 ∧ a ≠ 7) := by + revert a + decide + rcases ha with rfl | rfl | ⟨h2, h7⟩ + · simp [unitVec] + · simp [unitVec] + · simp [unitVec, h2, h7, hroot a h2 h7] + 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 + have h := hc su3Perm + rw [hcart, rowAct_add, rowAct_smul, rowAct_smul, rowAct_su3Perm_unitVec, + rowAct_su3Perm_unitVec] at h + have h2 := congrFun h 2 + have h7 := congrFun h 7 + simp [permCol, unitVec] at h2 h7 + have hc7 : c 7 = 0 := by + linear_combination (-((Real.sqrt 3 : ℝ) : ℂ) / 6) * h2 + (-(1 : ℂ) / 2) * h7 + + (-(c 7) / 12) * h3 + have hc2 : c 2 = 0 := by + linear_combination (-(2 : ℂ) / 3) * h2 - (((Real.sqrt 3 : ℝ) : ℂ) / 3) * hc7 + rw [hcart, hc2, hc7] + simp /-! -## E. A single adjoint index carries no invariant +## D. 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 +The action on coefficients is unitary, so `Family.exists_invariant_coeff` writes an +invariant of the span as the contraction of an invariant coefficient vector, which section C +makes zero. The statement is made for any family of linear maps obeying the law, so that +it applies in a quotient, and `Family.exists_smul_add_of_mem_sup` then gives the form +modulo a stable submodule: an invariant of the span joined with `S` lies in `S`. -/ -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. -/ +/-- An invariant of the span of a family obeying the law for a family of linear maps + `φ U` is zero: the adjoint representation of `SU(3)` contains no singlet. -/ +theorem eq_zero_of_invariant' {φ : specialUnitaryGroup (Fin 3) ℂ → B →ₗ[ℂ] B} + (hT : ∀ U, IsSU3AdjointMat U (φ U) T) {x : B} (hx : x ∈ ⨆ d, ℂ ∙ T d) + (hinv : ∀ U, φ U x = x) : x = 0 := by + obtain ⟨c, rfl, hc⟩ := Family.exists_invariant_coeff T φ act + (fun U c => map_sum_smul (hT U) c) + (Family.sum_star_mul_of_transpose act sum_act_mul act_star) hx hinv + have hc0 : c = 0 := eq_zero_of_rowAct_eq fun U => by rw [← act_apply, hc U] + simp [hc0] + +/-- A colour invariant in the span of the components is zero. -/ 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. -/ + (hinv : ∀ U : specialUnitaryGroup (Fin 3) ℂ, repGauge (U, 1, 1) x = x) : x = 0 := + eq_zero_of_invariant' hT.repGauge_T hx hinv + +/-- The law descends to the quotient by a submodule stable under the map. -/ +lemma isSU3AdjointMat_mapQ {U : specialUnitaryGroup (Fin 3) ℂ} {f : B →ₗ[ℂ] B} + (hf : IsSU3AdjointMat U f T) (S : Submodule ℂ B) (hS : ∀ y ∈ S, f y ∈ S) : + IsSU3AdjointMat U (S.mapQ S f hS) fun l => S.mkQ (T l) := by + intro l + dsimp only + rw [← LinearMap.comp_apply, Submodule.mapQ_mkQ, LinearMap.comp_apply, hf 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`: an `su(3)` adjoint index contributes nothing to the invariants. -/ 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') + obtain ⟨c, y, hyS, hxy, -⟩ := Family.exists_smul_add_of_mem_sup T + (fun U => repGauge (U, 1, 1)) S hS 0 (fun U => map_zero _) + (fun x hx hinv => ⟨0, by + rw [eq_zero_of_invariant' (fun U => isSU3AdjointMat_mapQ (hT.repGauge_T U) S (hS U)) + hx hinv, zero_smul]⟩) hx hinv + rwa [hxy, smul_zero, zero_add] /-- 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. -/ + submodule are exactly the colour invariants of the submodule. -/ 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) + ↔ x ∈ S ∧ ∀ U : specialUnitaryGroup (Fin 3) ℂ, repGauge (U, 1, 1) x = x := + ⟨fun ⟨hx, hinv⟩ => ⟨hT.mem_of_mem_span_sup_su3_invariant x S hS hx hinv, hinv⟩, + fun ⟨hx, hinv⟩ => ⟨Submodule.mem_sup_right hx, hinv⟩⟩ end IsSU3Adjoint diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiAdjoint.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiAdjoint.lean index 619d7abf0..fcdbbcb78 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiAdjoint.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiAdjoint.lean @@ -7,8 +7,8 @@ module public import Physlib.Particles.StandardModel.GaugeAlgebra.RootDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.SU3PermDecomposition +public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.Basic public import Mathlib.Algebra.TrivSqZeroExt.Basic -public import Mathlib.Analysis.InnerProductSpace.Projection.Basic /-! # Gauge tensors carrying two `su(3)` adjoint indices @@ -34,13 +34,11 @@ of the trace contraction up to a colour-invariant error in `S`. The proof has two halves, and neither needs more than the module structure of `B`. -The first half is linear algebra. A vector of the span is `∑ l, c l • T l` for a -coefficient function `c` on pairs of colour indices, and a colour rotation acts on `c` by -the Kronecker square of its adjoint matrix. The coefficients contracting to zero form a -subspace stable under all these actions; the actions are orthogonal for the standard inner -product, so the orthogonal complement is stable too. Projecting the coefficient of an -invariant vector onto that complement leaves the vector alone and makes the coefficient -itself invariant. One inner product thus replaces every averaging argument. +The first half is the linear algebra of `Invariants.Basic`. A vector of the span is +`∑ l, c l • T l` for a coefficient function `c` on pairs of colour indices, and a colour +rotation acts on `c` by the Kronecker square of its adjoint matrix, a unitary action. So an +invariant vector of the span is the contraction of an invariant coefficient +(`Family.exists_invariant_coeff`), and the question becomes a finite one. The second half is a finite computation. An invariant coefficient is a bilinear form on colour coordinates fixed by every colour rotation, and a handful of explicit rotations pin @@ -53,14 +51,13 @@ Cartan direction onto the two members of a root pair and tie the Cartan entries entries. So the form is a multiple of the Kronecker delta and the vector a multiple of the trace. -Section A sets up the adjoint matrix, the transformation law and the colour part of a -representation. Section B has the span, the contraction against a coefficient function, the -action on coefficients and the trace contraction. Section C has the coordinate vectors of -one index, section D computes the rotations on them, section E is the finite computation, -section F the inner product argument, and section G divides out a stable submodule and -proves the theorem. An aside at the end holds what other files import from here and the -theorem does not use: the weight basis of the adjoint, the trivial square-zero extension -and the gauge form of the theorem. +Section A sets up the adjoint matrix and the transformation law. Section B has the span, +the action on coefficients and the trace contraction. Section C has the coordinate vectors +of one index, section D computes the rotations on them, section E is the finite +computation, section F classifies the invariants of the span, and section G divides out a +stable submodule and proves the theorem. An aside at the end holds what other files import +from here and the theorem does not use: the weight basis of the adjoint, the quotient and +square-zero representations, and the gauge form of the theorem. -/ @[expose] public section @@ -162,80 +159,28 @@ structure IsSU3BiAdjoint (B : Type*) [AddCommMonoid B] [Module ℂ B] repGauge_T : ∀ g : specialUnitaryGroup (Fin 3) ℂ, IsSU3BiAdjointMat g (repGauge (g, 1, 1)) T -/-! - -## A.3. The colour part of a representation - -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. Invariance under it is -invariance under colour, `∀ U, repGauge (U, 1, 1) x = x`, stability of a submodule under it -is stability under colour, and a bi-adjoint family for `repGauge` is one for -`repSU3 repGauge`. Section G uses it to divide out a submodule that is only known to be -stable under colour. - --/ - -/-- The colour part of a representation of the gauge group: it reads only the `SU(3)` - factor of its argument. -/ -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 acts by the representation at the colour rotation with the same - `SU(3)` factor. -/ -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 - -/-- Invariance under the colour part is invariance under the colour rotations. -/ -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)⟩ - -/-- Stability under the colour part is stability under the colour rotations. -/ -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 -/- `span`, `contract`, `traceContraction` and `biVec` take the hypothesis `hT` only to hang -off it by dot notation, and `mem_span_sup_invariant_iff` keeps a hypothesis for its caller; -each is marked `nolint unusedArguments` where it is declared. -/ +/- `span`, `traceContraction` and `biVec` take the hypothesis `hT` only to hang off it by +dot notation, and `mem_span_sup_invariant_iff` keeps a hypothesis for its caller; each is +marked `nolint unusedArguments` where it is declared. -/ set_option linter.unusedVariables false variable {B : Type*} [AddCommGroup B] [Module ℂ B] {repGauge : Representation ℂ GaugeGroupI B} {T : (Fin 2 → Fin 8) → B} -/-- A bi-adjoint family for a representation is one for its colour part: the law reads only - the colour factor to begin with. -/ -lemma toRepSU3 (hT : IsSU3BiAdjoint B repGauge T) : - IsSU3BiAdjoint B (repSU3 repGauge) T where - repGauge_T g := hT.repGauge_T g - /-! -## B. Coefficients, the contraction and the trace +## B. Coefficients, their action and the trace A vector of the span of the components is a contraction `∑ l, c l • T l` against a -coefficient function `c` on pairs of colour indices. The transformation law says exactly +coefficient function `c` on pairs of colour indices, and the transformation law says exactly that a colour rotation moves such a contraction by moving `c` with the Kronecker square of -its adjoint matrix, `act U`, and orthogonality of the adjoint matrix says that `act U⁻¹` is -the transpose of `act U`. The trace contraction `∑ a, T ![a, a]` is the contraction against -the Kronecker delta `traceCoeff`, and it is colour invariant because the delta is. +its adjoint matrix, `act U`. Orthogonality of the adjoint matrix makes `act U⁻¹` the +transpose of `act U`, and the matrix being real, `act U` commutes with conjugation: these are +the two hypotheses of `Family.exists_invariant_coeff`. The trace contraction +`∑ a, T ![a, a]` is the contraction against the Kronecker delta `traceCoeff`, and it is +colour invariant because the delta is an invariant coefficient. -/ @@ -243,34 +188,16 @@ the Kronecker delta `traceCoeff`, and it is colour invariant because the delta i @[nolint unusedArguments] def span (hT : IsSU3BiAdjoint B repGauge T) : Submodule ℂ B := ⨆ d, ℂ ∙ T d -/-- The contraction of the family against a coefficient function, `c ↦ ∑ l, c l • T l`. -/ -@[nolint unusedArguments] -noncomputable def contract (hT : IsSU3BiAdjoint B repGauge T) : - ((Fin 2 → Fin 8) → ℂ) →ₗ[ℂ] B := - Fintype.linearCombination ℂ T - -/-- The contraction, written out. -/ -lemma contract_apply (hT : IsSU3BiAdjoint B repGauge T) (c : (Fin 2 → Fin 8) → ℂ) : - hT.contract c = ∑ l, c l • T l := - Fintype.linearCombination_apply _ _ _ - -/-- The span of the components is the range of the contraction: a vector lies in it - precisely when it is a linear combination of the components. -/ +/-- A vector lies in the span precisely when it is a linear combination of the + components. -/ lemma mem_span_iff (hT : IsSU3BiAdjoint B repGauge T) (x : B) : - x ∈ hT.span ↔ ∃ (c : (Fin 2 → Fin 8) → ℂ), x = ∑ d, c d • T d := by - rw [span, ← Submodule.span_range_eq_iSup, ← Fintype.range_linearCombination, - LinearMap.mem_range] - simp only [Fintype.linearCombination_apply, eq_comm] + x ∈ hT.span ↔ ∃ (c : (Fin 2 → Fin 8) → ℂ), x = ∑ d, c d • T d := + Family.mem_iSup_span_singleton_iff T x /-- A sum over pairs of colour 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] + ∑ d : Fin 2 → Fin 8, F d = ∑ x : Fin 8, ∑ y : Fin 8, F ![x, y] := + Family.sum_pi_two F /-- The action of `U ∈ SU(3)` on coefficient functions: the Kronecker square of its adjoint matrix. -/ @@ -287,10 +214,10 @@ lemma act_apply (U : specialUnitaryGroup (Fin 3) ℂ) (c : (Fin 2 → Fin 8) → /-- The transformation law in coefficient form: a map moving the components by `U` moves a contraction by `act U` on its coefficients. -/ -lemma map_contract (hT : IsSU3BiAdjoint B repGauge T) {U : specialUnitaryGroup (Fin 3) ℂ} - {f : B →ₗ[ℂ] B} (hf : IsSU3BiAdjointMat U f T) (c : (Fin 2 → Fin 8) → ℂ) : - f (hT.contract c) = hT.contract (act U c) := by - simp only [contract_apply, map_sum, map_smul, act_apply, Finset.sum_smul] +lemma map_sum_smul {U : specialUnitaryGroup (Fin 3) ℂ} {f : B →ₗ[ℂ] B} + (hf : IsSU3BiAdjointMat U f T) (c : (Fin 2 → Fin 8) → ℂ) : + f (∑ l, c l • T l) = ∑ a, act U c a • T a := by + simp only [map_sum, map_smul, act_apply, Finset.sum_smul] rw [Finset.sum_comm] refine Finset.sum_congr rfl fun l _ => ?_ rw [hf l, Finset.smul_sum] @@ -304,6 +231,13 @@ lemma sum_act_mul (U : specialUnitaryGroup (Fin 3) ℂ) (c d : (Fin 2 → Fin 8) rw [Finset.sum_comm] exact Finset.sum_congr rfl fun l _ => Finset.sum_congr rfl fun a _ => by ring +/-- The action on coefficients commutes with complex conjugation, the adjoint matrix being + real. -/ +lemma act_star (U : specialUnitaryGroup (Fin 3) ℂ) (c : (Fin 2 → Fin 8) → ℂ) : + act U (star c) = star (act U c) := by + funext a + simp [act_apply, star_sum, star_mul', Complex.conj_ofReal] + /-- The Kronecker delta on pairs of colour indices: the coefficients of the trace. -/ def traceCoeff : (Fin 2 → Fin 8) → ℂ := fun l => if l 0 = l 1 then 1 else 0 @@ -329,17 +263,17 @@ lemma act_traceCoeff (U : specialUnitaryGroup (Fin 3) ℂ) : act U traceCoeff = @[nolint unusedArguments] def traceContraction (hT : IsSU3BiAdjoint B repGauge T) : B := ∑ a : Fin 8, T ![a, a] -/-- The trace contraction is the contraction against the Kronecker delta. -/ -lemma contract_traceCoeff (hT : IsSU3BiAdjoint B repGauge T) : - hT.contract traceCoeff = hT.traceContraction := by - rw [contract_apply, sum_pi_two] - simp [traceCoeff, traceContraction, ite_smul] +/-- The trace is the contraction against the Kronecker delta. -/ +lemma sum_traceCoeff_smul (T : (Fin 2 → Fin 8) → B) : + ∑ l, traceCoeff l • T l = ∑ a : Fin 8, T ![a, a] := by + rw [sum_pi_two] + simp [traceCoeff, ite_smul] /-- Any map moving the components by an `SU(3)` matrix fixes the trace contraction. -/ 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 - rw [← hT.contract_traceCoeff, hT.map_contract hf, act_traceCoeff] + rw [traceContraction, ← sum_traceCoeff_smul, map_sum_smul hf, act_traceCoeff] /-- The trace contraction is colour invariant. Nothing constrains the isospin and hypercharge factors, which may well move it. -/ @@ -966,154 +900,60 @@ theorem exists_smul_traceCoeff_of_act_eq {c : (Fin 2 → Fin 8) → ℂ} /-! -## F. An invariant of the span is the contraction of an invariant coefficient +## F. The colour invariants of the span -Give the coefficient functions their standard inner product. The coefficients contracting to -zero form the kernel `K` of the contraction, stable under every `act U` by the -transformation law; and since `act U⁻¹` is the transpose of `act U` and the adjoint matrix -is real, `act U⁻¹` is the adjoint of `act U`, so the orthogonal complement `Kᗮ` is stable -as well. Write the coefficient of an invariant vector `x` as `k + k'` with `k ∈ K` and -`k' ∈ Kᗮ`. Then `x` is the contraction of `k'`, and `act U k' - k'` contracts to -`repGauge (U, 1, 1) x - x = 0` while lying in `Kᗮ`, so it is zero: `k'` is invariant. +The action on coefficients is unitary, by `sum_act_mul` and `act_star`, so +`Family.exists_invariant_coeff` writes a colour invariant of the span as the contraction of +an invariant coefficient, and section E makes that coefficient a multiple of the delta. The +statement is made for any family of linear maps `φ U` obeying the law, not only for the +colour rotations `repGauge (U, 1, 1)`, so that section G can apply it in a quotient. -/ -/-- The action on coefficients commutes with complex conjugation, the adjoint matrix being - real. -/ -lemma act_star (U : specialUnitaryGroup (Fin 3) ℂ) (c : (Fin 2 → Fin 8) → ℂ) : - act U (star c) = star (act U c) := by - funext a - simp [act_apply, star_sum, star_mul', Complex.conj_ofReal] - -/-- The contraction, on the coefficient space with its standard inner product. -/ -noncomputable def contractₗ (hT : IsSU3BiAdjoint B repGauge T) : - EuclideanSpace ℂ (Fin 2 → Fin 8) →ₗ[ℂ] B where - toFun c := hT.contract c.ofLp - map_add' c c' := by simp only [WithLp.ofLp_add, map_add] - map_smul' z c := by simp only [WithLp.ofLp_smul, map_smul, RingHom.id_apply] - -/-- The action on coefficients, on the coefficient space with its standard inner product. -/ -noncomputable def actₗ (U : specialUnitaryGroup (Fin 3) ℂ) : - EuclideanSpace ℂ (Fin 2 → Fin 8) →ₗ[ℂ] EuclideanSpace ℂ (Fin 2 → Fin 8) where - toFun c := WithLp.toLp 2 (act U c.ofLp) - map_add' c c' := by simp only [WithLp.ofLp_add, map_add, WithLp.toLp_add] - map_smul' z c := by - simp only [WithLp.ofLp_smul, map_smul, RingHom.id_apply, WithLp.toLp_smul] - -/-- The transformation law in coefficient form, on the inner product space. -/ -lemma contractₗ_actₗ (hT : IsSU3BiAdjoint B repGauge T) {U : specialUnitaryGroup (Fin 3) ℂ} - {f : B →ₗ[ℂ] B} (hf : IsSU3BiAdjointMat U f T) - (c : EuclideanSpace ℂ (Fin 2 → Fin 8)) : - hT.contractₗ (actₗ U c) = f (hT.contractₗ c) := by - simp only [contractₗ, actₗ, LinearMap.coe_mk, AddHom.coe_mk] - exact (hT.map_contract hf _).symm - -open scoped InnerProductSpace in -/-- The action of `U⁻¹` is the adjoint of the action of `U`. -/ -lemma inner_actₗ (U : specialUnitaryGroup (Fin 3) ℂ) - (a b : EuclideanSpace ℂ (Fin 2 → Fin 8)) : - ⟪a, actₗ U b⟫_ℂ = ⟪actₗ U⁻¹ a, b⟫_ℂ := by - have h := sum_act_mul U b.ofLp (star a.ofLp) - rw [act_star] at h - simpa only [PiLp.inner_apply, RCLike.inner_apply, actₗ, LinearMap.coe_mk, AddHom.coe_mk, - PiLp.toLp_apply, Pi.star_apply, Complex.star_def] using h - -/-- A colour invariant of the span is the contraction of an invariant coefficient. -/ -theorem exists_eq_contract_of_su3_invariant (hT : IsSU3BiAdjoint B repGauge T) {x : B} - (hx : x ∈ hT.span) - (hinv : ∀ U : specialUnitaryGroup (Fin 3) ℂ, repGauge (U, 1, 1) x = x) : - ∃ c : (Fin 2 → Fin 8) → ℂ, x = hT.contract c - ∧ ∀ U : specialUnitaryGroup (Fin 3) ℂ, act U c = c := by - obtain ⟨c, rfl⟩ := (hT.mem_span_iff x).1 hx - rw [← hT.contract_apply] at hinv ⊢ - set K := LinearMap.ker hT.contractₗ with hK - have hKstab : ∀ (V : specialUnitaryGroup (Fin 3) ℂ), ∀ u ∈ K, actₗ V u ∈ K := by - intro V u hu - rw [hK, LinearMap.mem_ker] at hu ⊢ - rw [hT.contractₗ_actₗ (hT.repGauge_T V), hu, map_zero] - obtain ⟨k, hk, k', hk', hkk'⟩ := K.exists_add_mem_mem_orthogonal (WithLp.toLp 2 c) - have hx' : hT.contract c = hT.contractₗ k' := by - have h := congrArg hT.contractₗ hkk' - rw [map_add, LinearMap.mem_ker.1 hk, zero_add] at h - exact h - refine ⟨k'.ofLp, hx', fun U => ?_⟩ - have h1 : actₗ U k' - k' ∈ K := by - rw [hK, LinearMap.mem_ker, map_sub, sub_eq_zero, hT.contractₗ_actₗ (hT.repGauge_T U), - ← hx', hinv] - have h2 : actₗ U k' ∈ Kᗮ := by - rw [Submodule.mem_orthogonal] - intro u hu - rw [inner_actₗ] - exact Submodule.inner_right_of_mem_orthogonal (hKstab _ u hu) hk' - have h3 : actₗ U k' - k' ∈ K ⊓ Kᗮ := ⟨h1, Submodule.sub_mem _ h2 hk'⟩ - rw [Submodule.inf_orthogonal_eq_bot, Submodule.mem_bot, sub_eq_zero] at h3 - exact congrArg WithLp.ofLp h3 +/-- Every invariant in the span of a family obeying the law for a family of linear maps + `φ U` is a multiple of the trace: the one singlet of `8 ⊗ 8`. -/ +theorem exists_smul_sum_diag_of_invariant {φ : specialUnitaryGroup (Fin 3) ℂ → B →ₗ[ℂ] B} + (hT : ∀ U, IsSU3BiAdjointMat U (φ U) T) {x : B} (hx : x ∈ ⨆ d, ℂ ∙ T d) + (hinv : ∀ U, φ U x = x) : + ∃ z : ℂ, x = z • ∑ a : Fin 8, T ![a, a] := by + obtain ⟨c, rfl, hc⟩ := Family.exists_invariant_coeff T φ act + (fun U c => map_sum_smul (hT U) c) + (Family.sum_star_mul_of_transpose act sum_act_mul act_star) hx hinv + obtain ⟨z, hz⟩ := exists_smul_traceCoeff_of_act_eq hc + refine ⟨z, ?_⟩ + rw [hz, ← sum_traceCoeff_smul, Finset.smul_sum] + simp only [Pi.smul_apply, smul_eq_mul, mul_smul] /-- Every colour invariant in the span of the components is a multiple of the trace - contraction: the one singlet of `8 ⊗ 8`. -/ -theorem exists_smul_traceContraction_of_su3_invariant (hT : IsSU3BiAdjoint B repGauge T) {x : B} - (hx : x ∈ hT.span) + contraction. -/ +theorem exists_smul_traceContraction_of_su3_invariant (hT : IsSU3BiAdjoint B repGauge T) + {x : B} (hx : x ∈ hT.span) (hinv : ∀ U : specialUnitaryGroup (Fin 3) ℂ, repGauge (U, 1, 1) x = x) : - ∃ z : ℂ, x = z • hT.traceContraction := by - obtain ⟨c, rfl, hc⟩ := hT.exists_eq_contract_of_su3_invariant hx hinv - obtain ⟨z, hz⟩ := exists_smul_traceCoeff_of_act_eq hc - exact ⟨z, by rw [hz, map_smul, contract_traceCoeff]⟩ + ∃ z : ℂ, x = z • hT.traceContraction := + exists_smul_sum_diag_of_invariant hT.repGauge_T hx hinv /-! ## G. The invariants modulo a stable submodule The Standard Model files handle many families at once and peel them off one at a time, so -the classification of section F is wanted modulo a submodule `S` in which the other families -are parked. A submodule stable under a representation carries the quotient representation -`quotRep`, and the images of the components form a bi-adjoint family for it, with the image -of the trace contraction as trace contraction; so section F applies in the quotient, and -the theorem lifts the result back. Stability of `S` is what makes the quotient -representation exist, and it cannot be dropped: an unstable line has no invariant but `0`, -while its sum with the span may carry invariants outside the span. Only stability under -colour is assumed, which is stability under the colour part `repSU3` of the -representation, and that is the representation the quotient is taken for. +the classification is wanted modulo a submodule `S` in which the other families are parked. +The law descends to the quotient by a colour-stable `S`, so section F applies there, and +`Family.exists_smul_add_of_mem_sup` lifts the result back. -/ -/-- The representation induced on the quotient by a stable submodule. -/ -noncomputable def quotRep (ρ : Representation ℂ GaugeGroupI B) (S : Submodule ℂ B) - (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, ρ g y ∈ S) : - Representation ℂ GaugeGroupI (B ⧸ 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. -/ -lemma quotRep_mkQ {ρ : Representation ℂ GaugeGroupI B} (S : Submodule ℂ B) - (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, ρ g y ∈ S) (g : GaugeGroupI) (y : B) : - quotRep ρ S hS g (S.mkQ y) = S.mkQ (ρ g y) := rfl - -/-- The images of the components in the quotient by a stable submodule form a bi-adjoint - family. -/ -lemma isSU3BiAdjoint_quotRep (hT : IsSU3BiAdjoint B repGauge T) (S : Submodule ℂ B) - (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, repGauge g y ∈ S) : - IsSU3BiAdjoint (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 _ _ _ - -/-- The quotient map carries the trace contraction to the trace contraction of the - images. -/ -lemma mkQ_traceContraction (hT : IsSU3BiAdjoint B repGauge T) (S : Submodule ℂ B) - (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, repGauge g y ∈ S) : - S.mkQ hT.traceContraction = (hT.isSU3BiAdjoint_quotRep S hS).traceContraction := by - simp only [traceContraction, map_sum] +/-- The law descends to the quotient by a submodule stable under the map. -/ +lemma isSU3BiAdjointMat_mapQ {U : specialUnitaryGroup (Fin 3) ℂ} {f : B →ₗ[ℂ] B} + (hf : IsSU3BiAdjointMat U f T) (S : Submodule ℂ B) (hS : ∀ y ∈ S, f y ∈ S) : + IsSU3BiAdjointMat U (S.mapQ S f hS) fun l => S.mkQ (T l) := by + intro l + dsimp only + rw [← LinearMap.comp_apply, Submodule.mapQ_mkQ, LinearMap.comp_apply, hf 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` is a multiple of the trace contraction up to a colour-invariant remainder in `S`. The - remainder is invariant for free, being the difference of two invariants. -/ + `S` is a multiple of the trace contraction up to a colour-invariant remainder in `S`. -/ theorem mem_span_sup_su3_invariant_iff (hT : IsSU3BiAdjoint B repGauge T) (x : B) (S : Submodule ℂ B) (hS : ∀ U : specialUnitaryGroup (Fin 3) ℂ, ∀ y ∈ S, repGauge (U, 1, 1) y ∈ S) @@ -1121,59 +961,18 @@ theorem mem_span_sup_su3_invariant_iff (hT : IsSU3BiAdjoint B repGauge T) (x : B (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 - have hS' : ∀ g : GaugeGroupI, ∀ y ∈ S, repSU3 repGauge g y ∈ S := - (repSU3_stable_iff_su3 repGauge S).2 hS - have hQ := hT.toRepSU3.isSU3BiAdjoint_quotRep S hS' - have hmk : S.mkQ x ∈ hQ.span := by - obtain ⟨u, hu, z, hz, huz⟩ := Submodule.mem_sup.1 hx - obtain ⟨c, hc⟩ := (hT.mem_span_iff u).1 hu - refine (hQ.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 _ _ _ - obtain ⟨c, hc⟩ := hQ.exists_smul_traceContraction_of_su3_invariant hmk - fun U => by rw [quotRep_mkQ, repSU3_apply, hinv] - rw [← hT.toRepSU3.mkQ_traceContraction S hS'] at hc - change S.mkQ x = c • S.mkQ hT.traceContraction at hc - refine ⟨c, x - c • hT.traceContraction, ?_, by abel, fun U => ?_⟩ - · 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 U, hT.repGauge_traceContraction U] + refine Family.exists_smul_add_of_mem_sup T (fun U => repGauge (U, 1, 1)) S hS + hT.traceContraction hT.repGauge_traceContraction (fun x hx hinv => ?_) hx hinv + obtain ⟨z, hz⟩ := exists_smul_sum_diag_of_invariant + (fun U => isSU3BiAdjointMat_mapQ (hT.repGauge_T U) S (hS U)) hx hinv + exact ⟨z, by rw [hz, traceContraction, map_sum]⟩ /-! ## Aside: what other files import from here Nothing from here on is used by the theorem above. Each item exists because another file -imports it under this name, and each says which. `isMulRep_repSU3` and -`repSU3_gaugeSU3Perm` serve the siblings `IsSU3BiFundamental` and `IsSU3FunAntiFun`, which -build the gauge weight decomposition for the colour part of a representation. - --/ - -end IsSU3BiAdjoint - -/-- The colour part of a multiplicative representation is multiplicative. -/ -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 - -/-- The colour part agrees with the representation at the cyclic colour rotation, which is - trivial on isospin and hypercharge. -/ -lemma repSU3_gaugeSU3Perm {B : Type*} [AddCommMonoid B] [Module ℂ B] - (repGauge : Representation ℂ GaugeGroupI B) : - repSU3 repGauge gaugeSU3Perm = repGauge gaugeSU3Perm := rfl - -namespace IsSU3BiAdjoint - -set_option linter.unusedVariables false - -variable {B : Type*} [AddCommGroup B] [Module ℂ B] - {repGauge : Representation ℂ GaugeGroupI B} {T : (Fin 2 → Fin 8) → B} - -/-! +imports it under this name, and each says which. ## Aside: the weight basis of the adjoint, for `MassDimEight` and `IsSU3Adjoint` @@ -1351,6 +1150,35 @@ lemma span_eq_wtSpan : hT.span = hT.wtSpan := by /-! +## Aside: the quotient representation, for `MassDimEight` + +A submodule stable under a representation of the whole gauge group carries the induced +representation on the quotient. The theorem above needs only the induced maps +`Submodule.mapQ`; `MassDimEight` uses the representation. + +-/ + +/-- The representation induced on the quotient by a stable submodule. -/ +noncomputable def quotRep (ρ : Representation ℂ GaugeGroupI B) (S : Submodule ℂ B) + (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, ρ g y ∈ S) : + Representation ℂ GaugeGroupI (B ⧸ 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. -/ +lemma quotRep_mkQ {ρ : Representation ℂ GaugeGroupI B} (S : Submodule ℂ B) + (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, ρ g y ∈ S) (g : GaugeGroupI) (y : B) : + quotRep ρ S hS g (S.mkQ y) = S.mkQ (ρ g y) := rfl + +/-! + ## Aside: the trivial square-zero extension, for `MassDimEight` `MassDimEight` needs a transport in the opposite direction to `quotRep`, from a module to an diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiFundamental.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiFundamental.lean index 699f246b8..6be4bb5cd 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiFundamental.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiFundamental.lean @@ -5,53 +5,29 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.SU3PermDecomposition -public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU3BiAdjoint +public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.Basic /-! # 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. - -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 -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 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 -nothing at all, and `SU3PermDecomposition` has nothing to refine. +A quark carries one fundamental colour index, and a product of two quark fields carries two. +There is no colour singlet in `3 ⊗ 3 = 6 ⊕ 3̄`: a colour singlet needs three quarks, or a +quark and an antiquark, never two quarks. This file proves that fact in the form the +Standard Model files consume, modulo a colour-stable submodule. + +`IsSU3BiFundamental B repGauge T` records the hypothesis: `T` is a family indexed by two +fundamental colour indices and valued in a module `B` carrying a representation of the gauge +group, and a colour rotation `U ∈ SU(3)` moves its components by one factor of `U` per +index. Nothing is asked of the isospin and hypercharge factors. + +The proof is triality. The scalar matrix `ω • 1`, with `ω` a primitive cube root of unity, +lies in `SU(3)` because `ω ^ 3 = 1` is exactly the determinant condition, and it scales a +tensor with `k` fundamental indices by `ω ^ k`. An invariant tensor therefore needs `3 ∣ k`, +and `k = 2` fails: the centre alone scales every component of `T` by `ω ^ 2`, so a colour +invariant of the span equals `ω ^ 2` times itself and vanishes. + +Section A gives the transformation law and the span, section B the centre and the +vanishing of the invariants of the span, and section C the form modulo a stable submodule. -/ @[expose] public section @@ -62,219 +38,79 @@ open Matrix /-! -## A. Bi-fundamental `su(3)` families and the span of their components +## A. The transformation law and 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 `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. -/ +/-- The linear map `f` moves the components of `T` as `U ∈ SU(3)` moves a tensor with two + fundamental indices: one factor of `U` per index. -/ 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: a colour transformation moves the components by the `SU(3)` element it is built - from. Nothing is asked of the isospin or hypercharge factors. -/ +/-- A family `T` of elements of `B`, indexed by two `su(3)` fundamental indices, transforms + as a tensor `T^{a b}` under the colour factor of the gauge group. Nothing is asked of the + isospin and 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 : 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 + +/- `span` takes the hypothesis `hT` only to hang off it by dot notation. -/ 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) - -/-- 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 + {repGauge : Representation ℂ GaugeGroupI B} {T : (Fin 2 → Fin 3) → B} -/-- 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 _)) +/-- The span of the components. -/ +@[nolint unusedArguments] +def span (hT : IsSU3BiFundamental B repGauge T) : Submodule ℂ B := ⨆ d, ℂ ∙ T d -end IsSU3BiFundamental +/-- A vector lies in the span precisely when it is a linear combination of the + components. -/ +lemma mem_span_iff (hT : IsSU3BiFundamental B repGauge T) (x : B) : + x ∈ hT.span ↔ ∃ c : (Fin 2 → Fin 3) → ℂ, x = ∑ d, c d • T d := + Family.mem_iSup_span_singleton_iff T x /-! -## 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 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. +## B. The centre of `SU(3)` forbids an invariant -/ -/-- The primitive cube root of unity has modulus one, so it is inverted by conjugation. -/ +/-- The primitive cube root of unity has modulus one. -/ 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`. -/ +/-- The generator `ω • 1` of the centre `ℤ₃` of `SU(3)`: 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 `ω`. -/ + ⟨Matrix.diagonal fun _ => su3Omega, 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, su3Omega_mul_star, Matrix.diagonal_one] + · rw [Matrix.det_diagonal] + simp⟩ + +/-- The central element is `ω` times the identity. -/ 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: 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)`. -/ -lemma toSU3_gaugeSU3Centre : GaugeGroupI.toSU3 gaugeSU3Centre = su3Centre := rfl - -namespace IsSU3BiFundamental -set_option linter.unusedVariables false + simp [su3Centre, Matrix.diagonal_apply] -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 - -/-- 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. -/ +/-- A map moving the components by the central element scales every one of them by + `ω ^ 2`, one factor of `ω` for each index. -/ lemma map_su3Centre {f : B →ₗ[ℂ] B} (hf : IsSU3BiFundamentalMat su3Centre f T) - (l : Fin 2 → Fin 3) : f (T l) = (su3Omega ^ 2) • T l := by + (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 @@ -289,270 +125,75 @@ lemma map_su3Centre {f : B →ₗ[ℂ] B} (hf : IsSU3BiFundamentalMat su3Centre · intro hl exact absurd (Finset.mem_univ l) hl -/-- 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 +/-- An invariant of the span of a family obeying the law for a family of linear maps + `φ U` is zero: the centre scales the whole span by `ω ^ 2 ≠ 1`. -/ +theorem eq_zero_of_invariant' {φ : specialUnitaryGroup (Fin 3) ℂ → B →ₗ[ℂ] B} + (hT : ∀ U, IsSU3BiFundamentalMat U (φ U) T) {x : B} (hx : x ∈ ⨆ d, ℂ ∙ T d) + (hinv : ∀ U, φ U x = x) : x = 0 := by + obtain ⟨c, rfl⟩ := (Family.mem_iSup_span_singleton_iff T x).1 hx + have hscale : φ su3Centre (∑ 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, 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} + exact Finset.sum_congr rfl fun d _ => by + rw [map_smul, map_su3Centre (hT su3Centre) d, smul_comm] + have hne : su3Omega ^ 2 - 1 ≠ 0 := + sub_ne_zero.2 (su3Omega_isPrimitiveRoot.pow_ne_one_of_pos_of_lt (by norm_num) (by norm_num)) + have h0 : (su3Omega ^ 2 - 1) • ∑ d, c d • T d = 0 := by + rw [sub_smul, one_smul, ← hscale, hinv, sub_self] + have h := congrArg (fun y => (su3Omega ^ 2 - 1)⁻¹ • y) h0 + simp only [smul_zero, inv_smul_smul₀ hne] at h + exact h + +/-- A colour invariant in the span of the components is zero: there is no colour singlet + in `3 ⊗ 3`. -/ +theorem eq_zero_of_su3_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 - -/-! - -## 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 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. - --/ - -namespace IsSU3BiFundamental - -set_option linter.unusedVariables false + (hinv : ∀ U : specialUnitaryGroup (Fin 3) ℂ, repGauge (U, 1, 1) x = x) : x = 0 := + eq_zero_of_invariant' hT.repGauge_T hx hinv /-! -## C.1. The gauge torus in the fundamental representation +## C. The invariants modulo a stable submodule --/ - -/-- 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 +The law descends to the quotient by a colour-stable submodule `S`, section B applies there, +and `Family.exists_smul_add_of_mem_sup` lifts the result back: an invariant of the span +joined with `S` lies in `S`, two fundamental colour indices contributing nothing. -/ -section Weights - -variable {B : Type*} [AddCommGroup B] [Module ℂ B] - {repGauge : Representation ℂ GaugeGroupI B} - {T : (Fin 2 → Fin 3) → B} - -/-- 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, - 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 - -/-- 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 - -/-! - -## 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, 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 (repSU3 repGauge) hT.span := - GaugeWeightDecomposition.copy - (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 - 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, 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), - (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 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. - --/ - -/-- 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 - 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 (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 => ?_⟩ - 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 - -/-- 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 +/-- The law descends to the quotient by a submodule stable under the map. -/ +lemma isSU3BiFundamentalMat_mapQ {U : specialUnitaryGroup (Fin 3) ℂ} {f : B →ₗ[ℂ] B} + (hf : IsSU3BiFundamentalMat U f T) (S : Submodule ℂ B) (hS : ∀ y ∈ S, f y ∈ S) : + IsSU3BiFundamentalMat U (S.mapQ S f hS) fun l => S.mkQ (T l) := by + intro l + dsimp only + rw [← LinearMap.comp_apply, Submodule.mapQ_mkQ, LinearMap.comp_apply, hf 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`. -/ +theorem mem_of_mem_span_sup_su3_invariant (hT : IsSU3BiFundamental 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 + obtain ⟨c, y, hyS, hxy, -⟩ := Family.exists_smul_add_of_mem_sup T + (fun U => repGauge (U, 1, 1)) S hS 0 (fun U => map_zero _) + (fun x hx hinv => ⟨0, by + rw [eq_zero_of_invariant' + (fun U => isSU3BiFundamentalMat_mapQ (hT.repGauge_T U) S (hS U)) hx hinv, zero_smul]⟩) + hx hinv + rwa [hxy, smul_zero, zero_add] + +/-- The colour invariants of the span of the components joined with a colour-stable + submodule are exactly the colour invariants of the submodule. -/ +theorem mem_span_sup_su3_invariant_iff (hT : IsSU3BiFundamental 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 := + ⟨fun ⟨hx, hinv⟩ => ⟨hT.mem_of_mem_span_sup_su3_invariant x S hS hx hinv, hinv⟩, + fun ⟨hx, hinv⟩ => ⟨Submodule.mem_sup_right hx, hinv⟩⟩ end IsSU3BiFundamental diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3FunAntiFun.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3FunAntiFun.lean index 84ded5cc1..06b54571e 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3FunAntiFun.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3FunAntiFun.lean @@ -5,70 +5,38 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.SU3PermDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU3BiAdjoint -public import Mathlib.Algebra.TrivSqZeroExt.Basic /-! -# 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. `IsSU3FunAntiFun` 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. That weakness is what a Yukawa bilinear needs: a colour triplet paired with -an anti-triplet carries hypercharge, so a hypercharge transformation does move its -components, and a law quantified over the whole gauge group would be false of it. - -What stays about `GaugeGroupI` is the bookkeeping of the two decompositions, -`GaugeWeightDecomposition` and `SU3PermDecomposition` being supplied only for -representations of the gauge group. They are built for `repSU3 repGauge` of section A.2, -the colour part of the representation, which is defined where the bi-adjoint case needs it, -in `IsSU3BiAdjoint`, and imported here. A decomposition must know how all four torus -generators act, and of the four only `gaugeTorusGen 0` and `gaugeTorusGen 1` are colour -transformations; the colour part sends the other two to the identity, so the isospin and -hypercharge coordinates of every weight vanish by construction rather than by hypothesis. - -Section A gives the transformation law, the proposition, the colour part of a -representation and the span of the 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 colour invariants. - -Sections E and F put that classification into the form the Yukawa sector needs, where -several colour bilinears are summed and one of them is peeled off at a time. Section E -sheds the algebra structure on the target and the multiplicativity hypothesis on the -representation, by running the classification in the trivial square-zero extension of a -module and pulling it back, and section F divides out a stable submodule, which is where -the families not yet reached are parked; the quotient is a module and no longer an algebra, -which is why section E comes first. Each conclusion is stated twice, once for the colour -factor and once for the whole gauge group, the colour form being what the transformation -law supports on its own and the gauge form asking in addition that the delta contraction be -gauge invariant. +# Gauge tensors carrying a fundamental and an anti-fundamental `su(3)` index + +A quark carries a fundamental colour index and an antiquark an anti-fundamental one, so a +quark-antiquark bilinear, the colour structure of every Yukawa coupling and of every +fermion kinetic term, carries one of each. Here there is a colour singlet, exactly one: +`3 ⊗ 3̄ = 8 ⊕ 1`, and the singlet is the Kronecker delta `δ^a_b`, the colour trace +`∑ a, T ![a, a]` of the bilinear. This file proves that in the form the Standard Model files +consume, modulo a colour-stable submodule. + +`IsSU3FunAntiFun B repGauge T` records the hypothesis: `T` is a family indexed by one +fundamental and one anti-fundamental colour index, valued in a module `B` carrying a +representation of the gauge group, and a colour rotation `U ∈ SU(3)` moves its components +by `U` on the first index and by the complex conjugate of `U` on the second, which is what an +anti-fundamental index means. Nothing is asked of the isospin and hypercharge factors, which +may well move the components: a quark-antiquark bilinear carries hypercharge. + +The proof follows `IsSU3BiAdjoint`. The action on coefficient functions `c ![a, b]` is +`c ↦ U c U†`, unitary, so a colour invariant of the span is the contraction of an invariant +coefficient, by `Family.exists_invariant_coeff`. An invariant coefficient is a `3 × 3` +matrix commuting with every `U ∈ SU(3)`, and two rotations pin it down: the colour parity +fixing a colour `a` and reversing the other two changes the sign of every entry `c ![a, b]` +with `b ≠ a`, so the matrix is diagonal, and the cyclic permutation of the colours equates +the diagonal entries. So the matrix is a multiple of the identity and the vector a multiple +of the trace. The delta uses only unitarity, `U * star U = 1`, so it is an invariant of +`U(3)` and not merely of `SU(3)`; the epsilon of `IsSU2BiFundamental` uses the determinant. + +Section A gives the transformation law and the span, section B the action on coefficients +and the delta contraction, section C the classification of invariant coefficients, section +D the invariants of the span, and section E the form modulo a stable submodule. -/ @[expose] public section @@ -79,150 +47,100 @@ open Matrix ComplexConjugate /-! -## A. Mixed `su(3)` families and the span of their components - -A fundamental colour index and an anti-fundamental one are acted on by the `SU(3)` factor -of the gauge group alone. A.1 phrases the transformation law through the fundamental matrix -of an `SU(3)` element and nothing else, so that no other factor of the gauge group appears -in the law, and A.2 reads a representation of the gauge group at its colour factor, which -is what carries the two decompositions of sections C and D. - -## A.1. The transformation law and the proposition - -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 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. That is what a Yukawa bilinear needs, its components carrying hypercharge. -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. +## A. The transformation law and the span of the components -/ -/-- 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. -/ +/-- The linear map `f` moves the components of `T` as `U ∈ SU(3)` moves a tensor with one + fundamental and one anti-fundamental index: a factor of `U` for the first index and a + factor of `conj U` for the second. -/ 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: a colour transformation moves the components by the - `SU(3)` element it is built from. Nothing is asked of the isospin or hypercharge - factors. -/ +/-- A family `T` of elements of `B`, indexed by one `su(3)` fundamental and one + anti-fundamental index, transforms as a tensor `T^{a}{}_{b}` under the colour factor of + the gauge group. Nothing is asked of the isospin and hypercharge factors. -/ structure IsSU3FunAntiFun (B : Type*) [AddCommMonoid B] [Module ℂ B] (repGauge : Representation ℂ GaugeGroupI B) (T : (Fin 2 → Fin 3) → B) : Prop where repGauge_T : ∀ g : specialUnitaryGroup (Fin 3) ℂ, IsSU3FunAntiFunMat 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 mixed family for `repGauge` is -a mixed family for `repSU3 repGauge`, with the same span and the same delta contraction, -which is `toRepSU3`. - -That transport is what carries sections C and D, whose two decompositions need 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 IsSU3FunAntiFun -set_option linter.unusedVariables false variable {B : Type*} [AddCommGroup B] [Module ℂ B] {repGauge : Representation ℂ GaugeGroupI B} - {U : specialUnitaryGroup (Fin 3) ℂ} {f : B →ₗ[ℂ] B} -/-- A mixed family for a representation is a mixed family for its colour part: the - transformation law reads only the colour factor to begin with. The span and the delta - 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 {T : (Fin 2 → Fin 3) → B} (hT : IsSU3FunAntiFun B repGauge T) : - IsSU3FunAntiFun B (repSU3 repGauge) T where - repGauge_T g := hT.repGauge_T g - -/-- The span of all the components of a family indexed by one `su(3)` fundamental colour - index and one anti-fundamental one. -/ +/-- The span of the components. -/ 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. -/ +/-- A vector lies in the span precisely when it is a linear combination of the + components. -/ 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 _)) + x ∈ span T ↔ ∃ c : (Fin 2 → Fin 3) → ℂ, x = ∑ d, c d • T d := + Family.mem_iSup_span_singleton_iff T x /-- 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 _) + Family.mem_iSup_span_singleton T d -/-! +/-- A sum over pairs of 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] := + Family.sum_pi_two F -## 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)`. +## B. The action on coefficients and the delta contraction -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, colour invariance being that statement read at the colour transformation `(U, 1, 1)`. +A coefficient function on pairs of colour indices is a `3 × 3` matrix `c ![a, b]`, and the +law says a colour rotation moves the contraction `∑ l, c l • T l` by `c ↦ U c U†`, the +action `act U`. Since `U⁻¹ = U†`, the action of `U⁻¹` is the adjoint of the action of `U`, +which is the hypothesis of `Family.exists_invariant_coeff`. The Kronecker delta is an +invariant coefficient because the rows of a unitary matrix are orthonormal, and the delta +contraction, the trace `∑ a, T ![a, a]`, is colour invariant for that reason. -/ -/-- 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. -/ +/-- The action of `U ∈ SU(3)` on coefficient functions, `c ↦ U c U†`. -/ +noncomputable def act (U : specialUnitaryGroup (Fin 3) ℂ) : + ((Fin 2 → Fin 3) → ℂ) →ₗ[ℂ] (Fin 2 → Fin 3) → ℂ := + Matrix.toLin' (Matrix.of fun a l => U.1 (a 0) (l 0) * conj (U.1 (a 1) (l 1))) + +/-- The action on coefficients, written out. -/ +lemma act_apply (U : specialUnitaryGroup (Fin 3) ℂ) (c : (Fin 2 → Fin 3) → ℂ) + (a : Fin 2 → Fin 3) : + act U c a = ∑ l, (U.1 (a 0) (l 0) * conj (U.1 (a 1) (l 1))) * c l := by + simp [act, Matrix.mulVec, dotProduct] + +/-- The transformation law in coefficient form. -/ +lemma map_sum_smul {T : (Fin 2 → Fin 3) → B} {U : specialUnitaryGroup (Fin 3) ℂ} + {f : B →ₗ[ℂ] B} (hf : IsSU3FunAntiFunMat U f T) (c : (Fin 2 → Fin 3) → ℂ) : + f (∑ l, c l • T l) = ∑ a, act U c a • T a := by + simp only [map_sum, map_smul, act_apply, Finset.sum_smul] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun l _ => ?_ + rw [hf l, Finset.smul_sum] + exact Finset.sum_congr rfl fun a _ => by rw [smul_smul, mul_comm] + +/-- The inverse of a special unitary matrix is its conjugate transpose. -/ +lemma inv_apply (U : specialUnitaryGroup (Fin 3) ℂ) (a b : Fin 3) : + (U⁻¹).1 a b = conj (U.1 b a) := by + rw [← Matrix.star_eq_inv, Matrix.specialUnitaryGroup.coe_star, Matrix.star_apply] + rfl + +/-- The action of `U⁻¹` is the adjoint of the action of `U`. -/ +lemma sum_star_mul_act (U : specialUnitaryGroup (Fin 3) ℂ) (c d : (Fin 2 → Fin 3) → ℂ) : + ∑ a, star (c a) * act U d a = ∑ l, star (act U⁻¹ c l) * d l := by + simp only [act_apply, inv_apply, Finset.mul_sum, Finset.sum_mul, star_sum, star_mul', + Complex.star_def, Complex.conj_conj] + rw [Finset.sum_comm] + exact Finset.sum_congr rfl fun l _ => Finset.sum_congr rfl fun a _ => by ring + +/-- The rows of a unitary matrix are orthonormal. -/ 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 @@ -232,887 +150,180 @@ lemma sum_mul_conj (U : specialUnitaryGroup (Fin 3) ℂ) (b c : Fin 3) : 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. -/ +/-- The Kronecker delta on pairs of colour indices: the coefficients of the trace. -/ +def deltaCoeff : (Fin 2 → Fin 3) → ℂ := fun l => if l 0 = l 1 then 1 else 0 + +/-- The Kronecker delta is an invariant coefficient. -/ +lemma act_deltaCoeff (U : specialUnitaryGroup (Fin 3) ℂ) : act U deltaCoeff = deltaCoeff := by + funext a + rw [act_apply, sum_pi_two] + have key : ∀ x y : Fin 3, + (U.1 (a 0) (![x, y] 0) * conj (U.1 (a 1) (![x, y] 1))) * deltaCoeff ![x, y] + = if y = x then U.1 (a 0) x * conj (U.1 (a 1) x) else 0 := by + intro x y + by_cases h : y = x + · subst h + simp [deltaCoeff] + · simp [deltaCoeff, h, Ne.symm h] + simp only [key, Finset.sum_ite_eq', Finset.mem_univ, if_true, sum_mul_conj] + simp [deltaCoeff] + +/-- The delta contraction: the colour trace of the family. -/ 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 +/-- The delta contraction is the contraction against the Kronecker delta. -/ +lemma sum_deltaCoeff_smul (T : (Fin 2 → Fin 3) → B) : + ∑ l, deltaCoeff l • T l = deltaContraction T := by rw [sum_pi_two] - simp [deltaContraction] + simp [deltaCoeff, deltaContraction, ite_smul] /-- 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 _ + sum_mem fun _ _ => 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) : +/-- Any map moving the components by an element of `SU(3)` fixes the delta contraction. -/ +lemma map_deltaContraction {T : (Fin 2 → Fin 3) → B} {U : specialUnitaryGroup (Fin 3) ℂ} + {f : B →ₗ[ℂ] 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] + rw [← sum_deltaCoeff_smul, map_sum_smul hf, act_deltaCoeff] -/-- The delta contraction of a mixed family is fixed by the colour factor: a colour - transformation moves the components by the `SU(3)` element it is built from, which fixes - the contraction. That is all the transformation law constrains, the isospin and - hypercharge factors being free to move the contraction. -/ +/-- The delta contraction is colour invariant. Nothing constrains the isospin and + hypercharge factors, which may well move it. -/ lemma repGauge_deltaContraction {T : (Fin 2 → Fin 3) → B} (hT : IsSU3FunAntiFun B repGauge T) (U : specialUnitaryGroup (Fin 3) ℂ) : repGauge (U, 1, 1) (deltaContraction T) = deltaContraction T := map_deltaContraction (hT.repGauge_T U) -/-- The cyclic Weyl element of the gauge group moves the components by the cyclic Weyl - element of `SU(3)`, being the colour transformation built from it. -/ -lemma isSU3FunAntiFunMat_gaugeSU3Perm {T : (Fin 2 → Fin 3) → B} - (hT : IsSU3FunAntiFun B repGauge T) : - IsSU3FunAntiFunMat su3Perm (repGauge gaugeSU3Perm) T := - hT.repGauge_T su3Perm - -/-! - -## 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 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 rather than by hypothesis, which is why -`gaugeWeightDecomposition_supp` still lists only weights 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 `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 - --/ - -/-- Any linear map moving the components of a mixed family by the colour part of a torus - generator scales every one of them by the character of the weight of its upper index minus - that of its lower one. -/ -lemma map_gaugeTorusGen {T : (Fin 2 → Fin 3) → B} {i : Fin 4} - (hf : IsSU3FunAntiFunMat (GaugeGroupI.toSU3 (gaugeTorusGen i)) f T) - (l : Fin 2 → Fin 3) : - f (T l) = ((expI : ℂ) ^ GaugeWeight.coord (wtWeight l) i) • T l := by - rw [map_of_diagonal hf (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] - -/-- Every component of a mixed family is a simultaneous eigenvector of the gauge torus for - the colour part of the representation, at the character of the weight of its upper index - minus that of its lower one. -/ -lemma repSU3_gaugeTorusGen {T : (Fin 2 → Fin 3) → B} - (hT : IsSU3FunAntiFun 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 mixed family by the - character of the weight of its upper index minus that of its lower one. This is - `repSU3_gaugeTorusGen` with the colour transformation spelled out. -/ -lemma repGauge_gaugeTorusGen {T : (Fin 2 → Fin 3) → B} - (hT : IsSU3FunAntiFun 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 - -/-! - -## 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, 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 weight of its upper index minus that of its lower one. - - 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 : IsSU3FunAntiFun B repGauge T) - (hmul : IsMulRep repGauge) : GaugeWeightDecomposition (repSU3 repGauge) (span T) := - GaugeWeightDecomposition.copy - (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 - -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, 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), - (-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 +## C. An invariant coefficient is a multiple of the Kronecker delta -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. 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. +The colour parity fixing the colour `k` and reversing the other two is the diagonal matrix +with entries `±1`, so it multiplies `c ![a, b]` by the product of the signs of `a` and `b`, +which is `-1` whenever exactly one of them is `k`: taking `k = a` kills every entry off the +diagonal. The cyclic permutation `su3Perm` of the colours carries `c ![a, a]` to +`c ![a + 1, a + 1]`, so the diagonal entries agree. -/ -/-- 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 fixed by the colour factor, - so in particular the colour part of the representation fixes it at the torus. -/ -lemma deltaContraction_mem_piece_zero (hmul : IsMulRep repGauge) : - deltaContraction T ∈ (hT.gaugeWeightDecomposition hmul).piece 0 := - GaugeWeightDecomposition.mem_zero_of_invariant _ (deltaContraction_mem_span T) - ((repSU3_invariant_iff_su3 repGauge _).2 (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`. - -Like the gauge weight decomposition the grading is read for `repSU3 repGauge`, the colour -part of the representation, which is where the transformation law constrains every gauge -transformation. The cyclic Weyl element is itself a colour transformation, so the two -representations agree at it outright, which is `repSU3_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 colour 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 `⊥`. The gauge form -`exists_smul_deltaContraction_of_invariant` follows at once, a gauge invariant being in -particular fixed by the colour factor. - --/ +/-- The entries of a colour parity. -/ +lemma su3Parity_apply (k a b : Fin 3) : + (IsSU3BiAdjoint.su3Parity k).1 a b = if a = b then (if a = k then 1 else -1) else 0 := by + simp [IsSU3BiAdjoint.su3Parity, Matrix.diagonal_apply] + +/-- A colour parity multiplies an entry by the product of the signs of its two indices. -/ +lemma act_su3Parity (k : Fin 3) (c : (Fin 2 → Fin 3) → ℂ) (a b : Fin 3) : + act (IsSU3BiAdjoint.su3Parity k) c ![a, b] + = (if a = k then 1 else -1) * (if b = k then 1 else -1) * c ![a, b] := by + rw [act_apply, sum_pi_two, Finset.sum_eq_single a, Finset.sum_eq_single b] + · simp [su3Parity_apply, apply_ite conj] + · intro y _ hy + simp [su3Parity_apply, Ne.symm hy] + · simp + · intro x _ hx + simp [su3Parity_apply, Ne.symm hx] + · simp + +/-- The cyclic permutation carries the first diagonal entry to the second. -/ +lemma act_su3Perm_one_one (c : (Fin 2 → Fin 3) → ℂ) : + act su3Perm c ![1, 1] = c ![0, 0] := by + rw [act_apply, sum_pi_two] + simp [su3Perm_coe, Fin.sum_univ_three] + +/-- The cyclic permutation carries the second diagonal entry to the third. -/ +lemma act_su3Perm_two_two (c : (Fin 2 → Fin 3) → ℂ) : + act su3Perm c ![2, 2] = c ![1, 1] := by + rw [act_apply, sum_pi_two] + simp [su3Perm_coe, Fin.sum_univ_three] + +/-- An invariant coefficient is a multiple of the Kronecker delta. -/ +theorem exists_smul_deltaCoeff_of_act_eq {c : (Fin 2 → Fin 3) → ℂ} + (hc : ∀ U : specialUnitaryGroup (Fin 3) ℂ, act U c = c) : + ∃ z : ℂ, c = z • deltaCoeff := by + have hoff : ∀ a b : Fin 3, a ≠ b → c ![a, b] = 0 := by + intro a b hab + have h := congrFun (hc (IsSU3BiAdjoint.su3Parity a)) ![a, b] + rw [act_su3Parity, if_pos rfl, if_neg (Ne.symm hab)] at h + linear_combination (-1 / 2 : ℂ) * h + have hdiag : ∀ a : Fin 3, c ![a, a] = c ![0, 0] := by + have h1 := congrFun (hc su3Perm) ![1, 1] + have h2 := congrFun (hc su3Perm) ![2, 2] + rw [act_su3Perm_one_one] at h1 + rw [act_su3Perm_two_two] at h2 + intro a + have ha : a = 0 ∨ a = 1 ∨ a = 2 := by + revert a + decide + rcases ha with rfl | rfl | rfl + · rfl + · exact h1.symm + · rw [← h2, ← h1] + refine ⟨c ![0, 0], funext fun l => ?_⟩ + obtain ⟨a, b, rfl⟩ : ∃ a b, l = ![a, b] := ⟨l 0, l 1, by ext i; fin_cases i <;> rfl⟩ + by_cases h : a = b + · subst h + simp [deltaCoeff, hdiag] + · simp [deltaCoeff, h, hoff a b h] /-! -## D.1. The cyclic Weyl element on the diagonal components +## D. The colour invariants of the span -/ -/-- 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] - refine Module.End.mem_eigenspace_iff.mpr ?_ - rw [su3PermSign_zero, one_smul] - exact repGauge_deltaContraction hT su3Perm - · rw [zeroPiece_one, Submodule.span_singleton_le_iff_mem] - exact Module.End.mem_eigenspace_iff.mpr - (by rw [su3PermSign_one, map_su3Perm_octetOne hT.isSU3FunAntiFunMat_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.isSU3FunAntiFunMat_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, for the colour part of the representation: 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 (repSU3 repGauge) ((hT.gaugeWeightDecomposition hmul).piece 0) where - piece := zeroPiece T - piece_le k x hx := by - rw [repSU3_gaugeSU3Perm] - 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 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 fixed by the colour factor, - 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) - ((repSU3_invariant_iff_su3 repGauge _).2 (repGauge_deltaContraction hT)) +/-- Every invariant in the span of a family obeying the law for a family of linear maps + `φ U` is a multiple of the delta contraction: the one singlet of `3 ⊗ 3̄`. -/ +theorem exists_smul_deltaContraction_of_invariant' {T : (Fin 2 → Fin 3) → B} + {φ : specialUnitaryGroup (Fin 3) ℂ → B →ₗ[ℂ] B} + (hT : ∀ U, IsSU3FunAntiFunMat U (φ U) T) {x : B} (hx : x ∈ span T) + (hinv : ∀ U, φ U x = x) : + ∃ z : ℂ, x = z • deltaContraction T := by + obtain ⟨c, rfl, hc⟩ := Family.exists_invariant_coeff T φ act + (fun U c => map_sum_smul (hT U) c) sum_star_mul_act hx hinv + obtain ⟨z, hz⟩ := exists_smul_deltaCoeff_of_act_eq hc + refine ⟨z, ?_⟩ + rw [hz, ← sum_deltaCoeff_smul, Finset.smul_sum] + simp only [Pi.smul_apply, smul_eq_mul, mul_smul] /-- Every colour 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. Only the colour factor is used, which is all the transformation law constrains. 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_su3_invariant (hT : IsSU3FunAntiFun B repGauge T) - (hmul : IsMulRep repGauge) {x : B} (hx : x ∈ span T) + contraction. -/ +theorem exists_smul_deltaContraction_of_su3_invariant {T : (Fin 2 → Fin 3) → B} + (hT : IsSU3FunAntiFun B repGauge T) {x : B} (hx : x ∈ span T) (hinv : ∀ U : specialUnitaryGroup (Fin 3) ℂ, repGauge (U, 1, 1) x = x) : - ∃ c : ℂ, x = c • deltaContraction T := by - have hinv' : ∀ g : GaugeGroupI, repSU3 repGauge g x = x := - (repSU3_invariant_iff_su3 repGauge x).2 hinv - 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⟩ - -/-- Every gauge invariant in the span of the components is a multiple of the delta - 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_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 := - hT.exists_smul_deltaContraction_of_su3_invariant hmul hx fun U => hinv (U, 1, 1) - -end Grading + ∃ z : ℂ, x = z • deltaContraction T := + exists_smul_deltaContraction_of_invariant' hT.repGauge_T hx hinv /-! -## E. The classification for a family valued in a module - -Section D states the classification for a family valued in an algebra, and asks that the -representation act by algebra maps. The conclusion needs neither. A mixed `su(3)` family -is a family of vectors and the delta contraction is a sum of them; the algebra structure -and `IsMulRep` are there only because the gauge weight decomposition and the `SU(3)` -permutation decomposition are set up in an algebra, `IsMulRep` being a statement about a -multiplication. - -The gap closes once and for all through the trivial square-zero extension -`TrivSqZeroExt ℂ M` of a module `M`, a commutative `ℂ`-algebra built from the module -structure alone in which the product of two module elements is zero. A representation of -the gauge group on `M` extends to it by acting trivially on the scalar part, and that -extension acts by algebra maps for free, its product being built from the module structure -the representation is linear for. So section D applies in the extension, and -`TrivSqZeroExt.inr` carries the transformation law, the span and the delta contraction -into it and, being injective, brings the conclusion back to `M`. That is -`exists_smul_deltaContraction_of_invariant_module` and its colour companion -`exists_smul_deltaContraction_of_su3_invariant_module`, which are section D with the -algebra structure and the multiplicativity hypothesis both removed, and they are the form -section F divides a submodule out of. `su3_invariant_iff_invariant` closes the section by -reading the classification backwards: inside the span, and once the delta contraction is -known to be gauge invariant, a vector fixed by the colour factor is fixed by the whole -gauge group, which is the bridge a peeling argument crosses when the families are only -colour-covariant and the submodule they are parked in is gauge-stable. +## E. The invariants modulo a stable submodule -/ -section SquareZero - -variable {M : Type*} [AddCommGroup M] [Module ℂ M] - {ρ : Representation ℂ GaugeGroupI M} {T : (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 family carrying - one fundamental and one anti-fundamental colour index. -/ -lemma isSU3FunAntiFun_sqZeroRep (hT : IsSU3FunAntiFun M ρ T) : - IsSU3FunAntiFun (TrivSqZeroExt ℂ M) (sqZeroRep ρ) fun l => TrivSqZeroExt.inr (T l) where - repGauge_T g l := by - rw [sqZeroRep_inr, hT.repGauge_T g l] - simp only [TrivSqZeroExt.inr_sum, TrivSqZeroExt.inr_smul] - -omit [Module ℂ M] in -/-- The delta contraction of the images is the image of the delta contraction, both being - the sum of the three diagonal components. -/ -lemma deltaContraction_sqZeroRep (T : (Fin 2 → Fin 3) → M) : - deltaContraction (fun l => TrivSqZeroExt.inr (R := ℂ) (T l)) - = TrivSqZeroExt.inr (deltaContraction T) := by - simp only [deltaContraction, TrivSqZeroExt.inr_sum] - -/-- The image of an element of the span lies in the span of the images. -/ -lemma inr_mem_span_sqZeroRep {x : M} (hx : x ∈ span T) : - TrivSqZeroExt.inr (R := ℂ) x ∈ span fun l => TrivSqZeroExt.inr (R := ℂ) (T l) := by - obtain ⟨c, rfl⟩ := (mem_span_iff x).1 hx - refine (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 delta - 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_deltaContraction_of_invariant_module (hT : IsSU3FunAntiFun M ρ T) {x : M} - (hx : x ∈ span T) (hinv : ∀ g : GaugeGroupI, ρ g x = x) : - ∃ c : ℂ, x = c • deltaContraction T := by - obtain ⟨c, hc⟩ := exists_smul_deltaContraction_of_invariant hT.isSU3FunAntiFun_sqZeroRep - (isMulRep_sqZeroRep ρ) (inr_mem_span_sqZeroRep hx) - (fun g => by rw [sqZeroRep_inr, hinv g]) - refine ⟨c, TrivSqZeroExt.inr_injective (R := ℂ) ?_⟩ - rw [hc, deltaContraction_sqZeroRep, TrivSqZeroExt.inr_smul] - -/-- The same classification for a family valued in a mere module, read at the colour factor - alone, which is all the transformation law constrains. -/ -lemma exists_smul_deltaContraction_of_su3_invariant_module (hT : IsSU3FunAntiFun M ρ T) - {x : M} (hx : x ∈ span T) - (hinv : ∀ V : specialUnitaryGroup (Fin 3) ℂ, ρ (V, 1, 1) x = x) : - ∃ c : ℂ, x = c • deltaContraction T := - hT.toRepSU3.exists_smul_deltaContraction_of_invariant_module hx - ((repSU3_invariant_iff_su3 ρ x).2 hinv) - -/-- Inside the span of the components the two notions of invariance agree, provided the - delta 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 delta contraction. The hypothesis `hdc` is exactly what the transformation law no - longer supplies, and without it the statement is false, the isospin and hypercharge - factors being unconstrained. It is stated here rather than in section D because the - square-zero extension has already shed the algebra structure and the multiplicativity - hypothesis, and a peeling argument crosses between the two notions in a quotient, which - carries neither. -/ -lemma su3_invariant_iff_invariant (hT : IsSU3FunAntiFun M ρ T) - (hdc : ∀ g : GaugeGroupI, ρ g (deltaContraction T) = deltaContraction T) - {x : M} (hx : x ∈ span T) : - (∀ V : specialUnitaryGroup (Fin 3) ℂ, ρ (V, 1, 1) x = x) - ↔ ∀ g : GaugeGroupI, ρ g x = x := by - refine ⟨fun h g => ?_, fun h V => h (V, 1, 1)⟩ - obtain ⟨c, rfl⟩ := hT.exists_smul_deltaContraction_of_su3_invariant_module hx h - rw [map_smul, hdc] - -end SquareZero - -/-! - -## F. The invariants modulo a stable submodule - -A gauge-stable submodule `S` can be divided out. The quotient `B ⧸ S` carries the induced -representation `quotRep`, the images of the components are a mixed `su(3)` family for it -again, and their span is the image of the span, so section E applies verbatim there and -lifts to a classification modulo `S`: an invariant of `span T ⊔ S` is a multiple of the -delta contraction up to an error in `S`, and the error is invariant as well, being the -difference of two invariants. - -That is the form a peeling argument wants. Several families are summed, one is classified, -and the ones not yet reached are adjoined to `S`; the quotient is only a module, which is -why section E had to shed the algebra structure first. Stability of `S` is needed and not -just convenient: it is what makes the quotient representation exist, and without it the -statement fails, since for an unstable line `ℂ ∙ v` the only invariant of the line is `0` -while an invariant of the sum may lie outside the span. - -`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 delta contraction be -gauge invariant, and cannot do without it: the law constrains the colour factor only, so -the isospin and hypercharge factors may scale the contraction, and that hypothesis is what -makes the error term a gauge invariant rather than merely a colour invariant. Where the two -factors do fix it, as they do for a colour bilinear whose hypercharges cancel, it is -supplied from the transformation law of the underlying fields. - --/ - -section Quotient - -variable {T : (Fin 2 → Fin 3) → B} - -/-- The representation induced on the quotient by a gauge-stable submodule. -/ -noncomputable def quotRep (repGauge : Representation ℂ GaugeGroupI B) (S : Submodule ℂ B) - (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, repGauge g y ∈ S) : - Representation ℂ GaugeGroupI (B ⧸ S) where - toFun g := S.mapQ S (repGauge 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 ℂ B) (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, repGauge g y ∈ S) - (g : GaugeGroupI) (y : B) : quotRep repGauge S hS g (S.mkQ y) = S.mkQ (repGauge g y) := rfl - -/-- The images of the components in the quotient by a gauge-stable submodule again form a - family carrying one fundamental and one anti-fundamental colour index. -/ -lemma isSU3FunAntiFun_quotRep (hT : IsSU3FunAntiFun B repGauge T) (S : Submodule ℂ B) - (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, repGauge g y ∈ S) : - IsSU3FunAntiFun (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 _ _ _ - -/-- The quotient map carries the delta contraction to the delta contraction of the - images, both being the sum of the three diagonal components. -/ -lemma mkQ_deltaContraction (T : (Fin 2 → Fin 3) → B) (S : Submodule ℂ B) : - S.mkQ (deltaContraction T) = deltaContraction fun l => S.mkQ (T l) := by - simp only [deltaContraction, map_sum] - -/-- The class of an element of the span lies in the span of the classes. -/ -lemma mkQ_mem_span_quotRep {x : B} (S : Submodule ℂ B) (hx : x ∈ span T) : - S.mkQ x ∈ span fun l => S.mkQ (T l) := by - obtain ⟨c, rfl⟩ := (mem_span_iff x).1 hx - refine (mem_span_iff _).2 ⟨c, ?_⟩ - rw [map_sum] - exact Finset.sum_congr rfl fun d _ => map_smul _ _ _ - -/-- The gauge invariants of the span of the components together with a gauge-stable - submodule `S`: such an element is a multiple of the delta 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 mixed family again and the target is only a module, which is what section E prepared - for. This is the form in which one family at a time is peeled off a join of families. - - The gauge invariance `hdc` of the delta contraction is a hypothesis because the - transformation law does not supply it: the law constrains the colour factor only, so the - isospin and hypercharge factors may scale the contraction, and it is what makes the error - term a gauge invariant rather than merely a colour invariant. -/ -lemma mem_span_sup_invariant_iff (hT : IsSU3FunAntiFun B repGauge T) - (x : B) (S : Submodule ℂ B) - (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, repGauge g y ∈ S) - (hdc : ∀ g : GaugeGroupI, repGauge g (deltaContraction T) = deltaContraction T) - (hx : x ∈ span T ⊔ S) - (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : - ∃ c : ℂ, ∃ y ∈ S, x = c • deltaContraction T + y - ∧ ∀ g : GaugeGroupI, repGauge g y = y := by - have hmk : S.mkQ x ∈ span fun l => S.mkQ (T l) := by - obtain ⟨u, hu, z, hz, huz⟩ := Submodule.mem_sup.1 hx - rw [← huz, map_add, show S.mkQ z = 0 from (Submodule.Quotient.mk_eq_zero S).2 hz, - add_zero] - exact mkQ_mem_span_quotRep S hu - 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.isSU3FunAntiFun_quotRep S hS).exists_smul_deltaContraction_of_invariant_module hmk hinv' - rw [← mkQ_deltaContraction T S] at hc - refine ⟨c, x - c • deltaContraction T, ?_, by abel, fun g => ?_⟩ - · have hker : x - c • deltaContraction T ∈ 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, hdc 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 delta - contraction up to an error in `S`, and the error is fixed by the colour factor too. This - is the form the transformation law supports on its own, no invariance of the delta - contraction having to be assumed, since `repGauge_deltaContraction` supplies invariance - under the colour factor outright. -/ -lemma mem_span_sup_su3_invariant_iff (hT : IsSU3FunAntiFun B repGauge T) - (x : B) (S : Submodule ℂ B) +/-- The law descends to the quotient by a submodule stable under the map. -/ +lemma isSU3FunAntiFunMat_mapQ {T : (Fin 2 → Fin 3) → B} {U : specialUnitaryGroup (Fin 3) ℂ} + {f : B →ₗ[ℂ] B} (hf : IsSU3FunAntiFunMat U f T) (S : Submodule ℂ B) + (hS : ∀ y ∈ S, f y ∈ S) : + IsSU3FunAntiFunMat U (S.mapQ S f hS) fun l => S.mkQ (T l) := by + intro l + dsimp only + rw [← LinearMap.comp_apply, Submodule.mapQ_mkQ, LinearMap.comp_apply, hf 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` is a multiple of the delta contraction up to a colour-invariant remainder in `S`. -/ +theorem mem_span_sup_su3_invariant_iff {T : (Fin 2 → Fin 3) → B} + (hT : IsSU3FunAntiFun B repGauge T) (x : B) (S : Submodule ℂ B) (hS : ∀ U : specialUnitaryGroup (Fin 3) ℂ, ∀ y ∈ S, repGauge (U, 1, 1) y ∈ S) (hx : x ∈ span T ⊔ S) (hinv : ∀ U : specialUnitaryGroup (Fin 3) ℂ, repGauge (U, 1, 1) x = x) : ∃ c : ℂ, ∃ y ∈ S, x = c • deltaContraction T + 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 x S - ((repSU3_stable_iff_su3 repGauge S).2 hS) - ((repSU3_invariant_iff_su3 repGauge _).2 (repGauge_deltaContraction hT)) hx - ((repSU3_invariant_iff_su3 repGauge x).2 hinv) - exact ⟨c, y, hyS, hxy, (repSU3_invariant_iff_su3 repGauge y).1 hyinv⟩ - -end Quotient + refine Family.exists_smul_add_of_mem_sup T (fun U => repGauge (U, 1, 1)) S hS + (deltaContraction T) (repGauge_deltaContraction hT) (fun x hx hinv => ?_) hx hinv + obtain ⟨z, hz⟩ := exists_smul_deltaContraction_of_invariant' + (fun U => isSU3FunAntiFunMat_mapQ (hT.repGauge_T U) S (hS U)) hx hinv + exact ⟨z, by rw [hz, deltaContraction, deltaContraction, map_sum]⟩ end IsSU3FunAntiFun diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsU1BiAdjoint.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsU1BiAdjoint.lean index 488c300ea..8194bb4f4 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsU1BiAdjoint.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsU1BiAdjoint.lean @@ -5,45 +5,35 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.GaugeAlgebra.Basis -public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition +public import Physlib.Particles.StandardModel.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.Basic public import Mathlib.RepresentationTheory.Invariants /-! # 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 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_repU1Factor_invariants`, for `repU1Factor 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. +The hypercharge field strength `B` carries one `u(1)` adjoint index, and a product of two +field strengths carries two. The `u(1)` factor of the gauge group is abelian, so its adjoint +action on its own Lie algebra is trivial: a hypercharge rotation leaves every component of +such a product alone, and every combination of the components is a hypercharge invariant. +This is the companion of `IsSU2BiAdjoint` and `IsSU3BiAdjoint` for the third factor of the +gauge group, and it is the degenerate case: the index takes a single value, the adjoint +matrix is the one by one matrix `1`, and the trace contraction is the one component. + +`IsU1BiAdjoint B repGauge T` records the hypothesis, in the same shape as its companions so +that the three factors can be treated alike: `T` is a family indexed by two `u(1)` adjoint +indices and valued in a module `B` carrying a representation of the gauge group, and a +hypercharge rotation `u ∈ U(1)` moves its components by two copies of the adjoint matrix of +`u`, which is to say not at all. Nothing is asked of the colour and isospin factors. + +The theorem, `span_le_invariants`, says that the span of the components consists of gauge +invariants once the law is known at every gauge element and not only at the hypercharge +ones. That hypothesis cannot be dropped: `IsU1BiAdjoint` says nothing about the colour and +isospin factors, which may move the components. Where they do not, as for the hypercharge +field strengths of `IsGaugeSector`, the hypothesis is supplied by the transformation law of +the underlying field. + +Section A gives the adjoint matrix and the transformation law, section B the span and the +trace contraction, and section C the invariance of the span. -/ @[expose] public section @@ -54,19 +44,12 @@ open Matrix /-! -## A. The `U(1)` adjoint matrix and bi-adjoint families +## A. The adjoint action of `U(1)` on a hypercharge index -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 `u(1)` factor is abelian, so it acts trivially on its own algebra and the adjoint matrix +is the one by one matrix `1`, whatever the element of `U(1)`. The transformation law is +recorded with one factor of that matrix per index, exactly as for the other two factors, and +`isU1BiAdjointMat_iff` reads it as the statement that the map fixes every component. -/ @@ -79,44 +62,9 @@ def u1AdjointMatrix (_u : unitary ℂ) : Matrix (Fin 1) (Fin 1) ℝ := Matrix.of 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. -/ +/-- The linear map `f` moves the components of `T` as `u ∈ U(1)` 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 := @@ -125,8 +73,7 @@ def IsU1BiAdjointMat {B : Type*} [AddCommMonoid B] [Module ℂ B] (∏ 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. -/ + 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 @@ -134,256 +81,78 @@ lemma isU1BiAdjointMat_iff {B : Type*} [AddCommMonoid B] [Module ℂ B] 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. -/ +/-- A linear map obeying the `u(1)` transformation law fixes every component. -/ 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: a - hypercharge transformation moves the components by the `U(1)` element it is built from. - Nothing is asked of the colour or isospin factors. -/ +/-- A family `T` of elements of `B`, indexed by two `u(1)` adjoint indices, transforms as a + tensor `T^{a b}` under the hypercharge factor of the gauge group. Nothing is asked of the + colour and 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 : 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 `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 `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 `repU1Factor_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 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 - 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 repU1Factor_apply {B : Type*} [AddCommMonoid B] [Module ℂ B] - (repGauge : Representation ℂ GaugeGroupI B) (g : GaugeGroupI) : - 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_repU1Factor {B : Type*} [Ring B] [Algebra ℂ B] - {repGauge : Representation ℂ GaugeGroupI B} (hmul : IsMulRep 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 repU1Factor_invariant_iff_u1 {B : Type*} [AddCommMonoid B] [Module ℂ B] - (repGauge : Representation ℂ GaugeGroupI B) (x : B) : - (∀ 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 repU1Factor_stable_iff_u1 {B : Type*} [AddCommGroup B] [Module ℂ B] - (repGauge : Representation ℂ GaugeGroupI B) (S : Submodule ℂ B) : - (∀ 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)⟩ - namespace IsU1BiAdjoint + +/- `span` and `traceContraction` take the hypothesis `hT` only to hang off it by dot +notation. -/ 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) - -/-- 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 (repU1Factor 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 - -/-- 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 _)) + {repGauge : Representation ℂ GaugeGroupI B} {T : (Fin 2 → Fin 1) → 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`, 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. +## B. The span and the trace contraction -/ -/-- 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 - -/-! +/-- The span of the components. -/ +@[nolint unusedArguments] +def span (hT : IsU1BiAdjoint B repGauge T) : Submodule ℂ B := ⨆ d, ℂ ∙ T d -## C. The trace contraction +/-- A vector lies in the span precisely when it is a linear combination of the + components. -/ +lemma mem_span_iff (hT : IsU1BiAdjoint B repGauge T) (x : B) : + x ∈ hT.span ↔ ∃ (c : (Fin 2 → Fin 1) → ℂ), x = ∑ d, c d • T d := + Family.mem_iSup_span_singleton_iff T x --/ - -/-- 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. -/ +/-- The trace contraction: the Kronecker contraction of the two `u(1)` indices, which is + the one component of the family. -/ +@[nolint unusedArguments] 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 fixed by any linear map moving the - components by a `U(1)` matrix, such a map fixing each component already. -/ +/-- Any map obeying the `u(1)` law fixes the trace contraction. -/ 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. -/ +/-- The trace contraction is fixed by the hypercharge factor. -/ 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. Invariance of the whole span - -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 `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 -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. +## C. The whole span is invariant -/ -/-- 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. -/ +/-- Every vector of the span is fixed by any map obeying the `u(1)` 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, 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_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 - -/-- The span of the components of a bi-adjoint `u(1)` family lies in the gauge - 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) +/-- The span of the components consists of gauge invariants, once the law is known to hold + at every gauge element and not only at the hypercharge ones. -/ +theorem 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.map_of_mem_span (hmat g) hx From 9f634d070530062127c19f5c4bf6c6e64734bf9c Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 7 Sep 2026 05:22:57 +0100 Subject: [PATCH 270/367] feat: Simplification of IsQuadLorentz --- .../Invariants/IsQuadLorentz.lean | 4487 ++++------------- 1 file changed, 1109 insertions(+), 3378 deletions(-) diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean index 3f943ce22..9e75a6e80 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean @@ -5,68 +5,67 @@ 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.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 -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 +public import Mathlib.Analysis.InnerProductSpace.Projection.Basic +public import Mathlib.LinearAlgebra.Matrix.Determinant.Basic +-- Not used here; `Peeling` reaches it through this file. +public import Physlib.Relativity.IsLorentzDeriv /-! -# 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 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 -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). -The two symbols the contractions are built from are shown invariant in I.5 and the -contractions themselves in I.6. +# Lorentz invariants of a rank-four tensor + +A rank-four tensor `T^{μνρσ}` has `4 ^ 4 = 256` components. Four combinations of them are fixed +by every rotation and boost, the Lorentz transformations coming from `SL(2,ℂ)`: + +* `outerContraction = η_{μν} η_{ρσ} T^{μνρσ}`, +* `innerContraction = η_{μρ} η_{νσ} T^{μνρσ}`, +* `splitContraction = η_{μσ} η_{νρ} T^{μνρσ}`, +* `epsilonContraction = ε_{μνρσ} T^{μνρσ}`. + +There are no others. The fourth is a pseudoscalar, so it would drop out if reflections were +allowed; independence is not proved, and for a given `T` the four may be dependent or zero. The +components are vectors `T d` of a complex vector space `B` carrying a representation +`repLorentz` of `SL(2,ℂ)`, and `IsQuadLorentz B repLorentz T` says the group moves them with +one factor of the Lorentz matrix per slot (A). A vector of `B` is invariant when every +`repLorentz g` fixes it, and `hT.span` is the set of contractions `∑_d c_d • T d`. The theorem +`mem_span_sup_invariant_iff` (H) allows a Lorentz-stable subspace `S` beside the span, where +the files using it park their other tensors: a vector of `hT.span ⊔ S`, the sums `u + y`, is +invariant exactly when it is a combination of the four contractions plus an invariant `y` of +`S`. For `S = ⊥` that is `exists_smul_contraction_of_invariant`. + +The four coefficient tensors are invariant, by `Λ η Λᵀ = η` and `det Λ = 1` (B); an invariant +of the span is the contraction of an invariant one, by projecting off the tensors that contract +to `0` (C); and such a tensor is a combination of the four, two rotations cutting `256` +coefficients to `22` (D), a boost keeping only what it does not rescale (E), and the `22 × 22` +integer equation left being solved by one checked matrix identity (F, G). -/ @[expose] public section namespace Lorentz -open TensorProduct Matrix MatrixGroups Lorentz SL2C +open Matrix MatrixGroups SL2C BoostWeight /-! -## A. Quadruple Lorentz tensors and the span of their components +## A. Quadruple Lorentz tensors, their span, and coefficient tensors + +A direction is an element of `Fin 1 ⊕ Fin 3`, time or one of the three axes; an index vector +`d : Fin 4 → Fin 1 ⊕ Fin 3` puts one in each slot, so `T d` is `T^{μνρσ}` at `(μ, ν, ρ, σ) = d`. +The law is + +`repLorentz g (T l) = ∑_a Λ_{a₀ l₀} Λ_{a₁ l₁} Λ_{a₂ l₂} Λ_{a₃ l₃} • T a`, +with `l` free and `a` summed, and transforming a contraction moves its coefficient tensor by +`(act Λ c) a = ∑_d c_d Λ_{a₀ d₀} ⋯ Λ_{a₃ d₃}`, now with `a` free and `d` summed +(`repLorentz_sum_smul`): the same `Λ`, never its inverse, but transposed index slots, which is +what makes `act Λᵀ` the adjoint of `act Λ` in C. Two invariance conditions are therefore in +play, kept apart by name: `x : B` is Lorentz invariant when `repLorentz g x = x`, and `c` is +`IsInvariantCoeff` when `act Λ c = c`. -/ -/-- 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,ℂ)`. -/ +/-- A family `T` of vectors of `B`, one per index vector, which `repLorentz` moves the way the + components of a rank-four tensor transform: one factor of the Lorentz matrix per slot, the + moved index second in each factor and the summed one first. -/ structure IsQuadLorentz (B : Type*) [AddCommMonoid B] [Module ℂ B] (repLorentz : Representation ℂ SL(2,ℂ) B) (T : (Fin 4 → (Fin 1 ⊕ Fin 3)) → B) : Prop where @@ -75,2222 +74,848 @@ structure IsQuadLorentz (B : Type*) [AddCommMonoid B] [Module ℂ B] (∏ (i : Fin 4), (((SL2C.toLorentzGroup g).1 (a i) (l i) : ℝ) : ℂ)) • T a namespace IsQuadLorentz -set_option linter.unusedVariables false 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) -/-- The span of all the components. -/ +set_option linter.unusedVariables false in +/-- The span of the `256` components; `hT` is unused, and is present only so it reads `hT.span`. -/ def span (hT : IsQuadLorentz B repLorentz T) : Submodule ℂ B := ⨆ d, ℂ ∙ T d +/-- A vector lies in the span exactly when it is a contraction `∑ d, c 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 _)) - -/-! - -## B. The light-cone basis along one axis - -## B.1. Light-cone components: their span and boost weight + x ∈ hT.span ↔ ∃ c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ, x = ∑ d, c d • T d := by + rw [span, ← Submodule.span_range_eq_iSup, ← Fintype.range_linearCombination, + LinearMap.mem_range] + simp only [Fintype.linearCombination_apply, eq_comm] + +/-- Every contraction of the components lies in their span. -/ +lemma sum_smul_mem_span (c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ) : ∑ d, c d • T d ∈ hT.span := + (hT.mem_span_iff _).2 ⟨c, rfl⟩ + +/-- The action of a real `4 × 4` matrix on coefficient tensors, one factor per slot: + `(act Λ c) a = ∑_d c_d Λ_{a₀ d₀} ⋯ Λ_{a₃ d₃}`, with `a` free and `d` summed. Same `Λ` as on + the components, never its inverse, but with the free index in the first slot, not the second. -/ +def act (Λ : Matrix (Fin 1 ⊕ Fin 3) (Fin 1 ⊕ Fin 3) ℝ) (c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ) + (a : Fin 4 → Fin 1 ⊕ Fin 3) : ℂ := + ∑ d, c d * ∏ s, ((Λ (a s) (d s) : ℝ) : ℂ) -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)`. +include hT in +/-- Transforming a contraction is the same as contracting the transformed coefficient tensor. -/ +lemma repLorentz_sum_smul (g : SL(2,ℂ)) (c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ) : + repLorentz g (∑ d, c d • T d) = ∑ a, act (SL2C.toLorentzGroup g).1 c a • T a := by + simp only [map_sum, map_smul, hT.repLorentz_T, Finset.smul_sum, smul_smul, act, + Finset.sum_smul] + exact Finset.sum_comm --/ +/-- A coefficient tensor fixed by `act` of the Lorentz matrix of every `g : SL(2,ℂ)`. -/ +def IsInvariantCoeff (c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ) : Prop := + ∀ g : SL(2,ℂ), act (SL2C.toLorentzGroup g).1 c = c -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 := - ∑ 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 +include hT in +/-- Contracting with an invariant coefficient tensor gives a Lorentz invariant vector. -/ +lemma repLorentz_sum_smul_of_isInvariantCoeff {c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ} + (hc : IsInvariantCoeff c) (g : SL(2,ℂ)) : + repLorentz g (∑ d, c d • T d) = ∑ d, c d • T d := by + rw [hT.repLorentz_sum_smul, hc g] /-! -## B.2. Integer and rational mirrors of the light-cone coefficients +## B. The four contractions -Mirrors of the light-cone coefficients over `ℤ` and `ℚ`, so that the vanishing of -coefficients can be settled by `decide`. +## B.1. The metric, the Levi-Civita symbol and the contractions +`etaZ` is `η = diag(1, -1, -1, -1)`, checked against `minkowskiMatrix` by `etaZ_cast`, and +`epsilonSignZ d` is the determinant of the matrix whose rows are the unit vectors of +`d 0, d 1, d 2, d 3`: `1` on `(t, x, y, z)`, minus itself under a swap of two slots, `0` on a +repeated direction. Both are integer valued, as is everything F and G compute with. The metric +pairings use the slots `(0,1)(2,3)`, `(0,2)(1,3)` and `(0,3)(1,2)` for `outerContraction`, +`innerContraction` and `splitContraction`; `contractionCoeff` holds the four coefficient +tensors and `contraction T` the four contractions in that order. -/ -/-- 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) - 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 +/-- The Minkowski sign of a direction: `+1` on time, `-1` on each spatial axis. -/ +def minkowskiSignZ : Fin 1 ⊕ Fin 3 → ℤ := Sum.elim (fun _ => 1) (fun _ => -1) -/-- 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) - 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 Minkowski metric `η = diag(1, -1, -1, -1)`, integer valued so the later checks compute. -/ +def etaZ (μ ν : Fin 1 ⊕ Fin 3) : ℤ := if μ = ν then minkowskiSignZ μ 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 +/-- The Levi-Civita symbol; the row index is a slot, carried across by `finSumFinEquiv`. -/ +def epsilonSignZ (d : Fin 4 → Fin 1 ⊕ Fin 3) : ℤ := + (Matrix.of fun μ ν : Fin 1 ⊕ Fin 3 => if d (finSumFinEquiv μ) = ν then (1 : ℤ) else 0).det -/-- 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] +/-- The four coefficient tensors: the three metric pairings, then the Levi-Civita symbol. -/ +def contractionCoeff : Fin 4 → (Fin 4 → Fin 1 ⊕ Fin 3) → ℤ := + ![fun d => etaZ (d 0) (d 1) * etaZ (d 2) (d 3), + fun d => etaZ (d 0) (d 2) * etaZ (d 1) (d 3), + fun d => etaZ (d 0) (d 3) * etaZ (d 1) (d 2), + epsilonSignZ] -/-! +/-- The contraction `η_{μν} η_{ρσ} T^{μνρσ}`, pairing slots `(0,1)` and `(2,3)`. -/ +noncomputable def outerContraction (T : (Fin 4 → Fin 1 ⊕ Fin 3) → B) : B := + ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, ((etaZ (d 0) (d 1) * etaZ (d 2) (d 3) : ℤ) : ℂ) • T d -## Aside: Vanishing of homogeneous boost-weight sums +/-- The contraction `η_{μρ} η_{νσ} T^{μνρσ}`, pairing slots `(0,2)` and `(1,3)`. -/ +noncomputable def innerContraction (T : (Fin 4 → Fin 1 ⊕ Fin 3) → B) : B := + ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, ((etaZ (d 0) (d 2) * etaZ (d 1) (d 3) : ℤ) : ℂ) • T d -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`. +/-- The contraction `η_{μσ} η_{νρ} T^{μνρσ}`, pairing slots `(0,3)` and `(1,2)`. -/ +noncomputable def splitContraction (T : (Fin 4 → Fin 1 ⊕ Fin 3) → B) : B := + ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, ((etaZ (d 0) (d 3) * etaZ (d 1) (d 2) : ℤ) : ℂ) • T d --/ +/-- The contraction `ε_{μνρσ} T^{μνρσ}` with the Levi-Civita symbol. -/ +noncomputable def epsilonContraction (T : (Fin 4 → Fin 1 ⊕ Fin 3) → B) : B := + ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, ((epsilonSignZ d : ℤ) : ℂ) • T d -/-- 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] - {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)))) +/-- The four contractions in order, from the outer one to the Levi-Civita one. -/ +noncomputable def contraction (T : (Fin 4 → Fin 1 ⊕ Fin 3) → B) : Fin 4 → B := + ![outerContraction T, innerContraction T, splitContraction T, epsilonContraction T] + +/-- Each contraction is the contraction with its coefficient tensor. -/ +lemma contraction_eq (i : Fin 4) : + contraction T i = ∑ d, ((contractionCoeff i d : ℤ) : ℂ) • T d := by + fin_cases i <;> rfl + +/-- A combination of the four contractions, written out. -/ +lemma sum_smul_contraction (a : Fin 4 → ℂ) : + ∑ i, a i • contraction T i + = a 0 • outerContraction T + a 1 • innerContraction T + a 2 • splitContraction T + + a 3 • epsilonContraction T := by + rw [Fin.sum_univ_four] + rfl -/-- 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] - {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 +/-- The outer contraction lies in the span of the components. -/ +lemma outerContraction_mem_span : outerContraction T ∈ hT.span := hT.sum_smul_mem_span _ -/-! +/-- The inner contraction lies in the span of the components. -/ +lemma innerContraction_mem_span : innerContraction T ∈ hT.span := hT.sum_smul_mem_span _ -## C. The weight-zero projection of a generator +/-- The split contraction lies in the span of the components. -/ +lemma splitContraction_mem_span : splitContraction T ∈ hT.span := hT.sum_smul_mem_span _ -## C.1. The boost-weight components of a generator +/-- The Levi-Civita contraction lies in the span of the components. -/ +lemma epsilonContraction_mem_span : epsilonContraction T ∈ hT.span := hT.sum_smul_mem_span _ -Each generator `T e` is the sum of its boost-weight components `monoComponent i e m` -over the weight support along any axis. +/-- A combination of the four contractions lies in the span of the components. -/ +lemma smul_contraction_mem_span (a₁ a₂ a₃ a₄ : ℂ) : + a₁ • outerContraction T + a₂ • innerContraction T + a₃ • splitContraction T + + a₄ • epsilonContraction 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) --/ +/-! -/-- 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 - -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 - -/-- 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 - rw [hT.eq_sum_lightCone i e] - exact (Finset.sum_fiberwise_of_maps_to (fun c _ => sum_lightConeWeight_mem c) _).symm +## B.2. The four coefficient tensors are invariant -/-! +`Λ η Λᵀ = η` defines the Lorentz group; entry by entry it is `sum_etaZ_mul`, and a pair of +metrics is two copies of it, one per pair of slots (`act_outerPair`). The inner and split +pairings are the outer one with the slots permuted (`act_outerPair_comp`). The symbol against +four rows of `M` gives `det M` times the symbol of those rows (`sum_epsilonSignZ_mul_prod`), +and `det Λ = 1` here: the only use of the determinant, and the reason there are four invariants +and not three, a reflection having `det = -1`. `sum_pi_four`, `coe_epsilonSignZ` and +`det_eq_sum_perm_prod` are bookkeeping. +-/ -## C.2. The weight-zero transition matrix +/-- Bookkeeping: a sum over index vectors is a fourfold sum over directions. -/ +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 matrix of the axis-`i` weight-zero projection in the `T`-basis: a sum over balanced -sector patterns of per-slot sector matrices. +/-- The integer metric agrees with `minkowskiMatrix`, which is therefore `diag(1, -1, -1, -1)`. -/ +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 defining relation `Λ η Λᵀ = η`, 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 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 pairing of slots `(0,1)` and `(2,3)` is fixed: two copies of `sum_etaZ_mul`. -/ +lemma act_outerPair (Λ : LorentzGroup 3) (a : Fin 4 → Fin 1 ⊕ Fin 3) : + act Λ.1 (fun d => ((etaZ (d 0) (d 1) * etaZ (d 2) (d 3) : ℤ) : ℂ)) a + = ((etaZ (a 0) (a 1) * etaZ (a 2) (a 3) : ℤ) : ℂ) := by + have h : ∀ 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) : ℤ) : ℂ) + * ∏ s, ((Λ.1 (a s) (![x, y, z, w] s) : ℝ) : ℂ) + = (((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 + rw [act, sum_pi_four] + simp only [h, ← Finset.mul_sum, ← Finset.sum_mul, sum_etaZ_mul] + push_cast + ring -/-- The boost weight of each sector. -/ -def sectorWeight : Fin 3 → ℤ := ![2, -2, 0] +/-- The same for the slots permuted by `σ`, by renaming the summation variable. -/ +lemma act_outerPair_comp (σ : Equiv.Perm (Fin 4)) (Λ : LorentzGroup 3) + (a : Fin 4 → Fin 1 ⊕ Fin 3) : + act Λ.1 (fun d => ((etaZ (d (σ 0)) (d (σ 1)) * etaZ (d (σ 2)) (d (σ 3)) : ℤ) : ℂ)) a + = ((etaZ (a (σ 0)) (a (σ 1)) * etaZ (a (σ 2)) (a (σ 3)) : ℤ) : ℂ) := by + have h := act_outerPair Λ (a ∘ σ) + rw [act, ← Equiv.sum_comp (Equiv.arrowCongr σ.symm (Equiv.refl (Fin 1 ⊕ Fin 3)))] at h + simp only [Equiv.arrowCongr_apply, Equiv.symm_symm, Equiv.coe_refl, Function.comp_def, + id] at h + rw [← h, act] + refine Finset.sum_congr rfl fun d _ => ?_ + rw [← Equiv.prod_comp σ fun i => ((Λ.1 (a i) (d i) : ℝ) : ℂ)] -/-- 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 +/-- Bookkeeping: the symbol reads the same in every commutative ring. -/ +lemma coe_epsilonSignZ {R : Type*} [CommRing R] (d : Fin 4 → Fin 1 ⊕ Fin 3) : + ((epsilonSignZ d : ℤ) : R) + = (Matrix.of fun μ ν : Fin 1 ⊕ Fin 3 => + if d (finSumFinEquiv μ) = ν then (1 : R) else 0).det := by + have h := RingHom.map_det (Int.castRingHom R) + (Matrix.of fun μ ν : Fin 1 ⊕ Fin 3 => if d (finSumFinEquiv μ) = ν then (1 : ℤ) else 0) + simp only [Int.coe_castRingHom, RingHom.mapMatrix_apply] at h + rw [epsilonSignZ, h] + congr 1 + ext μ ν + by_cases hdν : d (finSumFinEquiv μ) = ν <;> simp [Matrix.map_apply, hdν] -/-- 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 κ' ν : ℚ) +/-- Bookkeeping: 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 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. - 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) : ℚ := - ∑ 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. -/ -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] +/-- Against four rows of `M` the symbol gives `det M` times the symbol of those rows. -/ +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 hrows : (Matrix.of fun μ ν => M (a (finSumFinEquiv μ)) ν).det + = ((epsilonSignZ a : ℤ) : R) * M.det := by + rw [coe_epsilonSignZ, ← Matrix.det_mul] + congr 1 + ext μ ν + simp [Matrix.mul_apply] + have hfun : ∀ (σ : Equiv.Perm (Fin 1 ⊕ Fin 3)) (d : Fin 4 → Fin 1 ⊕ Fin 3), + (∀ μ, d (finSumFinEquiv μ) = σ μ) ↔ d = fun s => σ (finSumFinEquiv.symm s) := by + refine fun σ d => ⟨fun h => funext fun s => ?_, fun h μ => by subst h; simp⟩ + rw [← h, Equiv.apply_symm_apply] + rw [mul_comm, ← hrows, det_eq_sum_perm_prod] + simp only [coe_epsilonSignZ, det_eq_sum_perm_prod, Matrix.of_apply, Finset.sum_mul, + Fintype.prod_boole, hfun, mul_ite, mul_one, mul_zero, ite_mul, zero_mul] rw [Finset.sum_comm] - refine Finset.sum_congr rfl fun d _ => ?_ - rw [← Finset.sum_smul] + refine Finset.sum_congr rfl fun σ _ => ?_ + rw [Finset.sum_ite_eq' Finset.univ, if_pos (Finset.mem_univ _)] congr 1 - rw [weightZeroTransition_eq_sum_lightCone] - push_cast - simp only [coe_lightConeCoeffInvQ, coe_lightConeCoeffZ, Finset.prod_mul_distrib] -/-! +/-- The symbol is fixed by a Lorentz matrix of determinant `1`; in general it picks up `det Λ`. -/ +lemma act_epsilonSignZ (Λ : LorentzGroup 3) (hΛ : Λ.1.det = 1) (a : Fin 4 → Fin 1 ⊕ Fin 3) : + act Λ.1 (fun d => ((epsilonSignZ d : ℤ) : ℂ)) a = ((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 -## C.3. The boost average and iterated rounds +/-- The four coefficient tensors are invariant. -/ +lemma isInvariantCoeff_contractionCoeff (i : Fin 4) : + IsInvariantCoeff fun d => ((contractionCoeff i d : ℤ) : ℂ) := by + intro g + funext a + fin_cases i + · exact act_outerPair _ a + · simpa [contractionCoeff, Equiv.swap_apply_def] using + act_outerPair_comp (Equiv.swap 1 2) (SL2C.toLorentzGroup g) a + · simpa [contractionCoeff, Equiv.swap_apply_def, Equiv.trans_apply] using + act_outerPair_comp ((Equiv.swap 1 3).trans (Equiv.swap 1 2)) (SL2C.toLorentzGroup g) a + · exact act_epsilonSignZ _ (SL2C.toLorentzGroup_det_one g) a + +/-! -An element of weight zero along all three axes re-expands through any power of the -boost-average matrix applied to its coefficients. +## B.3. The four contractions are Lorentz invariant +Contracting with an invariant coefficient tensor gives an invariant vector, so each contraction +is invariant, as is any combination: with `smul_contraction_mem_span`, the easy direction. -/ -/-- 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 +/-- Each of the four contractions is Lorentz invariant, its coefficient tensor being invariant. -/ +lemma repLorentz_contraction (i : Fin 4) (g : SL(2,ℂ)) : + repLorentz g (contraction T i) = contraction T i := by + rw [contraction_eq, + hT.repLorentz_sum_smul_of_isInvariantCoeff (isInvariantCoeff_contractionCoeff i)] 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 _ _ +/-- The outer contraction is Lorentz invariant. -/ +lemma repLorentz_outerContraction (g : SL(2,ℂ)) : + repLorentz g (outerContraction T) = outerContraction T := + hT.repLorentz_contraction 0 g 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] +/-- The inner contraction is Lorentz invariant. -/ +lemma repLorentz_innerContraction (g : SL(2,ℂ)) : + repLorentz g (innerContraction T) = innerContraction T := + hT.repLorentz_contraction 1 g -/-! +include hT in +/-- The split contraction is Lorentz invariant. -/ +lemma repLorentz_splitContraction (g : SL(2,ℂ)) : + repLorentz g (splitContraction T) = splitContraction T := + hT.repLorentz_contraction 2 g -## D. Sieving the span along the three boost axes +include hT in +/-- The Levi-Civita contraction is Lorentz invariant. -/ +lemma repLorentz_epsilonContraction (g : SL(2,ℂ)) : + repLorentz g (epsilonContraction T) = epsilonContraction T := + hT.repLorentz_contraction 3 g -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. +include hT in +/-- A combination of the four contractions is Lorentz invariant. -/ +lemma repLorentz_smul_contraction (a₁ a₂ a₃ a₄ : ℂ) (g : SL(2,ℂ)) : + repLorentz g (a₁ • outerContraction T + a₂ • innerContraction T + a₃ • splitContraction T + + a₄ • epsilonContraction T) + = a₁ • outerContraction T + a₂ • innerContraction T + a₃ • splitContraction T + + a₄ • epsilonContraction T := by + simp only [map_add, map_smul, hT.repLorentz_outerContraction, hT.repLorentz_innerContraction, + hT.repLorentz_splitContraction, hT.repLorentz_epsilonContraction] -## D.1. Pieces along one axis +/-! +## C. An invariant of the span is the contraction of an invariant tensor + +The components may satisfy linear relations, so the `c` with `x = ∑ c_d • T d` is not +determined by `x` and need not be invariant. Let `K` be the coefficient tensors contracting to +`0`, a subspace of `ℂ^{256}` that the group preserves and that is the whole ambiguity in `c`. +Give `ℂ^{256}` the standard inner product `∑_d conj(u_d) v_d`, positive definite and unrelated +to `η`, written `EuclideanSpace ℂ (Fin 4 → Fin 1 ⊕ Fin 3)`, where `WithLp.toLp 2` and `.ofLp` +only move to and from the plain function type. The complement `Kᗮ` is preserved too, since +`act Λ` across the inner product becomes `act Λᵀ` (`inner_act_eq_inner_act_transpose`) and `Λᵀ` +is again such a matrix, that of `g†`; the action is not unitary, and is not used to be. So keep +the `Kᗮ` part of `c`: it still contracts to `x`, and acting on it changes it by an element of +`K` and of `Kᗮ`, hence by `0` (`exists_isInvariantCoeff_of_mem_span`). -/ -/-- 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 - -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 +/-- The conjugate transpose `g†`, again in `SL(2,ℂ)`. -/ +def dagger (g : SL(2,ℂ)) : SL(2,ℂ) := ⟨g.1ᴴ, by rw [Matrix.det_conjTranspose, g.2, star_one]⟩ + +/-- The Lorentz matrix of `g†` is the transpose of that of `g`. -/ +lemma toLorentzGroup_dagger (g : SL(2,ℂ)) : + (SL2C.toLorentzGroup (dagger g)).1 = (SL2C.toLorentzGroup g).1ᵀ := + SL2C.toLorentzGroup_conjTranspose rfl + +/-- Contraction with the components, as a linear map on the inner product space. -/ +noncomputable def contractₗ (T : (Fin 4 → Fin 1 ⊕ Fin 3) → B) : + EuclideanSpace ℂ (Fin 4 → Fin 1 ⊕ Fin 3) →ₗ[ℂ] B where + toFun c := ∑ d, c.ofLp d • T d + map_add' c c' := by + simp only [WithLp.ofLp_add, Pi.add_apply, add_smul, Finset.sum_add_distrib] + map_smul' z c := by + simp only [WithLp.ofLp_smul, Pi.smul_apply, smul_eq_mul, RingHom.id_apply, Finset.smul_sum, + smul_smul] + +open scoped InnerProductSpace in +/-- Across the standard inner product the action of a real matrix `Λ` becomes that of `Λᵀ`. -/ +lemma inner_act_eq_inner_act_transpose (Λ : Matrix (Fin 1 ⊕ Fin 3) (Fin 1 ⊕ Fin 3) ℝ) + (u v : EuclideanSpace ℂ (Fin 4 → Fin 1 ⊕ Fin 3)) : + ⟪u, WithLp.toLp 2 (act Λ v.ofLp)⟫_ℂ = ⟪WithLp.toLp 2 (act Λᵀ u.ofLp), v⟫_ℂ := by + simp only [PiLp.inner_apply, RCLike.inner_apply, act, Matrix.transpose_apply, map_sum, + map_mul, map_prod, Complex.conj_ofReal, Finset.mul_sum, Finset.sum_mul] + rw [Finset.sum_comm] + exact Finset.sum_congr rfl fun a _ => Finset.sum_congr rfl fun d _ => by ring + +include hT in +/-- An invariant of the span is the contraction of an invariant coefficient tensor. -/ +theorem exists_isInvariantCoeff_of_mem_span {x : B} (hx : x ∈ hT.span) + (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : + ∃ c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ, IsInvariantCoeff c ∧ x = ∑ d, c d • T d := by + obtain ⟨c, rfl⟩ := (hT.mem_span_iff x).1 hx + have hcontr : ∀ (g : SL(2,ℂ)) (u : EuclideanSpace ℂ (Fin 4 → Fin 1 ⊕ Fin 3)), + contractₗ T (WithLp.toLp 2 (act (SL2C.toLorentzGroup g).1 u.ofLp)) + = repLorentz g (contractₗ T u) := + fun g u => (hT.repLorentz_sum_smul g u.ofLp).symm + set K := LinearMap.ker (contractₗ T) with hK + obtain ⟨k, hk, k', hk', hkk'⟩ := K.exists_add_mem_mem_orthogonal (WithLp.toLp 2 c) + have hx' : ∑ d, c d • T d = contractₗ T k' := by + have h := congrArg (contractₗ T) hkk' + rwa [map_add, LinearMap.mem_ker.1 hk, zero_add] at h + refine ⟨k'.ofLp, fun g => ?_, hx'⟩ + have h1 : WithLp.toLp 2 (act (SL2C.toLorentzGroup g).1 k'.ofLp) - k' ∈ K := by + rw [hK, LinearMap.mem_ker, map_sub, hcontr, ← hx', hinv, hx', sub_self] + have h2 : WithLp.toLp 2 (act (SL2C.toLorentzGroup g).1 k'.ofLp) ∈ Kᗮ := by + refine (Submodule.mem_orthogonal _ _).2 fun u hu => ?_ + rw [inner_act_eq_inner_act_transpose, ← toLorentzGroup_dagger] + refine Submodule.inner_right_of_mem_orthogonal (K := K) ?_ hk' + rw [hK, LinearMap.mem_ker, hcontr, LinearMap.mem_ker.1 hu, map_zero] + have h3 : WithLp.toLp 2 (act (SL2C.toLorentzGroup g).1 k'.ofLp) - k' ∈ K ⊓ Kᗮ := + ⟨h1, Submodule.sub_mem _ h2 hk'⟩ + rw [Submodule.inf_orthogonal_eq_bot, Submodule.mem_bot, sub_eq_zero] at h3 + exact congrArg WithLp.ofLp h3 /-! -## D.2. Pieces along a second axis +## D. The rotations by `π` about the axes and the rotation `x → y → z → x` -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 rotation by `π` about the `k`-th axis is `i σ_k` (`flipAxis k`), with diagonal Lorentz +matrix fixing time and that axis and negating the other two, so it multiplies `c d` by `-1` +once per slot of `d` holding a negated direction (`act_flipAxis`), and where that sign is `-1` +invariance forces `c d = 0`. Call `d` flip-fixed when all three signs are `1` (`IsFlipFixed`): +with `n_t, n_x, n_y, n_z` the counts of each direction that says all four have the same parity, +so `xxyy` and `txyz` survive, `tttx` does not, and `64` of `256` remain. +The rotation `x → y → z → x` fixes time (`rotationCycle`) and permutes rather than rescales, so +the new coefficient at `a` is the old one at `cycIdx (cycIdx a)` (`act_rotationCycle`) and +invariance reads `c (cycIdx d) = c d`: `c` is constant on the orbit +`{d, cycIdx d, cycIdx (cycIdx d)}`, of three members unless `d` is `tttt`. -/ -/-- 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 _ +/-- Rotation by `π` about the `k`-th axis: the matrices below are `i σ_x`, `i σ_y`, `i σ_z`. -/ +def flipAxis : Fin 3 → SL(2,ℂ) + | 0 => ⟨!![0, Complex.I; Complex.I, 0], by simp [Matrix.det_fin_two_of]⟩ -- `i σ_x` + | 1 => ⟨!![0, 1; -1, 0], by simp [Matrix.det_fin_two_of]⟩ -- `i σ_y` + | 2 => ⟨!![Complex.I, 0; 0, -Complex.I], by simp [Matrix.det_fin_two_of]⟩ -- `i σ_z` + +/-- The sign the `k`-th flip gives a direction: `+1` on time and the axis, `-1` transverse. -/ +def flipSign (k : Fin 3) (μ : Fin 1 ⊕ Fin 3) : ℤ := + if μ = Sum.inl 0 ∨ μ = Sum.inr k then 1 else -1 + +/-- The Lorentz matrix of the `k`-th flip is diagonal, carrying `flipSign k`. -/ +lemma toLorentzGroup_flipAxis_apply (k : Fin 3) (a b : Fin 1 ⊕ Fin 3) : + (SL2C.toLorentzGroup (flipAxis k)).1 a b = if a = b then (flipSign k a : ℝ) else 0 := by + refine Complex.ofReal_injective ?_ + rw [SL2C.toLorentzGroup_eq_trace, PauliMatrix.trace_pauliSelfAdjoint'_mul_apply] + fin_cases k <;> rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> + simp [flipAxis, flipSign, PauliMatrix.pauliSelfAdjoint', PauliMatrix.pauliMatrix, + Matrix.mul_apply, Matrix.conjTranspose_apply, Fin.sum_univ_two, Complex.ext_iff] + +/-- Being diagonal, the flip rescales each coefficient by the product of its four signs. -/ +lemma act_flipAxis (k : Fin 3) (c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ) (a : Fin 4 → Fin 1 ⊕ Fin 3) : + act (SL2C.toLorentzGroup (flipAxis k)).1 c a = ((∏ s, flipSign k (a s) : ℤ) : ℂ) * c a := by + rw [act, Finset.sum_eq_single a] + · rw [mul_comm] + push_cast + congr 1 + exact Finset.prod_congr rfl fun s _ => by + rw [toLorentzGroup_flipAxis_apply, if_pos rfl, Complex.ofReal_intCast] + · intro d _ hda + obtain ⟨s, hs⟩ := Function.ne_iff.1 hda.symm + rw [Finset.prod_eq_zero (Finset.mem_univ s), mul_zero] + rw [toLorentzGroup_flipAxis_apply, if_neg hs, Complex.ofReal_zero] + · exact fun h => absurd (Finset.mem_univ a) h + +/-- The sign a flip attaches to a coefficient is `1` or `-1`, being a product of such signs. -/ +lemma prod_flipSign_eq_one_or (k : Fin 3) (d : Fin 4 → Fin 1 ⊕ Fin 3) : + ∏ s, flipSign k (d s) = 1 ∨ ∏ s, flipSign k (d s) = -1 := by + refine Finset.prod_induction _ (fun n : ℤ => n = 1 ∨ n = -1) ?_ (Or.inl rfl) fun s _ => ?_ + · rintro a b (rfl | rfl) (rfl | rfl) <;> norm_num + · unfold flipSign + split_ifs <;> simp + +/-- All three flips fix the coefficient at `d`, that is the sign product is `1` for each axis. + Equivalently, and not used below, all four directions occur an even number of times among the + slots, or all four an odd number. -/ +def IsFlipFixed (d : Fin 4 → Fin 1 ⊕ Fin 3) : Prop := + ∀ k : Fin 3, ∏ s, flipSign k (d s) = 1 + +instance : DecidablePred IsFlipFixed := fun d => + inferInstanceAs (Decidable (∀ k : Fin 3, ∏ s, flipSign k (d s) = 1)) + +/-- An invariant coefficient tensor vanishes off the flip-fixed index vectors. -/ +lemma IsInvariantCoeff.eq_zero_of_not_isFlipFixed {c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ} + (hc : IsInvariantCoeff c) {d : Fin 4 → Fin 1 ⊕ Fin 3} (hd : ¬IsFlipFixed d) : c d = 0 := by + obtain ⟨k, hk⟩ := not_forall.1 hd + have h := congrFun (hc (flipAxis k)) d + rw [act_flipAxis, (prod_flipSign_eq_one_or k d).resolve_left hk] at h + push_cast at h + linear_combination (-2⁻¹ : ℂ) * h + +/-- The relabelling `cycDir`, which fixes time and sends `x → y → z → x`, applied in every slot. -/ +def cycIdx (d : Fin 4 → Fin 1 ⊕ Fin 3) : Fin 4 → Fin 1 ⊕ Fin 3 := fun s => cycDir (d s) + +/-- Cycling the axes three times is the identity. -/ +lemma cycIdx_cycIdx_cycIdx (d : Fin 4 → Fin 1 ⊕ Fin 3) : cycIdx (cycIdx (cycIdx d)) = d := + funext fun s => cycDir_cycDir_cycDir (d s) + +/-- The cyclic rotation permutes entries: the new entry at `a` is the old one at `a` cycled back. -/ +lemma act_rotationCycle (c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ) (a : Fin 4 → Fin 1 ⊕ Fin 3) : + act (SL2C.toLorentzGroup rotationCycle).1 c a = c (cycIdx (cycIdx a)) := by + rw [act, Finset.sum_eq_single (cycIdx (cycIdx a))] + · rw [Finset.prod_eq_one fun s _ => ?_, mul_one] + rw [toLorentzGroup_rotationCycle_apply, if_pos, Complex.ofReal_one] + exact (congrFun (cycIdx_cycIdx_cycIdx a) s).symm + · intro d _ hda + have hne : cycIdx d ≠ a := fun h => hda (by rw [← h, cycIdx_cycIdx_cycIdx]) + obtain ⟨s, hs⟩ := Function.ne_iff.1 hne + rw [Finset.prod_eq_zero (Finset.mem_univ s), mul_zero] + rw [toLorentzGroup_rotationCycle_apply, if_neg fun h : a s = cycDir (d s) => hs h.symm, + Complex.ofReal_zero] + · exact fun h => absurd (Finset.mem_univ _) h + +/-- An invariant coefficient tensor is constant on the orbits of the cyclic rotation. -/ +lemma IsInvariantCoeff.apply_cycIdx {c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ} (hc : IsInvariantCoeff c) + (d : Fin 4 → Fin 1 ⊕ Fin 3) : c (cycIdx d) = c d := by + have h := congrFun (hc rotationCycle) (cycIdx d) + rw [act_rotationCycle, cycIdx_cycIdx_cycIdx] at h + exact h.symm /-! -## D.3. Tied pieces along the third axis +## E. The boost along an axis -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. +## E.1. An invariant tensor has boost weight zero +The boosts along the axis `i` are `SL2C.boostAxis i t ht`, of rapidity `2 log t` for `t > 0`. +In each slot replace the coordinate directions by the light-cone directions `D₀ - Dᵢ`, +`D₀ + Dᵢ` and the two transverse ones: they are eigenvectors of the boost with eigenvalues +`t²`, `t⁻²`, `1`, `1` (`sum_boostAxis_lightConeCoeff`, imported), so their weights, the +exponents of `t`, are `2`, `-2`, `0`, `0` (`lightConeWeight`). A multi-index `κ` picks one per +slot and `lightConeComponent i c κ` contracts `c` against that choice; the boost scales it by +`t` to the total weight of `κ`, so `t = 2` kills every component of nonzero weight. Only the +`z`-axis is used below, and nothing claims these elements generate the group: F and G show that +what they force is enough. -/ -/-- 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 - rw [hT.lightCone_eq_sum_lightCone i j c] - 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. -/ -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 _)) - +/-- A light-cone component: `c` contracted against one light-cone direction per slot. -/ +def lightConeComponent (i : Fin 3) (c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ) (κ : Fin 4 → Fin 4) : ℂ := + ∑ a, (∏ s, lightConeCoeff i (κ s) (a s)) * c a + +/-- The Lorentz matrix of a boost is symmetric. -/ +lemma toLorentzGroup_boostAxis_symm (i : Fin 3) {t : ℝ} (ht : t ≠ 0) (a b : Fin 1 ⊕ Fin 3) : + (SL2C.toLorentzGroup (SL2C.boostAxis i t ht)).1 a b + = (SL2C.toLorentzGroup (SL2C.boostAxis i t ht)).1 b a := + congrFun (congrFun + (SL2C.toLorentzGroup_conjTranspose (SL2C.boostAxis_conjTranspose i t ht).symm) a) b + +/-- The boost with parameter `t` multiplies a light-cone component by `t` to the weight of `κ`. -/ +lemma lightConeComponent_act_boostAxis (i : Fin 3) (c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ) + (κ : Fin 4 → Fin 4) {t : ℝ} (ht : t ≠ 0) : + lightConeComponent i (act (SL2C.toLorentzGroup (SL2C.boostAxis i t ht)).1 c) κ + = ((t : ℝ) : ℂ) ^ (∑ s, lightConeWeight (κ s)) * lightConeComponent i c κ := by + simp only [lightConeComponent, act, Finset.mul_sum] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun d _ => ?_ + have h := sum_prod_lightConeCoeff i κ d ht + simp only [toLorentzGroup_boostAxis_symm i ht (d _)] at h + rw [← mul_assoc, mul_comm _ (c d), ← h, Finset.mul_sum] + exact Finset.sum_congr rfl fun a _ => by ring + +/-- An invariant coefficient tensor has no light-cone component of nonzero weight. -/ +lemma IsInvariantCoeff.lightConeComponent_eq_zero {c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ} + (hc : IsInvariantCoeff c) (i : Fin 3) {κ : Fin 4 → Fin 4} + (hκ : ∑ s, lightConeWeight (κ s) ≠ 0) : + lightConeComponent i c κ = 0 := by + have h := lightConeComponent_act_boostAxis i c κ (two_ne_zero (α := ℝ)) + rw [hc] at h + have h2 : ((2 : ℝ) : ℂ) ^ (∑ s, lightConeWeight (κ s)) ≠ 1 := by + rw [← Complex.ofReal_zpow, Ne, Complex.ofReal_eq_one, + zpow_eq_one_iff_right₀ (by norm_num) (by norm_num)] + exact hκ + exact (mul_left_eq_self₀.1 h.symm).resolve_left h2 /-! -## E. The support of the weight-zero tied piece +## E.2. The weight-zero projection + +Writing each coordinate direction in the light-cone basis recovers `c` from its light-cone +components (`eq_sum_lightConeComponent`), and for an invariant `c` only weight zero survives: +`16 * c d = ∑_e transitionZ i d e 0 * c e`. Time and the axis span the boost plane +(`InBoostPlane`); a direction in it is a half-sum of `D₀ ∓ Dᵢ`, so `lightConeCoeffInvZ` carries +twice the true coefficients and four slots give the `2 ^ 4 = 16`, bought for integer entries. +`transitionZ i d e m` is `16` times the entry, at `d` and `e`, of the map keeping total weight +`m`, built a slot at a time: a slot of `d` in the boost plane takes weight `2` or `-2`, leaving +`m - 2` or `m + 2`, a transverse slot takes either weight `0` direction, which is why those two +are added, and leaves `m` (`transitionZ_eq_sum` as one sum). +-/ + +/-- The four light-cone directions of axis `i`, as integers. -/ +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 weight-zero tied piece only involves components `T d` whose four indices either form -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. +/-- The integer copy casts to `lightConeCoeff`. -/ +lemma coe_lightConeCoeffZ (i : Fin 3) (κ : Fin 4) (μ : Fin 1 ⊕ Fin 3) : + ((lightConeCoeffZ i κ μ : ℤ) : ℂ) = lightConeCoeff i κ μ := by + rw [lightConeCoeffZ, lightConeCoeff] + split_ifs <;> norm_num -## E.1. The null-swap sign involution kills the bad components +/-- Twice the coordinate directions in the light-cone basis, the `2` clearing the halves. -/ +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 copy is exactly twice `lightConeCoeffInv`. -/ +lemma coe_lightConeCoeffInvZ_eq_two_mul (i : Fin 3) (μ : Fin 1 ⊕ Fin 3) (κ : Fin 4) : + ((lightConeCoeffInvZ i μ κ : ℤ) : ℂ) = 2 * lightConeCoeffInv i μ κ := by + rw [lightConeCoeffInvZ, lightConeCoeffInv] + split_ifs <;> norm_num -/-- 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)) - -/-- 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 κ - -/-- 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 boost plane of axis `i`: time and the axis, the two directions the boost moves. -/ +def InBoostPlane (i : Fin 3) (μ : Fin 1 ⊕ Fin 3) : Prop := μ = Sum.inl 0 ∨ μ = Sum.inr i -/-- The null swap negates the light-cone weight. -/ -lemma lightConeWeight_swap01 (κ : Fin 4) : - lightConeWeight (swap01 κ) = -lightConeWeight κ := by - fin_cases κ <;> rfl +instance (i : Fin 3) (μ : Fin 1 ⊕ Fin 3) : Decidable (InBoostPlane i μ) := + inferInstanceAs (Decidable (_ ∨ _)) -/-- 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 : - ∀ (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 - -/-- 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 (d : Fin 4 → Fin 1 ⊕ Fin 3) - (hodd : Odd (Finset.univ.filter fun s => d s = Sum.inl 0 ∨ d s = Sum.inr 2).card) - (c'' : Fin 4 → Fin 4) (hc'' : (∑ s, lightConeWeight (c'' s)) = 0) : - ∃ s, lightConeCoeffZ 2 (c'' s) (d s) = 0 := by - 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'') - -/-- On a supported slot, `nuZ` factors into the sign of the outer row and the sign of - the coordinate column. -/ -lemma nuZ_eq_row_sign_mul_column_sign (a : Fin 4) (μ : Fin 1 ⊕ Fin 3) - (h : ∃ κ, lightConeTransitionZ 1 2 a κ * lightConeCoeffZ 2 κ μ ≠ 0) : - nuZ a μ = - (if a = 0 ∨ a = 1 then -1 else 1) * - (if μ = Sum.inl 0 ∨ μ = Sum.inr 1 then -1 else 1) := by - obtain ⟨κ, hκ⟩ := h - rcases μ with b | j - · rw [Subsingleton.elim b 0] at hκ ⊢ - fin_cases a <;> fin_cases κ <;> - simp_all [nuZ, lightConeTransitionZ, lightConeCoeffZ] - · fin_cases j <;> fin_cases a <;> fin_cases κ <;> - simp_all [nuZ, lightConeTransitionZ, lightConeCoeffZ] - -/-- A bad coordinate-index pattern with even null-sector multiplicity has odd - multiplicity in the column-sign sector. -/ -lemma odd_card_inl_zero_or_inr_one_of_not_isPairedOrDistinct - (d : Fin 4 → Fin 1 ⊕ Fin 3) (hd : ¬IsPairedOrDistinct d) - (hC : ¬Odd (Finset.univ.filter fun s => d s = Sum.inl 0 ∨ d s = Sum.inr 2).card) : - Odd (Finset.univ.filter fun s => d s = Sum.inl 0 ∨ d s = Sum.inr 1).card := by - rw [isPairedOrDistinct_iff_card_parity] at hd - let n0 := (Finset.univ.filter fun s => d s = Sum.inl 0).card - let n1 := (Finset.univ.filter fun s => d s = Sum.inr 0).card - let n2 := (Finset.univ.filter fun s => d s = Sum.inr 1).card - let n3 := (Finset.univ.filter fun s => d s = Sum.inr 2).card - have hsplit (μ ν : Fin 1 ⊕ Fin 3) (hne : μ ≠ ν) : - (Finset.univ.filter fun s => d s = μ ∨ d s = ν).card - = (Finset.univ.filter fun s => d s = μ).card - + (Finset.univ.filter fun s => d s = ν).card := by - rw [Finset.filter_or, Finset.card_union_of_disjoint] - exact Finset.disjoint_filter.2 fun s _ hμ hν => hne (hμ.symm.trans hν) - have hsum : n0 + n1 + n2 + n3 = 4 := by - have h : ∑ μ : 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 h - simpa [n0, n1, n2, n3, Nat.add_assoc] using h - have hnullEven : Even (n0 + n3) := by - rw [← hsplit (Sum.inl 0) (Sum.inr 2) (by simp)] - exact Nat.not_odd_iff_even.mp hC - rw [hsplit (Sum.inl 0) (Sum.inr 1) (by simp), ← Nat.not_even_iff_odd] - intro hcolumnEven - apply hd - have h03 := Nat.even_iff.1 hnullEven - have h02 := Nat.even_iff.1 hcolumnEven - have hparity : ∀ μ, (Finset.univ.filter fun s => d s = μ).card % 2 = n0 % 2 := by - rintro (b | j) - · rw [Subsingleton.elim b 0] - · fin_cases j - · change n1 % 2 = n0 % 2 - omega - · change n2 % 2 = n0 % 2 - omega - · change n3 % 2 = n0 % 2 - omega - rcases Nat.even_or_odd n0 with h0 | h0 - · exact Or.inl fun μ => Nat.even_iff.2 (by rw [hparity μ]; exact Nat.even_iff.1 h0) - · exact Or.inr fun μ => Nat.odd_iff.2 (by rw [hparity μ]; exact Nat.odd_iff.1 h0) - -/-- 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) - (hc' : (∑ s, lightConeWeight (c' s)) = 0) (d : Fin 4 → Fin 1 ⊕ Fin 3) - (hd : ¬IsPairedOrDistinct d) - (hA : ¬(∃ s, ∀ κ, - lightConeTransitionZ 1 2 (c' s) κ * lightConeCoeffZ 2 κ (d s) = 0)) - (hC : ¬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 - push Not at hA - have hcolumn := - odd_card_inl_zero_or_inr_one_of_not_isPairedOrDistinct d hd hC - have hrow : Even (Finset.univ.filter fun s => c' s = 0 ∨ c' s = 1).card := - even_card_null_of_sum_lightConeWeight_eq_zero c' hc' - have hfactor (s : Fin 4) : - nuZ (c' s) (d s) = - (if c' s = 0 ∨ c' s = 1 then -1 else 1) * - (if d s = Sum.inl 0 ∨ d s = Sum.inr 1 then -1 else 1) := - nuZ_eq_row_sign_mul_column_sign (c' s) (d s) (hA s) - calc - (∏ s, nuZ (c' s) (d s)) = - (∏ s, if c' s = 0 ∨ c' s = 1 then (-1 : ℤ) else 1) * - (∏ s, if d s = Sum.inl 0 ∨ d s = Sum.inr 1 then (-1 : ℤ) else 1) := by - rw [← Finset.prod_mul_distrib] - exact Finset.prod_congr rfl fun s _ => hfactor s - _ = (-1 : ℤ) ^ - ((Finset.univ.filter fun s => c' s = 0 ∨ c' s = 1).card + - (Finset.univ.filter fun s => d s = Sum.inl 0 ∨ d s = Sum.inr 1).card) := by - rw [pow_add] - congr 1 <;> - rw [Finset.prod_ite, Finset.prod_const, Finset.prod_const, one_pow, mul_one] - _ = -1 := Odd.neg_one_pow (Even.add_odd hrow hcolumn) - -/-- 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) - refine sum_weightZero_eq_zero_of_swap01_neg _ fun c'' => ?_ - rw [hswap c'', hsgn, neg_one_mul] +/-- A direction in the boost plane has no transverse light-cone components. -/ +lemma lightConeCoeffInvZ_eq_zero_of_inBoostPlane {i : Fin 3} {μ : Fin 1 ⊕ Fin 3} + (hμ : InBoostPlane i μ) {κ : Fin 4} (hκ : κ = 2 ∨ κ = 3) : + lightConeCoeffInvZ i μ κ = 0 := by + rcases hμ with rfl | rfl <;> rcases hκ with rfl | rfl <;> simp [lightConeCoeffInvZ] + +/-- A transverse direction has no light-cone components in the boost plane. -/ +lemma lightConeCoeffInvZ_eq_zero_of_not_inBoostPlane {i : Fin 3} {μ : Fin 1 ⊕ Fin 3} + (hμ : ¬InBoostPlane i μ) {κ : Fin 4} (hκ : κ = 0 ∨ κ = 1) : + lightConeCoeffInvZ i μ κ = 0 := by + simp only [InBoostPlane, not_or] at hμ + rcases hκ with rfl | rfl <;> simp [lightConeCoeffInvZ, hμ.1, hμ.2] + +/-- One slot's factor: twice the coefficient of `κ` in `μ`, times that of `ν` in `κ`. -/ +def slotZ (i : Fin 3) (κ : Fin 4) (μ ν : Fin 1 ⊕ Fin 3) : ℤ := + lightConeCoeffInvZ i μ κ * lightConeCoeffZ i κ ν + +/-- Sixteen times the entry, at `d` and `e`, of the map keeping the light-cone components of total + weight `m` along axis `i`. A slot of `d` in the boost plane takes weight `2` or `-2`, leaving + `m - 2` or `m + 2`; a transverse slot takes weight `0` and leaves `m`. -/ +def transitionZ (i : Fin 3) : {n : ℕ} → (d e : Fin n → Fin 1 ⊕ Fin 3) → ℤ → ℤ + | 0, _, _, m => if m = 0 then 1 else 0 + | _ + 1, d, e, m => + if InBoostPlane i (d 0) then + slotZ i 0 (d 0) (e 0) * transitionZ i (Fin.tail d) (Fin.tail e) (m - 2) + + slotZ i 1 (d 0) (e 0) * transitionZ i (Fin.tail d) (Fin.tail e) (m + 2) + else (slotZ i 2 (d 0) (e 0) + slotZ i 3 (d 0) (e 0)) + * transitionZ i (Fin.tail d) (Fin.tail e) m + +/-- The recursion unfolded, as a sum over the multi-indices of total weight `m`. -/ +lemma transitionZ_eq_sum (i : Fin 3) : + ∀ {n : ℕ} (d e : Fin n → Fin 1 ⊕ Fin 3) (m : ℤ), + transitionZ i d e m + = ∑ κ ∈ Finset.univ.filter + (fun κ : Fin n → Fin 4 => (∑ s, lightConeWeight (κ s)) = m), + ∏ s, slotZ i (κ s) (d s) (e s) + | 0, d, e, m => by + rw [Finset.sum_filter, Fintype.sum_unique] + simp [transitionZ, eq_comm] + | n + 1, d, e, m => by + have hpeel : ∀ κ : Fin 4, + (∑ κ' : Fin n → Fin 4, if lightConeWeight κ + ∑ s, lightConeWeight (κ' s) = m then + slotZ i κ (d 0) (e 0) * ∏ s, slotZ i (κ' s) (d s.succ) (e s.succ) else 0) + = slotZ i κ (d 0) (e 0) + * transitionZ i (Fin.tail d) (Fin.tail e) (m - lightConeWeight κ) := by + intro κ + rw [transitionZ_eq_sum i (Fin.tail d) (Fin.tail e), Finset.sum_filter, Finset.mul_sum] + exact Finset.sum_congr rfl fun κ' _ => by + rw [mul_ite, mul_zero] + exact if_congr (by omega) rfl rfl + calc transitionZ i d e m + = ∑ κ : Fin 4, slotZ i κ (d 0) (e 0) + * transitionZ i (Fin.tail d) (Fin.tail e) (m - lightConeWeight κ) := by + rw [Fin.sum_univ_four, transitionZ] + simp only [show lightConeWeight 0 = 2 from rfl, show lightConeWeight 1 = -2 from rfl, + show lightConeWeight 2 = 0 from rfl, show lightConeWeight 3 = 0 from rfl, + sub_neg_eq_add, sub_zero] + by_cases h : InBoostPlane i (d 0) + · rw [if_pos h] + simp [slotZ, lightConeCoeffInvZ_eq_zero_of_inBoostPlane h] + · rw [if_neg h] + simp [slotZ, lightConeCoeffInvZ_eq_zero_of_not_inBoostPlane h] + ring + _ = _ := by + rw [Finset.sum_filter, + ← Equiv.sum_comp (Fin.consEquiv fun _ : Fin (n + 1) => Fin 4), Fintype.sum_prod_type] + refine Finset.sum_congr rfl fun κ _ => ?_ + rw [← hpeel κ] + refine Finset.sum_congr rfl fun κ' _ => ?_ + simp only [Fin.consEquiv_apply, Fin.sum_univ_succ, Fin.prod_univ_succ, Fin.cons_zero, + Fin.cons_succ] + +/-- A coefficient tensor is recovered from its light-cone components. -/ +lemma eq_sum_lightConeComponent (i : Fin 3) (c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ) + (d : Fin 4 → Fin 1 ⊕ Fin 3) : + c d = ∑ κ, (∏ s, lightConeCoeffInv i (d s) (κ s)) * lightConeComponent i c κ := by + simp only [lightConeComponent, Finset.mul_sum, ← mul_assoc] + rw [Finset.sum_comm] + simp only [← Finset.sum_mul, sum_prod_lightConeCoeffInv, ite_mul, one_mul, zero_mul, + Finset.sum_ite_eq, Finset.mem_univ, if_true] + +/-- An invariant coefficient tensor is its own weight-zero projection. -/ +lemma IsInvariantCoeff.sixteen_mul_eq_sum_transitionZ {c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ} + (hc : IsInvariantCoeff c) (i : Fin 3) (d : Fin 4 → Fin 1 ⊕ Fin 3) : + 16 * c d = ∑ e, ((transitionZ i d e 0 : ℤ) : ℂ) * c e := by + rw [eq_sum_lightConeComponent i c d, ← Finset.sum_filter_add_sum_filter_not Finset.univ + (fun κ : Fin 4 → Fin 4 => ∑ s, lightConeWeight (κ s) = 0), + Finset.sum_eq_zero (s := Finset.univ.filter fun κ : Fin 4 → Fin 4 => + ¬∑ s, lightConeWeight (κ s) = 0) fun κ hκ => by + rw [hc.lightConeComponent_eq_zero i (Finset.mem_filter.1 hκ).2, mul_zero], + add_zero] + simp only [lightConeComponent, Finset.mul_sum, transitionZ_eq_sum, Int.cast_sum, Finset.sum_mul] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun κ hκ => Finset.sum_congr rfl fun e _ => ?_ + simp only [slotZ, Int.cast_prod, Int.cast_mul, coe_lightConeCoeffInvZ_eq_two_mul, + coe_lightConeCoeffZ, Finset.prod_mul_distrib, Finset.prod_const, Finset.card_univ, + Fintype.card_fin] + ring /-! -## E.2. Sector compatibility and the support of the weight-zero transition +## F. The `22` orbit coordinates and the orbit matrix -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`. +## F.1. The orbits +Write an index vector as a word, `tttt` or `txxt`. Cycling the axes carries one to another and +three cyclings return it, so they fall into orbits of at most three: `txxt`, `tyyt`, `tzzt` +form one, and `tttt` is alone. By D an invariant tensor vanishes off the `64` flip-fixed +vectors and is constant on each orbit, and those `64` make `22` orbits, `21` of size three plus +`tttt`; `orbitRep` lists one from each, and the two lemmas below check at all `256` index +vectors that these cover the flip-fixed ones without overlapping. So an invariant tensor is its +`22` values at the representatives, its orbit coordinates, which `ofOrbitCoord` inverts. -/ -/-- 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 +/-- One index vector from each of the `22` orbits, checked by the two lemmas below. -/ +def orbitRep : Fin 22 → Fin 4 → Fin 1 ⊕ Fin 3 := + ![![Sum.inl 0, Sum.inl 0, Sum.inl 0, Sum.inl 0], -- tttt + ![Sum.inl 0, Sum.inl 0, Sum.inr 0, Sum.inr 0], -- ttxx + ![Sum.inl 0, Sum.inr 0, Sum.inl 0, Sum.inr 0], -- txtx + ![Sum.inl 0, Sum.inr 0, Sum.inr 0, Sum.inl 0], -- txxt + ![Sum.inl 0, Sum.inr 0, Sum.inr 1, Sum.inr 2], -- txyz + ![Sum.inl 0, Sum.inr 0, Sum.inr 2, Sum.inr 1], -- txzy + ![Sum.inr 0, Sum.inl 0, Sum.inl 0, Sum.inr 0], -- xttx + ![Sum.inr 0, Sum.inl 0, Sum.inr 0, Sum.inl 0], -- xtxt + ![Sum.inr 0, Sum.inl 0, Sum.inr 1, Sum.inr 2], -- xtyz + ![Sum.inr 0, Sum.inl 0, Sum.inr 2, Sum.inr 1], -- xtzy + ![Sum.inr 0, Sum.inr 0, Sum.inl 0, Sum.inl 0], -- xxtt + ![Sum.inr 0, Sum.inr 0, Sum.inr 0, Sum.inr 0], -- xxxx + ![Sum.inr 0, Sum.inr 0, Sum.inr 1, Sum.inr 1], -- xxyy + ![Sum.inr 0, Sum.inr 0, Sum.inr 2, Sum.inr 2], -- xxzz + ![Sum.inr 0, Sum.inr 1, Sum.inl 0, Sum.inr 2], -- xytz + ![Sum.inr 0, Sum.inr 1, Sum.inr 0, Sum.inr 1], -- xyxy + ![Sum.inr 0, Sum.inr 1, Sum.inr 1, Sum.inr 0], -- xyyx + ![Sum.inr 0, Sum.inr 1, Sum.inr 2, Sum.inl 0], -- xyzt + ![Sum.inr 0, Sum.inr 2, Sum.inl 0, Sum.inr 1], -- xzty + ![Sum.inr 0, Sum.inr 2, Sum.inr 0, Sum.inr 2], -- xzxz + ![Sum.inr 0, Sum.inr 2, Sum.inr 1, Sum.inl 0], -- xzyt + ![Sum.inr 0, Sum.inr 2, Sum.inr 2, Sum.inr 0]] -- xzzx + +/-- The `k`-th representative and its two cyclings; for `tttt` the three coincide. -/ +def orbit (k : Fin 22) : Finset (Fin 4 → Fin 1 ⊕ Fin 3) := + {orbitRep k, cycIdx (orbitRep k), cycIdx (cycIdx (orbitRep k))} + +/-- The vectors in one of the `22` orbits are exactly the flip-fixed ones, a finite check. -/ +lemma isFlipFixed_iff_exists_mem_orbit : + ∀ d, IsFlipFixed d ↔ ∃ k, d ∈ orbit k := 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 +/-- Different orbits share no index vector, a finite check. -/ +lemma disjoint_orbit : ∀ k l : Fin 22, k ≠ l → Disjoint (orbit k) (orbit l) := by decide +kernel -/-- 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 (i : Fin 3) (e : Fin 4 → Fin 1 ⊕ Fin 3) - (he : IsPairedOrDistinct e) (d : Fin 4 → Fin 1 ⊕ Fin 3) - (hd : ¬IsPairedOrDistinct d) (hs : ∀ s, SameSlotSector i (e s) (d s)) : - (∏ s, nuSignZ i (e s) (d s)) = -1 := by - 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. -/ -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) - 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] - 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] - -/-! - -## 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, - ((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] +/-- An index vector lies in at most one orbit. -/ +lemma eq_of_mem_orbit {k l : Fin 22} {d : Fin 4 → Fin 1 ⊕ Fin 3} + (hk : d ∈ orbit k) (hl : d ∈ orbit l) : k = l := + by_contra fun h => Finset.disjoint_left.1 (disjoint_orbit k l h) hk hl + +/-- A tensor unchanged by cycling takes, on an orbit, its value at the representative. -/ +lemma eq_orbitRep_of_mem_orbit {c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ} + (hc : ∀ d, c (cycIdx d) = c d) {k : Fin 22} {d : Fin 4 → Fin 1 ⊕ Fin 3} + (h : d ∈ orbit k) : c d = c (orbitRep k) := by + simp only [orbit, Finset.mem_insert, Finset.mem_singleton] at h + rcases h with rfl | rfl | rfl + · rfl + · exact hc _ + · rw [hc, hc] + +/-- The coefficient tensor with orbit coordinates `b`, and `0` off the orbits. -/ +noncomputable def ofOrbitCoord (b : Fin 22 → ℂ) (d : Fin 4 → Fin 1 ⊕ Fin 3) : ℂ := + ∑ k, if d ∈ orbit k then b k else 0 + +/-- An invariant coefficient tensor is rebuilt from its `22` orbit coordinates. -/ +lemma IsInvariantCoeff.eq_ofOrbitCoord {c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ} (hc : IsInvariantCoeff c) : + c = ofOrbitCoord fun k => c (orbitRep k) := by + funext d + by_cases hd : IsFlipFixed d + · obtain ⟨k, hk⟩ := (isFlipFixed_iff_exists_mem_orbit d).1 hd + rw [ofOrbitCoord, Finset.sum_eq_single k, if_pos hk, + eq_orbitRep_of_mem_orbit hc.apply_cycIdx hk] + · exact fun l _ hl => if_neg fun hdl => hl (eq_of_mem_orbit hdl hk) + · exact fun h => absurd (Finset.mem_univ k) h + · rw [hc.eq_zero_of_not_isFlipFixed hd] + exact (Finset.sum_eq_zero fun k _ => + if_neg fun hk => hd ((isFlipFixed_iff_exists_mem_orbit d).2 ⟨k, hk⟩)).symm + +/-- Contracting against such a tensor collects the `256` index vectors into the `22` orbits. -/ +lemma sum_mul_ofOrbitCoord (f : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ) (b : Fin 22 → ℂ) : + ∑ e, f e * ofOrbitCoord b e = ∑ l, (∑ e ∈ orbit l, f e) * b l := by + simp only [ofOrbitCoord, Finset.mul_sum, mul_ite, mul_zero] 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 - -/-- The span of the paired-or-distinct components. -/ -def pairedOrDistinctSubmodule : Submodule ℂ B := - ⨆ d ∈ {d : Fin 4 → Fin 1 ⊕ Fin 3 | IsPairedOrDistinct d}, ℂ ∙ T d - + exact Finset.sum_congr rfl fun l _ => by + rw [Finset.sum_ite_mem, Finset.univ_inter, Finset.sum_mul] /-! -## F. Averaging over the cyclic rotation of the axes +## F.2. The orbit matrix -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. +Take `16 c_d = ∑_e transitionZ 2 d e 0 * c_e` at a representative and its two cyclings and add. +The left gives `48` times one orbit coordinate, the right collects the `256` index vectors into +the `22` orbits, and what is left is `M b = 48 b` with `M = orbitMatrix` below and +`48 = 3 * 16`. Entry `M k l` sums the transitions from the three cyclings of the representative +of orbit `k` into orbit `l` (`orbitMatrix_apply`, checked over `484` entries), so the printed +integers are not meant to be read; `M` is not symmetric, a row carrying three cyclings and a +column an orbit. +-/ -## 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. - --/ - -/-- 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 - -/-- 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 - 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]⟩ - -/-! - -## 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; `rotationSubset` lists the -canonical representatives explicitly. - --/ - -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 - 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 [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 - 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] - -/-! - -## 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 - decide +kernel - -/-- Goodness is preserved by rotating the index. -/ -lemma isPairedOrDistinct_cycDir (d : Fin 4 → Fin 1 ⊕ Fin 3) - (hd : IsPairedOrDistinct d) : IsPairedOrDistinct (fun s => cycDir (d s)) := by - rcases hd with ⟨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) : ℤ := - (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) - -/-- Cycles every Lorentz direction in an index vector. -/ -private abbrev rotateIndex {ι : Type*} (d : ι → Fin 1 ⊕ Fin 3) := - fun s => cycDir (d s) - -/-- Cycling every direction three times fixes an index vector. -/ -private lemma rotateIndex_three {ι : Type*} (d : ι → Fin 1 ⊕ Fin 3) : - rotateIndex (rotateIndex (rotateIndex d)) = d := by - funext s - exact cycDir_cycDir_cycDir (d s) - -/-- Two consecutive members of a rotation orbit can both be canonical only when they coincide. -/ -private lemma isOrbitRep_rotateIndex_eq_self {d : Fin 4 → Fin 1 ⊕ Fin 3} - (hd : IsOrbitRep d) (hr : IsOrbitRep (rotateIndex d)) : rotateIndex d = d := by - rcases hd with hall | ⟨s, hs, hbefore⟩ - · funext s - simp [rotateIndex, hall s] - · exfalso - rcases hr with hall | ⟨t, ht, htbefore⟩ - · have h := hall s - simp [rotateIndex, hs] at h - · obtain hlt | heq | hgt := lt_trichotomy t s - · have h := ht - simp [rotateIndex, hbefore t hlt] at h - · subst t - simp [rotateIndex, hs] at ht - · have h := htbefore s hgt - simp [rotateIndex, hs] at h - -/-- Canonical representatives two rotations apart coincide. -/ -private lemma isOrbitRep_rotateIndex_rotateIndex_eq_self {d : Fin 4 → Fin 1 ⊕ Fin 3} - (hd : IsOrbitRep d) (hr : IsOrbitRep (rotateIndex (rotateIndex d))) : - rotateIndex (rotateIndex d) = d := by - have h := isOrbitRep_rotateIndex_eq_self hr - (show IsOrbitRep (rotateIndex (rotateIndex (rotateIndex d))) by - simpa only [rotateIndex_three] using hd) - rw [rotateIndex_three] at h - exact h.symm - -/-- A canonical index is its own chosen orbit representative. -/ -private lemma orbitRepOf_eq_self {d : Fin 4 → Fin 1 ⊕ Fin 3} (hd : IsOrbitRep d) : - orbitRepOf d = d := by - simp [orbitRepOf, hd] - -/-- The representative chosen from the first rotation of a canonical index is that index. -/ -private lemma orbitRepOf_rotateIndex_eq_self {d : Fin 4 → Fin 1 ⊕ Fin 3} - (hd : IsOrbitRep d) : orbitRepOf (rotateIndex d) = d := by - rw [orbitRepOf] - split_ifs with h1 h2 - · exact isOrbitRep_rotateIndex_eq_self hd h1 - · exact isOrbitRep_rotateIndex_rotateIndex_eq_self hd h2 - · exact rotateIndex_three d - -/-- The representative chosen from the second rotation of a canonical index is that index. -/ -private lemma orbitRepOf_rotateIndex_rotateIndex_eq_self {d : Fin 4 → Fin 1 ⊕ Fin 3} - (hd : IsOrbitRep d) : orbitRepOf (rotateIndex (rotateIndex d)) = d := by - rw [orbitRepOf] - split_ifs with h1 h2 - · exact isOrbitRep_rotateIndex_rotateIndex_eq_self hd h1 - · exact rotateIndex_three d - · exfalso - apply h2 - rw [show (fun s => cycDir (cycDir (cycDir (d s)))) = d from - funext fun s => cycDir_cycDir_cycDir (d s)] - exact hd - -/-- Cyclically shifting the three displayed members of a rotation orbit does not change its set. -/ -private lemma rotationIndexSet_rotateIndex (d : Fin 4 → Fin 1 ⊕ Fin 3) : - rotationIndexSet (rotateIndex d) = rotationIndexSet d := by - change rotationIndexSet (fun s => cycDir (d s)) = rotationIndexSet d - ext e - simp only [rotationIndexSet, Finset.mem_insert, Finset.mem_singleton] - rw [show (fun s => cycDir (cycDir (cycDir (d s)))) = d from - funext fun s => cycDir_cycDir_cycDir (d s)] - constructor - · rintro (h | h | h) - · exact Or.inr (Or.inl h) - · exact Or.inr (Or.inr h) - · exact Or.inl h - · rintro (h | h | h) - · exact Or.inr (Or.inr h) - · exact Or.inl h - · exact Or.inr (Or.inl h) - -/-- A rotation-fixed index has no spatial directions and is therefore canonical. -/ -private lemma isOrbitRep_of_rotateIndex_eq_self {d : Fin 4 → Fin 1 ⊕ Fin 3} - (h : rotateIndex d = d) : IsOrbitRep d := by - left - intro s - have hs := congrFun h s - rcases hds : d s with x | x - · congr 1 - exact Subsingleton.elim _ _ - · simp only [rotateIndex, hds, cycDir_inr, Sum.inr.injEq] at hs - fin_cases x <;> norm_num at hs - -/-- A nonzero orbit coefficient says that the index is one of the three displayed rotations. -/ -private lemma eq_or_eq_rotateIndex_or_eq_rotateIndex_rotateIndex_of_rotationOrbitCoeff_ne_zero - {e d : Fin 4 → Fin 1 ⊕ Fin 3} (h : rotationOrbitCoeff e d ≠ 0) : - d = e ∨ d = rotateIndex e ∨ d = rotateIndex (rotateIndex e) := by - by_contra hn - push Not at hn - simp [rotationOrbitCoeff, hn] at h - -/-- Every explicitly listed representative satisfies the structural canonicality predicate. -/ -private lemma isOrbitRep_of_mem_rotationSubset : - ∀ r ∈ rotationSubset, IsOrbitRep r := by - set_option maxRecDepth 10000 in - decide - -/-- Every index in the rotation orbit of a canonical representative chooses that representative. -/ -private lemma orbitRepOf_eq_of_isOrbitRep_of_rotationOrbitCoeff_ne_zero - {r d : Fin 4 → Fin 1 ⊕ Fin 3} (hr : IsOrbitRep r) - (h : rotationOrbitCoeff r d ≠ 0) : orbitRepOf d = r := by - rcases eq_or_eq_rotateIndex_or_eq_rotateIndex_rotateIndex_of_rotationOrbitCoeff_ne_zero h - with rfl | rfl | rfl - · exact orbitRepOf_eq_self hr - · exact orbitRepOf_rotateIndex_eq_self hr - · exact orbitRepOf_rotateIndex_rotateIndex_eq_self hr - -/-- Only members of the orbit of a listed representative meet its indicator. -/ -lemma orbitRepOf_eq_of_rotationOrbitCoeff_ne_zero (r : Fin 4 → Fin 1 ⊕ Fin 3) - (hr : r ∈ rotationSubset) (d : Fin 4 → Fin 1 ⊕ Fin 3) - (h : rotationOrbitCoeff r d ≠ 0) : orbitRepOf d = r := by - exact orbitRepOf_eq_of_isOrbitRep_of_rotationOrbitCoeff_ne_zero - (isOrbitRep_of_mem_rotationSubset r hr) h - -/-- 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 - rw [orbitRepOf] - split_ifs - · rfl - · exact rotationIndexSet_rotateIndex d - · exact (rotationIndexSet_rotateIndex (rotateIndex d)).trans (rotationIndexSet_rotateIndex d) - -/-- 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 - by_cases hfix : (fun s => cycDir (d s)) = d - · rw [if_pos hfix, orbitRepOf_eq_self (isOrbitRep_of_rotateIndex_eq_self hfix)] - have h2 : (fun s => cycDir (cycDir (d s))) = d := by - funext s - exact (congrArg cycDir (congrFun hfix s)).trans (congrFun hfix s) - simp [rotationOrbitCoeff, hfix, h2] - · rw [if_neg hfix] - obtain ⟨h2, _⟩ := cycDir_orbit_distinct d hfix - have hfix' : d ≠ (fun s => cycDir (d s)) := Ne.symm hfix - have h2' : d ≠ (fun s => cycDir (cycDir (d s))) := Ne.symm h2 - have h3 : (fun s => cycDir (cycDir (cycDir (d s)))) = d := - funext fun s => cycDir_cycDir_cycDir (d s) - have h4 : (fun s => cycDir (cycDir (cycDir (cycDir (d s))))) = - (fun s => cycDir (d s)) := by - funext s - rw [cycDir_cycDir_cycDir] - rw [orbitRepOf] - split_ifs - · simp [rotationOrbitCoeff, hfix', h2'] - · simp [rotationOrbitCoeff, hfix', h2', h3] - · simp [rotationOrbitCoeff, hfix', h2', h3, h4] - -/-- 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 - -/-! - -## 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. - -## G.1. Enumerating the representatives - --/ - -/-- 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] - -/-! - -## 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 - 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 - -/-- 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 => - 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) - -/-- 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 - -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) : ℤ := - 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_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 - _ = 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] - -/-! - -## 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. -/ -def boostAverageOrbitZ : Matrix (Fin 22) (Fin 22) ℤ := - !![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; +/-- Forty-eight times the weight-zero projection along `z` on the orbit coordinates, the three + cyclings summed and not averaged, so `48 = 3 * 16`. Meaningful only through + `orbitMatrix_apply`. -/ +def orbitMatrix : Matrix (Fin 22) (Fin 22) ℤ := + !![18, -6, -6, -6, 0, 0, -6, -6, 0, 0, -6, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0; + -2, 22, -2, -2, 0, 0, -2, -2, 0, 0, 6, -2, -8, -8, 0, 0, 0, 0, 0, 0, 0, 0; + -2, -2, 22, -2, 0, 0, -2, 6, 0, 0, -2, -2, 0, 0, 0, -8, 0, 0, 0, -8, 0, 0; + -2, -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; + -2, -2, -2, 6, 0, 0, 22, -2, 0, 0, -2, -2, 0, 0, 0, 0, -8, 0, 0, 0, 0, -8; + -2, -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; + -2, 6, -2, -2, 0, 0, -2, -2, 0, 0, 22, -2, -8, -8, 0, 0, 0, 0, 0, 0, 0, 0; + 6, -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; @@ -2302,1193 +927,194 @@ def boostAverageOrbitZ : Matrix (Fin 22) (Fin 22) ℤ := 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] -/-- Entrywise decidability for integer families indexed by two copies of `Fin n`. - The pointwise `Decidable` instances are supplied explicitly: instance search cannot - see through the `Matrix` type synonym when the two indices are bound. -/ -private instance decidableForallEntriesZ {n : ℕ} (f : Matrix (Fin n) (Fin n) ℤ) +/-- Decidability for a matrix against a function; search misses the `Matrix` synonym. -/ +private instance decidableForallEntries {n : ℕ} (f : Matrix (Fin n) (Fin n) ℤ) (g : Fin n → Fin n → ℤ) : Decidable (∀ k l, f k l = g k l) := @Nat.decidableForallFin n _ fun _ => @Nat.decidableForallFin n _ fun _ => Int.instDecidableEq _ _ -/-- The same, with both sides matrices. -/ -private instance decidableForallEntriesZ' {n : ℕ} (f g : Matrix (Fin n) (Fin n) ℤ) : +/-- The same for two matrices, which is the shape of `certificate`. -/ +private instance decidableForallEntries' {n : ℕ} (f g : Matrix (Fin n) (Fin n) ℤ) : Decidable (∀ k l, f k l = g k l) := @Nat.decidableForallFin n _ fun _ => @Nat.decidableForallFin n _ fun _ => Int.instDecidableEq _ _ -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 +/-- Each entry sums the `z`-axis transitions from orbit `k` into orbit `l`, a finite check. -/ +lemma orbitMatrix_apply : ∀ k l : Fin 22, + orbitMatrix k l = ∑ e ∈ orbit l, (transitionZ 2 (orbitRep k) e 0 + + transitionZ 2 (cycIdx (orbitRep k)) e 0 + + transitionZ 2 (cycIdx (cycIdx (orbitRep k))) e 0) := 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_eq_sum] - 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 - -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] - -/-! - -## H. The certificate polynomial and the contraction projector - -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 - `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_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 - 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 +/-- The orbit coordinates of an invariant coefficient tensor satisfy `M b = 48 b`. -/ +lemma IsInvariantCoeff.orbitMatrix_mulVec {c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ} + (hc : IsInvariantCoeff c) : + orbitMatrix.map (Int.cast : ℤ → ℂ) *ᵥ (fun k => c (orbitRep k)) + = (48 : ℂ) • fun k => c (orbitRep k) := by + have h : ∀ d, 16 * c d + = ∑ l, (∑ e ∈ orbit l, ((transitionZ 2 d e 0 : ℤ) : ℂ)) * c (orbitRep l) := by + intro d + rw [hc.sixteen_mul_eq_sum_transitionZ 2 d] + conv_lhs => rw [hc.eq_ofOrbitCoord] + exact sum_mul_ofOrbitCoord _ _ + funext k + have h₀ := h (orbitRep k) + have h₁ := h (cycIdx (orbitRep k)) + have h₂ := h (cycIdx (cycIdx (orbitRep k))) + rw [hc.apply_cycIdx] at h₁ + rw [hc.apply_cycIdx, hc.apply_cycIdx] at h₂ + simp only [Matrix.mulVec, dotProduct, Matrix.map_apply, orbitMatrix_apply, Pi.smul_apply, + smul_eq_mul, Int.cast_sum, Int.cast_add, Finset.sum_add_distrib, add_mul] + linear_combination -(h₀ + h₁ + h₂) /-! -## I. The four invariant contractions - -## I.1. The metric and Levi-Civita contractions - -The three double metric contractions — outer `g^{μν} g^{ρσ} T_{μνρσ}`, inner -`g^{μρ} g^{νσ} T_{μνρσ}`, split `g^{μσ} g^{νρ} T_{μνρσ}` — and the Levi-Civita -contraction `ε^{μνρσ} T_{μνρσ}`. - --/ - -/-- 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 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 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 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_{μνρσ}`. -/ -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_{μνρσ}`. -/ -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_{μνρσ}`. -/ -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 - -Integer orbit vectors and weight rows for each contraction; three times the projector -is the sum of their four rank-one products. +## G. The certificate --/ - -/-- 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] - -/-- 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 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] +F leaves `M b = 48 b` for the orbit coordinates `b k = c (orbitRep k)`. Four solutions are +known, the orbit coordinates `v i = contractionOrbit i` of the tensors of B; there are no +others, by one identity between `22 × 22` integer matrices: -/-- 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 - -/-! - -## I.3. The orbit vectors represent the contractions +`M (M - 32) (M - 16) (M² - 44 M + 192) = 393216 • projector`, +where `projector = ∑ i, (v i) (w i)ᵀ` is four rank-one matrices built from the columns `v i` +and rows `w i = contractionWeight i`, so it sends any vector to a combination of the `v i`. +Lean checks it by computing all `484` entries of each side. On a solution `b` every factor +turns `M` into `48`, giving `48² - 44 * 48 + 192 = 384`, then `32`, `16`, `48`, so the left +sends `b` to `48 * 16 * 32 * 384 = 9437184` times `b` and the right to `393216 • (projector b)`. +As `9437184 = 393216 * 24` this leaves `projector b = 24 b`, writing `b`, and with it `c`, as a +combination of the four; the `24` is `contractionWeight_mul_contractionOrbit`. The identity is +`λ (3λ - 2) (3λ - 1) (12λ² - 11λ + 1) / 4` at `λ = M / 48` with denominators cleared, but that +is only where it came from: the file proves nothing about the spectrum. -/ -/-- 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 +/-- The orbit coordinates of the `i`-th coefficient tensor. -/ +def contractionOrbit (i : Fin 4) (k : Fin 22) : ℤ := contractionCoeff i (orbitRep k) + +/-- Four rows of `22` integers paired with `contractionOrbit` to build `projector`. Found by + computation and characterised by `contractionWeight_mul_contractionOrbit`; unrelated to boost + weight. -/ +def contractionWeight : Fin 4 → Fin 22 → ℤ := + ![![1, -5, 1, 1, 0, 0, 1, 1, 0, 0, -5, 3, 5, 5, 0, -1, -1, 0, 0, -1, 0, -1], + ![1, 1, -5, 1, 0, 0, 1, -5, 0, 0, 1, 3, -1, -1, 0, 5, -1, 0, 0, 5, 0, -1], + ![1, 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]] + +/-- The weight rows and orbit coordinates pair to `24 δᵢⱼ`, a finite check. -/ +lemma contractionWeight_mul_contractionOrbit : ∀ i j : Fin 4, + ∑ k, contractionWeight i k * contractionOrbit j k = if i = j then 24 else 0 := 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 +/-- Four rank-one matrices, so it sends any vector to a combination of the `v i`. -/ +def projector : Matrix (Fin 22) (Fin 22) ℤ := + Matrix.of fun k l => ∑ i, contractionOrbit i k * contractionWeight i l -/-- 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 +/-- An identity between `22 × 22` integer matrices, a finite check over `484` entries. -/ +lemma certificate : + orbitMatrix * (orbitMatrix - 32 • 1) * (orbitMatrix - 16 • 1) + * (orbitMatrix * orbitMatrix - 44 • orbitMatrix + 192 • 1) = 393216 • projector := by + ext k l + revert k l 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 - -/-! - -## I.4. The projector round lands in the contractions - --/ - -include hT in -/-- 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) : - ∃ 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] +/-- `24` times the orbit coordinates of an invariant tensor is `projector` applied to them. -/ +lemma IsInvariantCoeff.orbitCoord_eq {c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ} (hc : IsInvariantCoeff c) + (k : Fin 22) : + 24 * c (orbitRep k) + = ∑ i, (contractionOrbit i k : ℂ) * ∑ l, (contractionWeight i l : ℂ) * c (orbitRep l) := by + set b : Fin 22 → ℂ := fun k => c (orbitRep k) with hb + set M : Matrix (Fin 22) (Fin 22) ℂ := orbitMatrix.map (Int.cast : ℤ → ℂ) with hM + have hMb : M *ᵥ b = (48 : ℂ) • b := hc.orbitMatrix_mulVec + have hlin : ∀ z : ℂ, (M - z • 1) *ᵥ b = (48 - z) • b := fun z => by + rw [Matrix.sub_mulVec, hMb, Matrix.smul_mulVec, Matrix.one_mulVec, sub_smul] + have hquad : (M * M - (44 : ℂ) • M + (192 : ℂ) • 1) *ᵥ b = (384 : ℂ) • b := by + rw [Matrix.add_mulVec, Matrix.sub_mulVec, ← Matrix.mulVec_mulVec, hMb, Matrix.mulVec_smul, + hMb, Matrix.smul_mulVec, hMb, Matrix.smul_mulVec, Matrix.one_mulVec, smul_smul, smul_smul, + ← sub_smul, ← add_smul] + norm_num + have h₂ : (M - (16 : ℂ) • 1) *ᵥ ((384 : ℂ) • b) = (12288 : ℂ) • b := by + rw [Matrix.mulVec_smul, hlin, smul_smul] + norm_num + have h₃ : (M - (32 : ℂ) • 1) *ᵥ ((12288 : ℂ) • b) = (196608 : ℂ) • b := by + rw [Matrix.mulVec_smul, hlin, smul_smul] + norm_num + have h₄ : M *ᵥ ((196608 : ℂ) • b) = (9437184 : ℂ) • b := by + rw [Matrix.mulVec_smul, hMb, smul_smul] + norm_num + have hcert : M * (M - (32 : ℂ) • 1) * (M - (16 : ℂ) • 1) + * (M * M - (44 : ℂ) • M + (192 : ℂ) • 1) + = (393216 : ℂ) • projector.map (Int.cast : ℤ → ℂ) := by + have h := congrArg (Int.castRingHom ℂ).mapMatrix certificate + simpa only [map_mul, map_sub, map_add, map_nsmul, map_one, RingHom.mapMatrix_apply, + Int.coe_castRingHom, ← Nat.cast_smul_eq_nsmul ℂ, Nat.cast_ofNat, ← hM] using h + have hpb : (M * (M - (32 : ℂ) • 1) * (M - (16 : ℂ) • 1) + * (M * M - (44 : ℂ) • M + (192 : ℂ) • 1)) *ᵥ b + = ((393216 : ℂ) • projector.map (Int.cast : ℤ → ℂ)) *ᵥ b := by + rw [hcert] + rw [← Matrix.mulVec_mulVec, hquad, ← Matrix.mulVec_mulVec, h₂, ← Matrix.mulVec_mulVec, h₃, h₄, + Matrix.smul_mulVec] at hpb + have hk := congrFun hpb k + simp only [Pi.smul_apply, smul_eq_mul, Matrix.mulVec, dotProduct, Matrix.map_apply, projector, + Matrix.of_apply, Int.cast_sum, Int.cast_mul, Finset.sum_mul, hb] at hk + rw [Finset.sum_comm] at hk + have hk' : (393216 : ℂ) * (24 * c (orbitRep k)) + = (393216 : ℂ) * ∑ i, (contractionOrbit i k : ℂ) + * ∑ l, (contractionWeight i l : ℂ) * c (orbitRep l) := by + rw [← mul_assoc, show (393216 : ℂ) * 24 = 9437184 by norm_num, hk] congr 1 - field_simp - ring - · 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] + exact Finset.sum_congr rfl fun i _ => by + rw [Finset.mul_sum] + exact Finset.sum_congr rfl fun l _ => by ring + exact mul_left_cancel₀ (by norm_num) hk' + +/-- An invariant coefficient tensor is a combination of the four. -/ +theorem IsInvariantCoeff.exists_eq_sum {c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ} (hc : IsInvariantCoeff c) : + ∃ a : Fin 4 → ℂ, c = fun d => ∑ i, a i * ((contractionCoeff i d : ℤ) : ℂ) := by + refine ⟨fun i => 24⁻¹ * ∑ l, (contractionWeight i l : ℂ) * c (orbitRep l), funext fun d => ?_⟩ + have hfour : ∀ i d, ((contractionCoeff i d : ℤ) : ℂ) + = ∑ k, if d ∈ orbit k then (contractionOrbit i k : ℂ) else 0 := + fun i d => congrFun (isInvariantCoeff_contractionCoeff i).eq_ofOrbitCoord d + have hb : ∀ k, c (orbitRep k) = 24⁻¹ * ∑ i, (contractionOrbit i k : ℂ) + * ∑ l, (contractionWeight i l : ℂ) * c (orbitRep l) := + fun k => by rw [← hc.orbitCoord_eq]; ring + conv_lhs => rw [hc.eq_ofOrbitCoord, ofOrbitCoord] + rw [Finset.sum_congr rfl fun k _ => by rw [hb k]] + simp only [hfour, Finset.mul_sum, mul_ite, mul_zero] 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 - -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. - --/ - -/-- 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⟩ := (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 _) ?_ - · 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] + refine Finset.sum_congr rfl fun k _ => ?_ + by_cases hk : d ∈ orbit k + · simp only [hk, if_true, Finset.sum_mul] + exact Finset.sum_congr rfl fun i _ => Finset.sum_congr rfl fun l _ => by ring + · simp [hk] /-! -## J.2. The classification +## H. The classification, and the classification modulo a stable submodule +C to G give `exists_smul_contraction_of_invariant`, the case `S = ⊥` of the theorem. For +general `S`, right to left is immediate and does not use `hS`; left to right passes to the +quotient `B ⧸ S`, that is `B` with `S` declared zero and `S.mkQ` the map to classes. Stability +lets `repLorentz` act there (`quotRep`) and the classes of the components again form a +quadruple Lorentz tensor (`isQuadLorentz_quotRep`), so back in `B` the difference between `x` +and the matching combination of contractions has zero class, hence lies in `S`, and is +invariant as a difference of invariants. -/ 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. -/ +/-- Every Lorentz invariant of the span is a combination of the four contractions. -/ 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) - -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₄⟩ - - -/-! - -## 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. -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. - --/ - -/-- The representation induced on the quotient by a Lorentz-stable submodule. -/ + x = a₁ • outerContraction T + a₂ • innerContraction T + a₃ • splitContraction T + + a₄ • epsilonContraction T := by + obtain ⟨c, hc, rfl⟩ := hT.exists_isInvariantCoeff_of_mem_span hx hinv + obtain ⟨a, rfl⟩ := hc.exists_eq_sum + refine ⟨a 0, a 1, a 2, a 3, ?_⟩ + rw [← sum_smul_contraction] + simp only [contraction_eq, Finset.smul_sum, Finset.sum_smul, smul_smul] + exact Finset.sum_comm + +/-- The representation induced on `B ⧸ S`, well defined because `S` is stable. -/ noncomputable def quotRep (S : Submodule ℂ B) (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) : Representation ℂ SL(2,ℂ) (B ⧸ S) where @@ -3502,105 +1128,67 @@ noncomputable def quotRep (S : Submodule ℂ B) simp only [LinearMap.coe_comp, Function.comp_apply, Submodule.mkQ_apply, Submodule.mapQ_apply, map_mul, Module.End.mul_apply] -@[simp] +/-- `S.mkQ y` is the class of `y`, and the induced representation moves a class by any lift. -/ 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 +/-- Taking classes turns a contraction of the components into one of their classes. -/ +lemma mkQ_sum_smul (S : Submodule ℂ B) (c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ) : + S.mkQ (∑ d, c d • T d) = ∑ d, c d • S.mkQ (T d) := by + rw [map_sum] + exact Finset.sum_congr rfl fun d _ => map_smul _ _ _ + include hT in -/-- The images of the components in the quotient by a Lorentz-stable submodule again - form a quadruple Lorentz tensor. -/ +/-- The classes of the components 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 _ _ _ + rw [quotRep_mkQ, hT.repLorentz_T g l, mkQ_sum_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`, 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. -/ +/-- Left to right in `mem_span_sup_invariant_iff`, proved in the quotient by `S`. -/ 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 + x = a₁ • outerContraction T + a₂ • innerContraction T + a₃ • splitContraction T + + a₄ • epsilonContraction 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 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 + add_zero, hc, mkQ_sum_smul] + exact hT'.sum_smul_mem_span c 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] + quotRep (repLorentz := repLorentz) S hS g (S.mkQ x) = S.mkQ x := + fun g => by 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, - 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 + simp only [outerContraction, innerContraction, splitContraction, epsilonContraction, + ← mkQ_sum_smul] at hcomb + refine ⟨a₁, a₂, a₃, a₄, + x - (a₁ • outerContraction T + a₂ • innerContraction T + a₃ • splitContraction T + + a₄ • epsilonContraction T), ?_, by abel, fun g => ?_⟩ + · rw [← Submodule.ker_mkQ S, LinearMap.mem_ker, map_sub, hcomb, outerContraction, + innerContraction, splitContraction, epsilonContraction] + simp only [map_add, map_smul] + abel · 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. -/ +/-- A vector of `hT.span ⊔ S`, the sums `u + y` with `u` in the span and `y` in the Lorentz-stable + subspace `S`, is invariant exactly when it is a combination of the four contractions plus an + invariant `y` of `S`. `hS` is used only left to right. -/ 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 + x = a₁ • outerContraction T + a₂ • innerContraction T + a₃ • splitContraction T + + a₄ • epsilonContraction 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⟩ @@ -3608,6 +1196,149 @@ theorem mem_span_sup_invariant_iff (x : B) (S : Submodule ℂ B) (Submodule.mem_sup_right hyS), fun g => ?_⟩ rw [map_add, hT.repLorentz_smul_contraction a₁ a₂ a₃ a₄ g, hyinv g] +/-! + +## Aside: what other files import from here + +None of this is used above. A vector has weight `m` along the axis `i` when the boost with +parameter `t` scales it by `t ^ m`, `boostWeightSubmodule` is the space of such vectors, an +invariant has weight `0` along every axis, and weights are independent. The rest repeats E over +`ℚ`, sorting the light-cone directions into sectors: raising `2`, lowering `-2`, transverse `0`. +-/ + +/-- A Lorentz invariant has boost weight zero along every axis, being fixed by every boost. -/ +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] + +/-- Vectors of distinct boost weights adding to zero are each zero. -/ +lemma eq_zero_of_sum_mem_boostWeightSubmodule + {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) : + ∀ 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 vector written as a sum of definite weights equals the weight-zero term. -/ +lemma eq_component_zero_of_mem_boostWeightSubmodule + {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) + (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 + +/-- If each `S m` lies in the weight-`m` space, a weight-zero vector of their join lies in `S 0`. -/ +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⟩ := (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 _) ?_ + · 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] + +/-- The inverse light-cone coefficients of section E over `ℚ`, with the halves kept as halves. -/ +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 + +/-- The integer mirror is twice the rational one. -/ +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 + +/-- The sector of each light-cone direction: `0` raising, `1` lowering, `2` and `3` transverse. -/ +def sectorIndex : Fin 4 → Fin 3 := ![0, 1, 2, 2] + +/-- The boost weight of each sector: `2` raising, `-2` lowering, `0` transverse. -/ +def sectorWeight : Fin 3 → ℤ := ![2, -2, 0] + +/-- The light-cone weight of a direction is the weight of its sector. -/ +lemma lightConeWeight_eq_sectorWeight (κ : Fin 4) : + lightConeWeight κ = sectorWeight (sectorIndex κ) := by + fin_cases κ <;> rfl + +/-- The slot factor summed over the directions of one sector, over `ℚ`. -/ +def slotTransition (i : Fin 3) (κ : Fin 3) (μ ν : Fin 1 ⊕ Fin 3) : ℚ := + ∑ κ' ∈ Finset.univ.filter (fun κ' : Fin 4 => sectorIndex κ' = κ), + lightConeCoeffInvQ i μ κ' * (lightConeCoeffZ i κ' ν : ℚ) + +/-- The slot factor summed over one sector, in closed form over `ℤ`: on the boost plane the + raising sector carries `[[1, -1], [-1, 1]]` and the lowering sector the all-ones matrix, and + the transverse sector is twice the identity on the transverse directions. -/ +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 is the sector sum of the slot factors. -/ +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 + rw [Finset.sum_filter, Fin.sum_univ_four] + rcases μ with a | j <;> rcases ν with b | l + · simp only [Fin.fin_one_eq_zero a, Fin.fin_one_eq_zero b] + fin_cases κ <;> simp [slotTransitionZ, lightConeCoeffInvZ, lightConeCoeffZ, sectorIndex] + · simp only [Fin.fin_one_eq_zero a] + fin_cases κ <;> fin_cases i <;> fin_cases l <;> + simp [slotTransitionZ, lightConeCoeffInvZ, lightConeCoeffZ, sectorIndex] + · simp only [Fin.fin_one_eq_zero b] + fin_cases κ <;> fin_cases i <;> fin_cases j <;> + simp [slotTransitionZ, lightConeCoeffInvZ, lightConeCoeffZ, sectorIndex] + · fin_cases κ <;> fin_cases i <;> fin_cases j <;> fin_cases l <;> + simp [slotTransitionZ, lightConeCoeffInvZ, lightConeCoeffZ, sectorIndex] + +/-- The integer sector matrix is twice the rational one, which is what the two names promise. -/ +lemma coe_slotTransitionZ (i : Fin 3) (κ : Fin 3) (μ ν : Fin 1 ⊕ Fin 3) : + ((slotTransitionZ i κ μ ν : ℤ) : ℚ) = 2 * slotTransition i κ μ ν := by + rw [slotTransitionZ_eq_sum, slotTransition, Finset.mul_sum] + push_cast + exact Finset.sum_congr rfl fun κ' _ => by rw [coe_lightConeCoeffInvZ]; ring + end IsQuadLorentz end Lorentz From 66c6cdb5430f7eccab00c965840d6d2913d2ef06 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 7 Sep 2026 05:23:14 +0100 Subject: [PATCH 271/367] feat: Refactor other Lorentz files --- .../LorentzGroup/Invariants/IsBiLeftWeyl.lean | 228 +++++++--------- .../LorentzGroup/Invariants/IsBiLorentz.lean | 215 +++++++-------- .../Invariants/IsLeftRightWeyl.lean | 142 +++++----- .../Invariants/IsSingleLorentz.lean | 247 ++++++++---------- .../LorentzGroup/Invariants/IsTriLorentz.lean | 186 ++++++------- .../Invariants/IsVectorLeftRightWeyl.lean | 220 +++++++--------- 6 files changed, 539 insertions(+), 699 deletions(-) diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsBiLeftWeyl.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsBiLeftWeyl.lean index 7191d7991..f9caeaa2b 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsBiLeftWeyl.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsBiLeftWeyl.lean @@ -10,43 +10,38 @@ public import Physlib.Relativity.Fermions.Weyl.Metric /-! # 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. - -A family carrying dual Weyl indices transforms by the contragredient `(Λ⁻¹)ᵀ`, or, for -a barred species, by its complex conjugate `(Λ⁻¹)ᴴ`; neither is the fundamental law, so -neither is an `IsBiLeftWeyl` family on the nose. Two independent mechanisms bridge the -gap. The contragredient is inner, `(Λ⁻¹)ᵀ = ε Λ ε⁻¹`, so re-indexing the two index slots -by `ε` turns a contragredient family into a fundamental one without touching the -representation. Entrywise conjugation is instead a genuine automorphism of `SL(2,ℂ)`, so -a conjugated family is a fundamental family for the twisted representation -`repLorentz.comp conjHom`; since the twist is by a surjection, invariance is the same -condition for both, and the whole classification carries over. - -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), the classification modulo a -Lorentz-stable submodule (F), the symplectic form and the contragredient as an inner -twist (G), the conjugation automorphism of `SL(2,ℂ)` (H), transfer of invariance along a -surjective endomorphism (I), dual-index families and the `ε` re-index (J), and the -classification of the invariants of a dual-index family (K). +Two Weyl spinors of the same handedness have exactly one Lorentz-invariant contraction, +the antisymmetric one + +`epsilonContraction = ε_{α β} ψ^α χ^β`, + +which is the shape of a Dirac or Majorana mass term. There is nothing else: `SL(2,ℂ)` +preserves the determinant on a pair of fundamental indices and no more. That is +`exists_smul_epsilonContraction_of_invariant`, with +`exists_smul_epsilonContraction_of_invariant_subset` the same statement modulo a +Lorentz-stable subspace `S`; `repLorentz_epsilonContraction` checks that the contraction +is invariant. + +The components are vectors `T a` of a complex vector space `B` carrying a representation +`repLorentz` of `SL(2,ℂ)`, indexed by two left-handed Weyl indices, and `IsBiLeftWeyl` +says the group moves each index by the matrix of `g` (B). `hT.span` is the set of their +combinations. + +The proof is the same-handedness twin of `IsLeftRightWeyl` and reuses its Weyl weight +bases (A, C). An invariant has boost weight `0` along every axis, so it is fixed by the +weight-zero projection along each; averaging the three gives `M = 2 - swap` (D), whose +eigenvalue `3` is simple and carried by the antisymmetric line, so `(3 λ - 1) / 2` at +`λ = M / 3` collapses an invariant onto the antisymmetric part of its coefficients, which +is the `ε` contraction (E). Section F divides out `S`. + +Sections G to K handle dual Weyl indices, which transform by the contragredient +`(Λ⁻¹)ᵀ`, or for a barred species by `(Λ⁻¹)ᴴ`. Neither is the fundamental law, and two +separate mechanisms bridge the gap. The contragredient is inner, `(Λ⁻¹)ᵀ = ε Λ ε⁻¹`, so +re-indexing both slots by `ε` turns a contragredient family into a fundamental one +without touching the representation (G, J). Entrywise conjugation is instead an +automorphism of `SL(2,ℂ)` (H), so a conjugated family is a fundamental family for the +twisted representation `repLorentz.comp conjHom`; the twist is by a surjection, so +invariance is the same condition for both and the classification carries over (I, K). -/ @[expose] public section @@ -114,6 +109,9 @@ lemma sum_boostAxis_biLeftCoeff (i : Fin 3) (κ a : Fin 2 × Fin 2) {t : ℝ} (h ## B. Bi-left-handed Weyl tensors and the span of their components +`IsBiLeftWeyl B repLorentz T` says the group moves each index of `T^{α₁ α₂}` by the matrix +of `g`, and `hT.span` is the set of combinations `∑ a, c a • T a` of the four components. + -/ /-- A family `T` of elements of `B`, indexed by two left-handed Weyl indices, transforms @@ -125,43 +123,36 @@ structure IsBiLeftWeyl (B : Type*) [AddCommMonoid B] [Module ℂ B] 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. -/ +set_option linter.unusedVariables false in +/-- The span of the components; `hT` is unused, and is present only so it reads `hT.span`. -/ 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. -/ +/-- A vector lies in the span exactly when it is a combination `∑ d, c d • T d`. -/ 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 _)) + x ∈ hT.span ↔ ∃ c : Fin 2 × Fin 2 → ℂ, x = ∑ d, c d • T d := by + rw [span, ← Submodule.span_range_eq_iSup, ← Fintype.range_linearCombination, + LinearMap.mem_range] + simp only [Fintype.linearCombination_apply, eq_comm] /-! ## C. The weight grading of the span +The four products `weightVec i κ` of two left weight vectors span the same space as the +components and are boost eigenvectors along the axis `i`, of weights `2`, `0`, `0` and +`-2`. + -/ -/-- The axis-`i` weight component of `T` at the pair `κ` of Weyl weight indices. -/ +set_option linter.unusedVariables false in +/-- The weight component of `T` along axis `i` at the pair `κ` of Weyl weight indices; + `hT` is present only so it reads `hT.weightVec`. -/ 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 @@ -247,6 +238,10 @@ lemma eq_sum_monoComponent_univ (i : Fin 3) (α : Fin 2 × Fin 2) : ## D. The weight-zero round and its average over the axes +An invariant has boost weight zero along every axis, so along each axis it equals its own +weight-zero part, which written back on the components is the matrix +`weightZeroTransition i`. + -/ /-- The matrix of the axis-`i` weight-zero projection in the `T`-basis: the coefficient @@ -267,9 +262,8 @@ lemma monoComponent_zero_eq (i : Fin 3) (α : Fin 2 × Fin 2) : 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. -/ +/-- A vector of boost weight zero along axis `i` is written with the weight-zero transition + 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) : @@ -317,9 +311,8 @@ lemma sum_weightZeroTransition_eq (β α : Fin 2 × Fin 2) : 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. -/ +/-- A vector of boost weight zero along all three axes is written with a third of the summed + transition 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) : @@ -433,10 +426,9 @@ theorem exists_smul_epsilonContraction_of_invariant {x : B} (hx : x ∈ hT.span) ## 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`. +A stable subspace `S` is divided out by passing to the quotient `B ⧸ S`, that is `B` with +`S` declared zero: the classes of the components again form a bi-left-handed tensor, so +the classification applies there and lifts back with an error term in `S`. -/ @@ -460,9 +452,8 @@ lemma mkQ_epsilonContraction (S : Submodule ℂ B) : 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`. -/ +/-- The same modulo a Lorentz-stable subspace `S`: a multiple of the `ε` contraction plus 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) : @@ -493,12 +484,10 @@ end IsBiLeftWeyl ## G. The symplectic form and the contragredient as an inner twist -The antisymmetric form `ε = !![0, 1; -1, 0]` has determinant one, so it is itself an -element of `SL(2,ℂ)`, and `Λᵀ ε Λ = ε` holds for every `Λ ∈ SL(2,ℂ)`: this is the -statement that `ε` is the invariant symplectic form, and it is nothing but the condition -`det Λ = 1` written out. Rearranged it reads `(Λ⁻¹)ᵀ = ε Λ ε⁻¹`, so the contragredient -matrix is the fundamental one conjugated by a fixed group element. That is a change of -basis on the index type, not a change of representation. +`ε = !![0, 1; -1, 0]` has determinant one, so it lies in `SL(2,ℂ)`, and `Λᵀ ε Λ = ε` for +every `Λ` there: that is `det Λ = 1` written out. Rearranged it reads +`(Λ⁻¹)ᵀ = ε Λ ε⁻¹`, so the contragredient is the fundamental matrix conjugated by a fixed +group element, a change of basis on the index type rather than of representation. -/ @@ -560,12 +549,10 @@ lemma epsilon_mul_inv_eq_transpose_mul_epsilon (g : SL(2,ℂ)) : ## H. The conjugation automorphism of `SL(2,ℂ)` -Entrywise complex conjugation is a monoid homomorphism `SL(2,ℂ) → SL(2,ℂ)`: it is -multiplicative because conjugation is a ring homomorphism of `ℂ`, and it lands back in -`SL(2,ℂ)` because `det (conj Λ) = conj (det Λ) = 1`. It is its own inverse, hence -bijective. Unlike the `ε` twist of section G this is a genuine automorphism of the -group, so twisting a representation along it gives a genuinely different representation -rather than a re-indexing. +Entrywise conjugation is a monoid homomorphism `SL(2,ℂ) → SL(2,ℂ)`, multiplicative +because conjugation is a ring homomorphism and landing in `SL(2,ℂ)` because +`det (conj Λ) = 1`; it is its own inverse. Unlike the `ε` twist of G this is a genuine +automorphism, so twisting a representation along it gives a different representation. -/ @@ -613,10 +600,9 @@ end SL2C ## I. Transfer of invariance along a surjective endomorphism -Twisting a representation by a monoid endomorphism `σ` of the group does not change what -it means for a vector to be invariant, provided `σ` is surjective: the two families of -conditions `rep g x = x` and `rep (σ g) x = x` range over the very same set of group -elements. This is what makes the conjugation twist of section H free of charge. +Twisting by a surjective monoid endomorphism `σ` does not change what invariance means: +`rep g x = x` and `rep (σ g) x = x` range over the same group elements. That is what +makes the conjugation twist of H free. -/ @@ -637,25 +623,21 @@ lemma forall_comp_apply_eq_self_iff {k G V : Type*} [CommSemiring k] [Monoid G] ## J. Dual-index families and the `ε` re-index -`IsBiDualLeftWeyl` and `IsBiDualRightWeyl` are the two index laws actually carried by -the Standard Model's fermion symbols: one factor of the contragredient `(Λ⁻¹)ᵀ` per -index for an undotted pair, and one factor of its complex conjugate `(Λ⁻¹)ᴴ` per index -for a dotted pair. The re-index `epsReindex` transports both index slots through the -symplectic form. By section G it converts the contragredient law into the fundamental -one and leaves the representation alone; it is an involution, so it does not change the -span of the components; and it leaves the `ε` contraction strictly unchanged, with -neither a sign nor a scalar appearing. For a dotted family the same re-index works once -the representation has been twisted by `conjHom`, because conjugating the group argument -undoes the conjugation of the matrix entries. The two laws are not vacuous: +`IsBiDualLeftWeyl` and `IsBiDualRightWeyl` are the laws the Standard Model's fermion +symbols carry: one factor of `(Λ⁻¹)ᵀ` per index for an undotted pair, one of `(Λ⁻¹)ᴴ` for +a dotted pair. The re-index `epsReindex` sends both slots through `ε`. By G it converts +the contragredient law into the fundamental one and leaves the representation alone; it is +an involution, so the span is unchanged; and it leaves the `ε` contraction exactly as it +was, with no sign or scalar. For a dotted family the same re-index works once the +representation is twisted by `conjHom`, conjugating the group argument undoing the +conjugation of the entries. Neither law is vacuous: `isBiDualLeftWeyl_dualLeftHandedWeyl` and `isBiDualRightWeyl_dualRightHandedWeyl` check -that they are exactly the laws carried by the tensor squares of the repo's dual Weyl -representations. +they are what the tensor squares of the repo's dual Weyl representations carry. -/ -/-- A family `T` of elements of `B`, indexed by two dual left-handed Weyl indices, - transforms as a tensor `T_{α₁ α₂}` under `repLorentz`: each index carries a factor of - the contragredient matrix `(Λ⁻¹)ᵀ`. -/ +/-- A family `T` indexed by two dual left-handed Weyl indices, moved as `T_{α₁ α₂}`: one factor + of the contragredient matrix `(Λ⁻¹)ᵀ` per index. -/ structure IsBiDualLeftWeyl (B : Type*) [AddCommMonoid B] [Module ℂ B] (repLorentz : Representation ℂ SL(2,ℂ) B) (T : Fin 2 × Fin 2 → B) : Prop where @@ -663,9 +645,7 @@ structure IsBiDualLeftWeyl (B : Type*) [AddCommMonoid B] [Module ℂ B] repLorentz g (T l) = ∑ (a : Fin 2 × Fin 2), ((g.1⁻¹)ᵀ a.1 l.1 * (g.1⁻¹)ᵀ a.2 l.2) • T a -/-- A family `T` of elements of `B`, indexed by two dual right-handed Weyl indices, - transforms as a tensor `T_{α̇₁ α̇₂}` under `repLorentz`: each index carries a factor of - the conjugate contragredient matrix `(Λ⁻¹)ᴴ`. -/ +/-- The same for two dual right-handed indices, `T_{α̇₁ α̇₂}`: one factor of `(Λ⁻¹)ᴴ` per index. -/ structure IsBiDualRightWeyl (B : Type*) [AddCommMonoid B] [Module ℂ B] (repLorentz : Representation ℂ SL(2,ℂ) B) (T : Fin 2 × Fin 2 → B) : Prop where @@ -690,9 +670,8 @@ lemma isBiDualLeftWeyl_dualLeftHandedWeyl : rw [mul_comm] open Fermion in -/-- The tensor square of the dual right-handed Weyl representation, on the products of - basis vectors, is the basic example of a family with the conjugate contragredient - index law. -/ +/-- The tensor square of the dual right-handed Weyl representation carries the conjugate + contragredient law: the basic example. -/ lemma isBiDualRightWeyl_dualRightHandedWeyl : IsBiDualRightWeyl (DualRightHandedWeyl ⊗[ℂ] DualRightHandedWeyl) (DualRightHandedWeyl.rep.tprod DualRightHandedWeyl.rep) @@ -740,9 +719,8 @@ lemma epsReindex_epsReindex : epsReindex (epsReindex T) = T := by simp [epsReindex_zero_zero, epsReindex_zero_one, epsReindex_one_zero, epsReindex_one_one] -/-- The `ε` re-index leaves the `ε` contraction unchanged: no sign and no scalar are - introduced, so a conclusion about the re-indexed family is literally a conclusion - about the original one. -/ +/-- The `ε` re-index leaves the `ε` contraction unchanged, with no sign or scalar, so a + conclusion about the re-indexed family is one about the original. -/ lemma epsilonContraction_epsReindex : IsBiLeftWeyl.epsilonContraction (T := epsReindex T) = IsBiLeftWeyl.epsilonContraction (T := T) := by @@ -797,9 +775,8 @@ lemma sum_biEpsilon_mul_inv_transpose (g : SL(2,ℂ)) (l a : Fin 2 × Fin 2) : exact Finset.sum_congr rfl fun b₁ _ => Finset.sum_congr rfl fun b₂ _ => by ring rw [← hL, ← hR, sum_epsilon_mul_inv_transpose, sum_epsilon_mul_inv_transpose] -/-- The `ε` re-index turns a family with the contragredient index law into a family with - the fundamental index law, for the very same representation: the twist is a change of - basis on the index type, not a change of representation. -/ +/-- The `ε` re-index turns the contragredient law into the fundamental one for the same + representation: a change of basis on the index type, not of representation. -/ lemma IsBiDualLeftWeyl.isBiLeftWeyl_epsReindex {B : Type*} [AddCommGroup B] [Module ℂ B] {repLorentz : Representation ℂ SL(2,ℂ) B} {T : Fin 2 × Fin 2 → B} (hT : IsBiDualLeftWeyl B repLorentz T) : @@ -864,14 +841,12 @@ lemma IsBiDualRightWeyl.isBiLeftWeyl_epsReindex {B : Type*} [AddCommGroup B] ## K. The classification of the invariants of a dual-index family -Sections G to J assemble into contragredient and conjugate contragredient analogues of -`IsBiLeftWeyl.exists_smul_epsilonContraction_of_invariant` and of its version modulo a -Lorentz-stable submodule. Nothing in the classification had to be redone: the whole -argument, and in particular `mem_boostWeightSubmodule_zero_of_invariant`, is generic in -the representation, so it applies verbatim to the conjugation-twisted one. Because the -re-index leaves the `ε` contraction alone, the contraction named in the conclusions is -the contraction of the original family, `T (0, 1) - T (1, 0)`, with no sign and no -scalar attached. +Sections G to J assemble into contragredient and conjugate contragredient versions of +`exists_smul_epsilonContraction_of_invariant`, and of its form modulo a stable subspace. +Nothing had to be redone: the argument is generic in the representation, so it applies to +the twisted one as it stands. The re-index leaves the `ε` contraction alone, so the +contraction in the conclusions is that of the original family, `T (0, 1) - T (1, 0)`, +with no sign or scalar attached. -/ @@ -899,9 +874,8 @@ lemma IsBiDualRightWeyl.repLorentz_epsilonContraction rw [epsilonContraction_epsReindex] at h exact (forall_comp_apply_eq_self_iff repLorentz SL2C.conjHom_surjective _).1 h g -/-- The classification of the Lorentz invariants of a family with the contragredient - index law: every element of the span of the components fixed by the Lorentz group is a - scalar multiple of the `ε` contraction of that family. -/ +/-- For the contragredient law, every Lorentz invariant of the span is a multiple of the `ε` + contraction of that family. -/ theorem IsBiDualLeftWeyl.exists_smul_epsilonContraction_of_invariant (hT : IsBiDualLeftWeyl B repLorentz T) {x : B} (hx : x ∈ ⨆ d, ℂ ∙ T d) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : @@ -928,9 +902,7 @@ theorem IsBiDualLeftWeyl.exists_smul_epsilonContraction_of_invariant_subset hT'.exists_smul_epsilonContraction_of_invariant_subset S hS hx' hinv exact ⟨a, y, hy, by rwa [epsilonContraction_epsReindex] at ha⟩ -/-- The classification of the Lorentz invariants of a family with the conjugate - contragredient index law: every element of the span of the components fixed by the - Lorentz group is a scalar multiple of the `ε` contraction of that family. -/ +/-- The same for the conjugate contragredient law. -/ theorem IsBiDualRightWeyl.exists_smul_epsilonContraction_of_invariant (hT : IsBiDualRightWeyl B repLorentz T) {x : B} (hx : x ∈ ⨆ d, ℂ ∙ T d) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsBiLorentz.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsBiLorentz.lean index c4224ae6a..7bf365180 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsBiLorentz.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsBiLorentz.lean @@ -11,28 +11,32 @@ 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). +A rank-two tensor `T^{μν}` has `16` components, and exactly one combination of them is +fixed by every rotation and boost, the metric trace + +`metricContraction = η_{μν} T^{μν}`. + +Every other invariant is a multiple of it: nothing else ties two indices, the Levi-Civita +symbol needing four. That is `exists_smul_metricContraction_of_invariant`, and +`exists_smul_metricContraction_of_invariant_subset` is the same statement modulo a +Lorentz-stable subspace `S`, the form the Standard Model files use. + +The components are vectors `T d` of a complex vector space `B` carrying a representation +`repLorentz` of `SL(2,ℂ)`, indexed by two directions, and `IsBiLorentz` says the group +moves them with one factor of the Lorentz matrix per slot (A). `hT.span` is the set of +their combinations. + +The proof is the two-index case of the argument in `IsQuadLorentz`, and reuses its +light-cone coefficients and sector matrices. Along a spatial axis the four light-cone +directions carry boost weights `2`, `-2`, `0`, `0` (B), and an invariant, having weight +`0` along every axis, is fixed by the weight-zero projection along each; averaging the +three gives one linear map on the `16` components, `12` times an integer matrix with a +short closed form (C, D). Its eigenvalues are `12`, `10`, `4`, `0`, with `12` simple, so +the cubic `λ (λ - 4) (λ - 10)` sends everything onto that one eigenvector, which is the +metric (E). Section F draws the conclusion and G divides out `S`. 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. +three weight-zero conditions already cut the `16` components down to a single line. -/ @[expose] public section @@ -50,6 +54,11 @@ open IsQuadLorentz (lightConeCoeffZ coe_lightConeCoeffZ lightConeCoeffInvQ ## A. Bi-Lorentz tensors and the span of their components +A direction is an element of `Fin 1 ⊕ Fin 3`, time or one of the three axes, and an index +vector puts one in each of the two slots, so `T d` is `T^{μν}` at `(μ, ν) = d`. +`IsBiLorentz B repLorentz T` says the group moves the components with one factor of the +Lorentz matrix per slot, and `hT.span` is the set of combinations `∑ d, c d • T d`. + -/ /-- A family `T` of elements of `B`, indexed by two four-vector indices, transforms as @@ -62,46 +71,37 @@ structure IsBiLorentz (B : Type*) [AddCommMonoid B] [Module ℂ B] (∏ (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. -/ +set_option linter.unusedVariables false in +/-- The span of the components; `hT` is unused, and is present only so it reads `hT.span`. -/ def span (hT : IsBiLorentz B repLorentz T) : Submodule ℂ B := ⨆ d, ℂ ∙ T d +/-- A vector lies in the span exactly when it is a combination `∑ d, c 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 _)) + x ∈ hT.span ↔ ∃ c : (Fin 2 → Fin 1 ⊕ Fin 3) → ℂ, x = ∑ d, c d • T d := by + rw [span, ← Submodule.span_range_eq_iSup, ← Fintype.range_linearCombination, + LinearMap.mem_range] + simp only [Fintype.linearCombination_apply, eq_comm] /-! ## 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 boost along the axis `i` scales the light-cone directions `D₀ - Dᵢ`, `D₀ + Dᵢ` and the +two transverse ones by `t²`, `t⁻²`, `1`, `1`, so their weights are `2`, `-2`, `0`, `0`. +Recombining the components along those directions gives `hT.lightCone i c`, which spans +the same space and is a boost eigenvector of weight the total weight of `c`. -/ -/-- The axis-`i` light-cone component of `T` at the light-cone multi-index `c`. -/ +set_option linter.unusedVariables false in +/-- The light-cone component of `T` along axis `i` at the light-cone index `c`; `hT` is + present only so it reads `hT.lightCone`. -/ 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 @@ -140,44 +140,27 @@ lemma span_eq_lightCone (hT : IsBiLorentz B repLorentz T) (i : Fin 3) : 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, + = ∑ 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] + simp only [lightCone, map_sum, map_smul, hT.repLorentz_T, Finset.smul_sum, + smul_smul] 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 + exact Finset.sum_congr rfl fun a _ => Finset.sum_smul.symm _ = (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 + simp only [sum_prod_lightConeCoeff i c _ ht, lightCone, Finset.smul_sum, smul_smul] + rfl /-! -## C. The weight-zero round and its average over the axes +## C. The weight-zero projection and its average over the axes -## C.1. The boost-weight components of a generator +## C.1. The boost-weight parts of a component -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`. +Each component `T e` is the sum of its boost-weight parts `hT.monoComponent i e m`; with +two indices the weights are the five even numbers from `-4` to `4`. -/ @@ -220,22 +203,20 @@ lemma eq_sum_monoComponent_univ (i : Fin 3) (e : Fin 2 → Fin 1 ⊕ Fin 3) : ## 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`. +Written back on the components, the weight-zero part of `T e` is a matrix applied to the +components: a sum over the sector patterns of total weight zero 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. -/ +/-- The weight-zero projection along axis `i`, as a matrix on the components: the sum over the + three sector patterns of weight zero of the products 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. -/ +/-- A weight-zero light-cone sum over two slots regroups as a sum over sector patterns of + weight zero of the products 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) @@ -302,23 +283,21 @@ lemma monoComponent_zero_eq (i : Fin 3) (e : Fin 2 → Fin 1 ⊕ Fin 3) : /-! -## C.3. The boost average and iterated rounds +## C.3. The average over the axes, and its powers -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. +An invariant has weight zero along all three axes, so it is fixed by each of the three +weight-zero transitions, hence by their average and by every power of that average. -/ -/-- 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. -/ +/-- The average `M` of the three weight-zero transitions, as a matrix on the components. Its + powers drive the endgame. -/ 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 +/-- A vector of boost weight zero along axis `i` is written with the weight-zero transition 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) @@ -381,10 +360,10 @@ lemma eq_sum_boostAverageTransition_smul {x : B} /-! -## D. The averaged round as an integer matrix +## D. The average 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. +Twelve times the average is an integer matrix on the `16` components, with a short closed +form that the kernel can evaluate cheaply. -/ @@ -437,11 +416,10 @@ lemma coe_boostAverageZ (d e : Fin 2 → Fin 1 ⊕ Fin 3) : 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. -/ +/-- The closed form of the integer average. A pair of equal indices talks only to such pairs, + with time-time `6`, mixed time-space `-2` and space-space diagonal `10`; a pair with one + time index carries `2` on itself and `-2` on its transpose; 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 @@ -452,9 +430,8 @@ def boostAverageEntry (d e : Fin 2 → Fin 1 ⊕ Fin 3) : ℤ := (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) -/-- Entrywise decidability for integer matrices over a finite index type. The pointwise - `Decidable` instances are supplied explicitly: instance search cannot see through the - `Matrix` type synonym when the two indices are bound. -/ +/-- Entrywise decidability for integer matrices; instance search does not see through the + `Matrix` synonym when both indices are bound. -/ private instance decidableForallEntriesZ {ι : Type*} [Fintype ι] (f g : Matrix ι ι ℤ) : Decidable (∀ k l, f k l = g k l) := @Fintype.decidableForallFintype ι _ @@ -470,9 +447,10 @@ lemma boostAverageZ_eq : boostAverageZ = Matrix.of boostAverageEntry := by ## 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 average has eigenvalues `12`, `10`, `4` and `0` on the `16` components, with the +invariant eigenvalue `12` simple, so the cubic `λ (λ - 4) (λ - 10)` sends the matrix to a +rank-one one, the outer square of the metric. That identity is the certificate, checked +entry by entry. -/ @@ -480,9 +458,8 @@ therefore collapses it to a rank-one matrix, the outer square of the metric. 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. -/ +/-- The closed form of `M (M - 4)`: supported on the pairs of equal indices, where it is a + multiple of the metric outer square minus a multiple of the identity on the 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) @@ -490,9 +467,8 @@ def boostAverageSqEntry (d e : Fin 2 → Fin 1 ⊕ Fin 3) : ℤ := 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 +/-- The certificate: the cubic at the integer average is `48` times the outer square of the + metric. Checked through a materialised intermediate product, so each kernel step is one multiplication of matrices with cheap entries. -/ lemma Q_explicit : Q = Matrix.of fun d e : Fin 2 → Fin 1 ⊕ Fin 3 => @@ -609,9 +585,8 @@ lemma eq_sum_pow_boostAverageZ_smul {x : B} (c : (Fin 2 → Fin 1 ⊕ Fin 3) → -/ 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. -/ +/-- Applying the certificate polynomial to the coefficients reproduces `x`, as the combination + of three iterated averages 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) : @@ -650,9 +625,8 @@ lemma eq_sum_Q_smul {x : B} (c : (Fin 2 → Fin 1 ⊕ Fin 3) → ℂ) _ = _ := 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. -/ +/-- A vector of the span of 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) : @@ -682,8 +656,7 @@ lemma eq_smul_metricContraction {x : B} (c : (Fin 2 → Fin 1 ⊕ Fin 3) → ℂ -/ 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 +/-- Every Lorentz invariant in the span of the components is a 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) : @@ -696,10 +669,9 @@ theorem exists_smul_metricContraction_of_invariant {x : B} (hx : x ∈ hT.span) ## 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`. +A stable subspace `S` is divided out by passing to the quotient `B ⧸ S`, that is `B` with +`S` declared zero: the classes of the components again form a bi-Lorentz tensor, so +section F applies there and lifts back with an error term in `S`. -/ @@ -723,9 +695,8 @@ lemma mkQ_metricContraction (S : Submodule ℂ B) : 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`. -/ +/-- The same modulo a Lorentz-stable subspace `S`: a multiple of the metric contraction plus 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) : diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsLeftRightWeyl.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsLeftRightWeyl.lean index 8ba82d801..d85f36da5 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsLeftRightWeyl.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsLeftRightWeyl.lean @@ -10,36 +10,31 @@ 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. +A bispinor `T^{α α'}`, carrying one left-handed and one right-handed Weyl index, has no +Lorentz invariant built from its four components but `0`. The pair of indices carries the +`(1/2, 1/2)` representation, which is the four-vector representation, and a single +four-vector index has nothing to contract with; this file proves that from scratch on the +spinor side. That is `eq_zero_of_invariant`, and `mem_of_invariant_of_mem_sup` is the same +statement modulo a Lorentz-stable subspace `S`, the form the Standard Model files use. + +The components are vectors `T a` of a complex vector space `B` carrying a representation +`repLorentz` of `SL(2,ℂ)`, indexed by a pair of Weyl indices, and `IsLeftRightWeyl` says +the group moves the left index by the matrix of `g` and the right index by its complex +conjugate (C). `hT.span` is the set of their combinations. + +The proof follows the four-vector one with the light-cone basis replaced by Weyl weight +bases. Along a spatial axis the `SL(2,ℂ)` boost is the diagonal `z`-boost conjugated by +`rotationZToAxis i`, so the columns of that rotation are boost eigenvectors of weight +`±1` (A), and the four products of a left and a right eigenvector carry weights `2`, `0`, +`0`, `-2` (B). An invariant has weight `0` along every axis, so it is fixed by the +weight-zero projection along each (D); averaging the three gives a matrix `M` with +`M ^ 2 = 2 M` and no eigenvalue `3` (E), so `3 λ ^ 2 - 2 λ` at `λ = M / 3` annihilates +every invariant (F). Section G divides out `S`. A family carrying dual Weyl indices transforms by the contragredient `(Λ⁻¹)ᵀ` on the -undotted slot and by its complex conjugate `(Λ⁻¹)ᴴ` on the dotted one. That law is -`IsDualLeftRightWeyl`, and its classification — still that there is no invariant at all, -so there is no Dirac mass term — lives in `IsVectorLeftRightWeyl`, downstream of the `ε` -re-index of `IsBiLeftWeyl` which bridges the two laws. - -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). +undotted slot and by `(Λ⁻¹)ᴴ` on the dotted one. That law is `IsDualLeftRightWeyl` here; +its classification, still that there is no invariant, hence no Dirac mass term, is in +`IsVectorLeftRightWeyl`. -/ @[expose] public section @@ -54,12 +49,11 @@ open IsQuadLorentz (eq_component_zero_of_mem_boostWeightSubmodule ## 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. +Along the `z`-axis the `SL(2,ℂ)` boost is `diag (t, t⁻¹)`, which the standard Weyl basis +already diagonalises, with weights `weylWeight`. Along a general axis the boost is that +one conjugated by `rotationZToAxis`, so the columns of the rotation are the eigenvectors, +recorded here without their `√2` normalisation. A right-handed index sees the conjugate +boost, so its weight basis is the entrywise conjugate. -/ @@ -213,11 +207,14 @@ lemma sum_boostAxis_pairCoeff (i : Fin 3) (κ a : Fin 2 × Fin 2) {t : ℝ} (ht ## C. Left-right bispinors and the span of their components +`IsLeftRightWeyl B repLorentz T` says the group moves the left index of `T^{α α'}` by the +matrix of `g` and the right index by its complex conjugate, and `hT.span` is the set of +combinations `∑ a, c a • T a` of the four 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,ℂ)`. -/ +/-- A family `T` indexed by one left-handed and one right-handed Weyl index, moved by + `repLorentz` as a bispinor `T^{α α'}`. -/ structure IsLeftRightWeyl (B : Type*) [AddCommMonoid B] [Module ℂ B] (repLorentz : Representation ℂ SL(2,ℂ) B) (T : Fin 2 × Fin 2 → B) : Prop where @@ -226,43 +223,36 @@ structure IsLeftRightWeyl (B : Type*) [AddCommMonoid B] [Module ℂ B] (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. -/ +set_option linter.unusedVariables false in +/-- The span of the components; `hT` is unused, and is present only so it reads `hT.span`. -/ 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. -/ +/-- A vector lies in the span exactly when it is a combination `∑ d, c d • T d`. -/ 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 _)) + x ∈ hT.span ↔ ∃ c : Fin 2 × Fin 2 → ℂ, x = ∑ d, c d • T d := by + rw [span, ← Submodule.span_range_eq_iSup, ← Fintype.range_linearCombination, + LinearMap.mem_range] + simp only [Fintype.linearCombination_apply, eq_comm] /-! ## D. The weight grading of the span +The four products `weightVec i κ` of a left and a right weight vector span the same space +as the components and are boost eigenvectors along the axis `i`, of weights `2`, `0`, `0` +and `-2`. + -/ -/-- The axis-`i` weight component of `T` at the pair `κ` of Weyl weight indices. -/ +set_option linter.unusedVariables false in +/-- The weight component of `T` along axis `i` at the pair `κ` of Weyl weight indices; + `hT` is present only so it reads `hT.weightVec`. -/ 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 @@ -348,6 +338,10 @@ lemma eq_sum_monoComponent_univ (i : Fin 3) (α : Fin 2 × Fin 2) : ## E. The weight-zero round and its average over the axes +An invariant has boost weight zero along every axis, so along each axis it equals its own +weight-zero part, which written back on the components is the matrix +`weightZeroTransition i`. + -/ /-- The matrix of the axis-`i` weight-zero projection in the `T`-basis: the coefficient @@ -368,9 +362,8 @@ lemma monoComponent_zero_eq (i : Fin 3) (α : Fin 2 × Fin 2) : 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. -/ +/-- A vector of boost weight zero along axis `i` is written with the weight-zero transition + 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) : @@ -419,9 +412,8 @@ lemma sum_weightZeroTransition_eq (β α : Fin 2 × Fin 2) : 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. -/ +/-- A vector of boost weight zero along all three axes is written with a third of the summed + transition 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) : @@ -452,9 +444,8 @@ lemma eq_sum_transitionEntry_smul {x : B} (c : Fin 2 × Fin 2 → ℂ) ## 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 summed transition `M` satisfies `M ^ 2 = 2 M`, so `M / 3` has eigenvalues `2/3` and +`0`, never the `1` an invariant would need: `3 λ ^ 2 - 2 λ` annihilates every invariant. -/ @@ -493,9 +484,8 @@ lemma applyTransition_applyTransition (c : Fin 2 × Fin 2 → ℂ) (β : Fin 2 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. -/ +/-- Every Lorentz invariant in the span of the components is zero: the pair of indices carries + the four-vector representation, which has no invariant contraction. -/ 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 @@ -527,10 +517,9 @@ theorem eq_zero_of_invariant {x : B} (hx : x ∈ hT.span) ## 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`. +A stable subspace `S` is divided out by passing to the quotient `B ⧸ S`, that is `B` with +`S` declared zero: the classes of the components again form a bispinor, so the +classification applies there and lifts back with an error term in `S`. -/ @@ -546,9 +535,8 @@ lemma isLeftRightWeyl_quotRep (S : Submodule ℂ B) 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`. -/ +/-- A Lorentz invariant of `hT.span ⊔ S`, for a Lorentz-stable subspace `S`, 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 diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsSingleLorentz.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsSingleLorentz.lean index 7d64b4e80..cb13df91b 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsSingleLorentz.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsSingleLorentz.lean @@ -11,27 +11,22 @@ 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). +A four-vector `T^{μ}` has no Lorentz invariant built from its four components but `0`. +There is nothing to contract it with: the metric takes two indices and the Levi-Civita +symbol four. That is `eq_zero_of_invariant`, and `mem_of_invariant_of_mem_sup` is the +same statement modulo a Lorentz-stable subspace `S`, the form the Standard Model files +use. + +The components are vectors `T d` of a complex vector space `B` carrying a representation +`repLorentz` of `SL(2,ℂ)`, indexed by one direction `d`, and `IsSingleLorentz` says the +group moves them by the Lorentz matrix (A). `hT.span` is the set of their combinations. + +The proof takes one boost at a time and needs no certificate. Along a spatial axis the +four light-cone directions carry boost weights `2`, `-2`, `0`, `0` (B), so an invariant, +having weight `0`, keeps only the coefficients of the two weight-zero directions, which +are the two directions transverse to time and to that axis (C). No direction is +transverse to all three axes, so running the three axes in turn leaves nothing (D). +Section E divides out `S`. -/ @[expose] public section @@ -48,6 +43,11 @@ open IsQuadLorentz (lightConeCoeffZ coe_lightConeCoeffZ lightConeCoeffInvQ ## A. Single Lorentz tensors and the span of their components +A direction is an element of `Fin 1 ⊕ Fin 3`, time or one of the three axes, and `T d` is +the component `T^{μ}` at `μ = d`. `IsSingleLorentz B repLorentz T` says the group moves +them by the Lorentz matrix `Λ` of `g : SL(2,ℂ)`, and `hT.span` is the set of combinations +`∑ d, c d • T d` (`mem_span_iff`). + -/ /-- A family `T` of elements of `B`, indexed by a single four-vector index, transforms @@ -60,57 +60,48 @@ structure IsSingleLorentz (B : Type*) [AddCommMonoid B] [Module ℂ B] (∏ (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. -/ +set_option linter.unusedVariables false in +/-- The span of the components; `hT` is unused, and is present only so it reads `hT.span`. -/ 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. -/ +/-- A vector lies in the span exactly when it is a combination `∑ d, c d • T d`. -/ 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 _)) + x ∈ hT.span ↔ ∃ c : (Fin 1 → Fin 1 ⊕ Fin 3) → ℂ, x = ∑ d, c d • T d := by + rw [span, ← Submodule.span_range_eq_iSup, ← Fintype.range_linearCombination, + LinearMap.mem_range] + simp only [Fintype.linearCombination_apply, eq_comm] /-! ## 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 boost along the axis `i` scales the light-cone directions `D₀ - Dᵢ`, `D₀ + Dᵢ` and the +two transverse ones by `t²`, `t⁻²`, `1`, `1`, so their weights, the exponents of `t`, are +`2`, `-2`, `0`, `0`. Recombining the components along those directions gives the light-cone +components `hT.lightCone i c`, which span the same space and are boost eigenvectors of +weight the total weight of `c`. -/ -/-- The axis-`i` light-cone component of `T` at the light-cone multi-index `c`. -/ +set_option linter.unusedVariables false in +/-- The light-cone component of `T` along axis `i` at the light-cone index `c`; `hT` is + present only so it reads `hT.lightCone`. -/ 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. -/ +/-- Each light-cone component lies in the span of the 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. -/ +/-- Each component 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 @@ -134,73 +125,54 @@ lemma span_eq_lightCone (hT : IsSingleLorentz B repLorentz T) (i : Fin 3) : · 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`. -/ +/-- A light-cone component is a boost eigenvector, of weight the total 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, + = ∑ 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] + simp only [lightCone, map_sum, map_smul, hT.repLorentz_T, Finset.smul_sum, + smul_smul] 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 + exact Finset.sum_congr rfl fun a _ => Finset.sum_smul.symm _ = (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 + simp only [sum_prod_lightConeCoeff i c _ ht, lightCone, Finset.smul_sum, smul_smul] + rfl /-! -## C. The weight-zero round along one axis +## C. The weight-zero part along one axis -## C.1. The boost-weight components of a generator +## C.1. The boost-weight parts of a component -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`. +Each component `T e` is the sum of its boost-weight parts `hT.monoComponent i e m`; with +one index the only weights are `-2`, `0` and `2`. -/ -/-- The axis-`i` weight-`m` component of the generator `T e`: the weight-`m` partial - sum of `eq_sum_lightCone`. -/ +/-- The weight-`m` part of `T e` along axis `i`: the weight-`m` terms 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. -/ +/-- The weight-`m` part has boost weight `m`. -/ 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`. -/ +/-- With one index the only light-cone weights are `-2`, `0` and `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. -/ +/-- A component is the sum of its three boost-weight parts. -/ 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] @@ -210,19 +182,28 @@ lemma eq_sum_monoComponent_univ (i : Fin 3) (e : Fin 1 → Fin 1 ⊕ Fin 3) : ## 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. +Written back on the components, the weight-zero part of `T e` is a matrix applied to the +components. Its closed form, checked by computation on the four directions, is the +projector onto the two directions transverse to time and to the axis. The integer copy +`weightZeroTransitionZ` carries a factor of `2`, from `lightConeCoeffInvZ`, so that the +check runs over integers. -/ -/-- 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. -/ +/-- A direction transverse to the boost along axis `i`: neither time nor the axis. -/ +def Transverse (i : Fin 3) (μ : Fin 1 ⊕ Fin 3) : Prop := + μ = Sum.inr (i + 1) ∨ μ = Sum.inr (i + 2) + +instance (i : Fin 3) (μ : Fin 1 ⊕ Fin 3) : Decidable (Transverse i μ) := + inferInstanceAs (Decidable (_ ∨ _)) + +/-- The weight-zero projection along axis `i`, as a matrix on the components: the + coefficient of `T d` in the weight-zero part of `T e`. -/ 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. -/ +/-- The weight-zero part of `T e`, written back on the components. -/ 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 @@ -236,12 +217,12 @@ lemma monoComponent_zero_eq (i : Fin 3) (e : Fin 1 → Fin 1 ⊕ Fin 3) : push_cast simp only [coe_lightConeCoeffInvQ, coe_lightConeCoeffZ, Finset.prod_mul_distrib] -/-- Integer mirror of the weight-zero transition: twice its value. -/ +/-- Twice the weight-zero transition, over `ℤ`, so that the closed form can be computed. -/ 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. -/ +/-- The integer copy is 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] @@ -260,34 +241,34 @@ lemma coe_weightZeroTransitionZ (i : Fin 3) (d e : Fin 1 → Fin 1 ⊕ Fin 3) : 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`. -/ +/-- Twice the projector onto the two directions transverse to time and to the axis `i`, + a finite check over the four directions. -/ 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 + weightZeroTransitionZ i d e = if e 0 = d 0 ∧ Transverse i (d 0) 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`. -/ +/-- So the weight-zero transition is the projector onto the two directions transverse to + time and to 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 + weightZeroTransition i d e = if e 0 = d 0 ∧ Transverse i (d 0) 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 +## C.3. What one axis leaves + +An invariant has boost weight zero along every axis, so along the axis `i` it is its own +weight-zero part: every coefficient outside the transverse pair of that axis is `0`. -/ 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. -/ +/-- A vector of boost weight zero along axis `i` is written with the weight-zero + transition 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) : @@ -318,13 +299,13 @@ lemma eq_sum_weightZeroTransition_smul (i : Fin 3) {x : B} 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. -/ +/-- That transition keeps the coefficients of 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) + = if Transverse i (d 0) then c d else 0 := by + by_cases htr : Transverse i (d 0) · 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 @@ -343,12 +324,12 @@ lemma sum_weightZeroTransition_mul (i : Fin 3) (d : Fin 1 → Fin 1 ⊕ Fin 3) 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. -/ +/-- So a vector of boost weight zero along axis `i` is written 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 + x = ∑ d, (if Transverse i (d 0) 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] @@ -356,61 +337,52 @@ lemma eq_sum_transverse_smul (i : Fin 3) {x : B} ## 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 direction is transverse to all three axes at once, so applying C.3 to the three axes +in turn leaves nothing. -/ -/-- No four-vector direction is transverse to all three spatial axes at once. -/ +/-- No direction is transverse to all three axes at once, a finite check. -/ 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 + ¬(Transverse 0 μ ∧ Transverse 1 μ ∧ Transverse 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. -/ +/-- Every Lorentz invariant in the span of the components is zero: one index carries no + invariant contraction. -/ 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) + (fun d => if Transverse 0 (d 0) 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) + (fun d => if Transverse 1 (d 0) then (if Transverse 0 (d 0) 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) + by_cases h2t : Transverse 2 (d 0) + · by_cases h1t : Transverse 1 (d 0) + · by_cases h0t : Transverse 0 (d 0) · exact absurd ⟨h0t, h1t, h2t⟩ (not_transverse_all (d 0)) - · rw [if_neg h0t, zero_smul] - · rw [if_neg h1t, zero_smul] + · rw [if_pos h2t, if_pos h1t, if_neg h0t, zero_smul] + · rw [if_pos h2t, 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`. +A stable subspace `S` is divided out by passing to the quotient `B ⧸ S`, that is `B` with +`S` declared zero: the classes of the components again form a single Lorentz tensor, so +section D applies there and an invariant of `hT.span ⊔ S` lies in `S`. -/ include hT in -/-- The images of the components in the quotient by a Lorentz-stable submodule again - form a single Lorentz tensor. -/ +/-- The classes of the components in the quotient 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) @@ -420,9 +392,8 @@ lemma isSingleLorentz_quotRep (S : Submodule ℂ B) 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`. -/ +/-- A Lorentz invariant of `hT.span ⊔ S`, for a Lorentz-stable subspace `S`, 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 diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsTriLorentz.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsTriLorentz.lean index 2235504bb..cf32cdcab 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsTriLorentz.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsTriLorentz.lean @@ -11,31 +11,26 @@ 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). +A rank-three tensor `T^{μνρ}` has no Lorentz invariant built from its components but `0`. +Nothing ties three indices: the metric takes two and the Levi-Civita symbol four, and an +odd number is left over either way. That is `eq_zero_of_invariant`, and +`mem_of_invariant_of_mem_sup` is the same statement modulo a Lorentz-stable subspace `S`, +the form the Standard Model files use. + +The components are vectors `T d` of a complex vector space `B` carrying a representation +`repLorentz` of `SL(2,ℂ)`, indexed by three directions, and `IsTriLorentz` says the group +moves them with one factor of the Lorentz matrix per slot (B). `hT.span` is the set of +their combinations. + +One axis does all the work, with a parity argument in place of a certificate. Along a +spatial axis the four light-cone directions carry boost weights `2`, `-2`, `0`, `0`, the +two of weight `0` being the two directions transverse to time and to that axis (C). An +invariant has weight `0`, so it is a combination of light-cone multi-indices of total +weight `0` (D); in such a multi-index the `+2` and `-2` slots pair off, leaving an odd +number of the three slots transverse. The half turn about the axis, the rotation by `π`, +fixes time and the axis and negates the two transverse directions (A), so it multiplies +each of those multi-indices by `-1` to an odd power, that is by `-1`. An invariant is +therefore both negated and fixed by it, hence zero (E). Section F divides out `S`. -/ @[expose] public section @@ -50,10 +45,10 @@ open IsQuadLorentz (eq_component_zero_of_mem_boostWeightSubmodule ## 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. +The half turn about the axis `i` is the rotation by `π` about it, `SL2C.halfTurn i`. Its +Lorentz matrix is diagonal, fixing time and the axis and negating the two transverse +directions, so on the light-cone directions of that axis it is `1` on the two of weight +`±2` and `-1` on the two transverse ones (`lightConeSign`). -/ @@ -98,9 +93,8 @@ lemma toLorentzGroup_halfTurn_apply (i : Fin 3) (a b : Fin 1 ⊕ Fin 3) : 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. -/ +/-- The sign the half turn about an axis gives each light-cone direction of that axis: `1` on + the two of 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 @@ -166,58 +160,48 @@ structure IsTriLorentz (B : Type*) [AddCommMonoid B] [Module ℂ B] (∏ (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. -/ +set_option linter.unusedVariables false in +/-- The span of the components; `hT` is unused, and is present only so it reads `hT.span`. -/ 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. -/ +/-- A vector lies in the span exactly when it is a combination `∑ d, c d • T d`. -/ 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 _)) + x ∈ hT.span ↔ ∃ c : (Fin 3 → Fin 1 ⊕ Fin 3) → ℂ, x = ∑ d, c d • T d := by + rw [span, ← Submodule.span_range_eq_iSup, ← Fintype.range_linearCombination, + LinearMap.mem_range] + simp only [Fintype.linearCombination_apply, eq_comm] /-! ## 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. +Recombining the components along the light-cone directions of the axis `i` gives the +light-cone components `hT.lightCone i c`: they span the same space, are boost +eigenvectors of weight the total weight of `c`, and the half turn multiplies each by the +product of the signs of its slots, so it negates exactly those with an odd number of +transverse slots. -/ -/-- The axis-`i` light-cone component of `T` at the light-cone multi-index `c`. -/ +set_option linter.unusedVariables false in +/-- The light-cone component of `T` along axis `i` at the light-cone index `c`; `hT` is + present only so it reads `hT.lightCone`. -/ 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. -/ +/-- Each light-cone component lies in the span of the 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. -/ +/-- Each component 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 @@ -246,35 +230,18 @@ lemma span_eq_lightCone (hT : IsTriLorentz B repLorentz T) (i : Fin 3) : 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, + = ∑ 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] + simp only [lightCone, map_sum, map_smul, hT.repLorentz_T, Finset.smul_sum, + smul_smul] 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 + exact Finset.sum_congr rfl fun a _ => Finset.sum_smul.symm _ = (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 + simp only [sum_prod_lightConeCoeff i c _ ht, lightCone, Finset.smul_sum, smul_smul] + rfl /-- The half turn about the axis `i` acts on the light-cone component at `c` by the product of the signs of its slots. -/ @@ -311,44 +278,42 @@ lemma repLorentz_halfTurn_lightCone (i : Fin 3) (c : Fin 3 → Fin 4) : /-! -## D. The weight-zero part of a generator +## D. The weight-zero part of a component -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. +Each component `T e` is the sum of its boost-weight parts `hT.monoComponent i e m`, so a +vector of weight zero along the axis `i` is the combination of the weight-zero parts +alone. Those are built from light-cone multi-indices of total weight zero, which the half +turn negates. -/ -/-- The axis-`i` weight-`m` component of the generator `T e`: the weight-`m` partial - sum of `eq_sum_lightCone`. -/ +/-- The weight-`m` part of `T e` along axis `i`: the weight-`m` terms 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. -/ +/-- The weight-`m` part has boost weight `m`. -/ 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`. -/ +/-- The total weight of three slots is even and between `-6` and `6`, a finite check. -/ 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. -/ +/-- A component is the sum of its boost-weight parts. -/ 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. -/ +/-- A vector of boost weight zero along axis `i` is the combination of the weight-zero + parts 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) : @@ -369,9 +334,8 @@ lemma eq_sum_monoComponent_zero (i : Fin 3) {x : B} (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. -/ +/-- The half turn about the axis `i` negates the weight-zero part of a component: every + light-cone multi-index in 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] @@ -386,16 +350,15 @@ lemma repLorentz_halfTurn_monoComponent_zero (i : Fin 3) (e : Fin 3 → Fin 1 ## 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. +through the weight-zero parts alone, which the half turn about that axis negates. The +invariant is therefore both fixed and negated by one Lorentz transformation, so it 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. -/ +/-- Every Lorentz invariant in the span of the components is zero: three indices carry no + invariant contraction. -/ 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 @@ -426,16 +389,14 @@ theorem eq_zero_of_invariant {x : B} (hx : x ∈ hT.span) ## 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`. +A stable subspace `S` is divided out by passing to the quotient `B ⧸ S`, that is `B` with +`S` declared zero: the classes of the components again form a triple Lorentz tensor, so +section E applies there and an invariant of `hT.span ⊔ S` lies in `S`. -/ include hT in -/-- The images of the components in the quotient by a Lorentz-stable submodule again - form a triple Lorentz tensor. -/ +/-- The classes of the components in the quotient 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) @@ -445,9 +406,8 @@ lemma isTriLorentz_quotRep (S : Submodule ℂ B) 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`. -/ +/-- A Lorentz invariant of `hT.span ⊔ S`, for a Lorentz-stable subspace `S`, 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 diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsVectorLeftRightWeyl.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsVectorLeftRightWeyl.lean index 1ea3c44d2..78beaf7be 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsVectorLeftRightWeyl.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsVectorLeftRightWeyl.lean @@ -11,51 +11,37 @@ public import Physlib.Relativity.PauliMatrices.AsTensor /-! # Lorentz invariants of a four-vector index and a left-right Weyl pair -`IsVectorLeftRightWeyl repLorentz T` says that a family `T`, indexed by one four-vector -index and 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 tensor `T^{μ α α'}`. - -This is the shape of the fermion kinetic term, and it is the reason the classifier -exists: the kinetic term is the one Standard Model invariant that ties a vector index to -a pair of opposite-chirality spinor indices, `ψ̄_{α'} σ̄^{μ α' α} ∂_μ ψ_α`. No other -classifier covers that combination, and it is what the fermion sector needs at mass -weight eight, where the invariants of `derivSubmodule 0 * derivSubmodule 1` are -classified. - -There is exactly one invariant here, the contraction against the Pauli matrices: a pair -of opposite-chirality Weyl indices carries the `(1/2, 1/2)` representation, which is the -four-vector representation, so the three indices together are two four-vector indices, -and two four-vector indices admit only the metric trace. The main theorem -`exists_smul_pauliContraction_of_invariant` says accordingly that every Lorentz invariant -in the span of the components is a scalar multiple of `pauliContraction`, and -`repLorentz_pauliContraction` checks that this contraction really is invariant. - -The proof makes that argument literal rather than redoing the boost-weight analysis. The -covariant Pauli matrices `σ_μ` intertwine the two index laws — this is -`SL2C.toSelfAdjointMap_basis`, read entrywise — so contracting the Weyl pair against them -turns `T` into a genuine bi-Lorentz tensor, and the Fierz completeness relation makes that -contraction invertible, so the span is unchanged. `IsBiLorentz` then supplies the whole -classification, and its metric trace is on the nose the Pauli contraction of `T`. +A family `T^{μ α α'}` carrying one four-vector index and one opposite-chirality Weyl pair +has exactly one Lorentz-invariant contraction, the one against the Pauli matrices + +`pauliContraction = σ_μ^{α α'} T^{μ}{}_{α α'}`. + +This is the shape of the fermion kinetic term `ψ̄_{α'} σ̄^{μ α' α} ∂_μ ψ_α`, and why this +file exists: no other classifier covers a vector index tied to opposite-chirality spinor +indices, which the fermion sector needs at mass weight eight. The theorem is +`exists_smul_pauliContraction_of_invariant`, and `repLorentz_pauliContraction` checks the +contraction is invariant. + +The count is easy to see: an opposite-chirality Weyl pair carries the `(1/2, 1/2)` +representation, which is the four-vector representation, so the three indices are two +four-vector indices, and two of those admit only the metric trace. The proof makes that +literal. The covariant Pauli matrices intertwine the two index laws (A), so contracting +the Weyl pair against them turns `T` into a bi-Lorentz tensor, invertibly by Fierz +completeness, leaving the span unchanged (C); `IsBiLorentz` then supplies the +classification (D), its metric trace being the Pauli contraction of `T`. Section E gives +the model family, whose Pauli contraction is `PauliMatrix.asTensor`. The Standard Model's fermion symbols are `Module.Dual`-valued, so their spinor indices -carry the contragredient of the laws above. Following `IsBiLeftWeyl`, the symplectic form -`ε` bridges the gap: it is inner for `SL(2,ℂ)`, so re-indexing the two spinor slots by `ε` -converts the contragredient law into the fundamental one without touching the -representation. Here no conjugation twist is needed either, because the mixed law already -carries one conjugate factor and `ε` has real entries. The derivative slot keeps the plain -Lorentz law, since in the Standard Model only the value index of a symbol is dualised. The -re-index does move the contraction: it sends the Pauli matrices to their transposes, so -the invariant named in the dual conclusions is the conjugate Pauli contraction -`pauliBarContraction`, with the scalar `+1`. - -The section headings tell the story: the covariant and conjugate Pauli matrices and the -two identities they satisfy (A), the families and the span of their components (B), the -reduction which turns the Weyl pair into a second four-vector index (C), the -classification it buys (D), the model family whose Pauli contraction is -`PauliMatrix.asTensor` (E), the dual index laws and the `ε` re-index which straightens -them out (F, G), and the classification of the invariants of the dual families (H). The -mass-weight-six statement lives in F and H too: a dual left-right Weyl pair with no vector -index has no invariant at all, so there is no Dirac mass term. +carry the contragredient law. As in `IsBiLeftWeyl`, the symplectic form `ε` bridges the +gap: it is inner for `SL(2,ℂ)`, so re-indexing the two spinor slots by `ε` converts the +contragredient law into the fundamental one without touching the representation (F, G). +No conjugation twist is needed, the mixed law already carrying one conjugate factor and +`ε` having real entries, and the derivative slot keeps the plain Lorentz law, only the +value index of a symbol being dualised. The re-index does move the contraction, sending +the Pauli matrices to their transposes, so the invariant in the dual conclusions is the +conjugate Pauli contraction `pauliBarContraction`, with scalar `+1` (H). F and H also give +the mass-weight-six statement: a dual Weyl pair with no vector index has no invariant, so +there is no Dirac mass term. -/ @[expose] public section @@ -70,6 +56,11 @@ open IsQuadLorentz (etaZ etaZ_cast minkowskiSignZ sum_etaZ_mul ## A. The covariant Pauli matrices +`pauliLower μ` is the Pauli matrix with its vector index lowered and `pauliBar` its +conjugate. Two identities are needed: they are orthonormal for the trace pairing, which is +the Fierz completeness relation, and they intertwine the vector and Weyl index laws, which +is `SL2C.toSelfAdjointMap_basis` read entrywise. + -/ /-- The Pauli matrices with the vector index lowered by the Minkowski metric. -/ @@ -101,9 +92,8 @@ lemma sum_pauliLower_mul_pauliLower (α α' β β' : Fin 2) : Fintype.sum_sum_type, Fin.sum_univ_three] <;> norm_num [Complex.ext_iff] -/-- The intertwining property of the covariant Pauli matrices, in components: sandwiching - `σ_μ` between `g` and `gᴴ` mixes the covariant Pauli matrices by the column of the - Lorentz matrix of `g`. This is `SL2C.toSelfAdjointMap_basis` read entrywise. -/ +/-- Sandwiching `σ_μ` between `g` and `gᴴ` mixes the Pauli matrices by a column of the Lorentz + matrix of `g`: the intertwining property, `SL2C.toSelfAdjointMap_basis` read entrywise. -/ lemma sum_pauliLower_mul_sl2c (g : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) (β β' : Fin 2) : ∑ p : Fin 2 × Fin 2, pauliLower μ p.1 p.2 * (g.1 β p.1 * star (g.1 β' p.2)) = ∑ ν : Fin 1 ⊕ Fin 3, (((SL2C.toLorentzGroup g).1 ν μ : ℝ) : ℂ) @@ -124,6 +114,11 @@ lemma sum_pauliLower_mul_sl2c (g : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) (β β' : F ## B. Vector-Weyl families and the span of their components +`IsVectorLeftRightWeyl B repLorentz T` says the group moves the vector index of +`T^{μ α α'}` by the Lorentz matrix, the left Weyl index by the matrix of `g` and the right +one by its complex conjugate. `hT.span` is the set of combinations of the `16` components, +and `pauliContraction` is the contraction `σ_μ^{α α'} T^{μ}{}_{α α'}`. + -/ /-- A sum over families of two four-vector indices is a double sum. -/ @@ -138,11 +133,9 @@ lemma sum_pi_fin_two {M : Type*} [AddCommMonoid M] (f : (Fin 2 → Fin 1 ⊕ Fin fin_cases i <;> simp, Fintype.sum_prod_type] -/-- A family `T` of elements of `B`, indexed by one four-vector index, one left-handed - and one right-handed Weyl index, transforms as a tensor `T^{μ α α'}` under the - representation `repLorentz` of `SL(2,ℂ)`: the vector index moves by the Lorentz matrix - of the `SL(2,ℂ)` element, the left index by the matrix itself and the right index by - its complex conjugate. -/ +/-- A family `T` indexed by a four-vector index and a left- and a right-handed Weyl index, + moved by `repLorentz` as `T^{μ α α'}`: the vector index by the Lorentz matrix, the left + index by the matrix of `g` and the right index by its complex conjugate. -/ structure IsVectorLeftRightWeyl (B : Type*) [AddCommMonoid B] [Module ℂ B] (repLorentz : Representation ℂ SL(2,ℂ) B) (T : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2 → B) : Prop where @@ -152,35 +145,22 @@ structure IsVectorLeftRightWeyl (B : Type*) [AddCommMonoid B] [Module ℂ B] * (g.1 a.1 l.1 * star (g.1 a.2 l.2))) • T (ν, a) namespace IsVectorLeftRightWeyl -set_option linter.unusedVariables false variable {B : Type*} [AddCommGroup B] [Module ℂ B] {repLorentz : Representation ℂ SL(2,ℂ) B} {T : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2 → B} (hT : IsVectorLeftRightWeyl B repLorentz T) -/-- The span of all the components. -/ +set_option linter.unusedVariables false in +/-- The span of the components; `hT` is unused, and is present only so it reads `hT.span`. -/ def span (hT : IsVectorLeftRightWeyl B repLorentz T) : Submodule ℂ B := ⨆ d, ℂ ∙ T d -/-- The span of the components is exactly the set of linear combinations of them. -/ +/-- A vector lies in the span exactly when it is a combination `∑ d, c d • T d`. -/ lemma mem_span_iff (x : B) : - x ∈ hT.span ↔ ∃ (c : (Fin 1 ⊕ Fin 3) × 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 1 ⊕ Fin 3) × 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 _)) + x ∈ hT.span ↔ ∃ c : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2 → ℂ, x = ∑ d, c d • T d := by + rw [span, ← Submodule.span_range_eq_iSup, ← Fintype.range_linearCombination, + LinearMap.mem_range] + simp only [Fintype.linearCombination_apply, eq_comm] /-- The Pauli contraction `σ_μ^{α α'} T^μ_{α α'}`, the kinetic-term contraction of a four-vector index against a pair of opposite-chirality Weyl indices. -/ @@ -194,6 +174,10 @@ end IsVectorLeftRightWeyl ## C. The reduction to a pair of four-vector indices +Contracting the Weyl pair against the Pauli matrices turns `T` into a family +`vectorPair` of two four-vector indices, which is a bi-Lorentz tensor. By Fierz +completeness the contraction is invertible, so the two families have the same span. + -/ namespace IsVectorLeftRightWeyl @@ -338,6 +322,9 @@ lemma metricContraction_vectorPair : ## D. The classification of the Lorentz invariants +`IsBiLorentz` classifies the invariants of `vectorPair`, and its metric trace is the Pauli +contraction of `T`, so every invariant of the span is a multiple of `pauliContraction`. + -/ include hT in @@ -375,10 +362,7 @@ lemma repLorentz_pauliContraction (g : SL(2,ℂ)) : simp only [Fin.prod_univ_two, Matrix.cons_val_zero, Matrix.cons_val_one] include hT in -/-- The classification of the Lorentz invariants: a four-vector index together with a - left-handed and a right-handed Weyl index admit the single invariant contraction - against the Pauli matrices, so every element of the span of the components fixed by the - Lorentz group is a scalar multiple of `pauliContraction`. -/ +/-- Every Lorentz invariant in the span of the components is a multiple of `pauliContraction`. -/ theorem exists_smul_pauliContraction_of_invariant {x : B} (hx : x ∈ hT.span) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : ∃ a : ℂ, x = a • pauliContraction (T := T) := by @@ -390,9 +374,8 @@ theorem exists_smul_pauliContraction_of_invariant {x : B} (hx : x ∈ hT.span) exact ⟨a, by rwa [metricContraction_vectorPair] at ha⟩ 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 Pauli contraction up to an error in `S`. -/ +/-- The same modulo a Lorentz-stable subspace `S`: a multiple of `pauliContraction` plus an + error in `S`. -/ lemma exists_smul_pauliContraction_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) : @@ -412,18 +395,15 @@ end IsVectorLeftRightWeyl ## E. The Pauli tensor as the model example The tensor product of the complex four-vector representation with the two Weyl -representations carries exactly this index law on the products of basis vectors, and the -Pauli contraction of that family is the repo's `PauliMatrix.asTensor`. So the classifier -is not vacuous, and on the model family the invariant line is spanned by a tensor already -known to be nonzero. - +representations carries exactly this law on products of basis vectors, and the Pauli +contraction of that family is `PauliMatrix.asTensor`. So the classifier is not vacuous: +on the model family the invariant line is spanned by a tensor already known to be nonzero. -/ open Fermion in -/-- The tensor product of the complex four-vector representation with the left-handed and - the right-handed Weyl representations, on the products of basis vectors, is the basic - example of a family with this index law. -/ +/-- The tensor product of the four-vector and the two Weyl representations carries this index + law on products of basis vectors: the basic example. -/ lemma isVectorLeftRightWeyl_pauli : IsVectorLeftRightWeyl (ContrℂModule ⊗[ℂ] (LeftHandedWeyl ⊗[ℂ] RightHandedWeyl)) (ContrℂModule.SL2CRep.tprod (LeftHandedWeyl.rep.tprod RightHandedWeyl.rep)) @@ -457,9 +437,8 @@ lemma isVectorLeftRightWeyl_pauli : module open PauliMatrix Fermion in -/-- The Pauli contraction of the model family is the Pauli tensor `σ^μ{}^α{}^{α'}` of - `PauliMatrix.asTensor`: the classification of section D says that this tensor spans - the invariants, so the invariant space really is one dimensional here. -/ +/-- Its Pauli contraction is `PauliMatrix.asTensor`, which by section D spans the invariants, + so the invariant space here really is one dimensional. -/ lemma pauliContraction_pauli : IsVectorLeftRightWeyl.pauliContraction (T := fun d : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2 => complexContrBasis d.1 ⊗ₜ[ℂ] @@ -476,12 +455,16 @@ lemma pauliContraction_pauli : ## F. Dual Weyl indices and the `ε` re-index +A `Module.Dual`-valued symbol carries the contragredient law on its spinor indices: +`IsDualLeftRightWeyl` for a Weyl pair alone, `IsVectorDualLeftRightWeyl` with a vector +index alongside. The symplectic form `ε` is what converts those laws into the fundamental +ones. + -/ -/-- A family `T` of elements of `B`, indexed by one dual left-handed and one dual - right-handed Weyl index, transforms as a tensor `T_{α α'}` under `repLorentz`: the - undotted index carries the contragredient matrix and the dotted one its complex - conjugate. -/ +/-- A family `T` indexed by a dual left- and a dual right-handed Weyl index, moved as + `T_{α α'}`: the undotted index by the contragredient matrix, the dotted one by its + complex conjugate. -/ structure IsDualLeftRightWeyl (B : Type*) [AddCommMonoid B] [Module ℂ B] (repLorentz : Representation ℂ SL(2,ℂ) B) (T : Fin 2 × Fin 2 → B) : Prop where @@ -489,11 +472,9 @@ structure IsDualLeftRightWeyl (B : Type*) [AddCommMonoid B] [Module ℂ B] repLorentz g (T l) = ∑ (a : Fin 2 × Fin 2), ((g.1⁻¹)ᵀ a.1 l.1 * (g.1⁻¹)ᴴ a.2 l.2) • T a -/-- A family `T` of elements of `B`, indexed by one four-vector index, one dual - left-handed and one dual right-handed Weyl index, transforms as a tensor - `T^μ{}_{α α'}` under `repLorentz`. The vector index still carries the plain Lorentz - matrix: in the Standard Model it is a derivative slot, and only the value index of a - symbol is dualised. -/ +/-- The same with a four-vector index alongside, moved as `T^μ{}_{α α'}`. The vector index + keeps the plain Lorentz matrix: in the Standard Model it is a derivative slot, and only + the value index of a symbol is dualised. -/ structure IsVectorDualLeftRightWeyl (B : Type*) [AddCommMonoid B] [Module ℂ B] (repLorentz : Representation ℂ SL(2,ℂ) B) (T : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2 → B) : Prop where @@ -503,9 +484,8 @@ structure IsVectorDualLeftRightWeyl (B : Type*) [AddCommMonoid B] [Module ℂ B] * ((g.1⁻¹)ᵀ a.1 l.1 * (g.1⁻¹)ᴴ a.2 l.2)) • T (ν, a) open Fermion in -/-- The tensor product of the dual left-handed and the dual right-handed Weyl - representations, on the products of basis vectors, is the basic example of a family - with the mixed contragredient index law. -/ +/-- The tensor product of the two dual Weyl representations carries the mixed contragredient + law: the basic example. -/ lemma isDualLeftRightWeyl_dualWeyl : IsDualLeftRightWeyl (DualLeftHandedWeyl ⊗[ℂ] DualRightHandedWeyl) (DualLeftHandedWeyl.rep.tprod DualRightHandedWeyl.rep) @@ -592,6 +572,10 @@ lemma IsDualLeftRightWeyl.isLeftRightWeyl_epsReindex {B : Type*} [AddCommGroup B ## G. The `ε` re-index of a vector-Weyl family +Re-indexing both spinor slots by `ε` sends a family with the dual law to one with the +fundamental law, without touching the representation, and does not change the span. It +does move the contraction: the Pauli matrices go to their transposes. + -/ /-- Conjugating a Pauli matrix by the symplectic form on both spinor slots produces the @@ -603,9 +587,8 @@ lemma sum_pauliMatrix_mul_epsilon (μ : Fin 1 ⊕ Fin 3) (k₁ k₂ : Fin 2) : simp [Fintype.sum_prod_type, Fin.sum_univ_two, PauliMatrix.pauliMatrix, pauliBar, pauliLower, PauliMatrix.pauliSelfAdjoint', SL2C.epsilon_coe] -/-- The `ε` re-index of a family carrying a four-vector index and a Weyl pair: the - vector index is left alone and both spinor slots are transported through the - symplectic form. -/ +/-- The `ε` re-index of such a family: the vector index is left alone and both spinor slots + are sent through the symplectic form. -/ noncomputable def vectorEpsReindex {B : Type*} [AddCommMonoid B] [Module ℂ B] (T : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2 → B) : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2 → B := fun d => ∑ k : Fin 2 × Fin 2, (epsilon.1 d.2.1 k.1 * epsilon.1 d.2.2 k.2) • T (d.1, k) @@ -653,9 +636,7 @@ variable {B : Type*} [AddCommGroup B] [Module ℂ B] {repLorentz : Representation ℂ SL(2,ℂ) B} {T : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2 → B} -/-- The conjugate Pauli contraction `σ̄_μ^{α' α} T^μ{}_{α α'}`, the kinetic-term - contraction of a four-vector index against a pair of dual opposite-chirality Weyl - indices. -/ +/-- The conjugate Pauli contraction `σ̄_μ^{α' α} T^μ{}_{α α'}`, against a dual Weyl pair. -/ noncomputable def pauliBarContraction : B := ∑ μ : Fin 1 ⊕ Fin 3, ∑ a : Fin 2 × Fin 2, pauliBar μ a.1 a.2 • T (μ, a) @@ -711,9 +692,8 @@ lemma isVectorLeftRightWeyl_vectorEpsReindex rw [← Finset.sum_smul, Finset.mul_sum] exact congrArg (· • T (ν, b)) (Finset.sum_congr rfl fun a _ => by ring) -/-- The `ε` re-index carries the Pauli contraction of the re-indexed family to the - conjugate Pauli contraction of the original one, with neither a sign nor a scalar - appearing. -/ +/-- The re-index carries the Pauli contraction of the re-indexed family to the conjugate Pauli + contraction of the original, with no sign or scalar. -/ lemma pauliContraction_vectorEpsReindex : IsVectorLeftRightWeyl.pauliContraction (T := vectorEpsReindex T) = pauliBarContraction (T := T) := by @@ -730,6 +710,10 @@ end IsVectorDualLeftRightWeyl ## H. The classification of the invariants of the dual families +Transporting sections D and G along the re-index: a dual Weyl pair with no vector index +has no invariant at all, so there is no Dirac mass term, and with a vector index every +invariant is a multiple of the conjugate Pauli contraction. + -/ section DualClassification @@ -737,10 +721,8 @@ section DualClassification variable {B : Type*} [AddCommGroup B] [Module ℂ B] {repLorentz : Representation ℂ SL(2,ℂ) B} -/-- The classification of the Lorentz invariants of a family with the mixed - contragredient index law: there is no invariant contraction of a dual left-handed - against a dual right-handed Weyl index, so every element of the span of the components - fixed by the Lorentz group is zero. This is the absence of a Dirac mass term. -/ +/-- A dual left-handed and a dual right-handed Weyl index have no invariant contraction, so + every Lorentz invariant of the span is zero. This is the absence of a Dirac mass term. -/ theorem IsDualLeftRightWeyl.eq_zero_of_invariant {T : Fin 2 × Fin 2 → B} (hT : IsDualLeftRightWeyl B repLorentz T) {x : B} (hx : x ∈ ⨆ d, ℂ ∙ T d) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x = 0 := by @@ -750,9 +732,7 @@ theorem IsDualLeftRightWeyl.eq_zero_of_invariant {T : Fin 2 × Fin 2 → B} exact hx exact hT'.eq_zero_of_invariant hx' hinv -/-- The classification of the Lorentz invariants of a family with the mixed - contragredient index law, modulo a Lorentz-stable submodule `S`: such an invariant - already lies in `S`. -/ +/-- The same modulo a Lorentz-stable subspace `S`: such an invariant already lies in `S`. -/ theorem IsDualLeftRightWeyl.mem_of_invariant_of_mem_sup {T : Fin 2 × Fin 2 → B} (hT : IsDualLeftRightWeyl B repLorentz T) {x : B} (S : Submodule ℂ B) (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) @@ -775,10 +755,8 @@ lemma repLorentz_pauliBarContraction (hT : IsVectorDualLeftRightWeyl B repLorent have h := hT.isVectorLeftRightWeyl_vectorEpsReindex.repLorentz_pauliContraction g rwa [pauliContraction_vectorEpsReindex] at h -/-- The classification of the Lorentz invariants of a family with the mixed - contragredient index law: every element of the span of the components fixed by the - Lorentz group is a scalar multiple of the conjugate Pauli contraction of that family. - This is the kinetic term of a Weyl fermion. -/ +/-- For the mixed contragredient law, every Lorentz invariant of the span is a multiple of the + conjugate Pauli contraction. This is the kinetic term of a Weyl fermion. -/ theorem exists_smul_pauliBarContraction_of_invariant (hT : IsVectorDualLeftRightWeyl B repLorentz T) {x : B} (hx : x ∈ ⨆ d, ℂ ∙ T d) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : From 1afd127cbf8a13c619454f49477a8234dde10eaf Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Mon, 7 Sep 2026 09:19:46 +0400 Subject: [PATCH 272/367] feat: LocalFieldAlgebra, SpeciesComponentSpace and GaugeFieldData --- Physlib.lean | 3 + .../JetAlgebra/GaugeFieldData.lean | 503 +++++++++++ .../JetAlgebra/LocalFieldAlgebra.lean | 780 ++++++++++++++++++ .../JetAlgebra/SpeciesGenerators.lean | 703 ++++++++++++++++ 4 files changed, 1989 insertions(+) create mode 100644 Physlib/ClassicalFieldTheory/JetAlgebra/GaugeFieldData.lean create mode 100644 Physlib/ClassicalFieldTheory/JetAlgebra/LocalFieldAlgebra.lean create mode 100644 Physlib/ClassicalFieldTheory/JetAlgebra/SpeciesGenerators.lean diff --git a/Physlib.lean b/Physlib.lean index 576af3c9c..cf76bff27 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -23,9 +23,12 @@ 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.GaugeFieldData public import Physlib.ClassicalFieldTheory.JetAlgebra.Jet public import Physlib.ClassicalFieldTheory.JetAlgebra.JetComponentSpace.Basic public import Physlib.ClassicalFieldTheory.JetAlgebra.JetComponentSpace.GaugeAction +public import Physlib.ClassicalFieldTheory.JetAlgebra.LocalFieldAlgebra +public import Physlib.ClassicalFieldTheory.JetAlgebra.SpeciesGenerators public import Physlib.ClassicalFieldTheory.Local.Variation public import Physlib.ClassicalMechanics.Basic public import Physlib.ClassicalMechanics.DampedHarmonicOscillator.Basic diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/GaugeFieldData.lean b/Physlib/ClassicalFieldTheory/JetAlgebra/GaugeFieldData.lean new file mode 100644 index 000000000..193b9e42c --- /dev/null +++ b/Physlib/ClassicalFieldTheory/JetAlgebra/GaugeFieldData.lean @@ -0,0 +1,503 @@ +/- +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.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.Matter.MatterField +public import Physlib.ClassicalFieldTheory.JetAlgebra.SpeciesGenerators +/-! +# The field data of a gauge theory and its local field algebra + +## i. Overview + +A gauge theory is fixed, before any Lagrangian is chosen, by a gauge context and a matter +content. The gauge context is the existing jet data of the gauge group, namely a global +group `G₀` with finite-dimensional real Lie algebra `𝔤`, a jet group `G` with jet Lie +algebra `𝔤J`, and the identities `GaugeJet` and `GaugeJetLeibniz` relating them. The matter +content is a finite family of fermionic species and a finite family of bosonic species, +each given by an existing `MatterField G`. + +`GaugeFieldData G 𝔤` bundles the matter content over such a context. From it this file +derives, with no further data, + +* the fermionic and bosonic generator spaces, as `SpeciesComponentSpace` of the families + of value spaces; +* the connection generator space, as the existing `GaugeBoson.JetComponentSpace 𝔤`; +* the local field algebra `GaugeFieldData.LocalAlgebra`, the `SpeciesLocalFieldAlgebra` of + those three, with its generator inclusions and their relations; +* the realization arrow, by which a compatible assignment of the generators in any + associative unital complex algebra `B`, not assumed commutative, extends to one and only + one `LocalAlgebra →ₐ[ℂ] B`. + +That is the chain `T → J(T) → B`. It is field and transformation data before a Lagrangian, +so packaging the species' representations separately certifies no physical compatibility +between them, and no invariance is claimed here. + +The generator spaces carry derivative symbols of every order and are infinite-dimensional +however few species there are. Finiteness of the species types and of the value spaces is +not inherited by them. + +## ii. Key results + +- `GaugeFieldData` : the matter content of a gauge theory over a gauge context. +- `GaugeFieldData.FermionGenerators`, `GaugeFieldData.BosonGenerators` : the species + generator spaces. +- `GaugeFieldData.LocalAlgebra` : the local field algebra `J(T)` of the datum. +- `GaugeFieldData.ιFermion`, `GaugeFieldData.ιBoson`, `GaugeFieldData.ιConnection` : the + generator inclusions, with their statistics. +- `GaugeFieldData.Assignment`, `GaugeFieldData.lift_ιFermion`, + `GaugeFieldData.existsUnique_algHom` : the realization arrow `J(T) →ₐ[ℂ] B` and its + uniqueness. +- `GaugeFieldData.repLorentzFermion`, `GaugeFieldData.repJetFermion` : the Lorentz and jet + gauge actions assembled on the generator spaces. +- `GaugeFieldData.massWeightScaleFermion` : the mass-weight scaling carrying the weight of + each species. + +## iii. Table of contents + +- A. The gauge context and the field datum +- B. The generator spaces + - B.1. The species generator spaces + - B.2. The connection generator space +- C. The local field algebra of the datum + - C.1. The generator inclusions + - C.2. The statistics of the generators +- D. Realizations of the datum + - D.1. The induced algebra homomorphism + - D.2. Uniqueness +- E. The transformation data on the generator spaces + - E.1. The Lorentz action + - E.2. The jet gauge action + - E.3. The mass weights + +-/ + +@[expose] public section + +open Matrix MatrixGroups TensorProduct + +/-! + +## A. The gauge context and the field datum + +The gauge context is the parameter list of the structure below, namely the two groups, the +two Lie algebras and the two gauge-jet classes. It is what makes `𝔤` the gauge algebra of +`G` rather than an unrelated Lie algebra. `GaugeFieldData` adds only the matter content on +top of it. + +-/ + +/-- The field data of a gauge theory. Over a gauge context, given by a jet gauge group `G` + with global group `G₀`, a finite-dimensional real gauge algebra `𝔤` with jet algebra + `𝔤J` and the gauge-jet identities, it records a finite family of fermionic species and a + finite family of bosonic species, each given by an existing `MatterField G`. + + Nothing is repeated from `MatterField`, whose fields already carry the value space, the + Lorentz representation, the gauge-jet action and the mass weight of a species. Nothing is + repeated from the gauge context either, and the gauge bosons are not a species, since + their generator space is determined by `𝔤` alone. + + This is data before a Lagrangian. Collecting representations of the several species does + not assert that they are jointly consistent. Gauge-Lorentz compatibility, factorization + of the jet action through its global value, and richness of the jet group are separate + conditions, none of them imposed here. -/ +structure GaugeFieldData (G : Type) [Group G] (𝔤 : Type) [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + [Module.Finite ℝ 𝔤] {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + [GaugeJet G 𝔤 G₀ 𝔤J] [GaugeJetLeibniz G 𝔤 G₀ 𝔤J] where + /-- The index type of the fermionic species. -/ + FermionSpecies : Type + [decidableEqFermionSpecies : DecidableEq FermionSpecies] + [finiteFermionSpecies : Finite FermionSpecies] + /-- The matter field of each fermionic species. -/ + fermion : FermionSpecies → MatterField G + /-- The index type of the bosonic species. -/ + BosonSpecies : Type + [decidableEqBosonSpecies : DecidableEq BosonSpecies] + [finiteBosonSpecies : Finite BosonSpecies] + /-- The matter field of each bosonic species. -/ + boson : BosonSpecies → MatterField G + +attribute [instance] GaugeFieldData.decidableEqFermionSpecies + GaugeFieldData.finiteFermionSpecies GaugeFieldData.decidableEqBosonSpecies + GaugeFieldData.finiteBosonSpecies + +namespace GaugeFieldData + +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] [GaugeJet G 𝔤 G₀ 𝔤J] + [GaugeJetLeibniz G 𝔤 G₀ 𝔤J] (T : GaugeFieldData G 𝔤) + +/-! + +## B. The generator spaces + +### B.1. The species generator spaces + +-/ + +/-- The value space of a fermionic species. -/ +abbrev FermionValue (i : T.FermionSpecies) : Type := (T.fermion i).V + +/-- The value space of a bosonic species. -/ +abbrev BosonValue (j : T.BosonSpecies) : Type := (T.boson j).V + +/-- The fermionic generator space of the datum, holding the component functions `∂_s ψ_α` + and their conjugates of every fermionic species at once, as a direct sum over the + species. The direct sum, rather than a single component space on the product of the + value spaces, is what lets the species carry different mass weights. -/ +abbrev FermionGenerators : Type := SpeciesComponentSpace T.FermionValue + +/-- The bosonic generator space of the datum, assembled from the bosonic species in + the same way. -/ +abbrev BosonGenerators : Type := SpeciesComponentSpace T.BosonValue + +/-- The inclusion of the component space of one fermionic species into the fermionic + generator space. -/ +abbrev inclFermion (i : T.FermionSpecies) : + JetComponentSpace (T.FermionValue i) →ₗ[ℂ] T.FermionGenerators := + SpeciesComponentSpace.incl T.FermionValue i + +/-- The inclusion of the component space of one bosonic species into the bosonic generator + space. -/ +abbrev inclBoson (j : T.BosonSpecies) : + JetComponentSpace (T.BosonValue j) →ₗ[ℂ] T.BosonGenerators := + SpeciesComponentSpace.incl T.BosonValue j + +/-! + +### B.2. The connection generator space + +The connection is not a species. It is fixed by the gauge context alone, and its component +functions `∂_s A_μ^φ` are the existing `GaugeBoson.JetComponentSpace 𝔤`, used below +without a new name. They are real, a connection being a real object, which is why the +third generator family of the local field algebra is a real vector space, complexified +once inside the algebra. Finite dimensionality of `𝔤` is what makes `Module.Dual ℝ 𝔤` the +span of the adjoint components, so that these generators really are the `A_μ^a`. + +## C. The local field algebra of the datum + +-/ + +/-- The local field algebra `J(T)` of a gauge-field datum, in which the local expressions + of the theory, such as Lagrangian terms, currents and field strengths, live before any + of them is selected. Its fermionic generators are the component functions of the + fermionic species, its bosonic generators those of the bosonic species, and its + connection generators the component functions of the gauge bosons of `𝔤`. + + All the fermionic species share one exterior algebra, so their generators anticommute + across species and not only within one. -/ +abbrev LocalAlgebra : Type := + SpeciesLocalFieldAlgebra T.FermionValue T.BosonValue (GaugeBoson.JetComponentSpace 𝔤) + +/-! + +### C.1. The generator inclusions + +-/ + +/-- The generators of one fermionic species inside the local field algebra. -/ +noncomputable def ιFermion (i : T.FermionSpecies) : + JetComponentSpace (T.FermionValue i) →ₗ[ℂ] T.LocalAlgebra := + SpeciesLocalFieldAlgebra.ιFermionSpecies T.FermionValue T.BosonValue + (GaugeBoson.JetComponentSpace 𝔤) i + +/-- The generators of one bosonic species inside the local field algebra. -/ +noncomputable def ιBoson (j : T.BosonSpecies) : + JetComponentSpace (T.BosonValue j) →ₗ[ℂ] T.LocalAlgebra := + SpeciesLocalFieldAlgebra.ιBosonSpecies T.FermionValue T.BosonValue + (GaugeBoson.JetComponentSpace 𝔤) j + +/-- The connection generators inside the local field algebra. They are only real-linear, + since the connection generator space is real. -/ +noncomputable def ιConnection : GaugeBoson.JetComponentSpace 𝔤 →ₗ[ℝ] T.LocalAlgebra := + LocalFieldAlgebra.ιConnection (SpeciesComponentSpace T.FermionValue) + (SpeciesComponentSpace T.BosonValue) (GaugeBoson.JetComponentSpace 𝔤) + +variable {T} + +lemma ιFermion_apply (i : T.FermionSpecies) (x : JetComponentSpace (T.FermionValue i)) : + T.ιFermion i x + = LocalFieldAlgebra.ιFermion T.FermionGenerators T.BosonGenerators + (GaugeBoson.JetComponentSpace 𝔤) (T.inclFermion i x) := rfl + +lemma ιBoson_apply (j : T.BosonSpecies) (y : JetComponentSpace (T.BosonValue j)) : + T.ιBoson j y + = LocalFieldAlgebra.ιBoson T.FermionGenerators T.BosonGenerators + (GaugeBoson.JetComponentSpace 𝔤) (T.inclBoson j y) := rfl + +/-! + +### C.2. The statistics of the generators + +The relations of the local field algebra, read at the datum. Fermi statistics holds on the +fermionic generators, across species as well as within one, and everything else commutes. +None of this is new content. Each lemma is the corresponding relation of +`SpeciesLocalFieldAlgebra` with the datum's generator spaces supplied explicitly, which is +what keeps the elaboration directed at the tensor product. + +-/ + +/-- A fermionic generator squares to zero. -/ +@[simp] +lemma ιFermion_mul_self (i : T.FermionSpecies) (x : JetComponentSpace (T.FermionValue i)) : + T.ιFermion i x * T.ιFermion i x = 0 := + SpeciesLocalFieldAlgebra.ιFermionSpecies_mul_self (Vf := T.FermionValue) + (Vb := T.BosonValue) (EA := GaugeBoson.JetComponentSpace 𝔤) i x + +/-- The generators of two fermionic species of the datum anticommute. The species + enter one exterior algebra through different summands of the fermionic generator space, + so this is ordinary exterior anticommutation and not an extra relation. -/ +lemma ιFermion_mul_swap (i j : T.FermionSpecies) (x : JetComponentSpace (T.FermionValue i)) + (y : JetComponentSpace (T.FermionValue j)) : + T.ιFermion i x * T.ιFermion j y = -(T.ιFermion j y * T.ιFermion i x) := + SpeciesLocalFieldAlgebra.ιFermionSpecies_mul_swap (Vf := T.FermionValue) + (Vb := T.BosonValue) (EA := GaugeBoson.JetComponentSpace 𝔤) i j x y + +/-- Bosonic generators commute, across species as well as within one. -/ +lemma ιBoson_commute (i j : T.BosonSpecies) (x : JetComponentSpace (T.BosonValue i)) + (y : JetComponentSpace (T.BosonValue j)) : + Commute (T.ιBoson i x) (T.ιBoson j y) := + SpeciesLocalFieldAlgebra.ιBosonSpecies_commute (Vf := T.FermionValue) + (Vb := T.BosonValue) (EA := GaugeBoson.JetComponentSpace 𝔤) i j x y + +/-- A bosonic generator commutes with a fermionic one, bosons being even. -/ +lemma ιBoson_commute_ιFermion (j : T.BosonSpecies) (i : T.FermionSpecies) + (y : JetComponentSpace (T.BosonValue j)) (x : JetComponentSpace (T.FermionValue i)) : + Commute (T.ιBoson j y) (T.ιFermion i x) := + SpeciesLocalFieldAlgebra.ιBosonSpecies_commute_ιFermionSpecies (Vf := T.FermionValue) + (Vb := T.BosonValue) (EA := GaugeBoson.JetComponentSpace 𝔤) j i y x + +/-- A bosonic generator commutes with a connection generator. -/ +lemma ιBoson_commute_ιConnection (j : T.BosonSpecies) + (y : JetComponentSpace (T.BosonValue j)) (v : GaugeBoson.JetComponentSpace 𝔤) : + Commute (T.ιBoson j y) (T.ιConnection v) := + SpeciesLocalFieldAlgebra.ιBosonSpecies_commute_ιConnection (Vf := T.FermionValue) + (Vb := T.BosonValue) (EA := GaugeBoson.JetComponentSpace 𝔤) j y v + +/-- A connection generator commutes with a fermionic one, the connection being even. -/ +lemma ιConnection_commute_ιFermion (v : GaugeBoson.JetComponentSpace 𝔤) + (i : T.FermionSpecies) (x : JetComponentSpace (T.FermionValue i)) : + Commute (T.ιConnection v) (T.ιFermion i x) := + SpeciesLocalFieldAlgebra.ιConnection_commute_ιFermionSpecies (Vf := T.FermionValue) + (Vb := T.BosonValue) (EA := GaugeBoson.JetComponentSpace 𝔤) v i x + +/-- Connection generators commute pairwise. -/ +lemma ιConnection_commute (v w : GaugeBoson.JetComponentSpace 𝔤) : + Commute (T.ιConnection v) (T.ιConnection w) := + LocalFieldAlgebra.ιConnection_commute (Ef := T.FermionGenerators) + (Eb := T.BosonGenerators) (EA := GaugeBoson.JetComponentSpace 𝔤) v w + +variable (T) + +/-! + +## D. Realizations of the datum + +-/ + +/-- A compatible realization of the datum in an algebra `B`, which is not assumed + commutative. It consists of one linear map per fermionic species, one per bosonic + species and one real-linear map on the connection generators, subject to exactly the + statistics of section C.2. The algebra map it induces is `SpeciesAssignment.lift`, of + type `T.LocalAlgebra →ₐ[ℂ] B`. -/ +abbrev Assignment (B : Type*) [Ring B] [Algebra ℂ B] : Type _ := + SpeciesAssignment T.FermionValue T.BosonValue (GaugeBoson.JetComponentSpace 𝔤) B + +variable {T} {B : Type*} [Ring B] [Algebra ℂ B] (d : T.Assignment B) + +/-! + +### D.1. The induced algebra homomorphism + +-/ + +@[simp] +lemma lift_ιFermion (i : T.FermionSpecies) (x : JetComponentSpace (T.FermionValue i)) : + d.lift (T.ιFermion i x) = d.fermion i x := + d.lift_ιFermionSpecies i x + +@[simp] +lemma lift_ιBoson (j : T.BosonSpecies) (y : JetComponentSpace (T.BosonValue j)) : + d.lift (T.ιBoson j y) = d.boson j y := + d.lift_ιBosonSpecies j y + +@[simp] +lemma lift_ιConnection (v : GaugeBoson.JetComponentSpace 𝔤) : + d.lift (T.ιConnection v) = d.connection v := + d.lift_ιConnection v + +/-! + +### D.2. Uniqueness + +-/ + +/-- Two algebra maps out of `J(T)` are equal as soon as they agree on the generators of + every species and on the connection generators. -/ +lemma algHom_ext {Φ Ψ : T.LocalAlgebra →ₐ[ℂ] B} + (hf : ∀ i x, Φ (T.ιFermion i x) = Ψ (T.ιFermion i x)) + (hb : ∀ j y, Φ (T.ιBoson j y) = Ψ (T.ιBoson j y)) + (ha : ∀ v, Φ (T.ιConnection v) = Ψ (T.ιConnection v)) : Φ = Ψ := + SpeciesAssignment.algHom_ext (Vf := T.FermionValue) (Vb := T.BosonValue) + (EA := GaugeBoson.JetComponentSpace 𝔤) hf hb ha + +/-- The realization arrow of the datum. A compatible realization of the generators in an + arbitrary, in particular noncommutative, complex algebra `B` extends to one and only one + complex algebra homomorphism `J(T) →ₐ[ℂ] B`. Injectivity is neither claimed nor wanted, + since a realization may identify local expressions. -/ +lemma existsUnique_algHom : + ∃! Φ : T.LocalAlgebra →ₐ[ℂ] B, + (∀ i x, Φ (T.ιFermion i x) = d.fermion i x) ∧ + (∀ j y, Φ (T.ιBoson j y) = d.boson j y) ∧ + (∀ v, Φ (T.ιConnection v) = d.connection v) := + d.existsUnique_algHom + +variable (T) + +/-! + +## E. The transformation data on the generator spaces + +The datum supplies, per species, a Lorentz representation and a fibrewise action of the +gauge jets. Both land on the generator spaces species by species, so both are assembled by +`SpeciesComponentSpace.rep`. Nothing here asserts that the two actions commute, since +Lorentz transformations act on nonconstant gauge jets, and nothing extends them to the +algebra `J(T)`. + +### E.1. The Lorentz action + +-/ + +/-- The Lorentz action on the fermionic generator space, acting on each species through + the Lorentz representation of its matter field. -/ +noncomputable def repLorentzFermion : Representation ℂ SL(2,ℂ) T.FermionGenerators := + SpeciesComponentSpace.rep T.FermionValue fun i => + JetComponentSpace.repLorentzGroup (T.fermion i).repLorentz + +/-- The Lorentz action on the bosonic generator space. -/ +noncomputable def repLorentzBoson : Representation ℂ SL(2,ℂ) T.BosonGenerators := + SpeciesComponentSpace.rep T.BosonValue fun j => + JetComponentSpace.repLorentzGroup (T.boson j).repLorentz + +variable {T} + +@[simp] +lemma repLorentzFermion_inclFermion (Λ : SL(2,ℂ)) (i : T.FermionSpecies) + (x : JetComponentSpace (T.FermionValue i)) : + T.repLorentzFermion Λ (T.inclFermion i x) + = T.inclFermion i (JetComponentSpace.repLorentzGroup (T.fermion i).repLorentz Λ x) := + SpeciesComponentSpace.rep_incl _ Λ i x + +@[simp] +lemma repLorentzBoson_inclBoson (Λ : SL(2,ℂ)) (j : T.BosonSpecies) + (y : JetComponentSpace (T.BosonValue j)) : + T.repLorentzBoson Λ (T.inclBoson j y) + = T.inclBoson j (JetComponentSpace.repLorentzGroup (T.boson j).repLorentz Λ y) := + SpeciesComponentSpace.rep_incl _ Λ j y + +variable (T) + +/-! + +### E.2. The jet gauge action + +-/ + +/-- The action of the jet gauge group on the fermionic generator space, acting on each + species through the fibrewise jet action of its matter field. Both the fibrewise + hypothesis and the finite dimensionality of the value space that + `JetComponentSpace.repJet` needs are already fields of `MatterField`. -/ +noncomputable def repJetFermion : Representation ℂ G T.FermionGenerators := + SpeciesComponentSpace.rep T.FermionValue fun i => + JetComponentSpace.repJet (T.fermion i).repJet (T.fermion i).repJet_smul + +/-- The action of the jet gauge group on the bosonic generator space. -/ +noncomputable def repJetBoson : Representation ℂ G T.BosonGenerators := + SpeciesComponentSpace.rep T.BosonValue fun j => + JetComponentSpace.repJet (T.boson j).repJet (T.boson j).repJet_smul + +variable {T} + +@[simp] +lemma repJetFermion_inclFermion (U : G) (i : T.FermionSpecies) + (x : JetComponentSpace (T.FermionValue i)) : + T.repJetFermion U (T.inclFermion i x) + = T.inclFermion i + (JetComponentSpace.repJet (T.fermion i).repJet (T.fermion i).repJet_smul U x) := + SpeciesComponentSpace.rep_incl _ U i x + +@[simp] +lemma repJetBoson_inclBoson (U : G) (j : T.BosonSpecies) + (y : JetComponentSpace (T.BosonValue j)) : + T.repJetBoson U (T.inclBoson j y) + = T.inclBoson j + (JetComponentSpace.repJet (T.boson j).repJet (T.boson j).repJet_smul U y) := + SpeciesComponentSpace.rep_incl _ U j y + +variable (T) + +/-! + +### E.3. The mass weights + +-/ + +/-- The mass-weight scaling on the fermionic generator space, with the weight of each + species taken from its matter field. Species of different weight scale differently, + which is the property the direct-sum generator space was chosen to have. -/ +noncomputable def massWeightScaleFermion (c : ℂ) : + T.FermionGenerators →ₗ[ℂ] T.FermionGenerators := + SpeciesComponentSpace.massWeightScale T.FermionValue + (fun i => (T.fermion i).massWeight) c + +/-- The mass-weight scaling on the bosonic generator space. -/ +noncomputable def massWeightScaleBoson (c : ℂ) : + T.BosonGenerators →ₗ[ℂ] T.BosonGenerators := + SpeciesComponentSpace.massWeightScale T.BosonValue (fun j => (T.boson j).massWeight) c + +variable {T} + +/-- On the summand of a fermionic species the scaling is that species' own mass-weight + scaling, with the weight recorded in its matter field. -/ +@[simp] +lemma massWeightScaleFermion_inclFermion (c : ℂ) (i : T.FermionSpecies) + (x : JetComponentSpace (T.FermionValue i)) : + T.massWeightScaleFermion c (T.inclFermion i x) + = T.inclFermion i + (JetComponentSpace.massWeightScale (T.fermion i).massWeight c x) := + SpeciesComponentSpace.massWeightScale_incl _ c i x + +/-- On the summand of a bosonic species the scaling is that species' own mass-weight + scaling. -/ +@[simp] +lemma massWeightScaleBoson_inclBoson (c : ℂ) (j : T.BosonSpecies) + (y : JetComponentSpace (T.BosonValue j)) : + T.massWeightScaleBoson c (T.inclBoson j y) + = T.inclBoson j (JetComponentSpace.massWeightScale (T.boson j).massWeight c y) := + SpeciesComponentSpace.massWeightScale_incl _ c j y + +/-- A component function `∂_s ψ_α` of a fermionic species scales by `c ^ (w + 2 |s|)`, + where `w` is the mass weight of that species. There is one factor of `c` per unit of + mass dimension of the field and two per derivative. -/ +lemma massWeightScaleFermion_inclFermion_basis_tmul (c : ℂ) (i : T.FermionSpecies) + (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (T.FermionValue i)) : + T.massWeightScaleFermion c (T.inclFermion i + ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace (T.FermionValue i))) + = c ^ ((T.fermion i).massWeight + 2 * Multiset.card s) • T.inclFermion i + ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace (T.FermionValue i)) := + SpeciesComponentSpace.massWeightScale_incl_basis_tmul _ c i s φ + +/-- A component function `∂_s φ_α` of a bosonic species scales by `c ^ (w + 2 |s|)` + with that species' own weight `w`. -/ +lemma massWeightScaleBoson_inclBoson_basis_tmul (c : ℂ) (j : T.BosonSpecies) + (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (T.BosonValue j)) : + T.massWeightScaleBoson c (T.inclBoson j + ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace (T.BosonValue j))) + = c ^ ((T.boson j).massWeight + 2 * Multiset.card s) • T.inclBoson j + ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace (T.BosonValue j)) := + SpeciesComponentSpace.massWeightScale_incl_basis_tmul _ c j s φ + +end GaugeFieldData diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/LocalFieldAlgebra.lean b/Physlib/ClassicalFieldTheory/JetAlgebra/LocalFieldAlgebra.lean new file mode 100644 index 000000000..6f3ac9df7 --- /dev/null +++ b/Physlib/ClassicalFieldTheory/JetAlgebra/LocalFieldAlgebra.lean @@ -0,0 +1,780 @@ +/- +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.Mathematics.SymmetricAlgebra +public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basic +public import Mathlib.LinearAlgebra.Complex.Module +/-! +# The local field algebra and its mapping-out universal property + +## i. Overview + +The local field algebra of a field theory is the algebra in which its local expressions, +such as Lagrangian terms, currents and field strengths, live. It is built from three +generator spaces, a complex space `Ef` of fermionic derivative symbols, a complex space +`Eb` of bosonic matter derivative symbols, and a real space `EA` of connection derivative +symbols. Writing `Λ` for the exterior algebra and `Sym` for the symmetric algebra, it is + +`LocalFieldAlgebra Ef Eb EA = (Λ_ℂ Ef ⊗[ℂ] Sym_ℂ Eb) ⊗[ℂ] (ℂ ⊗[ℝ] Sym_ℝ EA)`, + +the shape of `StandardModel.JetAlgebra` with the Standard Model's species replaced by +arbitrary generator spaces. All fermionic generators enter a single exterior algebra, so +that symbols of different species anticommute with each other and not merely with +themselves. The connection generators are real and are complexified once, a connection +being a real object whose algebra of polynomials is then extended to complex coefficients. +Nothing here is finite-dimensional, the generator spaces being spaces of ordinary +derivative symbols of arbitrary order. + +This file proves the algebra's mapping-out universal property. An `Assignment` of the +three generator families in an associative unital complex algebra `B`, not assumed +commutative, subject to exactly the relations the generators themselves satisfy, extends +to a unique complex algebra homomorphism `LocalFieldAlgebra Ef Eb EA →ₐ[ℂ] B`. That is +what makes the carrier canonical rather than merely a convenient tensor product, and it is +what a realization of a field theory in an abstract algebra is built from. + +The construction has one subtlety. Mathlib's `SymmetricAlgebra.lift` requires a +commutative target, while `B` need not be commutative. The bosonic and connection +generators are therefore lifted into `Assignment.evenSubalgebra`, the subalgebra of `B` +generated by their images, which the hypotheses make commutative, and the result is +composed with its inclusion. The connection factor is then extended from `ℝ` to `ℂ` by +`AlgHom.liftEquiv`, which, unlike the symmetric lift, does accept a noncommutative target. +Uniqueness likewise cannot use `SymmetricAlgebra.algHom_ext`, whose target is commutative; +it uses generation instead, through `adjoin_generators_eq_top`. + +## ii. Key results + +- `LocalFieldAlgebra` : the algebra, with the generator maps `ιFermion`, `ιBoson`, + `ιConnection` and the relations they satisfy. +- `LocalFieldAlgebra.adjoin_generators_eq_top` : the algebra is generated by the three + families. +- `LocalFieldAlgebra.Assignment` : a compatible assignment of the three generator families + in an arbitrary complex algebra. +- `LinearMap.mul_swap_of_mul_self`, `LocalFieldAlgebra.ιFermion_mul_swap`, + `LocalFieldAlgebra.Assignment.fermion_mul_swap` : polarization, by which the square-zero + relation on the whole fermionic generator space already carries anticommutation across + species. +- `LocalFieldAlgebra.Assignment.lift` : the induced algebra homomorphism, with the + computation lemmas `lift_ιFermion`, `lift_ιBoson` and `lift_ιConnection`. +- `LocalFieldAlgebra.algHom_ext` : two algebra maps agreeing on the generators are equal. +- `LocalFieldAlgebra.Assignment.existsUnique_algHom` : the mapping-out universal + property. +- `LocalFieldAlgebra.liftEquiv` : compatible assignments in `B` are the same thing as + algebra maps into `B`. +- `LocalFieldAlgebra.Assignment.range_lift` : the range is the subalgebra generated by the + three images. + +## iii. Table of contents + +- A. Generation, commutation and tensor products + - A.1. Consequences of a generating set + - A.2. Generating a tensor product + - A.3. Polarization +- B. The local field algebra + - B.1. The factor inclusions and the generators + - B.2. The relations satisfied by the generators + - B.3. Generation by the three families +- C. Compatible generator assignments + - C.1. Polarization of the fermionic assignment + - C.2. The commutative subalgebra of even images + - C.3. The three factor maps + - C.4. Commutation of the factor images +- D. The mapping-out universal property + - D.1. The induced algebra homomorphism + - D.2. Uniqueness + - D.3. Assignments are the same thing as algebra maps + - D.4. The range of the induced map + +-/ + +@[expose] public section + +open TensorProduct + +/-! + +## A. Generation, commutation and tensor products + +Facts about algebras generated by a set, stated for a general base ring because they carry +no physics. They are the minimal API needed to lift into, and to prove uniqueness into, a +target that is not assumed commutative. + +-/ + +namespace Algebra + +section Generation + +variable {R A B : Type*} [CommSemiring R] [Semiring A] [Algebra R A] [Semiring B] + [Algebra R B] + +/-! + +### A.1. Consequences of a generating set + +-/ + +/-- If `s` generates `A` and a subalgebra `S` of `B` contains the image of `s`, then it + contains the whole range of an algebra map `A →ₐ[R] B`. -/ +lemma range_le_of_adjoin_eq_top {s : Set A} (hs : Algebra.adjoin R s = ⊤) (φ : A →ₐ[R] B) + {S : Subalgebra R B} (h : ∀ x ∈ s, φ x ∈ S) : φ.range ≤ S := by + rw [← Algebra.map_top, ← hs, AlgHom.map_adjoin] + exact Algebra.adjoin_le (Set.image_subset_iff.mpr h) + +/-- If `s` generates `A` and `y` commutes with the image of `s` under an algebra map, then + `y` commutes with the whole image. This is what extends a commutation relation from + generators to a factor of a tensor product. -/ +lemma commute_of_adjoin_eq_top {s : Set A} (hs : Algebra.adjoin R s = ⊤) (φ : A →ₐ[R] B) + {y : B} (h : ∀ x ∈ s, Commute (φ x) y) (a : A) : Commute (φ a) y := by + have ha : a ∈ Algebra.adjoin R s := hs ▸ Algebra.mem_top + induction ha using Algebra.adjoin_induction with + | mem x hx => exact h x hx + | algebraMap r => rw [AlgHom.commutes]; exact Algebra.commute_algebraMap_left r y + | add u v _ _ hu hv => rw [map_add]; exact hu.add_left hv + | mul u v _ _ hu hv => rw [map_mul]; exact hu.mul_left hv + +end Generation + +namespace TensorProduct + +/-! + +### A.2. Generating a tensor product + +-/ + +section Factors + +variable {R A B : Type*} [CommSemiring R] [Semiring A] [Algebra R A] [Semiring B] + [Algebra R B] + +/-- A subalgebra of `A ⊗[R] B` containing every `a ⊗ₜ 1` and every `1 ⊗ₜ b` contains + everything, since a pure tensor is the product of the two. -/ +lemma mem_of_tmul_one_of_one_tmul {S : Subalgebra R (A ⊗[R] B)} + (hA : ∀ a : A, a ⊗ₜ[R] (1 : B) ∈ S) (hB : ∀ b : B, (1 : A) ⊗ₜ[R] b ∈ S) + (x : A ⊗[R] B) : x ∈ S := by + induction x using _root_.TensorProduct.induction_on with + | zero => exact zero_mem _ + | add u v hu hv => exact add_mem hu hv + | tmul a b => + have h : a ⊗ₜ[R] b = (a ⊗ₜ[R] (1 : B)) * ((1 : A) ⊗ₜ[R] b) := by + rw [Algebra.TensorProduct.tmul_mul_tmul, mul_one, one_mul] + exact h ▸ mul_mem (hA a) (hB b) + +/-- A subalgebra of `A ⊗[R] B` containing every `a ⊗ₜ 1` and every `1 ⊗ₜ b` is the whole + algebra. -/ +lemma eq_top_of_tmul_one_of_one_tmul {S : Subalgebra R (A ⊗[R] B)} + (hA : ∀ a : A, a ⊗ₜ[R] (1 : B) ∈ S) (hB : ∀ b : B, (1 : A) ⊗ₜ[R] b ∈ S) : S = ⊤ := + _root_.Algebra.eq_top_iff.mpr fun x => mem_of_tmul_one_of_one_tmul hA hB x + +end Factors + +section BaseChange + +variable {R A : Type*} [CommSemiring R] [Semiring A] [Algebra R A] +variable (S : Type*) [CommSemiring S] [Algebra R S] (s : Set A) + +/-- Extension of scalars on the elements `1 ⊗ₜ a`. If `s` generates `A` over `R` then + every `1 ⊗ₜ a` lies in the `S`-subalgebra of `S ⊗[R] A` generated by `1 ⊗ₜ s`. -/ +lemma mem_adjoin_one_tmul (hs : Algebra.adjoin R s = ⊤) (a : A) : + (1 : S) ⊗ₜ[R] a ∈ Algebra.adjoin S ((fun a : A => (1 : S) ⊗ₜ[R] a) '' s) := by + have ha : a ∈ Algebra.adjoin R s := hs ▸ Algebra.mem_top + induction ha using Algebra.adjoin_induction with + | mem x hx => exact Algebra.subset_adjoin ⟨x, hx, rfl⟩ + | algebraMap r => + have h : (1 : S) ⊗ₜ[R] (algebraMap R A r) + = algebraMap S (S ⊗[R] A) (algebraMap R S r) := by + simp [Algebra.algebraMap_eq_smul_one, _root_.TensorProduct.tmul_smul, + _root_.TensorProduct.smul_tmul', Algebra.TensorProduct.one_def] + rw [h] + exact Subalgebra.algebraMap_mem _ _ + | add x y _ _ hx hy => rw [_root_.TensorProduct.tmul_add]; exact add_mem hx hy + | mul x y _ _ hx hy => + have h : (1 : S) ⊗ₜ[R] (x * y) = ((1 : S) ⊗ₜ[R] x) * ((1 : S) ⊗ₜ[R] y) := by + rw [Algebra.TensorProduct.tmul_mul_tmul, one_mul] + rw [h] + exact mul_mem hx hy + +/-- Every element of a base change lies in the subalgebra generated by the `1 ⊗ₜ s`. -/ +lemma mem_adjoin_one_tmul_of_generates (hs : Algebra.adjoin R s = ⊤) (x : S ⊗[R] A) : + x ∈ Algebra.adjoin S ((fun a : A => (1 : S) ⊗ₜ[R] a) '' s) := by + induction x using _root_.TensorProduct.induction_on with + | zero => exact zero_mem _ + | add u v hu hv => exact add_mem hu hv + | tmul z a => + have h : z ⊗ₜ[R] a = z • ((1 : S) ⊗ₜ[R] a) := by + rw [_root_.TensorProduct.smul_tmul', smul_eq_mul, mul_one] + exact h ▸ Subalgebra.smul_mem _ (mem_adjoin_one_tmul S s hs a) z + +/-- Extension of scalars preserves generation. If `s` generates `A` over `R` then the + elements `1 ⊗ₜ a`, for `a ∈ s`, generate `S ⊗[R] A` over `S`. -/ +lemma adjoin_one_tmul_eq_top (hs : Algebra.adjoin R s = ⊤) : + Algebra.adjoin S ((fun a : A => (1 : S) ⊗ₜ[R] a) '' s) + = (⊤ : Subalgebra S (S ⊗[R] A)) := + _root_.Algebra.eq_top_iff.mpr fun x => mem_adjoin_one_tmul_of_generates S s hs x + +end BaseChange + +end TensorProduct + +end Algebra + +/-! + +### A.3. Polarization + +-/ + +/-- Polarization. If every value of a linear map into a ring squares to zero, then any two + values anticommute. Applied to a space of fermionic generators, this is what makes the + single relation "every vector squares to zero" carry the anticommutation of distinct + generators, including generators of different species, which sit in the same space. -/ +lemma LinearMap.mul_swap_of_mul_self {R M B : Type*} [CommSemiring R] [AddCommMonoid M] + [Module R M] [Ring B] [Algebra R B] (f : M →ₗ[R] B) (h : ∀ v, f v * f v = 0) (v w : M) : + f v * f w = -(f w * f v) := by + have hvw := h (v + w) + rw [map_add, add_mul, mul_add, mul_add, h v, h w, zero_add, add_zero] at hvw + exact eq_neg_of_add_eq_zero_left hvw + +/-! + +## B. The local field algebra + +-/ + +variable (Ef Eb EA : Type*) [AddCommGroup Ef] [Module ℂ Ef] [AddCommGroup Eb] + [Module ℂ Eb] [AddCommGroup EA] [Module ℝ EA] + +/-- The local field algebra on a complex space `Ef` of fermionic generators, a complex + space `Eb` of bosonic generators and a real space `EA` of connection generators. It is + the exterior algebra of the fermions tensored with the symmetric algebra of the bosons, + tensored with the complexified symmetric algebra of the connection. A local expression + of a field theory, such as a Lagrangian term or a current, is an element of it. + + All fermionic generators share one exterior algebra, so that symbols of different species + anticommute; separate exterior algebras joined by an ordinary tensor product would make + them commute instead. The factor order matches `StandardModel.JetAlgebra`. -/ +abbrev LocalFieldAlgebra : Type _ := + (ExteriorAlgebra ℂ Ef ⊗[ℂ] SymmetricAlgebra ℂ Eb) ⊗[ℂ] (ℂ ⊗[ℝ] SymmetricAlgebra ℝ EA) + +namespace LocalFieldAlgebra + +/-! + +### B.1. The factor inclusions and the generators + +-/ + +/-- The inclusion of the fermionic factor. -/ +noncomputable def includeFermion : ExteriorAlgebra ℂ Ef →ₐ[ℂ] LocalFieldAlgebra Ef Eb EA := + (Algebra.TensorProduct.includeLeft + (R := ℂ) (S := ℂ) (B := ℂ ⊗[ℝ] SymmetricAlgebra ℝ EA)).comp + Algebra.TensorProduct.includeLeft + +/-- The inclusion of the bosonic factor. -/ +noncomputable def includeBoson : SymmetricAlgebra ℂ Eb →ₐ[ℂ] LocalFieldAlgebra Ef Eb EA := + (Algebra.TensorProduct.includeLeft + (R := ℂ) (S := ℂ) (B := ℂ ⊗[ℝ] SymmetricAlgebra ℝ EA)).comp + Algebra.TensorProduct.includeRight + +/-- The inclusion of the complexified connection factor. -/ +noncomputable def includeConnection : + (ℂ ⊗[ℝ] SymmetricAlgebra ℝ EA) →ₐ[ℂ] LocalFieldAlgebra Ef Eb EA := + Algebra.TensorProduct.includeRight + +/-- The fermionic generators of the local field algebra. -/ +noncomputable def ιFermion : Ef →ₗ[ℂ] LocalFieldAlgebra Ef Eb EA := + (includeFermion Ef Eb EA).toLinearMap ∘ₗ ExteriorAlgebra.ι ℂ + +/-- The bosonic generators of the local field algebra. -/ +noncomputable def ιBoson : Eb →ₗ[ℂ] LocalFieldAlgebra Ef Eb EA := + (includeBoson Ef Eb EA).toLinearMap ∘ₗ SymmetricAlgebra.ι ℂ Eb + +/-- The connection generators of the local field algebra. They are only real-linear, the + connection generator space being a real vector space, complexified inside the algebra. -/ +noncomputable def ιConnection : EA →ₗ[ℝ] LocalFieldAlgebra Ef Eb EA := + ((includeConnection Ef Eb EA).restrictScalars ℝ).toLinearMap ∘ₗ + (Algebra.TensorProduct.includeRight + (R := ℝ) (A := ℂ) (B := SymmetricAlgebra ℝ EA)).toLinearMap ∘ₗ + SymmetricAlgebra.ι ℝ EA + +variable {Ef Eb EA} + +lemma ιFermion_apply (v : Ef) : + ιFermion Ef Eb EA v + = (ExteriorAlgebra.ι ℂ v ⊗ₜ[ℂ] (1 : SymmetricAlgebra ℂ Eb)) + ⊗ₜ[ℂ] (1 : ℂ ⊗[ℝ] SymmetricAlgebra ℝ EA) := rfl + +lemma ιBoson_apply (v : Eb) : + ιBoson Ef Eb EA v + = ((1 : ExteriorAlgebra ℂ Ef) ⊗ₜ[ℂ] SymmetricAlgebra.ι ℂ Eb v) + ⊗ₜ[ℂ] (1 : ℂ ⊗[ℝ] SymmetricAlgebra ℝ EA) := rfl + +lemma ιConnection_apply (v : EA) : + ιConnection Ef Eb EA v + = (1 : ExteriorAlgebra ℂ Ef ⊗[ℂ] SymmetricAlgebra ℂ Eb) + ⊗ₜ[ℂ] ((1 : ℂ) ⊗ₜ[ℝ] SymmetricAlgebra.ι ℝ EA v) := rfl + +/-! + +### B.2. The relations satisfied by the generators + +These are the relations a compatible assignment is asked to reproduce, namely Fermi +statistics on the fermionic generators and commutativity everywhere else. + +-/ + +/-- A fermionic generator squares to zero. This is Fermi statistics, in the form that + implies anticommutation across the whole fermionic generator space by polarization. -/ +@[simp] +lemma ιFermion_mul_self (v : Ef) : + ιFermion Ef Eb EA v * ιFermion Ef Eb EA v = 0 := by + simp [ιFermion_apply, Algebra.TensorProduct.tmul_mul_tmul] + +/-- Two fermionic generators anticommute, including generators of two different species, + which share the one exterior algebra. This is not an extra relation, being + `ιFermion_mul_self` polarized. -/ +lemma ιFermion_mul_swap (v w : Ef) : + ιFermion Ef Eb EA v * ιFermion Ef Eb EA w + = -(ιFermion Ef Eb EA w * ιFermion Ef Eb EA v) := by + have h : ExteriorAlgebra.ι ℂ v * ExteriorAlgebra.ι ℂ w + = -(ExteriorAlgebra.ι ℂ w * ExteriorAlgebra.ι (R := ℂ) v) := + eq_neg_of_add_eq_zero_left (ExteriorAlgebra.ι_add_mul_swap (R := ℂ) v w) + simp [ιFermion_apply, Algebra.TensorProduct.tmul_mul_tmul, h, TensorProduct.neg_tmul] + +/-- Two bosonic generators commute. -/ +lemma ιBoson_commute (v w : Eb) : + Commute (ιBoson Ef Eb EA v) (ιBoson Ef Eb EA w) := by + simp [Commute, SemiconjBy, ιBoson_apply, Algebra.TensorProduct.tmul_mul_tmul, mul_comm] + +/-- Two connection generators commute. -/ +lemma ιConnection_commute (v w : EA) : + Commute (ιConnection Ef Eb EA v) (ιConnection Ef Eb EA w) := by + simp [Commute, SemiconjBy, ιConnection_apply, Algebra.TensorProduct.tmul_mul_tmul, + mul_comm] + +/-- A bosonic generator commutes with a connection generator. -/ +lemma ιBoson_commute_ιConnection (v : Eb) (w : EA) : + Commute (ιBoson Ef Eb EA v) (ιConnection Ef Eb EA w) := by + simp [Commute, SemiconjBy, ιBoson_apply, ιConnection_apply, + Algebra.TensorProduct.tmul_mul_tmul, mul_comm] + +/-- A bosonic generator commutes with a fermionic generator, bosons being even. -/ +lemma ιBoson_commute_ιFermion (v : Eb) (w : Ef) : + Commute (ιBoson Ef Eb EA v) (ιFermion Ef Eb EA w) := by + simp [Commute, SemiconjBy, ιBoson_apply, ιFermion_apply, + Algebra.TensorProduct.tmul_mul_tmul, mul_comm] + +/-- A connection generator commutes with a fermionic generator, the connection being even. -/ +lemma ιConnection_commute_ιFermion (v : EA) (w : Ef) : + Commute (ιConnection Ef Eb EA v) (ιFermion Ef Eb EA w) := by + simp [Commute, SemiconjBy, ιConnection_apply, ιFermion_apply, + Algebra.TensorProduct.tmul_mul_tmul, mul_comm] + +variable (Ef Eb EA) + +/-! + +### B.3. Generation by the three families + +-/ + +/-- The generators of the local field algebra, the images of the three generator spaces. -/ +noncomputable def generators : Set (LocalFieldAlgebra Ef Eb EA) := + Set.range (ιFermion Ef Eb EA) ∪ Set.range (ιBoson Ef Eb EA) + ∪ Set.range (ιConnection Ef Eb EA) + +/-- The matter factor `Λ_ℂ Ef ⊗[ℂ] Sym_ℂ Eb` is generated by the images of the fermionic + and bosonic generators. -/ +lemma adjoin_matter_generators_eq_top : + Algebra.adjoin ℂ + (Set.range (fun v : Ef => + ExteriorAlgebra.ι ℂ v ⊗ₜ[ℂ] (1 : SymmetricAlgebra ℂ Eb)) + ∪ Set.range (fun v : Eb => + (1 : ExteriorAlgebra ℂ Ef) ⊗ₜ[ℂ] SymmetricAlgebra.ι ℂ Eb v)) = ⊤ := by + refine Algebra.TensorProduct.eq_top_of_tmul_one_of_one_tmul (fun a => ?_) (fun b => ?_) + · exact Algebra.range_le_of_adjoin_eq_top CliffordAlgebra.adjoin_range_ι + (Algebra.TensorProduct.includeLeft (R := ℂ) (S := ℂ) (B := SymmetricAlgebra ℂ Eb)) + (by rintro _ ⟨v, rfl⟩; exact Algebra.subset_adjoin (Or.inl ⟨v, rfl⟩)) ⟨a, rfl⟩ + · exact Algebra.range_le_of_adjoin_eq_top SymmetricAlgebra.adjoin_range_ι + (Algebra.TensorProduct.includeRight (R := ℂ) (A := ExteriorAlgebra ℂ Ef)) + (by rintro _ ⟨v, rfl⟩; exact Algebra.subset_adjoin (Or.inr ⟨v, rfl⟩)) ⟨b, rfl⟩ + +/-- The local field algebra is generated by its three families of generators. Every + element is a polynomial in the fermionic, bosonic and connection symbols; this is the + algebraic form of "every local expression is a polynomial in the fields and their + derivatives", and it is what forces uniqueness in the universal property. -/ +lemma adjoin_generators_eq_top : + Algebra.adjoin ℂ (generators Ef Eb EA) = ⊤ := by + refine Algebra.TensorProduct.eq_top_of_tmul_one_of_one_tmul (fun m => ?_) (fun y => ?_) + · refine Algebra.range_le_of_adjoin_eq_top (adjoin_matter_generators_eq_top Ef Eb) + (Algebra.TensorProduct.includeLeft (R := ℂ) (S := ℂ) + (B := ℂ ⊗[ℝ] SymmetricAlgebra ℝ EA)) ?_ ⟨m, rfl⟩ + rintro _ (⟨v, rfl⟩ | ⟨v, rfl⟩) + · exact Algebra.subset_adjoin (Or.inl (Or.inl ⟨v, rfl⟩)) + · exact Algebra.subset_adjoin (Or.inl (Or.inr ⟨v, rfl⟩)) + · refine Algebra.range_le_of_adjoin_eq_top + (Algebra.TensorProduct.adjoin_one_tmul_eq_top ℂ (Set.range (SymmetricAlgebra.ι ℝ EA)) + SymmetricAlgebra.adjoin_range_ι) + (Algebra.TensorProduct.includeRight (R := ℂ) + (A := ExteriorAlgebra ℂ Ef ⊗[ℂ] SymmetricAlgebra ℂ Eb)) ?_ ⟨y, rfl⟩ + rintro _ ⟨_, ⟨v, rfl⟩, rfl⟩ + exact Algebra.subset_adjoin (Or.inr ⟨v, rfl⟩) + +/-- Two algebra maps out of the local field algebra agreeing on the generators are + equal. The target is not assumed commutative, so this cannot be deduced from + `SymmetricAlgebra.algHom_ext`; it comes from generation. -/ +lemma algHom_ext {B : Type*} [Ring B] [Algebra ℂ B] + {Φ Ψ : LocalFieldAlgebra Ef Eb EA →ₐ[ℂ] B} + (hf : ∀ v, Φ (ιFermion Ef Eb EA v) = Ψ (ιFermion Ef Eb EA v)) + (hb : ∀ v, Φ (ιBoson Ef Eb EA v) = Ψ (ιBoson Ef Eb EA v)) + (ha : ∀ v, Φ (ιConnection Ef Eb EA v) = Ψ (ιConnection Ef Eb EA v)) : Φ = Ψ := + AlgHom.ext_of_adjoin_eq_top (adjoin_generators_eq_top Ef Eb EA) (by + rintro _ ((⟨v, rfl⟩ | ⟨v, rfl⟩) | ⟨v, rfl⟩) + exacts [hf v, hb v, ha v]) + +/-! + +## C. Compatible generator assignments + +-/ + +/-- A compatible assignment of the generators of the local field algebra in a complex + algebra `B`, given by three linear maps subject to exactly the relations of section B.2. + The algebra `B` is not assumed commutative, and the commutation conditions are imposed + only between the assigned images, not between an image and an arbitrary element of `B`. + + The condition `fermion_mul_self` is imposed on every vector of `Ef`, including sums + across species; over `ℂ` it implies, by polarization, that distinct fermionic images + anticommute. -/ +@[ext] +structure Assignment (B : Type*) [Ring B] [Algebra ℂ B] where + /-- The images of the fermionic generators. -/ + fermion : Ef →ₗ[ℂ] B + /-- The images of the bosonic generators. -/ + boson : Eb →ₗ[ℂ] B + /-- The images of the connection generators; only real-linear, as the connection + generator space is real. -/ + connection : EA →ₗ[ℝ] B + /-- Fermi statistics, every fermionic image squaring to zero. -/ + fermion_mul_self : ∀ v, fermion v * fermion v = 0 + /-- Bosonic images commute pairwise. -/ + boson_commute : ∀ v w, Commute (boson v) (boson w) + /-- Connection images commute pairwise. -/ + connection_commute : ∀ v w, Commute (connection v) (connection w) + /-- Bosonic and connection images commute with each other. -/ + boson_commute_connection : ∀ v w, Commute (boson v) (connection w) + /-- Bosonic images commute with fermionic images. -/ + boson_commute_fermion : ∀ v w, Commute (boson v) (fermion w) + /-- Connection images commute with fermionic images. -/ + connection_commute_fermion : ∀ v w, Commute (connection v) (fermion w) + +section Assignments + +namespace Assignment + +variable {Ef Eb EA} +variable {B : Type*} [Ring B] [Algebra ℂ B] (d : Assignment Ef Eb EA B) + +/-! + +### C.1. Polarization of the fermionic assignment + +-/ + +/-- The images of two fermionic generators anticommute. Only `fermion_mul_self` is + assumed, and only vector by vector; because it is assumed on the whole of `Ef`, including + sums across species, polarization already yields the cross-species anticommutation. So + demanding anticommutation as a separate field of `Assignment` would be redundant. -/ +lemma fermion_mul_swap (v w : Ef) : + d.fermion v * d.fermion w = -(d.fermion w * d.fermion v) := + d.fermion.mul_swap_of_mul_self d.fermion_mul_self v w + +/-! + +### C.2. The commutative subalgebra of even images + +-/ + +/-- The even generator images, the bosonic and connection images together. -/ +def evenGenerators : Set B := Set.range d.boson ∪ Set.range d.connection + +/-- The commutative subalgebra of `B` generated by the even images. The bosonic and + connection assignments are lifted into it, because `SymmetricAlgebra.lift` requires a + commutative target while `B` itself need not be commutative. -/ +def evenSubalgebra : Subalgebra ℂ B := Algebra.adjoin ℂ d.evenGenerators + +instance : IsMulCommutative d.evenSubalgebra := by + refine Algebra.isMulCommutative_adjoin ℂ ?_ + rintro x (⟨v, rfl⟩ | ⟨v, rfl⟩) y (⟨w, rfl⟩ | ⟨w, rfl⟩) + · exact d.boson_commute v w + · exact d.boson_commute_connection v w + · exact (d.boson_commute_connection w v).symm + · exact d.connection_commute v w + +open scoped IsMulCommutative + +/-- The bosonic assignment, corestricted to the commutative subalgebra of even images. -/ +def bosonGenerator : Eb →ₗ[ℂ] d.evenSubalgebra where + toFun v := ⟨d.boson v, Algebra.subset_adjoin (Or.inl ⟨v, rfl⟩)⟩ + map_add' v w := Subtype.ext (by simp) + map_smul' c v := Subtype.ext (by simp) + +/-- The connection assignment, corestricted to the commutative subalgebra of even + images. -/ +def connectionGenerator : EA →ₗ[ℝ] d.evenSubalgebra where + toFun v := ⟨d.connection v, Algebra.subset_adjoin (Or.inr ⟨v, rfl⟩)⟩ + map_add' v w := Subtype.ext (by simp) + map_smul' c v := Subtype.ext (by simp) + +/-! + +### C.3. The three factor maps + +-/ + +/-- The algebra map out of the fermionic factor, the exterior lift of the fermionic + assignment, which already accepts an associative, possibly noncommutative, target. -/ +noncomputable def fermionHom : ExteriorAlgebra ℂ Ef →ₐ[ℂ] B := + ExteriorAlgebra.lift ℂ ⟨d.fermion, d.fermion_mul_self⟩ + +/-- The algebra map out of the bosonic factor, the symmetric lift into the commutative + subalgebra of even images, followed by its inclusion. -/ +noncomputable def bosonHom : SymmetricAlgebra ℂ Eb →ₐ[ℂ] B := + d.evenSubalgebra.val.comp (SymmetricAlgebra.lift d.bosonGenerator) + +/-- The real algebra map out of the real connection factor. -/ +noncomputable def connectionHomReal : SymmetricAlgebra ℝ EA →ₐ[ℝ] B := + (d.evenSubalgebra.val.restrictScalars ℝ).comp + (SymmetricAlgebra.lift d.connectionGenerator) + +/-- The algebra map out of the complexified connection factor, obtained from + `connectionHomReal` by the universal property of extension of scalars, which, unlike the + symmetric lift, accepts a noncommutative target. -/ +noncomputable def connectionHom : (ℂ ⊗[ℝ] SymmetricAlgebra ℝ EA) →ₐ[ℂ] B := + AlgHom.liftEquiv ℝ ℂ _ B d.connectionHomReal + +@[simp] +lemma fermionHom_ι (v : Ef) : d.fermionHom (ExteriorAlgebra.ι ℂ v) = d.fermion v := + ExteriorAlgebra.lift_ι_apply (R := ℂ) d.fermion d.fermion_mul_self v + +@[simp] +lemma bosonHom_ι (v : Eb) : d.bosonHom (SymmetricAlgebra.ι ℂ Eb v) = d.boson v := by + simp [bosonHom, bosonGenerator] + +@[simp] +lemma connectionHomReal_ι (v : EA) : + d.connectionHomReal (SymmetricAlgebra.ι ℝ EA v) = d.connection v := by + simp [connectionHomReal, connectionGenerator] + +@[simp] +lemma connectionHom_tmul (z : ℂ) (p : SymmetricAlgebra ℝ EA) : + d.connectionHom (z ⊗ₜ[ℝ] p) = z • d.connectionHomReal p := rfl + +/-! + +### C.4. Commutation of the factor images + +The tensor-product lifts need commutation between whole factor images, which the +hypotheses supply only on generators. `Algebra.commute_of_adjoin_eq_top` propagates it. + +-/ + +lemma fermionHom_commute_bosonHom (x : ExteriorAlgebra ℂ Ef) (y : SymmetricAlgebra ℂ Eb) : + Commute (d.fermionHom x) (d.bosonHom y) := by + refine Algebra.commute_of_adjoin_eq_top CliffordAlgebra.adjoin_range_ι d.fermionHom ?_ x + rintro _ ⟨v, rfl⟩ + refine (Algebra.commute_of_adjoin_eq_top SymmetricAlgebra.adjoin_range_ι + d.bosonHom ?_ y).symm + rintro _ ⟨w, rfl⟩ + simpa using d.boson_commute_fermion w v + +lemma fermionHom_commute_connectionHom (x : ExteriorAlgebra ℂ Ef) + (y : ℂ ⊗[ℝ] SymmetricAlgebra ℝ EA) : + Commute (d.fermionHom x) (d.connectionHom y) := by + refine Algebra.commute_of_adjoin_eq_top CliffordAlgebra.adjoin_range_ι d.fermionHom ?_ x + rintro _ ⟨v, rfl⟩ + induction y using TensorProduct.induction_on with + | zero => simp + | add u w hu hw => rw [map_add]; exact hu.add_right hw + | tmul z p => + rw [connectionHom_tmul] + refine Commute.smul_right ?_ z + refine (Algebra.commute_of_adjoin_eq_top SymmetricAlgebra.adjoin_range_ι + d.connectionHomReal ?_ p).symm + rintro _ ⟨w, rfl⟩ + simpa using d.connection_commute_fermion w v + +lemma bosonHom_commute_connectionHom (x : SymmetricAlgebra ℂ Eb) + (y : ℂ ⊗[ℝ] SymmetricAlgebra ℝ EA) : + Commute (d.bosonHom x) (d.connectionHom y) := by + refine Algebra.commute_of_adjoin_eq_top SymmetricAlgebra.adjoin_range_ι d.bosonHom ?_ x + rintro _ ⟨v, rfl⟩ + induction y using TensorProduct.induction_on with + | zero => simp + | add u w hu hw => rw [map_add]; exact hu.add_right hw + | tmul z p => + rw [connectionHom_tmul] + refine Commute.smul_right ?_ z + refine (Algebra.commute_of_adjoin_eq_top SymmetricAlgebra.adjoin_range_ι + d.connectionHomReal ?_ p).symm + rintro _ ⟨w, rfl⟩ + simpa using (d.boson_commute_connection v w).symm + +/-! + +## D. The mapping-out universal property + +-/ + +/-! + +### D.1. The induced algebra homomorphism + +-/ + +/-- The algebra map out of the matter factor `Λ_ℂ Ef ⊗[ℂ] Sym_ℂ Eb`. -/ +noncomputable def matterHom : + (ExteriorAlgebra ℂ Ef ⊗[ℂ] SymmetricAlgebra ℂ Eb) →ₐ[ℂ] B := + Algebra.TensorProduct.lift d.fermionHom d.bosonHom d.fermionHom_commute_bosonHom + +lemma matterHom_commute_connectionHom + (x : ExteriorAlgebra ℂ Ef ⊗[ℂ] SymmetricAlgebra ℂ Eb) + (y : ℂ ⊗[ℝ] SymmetricAlgebra ℝ EA) : + Commute (d.matterHom x) (d.connectionHom y) := by + induction x using TensorProduct.induction_on with + | zero => simp + | add u w hu hw => rw [map_add]; exact hu.add_left hw + | tmul a b => + rw [matterHom, Algebra.TensorProduct.lift_tmul] + exact (d.fermionHom_commute_connectionHom a y).mul_left + (d.bosonHom_commute_connectionHom b y) + +/-- The algebra homomorphism induced by a compatible assignment. -/ +noncomputable def lift : LocalFieldAlgebra Ef Eb EA →ₐ[ℂ] B := + Algebra.TensorProduct.lift d.matterHom d.connectionHom d.matterHom_commute_connectionHom + +@[simp] +lemma lift_ιFermion (v : Ef) : d.lift (ιFermion Ef Eb EA v) = d.fermion v := by + simp [lift, ιFermion_apply, matterHom] + +@[simp] +lemma lift_ιBoson (v : Eb) : d.lift (ιBoson Ef Eb EA v) = d.boson v := by + simp [lift, ιBoson_apply, matterHom] + +@[simp] +lemma lift_ιConnection (v : EA) : d.lift (ιConnection Ef Eb EA v) = d.connection v := by + simp [lift, ιConnection_apply, matterHom] + +/-! + +### D.2. Uniqueness + +-/ + +/-- The mapping-out universal property of the local field algebra. A compatible assignment + of the three generator families in an arbitrary, in particular noncommutative, complex + algebra `B` extends to one and only one complex algebra homomorphism out of the local + field algebra. -/ +lemma existsUnique_algHom : + ∃! Φ : LocalFieldAlgebra Ef Eb EA →ₐ[ℂ] B, + (∀ v, Φ (ιFermion Ef Eb EA v) = d.fermion v) ∧ + (∀ v, Φ (ιBoson Ef Eb EA v) = d.boson v) ∧ + (∀ v, Φ (ιConnection Ef Eb EA v) = d.connection v) := + ⟨d.lift, ⟨d.lift_ιFermion, d.lift_ιBoson, d.lift_ιConnection⟩, fun _ hΦ => + algHom_ext Ef Eb EA (fun v => (hΦ.1 v).trans (d.lift_ιFermion v).symm) + (fun v => (hΦ.2.1 v).trans (d.lift_ιBoson v).symm) + (fun v => (hΦ.2.2 v).trans (d.lift_ιConnection v).symm)⟩ + +/-! + +### D.3. Assignments are the same thing as algebra maps + +-/ + +/-- The compatible assignment obtained by pushing one forward along an algebra map, every + relation being preserved by an algebra homomorphism. -/ +def comp {C : Type*} [Ring C] [Algebra ℂ C] (φ : B →ₐ[ℂ] C) : Assignment Ef Eb EA C where + fermion := φ.toLinearMap ∘ₗ d.fermion + boson := φ.toLinearMap ∘ₗ d.boson + connection := (φ.restrictScalars ℝ).toLinearMap ∘ₗ d.connection + fermion_mul_self v := by simpa using congrArg φ (d.fermion_mul_self v) + boson_commute v w := (d.boson_commute v w).map φ + connection_commute v w := (d.connection_commute v w).map φ + boson_commute_connection v w := (d.boson_commute_connection v w).map φ + boson_commute_fermion v w := (d.boson_commute_fermion v w).map φ + connection_commute_fermion v w := (d.connection_commute_fermion v w).map φ + +end Assignment + +end Assignments + +/-- The tautological assignment, with the generators of the local field algebra assigned + to themselves. Its relations are those of section B.2. -/ +noncomputable def canonicalAssignment : + Assignment Ef Eb EA (LocalFieldAlgebra Ef Eb EA) where + fermion := ιFermion Ef Eb EA + boson := ιBoson Ef Eb EA + connection := ιConnection Ef Eb EA + fermion_mul_self := ιFermion_mul_self + boson_commute := ιBoson_commute + connection_commute := ιConnection_commute + boson_commute_connection := ιBoson_commute_ιConnection + boson_commute_fermion := ιBoson_commute_ιFermion + connection_commute_fermion := ιConnection_commute_ιFermion + +/-- Compatible assignments in `B` are the same thing as algebra maps into `B`. This is the + universal property as an equivalence of types rather than a linear equivalence, neither + side being a module in a way the other respects. -/ +noncomputable def liftEquiv (B : Type*) [Ring B] [Algebra ℂ B] : + Assignment Ef Eb EA B ≃ (LocalFieldAlgebra Ef Eb EA →ₐ[ℂ] B) where + toFun d := d.lift + invFun Φ := (canonicalAssignment Ef Eb EA).comp Φ + left_inv d := by + ext v + exacts [d.lift_ιFermion v, d.lift_ιBoson v, d.lift_ιConnection v] + right_inv Φ := + algHom_ext Ef Eb EA + (((canonicalAssignment Ef Eb EA).comp Φ).lift_ιFermion) + (((canonicalAssignment Ef Eb EA).comp Φ).lift_ιBoson) + (((canonicalAssignment Ef Eb EA).comp Φ).lift_ιConnection) + +/-! + +### D.4. The range of the induced map + +-/ + +section Range + +namespace Assignment + +variable {Ef Eb EA} +variable {B : Type*} [Ring B] [Algebra ℂ B] (d : Assignment Ef Eb EA B) + +/-- The range of the induced map is the complex subalgebra generated by the three + assignment images. No injectivity is claimed or required, since a realization of a field + theory may identify local expressions. -/ +lemma range_lift : + d.lift.range + = Algebra.adjoin ℂ + (Set.range d.fermion ∪ Set.range d.boson ∪ Set.range d.connection) := by + refine le_antisymm ?_ (Algebra.adjoin_le ?_) + · refine Algebra.range_le_of_adjoin_eq_top (adjoin_generators_eq_top Ef Eb EA) d.lift ?_ + rintro _ ((⟨v, rfl⟩ | ⟨v, rfl⟩) | ⟨v, rfl⟩) + · exact d.lift_ιFermion v ▸ Algebra.subset_adjoin (Or.inl (Or.inl ⟨v, rfl⟩)) + · exact d.lift_ιBoson v ▸ Algebra.subset_adjoin (Or.inl (Or.inr ⟨v, rfl⟩)) + · exact d.lift_ιConnection v ▸ Algebra.subset_adjoin (Or.inr ⟨v, rfl⟩) + · rintro _ ((⟨v, rfl⟩ | ⟨v, rfl⟩) | ⟨v, rfl⟩) + · exact ⟨ιFermion Ef Eb EA v, d.lift_ιFermion v⟩ + · exact ⟨ιBoson Ef Eb EA v, d.lift_ιBoson v⟩ + · exact ⟨ιConnection Ef Eb EA v, d.lift_ιConnection v⟩ + +end Assignment + +end Range + +end LocalFieldAlgebra diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/SpeciesGenerators.lean b/Physlib/ClassicalFieldTheory/JetAlgebra/SpeciesGenerators.lean new file mode 100644 index 000000000..b04754ba9 --- /dev/null +++ b/Physlib/ClassicalFieldTheory/JetAlgebra/SpeciesGenerators.lean @@ -0,0 +1,703 @@ +/- +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.ClassicalFieldTheory.JetAlgebra.JetComponentSpace.Basic +public import Physlib.ClassicalFieldTheory.JetAlgebra.LocalFieldAlgebra +public import Mathlib.Algebra.DirectSum.Module +/-! +# The generator spaces of a family of species + +## i. Overview + +A field theory carries several species of field, each with its own value space, its own +Lorentz representation and its own mass weight. The local field algebra of +`Physlib.ClassicalFieldTheory.JetAlgebra.LocalFieldAlgebra` takes one complex space of +fermionic generators and one of bosonic generators, so a multi-species theory has to +present its species as a single generator space. + +This file does that with a direct sum of component spaces. For a family `V : ι → Type` of +value spaces the total generator space is + +`SpeciesComponentSpace V = ⨁ i, JetComponentSpace (V i)`, + +one `JetComponentSpace` per species, each with its conjugate summand. The alternative, a +single `JetComponentSpace (∀ i, V i)` on the product of the value spaces, is available but +carries only one mass weight, since its scaling commutes with `JetComponentSpace.comap` +and so cannot distinguish the species. The direct sum records one weight per species. + +Nothing here is finite. Neither the index type `ι` nor any of the value spaces `V i` is +assumed finite, and the component spaces are infinite-dimensional in any case, since a +derivative label ranges over all multisets of directions. Only `DecidableEq ι` is used, +and only to have the summand inclusions. + +The subtle point is Fermi statistics. `LocalFieldAlgebra.Assignment` asks for +`fermion v * fermion v = 0` on the whole fermionic generator space, and imposing it on +each species separately is strictly weaker. By `DirectSum.mul_self_iff_lof`, square-zero +on the total space is equivalent to square-zero on each species together with +anticommutation between the images of any two species. So a species assignment must carry +the cross-species anticommutation as data, and `SpeciesAssignment.fermion_mul_swap` is +that field. + +## ii. Key results + +- `DirectSum.mul_self_iff_lof` : square-zero on a direct sum is square-zero on each + summand plus anticommutation across summands. +- `SpeciesComponentSpace` : the total component space of a family of species. +- `SpeciesComponentSpace.incl`, `SpeciesComponentSpace.assemble`, + `SpeciesComponentSpace.hom_ext`, `SpeciesComponentSpace.existsUnique_linearMap` : the + species inclusions and the mapping-out property of the total component space. +- `SpeciesComponentSpace.comap` : functoriality, contravariant in the family of value + spaces. +- `SpeciesComponentSpace.rep` : the species-diagonal assembly of a family of + representations on the individual component spaces. +- `SpeciesComponentSpace.massWeightScale` : the mass-weight scaling of a family with one + weight per species. +- `JetComponentSpace.comap_comp_massWeightScale` : the scaling of a single component + space is natural in the value space, hence species-blind, which is the reason for the + direct sum. +- `SpeciesLocalFieldAlgebra` : the local field algebra of a family of fermionic and a + family of bosonic species. +- `SpeciesLocalFieldAlgebra.ιFermionSpecies_mul_swap` : the generators of two different + fermionic species anticommute. +- `SpeciesAssignment`, `SpeciesAssignment.lift`, + `SpeciesAssignment.existsUnique_algHom` : the universal property in species form. + +## iii. Table of contents + +- A. Maps out of a direct sum into a ring + - A.1. Commutation + - A.2. Anticommutation and the square-zero condition +- B. The component space of a family of species + - B.1. The species inclusions and the assembly of linear maps + - B.2. Functoriality in the family of value spaces + - B.3. The species-diagonal representation + - B.4. Unequal mass weights + - B.5. Why the weights are recorded per species +- C. The local field algebra of a family of species + - C.1. The species generators + - C.2. Cross-species statistics +- D. Species assignments and the universal property + - D.1. The assembled assignment + - D.2. The induced algebra homomorphism and its computation rules + - D.3. Uniqueness + +-/ + +@[expose] public section + +open TensorProduct DirectSum + +/-! + +## A. Maps out of a direct sum into a ring + +A linear map out of a direct sum is determined by its restrictions to the summands, so a +relation between the images of two such maps which is stable under addition in each +argument need only be checked on the summands. The lemmas below are the instances of that +principle used later, and carry no physics. + +-/ + +namespace DirectSum + +section OfLof + +variable {ι κ : Type*} [DecidableEq ι] [DecidableEq κ] + {M : ι → Type*} [∀ i, AddCommGroup (M i)] [∀ i, Module ℂ (M i)] + {N : κ → Type*} [∀ j, AddCommGroup (N j)] [∀ j, Module ℂ (N j)] + {B : Type*} [Ring B] [Algebra ℂ B] + +/-! + +### A.1. Commutation + +-/ + +/-- If the image of every summand commutes with a fixed element, so does the whole + image. -/ +lemma commute_of_lof_left {F : (⨁ i, M i) →ₗ[ℂ] B} {b : B} + (h : ∀ i x, Commute (F (lof ℂ ι M i x)) b) (v : ⨁ i, M i) : Commute (F v) b := by + induction v using DirectSum.induction_on with + | zero => rw [map_zero]; exact Commute.zero_left b + | of i x => exact h i x + | add v w hv hw => rw [map_add]; exact hv.add_left hw + +/-- Commutation extends from the summands. If the image of every summand of one direct + sum commutes with the image of every summand of another, then the two images commute + elementwise. -/ +lemma commute_of_lof {F : (⨁ i, M i) →ₗ[ℂ] B} {G : (⨁ j, N j) →ₗ[ℂ] B} + (h : ∀ i j x y, Commute (F (lof ℂ ι M i x)) (G (lof ℂ κ N j y))) + (v : ⨁ i, M i) (w : ⨁ j, N j) : Commute (F v) (G w) := + commute_of_lof_left (fun i x => + (commute_of_lof_left (fun j y => (h i j x y).symm) w).symm) v + +/-! + +### A.2. Anticommutation and the square-zero condition + +-/ + +/-- Anticommutation extends from the summands. -/ +lemma mul_swap_of_lof {F : (⨁ i, M i) →ₗ[ℂ] B} + (h : ∀ i j x y, F (lof ℂ ι M i x) * F (lof ℂ ι M j y) + = -(F (lof ℂ ι M j y) * F (lof ℂ ι M i x))) + (v w : ⨁ i, M i) : F v * F w = -(F w * F v) := by + induction v using DirectSum.induction_on with + | zero => simp + | of i x => + induction w using DirectSum.induction_on with + | zero => simp + | of j y => exact h i j x y + | add w₁ w₂ h₁ h₂ => rw [map_add, mul_add, add_mul, h₁, h₂, neg_add] + | add v₁ v₂ h₁ h₂ => rw [map_add, add_mul, mul_add, h₁, h₂, neg_add] + +/-- Square-zero extends from the summands, given anticommutation across them. The + cross terms of `(x + y) * (x + y)` cancel exactly because the two images anticommute; + square-zero on each summand alone would leave them. -/ +lemma mul_self_of_lof {F : (⨁ i, M i) →ₗ[ℂ] B} + (hsq : ∀ i x, F (lof ℂ ι M i x) * F (lof ℂ ι M i x) = 0) + (hswap : ∀ i j x y, F (lof ℂ ι M i x) * F (lof ℂ ι M j y) + = -(F (lof ℂ ι M j y) * F (lof ℂ ι M i x))) + (v : ⨁ i, M i) : F v * F v = 0 := by + have key := mul_swap_of_lof hswap + induction v using DirectSum.induction_on with + | zero => simp + | of i x => exact hsq i x + | add v w hv hw => + have h : F (v + w) * F (v + w) + = F v * F v + (F v * F w + F w * F v) + F w * F w := by + rw [map_add]; noncomm_ring + rw [h, hv, hw, key v w] + abel + +/-- Square-zero on a direct sum is not square-zero summand by summand. It is equivalent to + square-zero on each summand together with anticommutation between the images of any two + summands, the second condition being vacuous only when there is at most one summand. + This is the precise sense in which Fermi statistics for a family of species is more than + the Fermi statistics of the individual species. -/ +lemma mul_self_iff_lof {F : (⨁ i, M i) →ₗ[ℂ] B} : + (∀ v, F v * F v = 0) ↔ + ((∀ i x, F (lof ℂ ι M i x) * F (lof ℂ ι M i x) = 0) ∧ + ∀ i j x y, F (lof ℂ ι M i x) * F (lof ℂ ι M j y) + = -(F (lof ℂ ι M j y) * F (lof ℂ ι M i x))) := + ⟨fun h => ⟨fun _ _ => h _, fun _ _ _ _ => F.mul_swap_of_mul_self h _ _⟩, + fun h v => mul_self_of_lof h.1 h.2 v⟩ + +end OfLof + +end DirectSum + +/-! + +## B. The component space of a family of species + +-/ + +section ComponentSpace + +variable {ι : Type*} [DecidableEq ι] (V : ι → Type*) + [∀ i, AddCommGroup (V i)] [∀ i, Module ℂ (V i)] + +/-- The component space of a family of species, with one `JetComponentSpace` per species, + each carrying its own conjugate summand, combined by a direct sum. A component function + of the theory is a finitely supported family of component functions of the species. -/ +abbrev SpeciesComponentSpace : Type _ := ⨁ i, JetComponentSpace (V i) + +namespace SpeciesComponentSpace + +/-! + +### B.1. The species inclusions and the assembly of linear maps + +-/ + +/-- The inclusion of a species into the total component space. -/ +abbrev incl (i : ι) : JetComponentSpace (V i) →ₗ[ℂ] SpeciesComponentSpace V := + DirectSum.lof ℂ ι (fun i => JetComponentSpace (V i)) i + +variable {N : Type*} [AddCommMonoid N] [Module ℂ N] + +/-- The assembly of a species-wise family of linear maps into a common target. -/ +abbrev assemble (f : ∀ i, JetComponentSpace (V i) →ₗ[ℂ] N) : + SpeciesComponentSpace V →ₗ[ℂ] N := + DirectSum.toModule ℂ ι N f + +variable {V} + +@[simp] +lemma assemble_incl (f : ∀ i, JetComponentSpace (V i) →ₗ[ℂ] N) (i : ι) + (x : JetComponentSpace (V i)) : assemble V f (incl V i x) = f i x := + DirectSum.toModule_lof (M := fun i => JetComponentSpace (V i)) ℂ i x + +/-- Two linear maps out of the total component space agreeing on every species are + equal. -/ +lemma hom_ext {F G : SpeciesComponentSpace V →ₗ[ℂ] N} + (h : ∀ i x, F (incl V i x) = G (incl V i x)) : F = G := + DirectSum.linearMap_ext ℂ fun i => LinearMap.ext (h i) + +variable (V) + +/-- The mapping-out property of the total component space. A species-wise family of linear + maps into a common target extends to one and only one linear map out of the total + component space. -/ +lemma existsUnique_linearMap (f : ∀ i, JetComponentSpace (V i) →ₗ[ℂ] N) : + ∃! F : SpeciesComponentSpace V →ₗ[ℂ] N, ∀ i x, F (incl V i x) = f i x := + ⟨assemble V f, assemble_incl f, fun _ hF => + hom_ext fun i x => (hF i x).trans (assemble_incl f i x).symm⟩ + +/-! + +### B.2. Functoriality in the family of value spaces + +Component functions are covectors on the value space, so the total component space is +contravariant in the family of value spaces, exactly as a single one is. The species-wise +pullbacks are the existing `JetComponentSpace.comap`; only the assembly is new. + +-/ + +variable (W : ι → Type*) [∀ i, AddCommGroup (W i)] [∀ i, Module ℂ (W i)] + +/-- The total component space is contravariant in the family of value spaces. Applied + to the projections out of a larger family, this is the inclusion of a subfamily of + species. -/ +noncomputable def comap (f : ∀ i, V i →ₗ[ℂ] W i) : + SpeciesComponentSpace W →ₗ[ℂ] SpeciesComponentSpace V := + assemble W fun i => (incl V i).comp (JetComponentSpace.comap (f i)) + +variable {V W} + +@[simp] +lemma comap_incl (f : ∀ i, V i →ₗ[ℂ] W i) (i : ι) (x : JetComponentSpace (W i)) : + comap V W f (incl W i x) = incl V i (JetComponentSpace.comap (f i) x) := + assemble_incl _ i x + +@[simp] +lemma comap_id : comap V V (fun _ => LinearMap.id) = LinearMap.id := + hom_ext fun i x => by + rw [comap_incl, JetComponentSpace.comap_id, LinearMap.id_apply, LinearMap.id_apply] + +/-- Functoriality, with the order reversing as a contravariant construction demands. -/ +lemma comap_comp (U : ι → Type*) [∀ i, AddCommGroup (U i)] [∀ i, Module ℂ (U i)] + (f : ∀ i, V i →ₗ[ℂ] W i) (g : ∀ i, W i →ₗ[ℂ] U i) : + comap V U (fun i => (g i).comp (f i)) = (comap V W f).comp (comap W U g) := + hom_ext fun i x => by + rw [comap_incl, JetComponentSpace.comap_comp, LinearMap.comp_apply, + LinearMap.comp_apply, comap_incl, comap_incl] + +/-! + +### B.3. The species-diagonal representation + +A symmetry of a field theory acts on each species separately, a Lorentz transformation +through that species' Lorentz representation and a gauge jet through that species' jet +action. On the total component space the action is therefore the direct sum of the +species-wise actions, and the representation laws follow from the mapping-out property of +the direct sum alone, with no relation between the species used. + +-/ + +variable (V) + +/-- The species-diagonal representation on the total component space assembled from a + representation on each species' component space. The summands are preserved, so `map_one` + and `map_mul` reduce by `hom_ext` to the corresponding laws of the species-wise + representations. + + Both transformation laws a matter species carries are of this form, namely the Lorentz + action `JetComponentSpace.repLorentzGroup` and the jet gauge action + `JetComponentSpace.repJet`. Nothing here asks the two to commute, and nothing asks the + monoid `H` to be related to the species. -/ +noncomputable def rep {H : Type*} [Monoid H] + (ρ : ∀ i, Representation ℂ H (JetComponentSpace (V i))) : + Representation ℂ H (SpeciesComponentSpace V) where + toFun g := assemble V fun i => (incl V i).comp (ρ i g) + map_one' := hom_ext fun i x => by simp + map_mul' g h := hom_ext fun i x => by simp + +variable {V} + +/-- The species-diagonal representation acts on the summand of a species through that + species' representation. -/ +@[simp] +lemma rep_incl {H : Type*} [Monoid H] (ρ : ∀ i, Representation ℂ H (JetComponentSpace (V i))) + (g : H) (i : ι) (x : JetComponentSpace (V i)) : + rep V ρ g (incl V i x) = incl V i (ρ i g x) := + assemble_incl _ i x + +/-! + +### B.4. Unequal mass weights + +The mass weight is a property of a species, not of the theory, a fermion carrying weight +`3` and a scalar weight `2`. The total component space records one weight per species, +and the scaling acts on the summand of a species through that species' weight alone. + +-/ + +variable (V) + +/-- The mass-weight scaling of a family of species, with the weight `w i` of each + species acting on that species' component functions. -/ +noncomputable def massWeightScale (w : ι → ℕ) (c : ℂ) : + SpeciesComponentSpace V →ₗ[ℂ] SpeciesComponentSpace V := + assemble V fun i => (incl V i).comp (JetComponentSpace.massWeightScale (w i) c) + +variable {V} + +@[simp] +lemma massWeightScale_incl (w : ι → ℕ) (c : ℂ) (i : ι) (x : JetComponentSpace (V i)) : + massWeightScale V w c (incl V i x) + = incl V i (JetComponentSpace.massWeightScale (w i) c x) := + assemble_incl _ i x + +/-- On a homogeneous component function `∂_s φ_α` of the species `i` the scaling is + multiplication by `c ^ (w i + 2 |s|)`, the weight being the weight of that species. -/ +lemma massWeightScale_incl_basis_tmul (w : ι → ℕ) (c : ℂ) (i : ι) + (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (V i)) : + massWeightScale V w c + (incl V i ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace (V i))) + = c ^ (w i + 2 * Multiset.card s) • + incl V i ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace (V i)) := by + rw [massWeightScale_incl, ← LinearMap.map_smul] + refine congrArg _ (Prod.ext ?_ ?_) + · exact JetComponentSpace.massWeightScale_fst_basis_tmul (w i) c s φ 0 + · simp + +/-- The conjugate component functions of a species scale with the same weight as its + unconjugated ones. -/ +lemma massWeightScale_incl_basis_tmul_conj (w : ι → ℕ) (c : ℂ) (i : ι) + (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule (V i))) : + massWeightScale V w c + (incl V i ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace (V i))) + = c ^ (w i + 2 * Multiset.card s) • + incl V i ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace (V i)) := by + rw [massWeightScale_incl, ← LinearMap.map_smul] + refine congrArg _ (Prod.ext ?_ ?_) + · simp + · simp only [JetComponentSpace.massWeightScale_snd, Prod.smul_snd, + TensorProduct.map_tmul, AlgHom.toLinearMap_apply, + DerivAlgebraComplex.gradeScale_basis, LinearMap.id_apply, TensorProduct.smul_tmul', + ← pow_mul, ← smul_assoc, smul_eq_mul, ← pow_add, mul_comm 2 (Multiset.card s)] + +end SpeciesComponentSpace + +end ComponentSpace + +/-! + +### B.5. Why the weights are recorded per species + +-/ + +/-- The mass-weight scaling of a single component space is natural in the value space. It + therefore cannot see which species a component function came from, so in the alternative + encoding `JetComponentSpace (∀ i, V i)`, where a species enters through + `JetComponentSpace.comap (LinearMap.proj i)`, every species is scaled by the same weight. + That is why the total generator space of this file is a direct sum, with one weight per + summand. + + The statement is about a single `JetComponentSpace` and would sit more naturally with the + rest of that API in `Physlib.ClassicalFieldTheory.JetAlgebra.JetComponentSpace.Basic`; it + is here because it justifies the choice this file makes. -/ +lemma JetComponentSpace.comap_comp_massWeightScale {V W : Type*} [AddCommGroup V] + [Module ℂ V] [AddCommGroup W] [Module ℂ W] (f : V →ₗ[ℂ] W) (w : ℕ) (c : ℂ) : + (JetComponentSpace.comap f).comp (JetComponentSpace.massWeightScale w c) + = (JetComponentSpace.massWeightScale w c).comp (JetComponentSpace.comap f) := by + simp only [JetComponentSpace.comap, JetComponentSpace.massWeightScale, + LinearMap.comp_smul, LinearMap.smul_comp, LinearMap.prodMap_comp, + ← TensorProduct.map_comp, LinearMap.comp_id, LinearMap.id_comp] + +/-! + +## C. The local field algebra of a family of species + +-/ + +section SpeciesAlgebra + +variable {ιf ιb : Type*} [DecidableEq ιf] [DecidableEq ιb] + (Vf : ιf → Type*) [∀ i, AddCommGroup (Vf i)] [∀ i, Module ℂ (Vf i)] + (Vb : ιb → Type*) [∀ j, AddCommGroup (Vb j)] [∀ j, Module ℂ (Vb j)] + (EA : Type*) [AddCommGroup EA] [Module ℝ EA] + +/-- The local field algebra of a family of species. Its fermionic generators are the + component functions of a family of fermionic species, its bosonic generators those of a + family of bosonic species, and its connection generator space is left abstract. All the + fermionic species share one exterior algebra, so their generators anticommute across + species and not merely within one. -/ +abbrev SpeciesLocalFieldAlgebra : Type _ := + LocalFieldAlgebra (SpeciesComponentSpace Vf) (SpeciesComponentSpace Vb) EA + +namespace SpeciesLocalFieldAlgebra + +open LocalFieldAlgebra + +/-! + +### C.1. The species generators + +-/ + +/-- The fermionic generators contributed by one species. -/ +noncomputable def ιFermionSpecies (i : ιf) : + JetComponentSpace (Vf i) →ₗ[ℂ] SpeciesLocalFieldAlgebra Vf Vb EA := + (ιFermion (SpeciesComponentSpace Vf) (SpeciesComponentSpace Vb) EA).comp + (SpeciesComponentSpace.incl Vf i) + +/-- The bosonic generators contributed by one species. -/ +noncomputable def ιBosonSpecies (j : ιb) : + JetComponentSpace (Vb j) →ₗ[ℂ] SpeciesLocalFieldAlgebra Vf Vb EA := + (ιBoson (SpeciesComponentSpace Vf) (SpeciesComponentSpace Vb) EA).comp + (SpeciesComponentSpace.incl Vb j) + +variable {Vf Vb EA} + +omit [DecidableEq ιb] in +lemma ιFermionSpecies_apply (i : ιf) (x : JetComponentSpace (Vf i)) : + ιFermionSpecies Vf Vb EA i x + = ιFermion (SpeciesComponentSpace Vf) (SpeciesComponentSpace Vb) EA + (SpeciesComponentSpace.incl Vf i x) := rfl + +omit [DecidableEq ιf] in +lemma ιBosonSpecies_apply (j : ιb) (y : JetComponentSpace (Vb j)) : + ιBosonSpecies Vf Vb EA j y + = ιBoson (SpeciesComponentSpace Vf) (SpeciesComponentSpace Vb) EA + (SpeciesComponentSpace.incl Vb j y) := rfl + +/-! + +### C.2. Cross-species statistics + +The five relations of `LocalFieldAlgebra`, read one species at a time. Each is the +corresponding relation of the total generator space evaluated at the images of the species +inclusions, so none is new mathematical content; what they record is that the inclusions +do not disturb the statistics. + +-/ + +omit [DecidableEq ιb] in +/-- A fermionic generator squares to zero. -/ +@[simp] +lemma ιFermionSpecies_mul_self (i : ιf) (x : JetComponentSpace (Vf i)) : + ιFermionSpecies Vf Vb EA i x * ιFermionSpecies Vf Vb EA i x = 0 := + ιFermion_mul_self (Ef := SpeciesComponentSpace Vf) (Eb := SpeciesComponentSpace Vb) + (EA := EA) (SpeciesComponentSpace.incl Vf i x) + +omit [DecidableEq ιb] in +/-- Fermionic generators of two different species anticommute. The two species enter + the same exterior algebra through different summands of the total component space, so + this is the ordinary exterior anticommutation, not an extra relation; it is what + separate exterior algebras joined by an ordinary tensor product would lose. -/ +lemma ιFermionSpecies_mul_swap (i j : ιf) (x : JetComponentSpace (Vf i)) + (y : JetComponentSpace (Vf j)) : + ιFermionSpecies Vf Vb EA i x * ιFermionSpecies Vf Vb EA j y + = -(ιFermionSpecies Vf Vb EA j y * ιFermionSpecies Vf Vb EA i x) := + ιFermion_mul_swap (Ef := SpeciesComponentSpace Vf) (Eb := SpeciesComponentSpace Vb) + (EA := EA) (SpeciesComponentSpace.incl Vf i x) (SpeciesComponentSpace.incl Vf j y) + +omit [DecidableEq ιf] in +/-- Bosonic generators commute, across species as well as within one. -/ +lemma ιBosonSpecies_commute (i j : ιb) (x : JetComponentSpace (Vb i)) + (y : JetComponentSpace (Vb j)) : + Commute (ιBosonSpecies Vf Vb EA i x) (ιBosonSpecies Vf Vb EA j y) := + ιBoson_commute (Ef := SpeciesComponentSpace Vf) (Eb := SpeciesComponentSpace Vb) + (EA := EA) (SpeciesComponentSpace.incl Vb i x) (SpeciesComponentSpace.incl Vb j y) + +/-- A bosonic generator commutes with a fermionic one, bosons being even. -/ +lemma ιBosonSpecies_commute_ιFermionSpecies (j : ιb) (i : ιf) + (y : JetComponentSpace (Vb j)) (x : JetComponentSpace (Vf i)) : + Commute (ιBosonSpecies Vf Vb EA j y) (ιFermionSpecies Vf Vb EA i x) := + ιBoson_commute_ιFermion (Ef := SpeciesComponentSpace Vf) (Eb := SpeciesComponentSpace Vb) + (EA := EA) (SpeciesComponentSpace.incl Vb j y) (SpeciesComponentSpace.incl Vf i x) + +omit [DecidableEq ιf] in +/-- A bosonic generator commutes with a connection generator. -/ +lemma ιBosonSpecies_commute_ιConnection (j : ιb) (y : JetComponentSpace (Vb j)) (v : EA) : + Commute (ιBosonSpecies Vf Vb EA j y) + (ιConnection (SpeciesComponentSpace Vf) (SpeciesComponentSpace Vb) EA v) := + ιBoson_commute_ιConnection (Ef := SpeciesComponentSpace Vf) + (Eb := SpeciesComponentSpace Vb) (EA := EA) (SpeciesComponentSpace.incl Vb j y) v + +omit [DecidableEq ιb] in +/-- A connection generator commutes with a fermionic one, the connection being even. -/ +lemma ιConnection_commute_ιFermionSpecies (v : EA) (i : ιf) + (x : JetComponentSpace (Vf i)) : + Commute (ιConnection (SpeciesComponentSpace Vf) (SpeciesComponentSpace Vb) EA v) + (ιFermionSpecies Vf Vb EA i x) := + ιConnection_commute_ιFermion (Ef := SpeciesComponentSpace Vf) + (Eb := SpeciesComponentSpace Vb) (EA := EA) v (SpeciesComponentSpace.incl Vf i x) + +end SpeciesLocalFieldAlgebra + +/-! + +## D. Species assignments and the universal property + +-/ + +open SpeciesLocalFieldAlgebra in +/-- A compatible assignment for a family of species in a complex algebra `B`, which is not + assumed commutative. It consists of one linear map per fermionic species, one per + bosonic species, and one real-linear map on the connection generator space, subject to + the relations of section C.2 read species by species. + + `fermion_mul_swap` is not redundant. `LocalFieldAlgebra.Assignment` demands + `fermion v * fermion v = 0` on the whole fermionic generator space, and by + `DirectSum.mul_self_iff_lof` that condition is equivalent to `fermion_mul_self` together + with `fermion_mul_swap`, since species-wise square-zero alone leaves the cross terms of + `(x + y) * (x + y)` for `x` and `y` in different species. -/ +structure SpeciesAssignment (B : Type*) [Ring B] [Algebra ℂ B] where + /-- The images of the generators of each fermionic species. -/ + fermion : ∀ i, JetComponentSpace (Vf i) →ₗ[ℂ] B + /-- The images of the generators of each bosonic species. -/ + boson : ∀ j, JetComponentSpace (Vb j) →ₗ[ℂ] B + /-- The images of the connection generators; only real-linear. -/ + connection : EA →ₗ[ℝ] B + /-- Fermi statistics within a species. -/ + fermion_mul_self : ∀ i x, fermion i x * fermion i x = 0 + /-- Fermi statistics across species, which does not follow from `fermion_mul_self`. -/ + fermion_mul_swap : ∀ i j x y, fermion i x * fermion j y = -(fermion j y * fermion i x) + /-- Bosonic images commute, across species as well as within one. -/ + boson_commute : ∀ i j x y, Commute (boson i x) (boson j y) + /-- Connection images commute pairwise. -/ + connection_commute : ∀ v w, Commute (connection v) (connection w) + /-- Bosonic and connection images commute with each other. -/ + boson_commute_connection : ∀ j y w, Commute (boson j y) (connection w) + /-- Bosonic images commute with fermionic images. -/ + boson_commute_fermion : ∀ j i y x, Commute (boson j y) (fermion i x) + /-- Connection images commute with fermionic images. -/ + connection_commute_fermion : ∀ v i x, Commute (connection v) (fermion i x) + +namespace SpeciesAssignment + +open SpeciesLocalFieldAlgebra + +variable {Vf Vb EA} +variable {B : Type*} [Ring B] [Algebra ℂ B] + +/-! + +### D.1. The assembled assignment + +-/ + +/-- Species-wise square-zero is not square-zero. The condition + `LocalFieldAlgebra.Assignment` imposes on the assembled fermionic map is equivalent to + the two fields `fermion_mul_self` and `fermion_mul_swap` of `SpeciesAssignment` + together; the second is vacuous only for a family with at most one species. -/ +lemma assemble_mul_self_iff (f : ∀ i, JetComponentSpace (Vf i) →ₗ[ℂ] B) : + (∀ v, SpeciesComponentSpace.assemble Vf f v * SpeciesComponentSpace.assemble Vf f v = 0) + ↔ ((∀ i x, f i x * f i x = 0) ∧ + ∀ i j x y, f i x * f j y = -(f j y * f i x)) := by + rw [DirectSum.mul_self_iff_lof] + simp + +variable (d : SpeciesAssignment Vf Vb EA B) + +/-- The compatible assignment assembled from a species assignment. Each of the five + relations of `LocalFieldAlgebra.Assignment` is quantified over the whole generator + space; each is obtained from its species-wise form by the extension lemmas of section + A. -/ +def toAssignment : LocalFieldAlgebra.Assignment + (SpeciesComponentSpace Vf) (SpeciesComponentSpace Vb) EA B where + fermion := SpeciesComponentSpace.assemble Vf d.fermion + boson := SpeciesComponentSpace.assemble Vb d.boson + connection := d.connection + fermion_mul_self := + (assemble_mul_self_iff d.fermion).2 ⟨d.fermion_mul_self, d.fermion_mul_swap⟩ + boson_commute := DirectSum.commute_of_lof fun i j x y => by + simpa using d.boson_commute i j x y + connection_commute := d.connection_commute + boson_commute_connection := fun v w => + DirectSum.commute_of_lof_left (fun j y => by + simpa using d.boson_commute_connection j y w) v + boson_commute_fermion := DirectSum.commute_of_lof fun j i y x => by + simpa using d.boson_commute_fermion j i y x + connection_commute_fermion := fun v w => + (DirectSum.commute_of_lof_left (fun i x => by + simpa using (d.connection_commute_fermion v i x).symm) w).symm + +@[simp] +lemma toAssignment_fermion : + d.toAssignment.fermion = SpeciesComponentSpace.assemble Vf d.fermion := rfl + +@[simp] +lemma toAssignment_boson : + d.toAssignment.boson = SpeciesComponentSpace.assemble Vb d.boson := rfl + +@[simp] +lemma toAssignment_connection : d.toAssignment.connection = d.connection := rfl + +/-! + +### D.2. The induced algebra homomorphism and its computation rules + +-/ + +/-- The algebra homomorphism induced by a species assignment. -/ +noncomputable def lift : SpeciesLocalFieldAlgebra Vf Vb EA →ₐ[ℂ] B := + d.toAssignment.lift + +@[simp] +lemma lift_ιFermionSpecies (i : ιf) (x : JetComponentSpace (Vf i)) : + d.lift (ιFermionSpecies Vf Vb EA i x) = d.fermion i x := by + rw [lift, ιFermionSpecies_apply, LocalFieldAlgebra.Assignment.lift_ιFermion, + toAssignment_fermion, SpeciesComponentSpace.assemble_incl] + +@[simp] +lemma lift_ιBosonSpecies (j : ιb) (y : JetComponentSpace (Vb j)) : + d.lift (ιBosonSpecies Vf Vb EA j y) = d.boson j y := by + rw [lift, ιBosonSpecies_apply, LocalFieldAlgebra.Assignment.lift_ιBoson, + toAssignment_boson, SpeciesComponentSpace.assemble_incl] + +@[simp] +lemma lift_ιConnection (v : EA) : + d.lift (LocalFieldAlgebra.ιConnection + (SpeciesComponentSpace Vf) (SpeciesComponentSpace Vb) EA v) = d.connection v := + d.toAssignment.lift_ιConnection v + +/-! + +### D.3. Uniqueness + +-/ + +/-- Two algebra maps agreeing on every species are equal. -/ +lemma algHom_ext {Φ Ψ : SpeciesLocalFieldAlgebra Vf Vb EA →ₐ[ℂ] B} + (hf : ∀ i x, Φ (ιFermionSpecies Vf Vb EA i x) = Ψ (ιFermionSpecies Vf Vb EA i x)) + (hb : ∀ j y, Φ (ιBosonSpecies Vf Vb EA j y) = Ψ (ιBosonSpecies Vf Vb EA j y)) + (ha : ∀ v, Φ (LocalFieldAlgebra.ιConnection + (SpeciesComponentSpace Vf) (SpeciesComponentSpace Vb) EA v) + = Ψ (LocalFieldAlgebra.ιConnection + (SpeciesComponentSpace Vf) (SpeciesComponentSpace Vb) EA v)) : Φ = Ψ := + LocalFieldAlgebra.algHom_ext _ _ EA + (fun v => LinearMap.congr_fun (SpeciesComponentSpace.hom_ext + (F := Φ.toLinearMap.comp (LocalFieldAlgebra.ιFermion _ _ EA)) + (G := Ψ.toLinearMap.comp (LocalFieldAlgebra.ιFermion _ _ EA)) hf) v) + (fun w => LinearMap.congr_fun (SpeciesComponentSpace.hom_ext + (F := Φ.toLinearMap.comp (LocalFieldAlgebra.ιBoson _ _ EA)) + (G := Ψ.toLinearMap.comp (LocalFieldAlgebra.ιBoson _ _ EA)) hb) w) + ha + +/-- The mapping-out universal property in species form. A compatible species assignment in + an arbitrary associative complex algebra `B` extends to one and only one complex algebra + homomorphism out of the local field algebra of the family. -/ +lemma existsUnique_algHom : + ∃! Φ : SpeciesLocalFieldAlgebra Vf Vb EA →ₐ[ℂ] B, + (∀ i x, Φ (ιFermionSpecies Vf Vb EA i x) = d.fermion i x) ∧ + (∀ j y, Φ (ιBosonSpecies Vf Vb EA j y) = d.boson j y) ∧ + (∀ v, Φ (LocalFieldAlgebra.ιConnection + (SpeciesComponentSpace Vf) (SpeciesComponentSpace Vb) EA v) = d.connection v) := + ⟨d.lift, ⟨d.lift_ιFermionSpecies, d.lift_ιBosonSpecies, d.lift_ιConnection⟩, fun _ hΦ => + algHom_ext (fun i x => (hΦ.1 i x).trans (d.lift_ιFermionSpecies i x).symm) + (fun j y => (hΦ.2.1 j y).trans (d.lift_ιBosonSpecies j y).symm) + (fun v => (hΦ.2.2 v).trans (d.lift_ιConnection v).symm)⟩ + +end SpeciesAssignment + +end SpeciesAlgebra + From 5359042f207f2eb312b6a8c047c79d9a69007fae Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 7 Sep 2026 06:55:52 +0100 Subject: [PATCH 273/367] refactor: some tidying --- Physlib/Mathematics/LeviCivita/Basic.lean | 60 +++++ .../YukawaSector/MassDimLTEight.lean | 4 +- .../MassWeight/MassDimEight.lean | 30 +-- .../MassWeight/MassDimLTEight.lean | 2 +- .../MassWeight/MassDimEight.lean | 8 +- .../LorentzGroup/Boosts/WeightGrading.lean | 76 ++++++ .../LorentzGroup/Invariants/IsBiLeftWeyl.lean | 5 +- .../LorentzGroup/Invariants/IsBiLorentz.lean | 23 +- .../Invariants/IsLeftRightWeyl.lean | 5 +- .../Invariants/IsQuadLorentz.lean | 229 +++++------------- .../Invariants/IsSingleLorentz.lean | 6 +- .../LorentzGroup/Invariants/IsTriLorentz.lean | 5 +- .../Invariants/IsVectorLeftRightWeyl.lean | 27 +-- Physlib/Relativity/MinkowskiMatrix.lean | 59 +++++ 14 files changed, 306 insertions(+), 233 deletions(-) diff --git a/Physlib/Mathematics/LeviCivita/Basic.lean b/Physlib/Mathematics/LeviCivita/Basic.lean index b20ada784..0f565743b 100644 --- a/Physlib/Mathematics/LeviCivita/Basic.lean +++ b/Physlib/Mathematics/LeviCivita/Basic.lean @@ -32,6 +32,9 @@ permutation via `Matrix.det_permutation`. - `leviCivitaSymbol_comp_swap` : antisymmetry under transposition of two indices. - `leviCivitaSymbol_swap_comp` : antisymmetry under transposition of two index values. - `leviCivitaSymbol_eq_zero_iff` : the symbol vanishes exactly on repeated indices. +- `sum_leviCivitaSymbol_mul_prod` : contracted against the rows of a matrix `M` selected by + `a`, the symbol gives `det M` times the symbol of `a`. This is the statement that `ε` + transforms as a tensor density of weight one. ## iii. Table of contents @@ -39,6 +42,7 @@ permutation via `Matrix.det_permutation`. - B. Value on permutations - C. Antisymmetry - D. Vanishing on repeated indices +- E. Contraction against a matrix ## iv. References @@ -151,3 +155,59 @@ lemma leviCivitaSymbol_eq_zero_iff {g : ι → ι} : ⟨Equiv.ofBijective g (Finite.injective_iff_bijective.mp hinj), rfl⟩ rw [leviCivitaSymbol_perm] at h exact Units.ne_zero (Equiv.Perm.sign σ) h + +/-! + +## E. Contraction against a matrix + +Contracting the symbol against the rows of a matrix `M` picked out by `a` gives `det M` times +the symbol of `a`. Both sides are the determinant of the matrix of those rows: on the left by +expanding it along the Leibniz formula, on the right by the product rule, the row selection +being the matrix of Kronecker deltas of `a`. + +-/ + +variable {R : Type*} [CommRing R] + +/-- The symbol as a determinant over any commutative ring, the integer determinant carried +along the ring map from `ℤ`. -/ +lemma cast_leviCivitaSymbol (g : ι → ι) : + ((leviCivitaSymbol g : ℤ) : R) + = (Matrix.of fun i j : ι => if g i = j then (1 : R) else 0).det := by + have h := RingHom.map_det (Int.castRingHom R) + (Matrix.of fun i j : ι => if g i = j then (1 : ℤ) else 0) + simp only [Int.coe_castRingHom, RingHom.mapMatrix_apply] at h + rw [leviCivitaSymbol_eq_det, show (fun (i j : ι) => ((kroneckerDelta (g i) j : ℕ) : ℤ)) + = (Matrix.of fun i j : ι => if g i = j then (1 : ℤ) else 0) from by + ext i j + by_cases hij : g i = j <;> simp [kroneckerDelta, hij], h] + congr 1 + ext i j + by_cases hij : g i = j <;> simp [Matrix.map_apply, hij] + +/-- The Leibniz formula with the permutation moving the column index. -/ +private lemma det_eq_sum_perm_prod (X : Matrix ι ι R) : + X.det = ∑ σ : Equiv.Perm ι, ((Equiv.Perm.sign σ : ℤ) : R) * ∏ i, X i (σ i) := by + rw [← Matrix.det_transpose X, Matrix.det_apply'] + rfl + +/-- Contracted against the rows of `M` selected by `a`, the symbol gives `det M` times the +symbol of `a`. -/ +lemma sum_leviCivitaSymbol_mul_prod (M : Matrix ι ι R) (a : ι → ι) : + ∑ g : ι → ι, ((leviCivitaSymbol g : ℤ) : R) * ∏ i, M (a i) (g i) + = M.det * ((leviCivitaSymbol a : ℤ) : R) := by + classical + have hrows : (Matrix.of fun i j => M (a i) j).det + = ((leviCivitaSymbol a : ℤ) : R) * M.det := by + rw [cast_leviCivitaSymbol, ← Matrix.det_mul] + congr 1 + ext i j + simp [Matrix.mul_apply] + have hfun : ∀ (σ : Equiv.Perm ι) (g : ι → ι), (∀ i, g i = σ i) ↔ g = ⇑σ := + fun σ g => ⟨fun h => funext h, fun h i => by rw [h]⟩ + rw [mul_comm, ← hrows, det_eq_sum_perm_prod] + simp only [cast_leviCivitaSymbol, det_eq_sum_perm_prod, Matrix.of_apply, Finset.sum_mul, + Fintype.prod_boole, hfun, mul_ite, mul_one, mul_zero, ite_mul, zero_mul] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun σ _ => ?_ + rw [Finset.sum_ite_eq' Finset.univ, if_pos (Finset.mem_univ _)] diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/MassDimLTEight.lean b/Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/MassDimLTEight.lean index b5f914ca3..ac6a6f047 100644 --- a/Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/MassDimLTEight.lean +++ b/Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/MassDimLTEight.lean @@ -200,8 +200,8 @@ lemma mem_of_invariant_of_mem_sup_of_odd_supp {M : Type*} [AddCommGroup M] [Modu have hinv' : ∀ g : SL(2,ℂ), IsQuadLorentz.quotRep (repLorentz := repLorentz) S hS g (S.mkQ x) = S.mkQ x := fun g => by rw [IsQuadLorentz.quotRep_mkQ, hinv g] - have hx0 := IsQuadLorentz.mem_of_mem_iSup_of_boostWeight_zero hle hmem - (IsQuadLorentz.mem_boostWeightSubmodule_zero_of_invariant hinv' j) + have hx0 := mem_of_mem_iSup_of_boostWeight_zero hle hmem + (mem_boostWeightSubmodule_zero_of_invariant hinv' j) rw [hzero, Submodule.map_bot, Submodule.mem_bot] at hx0 rwa [← Submodule.ker_mkQ S, LinearMap.mem_ker] diff --git a/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/MassDimEight.lean b/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/MassDimEight.lean index fbc975eea..f4a4b1274 100644 --- a/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/MassDimEight.lean +++ b/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/MassDimEight.lean @@ -2277,12 +2277,6 @@ theorem exists_mem_of_gauge_and_lorentz_invariant (S : Submodule ℂ B) (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] @@ -2302,20 +2296,20 @@ lemma outerContraction_eq_zero_of_swap {T : (Fin 4 → Fin 1 ⊕ Fin 3) → B} 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 + ((minkowskiMatrixZ x y * minkowskiMatrixZ 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 : ℤ) : ℂ) • + ((minkowskiMatrixZ y x * minkowskiMatrixZ z w : ℤ) : ℂ) • T ![y, x, z, w] + = -(((minkowskiMatrixZ x y * minkowskiMatrixZ 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] + rw [hswap x y z w, smul_neg, minkowskiMatrixZ.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]] + ((minkowskiMatrixZ x y * minkowskiMatrixZ 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] @@ -2345,25 +2339,25 @@ lemma splitContraction_eq_neg_innerContraction_of_swap 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 + ((minkowskiMatrixZ x w * minkowskiMatrixZ 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 + ((minkowskiMatrixZ x z * minkowskiMatrixZ 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 : ℤ) : ℂ) • + ((minkowskiMatrixZ y w * minkowskiMatrixZ x z : ℤ) : ℂ) • T ![y, x, z, w] + = -(((minkowskiMatrixZ x z * minkowskiMatrixZ 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)] + rw [hswap x y z w, smul_neg, mul_comm (minkowskiMatrixZ 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]] + ((minkowskiMatrixZ x w * minkowskiMatrixZ 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] @@ -2389,7 +2383,7 @@ twice-derived hypercharge span by `repGauge_hyperchargeField`, which fixes the h 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 +a combination of the components of its family with the constant coefficients `minkowskiMatrixZ` 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. diff --git a/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/MassDimLTEight.lean b/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/MassDimLTEight.lean index 9fb04e6eb..af81cd214 100644 --- a/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/MassDimLTEight.lean +++ b/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/MassDimLTEight.lean @@ -220,7 +220,7 @@ lemma metricContraction_eq_zero_of_antisymm {T : (Fin 2 → Fin 1 ⊕ Fin 3) → 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]] + · rw [show minkowskiMatrixZ (d 0) (d 1) = 0 from by simp [minkowskiMatrixZ, hne]] simp /-! diff --git a/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/MassDimEight.lean b/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/MassDimEight.lean index e77787b74..668c030e1 100644 --- a/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/MassDimEight.lean +++ b/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/MassDimEight.lean @@ -176,7 +176,7 @@ lemma dotSpan_one_one_eq : Two covector indices admit one invariant contraction, the metric trace, and the metric is carried to itself by a Lorentz matrix — that is the defining property of the Lorentz group, -recorded as `IsQuadLorentz.sum_etaZ_mul` — so the trace of a bi-Lorentz family is a Lorentz +recorded as `sum_minkowskiMatrixZ_mul` — so the trace of a bi-Lorentz family is a Lorentz invariant. It is a gauge invariant too whenever the components are, and the components here are isospin contractions, which the gauge group fixes. @@ -189,9 +189,9 @@ lemma repLorentz_metricContraction {T : (Fin 2 → Fin 1 ⊕ Fin 3) → B} = IsBiLorentz.metricContraction (T := T) := by rw [IsBiLorentz.metricContraction, map_sum] have step : ∀ d : Fin 2 → Fin 1 ⊕ Fin 3, - repLorentz g (((IsQuadLorentz.etaZ (d 0) (d 1) : ℤ) : ℂ) • T d) + repLorentz g (((minkowskiMatrixZ (d 0) (d 1) : ℤ) : ℂ) • T d) = ∑ a : Fin 2 → Fin 1 ⊕ Fin 3, - (((IsQuadLorentz.etaZ (d 0) (d 1) : ℤ) : ℂ) + (((minkowskiMatrixZ (d 0) (d 1) : ℤ) : ℂ) * ∏ i : Fin 2, (((SL2C.toLorentzGroup g).1 (a i) (d i) : ℝ) : ℂ)) • T a := by intro d rw [map_smul, hT.repLorentz_T g d, Finset.smul_sum] @@ -202,7 +202,7 @@ lemma repLorentz_metricContraction {T : (Fin 2 → Fin 1 ⊕ Fin 3) → B} congr 1 rw [sum_cov_two] simp only [Fin.prod_univ_two, Matrix.cons_val_zero, Matrix.cons_val_one] - exact IsQuadLorentz.sum_etaZ_mul (SL2C.toLorentzGroup g) (a 0) (a 1) + exact IsQuadLorentz.sum_minkowskiMatrixZ_mul (SL2C.toLorentzGroup g) (a 0) (a 1) /-- The metric trace of a family of gauge invariants is a gauge invariant. -/ lemma rep_metricContraction {T : (Fin 2 → Fin 1 ⊕ Fin 3) → B} diff --git a/Physlib/Relativity/LorentzGroup/Boosts/WeightGrading.lean b/Physlib/Relativity/LorentzGroup/Boosts/WeightGrading.lean index 499c08d00..3d950cf91 100644 --- a/Physlib/Relativity/LorentzGroup/Boosts/WeightGrading.lean +++ b/Physlib/Relativity/LorentzGroup/Boosts/WeightGrading.lean @@ -436,6 +436,82 @@ lemma boostWeightSubmodule_iSupIndep (rep : Representation K SL(2,ℂ) M) : (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 + +/-! + +### Weight-zero vectors + +An invariant of the group has weight zero along every axis, and the weight spaces are +independent, so a weight-zero vector written as a sum of vectors of definite weights is equal +to the weight-zero term of that sum. The `Invariants` files use these to read an invariant off +its weight decomposition. + +-/ + +/-- A vector fixed by the whole group has boost weight zero along every axis. -/ +lemma mem_boostWeightSubmodule_zero_of_invariant {rep : Representation K SL(2,ℂ) M} {x : M} + (hinv : ∀ g : SL(2,ℂ), rep g x = x) (i : Fin 3) : + x ∈ boostWeightSubmodule rep i 0 := by + rw [mem_boostWeightSubmodule] + intro t ht + rw [hinv, zpow_zero, one_smul] + +/-- Vectors of distinct boost weights adding to zero are each zero. -/ +lemma eq_zero_of_sum_mem_boostWeightSubmodule + {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) : + ∀ 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 vector written as a sum of definite weights equals the weight-zero term. -/ +lemma eq_component_zero_of_mem_boostWeightSubmodule + {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) + (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 + +/-- If each `S m` lies in the weight-`m` space, a weight-zero vector of their join lies in + `S 0`. -/ +lemma mem_of_mem_iSup_of_boostWeight_zero {rep : Representation K SL(2,ℂ) M} {i : Fin 3} + {S : ℤ → Submodule K M} (hS : ∀ m : ℤ, S m ≤ boostWeightSubmodule rep i m) {x : M} + (hx : x ∈ ⨆ m, S m) (h0 : x ∈ boostWeightSubmodule rep i 0) : x ∈ S 0 := by + 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 _) ?_ + · 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] + variable (rep : Representation K SL(2,ℂ) A) /-- The unit has boost weight zero. -/ diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsBiLeftWeyl.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsBiLeftWeyl.lean index f9caeaa2b..e626b22d1 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsBiLeftWeyl.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsBiLeftWeyl.lean @@ -49,8 +49,7 @@ invariance is the same condition for both and the classification carries over (I namespace Lorentz open TensorProduct Matrix MatrixGroups SL2C BoostWeight -open IsQuadLorentz (eq_component_zero_of_mem_boostWeightSubmodule - mem_boostWeightSubmodule_zero_of_invariant quotRep quotRep_mkQ) +open IsQuadLorentz (quotRep quotRep_mkQ) /-! @@ -407,7 +406,7 @@ 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 hw := mem_boostWeightSubmodule_zero_of_invariant (rep := 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] diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsBiLorentz.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsBiLorentz.lean index 7bf365180..bd167adc4 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsBiLorentz.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsBiLorentz.lean @@ -45,10 +45,9 @@ 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) + coe_lightConeCoeffInvQ lightConeCoeffInvZ coe_lightConeCoeffInvZ sectorIndex sectorWeight + lightConeWeight_eq_sectorWeight slotTransition slotTransitionZ slotTransitionZ_eq_sum quotRep + quotRep_mkQ) /-! @@ -472,7 +471,7 @@ set_option maxRecDepth 20000 in 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 + 48 * (minkowskiMatrixZ (d 0) (d 1) * minkowskiMatrixZ (e 0) (e 1)) := by have h1 : boostAverageZ * (boostAverageZ - 4) = Matrix.of boostAverageSqEntry := by rw [boostAverageZ_eq] ext a b @@ -500,7 +499,7 @@ lemma Q_eq_poly : Q = boostAverageZ ^ 3 - (14 : ℤ) • boostAverageZ ^ 2 /-- 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 + ∑ d : Fin 2 → Fin 1 ⊕ Fin 3, ((minkowskiMatrixZ (d 0) (d 1) : ℤ) : ℂ) • T d /-! @@ -630,20 +629,20 @@ include hT in 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) + x = ((4 : ℂ)⁻¹ * ∑ e, ((minkowskiMatrixZ (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 + have hP : ∀ e, ((Q d e : ℤ) : ℂ) = 48 * ((minkowskiMatrixZ (d 0) (d 1) : ℤ) : ℂ) + * ((minkowskiMatrixZ (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 + = 48 * ((minkowskiMatrixZ (d 0) (d 1) : ℤ) : ℂ) + * ∑ e, ((minkowskiMatrixZ (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 @@ -663,7 +662,7 @@ theorem exists_smul_metricContraction_of_invariant {x : B} (hx : x ∈ hT.span) ∃ 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)⟩ + (mem_boostWeightSubmodule_zero_of_invariant (rep := repLorentz) hinv)⟩ /-! diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsLeftRightWeyl.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsLeftRightWeyl.lean index d85f36da5..d7d3feb14 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsLeftRightWeyl.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsLeftRightWeyl.lean @@ -42,8 +42,7 @@ its classification, still that there is no invariant, hence no Dirac mass term, namespace Lorentz open TensorProduct Matrix MatrixGroups SL2C BoostWeight -open IsQuadLorentz (eq_component_zero_of_mem_boostWeightSubmodule - mem_boostWeightSubmodule_zero_of_invariant quotRep quotRep_mkQ) +open IsQuadLorentz (quotRep quotRep_mkQ) /-! @@ -489,7 +488,7 @@ include hT in 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 hw := mem_boostWeightSubmodule_zero_of_invariant (rep := 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 diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean index 9e75a6e80..28a724661 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean @@ -6,6 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Relativity.LightConeDeriv +public import Physlib.Mathematics.LeviCivita.Basic public import Mathlib.Analysis.InnerProductSpace.Projection.Basic public import Mathlib.LinearAlgebra.Matrix.Determinant.Basic -- Not used here; `Peeling` reaches it through this file. @@ -127,47 +128,42 @@ lemma repLorentz_sum_smul_of_isInvariantCoeff {c : (Fin 4 → Fin 1 ⊕ Fin 3) ## B.1. The metric, the Levi-Civita symbol and the contractions -`etaZ` is `η = diag(1, -1, -1, -1)`, checked against `minkowskiMatrix` by `etaZ_cast`, and -`epsilonSignZ d` is the determinant of the matrix whose rows are the unit vectors of -`d 0, d 1, d 2, d 3`: `1` on `(t, x, y, z)`, minus itself under a swap of two slots, `0` on a -repeated direction. Both are integer valued, as is everything F and G compute with. The metric -pairings use the slots `(0,1)(2,3)`, `(0,2)(1,3)` and `(0,3)(1,2)` for `outerContraction`, -`innerContraction` and `splitContraction`; `contractionCoeff` holds the four coefficient -tensors and `contraction T` the four contractions in that order. +Neither the metric nor the Levi-Civita symbol is defined here. The metric is +`minkowskiMatrixZ`, the integer form of `minkowskiMatrix`, and the symbol is +`leviCivitaSymbol`, read on an index vector through `finSumFinEquiv`. Both are integer +valued because sections F and G evaluate them in the kernel, which cannot compute with real +numbers. The metric pairings use the slots `(0,1)(2,3)`, +`(0,2)(1,3)` and `(0,3)(1,2)` for `outerContraction`, `innerContraction` and +`splitContraction`; `contractionCoeff` holds the four coefficient tensors and `contraction T` +the four contractions in that order. -/ -/-- The Minkowski sign of a direction: `+1` on time, `-1` on each spatial axis. -/ -def minkowskiSignZ : Fin 1 ⊕ Fin 3 → ℤ := Sum.elim (fun _ => 1) (fun _ => -1) - -/-- The Minkowski metric `η = diag(1, -1, -1, -1)`, integer valued so the later checks compute. -/ -def etaZ (μ ν : Fin 1 ⊕ Fin 3) : ℤ := if μ = ν then minkowskiSignZ μ else 0 - -/-- The Levi-Civita symbol; the row index is a slot, carried across by `finSumFinEquiv`. -/ -def epsilonSignZ (d : Fin 4 → Fin 1 ⊕ Fin 3) : ℤ := - (Matrix.of fun μ ν : Fin 1 ⊕ Fin 3 => if d (finSumFinEquiv μ) = ν then (1 : ℤ) else 0).det - /-- The four coefficient tensors: the three metric pairings, then the Levi-Civita symbol. -/ def contractionCoeff : Fin 4 → (Fin 4 → Fin 1 ⊕ Fin 3) → ℤ := - ![fun d => etaZ (d 0) (d 1) * etaZ (d 2) (d 3), - fun d => etaZ (d 0) (d 2) * etaZ (d 1) (d 3), - fun d => etaZ (d 0) (d 3) * etaZ (d 1) (d 2), - epsilonSignZ] + ![fun d => minkowskiMatrixZ (d 0) (d 1) * minkowskiMatrixZ (d 2) (d 3), + fun d => minkowskiMatrixZ (d 0) (d 2) * minkowskiMatrixZ (d 1) (d 3), + fun d => minkowskiMatrixZ (d 0) (d 3) * minkowskiMatrixZ (d 1) (d 2), + fun d => leviCivitaSymbol fun μ => d (finSumFinEquiv μ)] /-- The contraction `η_{μν} η_{ρσ} T^{μνρσ}`, pairing slots `(0,1)` and `(2,3)`. -/ noncomputable def outerContraction (T : (Fin 4 → Fin 1 ⊕ Fin 3) → B) : B := - ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, ((etaZ (d 0) (d 1) * etaZ (d 2) (d 3) : ℤ) : ℂ) • T d + ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, + ((minkowskiMatrixZ (d 0) (d 1) * minkowskiMatrixZ (d 2) (d 3) : ℤ) : ℂ) • T d /-- The contraction `η_{μρ} η_{νσ} T^{μνρσ}`, pairing slots `(0,2)` and `(1,3)`. -/ noncomputable def innerContraction (T : (Fin 4 → Fin 1 ⊕ Fin 3) → B) : B := - ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, ((etaZ (d 0) (d 2) * etaZ (d 1) (d 3) : ℤ) : ℂ) • T d + ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, + ((minkowskiMatrixZ (d 0) (d 2) * minkowskiMatrixZ (d 1) (d 3) : ℤ) : ℂ) • T d /-- The contraction `η_{μσ} η_{νρ} T^{μνρσ}`, pairing slots `(0,3)` and `(1,2)`. -/ noncomputable def splitContraction (T : (Fin 4 → Fin 1 ⊕ Fin 3) → B) : B := - ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, ((etaZ (d 0) (d 3) * etaZ (d 1) (d 2) : ℤ) : ℂ) • T d + ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, + ((minkowskiMatrixZ (d 0) (d 3) * minkowskiMatrixZ (d 1) (d 2) : ℤ) : ℂ) • T d /-- The contraction `ε_{μνρσ} T^{μνρσ}` with the Levi-Civita symbol. -/ noncomputable def epsilonContraction (T : (Fin 4 → Fin 1 ⊕ Fin 3) → B) : B := - ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, ((epsilonSignZ d : ℤ) : ℂ) • T d + ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, + ((leviCivitaSymbol fun μ => d (finSumFinEquiv μ) : ℤ) : ℂ) • T d /-- The four contractions in order, from the outer one to the Levi-Civita one. -/ noncomputable def contraction (T : (Fin 4 → Fin 1 ⊕ Fin 3) → B) : Fin 4 → B := @@ -211,13 +207,13 @@ lemma smul_contraction_mem_span (a₁ a₂ a₃ a₄ : ℂ) : ## B.2. The four coefficient tensors are invariant -`Λ η Λᵀ = η` defines the Lorentz group; entry by entry it is `sum_etaZ_mul`, and a pair of -metrics is two copies of it, one per pair of slots (`act_outerPair`). The inner and split +`Λ η Λᵀ = η` defines the Lorentz group; entry by entry it is `sum_minkowskiMatrixZ_mul`, and +a pair of metrics is two copies of it, one per pair of slots (`act_outerPair`). The inner and +split pairings are the outer one with the slots permuted (`act_outerPair_comp`). The symbol against -four rows of `M` gives `det M` times the symbol of those rows (`sum_epsilonSignZ_mul_prod`), +four rows of `M` gives `det M` times the symbol of those rows (`sum_leviCivitaSymbol_mul_prod`), and `det Λ = 1` here: the only use of the determinant, and the reason there are four invariants -and not three, a reflection having `det = -1`. `sum_pi_four`, `coe_epsilonSignZ` and -`det_eq_sum_perm_prod` are bookkeeping. +and not three, a reflection having `det = -1`. `sum_pi_four` is bookkeeping. -/ /-- Bookkeeping: a sum over index vectors is a fourfold sum over directions. -/ @@ -238,57 +234,54 @@ lemma sum_pi_four {M : Type*} [AddCommMonoid M] (F : (Fin 4 → Fin 1 ⊕ Fin 3) fin_cases i <;> simp] simp only [Fintype.sum_prod_type] -/-- The integer metric agrees with `minkowskiMatrix`, which is therefore `diag(1, -1, -1, -1)`. -/ -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 defining relation `Λ η Λᵀ = η`, 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 : ℤ) : ℂ) +lemma sum_minkowskiMatrixZ_mul (Λ : LorentzGroup 3) (a b : Fin 1 ⊕ Fin 3) : + ∑ x : Fin 1 ⊕ Fin 3, ∑ y : Fin 1 ⊕ Fin 3, ((minkowskiMatrixZ x y : ℤ) : ℂ) * (((Λ.1 a x : ℝ) : ℂ) * ((Λ.1 b y : ℝ) : ℂ)) - = ((etaZ a b : ℤ) : ℂ) := by + = ((minkowskiMatrixZ 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 + ((minkowskiMatrixZ x y : ℤ) : ℝ) * (Λ.1 a x * Λ.1 b y) + = ((minkowskiMatrixZ 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] + rw [minkowskiMatrixZ.cast_apply, ← 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 + exact Finset.sum_congr rfl fun x _ => by rw [minkowskiMatrixZ.cast_apply]; ring have hC := congrArg (fun r : ℝ => (r : ℂ)) hR push_cast at hC ⊢ exact hC -/-- The pairing of slots `(0,1)` and `(2,3)` is fixed: two copies of `sum_etaZ_mul`. -/ +/-- The pairing of slots `(0,1)` and `(2,3)` is fixed: two copies of `sum_minkowskiMatrixZ_mul`. -/ lemma act_outerPair (Λ : LorentzGroup 3) (a : Fin 4 → Fin 1 ⊕ Fin 3) : - act Λ.1 (fun d => ((etaZ (d 0) (d 1) * etaZ (d 2) (d 3) : ℤ) : ℂ)) a - = ((etaZ (a 0) (a 1) * etaZ (a 2) (a 3) : ℤ) : ℂ) := by + act Λ.1 (fun d => ((minkowskiMatrixZ (d 0) (d 1) * minkowskiMatrixZ (d 2) (d 3) : ℤ) : ℂ)) a + = ((minkowskiMatrixZ (a 0) (a 1) * minkowskiMatrixZ (a 2) (a 3) : ℤ) : ℂ) := by have h : ∀ 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) : ℤ) : ℂ) + ((minkowskiMatrixZ (![x, y, z, w] 0) (![x, y, z, w] 1) + * minkowskiMatrixZ (![x, y, z, w] 2) (![x, y, z, w] 3) : ℤ) : ℂ) * ∏ s, ((Λ.1 (a s) (![x, y, z, w] s) : ℝ) : ℂ) - = (((etaZ x y : ℤ) : ℂ) * (((Λ.1 (a 0) x : ℝ) : ℂ) * ((Λ.1 (a 1) y : ℝ) : ℂ))) - * (((etaZ z w : ℤ) : ℂ) * (((Λ.1 (a 2) z : ℝ) : ℂ) * ((Λ.1 (a 3) w : ℝ) : ℂ))) := by + = (((minkowskiMatrixZ x y : ℤ) : ℂ) + * (((Λ.1 (a 0) x : ℝ) : ℂ) * ((Λ.1 (a 1) y : ℝ) : ℂ))) + * (((minkowskiMatrixZ 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 rw [act, sum_pi_four] - simp only [h, ← Finset.mul_sum, ← Finset.sum_mul, sum_etaZ_mul] + simp only [h, ← Finset.mul_sum, ← Finset.sum_mul, sum_minkowskiMatrixZ_mul] push_cast ring /-- The same for the slots permuted by `σ`, by renaming the summation variable. -/ lemma act_outerPair_comp (σ : Equiv.Perm (Fin 4)) (Λ : LorentzGroup 3) (a : Fin 4 → Fin 1 ⊕ Fin 3) : - act Λ.1 (fun d => ((etaZ (d (σ 0)) (d (σ 1)) * etaZ (d (σ 2)) (d (σ 3)) : ℤ) : ℂ)) a - = ((etaZ (a (σ 0)) (a (σ 1)) * etaZ (a (σ 2)) (a (σ 3)) : ℤ) : ℂ) := by + act Λ.1 (fun d => ((minkowskiMatrixZ (d (σ 0)) (d (σ 1)) + * minkowskiMatrixZ (d (σ 2)) (d (σ 3)) : ℤ) : ℂ)) a + = ((minkowskiMatrixZ (a (σ 0)) (a (σ 1)) + * minkowskiMatrixZ (a (σ 2)) (a (σ 3)) : ℤ) : ℂ) := by have h := act_outerPair Λ (a ∘ σ) rw [act, ← Equiv.sum_comp (Equiv.arrowCongr σ.symm (Equiv.refl (Fin 1 ⊕ Fin 3)))] at h simp only [Equiv.arrowCongr_apply, Equiv.symm_symm, Equiv.coe_refl, Function.comp_def, @@ -297,61 +290,22 @@ lemma act_outerPair_comp (σ : Equiv.Perm (Fin 4)) (Λ : LorentzGroup 3) refine Finset.sum_congr rfl fun d _ => ?_ rw [← Equiv.prod_comp σ fun i => ((Λ.1 (a i) (d i) : ℝ) : ℂ)] -/-- Bookkeeping: the symbol reads the same in every commutative ring. -/ -lemma coe_epsilonSignZ {R : Type*} [CommRing R] (d : Fin 4 → Fin 1 ⊕ Fin 3) : - ((epsilonSignZ d : ℤ) : R) - = (Matrix.of fun μ ν : Fin 1 ⊕ Fin 3 => - if d (finSumFinEquiv μ) = ν then (1 : R) else 0).det := by - have h := RingHom.map_det (Int.castRingHom R) - (Matrix.of fun μ ν : Fin 1 ⊕ Fin 3 => if d (finSumFinEquiv μ) = ν then (1 : ℤ) else 0) - simp only [Int.coe_castRingHom, RingHom.mapMatrix_apply] at h - rw [epsilonSignZ, h] - congr 1 - ext μ ν - by_cases hdν : d (finSumFinEquiv μ) = ν <;> simp [Matrix.map_apply, hdν] - -/-- Bookkeeping: 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 - -/-- Against four rows of `M` the symbol gives `det M` times the symbol of those rows. -/ -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 hrows : (Matrix.of fun μ ν => M (a (finSumFinEquiv μ)) ν).det - = ((epsilonSignZ a : ℤ) : R) * M.det := by - rw [coe_epsilonSignZ, ← Matrix.det_mul] - congr 1 - ext μ ν - simp [Matrix.mul_apply] - have hfun : ∀ (σ : Equiv.Perm (Fin 1 ⊕ Fin 3)) (d : Fin 4 → Fin 1 ⊕ Fin 3), - (∀ μ, d (finSumFinEquiv μ) = σ μ) ↔ d = fun s => σ (finSumFinEquiv.symm s) := by - refine fun σ d => ⟨fun h => funext fun s => ?_, fun h μ => by subst h; simp⟩ - rw [← h, Equiv.apply_symm_apply] - rw [mul_comm, ← hrows, det_eq_sum_perm_prod] - simp only [coe_epsilonSignZ, det_eq_sum_perm_prod, Matrix.of_apply, Finset.sum_mul, - Fintype.prod_boole, hfun, mul_ite, mul_one, mul_zero, ite_mul, zero_mul] - rw [Finset.sum_comm] - refine Finset.sum_congr rfl fun σ _ => ?_ - rw [Finset.sum_ite_eq' Finset.univ, if_pos (Finset.mem_univ _)] - congr 1 - -/-- The symbol is fixed by a Lorentz matrix of determinant `1`; in general it picks up `det Λ`. -/ -lemma act_epsilonSignZ (Λ : LorentzGroup 3) (hΛ : Λ.1.det = 1) (a : Fin 4 → Fin 1 ⊕ Fin 3) : - act Λ.1 (fun d => ((epsilonSignZ d : ℤ) : ℂ)) a = ((epsilonSignZ a : ℤ) : ℂ) := by +/-- The symbol is fixed by a Lorentz matrix of determinant `1`; in general it picks up `det Λ`, + by `sum_leviCivitaSymbol_mul_prod`. -/ +lemma act_leviCivitaSymbol (Λ : LorentzGroup 3) (hΛ : Λ.1.det = 1) (a : Fin 4 → Fin 1 ⊕ Fin 3) : + act Λ.1 (fun d => ((leviCivitaSymbol fun μ => d (finSumFinEquiv μ) : ℤ) : ℂ)) a + = ((leviCivitaSymbol fun μ => a (finSumFinEquiv μ) : ℤ) : ℂ) := 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 + have h := sum_leviCivitaSymbol_mul_prod (Complex.ofRealHom.mapMatrix Λ.1) + (fun μ => a (finSumFinEquiv μ)) rw [hdet, one_mul] at h - rw [← h] - rfl + rw [act, ← h, ← Equiv.sum_comp + (Equiv.arrowCongr finSumFinEquiv.symm (Equiv.refl (Fin 1 ⊕ Fin 3)))] + refine Finset.sum_congr rfl fun d _ => ?_ + simp only [Equiv.arrowCongr_apply, Equiv.symm_symm, Equiv.coe_refl, Function.comp_def, id] + congr 1 /-- The four coefficient tensors are invariant. -/ lemma isInvariantCoeff_contractionCoeff (i : Fin 4) : @@ -364,7 +318,7 @@ lemma isInvariantCoeff_contractionCoeff (i : Fin 4) : act_outerPair_comp (Equiv.swap 1 2) (SL2C.toLorentzGroup g) a · simpa [contractionCoeff, Equiv.swap_apply_def, Equiv.trans_apply] using act_outerPair_comp ((Equiv.swap 1 3).trans (Equiv.swap 1 2)) (SL2C.toLorentzGroup g) a - · exact act_epsilonSignZ _ (SL2C.toLorentzGroup_det_one g) a + · exact act_leviCivitaSymbol _ (SL2C.toLorentzGroup_det_one g) a /-! @@ -1206,69 +1160,6 @@ invariant has weight `0` along every axis, and weights are independent. The rest `ℚ`, sorting the light-cone directions into sectors: raising `2`, lowering `-2`, transverse `0`. -/ -/-- A Lorentz invariant has boost weight zero along every axis, being fixed by every boost. -/ -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] - -/-- Vectors of distinct boost weights adding to zero are each zero. -/ -lemma eq_zero_of_sum_mem_boostWeightSubmodule - {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) : - ∀ 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 vector written as a sum of definite weights equals the weight-zero term. -/ -lemma eq_component_zero_of_mem_boostWeightSubmodule - {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) - (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 - -/-- If each `S m` lies in the weight-`m` space, a weight-zero vector of their join lies in `S 0`. -/ -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⟩ := (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 _) ?_ - · 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] - /-- The inverse light-cone coefficients of section E over `ℚ`, with the halves kept as halves. -/ 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) diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsSingleLorentz.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsSingleLorentz.lean index cb13df91b..45d414789 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsSingleLorentz.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsSingleLorentz.lean @@ -35,9 +35,7 @@ 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) + coe_lightConeCoeffInvQ lightConeCoeffInvZ coe_lightConeCoeffInvZ quotRep quotRep_mkQ) /-! @@ -354,7 +352,7 @@ include hT in 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 hw := mem_boostWeightSubmodule_zero_of_invariant (rep := 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 Transverse 0 (d 0) then c d else 0) h0 (hw 1) diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsTriLorentz.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsTriLorentz.lean index cf32cdcab..95ad93ba6 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsTriLorentz.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsTriLorentz.lean @@ -38,8 +38,7 @@ therefore both negated and fixed by it, hence zero (E). Section F divides out `S namespace Lorentz open TensorProduct Matrix MatrixGroups SL2C BoostWeight -open IsQuadLorentz (eq_component_zero_of_mem_boostWeightSubmodule - mem_boostWeightSubmodule_zero_of_invariant quotRep quotRep_mkQ) +open IsQuadLorentz (quotRep quotRep_mkQ) /-! @@ -362,7 +361,7 @@ include hT in 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 hw := mem_boostWeightSubmodule_zero_of_invariant (rep := 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 diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsVectorLeftRightWeyl.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsVectorLeftRightWeyl.lean index 78beaf7be..2409bd132 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsVectorLeftRightWeyl.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsVectorLeftRightWeyl.lean @@ -49,8 +49,7 @@ there is no Dirac mass term. namespace Lorentz open TensorProduct Matrix MatrixGroups SL2C BoostWeight -open IsQuadLorentz (etaZ etaZ_cast minkowskiSignZ sum_etaZ_mul - mem_boostWeightSubmodule_zero_of_invariant quotRep quotRep_mkQ) +open IsQuadLorentz (sum_minkowskiMatrixZ_mul quotRep quotRep_mkQ) /-! @@ -72,11 +71,11 @@ lemma pauliBasis'_coe (μ : Fin 1 ⊕ Fin 3) : (PauliMatrix.pauliBasis' μ).1 = pauliLower μ := by rw [PauliMatrix.pauliBasis', Module.Basis.coe_mk, pauliLower] -/-- Lowering the vector index multiplies by the Minkowski sign. -/ +/-- Lowering the vector index multiplies by the diagonal entry of the metric. -/ lemma pauliLower_eq_smul (μ : Fin 1 ⊕ Fin 3) : - pauliLower μ = ((minkowskiSignZ μ : ℤ) : ℂ) • PauliMatrix.pauliMatrix μ := by + pauliLower μ = ((minkowskiMatrixZ μ μ : ℤ) : ℂ) • PauliMatrix.pauliMatrix μ := by rcases μ with μ | μ <;> fin_cases μ <;> - simp [pauliLower, PauliMatrix.pauliSelfAdjoint', minkowskiSignZ] + simp [pauliLower, PauliMatrix.pauliSelfAdjoint', minkowskiMatrixZ] /-- The conjugate Pauli matrices, the transposes of the covariant ones. These are the matrices `σ̄_μ` carrying two dual spinor indices. -/ @@ -312,10 +311,10 @@ lemma metricContraction_vectorPair : refine Finset.sum_congr rfl fun a _ => ?_ congr 1 rw [pauliLower_eq_smul, Matrix.smul_apply, smul_eq_mul, ← mul_assoc] - rcases ν with ν | ν <;> fin_cases ν <;> norm_num [etaZ, minkowskiSignZ] - · rw [show etaZ (![ν, ρ] 0) (![ν, ρ] 1) = 0 from by + rcases ν with ν | ν <;> fin_cases ν <;> norm_num [minkowskiMatrixZ] + · rw [show minkowskiMatrixZ (![ν, ρ] 0) (![ν, ρ] 1) = 0 from by simp only [Matrix.cons_val_zero, Matrix.cons_val_one] - simp [etaZ, Ne.symm hρ]] + simp [minkowskiMatrixZ, Ne.symm hρ]] simp /-! @@ -334,9 +333,9 @@ lemma repLorentz_pauliContraction (g : SL(2,ℂ)) : repLorentz g (pauliContraction (T := T)) = pauliContraction (T := T) := by have hV := hT.isBiLorentz_vectorPair have hstep : ∀ d : Fin 2 → Fin 1 ⊕ Fin 3, - repLorentz g (((etaZ (d 0) (d 1) : ℤ) : ℂ) • vectorPair (T := T) d) + repLorentz g (((minkowskiMatrixZ (d 0) (d 1) : ℤ) : ℂ) • vectorPair (T := T) d) = ∑ a : Fin 2 → Fin 1 ⊕ Fin 3, - (((etaZ (d 0) (d 1) : ℤ) : ℂ) + (((minkowskiMatrixZ (d 0) (d 1) : ℤ) : ℂ) * ∏ i : Fin 2, (((SL2C.toLorentzGroup g).1 (a i) (d i) : ℝ) : ℂ)) • vectorPair (T := T) a := by intro d @@ -344,20 +343,20 @@ lemma repLorentz_pauliContraction (g : SL(2,ℂ)) : exact Finset.sum_congr rfl fun a _ => smul_smul _ _ _ rw [← metricContraction_vectorPair (T := T), IsBiLorentz.metricContraction, map_sum] calc ∑ d : Fin 2 → Fin 1 ⊕ Fin 3, - repLorentz g (((etaZ (d 0) (d 1) : ℤ) : ℂ) • vectorPair (T := T) d) + repLorentz g (((minkowskiMatrixZ (d 0) (d 1) : ℤ) : ℂ) • vectorPair (T := T) d) = ∑ a : Fin 2 → Fin 1 ⊕ Fin 3, (∑ d : Fin 2 → Fin 1 ⊕ Fin 3, - ((etaZ (d 0) (d 1) : ℤ) : ℂ) + ((minkowskiMatrixZ (d 0) (d 1) : ℤ) : ℂ) * ∏ i : Fin 2, (((SL2C.toLorentzGroup g).1 (a i) (d i) : ℝ) : ℂ)) • vectorPair (T := 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, - ((etaZ (a 0) (a 1) : ℤ) : ℂ) • vectorPair (T := T) a := by + ((minkowskiMatrixZ (a 0) (a 1) : ℤ) : ℂ) • vectorPair (T := T) a := by refine Finset.sum_congr rfl fun a _ => ?_ congr 1 rw [sum_pi_fin_two] - rw [← sum_etaZ_mul (SL2C.toLorentzGroup g) (a 0) (a 1)] + rw [← sum_minkowskiMatrixZ_mul (SL2C.toLorentzGroup g) (a 0) (a 1)] refine Finset.sum_congr rfl fun x _ => Finset.sum_congr rfl fun y _ => ?_ simp only [Fin.prod_univ_two, Matrix.cons_val_zero, Matrix.cons_val_one] diff --git a/Physlib/Relativity/MinkowskiMatrix.lean b/Physlib/Relativity/MinkowskiMatrix.lean index ff851798f..527dcbccc 100644 --- a/Physlib/Relativity/MinkowskiMatrix.lean +++ b/Physlib/Relativity/MinkowskiMatrix.lean @@ -28,6 +28,9 @@ This will be used to help define the Lorentz group in later files. - `minkowskiMatrix` : The Minkowski matrix in `d+1` dimensions. - `minkowskiMatrix.dual` : The dual of a matrix with respect to the Minkowski metric, defined to be `η * Λᵀ * η`. +- `minkowskiMatrixZ` : The Minkowski matrix over the integers, whose cast to `ℝ` is + `minkowskiMatrix`. Statements which a decision procedure has to evaluate are stated with + it, the kernel being able to compute in `ℤ` but not in `ℝ`. ## iii. Table of contents @@ -48,6 +51,7 @@ This will be used to help define the Lorentz group in later files. - B.5. The dual preserves the Minkowski matrix - B.6. The dual preserves the determinants - B.7. Components of the dual +- C. The Minkowski matrix over the integers ## iv. References @@ -360,3 +364,58 @@ lemma dual_apply_minkowskiMatrix (μ ν : Fin 1 ⊕ Fin d) : simp [dual_apply, mul_assoc] end minkowskiMatrix + +/-! + +## C. The Minkowski matrix over the integers + +The entries of the Minkowski matrix are integers, and some arguments have to compute with +them: the kernel evaluates `ℤ` but not `ℝ`. `minkowskiMatrixZ` is the same diagonal matrix +over `ℤ`, and `minkowskiMatrixZ.cast_apply` identifies it with `minkowskiMatrix`. + +-/ + +/-- The Minkowski matrix over the integers, `diag(1, -1, -1, ...)` in `ℤ`. Its cast to `ℝ` is + `minkowskiMatrix`, by `minkowskiMatrixZ.cast_apply`. -/ +def minkowskiMatrixZ {d : ℕ} : Matrix (Fin 1 ⊕ Fin d) (Fin 1 ⊕ Fin d) ℤ := + diagonal (Sum.elim 1 (-1)) + +namespace minkowskiMatrixZ + +variable {d : ℕ} + +/-- The integer Minkowski matrix as a diagonal matrix. -/ +lemma as_diagonal : @minkowskiMatrixZ d = diagonal (Sum.elim 1 (-1)) := rfl + +/-- The time-time component of the integer Minkowski matrix is `1`. -/ +@[simp] +lemma inl_0_inl_0 : @minkowskiMatrixZ d (Sum.inl 0) (Sum.inl 0) = 1 := by + simp [minkowskiMatrixZ] + +/-- The space diagonal components of the integer Minkowski matrix are `-1`. -/ +@[simp] +lemma inr_i_inr_i (i : Fin d) : @minkowskiMatrixZ d (Sum.inr i) (Sum.inr i) = -1 := by + simp [minkowskiMatrixZ] + +/-- The off-diagonal components of the integer Minkowski matrix vanish. -/ +@[simp] +lemma off_diag_zero {μ ν : Fin 1 ⊕ Fin d} (h : μ ≠ ν) : @minkowskiMatrixZ d μ ν = 0 := + diagonal_apply_ne _ h + +/-- The integer Minkowski matrix is symmetric, being diagonal. -/ +lemma comm (μ ν : Fin 1 ⊕ Fin d) : @minkowskiMatrixZ d μ ν = minkowskiMatrixZ ν μ := by + rcases eq_or_ne μ ν with rfl | h + · rfl + · rw [off_diag_zero h, off_diag_zero h.symm] + +/-- The integer Minkowski matrix casts to the Minkowski matrix, entry by entry. -/ +lemma cast_apply (μ ν : Fin 1 ⊕ Fin d) : + ((minkowskiMatrixZ μ ν : ℤ) : ℝ) = minkowskiMatrix μ ν := by + rcases eq_or_ne μ ν with rfl | h + · match μ with + | Sum.inl i => rw [Subsingleton.elim i 0]; simp + | Sum.inr i => simp + · rw [off_diag_zero h, minkowskiMatrix.off_diag_zero h] + simp + +end minkowskiMatrixZ From 9857558b12de87f4a917cf1c2bdadff5855ec6ca Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 7 Sep 2026 08:43:56 +0100 Subject: [PATCH 274/367] feat: Simplify all invariant files --- Physlib.lean | 1 + .../LorentzGroup/Invariants/Basic.lean | 300 ++++++++++++ .../LorentzGroup/Invariants/IsBiLeftWeyl.lean | 359 ++++++-------- .../LorentzGroup/Invariants/IsBiLorentz.lean | 461 +++++------------- .../Invariants/IsLeftRightWeyl.lean | 377 ++++++-------- .../Invariants/IsQuadLorentz.lean | 184 ++----- .../Invariants/IsSingleLorentz.lean | 359 +++----------- .../LorentzGroup/Invariants/IsTriLorentz.lean | 271 +++------- .../Invariants/IsVectorLeftRightWeyl.lean | 2 +- 9 files changed, 895 insertions(+), 1419 deletions(-) create mode 100644 Physlib/Relativity/LorentzGroup/Invariants/Basic.lean diff --git a/Physlib.lean b/Physlib.lean index cf76bff27..58376f4b7 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -582,6 +582,7 @@ 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.Basic public import Physlib.Relativity.LorentzGroup.Invariants.IsBiLeftWeyl public import Physlib.Relativity.LorentzGroup.Invariants.IsBiLorentz public import Physlib.Relativity.LorentzGroup.Invariants.IsLeftRightWeyl diff --git a/Physlib/Relativity/LorentzGroup/Invariants/Basic.lean b/Physlib/Relativity/LorentzGroup/Invariants/Basic.lean new file mode 100644 index 000000000..22c25c72d --- /dev/null +++ b/Physlib/Relativity/LorentzGroup/Invariants/Basic.lean @@ -0,0 +1,300 @@ +/- +Copyright (c) 2026 Joseph Tooby-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.LightConeDeriv +public import Mathlib.Analysis.InnerProductSpace.Projection.Basic +/-! +# Invariants of the span of a family of components + +Every file in this folder asks the same question of a different index pattern. A family `T` of +vectors of a complex vector space `B`, indexed by a finite set `ι` and moved by a +representation of `SL(2,ℂ)`, spans a subspace of `B`; which of its vectors does the group +leave alone? This file holds the three steps of the answer that do not depend on the pattern. + +The first turns the question into a finite one. A vector of the span is a contraction +`∑ i, c i • T i` for a coefficient function `c : ι → ℂ`, and the group moves such a vector by +moving `c`. The components may satisfy linear relations, so `c` is not determined by the +vector and need not be invariant, but the coefficients contracting to `0` form a subspace `K` +which the group preserves, and so does its orthogonal complement whenever the coefficient +action is closed under taking adjoints. Replacing `c` by its part in `Kᗮ` keeps the vector and +makes `c` invariant: `exists_invariantCoeff`. What is left is a question about `ι`-indexed +tuples of complex numbers. + +The second reads that condition off the transformation law. Every family here is moved by a +matrix, `repLorentz g (T l) = ∑_a M_g(a, l) • T a`, so the coefficients move by `actMat M_g`, +whose adjoint is the action of the conjugate transpose of `M_g`. The hypothesis to check is +therefore that these matrices are closed under conjugate transposition, and in every case it +is `g†` that supplies the adjoint of `g`: `exists_invariantCoeff_matrix`. + +The third is for the patterns whose indices are spacetime directions, `ι = Fin n → Fin 1 ⊕ +Fin 3`. There `M_g` is a product of Lorentz-matrix entries, one per slot, whose conjugate +transpose is the same product for the transposed matrix, which is again a Lorentz matrix coming +from `SL(2,ℂ)`, so `exists_isInvariantCoeff_of_mem_span` applies. Writing each slot of a +coefficient tensor in the light-cone basis of an axis splits it into pieces that a boost +scales by powers of its parameter, and an invariant keeps only the piece of weight zero: +`IsInvariantCoeff.lightConeComponent_eq_zero`. The Weyl patterns have their own weight bases, +built in the files that need them on top of the second step. +-/ + +@[expose] public section + +namespace Lorentz + +open Matrix MatrixGroups SL2C + +namespace Invariants + +variable {B : Type*} [AddCommGroup B] [Module ℂ B] + +/-! + +## A. An invariant of the span is the contraction of an invariant coefficient + +-/ + +section Complement + +variable {ι : Type} [Fintype ι] {G : Type*} + +/-- Contraction with the components, as a linear map on the coefficients carrying the standard + inner product; `WithLp.toLp 2` and `.ofLp` only translate to the plain function type. -/ +noncomputable def contractₗ (T : ι → B) : EuclideanSpace ℂ ι →ₗ[ℂ] B where + toFun c := ∑ i, c.ofLp i • T i + map_add' c c' := by + simp only [WithLp.ofLp_add, Pi.add_apply, add_smul, Finset.sum_add_distrib] + map_smul' z c := by + simp only [WithLp.ofLp_smul, Pi.smul_apply, smul_eq_mul, RingHom.id_apply, Finset.smul_sum, + smul_smul] + +open scoped InnerProductSpace in +/-- An invariant of the span is the contraction of an invariant coefficient function, provided + the coefficient action `A` has all its adjoints inside the family: for every `g` some `g'` + acts as the adjoint of `g`. Nothing is claimed about uniqueness, the components being + possibly dependent. -/ +theorem exists_invariantCoeff (T : ι → B) (φ : G → B →ₗ[ℂ] B) + (A : G → (ι → ℂ) →ₗ[ℂ] (ι → ℂ)) + (hφ : ∀ (g : G) (c : ι → ℂ), φ g (∑ i, c i • T i) = ∑ i, A g c i • T i) + (hA : ∀ g : G, ∃ g' : G, ∀ u v : EuclideanSpace ℂ ι, + ⟪u, WithLp.toLp 2 (A g v.ofLp)⟫_ℂ = ⟪WithLp.toLp 2 (A g' u.ofLp), v⟫_ℂ) + {x : B} (hx : x ∈ ⨆ i, ℂ ∙ T i) (hinv : ∀ g, φ g x = x) : + ∃ c : ι → ℂ, x = ∑ i, c i • T i ∧ ∀ g, A g c = c := by + classical + obtain ⟨c, rfl⟩ : ∃ c : ι → ℂ, x = ∑ i, c i • T i := by + rw [← Submodule.span_range_eq_iSup, ← Fintype.range_linearCombination, + LinearMap.mem_range] at hx + simpa only [Fintype.linearCombination_apply, eq_comm] using hx + have hcontr : ∀ (g : G) (u : EuclideanSpace ℂ ι), + contractₗ T (WithLp.toLp 2 (A g u.ofLp)) = φ g (contractₗ T u) := + fun g u => (hφ g u.ofLp).symm + set K := LinearMap.ker (contractₗ T) with hK + have hKstab : ∀ (g : G) (u : EuclideanSpace ℂ ι), u ∈ K → + WithLp.toLp 2 (A g u.ofLp) ∈ K := by + intro g u hu + rw [hK, LinearMap.mem_ker] at hu ⊢ + rw [hcontr, hu, map_zero] + obtain ⟨k, hk, k', hk', hkk'⟩ := K.exists_add_mem_mem_orthogonal (WithLp.toLp 2 c) + have hx' : ∑ i, c i • T i = contractₗ T k' := by + have h := congrArg (contractₗ T) hkk' + rwa [map_add, LinearMap.mem_ker.1 hk, zero_add] at h + refine ⟨k'.ofLp, hx', fun g => ?_⟩ + have h1 : WithLp.toLp 2 (A g k'.ofLp) - k' ∈ K := by + rw [hK, LinearMap.mem_ker, map_sub, hcontr, ← hx', hinv, hx', sub_self] + have h2 : WithLp.toLp 2 (A g k'.ofLp) ∈ Kᗮ := by + obtain ⟨g', hg'⟩ := hA g + refine (Submodule.mem_orthogonal _ _).2 fun u hu => ?_ + rw [hg' u k'] + exact Submodule.inner_right_of_mem_orthogonal (hKstab g' u hu) hk' + have h3 : WithLp.toLp 2 (A g k'.ofLp) - k' ∈ K ⊓ Kᗮ := + ⟨h1, Submodule.sub_mem _ h2 hk'⟩ + rw [Submodule.inf_orthogonal_eq_bot, Submodule.mem_bot, sub_eq_zero] at h3 + exact congrArg WithLp.ofLp h3 + +end Complement + +/-! + +## B. Coefficient functions moved by a matrix + +Every family in this folder is moved by a matrix: `repLorentz g (T l) = ∑_a M_g(a, l) • T a`, +with `M_g` built from the Lorentz matrix of `g`, from `g` itself on Weyl indices, or from both. +The coefficients then move by `actMat M_g`, whose adjoint is the action of the conjugate +transpose of `M_g`. So the hypothesis of A reads: for every `g` some `g'` has `M_{g'}` the +conjugate transpose of `M_g`. In every case below `g'` is `g†`. + +-/ + +section Mat + +variable {ι : Type} [Fintype ι] {G : Type*} + +/-- The action on coefficient functions of a matrix moving the components: + `(actMat M c) a = ∑_d c_d M_{a d}`, with `a` free and `d` summed. -/ +def actMat (M : ι → ι → ℂ) (c : ι → ℂ) (a : ι) : ℂ := ∑ d, c d * M a d + +/-- That action, as a linear map. -/ +noncomputable def actMatₗ (M : ι → ι → ℂ) : (ι → ℂ) →ₗ[ℂ] (ι → ℂ) where + toFun := actMat M + map_add' c c' := by + funext a + simp only [actMat, Pi.add_apply, add_mul, Finset.sum_add_distrib] + map_smul' z c := by + funext a + simp only [actMat, Pi.smul_apply, smul_eq_mul, RingHom.id_apply, Finset.mul_sum, mul_assoc] + +open scoped InnerProductSpace in +/-- Across the standard inner product the action of `M` becomes that of its conjugate + transpose. The action is not unitary, and is not used to be. -/ +lemma inner_actMat (M N : ι → ι → ℂ) (hN : ∀ a d, N a d = star (M d a)) + (u v : EuclideanSpace ℂ ι) : + ⟪u, WithLp.toLp 2 (actMat M v.ofLp)⟫_ℂ = ⟪WithLp.toLp 2 (actMat N u.ofLp), v⟫_ℂ := by + simp only [PiLp.inner_apply, RCLike.inner_apply, actMat, hN, map_sum, map_mul, Complex.conj_conj, + Complex.star_def, Finset.mul_sum, Finset.sum_mul] + rw [Finset.sum_comm] + exact Finset.sum_congr rfl fun a _ => Finset.sum_congr rfl fun d _ => by ring + +/-- An invariant of the span is the contraction of a coefficient function that every `M g` + fixes, provided the matrices are closed under conjugate transposition. -/ +theorem exists_invariantCoeff_matrix (T : ι → B) (φ : G → B →ₗ[ℂ] B) (M : G → ι → ι → ℂ) + (hT : ∀ (g : G) l, φ g (T l) = ∑ a, M g a l • T a) + (hM : ∀ g : G, ∃ g' : G, ∀ a d, M g' a d = star (M g d a)) + {x : B} (hx : x ∈ ⨆ i, ℂ ∙ T i) (hinv : ∀ g, φ g x = x) : + ∃ c : ι → ℂ, (∀ g, actMat (M g) c = c) ∧ x = ∑ i, c i • T i := by + obtain ⟨c, hc, hinvc⟩ := exists_invariantCoeff T φ (fun g => actMatₗ (M g)) + (fun g c => by + simp only [map_sum, map_smul, hT, Finset.smul_sum, smul_smul, actMatₗ, LinearMap.coe_mk, + AddHom.coe_mk, actMat, Finset.sum_smul] + exact Finset.sum_comm) + (fun g => by + obtain ⟨g', hg'⟩ := hM g + exact ⟨g', fun u v => inner_actMat (M g) (M g') hg' u v⟩) hx hinv + exact ⟨c, hinvc, hc⟩ + +end Mat + +/-! + +## C. Coefficient tensors on spacetime indices + +-/ + +section Spacetime + +variable {n : ℕ} + +/-- The conjugate transpose `g†` of an element of `SL(2,ℂ)`, again in `SL(2,ℂ)`. -/ +def dagger (g : SL(2,ℂ)) : SL(2,ℂ) := ⟨g.1ᴴ, by rw [Matrix.det_conjTranspose, g.2, star_one]⟩ + +/-- The Lorentz matrix of `g†` is the transpose of that of `g`, so these matrices are closed + under transposition. -/ +lemma toLorentzGroup_dagger (g : SL(2,ℂ)) : + (SL2C.toLorentzGroup (dagger g)).1 = (SL2C.toLorentzGroup g).1ᵀ := + SL2C.toLorentzGroup_conjTranspose rfl + +/-- The action of a real `4 × 4` matrix on coefficient tensors, one factor per slot: + `(act Λ c) a = ∑_d c_d Λ_{a₀ d₀} ⋯`, with `a` free and `d` summed. -/ +def act (Λ : Matrix (Fin 1 ⊕ Fin 3) (Fin 1 ⊕ Fin 3) ℝ) + (c : (Fin n → Fin 1 ⊕ Fin 3) → ℂ) (a : Fin n → Fin 1 ⊕ Fin 3) : ℂ := + ∑ d, c d * ∏ s, ((Λ (a s) (d s) : ℝ) : ℂ) + +/-- The action on coefficient tensors is that of the matrix of products, one factor per slot. -/ +lemma act_eq_actMat (Λ : Matrix (Fin 1 ⊕ Fin 3) (Fin 1 ⊕ Fin 3) ℝ) + (c : (Fin n → Fin 1 ⊕ Fin 3) → ℂ) : + act Λ c = actMat (fun a d => ∏ i, ((Λ (a i) (d i) : ℝ) : ℂ)) c := rfl + +/-- A coefficient tensor fixed by `act` of the Lorentz matrix of every `g : SL(2,ℂ)`. -/ +def IsInvariantCoeff (c : (Fin n → Fin 1 ⊕ Fin 3) → ℂ) : Prop := + ∀ g : SL(2,ℂ), act (SL2C.toLorentzGroup g).1 c = c + +/-- Transforming a contraction is the same as contracting the transformed coefficient tensor. -/ +lemma repLorentz_sum_smul {T : (Fin n → Fin 1 ⊕ Fin 3) → B} + {repLorentz : Representation ℂ SL(2,ℂ) B} + (hT : ∀ (g : SL(2,ℂ)) l, repLorentz g (T l) = ∑ a : Fin n → Fin 1 ⊕ Fin 3, + (∏ i, (((SL2C.toLorentzGroup g).1 (a i) (l i) : ℝ) : ℂ)) • T a) + (g : SL(2,ℂ)) (c : (Fin n → Fin 1 ⊕ Fin 3) → ℂ) : + repLorentz g (∑ d, c d • T d) = ∑ a, act (SL2C.toLorentzGroup g).1 c a • T a := by + simp only [map_sum, map_smul, hT, Finset.smul_sum, smul_smul, act, Finset.sum_smul] + exact Finset.sum_comm + +/-- An invariant of the span is the contraction of an invariant coefficient tensor: the + adjoint of `act Λ` is the action of `Λᵀ`, which is the Lorentz matrix of `g†`. -/ +theorem exists_isInvariantCoeff_of_mem_span {T : (Fin n → Fin 1 ⊕ Fin 3) → B} + {repLorentz : Representation ℂ SL(2,ℂ) B} + (hT : ∀ (g : SL(2,ℂ)) l, repLorentz g (T l) = ∑ a : Fin n → Fin 1 ⊕ Fin 3, + (∏ i, (((SL2C.toLorentzGroup g).1 (a i) (l i) : ℝ) : ℂ)) • T a) + {x : B} (hx : x ∈ ⨆ d, ℂ ∙ T d) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : + ∃ c : (Fin n → Fin 1 ⊕ Fin 3) → ℂ, IsInvariantCoeff c ∧ x = ∑ d, c d • T d := by + obtain ⟨c, hc, hx'⟩ := exists_invariantCoeff_matrix T (fun g => repLorentz g) + (fun g a d => ∏ i, (((SL2C.toLorentzGroup g).1 (a i) (d i) : ℝ) : ℂ)) hT + (fun g => ⟨dagger g, fun a d => by + rw [toLorentzGroup_dagger] + simp [Matrix.transpose_apply]⟩) hx hinv + exact ⟨c, fun g => (act_eq_actMat _ c).trans (hc g), hx'⟩ + +/-- Contracting the components with an invariant coefficient tensor gives a vector fixed by + the representation. -/ +lemma repLorentz_sum_smul_of_isInvariantCoeff {T : (Fin n → Fin 1 ⊕ Fin 3) → B} + {repLorentz : Representation ℂ SL(2,ℂ) B} + (hT : ∀ (g : SL(2,ℂ)) l, repLorentz g (T l) = ∑ a : Fin n → Fin 1 ⊕ Fin 3, + (∏ i, (((SL2C.toLorentzGroup g).1 (a i) (l i) : ℝ) : ℂ)) • T a) + {c : (Fin n → Fin 1 ⊕ Fin 3) → ℂ} (hc : IsInvariantCoeff c) (g : SL(2,ℂ)) : + repLorentz g (∑ d, c d • T d) = ∑ d, c d • T d := by + rw [repLorentz_sum_smul hT, hc g] + +/-- A light-cone component of a coefficient tensor along axis `i`: the multi-index `κ` picks + one light-cone direction per slot and `c` is contracted against that choice. -/ +def lightConeComponent (i : Fin 3) (c : (Fin n → Fin 1 ⊕ Fin 3) → ℂ) (κ : Fin n → Fin 4) : ℂ := + ∑ a, (∏ s, lightConeCoeff i (κ s) (a s)) * c a + +/-- The Lorentz matrix of a boost is symmetric. -/ +lemma toLorentzGroup_boostAxis_symm (i : Fin 3) {t : ℝ} (ht : t ≠ 0) (a b : Fin 1 ⊕ Fin 3) : + (SL2C.toLorentzGroup (SL2C.boostAxis i t ht)).1 a b + = (SL2C.toLorentzGroup (SL2C.boostAxis i t ht)).1 b a := + congrFun (congrFun + (SL2C.toLorentzGroup_conjTranspose (SL2C.boostAxis_conjTranspose i t ht).symm) a) b + +/-- The boost with parameter `t` multiplies a light-cone component by `t` raised to the weight + of `κ`, the sum of the weights of the directions `κ` picks. -/ +lemma lightConeComponent_act_boostAxis (i : Fin 3) (c : (Fin n → Fin 1 ⊕ Fin 3) → ℂ) + (κ : Fin n → Fin 4) {t : ℝ} (ht : t ≠ 0) : + lightConeComponent i (act (SL2C.toLorentzGroup (SL2C.boostAxis i t ht)).1 c) κ + = ((t : ℝ) : ℂ) ^ (∑ s, lightConeWeight (κ s)) * lightConeComponent i c κ := by + simp only [lightConeComponent, act, Finset.mul_sum] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun d _ => ?_ + have h := sum_prod_lightConeCoeff i κ d ht + simp only [toLorentzGroup_boostAxis_symm i ht (d _)] at h + rw [← mul_assoc, mul_comm _ (c d), ← h, Finset.mul_sum] + exact Finset.sum_congr rfl fun a _ => by ring + +/-- An invariant coefficient tensor has no light-cone component of nonzero weight: the boost at + `t = 2` would rescale such a component by a factor other than `1`. -/ +lemma IsInvariantCoeff.lightConeComponent_eq_zero {c : (Fin n → Fin 1 ⊕ Fin 3) → ℂ} + (hc : IsInvariantCoeff c) (i : Fin 3) {κ : Fin n → Fin 4} + (hκ : ∑ s, lightConeWeight (κ s) ≠ 0) : + lightConeComponent i c κ = 0 := by + have h := lightConeComponent_act_boostAxis i c κ (two_ne_zero (α := ℝ)) + rw [hc] at h + have h2 : ((2 : ℝ) : ℂ) ^ (∑ s, lightConeWeight (κ s)) ≠ 1 := by + rw [← Complex.ofReal_zpow, Ne, Complex.ofReal_eq_one, + zpow_eq_one_iff_right₀ (by norm_num) (by norm_num)] + exact hκ + exact (mul_left_eq_self₀.1 h.symm).resolve_left h2 + +/-- A coefficient tensor is recovered from its light-cone components. -/ +lemma eq_sum_lightConeComponent (i : Fin 3) (c : (Fin n → Fin 1 ⊕ Fin 3) → ℂ) + (d : Fin n → Fin 1 ⊕ Fin 3) : + c d = ∑ κ, (∏ s, lightConeCoeffInv i (d s) (κ s)) * lightConeComponent i c κ := by + simp only [lightConeComponent, Finset.mul_sum, ← mul_assoc] + rw [Finset.sum_comm] + simp only [← Finset.sum_mul, sum_prod_lightConeCoeffInv, ite_mul, one_mul, zero_mul, + Finset.sum_ite_eq, Finset.mem_univ, if_true] + +end Spacetime + +end Invariants + +end Lorentz diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsBiLeftWeyl.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsBiLeftWeyl.lean index e626b22d1..30f05e515 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsBiLeftWeyl.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsBiLeftWeyl.lean @@ -27,12 +27,13 @@ The components are vectors `T a` of a complex vector space `B` carrying a repres says the group moves each index by the matrix of `g` (B). `hT.span` is the set of their combinations. -The proof is the same-handedness twin of `IsLeftRightWeyl` and reuses its Weyl weight -bases (A, C). An invariant has boost weight `0` along every axis, so it is fixed by the -weight-zero projection along each; averaging the three gives `M = 2 - swap` (D), whose -eigenvalue `3` is simple and carried by the antisymmetric line, so `(3 λ - 1) / 2` at -`λ = M / 3` collapses an invariant onto the antisymmetric part of its coefficients, which -is the `ε` contraction (E). Section F divides out `S`. +An invariant of the span is `∑_a c_a • T a` for a coefficient function `c` that the group +itself fixes (B, from `Invariants.Basic`), and the proof is then the same-handedness twin of +`IsLeftRightWeyl`, reusing its Weyl weight bases (A, C). The coefficients transform +contragrediently, so their weight basis is the conjugate of the components'. An invariant has +weight `0` along every axis, so it is fixed by the weight-zero projection along each; averaging +the three gives `M = 2 - swap` (D), and `M c = 3 c` says exactly that `c` is antisymmetric, +which is the `ε` contraction (E). Section F divides out `S`. Sections G to K handle dual Weyl indices, which transform by the contragredient `(Λ⁻¹)ᵀ`, or for a barred species by `(Λ⁻¹)ᴴ`. Neither is the fundamental law, and two @@ -48,65 +49,66 @@ invariance is the same condition for both and the classification carries over (I namespace Lorentz -open TensorProduct Matrix MatrixGroups SL2C BoostWeight +open TensorProduct Matrix MatrixGroups SL2C Invariants open IsQuadLorentz (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`. +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`. What is graded +here is the coefficient function, which transforms contragrediently, so both slots take the +conjugated basis. -/ -/-- The axis-`i` weight basis of a pair of left-handed indices. -/ +/-- The axis-`i` weight basis of the coefficients of a pair of left-handed indices. -/ def biLeftCoeff (i : Fin 3) (κ α : Fin 2 × Fin 2) : ℂ := - weylCoeff i κ.1 α.1 * weylCoeff i κ.2 α.2 + weylCoeffC i κ.1 α.1 * weylCoeffC i κ.2 α.2 -/-- The standard basis of a pair of left-handed indices written back in the axis-`i` - weight basis. -/ +/-- The standard basis of the coefficients 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 + weylCoeffInvC i α.1 κ.1 * weylCoeffInvC 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) + have hfac : (∑ κ₁, weylCoeffInvC i α.1 κ₁ * weylCoeffC i κ₁ β.1) + * (∑ κ₂, weylCoeffInvC i α.2 κ₂ * weylCoeffC 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] + rw [← hfac, sum_weylCoeffInvC_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 +/-- The pair weight basis diagonalises the axis-`i` boost on coefficients, 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 +lemma sum_boostAxis_biLeftCoeff (i : Fin 3) (κ l : Fin 2 × Fin 2) {t : ℝ} (ht : t ≠ 0) : + ∑ a : Fin 2 × Fin 2, biLeftCoeff i κ a * ((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 + = ((t : ℝ) : ℂ) ^ (pairWeight κ) * biLeftCoeff i κ l := 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 + have hfac : (∑ a₁, star ((SL2C.boostAxis i t ht).1 l.1 a₁) * weylCoeffC i κ.1 a₁) + * (∑ a₂, star ((SL2C.boostAxis i t ht).1 l.2 a₂) * weylCoeffC i κ.2 a₂) + = ∑ a : Fin 2 × Fin 2, biLeftCoeff i κ a * ((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, + refine Finset.sum_congr rfl fun a₁ _ => Finset.sum_congr rfl fun a₂ _ => ?_ + simp only [biLeftCoeff, star_boostAxis_apply] + ring + rw [← hfac, sum_boostAxis_weylCoeffC i κ.1 l.1 ht, sum_boostAxis_weylCoeffC i κ.2 l.2 ht, pairWeight, biLeftCoeff, zpow_add₀ htc] ring /-! -## B. Bi-left-handed Weyl tensors and the span of their components +## B. Bi-left-handed Weyl tensors, their span, and coefficient functions `IsBiLeftWeyl B repLorentz T` says the group moves each index of `T^{α₁ α₂}` by the matrix of `g`, and `hT.span` is the set of combinations `∑ a, c a • T a` of the four components. @@ -139,158 +141,100 @@ lemma mem_span_iff (x : B) : LinearMap.mem_range] simp only [Fintype.linearCombination_apply, eq_comm] +/-- The action of `g : SL(2,ℂ)` on coefficient functions: one factor of `g` per slot, with + the free index first in each factor and the summed one second. -/ +def act (g : SL(2,ℂ)) (c : Fin 2 × Fin 2 → ℂ) (a : Fin 2 × Fin 2) : ℂ := + ∑ d : Fin 2 × Fin 2, c d * (g.1 a.1 d.1 * g.1 a.2 d.2) + +/-- A coefficient function fixed by every `g : SL(2,ℂ)`. -/ +def IsInvariantCoeff (c : Fin 2 × Fin 2 → ℂ) : Prop := ∀ g : SL(2,ℂ), act g c = c + +include hT in +/-- An invariant of the span is the contraction of an invariant coefficient function: the + adjoint of the action of `g` is the action of `g†`. -/ +theorem exists_isInvariantCoeff_of_mem_span {x : B} (hx : x ∈ hT.span) + (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : + ∃ c : Fin 2 × Fin 2 → ℂ, IsInvariantCoeff c ∧ x = ∑ d, c d • T d := by + obtain ⟨c, hc, hx'⟩ := Invariants.exists_invariantCoeff_matrix T (fun g => repLorentz g) + (fun g a d => g.1 a.1 d.1 * g.1 a.2 d.2) hT.repLorentz_T + (fun g => ⟨Invariants.dagger g, fun a d => by + simp [Invariants.dagger, Matrix.conjTranspose_apply]⟩) + (by rwa [← span]) hinv + exact ⟨c, hc, hx'⟩ + /-! -## C. The weight grading of the span +## C. The weight grading of the coefficients -The four products `weightVec i κ` of two left weight vectors span the same space as the -components and are boost eigenvectors along the axis `i`, of weights `2`, `0`, `0` and -`-2`. +The four products `biLeftCoeff i κ` of two weight covectors read off the weight components of +a coefficient function, and the axis-`i` boost multiplies the component at `κ` by +`t ^ pairWeight κ`. An invariant function has no component of weight `±2`. -/ -set_option linter.unusedVariables false in -/-- The weight component of `T` along axis `i` at the pair `κ` of Weyl weight indices; - `hT` is present only so it reads `hT.weightVec`. -/ -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 +/-- The axis-`i` weight component of a coefficient function at the pair `κ`. -/ +def weightComponent (i : Fin 3) (c : Fin 2 × Fin 2 → ℂ) (κ : Fin 2 × Fin 2) : ℂ := + ∑ a : Fin 2 × Fin 2, biLeftCoeff i κ a * c a + +/-- The axis-`i` boost multiplies the weight component at `κ` by `t ^ pairWeight κ`. -/ +lemma weightComponent_act_boostAxis (i : Fin 3) (c : Fin 2 × Fin 2 → ℂ) + (κ : Fin 2 × Fin 2) {t : ℝ} (ht : t ≠ 0) : + weightComponent i (act (SL2C.boostAxis i t ht) c) κ + = ((t : ℝ) : ℂ) ^ (pairWeight κ) * weightComponent i c κ := by + simp only [weightComponent, act, Finset.mul_sum] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun d _ => ?_ + calc ∑ a : Fin 2 × Fin 2, biLeftCoeff i κ a * (c d * ((SL2C.boostAxis i t ht).1 a.1 d.1 + * (SL2C.boostAxis i t ht).1 a.2 d.2)) + = c d * ∑ a : Fin 2 × Fin 2, biLeftCoeff i κ a * ((SL2C.boostAxis i t ht).1 a.1 d.1 + * (SL2C.boostAxis i t ht).1 a.2 d.2) := by + rw [Finset.mul_sum] + exact Finset.sum_congr rfl fun a _ => by ring + _ = _ := by rw [sum_boostAxis_biLeftCoeff i κ d ht]; ring + +/-- An invariant coefficient function has no weight component of nonzero weight. -/ +lemma weightComponent_eq_zero {c : Fin 2 × Fin 2 → ℂ} (hc : IsInvariantCoeff c) (i : Fin 3) + {κ : Fin 2 × Fin 2} (hκ : pairWeight κ ≠ 0) : weightComponent i c κ = 0 := by + have h := weightComponent_act_boostAxis i c κ (two_ne_zero (α := ℝ)) + rw [hc] at h + have h2 : ((2 : ℝ) : ℂ) ^ (pairWeight κ) ≠ 1 := by + rw [← Complex.ofReal_zpow, Ne, Complex.ofReal_eq_one, + zpow_eq_one_iff_right₀ (by norm_num) (by norm_num)] + exact hκ + exact (mul_left_eq_self₀.1 h.symm).resolve_left h2 + +/-- A coefficient function is recovered from its weight components. -/ +lemma eq_sum_weightComponent (i : Fin 3) (c : Fin 2 × Fin 2 → ℂ) (α : Fin 2 × Fin 2) : + c α = ∑ κ : Fin 2 × Fin 2, biLeftCoeffInv i α κ * weightComponent i c κ := by + simp only [weightComponent, Finset.mul_sum, ← mul_assoc] + rw [Finset.sum_comm] + simp only [← Finset.sum_mul, sum_biLeftCoeffInv_mul, ite_mul, one_mul, zero_mul, + Finset.sum_ite_eq, Finset.mem_univ, if_true] /-! ## D. The weight-zero round and its average over the axes -An invariant has boost weight zero along every axis, so along each axis it equals its own -weight-zero part, which written back on the components is the matrix -`weightZeroTransition i`. +Keeping only the weight-zero components writes an invariant coefficient function as one matrix +per axis applied to itself, and the three average to `2 - swap`. -/ -/-- 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) : ℂ := +/-- The matrix of the axis-`i` weight-zero projection on coefficient functions. -/ +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] +/-- An invariant coefficient function is fixed by the axis-`i` weight-zero projection. -/ +lemma eq_sum_weightZeroTransition {c : Fin 2 × Fin 2 → ℂ} (hc : IsInvariantCoeff c) (i : Fin 3) + (α : Fin 2 × Fin 2) : c α = ∑ β, weightZeroTransition i α β * c β := by + have hfil : ∀ κ ∈ Finset.univ.filter (fun κ : Fin 2 × Fin 2 => ¬ pairWeight κ = 0), + biLeftCoeffInv i α κ * weightComponent i c κ = 0 := + fun κ hκ => by rw [weightComponent_eq_zero hc i (Finset.mem_filter.1 hκ).2, mul_zero] + rw [eq_sum_weightComponent i c α, ← Finset.sum_filter_add_sum_filter_not Finset.univ + (fun κ : Fin 2 × Fin 2 => pairWeight κ = 0), Finset.sum_eq_zero hfil, add_zero] + simp only [weightComponent, weightZeroTransition, Finset.mul_sum, Finset.sum_mul, ← mul_assoc] rw [Finset.sum_comm] - refine Finset.sum_congr rfl fun β _ => ?_ - rw [← Finset.sum_smul, weightZeroTransition] - -include hT in -/-- A vector of boost weight zero along axis `i` is written with the weight-zero transition - 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. -/ @@ -306,45 +250,16 @@ lemma sum_weightZeroTransition_eq (β α : Fin 2 × Fin 2) : obtain ⟨β₁, β₂⟩ := β obtain ⟨α₁, α₂⟩ := α fin_cases β₁ <;> fin_cases β₂ <;> fin_cases α₁ <;> fin_cases α₂ <;> - simp [transitionEntry, biLeftCoeff, biLeftCoeffInv, weylCoeff, weylCoeffInv] <;> + simp [transitionEntry, biLeftCoeff, biLeftCoeffInv, weylCoeffC, weylCoeffInvC] <;> norm_num [Complex.ext_iff] -include hT in -/-- A vector of boost weight zero along all three axes is written with a third of the summed - transition 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 summed transition is `2 - swap`, so `M c = 3 c` says exactly that `c` is antisymmetric. +An invariant coefficient function is therefore the `ε` symbol up to a scalar, and the invariant +is that multiple of the `ε` contraction. -/ @@ -390,14 +305,19 @@ lemma sum_transitionEntry_mul (c : Fin 2 × Fin 2 → ℂ) (β : Fin 2 × Fin 2) 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 +/-- An invariant coefficient function is antisymmetric: the summed transition is `2 - swap`, + and an invariant is its eigenvector for the eigenvalue `3`. -/ +lemma eq_neg_swap {c : Fin 2 × Fin 2 → ℂ} (hc : IsInvariantCoeff c) (β : Fin 2 × Fin 2) : + c β = - c β.swap := by + have h3 : ∑ i : Fin 3, ∑ α, weightZeroTransition i β α * c α = 3 * c β := by + rw [Fin.sum_univ_three, ← eq_sum_weightZeroTransition hc 0 β, + ← eq_sum_weightZeroTransition hc 1 β, ← eq_sum_weightZeroTransition hc 2 β] + ring + rw [show (∑ i : Fin 3, ∑ α, weightZeroTransition i β α * c α) = 2 * c β - c β.swap from by + rw [Finset.sum_comm, ← sum_transitionEntry_mul c β] + exact Finset.sum_congr rfl fun α _ => by + rw [← Finset.sum_mul, sum_weightZeroTransition_eq]] at h3 + linear_combination -h3 include hT in /-- The classification of the Lorentz invariants: every element of the span of the @@ -405,21 +325,22 @@ include hT in 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 (rep := 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 + obtain ⟨c, hc, rfl⟩ := hT.exists_isInvariantCoeff_of_mem_span hx hinv + have h00 : c (0, 0) = 0 := by + have h := eq_neg_swap hc (0, 0) + rw [Prod.swap_prod_mk] at h + linear_combination h / 2 + have h11 : c (1, 1) = 0 := by + have h := eq_neg_swap hc (1, 1) + rw [Prod.swap_prod_mk] at h + linear_combination h / 2 + have h10 : c (1, 0) = - c (0, 1) := by + have h := eq_neg_swap hc (1, 0) + rwa [Prod.swap_prod_mk] at h + refine ⟨c (0, 1), ?_⟩ + rw [epsilonContraction_eq] + simp only [Fintype.sum_prod_type, Fin.sum_univ_two, h00, h11, h10] + module /-! diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsBiLorentz.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsBiLorentz.lean index bd167adc4..cd9ed859a 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsBiLorentz.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsBiLorentz.lean @@ -26,14 +26,16 @@ The components are vectors `T d` of a complex vector space `B` carrying a repres moves them with one factor of the Lorentz matrix per slot (A). `hT.span` is the set of their combinations. -The proof is the two-index case of the argument in `IsQuadLorentz`, and reuses its -light-cone coefficients and sector matrices. Along a spatial axis the four light-cone -directions carry boost weights `2`, `-2`, `0`, `0` (B), and an invariant, having weight -`0` along every axis, is fixed by the weight-zero projection along each; averaging the -three gives one linear map on the `16` components, `12` times an integer matrix with a -short closed form (C, D). Its eigenvalues are `12`, `10`, `4`, `0`, with `12` simple, so -the cubic `λ (λ - 4) (λ - 10)` sends everything onto that one eigenvector, which is the -metric (E). Section F draws the conclusion and G divides out `S`. +An invariant of the span is `∑_d c_d • T d` for a coefficient tensor `c` that the Lorentz +matrices themselves fix (A, from `Invariants.Basic`), and the rest is the two-index case of the +argument in `IsQuadLorentz`, reusing its light-cone coefficients and sector matrices. Along a +spatial axis the four light-cone directions carry boost weights `2`, `-2`, `0`, `0`, and an +invariant `c` has no light-cone component of nonzero weight, so it is fixed by the weight-zero +projection along each axis (B); averaging the three gives one linear map on the `16` +coefficients, `12` times an integer matrix with a short closed form (C, D). Its eigenvalues are +`12`, `10`, `4`, `0`, with `12` simple, so the cubic `λ (λ - 4) (λ - 10)` sends everything onto +that one eigenvector, which is the metric (E). Section F draws the conclusion and G divides +out `S`. No rotation averaging is needed here, unlike the four-index case: for two indices the three weight-zero conditions already cut the `16` components down to a single line. @@ -43,7 +45,7 @@ three weight-zero conditions already cut the `16` components down to a single li namespace Lorentz -open TensorProduct Matrix MatrixGroups SL2C BoostWeight +open TensorProduct Matrix MatrixGroups SL2C Invariants open IsQuadLorentz (lightConeCoeffZ coe_lightConeCoeffZ lightConeCoeffInvQ coe_lightConeCoeffInvQ lightConeCoeffInvZ coe_lightConeCoeffInvZ sectorIndex sectorWeight lightConeWeight_eq_sectorWeight slotTransition slotTransitionZ slotTransitionZ_eq_sum quotRep @@ -87,124 +89,21 @@ lemma mem_span_iff (x : B) : LinearMap.mem_range] simp only [Fintype.linearCombination_apply, eq_comm] -/-! - -## B. The light-cone basis along one axis - -The boost along the axis `i` scales the light-cone directions `D₀ - Dᵢ`, `D₀ + Dᵢ` and the -two transverse ones by `t²`, `t⁻²`, `1`, `1`, so their weights are `2`, `-2`, `0`, `0`. -Recombining the components along those directions gives `hT.lightCone i c`, which spans -the same space and is a boost eigenvector of weight the total weight of `c`. - --/ - -set_option linter.unusedVariables false in -/-- The light-cone component of `T` along axis `i` at the light-cone index `c`; `hT` is - present only so it reads `hT.lightCone`. -/ -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 => ?_ - calc repLorentz (SL2C.boostAxis i t ht) (hT.lightCone i c) - = ∑ 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 [lightCone, map_sum, map_smul, hT.repLorentz_T, Finset.smul_sum, - smul_smul] - rw [Finset.sum_comm] - exact Finset.sum_congr rfl fun a _ => Finset.sum_smul.symm - _ = (algebraMap ℝ ℂ) t ^ (∑ j, lightConeWeight (c j)) • hT.lightCone i c := by - simp only [sum_prod_lightConeCoeff i c _ ht, lightCone, Finset.smul_sum, smul_smul] - rfl - -/-! - -## C. The weight-zero projection and its average over the axes - -## C.1. The boost-weight parts of a component - -Each component `T e` is the sum of its boost-weight parts `hT.monoComponent i e m`; with -two indices the weights are the five even numbers from `-4` to `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 +include hT in +/-- An invariant of the span is the contraction of an invariant coefficient tensor. -/ +theorem exists_isInvariantCoeff_of_mem_span {x : B} (hx : x ∈ hT.span) + (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : + ∃ c : (Fin 2 → Fin 1 ⊕ Fin 3) → ℂ, IsInvariantCoeff c ∧ x = ∑ d, c d • T d := + Invariants.exists_isInvariantCoeff_of_mem_span hT.repLorentz_T hx hinv /-! -## C.2. The weight-zero transition matrix +## B. The weight-zero transition along one axis -Written back on the components, the weight-zero part of `T e` is a matrix applied to the -components: a sum over the sector patterns of total weight zero of the per-slot sector -matrices of `IsQuadLorentz`. +An invariant coefficient tensor keeps only its light-cone components of total weight zero, so +writing it back on the coefficients it is fixed by one matrix per axis: a sum over the sector +patterns of total weight zero of the per-slot sector matrices of `IsQuadLorentz`. -/ @@ -265,27 +164,39 @@ lemma weightZeroTransition_eq_sum_lightCone (i : Fin 3) (d e : Fin 2 → 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` - 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] +/-- An invariant coefficient tensor is fixed by the axis-`i` weight-zero transition. -/ +lemma eq_sum_weightZeroTransition {c : (Fin 2 → Fin 1 ⊕ Fin 3) → ℂ} + (hc : IsInvariantCoeff c) (i : Fin 3) (d : Fin 2 → Fin 1 ⊕ Fin 3) : + c d = ∑ e, ((weightZeroTransition i e d : ℚ) : ℂ) * c e := by + have hfil : ∀ κ ∈ Finset.univ.filter + (fun κ : Fin 2 → Fin 4 => ¬ (∑ s, lightConeWeight (κ s)) = 0), + (∏ s, lightConeCoeffInv i (d s) (κ s)) * lightConeComponent i c κ = 0 := + fun κ hκ => by + rw [hc.lightConeComponent_eq_zero i (Finset.mem_filter.1 hκ).2, mul_zero] + rw [eq_sum_lightConeComponent i c d, ← Finset.sum_filter_add_sum_filter_not Finset.univ + (fun κ : Fin 2 → Fin 4 => (∑ s, lightConeWeight (κ s)) = 0), Finset.sum_eq_zero hfil, + add_zero] + calc ∑ κ ∈ Finset.univ.filter (fun κ : Fin 2 → Fin 4 => (∑ s, lightConeWeight (κ s)) = 0), + (∏ s, lightConeCoeffInv i (d s) (κ s)) * lightConeComponent i c κ + = ∑ e, (∑ κ ∈ Finset.univ.filter + (fun κ : Fin 2 → Fin 4 => (∑ s, lightConeWeight (κ s)) = 0), + ∏ s, lightConeCoeffInv i (d s) (κ s) * lightConeCoeff i (κ s) (e s)) * c e := by + simp only [lightConeComponent, Finset.mul_sum, Finset.sum_mul, Finset.prod_mul_distrib] + rw [Finset.sum_comm] + exact Finset.sum_congr rfl fun e _ => Finset.sum_congr rfl fun κ _ => by ring + _ = _ := by + refine Finset.sum_congr rfl fun e _ => ?_ + congr 1 + rw [weightZeroTransition_eq_sum_lightCone] + push_cast + simp only [coe_lightConeCoeffInvQ, coe_lightConeCoeffZ] /-! -## C.3. The average over the axes, and its powers +## C. The average over the axes -An invariant has weight zero along all three axes, so it is fixed by each of the three -weight-zero transitions, hence by their average and by every power of that average. +An invariant coefficient tensor is fixed by each of the three weight-zero transitions, hence +by their average. -/ @@ -295,67 +206,22 @@ 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 -/-- A vector of boost weight zero along axis `i` is written with the weight-zero transition - 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] +/-- An invariant coefficient tensor is fixed by the average of the three transitions. -/ +lemma eq_sum_boostAverageTransition {c : (Fin 2 → Fin 1 ⊕ Fin 3) → ℂ} + (hc : IsInvariantCoeff c) (d : Fin 2 → Fin 1 ⊕ Fin 3) : + c d = ∑ e, ((boostAverageTransition e d : ℚ) : ℂ) * c e := by + have h3 : (3 : ℂ) * c d = ∑ i : Fin 3, ∑ e, ((weightZeroTransition i e d : ℚ) : ℂ) * c e := by + rw [Fin.sum_univ_three, ← eq_sum_weightZeroTransition hc 0 d, + ← eq_sum_weightZeroTransition hc 1 d, ← eq_sum_weightZeroTransition hc 2 d] + ring + rw [show (∑ e, ((boostAverageTransition e d : ℚ) : ℂ) * c e) + = (3 : ℂ)⁻¹ * ∑ i : Fin 3, ∑ e, ((weightZeroTransition i e d : ℚ) : ℂ) * c e from by + 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], ← h3] + ring /-! @@ -488,6 +354,19 @@ lemma Q_eq_poly : Q = boostAverageZ ^ 3 - (14 : ℤ) • boostAverageZ ^ 2 rw [Q] noncomm_ring +/-- The integer averaged round is a symmetric matrix, a finite check. -/ +lemma boostAverageZ_transpose : boostAverageZᵀ = boostAverageZ := by + rw [boostAverageZ_eq] + ext d e + revert d e + decide +kernel + +/-- The same read on a pair of entries. -/ +lemma boostAverageZ_symm (d e : Fin 2 → Fin 1 ⊕ Fin 3) : + boostAverageZ d e = boostAverageZ e d := by + have h := congrFun (congrFun boostAverageZ_transpose e) d + rwa [Matrix.transpose_apply] at h + /-! ## F. The classification of the Lorentz invariants @@ -503,79 +382,41 @@ noncomputable def metricContraction : B := /-! -## F.2. Iterating the averaged round +## F.2. Iterating the averaged round on the coefficients -/ -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] +/-- An invariant coefficient tensor is fixed by the integer averaged round, up to `12`. -/ +lemma twelve_mul_eq_sum_boostAverageZ {c : (Fin 2 → Fin 1 ⊕ Fin 3) → ℂ} + (hc : IsInvariantCoeff c) (d : Fin 2 → Fin 1 ⊕ Fin 3) : + (12 : ℂ) * c d = ∑ e, ((boostAverageZ d e : ℤ) : ℂ) * c e := by + rw [show (12 : ℂ) * c d = ∑ e, (12 : ℂ) * (((boostAverageTransition e d : ℚ) : ℂ) * c e) from by + rw [← Finset.mul_sum, ← eq_sum_boostAverageTransition hc]] refine Finset.sum_congr rfl fun e _ => ?_ - have hb := congrArg (fun q : ℚ => (q : ℂ)) (coe_boostAverageZ d e) - push_cast at hb ⊢ - rw [hb] + have hb := congrArg (fun q : ℚ => (q : ℂ)) (coe_boostAverageZ e d) + push_cast at hb + rw [boostAverageZ_symm d e, 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] +/-- The same for `n` rounds: the `n`-th power of the integer matrix, up to `12 ^ n`. -/ +lemma pow_mul_eq_sum_pow_boostAverageZ {c : (Fin 2 → Fin 1 ⊕ Fin 3) → ℂ} + (hc : IsInvariantCoeff c) (n : ℕ) (d : Fin 2 → Fin 1 ⊕ Fin 3) : + ((12 : ℂ) ^ n) * c d = ∑ e, (((boostAverageZ ^ n) d e : ℤ) : ℂ) * c e := by + induction n generalizing d with + | 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] + calc ((12 : ℂ) ^ (n + 1)) * c d + = (12 : ℂ) ^ n * ((12 : ℂ) * c d) := by ring + _ = ∑ f, ((boostAverageZ d f : ℤ) : ℂ) * ((12 : ℂ) ^ n * c f) := by + rw [twelve_mul_eq_sum_boostAverageZ hc, Finset.mul_sum] + exact Finset.sum_congr rfl fun f _ => by ring + _ = ∑ e, (((boostAverageZ ^ (n + 1)) d e : ℤ) : ℂ) * c e := by + simp only [ih, Finset.mul_sum, pow_succ' boostAverageZ n, Matrix.mul_apply] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun e _ => ?_ + push_cast + rw [Finset.sum_mul] + exact Finset.sum_congr rfl fun f _ => by ring /-! @@ -583,70 +424,36 @@ lemma eq_sum_pow_boostAverageZ_smul {x : B} (c : (Fin 2 → Fin 1 ⊕ Fin 3) → -/ -include hT in -/-- Applying the certificate polynomial to the coefficients reproduces `x`, as the combination - of three iterated averages 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 +/-- The certificate applied to an invariant coefficient tensor: `192 c = 48 η (η ⬝ c)`, so + every invariant coefficient tensor is a multiple of the metric. -/ +lemma eq_smul_minkowskiMatrixZ {c : (Fin 2 → Fin 1 ⊕ Fin 3) → ℂ} (hc : IsInvariantCoeff c) + (d : Fin 2 → Fin 1 ⊕ Fin 3) : + c d = ((4 : ℂ)⁻¹ * ∑ e, ((minkowskiMatrixZ (e 0) (e 1) : ℤ) : ℂ) * c e) + * ((minkowskiMatrixZ (d 0) (d 1) : ℤ) : ℂ) := by + have hQ : ∑ e, ((Q d e : ℤ) : ℂ) * c e = (192 : ℂ) * c d := by + have h1 := pow_mul_eq_sum_pow_boostAverageZ hc 1 d + have h2 := pow_mul_eq_sum_pow_boostAverageZ hc 2 d + have h3 := pow_mul_eq_sum_pow_boostAverageZ hc 3 d + simp only [pow_one] at h1 + rw [show (∑ 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 -/-- A vector of the span of 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, ((minkowskiMatrixZ (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 * ((minkowskiMatrixZ (d 0) (d 1) : ℤ) : ℂ) - * ((minkowskiMatrixZ (e 0) (e 1) : ℤ) : ℂ) := fun e => by - rw [Q_explicit, Matrix.of_apply] - push_cast + + 40 * (∑ e, ((boostAverageZ d e : ℤ) : ℂ) * c e) from by + simp only [Finset.mul_sum, ← Finset.sum_sub_distrib, ← Finset.sum_add_distrib] + refine Finset.sum_congr rfl fun e _ => ?_ + rw [Q_eq_poly] + push_cast [Matrix.sub_apply, Matrix.add_apply, Matrix.smul_apply, smul_eq_mul] + ring, ← h1, ← h2, ← h3] ring rw [show (∑ e, ((Q d e : ℤ) : ℂ) * c e) = 48 * ((minkowskiMatrixZ (d 0) (d 1) : ℤ) : ℂ) * ∑ e, ((minkowskiMatrixZ (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 + refine Finset.sum_congr rfl fun e _ => ?_ + rw [Q_explicit, Matrix.of_apply] + push_cast + ring] at hQ + linear_combination -hQ / 192 /-! @@ -660,9 +467,11 @@ include hT in 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 (rep := repLorentz) hinv)⟩ + obtain ⟨c, hc, rfl⟩ := hT.exists_isInvariantCoeff_of_mem_span hx hinv + refine ⟨(4 : ℂ)⁻¹ * ∑ e, ((minkowskiMatrixZ (e 0) (e 1) : ℤ) : ℂ) * c e, ?_⟩ + rw [metricContraction, Finset.smul_sum] + refine Finset.sum_congr rfl fun d _ => ?_ + rw [smul_smul, ← eq_smul_minkowskiMatrixZ hc d] /-! diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsLeftRightWeyl.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsLeftRightWeyl.lean index d7d3feb14..0d5126614 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsLeftRightWeyl.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsLeftRightWeyl.lean @@ -22,14 +22,16 @@ The components are vectors `T a` of a complex vector space `B` carrying a repres the group moves the left index by the matrix of `g` and the right index by its complex conjugate (C). `hT.span` is the set of their combinations. -The proof follows the four-vector one with the light-cone basis replaced by Weyl weight -bases. Along a spatial axis the `SL(2,ℂ)` boost is the diagonal `z`-boost conjugated by -`rotationZToAxis i`, so the columns of that rotation are boost eigenvectors of weight -`±1` (A), and the four products of a left and a right eigenvector carry weights `2`, `0`, -`0`, `-2` (B). An invariant has weight `0` along every axis, so it is fixed by the -weight-zero projection along each (D); averaging the three gives a matrix `M` with -`M ^ 2 = 2 M` and no eigenvalue `3` (E), so `3 λ ^ 2 - 2 λ` at `λ = M / 3` annihilates -every invariant (F). Section G divides out `S`. +An invariant of the span is `∑_a c_a • T a` for a coefficient function `c` that the group +itself fixes (C, from `Invariants.Basic`), and the proof then follows the four-vector one with +the light-cone basis replaced by Weyl weight bases. Along a spatial axis the `SL(2,ℂ)` boost is +the diagonal `z`-boost conjugated by `rotationZToAxis i`, so the columns of that rotation are +boost eigenvectors of weight `±1` (A). The coefficients transform contragrediently, so their +weight basis conjugates the left slot and not the right, the opposite of the components; the +four products of a left and a right eigenvector carry weights `2`, `0`, `0`, `-2` (B). An +invariant has weight `0` along every axis, so it is fixed by the weight-zero projection along +each (D); averaging the three gives a matrix `M` with `M ^ 2 = 2 M` (E), and an invariant would +need `M c = 3 c`, which forces `c = 0` (F). Section G divides out `S`. A family carrying dual Weyl indices transforms by the contragredient `(Λ⁻¹)ᵀ` on the undotted slot and by `(Λ⁻¹)ᴴ` on the dotted one. That law is `IsDualLeftRightWeyl` here; @@ -41,7 +43,7 @@ its classification, still that there is no invariant, hence no Dirac mass term, namespace Lorentz -open TensorProduct Matrix MatrixGroups SL2C BoostWeight +open TensorProduct Matrix MatrixGroups SL2C Invariants open IsQuadLorentz (quotRep quotRep_mkQ) /-! @@ -134,21 +136,18 @@ lemma sum_boostAxis_weylCoeffC (i : Fin 3) (κ β : Fin 2) {t : ℝ} (ht : t ≠ /-! -## B. The weight basis of a left-right pair +## B. The weight basis of the coefficients 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. +product of the two, and its weight is the sum of the two Weyl weights. What is graded here is +the coefficient function, which transforms contragrediently, so its left slot takes the +conjugated basis and its right slot the plain one, the opposite of the components. -/ /-- 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 κ @@ -157,54 +156,53 @@ lemma sum_weightZeroFilter {M : Type*} [AddCommMonoid M] (f : Fin 2 × Fin 2 → = {(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. -/ +/-- The axis-`i` weight basis of the coefficients of a left-right pair of indices. -/ def pairCoeff (i : Fin 3) (κ α : Fin 2 × Fin 2) : ℂ := - weylCoeff i κ.1 α.1 * weylCoeffC i κ.2 α.2 + weylCoeffC i κ.1 α.1 * weylCoeff i κ.2 α.2 -/-- The standard basis of a left-right pair written back in the axis-`i` weight - basis. -/ +/-- The standard basis of the coefficients 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 + weylCoeffInvC i α.1 κ.1 * weylCoeffInv 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) + have hfac : (∑ κ₁, weylCoeffInvC i α.1 κ₁ * weylCoeffC i κ₁ β.1) + * (∑ κ₂, weylCoeffInv i α.2 κ₂ * weylCoeff 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] + rw [← hfac, sum_weylCoeffInvC_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 +/-- The pair weight basis diagonalises the axis-`i` boost on coefficients, 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 +lemma sum_boostAxis_pairCoeff (i : Fin 3) (κ l : Fin 2 × Fin 2) {t : ℝ} (ht : t ≠ 0) : + ∑ a : Fin 2 × Fin 2, pairCoeff i κ a * ((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 + = ((t : ℝ) : ℂ) ^ (pairWeight κ) * pairCoeff i κ l := 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 + have hfac : (∑ a₁, star ((SL2C.boostAxis i t ht).1 l.1 a₁) * weylCoeffC i κ.1 a₁) + * (∑ a₂, (SL2C.boostAxis i t ht).1 l.2 a₂ * weylCoeff i κ.2 a₂) + = ∑ a : Fin 2 × Fin 2, pairCoeff i κ a * ((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, + refine Finset.sum_congr rfl fun a₁ _ => Finset.sum_congr rfl fun a₂ _ => ?_ + simp only [pairCoeff, star_boostAxis_apply] + ring + rw [← hfac, sum_boostAxis_weylCoeffC i κ.1 l.1 ht, sum_boostAxis_weylCoeff i κ.2 l.2 ht, pairWeight, pairCoeff, zpow_add₀ htc] ring /-! -## C. Left-right bispinors and the span of their components +## C. Left-right bispinors, their span, and coefficient functions `IsLeftRightWeyl B repLorentz T` says the group moves the left index of `T^{α α'}` by the matrix of `g` and the right index by its complex conjugate, and `hT.span` is the set of @@ -239,158 +237,110 @@ lemma mem_span_iff (x : B) : LinearMap.mem_range] simp only [Fintype.linearCombination_apply, eq_comm] +/-- The action of `g : SL(2,ℂ)` on coefficient functions: the left slot moves by `g` and the + right by its conjugate, with the free index first in each factor and the summed one second. -/ +def act (g : SL(2,ℂ)) (c : Fin 2 × Fin 2 → ℂ) (a : Fin 2 × Fin 2) : ℂ := + ∑ d : Fin 2 × Fin 2, c d * (g.1 a.1 d.1 * star (g.1 a.2 d.2)) + +/-- A coefficient function fixed by every `g : SL(2,ℂ)`. -/ +def IsInvariantCoeff (c : Fin 2 × Fin 2 → ℂ) : Prop := ∀ g : SL(2,ℂ), act g c = c + +include hT in +/-- An invariant of the span is the contraction of an invariant coefficient function: the + adjoint of the action of `g` is the action of `g†`. -/ +theorem exists_isInvariantCoeff_of_mem_span {x : B} (hx : x ∈ hT.span) + (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : + ∃ c : Fin 2 × Fin 2 → ℂ, IsInvariantCoeff c ∧ x = ∑ d, c d • T d := by + obtain ⟨c, hc, hx'⟩ := Invariants.exists_invariantCoeff_matrix T (fun g => repLorentz g) + (fun g a d => g.1 a.1 d.1 * star (g.1 a.2 d.2)) hT.repLorentz_T + (fun g => ⟨Invariants.dagger g, fun a d => by + simp [Invariants.dagger, Matrix.conjTranspose_apply, mul_comm]⟩) + (by rwa [← span]) hinv + exact ⟨c, hc, hx'⟩ + /-! -## D. The weight grading of the span +## D. The weight grading of the coefficients -The four products `weightVec i κ` of a left and a right weight vector span the same space -as the components and are boost eigenvectors along the axis `i`, of weights `2`, `0`, `0` -and `-2`. +The four products `pairCoeff i κ` of a left and a right weight covector read off the weight +components of a coefficient function, and the axis-`i` boost multiplies the component at `κ` +by `t ^ pairWeight κ`. An invariant function therefore has no component of weight `±2`, and is +recovered from its two weight-zero components alone. -/ -set_option linter.unusedVariables false in -/-- The weight component of `T` along axis `i` at the pair `κ` of Weyl weight indices; - `hT` is present only so it reads `hT.weightVec`. -/ -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 axis-`i` weight component of a coefficient function at the pair `κ`. -/ +def weightComponent (i : Fin 3) (c : Fin 2 × Fin 2 → ℂ) (κ : Fin 2 × Fin 2) : ℂ := + ∑ a : Fin 2 × Fin 2, pairCoeff i κ a * c a -/-- 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 +/-- The axis-`i` boost multiplies the weight component at `κ` by `t ^ pairWeight κ`. -/ +lemma weightComponent_act_boostAxis (i : Fin 3) (c : Fin 2 × Fin 2 → ℂ) + (κ : Fin 2 × Fin 2) {t : ℝ} (ht : t ≠ 0) : + weightComponent i (act (SL2C.boostAxis i t ht) c) κ + = ((t : ℝ) : ℂ) ^ (pairWeight κ) * weightComponent i c κ := by + simp only [weightComponent, act, Finset.mul_sum] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun d _ => ?_ + calc ∑ a : Fin 2 × Fin 2, pairCoeff i κ a * (c d * ((SL2C.boostAxis i t ht).1 a.1 d.1 + * star ((SL2C.boostAxis i t ht).1 a.2 d.2))) + = c d * ∑ a : Fin 2 × Fin 2, pairCoeff i κ a * ((SL2C.boostAxis i t ht).1 a.1 d.1 + * star ((SL2C.boostAxis i t ht).1 a.2 d.2)) := by + rw [Finset.mul_sum] + exact Finset.sum_congr rfl fun a _ => by ring + _ = _ := by rw [sum_boostAxis_pairCoeff i κ d ht]; ring + +/-- An invariant coefficient function has no weight component of nonzero weight. -/ +lemma weightComponent_eq_zero {c : Fin 2 × Fin 2 → ℂ} (hc : IsInvariantCoeff c) (i : Fin 3) + {κ : Fin 2 × Fin 2} (hκ : pairWeight κ ≠ 0) : weightComponent i c κ = 0 := by + have h := weightComponent_act_boostAxis i c κ (two_ne_zero (α := ℝ)) + rw [hc] at h + have h2 : ((2 : ℝ) : ℂ) ^ (pairWeight κ) ≠ 1 := by + rw [← Complex.ofReal_zpow, Ne, Complex.ofReal_eq_one, + zpow_eq_one_iff_right₀ (by norm_num) (by norm_num)] + exact hκ + exact (mul_left_eq_self₀.1 h.symm).resolve_left h2 + +/-- A coefficient function is recovered from its weight components. -/ +lemma eq_sum_weightComponent (i : Fin 3) (c : Fin 2 × Fin 2 → ℂ) (α : Fin 2 × Fin 2) : + c α = ∑ κ : Fin 2 × Fin 2, pairCoeffInv i α κ * weightComponent i c κ := by + simp only [weightComponent, Finset.mul_sum, ← mul_assoc] + rw [Finset.sum_comm] + simp only [← Finset.sum_mul, sum_pairCoeffInv_mul, ite_mul, one_mul, zero_mul, + Finset.sum_ite_eq, Finset.mem_univ, if_true] /-! ## E. The weight-zero round and its average over the axes -An invariant has boost weight zero along every axis, so along each axis it equals its own -weight-zero part, which written back on the components is the matrix -`weightZeroTransition i`. +Keeping only the weight-zero components writes an invariant coefficient function as one matrix +per axis applied to itself, and the three average to a matrix with a short closed form. -/ -/-- 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) : ℂ := +/-- The matrix of the axis-`i` weight-zero projection on coefficient functions. -/ +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] +/-- An invariant coefficient function is fixed by the axis-`i` weight-zero projection. -/ +lemma eq_sum_weightZeroTransition {c : Fin 2 × Fin 2 → ℂ} (hc : IsInvariantCoeff c) (i : Fin 3) + (α : Fin 2 × Fin 2) : c α = ∑ β, weightZeroTransition i α β * c β := by + have hfil : ∀ κ ∈ Finset.univ.filter (fun κ : Fin 2 × Fin 2 => ¬ pairWeight κ = 0), + pairCoeffInv i α κ * weightComponent i c κ = 0 := + fun κ hκ => by rw [weightComponent_eq_zero hc i (Finset.mem_filter.1 hκ).2, mul_zero] + rw [eq_sum_weightComponent i c α, ← Finset.sum_filter_add_sum_filter_not Finset.univ + (fun κ : Fin 2 × Fin 2 => pairWeight κ = 0), Finset.sum_eq_zero hfil, add_zero] + simp only [weightComponent, weightZeroTransition, Finset.mul_sum, Finset.sum_mul, ← mul_assoc] rw [Finset.sum_comm] - refine Finset.sum_congr rfl fun β _ => ?_ - rw [← Finset.sum_smul, weightZeroTransition] -include hT in -/-- A vector of boost weight zero along axis `i` is written with the weight-zero transition - 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 _ _) +/-! + +## F. The quadratic certificate and the classification + +The summed transition `M` satisfies `M ^ 2 = 2 M`, while an invariant coefficient function +would have to satisfy `M c = 3 c`. Only `c = 0` does both. + +-/ /-- The closed form of the summed weight-zero transition: twice the identity minus the outer product of the two diagonal indicators. -/ @@ -410,44 +360,6 @@ lemma sum_weightZeroTransition_eq (β α : Fin 2 × Fin 2) : weylCoeffInv, weylCoeffInvC] <;> norm_num [Complex.ext_iff] -include hT in -/-- A vector of boost weight zero along all three axes is written with a third of the summed - transition 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 `M / 3` has eigenvalues `2/3` and -`0`, never the `1` an invariant would need: `3 λ ^ 2 - 2 λ` 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 α @@ -482,35 +394,40 @@ lemma applyTransition_applyTransition (c : Fin 2 × Fin 2 → ℂ) (β : Fin 2 simp only [applyTransition, Finset.mul_sum] exact Finset.sum_congr rfl fun α _ => by ring +/-- An invariant coefficient function is `3` times its averaged round, so it is an eigenvector + of the summed transition for the eigenvalue `3`. -/ +lemma applyTransition_eq_three_smul {c : Fin 2 × Fin 2 → ℂ} (hc : IsInvariantCoeff c) + (β : Fin 2 × Fin 2) : applyTransition c β = 3 * c β := by + have h3 : ∑ i : Fin 3, ∑ α, weightZeroTransition i β α * c α = 3 * c β := by + rw [Fin.sum_univ_three, ← eq_sum_weightZeroTransition hc 0 β, + ← eq_sum_weightZeroTransition hc 1 β, ← eq_sum_weightZeroTransition hc 2 β] + ring + rw [← h3, applyTransition, Finset.sum_comm] + exact Finset.sum_congr rfl fun α _ => by rw [← Finset.sum_mul, sum_weightZeroTransition_eq] + +/-- An invariant coefficient function is zero: `3` is not an eigenvalue of a matrix squaring + to twice itself unless the eigenvector is. -/ +lemma eq_zero_of_isInvariantCoeff {c : Fin 2 × Fin 2 → ℂ} (hc : IsInvariantCoeff c) : c = 0 := by + funext β + show c β = 0 + have h9 : applyTransition (applyTransition c) β = 9 * c β := by + rw [show applyTransition c = fun γ => 3 * c γ from + funext fun γ => applyTransition_eq_three_smul hc γ, applyTransition_const_mul, + applyTransition_eq_three_smul hc] + ring + have h6 : applyTransition (applyTransition c) β = 6 * c β := by + rw [applyTransition_applyTransition, applyTransition_eq_three_smul hc] + ring + rw [h9] at h6 + linear_combination h6 / 3 + include hT in /-- Every Lorentz invariant in the span of the components is zero: the pair of indices carries the four-vector representation, which has no invariant contraction. -/ 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 (rep := 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] + obtain ⟨c, hc, rfl⟩ := hT.exists_isInvariantCoeff_of_mem_span hx hinv + simp [eq_zero_of_isInvariantCoeff hc] /-! diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean index 28a724661..b21add045 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean @@ -5,9 +5,8 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Relativity.LightConeDeriv +public import Physlib.Relativity.LorentzGroup.Invariants.Basic public import Physlib.Mathematics.LeviCivita.Basic -public import Mathlib.Analysis.InnerProductSpace.Projection.Basic public import Mathlib.LinearAlgebra.Matrix.Determinant.Basic -- Not used here; `Peeling` reaches it through this file. public import Physlib.Relativity.IsLorentzDeriv @@ -44,7 +43,7 @@ integer equation left being solved by one checked matrix identity (F, G). namespace Lorentz -open Matrix MatrixGroups SL2C BoostWeight +open Matrix MatrixGroups SL2C Invariants /-! @@ -61,7 +60,8 @@ with `l` free and `a` summed, and transforming a contraction moves its coefficie (`repLorentz_sum_smul`): the same `Λ`, never its inverse, but transposed index slots, which is what makes `act Λᵀ` the adjoint of `act Λ` in C. Two invariance conditions are therefore in play, kept apart by name: `x : B` is Lorentz invariant when `repLorentz g x = x`, and `c` is -`IsInvariantCoeff` when `act Λ c = c`. +`IsInvariantCoeff` when `act Λ c = c`. Everything in this paragraph, and section C below, is +stated for any number of slots in `Invariants.Basic` and used here at four. -/ /-- A family `T` of vectors of `B`, one per index vector, which `repLorentz` moves the way the @@ -96,32 +96,6 @@ lemma mem_span_iff (x : B) : lemma sum_smul_mem_span (c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ) : ∑ d, c d • T d ∈ hT.span := (hT.mem_span_iff _).2 ⟨c, rfl⟩ -/-- The action of a real `4 × 4` matrix on coefficient tensors, one factor per slot: - `(act Λ c) a = ∑_d c_d Λ_{a₀ d₀} ⋯ Λ_{a₃ d₃}`, with `a` free and `d` summed. Same `Λ` as on - the components, never its inverse, but with the free index in the first slot, not the second. -/ -def act (Λ : Matrix (Fin 1 ⊕ Fin 3) (Fin 1 ⊕ Fin 3) ℝ) (c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ) - (a : Fin 4 → Fin 1 ⊕ Fin 3) : ℂ := - ∑ d, c d * ∏ s, ((Λ (a s) (d s) : ℝ) : ℂ) - -include hT in -/-- Transforming a contraction is the same as contracting the transformed coefficient tensor. -/ -lemma repLorentz_sum_smul (g : SL(2,ℂ)) (c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ) : - repLorentz g (∑ d, c d • T d) = ∑ a, act (SL2C.toLorentzGroup g).1 c a • T a := by - simp only [map_sum, map_smul, hT.repLorentz_T, Finset.smul_sum, smul_smul, act, - Finset.sum_smul] - exact Finset.sum_comm - -/-- A coefficient tensor fixed by `act` of the Lorentz matrix of every `g : SL(2,ℂ)`. -/ -def IsInvariantCoeff (c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ) : Prop := - ∀ g : SL(2,ℂ), act (SL2C.toLorentzGroup g).1 c = c - -include hT in -/-- Contracting with an invariant coefficient tensor gives a Lorentz invariant vector. -/ -lemma repLorentz_sum_smul_of_isInvariantCoeff {c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ} - (hc : IsInvariantCoeff c) (g : SL(2,ℂ)) : - repLorentz g (∑ d, c d • T d) = ∑ d, c d • T d := by - rw [hT.repLorentz_sum_smul, hc g] - /-! ## B. The four contractions @@ -333,7 +307,8 @@ include hT in lemma repLorentz_contraction (i : Fin 4) (g : SL(2,ℂ)) : repLorentz g (contraction T i) = contraction T i := by rw [contraction_eq, - hT.repLorentz_sum_smul_of_isInvariantCoeff (isInvariantCoeff_contractionCoeff i)] + Invariants.repLorentz_sum_smul_of_isInvariantCoeff hT.repLorentz_T + (isInvariantCoeff_contractionCoeff i)] include hT in /-- The outer contraction is Lorentz invariant. -/ @@ -379,67 +354,19 @@ determined by `x` and need not be invariant. Let `K` be the coefficient tensors Give `ℂ^{256}` the standard inner product `∑_d conj(u_d) v_d`, positive definite and unrelated to `η`, written `EuclideanSpace ℂ (Fin 4 → Fin 1 ⊕ Fin 3)`, where `WithLp.toLp 2` and `.ofLp` only move to and from the plain function type. The complement `Kᗮ` is preserved too, since -`act Λ` across the inner product becomes `act Λᵀ` (`inner_act_eq_inner_act_transpose`) and `Λᵀ` +`act Λ` across the inner product becomes `act Λᵀ` (`Invariants.inner_actMat`) and `Λᵀ` is again such a matrix, that of `g†`; the action is not unitary, and is not used to be. So keep the `Kᗮ` part of `c`: it still contracts to `x`, and acting on it changes it by an element of -`K` and of `Kᗮ`, hence by `0` (`exists_isInvariantCoeff_of_mem_span`). +`K` and of `Kᗮ`, hence by `0`. The argument is the same for any number of slots and is carried +out there, `exists_isInvariantCoeff_of_mem_span` below being the reading of it for four. -/ -/-- The conjugate transpose `g†`, again in `SL(2,ℂ)`. -/ -def dagger (g : SL(2,ℂ)) : SL(2,ℂ) := ⟨g.1ᴴ, by rw [Matrix.det_conjTranspose, g.2, star_one]⟩ - -/-- The Lorentz matrix of `g†` is the transpose of that of `g`. -/ -lemma toLorentzGroup_dagger (g : SL(2,ℂ)) : - (SL2C.toLorentzGroup (dagger g)).1 = (SL2C.toLorentzGroup g).1ᵀ := - SL2C.toLorentzGroup_conjTranspose rfl - -/-- Contraction with the components, as a linear map on the inner product space. -/ -noncomputable def contractₗ (T : (Fin 4 → Fin 1 ⊕ Fin 3) → B) : - EuclideanSpace ℂ (Fin 4 → Fin 1 ⊕ Fin 3) →ₗ[ℂ] B where - toFun c := ∑ d, c.ofLp d • T d - map_add' c c' := by - simp only [WithLp.ofLp_add, Pi.add_apply, add_smul, Finset.sum_add_distrib] - map_smul' z c := by - simp only [WithLp.ofLp_smul, Pi.smul_apply, smul_eq_mul, RingHom.id_apply, Finset.smul_sum, - smul_smul] - -open scoped InnerProductSpace in -/-- Across the standard inner product the action of a real matrix `Λ` becomes that of `Λᵀ`. -/ -lemma inner_act_eq_inner_act_transpose (Λ : Matrix (Fin 1 ⊕ Fin 3) (Fin 1 ⊕ Fin 3) ℝ) - (u v : EuclideanSpace ℂ (Fin 4 → Fin 1 ⊕ Fin 3)) : - ⟪u, WithLp.toLp 2 (act Λ v.ofLp)⟫_ℂ = ⟪WithLp.toLp 2 (act Λᵀ u.ofLp), v⟫_ℂ := by - simp only [PiLp.inner_apply, RCLike.inner_apply, act, Matrix.transpose_apply, map_sum, - map_mul, map_prod, Complex.conj_ofReal, Finset.mul_sum, Finset.sum_mul] - rw [Finset.sum_comm] - exact Finset.sum_congr rfl fun a _ => Finset.sum_congr rfl fun d _ => by ring - include hT in /-- An invariant of the span is the contraction of an invariant coefficient tensor. -/ theorem exists_isInvariantCoeff_of_mem_span {x : B} (hx : x ∈ hT.span) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : - ∃ c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ, IsInvariantCoeff c ∧ x = ∑ d, c d • T d := by - obtain ⟨c, rfl⟩ := (hT.mem_span_iff x).1 hx - have hcontr : ∀ (g : SL(2,ℂ)) (u : EuclideanSpace ℂ (Fin 4 → Fin 1 ⊕ Fin 3)), - contractₗ T (WithLp.toLp 2 (act (SL2C.toLorentzGroup g).1 u.ofLp)) - = repLorentz g (contractₗ T u) := - fun g u => (hT.repLorentz_sum_smul g u.ofLp).symm - set K := LinearMap.ker (contractₗ T) with hK - obtain ⟨k, hk, k', hk', hkk'⟩ := K.exists_add_mem_mem_orthogonal (WithLp.toLp 2 c) - have hx' : ∑ d, c d • T d = contractₗ T k' := by - have h := congrArg (contractₗ T) hkk' - rwa [map_add, LinearMap.mem_ker.1 hk, zero_add] at h - refine ⟨k'.ofLp, fun g => ?_, hx'⟩ - have h1 : WithLp.toLp 2 (act (SL2C.toLorentzGroup g).1 k'.ofLp) - k' ∈ K := by - rw [hK, LinearMap.mem_ker, map_sub, hcontr, ← hx', hinv, hx', sub_self] - have h2 : WithLp.toLp 2 (act (SL2C.toLorentzGroup g).1 k'.ofLp) ∈ Kᗮ := by - refine (Submodule.mem_orthogonal _ _).2 fun u hu => ?_ - rw [inner_act_eq_inner_act_transpose, ← toLorentzGroup_dagger] - refine Submodule.inner_right_of_mem_orthogonal (K := K) ?_ hk' - rw [hK, LinearMap.mem_ker, hcontr, LinearMap.mem_ker.1 hu, map_zero] - have h3 : WithLp.toLp 2 (act (SL2C.toLorentzGroup g).1 k'.ofLp) - k' ∈ K ⊓ Kᗮ := - ⟨h1, Submodule.sub_mem _ h2 hk'⟩ - rw [Submodule.inf_orthogonal_eq_bot, Submodule.mem_bot, sub_eq_zero] at h3 - exact congrArg WithLp.ofLp h3 + ∃ c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ, IsInvariantCoeff c ∧ x = ∑ d, c d • T d := + Invariants.exists_isInvariantCoeff_of_mem_span hT.repLorentz_T hx hinv /-! @@ -510,7 +437,7 @@ instance : DecidablePred IsFlipFixed := fun d => inferInstanceAs (Decidable (∀ k : Fin 3, ∏ s, flipSign k (d s) = 1)) /-- An invariant coefficient tensor vanishes off the flip-fixed index vectors. -/ -lemma IsInvariantCoeff.eq_zero_of_not_isFlipFixed {c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ} +lemma eq_zero_of_not_isFlipFixed {c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ} (hc : IsInvariantCoeff c) {d : Fin 4 → Fin 1 ⊕ Fin 3} (hd : ¬IsFlipFixed d) : c d = 0 := by obtain ⟨k, hk⟩ := not_forall.1 hd have h := congrFun (hc (flipAxis k)) d @@ -541,7 +468,7 @@ lemma act_rotationCycle (c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ) (a : Fin 4 → · exact fun h => absurd (Finset.mem_univ _) h /-- An invariant coefficient tensor is constant on the orbits of the cyclic rotation. -/ -lemma IsInvariantCoeff.apply_cycIdx {c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ} (hc : IsInvariantCoeff c) +lemma apply_cycIdx {c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ} (hc : IsInvariantCoeff c) (d : Fin 4 → Fin 1 ⊕ Fin 3) : c (cycIdx d) = c d := by have h := congrFun (hc rotationCycle) (cycIdx d) rw [act_rotationCycle, cycIdx_cycIdx_cycIdx] at h @@ -564,43 +491,6 @@ slot and `lightConeComponent i c κ` contracts `c` against that choice; the boos what they force is enough. -/ -/-- A light-cone component: `c` contracted against one light-cone direction per slot. -/ -def lightConeComponent (i : Fin 3) (c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ) (κ : Fin 4 → Fin 4) : ℂ := - ∑ a, (∏ s, lightConeCoeff i (κ s) (a s)) * c a - -/-- The Lorentz matrix of a boost is symmetric. -/ -lemma toLorentzGroup_boostAxis_symm (i : Fin 3) {t : ℝ} (ht : t ≠ 0) (a b : Fin 1 ⊕ Fin 3) : - (SL2C.toLorentzGroup (SL2C.boostAxis i t ht)).1 a b - = (SL2C.toLorentzGroup (SL2C.boostAxis i t ht)).1 b a := - congrFun (congrFun - (SL2C.toLorentzGroup_conjTranspose (SL2C.boostAxis_conjTranspose i t ht).symm) a) b - -/-- The boost with parameter `t` multiplies a light-cone component by `t` to the weight of `κ`. -/ -lemma lightConeComponent_act_boostAxis (i : Fin 3) (c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ) - (κ : Fin 4 → Fin 4) {t : ℝ} (ht : t ≠ 0) : - lightConeComponent i (act (SL2C.toLorentzGroup (SL2C.boostAxis i t ht)).1 c) κ - = ((t : ℝ) : ℂ) ^ (∑ s, lightConeWeight (κ s)) * lightConeComponent i c κ := by - simp only [lightConeComponent, act, Finset.mul_sum] - rw [Finset.sum_comm] - refine Finset.sum_congr rfl fun d _ => ?_ - have h := sum_prod_lightConeCoeff i κ d ht - simp only [toLorentzGroup_boostAxis_symm i ht (d _)] at h - rw [← mul_assoc, mul_comm _ (c d), ← h, Finset.mul_sum] - exact Finset.sum_congr rfl fun a _ => by ring - -/-- An invariant coefficient tensor has no light-cone component of nonzero weight. -/ -lemma IsInvariantCoeff.lightConeComponent_eq_zero {c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ} - (hc : IsInvariantCoeff c) (i : Fin 3) {κ : Fin 4 → Fin 4} - (hκ : ∑ s, lightConeWeight (κ s) ≠ 0) : - lightConeComponent i c κ = 0 := by - have h := lightConeComponent_act_boostAxis i c κ (two_ne_zero (α := ℝ)) - rw [hc] at h - have h2 : ((2 : ℝ) : ℂ) ^ (∑ s, lightConeWeight (κ s)) ≠ 1 := by - rw [← Complex.ofReal_zpow, Ne, Complex.ofReal_eq_one, - zpow_eq_one_iff_right₀ (by norm_num) (by norm_num)] - exact hκ - exact (mul_left_eq_self₀.1 h.symm).resolve_left h2 - /-! ## E.2. The weight-zero projection @@ -720,17 +610,8 @@ lemma transitionZ_eq_sum (i : Fin 3) : simp only [Fin.consEquiv_apply, Fin.sum_univ_succ, Fin.prod_univ_succ, Fin.cons_zero, Fin.cons_succ] -/-- A coefficient tensor is recovered from its light-cone components. -/ -lemma eq_sum_lightConeComponent (i : Fin 3) (c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ) - (d : Fin 4 → Fin 1 ⊕ Fin 3) : - c d = ∑ κ, (∏ s, lightConeCoeffInv i (d s) (κ s)) * lightConeComponent i c κ := by - simp only [lightConeComponent, Finset.mul_sum, ← mul_assoc] - rw [Finset.sum_comm] - simp only [← Finset.sum_mul, sum_prod_lightConeCoeffInv, ite_mul, one_mul, zero_mul, - Finset.sum_ite_eq, Finset.mem_univ, if_true] - /-- An invariant coefficient tensor is its own weight-zero projection. -/ -lemma IsInvariantCoeff.sixteen_mul_eq_sum_transitionZ {c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ} +lemma sixteen_mul_eq_sum_transitionZ {c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ} (hc : IsInvariantCoeff c) (i : Fin 3) (d : Fin 4 → Fin 1 ⊕ Fin 3) : 16 * c d = ∑ e, ((transitionZ i d e 0 : ℤ) : ℂ) * c e := by rw [eq_sum_lightConeComponent i c d, ← Finset.sum_filter_add_sum_filter_not Finset.univ @@ -820,16 +701,16 @@ noncomputable def ofOrbitCoord (b : Fin 22 → ℂ) (d : Fin 4 → Fin 1 ⊕ Fin ∑ k, if d ∈ orbit k then b k else 0 /-- An invariant coefficient tensor is rebuilt from its `22` orbit coordinates. -/ -lemma IsInvariantCoeff.eq_ofOrbitCoord {c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ} (hc : IsInvariantCoeff c) : +lemma eq_ofOrbitCoord {c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ} (hc : IsInvariantCoeff c) : c = ofOrbitCoord fun k => c (orbitRep k) := by funext d by_cases hd : IsFlipFixed d · obtain ⟨k, hk⟩ := (isFlipFixed_iff_exists_mem_orbit d).1 hd rw [ofOrbitCoord, Finset.sum_eq_single k, if_pos hk, - eq_orbitRep_of_mem_orbit hc.apply_cycIdx hk] + eq_orbitRep_of_mem_orbit (apply_cycIdx hc) hk] · exact fun l _ hl => if_neg fun hdl => hl (eq_of_mem_orbit hdl hk) · exact fun h => absurd (Finset.mem_univ k) h - · rw [hc.eq_zero_of_not_isFlipFixed hd] + · rw [eq_zero_of_not_isFlipFixed hc hd] exact (Finset.sum_eq_zero fun k _ => if_neg fun hk => hd ((isFlipFixed_iff_exists_mem_orbit d).2 ⟨k, hk⟩)).symm @@ -901,22 +782,22 @@ lemma orbitMatrix_apply : ∀ k l : Fin 22, decide +kernel /-- The orbit coordinates of an invariant coefficient tensor satisfy `M b = 48 b`. -/ -lemma IsInvariantCoeff.orbitMatrix_mulVec {c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ} +lemma orbitMatrix_mulVec {c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ} (hc : IsInvariantCoeff c) : orbitMatrix.map (Int.cast : ℤ → ℂ) *ᵥ (fun k => c (orbitRep k)) = (48 : ℂ) • fun k => c (orbitRep k) := by have h : ∀ d, 16 * c d = ∑ l, (∑ e ∈ orbit l, ((transitionZ 2 d e 0 : ℤ) : ℂ)) * c (orbitRep l) := by intro d - rw [hc.sixteen_mul_eq_sum_transitionZ 2 d] - conv_lhs => rw [hc.eq_ofOrbitCoord] + rw [sixteen_mul_eq_sum_transitionZ hc 2 d] + conv_lhs => rw [eq_ofOrbitCoord hc] exact sum_mul_ofOrbitCoord _ _ funext k have h₀ := h (orbitRep k) have h₁ := h (cycIdx (orbitRep k)) have h₂ := h (cycIdx (cycIdx (orbitRep k))) - rw [hc.apply_cycIdx] at h₁ - rw [hc.apply_cycIdx, hc.apply_cycIdx] at h₂ + rw [apply_cycIdx hc] at h₁ + rw [apply_cycIdx hc, apply_cycIdx hc] at h₂ simp only [Matrix.mulVec, dotProduct, Matrix.map_apply, orbitMatrix_apply, Pi.smul_apply, smul_eq_mul, Int.cast_sum, Int.cast_add, Finset.sum_add_distrib, add_mul] linear_combination -(h₀ + h₁ + h₂) @@ -972,13 +853,13 @@ lemma certificate : decide +kernel /-- `24` times the orbit coordinates of an invariant tensor is `projector` applied to them. -/ -lemma IsInvariantCoeff.orbitCoord_eq {c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ} (hc : IsInvariantCoeff c) +lemma orbitCoord_eq {c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ} (hc : IsInvariantCoeff c) (k : Fin 22) : 24 * c (orbitRep k) = ∑ i, (contractionOrbit i k : ℂ) * ∑ l, (contractionWeight i l : ℂ) * c (orbitRep l) := by set b : Fin 22 → ℂ := fun k => c (orbitRep k) with hb set M : Matrix (Fin 22) (Fin 22) ℂ := orbitMatrix.map (Int.cast : ℤ → ℂ) with hM - have hMb : M *ᵥ b = (48 : ℂ) • b := hc.orbitMatrix_mulVec + have hMb : M *ᵥ b = (48 : ℂ) • b := orbitMatrix_mulVec hc have hlin : ∀ z : ℂ, (M - z • 1) *ᵥ b = (48 - z) • b := fun z => by rw [Matrix.sub_mulVec, hMb, Matrix.smul_mulVec, Matrix.one_mulVec, sub_smul] have hquad : (M * M - (44 : ℂ) • M + (192 : ℂ) • 1) *ᵥ b = (384 : ℂ) • b := by @@ -1022,16 +903,16 @@ lemma IsInvariantCoeff.orbitCoord_eq {c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ} ( exact mul_left_cancel₀ (by norm_num) hk' /-- An invariant coefficient tensor is a combination of the four. -/ -theorem IsInvariantCoeff.exists_eq_sum {c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ} (hc : IsInvariantCoeff c) : +theorem exists_eq_sum {c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ} (hc : IsInvariantCoeff c) : ∃ a : Fin 4 → ℂ, c = fun d => ∑ i, a i * ((contractionCoeff i d : ℤ) : ℂ) := by refine ⟨fun i => 24⁻¹ * ∑ l, (contractionWeight i l : ℂ) * c (orbitRep l), funext fun d => ?_⟩ have hfour : ∀ i d, ((contractionCoeff i d : ℤ) : ℂ) = ∑ k, if d ∈ orbit k then (contractionOrbit i k : ℂ) else 0 := - fun i d => congrFun (isInvariantCoeff_contractionCoeff i).eq_ofOrbitCoord d + fun i d => congrFun (eq_ofOrbitCoord (isInvariantCoeff_contractionCoeff i)) d have hb : ∀ k, c (orbitRep k) = 24⁻¹ * ∑ i, (contractionOrbit i k : ℂ) * ∑ l, (contractionWeight i l : ℂ) * c (orbitRep l) := - fun k => by rw [← hc.orbitCoord_eq]; ring - conv_lhs => rw [hc.eq_ofOrbitCoord, ofOrbitCoord] + fun k => by rw [← orbitCoord_eq hc]; ring + conv_lhs => rw [eq_ofOrbitCoord hc, ofOrbitCoord] rw [Finset.sum_congr rfl fun k _ => by rw [hb k]] simp only [hfour, Finset.mul_sum, mul_ite, mul_zero] rw [Finset.sum_comm] @@ -1062,7 +943,7 @@ theorem exists_smul_contraction_of_invariant {x : B} (hx : x ∈ hT.span) x = a₁ • outerContraction T + a₂ • innerContraction T + a₃ • splitContraction T + a₄ • epsilonContraction T := by obtain ⟨c, hc, rfl⟩ := hT.exists_isInvariantCoeff_of_mem_span hx hinv - obtain ⟨a, rfl⟩ := hc.exists_eq_sum + obtain ⟨a, rfl⟩ := exists_eq_sum hc refine ⟨a 0, a 1, a 2, a 3, ?_⟩ rw [← sum_smul_contraction] simp only [contraction_eq, Finset.smul_sum, Finset.sum_smul, smul_smul] @@ -1154,10 +1035,9 @@ theorem mem_span_sup_invariant_iff (x : B) (S : Submodule ℂ B) ## Aside: what other files import from here -None of this is used above. A vector has weight `m` along the axis `i` when the boost with -parameter `t` scales it by `t ^ m`, `boostWeightSubmodule` is the space of such vectors, an -invariant has weight `0` along every axis, and weights are independent. The rest repeats E over -`ℚ`, sorting the light-cone directions into sectors: raising `2`, lowering `-2`, transverse `0`. +None of this is used above. It repeats E over `ℚ`, sorting the light-cone directions into +sectors by weight, raising `2`, lowering `-2` and transverse `0`, which is the form +`IsBiLorentz` needs. -/ /-- The inverse light-cone coefficients of section E over `ℚ`, with the halves kept as halves. -/ diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsSingleLorentz.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsSingleLorentz.lean index 45d414789..5d0f3a836 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsSingleLorentz.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsSingleLorentz.lean @@ -6,45 +6,43 @@ 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 -A four-vector `T^{μ}` has no Lorentz invariant built from its four components but `0`. -There is nothing to contract it with: the metric takes two indices and the Levi-Civita -symbol four. That is `eq_zero_of_invariant`, and `mem_of_invariant_of_mem_sup` is the -same statement modulo a Lorentz-stable subspace `S`, the form the Standard Model files -use. +A four-vector `T^{μ}` has no Lorentz invariant built from its four components but `0`. There is +nothing to contract it with: the metric takes two indices and the Levi-Civita symbol four. That +is `eq_zero_of_invariant`, and `mem_of_invariant_of_mem_sup` is the same statement modulo a +Lorentz-stable subspace `S`, the form the Standard Model files use. The components are vectors `T d` of a complex vector space `B` carrying a representation -`repLorentz` of `SL(2,ℂ)`, indexed by one direction `d`, and `IsSingleLorentz` says the -group moves them by the Lorentz matrix (A). `hT.span` is the set of their combinations. - -The proof takes one boost at a time and needs no certificate. Along a spatial axis the -four light-cone directions carry boost weights `2`, `-2`, `0`, `0` (B), so an invariant, -having weight `0`, keeps only the coefficients of the two weight-zero directions, which -are the two directions transverse to time and to that axis (C). No direction is -transverse to all three axes, so running the three axes in turn leaves nothing (D). -Section E divides out `S`. +`repLorentz` of `SL(2,ℂ)`, indexed by one direction `d`, and `IsSingleLorentz` says the group +moves them by the Lorentz matrix (A). `hT.span` is the set of their combinations. + +An invariant of the span is `∑_d c_d • T d` for a coefficient tensor `c` that the Lorentz +matrices themselves fix (A, from `Invariants.Basic`). Along a spatial axis the four light-cone +directions carry boost weights `2`, `-2`, `0`, `0`, and an invariant `c` has no light-cone +component of nonzero weight, which with one index says `c_d = 0` unless `d` is one of the two +directions transverse to time and to that axis (B). No direction is transverse to all three +axes, so running the three axes in turn leaves `c = 0` (C). Section D divides out `S`. -/ @[expose] public section namespace Lorentz -open TensorProduct Matrix MatrixGroups SL2C BoostWeight -open IsQuadLorentz (lightConeCoeffZ coe_lightConeCoeffZ lightConeCoeffInvQ - coe_lightConeCoeffInvQ lightConeCoeffInvZ coe_lightConeCoeffInvZ quotRep quotRep_mkQ) +open TensorProduct Matrix MatrixGroups SL2C Invariants +open IsQuadLorentz (quotRep quotRep_mkQ) /-! -## A. Single Lorentz tensors and the span of their components +## A. Single Lorentz tensors, their span, and coefficient tensors -A direction is an element of `Fin 1 ⊕ Fin 3`, time or one of the three axes, and `T d` is -the component `T^{μ}` at `μ = d`. `IsSingleLorentz B repLorentz T` says the group moves -them by the Lorentz matrix `Λ` of `g : SL(2,ℂ)`, and `hT.span` is the set of combinations -`∑ d, c d • T d` (`mem_span_iff`). +A direction is an element of `Fin 1 ⊕ Fin 3`, time or one of the three axes, and `T d` is the +component `T^{μ}` at `μ = d`. `IsSingleLorentz B repLorentz T` says the group moves them by the +Lorentz matrix `Λ` of `g : SL(2,ℂ)`, and `hT.span` is the set of combinations `∑ d, c d • T d` +(`mem_span_iff`). The components may be dependent, so the `c` writing a vector of the span is +not determined by it; `Invariants.exists_isInvariantCoeff_of_mem_span` picks out one that the +matrices fix, `act Λ c = c`, and the rest of the file classifies those. -/ @@ -75,116 +73,22 @@ lemma mem_span_iff (x : B) : LinearMap.mem_range] simp only [Fintype.linearCombination_apply, eq_comm] -/-! - -## B. The light-cone basis along one axis - -The boost along the axis `i` scales the light-cone directions `D₀ - Dᵢ`, `D₀ + Dᵢ` and the -two transverse ones by `t²`, `t⁻²`, `1`, `1`, so their weights, the exponents of `t`, are -`2`, `-2`, `0`, `0`. Recombining the components along those directions gives the light-cone -components `hT.lightCone i c`, which span the same space and are boost eigenvectors of -weight the total weight of `c`. - --/ - -set_option linter.unusedVariables false in -/-- The light-cone component of `T` along axis `i` at the light-cone index `c`; `hT` is - present only so it reads `hT.lightCone`. -/ -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 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 component 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 - -/-- A light-cone component is a boost eigenvector, of weight the total 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 => ?_ - calc repLorentz (SL2C.boostAxis i t ht) (hT.lightCone i c) - = ∑ 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 [lightCone, map_sum, map_smul, hT.repLorentz_T, Finset.smul_sum, - smul_smul] - rw [Finset.sum_comm] - exact Finset.sum_congr rfl fun a _ => Finset.sum_smul.symm - _ = (algebraMap ℝ ℂ) t ^ (∑ j, lightConeWeight (c j)) • hT.lightCone i c := by - simp only [sum_prod_lightConeCoeff i c _ ht, lightCone, Finset.smul_sum, smul_smul] - rfl - -/-! - -## C. The weight-zero part along one axis - -## C.1. The boost-weight parts of a component - -Each component `T e` is the sum of its boost-weight parts `hT.monoComponent i e m`; with -one index the only weights are `-2`, `0` and `2`. - --/ - -/-- The weight-`m` part of `T e` along axis `i`: the weight-`m` terms 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-`m` part has boost weight `m`. -/ -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 - -/-- With one index the only light-cone weights are `-2`, `0` and `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 three boost-weight parts. -/ -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 +include hT in +/-- An invariant of the span is the contraction of an invariant coefficient tensor. -/ +theorem exists_isInvariantCoeff_of_mem_span {x : B} (hx : x ∈ hT.span) + (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : + ∃ c : (Fin 1 → Fin 1 ⊕ Fin 3) → ℂ, IsInvariantCoeff c ∧ x = ∑ d, c d • T d := + Invariants.exists_isInvariantCoeff_of_mem_span hT.repLorentz_T hx hinv /-! -## C.2. The weight-zero transition matrix +## B. What one axis leaves -Written back on the components, the weight-zero part of `T e` is a matrix applied to the -components. Its closed form, checked by computation on the four directions, is the -projector onto the two directions transverse to time and to the axis. The integer copy -`weightZeroTransitionZ` carries a factor of `2`, from `lightConeCoeffInvZ`, so that the -check runs over integers. +The boost along the axis `i` scales the light-cone directions `D₀ - Dᵢ`, `D₀ + Dᵢ` and the two +transverse ones by `t²`, `t⁻²`, `1`, `1`, so their weights are `2`, `-2`, `0`, `0`. An invariant +`c` has no light-cone component of nonzero weight, so writing `c_d` in the light-cone basis +leaves only the two weight-zero directions, and their coefficients in `d` vanish unless `d` is +itself transverse. -/ @@ -195,148 +99,33 @@ def Transverse (i : Fin 3) (μ : Fin 1 ⊕ Fin 3) : Prop := instance (i : Fin 3) (μ : Fin 1 ⊕ Fin 3) : Decidable (Transverse i μ) := inferInstanceAs (Decidable (_ ∨ _)) -/-- The weight-zero projection along axis `i`, as a matrix on the components: the - coefficient of `T d` in the weight-zero part of `T e`. -/ -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 part of `T e`, written back on the components. -/ -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] - -/-- Twice the weight-zero transition, over `ℤ`, so that the closed form can be computed. -/ -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 copy is 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] - -/-- Twice the projector onto the two directions transverse to time and to the axis `i`, - a finite check over the four directions. -/ -lemma weightZeroTransitionZ_eq (i : Fin 3) (d e : Fin 1 → Fin 1 ⊕ Fin 3) : - weightZeroTransitionZ i d e = if e 0 = d 0 ∧ Transverse i (d 0) then 2 else 0 := by - revert i - revert d e - decide - -/-- So the weight-zero transition is the projector onto the two directions transverse to - time and to 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 ∧ Transverse i (d 0) 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. What one axis leaves - -An invariant has boost weight zero along every axis, so along the axis `i` it is its own -weight-zero part: every coefficient outside the transverse pair of that axis is `0`. - --/ - -include hT in -/-- A vector of boost weight zero along axis `i` is written with the weight-zero - transition 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 _ _ - -/-- That transition keeps the coefficients of 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 Transverse i (d 0) then c d else 0 := by - by_cases htr : Transverse i (d 0) - · 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 -/-- So a vector of boost weight zero along axis `i` is written 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 Transverse i (d 0) 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] +/-- A non-transverse direction has no weight-zero light-cone coefficient. -/ +lemma prod_lightConeCoeffInv_eq_zero {i : Fin 3} {d : Fin 1 → Fin 1 ⊕ Fin 3} + (hd : ¬ Transverse i (d 0)) {κ : Fin 1 → Fin 4} + (hκ : ∑ s, lightConeWeight (κ s) = 0) : + ∏ s, lightConeCoeffInv i (d s) (κ s) = 0 := by + have h : ∀ κ : Fin 4, lightConeWeight κ = 0 → κ = 2 ∨ κ = 3 := by decide + rw [Fin.sum_univ_one] at hκ + rw [Fin.prod_univ_one] + rcases h (κ 0) hκ with hk | hk + · exact hk ▸ lightConeCoeffInv_two_eq_zero i fun h => hd (Or.inl h) + · exact hk ▸ lightConeCoeffInv_three_eq_zero i fun h => hd (Or.inr h) + +/-- An invariant coefficient tensor vanishes off the two directions transverse to the axis. -/ +lemma eq_zero_of_not_transverse {c : (Fin 1 → Fin 1 ⊕ Fin 3) → ℂ} (hc : IsInvariantCoeff c) + (i : Fin 3) {d : Fin 1 → Fin 1 ⊕ Fin 3} (hd : ¬ Transverse i (d 0)) : c d = 0 := by + rw [eq_sum_lightConeComponent i c d] + refine Finset.sum_eq_zero fun κ _ => ?_ + by_cases hκ : ∑ s, lightConeWeight (κ s) = 0 + · rw [prod_lightConeCoeffInv_eq_zero hd hκ, zero_mul] + · rw [hc.lightConeComponent_eq_zero i hκ, mul_zero] /-! -## D. The classification of the Lorentz invariants +## C. The classification of the Lorentz invariants -No direction is transverse to all three axes at once, so applying C.3 to the three axes -in turn leaves nothing. +No direction is transverse to all three axes at once, so applying B to the three axes in turn +leaves no coefficient standing. -/ @@ -346,32 +135,30 @@ lemma not_transverse_all (μ : Fin 1 ⊕ Fin 3) : revert μ decide +/-- An invariant coefficient tensor is zero. -/ +lemma eq_zero_of_isInvariantCoeff {c : (Fin 1 → Fin 1 ⊕ Fin 3) → ℂ} + (hc : IsInvariantCoeff c) : c = 0 := by + funext d + show c d = 0 + by_cases h0 : Transverse 0 (d 0) + · by_cases h1 : Transverse 1 (d 0) + · by_cases h2 : Transverse 2 (d 0) + · exact absurd ⟨h0, h1, h2⟩ (not_transverse_all (d 0)) + · exact eq_zero_of_not_transverse hc 2 h2 + · exact eq_zero_of_not_transverse hc 1 h1 + · exact eq_zero_of_not_transverse hc 0 h0 + include hT in /-- Every Lorentz invariant in the span of the components is zero: one index carries no invariant contraction. -/ 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 (rep := 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 Transverse 0 (d 0) then c d else 0) h0 (hw 1) - have h2 := hT.eq_sum_transverse_smul 2 - (fun d => if Transverse 1 (d 0) then (if Transverse 0 (d 0) then c d else 0) else 0) - h1 (hw 2) - rw [h2] - refine Finset.sum_eq_zero fun d _ => ?_ - by_cases h2t : Transverse 2 (d 0) - · by_cases h1t : Transverse 1 (d 0) - · by_cases h0t : Transverse 0 (d 0) - · exact absurd ⟨h0t, h1t, h2t⟩ (not_transverse_all (d 0)) - · rw [if_pos h2t, if_pos h1t, if_neg h0t, zero_smul] - · rw [if_pos h2t, if_neg h1t, zero_smul] - · rw [if_neg h2t, zero_smul] + obtain ⟨c, hc, rfl⟩ := hT.exists_isInvariantCoeff_of_mem_span hx hinv + simp [eq_zero_of_isInvariantCoeff hc] /-! -## E. The classification modulo a Lorentz-stable submodule +## D. The classification modulo a Lorentz-stable submodule A stable subspace `S` is divided out by passing to the quotient `B ⧸ S`, that is `B` with `S` declared zero: the classes of the components again form a single Lorentz tensor, so diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsTriLorentz.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsTriLorentz.lean index 95ad93ba6..060c502a5 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsTriLorentz.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsTriLorentz.lean @@ -22,22 +22,23 @@ The components are vectors `T d` of a complex vector space `B` carrying a repres moves them with one factor of the Lorentz matrix per slot (B). `hT.span` is the set of their combinations. -One axis does all the work, with a parity argument in place of a certificate. Along a -spatial axis the four light-cone directions carry boost weights `2`, `-2`, `0`, `0`, the -two of weight `0` being the two directions transverse to time and to that axis (C). An -invariant has weight `0`, so it is a combination of light-cone multi-indices of total -weight `0` (D); in such a multi-index the `+2` and `-2` slots pair off, leaving an odd -number of the three slots transverse. The half turn about the axis, the rotation by `π`, -fixes time and the axis and negates the two transverse directions (A), so it multiplies -each of those multi-indices by `-1` to an odd power, that is by `-1`. An invariant is -therefore both negated and fixed by it, hence zero (E). Section F divides out `S`. +An invariant of the span is `∑_d c_d • T d` for a coefficient tensor `c` that the Lorentz +matrices themselves fix (B, from `Invariants.Basic`). One axis then does all the work, with a +parity argument in place of a certificate. Along a spatial axis the four light-cone directions +carry boost weights `2`, `-2`, `0`, `0`, and an invariant `c` has no light-cone component of +nonzero weight. In a multi-index of total weight `0` the `+2` and `-2` slots pair off, leaving +an odd number of the three slots transverse. The half turn about the axis, the rotation by `π`, +fixes time and the axis and negates the two transverse directions (A), so it multiplies each +weight-zero component by `-1` to an odd power, that is by `-1`, and an invariant component both +fixed and negated is `0` (C). Every light-cone component of `c` vanishes, so `c` does, and with +it the invariant. Section D divides out `S`. -/ @[expose] public section namespace Lorentz -open TensorProduct Matrix MatrixGroups SL2C BoostWeight +open TensorProduct Matrix MatrixGroups SL2C Invariants open IsQuadLorentz (quotRep quotRep_mkQ) /-! @@ -176,217 +177,77 @@ lemma mem_span_iff (x : B) : LinearMap.mem_range] simp only [Fintype.linearCombination_apply, eq_comm] -/-! - -## C. The light-cone basis along one axis - -Recombining the components along the light-cone directions of the axis `i` gives the -light-cone components `hT.lightCone i c`: they span the same space, are boost -eigenvectors of weight the total weight of `c`, and the half turn multiplies each by the -product of the signs of its slots, so it negates exactly those with an odd number of -transverse slots. - --/ - -set_option linter.unusedVariables false in -/-- The light-cone component of `T` along axis `i` at the light-cone index `c`; `hT` is - present only so it reads `hT.lightCone`. -/ -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 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 component 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 => ?_ - calc repLorentz (SL2C.boostAxis i t ht) (hT.lightCone i c) - = ∑ 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 [lightCone, map_sum, map_smul, hT.repLorentz_T, Finset.smul_sum, - smul_smul] - rw [Finset.sum_comm] - exact Finset.sum_congr rfl fun a _ => Finset.sum_smul.symm - _ = (algebraMap ℝ ℂ) t ^ (∑ j, lightConeWeight (c j)) • hT.lightCone i c := by - simp only [sum_prod_lightConeCoeff i c _ ht, lightCone, Finset.smul_sum, smul_smul] - rfl - -/-- 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 component - -Each component `T e` is the sum of its boost-weight parts `hT.monoComponent i e m`, so a -vector of weight zero along the axis `i` is the combination of the weight-zero parts -alone. Those are built from light-cone multi-indices of total weight zero, which the half -turn negates. - --/ - -/-- The weight-`m` part of `T e` along axis `i`: the weight-`m` terms 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-`m` part has boost weight `m`. -/ -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 weight of three slots is even and between `-6` and `6`, a finite check. -/ -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 boost-weight parts. -/ -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 -/-- A vector of boost weight zero along axis `i` is the combination of the weight-zero - parts 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 part of a component: every - light-cone multi-index in 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] +/-- An invariant of the span is the contraction of an invariant coefficient tensor. -/ +theorem exists_isInvariantCoeff_of_mem_span {x : B} (hx : x ∈ hT.span) + (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : + ∃ c : (Fin 3 → Fin 1 ⊕ Fin 3) → ℂ, IsInvariantCoeff c ∧ x = ∑ d, c d • T d := + Invariants.exists_isInvariantCoeff_of_mem_span hT.repLorentz_T hx hinv /-! -## E. The classification of the Lorentz invariants +## C. 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 parts alone, which the half turn about that axis negates. The -invariant is therefore both fixed and negated by one Lorentz transformation, so it is -zero. +Writing a coefficient tensor in the light-cone basis of one axis leaves only the multi-indices +of total weight zero, the others being killed by the boost. The half turn about that axis +negates exactly those, so they vanish too and nothing is left. -/ +/-- The Lorentz matrix of the half turn is diagonal, hence symmetric. -/ +lemma toLorentzGroup_halfTurn_symm (i : Fin 3) (a b : Fin 1 ⊕ Fin 3) : + (SL2C.toLorentzGroup (SL2C.halfTurn i)).1 a b + = (SL2C.toLorentzGroup (SL2C.halfTurn i)).1 b a := by + rw [SL2C.toLorentzGroup_halfTurn_apply, SL2C.toLorentzGroup_halfTurn_apply] + by_cases h : a = b + · rw [h] + · rw [if_neg h, if_neg (Ne.symm h)] + +/-- The half turn multiplies a light-cone component by the product of the signs of its slots. -/ +lemma lightConeComponent_act_halfTurn {n : ℕ} (i : Fin 3) + (c : (Fin n → Fin 1 ⊕ Fin 3) → ℂ) (κ : Fin n → Fin 4) : + lightConeComponent i (act (SL2C.toLorentzGroup (SL2C.halfTurn i)).1 c) κ + = ((∏ s, lightConeSign (κ s) : ℤ) : ℂ) * lightConeComponent i c κ := by + simp only [lightConeComponent, act, Finset.mul_sum] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun d _ => ?_ + have h := sum_prod_halfTurn_lightConeCoeff i κ d + simp only [toLorentzGroup_halfTurn_symm i (d _)] at h + rw [← mul_assoc, mul_comm _ (c d), ← h, Finset.mul_sum] + exact Finset.sum_congr rfl fun a _ => by ring + +/-- An invariant coefficient tensor has no weight-zero light-cone component either, the half + turn negating those. -/ +lemma lightConeComponent_eq_zero_of_weight_zero {c : (Fin 3 → Fin 1 ⊕ Fin 3) → ℂ} + (hc : IsInvariantCoeff c) (i : Fin 3) {κ : Fin 3 → Fin 4} + (hκ : ∑ s, lightConeWeight (κ s) = 0) : lightConeComponent i c κ = 0 := by + have h := lightConeComponent_act_halfTurn i c κ + rw [hc, prod_lightConeSign_of_sum_lightConeWeight_eq_zero κ hκ] at h + push_cast at h + linear_combination h / 2 + +/-- An invariant coefficient tensor is zero: no light-cone component of it survives. -/ +lemma eq_zero_of_isInvariantCoeff {c : (Fin 3 → Fin 1 ⊕ Fin 3) → ℂ} + (hc : IsInvariantCoeff c) : c = 0 := by + funext d + show c d = 0 + rw [eq_sum_lightConeComponent 2 c d] + refine Finset.sum_eq_zero fun κ _ => ?_ + by_cases hκ : ∑ s, lightConeWeight (κ s) = 0 + · rw [lightConeComponent_eq_zero_of_weight_zero hc 2 hκ, mul_zero] + · rw [hc.lightConeComponent_eq_zero 2 hκ, mul_zero] + include hT in /-- Every Lorentz invariant in the span of the components is zero: three indices carry no invariant contraction. -/ 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 (rep := 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 + obtain ⟨c, hc, rfl⟩ := hT.exists_isInvariantCoeff_of_mem_span hx hinv + simp [eq_zero_of_isInvariantCoeff hc] /-! -## F. The classification modulo a Lorentz-stable submodule +## D. The classification modulo a Lorentz-stable submodule A stable subspace `S` is divided out by passing to the quotient `B ⧸ S`, that is `B` with `S` declared zero: the classes of the components again form a triple Lorentz tensor, so diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsVectorLeftRightWeyl.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsVectorLeftRightWeyl.lean index 2409bd132..8b415bedd 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsVectorLeftRightWeyl.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsVectorLeftRightWeyl.lean @@ -48,7 +48,7 @@ there is no Dirac mass term. namespace Lorentz -open TensorProduct Matrix MatrixGroups SL2C BoostWeight +open TensorProduct Matrix MatrixGroups SL2C open IsQuadLorentz (sum_minkowskiMatrixZ_mul quotRep quotRep_mkQ) /-! From c6c70289b91f393a81dc3e864f84bdc7d6fcac02 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 7 Sep 2026 10:03:21 +0100 Subject: [PATCH 275/367] feat: Clean up unneded results --- .../GaugeGroup/GaugeWeightDecomposition.lean | 177 -- .../StandardModel/IsHiggsSector/Basic.lean | 2638 ----------------- 2 files changed, 2815 deletions(-) diff --git a/Physlib/Particles/StandardModel/GaugeGroup/GaugeWeightDecomposition.lean b/Physlib/Particles/StandardModel/GaugeGroup/GaugeWeightDecomposition.lean index 17f25fedb..df4564633 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/GaugeWeightDecomposition.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/GaugeWeightDecomposition.lean @@ -7,7 +7,6 @@ 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 /-! @@ -51,8 +50,6 @@ this one; it is `GaugeAlgebra.adjointDecomposition` in - `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 @@ -62,7 +59,6 @@ this one; it is `GaugeAlgebra.adjointDecomposition` in - D. Joins - E. Products - F. Invariants -- G. Compatibility with the boost weight decomposition -/ @@ -849,178 +845,5 @@ 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/IsHiggsSector/Basic.lean b/Physlib/Particles/StandardModel/IsHiggsSector/Basic.lean index 4ad3fc870..c76ba9c7e 100644 --- a/Physlib/Particles/StandardModel/IsHiggsSector/Basic.lean +++ b/Physlib/Particles/StandardModel/IsHiggsSector/Basic.lean @@ -51,8 +51,6 @@ 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`. - - So let `x := a0 TT + a1 XX + a2 YY + a3 ZZ`. @@ -80,7 +78,6 @@ namespace StandardModel open TensorProduct Matrix MatrixGroups Lorentz Lorentz.SL2C - /-- 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: @@ -175,7 +172,6 @@ lemma repLorentz_barH_apply (g : SL(2,ℂ)) (φ : Module.Dual ℂ (ConjModule Hi (∏ (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 φ - /-! ## A. The basic generators and the submodules generated by them. @@ -200,7 +196,6 @@ noncomputable def barHiggs (h : IsHiggsSector B rep hrep_mul repLorentz hrepLore -/ - 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 @@ -216,7 +211,6 @@ lemma rep_higgsComponent (g : GaugeGroupI) {n : ℕ} (d : Fin n → (Fin 1 ⊕ F 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 @@ -404,7 +398,6 @@ lemma barHiggsSubmodule_closure (n : ℕ) (g : GaugeGroupI) : -/ - /-! #### A.4.1. The action of the gauge torus on the Higgs components @@ -695,21 +688,6 @@ 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 : 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)) : @@ -844,29 +822,6 @@ namespace IsDerivativeCollection variable {W} [AddCommGroup W] [Module ℂ W] {repW : Representation ℂ SL(2,ℂ) 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 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 @@ -926,46 +881,6 @@ lemma rotatesIndices {α : ℕ} 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 /-! @@ -1035,39 +950,6 @@ noncomputable def trivialWeightDecomposition (i : Fin 3) : 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, Fin.appendEquiv_symm_apply, smul_smul, - mul_comm w, mul_assoc] - rw [hprod a, mul_assoc] - rfl - /-! ## B. The higgs algebra @@ -1663,7 +1545,6 @@ 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 @@ -1781,7 +1662,6 @@ noncomputable def massWeightFourPermDecomposition : - (h.higgs ![] 0 * h.barHiggs ![] 0 - h.higgs ![] 1 * h.barHiggs ![] 1)) = h.higgs ![] 1 * h.barHiggs ![] 1 from by module] at hs - noncomputable def massWeightSixPermDecomposition : SU2PermDecomposition rep (piece rep (h.massWeightSubmodule 6) 0) where piece := fun w => @@ -1900,7 +1780,6 @@ noncomputable def massWeightSixPermDecomposition : (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 => @@ -2146,7 +2025,6 @@ noncomputable def massWeightEightPermDecomposition : -/ - 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 @@ -2470,98 +2348,6 @@ 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 - -/-- **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)) - - -/-! - ## D. Invariance under the Lorentz group Given the invariance under the the gauge group, @@ -2674,68 +2460,12 @@ lemma repLorentz_dotGaugeHiggs_nil (g : SL(2,ℂ)) : 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 : - 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 : - ((⨆ 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 - /-- 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 : @@ -2761,268 +2491,12 @@ lemma iSup_range_dotSymbol_eight_eq : · 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 in the x-direction - --/ - -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 := iSup_range_lightConeDeriv_single_weight_zero - (h.dotSymbol ![1, 0]) i - 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 - 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 - -/-- **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 := iSup_range_lightConeDeriv_pair_weight_zero - (h.dotSymbol ![2, 0]) i - have h2 := iSup_range_lightConeDeriv_pair_weight_zero - (h.dotSymbol ![0, 2]) i - have h3 := iSup_range_lightConeDeriv_pair_weight_zero - (h.dotSymbol ![1, 1]) i - simp only [lightConeDeriv_pair_zero_one (h.dotSymbol ![2, 0]) i, - lightConeDeriv_pair_one_zero (h.dotSymbol ![2, 0]) i, - lightConeDeriv_pair_two_two (h.dotSymbol ![2, 0]) i, - lightConeDeriv_pair_two_three (h.dotSymbol ![2, 0]) i, - lightConeDeriv_pair_three_two (h.dotSymbol ![2, 0]) i, - lightConeDeriv_pair_three_three (h.dotSymbol ![2, 0]) i, - h.dotSymbol_left_two, - range_toSpanSingleton_add_sub_sub, range_toSpanSingleton_sub_add_sub, - ← LinearMap.span_singleton_eq_range] at h1 - simp only [lightConeDeriv_pair_zero_one (h.dotSymbol ![0, 2]) i, - lightConeDeriv_pair_one_zero (h.dotSymbol ![0, 2]) i, - lightConeDeriv_pair_two_two (h.dotSymbol ![0, 2]) i, - lightConeDeriv_pair_two_three (h.dotSymbol ![0, 2]) i, - lightConeDeriv_pair_three_two (h.dotSymbol ![0, 2]) i, - lightConeDeriv_pair_three_three (h.dotSymbol ![0, 2]) i, - h.dotSymbol_right_two, - range_toSpanSingleton_add_sub_sub, range_toSpanSingleton_sub_add_sub, - ← LinearMap.span_singleton_eq_range] at h2 - simp only [lightConeDeriv_pair_zero_one (h.dotSymbol ![1, 1]) i, - lightConeDeriv_pair_one_zero (h.dotSymbol ![1, 1]) i, - lightConeDeriv_pair_two_two (h.dotSymbol ![1, 1]) i, - lightConeDeriv_pair_two_three (h.dotSymbol ![1, 1]) i, - lightConeDeriv_pair_three_two (h.dotSymbol ![1, 1]) i, - lightConeDeriv_pair_three_three (h.dotSymbol ![1, 1]) i, - 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 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] - show ((((h.isDerivativeCollection_dotSymbol.boostDecompOfNum ![2, 0] i - (trivialWeightDecomposition i)).piece 0 ⊔ - (h.isDerivativeCollection_dotSymbol.boostDecompOfNum ![0, 2] i - (trivialWeightDecomposition i)).piece 0) ⊔ - (h.isDerivativeCollection_dotSymbol.boostDecompOfNum ![1, 1] i - (trivialWeightDecomposition i)).piece 0) ⊔ - (IsDerivativeCollection.boostDecompZero h.quarticSymbol h.rotatesIndices_quarticSymbol i - (trivialWeightDecomposition i)).piece 0) = _ - 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 - `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 ![1, 0]) 1, - 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 ![0, 1]) 1, - 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 (h.dotSymbol ![1, 0]) 1, - 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 (h.dotSymbol ![0, 1]) 1, - 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 (h.dotSymbol ![1, 0]) 1, - 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 (h.dotSymbol ![0, 1]) 1, - 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 _) - - -lemma dimSixWeightDecompositionLE_piece_zero_eq : - (h.dimSixWeightDecompositionLE.piece 0) = - (ℂ ∙ 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 @@ -3040,161 +2514,6 @@ noncomputable def dimEightPieceOne (k : ℤ) : Submodule ℂ B := 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. -/ -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 ▸ 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 ▸ 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 ▸ 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, 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, 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 [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, 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, 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, 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, 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, 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, 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 [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, 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, 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, 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, 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, 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, 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 [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, 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, 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, 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, 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, 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 @@ -3220,1975 +2539,18 @@ lemma dimEightPieceOne_le_gaugeInvariant (k : ℤ) : 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 := iSup_range_lightConeDeriv_pair_weight_zero_notMixed - (h.dotSymbol ![2, 0]) 1 - have h2 := iSup_range_lightConeDeriv_pair_weight_zero_notMixed - (h.dotSymbol ![0, 2]) 1 - have h3 := iSup_range_lightConeDeriv_pair_weight_zero_notMixed - (h.dotSymbol ![1, 1]) 1 - simp only [lightConeDeriv_pair_zero_one (h.dotSymbol ![2, 0]) 1, - lightConeDeriv_pair_one_zero (h.dotSymbol ![2, 0]) 1, - lightConeDeriv_pair_two_two (h.dotSymbol ![2, 0]) 1, - lightConeDeriv_pair_three_three (h.dotSymbol ![2, 0]) 1, - show ((1 : Fin 3) + 1) = 2 from rfl, show ((1 : Fin 3) + 2) = 0 from rfl, - h.dotSymbol_left_two, - range_toSpanSingleton_add_sub_sub, range_toSpanSingleton_sub_add_sub, - ← LinearMap.span_singleton_eq_range] at h1 - simp only [lightConeDeriv_pair_zero_one (h.dotSymbol ![0, 2]) 1, - lightConeDeriv_pair_one_zero (h.dotSymbol ![0, 2]) 1, - lightConeDeriv_pair_two_two (h.dotSymbol ![0, 2]) 1, - lightConeDeriv_pair_three_three (h.dotSymbol ![0, 2]) 1, - show ((1 : Fin 3) + 1) = 2 from rfl, show ((1 : Fin 3) + 2) = 0 from rfl, - h.dotSymbol_right_two, - range_toSpanSingleton_add_sub_sub, range_toSpanSingleton_sub_add_sub, - ← LinearMap.span_singleton_eq_range] at h2 - simp only [lightConeDeriv_pair_zero_one (h.dotSymbol ![1, 1]) 1, - lightConeDeriv_pair_one_zero (h.dotSymbol ![1, 1]) 1, - lightConeDeriv_pair_two_two (h.dotSymbol ![1, 1]) 1, - lightConeDeriv_pair_three_three (h.dotSymbol ![1, 1]) 1, - show ((1 : Fin 3) + 1) = 2 from rfl, show ((1 : Fin 3) + 2) = 0 from rfl, - 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 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 - 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 (h.dotSymbol ![1, 0]) 2, - 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 (h.dotSymbol ![0, 1]) 2, - 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 (h.dotSymbol ![1, 0]) 2, - 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 (h.dotSymbol ![0, 1]) 2, - 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 - 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.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 _) - - -/-- **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 - ℂ ∙ 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 - ℂ ∙ (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 - ((ℂ ∙ (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 - ℂ ∙ (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 - ℂ ∙ 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, 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, 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, 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 - · 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 : 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 : 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 : 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 : 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 : 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 : 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 : 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 : 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 : 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 : 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 : 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 : 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 : 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 : 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 : 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 : 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 : 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 : 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 : 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 : 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 : 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⁻¹ : ℂ) • 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 [show ∀ c, lightConeDot (h.dotSymbol ![0, 2]) 2 c - = lightConeDeriv (n := 2) (h.dotSymbol ![0, 2]) 2 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_zero_one (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_one_zero (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_one_one (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_zero_three (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_three_zero (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_one_three (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_three_one (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_two_two (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_three_three (h.dotSymbol ![0, 2]) 2, - show ∀ c, lightConeDot (h.dotSymbol ![1, 1]) 2 c - = lightConeDeriv (n := 2) (h.dotSymbol ![1, 1]) 2 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_zero_one (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_one_zero (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_one_one (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_zero_three (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_three_zero (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_one_three (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_three_one (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_two_two (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_three_three (h.dotSymbol ![1, 1]) 2, - show ∀ c, lightConeDot (h.dotSymbol ![2, 0]) 2 c - = lightConeDeriv (n := 2) (h.dotSymbol ![2, 0]) 2 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_zero_one (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_one_zero (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_one_one (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_zero_three (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_three_zero (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_one_three (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_three_one (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_two_two (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_three_three (h.dotSymbol ![2, 0]) 2, - 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⁻¹ : ℂ) • 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 [show ∀ c, lightConeDot (h.dotSymbol ![1, 1]) 2 c - = lightConeDeriv (n := 2) (h.dotSymbol ![1, 1]) 2 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_zero_one (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_one_zero (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_one_one (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_zero_three (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_three_zero (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_one_three (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_three_one (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_two_two (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_three_three (h.dotSymbol ![1, 1]) 2, - show ∀ c, lightConeDot (h.dotSymbol ![2, 0]) 2 c - = lightConeDeriv (n := 2) (h.dotSymbol ![2, 0]) 2 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_zero_one (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_one_zero (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_one_one (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_zero_three (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_three_zero (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_one_three (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_three_one (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_two_two (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_three_three (h.dotSymbol ![2, 0]) 2, - 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⁻¹ : ℂ) • 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 [show ∀ c, lightConeDot (h.dotSymbol ![2, 0]) 2 c - = lightConeDeriv (n := 2) (h.dotSymbol ![2, 0]) 2 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_zero_one (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_one_zero (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_one_one (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_zero_three (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_three_zero (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_one_three (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_three_one (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_two_two (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_three_three (h.dotSymbol ![2, 0]) 2, - 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] ![] = lightConeDot (h.dotSymbol ![2, 0]) 2 ![2, 2] from by - simp only [show ∀ c, lightConeDot (h.dotSymbol ![2, 0]) 2 c - = lightConeDeriv (n := 2) (h.dotSymbol ![2, 0]) 2 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_zero_one (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_one_zero (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_one_one (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_zero_three (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_three_zero (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_one_three (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_three_one (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_two_two (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_three_three (h.dotSymbol ![2, 0]) 2, - 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⁻¹ : ℂ) • 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 [show ∀ c, lightConeDot (h.dotSymbol ![0, 2]) 2 c - = lightConeDeriv (n := 2) (h.dotSymbol ![0, 2]) 2 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_zero_one (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_one_zero (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_one_one (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_zero_three (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_three_zero (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_one_three (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_three_one (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_two_two (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_three_three (h.dotSymbol ![0, 2]) 2, - show ∀ c, lightConeDot (h.dotSymbol ![2, 0]) 2 c - = lightConeDeriv (n := 2) (h.dotSymbol ![2, 0]) 2 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_zero_one (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_one_zero (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_one_one (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_zero_three (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_three_zero (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_one_three (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_three_one (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_two_two (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_three_three (h.dotSymbol ![2, 0]) 2, - 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⁻¹ : ℂ) • 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 [show ∀ c, lightConeDot (h.dotSymbol ![0, 2]) 2 c - = lightConeDeriv (n := 2) (h.dotSymbol ![0, 2]) 2 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_zero_one (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_one_zero (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_one_one (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_zero_three (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_three_zero (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_one_three (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_three_one (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_two_two (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_three_three (h.dotSymbol ![0, 2]) 2, - show ∀ c, lightConeDot (h.dotSymbol ![2, 0]) 2 c - = lightConeDeriv (n := 2) (h.dotSymbol ![2, 0]) 2 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_zero_one (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_one_zero (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_one_one (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_zero_three (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_three_zero (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_one_three (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_three_one (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_two_two (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_three_three (h.dotSymbol ![2, 0]) 2, - 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⁻¹ : ℂ) • 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 [show ∀ c, lightConeDot (h.dotSymbol ![0, 2]) 2 c - = lightConeDeriv (n := 2) (h.dotSymbol ![0, 2]) 2 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_zero_one (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_one_zero (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_one_one (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_zero_three (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_three_zero (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_one_three (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_three_one (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_two_two (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_three_three (h.dotSymbol ![0, 2]) 2, - 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] = lightConeDot (h.dotSymbol ![0, 2]) 2 ![2, 2] from by - simp only [show ∀ c, lightConeDot (h.dotSymbol ![0, 2]) 2 c - = lightConeDeriv (n := 2) (h.dotSymbol ![0, 2]) 2 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_zero_one (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_one_zero (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_one_one (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_zero_three (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_three_zero (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_one_three (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_three_one (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_two_two (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_three_three (h.dotSymbol ![0, 2]) 2, - 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⁻¹ : ℂ) • 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 [show ∀ c, lightConeDot (h.dotSymbol ![0, 2]) 2 c - = lightConeDeriv (n := 2) (h.dotSymbol ![0, 2]) 2 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_zero_one (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_one_zero (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_one_one (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_zero_three (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_three_zero (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_one_three (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_three_one (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_two_two (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_three_three (h.dotSymbol ![0, 2]) 2, - show ∀ c, lightConeDot (h.dotSymbol ![1, 1]) 2 c - = lightConeDeriv (n := 2) (h.dotSymbol ![1, 1]) 2 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_zero_one (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_one_zero (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_one_one (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_zero_three (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_three_zero (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_one_three (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_three_one (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_two_two (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_three_three (h.dotSymbol ![1, 1]) 2, - 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⁻¹ : ℂ) • 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 [show ∀ c, lightConeDot (h.dotSymbol ![0, 2]) 2 c - = lightConeDeriv (n := 2) (h.dotSymbol ![0, 2]) 2 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_zero_one (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_one_zero (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_one_one (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_zero_three (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_three_zero (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_one_three (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_three_one (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_two_two (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_three_three (h.dotSymbol ![0, 2]) 2, - show ∀ c, lightConeDot (h.dotSymbol ![1, 1]) 2 c - = lightConeDeriv (n := 2) (h.dotSymbol ![1, 1]) 2 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_zero_one (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_one_zero (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_one_one (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_zero_three (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_three_zero (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_one_three (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_three_one (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_two_two (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_three_three (h.dotSymbol ![1, 1]) 2, - 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⁻¹ : ℂ) • 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 [show ∀ c, lightConeDot (h.dotSymbol ![1, 1]) 2 c - = lightConeDeriv (n := 2) (h.dotSymbol ![1, 1]) 2 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_zero_one (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_one_zero (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_one_one (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_zero_three (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_three_zero (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_one_three (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_three_one (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_two_two (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_three_three (h.dotSymbol ![1, 1]) 2, - 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] = lightConeDot (h.dotSymbol ![1, 1]) 2 ![2, 2] from by - simp only [show ∀ c, lightConeDot (h.dotSymbol ![1, 1]) 2 c - = lightConeDeriv (n := 2) (h.dotSymbol ![1, 1]) 2 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_zero_one (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_one_zero (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_one_one (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_zero_three (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_three_zero (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_one_three (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_three_one (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_two_two (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_three_three (h.dotSymbol ![1, 1]) 2, - 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 : (ℂ ∙ (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 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 [show ∀ c, lightConeDot (h.dotSymbol ![1, 1]) 2 c - = lightConeDeriv (n := 2) (h.dotSymbol ![1, 1]) 2 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_zero_one (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_one_zero (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_one_one (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_zero_three (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_three_zero (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_one_three (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_three_one (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_two_two (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_three_three (h.dotSymbol ![1, 1]) 2, - show ∀ c, lightConeDot (h.dotSymbol ![2, 0]) 2 c - = lightConeDeriv (n := 2) (h.dotSymbol ![2, 0]) 2 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_zero_one (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_one_zero (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_one_one (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_zero_three (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_three_zero (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_one_three (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_three_one (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_two_two (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_three_three (h.dotSymbol ![2, 0]) 2, - 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 : (ℂ ∙ 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 [show ∀ c, lightConeDot (h.dotSymbol ![1, 1]) 2 c - = lightConeDeriv (n := 2) (h.dotSymbol ![1, 1]) 2 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_zero_one (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_one_zero (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_one_one (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_zero_three (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_three_zero (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_one_three (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_three_one (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_two_two (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_three_three (h.dotSymbol ![1, 1]) 2, - show ∀ c, lightConeDot (h.dotSymbol ![2, 0]) 2 c - = lightConeDeriv (n := 2) (h.dotSymbol ![2, 0]) 2 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_zero_one (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_one_zero (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_one_one (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_zero_three (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_three_zero (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_one_three (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_three_one (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_two_two (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_three_three (h.dotSymbol ![2, 0]) 2, - 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 : (ℂ ∙ 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 [show ∀ c, lightConeDot (h.dotSymbol ![2, 0]) 2 c - = lightConeDeriv (n := 2) (h.dotSymbol ![2, 0]) 2 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_zero_one (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_one_zero (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_one_one (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_zero_three (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_three_zero (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_one_three (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_three_one (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_two_two (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_three_three (h.dotSymbol ![2, 0]) 2, - 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 : (ℂ ∙ (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 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 [show ∀ c, lightConeDot (h.dotSymbol ![0, 2]) 2 c - = lightConeDeriv (n := 2) (h.dotSymbol ![0, 2]) 2 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_zero_one (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_one_zero (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_one_one (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_zero_three (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_three_zero (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_one_three (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_three_one (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_two_two (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_three_three (h.dotSymbol ![0, 2]) 2, - show ∀ c, lightConeDot (h.dotSymbol ![2, 0]) 2 c - = lightConeDeriv (n := 2) (h.dotSymbol ![2, 0]) 2 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_zero_one (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_one_zero (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_one_one (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_zero_three (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_three_zero (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_one_three (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_three_one (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_two_two (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_three_three (h.dotSymbol ![2, 0]) 2, - 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 : (ℂ ∙ 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 [show ∀ c, lightConeDot (h.dotSymbol ![0, 2]) 2 c - = lightConeDeriv (n := 2) (h.dotSymbol ![0, 2]) 2 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_zero_one (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_one_zero (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_one_one (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_zero_three (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_three_zero (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_one_three (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_three_one (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_two_two (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_three_three (h.dotSymbol ![0, 2]) 2, - show ∀ c, lightConeDot (h.dotSymbol ![2, 0]) 2 c - = lightConeDeriv (n := 2) (h.dotSymbol ![2, 0]) 2 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_zero_one (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_one_zero (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_one_one (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_zero_three (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_three_zero (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_one_three (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_three_one (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_two_two (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_three_three (h.dotSymbol ![2, 0]) 2, - 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 : (ℂ ∙ 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 [show ∀ c, lightConeDot (h.dotSymbol ![0, 2]) 2 c - = lightConeDeriv (n := 2) (h.dotSymbol ![0, 2]) 2 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_zero_one (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_one_zero (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_one_one (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_zero_three (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_three_zero (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_one_three (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_three_one (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_two_two (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_three_three (h.dotSymbol ![0, 2]) 2, - show ∀ c, lightConeDot (h.dotSymbol ![2, 0]) 2 c - = lightConeDeriv (n := 2) (h.dotSymbol ![2, 0]) 2 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_zero_one (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_one_zero (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_one_one (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_zero_three (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_three_zero (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_one_three (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_three_one (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_two_two (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_three_three (h.dotSymbol ![2, 0]) 2, - 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 : (ℂ ∙ (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 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 [show ∀ c, lightConeDot (h.dotSymbol ![0, 2]) 2 c - = lightConeDeriv (n := 2) (h.dotSymbol ![0, 2]) 2 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_zero_one (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_one_zero (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_one_one (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_zero_three (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_three_zero (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_one_three (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_three_one (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_two_two (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_three_three (h.dotSymbol ![0, 2]) 2, - show ∀ c, lightConeDot (h.dotSymbol ![1, 1]) 2 c - = lightConeDeriv (n := 2) (h.dotSymbol ![1, 1]) 2 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_zero_one (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_one_zero (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_one_one (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_zero_three (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_three_zero (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_one_three (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_three_one (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_two_two (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_three_three (h.dotSymbol ![1, 1]) 2, - 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 : (ℂ ∙ 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 [show ∀ c, lightConeDot (h.dotSymbol ![0, 2]) 2 c - = lightConeDeriv (n := 2) (h.dotSymbol ![0, 2]) 2 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_zero_one (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_one_zero (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_one_one (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_zero_three (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_three_zero (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_one_three (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_three_one (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_two_two (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_three_three (h.dotSymbol ![0, 2]) 2, - show ∀ c, lightConeDot (h.dotSymbol ![1, 1]) 2 c - = lightConeDeriv (n := 2) (h.dotSymbol ![1, 1]) 2 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_zero_one (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_one_zero (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_one_one (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_zero_three (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_three_zero (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_one_three (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_three_one (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_two_two (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_three_three (h.dotSymbol ![1, 1]) 2, - 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 : (ℂ ∙ 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 [show ∀ c, lightConeDot (h.dotSymbol ![0, 2]) 2 c - = lightConeDeriv (n := 2) (h.dotSymbol ![0, 2]) 2 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_zero_one (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_one_zero (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_one_one (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_zero_three (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_three_zero (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_one_three (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_three_one (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_two_two (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_three_three (h.dotSymbol ![0, 2]) 2, - show ∀ c, lightConeDot (h.dotSymbol ![1, 1]) 2 c - = lightConeDeriv (n := 2) (h.dotSymbol ![1, 1]) 2 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_zero_one (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_one_zero (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_one_one (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_zero_three (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_three_zero (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_one_three (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_three_one (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_two_two (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_three_three (h.dotSymbol ![1, 1]) 2, - 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.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 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) • 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 [show ∀ c, lightConeDot (h.dotSymbol ![0, 2]) 0 c - = lightConeDeriv (n := 2) (h.dotSymbol ![0, 2]) 0 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![0, 2]) 0, - lightConeDeriv_pair_one_one (h.dotSymbol ![0, 2]) 0, - lightConeDeriv_pair_zero_one (h.dotSymbol ![0, 2]) 0, - lightConeDeriv_pair_one_zero (h.dotSymbol ![0, 2]) 0, - lightConeDeriv_pair_two_two (h.dotSymbol ![0, 2]) 0, - lightConeDeriv_pair_three_three (h.dotSymbol ![0, 2]) 0, - show ∀ c, lightConeDot (h.dotSymbol ![1, 1]) 0 c - = lightConeDeriv (n := 2) (h.dotSymbol ![1, 1]) 0 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![1, 1]) 0, - lightConeDeriv_pair_one_one (h.dotSymbol ![1, 1]) 0, - lightConeDeriv_pair_zero_one (h.dotSymbol ![1, 1]) 0, - lightConeDeriv_pair_one_zero (h.dotSymbol ![1, 1]) 0, - lightConeDeriv_pair_two_two (h.dotSymbol ![1, 1]) 0, - lightConeDeriv_pair_three_three (h.dotSymbol ![1, 1]) 0, - show ∀ c, lightConeDot (h.dotSymbol ![2, 0]) 0 c - = lightConeDeriv (n := 2) (h.dotSymbol ![2, 0]) 0 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![2, 0]) 0, - lightConeDeriv_pair_one_one (h.dotSymbol ![2, 0]) 0, - lightConeDeriv_pair_zero_one (h.dotSymbol ![2, 0]) 0, - lightConeDeriv_pair_one_zero (h.dotSymbol ![2, 0]) 0, - lightConeDeriv_pair_two_two (h.dotSymbol ![2, 0]) 0, - lightConeDeriv_pair_three_three (h.dotSymbol ![2, 0]) 0, - 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) (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) (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) (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) (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) (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) (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 - (lightConeDot_mem (k := 0) (h.dotSymbol ![2, 0]) - (h.isDerivativeCollection_dotSymbol.rotatesIndices ![2, 0]) 0 ![0, 1] (by decide)) - (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 - (lightConeDot_mem (k := 0) (h.dotSymbol ![2, 0]) - (h.isDerivativeCollection_dotSymbol.rotatesIndices ![2, 0]) 0 ![2, 2] (by decide)) - (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 - (lightConeDot_mem (k := 0) (h.dotSymbol ![0, 2]) - (h.isDerivativeCollection_dotSymbol.rotatesIndices ![0, 2]) 0 ![0, 1] (by decide)) - (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 - (lightConeDot_mem (k := 0) (h.dotSymbol ![0, 2]) - (h.isDerivativeCollection_dotSymbol.rotatesIndices ![0, 2]) 0 ![2, 2] (by decide)) - (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 - (lightConeDot_mem (k := 0) (h.dotSymbol ![1, 1]) - (h.isDerivativeCollection_dotSymbol.rotatesIndices ![1, 1]) 0 ![0, 1] (by decide)) - (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 - (lightConeDot_mem (k := 0) (h.dotSymbol ![1, 1]) - (h.isDerivativeCollection_dotSymbol.rotatesIndices ![1, 1]) 0 ![2, 2] (by decide)) - (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) • 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 [show ∀ c, lightConeDot (h.dotSymbol ![0, 2]) 0 c - = lightConeDeriv (n := 2) (h.dotSymbol ![0, 2]) 0 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![0, 2]) 0, - lightConeDeriv_pair_one_one (h.dotSymbol ![0, 2]) 0, - lightConeDeriv_pair_zero_one (h.dotSymbol ![0, 2]) 0, - lightConeDeriv_pair_one_zero (h.dotSymbol ![0, 2]) 0, - lightConeDeriv_pair_two_two (h.dotSymbol ![0, 2]) 0, - lightConeDeriv_pair_three_three (h.dotSymbol ![0, 2]) 0, - show ∀ c, lightConeDot (h.dotSymbol ![1, 1]) 0 c - = lightConeDeriv (n := 2) (h.dotSymbol ![1, 1]) 0 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![1, 1]) 0, - lightConeDeriv_pair_one_one (h.dotSymbol ![1, 1]) 0, - lightConeDeriv_pair_zero_one (h.dotSymbol ![1, 1]) 0, - lightConeDeriv_pair_one_zero (h.dotSymbol ![1, 1]) 0, - lightConeDeriv_pair_two_two (h.dotSymbol ![1, 1]) 0, - lightConeDeriv_pair_three_three (h.dotSymbol ![1, 1]) 0, - show ∀ c, lightConeDot (h.dotSymbol ![2, 0]) 0 c - = lightConeDeriv (n := 2) (h.dotSymbol ![2, 0]) 0 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![2, 0]) 0, - lightConeDeriv_pair_one_one (h.dotSymbol ![2, 0]) 0, - lightConeDeriv_pair_zero_one (h.dotSymbol ![2, 0]) 0, - lightConeDeriv_pair_one_zero (h.dotSymbol ![2, 0]) 0, - lightConeDeriv_pair_two_two (h.dotSymbol ![2, 0]) 0, - lightConeDeriv_pair_three_three (h.dotSymbol ![2, 0]) 0, - 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) • 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 [show ∀ c, lightConeDot (h.dotSymbol ![0, 2]) 0 c - = lightConeDeriv (n := 2) (h.dotSymbol ![0, 2]) 0 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![0, 2]) 0, - lightConeDeriv_pair_one_one (h.dotSymbol ![0, 2]) 0, - lightConeDeriv_pair_zero_one (h.dotSymbol ![0, 2]) 0, - lightConeDeriv_pair_one_zero (h.dotSymbol ![0, 2]) 0, - lightConeDeriv_pair_two_two (h.dotSymbol ![0, 2]) 0, - lightConeDeriv_pair_three_three (h.dotSymbol ![0, 2]) 0, - show ∀ c, lightConeDot (h.dotSymbol ![0, 2]) 1 c - = lightConeDeriv (n := 2) (h.dotSymbol ![0, 2]) 1 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![0, 2]) 1, - lightConeDeriv_pair_one_one (h.dotSymbol ![0, 2]) 1, - lightConeDeriv_pair_zero_one (h.dotSymbol ![0, 2]) 1, - lightConeDeriv_pair_one_zero (h.dotSymbol ![0, 2]) 1, - lightConeDeriv_pair_two_two (h.dotSymbol ![0, 2]) 1, - lightConeDeriv_pair_three_three (h.dotSymbol ![0, 2]) 1, - show ∀ c, lightConeDot (h.dotSymbol ![1, 1]) 0 c - = lightConeDeriv (n := 2) (h.dotSymbol ![1, 1]) 0 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![1, 1]) 0, - lightConeDeriv_pair_one_one (h.dotSymbol ![1, 1]) 0, - lightConeDeriv_pair_zero_one (h.dotSymbol ![1, 1]) 0, - lightConeDeriv_pair_one_zero (h.dotSymbol ![1, 1]) 0, - lightConeDeriv_pair_two_two (h.dotSymbol ![1, 1]) 0, - lightConeDeriv_pair_three_three (h.dotSymbol ![1, 1]) 0, - show ∀ c, lightConeDot (h.dotSymbol ![1, 1]) 1 c - = lightConeDeriv (n := 2) (h.dotSymbol ![1, 1]) 1 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![1, 1]) 1, - lightConeDeriv_pair_one_one (h.dotSymbol ![1, 1]) 1, - lightConeDeriv_pair_zero_one (h.dotSymbol ![1, 1]) 1, - lightConeDeriv_pair_one_zero (h.dotSymbol ![1, 1]) 1, - lightConeDeriv_pair_two_two (h.dotSymbol ![1, 1]) 1, - lightConeDeriv_pair_three_three (h.dotSymbol ![1, 1]) 1, - show ∀ c, lightConeDot (h.dotSymbol ![2, 0]) 0 c - = lightConeDeriv (n := 2) (h.dotSymbol ![2, 0]) 0 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![2, 0]) 0, - lightConeDeriv_pair_one_one (h.dotSymbol ![2, 0]) 0, - lightConeDeriv_pair_zero_one (h.dotSymbol ![2, 0]) 0, - lightConeDeriv_pair_one_zero (h.dotSymbol ![2, 0]) 0, - lightConeDeriv_pair_two_two (h.dotSymbol ![2, 0]) 0, - lightConeDeriv_pair_three_three (h.dotSymbol ![2, 0]) 0, - show ∀ c, lightConeDot (h.dotSymbol ![2, 0]) 1 c - = lightConeDeriv (n := 2) (h.dotSymbol ![2, 0]) 1 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![2, 0]) 1, - lightConeDeriv_pair_one_one (h.dotSymbol ![2, 0]) 1, - lightConeDeriv_pair_zero_one (h.dotSymbol ![2, 0]) 1, - lightConeDeriv_pair_one_zero (h.dotSymbol ![2, 0]) 1, - lightConeDeriv_pair_two_two (h.dotSymbol ![2, 0]) 1, - lightConeDeriv_pair_three_three (h.dotSymbol ![2, 0]) 1, - 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) (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) (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) (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) (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) (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) (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 - (lightConeDot_mem (k := 0) (h.dotSymbol ![2, 0]) - (h.isDerivativeCollection_dotSymbol.rotatesIndices ![2, 0]) 1 ![0, 1] (by decide)) - (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 - (lightConeDot_mem (k := 0) (h.dotSymbol ![2, 0]) - (h.isDerivativeCollection_dotSymbol.rotatesIndices ![2, 0]) 1 ![2, 2] (by decide)) - (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 - (lightConeDot_mem (k := 0) (h.dotSymbol ![0, 2]) - (h.isDerivativeCollection_dotSymbol.rotatesIndices ![0, 2]) 1 ![0, 1] (by decide)) - (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 - (lightConeDot_mem (k := 0) (h.dotSymbol ![0, 2]) - (h.isDerivativeCollection_dotSymbol.rotatesIndices ![0, 2]) 1 ![2, 2] (by decide)) - (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 - (lightConeDot_mem (k := 0) (h.dotSymbol ![1, 1]) - (h.isDerivativeCollection_dotSymbol.rotatesIndices ![1, 1]) 1 ![0, 1] (by decide)) - (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 - (lightConeDot_mem (k := 0) (h.dotSymbol ![1, 1]) - (h.isDerivativeCollection_dotSymbol.rotatesIndices ![1, 1]) 1 ![2, 2] (by decide)) - (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) • 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 [show ∀ c, lightConeDot (h.dotSymbol ![0, 2]) 1 c - = lightConeDeriv (n := 2) (h.dotSymbol ![0, 2]) 1 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![0, 2]) 1, - lightConeDeriv_pair_one_one (h.dotSymbol ![0, 2]) 1, - lightConeDeriv_pair_zero_one (h.dotSymbol ![0, 2]) 1, - lightConeDeriv_pair_one_zero (h.dotSymbol ![0, 2]) 1, - lightConeDeriv_pair_two_two (h.dotSymbol ![0, 2]) 1, - lightConeDeriv_pair_three_three (h.dotSymbol ![0, 2]) 1, - show ∀ c, lightConeDot (h.dotSymbol ![1, 1]) 1 c - = lightConeDeriv (n := 2) (h.dotSymbol ![1, 1]) 1 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![1, 1]) 1, - lightConeDeriv_pair_one_one (h.dotSymbol ![1, 1]) 1, - lightConeDeriv_pair_zero_one (h.dotSymbol ![1, 1]) 1, - lightConeDeriv_pair_one_zero (h.dotSymbol ![1, 1]) 1, - lightConeDeriv_pair_two_two (h.dotSymbol ![1, 1]) 1, - lightConeDeriv_pair_three_three (h.dotSymbol ![1, 1]) 1, - show ∀ c, lightConeDot (h.dotSymbol ![2, 0]) 1 c - = lightConeDeriv (n := 2) (h.dotSymbol ![2, 0]) 1 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![2, 0]) 1, - lightConeDeriv_pair_one_one (h.dotSymbol ![2, 0]) 1, - lightConeDeriv_pair_zero_one (h.dotSymbol ![2, 0]) 1, - lightConeDeriv_pair_one_zero (h.dotSymbol ![2, 0]) 1, - lightConeDeriv_pair_two_two (h.dotSymbol ![2, 0]) 1, - lightConeDeriv_pair_three_three (h.dotSymbol ![2, 0]) 1, - 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) • 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 [show ∀ c, lightConeDot (h.dotSymbol ![0, 2]) 1 c - = lightConeDeriv (n := 2) (h.dotSymbol ![0, 2]) 1 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![0, 2]) 1, - lightConeDeriv_pair_one_one (h.dotSymbol ![0, 2]) 1, - lightConeDeriv_pair_zero_one (h.dotSymbol ![0, 2]) 1, - lightConeDeriv_pair_one_zero (h.dotSymbol ![0, 2]) 1, - lightConeDeriv_pair_two_two (h.dotSymbol ![0, 2]) 1, - lightConeDeriv_pair_three_three (h.dotSymbol ![0, 2]) 1, - show ∀ c, lightConeDot (h.dotSymbol ![0, 2]) 2 c - = lightConeDeriv (n := 2) (h.dotSymbol ![0, 2]) 2 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_one_one (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_zero_one (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_one_zero (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_two_two (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_three_three (h.dotSymbol ![0, 2]) 2, - show ∀ c, lightConeDot (h.dotSymbol ![1, 1]) 1 c - = lightConeDeriv (n := 2) (h.dotSymbol ![1, 1]) 1 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![1, 1]) 1, - lightConeDeriv_pair_one_one (h.dotSymbol ![1, 1]) 1, - lightConeDeriv_pair_zero_one (h.dotSymbol ![1, 1]) 1, - lightConeDeriv_pair_one_zero (h.dotSymbol ![1, 1]) 1, - lightConeDeriv_pair_two_two (h.dotSymbol ![1, 1]) 1, - lightConeDeriv_pair_three_three (h.dotSymbol ![1, 1]) 1, - show ∀ c, lightConeDot (h.dotSymbol ![1, 1]) 2 c - = lightConeDeriv (n := 2) (h.dotSymbol ![1, 1]) 2 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_one_one (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_zero_one (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_one_zero (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_two_two (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_three_three (h.dotSymbol ![1, 1]) 2, - show ∀ c, lightConeDot (h.dotSymbol ![2, 0]) 1 c - = lightConeDeriv (n := 2) (h.dotSymbol ![2, 0]) 1 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![2, 0]) 1, - lightConeDeriv_pair_one_one (h.dotSymbol ![2, 0]) 1, - lightConeDeriv_pair_zero_one (h.dotSymbol ![2, 0]) 1, - lightConeDeriv_pair_one_zero (h.dotSymbol ![2, 0]) 1, - lightConeDeriv_pair_two_two (h.dotSymbol ![2, 0]) 1, - lightConeDeriv_pair_three_three (h.dotSymbol ![2, 0]) 1, - show ∀ c, lightConeDot (h.dotSymbol ![2, 0]) 2 c - = lightConeDeriv (n := 2) (h.dotSymbol ![2, 0]) 2 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_one_one (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_zero_one (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_one_zero (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_two_two (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_three_three (h.dotSymbol ![2, 0]) 2, - 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) (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) (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) (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) (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) (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) (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 - (lightConeDot_mem (k := 0) (h.dotSymbol ![2, 0]) - (h.isDerivativeCollection_dotSymbol.rotatesIndices ![2, 0]) 2 ![0, 1] (by decide)) - (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 - (lightConeDot_mem (k := 0) (h.dotSymbol ![2, 0]) - (h.isDerivativeCollection_dotSymbol.rotatesIndices ![2, 0]) 2 ![2, 2] (by decide)) - (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 - (lightConeDot_mem (k := 0) (h.dotSymbol ![0, 2]) - (h.isDerivativeCollection_dotSymbol.rotatesIndices ![0, 2]) 2 ![0, 1] (by decide)) - (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 - (lightConeDot_mem (k := 0) (h.dotSymbol ![0, 2]) - (h.isDerivativeCollection_dotSymbol.rotatesIndices ![0, 2]) 2 ![2, 2] (by decide)) - (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 - (lightConeDot_mem (k := 0) (h.dotSymbol ![1, 1]) - (h.isDerivativeCollection_dotSymbol.rotatesIndices ![1, 1]) 2 ![0, 1] (by decide)) - (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 - (lightConeDot_mem (k := 0) (h.dotSymbol ![1, 1]) - (h.isDerivativeCollection_dotSymbol.rotatesIndices ![1, 1]) 2 ![2, 2] (by decide)) - (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) • 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 [show ∀ c, lightConeDot (h.dotSymbol ![0, 2]) 2 c - = lightConeDeriv (n := 2) (h.dotSymbol ![0, 2]) 2 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_one_one (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_zero_one (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_one_zero (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_two_two (h.dotSymbol ![0, 2]) 2, - lightConeDeriv_pair_three_three (h.dotSymbol ![0, 2]) 2, - show ∀ c, lightConeDot (h.dotSymbol ![1, 1]) 2 c - = lightConeDeriv (n := 2) (h.dotSymbol ![1, 1]) 2 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_one_one (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_zero_one (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_one_zero (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_two_two (h.dotSymbol ![1, 1]) 2, - lightConeDeriv_pair_three_three (h.dotSymbol ![1, 1]) 2, - show ∀ c, lightConeDot (h.dotSymbol ![2, 0]) 2 c - = lightConeDeriv (n := 2) (h.dotSymbol ![2, 0]) 2 c 1 from fun _ => rfl, - lightConeDeriv_pair_zero_zero (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_one_one (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_zero_one (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_one_zero (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_two_two (h.dotSymbol ![2, 0]) 2, - lightConeDeriv_pair_three_three (h.dotSymbol ![2, 0]) 2, - 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 - --/ - -/-- **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) - - /-! ### I.2. Invariants in the full algebra -/ - end IsHiggsSector end StandardModel From 4e28bf73926756830fb0d021057354121dc0be08 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 7 Sep 2026 10:38:07 +0100 Subject: [PATCH 276/367] feat: Remove a lot of PermDecomposition stuff --- Physlib.lean | 1 - .../GaugeGroup/SU2PermDecomposition.lean | 288 +----- .../GaugeGroup/SU3PermDecomposition.lean | 935 +---------------- .../MassWeight/SU2PermDecomposition.lean | 846 ---------------- .../StandardModel/IsHiggsSector/Basic.lean | 953 +----------------- 5 files changed, 25 insertions(+), 2998 deletions(-) delete mode 100644 Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/SU2PermDecomposition.lean diff --git a/Physlib.lean b/Physlib.lean index 58376f4b7..e83b7ccb2 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -361,7 +361,6 @@ public import Physlib.Particles.StandardModel.IsGaugeSector.MassWeight.Basic 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.Basic public import Physlib.Particles.StandardModel.IsHiggsSector.DerivSubmodule.Basic public import Physlib.Particles.StandardModel.IsHiggsSector.DerivSubmodule.BoostWeightDecomposition diff --git a/Physlib/Particles/StandardModel/GaugeGroup/SU2PermDecomposition.lean b/Physlib/Particles/StandardModel/GaugeGroup/SU2PermDecomposition.lean index 382bf9fb7..f8a3353ce 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/SU2PermDecomposition.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/SU2PermDecomposition.lean @@ -8,67 +8,32 @@ module public import Physlib.Particles.StandardModel.Basic public import Mathlib.LinearAlgebra.Eigenspace.Basic /-! -# `SU(2)` permutation decompositions +# The `SU(2)` Weyl element ## 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 +The Weyl reflection of `SU(2)`, `su2Perm = !![0, -1; 1, 0]`, -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 -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 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 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 -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 +sends a doublet `(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. `gaugeSU2Perm` is its image in the gauge group. + +`su2Perm` squares to `-1`, so it has order four in `SU(2)`, and its spectrum is contained in +the fourth roots of unity: `su2PermSign` is the character `k ↦ i ^ k` on `ZMod 4` attaching +the eigenvalue to each grade. + +## ii. 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 +## iii. 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 -/ @@ -154,233 +119,4 @@ lemma su2PermSign_injective : Function.Injective su2PermSign := by 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 - -/-- 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 - --/ - -/-- 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/GaugeGroup/SU3PermDecomposition.lean b/Physlib/Particles/StandardModel/GaugeGroup/SU3PermDecomposition.lean index f51003e0e..93c710864 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/SU3PermDecomposition.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/SU3PermDecomposition.lean @@ -9,38 +9,23 @@ public import Physlib.Particles.StandardModel.Basic public import Mathlib.LinearAlgebra.Eigenspace.Basic public import Mathlib.LinearAlgebra.Matrix.Permutation /-! -# `SU(3)` permutation decompositions +# The `SU(3)` Weyl group ## 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 +The cyclic colour rotation - `su3Perm = !![0, 0, 1; 1, 0, 0; 0, 1, 0]`, + `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. +sends a colour triplet `(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. +`gaugeSU3Perm` is its image in the gauge group. `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. - 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 @@ -50,70 +35,11 @@ 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. -`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. +`su3Perm` cubes to `1`, so it has order three in `SU(3)`, and its spectrum is contained in +the cube roots of unity: `su3PermSign` is the character `k ↦ ω ^ k` on `ZMod 3` for +`ω = su3Omega = exp (2 π i / 3)`, attaching the eigenvalue to each grade. -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 +## ii. 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. @@ -121,31 +47,12 @@ continuous one. 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 +## iii. Table of contents - A. The `SU(3)` cyclic Weyl element - 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 @@ -410,824 +317,4 @@ lemma su3PermSign_symmetrizer {k : ZMod 3} (hk : k ≠ 0) : · rw [su3PermSign_two] linear_combination hω + su3Omega * su3Omega_pow_three -/-! - -## D. `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 - -/-! - -## E. 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 - -/-! - -## F. 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 - -/-! - -## G. 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 - -/-! - -## 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/SU2PermDecomposition.lean b/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/SU2PermDecomposition.lean deleted file mode 100644 index 6a9ca1178..000000000 --- a/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/SU2PermDecomposition.lean +++ /dev/null @@ -1,846 +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.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/Particles/StandardModel/IsHiggsSector/Basic.lean b/Physlib/Particles/StandardModel/IsHiggsSector/Basic.lean index c76ba9c7e..dfaba6b07 100644 --- a/Physlib/Particles/StandardModel/IsHiggsSector/Basic.lean +++ b/Physlib/Particles/StandardModel/IsHiggsSector/Basic.lean @@ -11,8 +11,8 @@ 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 public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition +public import Physlib.Particles.StandardModel.GaugeGroup.SU2PermDecomposition public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.JetDeriv public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.LorentzAction public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.GaugeAction @@ -372,12 +372,6 @@ lemma higgsSubmodule_map_rep_le (n : ℕ) (g : GaugeGroupI) : 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] @@ -386,12 +380,6 @@ lemma barHiggsSubmodule_map_rep_le (n : ℕ) (g : GaugeGroupI) : 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 @@ -693,14 +681,6 @@ noncomputable def dotGaugeHiggs (h : IsHiggsSector B rep hrep_mul repLorentz hre (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 - 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 @@ -753,58 +733,6 @@ lemma succ_deriv_span {n : ℕ} (f : (Fin n.succ → (Fin 1 ⊕ Fin 3)) → B) : · 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 @@ -1115,12 +1043,6 @@ lemma massWeightSubmodule_map_rep_le (n : ℕ) (g : GaugeGroupI) : 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 @@ -1537,815 +1459,13 @@ 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 - -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 _)))) - -/-! - -### 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 +## C. Gauge invariance -/ 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 @@ -2393,16 +1513,6 @@ lemma dotSymbol_right (d : Fin 1 → Fin 1 ⊕ Fin 3) : | exact funext fun j => j.elim0 | (funext j; congr 1; exact Fin.ext (by simp [Fin.natAdd])) -@[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] - /-- 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 @@ -2446,15 +1556,6 @@ 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 := @@ -2466,31 +1567,6 @@ lemma range_quarticSymbol (d : Fin 0 → Fin 1 ⊕ Fin 3) : = ℂ ∙ (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![]) := by rw [quarticSymbol, ← LinearMap.span_singleton_eq_range] -/-- 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) - /-! ### D.4. The decomposition along the x and y directions @@ -2514,31 +1590,6 @@ noncomputable def dimEightPieceOne (k : ℤ) : Submodule ℂ B := LinearMap.range (lightConeDeriv (n := 2) (h.dotSymbol ![1, 1]) 1 c)) ⊔ (if k = 0 then ℂ ∙ (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![]) else ⊥) -/-- 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 _ => - (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 _ => - (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 _ => - (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 - /-! ## I. The fully invariants From 6a7413faa7fbc1393043854e10e3b4fce1ead578 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 7 Sep 2026 10:44:52 +0100 Subject: [PATCH 277/367] feat: Remove unneeded results on MaurerCartan forms --- Physlib.lean | 3 - .../LeptonSinglet/JetAlgebra/GaugeAction.lean | 234 ------- .../LeptonSinglet/JetAlgebra/MassDim.lean | 548 ---------------- .../GaugeGroup/MaurerCartan.lean | 594 ------------------ 4 files changed, 1379 deletions(-) delete mode 100644 Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetAlgebra/GaugeAction.lean delete mode 100644 Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetAlgebra/MassDim.lean delete mode 100644 Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean diff --git a/Physlib.lean b/Physlib.lean index e83b7ccb2..8df591236 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -276,10 +276,8 @@ public import Physlib.Particles.StandardModel.Fermions.LeptonSector.Basic 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 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.QuarkDoublet.GaugeAlgebraAction @@ -316,7 +314,6 @@ public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU3FunAnti public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsU1BiAdjoint public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Basic public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Truncation -public import Physlib.Particles.StandardModel.GaugeGroup.MaurerCartan public import Physlib.Particles.StandardModel.GaugeGroup.MaurerCartan.Basic public import Physlib.Particles.StandardModel.GaugeGroup.MaurerCartan.Truncation public import Physlib.Particles.StandardModel.GaugeGroup.SU2PermDecomposition diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetAlgebra/GaugeAction.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetAlgebra/GaugeAction.lean deleted file mode 100644 index 6391dc853..000000000 --- a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetAlgebra/GaugeAction.lean +++ /dev/null @@ -1,234 +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.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] - -/-! - -## 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 - -end StandardModel diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetAlgebra/MassDim.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetAlgebra/MassDim.lean deleted file mode 100644 index 9b67d0aa3..000000000 --- a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetAlgebra/MassDim.lean +++ /dev/null @@ -1,548 +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.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 - -## 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] - change Polynomial.eval₂ (RingHom.id _) 1 - (Polynomial.monomial j.massWeight (ExteriorAlgebra.ι ℂ (JetComponentSpace.basis j))) = _ - rw [Polynomial.eval₂_id] - simp - 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 - -/-! - -## 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 - -end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean deleted file mode 100644 index 037cbb942..000000000 --- a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan.lean +++ /dev/null @@ -1,594 +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.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 Mathlib.RingTheory.MvPowerSeries.Derivative -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) → JetLieAlgebra` -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 - - - -/-! -# THis file is OLD!!!!!!!!!!! - - -!!!!!!!!!!!!! - -## The Maurer–Cartan forms of the jet gauge group - --/ - - - - -/-- 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)) - -/-- 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] - -/-- 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] -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 - 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 - --/ - -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_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 - 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_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 - 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 - -/-! - -## 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 - - -/-- 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 b22b9fa5767e73fb571f1ff2f0bcec35286bc947 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 7 Sep 2026 10:51:42 +0100 Subject: [PATCH 278/367] feat: Remove LeptonSinglet jet algebra --- Physlib.lean | 3 - .../LeptonSinglet/JetAlgebra/Basic.lean | 66 ------- .../LeptonSinglet/JetAlgebra/JetDeriv.lean | 180 ------------------ .../JetAlgebra/LorentzAction.lean | 162 ---------------- 4 files changed, 411 deletions(-) delete mode 100644 Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetAlgebra/Basic.lean delete mode 100644 Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetAlgebra/JetDeriv.lean delete mode 100644 Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetAlgebra/LorentzAction.lean diff --git a/Physlib.lean b/Physlib.lean index 8df591236..69fc1d7ff 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -275,9 +275,6 @@ public import Physlib.Particles.StandardModel.Fermions.LeptonDoublet.GaugeAlgebr public import Physlib.Particles.StandardModel.Fermions.LeptonSector.Basic 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.JetDeriv -public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.JetAlgebra.LorentzAction public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.JetComponentSpace public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet.GaugeAlgebraAction diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetAlgebra/Basic.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetAlgebra/Basic.lean deleted file mode 100644 index 34a1fb80c..000000000 --- a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetAlgebra/Basic.lean +++ /dev/null @@ -1,66 +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.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/JetDeriv.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetAlgebra/JetDeriv.lean deleted file mode 100644 index 7ebcf2703..000000000 --- a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetAlgebra/JetDeriv.lean +++ /dev/null @@ -1,180 +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.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 deleted file mode 100644 index 0c762f470..000000000 --- a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetAlgebra/LorentzAction.lean +++ /dev/null @@ -1,162 +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.Fermions.LeptonSinglet.JetAlgebra.Basic -public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.JetAlgebra.JetDeriv -/-! -# 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] - -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 - -end StandardModel From 1532fa48ca4184885534813efafed38279b1edc7 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 7 Sep 2026 10:55:37 +0100 Subject: [PATCH 279/367] feat: Move fermion files --- Physlib.lean | 9 ++++---- .../Basic.lean} | 0 .../DownSinglet/GaugeAlgebraAction.lean | 2 +- .../Fermions/JetAlgebra/Basic.lean | 8 +++---- .../Basic.lean} | 0 .../LeptonDoublet/GaugeAlgebraAction.lean | 2 +- .../Fermions/LeptonSector/Basic.lean | 22 ------------------- .../Basic.lean} | 0 .../QuarkDoublet/GaugeAlgebraAction.lean | 2 +- .../{UpSinglet.lean => UpSinglet/Basic.lean} | 0 .../UpSinglet/GaugeAlgebraAction.lean | 2 +- .../HiggsBoson/JetAlgebra/Basic.lean | 2 +- .../StandardModel/IsFermionSector/Basic.lean | 8 +++---- 13 files changed, 17 insertions(+), 40 deletions(-) rename Physlib/Particles/StandardModel/Fermions/{DownSinglet.lean => DownSinglet/Basic.lean} (100%) rename Physlib/Particles/StandardModel/Fermions/{LeptonDoublet.lean => LeptonDoublet/Basic.lean} (100%) delete mode 100644 Physlib/Particles/StandardModel/Fermions/LeptonSector/Basic.lean rename Physlib/Particles/StandardModel/Fermions/{QuarkDoublet.lean => QuarkDoublet/Basic.lean} (100%) rename Physlib/Particles/StandardModel/Fermions/{UpSinglet.lean => UpSinglet/Basic.lean} (100%) diff --git a/Physlib.lean b/Physlib.lean index 69fc1d7ff..c461174bc 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -266,19 +266,18 @@ public import Physlib.Particles.StandardModel.AnomalyCancellation.NoGrav.One.Lem public import Physlib.Particles.StandardModel.AnomalyCancellation.NoGrav.One.LinearParameterization 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.Basic public import Physlib.Particles.StandardModel.Fermions.DownSinglet.GaugeAlgebraAction public import Physlib.Particles.StandardModel.Fermions.JetAlgebra.Basic public import Physlib.Particles.StandardModel.Fermions.JetAlgebra.Species -public import Physlib.Particles.StandardModel.Fermions.LeptonDoublet +public import Physlib.Particles.StandardModel.Fermions.LeptonDoublet.Basic public import Physlib.Particles.StandardModel.Fermions.LeptonDoublet.GaugeAlgebraAction -public import Physlib.Particles.StandardModel.Fermions.LeptonSector.Basic public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.Basic public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.GaugeAlgebraAction public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.JetComponentSpace -public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet +public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet.Basic public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet.GaugeAlgebraAction -public import Physlib.Particles.StandardModel.Fermions.UpSinglet +public import Physlib.Particles.StandardModel.Fermions.UpSinglet.Basic public import Physlib.Particles.StandardModel.Fermions.UpSinglet.GaugeAlgebraAction public import Physlib.Particles.StandardModel.GaugeAlgebra.Basic public import Physlib.Particles.StandardModel.GaugeAlgebra.Basis diff --git a/Physlib/Particles/StandardModel/Fermions/DownSinglet.lean b/Physlib/Particles/StandardModel/Fermions/DownSinglet/Basic.lean similarity index 100% rename from Physlib/Particles/StandardModel/Fermions/DownSinglet.lean rename to Physlib/Particles/StandardModel/Fermions/DownSinglet/Basic.lean diff --git a/Physlib/Particles/StandardModel/Fermions/DownSinglet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/DownSinglet/GaugeAlgebraAction.lean index 3e95cb5fd..344af9616 100644 --- a/Physlib/Particles/StandardModel/Fermions/DownSinglet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/DownSinglet/GaugeAlgebraAction.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.Fermions.DownSinglet +public import Physlib.Particles.StandardModel.Fermions.DownSinglet.Basic public import Physlib.Particles.StandardModel.GaugeAlgebra.InfinitesimalAction public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.GaugeAction public import Mathlib.LinearAlgebra.TensorProduct.Pi diff --git a/Physlib/Particles/StandardModel/Fermions/JetAlgebra/Basic.lean b/Physlib/Particles/StandardModel/Fermions/JetAlgebra/Basic.lean index f45156512..8b626e596 100644 --- a/Physlib/Particles/StandardModel/Fermions/JetAlgebra/Basic.lean +++ b/Physlib/Particles/StandardModel/Fermions/JetAlgebra/Basic.lean @@ -9,11 +9,11 @@ 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.LeptonDoublet.Basic 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.QuarkDoublet.Basic +public import Physlib.Particles.StandardModel.Fermions.UpSinglet.Basic +public import Physlib.Particles.StandardModel.Fermions.DownSinglet.Basic /-! # The fermionic jet algebra of the Standard Model diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet.lean b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/Basic.lean similarity index 100% rename from Physlib/Particles/StandardModel/Fermions/LeptonDoublet.lean rename to Physlib/Particles/StandardModel/Fermions/LeptonDoublet/Basic.lean diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean index a5dcfce64..e1078a106 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.Fermions.LeptonDoublet +public import Physlib.Particles.StandardModel.Fermions.LeptonDoublet.Basic public import Physlib.Particles.StandardModel.GaugeAlgebra.InfinitesimalAction public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.GaugeAction public import Mathlib.LinearAlgebra.TensorProduct.Pi diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSector/Basic.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSector/Basic.lean deleted file mode 100644 index 4a1ede0b7..000000000 --- a/Physlib/Particles/StandardModel/Fermions/LeptonSector/Basic.lean +++ /dev/null @@ -1,22 +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 - -/-! - -## 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/Fermions/QuarkDoublet.lean b/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/Basic.lean similarity index 100% rename from Physlib/Particles/StandardModel/Fermions/QuarkDoublet.lean rename to Physlib/Particles/StandardModel/Fermions/QuarkDoublet/Basic.lean diff --git a/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/GaugeAlgebraAction.lean index 83535f303..44a8a2b7e 100644 --- a/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/GaugeAlgebraAction.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet +public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet.Basic public import Physlib.Particles.StandardModel.GaugeAlgebra.InfinitesimalAction public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.GaugeAction public import Mathlib.LinearAlgebra.TensorProduct.Pi diff --git a/Physlib/Particles/StandardModel/Fermions/UpSinglet.lean b/Physlib/Particles/StandardModel/Fermions/UpSinglet/Basic.lean similarity index 100% rename from Physlib/Particles/StandardModel/Fermions/UpSinglet.lean rename to Physlib/Particles/StandardModel/Fermions/UpSinglet/Basic.lean diff --git a/Physlib/Particles/StandardModel/Fermions/UpSinglet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/UpSinglet/GaugeAlgebraAction.lean index b8d2c1a3a..5927d2523 100644 --- a/Physlib/Particles/StandardModel/Fermions/UpSinglet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/UpSinglet/GaugeAlgebraAction.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.Fermions.UpSinglet +public import Physlib.Particles.StandardModel.Fermions.UpSinglet.Basic public import Physlib.Particles.StandardModel.GaugeAlgebra.InfinitesimalAction public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.GaugeAction public import Mathlib.LinearAlgebra.TensorProduct.Pi diff --git a/Physlib/Particles/StandardModel/HiggsBoson/JetAlgebra/Basic.lean b/Physlib/Particles/StandardModel/HiggsBoson/JetAlgebra/Basic.lean index 9c9f2b713..f7a5c277c 100644 --- a/Physlib/Particles/StandardModel/HiggsBoson/JetAlgebra/Basic.lean +++ b/Physlib/Particles/StandardModel/HiggsBoson/JetAlgebra/Basic.lean @@ -25,7 +25,7 @@ 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, +`Physlib.Particles.StandardModel.Fermions.DownSinglet.Basic`): 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 diff --git a/Physlib/Particles/StandardModel/IsFermionSector/Basic.lean b/Physlib/Particles/StandardModel/IsFermionSector/Basic.lean index 03dc8bd43..5d9fa46c4 100644 --- a/Physlib/Particles/StandardModel/IsFermionSector/Basic.lean +++ b/Physlib/Particles/StandardModel/IsFermionSector/Basic.lean @@ -5,10 +5,10 @@ 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.DownSinglet.Basic +public import Physlib.Particles.StandardModel.Fermions.UpSinglet.Basic +public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet.Basic +public import Physlib.Particles.StandardModel.Fermions.LeptonDoublet.Basic public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.Basic public import Physlib.Mathematics.ConjModule public import Physlib.Relativity.IsLorentzDeriv From 53580b42d46e362321424bb53827b52335f7fc44 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 7 Sep 2026 10:59:49 +0100 Subject: [PATCH 280/367] feat: Remove old JetComponentSpace file --- Physlib.lean | 1 - .../LeptonSinglet/JetComponentSpace.lean | 916 ------------------ 2 files changed, 917 deletions(-) delete mode 100644 Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetComponentSpace.lean diff --git a/Physlib.lean b/Physlib.lean index c461174bc..ffe7b27b3 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -274,7 +274,6 @@ public import Physlib.Particles.StandardModel.Fermions.LeptonDoublet.Basic 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.JetComponentSpace public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet.Basic public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet.GaugeAlgebraAction public import Physlib.Particles.StandardModel.Fermions.UpSinglet.Basic diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetComponentSpace.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetComponentSpace.lean deleted file mode 100644 index 3320ac8b0..000000000 --- a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/JetComponentSpace.lean +++ /dev/null @@ -1,916 +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.Fermions.LeptonSinglet.Basic -public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Basic -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 - -/-- 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 - --/ - -/-- 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 a22171bb6726ce865edab8fb7261cc7473b0c0f3 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 7 Sep 2026 11:19:47 +0100 Subject: [PATCH 281/367] feat: Remove dead code --- Physlib.lean | 1 - Physlib/Particles/LagrangianTheory/Basic.lean | 1066 +---------------- .../GaugeBosons/FieldStrength/Basic.lean | 27 - 3 files changed, 7 insertions(+), 1087 deletions(-) delete mode 100644 Physlib/Particles/StandardModel/GaugeBosons/FieldStrength/Basic.lean diff --git a/Physlib.lean b/Physlib.lean index ffe7b27b3..bcea55d04 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -287,7 +287,6 @@ public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.Basic public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.FieldStrength public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.Symmeterized public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.TransformsInAdjoint -public import Physlib.Particles.StandardModel.GaugeBosons.FieldStrength.Basic public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.Basic public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.GaugeAction public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.Invariants diff --git a/Physlib/Particles/LagrangianTheory/Basic.lean b/Physlib/Particles/LagrangianTheory/Basic.lean index 6a2b916d1..944ec97d8 100644 --- a/Physlib/Particles/LagrangianTheory/Basic.lean +++ b/Physlib/Particles/LagrangianTheory/Basic.lean @@ -25,776 +25,24 @@ public import Physlib.Relativity.Tensors.RealTensor.CoVector.Representation public import Physlib.Relativity.SL2C.Basic /-! -# The Standard Model EFT Lagrangian without derivatives +# The basis of the dual real jet-slot algebra ## i. Overview +`LagrangianTheory.dualRealJetAlgebraBasis` is the basis of the symmetric algebra of dual real +jet slots `SymmetricAlgebra ℝ (Module.Dual ℝ Lorentz.CoVector)`, indexed by multisets of +spacetime indices. It is the multiset-indexed basis used throughout the gauge-boson jet +algebra (`GaugeBosons/GaugeJetAlgebra`) to name a monomial in the derivative slots by the +multiset of spacetime indices it carries. + -/ @[expose] public section -/-! - -## The basic type for a lagrangian theory - --/ open Matrix MatrixGroups Module TensorProduct -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 φ) - complexScalarRepGaugeGroup : ∀ φ, Representation ℂ G (complexScalarModule φ) - -- The real bosonic fields (e.g. the gauge bosons of the theory.) - 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 φ) - realBosonRepLorentzGroup : ∀ φ, Representation ℝ SL(2,ℂ) (realBosonModule φ) - realBosonRepGaugeGroup : ∀ φ, Representation ℝ G (realBosonModule φ) - namespace LagrangianTheory - -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 - realBosonIrreps_fintype realBosonIrreps_decEq - realBosonComponents_fintype realBosonComponents_decEq - realBosonModule_addCommGroup realBosonModule_module - -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 -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 - -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 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 (μ, ⟨φ, α⟩) - 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. - --/ - -/-- 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 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 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.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 - 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 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. -/ -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 jet-bundle derivative coordinates in the theory. - - 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 `FermionicJetSpaceWithComplex` is strictly larger (the latter is - infinite dimensional) and is not spanned by the component functions. -/ -abbrev FermionicJetComponentSpace (L : LagrangianTheory G) := - (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] - Module.Dual ℂ L.FermionicTargetSpace) × - (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] - Module.Dual ℂ (ConjModule L.FermionicTargetSpace)) - -/-! - -## 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 - 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 `FermionicJetComponentSpace`. -On these spaces we want to define a basis indexed by `FermionicGenerator` and -`FermionicJetGenerator` respectively. - --/ - -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 - -noncomputable def FermionicJetComponentSpace.basis {L : LagrangianTheory G} : - Basis L.FermionicJetGenerator ℂ L.FermionicJetComponentSpace := - ((DerivAlgebraComplex.basis.tensorProduct - (Pi.basis fun φ => L.fermionBasis φ).dualBasis).prod - (DerivAlgebraComplex.basis.tensorProduct - ((Pi.basis fun φ => L.fermionBasis φ).conj.dualBasis))).reindex - fermionicJetGeneratorEquiv.symm - -/-! - -## 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 `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. - --/ - - -variable {L : LagrangianTheory G} - -/-- 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 - simp [End.one_eq_id] - map_mul' Λ1 Λ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 - 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 - 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 FermionicJetComponentSpace.repLorentzGroup : - Representation ℂ SL(2,ℂ) L.FermionicJetComponentSpace := - (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 - 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 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] - map_mul' Λ1 Λ2 := by - simp only [map_mul, End.mul_eq_comp, ← ExteriorAlgebra.map_comp_map, - AlgHom.comp_toLinearMap] - -/-! - -### A.5. The representation of the Gauge group on fermionic vector spaces and algebras - --/ - -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) - -/-- 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 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 (SymmetricAlgebra ℂ (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 - 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] - -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] - 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 - --/ - -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 - -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 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 (μ, ⟨φ, α⟩) - 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 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 - 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.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) := - 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 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 - theory. -/ -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 jet-bundle derivative coordinates in the - theory. - - 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 `ComplexScalarJetSpaceWithComplex` is strictly larger (the - latter is infinite dimensional) and is not spanned by the component functions. -/ -abbrev ComplexScalarJetComponentSpace (L : LagrangianTheory G) := - (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule) ⊗[ℂ] - Module.Dual ℂ L.ComplexScalarTargetSpace) × - (SymmetricAlgebra ℂ (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 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 -`ComplexScalarJetComponentSpace`. On these spaces we want to define a basis -indexed by `ComplexScalarGenerator` and `ComplexScalarJetGenerator` 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 - -noncomputable def ComplexScalarJetComponentSpace.basis : - Basis L.ComplexScalarJetGenerator ℂ L.ComplexScalarJetComponentSpace := - ((DerivAlgebraComplex.basis.tensorProduct - (Pi.basis fun φ => L.complexScalarBasis φ).dualBasis).prod - (DerivAlgebraComplex.basis.tensorProduct - ((Pi.basis fun φ => L.complexScalarBasis φ).conj.dualBasis))).reindex - complexScalarJetGeneratorEquiv.symm - -/-! - -### B.4. The representation of the Lorentz group on complex scalar vector spaces and algebras - --/ - -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 ComplexScalarJetComponentSpace.repLorentzGroup : - Representation ℂ SL(2,ℂ) L.ComplexScalarJetComponentSpace := - (DerivAlgebraComplex.repLorentzGroup.tprod ComplexScalarTargetSpace.repLorentzGroup.dual).prod - (DerivAlgebraComplex.repLorentzGroup.tprod ComplexScalarTargetSpace.repLorentzGroup.conj.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 - -/-- The representation of the Lorentz group on the algebra `ComplexScalarEFTJet`. -/ -noncomputable def ComplexScalarEFTJet.repLorentzGroup : - Representation ℂ SL(2,ℂ) L.ComplexScalarEFTJet where - toFun Λ := (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarJetComponentSpace.repLorentzGroup Λ)).toLinearMap - map_one' := by - simp [End.one_eq_id] - map_mul' Λ1 Λ2 := by - suffices h : SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarJetComponentSpace.repLorentzGroup (Λ1 * Λ2)) = - (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarJetComponentSpace.repLorentzGroup Λ1)).comp - (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarJetComponentSpace.repLorentzGroup Λ2)) by - rw [h]; rfl - refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun x => ?_) - simp [map_mul, Module.End.mul_apply] - -/-! - -### B.5. The representation of the Gauge group on complex scalar vector spaces and algebras - --/ - -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) - -/-- 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 : - 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 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 (SymmetricAlgebra ℂ (Module.Dual ℂ Lorentz.CoℂModule))).tprod - ComplexScalarTargetSpace.repGaugeGroup.conj.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 - -noncomputable def ComplexScalarEFTJet.repGaugeGroup : - Representation ℂ G L.ComplexScalarEFTJet where - toFun g := (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarJetComponentSpace.repGaugeGroup g)).toLinearMap - map_one' := by - simp [End.one_eq_id] - map_mul' g1 g2 := by - suffices h : SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarJetComponentSpace.repGaugeGroup (g1 * g2)) = - (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarJetComponentSpace.repGaugeGroup g1)).comp - (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℂ _ ∘ₗ ComplexScalarJetComponentSpace.repGaugeGroup g2)) by - rw [h]; rfl - refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun x => ?_) - simp [map_mul, Module.End.mul_apply] - -/-! - -## 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 RealBosonJetGenerator (L : LagrangianTheory G) - | of (μ : Multiset (Fin 1 ⊕ Fin 3)) (φ : L.RealBosonIrreps) (α : L.RealBosonComponents φ) : - L.RealBosonJetGenerator - -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 - | (μ, ⟨φ, α⟩) => .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 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 - 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.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 - 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 jet-bundle derivative coordinates in the theory. - - This is the *graded* dual of `RealBosonJetSpace`: the duals of the - finite-dimensional building blocks are dualized individually and reassembled. -/ -abbrev RealBosonJetComponentSpace (L : LagrangianTheory G) := - SymmetricAlgebra ℝ (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 - 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 - 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 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 RealBosonEFTJetComplex (L : LagrangianTheory G) := ℂ ⊗[ℝ] L.RealBosonEFTJet - - -/-! - -### 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 - /-- The basis of the symmetric algebra of dual real jet slots, indexed by multisets of spacetime indices. -/ noncomputable def dualRealJetAlgebraBasis : @@ -856,304 +104,4 @@ lemma dualRealJetAlgebraBasis_singleton (μ : Fin 1 ⊕ Fin 3) : Basis.symmetricAlgebra, Basis.map_apply, h] simp -noncomputable def RealBosonJetComponentSpace.basis : - Basis L.RealBosonJetGenerator ℝ L.RealBosonJetComponentSpace := - (dualRealJetAlgebraBasis.tensorProduct - (Pi.basis fun φ => L.realBosonBasis φ).dualBasis).reindex - realBosonJetGeneratorEquiv.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 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 - simp [End.one_eq_id] - map_mul' Λ1 Λ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 - 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 : SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℝ _ ∘ₗ realBosonSlotRepLorentzGroup.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.ι ℝ _ ∘ₗ realBosonSlotRepLorentzGroup.dual (Λ1 * Λ2)) = - (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℝ _ ∘ₗ realBosonSlotRepLorentzGroup.dual Λ1)).comp - (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℝ _ ∘ₗ realBosonSlotRepLorentzGroup.dual Λ2)) by - rw [h]; 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 - 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 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 RealBosonJetComponentSpace.repLorentzGroup : - Representation ℝ SL(2,ℂ) L.RealBosonJetComponentSpace := - dualRealJetAlgebraRepLorentzGroup.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 `RealBosonEFTJet`. -/ -noncomputable def RealBosonEFTJet.repLorentzGroup : - Representation ℝ SL(2,ℂ) L.RealBosonEFTJet where - toFun Λ := (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℝ _ ∘ₗ RealBosonJetComponentSpace.repLorentzGroup Λ)).toLinearMap - map_one' := by - simp [End.one_eq_id] - map_mul' Λ1 Λ2 := by - suffices h : SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℝ _ ∘ₗ RealBosonJetComponentSpace.repLorentzGroup (Λ1 * Λ2)) = - (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℝ _ ∘ₗ RealBosonJetComponentSpace.repLorentzGroup Λ1)).comp - (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℝ _ ∘ₗ RealBosonJetComponentSpace.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 RealBosonEFTJetComplex.repLorentzGroup : - Representation ℂ SL(2,ℂ) (RealBosonEFTJetComplex L) where - toFun Λ := - LinearMap.baseChange ℂ (RealBosonEFTJet.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 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 : - 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 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 : - 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 RealBosonEFTJet.repGaugeGroup : - Representation ℝ G L.RealBosonEFTJet where - toFun g := (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℝ _ ∘ₗ RealBosonJetComponentSpace.repGaugeGroup g)).toLinearMap - map_one' := by - simp [End.one_eq_id] - map_mul' g1 g2 := by - suffices h : SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℝ _ ∘ₗ RealBosonJetComponentSpace.repGaugeGroup (g1 * g2)) = - (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℝ _ ∘ₗ RealBosonJetComponentSpace.repGaugeGroup g1)).comp - (SymmetricAlgebra.lift - (SymmetricAlgebra.ι ℝ _ ∘ₗ RealBosonJetComponentSpace.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 RealBosonEFTJetComplex.repGaugeGroup : - Representation ℂ G (RealBosonEFTJetComplex L) where - toFun g := - LinearMap.baseChange ℂ (RealBosonEFTJet.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 - --/ - - -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] - -@[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/StandardModel/GaugeBosons/FieldStrength/Basic.lean b/Physlib/Particles/StandardModel/GaugeBosons/FieldStrength/Basic.lean deleted file mode 100644 index f306df66e..000000000 --- a/Physlib/Particles/StandardModel/GaugeBosons/FieldStrength/Basic.lean +++ /dev/null @@ -1,27 +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.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 7f09d3fc15e55e7a3ad14c1b7de0eea175dbf206 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 7 Sep 2026 11:23:43 +0100 Subject: [PATCH 282/367] refactor: delete old mass-dimension code --- Physlib.lean | 2 - .../GaugeBosons/GaugeJetAlgebra/MassDim.lean | 148 ------------------ .../GaugeJetAlgebra/MassWeightPoly.lean | 13 +- .../StandardModel/JetAlgebra/MassDim.lean | 68 -------- 4 files changed, 5 insertions(+), 226 deletions(-) delete mode 100644 Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/MassDim.lean delete mode 100644 Physlib/Particles/StandardModel/JetAlgebra/MassDim.lean diff --git a/Physlib.lean b/Physlib.lean index bcea55d04..0df36a8b6 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -292,7 +292,6 @@ public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.GaugeA 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.GaugeJetAlgebra.MassWeightPoly public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.Basic @@ -368,7 +367,6 @@ public import Physlib.Particles.StandardModel.JetAlgebra.Generators 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.JetAlgebra.MassWeightPoly public import Physlib.Particles.StandardModel.JetAlgebra.TransformsIn public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.Basic diff --git a/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/MassDim.lean b/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/MassDim.lean deleted file mode 100644 index 546642472..000000000 --- a/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/MassDim.lean +++ /dev/null @@ -1,148 +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.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/GaugeBosons/GaugeJetAlgebra/MassWeightPoly.lean b/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/MassWeightPoly.lean index a680444d9..ce51d904a 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/MassWeightPoly.lean +++ b/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/MassWeightPoly.lean @@ -5,17 +5,15 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.MassDim +public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.JetDeriv /-! # The mass-weight polynomial on the gauge-boson jet algebra ## i. Overview -The mass-weight scaling of -`Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.MassDim` records the mass -dimension of a homogeneous element in a scalar. Replacing that scalar by a formal variable -turns the scaling into a grading: the generator `∂_s A_μ^φ` is sent to `X ^ (2 + 2 |s|)` -times itself, the gauge field carrying mass weight two and each derivative two more. +Replacing the scalar of a mass-weight scaling by a formal variable turns the scaling into a +grading: the generator `∂_s A_μ^φ` is sent to `X ^ (2 + 2 |s|)` times itself, the gauge field +carrying mass weight two and each derivative two more. The gauge-boson jet algebra is real, but the jet algebra of the Standard Model uses its complexification `ℂ ⊗[ℝ] GaugeJetAlgebra`. So the grading is built in two steps: the @@ -106,8 +104,7 @@ lemma jetComponentPoly_basisMultiset_tmul (s : Multiset (Fin 1 ⊕ Fin 3)) -/ /-- The mass-weight polynomial on the gauge-boson jet algebra: the `ℝ`-algebra map sending - a generator of mass weight `n` to `X ^ n` times its image in the complexification. It is - `GaugeJetAlgebra.massWeightScale` with the scalar replaced by the formal variable `X`, and + a generator of mass weight `n` to `X ^ n` times its image in the complexification. It needs no side condition because the target is commutative. -/ noncomputable def massWeightPoly : GaugeJetAlgebra →ₐ[ℝ] Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra) := by diff --git a/Physlib/Particles/StandardModel/JetAlgebra/MassDim.lean b/Physlib/Particles/StandardModel/JetAlgebra/MassDim.lean deleted file mode 100644 index dc047a53e..000000000 --- a/Physlib/Particles/StandardModel/JetAlgebra/MassDim.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 --/ -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 From 98c52beb5e7c4050d9c118ab0b75347ee70ff767 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 7 Sep 2026 12:51:47 +0100 Subject: [PATCH 283/367] refactor: Claude golf of CovariantDeriv.lean --- .../AlgebraRealization/CovariantDeriv.lean | 3541 ++++++----------- 1 file changed, 1180 insertions(+), 2361 deletions(-) diff --git a/Physlib/Particles/StandardModel/AlgebraRealization/CovariantDeriv.lean b/Physlib/Particles/StandardModel/AlgebraRealization/CovariantDeriv.lean index 56027a717..959934eeb 100644 --- a/Physlib/Particles/StandardModel/AlgebraRealization/CovariantDeriv.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/CovariantDeriv.lean @@ -12,44 +12,44 @@ public import Physlib.Particles.StandardModel.AlgebraRealization.Commutations The fields of a Standard Model are the bare derivative symbols `[∂_s A_μ^a]`, `[∂_s H^i]` and `[∂_s ψ^α]` of [`Basic.lean`](Basic.lean), with the statistics proved in -[`Commutations.lean`](Commutations.lean). The whole jet gauge group acts on those — a -gauge transformation together with all of its derivatives at the base point — and the -transformation of a matter symbol carries an inhomogeneous term built from the gauge -field. This file replaces them by the covariant towers `∇_l H`, `∇_l ψ` and `∇_l F_{μν}`, -on which a gauge jet acts through its base point alone, and shows that nothing is lost in -the exchange: the two sets of generators generate the same algebra, and a jet-gauge -invariant of it is a polynomial in the covariant towers. +[`Commutations.lean`](Commutations.lean). The whole jet gauge group acts on those — a gauge +transformation together with all of its derivatives at the base point — and the +transformation of a matter symbol carries an inhomogeneous term built from the gauge field. +This file replaces them by the covariant towers `∇_l H`, `∇_l ψ` and `∇_l F_{μν}`, on which +a gauge jet acts through its base point alone, and shows that nothing is lost in the +exchange: the two sets of generators generate the same algebra, and a jet-gauge invariant of +it is a polynomial in the covariant towers. Sections A to F are the Lorentz machinery the towers need, stated for an arbitrary `IsGaugeField` rather than for a Standard Model. A Lorentz transformation mixes each derivative slot of a symbol through a column of the Lorentz matrix; the bare symbols are indexed by multisets of directions, where no ordering is available, so that mixing is -written as an operator `lorentzMix` on multiset-indexed families. It is a morphism for -the Leibniz convolution out of which the correction terms of a covariant derivative are -built, and the infinitesimal gauge action on a value space commutes with the Lorentz -action there, the two acting on different tensor factors. Together those give the Lorentz -law of `IsGaugeField.covDerivIter`, the Lorentz law of the covariant tower of the field -strength, and the antisymmetry of the field strength in its two covector indices. - -Sections G onwards work inside a Standard Model. The field algebra is the algebra -generated by every symbol of the theory; the covariant towers are the iterated covariant -derivatives of the twelve matter families and of the field strength; and -`fieldAlgebra_eq_covDeriv` says that swapping the bare matter symbols for their towers, -the gauge-field symbols being kept in both, does not change the algebra generated. The -towers are then shown to be gauge covariant, to transform through the base point of a -gauge jet alone, and to be fixed by a pure gauge jet. Those combine into -`invariant_mem_adjoin_covDeriv`: a jet-gauge invariant of the field algebra lies in the +written as an operator `lorentzMix` on multiset-indexed families. It is a morphism for the +Leibniz convolution out of which the correction terms of a covariant derivative are built. +The Lorentz law of a covariant tower is then a single induction, `repLorentz_tower`, run +once for an abstract tower and instantiated twice: for the matter towers, where the value +index carries the contragredient action and the gauge action has to commute with the Lorentz +action, and for the field-strength tower, where the adjoint index carries no Lorentz weight. + +Sections G onwards work inside a Standard Model. The field algebra is the algebra generated +by every symbol of the theory; the covariant towers are the iterated covariant derivatives +of the twelve matter families and of the field strength; and `fieldAlgebra_eq_covDeriv` says +that swapping the bare matter symbols for their towers, the gauge-field symbols being kept +in both, does not change the algebra generated. The towers are gauge covariant, transform +through the base point of a gauge jet alone, and are fixed by a pure gauge jet. Those combine +into `invariant_mem_adjoin_covDeriv`: a jet-gauge invariant of the field algebra lies in the algebra generated by the covariant towers, gauge invariance having eliminated the bare -gauge-field symbols. The last section records the Lorentz laws of the covariant matter +gauge-field symbols. The last two sections record the Lorentz laws of the covariant matter towers, which the covariant form of the theory consumes. ## ii. Key results - `StandardModel.lorentzMix` : the Lorentz mixing operator on multiset-indexed families of - derivative symbols. + derivative symbols, a morphism for the Leibniz convolution (`lorentzMix_derivConv`). +- `StandardModel.repLorentz_tower` : the Lorentz law of an abstract covariant tower. - `IsGaugeField.isLorentzCovDerivTransforms_covDerivIter` and - `IsGaugeField.repLorentz_iteratedCovDerivAdjoint` : the Lorentz laws of the covariant - matter towers and of the covariant field-strength tower. + `IsGaugeField.repLorentz_iteratedCovDerivAdjoint_fieldStrength` : the Lorentz laws of the + covariant matter towers and of the covariant field-strength tower. - `AlgebraRealization.fieldAlgebra` : the algebra the fields generate. - `AlgebraRealization.covDerivH`, `AlgebraRealization.covDerivFieldStrength` and their companions : the covariant derivative towers. @@ -63,20 +63,18 @@ towers, which the covariant form of the theory consumes. ## iii. Table of contents - A. The Lorentz mixing of derivative slots -- B. The Leibniz convolution and the mixing operator -- C. The gauge action commutes with the Lorentz action on the value spaces -- D. The Lorentz law of the covariant matter towers -- E. The Lorentz law of the covariant field-strength tower +- B. The Leibniz convolution +- C. The Lorentz law of a covariant tower +- D. The covariant tower of a matter family +- E. The covariant tower of the field strength - F. The antisymmetry of the field strength -- G. The field algebra -- H. Covariant derivatives -- I. The algebra written in terms of covariant derivatives -- J. Gauge covariance of the covariant derivatives -- K. The field strength and its covariant derivatives -- L. The matter covariant derivatives transform through the base point -- M. Pure gauge jets fix the matter covariant derivatives -- N. The classification of gauge invariants -- O. The Lorentz laws of the covariant matter towers +- G. What a covariant tower inherits from its family +- H. The field algebra and the covariant towers +- I. The covariant towers generate the field algebra +- J. Gauge covariance of the covariant towers +- K. The classification of gauge invariants +- L. The gauge action commutes with the Lorentz action +- M. The Lorentz laws of the covariant matter towers -/ @@ -91,18 +89,22 @@ namespace StandardModel open TensorProduct Matrix MatrixGroups Lorentz +-- The entry `Λ_{b a}` of the Lorentz matrix of `Λ : SL(2,ℂ)`, as a complex scalar. +set_option quotPrecheck false in +local notation:max "L[" Λ "]" b:max a:max => (((SL2C.toLorentzGroup Λ).1 b a : ℝ) : ℂ) + /-! ## A. 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`. +A Lorentz transformation mixes every derivative slot of a symbol through a column +`L[Λ] · a` of the Lorentz matrix. For symbols indexed by an ordered tuple the mixing is a +sum over tuples, but the covariant derivative symbols carry multisets of directions, where +no ordering is available. The mixing is therefore an operator on multiset-indexed families: +peel one direction `a`, replace it by every direction `b` weighted by `L[Λ] b a`, and mix +what is left. Peeling two directions commutes, so the recursion descends to multisets; +`lorentzMix_ofFn` identifies the operator with the tuple form, and the remaining lemmas +record how it interacts with translation of the index and that it is linear in the family. -/ @@ -110,12 +112,11 @@ 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}`. -/ +/-- 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 `L[Λ] 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) + fun t => ∑ b, L[Λ] 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 @@ -123,8 +124,8 @@ instance (Λ : SL(2,ℂ)) : LeftCommutative (lorentzMixStep (M := M) Λ) where 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] + exact Finset.sum_congr rfl fun b₁ _ => Finset.sum_congr rfl fun b₂ _ => by + 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 @@ -135,7 +136,6 @@ noncomputable def lorentzMix (Λ : SL(2,ℂ)) (G : Multiset (Fin 1 ⊕ Fin 3) 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 _ _ @@ -146,8 +146,7 @@ lemma lorentzMix_cons (a : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : /-- 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 + lorentzMix Λ G (a ::ₘ s) t = ∑ b, L[Λ] b a • lorentzMix Λ G s (b ::ₘ t) := by rw [lorentzMix_cons]; rfl /-- Mixing along a sum of multisets is mixing twice. -/ @@ -157,56 +156,9 @@ lemma lorentzMix_add (s t : Multiset (Fin 1 ⊕ Fin 3)) : | 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)) : +lemma lorentzMix_apply_add (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 @@ -215,28 +167,20 @@ lemma lorentzMix_apply_add (Λ : SL(2,ℂ)) (s : Multiset (Fin 1 ⊕ Fin 3)) : 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] + rw [ih G, ih (fun r => G (r + t))] + simp only [Multiset.add_cons, Multiset.cons_add, add_zero] + +/-- Peeling at the empty multiset: the peeled direction is pushed into the family. -/ +lemma lorentzMix_cons_zero (a : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : + lorentzMix Λ G (a ::ₘ s) 0 = + ∑ b, L[Λ] b a • lorentzMix Λ (fun t => G (b ::ₘ t)) s 0 := by + rw [lorentzMix_cons_apply] + refine Finset.sum_congr rfl fun b _ => ?_ + rw [lorentzMix_apply_add Λ s G (b ::ₘ 0)] + simp only [Multiset.add_cons, add_zero] /-- 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)) : +lemma lorentzMix_map (Φ : M →ₗ[ℂ] N) (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] @@ -245,57 +189,92 @@ lemma lorentzMix_map (Φ : M →ₗ[ℂ] N) (Λ : SL(2,ℂ)) (G : Multiset (Fin 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)) : +lemma lorentzMix_smul_fam (c : ℂ) (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 + (lorentzMix_map Λ G (c • LinearMap.id) s t).symm + +/-- The mixing operator is additive in the family. -/ +lemma lorentzMix_add_fam (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 => + simp only [lorentzMix_cons_apply, ih, smul_add, Finset.sum_add_distrib] /-- 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)) : +lemma lorentzMix_sum_fam {ι : Type*} [Fintype ι] (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] + exact Finset.sum_comm + +/-- A sum over tuples of directions, with one Lorentz matrix factor per slot, split into + its first slot and the remaining ones. -/ +lemma sum_fin_succ_prod_smul {n : ℕ} (l : Fin (n + 1) → (Fin 1 ⊕ Fin 3)) + (X : (Fin (n + 1) → (Fin 1 ⊕ Fin 3)) → M) : + ∑ q : Fin (n + 1) → (Fin 1 ⊕ Fin 3), (∏ i, L[Λ] (q i) (l i)) • X q = + ∑ b, ∑ p : Fin n → (Fin 1 ⊕ Fin 3), + (L[Λ] b (l 0) * ∏ i, L[Λ] (p i) (l i.succ)) • X (Fin.cons b p) := by + rw [← (Fin.consEquiv fun _ : Fin (n + 1) => Fin 1 ⊕ Fin 3).sum_comp, Fintype.sum_prod_type] + refine Finset.sum_congr rfl fun b _ => Finset.sum_congr rfl fun p _ => ?_ + show (∏ i, L[Λ] ((Fin.cons b p : Fin (n + 1) → (Fin 1 ⊕ Fin 3)) i) (l i)) • + X (Fin.cons b p) = _ + rw [Fin.prod_univ_succ] + simp only [Fin.cons_zero, Fin.cons_succ] + +/-- 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, L[Λ] (p i) (l i)) • G ((List.ofFn p : List (Fin 1 ⊕ Fin 3)) + t) := by + induction n generalizing t with + | zero => rw [Fintype.sum_unique]; simp + | succ n ih => + rw [List.ofFn_succ, ← Multiset.cons_coe, lorentzMix_cons_apply, sum_fin_succ_prod_smul] + refine Finset.sum_congr rfl fun b _ => ?_ + rw [ih (fun i => l i.succ) (b ::ₘ t), Finset.smul_sum] + refine Finset.sum_congr rfl fun p _ => ?_ + rw [smul_smul, List.ofFn_succ, ← Multiset.cons_coe, Multiset.cons_add, Multiset.add_cons] + simp only [Fin.cons_zero, Fin.cons_succ] end LorentzMix section LorentzMixGroup -variable {M : Type*} [AddCommGroup M] [Module ℂ M] +variable {M : Type*} [AddCommGroup M] [Module ℂ M] (Λ : SL(2,ℂ)) /-- 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)) : +lemma lorentzMix_neg_fam (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] + simpa only [neg_one_smul] using lorentzMix_smul_fam Λ G (-1) s t /-- 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) +lemma lorentzMix_sub_fam (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] + simp only [sub_eq_add_neg, lorentzMix_add_fam Λ G₁ (fun r => -G₂ r), lorentzMix_neg_fam] end LorentzMixGroup - /-! -## B. The Leibniz convolution and the mixing operator +## B. The Leibniz convolution -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. +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 correction terms of this file 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. -/ @@ -310,8 +289,7 @@ lemma multiset_sum_map_sum {α ι : Type*} [Fintype ι] (m : Multiset α) (F : 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] + simp only [Multiset.map_cons, Multiset.sum_cons, ih, Finset.sum_add_distrib] /-- The Leibniz convolution of two families of derivative symbols: the sum over the splittings of the multiset of the products of the two symbols. -/ @@ -324,45 +302,29 @@ omit [Algebra ℂ B] in 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]) + derivConv f (fun r => g (a ::ₘ r)) s + derivConv (fun r => f (a ::ₘ r)) g s := by + simp only [derivConv, Multiset.antidiagonal_cons, Multiset.map_add, Multiset.sum_add, + Multiset.map_map] + rfl /-- 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)) : + (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 + simp only [derivConv, Finset.mul_sum, mul_smul_comm, multiset_sum_map_sum, + Multiset.smul_sum, Multiset.map_map, Function.comp_def] /-- 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)) : + (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 + simp only [derivConv, Finset.sum_mul, smul_mul_assoc, multiset_sum_map_sum, + Multiset.smul_sum, Multiset.map_map, Function.comp_def] -/-- 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. -/ +/-- 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 = @@ -371,188 +333,121 @@ lemma lorentzMix_derivConv (Λ : SL(2,ℂ)) (s : Multiset (Fin 1 ⊕ Fin 3)) : | 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] + rw [derivConv_cons, lorentzMix_cons_zero] + simp only [lorentzMix_cons_zero, derivConv_sum_right, derivConv_sum_left, + derivConv_cons, lorentzMix_add_fam, ← ih, smul_add, Finset.sum_add_distrib] end DerivConv /-! -## C. The gauge action commutes with the Lorentz action on the value spaces +## C. The Lorentz law of a covariant tower -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. +A covariant tower is built one slot at a time: the tower along `l 0 :: l'` is the tower +along `l'` with one more plain derivative, plus a correction term `C (l 0)` applied to the +tower along `l'`. Both towers of this file have that shape — the matter towers with the +derived action of the gauge field as correction, the field-strength tower with the derived +bracket — and both corrections are Lorentz covariant, linear in the family they correct, +and compatible with a twist of the value index. That is all the induction uses, so it is +run once, for an abstract tower `T` transforming into a possibly different tower `T'`: the +ordered covariant slots mix by their own columns of the Lorentz matrix, the multiset of +plain derivative slots by `lorentzMix`, and the value index by the twist `τ`. -/ -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)) +section Tower -/-- 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] +variable {B : Type} [Ring B] [Algebra ℂ B] {repLorentz : Representation ℂ SL(2,ℂ) B} -/-- 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 _ _ _ +/-- 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]) -/-- 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 Λ _) +/-- The Lorentz law of a covariant tower. The tower `T` is built by the step `hstep` out of + a correction `C`, and so is the tower `T'` it transforms into; the seed of `T` transforms + into the seed of `T'` with the value index twisted by `τ` (`hzero`); and the correction is + Lorentz covariant (`hC`), linear in the family it corrects (`hClin`), and lets the twist + through (`hCτ`). Then the covariant slots mix by their own columns, the plain slots by + `lorentzMix`, and the value index by `τ`. -/ +theorem repLorentz_tower {K : Type} [Field K] {W : Type} [AddCommGroup W] [Module K W] + [Module K B] [SMulCommClass K ℂ B] (Λ : SL(2,ℂ)) + (T T' : (n : ℕ) → (Fin n → (Fin 1 ⊕ Fin 3)) → Multiset (Fin 1 ⊕ Fin 3) → + W →ₗ[K] B) + (C : (Fin 1 ⊕ Fin 3) → (Multiset (Fin 1 ⊕ Fin 3) → W →ₗ[K] B) → + Multiset (Fin 1 ⊕ Fin 3) → W →ₗ[K] B) + (τ : W →ₗ[K] W) + (hstep : ∀ (n : ℕ) (l : Fin (n + 1) → (Fin 1 ⊕ Fin 3)) (s : Multiset (Fin 1 ⊕ Fin 3)), + T (n + 1) l s = T n (fun i => l i.succ) (l 0 ::ₘ s) + C (l 0) (T n fun i => l i.succ) s) + (hstep' : ∀ (n : ℕ) (l : Fin (n + 1) → (Fin 1 ⊕ Fin 3)) + (s : Multiset (Fin 1 ⊕ Fin 3)), T' (n + 1) l s = + T' n (fun i => l i.succ) (l 0 ::ₘ s) + C (l 0) (T' n fun i => l i.succ) s) + (hzero : ∀ (l : Fin 0 → (Fin 1 ⊕ Fin 3)) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : W), + repLorentz Λ (T 0 l s φ) = lorentzMix Λ (fun t => T' 0 l t (τ φ)) s 0) + (hC : ∀ (ρ : Fin 1 ⊕ Fin 3) (G G' : Multiset (Fin 1 ⊕ Fin 3) → W →ₗ[K] B), + (∀ y χ, repLorentz Λ (G y χ) = lorentzMix Λ (fun t => G' t χ) y 0) → + ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : W), repLorentz Λ (C ρ G s φ) = + ∑ a, L[Λ] a ρ • lorentzMix Λ (fun t => C a G' t φ) s 0) + (hClin : ∀ (ρ : Fin 1 ⊕ Fin 3) {ι : Type} [Fintype ι] (c : ι → ℂ) + (G : ι → Multiset (Fin 1 ⊕ Fin 3) → W →ₗ[K] B) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : W), C ρ (fun t => ∑ i, c i • G i t) s φ = ∑ i, c i • C ρ (G i) s φ) + (hCτ : ∀ (ρ : Fin 1 ⊕ Fin 3) (G : Multiset (Fin 1 ⊕ Fin 3) → W →ₗ[K] B) + (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : W), + C ρ (fun t => G t ∘ₗ τ) s φ = C ρ G s (τ φ)) : + ∀ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : W), + repLorentz Λ (T n l s φ) = + ∑ p : Fin n → (Fin 1 ⊕ Fin 3), + (∏ i, L[Λ] (p i) (l i)) • lorentzMix Λ (fun t => T' n p t (τ φ)) s 0 := by + intro n + induction n with + | zero => + intro l s φ + rw [Fintype.sum_eq_single l fun p hp => absurd (Subsingleton.elim p l) hp] + simp only [Finset.univ_eq_empty, Finset.prod_empty, one_smul] + exact hzero l s φ + | succ n ih => + intro l s φ + -- the Lorentz law of the lower tower, in the form the correction term consumes + have hG : ∀ y χ, repLorentz Λ (T n (fun i => l i.succ) y χ) = + lorentzMix Λ (fun t => (∑ p : Fin n → (Fin 1 ⊕ Fin 3), + (∏ i, L[Λ] (p i) (l i.succ)) • (T' n p t ∘ₗ τ)) χ) y 0 := by + intro y χ + simp only [LinearMap.sum_apply, LinearMap.smul_apply, LinearMap.comp_apply, + lorentzMix_sum_fam, lorentzMix_smul_fam] + exact ih _ y χ + rw [hstep, LinearMap.add_apply, map_add, ih _ (l 0 ::ₘ s) φ, hC (l 0) _ _ hG s φ, + sum_fin_succ_prod_smul] + -- both sides as double sums over the first direction and the lower tuple + simp only [lorentzMix_cons_zero, hClin, hCτ, hstep', Fin.cons_zero, Fin.cons_succ, + LinearMap.add_apply, lorentzMix_add_fam, lorentzMix_sum_fam, lorentzMix_smul_fam, + Finset.smul_sum, smul_smul, smul_add, Finset.sum_add_distrib] + congr 1 + rw [Finset.sum_comm] + exact Finset.sum_congr rfl fun b _ => Finset.sum_congr rfl fun p _ => by rw [mul_comm] -end GaugeLorentzComm +end Tower /-! -## D. The Lorentz law of the covariant matter towers +## D. The covariant tower of a matter family -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. +The covariant derivative of a matter family adds one ordered derivative slot and a Leibniz +correction `A_ρ · F`, the derived action of the gauge field on the value index through the +infinitesimal action `act`. Expanded in bases of the gauge algebra and of the value space, +the correction is a scalar combination of Leibniz convolutions of gauge-field symbols +against matter symbols, which gives its Lorentz law and its linearity in the matter family. +The twist of the value index is the contragredient action `rep.dual Λ`, and it passes +through the correction because the gauge action commutes with the Lorentz action on the +value space: that is the one hypothesis about the species that the Lorentz law of its +covariant tower needs. -/ @@ -560,8 +455,76 @@ 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 {A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → + Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} variable {act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℂ] V} +variable {repLorentz : Representation ℂ SL(2,ℂ) B} +variable {repGauge : Representation ℂ JetGaugeGroupI B} + +/-- 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 + +/-- A scalar combination of convolutions against the gauge field is linear in the + right-hand families. -/ +lemma sum_derivConv_sum_fam {ι κ ι' : Type} [Fintype ι] [Fintype κ] [Fintype ι'] + (f : ι → Multiset (Fin 1 ⊕ Fin 3) → B) (coef : ι → κ → ℂ) (c : ι' → ℂ) + (g : ι' → κ → Multiset (Fin 1 ⊕ Fin 3) → B) (s : Multiset (Fin 1 ⊕ Fin 3)) : + ∑ j, ∑ k, coef j k • derivConv (f j) (fun y => ∑ i, c i • g i k y) s = + ∑ i, c i • ∑ j, ∑ k, coef j k • derivConv (f j) (g i k) s := by + simp only [derivConv_sum_right, Finset.smul_sum, smul_smul, mul_comm] + exact sum_comm₃ _ + +/-- 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, L[Λ] 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 {rep : Representation ℂ SL(2,ℂ) V} + {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 scalar combination of convolutions against the gauge field: the + direction of the gauge field mixes by its own column, the derivative slots by + `lorentzMix`, and the right-hand families are replaced by their transforms. -/ +lemma repLorentz_sum_derivConv + (hmul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂) + (hA : IsGaugeField repLorentz repGauge A) (Λ : SL(2,ℂ)) (ρ : Fin 1 ⊕ Fin 3) + {ι κ : Type} [Fintype ι] [Fintype κ] (bg : Module.Basis ι ℝ GaugeAlgebra) (coef : ι → κ → ℂ) + (g g' : κ → Multiset (Fin 1 ⊕ Fin 3) → B) + (hg : ∀ k y, repLorentz Λ (g k y) = lorentzMix Λ (g' k) y 0) (s : Multiset (Fin 1 ⊕ Fin 3)) : + repLorentz Λ (∑ j, ∑ k, coef j k • derivConv (fun x => A x ρ (bg.coord j)) (g k) s) = + ∑ a, L[Λ] a ρ • lorentzMix Λ + (fun t => ∑ j, ∑ k, coef j k • derivConv (fun x => A x a (bg.coord j)) (g' k) t) s 0 := by + have h1 : ∀ j k, repLorentz Λ (derivConv (fun x => A x ρ (bg.coord j)) (g k) s) = + ∑ a, L[Λ] a ρ • lorentzMix Λ (derivConv (fun x => A x a (bg.coord j)) (g' k)) s 0 := by + intro j k + rw [repLorentz_derivConv hmul Λ _ (fun t => ∑ a, L[Λ] a ρ • A t a (bg.coord j)) _ (g' k) + (fun x => repLorentz_apply_mix hA Λ x ρ _) (hg k)] + rw [show derivConv (fun t => ∑ a, L[Λ] a ρ • A t a (bg.coord j)) (g' k) = + fun r => ∑ a, L[Λ] a ρ • derivConv (fun x => A x a (bg.coord j)) (g' k) r from + funext fun r => derivConv_sum_left _ _ _ _, lorentzMix_sum_fam] + exact Finset.sum_congr rfl fun a _ => lorentzMix_smul_fam _ _ _ _ _ + simp only [map_sum, map_smul, h1, lorentzMix_sum_fam, lorentzMix_smul_fam, Finset.smul_sum, + smul_smul, mul_comm] + exact sum_comm₃ _ /-- The action of families expanded in bases of the gauge algebra and the value space. -/ lemma actionFam_apply_eq_sum {ι κ : Type} [Fintype ι] [Fintype κ] @@ -582,19 +545,8 @@ lemma actionFamConv_eq_sum {ι κ : Type} [Fintype ι] [Fintype κ] 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 + simp only [actionFamConv, Multiset.sum_linearMap_apply, Multiset.map_map, Function.comp_def, + actionFam_apply_eq_sum bg bv, multiset_sum_map_sum, derivConv, Multiset.smul_sum] /-- The derived action family is linear in the matter family. -/ lemma actionFamConv_sum_fam {ι : Type} [Fintype ι] (ρ : Fin 1 ⊕ Fin 3) (c : ι → ℂ) @@ -603,39 +555,27 @@ lemma actionFamConv_sum_fam {ι : Type} [Fintype ι] (ρ : Fin 1 ⊕ Fin 3) (c : 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₃ _ + simp only [actionFamConv_eq_sum (Module.finBasis ℝ GaugeAlgebra) (Module.finBasis ℂ V), + LinearMap.sum_apply, LinearMap.smul_apply] + exact sum_derivConv_sum_fam _ _ _ _ s -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 +/-- 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, L[Λ] a ρ • lorentzMix Λ (fun t => actionFamConv A act a G' t φ) s 0 := by + classical + set bg := Module.finBasis ℝ GaugeAlgebra + set bv := Module.finBasis ℂ V + simp only [actionFamConv_eq_sum bg bv] + exact repLorentz_sum_derivConv hmul hA Λ ρ bg (fun j k => φ (act (bg j) (bv k))) + (fun k y => G y (bv.coord k)) (fun k t => G' t (bv.coord k)) (fun k y => hG y _) s omit [FiniteDimensional ℂ V] in /-- The twist of the value index past the gauge action: an endomorphism commuting with @@ -645,14 +585,12 @@ lemma dual_twist {κ : Type} [Fintype κ] (bv : Module.Basis κ ℂ V) (T : 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), + rw [show ∑ k, φ (act c (bv k)) • T.dualMap (bv.coord k) = + T.dualMap (∑ k, φ (act c (bv k)) • bv.coord k) by simp only [map_sum, map_smul], + show (∑ k, φ (act c (bv k)) • bv.coord k) = φ ∘ₗ act c from + bv.sum_dual_apply_smul_coord (φ ∘ₗ 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)] + bv.sum_dual_apply_smul_coord ((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 @@ -663,20 +601,14 @@ lemma actionFam_comp_dual (T : V →ₗ[ℂ] V) (φ : 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), + set bg := Module.finBasis ℝ GaugeAlgebra + set bv := Module.finBasis ℂ V + have key : ∀ (α : Fin (Module.finrank ℂ V) → ℂ) (v : Fin (Module.finrank ℂ V) → Module.Dual ℂ V) + (j : Fin (Module.finrank ℝ GaugeAlgebra)), ∑ 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] + intro α v j + simp only [map_sum, map_smul, Finset.mul_sum, mul_smul_comm] + simp only [actionFam_apply_eq_sum bg bv, LinearMap.comp_apply, key, dual_twist bv T hT] /-- The contragredient action may be pulled out of a derived action family. -/ lemma actionFamConv_comp_dual (T : V →ₗ[ℂ] V) @@ -685,283 +617,60 @@ lemma actionFamConv_comp_dual (T : V →ₗ[ℂ] V) (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) φ) + simp only [actionFamConv, Multiset.sum_linearMap_apply, Multiset.map_map, Function.comp_def, + actionFam_comp_dual T hT] + +/-- 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 contragrediently. -/ +lemma repLorentz_covDerivIter {rep : Representation ℂ SL(2,ℂ) V} + (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, L[Λ] (p i) (l i)) • + lorentzMix Λ (fun t => covDerivIter A act F n p t (rep.dual Λ φ)) s 0 := + repLorentz_tower Λ (covDerivIter A act F) (covDerivIter A act F) (actionFamConv A act) + (rep.dual Λ) (fun _ _ _ => rfl) (fun _ _ _ => rfl) + (fun _ s φ => isLorentzDerivTransforms_mix hF Λ s φ) + (fun ρ G G' hG s φ => repLorentz_actionFamConv hmul hA Λ ρ G G' hG s φ) + (fun ρ _ _ c G s φ => actionFamConv_sum_fam ρ c G s φ) + (fun ρ G s φ => actionFamConv_comp_dual (rep Λ⁻¹) (fun c v => hcomm c Λ⁻¹ v) ρ G s φ) + n l s φ -section LorentzLaws +/-- 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 {rep : Representation ℂ SL(2,ℂ) V} + (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] -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]⟩ +## E. The covariant tower of the field strength -/-- 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 - -/-! - -## E. 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. +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 the twist is the identity, and the induction +of section C applies 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) @@ -971,14 +680,9 @@ lemma bracketFamConv_eq_sum (ρ : Fin 1 ⊕ Fin 3) 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) + simp only [bracketFamConv, Multiset.sum_linearMap_apply, Multiset.map_map, Function.comp_def, + bracketFam_apply_eq_sum, multiset_sum_map_sum, derivConv, Multiset.smul_sum, + Complex.coe_smul] /-- The derived bracket family is linear in the second family. -/ lemma bracketFamConv_sum_fam {ι : Type} [Fintype ι] (ρ : Fin 1 ⊕ Fin 3) (c : ι → ℂ) @@ -986,299 +690,98 @@ lemma bracketFamConv_sum_fam {ι : Type} [Fintype ι] (ρ : Fin 1 ⊕ Fin 3) (c (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₃ _ + simp only [bracketFamConv_eq_sum, LinearMap.sum_apply, LinearMap.smul_apply] + exact sum_derivConv_sum_fam _ _ _ _ s /-- The Lorentz law of the derived bracket family. -/ lemma repLorentz_bracketFamConv - (hmul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), - repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂) + (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] + ∑ a, L[Λ] a ρ • lorentzMix Λ (fun t => bracketFamConv A a G' t φ) s 0 := by + set bg := Module.Free.chooseBasis ℝ GaugeAlgebra + simp only [bracketFamConv_eq_sum] + exact repLorentz_sum_derivConv hmul hA Λ ρ bg (fun j k => ((φ ⁅bg j, bg k⁆ : ℝ) : ℂ)) + (fun k y => G y (bg.coord k)) (fun k t => G' t (bg.coord k)) (fun k y => hG y _) s + +/-- 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, L[Λ] (p i) (l i)) • + lorentzMix Λ (fun t => iteratedCovDerivAdjoint A (List.ofFn p) F' t φ) x 0 := by + have := repLorentz_tower Λ (fun n l => iteratedCovDerivAdjoint A (List.ofFn l) F) + (fun n l => iteratedCovDerivAdjoint A (List.ofFn l) F') (bracketFamConv A) LinearMap.id + (fun _ l _ => by rw [List.ofFn_succ]; rfl) (fun _ l _ => by rw [List.ofFn_succ]; rfl) + (fun _ x φ => hF x φ) (fun ρ G G' hG s φ => repLorentz_bracketFamConv hmul hA Λ ρ G G' hG s φ) + (fun ρ _ _ c G s φ => bracketFamConv_sum_fam ρ c G s φ) + (fun _ _ _ _ => by simp only [LinearMap.comp_id, LinearMap.id_apply]) n l x φ + simpa only [LinearMap.id_apply] using this /-- 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), + ∀ (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 φ + ∑ i, c i • iteratedCovDerivAdjoint A l (H i) x φ + | [], x, φ => by simp only [iteratedCovDerivAdjoint, LinearMap.sum_apply, LinearMap.smul_apply] + | ρ :: l, x, φ => by 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] + simp only [iteratedCovDerivAdjoint_sum_fam c H l t χ, LinearMap.sum_apply, + LinearMap.smul_apply] + simp only [iteratedCovDerivAdjoint, covDerivAdjoint_apply, hfam, bracketFamConv_sum_fam, + LinearMap.sum_apply, LinearMap.smul_apply, smul_add, Finset.sum_add_distrib] /-- 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₂) + (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] + lorentzMix Λ (fun t => ∑ a, L[Λ] a μ • ∑ b, L[Λ] b ν • fieldStrength A a b t φ) x 0 := by -- 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 + have hder : ∀ κ σ, repLorentz Λ (A (κ ::ₘ x) σ φ) = + lorentzMix Λ (fun t => ∑ a, L[Λ] a κ • ∑ b, L[Λ] 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] + rw [repLorentz_apply_mix hA Λ (κ ::ₘ x) σ φ, lorentzMix_cons_zero, lorentzMix_sum_fam] + exact Finset.sum_congr rfl fun a _ => (lorentzMix_smul_fam _ _ _ _ _).symm -- 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] + have hcomm : repLorentz Λ (commutatorFam A μ ν x φ) = + lorentzMix Λ (fun t => ∑ a, L[Λ] a μ • ∑ b, L[Λ] b ν • commutatorFam A a b t φ) x 0 := by + have hG : ∀ y χ, repLorentz Λ (A y ν χ) = + lorentzMix Λ (fun t => (∑ b, L[Λ] b ν • A t b) χ) y 0 := fun y χ => by + simpa only [LinearMap.sum_apply, LinearMap.smul_apply] using repLorentz_apply_mix hA Λ y ν χ + rw [show commutatorFam A μ ν x = bracketFamConv A μ (fun r => A r ν) x from rfl, + repLorentz_bracketFamConv hmul hA Λ μ _ _ hG x φ, lorentzMix_sum_fam] refine Finset.sum_congr rfl fun a _ => ?_ rw [lorentzMix_smul_fam] - congr 2 + exact congrArg (fun G => L[Λ] a μ • lorentzMix Λ G x 0) + (funext fun t => bracketFamConv_sum_fam (A := A) a _ (fun b r => A r b) t φ) + -- the second derivative term, with its two sums exchanged + have hswap : (fun t => ∑ a, L[Λ] a ν • ∑ b, L[Λ] b μ • A (a ::ₘ t) b φ) = + fun t => ∑ a, L[Λ] a μ • ∑ b, L[Λ] b ν • A (b ::ₘ t) a φ := by 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] + simp only [Finset.smul_sum, smul_smul] 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] + exact Finset.sum_congr rfl fun a _ => Finset.sum_congr rfl fun b _ => by rw [mul_comm] + rw [fieldStrength_apply, map_add, map_sub, hder μ ν, hder ν μ, hswap, hcomm, + ← lorentzMix_sub_fam, ← lorentzMix_add_fam] + refine congrArg (fun G => lorentzMix Λ G x 0) (funext fun t => ?_) + simp only [fieldStrength_apply, smul_sub, smul_add, Finset.sum_sub_distrib, + Finset.sum_add_distrib] /-- 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 @@ -1295,59 +798,40 @@ lemma repLorentz_iteratedCovDerivAdjoint_fieldStrength ∑ 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 φ] + have hF' : ∀ y χ, repLorentz Λ (fieldStrength A μ ν y χ) = + lorentzMix Λ (fun t => (∑ a, L[Λ] a μ • ∑ b, L[Λ] b ν • fieldStrength A a b t) χ) y 0 := + fun y χ => by + simpa only [LinearMap.sum_apply, LinearMap.smul_apply] using + repLorentz_fieldStrength_mix hmul hA Λ μ ν y χ + rw [repLorentz_iteratedCovDerivAdjoint hmul hA Λ (fieldStrength A μ ν) _ hF' n l 0 φ] + simp only [lorentzMix_zero, iteratedCovDerivAdjoint_sum_fam] /-! ## F. 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 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. -/ +/-- 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 + rw [LinearMap.neg_apply, bracketFam_apply_eq_sum, bracketFam_apply_eq_sum, + ← Finset.sum_neg_distrib, Finset.sum_comm] + refine Finset.sum_congr rfl fun j _ => ?_ + rw [← Finset.sum_neg_distrib] + refine Finset.sum_congr rfl fun k _ => ?_ + rw [(hfg _ _).eq, ← lie_skew, map_neg, neg_smul] /-- 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 @@ -1364,8 +848,8 @@ lemma commutatorFam_swap 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`. -/ + 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' μ' ψ')) @@ -1374,24 +858,110 @@ lemma fieldStrength_swap 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`. -/ +/-- 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 + (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 φ] + 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 +/-! + +## G. What a covariant tower inherits from its family + +Three facts about the covariant tower of a single matter family, in the form the field +algebra consumes. The span lemma `IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter` says +that the bare symbols and the tower generate the same algebra over the gauge-field symbols, +so each is a polynomial in the other: `symbol_mem_adjoin` and `covDerivIter_mem_adjoin`. +The tower commutes with the gauge-field symbols as soon as the bare symbols do, the tower +being a polynomial in symbols that commute with them. And a gauge tensor transforms at the +base point through the dual coefficient of the base-point value alone, the Leibniz +convolution over the empty multiset having a single term. + +-/ + +namespace IsGaugeField + +variable {B : Type} [Ring B] [Algebra ℂ B] {repGauge : Representation ℂ JetGaugeGroupI B} +variable {A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} +variable {V : Type} [AddCommGroup V] [Module ℂ V] [FiniteDimensional ℂ V] + (act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℂ] V) (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B) + +/-- A bare matter symbol is a polynomial in the gauge-field symbols and the covariant + tower of its family. -/ +lemma symbol_mem_adjoin {X : Set B} (hA : ∀ s μ ψ, A s μ ψ ∈ X) + (hF : ∀ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) φ, covDerivIter A act F n l 0 φ ∈ X) + (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V) : F s φ ∈ Algebra.adjoin ℂ X := by + refine Algebra.adjoin_mono ?_ ((adjoin_symbols_eq_adjoin_covDerivIter (A := A) act F).le + (Algebra.subset_adjoin (Or.inr ⟨s, φ, rfl⟩))) + rintro b (⟨s, μ, ψ, rfl⟩ | ⟨n, l, φ, rfl⟩) + exacts [hA s μ ψ, hF n l φ] + +/-- A symbol of a covariant tower is a polynomial in the gauge-field symbols and the bare + symbols of its family. -/ +lemma covDerivIter_mem_adjoin {X : Set B} (hA : ∀ s μ ψ, A s μ ψ ∈ X) + (hF : ∀ s φ, F s φ ∈ X) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V) : + covDerivIter A act F n l 0 φ ∈ Algebra.adjoin ℂ X := by + refine Algebra.adjoin_mono ?_ (covDerivIter_mem_adjoin_symbols act F n l 0 φ) + rintro b (⟨s, μ, ψ, rfl⟩ | ⟨s, φ, rfl⟩) + exacts [hA s μ ψ, hF s φ] + +/-- A symbol of a covariant tower commutes with the gauge-field symbols, as soon as the + bare symbols of its family do. -/ +lemma commute_covDerivIter + (hAA : ∀ (s s' : Multiset (Fin 1 ⊕ Fin 3)) (μ μ' : Fin 1 ⊕ Fin 3) + (ψ ψ' : Module.Dual ℝ GaugeAlgebra), Commute (A s μ ψ) (A s' μ' ψ')) + (hAF : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (ψ : Module.Dual ℝ GaugeAlgebra) + (s' : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V), Commute (A s μ ψ) (F s' φ)) + (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V) + (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (ψ : Module.Dual ℝ GaugeAlgebra) : + Commute (covDerivIter A act F n l 0 φ) (A p μ ψ) := by + refine commute_of_mem_adjoin ?_ (covDerivIter_mem_adjoin_symbols act F n l 0 φ) + rintro y (⟨s, μ', ψ', rfl⟩ | ⟨s, φ', rfl⟩) + exacts [hAA s p μ' μ ψ' ψ, (hAF p μ ψ s φ').symm] + +omit [FiniteDimensional ℂ V] in +/-- A matter gauge tensor transforms at the base point through the dual coefficient of the + base-point value of the gauge jet alone. -/ +lemma _root_.StandardModel.TransformsIn.repGauge_zero + {rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)} + {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B} (hF : TransformsIn repGauge rep F) + (U : JetGaugeGroupI) (φ : Module.Dual ℂ V) : + repGauge U (F 0 φ) = F 0 (repDualCoeff rep U⁻¹ 0 φ) := by + simpa only [Multiset.antidiagonal_zero, Multiset.map_singleton, Multiset.sum_singleton] using + hF U φ 0 + +/-- An adjoint gauge tensor transforms at the base point through the dual adjoint + coefficient of the base-point value of the gauge jet alone. -/ +lemma TransformsInAdjoint.repGauge_zero + {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} + (hF : TransformsInAdjoint repGauge F) (U : JetGaugeGroupI) (φ : Module.Dual ℝ GaugeAlgebra) : + repGauge U (F 0 φ) = F 0 (adjointDualCoeff U⁻¹ 0 φ) := by + simpa only [Multiset.antidiagonal_zero, Multiset.map_singleton, Multiset.sum_singleton] using + hF U φ 0 + +end IsGaugeField + +/-! + +## H. The field algebra and the covariant towers + +The field algebra is the algebra generated by every derivative symbol of the theory. The +covariant towers are the iterated covariant derivatives of the twelve matter families along +ordered tuples of directions, evaluated at the empty multiset, each built with the +infinitesimal action of its species (`GaugeAlgebra.actionConj` of it for a conjugate +family), together with the iterated covariant derivative of the field strength along a list +of directions. The set `matterTowers` collects the twelve matter towers, and +`matterTowers_induction` is the case split over them that the rest of the file runs. + +-/ + namespace AlgebraRealization variable {B : Type} [Ring B] [Algebra ℂ B] @@ -1400,125 +970,148 @@ variable {B : Type} [Ring B] [Algebra ℂ B] {massWeightPoly : B →ₐ[ℂ] Polynomial B} (h : AlgebraRealization B repJet repLorentz massWeightPoly) - -/-! - -## G. The field algebra - --/ +/-- The generators of the field algebra: every derivative symbol of the gauge field, of + the Higgs and its conjugate, and of the three generations of each fermion species and + their conjugates. -/ +def symbols : Set B := + (⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.A s μ)) ∪ + (⋃ (s : Multiset (Fin 1 ⊕ Fin 3)), Set.range (h.H s) ∪ Set.range (h.barH s)) ∪ + (⋃ (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)), + Set.range (h.d i s) ∪ Set.range (h.bard i s) ∪ + Set.range (h.u i s) ∪ Set.range (h.baru i s) ∪ + Set.range (h.Q i s) ∪ Set.range (h.barQ i s) ∪ + Set.range (h.L i s) ∪ Set.range (h.barL i s) ∪ + Set.range (h.e i s) ∪ Set.range (h.bare i s)) /-- 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 : AlgebraRealization B repJet repLorentz massWeightPoly): Subalgebra ℂ B := - Algebra.adjoin ℂ - ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.A s μ)) ∪ - (⋃ (s : Multiset (Fin 1 ⊕ Fin 3)), Set.range (h.H s) ∪ Set.range (h.barH s)) ∪ - (⋃ (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)), - Set.range (h.d i s) ∪ Set.range (h.bard i s) ∪ - Set.range (h.u i s) ∪ Set.range (h.baru i s) ∪ - Set.range (h.Q i s) ∪ Set.range (h.barQ i s) ∪ - Set.range (h.L i s) ∪ Set.range (h.barL i s) ∪ - Set.range (h.e i s) ∪ Set.range (h.bare i s))) +def fieldAlgebra : Subalgebra ℂ B := Algebra.adjoin ℂ h.symbols -/-! - -## H. Covariant derivatives +/-- The iterated covariant derivative of the Higgs field. -/ +noncomputable def covDerivH {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ HiggsVec →ₗ[ℂ] B := + IsGaugeField.covDerivIter h.A HiggsVec.gaugeAlgebraAction h.H n l 0 --/ +/-- The iterated covariant derivative of the conjugate Higgs field. -/ +noncomputable def covDerivBarH {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (ConjModule HiggsVec) →ₗ[ℂ] B := + IsGaugeField.covDerivIter h.A (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.barH n l 0 -include h in /-- The iterated covariant derivative of the down-type quarks. -/ -noncomputable def covDerivD (h : AlgebraRealization B repJet repLorentz massWeightPoly) - (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : +noncomputable def covDerivD (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : Module.Dual ℂ DownSinglet →ₗ[ℂ] B := IsGaugeField.covDerivIter h.A DownSinglet.gaugeAlgebraAction (h.d i) n l 0 /-- The iterated covariant derivative of the conjugate down-type quarks. -/ -noncomputable def covDerivBarD (h : AlgebraRealization B repJet repLorentz massWeightPoly) - (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : +noncomputable def covDerivBarD (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : Module.Dual ℂ (ConjModule DownSinglet) →ₗ[ℂ] B := IsGaugeField.covDerivIter h.A (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) - (h.bard i) n l 0 - -/-- The iterated covariant derivative of the Higgs field. -/ -noncomputable def covDerivH (h : AlgebraRealization B repJet repLorentz massWeightPoly) {n : ℕ} - (l : Fin n → (Fin 1 ⊕ Fin 3)) : - Module.Dual ℂ HiggsVec →ₗ[ℂ] B := - IsGaugeField.covDerivIter h.A HiggsVec.gaugeAlgebraAction h.H n l 0 - -/-- The iterated covariant derivative of the conjugate Higgs field. -/ -noncomputable def covDerivBarH (h : AlgebraRealization B repJet repLorentz massWeightPoly) {n : ℕ} - (l : Fin n → (Fin 1 ⊕ Fin 3)) : - Module.Dual ℂ (ConjModule HiggsVec) →ₗ[ℂ] B := - IsGaugeField.covDerivIter h.A (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) - h.barH n l 0 + (h.bard i) n l 0 /-- The iterated covariant derivative of the up-type quarks. -/ -noncomputable def covDerivU (h : AlgebraRealization B repJet repLorentz massWeightPoly) - (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : +noncomputable def covDerivU (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : Module.Dual ℂ UpSinglet →ₗ[ℂ] B := IsGaugeField.covDerivIter h.A UpSinglet.gaugeAlgebraAction (h.u i) n l 0 /-- The iterated covariant derivative of the conjugate up-type quarks. -/ -noncomputable def covDerivBarU (h : AlgebraRealization B repJet repLorentz massWeightPoly) - (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : +noncomputable def covDerivBarU (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : Module.Dual ℂ (ConjModule UpSinglet) →ₗ[ℂ] B := IsGaugeField.covDerivIter h.A (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) - (h.baru i) n l 0 + (h.baru i) n l 0 /-- The iterated covariant derivative of the quark doublets. -/ -noncomputable def covDerivQ (h : AlgebraRealization B repJet repLorentz massWeightPoly) - (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : +noncomputable def covDerivQ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : Module.Dual ℂ QuarkDoublet →ₗ[ℂ] B := IsGaugeField.covDerivIter h.A QuarkDoublet.gaugeAlgebraAction (h.Q i) n l 0 /-- The iterated covariant derivative of the conjugate quark doublets. -/ -noncomputable def covDerivBarQ (h : AlgebraRealization B repJet repLorentz massWeightPoly) - (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : +noncomputable def covDerivBarQ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : Module.Dual ℂ (ConjModule QuarkDoublet) →ₗ[ℂ] B := IsGaugeField.covDerivIter h.A (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) - (h.barQ i) n l 0 + (h.barQ i) n l 0 /-- The iterated covariant derivative of the lepton doublets. -/ -noncomputable def covDerivL (h : AlgebraRealization B repJet repLorentz massWeightPoly) - (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : +noncomputable def covDerivL (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : Module.Dual ℂ LeptonDoublet →ₗ[ℂ] B := IsGaugeField.covDerivIter h.A LeptonDoublet.gaugeAlgebraAction (h.L i) n l 0 /-- The iterated covariant derivative of the conjugate lepton doublets. -/ -noncomputable def covDerivBarL (h : AlgebraRealization B repJet repLorentz massWeightPoly) - (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : +noncomputable def covDerivBarL (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : Module.Dual ℂ (ConjModule LeptonDoublet) →ₗ[ℂ] B := IsGaugeField.covDerivIter h.A (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) - (h.barL i) n l 0 + (h.barL i) n l 0 /-- The iterated covariant derivative of the lepton singlets. -/ -noncomputable def covDerivE (h : AlgebraRealization B repJet repLorentz massWeightPoly) - (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : +noncomputable def covDerivE (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : Module.Dual ℂ LeptonSinglet →ₗ[ℂ] B := IsGaugeField.covDerivIter h.A LeptonSinglet.gaugeAlgebraAction (h.e i) n l 0 /-- The iterated covariant derivative of the conjugate lepton singlets. -/ -noncomputable def covDerivBarE (h : AlgebraRealization B repJet repLorentz massWeightPoly) - (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : +noncomputable def covDerivBarE (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : Module.Dual ℂ (ConjModule LeptonSinglet) →ₗ[ℂ] B := IsGaugeField.covDerivIter h.A (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) - (h.bare i) n l 0 + (h.bare i) n l 0 +/-- The iterated covariant derivative `∇_{l₁} ⋯ ∇_{lₙ} F_{μν}` of the field strength of the + gauge field, along an ordered list of directions. -/ +noncomputable def covDerivFieldStrength (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : + Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B := + IsGaugeField.iteratedCovDerivAdjoint h.A l (IsGaugeField.fieldStrength h.A μ ν) 0 + +/-- The covariant towers of the twelve matter families: every symbol of every tower. -/ +def matterTowers : 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)) + +/-- A property of every symbol of every matter tower is proved tower by tower. -/ +lemma matterTowers_induction (P : B → Prop) {b : B} (hb : b ∈ h.matterTowers) + (hH : ∀ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) φ, P (h.covDerivH l φ)) + (hbarH : ∀ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) φ, P (h.covDerivBarH l φ)) + (hd : ∀ (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) φ, P (h.covDerivD i l φ)) + (hbard : ∀ (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) φ, P (h.covDerivBarD i l φ)) + (hu : ∀ (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) φ, P (h.covDerivU i l φ)) + (hbaru : ∀ (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) φ, P (h.covDerivBarU i l φ)) + (hQ : ∀ (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) φ, P (h.covDerivQ i l φ)) + (hbarQ : ∀ (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) φ, P (h.covDerivBarQ i l φ)) + (hL : ∀ (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) φ, P (h.covDerivL i l φ)) + (hbarL : ∀ (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) φ, P (h.covDerivBarL i l φ)) + (he : ∀ (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) φ, P (h.covDerivE i l φ)) + (hbare : ∀ (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) φ, P (h.covDerivBarE i l φ)) : + P b := by + rcases hb with hb | hb + · simp only [Set.mem_iUnion] at hb + obtain ⟨n, l, ⟨φ, rfl⟩ | ⟨φ, rfl⟩⟩ := hb + exacts [hH n l φ, hbarH n l φ] + · simp only [Set.mem_iUnion] at hb + obtain ⟨i, n, l, hb⟩ := hb + rcases hb with (((((((((⟨φ, rfl⟩ | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | + ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) + exacts [hd i n l φ, hbard i n l φ, hu i n l φ, hbaru i n l φ, hQ i n l φ, hbarQ i n l φ, + hL i n l φ, hbarL i n l φ, he i n l φ, hbare i n l φ] /-! -## I. The algebra written in terms of covariant derivatives +## I. The covariant towers generate the field algebra +For a single matter family the span lemma +`IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter` says that its bare symbols and its +covariant tower generate the same algebra together with the gauge-field symbols. The field +algebra is that statement for the twelve families at once: each bare symbol is a polynomial +in the gauge-field symbols and its own tower, and each tower symbol is a polynomial in the +gauge-field symbols and its own bare symbols. -/ -/-- **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). -/ + +/-- The covariant towers generate the field algebra: replacing the plain derivative + symbols of every matter field by their covariant derivative towers does not change the + generated algebra; only the gauge-field symbols remain plain. -/ lemma fieldAlgebra_eq_covDeriv : h.fieldAlgebra = Algebra.adjoin ℂ ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.A s μ)) ∪ @@ -1530,1249 +1123,427 @@ lemma fieldAlgebra_eq_covDeriv : 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 = h.A s μ ψ} ∪ - {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (HiggsVec)), - b = h.H s φ}) = - Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (HiggsVec)), - b = IsGaugeField.covDerivIter h.A (HiggsVec.gaugeAlgebraAction) h.H n l 0 φ}) := - IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter (HiggsVec.gaugeAlgebraAction) h.H - have hATbarH : - Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule HiggsVec)), - b = h.barH s φ}) = - Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule HiggsVec)), - b = IsGaugeField.covDerivIter h.A - (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.barH n l 0 φ}) := - IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter - (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.barH - have hATd : ∀ i : Fin 3, - Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (DownSinglet)), - b = h.d i s φ}) = - Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (DownSinglet)), - b = IsGaugeField.covDerivIter h.A (DownSinglet.gaugeAlgebraAction) (h.d i) n l 0 φ}) := - fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter (DownSinglet.gaugeAlgebraAction) - (h.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 = h.A s μ ψ} ∪ - {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule DownSinglet)), - b = h.bard i s φ}) = - Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule DownSinglet)), - b = IsGaugeField.covDerivIter h.A - (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (h.bard i) n l 0 φ}) := - fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter - (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (h.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 = h.A s μ ψ} ∪ - {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (UpSinglet)), - b = h.u i s φ}) = - Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (UpSinglet)), - b = IsGaugeField.covDerivIter h.A (UpSinglet.gaugeAlgebraAction) (h.u i) n l 0 φ}) := - fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter (UpSinglet.gaugeAlgebraAction) - (h.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 = h.A s μ ψ} ∪ - {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule UpSinglet)), - b = h.baru i s φ}) = - Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule UpSinglet)), - b = IsGaugeField.covDerivIter h.A - (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (h.baru i) n l 0 φ}) := - fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter - (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (h.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 = h.A s μ ψ} ∪ - {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (QuarkDoublet)), - b = h.Q i s φ}) = - Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (QuarkDoublet)), - b = IsGaugeField.covDerivIter h.A (QuarkDoublet.gaugeAlgebraAction) (h.Q i) n l 0 φ}) := - fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter (QuarkDoublet.gaugeAlgebraAction) - (h.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 = h.A s μ ψ} ∪ - {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule QuarkDoublet)), - b = h.barQ i s φ}) = - Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule QuarkDoublet)), - b = IsGaugeField.covDerivIter h.A - (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (h.barQ i) n l 0 φ}) := - fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter - (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (h.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 = h.A s μ ψ} ∪ - {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (LeptonDoublet)), - b = h.L i s φ}) = - Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (LeptonDoublet)), - b = IsGaugeField.covDerivIter h.A (LeptonDoublet.gaugeAlgebraAction) - (h.L i) n l 0 φ}) := - fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter (LeptonDoublet.gaugeAlgebraAction) - (h.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 = h.A s μ ψ} ∪ - {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule LeptonDoublet)), - b = h.barL i s φ}) = - Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule LeptonDoublet)), - b = IsGaugeField.covDerivIter h.A - (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (h.barL i) n l 0 φ}) := - fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter - (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (h.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 = h.A s μ ψ} ∪ - {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (LeptonSinglet)), - b = h.e i s φ}) = - Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (LeptonSinglet)), - b = IsGaugeField.covDerivIter h.A (LeptonSinglet.gaugeAlgebraAction) - (h.e i) n l 0 φ}) := - fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter (LeptonSinglet.gaugeAlgebraAction) - (h.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 = h.A s μ ψ} ∪ - {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule LeptonSinglet)), - b = h.bare i s φ}) = - Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule LeptonSinglet)), - b = IsGaugeField.covDerivIter h.A - (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (h.bare i) n l 0 φ}) := - fun i => IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter - (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (h.bare i) - -- every plain matter symbol lies in the covariant algebra - have hmem_H : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (HiggsVec)), - h.H s φ ∈ Algebra.adjoin ℂ - ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.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.H s φ ∈ Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (HiggsVec)), - b = IsGaugeField.covDerivIter h.A (HiggsVec.gaugeAlgebraAction) h.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 h.A (HiggsVec.gaugeAlgebraAction) h.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)), - h.barH s φ ∈ Algebra.adjoin ℂ - ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.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.barH s φ ∈ Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule HiggsVec)), - b = IsGaugeField.covDerivIter h.A - (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.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 h.A - (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.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)), - h.d i s φ ∈ Algebra.adjoin ℂ - ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.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 : h.d i s φ ∈ Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (DownSinglet)), - b = IsGaugeField.covDerivIter h.A (DownSinglet.gaugeAlgebraAction) (h.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 - (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 h.A (DownSinglet.gaugeAlgebraAction) (h.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)), - h.bard i s φ ∈ Algebra.adjoin ℂ - ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.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 : h.bard i s φ ∈ Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule DownSinglet)), - b = IsGaugeField.covDerivIter h.A - (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (h.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 h.A - (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (h.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)), - h.u i s φ ∈ Algebra.adjoin ℂ - ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.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 : h.u i s φ ∈ Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (UpSinglet)), - b = IsGaugeField.covDerivIter h.A (UpSinglet.gaugeAlgebraAction) (h.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 h.A (UpSinglet.gaugeAlgebraAction) (h.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)), - h.baru i s φ ∈ Algebra.adjoin ℂ - ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.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 : h.baru i s φ ∈ Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule UpSinglet)), - b = IsGaugeField.covDerivIter h.A - (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (h.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 h.A - (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (h.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)), - h.Q i s φ ∈ Algebra.adjoin ℂ - ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.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 : h.Q i s φ ∈ Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (QuarkDoublet)), - b = IsGaugeField.covDerivIter h.A (QuarkDoublet.gaugeAlgebraAction) (h.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 h.A (QuarkDoublet.gaugeAlgebraAction) (h.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)), - h.barQ i s φ ∈ Algebra.adjoin ℂ - ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.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 : h.barQ i s φ ∈ Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule QuarkDoublet)), - b = IsGaugeField.covDerivIter h.A - (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (h.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 - (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 h.A - (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (h.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)), - h.L i s φ ∈ Algebra.adjoin ℂ - ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.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 : h.L i s φ ∈ Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (LeptonDoublet)), - b = IsGaugeField.covDerivIter h.A (LeptonDoublet.gaugeAlgebraAction) - (h.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 h.A (LeptonDoublet.gaugeAlgebraAction) (h.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)), - h.barL i s φ ∈ Algebra.adjoin ℂ - ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.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 : h.barL i s φ ∈ Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule LeptonDoublet)), - b = IsGaugeField.covDerivIter h.A - (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (h.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 h.A - (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (h.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)), - h.e i s φ ∈ Algebra.adjoin ℂ + rw [Set.union_assoc] + show Algebra.adjoin ℂ h.symbols = Algebra.adjoin ℂ ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.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 : h.e i s φ ∈ Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (LeptonSinglet)), - b = IsGaugeField.covDerivIter h.A (LeptonSinglet.gaugeAlgebraAction) - (h.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 h.A (LeptonSinglet.gaugeAlgebraAction) (h.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)), - h.bare i s φ ∈ Algebra.adjoin ℂ - ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.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 : h.bare i s φ ∈ Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule LeptonSinglet)), - b = IsGaugeField.covDerivIter h.A - (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (h.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 h.A - (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (h.bare i) n l 0 φ' - ∈ Set.range (h.covDerivBarE i l) := ⟨φ', rfl⟩ - simp only [Set.mem_union] - tauto + h.matterTowers) + have hA : ∀ s μ ψ, h.A s μ ψ ∈ + (⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.A s μ)) ∪ + h.matterTowers := + fun s μ ψ => Or.inl (Set.mem_iUnion_of_mem s (Set.mem_iUnion_of_mem μ ⟨ψ, rfl⟩)) + have hA' : ∀ s μ ψ, h.A s μ ψ ∈ h.symbols := + fun s μ ψ => Or.inl (Or.inl (Set.mem_iUnion_of_mem s (Set.mem_iUnion_of_mem μ ⟨ψ, rfl⟩))) refine le_antisymm (Algebra.adjoin_le ?_) (Algebra.adjoin_le ?_) - · rintro b (hAH | hbF) - · 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 - rcases hbF with (((((((((⟨φ, rfl⟩ | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | + -- every bare symbol is a polynomial in the gauge-field symbols and its tower + · rintro b ((hb | hb) | hb) + · exact Algebra.subset_adjoin (Or.inl hb) + · simp only [Set.mem_iUnion] at hb + obtain ⟨s, ⟨φ, rfl⟩ | ⟨φ, rfl⟩⟩ := hb + · exact IsGaugeField.symbol_mem_adjoin HiggsVec.gaugeAlgebraAction h.H hA + (fun n l φ => Or.inr (Or.inl (Set.mem_iUnion_of_mem n + (Set.mem_iUnion_of_mem l (by simp [covDerivH]))))) s φ + · exact IsGaugeField.symbol_mem_adjoin (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) + h.barH hA (fun n l φ => Or.inr (Or.inl (Set.mem_iUnion_of_mem n + (Set.mem_iUnion_of_mem l (by simp [covDerivBarH]))))) s φ + · simp only [Set.mem_iUnion] at hb + obtain ⟨i, s, hb⟩ := hb + rcases hb 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 h.A (HiggsVec.gaugeAlgebraAction) h.H n l 0 φ - ∈ Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (HiggsVec)), b = h.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 h.A - (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.barH n l 0 φ - ∈ Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule HiggsVec)), b = h.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 h.A (DownSinglet.gaugeAlgebraAction) (h.d i) n l 0 φ - ∈ Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (DownSinglet)), b = h.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 - (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 : h.d i s' φ' ∈ Set.range (h.d i s') := ⟨φ', rfl⟩ - simp only [Set.mem_union] - tauto - · have h1 : IsGaugeField.covDerivIter h.A - (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (h.bard i) n l 0 φ - ∈ Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule DownSinglet)), b = h.bard i s φ}) := - (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 - (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 : h.bard i s' φ' ∈ Set.range (h.bard i s') := ⟨φ', rfl⟩ - simp only [Set.mem_union] - tauto - · have h1 : IsGaugeField.covDerivIter h.A (UpSinglet.gaugeAlgebraAction) (h.u i) n l 0 φ - ∈ Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (UpSinglet)), b = h.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 : h.u i s' φ' ∈ Set.range (h.u i s') := ⟨φ', rfl⟩ - simp only [Set.mem_union] - tauto - · have h1 : IsGaugeField.covDerivIter h.A - (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (h.baru i) n l 0 φ - ∈ Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule UpSinglet)), b = h.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 : h.baru i s' φ' ∈ Set.range (h.baru i s') := ⟨φ', rfl⟩ - simp only [Set.mem_union] - tauto - · have h1 : IsGaugeField.covDerivIter h.A (QuarkDoublet.gaugeAlgebraAction) (h.Q i) n l 0 φ - ∈ Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (QuarkDoublet)), b = h.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 : h.Q i s' φ' ∈ Set.range (h.Q i s') := ⟨φ', rfl⟩ - simp only [Set.mem_union] - tauto - · have h1 : IsGaugeField.covDerivIter h.A - (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (h.barQ i) n l 0 φ - ∈ Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule QuarkDoublet)), b = h.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 : h.barQ i s' φ' ∈ Set.range (h.barQ i s') := ⟨φ', rfl⟩ - simp only [Set.mem_union] - tauto - · have h1 : IsGaugeField.covDerivIter h.A (LeptonDoublet.gaugeAlgebraAction) (h.L i) n l 0 φ - ∈ Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (LeptonDoublet)), b = h.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 : h.L i s' φ' ∈ Set.range (h.L i s') := ⟨φ', rfl⟩ - simp only [Set.mem_union] - tauto - · have h1 : IsGaugeField.covDerivIter h.A - (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (h.barL i) n l 0 φ - ∈ Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule LeptonDoublet)), b = h.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 : h.barL i s' φ' ∈ Set.range (h.barL i s') := ⟨φ', rfl⟩ - simp only [Set.mem_union] - tauto - · have h1 : IsGaugeField.covDerivIter h.A (LeptonSinglet.gaugeAlgebraAction) (h.e i) n l 0 φ - ∈ Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (LeptonSinglet)), b = h.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 : h.e i s' φ' ∈ Set.range (h.e i s') := ⟨φ', rfl⟩ - simp only [Set.mem_union] - tauto - · have h1 : IsGaugeField.covDerivIter h.A - (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (h.bare i) n l 0 φ - ∈ Algebra.adjoin ℂ - ({b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ GaugeAlgebra), b = h.A s μ ψ} ∪ - {b : B | ∃ (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule LeptonSinglet)), b = h.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 : h.bare i s' φ' ∈ Set.range (h.bare i s') := ⟨φ', rfl⟩ - simp only [Set.mem_union] - tauto + · exact IsGaugeField.symbol_mem_adjoin DownSinglet.gaugeAlgebraAction (h.d i) hA + (fun n l φ => Or.inr (Or.inr (Set.mem_iUnion_of_mem i (Set.mem_iUnion_of_mem n + (Set.mem_iUnion_of_mem l (by simp [covDerivD])))))) s φ + · exact IsGaugeField.symbol_mem_adjoin + (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (h.bard i) hA + (fun n l φ => Or.inr (Or.inr (Set.mem_iUnion_of_mem i (Set.mem_iUnion_of_mem n + (Set.mem_iUnion_of_mem l (by simp [covDerivBarD])))))) s φ + · exact IsGaugeField.symbol_mem_adjoin UpSinglet.gaugeAlgebraAction (h.u i) hA + (fun n l φ => Or.inr (Or.inr (Set.mem_iUnion_of_mem i (Set.mem_iUnion_of_mem n + (Set.mem_iUnion_of_mem l (by simp [covDerivU])))))) s φ + · exact IsGaugeField.symbol_mem_adjoin + (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (h.baru i) hA + (fun n l φ => Or.inr (Or.inr (Set.mem_iUnion_of_mem i (Set.mem_iUnion_of_mem n + (Set.mem_iUnion_of_mem l (by simp [covDerivBarU])))))) s φ + · exact IsGaugeField.symbol_mem_adjoin QuarkDoublet.gaugeAlgebraAction (h.Q i) hA + (fun n l φ => Or.inr (Or.inr (Set.mem_iUnion_of_mem i (Set.mem_iUnion_of_mem n + (Set.mem_iUnion_of_mem l (by simp [covDerivQ])))))) s φ + · exact IsGaugeField.symbol_mem_adjoin + (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (h.barQ i) hA + (fun n l φ => Or.inr (Or.inr (Set.mem_iUnion_of_mem i (Set.mem_iUnion_of_mem n + (Set.mem_iUnion_of_mem l (by simp [covDerivBarQ])))))) s φ + · exact IsGaugeField.symbol_mem_adjoin LeptonDoublet.gaugeAlgebraAction (h.L i) hA + (fun n l φ => Or.inr (Or.inr (Set.mem_iUnion_of_mem i (Set.mem_iUnion_of_mem n + (Set.mem_iUnion_of_mem l (by simp [covDerivL])))))) s φ + · exact IsGaugeField.symbol_mem_adjoin + (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (h.barL i) hA + (fun n l φ => Or.inr (Or.inr (Set.mem_iUnion_of_mem i (Set.mem_iUnion_of_mem n + (Set.mem_iUnion_of_mem l (by simp [covDerivBarL])))))) s φ + · exact IsGaugeField.symbol_mem_adjoin LeptonSinglet.gaugeAlgebraAction (h.e i) hA + (fun n l φ => Or.inr (Or.inr (Set.mem_iUnion_of_mem i (Set.mem_iUnion_of_mem n + (Set.mem_iUnion_of_mem l (by simp [covDerivE])))))) s φ + · exact IsGaugeField.symbol_mem_adjoin + (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (h.bare i) hA + (fun n l φ => Or.inr (Or.inr (Set.mem_iUnion_of_mem i (Set.mem_iUnion_of_mem n + (Set.mem_iUnion_of_mem l (by simp [covDerivBarE])))))) s φ + -- every symbol of a tower is a polynomial in the gauge-field symbols and its bare symbols + · rintro b (hb | hb) + · exact Algebra.subset_adjoin (Or.inl (Or.inl hb)) + · refine h.matterTowers_induction (fun b => b ∈ Algebra.adjoin ℂ h.symbols) hb + ?_ ?_ ?_ ?_ ?_ ?_ ?_ ?_ ?_ ?_ ?_ ?_ + · exact fun n l φ => IsGaugeField.covDerivIter_mem_adjoin _ _ hA' (fun s φ => + Or.inl (Or.inr (Set.mem_iUnion_of_mem s (by simp)))) n l φ + · exact fun n l φ => IsGaugeField.covDerivIter_mem_adjoin _ _ hA' (fun s φ => + Or.inl (Or.inr (Set.mem_iUnion_of_mem s (by simp)))) n l φ + all_goals exact fun i n l φ => IsGaugeField.covDerivIter_mem_adjoin _ _ hA' (fun s φ => + Or.inr (Set.mem_iUnion_of_mem i (Set.mem_iUnion_of_mem s (by simp)))) n l φ /-! -## J. Gauge covariance of the covariant derivatives +## J. Gauge covariance of the covariant towers + +Each matter tower transforms in the representation of its species, by +`TransformsIn.covDerivIter`; the field-strength tower transforms in the adjoint. At the +base point that is the action of the base-point value of the gauge jet alone, and a pure +gauge jet — one with trivial base-point value — fixes every tower. -/ -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. -/ +/-- The covariant tower of the Higgs transforms in the Higgs representation. -/ lemma transformsIn_covDerivH (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : - TransformsIn repJet (HiggsVec.repJetGaugeGroupI) - (IsGaugeField.covDerivIter h.A (HiggsVec.gaugeAlgebraAction) h.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. -/ + TransformsIn repJet HiggsVec.repJetGaugeGroupI + (IsGaugeField.covDerivIter h.A HiggsVec.gaugeAlgebraAction h.H n l) := + TransformsIn.covDerivIter h.repJet_A h.repJet_H HiggsVec.isInfinitesimalActionOf n l + +/-- The covariant tower of the conjugate Higgs transforms in the conjugate Higgs + representation. -/ lemma transformsIn_covDerivBarH (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : TransformsIn repJet (repConj HiggsVec.repJetGaugeGroupI) - (IsGaugeField.covDerivIter h.A - (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.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. -/ + (IsGaugeField.covDerivIter h.A (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) + h.barH n l) := + TransformsIn.covDerivIter h.repJet_A h.repJet_barH HiggsVec.isInfinitesimalActionOf.conj n l + +/-- The covariant tower of the down-type quarks transforms in their representation. -/ lemma transformsIn_covDerivD (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : - TransformsIn repJet (DownSinglet.repJetGaugeGroupI) - (IsGaugeField.covDerivIter h.A (DownSinglet.gaugeAlgebraAction) (h.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. -/ + TransformsIn repJet DownSinglet.repJetGaugeGroupI + (IsGaugeField.covDerivIter h.A DownSinglet.gaugeAlgebraAction (h.d i) n l) := + TransformsIn.covDerivIter h.repJet_A (h.repJet_d i) DownSinglet.isInfinitesimalActionOf n l + +/-- The covariant tower of the conjugate down-type quarks transforms in their conjugate + representation. -/ lemma transformsIn_covDerivBarD (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : TransformsIn repJet (repConj DownSinglet.repJetGaugeGroupI) (IsGaugeField.covDerivIter h.A (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (h.bard i) n l) := - TransformsIn.covDerivIter h.repJet_A (h.repJet_bard i) (DownSinglet.isInfinitesimalActionOf.conj) 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. -/ +/-- The covariant tower of the up-type quarks transforms in their representation. -/ lemma transformsIn_covDerivU (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : - TransformsIn repJet (UpSinglet.repJetGaugeGroupI) - (IsGaugeField.covDerivIter h.A (UpSinglet.gaugeAlgebraAction) (h.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. -/ + TransformsIn repJet UpSinglet.repJetGaugeGroupI + (IsGaugeField.covDerivIter h.A UpSinglet.gaugeAlgebraAction (h.u i) n l) := + TransformsIn.covDerivIter h.repJet_A (h.repJet_u i) UpSinglet.isInfinitesimalActionOf n l + +/-- The covariant tower of the conjugate up-type quarks transforms in their conjugate + representation. -/ lemma transformsIn_covDerivBarU (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : TransformsIn repJet (repConj UpSinglet.repJetGaugeGroupI) (IsGaugeField.covDerivIter h.A (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (h.baru i) n l) := - TransformsIn.covDerivIter h.repJet_A (h.repJet_baru i) (UpSinglet.isInfinitesimalActionOf.conj) 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. -/ +/-- The covariant tower of the quark doublets transforms in their representation. -/ lemma transformsIn_covDerivQ (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : - TransformsIn repJet (QuarkDoublet.repJetGaugeGroupI) - (IsGaugeField.covDerivIter h.A (QuarkDoublet.gaugeAlgebraAction) (h.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. -/ + TransformsIn repJet QuarkDoublet.repJetGaugeGroupI + (IsGaugeField.covDerivIter h.A QuarkDoublet.gaugeAlgebraAction (h.Q i) n l) := + TransformsIn.covDerivIter h.repJet_A (h.repJet_Q i) QuarkDoublet.isInfinitesimalActionOf n l + +/-- The covariant tower of the conjugate quark doublets transforms in their conjugate + representation. -/ lemma transformsIn_covDerivBarQ (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : TransformsIn repJet (repConj QuarkDoublet.repJetGaugeGroupI) (IsGaugeField.covDerivIter h.A (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (h.barQ i) n l) := - TransformsIn.covDerivIter h.repJet_A (h.repJet_barQ i) (QuarkDoublet.isInfinitesimalActionOf.conj) 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. -/ +/-- The covariant tower of the lepton doublets transforms in their representation. -/ lemma transformsIn_covDerivL (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : - TransformsIn repJet (LeptonDoublet.repJetGaugeGroupI) - (IsGaugeField.covDerivIter h.A (LeptonDoublet.gaugeAlgebraAction) (h.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. -/ + TransformsIn repJet LeptonDoublet.repJetGaugeGroupI + (IsGaugeField.covDerivIter h.A LeptonDoublet.gaugeAlgebraAction (h.L i) n l) := + TransformsIn.covDerivIter h.repJet_A (h.repJet_L i) LeptonDoublet.isInfinitesimalActionOf n l + +/-- The covariant tower of the conjugate lepton doublets transforms in their conjugate + representation. -/ lemma transformsIn_covDerivBarL (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : TransformsIn repJet (repConj LeptonDoublet.repJetGaugeGroupI) (IsGaugeField.covDerivIter h.A (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (h.barL i) n l) := - TransformsIn.covDerivIter h.repJet_A (h.repJet_barL i) (LeptonDoublet.isInfinitesimalActionOf.conj) 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. -/ +/-- The covariant tower of the lepton singlets transforms in their representation. -/ lemma transformsIn_covDerivE (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : - TransformsIn repJet (LeptonSinglet.repJetGaugeGroupI) - (IsGaugeField.covDerivIter h.A (LeptonSinglet.gaugeAlgebraAction) (h.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. -/ + TransformsIn repJet LeptonSinglet.repJetGaugeGroupI + (IsGaugeField.covDerivIter h.A LeptonSinglet.gaugeAlgebraAction (h.e i) n l) := + TransformsIn.covDerivIter h.repJet_A (h.repJet_e i) LeptonSinglet.isInfinitesimalActionOf n l + +/-- The covariant tower of the conjugate lepton singlets transforms in their conjugate + representation. -/ lemma transformsIn_covDerivBarE (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : TransformsIn repJet (repConj LeptonSinglet.repJetGaugeGroupI) (IsGaugeField.covDerivIter h.A (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (h.bare i) n l) := - TransformsIn.covDerivIter h.repJet_A (h.repJet_bare i) (LeptonSinglet.isInfinitesimalActionOf.conj) n l - -/-! - -## K. 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 : AlgebraRealization B repJet repLorentz massWeightPoly) - (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : - Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B := - IsGaugeField.iteratedCovDerivAdjoint h.A l (IsGaugeField.fieldStrength h.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 h.A ν μ = - fun t => - IsGaugeField.fieldStrength h.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 - term. -/ -lemma transformsInAdjoint_covDerivFieldStrength (l : List (Fin 1 ⊕ Fin 3)) - (μ ν : Fin 1 ⊕ Fin 3) : - IsGaugeField.TransformsInAdjoint repJet - (IsGaugeField.iteratedCovDerivAdjoint h.A l (IsGaugeField.fieldStrength h.A μ ν)) := - IsGaugeField.transformsInAdjoint_iteratedCovDerivAdjoint h.repJet_A l μ ν + TransformsIn.covDerivIter h.repJet_A (h.repJet_bare i) + LeptonSinglet.isInfinitesimalActionOf.conj n 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 μ ν φ - -/-! - -## L. 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) (φ) : +/-- The covariant tower of the Higgs transforms through the base point of a gauge jet. -/ +lemma repJet_covDerivH {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI) + (φ : Module.Dual ℂ HiggsVec) : 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) (φ) : + h.covDerivH l (IsGaugeField.repDualCoeff HiggsVec.repJetGaugeGroupI U⁻¹ 0 φ) := + (h.transformsIn_covDerivH n l).repGauge_zero U φ + +/-- The covariant tower of the conjugate Higgs transforms through the base point of a gauge + jet. -/ +lemma repJet_covDerivBarH {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI) + (φ : Module.Dual ℂ (ConjModule HiggsVec)) : 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) (φ) : + h.covDerivBarH l (IsGaugeField.repDualCoeff (repConj HiggsVec.repJetGaugeGroupI) U⁻¹ 0 φ) := + (h.transformsIn_covDerivBarH n l).repGauge_zero U φ + +/-- The covariant tower of the down-type quarks transforms through the base point of a + gauge jet. -/ +lemma repJet_covDerivD (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI) + (φ : Module.Dual ℂ DownSinglet) : 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) (φ) : + h.covDerivD i l (IsGaugeField.repDualCoeff DownSinglet.repJetGaugeGroupI U⁻¹ 0 φ) := + (h.transformsIn_covDerivD i n l).repGauge_zero U φ + +/-- The covariant tower of the conjugate down-type quarks transforms through the base point + of a gauge jet. -/ +lemma repJet_covDerivBarD (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI) + (φ : Module.Dual ℂ (ConjModule DownSinglet)) : 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) (φ) : + h.covDerivBarD i l + (IsGaugeField.repDualCoeff (repConj DownSinglet.repJetGaugeGroupI) U⁻¹ 0 φ) := + (h.transformsIn_covDerivBarD i n l).repGauge_zero U φ + +/-- The covariant tower of the up-type quarks transforms through the base point of a gauge + jet. -/ +lemma repJet_covDerivU (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI) + (φ : Module.Dual ℂ UpSinglet) : 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) (φ) : + h.covDerivU i l (IsGaugeField.repDualCoeff UpSinglet.repJetGaugeGroupI U⁻¹ 0 φ) := + (h.transformsIn_covDerivU i n l).repGauge_zero U φ + +/-- The covariant tower of the conjugate up-type quarks transforms through the base point + of a gauge jet. -/ +lemma repJet_covDerivBarU (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI) + (φ : Module.Dual ℂ (ConjModule UpSinglet)) : 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) (φ) : + h.covDerivBarU i l + (IsGaugeField.repDualCoeff (repConj UpSinglet.repJetGaugeGroupI) U⁻¹ 0 φ) := + (h.transformsIn_covDerivBarU i n l).repGauge_zero U φ + +/-- The covariant tower of the quark doublets transforms through the base point of a gauge + jet. -/ +lemma repJet_covDerivQ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI) + (φ : Module.Dual ℂ QuarkDoublet) : 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) (φ) : + h.covDerivQ i l (IsGaugeField.repDualCoeff QuarkDoublet.repJetGaugeGroupI U⁻¹ 0 φ) := + (h.transformsIn_covDerivQ i n l).repGauge_zero U φ + +/-- The covariant tower of the conjugate quark doublets transforms through the base point + of a gauge jet. -/ +lemma repJet_covDerivBarQ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI) + (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) : 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) (φ) : + h.covDerivBarQ i l + (IsGaugeField.repDualCoeff (repConj QuarkDoublet.repJetGaugeGroupI) U⁻¹ 0 φ) := + (h.transformsIn_covDerivBarQ i n l).repGauge_zero U φ + +/-- The covariant tower of the lepton doublets transforms through the base point of a gauge + jet. -/ +lemma repJet_covDerivL (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI) + (φ : Module.Dual ℂ LeptonDoublet) : 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) (φ) : + h.covDerivL i l (IsGaugeField.repDualCoeff LeptonDoublet.repJetGaugeGroupI U⁻¹ 0 φ) := + (h.transformsIn_covDerivL i n l).repGauge_zero U φ + +/-- The covariant tower of the conjugate lepton doublets transforms through the base point + of a gauge jet. -/ +lemma repJet_covDerivBarL (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI) + (φ : Module.Dual ℂ (ConjModule LeptonDoublet)) : 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) (φ) : + h.covDerivBarL i l + (IsGaugeField.repDualCoeff (repConj LeptonDoublet.repJetGaugeGroupI) U⁻¹ 0 φ) := + (h.transformsIn_covDerivBarL i n l).repGauge_zero U φ + +/-- The covariant tower of the lepton singlets transforms through the base point of a gauge + jet. -/ +lemma repJet_covDerivE (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI) + (φ : Module.Dual ℂ LeptonSinglet) : 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 - -/-! + h.covDerivE i l (IsGaugeField.repDualCoeff LeptonSinglet.repJetGaugeGroupI U⁻¹ 0 φ) := + (h.transformsIn_covDerivE i n l).repGauge_zero U φ -## M. Pure gauge jets fix the matter covariant derivatives - --/ +/-- The covariant tower of the conjugate lepton singlets transforms through the base point + of a gauge jet. -/ +lemma repJet_covDerivBarE (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI) + (φ : Module.Dual ℂ (ConjModule LeptonSinglet)) : + repJet U (h.covDerivBarE i l φ) = + h.covDerivBarE i l + (IsGaugeField.repDualCoeff (repConj LeptonSinglet.repJetGaugeGroupI) U⁻¹ 0 φ) := + (h.transformsIn_covDerivBarE i n l).repGauge_zero U φ -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) (φ) : +/-- A pure gauge jet fixes the covariant tower of the Higgs. -/ +lemma repJet_covDerivH_of_mem_truncationKer_zero {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (U : JetGaugeGroupI.truncationKer 0) (φ : Module.Dual ℂ HiggsVec) : 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) (φ) : +/-- A pure gauge jet fixes the covariant tower of the conjugate Higgs. -/ +lemma repJet_covDerivBarH_of_mem_truncationKer_zero {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (U : JetGaugeGroupI.truncationKer 0) (φ : Module.Dual ℂ (ConjModule HiggsVec)) : 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 φ + (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. -/ +/-- A pure gauge jet fixes the covariant tower of the down-type quarks. -/ lemma repJet_covDerivD_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} - (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI.truncationKer 0) (φ) : + (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI.truncationKer 0) + (φ : Module.Dual ℂ DownSinglet) : 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. -/ +/-- A pure gauge jet fixes the covariant tower of the conjugate down-type quarks. -/ lemma repJet_covDerivBarD_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} - (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI.truncationKer 0) (φ) : + (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI.truncationKer 0) + (φ : Module.Dual ℂ (ConjModule DownSinglet)) : 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 φ + (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. -/ +/-- A pure gauge jet fixes the covariant tower of the up-type quarks. -/ lemma repJet_covDerivU_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} - (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI.truncationKer 0) (φ) : + (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI.truncationKer 0) + (φ : Module.Dual ℂ UpSinglet) : 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. -/ +/-- A pure gauge jet fixes the covariant tower of the conjugate up-type quarks. -/ lemma repJet_covDerivBarU_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} - (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI.truncationKer 0) (φ) : + (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI.truncationKer 0) + (φ : Module.Dual ℂ (ConjModule UpSinglet)) : 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 φ + (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. -/ +/-- A pure gauge jet fixes the covariant tower of the quark doublets. -/ lemma repJet_covDerivQ_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} - (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI.truncationKer 0) (φ) : + (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI.truncationKer 0) + (φ : Module.Dual ℂ QuarkDoublet) : 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. -/ +/-- A pure gauge jet fixes the covariant tower of the conjugate quark doublets. -/ lemma repJet_covDerivBarQ_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} - (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI.truncationKer 0) (φ) : + (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI.truncationKer 0) + (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) : 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 φ + (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. -/ +/-- A pure gauge jet fixes the covariant tower of the lepton doublets. -/ lemma repJet_covDerivL_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} - (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI.truncationKer 0) (φ) : + (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI.truncationKer 0) + (φ : Module.Dual ℂ LeptonDoublet) : 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. -/ +/-- A pure gauge jet fixes the covariant tower of the conjugate lepton doublets. -/ lemma repJet_covDerivBarL_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} - (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI.truncationKer 0) (φ) : + (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI.truncationKer 0) + (φ : Module.Dual ℂ (ConjModule LeptonDoublet)) : 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 φ + (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. -/ +/-- A pure gauge jet fixes the covariant tower of the lepton singlets. -/ lemma repJet_covDerivE_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} - (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI.truncationKer 0) (φ) : + (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI.truncationKer 0) + (φ : Module.Dual ℂ LeptonSinglet) : 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. -/ +/-- A pure gauge jet fixes the covariant tower of the conjugate lepton singlets. -/ lemma repJet_covDerivBarE_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} - (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI.truncationKer 0) (φ) : + (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI.truncationKer 0) + (φ : Module.Dual ℂ (ConjModule LeptonSinglet)) : 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 φ + (fun hW => GaugeAlgebra.repCoeff_repConj_zero_eq_id + (LeptonSinglet.repCoeff_zero_of_eval_eq_one hW)) U φ + +/-- The covariant tower of the field strength is antisymmetric in its two covector + indices: the field strength itself is, the gauge-field symbols commuting, 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 h.A ν μ = fun t => - IsGaugeField.fieldStrength h.A μ ν t from + funext fun t => IsGaugeField.fieldStrength_swap h.A_comm_A μ ν t, + IsGaugeField.iteratedCovDerivAdjoint_neg_fam] + +/-- The covariant tower of the field strength transforms in the adjoint. -/ +lemma transformsInAdjoint_covDerivFieldStrength (l : List (Fin 1 ⊕ Fin 3)) + (μ ν : Fin 1 ⊕ Fin 3) : + IsGaugeField.TransformsInAdjoint repJet + (IsGaugeField.iteratedCovDerivAdjoint h.A l (IsGaugeField.fieldStrength h.A μ ν)) := + IsGaugeField.transformsInAdjoint_iteratedCovDerivAdjoint h.repJet_A l μ ν + +/-- The covariant tower of the field strength transforms through the base point of a gauge + jet: 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 φ) := + (h.transformsInAdjoint_covDerivFieldStrength l μ ν).repGauge_zero U φ + +/-- A pure gauge jet fixes the covariant tower of the field strength. -/ +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 μ ν φ /-! -## N. The classification of gauge invariants +## K. The classification of gauge invariants + +The matter towers commute with the gauge-field symbols and are fixed by pure gauge jets, so +the abstract classification `IsGaugeField.invariant_mem_adjoin_fieldStrength` applies to +the field algebra written in terms of the covariant towers: a jet-gauge invariant is a +polynomial in the covariant towers of the field strength and of the matter fields, gauge +invariance having eliminated the bare gauge-field symbols. -/ -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. -/ +/-- The classification of gauge invariants of the 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. -/ theorem invariant_mem_adjoin_covDeriv {x : B} (hx : x ∈ h.fieldAlgebra) (hinv : ∀ U : JetGaugeGroupI, repJet U x = x) : @@ -2787,163 +1558,222 @@ theorem invariant_mem_adjoin_covDeriv {x : B} 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 (h.A p μ ψ) := by + -- the matter towers commute with the gauge-field symbols + have hcS : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (ψ : Module.Dual ℝ GaugeAlgebra), + ∀ y ∈ h.matterTowers, Commute y (h.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.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) h.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) (h.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) (h.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) (h.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) (h.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) (h.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) (h.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) (h.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) (h.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) (h.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) (h.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 + refine h.matterTowers_induction (fun y => Commute y (h.A p μ ψ)) hy + ?_ ?_ ?_ ?_ ?_ ?_ ?_ ?_ ?_ ?_ ?_ ?_ + · exact fun n l φ => IsGaugeField.commute_covDerivIter _ _ h.A_comm_A h.A_comm_H n l φ p μ ψ + · exact fun n l φ => + IsGaugeField.commute_covDerivIter _ _ h.A_comm_A h.A_comm_barH n l φ p μ ψ + · exact fun i n l φ => IsGaugeField.commute_covDerivIter _ _ h.A_comm_A + (fun s μ ψ s' φ => h.A_comm_d s μ ψ i s' φ) n l φ p μ ψ + · exact fun i n l φ => IsGaugeField.commute_covDerivIter _ _ h.A_comm_A + (fun s μ ψ s' φ => h.A_comm_bard s μ ψ i s' φ) n l φ p μ ψ + · exact fun i n l φ => IsGaugeField.commute_covDerivIter _ _ h.A_comm_A + (fun s μ ψ s' φ => h.A_comm_u s μ ψ i s' φ) n l φ p μ ψ + · exact fun i n l φ => IsGaugeField.commute_covDerivIter _ _ h.A_comm_A + (fun s μ ψ s' φ => h.A_comm_baru s μ ψ i s' φ) n l φ p μ ψ + · exact fun i n l φ => IsGaugeField.commute_covDerivIter _ _ h.A_comm_A + (fun s μ ψ s' φ => h.A_comm_Q s μ ψ i s' φ) n l φ p μ ψ + · exact fun i n l φ => IsGaugeField.commute_covDerivIter _ _ h.A_comm_A + (fun s μ ψ s' φ => h.A_comm_barQ s μ ψ i s' φ) n l φ p μ ψ + · exact fun i n l φ => IsGaugeField.commute_covDerivIter _ _ h.A_comm_A + (fun s μ ψ s' φ => h.A_comm_L s μ ψ i s' φ) n l φ p μ ψ + · exact fun i n l φ => IsGaugeField.commute_covDerivIter _ _ h.A_comm_A + (fun s μ ψ s' φ => h.A_comm_barL s μ ψ i s' φ) n l φ p μ ψ + · exact fun i n l φ => IsGaugeField.commute_covDerivIter _ _ h.A_comm_A + (fun s μ ψ s' φ => h.A_comm_e s μ ψ i s' φ) n l φ p μ ψ + · exact fun i n l φ => IsGaugeField.commute_covDerivIter _ _ h.A_comm_A + (fun s μ ψ s' φ => h.A_comm_bare s μ ψ i s' φ) n l φ p μ ψ + -- the matter towers are fixed by pure gauge jets + have hS : ∀ y ∈ h.matterTowers, ∀ 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 = h.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) + exact h.matterTowers_induction (fun y => repJet U.1 y = y) hy + (fun _ l φ => h.repJet_covDerivH_of_mem_truncationKer_zero l U φ) + (fun _ l φ => h.repJet_covDerivBarH_of_mem_truncationKer_zero l U φ) + (fun i _ l φ => h.repJet_covDerivD_of_mem_truncationKer_zero i l U φ) + (fun i _ l φ => h.repJet_covDerivBarD_of_mem_truncationKer_zero i l U φ) + (fun i _ l φ => h.repJet_covDerivU_of_mem_truncationKer_zero i l U φ) + (fun i _ l φ => h.repJet_covDerivBarU_of_mem_truncationKer_zero i l U φ) + (fun i _ l φ => h.repJet_covDerivQ_of_mem_truncationKer_zero i l U φ) + (fun i _ l φ => h.repJet_covDerivBarQ_of_mem_truncationKer_zero i l U φ) + (fun i _ l φ => h.repJet_covDerivL_of_mem_truncationKer_zero i l U φ) + (fun i _ l φ => h.repJet_covDerivBarL_of_mem_truncationKer_zero i l U φ) + (fun i _ l φ => h.repJet_covDerivE_of_mem_truncationKer_zero i l U φ) + (fun i _ l φ => h.repJet_covDerivBarE_of_mem_truncationKer_zero i l U φ) + -- the invariant lies in the algebra of the gauge-field 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 = h.A p μ ψ} ∪ h.matterTowers) := by + rw [h.fieldAlgebra_eq_covDeriv, Set.union_assoc] at hx + refine Algebra.adjoin_mono ?_ hx + rintro b (hA | hb) · 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) + obtain ⟨s, μ, ψ, rfl⟩ := hA + exact Or.inl ⟨s, μ, ψ, rfl⟩ + · exact Or.inr hb -- 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 + rw [Set.union_assoc] + refine Algebra.adjoin_mono ?_ (IsGaugeField.invariant_mem_adjoin_fieldStrength h.repJet_A + h.A_comm_A h.matterTowers hcS hS hx' hinv) + rintro b (⟨l, ν, lam, φ, rfl⟩ | hb) + · exact Or.inl (Set.mem_iUnion_of_mem l (Set.mem_iUnion_of_mem ν + (Set.mem_iUnion_of_mem lam ⟨φ, rfl⟩))) + · exact Or.inr hb + +end AlgebraRealization + +/-! + +## L. The gauge action commutes with the Lorentz action + +The Lorentz law of a covariant matter tower needs the infinitesimal gauge action of its +species to commute with the Lorentz action on the value space. The two act on different +tensor factors: the Lorentz group on the Weyl factor and the gauge algebra on the colour and +weak factors, so they commute; for the Higgs the Lorentz action is trivial, and for the +charged-lepton singlet the gauge action is a scalar. Conjugation transports the commutation +to the conjugate families. + +-/ + +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) := fun x => by + 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 /-! -## O. The Lorentz laws of the covariant matter towers +## M. 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 `AlgebraRealization` 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`. +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 `AlgebraRealization` into the covariant one, given the commutation of the +gauge action with the Lorentz action of section L; for the conjugate towers that +commutation is transported by `actionConj_comm_repConj`. -/ -include h in +namespace AlgebraRealization + +variable {B : Type} [Ring B] [Algebra ℂ B] + {repJet : Representation ℂ JetGaugeGroupI B} + {repLorentz : Representation ℂ SL(2,ℂ) B} + {massWeightPoly : B →ₐ[ℂ] Polynomial B} + (h : AlgebraRealization B repJet repLorentz massWeightPoly) + /-- The covariant tower of the Higgs transforms as a Lorentz scalar. -/ lemma repLorentz_covDerivH : IsLorentzCovDerivTransforms repLorentz @@ -2951,7 +1781,6 @@ lemma repLorentz_covDerivH : IsGaugeField.isLorentzCovDerivTransforms_covDerivIter h.repLorentz_mul h.repJet_A HiggsVec.gaugeAlgebraAction_comm_repLorentz h.H h.repLorentz_H -include h in /-- The covariant tower of the conjugate Higgs transforms as a Lorentz scalar. -/ lemma repLorentz_covDerivBarH : IsLorentzCovDerivTransforms repLorentz @@ -2961,7 +1790,6 @@ lemma repLorentz_covDerivBarH : (actionConj_comm_repConj HiggsVec.gaugeAlgebraAction _ HiggsVec.gaugeAlgebraAction_comm_repLorentz) h.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) : @@ -2970,9 +1798,8 @@ lemma repLorentz_covDerivD (i : Fin 3) : IsGaugeField.isLorentzCovDerivTransforms_covDerivIter h.repLorentz_mul h.repJet_A DownSinglet.gaugeAlgebraAction_comm_repLorentzGroup (h.d i) (h.repLorentz_d i) -include h in -/-- The covariant tower of the conjugate down-type quarks transforms in the conjugate - Weyl representation. -/ +/-- 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) := @@ -2980,7 +1807,6 @@ lemma repLorentz_covDerivBarD (i : Fin 3) : (actionConj_comm_repConj DownSinglet.gaugeAlgebraAction _ DownSinglet.gaugeAlgebraAction_comm_repLorentzGroup) (h.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 @@ -2988,7 +1814,6 @@ lemma repLorentz_covDerivU (i : Fin 3) : IsGaugeField.isLorentzCovDerivTransforms_covDerivIter h.repLorentz_mul h.repJet_A UpSinglet.gaugeAlgebraAction_comm_repLorentzGroup (h.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) : @@ -2998,7 +1823,6 @@ lemma repLorentz_covDerivBarU (i : Fin 3) : (actionConj_comm_repConj UpSinglet.gaugeAlgebraAction _ UpSinglet.gaugeAlgebraAction_comm_repLorentzGroup) (h.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 @@ -3006,7 +1830,6 @@ lemma repLorentz_covDerivQ (i : Fin 3) : IsGaugeField.isLorentzCovDerivTransforms_covDerivIter h.repLorentz_mul h.repJet_A QuarkDoublet.gaugeAlgebraAction_comm_repLorentzGroup (h.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) : @@ -3016,7 +1839,6 @@ lemma repLorentz_covDerivBarQ (i : Fin 3) : (actionConj_comm_repConj QuarkDoublet.gaugeAlgebraAction _ QuarkDoublet.gaugeAlgebraAction_comm_repLorentzGroup) (h.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 @@ -3024,7 +1846,6 @@ lemma repLorentz_covDerivL (i : Fin 3) : IsGaugeField.isLorentzCovDerivTransforms_covDerivIter h.repLorentz_mul h.repJet_A LeptonDoublet.gaugeAlgebraAction_comm_repLorentzGroup (h.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) : @@ -3034,7 +1855,6 @@ lemma repLorentz_covDerivBarL (i : Fin 3) : (actionConj_comm_repConj LeptonDoublet.gaugeAlgebraAction _ LeptonDoublet.gaugeAlgebraAction_comm_repLorentzGroup) (h.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 @@ -3042,7 +1862,6 @@ lemma repLorentz_covDerivE (i : Fin 3) : IsGaugeField.isLorentzCovDerivTransforms_covDerivIter h.repLorentz_mul h.repJet_A LeptonSinglet.gaugeAlgebraAction_comm_repLorentzGroup (h.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) : From 9a0bb7a60b919e0e6da159a2931116a59202b2b2 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 7 Sep 2026 14:15:23 +0100 Subject: [PATCH 284/367] feat: More clean up --- Physlib.lean | 4 +- .../GaugeTheory/GaugeField/Basic.lean | 2 +- .../GaugeTheory/GaugeJet.lean | 2 + .../Fermions/DownSinglet/Basic.lean | 2 +- .../Fermions/LeptonDoublet/Basic.lean | 2 +- .../Fermions/LeptonSinglet/Basic.lean | 2 +- .../Fermions/QuarkDoublet/Basic.lean | 2 +- .../Fermions/UpSinglet/Basic.lean | 2 +- .../StandardModel/GaugeAlgebra/Basic.lean | 2 +- .../GaugeAlgebra/JetGaugeAlgebra.lean | 2 +- .../GaugeBosons/AlgebraValued/Basic.lean | 2 +- .../GaugeGroup/GaugeWeightDecomposition.lean | 200 +++-- .../GaugeGroup/Invariants/IsSU3BiAdjoint.lean | 110 +-- .../{Jet => JetGaugeGroup}/Basic.lean | 0 .../{Jet => JetGaugeGroup}/Truncation.lean | 2 +- .../GaugeGroup/MaurerCartan/Basic.lean | 2 +- .../GaugeGroup/MaurerCartan/Truncation.lean | 2 +- .../HiggsBoson/JetAlgebra/Basic.lean | 2 +- .../GaugeWeightDecomposition.lean | 97 +-- .../YukawaSector/MassDimLTEight.lean | 13 +- .../BoostWeightDecomposition.lean | 162 +--- .../MassWeight/GaugeWeightDecomposition.lean | 59 +- .../MassWeight/MassDimEight.lean | 2 +- .../MassWeight/MassDimLTEight.lean | 90 +- .../BoostWeightDecomposition.lean | 56 -- .../MassWeight/MassDimEight.lean | 101 +-- .../StandardModel/IsHiggsSector/Basic.lean | 157 +--- .../BoostWeightDecomposition.lean | 43 - .../MassWeight/GaugeWeightDecomposition.lean | 96 +-- .../Matter/JetComponentSpace/Basic.lean | 2 +- Physlib/Particles/StandardModel/Peeling.lean | 10 +- Physlib/Relativity/IsLorentzDeriv.lean | 266 +----- Physlib/Relativity/LightConeDeriv.lean | 332 -------- .../LorentzGroup/Boosts/WeightGrading.lean | 786 ++---------------- 34 files changed, 245 insertions(+), 2369 deletions(-) rename Physlib/Particles/StandardModel/GaugeGroup/{Jet => JetGaugeGroup}/Basic.lean (100%) rename Physlib/Particles/StandardModel/GaugeGroup/{Jet => JetGaugeGroup}/Truncation.lean (99%) diff --git a/Physlib.lean b/Physlib.lean index 0df36a8b6..8e004f8eb 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -305,8 +305,8 @@ public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU3BiAdjoi 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.Jet.Basic -public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Truncation +public import Physlib.Particles.StandardModel.GaugeGroup.JetGaugeGroup.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.JetGaugeGroup.Truncation public import Physlib.Particles.StandardModel.GaugeGroup.MaurerCartan.Basic public import Physlib.Particles.StandardModel.GaugeGroup.MaurerCartan.Truncation public import Physlib.Particles.StandardModel.GaugeGroup.SU2PermDecomposition diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/Basic.lean index f5124a3d4..cb10f674c 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/Basic.lean @@ -17,7 +17,7 @@ public import Physlib.Relativity.SL2C.Basic 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`. +`Physlib.Particles.StandardModel.GaugeGroup.JetGaugeGroup.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 diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeJet.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeJet.lean index c21b5bb23..6df5982ea 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeJet.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeJet.lean @@ -200,6 +200,8 @@ lemma iteratedDeriv_ofConstantLie_of_ne_zero {p : Multiset (Fin 1 ⊕ Fin 3)} (h · rw [iteratedDeriv_zero, LinearMap.id_apply, deriv_ofConstantLie] · rw [ih ht, map_zero] +TODO "Add product of GaugeJet." + end GaugeJet /-! diff --git a/Physlib/Particles/StandardModel/Fermions/DownSinglet/Basic.lean b/Physlib/Particles/StandardModel/Fermions/DownSinglet/Basic.lean index 414e7c76f..e211476da 100644 --- a/Physlib/Particles/StandardModel/Fermions/DownSinglet/Basic.lean +++ b/Physlib/Particles/StandardModel/Fermions/DownSinglet/Basic.lean @@ -8,7 +8,7 @@ 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.GaugeGroup.JetGaugeGroup.Basic public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.CovariantDeriv public import Physlib.Particles.StandardModel.GaugeAlgebra.InfinitesimalAction public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.Basic diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/Basic.lean b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/Basic.lean index 6c9332ba3..7d338b018 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/Basic.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/Basic.lean @@ -8,7 +8,7 @@ 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.GaugeGroup.JetGaugeGroup.Basic public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.CovariantDeriv public import Physlib.Relativity.Tensors.ComplexTensor.Basic public import Mathlib.LinearAlgebra.TensorProduct.Pi diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/Basic.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/Basic.lean index 3fd5fe483..af06e6d57 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/Basic.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/Basic.lean @@ -8,7 +8,7 @@ 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.GaugeGroup.JetGaugeGroup.Basic public import Physlib.Relativity.Tensors.ComplexTensor.Basic public import Physlib.Relativity.DerivAlgebra public import Physlib.Mathematics.ConjModule diff --git a/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/Basic.lean b/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/Basic.lean index 5b030f331..a79c5db2e 100644 --- a/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/Basic.lean +++ b/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/Basic.lean @@ -8,7 +8,7 @@ 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.GaugeGroup.JetGaugeGroup.Basic public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.CovariantDeriv public import Physlib.Relativity.Fermions.Weyl.LeftHanded public import Physlib.Relativity.Fermions.Weyl.RightHanded diff --git a/Physlib/Particles/StandardModel/Fermions/UpSinglet/Basic.lean b/Physlib/Particles/StandardModel/Fermions/UpSinglet/Basic.lean index 5eecac2d8..e0d94e52b 100644 --- a/Physlib/Particles/StandardModel/Fermions/UpSinglet/Basic.lean +++ b/Physlib/Particles/StandardModel/Fermions/UpSinglet/Basic.lean @@ -8,7 +8,7 @@ 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.GaugeGroup.JetGaugeGroup.Basic public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.CovariantDeriv public import Physlib.Relativity.Tensors.ComplexTensor.Basic public import Mathlib.LinearAlgebra.TensorProduct.Pi diff --git a/Physlib/Particles/StandardModel/GaugeAlgebra/Basic.lean b/Physlib/Particles/StandardModel/GaugeAlgebra/Basic.lean index 6c3fc448f..6854c0ca6 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.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.JetGaugeGroup.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 ff5da8145..de8b113e8 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.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.JetGaugeGroup.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/AlgebraValued/Basic.lean b/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Basic.lean index b3d0295d1..99561d7f3 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.Truncation +public import Physlib.Particles.StandardModel.GaugeGroup.JetGaugeGroup.Truncation public import Physlib.Particles.StandardModel.GaugeAlgebra.JetGaugeAlgebra public import Physlib.Particles.StandardModel.GaugeGroup.MaurerCartan.Basic public import Physlib.Relativity.IsLorentzDeriv diff --git a/Physlib/Particles/StandardModel/GaugeGroup/GaugeWeightDecomposition.lean b/Physlib/Particles/StandardModel/GaugeGroup/GaugeWeightDecomposition.lean index df4564633..89ad8de97 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/GaugeWeightDecomposition.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/GaugeWeightDecomposition.lean @@ -50,6 +50,8 @@ this one; it is `GaugeAlgebra.adjointDecomposition` in - `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.mem_piece_zero_sup_of_invariant` : the same relative to a + torus-stable submodule `S`, the form used to peel a sector one submodule at a time. ## iii. Table of contents @@ -242,7 +244,7 @@ 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 +/-- 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 @@ -276,7 +278,7 @@ decomposition was recorded. variable {B : Type*} [Ring B] [Algebra ℂ B] -/-- **A representation acts by algebra maps**, respecting multiplication. This is the +/-- 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 @@ -410,6 +412,10 @@ lemma piece_le_eigenspace (d : GaugeWeightDecomposition rep V) (w : GaugeWeight) 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 +/-- A weight piece lies inside the submodule it decomposes. -/ +lemma piece_le_self (d : GaugeWeightDecomposition rep V) (w : GaugeWeight) : + d.piece w ≤ V := le_trans (le_iSup d.piece w) (le_of_eq d.iSup_piece) + /-- Transport a decomposition along an equality of submodules. -/ @[implicit_reducible] def copy (d : GaugeWeightDecomposition rep V) (W : Submodule ℂ B) (hW : W = V) : @@ -482,7 +488,7 @@ 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 +/-- 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] @@ -517,7 +523,7 @@ lemma spanSingleton_piece (hmul : IsMulRep rep) (x : B) (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 +/-- 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] @@ -550,7 +556,7 @@ lemma iSup_supp {ι : Type*} [Fintype ι] {V : ι → Submodule ℂ B} (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 +/-- 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] @@ -570,14 +576,10 @@ which additivity of `GaugeWeight.coord` identifies with the character of `w₁ + 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. +`mul_piece_eq_sub` and `mul_piece_eq_sub'` do this against the left and the right factor. The +resulting finite joins are what make the weight pieces of a product computable. -/ /-- The product of two gauge weight decompositions, decomposing `V * V'`. -/ @@ -622,7 +624,7 @@ noncomputable instance mul [d : GaugeWeightDecomposition rep V] 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 +/-- 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) : @@ -658,78 +660,6 @@ 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 decomposition of the unit submodule, concentrated at weight zero. -/ -@[implicit_reducible] -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 - 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 - 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 - 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 - -@[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) : - 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 - · 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)) - -/-- 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) - | 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 [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, 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 - = ⨆ 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 - /-! ## F. Invariants @@ -747,12 +677,12 @@ 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. +what passes `mem_zero_of_invariant` must still be checked against the non-abelian part of the +group; no grading closes that gap, since a grading sees only the abelian subgroup generated by +the elements it uses. The `Invariants` files do that check representation by representation. -/ -/-- **The one-generator refinement step.** A vector in the span of a family graded along a +/-- 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} @@ -777,7 +707,7 @@ 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 many-generator refinement.** The same for a finite family of operators. A vector in +/-- 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 κ] @@ -809,7 +739,7 @@ lemma mem_iSup_of_forall_eigenvector {ι κ : Type*} [Fintype κ] [DecidableEq 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 +/-- 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 @@ -828,7 +758,7 @@ lemma piece_eq_inf (d : GaugeWeightDecomposition rep V) (w : GaugeWeight) : 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 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] @@ -836,7 +766,7 @@ lemma piece_congr {W : Submodule ℂ B} [d : GaugeWeightDecomposition rep V] 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 +/-- A gauge-invariant element sits in the zero-weight piece. Only invariance under the 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 @@ -845,5 +775,91 @@ 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 _ +/-- A gauge-invariant element of a join of non-zero-weight pieces with a torus-stable `S` + lies in `S`. Let `S` be closed under the four torus generators and let `s` be a finite set + of gauge weights, each seen by some generator. Peeling one weight at a time, the generator + that sees `w₀` scales the weight-`w₀` component by a scalar other than one, and invariance + then forces that component into the rest. -/ +lemma mem_of_invariant_of_mem_biSup_piece_sup_of_ne_zero {S : Submodule ℂ B} + (dV : GaugeWeightDecomposition rep V) + (hS : ∀ (i : Fin 4) (y : B), y ∈ S → rep (gaugeTorusGen i) y ∈ S) : + ∀ (s : Finset GaugeWeight), (∀ w ∈ s, ∃ i, w.coord i ≠ 0) → + ∀ x ∈ (⨆ w ∈ s, dV.piece w) ⊔ S, (∀ g : GaugeGroupI, rep 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 + obtain ⟨i, hi⟩ := hs w₀ (Finset.mem_insert_self w₀ s') + 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 hi (expI_zpow_injective + (show (expI : ℂ) ^ w₀.coord i = (expI : ℂ) ^ (0 : ℤ) by rw [zpow_zero]; exact hcc)) + have hpiece : ∀ w, ∀ z ∈ dV.piece w, rep (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 (rep (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 i z hz + have hsum : ((expI : ℂ) ^ w₀.coord i) • a + rep (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 - rep (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 `V ⊔ S`, for `S` closed under the four torus generators, + lies in the weight-zero piece joined with `S`: every other weight is seen by some + generator and is scaled away by it. This is the form of `mem_zero_of_invariant` used to + peel a sector, with `S` the part already understood. -/ +lemma mem_piece_zero_sup_of_invariant {S : Submodule ℂ B} + (dV : GaugeWeightDecomposition rep V) + (hS : ∀ (i : Fin 4) (y : B), y ∈ S → rep (gaugeTorusGen i) y ∈ S) + {x : B} (hx : x ∈ V ⊔ S) (hinv : ∀ g : GaugeGroupI, rep g x = x) : + x ∈ dV.piece 0 ⊔ S := by + refine mem_of_invariant_of_mem_biSup_piece_sup_of_ne_zero dV ?_ (dV.supp.erase 0) ?_ x ?_ + hinv + · intro i y hy + rw [Submodule.mem_sup] at hy ⊢ + obtain ⟨a, ha, b, hb, rfl⟩ := hy + refine ⟨rep (gaugeTorusGen i) a, ?_, rep (gaugeTorusGen i) b, hS i b hb, ?_⟩ + · rw [dV.piece_le 0 a ha i] + exact (dV.piece 0).smul_mem _ ha + · rw [map_add] + · intro w hw + have hw0 : w ≠ 0 := (Finset.mem_erase.mp hw).1 + by_contra hcon + refine hw0 (GaugeWeight.coord_injective (funext fun i => ?_)) + have hi := not_not.mp (not_exists.mp hcon i) + rw [hi, GaugeWeight.zero_coord i] + · have hVle : V ≤ (⨆ w ∈ dV.supp.erase 0, dV.piece w) ⊔ dV.piece 0 := by + refine le_trans (le_of_eq dV.iSup_piece.symm) (iSup_le fun w => ?_) + by_cases hw0 : w = 0 + · subst hw0 + exact le_sup_right + · by_cases hw : w ∈ dV.supp + · exact le_sup_of_le_left (le_iSup₂_of_le w (Finset.mem_erase.mpr ⟨hw0, hw⟩) le_rfl) + · rw [dV.piece_eq_bot w hw] + exact bot_le + exact ((sup_le_sup_right hVle S).trans (le_of_eq (sup_assoc _ _ _))) hx + end GaugeWeightDecomposition end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiAdjoint.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiAdjoint.lean index fcdbbcb78..29065fa27 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiAdjoint.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiAdjoint.lean @@ -8,7 +8,6 @@ module public import Physlib.Particles.StandardModel.GaugeAlgebra.RootDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.SU3PermDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.Basic -public import Mathlib.Algebra.TrivSqZeroExt.Basic /-! # Gauge tensors carrying two `su(3)` adjoint indices @@ -56,8 +55,8 @@ the action on coefficients and the trace contraction. Section C has the coordina of one index, section D computes the rotations on them, section E is the finite computation, section F classifies the invariants of the span, and section G divides out a stable submodule and proves the theorem. An aside at the end holds what other files import -from here and the theorem does not use: the weight basis of the adjoint, the quotient and -square-zero representations, and the gauge form of the theorem. +from here and the theorem does not use: the weight basis of the adjoint and the gauge form +of the theorem. -/ @[expose] public section @@ -1150,111 +1149,6 @@ lemma span_eq_wtSpan : hT.span = hT.wtSpan := by /-! -## Aside: the quotient representation, for `MassDimEight` - -A submodule stable under a representation of the whole gauge group carries the induced -representation on the quotient. The theorem above needs only the induced maps -`Submodule.mapQ`; `MassDimEight` uses the representation. - --/ - -/-- The representation induced on the quotient by a stable submodule. -/ -noncomputable def quotRep (ρ : Representation ℂ GaugeGroupI B) (S : Submodule ℂ B) - (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, ρ g y ∈ S) : - Representation ℂ GaugeGroupI (B ⧸ 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. -/ -lemma quotRep_mkQ {ρ : Representation ℂ GaugeGroupI B} (S : Submodule ℂ B) - (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, ρ g y ∈ S) (g : GaugeGroupI) (y : B) : - quotRep ρ S hS g (S.mkQ y) = S.mkQ (ρ g y) := rfl - -/-! - -## Aside: the trivial square-zero extension, for `MassDimEight` - -`MassDimEight` needs a transport in the opposite direction to `quotRep`, from a module to an -algebra: the trivial square-zero extension `TrivSqZeroExt ℂ M` is a commutative algebra on -which any representation of `M` acts multiplicatively, `sqZeroRep`. It belongs with -`GaugeWeightDecomposition`. - --/ - -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⟩ - -/-- 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. -/ -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] - -end SquareZero - -/-! - ## Aside: the gauge form of the theorem, for `MassDimEight` -/ diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Jet/Basic.lean b/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeGroup/Basic.lean similarity index 100% rename from Physlib/Particles/StandardModel/GaugeGroup/Jet/Basic.lean rename to Physlib/Particles/StandardModel/GaugeGroup/JetGaugeGroup/Basic.lean diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Jet/Truncation.lean b/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeGroup/Truncation.lean similarity index 99% rename from Physlib/Particles/StandardModel/GaugeGroup/Jet/Truncation.lean rename to Physlib/Particles/StandardModel/GaugeGroup/JetGaugeGroup/Truncation.lean index 304a68ec8..7d0dd37e8 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Jet/Truncation.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeGroup/Truncation.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.JetGaugeGroup.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/MaurerCartan/Basic.lean b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean index 1cfb0f025..5e995ecd0 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.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.JetGaugeGroup.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/Truncation.lean b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Truncation.lean index 42de56f18..f67c448af 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Truncation.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Truncation.lean @@ -7,7 +7,7 @@ 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.GaugeGroup.JetGaugeGroup.Truncation 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/HiggsBoson/JetAlgebra/Basic.lean b/Physlib/Particles/StandardModel/HiggsBoson/JetAlgebra/Basic.lean index f7a5c277c..bc210ae73 100644 --- a/Physlib/Particles/StandardModel/HiggsBoson/JetAlgebra/Basic.lean +++ b/Physlib/Particles/StandardModel/HiggsBoson/JetAlgebra/Basic.lean @@ -6,7 +6,7 @@ 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.GaugeGroup.JetGaugeGroup.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 diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/GaugeWeightDecomposition.lean b/Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/GaugeWeightDecomposition.lean index 5d61f3fda..8716a097b 100644 --- a/Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/GaugeWeightDecomposition.lean +++ b/Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/GaugeWeightDecomposition.lean @@ -690,99 +690,14 @@ lies in the weight-zero piece joined with `S`. This is what turns the twelve bl section F into a statement about the invariants themselves, the remaining work being to peel the blocks apart, which is not done here. -The fermion sector had it easier. There every weight has nonzero hypercharge, so one -torus generator separates all of them at once and -`IsFermionSector.mem_of_invariant_of_mem_biSup_piece_sup` fixes a single `i`. At mass -weight eight the sector carries weights of vanishing hypercharge and nonzero colour or -isospin — `H d bard` is one — so the generator has to be chosen weight by weight. That -costs nothing: the induction deletes one weight at a time and never needs two generators -at once. +The statement is `GaugeWeightDecomposition.mem_piece_zero_sup_of_invariant`, whose +induction chooses the separating torus generator weight by weight. That matters here: at +mass weight eight the sector carries weights of vanishing hypercharge and nonzero colour or +isospin — `H d bard` is one — so, unlike the fermion sector, no single generator sees every +weight. -/ -/-- The one-weight-at-a-time refinement, with the separating generator chosen per weight. - Let `S` be closed under the four torus generators and let `s` be a finite set of nonzero - gauge weights, each seen by some generator. 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_of_ne_zero {V S : Submodule ℂ B} - (dV : GaugeWeightDecomposition repGauge V) - (hS : ∀ (i : Fin 4) (y : B), y ∈ S → repGauge (gaugeTorusGen i) y ∈ S) : - ∀ (s : Finset GaugeWeight), (∀ w ∈ s, ∃ i, 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 - obtain ⟨i, hi⟩ := hs w₀ (Finset.mem_insert_self w₀ s') - 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 hi (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 i 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 `V ⊔ S`, for `S` closed under the four torus generators, - already lies in the weight-zero piece joined with `S`: every other weight is seen by some - generator and is scaled away by it. -/ -lemma mem_piece_zero_sup_of_invariant {V S : Submodule ℂ B} - (dV : GaugeWeightDecomposition repGauge V) - (hS : ∀ (i : Fin 4) (y : B), y ∈ S → repGauge (gaugeTorusGen i) y ∈ S) - {x : B} (hx : x ∈ V ⊔ S) (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : - x ∈ dV.piece 0 ⊔ S := by - refine mem_of_invariant_of_mem_biSup_piece_sup_of_ne_zero dV ?_ (dV.supp.erase 0) ?_ x ?_ hinv - · intro i y hy - rw [Submodule.mem_sup] at hy ⊢ - obtain ⟨a, ha, b, hb, rfl⟩ := hy - refine ⟨repGauge (gaugeTorusGen i) a, ?_, repGauge (gaugeTorusGen i) b, hS i b hb, ?_⟩ - · rw [dV.piece_le 0 a ha i] - exact (dV.piece 0).smul_mem _ ha - · rw [map_add] - · intro w hw - have hw0 : w ≠ 0 := (Finset.mem_erase.mp hw).1 - by_contra hcon - refine hw0 (GaugeWeight.coord_injective (funext fun i => ?_)) - have hi := not_not.mp (not_exists.mp hcon i) - rw [hi, GaugeWeight.zero_coord i] - · have hVle : V ≤ (⨆ w ∈ dV.supp.erase 0, dV.piece w) ⊔ dV.piece 0 := by - refine le_trans (le_of_eq dV.iSup_piece.symm) (iSup_le fun w => ?_) - by_cases hw0 : w = 0 - · subst hw0 - exact le_sup_right - · by_cases hw : w ∈ dV.supp - · exact le_sup_of_le_left (le_iSup₂_of_le w (Finset.mem_erase.mpr ⟨hw0, hw⟩) le_rfl) - · rw [dV.piece_eq_bot w hw] - exact bot_le - exact ((sup_le_sup_right hVle S).trans (le_of_eq (sup_assoc _ _ _))) hx - /-- A gauge-invariant element of the Yukawa sector at mass weight eight joined with a torus-stable `S` lies in the weight-zero piece joined with `S`, so the twelve blocks of `sectorMassWeightEightGaugeWeight_piece_zero` are all that a Yukawa invariant can be @@ -792,7 +707,7 @@ lemma mem_sectorMassWeightEight_piece_zero_sup_of_invariant {S : Submodule ℂ B (hx : x ∈ h.sectorMassWeight {GeneratorClass.higgs, GeneratorClass.fermion} 8 ⊔ S) (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : x ∈ h.sectorMassWeightEightGaugeWeight.piece 0 ⊔ S := - mem_piece_zero_sup_of_invariant _ hS hx hinv + GaugeWeightDecomposition.mem_piece_zero_sup_of_invariant _ hS hx hinv end IsCovStandardModel diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/MassDimLTEight.lean b/Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/MassDimLTEight.lean index ac6a6f047..43e118302 100644 --- a/Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/MassDimLTEight.lean +++ b/Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/MassDimLTEight.lean @@ -28,11 +28,10 @@ the four products surviving at weights five and seven has exactly one fermion fa its boost weight is odd along every axis; and an element of odd boost weight cannot be Lorentz invariant, since invariance forces boost weight zero and zero is even. -Running that argument needs the product of two weight decompositions, and the general -construction in `WeightGrading.lean` asks for `IsBoostGraded`, which the Standard Model -algebra has no reason to satisfy: nothing says its boost weight spaces span. Yet -multiplicativity of the Lorentz representation is by itself enough to convolve two -decompositions, and section A rebuilds the product from that alone. Section B turns an odd +Running that argument needs the product of two weight decompositions, which +`WeightGrading.lean` does not provide: multiplicativity of the Lorentz representation is by +itself enough to convolve two decompositions, and section A builds the product from that +alone. Section B turns an odd support into the absence of invariants, and does so modulo a Lorentz-stable submodule `S` by passing to the quotient, where the weight-zero piece of the pushed-forward decomposition is still trivial. @@ -63,9 +62,7 @@ The weight-`m` piece of a product is the join, over the splittings `k + l = m`, products of the weight-`k` and weight-`l` pieces of the factors. That this is a weight decomposition of the product submodule needs nothing of the representation beyond multiplicativity: `mul_mem_boostWeightSubmodule` adds the two weights, and the pieces of -the factors join to the factors themselves. The general `mul` of `WeightGrading.lean` -instead routes through the projections `boostProj`, and so through `IsBoostGraded`, which -is more than is available here. +the factors join to the factors themselves. -/ diff --git a/Physlib/Particles/StandardModel/IsFermionSector/DerivSubmodule/BoostWeightDecomposition.lean b/Physlib/Particles/StandardModel/IsFermionSector/DerivSubmodule/BoostWeightDecomposition.lean index b6645e824..64b33f407 100644 --- a/Physlib/Particles/StandardModel/IsFermionSector/DerivSubmodule/BoostWeightDecomposition.lean +++ b/Physlib/Particles/StandardModel/IsFermionSector/DerivSubmodule/BoostWeightDecomposition.lean @@ -38,9 +38,9 @@ decomposition of the span of that species' symbols; joining the ten species and 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** +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`. +even. -/ @@ -505,27 +505,6 @@ lemma not_two_dvd_of_mem_fermionBoostWeights {n : ℕ} {k : ℤ} 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 @@ -590,143 +569,6 @@ 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 diff --git a/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/GaugeWeightDecomposition.lean b/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/GaugeWeightDecomposition.lean index 0af265a0e..43b330c57 100644 --- a/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/GaugeWeightDecomposition.lean +++ b/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/GaugeWeightDecomposition.lean @@ -744,64 +744,15 @@ with `a` of pure weight `w` and `y` in the join of the remaining pieces with `S` 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. +the empty support. This is `GaugeWeightDecomposition.mem_of_invariant_of_mem_biSup_piece_sup_of_ne_zero`, +with the hypercharge generator chosen at every step, 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 @@ -810,10 +761,12 @@ 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 + refine GaugeWeightDecomposition.mem_of_invariant_of_mem_biSup_piece_sup_of_ne_zero + (h.derivSubmoduleGaugeWeight n) (fun i y hy => hS _ y hy) (h.derivSubmoduleGaugeWeight n).supp ?_ x ?_ hinv · have hhc : ∀ w ∈ fermionGaugeWeights, w.2.2.2 ≠ 0 := by decide intro w hw + refine ⟨3, ?_⟩ rw [GaugeWeight.coord_three] exact hhc w (h.derivSubmoduleGaugeWeight_supp n ▸ hw) · refine sup_le_sup_right diff --git a/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/MassDimEight.lean b/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/MassDimEight.lean index 397381f07..607f4fe8e 100644 --- a/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/MassDimEight.lean +++ b/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/MassDimEight.lean @@ -1294,7 +1294,7 @@ theorem exists_mem_of_gauge_and_lorentz_invariant (S : Submodule ℂ B) ∃ y ∈ S, (∀ g : GaugeGroupI, repGauge g y = y) ∧ (∀ g : SL(2,ℂ), repLorentz g y = y) ∧ x - y ∈ h.kineticSpan := by have hzero : x ∈ (h.massWeightSubmoduleGaugeWeightEight).piece 0 ⊔ S := - mem_piece_zero_sup_of_invariant _ (fun i y hy => hS _ y hy) hx hG + GaugeWeightDecomposition.mem_piece_zero_sup_of_invariant _ (fun i y hy => hS _ y hy) hx hG have hblk : x ∈ h.kineticBlockSubmodule ⊔ S := sup_le_sup_right h.massWeightSubmoduleGaugeWeightEight_piece_zero_le S hzero have hSstab : IsStableUnder (gaugeLorentzMaps repGauge repLorentz) S := diff --git a/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/MassDimLTEight.lean b/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/MassDimLTEight.lean index ad93bdaf1..93e1c45b8 100644 --- a/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/MassDimLTEight.lean +++ b/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/MassDimLTEight.lean @@ -484,98 +484,14 @@ lemma range_e_le_rightSpan (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) Gauge invariance is what selects the conjugate pairings. A gauge-invariant element lies in the weight-zero piece of the gauge weight decomposition, and modulo a gauge-stable submodule the same holds with the submodule joined on: the torus generators scale every -other weight, and the induction of `mem_of_invariant_of_mem_biSup_piece_sup` deletes them +other weight, and the induction of +`GaugeWeightDecomposition.mem_of_invariant_of_mem_biSup_piece_sup_of_ne_zero` deletes them one at a time. Unlike the single-tower case, the generator has to be chosen weight by weight: a product like `Q barQ` at two different colours has vanishing hypercharge and nonzero colour, so no one generator sees every weight. -/ -/-- The one-weight-at-a-time refinement, with the separating generator chosen per weight. - Let `S` be closed under the four torus generators and let `s` be a finite set of gauge - weights, each seen by some generator. 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_of_ne_zero {V S : Submodule ℂ B} - (dV : GaugeWeightDecomposition repGauge V) - (hS : ∀ (i : Fin 4) (y : B), y ∈ S → repGauge (gaugeTorusGen i) y ∈ S) : - ∀ (s : Finset GaugeWeight), (∀ w ∈ s, ∃ i, 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 - obtain ⟨i, hi⟩ := hs w₀ (Finset.mem_insert_self w₀ s') - 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 hi (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 i 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 `V ⊔ S`, for `S` closed under the four torus generators, - already lies in the weight-zero piece joined with `S`: every other weight is seen by - some generator and is scaled away by it. -/ -lemma mem_piece_zero_sup_of_invariant {V S : Submodule ℂ B} - (dV : GaugeWeightDecomposition repGauge V) - (hS : ∀ (i : Fin 4) (y : B), y ∈ S → repGauge (gaugeTorusGen i) y ∈ S) - {x : B} (hx : x ∈ V ⊔ S) (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : - x ∈ dV.piece 0 ⊔ S := by - refine mem_of_invariant_of_mem_biSup_piece_sup_of_ne_zero dV ?_ (dV.supp.erase 0) ?_ x ?_ - hinv - · intro i y hy - rw [Submodule.mem_sup] at hy ⊢ - obtain ⟨a, ha, b, hb, rfl⟩ := hy - refine ⟨repGauge (gaugeTorusGen i) a, ?_, repGauge (gaugeTorusGen i) b, hS i b hb, ?_⟩ - · rw [dV.piece_le 0 a ha i] - exact (dV.piece 0).smul_mem _ ha - · rw [map_add] - · intro w hw - have hw0 : w ≠ 0 := (Finset.mem_erase.mp hw).1 - by_contra hcon - refine hw0 (GaugeWeight.coord_injective (funext fun i => ?_)) - have hi := not_not.mp (not_exists.mp hcon i) - rw [hi, GaugeWeight.zero_coord i] - · have hVle : V ≤ (⨆ w ∈ dV.supp.erase 0, dV.piece w) ⊔ dV.piece 0 := by - refine le_trans (le_of_eq dV.iSup_piece.symm) (iSup_le fun w => ?_) - by_cases hw0 : w = 0 - · subst hw0 - exact le_sup_right - · by_cases hw : w ∈ dV.supp - · exact le_sup_of_le_left (le_iSup₂_of_le w (Finset.mem_erase.mpr ⟨hw0, hw⟩) le_rfl) - · rw [dV.piece_eq_bot w hw] - exact bot_le - exact ((sup_le_sup_right hVle S).trans (le_of_eq (sup_assoc _ _ _))) hx - - /-! ## G. Mass weight six: no Dirac mass term @@ -706,7 +622,7 @@ theorem mem_of_invariant_of_mem_massWeightSubmoduleSix_sup {S : Submodule ℂ B} (hG : ∀ g : GaugeGroupI, repGauge g x = x) (hL : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by have hzero : x ∈ (h.massWeightSubmoduleGaugeWeightSix).piece 0 ⊔ S := - mem_piece_zero_sup_of_invariant _ (fun i y hy => hS _ y hy) hx hG + GaugeWeightDecomposition.mem_piece_zero_sup_of_invariant _ (fun i y hy => hS _ y hy) hx hG refine mem_of_lorentz_invariant_iSup_dualLeftRightWeyl_span h.isDualLeftRightWeyl_sixFamily S hSL ?_ hL exact sup_le_sup_right h.massWeightSubmoduleGaugeWeightSix_piece_zero_le S hzero diff --git a/Physlib/Particles/StandardModel/IsGaugeSector/DerivSubmodule/BoostWeightDecomposition.lean b/Physlib/Particles/StandardModel/IsGaugeSector/DerivSubmodule/BoostWeightDecomposition.lean index 2e85be589..43f749953 100644 --- a/Physlib/Particles/StandardModel/IsGaugeSector/DerivSubmodule/BoostWeightDecomposition.lean +++ b/Physlib/Particles/StandardModel/IsGaugeSector/DerivSubmodule/BoostWeightDecomposition.lean @@ -308,62 +308,6 @@ lemma two_dvd_of_mem_derivSubmoduleBoostWeight_supp (n : ℕ) (i : Fin 3) {k : 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 diff --git a/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/MassDimEight.lean b/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/MassDimEight.lean index f4a4b1274..2da990622 100644 --- a/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/MassDimEight.lean +++ b/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/MassDimEight.lean @@ -762,8 +762,9 @@ 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 +so nothing places it in the zero-weight piece directly; +`GaugeWeightDecomposition.mem_piece_zero_sup_of_invariant` supplies that step for any +gauge-stable `S`, and `exists_mem_of_invariant_massWeightSubmodule_eight_sup` is the resulting statement about `massWeightSubmodule 8 ⊔ S`. @@ -1572,99 +1573,6 @@ lemma mixedCartanPart_le : /-! -## 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 -/ @@ -1844,7 +1752,8 @@ theorem exists_mem_of_invariant_massWeightSubmodule_eight_sup (S : Submodule ℂ ∃ 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) + (GaugeWeightDecomposition.mem_piece_zero_sup_of_invariant + h.massWeightSubmoduleGaugeWeightEight (fun i y hy => hS _ y hy) hx hinv) hinv /-- The gauge invariants of the mass-weight eight submodule itself, the case `x ∈ V` of diff --git a/Physlib/Particles/StandardModel/IsHiggsSector/Basic.lean b/Physlib/Particles/StandardModel/IsHiggsSector/Basic.lean index dfaba6b07..b968f2d86 100644 --- a/Physlib/Particles/StandardModel/IsHiggsSector/Basic.lean +++ b/Physlib/Particles/StandardModel/IsHiggsSector/Basic.lean @@ -9,7 +9,7 @@ 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.Particles.StandardModel.GaugeGroup.JetGaugeGroup.Basic public import Physlib.Relativity.LorentzGroup.Boosts.WeightGrading public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.SU2PermDecomposition @@ -836,15 +836,6 @@ lemma repLorentz_barHiggs {n : ℕ} (g : SL(2,ℂ)) (d : Fin n → Fin 1 ⊕ Fin simp only [barHiggs] 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 - 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,ℂ)) @@ -1452,156 +1443,12 @@ lemma massWeightSubmodule_eight_eq : ## C. Gauge invariance -We now turn to the gauge invariance of the -different terms. - --/ - -/-! - -## C. Gauge invariance - -/ +/-- The gauge invariants of a given mass weight. -/ noncomputable def gaugeInvariantOfMassDim (M : ℕ) : Submodule ℂ B := h.massWeightSubmodule M ⊓ Representation.invariants rep -/-! - -## 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. --/ - -/-! - -### 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 - delta 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 - delta dotSymbol - congr 1 - congr 1 - all_goals first - | exact funext fun j => j.elim0 - | (funext j; congr 1; exact Fin.ext (by simp [Fin.natAdd])) - -/-- 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 - delta 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 - delta dotSymbol - congr 1 - congr 1 - all_goals first - | exact funext fun j => j.elim0 - | (funext j; congr 1; exact Fin.ext (by simp [Fin.natAdd])) - -/-- 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 - delta 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 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 ![] ![]) - -@[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] - -/-! - -### D.4. The decomposition along the x and y directions - --/ - -/-- **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, lightConeWeight (c j)) = k ∧ - ¬(c 0 = 2 ∧ c 1 = 3) ∧ ¬(c 0 = 3 ∧ c 1 = 2)), - 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 (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 (lightConeDeriv (n := 2) (h.dotSymbol ![1, 1]) 1 c)) ⊔ - (if k = 0 then ℂ ∙ (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![]) else ⊥) - -/-! - -## I. The fully invariants - --/ - -/-! - -### I.2. Invariants in the full algebra - --/ - end IsHiggsSector end StandardModel diff --git a/Physlib/Particles/StandardModel/IsHiggsSector/DerivSubmodule/BoostWeightDecomposition.lean b/Physlib/Particles/StandardModel/IsHiggsSector/DerivSubmodule/BoostWeightDecomposition.lean index e38eb9971..91b35d89a 100644 --- a/Physlib/Particles/StandardModel/IsHiggsSector/DerivSubmodule/BoostWeightDecomposition.lean +++ b/Physlib/Particles/StandardModel/IsHiggsSector/DerivSubmodule/BoostWeightDecomposition.lean @@ -339,49 +339,6 @@ lemma two_dvd_of_mem_derivSubmoduleBoostWeight_supp (n : ℕ) (i : Fin 3) {k : 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 diff --git a/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/GaugeWeightDecomposition.lean b/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/GaugeWeightDecomposition.lean index ac336eaa1..b21a41111 100644 --- a/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/GaugeWeightDecomposition.lean +++ b/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/GaugeWeightDecomposition.lean @@ -783,90 +783,6 @@ a gauge transformation does not. -/ -/-- The one-weight-at-a-time refinement, with the separating torus generator chosen per - weight. Let `S` be closed under the four torus generators and let `s` be a finite set of - non-zero gauge weights, each seen by some generator. 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_of_ne_zero {V S : Submodule ℂ B} - (dV : GaugeWeightDecomposition rep V) - (hS : ∀ (i : Fin 4) (y : B), y ∈ S → rep (gaugeTorusGen i) y ∈ S) : - ∀ (s : Finset GaugeWeight), (∀ w ∈ s, ∃ i, w.coord i ≠ 0) → - ∀ x ∈ (⨆ w ∈ s, dV.piece w) ⊔ S, (∀ g : GaugeGroupI, rep 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 - obtain ⟨i, hi⟩ := hs w₀ (Finset.mem_insert_self w₀ s') - 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 hi (expI_zpow_injective - (show (expI : ℂ) ^ w₀.coord i = (expI : ℂ) ^ (0 : ℤ) by rw [zpow_zero]; exact hcc)) - have hpiece : ∀ w, ∀ z ∈ dV.piece w, rep (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 (rep (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 i z hz - have hsum : ((expI : ℂ) ^ w₀.coord i) • a + rep (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 - rep (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 `V ⊔ S`, for `S` closed under the four torus generators, - already lies in the weight-zero piece joined with `S`: every other weight is seen by some - generator and is scaled away by it. -/ -lemma mem_piece_zero_sup_of_invariant {V S : Submodule ℂ B} - (dV : GaugeWeightDecomposition rep V) - (hS : ∀ (i : Fin 4) (y : B), y ∈ S → rep (gaugeTorusGen i) y ∈ S) - {x : B} (hx : x ∈ V ⊔ S) (hinv : ∀ g : GaugeGroupI, rep g x = x) : - x ∈ dV.piece 0 ⊔ S := by - refine mem_of_invariant_of_mem_biSup_piece_sup_of_ne_zero dV ?_ (dV.supp.erase 0) ?_ x ?_ - hinv - · intro i y hy - rw [Submodule.mem_sup] at hy ⊢ - obtain ⟨a, ha, b, hb, rfl⟩ := hy - refine ⟨rep (gaugeTorusGen i) a, ?_, rep (gaugeTorusGen i) b, hS i b hb, ?_⟩ - · rw [dV.piece_le 0 a ha i] - exact (dV.piece 0).smul_mem _ ha - · rw [map_add] - · intro w hw - have hw0 : w ≠ 0 := (Finset.mem_erase.mp hw).1 - by_contra hcon - refine hw0 (GaugeWeight.coord_injective (funext fun i => ?_)) - have hi := not_not.mp (not_exists.mp hcon i) - rw [hi, GaugeWeight.zero_coord i] - · have hVle : V ≤ (⨆ w ∈ dV.supp.erase 0, dV.piece w) ⊔ dV.piece 0 := by - refine le_trans (le_of_eq dV.iSup_piece.symm) (iSup_le fun w => ?_) - by_cases hw0 : w = 0 - · subst hw0 - exact le_sup_right - · by_cases hw : w ∈ dV.supp - · exact le_sup_of_le_left (le_iSup₂_of_le w (Finset.mem_erase.mpr ⟨hw0, hw⟩) le_rfl) - · rw [dV.piece_eq_bot w hw] - exact bot_le - exact ((sup_le_sup_right hVle S).trans (le_of_eq (sup_assoc _ _ _))) hx - /-- Peeling a finite join of the spans of families with one fundamental and one anti-fundamental isospin index off a gauge-stable submodule: a gauge invariant of the join together with `S` is a combination of the delta contractions of the families plus a @@ -1014,7 +930,8 @@ theorem mem_of_invariant_massWeightSubmodule_two_sup (S : Submodule ℂ B) (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, rep g y ∈ S) {x : B} (hx : x ∈ h.massWeightSubmodule 2 ⊔ S) (hinv : ∀ g : GaugeGroupI, rep g x = x) : x ∈ S := by - have hmem := mem_piece_zero_sup_of_invariant h.massWeightSubmoduleGaugeWeightTwo + have hmem := GaugeWeightDecomposition.mem_piece_zero_sup_of_invariant + h.massWeightSubmoduleGaugeWeightTwo (fun i y hy => hS (gaugeTorusGen i) y hy) hx hinv rwa [h.massWeightSubmoduleGaugeWeightTwo_piece_zero, bot_sup_eq] at hmem @@ -1026,7 +943,8 @@ theorem exists_mem_of_invariant_massWeightSubmodule_four_sup (S : Submodule ℂ (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, rep g y ∈ S) {x : B} (hx : x ∈ h.massWeightSubmodule 4 ⊔ S) (hinv : ∀ g : GaugeGroupI, rep g x = x) : ∃ y ∈ S, (∀ g : GaugeGroupI, rep g y = y) ∧ x - y ∈ h.dotSpan 0 0 := by - have hmem := mem_piece_zero_sup_of_invariant h.massWeightSubmoduleGaugeWeightFour + have hmem := GaugeWeightDecomposition.mem_piece_zero_sup_of_invariant + h.massWeightSubmoduleGaugeWeightFour (fun i y hy => hS (gaugeTorusGen i) y hy) hx hinv rw [h.massWeightSubmoduleGaugeWeightFour_piece_zero] at hmem exact h.exists_mem_of_invariant_isoSpan_sup 0 0 S hS @@ -1041,7 +959,8 @@ theorem exists_mem_of_invariant_massWeightSubmodule_six_sup (S : Submodule ℂ B (hx : x ∈ h.massWeightSubmodule 6 ⊔ S) (hinv : ∀ g : GaugeGroupI, rep g x = x) : ∃ y ∈ S, (∀ g : GaugeGroupI, rep g y = y) ∧ x - y ∈ h.dotSpan 1 0 ⊔ h.dotSpan 0 1 := by - have hmem := mem_piece_zero_sup_of_invariant h.massWeightSubmoduleGaugeWeightSix + have hmem := GaugeWeightDecomposition.mem_piece_zero_sup_of_invariant + h.massWeightSubmoduleGaugeWeightSix (fun i y hy => hS (gaugeTorusGen i) y hy) hx hinv rw [h.massWeightSubmoduleGaugeWeightSix_piece_zero] at hmem have hle : h.higgsBarHiggsSpan 1 0 0 ⊔ h.higgsBarHiggsSpan 1 0 1 @@ -1075,7 +994,8 @@ theorem exists_mem_of_invariant_massWeightSubmodule_eight_sup (S : Submodule ℂ ∃ y ∈ S, (∀ g : GaugeGroupI, rep g y = y) ∧ x - y ∈ h.dotSpan 2 0 ⊔ h.dotSpan 0 2 ⊔ h.dotSpan 1 1 ⊔ ℂ ∙ (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![]) := by - have hmem := mem_piece_zero_sup_of_invariant h.massWeightSubmoduleGaugeWeightEight + have hmem := GaugeWeightDecomposition.mem_piece_zero_sup_of_invariant + h.massWeightSubmoduleGaugeWeightEight (fun i y hy => hS (gaugeTorusGen i) y hy) hx hinv rw [h.massWeightSubmoduleGaugeWeightEight_piece_zero] at hmem set S₃ := h.isoSpan 1 1 ⊔ S with hS₃def diff --git a/Physlib/Particles/StandardModel/Matter/JetComponentSpace/Basic.lean b/Physlib/Particles/StandardModel/Matter/JetComponentSpace/Basic.lean index 6fc02e221..8997b63c6 100644 --- a/Physlib/Particles/StandardModel/Matter/JetComponentSpace/Basic.lean +++ b/Physlib/Particles/StandardModel/Matter/JetComponentSpace/Basic.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.GaugeGroup.Jet.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.JetGaugeGroup.Basic 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/Peeling.lean b/Physlib/Particles/StandardModel/Peeling.lean index 97012ce52..dfb9f9e3e 100644 --- a/Physlib/Particles/StandardModel/Peeling.lean +++ b/Physlib/Particles/StandardModel/Peeling.lean @@ -731,9 +731,8 @@ lemma isBiDualRightWeyl_sub {M : Type*} [AddCommGroup M] [Module ℂ M] ## G. Weight pieces, symbol ranges and stability The last group of shared facts is about the objects a sector-level argument hands the -peeling: a weight piece of a gauge weight decomposition lies in the submodule it -decomposes, a symbol range is the span of the symbol's components against a dual basis, and -the product of two stable submodules is stable. None of them mentions a particular sector. +peeling: a symbol range is the span of the symbol's components against a dual basis, and +the product of two stable submodules is stable. Neither mentions a particular sector. -/ @@ -741,11 +740,6 @@ section Bridges variable {B : Type} [Ring B] [Algebra ℂ B] -/-- A weight piece lies inside the submodule it decomposes. -/ -lemma GaugeWeightDecomposition.piece_le_self {rep : Representation ℂ GaugeGroupI B} - {V : Submodule ℂ B} (d : GaugeWeightDecomposition rep V) (w : GaugeWeight) : - d.piece w ≤ V := le_trans (le_iSup d.piece w) (le_of_eq d.iSup_piece) - /-- The range of a symbol map is the span of its components against the dual basis of the value space. This is the companion of `range_eq_iSup_span`, which reads the same range off `Module.Basis.coord`; the two families of components are equal, but the components of the diff --git a/Physlib/Relativity/IsLorentzDeriv.lean b/Physlib/Relativity/IsLorentzDeriv.lean index 904f37dc8..fcdd2207e 100644 --- a/Physlib/Relativity/IsLorentzDeriv.lean +++ b/Physlib/Relativity/IsLorentzDeriv.lean @@ -16,16 +16,12 @@ public import Mathlib.RingTheory.TensorProduct.Basic /-! # Class IsLorentzDeriv -A family of operators indexed by the four spacetime directions is a **Lorentz derivative** +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`). +matrix, as the jet derivatives on a jet algebra do. The iterated operator along a multiset +of directions then transforms by one column of the Lorentz matrix per slot +(`rep_iteratedD_ofFn`), which is the law `IsLorentzDerivTransforms` and its covariant form +`IsLorentzCovDerivTransforms` record for a family of derivative symbols. -/ @@ -232,258 +228,6 @@ lemma rep_iteratedD_ofFn [IsLorentzDeriv rep D] rw [Fin.prod_univ_succ, hstep a p] simp only [Fin.cons_zero, Fin.cons_succ] -/-! - -## A. 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) - -/-! - -## B. Relationship to boost weights - --/ - -section - -/-- 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 [LorentzGroup.boostAxis_apply] - -/-- 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'] - rw [show Lorentz.SL2C.toLorentzGroup (Lorentz.SL2C.boostAxis i t ht) = - LorentzGroup.boostAxis i t ht from rfl] - fin_cases i - 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. -/ -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'] - rw [show Lorentz.SL2C.toLorentzGroup (Lorentz.SL2C.boostAxis i t ht) = - LorentzGroup.boostAxis i t ht from rfl] - fin_cases i - all_goals - simp [LorentzGroup.boostAxis_apply, Fintype.sum_sum_type, Fin.sum_univ_three] - match_scalars <;> (field_simp [ht']; noncomm_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 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] - -/-- 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/LightConeDeriv.lean b/Physlib/Relativity/LightConeDeriv.lean index 2521612f4..0306f0901 100644 --- a/Physlib/Relativity/LightConeDeriv.lean +++ b/Physlib/Relativity/LightConeDeriv.lean @@ -100,13 +100,6 @@ lemma lightConeCoeffInv_three_eq_zero (i : Fin 3) {μ : Fin 1 ⊕ Fin 3} 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 @@ -164,309 +157,6 @@ noncomputable def lightConeDeriv {n : ℕ} (F : (Fin n → Fin 1 ⊕ Fin 3) → (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) : @@ -546,26 +236,4 @@ lemma range_lightConeDeriv_le {n : ℕ} (F : (Fin n → Fin 1 ⊕ Fin 3) → ℂ 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/Boosts/WeightGrading.lean b/Physlib/Relativity/LorentzGroup/Boosts/WeightGrading.lean index 3d950cf91..071de2b5d 100644 --- a/Physlib/Relativity/LorentzGroup/Boosts/WeightGrading.lean +++ b/Physlib/Relativity/LorentzGroup/Boosts/WeightGrading.lean @@ -7,30 +7,42 @@ 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 public import Mathlib.Algebra.Group.Pointwise.Finset.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 (`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. +# Boost weights of representations of `SL(2,ℂ)` + +## i. Overview + +An element of a representation of `SL(2,ℂ)` has boost weight `k` along the `i`-th spatial +axis when the one-parameter boost family along that axis scales it by `t ^ k`; +`boostWeightSubmodule rep i k` collects these elements. Weights add under multiplication, +and the weight spaces sit in eigenspaces of a single boost at distinct eigenvalues, so they +are independent. That is all the Standard Model needs of them: an invariant of the group has +boost weight zero along every axis, so a weight-zero vector of a join of weight spaces lies +in the weight-zero one. + +A `WeightDecomposition` records a finitely supported family of subspaces of pure boost +weight joining to a given submodule; it is transported along equalities and joined here. The +product of two decompositions, which needs only multiplicativity of the representation, is +built where it is used, in `IsCovStandardModel/YukawaSector/MassDimLTEight.lean`, together +with the parity argument that a submodule of odd boost weights carries no invariant. + +## ii. Key results + +- `boostWeightSubmodule` : the weight-`k` space along the `i`-th axis. +- `mul_mem_boostWeightSubmodule` : weights add under multiplication. +- `boostWeightSubmodule_iSupIndep` : the weight spaces are independent. +- `mem_boostWeightSubmodule_zero_of_invariant` and `mem_of_mem_iSup_of_boostWeight_zero` : + an invariant has weight zero, and lies in the weight-zero term of any join of weight + spaces containing it. +- `WeightDecomposition`, with its transport `copy` and join `sup`. + +## iii. Table of contents + +- A. Boost weights +- B. Independence of the weight spaces +- C. Weight decompositions of submodules -/ @@ -38,35 +50,27 @@ built from. namespace Lorentz -open Matrix MatrixGroups TensorProduct +open Matrix MatrixGroups /-! -## 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 -`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. +## A. Boost weights -/ 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 {M : Type*} [AddCommGroup M] [Module K M] 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 +/-- The weight-`w` space of a representation along the `i`-th axis: the vectors scaling by + `t ^ w` under the boost along that axis 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 (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] @@ -77,341 +81,29 @@ lemma mem_boostWeightSubmodule {rep : Representation K SL(2,ℂ) M} {i : Fin 3} x ∈ boostWeightSubmodule rep i w ↔ ∀ (t : ℝ) (ht : t ≠ 0), 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 := - ⨆ w, boostWeightSubmodule rep i w - -/-- 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 - 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 - -/-- A representation with a spanning family of vectors in the weight span is graded. -/ -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 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) - -/-! - -### 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 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 := 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 - | 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 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 := 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 _ - | 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 := 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 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) - -/-! - -### 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] - +/-- Weights add under multiplication, when the representation is multiplicative. -/ 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) : + {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 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) - (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 : 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 := 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 => ?_ - 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 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) - (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 : 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 := 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 => ?_ - 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 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) : - 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 (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] - 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 [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 [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 [LorentzGroup.boostAxis_apply] - 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)) - + (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 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 : 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 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 := 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 _ - | add u v _ _ ihu ihv => rw [TensorProduct.tmul_add]; exact Submodule.add_mem _ ihu ihv - + rw [hmul, hx t ht, hy t ht, smul_mul_smul_comm, zpow_add₀ (algebraMap_ne_zero (K := K) ht)] /-! -### Transport between the three axes - --/ +## B. Independence of the weight spaces -/-- 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⟩ := 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] - 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 Submodule.eq_top_iff'.mpr fun x => ?_ - obtain ⟨y, rfl⟩ : ∃ y, rep R y = x := ⟨rep R⁻¹ x, hsurj x⟩ - 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 _ - | add u v _ _ ihu ihv => rw [map_add]; exact Submodule.add_mem _ ihu ihv - -/-! - -## B. The graded-algebra theory of a boost-graded representation +The weight-`k` space lies in the `2 ^ k` eigenspace of the boost at parameter two, and +distinct weights give distinct eigenvalues, so the weight spaces are independent. An +invariant of the group has weight zero along every axis; written as a sum of vectors of +definite weight it is therefore the weight-zero term, and a weight-zero vector of a join of +weight spaces lies in the weight-zero one. -/ -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 - /-- The weight space of weight `k` sits inside the `2 ^ k` eigenspace of the boost at parameter two. -/ lemma boostWeightSubmodule_le_eigenspace (rep : Representation K SL(2,ℂ) M) (k : ℤ) : @@ -428,26 +120,14 @@ private lemma zpow_algebraMap_two_injective : 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. -/ +/-- The weight spaces are independent: a decomposition into homogeneous parts is unique + when it exists. -/ 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 M)).comp zpow_algebraMap_two_injective).mono fun k => boostWeightSubmodule_le_eigenspace rep k - -/-! - -### Weight-zero vectors - -An invariant of the group has weight zero along every axis, and the weight spaces are -independent, so a weight-zero vector written as a sum of vectors of definite weights is equal -to the weight-zero term of that sum. The `Invariants` files use these to read an invariant off -its weight decomposition. - --/ - /-- A vector fixed by the whole group has boost weight zero along every axis. -/ lemma mem_boostWeightSubmodule_zero_of_invariant {rep : Representation K SL(2,ℂ) M} {x : M} (hinv : ∀ g : SL(2,ℂ), rep g x = x) (i : Fin 3) : @@ -457,12 +137,9 @@ lemma mem_boostWeightSubmodule_zero_of_invariant {rep : Representation K SL(2, rw [hinv, zpow_zero, one_smul] /-- Vectors of distinct boost weights adding to zero are each zero. -/ -lemma eq_zero_of_sum_mem_boostWeightSubmodule - {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) : - ∀ m ∈ s, w m = 0 := by +lemma eq_zero_of_sum_mem_boostWeightSubmodule {rep : Representation K SL(2,ℂ) M} + {s : Finset ℤ} {w : ℤ → M} (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₀) ?_ @@ -473,14 +150,12 @@ 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 vector written as a sum of definite weights equals the weight-zero term. -/ -lemma eq_component_zero_of_mem_boostWeightSubmodule - {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) - (h0 : (0 : ℤ) ∈ s) (hsum : x = ∑ m ∈ s, w m) : - x = w 0 := by +/-- A weight-zero vector written as a sum of definite weights equals the weight-zero + term. -/ +lemma eq_component_zero_of_mem_boostWeightSubmodule {rep : Representation K SL(2,ℂ) M} + {s : Finset ℤ} {w : ℤ → M} {x : M} (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 @@ -512,258 +187,14 @@ lemma mem_of_mem_iSup_of_boostWeight_zero {rep : Representation K SL(2,ℂ) M} { · rw [Finset.insert_eq_self.2 h] · rw [Finset.sum_insert h, Finsupp.notMem_support_iff.1 h, zero_add] -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} - (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.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. -/ -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 - /-! ## 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. -/ +/-- A weight decomposition of a submodule `V`: a finitely supported family of subspaces of + pure boost weight whose supremum is `V`. -/ structure WeightDecomposition (rep : Representation K SL(2,ℂ) M) (i : Fin 3) (V : Submodule K M) where /-- The weight-`k` piece of the decomposition. -/ @@ -776,9 +207,10 @@ structure WeightDecomposition (rep : Representation K SL(2,ℂ) M) (i : Fin 3) namespace WeightDecomposition +variable {rep : Representation K SL(2,ℂ) M} {V₁ V₂ : Submodule K M} + /-- 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 +def copy (d₁ : WeightDecomposition rep i V₁) (hV : V₁ = V₂) : WeightDecomposition rep i V₂ where piece := d₁.piece supp := d₁.supp piece_le := d₁.piece_le @@ -786,14 +218,12 @@ def copy {rep : Representation K SL(2,ℂ) M} {i : Fin 3} {V₁ V₂ : Submodule 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 : ℤ) : +lemma copy_piece (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₂) : +/-- 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 (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 @@ -804,80 +234,8 @@ def sup {rep : Representation K SL(2,ℂ) M} {i : Fin 3} {V₁ V₂ : Submodule 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) - -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]) +lemma sup_piece (d₁ : WeightDecomposition rep i V₁) (d₂ : WeightDecomposition rep i V₂) + (k : ℤ) : (d₁.sup d₂).piece k = d₁.piece k ⊔ d₂.piece k := rfl end WeightDecomposition From 58f91f454a0b81be6c52573ab833f695de7b7423 Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Mon, 7 Sep 2026 17:14:54 +0400 Subject: [PATCH 285/367] feat: Standard Model matterFields and GaugeJet --- Physlib.lean | 2 + .../StandardModel/Fermions/MatterField.lean | 220 ++++++++++++++++++ .../StandardModel/GaugeGroup/GaugeJet.lean | 166 +++++++++++++ 3 files changed, 388 insertions(+) create mode 100644 Physlib/Particles/StandardModel/Fermions/MatterField.lean create mode 100644 Physlib/Particles/StandardModel/GaugeGroup/GaugeJet.lean diff --git a/Physlib.lean b/Physlib.lean index 8e004f8eb..00995250d 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -274,6 +274,7 @@ public import Physlib.Particles.StandardModel.Fermions.LeptonDoublet.Basic 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.MatterField public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet.Basic public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet.GaugeAlgebraAction public import Physlib.Particles.StandardModel.Fermions.UpSinglet.Basic @@ -293,6 +294,7 @@ 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.MassWeightPoly +public import Physlib.Particles.StandardModel.GaugeGroup.GaugeJet public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.Basic public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU2Adjoint diff --git a/Physlib/Particles/StandardModel/Fermions/MatterField.lean b/Physlib/Particles/StandardModel/Fermions/MatterField.lean new file mode 100644 index 000000000..a3d17d67c --- /dev/null +++ b/Physlib/Particles/StandardModel/Fermions/MatterField.lean @@ -0,0 +1,220 @@ +/- +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.ClassicalFieldTheory.GaugeTheory.Matter.MatterField +public import Physlib.Particles.StandardModel.Fermions.DownSinglet.Basic +public import Physlib.Particles.StandardModel.Fermions.LeptonDoublet.Basic +public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.Basic +public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet.Basic +public import Physlib.Particles.StandardModel.Fermions.UpSinglet.Basic +/-! +# The Standard Model fermions as matter fields + +## i. Overview + +`MatterField G` bundles the value space of one field of a gauge theory with jet gauge +group `G`, its Lorentz representation, the fibrewise action of the jets of gauge +transformations on the jets of the field, and its mass weight. The five Standard Model +fermion types already carry all four, and this file collects them. Nothing is redefined +and no convention is changed. The chirality, the gauge representation, the hypercharge +normalization `6Y` and the fibrewise-linearity proof are the ones already in the species +files. + +There is one adapter per fermion type, not per type and generation, since `FermionSpace` +carries `Fin 3` copies of each type and a matter field describes one multiplet. + +Mass weight three is the fermionic weight already fixed by +`FermionJetAlgebra.massWeightScale`, in the units in which a derivative has weight two. + +## ii. Key results + +- `StandardModel.LeptonDoublet.matterField` : the lepton doublet as a matter field. +- `StandardModel.LeptonSinglet.matterField` : the charged-lepton singlet as a matter field. +- `StandardModel.QuarkDoublet.matterField` : the quark doublet as a matter field. +- `StandardModel.UpSinglet.matterField` : the up-type singlet as a matter field. +- `StandardModel.DownSinglet.matterField` : the down-type singlet as a matter field. + +Each comes with the four projection rules `…matterField_V`, `…matterField_repLorentz`, +`…matterField_repJet` and `…matterField_massWeight` identifying its fields with the +existing Standard Model definitions. + +## iii. Table of contents + +- A. The lepton sector + - A.1. The lepton doublet + - A.2. The charged-lepton singlet +- B. The quark sector + - B.1. The quark doublet + - B.2. The up-type singlet + - B.3. The down-type singlet + +-/ + +@[expose] public section + +namespace StandardModel + +/-! + +## A. The lepton sector + +### A.1. The lepton doublet + +-/ + +namespace LeptonDoublet + +/-- The lepton doublet as a matter field of `JetGaugeGroupI`, in the `(1, 2)_{-3}` + representation with its left-handed Lorentz action. -/ +noncomputable def matterField : MatterField JetGaugeGroupI where + V := LeptonDoublet + repLorentz := repLorentzGroup + repJet := repJetGaugeGroupI + repJet_smul := repJetGaugeGroupI_smul + massWeight := 3 + +@[simp] +lemma matterField_V : matterField.V = LeptonDoublet := rfl + +@[simp] +lemma matterField_repLorentz : matterField.repLorentz = repLorentzGroup := rfl + +@[simp] +lemma matterField_repJet : matterField.repJet = repJetGaugeGroupI := rfl + +@[simp] +lemma matterField_massWeight : matterField.massWeight = 3 := rfl + +end LeptonDoublet + +/-! + +### A.2. The charged-lepton singlet + +-/ + +namespace LeptonSinglet + +/-- The charged-lepton singlet as a matter field of `JetGaugeGroupI`, in the + `(1, 1)_{-6}` representation with its right-handed Lorentz action. -/ +noncomputable def matterField : MatterField JetGaugeGroupI where + V := LeptonSinglet + repLorentz := repLorentzGroup + repJet := repJetGaugeGroupI + repJet_smul := repJetGaugeGroupI_smul + massWeight := 3 + +@[simp] +lemma matterField_V : matterField.V = LeptonSinglet := rfl + +@[simp] +lemma matterField_repLorentz : matterField.repLorentz = repLorentzGroup := rfl + +@[simp] +lemma matterField_repJet : matterField.repJet = repJetGaugeGroupI := rfl + +@[simp] +lemma matterField_massWeight : matterField.massWeight = 3 := rfl + +end LeptonSinglet + +/-! + +## B. The quark sector + +### B.1. The quark doublet + +-/ + +namespace QuarkDoublet + +/-- The quark doublet as a matter field of `JetGaugeGroupI`, in the `(3, 2)_{1}` + representation with its left-handed Lorentz action. -/ +noncomputable def matterField : MatterField JetGaugeGroupI where + V := QuarkDoublet + repLorentz := repLorentzGroup + repJet := repJetGaugeGroupI + repJet_smul := repJetGaugeGroupI_smul + massWeight := 3 + +@[simp] +lemma matterField_V : matterField.V = QuarkDoublet := rfl + +@[simp] +lemma matterField_repLorentz : matterField.repLorentz = repLorentzGroup := rfl + +@[simp] +lemma matterField_repJet : matterField.repJet = repJetGaugeGroupI := rfl + +@[simp] +lemma matterField_massWeight : matterField.massWeight = 3 := rfl + +end QuarkDoublet + +/-! + +### B.2. The up-type singlet + +-/ + +namespace UpSinglet + +/-- The up-type quark singlet as a matter field of `JetGaugeGroupI`, in the + `(3, 1)_{4}` representation with its right-handed Lorentz action. -/ +noncomputable def matterField : MatterField JetGaugeGroupI where + V := UpSinglet + repLorentz := repLorentzGroup + repJet := repJetGaugeGroupI + repJet_smul := repJetGaugeGroupI_smul + massWeight := 3 + +@[simp] +lemma matterField_V : matterField.V = UpSinglet := rfl + +@[simp] +lemma matterField_repLorentz : matterField.repLorentz = repLorentzGroup := rfl + +@[simp] +lemma matterField_repJet : matterField.repJet = repJetGaugeGroupI := rfl + +@[simp] +lemma matterField_massWeight : matterField.massWeight = 3 := rfl + +end UpSinglet + +/-! + +### B.3. The down-type singlet + +-/ + +namespace DownSinglet + +/-- The down-type quark singlet as a matter field of `JetGaugeGroupI`, in the + `(3, 1)_{-2}` representation with its right-handed Lorentz action. -/ +noncomputable def matterField : MatterField JetGaugeGroupI where + V := DownSinglet + repLorentz := repLorentzGroup + repJet := repJetGaugeGroupI + repJet_smul := repJetGaugeGroupI_smul + massWeight := 3 + +@[simp] +lemma matterField_V : matterField.V = DownSinglet := rfl + +@[simp] +lemma matterField_repLorentz : matterField.repLorentz = repLorentzGroup := rfl + +@[simp] +lemma matterField_repJet : matterField.repJet = repJetGaugeGroupI := rfl + +@[simp] +lemma matterField_massWeight : matterField.massWeight = 3 := rfl + +end DownSinglet + +end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeGroup/GaugeJet.lean b/Physlib/Particles/StandardModel/GaugeGroup/GaugeJet.lean new file mode 100644 index 000000000..33b796fc1 --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeGroup/GaugeJet.lean @@ -0,0 +1,166 @@ +/- +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.ClassicalFieldTheory.GaugeTheory.GaugeField.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.Matter.CovariantDeriv +public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.MaurerCartan.Basic +public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.CovariantDeriv +/-! +# The Standard Model gauge group as jets of a gauge group + +## i. Overview + +The generic transformation laws of gauge and matter fields are stated against the class +`GaugeJet G 𝔤 G₀ 𝔤J`. The Standard Model already carries all of its data, for the jet +gauge group `JetGaugeGroupI` of `SU(3) × SU(2) × U(1)` with jet Lie algebra +`JetGaugeAlgebra`, global group `GaugeGroupI` and gauge algebra `GaugeAlgebra`. + +This file installs those existing constructions as the instance +`StandardModel.instGaugeJet`, and records the rules that compute the generic interface +back to the Standard Model definition it came from, so the existing Standard Model lemmas +apply to it unchanged. `GaugeJetLeibniz` is not instantiated here. + +## ii. Key results + +- `StandardModel.instGaugeJet` : the Standard Model gauge group as jets of a gauge group. +- `StandardModel.gaugeJet_eval`, `StandardModel.gaugeJet_deriv`, + `StandardModel.gaugeJet_mc`, … : the generic interface computed back to the Standard + Model definitions. +- `StandardModel.gaugeJet_iteratedDeriv` : the generic iterated derivative is the Standard + Model iterated derivative. +- `StandardModel.gaugeJet_adjointCoeff`, `StandardModel.gaugeJet_adjointDualCoeff` : the + generic base-point adjoint transport at the instance is the existing Standard Model one. + +## iii. Table of contents + +- A. The gauge-jet instance +- B. The generic interface in Standard Model terms + - B.1. The group and Lie algebra data + - B.2. The derivative, the adjoint action and the Maurer–Cartan form +- C. The generic adjoint transport is the Standard Model adjoint transport + +-/ + +@[expose] public section + +namespace StandardModel + +open JetGaugeAlgebra + +/-! + +## A. The gauge-jet instance + +It is registered as a global instance because `G₀` and `𝔤J` are output parameters of the +class, so the pair `(JetGaugeGroupI, GaugeAlgebra)` determines it, and the library holds +no other `GaugeJet` instance. + +-/ + +/-- The Standard Model gauge group as jets of a gauge group, for the jet gauge group + `JetGaugeGroupI` and its Lie algebra `JetGaugeAlgebra` over the global group + `GaugeGroupI` and gauge algebra `GaugeAlgebra`. Nothing is redefined. Every data field + is an existing Standard Model construction and every proof field an existing Standard + Model lemma. -/ +noncomputable instance instGaugeJet : + GaugeJet JetGaugeGroupI GaugeAlgebra GaugeGroupI JetGaugeAlgebra where + eval := JetGaugeGroupI.eval + ofConstant := JetGaugeGroupI.ofConstant + eval_ofConstant := JetGaugeGroupI.eval_ofConstant + evalLie := JetGaugeAlgebra.eval + ofConstantLie := JetGaugeAlgebra.ofConstant + ofConstantLie_lie := JetGaugeAlgebra.ofConstant_lie + deriv := JetGaugeAlgebra.deriv + deriv_comm := JetGaugeAlgebra.deriv_comm + deriv_bracket := JetGaugeAlgebra.deriv_bracket + deriv_ofConstantLie := JetGaugeAlgebra.deriv_ofConstant + adjoint := JetGaugeAlgebra.adjoint + adjoint_lie := JetGaugeAlgebra.adjointMap_lie + mc := maurerCartanForm + mc_one := fun μ => congrFun maurerCartanForm_one μ + mc_cocycle := maurerCartanForm_cocycle + mc_structure := maurerCartanForm_structure + deriv_adjoint := deriv_adjointMap + adjointValue := GaugeAlgebra.adjoint + evalLie_adjoint_ofConstantLie := JetGaugeAlgebra.eval_adjointMap_ofConstant + +/-! + +## B. The generic interface in Standard Model terms + +These rules point from the generic interface to the Standard Model definitions, which is +the direction in which the existing Standard Model lemmas become applicable. + +### B.1. The group and Lie algebra data + +-/ + +@[simp] +lemma gaugeJet_eval : GaugeJet.eval GaugeAlgebra (G := JetGaugeGroupI) = + JetGaugeGroupI.eval := rfl + +@[simp] +lemma gaugeJet_ofConstant : GaugeJet.ofConstant GaugeAlgebra (G := JetGaugeGroupI) = + JetGaugeGroupI.ofConstant := rfl + +@[simp] +lemma gaugeJet_evalLie : GaugeJet.evalLie JetGaugeGroupI (𝔤 := GaugeAlgebra) = + JetGaugeAlgebra.eval := rfl + +@[simp] +lemma gaugeJet_ofConstantLie : GaugeJet.ofConstantLie JetGaugeGroupI (𝔤 := GaugeAlgebra) = + JetGaugeAlgebra.ofConstant := rfl + +@[simp] +lemma gaugeJet_adjointValue : GaugeJet.adjointValue JetGaugeGroupI (𝔤 := GaugeAlgebra) = + GaugeAlgebra.adjoint := rfl + +/-! + +### B.2. The derivative, the adjoint action and the Maurer–Cartan form + +-/ + +@[simp] +lemma gaugeJet_deriv (μ : Fin 1 ⊕ Fin 3) : + GaugeJet.deriv JetGaugeGroupI GaugeAlgebra μ = JetGaugeAlgebra.deriv μ := rfl + +/-- The generic iterated derivative is the Standard Model iterated derivative, both being + the same fold of `JetGaugeAlgebra.deriv` over the multiset of directions. -/ +@[simp] +lemma gaugeJet_iteratedDeriv (s : Multiset (Fin 1 ⊕ Fin 3)) : + GaugeJet.iteratedDeriv JetGaugeGroupI GaugeAlgebra s = JetGaugeAlgebra.iteratedDeriv s := + rfl + +@[simp] +lemma gaugeJet_adjoint : GaugeJet.adjoint GaugeAlgebra (G := JetGaugeGroupI) = + JetGaugeAlgebra.adjoint := rfl + +@[simp] +lemma gaugeJet_mc : GaugeJet.mc GaugeAlgebra (G := JetGaugeGroupI) = maurerCartanForm := rfl + +/-! + +## C. The generic adjoint transport is the Standard Model adjoint transport + +The composite `evalLie ∘ ∂_x ∘ Ad_U ∘ ofConstantLie`, by which the generic theory +transports the gauge algebra to the base point, is the map the Standard Model +covariant-derivative development already uses under the same name. + +-/ + +@[simp] +lemma gaugeJet_adjointCoeff (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : + _root_.IsGaugeField.adjointCoeff (𝔤 := GaugeAlgebra) U x = IsGaugeField.adjointCoeff U x := + rfl + +@[simp] +lemma gaugeJet_adjointDualCoeff (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : + _root_.adjointDualCoeff (𝔤 := GaugeAlgebra) U x = adjointDualCoeff U x := rfl + +end StandardModel From 9a2a635641b3d67e9aec7a79140ab7da6ce62a93 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 7 Sep 2026 15:00:24 +0100 Subject: [PATCH 286/367] feat: more clean up --- Physlib/Mathematics/TensorProductComm.lean | 52 ++ .../AlgebraRealization/Basic.lean | 49 +- .../CovFieldAlgebra/Basic.lean | 162 ++++++ .../AlgebraRealization/CovStandardModel.lean | 21 +- .../AlgebraRealization/CovariantDeriv.lean | 226 +------- .../CovAlgebraRealization/Basic.lean | 508 ++++++++++++++++++ .../DownSinglet/GaugeAlgebraAction.lean | 16 + .../LeptonDoublet/GaugeAlgebraAction.lean | 16 + .../LeptonSinglet/GaugeAlgebraAction.lean | 18 +- .../QuarkDoublet/GaugeAlgebraAction.lean | 36 ++ .../UpSinglet/GaugeAlgebraAction.lean | 16 + .../HiggsBoson/GaugeAlgebraAction.lean | 13 + .../JetAlgebra/AlgebraRealization.lean | 112 ++-- 13 files changed, 942 insertions(+), 303 deletions(-) create mode 100644 Physlib/Mathematics/TensorProductComm.lean create mode 100644 Physlib/Particles/StandardModel/AlgebraRealization/CovFieldAlgebra/Basic.lean create mode 100644 Physlib/Particles/StandardModel/CovAlgebraRealization/Basic.lean diff --git a/Physlib/Mathematics/TensorProductComm.lean b/Physlib/Mathematics/TensorProductComm.lean new file mode 100644 index 000000000..49cf0942b --- /dev/null +++ b/Physlib/Mathematics/TensorProductComm.lean @@ -0,0 +1,52 @@ +/- +Copyright (c) 2026 Joseph 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.TensorProduct.Basic +public import Mathlib.LinearAlgebra.TensorProduct.Map +public import Mathlib.LinearAlgebra.TensorProduct.Associator +/-! +# Commuting tensor-factor endomorphisms + +An endomorphism of one tensor factor of `W ⊗ X` commutes with a map acting on another +factor, since the two act independently. `lTensor_map_id_comm` is that fact for two +factors, and `congr_assoc_map_id_comm` is its analogue after reassociating and recombining +a third factor into the second. + +-/ + +@[expose] public section + +open scoped TensorProduct + +/-- An endomorphism of the second tensor factor commutes with one of the first. -/ +lemma lTensor_map_id_comm {k : Type} [CommSemiring k] {W X : Type} [AddCommMonoid W] + [Module k W] [AddCommMonoid X] [Module k X] (f : X →ₗ[k] X) (g : W →ₗ[k] W) + (t : W ⊗[k] 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. -/ +lemma congr_assoc_map_id_comm {k : Type} [CommSemiring k] {W X Y Z : Type} [AddCommMonoid W] + [Module k W] [AddCommMonoid X] [Module k X] [AddCommMonoid Y] [Module k Y] + [AddCommMonoid Z] [Module k Z] (E : X ⊗[k] Y ≃ₗ[k] Z) (g : W →ₗ[k] W) + (t : (W ⊗[k] X) ⊗[k] Y) : + (TensorProduct.congr (LinearEquiv.refl k W) E) (TensorProduct.assoc k W X Y + (TensorProduct.map (TensorProduct.map g LinearMap.id) LinearMap.id t)) = + TensorProduct.map g LinearMap.id + ((TensorProduct.congr (LinearEquiv.refl k W) E) (TensorProduct.assoc k 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] diff --git a/Physlib/Particles/StandardModel/AlgebraRealization/Basic.lean b/Physlib/Particles/StandardModel/AlgebraRealization/Basic.lean index 972884b22..0310d4afe 100644 --- a/Physlib/Particles/StandardModel/AlgebraRealization/Basic.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/Basic.lean @@ -45,6 +45,8 @@ their gauge covariance and the classification of jet-gauge invariants. - `StandardModel.AlgebraRealization` : an algebra is a Standard Model when it receives an equivariant algebra map from the jet algebra. +- `AlgebraRealization.id` : the jet algebra of the Standard Model is a Standard Model, along + the identity algebra map. - `AlgebraRealization.A`, `AlgebraRealization.H` and their companions : the thirteen families of derivative symbols of a Standard Model. - `AlgebraRealization.repJet_A`, `AlgebraRealization.repLorentz_H`, @@ -53,11 +55,12 @@ their gauge covariance and the classification of jet-gauge invariants. ## iii. Table of contents -- A. The fields of a Standard Model -- B. Transporting a fact along the defining map -- C. The gauge transformation of the fields -- D. The Lorentz transformation of the fields -- E. The mass weights of the fields +- A. The identity realization +- B. The fields of a Standard Model +- C. Transporting a fact along the defining map +- D. The gauge transformation of the fields +- E. The Lorentz transformation of the fields +- F. The mass weights of the fields -/ @@ -111,6 +114,34 @@ structure AlgebraRealization (B : Type) [Ring B] [Algebra ℂ B] namespace AlgebraRealization +/-! + +## A. The identity realization + +The jet algebra of the Standard Model is a Standard Model along the identity algebra map, +since `AlgebraRealization` asks precisely for an equivariant algebra map out of the jet +algebra. The four compatibility laws hold by definition, and the two multiplicativity laws +are the ones the jet gauge action and the Lorentz action were shown to satisfy when they +were built. + +This is the point at which the abstract theory of `AlgebraRealization` — its covariant +reduction, its mass-weight filtration and its classification of invariants — becomes a +theory of the concrete algebra in which a Standard Model Lagrangian is written. + +-/ + +/-- The jet algebra of the Standard Model is a Standard Model: it is one along the identity + algebra map. -/ +noncomputable def id : AlgebraRealization JetAlgebra JetAlgebra.repJetGaugeGroupI + JetAlgebra.repLorentzGroup JetAlgebra.massWeightPoly where + toAlgHom := AlgHom.id ℂ JetAlgebra + map_repJet _ _ := rfl + map_repLorentz _ _ := rfl + map_massWeight x := by + simp [Polynomial.mapAlgHom] + repJet_mul := JetAlgebra.isGaugeField.gauge_mul + repLorentz_mul := JetAlgebra.repLorentzGroup_apply_mul + variable {B : Type} [Ring B] [Algebra ℂ B] {repJet : Representation ℂ JetGaugeGroupI B} {repLorentz : Representation ℂ SL(2,ℂ) B} @@ -119,7 +150,7 @@ variable {B : Type} [Ring B] [Algebra ℂ B] /-! -## A. The fields of a Standard Model +## B. The fields of a Standard Model The thirteen families of derivative symbols the theory is written in — the gauge field, the Higgs field and its conjugate, and the five fermion species in three generations with @@ -199,7 +230,7 @@ noncomputable def bare (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : /-! -## B. Transporting a fact along the defining map +## C. Transporting a fact along the defining map Every law the old structure demanded as an axiom is now a theorem, proved once for the jet algebra and transported along `toAlgHom`. The transport is the same in each of the shapes @@ -236,7 +267,7 @@ private lemma map_family_repLorentz {V : Type} [AddCommGroup V] [Module ℂ V] /-! -## C. The gauge transformation of the fields +## D. The gauge transformation of the fields The gauge field is a gauge field — Lorentz covector symbols, the all-orders adjoint Leibniz convolution with the Maurer–Cartan shift, and a multiplicative gauge action — and @@ -329,7 +360,7 @@ lemma repJet_bare : ∀ i, TransformsIn repJet (repConj LeptonSinglet.repJetGaug /-! -## D. The Lorentz transformation of the fields +## E. The Lorentz transformation of the fields The derivative slots of every field mix by per-slot Lorentz matrices, and the value index by the contragredient of the species' Lorentz representation: the Higgs is a scalar, the diff --git a/Physlib/Particles/StandardModel/AlgebraRealization/CovFieldAlgebra/Basic.lean b/Physlib/Particles/StandardModel/AlgebraRealization/CovFieldAlgebra/Basic.lean new file mode 100644 index 000000000..e2be58e2a --- /dev/null +++ b/Physlib/Particles/StandardModel/AlgebraRealization/CovFieldAlgebra/Basic.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 Physlib.Particles.StandardModel.AlgebraRealization.CovariantDeriv +/-! +# The covariant field algebra + +## i. Overview + +The matter towers of `AlgebraRealization.CovariantDeriv` commute with the gauge-field +symbols and are fixed by pure gauge jets, so the abstract classification +`IsGaugeField.invariant_mem_adjoin_fieldStrength` applies to the field algebra written in +terms of the covariant towers: a jet-gauge invariant is a polynomial in the covariant +towers of the field strength and of the matter fields, gauge invariance having eliminated +the bare gauge-field symbols. `covFieldAlgebra` names the algebra those covariant towers +generate, and `invariant_mem_adjoin_covDeriv` is the classification. + +## ii. Key results + +- `AlgebraRealization.covFieldAlgebra` : the algebra generated by the covariant derivative + of the field strength and the covariant derivatives of the ten matter species. +- `AlgebraRealization.invariant_mem_adjoin_covDeriv` : the classification of jet-gauge + invariants of the field algebra: a `repJet`-invariant element of the field algebra lies + in `covFieldAlgebra`. + +## iii. Table of contents + +- A. The covariant field algebra and its 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 + +open TensorProduct Matrix MatrixGroups Lorentz + +namespace AlgebraRealization + +variable {B : Type} [Ring B] [Algebra ℂ B] + {repJet : Representation ℂ JetGaugeGroupI B} + {repLorentz : Representation ℂ SL(2,ℂ) B} + {massWeightPoly : B →ₐ[ℂ] Polynomial B} + (h : AlgebraRealization B repJet repLorentz massWeightPoly) + +/-! + +## A. The covariant field algebra and its classification of gauge invariants + +-/ + +/-- The covariant field algebra: the algebra generated by the covariant derivative of the + field strength and the covariant derivatives of the ten matter species. It is the + covariant analogue of `fieldAlgebra`, and the target of the classification of jet-gauge + invariants, `invariant_mem_adjoin_covDeriv`. -/ +noncomputable def covFieldAlgebra : Subalgebra ℂ B := + 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))) + +/-- The classification of gauge invariants of the field algebra: a `repJet`-invariant + element of the field algebra lies in the covariant field algebra — it is a polynomial in + the covariant derivatives of the field strength and the covariant derivatives of the + matter fields. -/ +theorem invariant_mem_adjoin_covDeriv {x : B} + (hx : x ∈ h.fieldAlgebra) + (hinv : ∀ U : JetGaugeGroupI, repJet U x = x) : + x ∈ h.covFieldAlgebra := by + show 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))) + -- the matter towers commute with the gauge-field symbols + have hcS : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (ψ : Module.Dual ℝ GaugeAlgebra), + ∀ y ∈ h.matterTowers, Commute y (h.A p μ ψ) := by + intro p μ ψ y hy + refine h.matterTowers_induction (fun y => Commute y (h.A p μ ψ)) hy + ?_ ?_ ?_ ?_ ?_ ?_ ?_ ?_ ?_ ?_ ?_ ?_ + · exact fun n l φ => IsGaugeField.commute_covDerivIter _ _ h.A_comm_A h.A_comm_H n l φ p μ ψ + · exact fun n l φ => + IsGaugeField.commute_covDerivIter _ _ h.A_comm_A h.A_comm_barH n l φ p μ ψ + · exact fun i n l φ => IsGaugeField.commute_covDerivIter _ _ h.A_comm_A + (fun s μ ψ s' φ => h.A_comm_d s μ ψ i s' φ) n l φ p μ ψ + · exact fun i n l φ => IsGaugeField.commute_covDerivIter _ _ h.A_comm_A + (fun s μ ψ s' φ => h.A_comm_bard s μ ψ i s' φ) n l φ p μ ψ + · exact fun i n l φ => IsGaugeField.commute_covDerivIter _ _ h.A_comm_A + (fun s μ ψ s' φ => h.A_comm_u s μ ψ i s' φ) n l φ p μ ψ + · exact fun i n l φ => IsGaugeField.commute_covDerivIter _ _ h.A_comm_A + (fun s μ ψ s' φ => h.A_comm_baru s μ ψ i s' φ) n l φ p μ ψ + · exact fun i n l φ => IsGaugeField.commute_covDerivIter _ _ h.A_comm_A + (fun s μ ψ s' φ => h.A_comm_Q s μ ψ i s' φ) n l φ p μ ψ + · exact fun i n l φ => IsGaugeField.commute_covDerivIter _ _ h.A_comm_A + (fun s μ ψ s' φ => h.A_comm_barQ s μ ψ i s' φ) n l φ p μ ψ + · exact fun i n l φ => IsGaugeField.commute_covDerivIter _ _ h.A_comm_A + (fun s μ ψ s' φ => h.A_comm_L s μ ψ i s' φ) n l φ p μ ψ + · exact fun i n l φ => IsGaugeField.commute_covDerivIter _ _ h.A_comm_A + (fun s μ ψ s' φ => h.A_comm_barL s μ ψ i s' φ) n l φ p μ ψ + · exact fun i n l φ => IsGaugeField.commute_covDerivIter _ _ h.A_comm_A + (fun s μ ψ s' φ => h.A_comm_e s μ ψ i s' φ) n l φ p μ ψ + · exact fun i n l φ => IsGaugeField.commute_covDerivIter _ _ h.A_comm_A + (fun s μ ψ s' φ => h.A_comm_bare s μ ψ i s' φ) n l φ p μ ψ + -- the matter towers are fixed by pure gauge jets + have hS : ∀ y ∈ h.matterTowers, ∀ U : JetGaugeGroupI.truncationKer 0, repJet U.1 y = y := by + intro y hy U + exact h.matterTowers_induction (fun y => repJet U.1 y = y) hy + (fun _ l φ => h.repJet_covDerivH_of_mem_truncationKer_zero l U φ) + (fun _ l φ => h.repJet_covDerivBarH_of_mem_truncationKer_zero l U φ) + (fun i _ l φ => h.repJet_covDerivD_of_mem_truncationKer_zero i l U φ) + (fun i _ l φ => h.repJet_covDerivBarD_of_mem_truncationKer_zero i l U φ) + (fun i _ l φ => h.repJet_covDerivU_of_mem_truncationKer_zero i l U φ) + (fun i _ l φ => h.repJet_covDerivBarU_of_mem_truncationKer_zero i l U φ) + (fun i _ l φ => h.repJet_covDerivQ_of_mem_truncationKer_zero i l U φ) + (fun i _ l φ => h.repJet_covDerivBarQ_of_mem_truncationKer_zero i l U φ) + (fun i _ l φ => h.repJet_covDerivL_of_mem_truncationKer_zero i l U φ) + (fun i _ l φ => h.repJet_covDerivBarL_of_mem_truncationKer_zero i l U φ) + (fun i _ l φ => h.repJet_covDerivE_of_mem_truncationKer_zero i l U φ) + (fun i _ l φ => h.repJet_covDerivBarE_of_mem_truncationKer_zero i l U φ) + -- the invariant lies in the algebra of the gauge-field 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 = h.A p μ ψ} ∪ h.matterTowers) := by + rw [h.fieldAlgebra_eq_covDeriv, Set.union_assoc] at hx + refine Algebra.adjoin_mono ?_ hx + rintro b (hA | hb) + · simp only [Set.mem_iUnion, Set.mem_range] at hA + obtain ⟨s, μ, ψ, rfl⟩ := hA + exact Or.inl ⟨s, μ, ψ, rfl⟩ + · exact Or.inr hb + -- the abstract classification + rw [Set.union_assoc] + refine Algebra.adjoin_mono ?_ (IsGaugeField.invariant_mem_adjoin_fieldStrength h.repJet_A + h.A_comm_A h.matterTowers hcS hS hx' hinv) + rintro b (⟨l, ν, lam, φ, rfl⟩ | hb) + · exact Or.inl (Set.mem_iUnion_of_mem l (Set.mem_iUnion_of_mem ν + (Set.mem_iUnion_of_mem lam ⟨φ, rfl⟩))) + · exact Or.inr hb + +end AlgebraRealization + +end StandardModel diff --git a/Physlib/Particles/StandardModel/AlgebraRealization/CovStandardModel.lean b/Physlib/Particles/StandardModel/AlgebraRealization/CovStandardModel.lean index b51ecdadd..9fea3c3f4 100644 --- a/Physlib/Particles/StandardModel/AlgebraRealization/CovStandardModel.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/CovStandardModel.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module public import Physlib.Particles.StandardModel.IsCovStandardModel.Basic -public import Physlib.Particles.StandardModel.AlgebraRealization.CovariantDeriv +public import Physlib.Particles.StandardModel.AlgebraRealization.CovFieldAlgebra.Basic public import Physlib.Particles.StandardModel.AlgebraRealization.MassWeight.Basic /-! # From the jet Standard Model to its covariant form @@ -35,7 +35,7 @@ which grades the algebra by the weight eigenspaces of `massWeightPoly` and pushe 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. Their Lorentz transformation laws -are section O of [`CovariantDeriv.lean`](CovariantDeriv.lean): each follows from the +are section L of [`CovariantDeriv.lean`](CovariantDeriv.lean): each follows from the Lorentz law `AlgebraRealization` 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 @@ -86,7 +86,7 @@ it. So `isCovStandardModel` is unconditional. The classification of jet-gauge invariants that section D consumes is `AlgebraRealization.invariant_mem_adjoin_covDeriv`, proved in -[`AlgebraRealization/CovariantDeriv.lean`](CovariantDeriv.lean); the splitting of a gauge +[`CovFieldAlgebra/Basic.lean`](CovFieldAlgebra/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 @@ -241,8 +241,9 @@ lemma repJet_algebraMap (U : JetGaugeGroupI) (c : ℂ) : rw [Algebra.algebraMap_eq_smul_one, map_smul, hone] include h in -/-- Pure gauge jets fix the covariant generators: this is section M of - `AlgebraRealization.CovariantDeriv` together with the field-strength case of section K. -/ +/-- Pure gauge jets fix the covariant generators: this is section L of + `AlgebraRealization.CovariantDeriv` together with the field-strength case of + `AlgebraRealization.CovFieldAlgebra.Basic`. -/ 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 @@ -290,9 +291,9 @@ lemma repJet_eq_of_mem_covAlgebra_of_mem_truncationKer_zero 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 N of -`AlgebraRealization.CovariantDeriv` puts every jet-invariant of the field algebra inside the -covariant algebra. Together: on the field algebra, jet invariance is membership of the +In the other direction the classification `AlgebraRealization.invariant_mem_adjoin_covDeriv` +of `AlgebraRealization.CovFieldAlgebra.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. -/ @@ -2282,7 +2283,7 @@ lemma covBarE_anticomm_covBarE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 Everything above assembles into an `IsCovStandardModel` for the covariant towers, acted on by the global gauge group and the Lorentz group. The Lorentz laws of the -matter towers are section O of [`CovariantDeriv.lean`](CovariantDeriv.lean); the one for +matter towers are section L of [`CovariantDeriv.lean`](CovariantDeriv.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. @@ -2306,7 +2307,7 @@ lemma repLorentz_covF (Λ : SL(2,ℂ)) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3 include h in /-- The covariant form of the Standard Model. Every gauge-equivariance, Lorentz, mass-weight and commutation obligation of `IsCovStandardModel` is discharged from - `AlgebraRealization`: the Lorentz laws of the matter towers are section O of + `AlgebraRealization`: the Lorentz laws of the matter towers are section L of `CovariantDeriv.lean`, the one of the field-strength tower is `repLorentz_covF`. -/ theorem isCovStandardModel : IsCovStandardModel B (repGlobal repJet) h.repGlobal_mul repLorentz h.repLorentz_mul diff --git a/Physlib/Particles/StandardModel/AlgebraRealization/CovariantDeriv.lean b/Physlib/Particles/StandardModel/AlgebraRealization/CovariantDeriv.lean index 959934eeb..2185db9e0 100644 --- a/Physlib/Particles/StandardModel/AlgebraRealization/CovariantDeriv.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/CovariantDeriv.lean @@ -36,10 +36,9 @@ by every symbol of the theory; the covariant towers are the iterated covariant d of the twelve matter families and of the field strength; and `fieldAlgebra_eq_covDeriv` says that swapping the bare matter symbols for their towers, the gauge-field symbols being kept in both, does not change the algebra generated. The towers are gauge covariant, transform -through the base point of a gauge jet alone, and are fixed by a pure gauge jet. Those combine -into `invariant_mem_adjoin_covDeriv`: a jet-gauge invariant of the field algebra lies in the -algebra generated by the covariant towers, gauge invariance having eliminated the bare -gauge-field symbols. The last two sections record the Lorentz laws of the covariant matter +through the base point of a gauge jet alone, and are fixed by a pure gauge jet — the three +facts `AlgebraRealization.CovFieldAlgebra.Basic` combines into the classification of +jet-gauge invariants. The last two sections record the Lorentz laws of the covariant matter towers, which the covariant form of the theory consumes. ## ii. Key results @@ -55,8 +54,6 @@ towers, which the covariant form of the theory consumes. companions : the covariant derivative towers. - `AlgebraRealization.fieldAlgebra_eq_covDeriv` : the covariant towers generate the field algebra. -- `AlgebraRealization.invariant_mem_adjoin_covDeriv` : the classification of jet-gauge - invariants of the field algebra. - `AlgebraRealization.repLorentz_covDerivH` and its companions : the Lorentz laws of the covariant matter towers. @@ -72,9 +69,8 @@ towers, which the covariant form of the theory consumes. - H. The field algebra and the covariant towers - I. The covariant towers generate the field algebra - J. Gauge covariance of the covariant towers -- K. The classification of gauge invariants -- L. The gauge action commutes with the Lorentz action -- M. The Lorentz laws of the covariant matter towers +- K. The gauge action commutes with the Lorentz action +- L. The Lorentz laws of the covariant matter towers -/ @@ -1529,219 +1525,23 @@ lemma repJet_covDerivFieldStrength_of_mem_truncationKer_zero IsGaugeField.repGauge_iteratedCovDerivAdjoint_fieldStrength_of_mem_truncationKer_zero h.repJet_A U l μ ν φ -/-! - -## K. The classification of gauge invariants - -The matter towers commute with the gauge-field symbols and are fixed by pure gauge jets, so -the abstract classification `IsGaugeField.invariant_mem_adjoin_fieldStrength` applies to -the field algebra written in terms of the covariant towers: a jet-gauge invariant is a -polynomial in the covariant towers of the field strength and of the matter fields, gauge -invariance having eliminated the bare gauge-field symbols. - --/ - -/-- The classification of gauge invariants of the 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. -/ -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 - -- the matter towers commute with the gauge-field symbols - have hcS : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (ψ : Module.Dual ℝ GaugeAlgebra), - ∀ y ∈ h.matterTowers, Commute y (h.A p μ ψ) := by - intro p μ ψ y hy - refine h.matterTowers_induction (fun y => Commute y (h.A p μ ψ)) hy - ?_ ?_ ?_ ?_ ?_ ?_ ?_ ?_ ?_ ?_ ?_ ?_ - · exact fun n l φ => IsGaugeField.commute_covDerivIter _ _ h.A_comm_A h.A_comm_H n l φ p μ ψ - · exact fun n l φ => - IsGaugeField.commute_covDerivIter _ _ h.A_comm_A h.A_comm_barH n l φ p μ ψ - · exact fun i n l φ => IsGaugeField.commute_covDerivIter _ _ h.A_comm_A - (fun s μ ψ s' φ => h.A_comm_d s μ ψ i s' φ) n l φ p μ ψ - · exact fun i n l φ => IsGaugeField.commute_covDerivIter _ _ h.A_comm_A - (fun s μ ψ s' φ => h.A_comm_bard s μ ψ i s' φ) n l φ p μ ψ - · exact fun i n l φ => IsGaugeField.commute_covDerivIter _ _ h.A_comm_A - (fun s μ ψ s' φ => h.A_comm_u s μ ψ i s' φ) n l φ p μ ψ - · exact fun i n l φ => IsGaugeField.commute_covDerivIter _ _ h.A_comm_A - (fun s μ ψ s' φ => h.A_comm_baru s μ ψ i s' φ) n l φ p μ ψ - · exact fun i n l φ => IsGaugeField.commute_covDerivIter _ _ h.A_comm_A - (fun s μ ψ s' φ => h.A_comm_Q s μ ψ i s' φ) n l φ p μ ψ - · exact fun i n l φ => IsGaugeField.commute_covDerivIter _ _ h.A_comm_A - (fun s μ ψ s' φ => h.A_comm_barQ s μ ψ i s' φ) n l φ p μ ψ - · exact fun i n l φ => IsGaugeField.commute_covDerivIter _ _ h.A_comm_A - (fun s μ ψ s' φ => h.A_comm_L s μ ψ i s' φ) n l φ p μ ψ - · exact fun i n l φ => IsGaugeField.commute_covDerivIter _ _ h.A_comm_A - (fun s μ ψ s' φ => h.A_comm_barL s μ ψ i s' φ) n l φ p μ ψ - · exact fun i n l φ => IsGaugeField.commute_covDerivIter _ _ h.A_comm_A - (fun s μ ψ s' φ => h.A_comm_e s μ ψ i s' φ) n l φ p μ ψ - · exact fun i n l φ => IsGaugeField.commute_covDerivIter _ _ h.A_comm_A - (fun s μ ψ s' φ => h.A_comm_bare s μ ψ i s' φ) n l φ p μ ψ - -- the matter towers are fixed by pure gauge jets - have hS : ∀ y ∈ h.matterTowers, ∀ U : JetGaugeGroupI.truncationKer 0, repJet U.1 y = y := by - intro y hy U - exact h.matterTowers_induction (fun y => repJet U.1 y = y) hy - (fun _ l φ => h.repJet_covDerivH_of_mem_truncationKer_zero l U φ) - (fun _ l φ => h.repJet_covDerivBarH_of_mem_truncationKer_zero l U φ) - (fun i _ l φ => h.repJet_covDerivD_of_mem_truncationKer_zero i l U φ) - (fun i _ l φ => h.repJet_covDerivBarD_of_mem_truncationKer_zero i l U φ) - (fun i _ l φ => h.repJet_covDerivU_of_mem_truncationKer_zero i l U φ) - (fun i _ l φ => h.repJet_covDerivBarU_of_mem_truncationKer_zero i l U φ) - (fun i _ l φ => h.repJet_covDerivQ_of_mem_truncationKer_zero i l U φ) - (fun i _ l φ => h.repJet_covDerivBarQ_of_mem_truncationKer_zero i l U φ) - (fun i _ l φ => h.repJet_covDerivL_of_mem_truncationKer_zero i l U φ) - (fun i _ l φ => h.repJet_covDerivBarL_of_mem_truncationKer_zero i l U φ) - (fun i _ l φ => h.repJet_covDerivE_of_mem_truncationKer_zero i l U φ) - (fun i _ l φ => h.repJet_covDerivBarE_of_mem_truncationKer_zero i l U φ) - -- the invariant lies in the algebra of the gauge-field 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 = h.A p μ ψ} ∪ h.matterTowers) := by - rw [h.fieldAlgebra_eq_covDeriv, Set.union_assoc] at hx - refine Algebra.adjoin_mono ?_ hx - rintro b (hA | hb) - · simp only [Set.mem_iUnion, Set.mem_range] at hA - obtain ⟨s, μ, ψ, rfl⟩ := hA - exact Or.inl ⟨s, μ, ψ, rfl⟩ - · exact Or.inr hb - -- the abstract classification - rw [Set.union_assoc] - refine Algebra.adjoin_mono ?_ (IsGaugeField.invariant_mem_adjoin_fieldStrength h.repJet_A - h.A_comm_A h.matterTowers hcS hS hx' hinv) - rintro b (⟨l, ν, lam, φ, rfl⟩ | hb) - · exact Or.inl (Set.mem_iUnion_of_mem l (Set.mem_iUnion_of_mem ν - (Set.mem_iUnion_of_mem lam ⟨φ, rfl⟩))) - · exact Or.inr hb - end AlgebraRealization /-! -## L. The gauge action commutes with the Lorentz action +## K. The gauge action commutes with the Lorentz action The Lorentz law of a covariant matter tower needs the infinitesimal gauge action of its -species to commute with the Lorentz action on the value space. The two act on different -tensor factors: the Lorentz group on the Weyl factor and the gauge algebra on the colour and -weak factors, so they commute; for the Higgs the Lorentz action is trivial, and for the -charged-lepton singlet the gauge action is a scalar. Conjugation transports the commutation -to the conjugate families. +species to commute with the Lorentz action on the value space. Each species proves this +commutation for itself, next to its `gaugeAlgebraAction` +(`HiggsVec.gaugeAlgebraAction_comm_repLorentz` and, for the ten fermion species, +`gaugeAlgebraAction_comm_repLorentzGroup` in its own `GaugeAlgebraAction.lean`). +Conjugation transports the commutation to the conjugate families. -/ 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) := fun x => by - 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] @@ -1756,12 +1556,12 @@ end GaugeLorentzComm /-! -## M. The Lorentz laws of the covariant matter towers +## L. 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 `AlgebraRealization` into the covariant one, given the commutation of the -gauge action with the Lorentz action of section L; for the conjugate towers that +gauge action with the Lorentz action of section K; for the conjugate towers that commutation is transported by `actionConj_comm_repConj`. -/ diff --git a/Physlib/Particles/StandardModel/CovAlgebraRealization/Basic.lean b/Physlib/Particles/StandardModel/CovAlgebraRealization/Basic.lean new file mode 100644 index 000000000..d76d295c1 --- /dev/null +++ b/Physlib/Particles/StandardModel/CovAlgebraRealization/Basic.lean @@ -0,0 +1,508 @@ +/- +Copyright (c) 2026 Joseph Tooby-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.AlgebraRealization.CovStandardModel +/-! +# The covariant jet algebra + +## i. Overview + +Placeholder. + +## ii. Key results + +Placeholder. + +## iii. Table of contents + +- A. The covariant subalgebra is the covariant field algebra + +-/ + +@[expose] public section + +set_option maxHeartbeats 4000000 +set_option synthInstance.maxHeartbeats 1000000 +set_option synthInstance.maxSize 2048 +set_option maxRecDepth 8000 + +namespace StandardModel + +open TensorProduct Matrix MatrixGroups Lorentz + +namespace AlgebraRealization + +variable {B : Type} [Ring B] [Algebra ℂ B] + {repJet : Representation ℂ JetGaugeGroupI B} + {repLorentz : Representation ℂ SL(2,ℂ) B} + {massWeightPoly : B →ₐ[ℂ] Polynomial B} + (h : AlgebraRealization B repJet repLorentz massWeightPoly) + +/-! + +## A. The covariant subalgebra is the covariant field algebra + +-/ + +/-- The covariant field algebra of `CovFieldAlgebra.Basic` and the covariant subalgebra of + `CovStandardModel` are the same subalgebra: their generating sets are the two indexings + of the covariant towers, which agree. -/ +lemma covFieldAlgebra_eq_covAlgebra : h.covFieldAlgebra = h.covAlgebra := by + rw [covAlgebra, covGenerators_eq_covGeneratorsList] + rfl + +/-! + +### A.1. The covariant towers lie in the covariant subalgebra + +-/ + +/-- The field-strength tower lies in the covariant subalgebra. -/ +lemma covF_mem_covAlgebra {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra) : h.covF l μ ν φ ∈ h.covAlgebra := + Algebra.subset_adjoin <| Or.inl <| Or.inl <| Set.mem_iUnion_of_mem n <| + Set.mem_iUnion_of_mem l <| Set.mem_iUnion_of_mem μ <| Set.mem_iUnion_of_mem ν <| ⟨φ, rfl⟩ + +/-- The Higgs tower lies in the covariant subalgebra. -/ +lemma covDerivH_mem_covAlgebra {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ HiggsVec) : h.covDerivH l φ ∈ h.covAlgebra := + Algebra.subset_adjoin <| Or.inl <| Or.inr <| Set.mem_iUnion_of_mem n <| + Set.mem_iUnion_of_mem l <| Or.inl ⟨φ, rfl⟩ + +/-- The conjugate Higgs tower lies in the covariant subalgebra. -/ +lemma covDerivBarH_mem_covAlgebra {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule HiggsVec)) : h.covDerivBarH l φ ∈ h.covAlgebra := + Algebra.subset_adjoin <| Or.inl <| Or.inr <| Set.mem_iUnion_of_mem n <| + Set.mem_iUnion_of_mem l <| Or.inr ⟨φ, rfl⟩ + +/-- The down-type quark tower lies in the covariant subalgebra. -/ +lemma covDerivD_mem_covAlgebra (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ DownSinglet) : h.covDerivD i l φ ∈ h.covAlgebra := + Algebra.subset_adjoin <| Or.inr <| Set.mem_iUnion_of_mem i <| Set.mem_iUnion_of_mem n <| + Set.mem_iUnion_of_mem l <| Or.inl <| Or.inl <| Or.inl <| Or.inl <| Or.inl <| Or.inl <| + Or.inl <| Or.inl <| Or.inl <| ⟨φ, rfl⟩ + +/-- The conjugate down-type quark tower lies in the covariant subalgebra. -/ +lemma covDerivBarD_mem_covAlgebra (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule DownSinglet)) : h.covDerivBarD i l φ ∈ h.covAlgebra := + Algebra.subset_adjoin <| Or.inr <| Set.mem_iUnion_of_mem i <| Set.mem_iUnion_of_mem n <| + Set.mem_iUnion_of_mem l <| Or.inl <| Or.inl <| Or.inl <| Or.inl <| Or.inl <| Or.inl <| + Or.inl <| Or.inl <| Or.inr <| ⟨φ, rfl⟩ + +/-- The up-type quark tower lies in the covariant subalgebra. -/ +lemma covDerivU_mem_covAlgebra (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ UpSinglet) : h.covDerivU i l φ ∈ h.covAlgebra := + Algebra.subset_adjoin <| Or.inr <| Set.mem_iUnion_of_mem i <| Set.mem_iUnion_of_mem n <| + Set.mem_iUnion_of_mem l <| Or.inl <| Or.inl <| Or.inl <| Or.inl <| Or.inl <| Or.inl <| + Or.inl <| Or.inr <| ⟨φ, rfl⟩ + +/-- The conjugate up-type quark tower lies in the covariant subalgebra. -/ +lemma covDerivBarU_mem_covAlgebra (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule UpSinglet)) : h.covDerivBarU i l φ ∈ h.covAlgebra := + Algebra.subset_adjoin <| Or.inr <| Set.mem_iUnion_of_mem i <| Set.mem_iUnion_of_mem n <| + Set.mem_iUnion_of_mem l <| Or.inl <| Or.inl <| Or.inl <| Or.inl <| Or.inl <| Or.inl <| + Or.inr <| ⟨φ, rfl⟩ + +/-- The quark doublet tower lies in the covariant subalgebra. -/ +lemma covDerivQ_mem_covAlgebra (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ QuarkDoublet) : h.covDerivQ i l φ ∈ h.covAlgebra := + Algebra.subset_adjoin <| Or.inr <| Set.mem_iUnion_of_mem i <| Set.mem_iUnion_of_mem n <| + Set.mem_iUnion_of_mem l <| Or.inl <| Or.inl <| Or.inl <| Or.inl <| Or.inl <| Or.inr <| + ⟨φ, rfl⟩ + +/-- The conjugate quark doublet tower lies in the covariant subalgebra. -/ +lemma covDerivBarQ_mem_covAlgebra (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) : h.covDerivBarQ i l φ ∈ h.covAlgebra := + Algebra.subset_adjoin <| Or.inr <| Set.mem_iUnion_of_mem i <| Set.mem_iUnion_of_mem n <| + Set.mem_iUnion_of_mem l <| Or.inl <| Or.inl <| Or.inl <| Or.inl <| Or.inr <| ⟨φ, rfl⟩ + +/-- The lepton doublet tower lies in the covariant subalgebra. -/ +lemma covDerivL_mem_covAlgebra (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ LeptonDoublet) : h.covDerivL i l φ ∈ h.covAlgebra := + Algebra.subset_adjoin <| Or.inr <| Set.mem_iUnion_of_mem i <| Set.mem_iUnion_of_mem n <| + Set.mem_iUnion_of_mem l <| Or.inl <| Or.inl <| Or.inl <| Or.inr <| ⟨φ, rfl⟩ + +/-- The conjugate lepton doublet tower lies in the covariant subalgebra. -/ +lemma covDerivBarL_mem_covAlgebra (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule LeptonDoublet)) : h.covDerivBarL i l φ ∈ h.covAlgebra := + Algebra.subset_adjoin <| Or.inr <| Set.mem_iUnion_of_mem i <| Set.mem_iUnion_of_mem n <| + Set.mem_iUnion_of_mem l <| Or.inl <| Or.inl <| Or.inr <| ⟨φ, rfl⟩ + +/-- The charged-lepton singlet tower lies in the covariant subalgebra. -/ +lemma covDerivE_mem_covAlgebra (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ LeptonSinglet) : h.covDerivE i l φ ∈ h.covAlgebra := + Algebra.subset_adjoin <| Or.inr <| Set.mem_iUnion_of_mem i <| Set.mem_iUnion_of_mem n <| + Set.mem_iUnion_of_mem l <| Or.inl <| Or.inr <| ⟨φ, rfl⟩ + +/-- The conjugate charged-lepton singlet tower lies in the covariant subalgebra. -/ +lemma covDerivBarE_mem_covAlgebra (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule LeptonSinglet)) : h.covDerivBarE i l φ ∈ h.covAlgebra := + Algebra.subset_adjoin <| Or.inr <| Set.mem_iUnion_of_mem i <| Set.mem_iUnion_of_mem n <| + Set.mem_iUnion_of_mem l <| Or.inr <| ⟨φ, rfl⟩ + + +/-! + +## B. The covariant subalgebra is closed under the actions + +The global gauge action, the Lorentz action and the mass-weight polynomial all carry a +covariant tower to a combination of covariant towers, and each is multiplicative, so each +carries the whole covariant subalgebra into itself. Those three closure facts are what let +the covariant subalgebra be regarded as an algebra with a gauge action, a Lorentz action +and a mass-weight grading of its own. + +-/ + +include h in +/-- A property that holds of every covariant tower holds of every covariant generator: + the case analysis of the generating set, done once. -/ +lemma covGenerators_induction {P : B → Prop} + (hF : ∀ {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra), P (h.covF l μ ν φ)) + (hH : ∀ {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ HiggsVec), + P (h.covDerivH l φ)) + (hBarH : ∀ {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule HiggsVec)), + P (h.covDerivBarH l φ)) + (hD : ∀ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ DownSinglet), P (h.covDerivD i l φ)) + (hBarD : ∀ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule DownSinglet)), P (h.covDerivBarD i l φ)) + (hU : ∀ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ UpSinglet), P (h.covDerivU i l φ)) + (hBarU : ∀ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule UpSinglet)), P (h.covDerivBarU i l φ)) + (hQ : ∀ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ QuarkDoublet), P (h.covDerivQ i l φ)) + (hBarQ : ∀ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule QuarkDoublet)), P (h.covDerivBarQ i l φ)) + (hL : ∀ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ LeptonDoublet), P (h.covDerivL i l φ)) + (hBarL : ∀ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule LeptonDoublet)), P (h.covDerivBarL i l φ)) + (hE : ∀ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ LeptonSinglet), P (h.covDerivE i l φ)) + (hBarE : ∀ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule LeptonSinglet)), P (h.covDerivBarE i l φ)) + : ∀ x ∈ h.covGenerators, P x := by + rintro x hx + 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 hF l μ ν φ + · simp only [Set.mem_iUnion] at hx + obtain ⟨n, l, hx⟩ := hx + rcases hx with ⟨φ, rfl⟩ | ⟨φ, rfl⟩ + · exact hH l φ + · exact hBarH l φ + · 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 hD i l φ + · exact hBarD i l φ + · exact hU i l φ + · exact hBarU i l φ + · exact hQ i l φ + · exact hBarQ i l φ + · exact hL i l φ + · exact hBarL i l φ + · exact hE i l φ + · exact hBarE i l φ + + +include h in +/-- A unital multiplicative endomorphism of the algebra that carries the covariant + generators into the covariant subalgebra carries the whole subalgebra into itself. -/ +lemma mapsTo_covAlgebra {f : B →ₗ[ℂ] B} (hone : f 1 = 1) + (hmul : ∀ b₁ b₂ : B, f (b₁ * b₂) = f b₁ * f b₂) + (hgen : ∀ x ∈ h.covGenerators, f x ∈ h.covAlgebra) {x : B} (hx : x ∈ h.covAlgebra) : + f x ∈ h.covAlgebra := by + induction hx using Algebra.adjoin_induction with + | mem b hb => exact hgen b hb + | algebraMap c => + rw [Algebra.algebraMap_eq_smul_one, map_smul, hone] + exact Subalgebra.smul_mem _ (one_mem _) c + | add a b _ _ iha ihb => rw [map_add]; exact add_mem iha ihb + | mul a b _ _ iha ihb => rw [hmul]; exact mul_mem iha ihb + +include h in +/-- A Lorentz slot-mixing sum of covariant towers lies in the covariant subalgebra. -/ +lemma sum_smul_mem_covAlgebra {n : ℕ} {c : (Fin n → (Fin 1 ⊕ Fin 3)) → ℂ} + {G : (Fin n → (Fin 1 ⊕ Fin 3)) → B} (hG : ∀ p, G p ∈ h.covAlgebra) : + ∑ p : Fin n → (Fin 1 ⊕ Fin 3), c p • G p ∈ h.covAlgebra := + Subalgebra.sum_mem _ fun p _ => Subalgebra.smul_mem _ (hG p) _ + +/-! + +### B.1. The global gauge action + +-/ + +include h in +/-- The global gauge action fixes the unit of the algebra. -/ +lemma repGlobal_one (g : GaugeGroupI) : repGlobal repJet g (1 : B) = 1 := by + simpa using h.repJet_algebraMap (JetGaugeGroupI.ofConstant g) 1 + +include h in +/-- The global gauge action preserves the covariant subalgebra: it carries each covariant + tower to a tower of the same shape at a rotated value index, and it is multiplicative. -/ +lemma repGlobal_mem_covAlgebra (g : GaugeGroupI) {x : B} (hx : x ∈ h.covAlgebra) : + repGlobal repJet g x ∈ h.covAlgebra := + h.mapsTo_covAlgebra (h.repGlobal_one g) (h.repJet_A.gauge_mul _) + (h.covGenerators_induction + (fun l μ ν φ => by + rw [h.repGlobal_covF]; exact h.covF_mem_covAlgebra _ _ _ _) + (fun l φ => by rw [h.repGlobal_covDerivH]; exact h.covDerivH_mem_covAlgebra _ _) + (fun l φ => by rw [h.repGlobal_covDerivBarH]; exact h.covDerivBarH_mem_covAlgebra _ _) + (fun i {_n} l φ => by + rw [h.repGlobal_covDerivD]; exact h.covDerivD_mem_covAlgebra _ _ _) + (fun i {_n} l φ => by + rw [h.repGlobal_covDerivBarD]; exact h.covDerivBarD_mem_covAlgebra _ _ _) + (fun i {_n} l φ => by + rw [h.repGlobal_covDerivU]; exact h.covDerivU_mem_covAlgebra _ _ _) + (fun i {_n} l φ => by + rw [h.repGlobal_covDerivBarU]; exact h.covDerivBarU_mem_covAlgebra _ _ _) + (fun i {_n} l φ => by + rw [h.repGlobal_covDerivQ]; exact h.covDerivQ_mem_covAlgebra _ _ _) + (fun i {_n} l φ => by + rw [h.repGlobal_covDerivBarQ]; exact h.covDerivBarQ_mem_covAlgebra _ _ _) + (fun i {_n} l φ => by + rw [h.repGlobal_covDerivL]; exact h.covDerivL_mem_covAlgebra _ _ _) + (fun i {_n} l φ => by + rw [h.repGlobal_covDerivBarL]; exact h.covDerivBarL_mem_covAlgebra _ _ _) + (fun i {_n} l φ => by + rw [h.repGlobal_covDerivE]; exact h.covDerivE_mem_covAlgebra _ _ _) + (fun i {_n} l φ => by + rw [h.repGlobal_covDerivBarE]; exact h.covDerivBarE_mem_covAlgebra _ _ _)) hx + +/-! + +### B.2. The Lorentz action + +-/ + +include h in +/-- The Lorentz action fixes the unit of the algebra. -/ +lemma repLorentz_one (Λ : SL(2,ℂ)) : repLorentz Λ (1 : B) = 1 := by + obtain ⟨v, hv⟩ : ∃ v, repLorentz Λ v = 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 Λ v 1 + rw [mul_one, hv, one_mul] at h1 + exact h1.symm + +include h in +/-- The Lorentz action preserves the covariant subalgebra: it carries each covariant tower + to a slot-mixing sum of towers of the same shape, and it is multiplicative. -/ +lemma repLorentz_mem_covAlgebra (Λ : SL(2,ℂ)) {x : B} (hx : x ∈ h.covAlgebra) : + repLorentz Λ x ∈ h.covAlgebra := + h.mapsTo_covAlgebra (h.repLorentz_one Λ) (h.repLorentz_mul Λ) + (h.covGenerators_induction + (fun l μ ν φ => by + rw [h.repLorentz_covF] + exact Subalgebra.sum_mem _ fun p _ => Subalgebra.smul_mem _ + (Subalgebra.sum_mem _ fun a _ => Subalgebra.smul_mem _ + (Subalgebra.sum_mem _ fun b _ => Subalgebra.smul_mem _ + (h.covF_mem_covAlgebra _ _ _ _) _) _) _) + (fun l φ => by + rw [h.repLorentz_covDerivH] + exact h.sum_smul_mem_covAlgebra fun p => h.covDerivH_mem_covAlgebra _ _) + (fun l φ => by + rw [h.repLorentz_covDerivBarH] + exact h.sum_smul_mem_covAlgebra fun p => h.covDerivBarH_mem_covAlgebra _ _) + (fun i {_n} l φ => by + rw [h.repLorentz_covDerivD] + exact h.sum_smul_mem_covAlgebra fun p => h.covDerivD_mem_covAlgebra _ _ _) + (fun i {_n} l φ => by + rw [h.repLorentz_covDerivBarD] + exact h.sum_smul_mem_covAlgebra fun p => h.covDerivBarD_mem_covAlgebra _ _ _) + (fun i {_n} l φ => by + rw [h.repLorentz_covDerivU] + exact h.sum_smul_mem_covAlgebra fun p => h.covDerivU_mem_covAlgebra _ _ _) + (fun i {_n} l φ => by + rw [h.repLorentz_covDerivBarU] + exact h.sum_smul_mem_covAlgebra fun p => h.covDerivBarU_mem_covAlgebra _ _ _) + (fun i {_n} l φ => by + rw [h.repLorentz_covDerivQ] + exact h.sum_smul_mem_covAlgebra fun p => h.covDerivQ_mem_covAlgebra _ _ _) + (fun i {_n} l φ => by + rw [h.repLorentz_covDerivBarQ] + exact h.sum_smul_mem_covAlgebra fun p => h.covDerivBarQ_mem_covAlgebra _ _ _) + (fun i {_n} l φ => by + rw [h.repLorentz_covDerivL] + exact h.sum_smul_mem_covAlgebra fun p => h.covDerivL_mem_covAlgebra _ _ _) + (fun i {_n} l φ => by + rw [h.repLorentz_covDerivBarL] + exact h.sum_smul_mem_covAlgebra fun p => h.covDerivBarL_mem_covAlgebra _ _ _) + (fun i {_n} l φ => by + rw [h.repLorentz_covDerivE] + exact h.sum_smul_mem_covAlgebra fun p => h.covDerivE_mem_covAlgebra _ _ _) + (fun i {_n} l φ => by + rw [h.repLorentz_covDerivBarE] + exact h.sum_smul_mem_covAlgebra fun p => h.covDerivBarE_mem_covAlgebra _ _ _)) hx + +/-! + +### B.3. The mass-weight polynomial + +-/ + +include h in +/-- A monomial with a coefficient in the covariant subalgebra is the image of a monomial + over the covariant subalgebra. -/ +private lemma monomial_mem_range {n : ℕ} {y : B} (hy : y ∈ h.covAlgebra) : + Polynomial.monomial n y ∈ (Polynomial.mapAlgHom h.covAlgebra.val).range := + ⟨Polynomial.monomial n ⟨y, hy⟩, by simp⟩ + +include h in +/-- The mass-weight polynomial carries the covariant subalgebra into the polynomials with + coefficients in it: each covariant tower is an eigenvector whose eigenvector is the tower + itself, and the mass-weight polynomial is an algebra map. -/ +lemma massWeightPoly_mem_range_mapAlgHom {x : B} (hx : x ∈ h.covAlgebra) : + massWeightPoly x ∈ (Polynomial.mapAlgHom h.covAlgebra.val).range := by + have hgen : ∀ y ∈ h.covGenerators, + massWeightPoly y ∈ (Polynomial.mapAlgHom h.covAlgebra.val).range := + h.covGenerators_induction + (fun l μ ν φ => by + rw [h.massWeight_covF] + exact h.monomial_mem_range (h.covF_mem_covAlgebra l μ ν φ)) + (fun l φ => by + rw [h.massWeight_covDerivH] + exact h.monomial_mem_range (h.covDerivH_mem_covAlgebra l φ)) + (fun l φ => by + rw [h.massWeight_covDerivBarH] + exact h.monomial_mem_range (h.covDerivBarH_mem_covAlgebra l φ)) + (fun i {_n} l φ => by + rw [h.massWeight_covDerivD] + exact h.monomial_mem_range (h.covDerivD_mem_covAlgebra i l φ)) + (fun i {_n} l φ => by + rw [h.massWeight_covDerivBarD] + exact h.monomial_mem_range (h.covDerivBarD_mem_covAlgebra i l φ)) + (fun i {_n} l φ => by + rw [h.massWeight_covDerivU] + exact h.monomial_mem_range (h.covDerivU_mem_covAlgebra i l φ)) + (fun i {_n} l φ => by + rw [h.massWeight_covDerivBarU] + exact h.monomial_mem_range (h.covDerivBarU_mem_covAlgebra i l φ)) + (fun i {_n} l φ => by + rw [h.massWeight_covDerivQ] + exact h.monomial_mem_range (h.covDerivQ_mem_covAlgebra i l φ)) + (fun i {_n} l φ => by + rw [h.massWeight_covDerivBarQ] + exact h.monomial_mem_range (h.covDerivBarQ_mem_covAlgebra i l φ)) + (fun i {_n} l φ => by + rw [h.massWeight_covDerivL] + exact h.monomial_mem_range (h.covDerivL_mem_covAlgebra i l φ)) + (fun i {_n} l φ => by + rw [h.massWeight_covDerivBarL] + exact h.monomial_mem_range (h.covDerivBarL_mem_covAlgebra i l φ)) + (fun i {_n} l φ => by + rw [h.massWeight_covDerivE] + exact h.monomial_mem_range (h.covDerivE_mem_covAlgebra i l φ)) + (fun i {_n} l φ => by + rw [h.massWeight_covDerivBarE] + exact h.monomial_mem_range (h.covDerivBarE_mem_covAlgebra i l φ)) + induction hx using Algebra.adjoin_induction with + | mem b hb => exact hgen b hb + | algebraMap c => exact ⟨algebraMap ℂ (Polynomial ↥h.covAlgebra) c, by simp⟩ + | add a b _ _ iha ihb => rw [map_add]; exact add_mem iha ihb + | mul a b _ _ iha ihb => rw [map_mul]; exact mul_mem iha ihb + +/-! + +## C. The covariant subalgebra as an algebra in its own right + +The three closure facts of section B let the covariant subalgebra carry a gauge action, a +Lorentz action and a mass-weight polynomial of its own: each is the ambient one restricted, +and each is recorded here together with the lemma identifying it with the ambient one on +underlying elements. The mass-weight polynomial takes a little more care than the two +actions, because its target is the polynomials over the subalgebra rather than the +subalgebra itself; the identification is through the injection +`Polynomial.mapAlgHom h.covAlgebra.val`. + +-/ + +/-- The global gauge action on the covariant subalgebra: the ambient global gauge action, + which section B shows preserves it. -/ +noncomputable def covRepGauge : Representation ℂ GaugeGroupI ↥h.covAlgebra where + toFun g := LinearMap.restrict (repGlobal repJet g) fun _ hx => h.repGlobal_mem_covAlgebra g hx + map_one' := by + refine LinearMap.ext fun x => Subtype.ext ?_ + show repGlobal repJet 1 (x : B) = (x : B) + rw [map_one] + rfl + map_mul' g₁ g₂ := by + refine LinearMap.ext fun x => Subtype.ext ?_ + show repGlobal repJet (g₁ * g₂) (x : B) = repGlobal repJet g₁ (repGlobal repJet g₂ (x : B)) + rw [map_mul] + rfl + +@[simp] +lemma coe_covRepGauge (g : GaugeGroupI) (x : ↥h.covAlgebra) : + (h.covRepGauge g x : B) = repGlobal repJet g (x : B) := rfl + +/-- The Lorentz action on the covariant subalgebra: the ambient Lorentz action, which + section B shows preserves it. -/ +noncomputable def covRepLorentz : Representation ℂ SL(2,ℂ) ↥h.covAlgebra where + toFun Λ := LinearMap.restrict (repLorentz Λ) fun _ hx => h.repLorentz_mem_covAlgebra Λ hx + map_one' := by + refine LinearMap.ext fun x => Subtype.ext ?_ + show repLorentz 1 (x : B) = (x : B) + rw [map_one] + rfl + map_mul' Λ₁ Λ₂ := by + refine LinearMap.ext fun x => Subtype.ext ?_ + show repLorentz (Λ₁ * Λ₂) (x : B) = repLorentz Λ₁ (repLorentz Λ₂ (x : B)) + rw [map_mul] + rfl + +@[simp] +lemma coe_covRepLorentz (Λ : SL(2,ℂ)) (x : ↥h.covAlgebra) : + (h.covRepLorentz Λ x : B) = repLorentz Λ (x : B) := rfl + +include h in +/-- Polynomials over the covariant subalgebra inject into polynomials over the algebra. -/ +lemma mapAlgHom_val_injective : + Function.Injective (Polynomial.mapAlgHom h.covAlgebra.val) := by + rw [Polynomial.coe_mapAlgHom] + exact Polynomial.map_injective _ Subtype.val_injective + +/-- The mass-weight polynomial of the covariant subalgebra: the ambient mass-weight + polynomial, whose value on the subalgebra has all of its coefficients in the subalgebra + by section B. -/ +noncomputable def covMassWeightPoly : ↥h.covAlgebra →ₐ[ℂ] Polynomial ↥h.covAlgebra := + (AlgEquiv.ofInjective (Polynomial.mapAlgHom h.covAlgebra.val) + h.mapAlgHom_val_injective).symm.toAlgHom.comp + (AlgHom.codRestrict (massWeightPoly.comp h.covAlgebra.val) _ + fun x => h.massWeightPoly_mem_range_mapAlgHom x.2) + +@[simp] +lemma mapAlgHom_covMassWeightPoly (x : ↥h.covAlgebra) : + Polynomial.mapAlgHom h.covAlgebra.val (h.covMassWeightPoly x) = massWeightPoly (x : B) := + congrArg Subtype.val ((AlgEquiv.ofInjective (Polynomial.mapAlgHom h.covAlgebra.val) + h.mapAlgHom_val_injective).apply_symm_apply + ⟨massWeightPoly (x : B), h.massWeightPoly_mem_range_mapAlgHom x.2⟩) + +/-- A mass-weight eigenvalue equation in the covariant subalgebra is the ambient one. -/ +lemma covMassWeightPoly_eq_monomial_iff {n : ℕ} (x : ↥h.covAlgebra) : + h.covMassWeightPoly x = Polynomial.monomial n x + ↔ massWeightPoly (x : B) = Polynomial.monomial n (x : B) := by + constructor + · intro hx + rw [← h.mapAlgHom_covMassWeightPoly, hx, Polynomial.mapAlgHom_monomial] + rfl + · intro hx + refine h.mapAlgHom_val_injective ?_ + rw [h.mapAlgHom_covMassWeightPoly, hx, Polynomial.mapAlgHom_monomial] + rfl + + +end AlgebraRealization + +end StandardModel diff --git a/Physlib/Particles/StandardModel/Fermions/DownSinglet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/DownSinglet/GaugeAlgebraAction.lean index 344af9616..bc38720d3 100644 --- a/Physlib/Particles/StandardModel/Fermions/DownSinglet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/DownSinglet/GaugeAlgebraAction.lean @@ -11,6 +11,7 @@ public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.GaugeA public import Mathlib.LinearAlgebra.TensorProduct.Pi public import Mathlib.Analysis.Normed.Lp.Matrix public import Mathlib.RingTheory.TensorProduct.Maps +public import Physlib.Mathematics.TensorProductComm /-! # The infinitesimal gauge action on the down-type singlet @@ -631,6 +632,21 @@ theorem isInfinitesimalActionOf : end InfinitesimalAction +/-! + +## The gauge action commutes with the Lorentz action + +-/ + +/-- 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 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)) + end DownSinglet end StandardModel diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean index e1078a106..44909cec2 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean @@ -11,6 +11,7 @@ public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.GaugeA public import Mathlib.LinearAlgebra.TensorProduct.Pi public import Mathlib.Analysis.Normed.Lp.Matrix public import Mathlib.RingTheory.TensorProduct.Maps +public import Physlib.Mathematics.TensorProductComm /-! # The infinitesimal gauge action on the lepton doublet @@ -644,6 +645,21 @@ theorem isInfinitesimalActionOf : end InfinitesimalAction +/-! + +## C. The gauge action commutes with the Lorentz action + +-/ + +/-- 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 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)) + end LeptonDoublet end StandardModel diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/GaugeAlgebraAction.lean index 2784dce3c..09c84c55d 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/GaugeAlgebraAction.lean @@ -52,7 +52,7 @@ namespace StandardModel namespace LeptonSinglet -open TensorProduct MvPowerSeries +open TensorProduct MvPowerSeries MatrixGroups /-! @@ -321,6 +321,22 @@ theorem isInfinitesimalActionOf : ← hcollapse] exact congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => (hterm p).symm) +/-! + +## F. The gauge action commutes with the Lorentz action + +-/ + +/-- The infinitesimal gauge action on the charged-lepton singlet is a scalar, so it + commutes with the Lorentz action. -/ +lemma 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] + end LeptonSinglet end StandardModel diff --git a/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/GaugeAlgebraAction.lean index 44a8a2b7e..d5b219615 100644 --- a/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/GaugeAlgebraAction.lean @@ -12,6 +12,7 @@ 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 +public import Physlib.Mathematics.TensorProductComm /-! # The infinitesimal gauge action on the quark doublet @@ -763,6 +764,41 @@ theorem isInfinitesimalActionOf : end InfinitesimalAction +/-! + +## D. The gauge action commutes with the Lorentz action + +-/ + +/-- 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 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) := fun x => by + 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 _ _ _ + end QuarkDoublet end StandardModel diff --git a/Physlib/Particles/StandardModel/Fermions/UpSinglet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/UpSinglet/GaugeAlgebraAction.lean index 5927d2523..cfcb00ac6 100644 --- a/Physlib/Particles/StandardModel/Fermions/UpSinglet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/UpSinglet/GaugeAlgebraAction.lean @@ -11,6 +11,7 @@ public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.GaugeA public import Mathlib.LinearAlgebra.TensorProduct.Pi public import Mathlib.Analysis.Normed.Lp.Matrix public import Mathlib.RingTheory.TensorProduct.Maps +public import Physlib.Mathematics.TensorProductComm /-! # The infinitesimal gauge action on the up-type singlet @@ -625,6 +626,21 @@ theorem isInfinitesimalActionOf : end InfinitesimalAction +/-! + +## D. The gauge action commutes with the Lorentz action + +-/ + +/-- 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 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)) + end UpSinglet end StandardModel diff --git a/Physlib/Particles/StandardModel/HiggsBoson/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/HiggsBoson/GaugeAlgebraAction.lean index eab16064a..8a31ae0ba 100644 --- a/Physlib/Particles/StandardModel/HiggsBoson/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/HiggsBoson/GaugeAlgebraAction.lean @@ -540,6 +540,19 @@ theorem isInfinitesimalActionOf : end InfinitesimalAction +/-! + +## C. The gauge action commutes with the Lorentz action + +-/ + +/-- The infinitesimal gauge action on the Higgs commutes with the Lorentz action, which is + trivial. -/ +lemma 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 + end HiggsVec end StandardModel diff --git a/Physlib/Particles/StandardModel/JetAlgebra/AlgebraRealization.lean b/Physlib/Particles/StandardModel/JetAlgebra/AlgebraRealization.lean index 3a65efe7b..a12c8ba23 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/AlgebraRealization.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/AlgebraRealization.lean @@ -14,12 +14,12 @@ public import Physlib.Particles.StandardModel.AlgebraRealization.MassWeight.Filt The abstract theory of `AlgebraRealization` asks an algebra for an equivariant algebra map out of the jet algebra of the Standard Model. The jet algebra therefore carries one for free — -the identity — and `JetAlgebra.algebraRealization` records it. The four compatibility laws are -definitional; the two multiplicativity laws are the ones the jet gauge action and the -Lorentz action were shown to satisfy when they were built. +the identity — and `AlgebraRealization.id` records it, in `AlgebraRealization.Basic`. The +four compatibility laws are definitional; the two multiplicativity laws are the ones the +jet gauge action and the Lorentz action were shown to satisfy when they were built. -That is the whole of section A. Once the instance exists, two things follow that make it -worth having. The field algebra it generates is the whole algebra — the fields of the +Once the instance exists, two things follow that make it worth having. The field algebra it +generates is the whole algebra — the fields of the Standard Model generate the algebra in which its Lagrangian lives, since nothing else is available to write down — so the mass-weight submodules stop being intersections with the field algebra and become the honest eigenspaces of `massWeightPoly` on the whole of @@ -27,7 +27,7 @@ field algebra and become the honest eigenspaces of `massWeightPoly` on the whole And then the classification of invariants of mass dimension at most four applies to *every* element of the algebra of that dimension, with no side condition left to check. That is -the result this whole chain of files exists for, and section C states it: for an arbitrary +the result this whole chain of files exists for, and section B states it: for an arbitrary `x : JetAlgebra` of mass weight at most eight, `x` is fixed by the jet gauge group and by the Lorentz group @@ -48,19 +48,19 @@ higher-dimension operators, follows as a generalization for a reader who wants o Higgs mass term `H† H`, and the dimension-four Standard Model Lagrangian. - `JetAlgebra.mem_massWeightSubmoduleLE_eight_sup_and_invariant_iff_lagrangian` : the same classification modulo a submodule of higher-dimension operators set aside. -- `JetAlgebra.algebraRealization` : the jet algebra of the Standard Model is a Standard Model. +- `AlgebraRealization.id` (see `AlgebraRealization.Basic`) : the jet algebra of the + Standard Model is a Standard Model. - `JetAlgebra.algebraRealization_fieldAlgebra_eq_top` : its field algebra is everything. - `JetAlgebra.massWeightSubmodule`, `JetAlgebra.massWeightSubmoduleLE` : the mass-weight grading and its filtration, on the jet algebra itself. ## iii. Table of contents -- A. The Standard Model instance -- B. The field algebra is everything - - B.1. The field algebra - - B.2. The collapse of the graded pieces - - B.3. The mass-weight filtration of the jet algebra -- C. The Standard Model Lagrangian +- A. The field algebra is everything + - A.1. The field algebra + - A.2. The collapse of the graded pieces + - A.3. The mass-weight filtration of the jet algebra +- B. The Standard Model Lagrangian -/ @@ -79,35 +79,7 @@ open TensorProduct Matrix MatrixGroups Lorentz /-! -## A. The Standard Model instance - -The abstract theory `AlgebraRealization` is written in terms of an equivariant algebra map out -of the jet algebra, so the jet algebra is a Standard Model along the identity map. The four -compatibility laws hold by definition, and the two multiplicativity laws are the ones the -jet gauge action and the Lorentz action were shown to satisfy when they were built. - --/ - -/-- The jet algebra of the Standard Model is a Standard Model: it is one along the identity - algebra map, since `AlgebraRealization` asks precisely for an equivariant algebra map out of - the jet algebra. - - This is the point at which the abstract theory of `AlgebraRealization` — its covariant - reduction, its mass-weight filtration and its classification of invariants — becomes a - theory of the concrete algebra in which a Standard Model Lagrangian is written. -/ -noncomputable def algebraRealization : AlgebraRealization JetAlgebra repJetGaugeGroupI repLorentzGroup - massWeightPoly where - toAlgHom := AlgHom.id ℂ JetAlgebra - map_repJet _ _ := rfl - map_repLorentz _ _ := rfl - map_massWeight x := by - simp [Polynomial.mapAlgHom] - repJet_mul := isGaugeField.gauge_mul - repLorentz_mul := repLorentzGroup_apply_mul - -/-! - -## B. The field algebra is everything +## A. The field algebra is everything The field algebra of an `AlgebraRealization` is the algebra generated by the thirteen families of derivative symbols. On the jet algebra it is everything: a Standard Model Lagrangian @@ -118,35 +90,35 @@ The consequence is that the mass-weight filtration simplifies. The graded piece `AlgebraRealization.massWeightSubmodule n` is by definition the intersection of the field algebra with the kernel of `massWeightPoly - X ^ n`; with the field algebra the whole algebra the intersection is idle, and what is left is the honest weight-`n` eigenspace of -`massWeightPoly` on the whole algebra. That collapse is section B.2, stated for an +`massWeightPoly` on the whole algebra. That collapse is section A.2, stated for an arbitrary `AlgebraRealization` whose field algebra is everything. The weight pieces and the filtration are therefore worth having on `JetAlgebra` directly, -with no mention of an `AlgebraRealization` instance, and section B.3 gives them: a reader of -the classification of section C should not have to know that an instance exists. They are +with no mention of an `AlgebraRealization` instance, and section A.3 gives them: a reader of +the classification of section B should not have to know that an instance exists. They are defined by the eigenvalue equation rather than as a kernel because `Polynomial JetAlgebra` carries no synthesizable `Ring` instance — the search does not close at this concrete type — so the subtraction `massWeightPoly - X ^ n` can only be written at an abstract type. -The bridges of section B.3 identify the two. +The bridges of section A.3 identify the two. -/ /-! -### B.1. The field algebra +### A.1. The field algebra -/ /-- The fields of the Standard Model generate its jet algebra: the field algebra of the instance is the whole of `JetAlgebra`. -/ -theorem algebraRealization_fieldAlgebra_eq_top : algebraRealization.fieldAlgebra = ⊤ := +theorem algebraRealization_fieldAlgebra_eq_top : AlgebraRealization.id.fieldAlgebra = ⊤ := adjoin_generators_eq_top end JetAlgebra /-! -### B.2. The collapse of the graded pieces +### A.2. The collapse of the graded pieces -/ @@ -187,7 +159,7 @@ open TensorProduct Matrix MatrixGroups Lorentz /-! -### B.3. The mass-weight filtration of the jet algebra +### A.3. The mass-weight filtration of the jet algebra -/ @@ -219,25 +191,25 @@ noncomputable def massWeightSubmoduleLE (w : ℕ) : Submodule ℂ JetAlgebra := /-- The graded piece defined on the jet algebra is the graded piece of the instance: the two differ only by the intersection with the field algebra, which is everything. -/ lemma algebraRealization_massWeightSubmodule (n : ℕ) : - algebraRealization.massWeightSubmodule n = massWeightSubmodule n := by - rw [algebraRealization.massWeightSubmodule_eq_ker algebraRealization_fieldAlgebra_eq_top] + AlgebraRealization.id.massWeightSubmodule n = massWeightSubmodule n := by + rw [AlgebraRealization.id.massWeightSubmodule_eq_ker algebraRealization_fieldAlgebra_eq_top] ext x rw [LinearMap.mem_ker, mem_massWeightSubmodule] simp [sub_eq_zero] /-- The filtration defined on the jet algebra is the filtration of the instance. -/ lemma algebraRealization_massWeightSubmoduleLE (w : ℕ) : - algebraRealization.massWeightSubmoduleLE w = massWeightSubmoduleLE w := by - show ⨆ k ∈ Finset.range (w + 1), algebraRealization.massWeightSubmodule k = _ + AlgebraRealization.id.massWeightSubmoduleLE w = massWeightSubmoduleLE w := by + show ⨆ k ∈ Finset.range (w + 1), AlgebraRealization.id.massWeightSubmodule k = _ exact iSup_congr fun k => iSup_congr fun _ => algebraRealization_massWeightSubmodule k /-! -## C. The Standard Model Lagrangian +## B. The Standard Model Lagrangian This is what the chain was built for, and the first theorem below is the headline. Take any element `x` of the jet algebra of mass weight at most eight — that is, of mass -dimension at most four; by section B that is a condition on `x` alone, and it is the only +dimension at most four; by section A that is a condition on `x` alone, and it is the only hypothesis there is. Then `x` is invariant under the jet gauge group and under the Lorentz group if and only if it is a combination of @@ -255,7 +227,7 @@ The second theorem is the same classification with a submodule `S` set aside — operators of mass dimension above four, for a reader who wants to work modulo them. It is strictly more general and strictly less readable, which is why it comes second. It keeps its hypothesis `hScov : S ≤ covAlgebra.toSubmodule`, and that is not an oversight of the -simplification of section B. The field algebra is everything, but the covariant subalgebra +simplification of section A. The field algebra is everything, but the covariant subalgebra is not: a covariant element is fixed by the pure gauge jets, while the gauge potential picks up the Maurer–Cartan shift and so is not. `covAlgebra` therefore stays a proper subalgebra of `JetAlgebra`, and a set-aside `S` still has to be written in the covariant @@ -281,13 +253,13 @@ theorem mem_massWeightSubmoduleLE_eight_and_invariant_iff_lagrangian (x : JetAlg ∧ (∀ U : JetGaugeGroupI, repJetGaugeGroupI U x = x) ∧ ∀ Λ : SL(2,ℂ), repLorentzGroup Λ x = x) ↔ x ∈ 1 - ⊔ (algebraRealization.isCovStandardModel.isHiggsSector.dotSpan 0 0 - ⊔ (algebraRealization.isCovStandardModel.isGaugeSector.lorentzContractionEightSpan - ⊔ algebraRealization.isCovStandardModel.isHiggsSector.lorentzContractionEightSpan - ⊔ (algebraRealization.isCovStandardModel.isFermionSector.kineticSpan - ⊔ algebraRealization.isCovStandardModel.yukawaSpan))) := by + ⊔ (AlgebraRealization.id.isCovStandardModel.isHiggsSector.dotSpan 0 0 + ⊔ (AlgebraRealization.id.isCovStandardModel.isGaugeSector.lorentzContractionEightSpan + ⊔ AlgebraRealization.id.isCovStandardModel.isHiggsSector.lorentzContractionEightSpan + ⊔ (AlgebraRealization.id.isCovStandardModel.isFermionSector.kineticSpan + ⊔ AlgebraRealization.id.isCovStandardModel.yukawaSpan))) := by rw [← algebraRealization_massWeightSubmoduleLE] - exact algebraRealization.mem_massWeightSubmoduleLE_eight_and_invariant_iff_lagrangian x + exact AlgebraRealization.id.mem_massWeightSubmoduleLE_eight_and_invariant_iff_lagrangian x set_option maxHeartbeats 40000000 in /-- The same classification as @@ -307,20 +279,20 @@ theorem mem_massWeightSubmoduleLE_eight_sup_and_invariant_iff_lagrangian (S : Submodule ℂ JetAlgebra) (hS : ∀ U : JetGaugeGroupI, ∀ y ∈ S, repJetGaugeGroupI U y ∈ S) (hSL : ∀ Λ : SL(2,ℂ), ∀ y ∈ S, repLorentzGroup Λ y ∈ S) - (hScov : S ≤ algebraRealization.covAlgebra.toSubmodule) (x : JetAlgebra) : + (hScov : S ≤ AlgebraRealization.id.covAlgebra.toSubmodule) (x : JetAlgebra) : (x ∈ massWeightSubmoduleLE 8 ⊔ S ∧ (∀ U : JetGaugeGroupI, repJetGaugeGroupI U x = x) ∧ ∀ Λ : SL(2,ℂ), repLorentzGroup Λ x = x) ↔ ∃ y ∈ S, (∀ U : JetGaugeGroupI, repJetGaugeGroupI U y = y) ∧ (∀ Λ : SL(2,ℂ), repLorentzGroup Λ y = y) ∧ x - y ∈ 1 - ⊔ (algebraRealization.isCovStandardModel.isHiggsSector.dotSpan 0 0 - ⊔ (algebraRealization.isCovStandardModel.isGaugeSector.lorentzContractionEightSpan - ⊔ algebraRealization.isCovStandardModel.isHiggsSector.lorentzContractionEightSpan - ⊔ (algebraRealization.isCovStandardModel.isFermionSector.kineticSpan - ⊔ algebraRealization.isCovStandardModel.yukawaSpan))) := by + ⊔ (AlgebraRealization.id.isCovStandardModel.isHiggsSector.dotSpan 0 0 + ⊔ (AlgebraRealization.id.isCovStandardModel.isGaugeSector.lorentzContractionEightSpan + ⊔ AlgebraRealization.id.isCovStandardModel.isHiggsSector.lorentzContractionEightSpan + ⊔ (AlgebraRealization.id.isCovStandardModel.isFermionSector.kineticSpan + ⊔ AlgebraRealization.id.isCovStandardModel.yukawaSpan))) := by rw [← algebraRealization_massWeightSubmoduleLE] - exact algebraRealization.mem_massWeightSubmoduleLE_eight_sup_and_invariant_iff_lagrangian + exact AlgebraRealization.id.mem_massWeightSubmoduleLE_eight_sup_and_invariant_iff_lagrangian S hS hSL hScov x end JetAlgebra From 93bb3e25d799810bab9025c1f6959946e23d1d15 Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Mon, 7 Sep 2026 21:44:37 +0400 Subject: [PATCH 287/367] refactor: GaugeJet from class to structure --- .../GaugeTheory/GaugeBoson/GaugeAction.lean | 247 ++++++------ .../GaugeTheory/GaugeBoson/IsGaugeField.lean | 9 +- .../GaugeTheory/GaugeField/Basic.lean | 352 +++++++++--------- .../GaugeTheory/GaugeField/FieldStrength.lean | 80 ++-- .../GaugeField/TransformsInAdjoint.lean | 113 +++--- .../GaugeTheory/GaugeJet.lean | 120 +++--- .../GaugeTheory/Matter/CovariantDeriv.lean | 27 +- .../JetAlgebra/GaugeFieldData.lean | 29 +- .../StandardModel/GaugeGroup/GaugeJet.lean | 65 ++-- 9 files changed, 527 insertions(+), 515 deletions(-) diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeAction.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeAction.lean index 02103597b..bf4173128 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeAction.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeAction.lean @@ -63,8 +63,8 @@ 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] +variable {jets : GaugeJet G 𝔤 G₀ 𝔤J} +variable [GaugeJetLeibniz jets] set_option maxHeartbeats 1000000 @@ -73,28 +73,28 @@ open TensorProduct MvPowerSeries /-! -## C. The (transport G 𝔤) on the component space +## C. The transport on the component space -/ namespace GaugeBoson -variable (G 𝔤) in -/-- The adjoint (transport G 𝔤) on the gauge-boson target space at `p` derivatives: the adjoint +variable (jets) in +/-- 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 : G) (p : Multiset (Fin 1 ⊕ Fin 3)) : (GaugeBoson 𝔤) →ₗ[ℝ] (GaugeBoson 𝔤) := (valLinEquiv 𝔤).symm.toLinearMap ∘ₗ - TensorProduct.map LinearMap.id (IsGaugeField.adjointCoeff U p) ∘ₗ + TensorProduct.map LinearMap.id (IsGaugeField.adjointCoeff jets 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 + adjointTransport jets U p ⟨v ⊗ₜ[ℝ] a⟩ = ⟨v ⊗ₜ[ℝ] IsGaugeField.adjointCoeff jets U p a⟩ := rfl -/-- The adjoint (transport G 𝔤) at the identity: only the base point survives. -/ +/-- The adjoint transport 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 + adjointTransport jets 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] @@ -109,11 +109,11 @@ lemma adjointTransport_one (p : Multiset (Fin 1 ⊕ Fin 3)) : rfl] simp -/-- The adjoint (transport G 𝔤) of a product: the antidiagonal convolution of transports. -/ +/-- The adjoint transport 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 + adjointTransport jets (U * V) p = (p.antidiagonal.map fun r => - (adjointTransport G 𝔤) U r.1 ∘ₗ (adjointTransport G 𝔤) V r.2).sum := by + adjointTransport jets U r.1 ∘ₗ adjointTransport jets V r.2).sum := by refine LinearMap.ext fun v => ?_ rw [Multiset.sum_linearMap_apply, Multiset.map_map] obtain ⟨m⟩ := v @@ -126,8 +126,8 @@ lemma adjointTransport_mul (U V : G) (p : Multiset (Fin 1 ⊕ Fin 3)) : | 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, + show ((⟨x ⊗ₜ[ℝ] IsGaugeField.adjointCoeff jets (U * V) p a⟩ : (GaugeBoson 𝔤))).val + = x ⊗ₜ[ℝ] IsGaugeField.adjointCoeff jets (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 => ?_) @@ -140,13 +140,13 @@ lemma adjointTransport_mul (U V : G) (p : Multiset (Fin 1 ⊕ Fin 3)) : simp only [Function.comp_apply] exact (map_add _ _ _).symm -/-- The dual (transport G 𝔤) carries a component covector to the component covector of the +/-- 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 : 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 + (adjointTransport jets U p).dualMap ((componentDual 𝔤) ω φ) + = (componentDual 𝔤) ω (φ ∘ₗ IsGaugeField.adjointCoeff jets U p) := by refine LinearMap.ext fun v => ?_ obtain ⟨m⟩ := v induction m using TensorProduct.induction_on with @@ -164,30 +164,30 @@ end GaugeBoson namespace GaugeJetAlgebra -variable (G 𝔤) in -/-- The value of the (transport G 𝔤) on the derivative symbol at `s`: the all-orders Leibniz +variable (jets) in +/-- 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 : 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 + ((GaugeBoson.adjointTransport jets U p.1).dualMap)).sum -variable (G 𝔤) in +variable (jets) 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)) + TensorProduct.lift (DerivAlgebraReal.basisMultiset.constr ℝ (transportFun jets U)) lemma transport_basis_tmul (U : G) (s : Multiset (Fin 1 ⊕ Fin 3)) (ψ : Module.Dual ℝ (GaugeBoson 𝔤)) : - (transport G 𝔤) U (DerivAlgebraReal.basisMultiset s ⊗ₜ[ℝ] ψ) + transport jets U (DerivAlgebraReal.basisMultiset s ⊗ₜ[ℝ] ψ) = (s.antidiagonal.map fun p => DerivAlgebraReal.basisMultiset p.2 ⊗ₜ[ℝ] - ((GaugeBoson.adjointTransport G 𝔤) U p.1).dualMap ψ).sum := by + (GaugeBoson.adjointTransport jets U p.1).dualMap ψ).sum := by rw [transport, TensorProduct.lift.tmul, Module.Basis.constr_basis, transportFun, Multiset.sum_linearMap_apply, Multiset.map_map] rfl @@ -214,8 +214,8 @@ lemma _root_.GaugeBoson.JetComponentSpace.ext_of_basis | 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 +/-- The transport of the identity is the identity. -/ +lemma transport_one : transport jets (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]), @@ -230,48 +230,48 @@ lemma transport_one : (transport G 𝔤) (1 : G) = LinearMap.id := by 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 +/-- **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 : G) : - (transport G 𝔤) (U * V) = (transport G 𝔤) V ∘ₗ (transport G 𝔤) U := by + transport jets (U * V) = transport jets V ∘ₗ transport jets 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 ψ + (GaugeBoson.adjointTransport jets (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 + (GaugeBoson.adjointTransport jets V r.2).dualMap + ((GaugeBoson.adjointTransport jets 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 ⊗ₜ[ℝ] ψ) + have hLHS : transport jets (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 + (GaugeBoson.adjointTransport jets V q.2).dualMap + ((GaugeBoson.adjointTransport jets 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) + have hRHS : (transport jets V ∘ₗ transport jets 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 + (GaugeBoson.adjointTransport jets V q.1).dualMap + ((GaugeBoson.adjointTransport jets 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 ψ) + (GaugeBoson.adjointTransport jets V b).dualMap + ((GaugeBoson.adjointTransport jets U a).dualMap ψ) end GaugeJetAlgebra @@ -283,7 +283,7 @@ end GaugeJetAlgebra namespace GaugeJetAlgebra -variable (G 𝔤) in +variable (jets) 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 @@ -291,61 +291,60 @@ variable (G 𝔤) in 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 μ))⟩ + jets.evalLie (jets.iteratedDeriv s (jets.mc U μ))⟩ @[simp] -lemma mcBosonCoeff_one (s : Multiset (Fin 1 ⊕ Fin 3)) : (mcBosonCoeff G 𝔤) 1 s = 0 := by +lemma mcBosonCoeff_one (s : Multiset (Fin 1 ⊕ Fin 3)) : mcBosonCoeff jets 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, + rw [show jets.mc 1 μ = 0 from jets.mc_one μ, 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. -/ + adjoint transport 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 + mcBosonCoeff jets (U * V) s + = mcBosonCoeff jets U s + (s.antidiagonal.map fun p => - (GaugeBoson.adjointTransport G 𝔤) U p.1 ((mcBosonCoeff G 𝔤) V p.2)).sum := by + GaugeBoson.adjointTransport jets U p.1 (mcBosonCoeff jets 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) + (GaugeBoson.valLinEquiv 𝔤) (mcBosonCoeff jets W t) = ∑ μ, Lorentz.CoVector.basis μ ⊗ₜ[ℝ] - GaugeJet.evalLie G (𝔤 := 𝔤) (GaugeJet.iteratedDeriv G 𝔤 t - (GaugeJet.mc 𝔤 (G := G) W μ)) := fun W t => rfl + jets.evalLie (jets.iteratedDeriv t + (jets.mc 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)) + (GaugeBoson.valLinEquiv 𝔤) (GaugeBoson.adjointTransport jets U p (mcBosonCoeff jets V q)) = ∑ μ, Lorentz.CoVector.basis μ ⊗ₜ[ℝ] - IsGaugeField.adjointCoeff U p (GaugeJet.evalLie G (𝔤 := 𝔤) - (GaugeJet.iteratedDeriv G 𝔤 q (GaugeJet.mc 𝔤 (G := G) V μ))) := by + IsGaugeField.adjointCoeff jets U p (jets.evalLie + (jets.iteratedDeriv q (jets.mc 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 [show (GaugeBoson.valLinEquiv 𝔤) (GaugeBoson.adjointTransport jets U p + (mcBosonCoeff jets V q)) + = TensorProduct.map LinearMap.id (IsGaugeField.adjointCoeff jets U p) + ((GaugeBoson.valLinEquiv 𝔤) (mcBosonCoeff jets 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) + have hA : (GaugeBoson.valLinEquiv 𝔤) (mcBosonCoeff jets (U * V) s) = ∑ μ, (Lorentz.CoVector.basis μ ⊗ₜ[ℝ] - GaugeJet.evalLie G (𝔤 := 𝔤) (GaugeJet.iteratedDeriv G 𝔤 s (GaugeJet.mc 𝔤 (G := G) U μ)) + jets.evalLie (jets.iteratedDeriv s (jets.mc 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 + IsGaugeField.adjointCoeff jets U p.1 (jets.evalLie + (jets.iteratedDeriv p.2 (jets.mc 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 μ, + rw [show jets.mc (U * V) μ + = jets.mc U μ + jets.adjoint U (jets.mc V μ) from + jets.mc_cocycle 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, + show jets.adjoint U (jets.mc V μ) + = jets.adjoint U (jets.mc V μ) from rfl, GaugeJetLeibniz.evalLie_iteratedDeriv_adjoint, TensorProduct.tmul_add, Multiset.tmul_sum, Multiset.map_map] exact congrArg (fun z => _ + z) @@ -354,29 +353,29 @@ lemma mcBosonCoeff_mul (U V : G) (s : Multiset (Fin 1 ⊕ Fin 3)) : ← Multiset.sum_map_finsetSum] congr 1 -variable (G 𝔤) in +variable (jets) 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)) + Module.Dual.eval ℝ (GaugeBoson 𝔤) (mcBosonCoeff jets 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 + mcShift jets U (DerivAlgebraReal.basisMultiset s ⊗ₜ[ℝ] ψ) + = ψ (mcBosonCoeff jets U s) := by rw [mcShift, TensorProduct.lift.tmul, Module.Basis.constr_basis] rfl @[simp] -lemma mcShift_one : (mcShift G 𝔤) (1 : G) = 0 := by +lemma mcShift_one : mcShift jets (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 + mcShift jets (U * V) = mcShift jets V ∘ₗ transport jets U + mcShift jets 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] @@ -394,42 +393,42 @@ lemma mcShift_mul (U V : G) : -/ -variable (G 𝔤) in +variable (jets) 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⁻¹) + (SymmetricAlgebra.ι ℝ (GaugeBoson.JetComponentSpace 𝔤)).comp (transport jets U⁻¹) + + (Algebra.linearMap ℝ (GaugeJetAlgebra 𝔤)).comp (mcShift jets 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 + gaugeGen jets U x = SymmetricAlgebra.ι ℝ _ (transport jets U⁻¹ x) + + algebraMap ℝ (GaugeJetAlgebra 𝔤) (mcShift jets U⁻¹ x) := rfl -variable (G 𝔤) in +variable (jets) 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 + toFun U := (SymmetricAlgebra.lift (gaugeGen jets U)).toLinearMap map_one' := by - suffices h : SymmetricAlgebra.lift ((gaugeGen G 𝔤) 1) = AlgHom.id ℝ (GaugeJetAlgebra 𝔤) by + suffices h : SymmetricAlgebra.lift (gaugeGen jets 1) = AlgHom.id ℝ (GaugeJetAlgebra 𝔤) by rw [h]; rfl refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun x => ?_) - show SymmetricAlgebra.lift ((gaugeGen G 𝔤) 1) (SymmetricAlgebra.ι ℝ _ x) + show SymmetricAlgebra.lift (gaugeGen jets 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 + suffices h : SymmetricAlgebra.lift (gaugeGen jets (U * V)) + = (SymmetricAlgebra.lift (gaugeGen jets U)).comp (SymmetricAlgebra.lift + (gaugeGen jets 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))) + show SymmetricAlgebra.lift (gaugeGen jets (U * V)) (SymmetricAlgebra.ι ℝ _ x) + = ((SymmetricAlgebra.lift (gaugeGen jets U)).comp (SymmetricAlgebra.lift (gaugeGen jets V))) (SymmetricAlgebra.ι ℝ _ x) rw [SymmetricAlgebra.lift_ι_apply, gaugeGen_apply, AlgHom.comp_apply, SymmetricAlgebra.lift_ι_apply, gaugeGen_apply, map_add, @@ -437,40 +436,40 @@ noncomputable def repJet : Representation ℝ G (GaugeJetAlgebra 𝔤) where mul_inv_rev, transport_mul, mcShift_mul, LinearMap.comp_apply, LinearMap.add_apply, LinearMap.comp_apply, map_add, add_assoc] -variable (G 𝔤) in +variable (jets) 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) + SymmetricAlgebra.lift (gaugeGen jets 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, + repJet jets U (SymmetricAlgebra.ι ℝ _ x) + = SymmetricAlgebra.ι ℝ _ (transport jets U⁻¹ x) + + algebraMap ℝ (GaugeJetAlgebra 𝔤) (mcShift jets U⁻¹ x) := by + rw [show repJet jets U (SymmetricAlgebra.ι ℝ _ x) + = SymmetricAlgebra.lift (gaugeGen jets 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] + repJet jets U (1 : (GaugeJetAlgebra 𝔤)) = 1 := by + rw [show repJet jets U (1 : (GaugeJetAlgebra 𝔤)) + = SymmetricAlgebra.lift (gaugeGen jets 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] + repJet jets U (x * y) = repJet jets U x * repJet jets U y := by + rw [show repJet jets U (x * y) + = SymmetricAlgebra.lift (gaugeGen jets U) (x * y) from rfl, map_mul] rfl @[simp] lemma repJet_algebraMap (U : G) (r : ℝ) : - (repJet G 𝔤) U (algebraMap ℝ (GaugeJetAlgebra 𝔤) r) + repJet jets 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, + rw [show repJet jets U (algebraMap ℝ (GaugeJetAlgebra 𝔤) r) + = SymmetricAlgebra.lift (gaugeGen jets U) (algebraMap ℝ (GaugeJetAlgebra 𝔤) r) from rfl, AlgHom.commutes] /-! @@ -483,13 +482,13 @@ lemma repJet_algebraMap (U : G) (r : ℝ) : 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 + (GaugeBoson.componentDual 𝔤) (Lorentz.CoVector.basis.dualBasis μ) φ (mcBosonCoeff jets W s) + = φ (jets.evalLie (jets.iteratedDeriv s + (jets.mc W μ))) := by + have hsum : mcBosonCoeff jets W s = ∑ ν, (⟨Lorentz.CoVector.basis ν ⊗ₜ[ℝ] - GaugeJet.evalLie G (𝔤 := 𝔤) (GaugeJet.iteratedDeriv G 𝔤 s - (GaugeJet.mc 𝔤 (G := G) W ν))⟩ : (GaugeBoson 𝔤)) := by + jets.evalLie (jets.iteratedDeriv s + (jets.mc W ν))⟩ : (GaugeBoson 𝔤)) := by apply (GaugeBoson.valLinEquiv 𝔤).injective rw [map_sum] rfl @@ -498,8 +497,8 @@ lemma componentDual_dualBasis_mcBosonCoeff (W : G) 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 μ)] + (fun ν => φ (jets.evalLie (jets.iteratedDeriv s + (jets.mc 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 @@ -507,12 +506,12 @@ lemma componentDual_dualBasis_mcBosonCoeff (W : G) 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 𝔤) μ φ)) + repJet jets U ((iteratedJetDeriv 𝔤) s ((ofA 𝔤) μ φ)) = (s.antidiagonal.map fun p => - (iteratedJetDeriv 𝔤) p.2 ((ofA 𝔤) μ (adjointDualCoeff U⁻¹ p.1 φ))).sum + (iteratedJetDeriv 𝔤) p.2 ((ofA 𝔤) μ (adjointDualCoeff jets U⁻¹ p.1 φ))).sum + algebraMap ℝ (GaugeJetAlgebra 𝔤) - (φ (GaugeJet.evalLie G (𝔤 := 𝔤) (GaugeJet.iteratedDeriv G 𝔤 s - (GaugeJet.mc 𝔤 (G := G) U⁻¹ μ)))) := by + (φ (jets.evalLie (jets.iteratedDeriv s + (jets.mc U⁻¹ μ)))) := by rw [iteratedJetDeriv_ofA, repJet_ι, transport_basis_tmul, mcShift_basis_tmul, componentDual_dualBasis_mcBosonCoeff, map_multiset_sum, Multiset.map_map] congr 1 @@ -527,12 +526,12 @@ theorem repJet_iteratedJetDeriv_ofA (U : G) -/ -variable (G 𝔤) in +variable (jets) 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) + toFun U := LinearMap.baseChange ℂ (repJet jets 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 @@ -540,12 +539,12 @@ noncomputable def complexRepJet : @[simp] lemma complexRepJet_tmul (U : G) (z : ℂ) (x : (GaugeJetAlgebra 𝔤)) : - (complexRepJet G 𝔤) U (z ⊗ₜ[ℝ] x) = z ⊗ₜ[ℝ] (repJet G 𝔤) U x := rfl + complexRepJet jets U (z ⊗ₜ[ℝ] x) = z ⊗ₜ[ℝ] repJet jets 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 + complexRepJet jets U (x * y) + = complexRepJet jets U x * complexRepJet jets 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] @@ -584,14 +583,14 @@ lemma one_tmul_algebraMap (r : ℝ) : 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 + complexRepJet jets 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 + ((1 : ℂ) ⊗ₜ[ℝ] (ofA 𝔤) μ (adjointDualCoeff jets U⁻¹ p.1 φ))).sum + algebraMap ℂ (ℂ ⊗[ℝ] (GaugeJetAlgebra 𝔤)) - (((φ (GaugeJet.evalLie G (𝔤 := 𝔤) (GaugeJet.iteratedDeriv G 𝔤 s - (GaugeJet.mc 𝔤 (G := G) U⁻¹ μ))) : ℝ)) : ℂ) := by + (((φ (jets.evalLie (jets.iteratedDeriv s + (jets.mc U⁻¹ μ))) : ℝ)) : ℂ) := by rw [iteratedD_complexJetDeriv_one_tmul, complexRepJet_tmul, repJet_iteratedJetDeriv_ofA, TensorProduct.tmul_add, Multiset.tmul_sum, Multiset.map_map, one_tmul_algebraMap] diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/IsGaugeField.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/IsGaugeField.lean index 6864b926b..791d3728d 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/IsGaugeField.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/IsGaugeField.lean @@ -14,7 +14,7 @@ public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeField.Basic 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`. +for any gauge-jet package `jets` with the Taylor–Leibniz rule `GaugeJetLeibniz jets`. -/ @[expose] public section @@ -23,8 +23,8 @@ 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] +variable {jets : GaugeJet G 𝔤 G₀ 𝔤J} +variable [GaugeJetLeibniz jets] set_option maxHeartbeats 1000000 @@ -66,12 +66,13 @@ lemma gaugeField_apply (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) -/ +variable (jets) in /-- **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 + IsGaugeField jets (complexRepLorentzGroup 𝔤) (complexRepJet jets) (gaugeField 𝔤) where lorentz_apply Λ n l μ φ := by calc (complexRepLorentzGroup 𝔤) Λ ((gaugeField 𝔤) (List.ofFn l) μ φ) = ∑ p : Fin n → (Fin 1 ⊕ Fin 3), diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/Basic.lean index cb10f674c..c17cb6f9c 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/Basic.lean @@ -15,9 +15,10 @@ 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.JetGaugeGroup.GaugeJet`. +This file is stated for a supplied gauge-jet package `jets : GaugeJet G 𝔤 G₀ 𝔤J` +(jets of a gauge group `G₀` with Lie algebra `𝔤`), which every declaration below takes +as an argument; the Standard Model package is `StandardModel.gaugeJet` in +`Physlib.Particles.StandardModel.GaugeGroup.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 @@ -50,7 +51,7 @@ of the jet group `G` and not merely of its value group `G₀`. * `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 φ`: +* `∂_x (Ad_{g⁻¹})^a_b|` acting on the dual index is `adjointDualCoeff jets 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)` @@ -68,9 +69,10 @@ 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 {jets : GaugeJet G 𝔤 G₀ 𝔤J} +variable (jets) in /-- 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 @@ -78,25 +80,25 @@ variable [GaugeJet G 𝔤 G₀ 𝔤J] 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 + ((jets.evalLie).toLinearMap ∘ₗ jets.iteratedDeriv x ∘ₗ + jets.adjoint U ∘ₗ jets.ofConstantLie).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 + adjointDualCoeff jets U 0 = (jets.adjointValue + (jets.eval 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 + exact jets.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 +lemma adjointDualCoeff_zero_of_eval_eq_one {U : G} (hU : (jets.eval U) = 1) : + adjointDualCoeff jets 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 @@ -107,32 +109,32 @@ lemma adjointDualCoeff_zero_of_eval_eq_one {U : G} (hU : (GaugeJet.eval 𝔤 (G `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 + adjointDualCoeff jets U {μ} φ = + -adjointDualCoeff jets U 0 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 + (jets.evalLie (jets.mc 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, + rw [jets.deriv_adjoint, + jets.deriv_ofConstantLie, map_zero, zero_sub, map_neg, map_neg, LieHom.map_lie] simp section Truncation -variable [GaugeJetTruncation G 𝔤 G₀ 𝔤J] +variable [GaugeJetTruncation jets] /-- **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 + (hU : U ∈ GaugeJetTruncation.truncationKer jets n) {x : Multiset (Fin 1 ⊕ Fin 3)} + (hx : x ≠ 0) (hxn : x.card ≤ n) : adjointDualCoeff jets 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 + show φ (jets.evalLie (jets.iteratedDeriv x + (jets.adjoint U (jets.ofConstantLie b)))) = 0 rw [GaugeJetTruncation.evalLie_iteratedDeriv_adjoint_ofConstantLie_eq_zero hU hx hxn b, map_zero] @@ -140,6 +142,7 @@ end Truncation open Lorentz +variable (jets) in /-- 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: @@ -170,10 +173,10 @@ structure IsGaugeField (repLorentz : Representation ℂ SL(2,ℂ) B) 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 + (s.antidiagonal.map fun p => (A p.2 μ (adjointDualCoeff jets U⁻¹ p.1 φ))).sum + algebraMap ℂ B - (φ (GaugeJet.evalLie G (𝔤 := 𝔤) (GaugeJet.iteratedDeriv G 𝔤 s - (GaugeJet.mc 𝔤 (G := G) U⁻¹ μ)))) + (φ (jets.evalLie (jets.iteratedDeriv s + (jets.mc 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), @@ -218,10 +221,10 @@ noncomputable def commutator /-- 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) +lemma repGauge_apply (hA : IsGaugeField jets 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 + repGauge U (A 0 μ φ) = A 0 μ (adjointDualCoeff jets U⁻¹ ∅ φ) + + algebraMap ℂ B (φ (jets.evalLie (jets.mc U⁻¹ μ))) := by simpa [show (∅ : Multiset (Fin 1 ⊕ Fin 3)) = 0 from rfl] using hA.gauge_apply_deriv U 0 μ φ @@ -229,12 +232,12 @@ lemma repGauge_apply (hA : IsGaugeField repLorentz repGauge A) (U : G) /-- 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) +lemma repGauge_deriv_apply (hA : IsGaugeField jets 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 + A {ρ} σ (adjointDualCoeff jets U⁻¹ 0 φ) + A 0 σ (adjointDualCoeff jets U⁻¹ {ρ} φ) + + algebraMap ℂ B (φ (jets.evalLie + (jets.deriv ρ (jets.mc 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 @@ -378,37 +381,37 @@ 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) +lemma repGauge_commutator (hA : IsGaugeField jets 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 + commutator A μ ν (adjointDualCoeff jets U⁻¹ 0 φ) + - A 0 μ (adjointDualCoeff jets U⁻¹ 0 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 + (jets.evalLie (jets.mc U⁻¹ ν)))) + + A 0 ν (adjointDualCoeff jets U⁻¹ 0 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 + (jets.evalLie (jets.mc U⁻¹ μ)))) + + algebraMap ℂ B (φ ⁅jets.evalLie (jets.mc U⁻¹ μ), + jets.evalLie (jets.mc 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ν + (jets.evalLie).toLinearMap ∘ₗ jets.iteratedDeriv 0 ∘ₗ + jets.adjoint U⁻¹ ∘ₗ jets.ofConstantLie with hT₀def + set cμ : 𝔤 := jets.evalLie (jets.mc U⁻¹ μ) with hcμ + set cν : 𝔤 := jets.evalLie (jets.mc 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 + have hcoeff : adjointDualCoeff jets 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) (𝔤 := 𝔤), + simp [hT₀def, jets.ofConstantLie_lie, + jets.adjoint_lie, 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 + dualPairEquiv ((1 : B) ⊗ₜ[ℝ] jets.evalLie + (jets.mc U⁻¹ ρ)) := by intro ρ refine LinearMap.ext fun ψ => ?_ simp only [LinearMap.comp_apply, LinearMap.add_apply, hΦdef, @@ -470,27 +473,27 @@ lemma repGauge_commutator (hA : IsGaugeField repLorentz repGauge A) 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 + adjointDualCoeff jets U (ρ ::ₘ {μ}) φ = + -adjointDualCoeff jets U 0 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 + (jets.evalLie (jets.deriv ρ (jets.mc U μ)))) + - adjointDualCoeff jets U {ρ} (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 + (jets.evalLie (jets.mc 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 + jets.deriv τ (jets.adjoint U (jets.ofConstantLie a)) = + -⁅jets.mc U τ, + jets.adjoint U (jets.ofConstantLie a)⁆ := + fun τ => by rw [jets.deriv_adjoint, + jets.deriv_ofConstantLie, map_zero, zero_sub] + have hkey : jets.iteratedDeriv (ρ ::ₘ {μ}) + (jets.adjoint U (jets.ofConstantLie a)) = + -⁅jets.deriv ρ (jets.mc U μ), + jets.adjoint U (jets.ofConstantLie a)⁆ + + ⁅jets.mc U μ, ⁅jets.mc U ρ, + jets.adjoint U (jets.ofConstantLie a)⁆⁆ := by rw [GaugeJet.iteratedDeriv_cons, LinearMap.comp_apply, GaugeJet.iteratedDeriv_singleton, hderiv μ, map_neg, - GaugeJet.deriv_bracket (G := G) (𝔤 := 𝔤), hderiv ρ, lie_neg] + jets.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, @@ -504,15 +507,15 @@ lemma _root_.adjointDualCoeff_pair (U : G) /-- 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) +lemma repGauge_deriv_deriv_apply (hA : IsGaugeField jets 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 + A (ρ ::ₘ {σ}) τ (adjointDualCoeff jets U⁻¹ 0 φ) + + A {ρ} τ (adjointDualCoeff jets U⁻¹ {σ} φ) + + A {σ} τ (adjointDualCoeff jets U⁻¹ {ρ} φ) + + A 0 τ (adjointDualCoeff jets U⁻¹ (ρ ::ₘ {σ}) φ) + + algebraMap ℂ B (φ (jets.evalLie (jets.deriv ρ + (jets.deriv σ (jets.mc 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 @@ -692,7 +695,7 @@ set_option maxHeartbeats 1000000 in 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) +lemma repGauge_bracketFam (hA : IsGaugeField jets repLorentz repGauge A) (U : G) {f g f' g' : Module.Dual ℝ 𝔤 →ₗ[ℝ] B} {cf cg : 𝔤} (hf : ∀ ψ : Module.Dual ℝ 𝔤, @@ -834,14 +837,14 @@ lemma bracketFam_sum_right (f : Module.Dual ℝ 𝔤 →ₗ[ℝ] B) 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⁆))) = + jets.evalLie (jets.iteratedDeriv x + (jets.adjoint U (jets.ofConstantLie ⁅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) (𝔤 := 𝔤), + ⁅jets.evalLie (jets.iteratedDeriv p.1 + (jets.adjoint U (jets.ofConstantLie a))), + jets.evalLie (jets.iteratedDeriv p.2 + (jets.adjoint U (jets.ofConstantLie b)))⁆).sum := by + rw [jets.ofConstantLie_lie, jets.adjoint_lie, 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]) @@ -882,13 +885,14 @@ lemma tensorBracket_map_right_antidiagonal `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 φ) = + bracketFam f g (adjointDualCoeff jets U x φ) = (x.antidiagonal.map fun p => - bracketFam (f ∘ₗ adjointDualCoeff U p.1) (g ∘ₗ adjointDualCoeff U p.2) φ).sum := by + bracketFam (f ∘ₗ adjointDualCoeff jets U p.1) + (g ∘ₗ adjointDualCoeff jets 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 + (jets.evalLie).toLinearMap ∘ₗ jets.iteratedDeriv m ∘ₗ + jets.adjoint U ∘ₗ jets.ofConstantLie with hTdef + have hcoeff : ∀ m, adjointDualCoeff jets 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 @@ -913,23 +917,23 @@ lemma bracketFam_adjointDualCoeff (U : G) (x : Multiset (Fin 1 ⊕ Fin 3)) 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) φ = + adjointDualCoeff jets 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 + adjointDualCoeff jets U p.2 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 + (jets.evalLie (jets.iteratedDeriv p.1 + (jets.mc U μ))))).sum) := by refine LinearMap.ext fun a => ?_ - have hkey : GaugeJet.iteratedDeriv G 𝔤 (μ ::ₘ x) - (GaugeJet.adjoint 𝔤 (G := G) U (GaugeJet.ofConstantLie G (𝔤 := 𝔤) a)) = + have hkey : jets.iteratedDeriv (μ ::ₘ x) + (jets.adjoint U (jets.ofConstantLie 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 + ⁅jets.iteratedDeriv p.1 (jets.mc U μ), + jets.iteratedDeriv p.2 + (jets.adjoint U (jets.ofConstantLie 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_singleton, jets.deriv_adjoint, + jets.deriv_ofConstantLie, 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] @@ -944,51 +948,51 @@ lemma _root_.adjointDualCoeff_cons (U : G) 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 μ)) + jets.evalLie (jets.iteratedDeriv (μ ::ₘ s) + (jets.mc U ν)) = + jets.evalLie (jets.iteratedDeriv (ν ::ₘ s) + (jets.mc 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 + ⁅jets.evalLie (jets.iteratedDeriv p.1 + (jets.mc U μ)), + jets.evalLie (jets.iteratedDeriv p.2 + (jets.mc 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 + jets.iteratedDeriv s (jets.deriv κ z) = + jets.iteratedDeriv (κ ::ₘ 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 μ ν) + have h0 := congrArg (fun z => jets.evalLie (jets.iteratedDeriv s z)) + (jets.mc_structure 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 ν)) + calc jets.evalLie (jets.iteratedDeriv (μ ::ₘ s) + (jets.mc 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 μ)) + ⁅jets.evalLie (jets.iteratedDeriv p.1 + (jets.mc U μ)), + jets.evalLie (jets.iteratedDeriv p.2 + (jets.mc U ν))⁆).sum + = (jets.evalLie (jets.iteratedDeriv (μ ::ₘ s) + (jets.mc U ν)) + - jets.evalLie (jets.iteratedDeriv (ν ::ₘ s) + (jets.mc 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 + ⁅jets.evalLie (jets.iteratedDeriv p.1 + (jets.mc U μ)), + jets.evalLie (jets.iteratedDeriv p.2 + (jets.mc U ν))⁆).sum) + + jets.evalLie (jets.iteratedDeriv (ν ::ₘ s) + (jets.mc U μ)) := by abel - _ = GaugeJet.evalLie G (𝔤 := 𝔤) (GaugeJet.iteratedDeriv G 𝔤 (ν ::ₘ s) - (GaugeJet.mc 𝔤 (G := G) U μ)) := by + _ = jets.evalLie (jets.iteratedDeriv (ν ::ₘ s) + (jets.mc U μ)) := by rw [h0, zero_add] /-! @@ -1001,30 +1005,30 @@ lemma _root_.eval_iteratedDeriv_maurerCartan_structure 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) +lemma repGauge_cons_apply (hA : IsGaugeField jets 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 + A (κ ::ₘ p.2) τ (adjointDualCoeff jets 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 + A p.2 τ (adjointDualCoeff jets U⁻¹ q.2 + (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie + (jets.iteratedDeriv q.1 (jets.mc U⁻¹ κ)))))).sum).sum + + algebraMap ℂ B (φ (jets.evalLie (jets.iteratedDeriv (κ ::ₘ s) + (jets.mc 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 = + A p.2 τ (adjointDualCoeff jets 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 + A p.2 τ (adjointDualCoeff jets U⁻¹ q.2 + (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie + (jets.iteratedDeriv q.1 (jets.mc 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] @@ -1037,46 +1041,46 @@ 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_commutatorFam (hA : IsGaugeField repLorentz repGauge A) +lemma repGauge_commutatorFam (hA : IsGaugeField jets 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 + commutatorFam A μ ν p.2 (adjointDualCoeff jets 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 + A r.2 ν (adjointDualCoeff jets U⁻¹ r.1 + (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie + (jets.iteratedDeriv p.1 (jets.mc 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 + A q.2 μ (adjointDualCoeff jets U⁻¹ q.1 + (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie + (jets.iteratedDeriv p.2 (jets.mc 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 + algebraMap ℂ B (φ ⁅jets.evalLie (jets.iteratedDeriv p.1 + (jets.mc U⁻¹ μ)), + jets.evalLie (jets.iteratedDeriv p.2 + (jets.mc 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 + ((u.antidiagonal.map fun q => A q.2 τ ∘ₗ adjointDualCoeff jets U⁻¹ q.1).sum) ψ + + algebraMap ℂ B (ψ (jets.evalLie + (jets.iteratedDeriv u (jets.mc 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 = + bracketFam ((p.1.antidiagonal.map fun q => A q.2 μ ∘ₗ adjointDualCoeff jets U⁻¹ q.1).sum) + ((p.2.antidiagonal.map fun r => A r.2 ν ∘ₗ adjointDualCoeff jets 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 + bracketFam (A q.2 μ ∘ₗ adjointDualCoeff jets U⁻¹ q.1) + (A r.2 ν ∘ₗ adjointDualCoeff jets 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] @@ -1087,12 +1091,12 @@ lemma repGauge_commutatorFam (hA : IsGaugeField repLorentz repGauge A) 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 = + commutatorFam A μ ν p.2 (adjointDualCoeff jets 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 + bracketFam (A r.1 μ ∘ₗ adjointDualCoeff jets U⁻¹ q.1) + (A r.2 ν ∘ₗ adjointDualCoeff jets 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 @@ -1100,29 +1104,29 @@ lemma repGauge_commutatorFam (hA : IsGaugeField repLorentz repGauge A) 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) + bracketFam (A b μ ∘ₗ adjointDualCoeff jets U⁻¹ a) + (A d ν ∘ₗ adjointDualCoeff jets 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 jets U⁻¹ r.1).sum) + (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie + (jets.iteratedDeriv p.1 (jets.mc 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 + A r.2 ν (adjointDualCoeff jets U⁻¹ r.1 + (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie + (jets.iteratedDeriv p.1 (jets.mc 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 jets U⁻¹ q.1).sum) + (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie + (jets.iteratedDeriv p.2 (jets.mc 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 + A q.2 μ (adjointDualCoeff jets U⁻¹ q.1 + (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie + (jets.iteratedDeriv p.2 (jets.mc U⁻¹ ν)))))).sum := by intro p rw [Multiset.sum_linearMap_apply, Multiset.map_map] refine congrArg Multiset.sum (Multiset.map_congr rfl fun q hq => ?_) diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/FieldStrength.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/FieldStrength.lean index 050751e41..261969226 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/FieldStrength.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/FieldStrength.lean @@ -37,7 +37,7 @@ 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] +variable {jets : GaugeJet G 𝔤 G₀ 𝔤J} namespace IsGaugeField @@ -149,72 +149,72 @@ lemma fieldStrength_swap 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) +theorem repGauge_fieldStrength (hA : IsGaugeField jets 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 + fieldStrength A μ ν p.2 (adjointDualCoeff jets 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 = + fieldStrength A μ ν p.2 (adjointDualCoeff jets U⁻¹ p.1 φ)).sum = (s.antidiagonal.map fun p => - A (μ ::ₘ p.2) ν (adjointDualCoeff U⁻¹ p.1 φ)).sum + A (μ ::ₘ p.2) ν (adjointDualCoeff jets U⁻¹ p.1 φ)).sum - (s.antidiagonal.map fun p => - A (ν ::ₘ p.2) μ (adjointDualCoeff U⁻¹ p.1 φ)).sum + A (ν ::ₘ p.2) μ (adjointDualCoeff jets U⁻¹ p.1 φ)).sum + (s.antidiagonal.map fun p => - commutatorFam A μ ν p.2 (adjointDualCoeff U⁻¹ p.1 φ)).sum := by + commutatorFam A μ ν p.2 (adjointDualCoeff jets 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 = + A p.2 ν (adjointDualCoeff jets U⁻¹ q.2 + (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie + (jets.iteratedDeriv q.1 (jets.mc 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 := + A r.2 ν (adjointDualCoeff jets U⁻¹ r.1 + (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie + (jets.iteratedDeriv p.1 (jets.mc 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⁻¹ μ)))))) + A c ν (adjointDualCoeff jets U⁻¹ b + (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie + (jets.iteratedDeriv a (jets.mc 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 = + A p.2 μ (adjointDualCoeff jets U⁻¹ q.2 + (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie + (jets.iteratedDeriv q.1 (jets.mc 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 + A q.2 μ (adjointDualCoeff jets U⁻¹ q.1 + (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie + (jets.iteratedDeriv p.2 (jets.mc 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 ?_ + A c μ (adjointDualCoeff jets U⁻¹ b + (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie + (jets.iteratedDeriv a (jets.mc 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) + A q.2 μ (adjointDualCoeff jets U⁻¹ q.1 + (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie + (jets.iteratedDeriv a (jets.mc 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⁻¹ μ))) + have hconst : Θ (jets.evalLie (jets.iteratedDeriv (μ ::ₘ s) + (jets.mc U⁻¹ ν))) = + Θ (jets.evalLie (jets.iteratedDeriv (ν ::ₘ s) + (jets.mc 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 + Θ ⁅jets.evalLie (jets.iteratedDeriv p.1 + (jets.mc U⁻¹ μ)), + jets.evalLie (jets.iteratedDeriv p.2 + (jets.mc U⁻¹ ν))⁆).sum := by rw [eval_iteratedDeriv_maurerCartan_structure U⁻¹ s μ ν, map_sub, map_multiset_sum, Multiset.map_map] congr 1 @@ -227,17 +227,17 @@ theorem repGauge_fieldStrength (hA : IsGaugeField repLorentz repGauge A) /-- **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 μ ν) := +theorem transformsInAdjoint_fieldStrength (hA : IsGaugeField jets repLorentz repGauge A) + (μ ν : Fin 1 ⊕ Fin 3) : TransformsInAdjoint jets 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) +lemma repGauge_fieldStrength_zero (hA : IsGaugeField jets repLorentz repGauge A) (U : G) (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : repGauge U (fieldStrength A μ ν 0 φ) = - fieldStrength A μ ν 0 (adjointDualCoeff U⁻¹ 0 φ) := by + fieldStrength A μ ν 0 (adjointDualCoeff jets U⁻¹ 0 φ) := by rw [hA.repGauge_fieldStrength U 0 μ ν φ, Multiset.antidiagonal_zero, Multiset.map_singleton, Multiset.sum_singleton] diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/TransformsInAdjoint.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/TransformsInAdjoint.lean index 1a1b0e4af..8dc294004 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/TransformsInAdjoint.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/TransformsInAdjoint.lean @@ -33,7 +33,7 @@ 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] +variable {jets : GaugeJet G 𝔤 G₀ 𝔤J} namespace IsGaugeField @@ -41,6 +41,7 @@ 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} +variable (jets) in /-- 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 @@ -50,7 +51,7 @@ 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 + (s.antidiagonal.map fun p => F p.2 (adjointDualCoeff jets 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 @@ -94,29 +95,29 @@ lemma covDerivAdjoint_apply 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) + (hF : TransformsInAdjoint jets 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 + F (κ ::ₘ p.2) (adjointDualCoeff jets 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 + F p.2 (adjointDualCoeff jets U⁻¹ q.2 + (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie + (jets.iteratedDeriv q.1 + (jets.mc 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 = + F p.2 (adjointDualCoeff jets 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 + F p.2 (adjointDualCoeff jets U⁻¹ q.2 + (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie + (jets.iteratedDeriv q.1 + (jets.mc 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] @@ -129,44 +130,44 @@ set_option maxHeartbeats 2000000 in 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) + (hA : IsGaugeField jets repLorentz repGauge A) {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B} - (hF : TransformsInAdjoint repGauge F) + (hF : TransformsInAdjoint jets 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 + bracketFamConv A ρ F p.2 (adjointDualCoeff jets 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 + F r.2 (adjointDualCoeff jets U⁻¹ r.1 + (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie + (jets.iteratedDeriv p.1 + (jets.mc 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 + ((u.antidiagonal.map fun q => A q.2 ρ ∘ₗ adjointDualCoeff jets U⁻¹ q.1).sum) ψ + + algebraMap ℂ B (ψ (jets.evalLie + (jets.iteratedDeriv u (jets.mc 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) ψ + ((u.antidiagonal.map fun r => F r.2 ∘ₗ adjointDualCoeff jets 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 = + bracketFam ((p.1.antidiagonal.map fun q => A q.2 ρ ∘ₗ adjointDualCoeff jets U⁻¹ q.1).sum) + ((p.2.antidiagonal.map fun r => F r.2 ∘ₗ adjointDualCoeff jets 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 + bracketFam (A q.2 ρ ∘ₗ adjointDualCoeff jets U⁻¹ q.1) + (F r.2 ∘ₗ adjointDualCoeff jets 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] @@ -177,12 +178,12 @@ lemma TransformsInAdjoint.repGauge_bracketFamConv 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 = + bracketFamConv A ρ F p.2 (adjointDualCoeff jets 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 + bracketFam (A r.1 ρ ∘ₗ adjointDualCoeff jets U⁻¹ q.1) + (F r.2 ∘ₗ adjointDualCoeff jets 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 @@ -190,16 +191,16 @@ lemma TransformsInAdjoint.repGauge_bracketFamConv 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) + bracketFam (A b ρ ∘ₗ adjointDualCoeff jets U⁻¹ a) + (F d ∘ₗ adjointDualCoeff jets 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 jets U⁻¹ r.1).sum) + (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie + (jets.iteratedDeriv p.1 (jets.mc 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 + F r.2 (adjointDualCoeff jets U⁻¹ r.1 + (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie + (jets.iteratedDeriv p.1 (jets.mc U⁻¹ ρ)))))).sum := by intro p rw [Multiset.sum_linearMap_apply, Multiset.map_map] refine congrArg Multiset.sum (Multiset.map_congr rfl fun r hr => ?_) @@ -223,39 +224,39 @@ set_option maxHeartbeats 2000000 in 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) + (hA : IsGaugeField jets 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 + (hF : TransformsInAdjoint jets repGauge F) (ρ : Fin 1 ⊕ Fin 3) : + TransformsInAdjoint jets 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 = + IsGaugeField.covDerivAdjoint A F ρ p.2 (adjointDualCoeff jets U⁻¹ p.1 φ)).sum = (s.antidiagonal.map fun p => - F (ρ ::ₘ p.2) (adjointDualCoeff U⁻¹ p.1 φ)).sum + F (ρ ::ₘ p.2) (adjointDualCoeff jets U⁻¹ p.1 φ)).sum + (s.antidiagonal.map fun p => - bracketFamConv A ρ F p.2 (adjointDualCoeff U⁻¹ p.1 φ)).sum := by + bracketFamConv A ρ F p.2 (adjointDualCoeff jets 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 = + F p.2 (adjointDualCoeff jets U⁻¹ q.2 + (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie + (jets.iteratedDeriv q.1 + (jets.mc 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 := + F r.2 (adjointDualCoeff jets U⁻¹ r.1 + (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie + (jets.iteratedDeriv p.1 + (jets.mc 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⁻¹ ρ)))))) + F c (adjointDualCoeff jets U⁻¹ b + (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie + (jets.iteratedDeriv a (jets.mc U⁻¹ ρ)))))) rw [hL, hF.repGauge_cons U ρ s φ, hF.repGauge_bracketFamConv hA U s ρ φ, hR, hcancel] abel diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeJet.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeJet.lean index 6df5982ea..43d5ce802 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeJet.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeJet.lean @@ -19,7 +19,7 @@ local Lagrangian sees of it is its *jet* at the base point. The jet gauge transf 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 +This file records, as the structure `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 @@ -30,18 +30,25 @@ situation that the transformation laws of gauge fields and matter fields use: * 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. +A term `jets : GaugeJet G 𝔤 G₀ 𝔤J` is supplied, not inferred: every construction below, +and every construction downstream, takes the package it works over as an ordinary +argument. The four carriers do not determine it — a truncated jet group beside the full +one is the same four carriers with different data — so there is nothing canonical for +instance search to choose. + 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. +(`StandardModel.JetGaugeGroupI`), packaged as `StandardModel.gaugeJet`; nothing here +depends on that choice. ## ii. Key results -- `GaugeJet` : the class. +- `GaugeJet` : the structure. - `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. +- `GaugeJetLeibniz` : the Taylor–Leibniz rule for the adjoint action of a given package, + 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. @@ -52,9 +59,13 @@ coefficients in the ring of formal power series in the spacetime coordinates /-- **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 + laws of gauge and matter fields. + + This is data attached to the four carriers, not a property of them, and it is passed + explicitly: the generic theory takes `jets : GaugeJet G 𝔤 G₀ 𝔤J` as an argument rather + than searching for it. -/ +structure GaugeJet (G : Type) [Group G] (𝔤 : Type) [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + (G₀ : Type) [Group G₀] (𝔤J : 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. -/ @@ -96,17 +107,17 @@ namespace GaugeJet variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - [GaugeJet G 𝔤 G₀ 𝔤J] + (jets : 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 +lemma evalLie_ofConstantLie (a : 𝔤) : jets.evalLie (jets.ofConstantLie a) = a := by + have h := jets.evalLie_adjoint_ofConstantLie 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 +lemma evalLie_adjoint_ofConstantLie_of_eval_eq_one {U : G} (hU : jets.eval U = 1) (a : 𝔤) : + jets.evalLie (jets.adjoint U (jets.ofConstantLie a)) = a := by rw [evalLie_adjoint_ofConstantLie, hU, map_one, Module.End.one_apply] /-! @@ -119,26 +130,24 @@ lemma evalLie_adjoint_ofConstantLie_of_eval_eq_one {U : G} (hU : eval 𝔤 U = 1 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 + (fun (D : 𝔤J →ₗ[ℝ] 𝔤J) (μ : Fin 1 ⊕ Fin 3) => D.comp (jets.deriv μ)) where right_comm D μ ν := by refine LinearMap.ext fun a => ?_ - exact congrArg D (deriv_comm (G := G) (𝔤 := 𝔤) μ ν a) + exact congrArg D (jets.deriv_comm μ ν 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 + μs.foldl (fun D μ => D.comp (jets.deriv μ)) LinearMap.id @[simp] -lemma iteratedDeriv_zero : iteratedDeriv G 𝔤 (0 : Multiset (Fin 1 ⊕ Fin 3)) = LinearMap.id := by +lemma iteratedDeriv_zero : jets.iteratedDeriv (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 + jets.iteratedDeriv (μ ::ₘ μs) = (jets.deriv μ).comp (jets.iteratedDeriv μ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 + s.foldl (fun D μ => D.comp (jets.deriv μ)) D = D.comp (jets.iteratedDeriv s) := by intro s induction s using Multiset.induction_on with | empty => intro D; simp [iteratedDeriv] @@ -152,7 +161,7 @@ lemma iteratedDeriv_cons (μ : Fin 1 ⊕ Fin 3) (μs : Multiset (Fin 1 ⊕ Fin 3 /-- 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 + jets.iteratedDeriv (s + t) = (jets.iteratedDeriv s).comp (jets.iteratedDeriv t) := by induction s using Multiset.induction_on with | empty => simp [iteratedDeriv_zero] | cons μ s ih => @@ -161,27 +170,28 @@ lemma iteratedDeriv_add (s t : Multiset (Fin 1 ⊕ Fin 3)) : @[simp] lemma iteratedDeriv_singleton (μ : Fin 1 ⊕ Fin 3) : - iteratedDeriv G 𝔤 ({μ} : Multiset (Fin 1 ⊕ Fin 3)) = deriv (G := G) (𝔤 := 𝔤) μ := by + jets.iteratedDeriv ({μ} : Multiset (Fin 1 ⊕ Fin 3)) = jets.deriv μ := 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 + jets.iteratedDeriv s ⁅a, b⁆ = + (s.antidiagonal.map fun p => + ⁅jets.iteratedDeriv p.1 a, jets.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 (G := G) (𝔤 := 𝔤) κ (iteratedDeriv G 𝔤 p.1 a) - = iteratedDeriv G 𝔤 (κ ::ₘ p.1) a from by + rw [Function.comp_apply, jets.deriv_bracket, + show jets.deriv κ (jets.iteratedDeriv p.1 a) + = jets.iteratedDeriv (κ ::ₘ 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 + show jets.deriv κ (jets.iteratedDeriv p.2 b) + = jets.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, @@ -191,7 +201,7 @@ lemma iteratedDeriv_bracket (s : Multiset (Fin 1 ⊕ Fin 3)) (a b : 𝔤J) : /-- 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 + (a : 𝔤) : jets.iteratedDeriv p (jets.ofConstantLie a) = 0 := by induction p using Multiset.induction_on with | empty => exact absurd rfl hp | cons μ t ih => @@ -210,23 +220,23 @@ end GaugeJet -/ -/-- **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 +/-- **The Taylor–Leibniz rule for the adjoint action** of a gauge-jet package `jets`: 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. + + It is an extra law of one package, so `jets` is its only explicit parameter and the + carriers are read off from it. -/ +class GaugeJetLeibniz {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + (jets : 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 + jets.evalLie (jets.iteratedDeriv x (jets.adjoint U Y)) + = (x.antidiagonal.map fun p => jets.evalLie (jets.iteratedDeriv p.1 + (jets.adjoint U (jets.ofConstantLie + (jets.evalLie (jets.iteratedDeriv p.2 Y)))))).sum /-! @@ -237,15 +247,15 @@ class GaugeJetLeibniz (G : Type) [Group G] (𝔤 : Type) [LieRing 𝔤] [LieAlge /-- **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 + of order between `1` and `n` vanish at the base point. + + Like `GaugeJetLeibniz` this is an extra law of one package `jets`, its only explicit + parameter. -/ +class GaugeJetTruncation {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + (jets : 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 + ∀ b : 𝔤, jets.evalLie (jets.iteratedDeriv x (jets.adjoint U (jets.ofConstantLie b))) = 0 diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/Matter/CovariantDeriv.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/Matter/CovariantDeriv.lean index 4cb2fb3c5..43491048c 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/Matter/CovariantDeriv.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/Matter/CovariantDeriv.lean @@ -62,7 +62,7 @@ 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 {jets : GaugeJet G 𝔤 G₀ 𝔤J} variable {V : Type} [AddCommGroup V] [Module ℂ V] namespace IsGaugeField @@ -79,15 +79,16 @@ variable {A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual -/ +variable (jets) in /-- 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 (𝔤 := 𝔤) + (jets.evalLie).toLinearMap ∘ₗ jets.iteratedDeriv x ∘ₗ + jets.adjoint U ∘ₗ jets.ofConstantLie lemma adjointDualCoeff_eq_dualMap (U : G) (x : Multiset (Fin 1 ⊕ Fin 3)) : - adjointDualCoeff (𝔤 := 𝔤) U x = (adjointCoeff U x).dualMap := rfl + adjointDualCoeff jets U x = (adjointCoeff jets 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 @@ -316,7 +317,7 @@ set_option maxHeartbeats 1000000 in 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) +lemma repGauge_actionFam (hA : IsGaugeField jets repLorentz repGauge A) (U : G) {f f' : Module.Dual ℝ 𝔤 →ₗ[ℝ] B} {g g' : Module.Dual ℂ V →ₗ[ℂ] B} {cf : 𝔤} (hf : ∀ ψ : Module.Dual ℝ 𝔤, @@ -666,19 +667,19 @@ end Action section Leibniz -variable [GaugeJetLeibniz G 𝔤 G₀ 𝔤J] +variable [GaugeJetLeibniz jets] /-- **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 + adjointCoeff jets (U * V) x + = (x.antidiagonal.map fun p => adjointCoeff jets U p.1 ∘ₗ adjointCoeff jets 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 + show adjointCoeff jets (U * V) x a + = jets.evalLie (jets.iteratedDeriv x (jets.adjoint U + (jets.adjoint V (jets.ofConstantLie a)))) from by rw [adjointCoeff] simp only [LinearMap.coe_comp, Function.comp_apply, LieHom.coe_toLinearMap, map_mul, Module.End.mul_apply], @@ -689,7 +690,7 @@ lemma adjointCoeff_mul (U V : G) (x : Multiset (Fin 1 ⊕ Fin 3)) : /-- 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 + adjointCoeff jets (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, @@ -697,7 +698,7 @@ lemma adjointCoeff_one (p : Multiset (Fin 1 ⊕ Fin 3)) : 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, + · rw [jets.iteratedDeriv_ofConstantLie_of_ne_zero hp, map_zero, if_neg hp, LinearMap.zero_apply] end Leibniz diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/GaugeFieldData.lean b/Physlib/ClassicalFieldTheory/JetAlgebra/GaugeFieldData.lean index 193b9e42c..ee9888398 100644 --- a/Physlib/ClassicalFieldTheory/JetAlgebra/GaugeFieldData.lean +++ b/Physlib/ClassicalFieldTheory/JetAlgebra/GaugeFieldData.lean @@ -16,11 +16,12 @@ public import Physlib.ClassicalFieldTheory.JetAlgebra.SpeciesGenerators A gauge theory is fixed, before any Lagrangian is chosen, by a gauge context and a matter content. The gauge context is the existing jet data of the gauge group, namely a global group `G₀` with finite-dimensional real Lie algebra `𝔤`, a jet group `G` with jet Lie -algebra `𝔤J`, and the identities `GaugeJet` and `GaugeJetLeibniz` relating them. The matter -content is a finite family of fermionic species and a finite family of bosonic species, -each given by an existing `MatterField G`. +algebra `𝔤J`, a gauge-jet package `jets : GaugeJet G 𝔤 G₀ 𝔤J` relating them and its +Taylor–Leibniz law `GaugeJetLeibniz jets`. The matter content is a finite family of +fermionic species and a finite family of bosonic species, each given by an existing +`MatterField G`. -`GaugeFieldData G 𝔤` bundles the matter content over such a context. From it this file +`GaugeFieldData jets` bundles the matter content over such a context. From it this file derives, with no further data, * the fermionic and bosonic generator spaces, as `SpeciesComponentSpace` of the families @@ -84,16 +85,18 @@ open Matrix MatrixGroups TensorProduct ## A. The gauge context and the field datum The gauge context is the parameter list of the structure below, namely the two groups, the -two Lie algebras and the two gauge-jet classes. It is what makes `𝔤` the gauge algebra of -`G` rather than an unrelated Lie algebra. `GaugeFieldData` adds only the matter content on -top of it. +two Lie algebras, the supplied gauge-jet package `jets` and its Taylor–Leibniz law. It is +`jets` that makes `𝔤` the gauge algebra of `G` rather than an unrelated Lie algebra, and +it is supplied rather than inferred, so a second package over the same carriers is a +different context. `GaugeFieldData` adds only the matter content on top of it. -/ /-- The field data of a gauge theory. Over a gauge context, given by a jet gauge group `G` with global group `G₀`, a finite-dimensional real gauge algebra `𝔤` with jet algebra - `𝔤J` and the gauge-jet identities, it records a finite family of fermionic species and a - finite family of bosonic species, each given by an existing `MatterField G`. + `𝔤J` and a gauge-jet package `jets` over them, it records a finite family of fermionic + species and a finite family of bosonic species, each given by an existing + `MatterField G`. Nothing is repeated from `MatterField`, whose fields already carry the value space, the Lorentz representation, the gauge-jet action and the mass weight of a species. Nothing is @@ -104,9 +107,9 @@ top of it. not assert that they are jointly consistent. Gauge-Lorentz compatibility, factorization of the jet action through its global value, and richness of the jet group are separate conditions, none of them imposed here. -/ -structure GaugeFieldData (G : Type) [Group G] (𝔤 : Type) [LieRing 𝔤] [LieAlgebra ℝ 𝔤] +structure GaugeFieldData {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - [GaugeJet G 𝔤 G₀ 𝔤J] [GaugeJetLeibniz G 𝔤 G₀ 𝔤J] where + (jets : GaugeJet G 𝔤 G₀ 𝔤J) [GaugeJetLeibniz jets] where /-- The index type of the fermionic species. -/ FermionSpecies : Type [decidableEqFermionSpecies : DecidableEq FermionSpecies] @@ -127,8 +130,8 @@ attribute [instance] GaugeFieldData.decidableEqFermionSpecies namespace GaugeFieldData variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] - {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] [GaugeJet G 𝔤 G₀ 𝔤J] - [GaugeJetLeibniz G 𝔤 G₀ 𝔤J] (T : GaugeFieldData G 𝔤) + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : GaugeJet G 𝔤 G₀ 𝔤J} [GaugeJetLeibniz jets] (T : GaugeFieldData jets) /-! diff --git a/Physlib/Particles/StandardModel/GaugeGroup/GaugeJet.lean b/Physlib/Particles/StandardModel/GaugeGroup/GaugeJet.lean index 33b796fc1..9f79ab1b9 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/GaugeJet.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/GaugeJet.lean @@ -15,30 +15,31 @@ public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.Covariant ## i. Overview -The generic transformation laws of gauge and matter fields are stated against the class -`GaugeJet G 𝔤 G₀ 𝔤J`. The Standard Model already carries all of its data, for the jet -gauge group `JetGaugeGroupI` of `SU(3) × SU(2) × U(1)` with jet Lie algebra -`JetGaugeAlgebra`, global group `GaugeGroupI` and gauge algebra `GaugeAlgebra`. +The generic transformation laws of gauge and matter fields are stated against a supplied +gauge-jet package `jets : GaugeJet G 𝔤 G₀ 𝔤J`. The Standard Model already carries all of +its data, for the jet gauge group `JetGaugeGroupI` of `SU(3) × SU(2) × U(1)` with jet Lie +algebra `JetGaugeAlgebra`, global group `GaugeGroupI` and gauge algebra `GaugeAlgebra`. -This file installs those existing constructions as the instance -`StandardModel.instGaugeJet`, and records the rules that compute the generic interface -back to the Standard Model definition it came from, so the existing Standard Model lemmas -apply to it unchanged. `GaugeJetLeibniz` is not instantiated here. +This file packages those existing constructions as the named term +`StandardModel.gaugeJet`, and records the rules that compute the generic interface back to +the Standard Model definition it came from, so the existing Standard Model lemmas apply to +it unchanged. It is a term, not an instance: every generic construction receives it as an +argument. `GaugeJetLeibniz` is not instantiated here. ## ii. Key results -- `StandardModel.instGaugeJet` : the Standard Model gauge group as jets of a gauge group. +- `StandardModel.gaugeJet` : the Standard Model gauge group as jets of a gauge group. - `StandardModel.gaugeJet_eval`, `StandardModel.gaugeJet_deriv`, `StandardModel.gaugeJet_mc`, … : the generic interface computed back to the Standard Model definitions. - `StandardModel.gaugeJet_iteratedDeriv` : the generic iterated derivative is the Standard Model iterated derivative. - `StandardModel.gaugeJet_adjointCoeff`, `StandardModel.gaugeJet_adjointDualCoeff` : the - generic base-point adjoint transport at the instance is the existing Standard Model one. + generic base-point adjoint transport at this package is the existing Standard Model one. ## iii. Table of contents -- A. The gauge-jet instance +- A. The gauge-jet package - B. The generic interface in Standard Model terms - B.1. The group and Lie algebra data - B.2. The derivative, the adjoint action and the Maurer–Cartan form @@ -54,11 +55,12 @@ open JetGaugeAlgebra /-! -## A. The gauge-jet instance +## A. The gauge-jet package -It is registered as a global instance because `G₀` and `𝔤J` are output parameters of the -class, so the pair `(JetGaugeGroupI, GaugeAlgebra)` determines it, and the library holds -no other `GaugeJet` instance. +`GaugeJet` is an ordinary structure, so this is a named term supplied at each use site, +not an instance found by search. The four carriers do not determine it — a truncated jet +group over the same gauge group would be a second, equally canonical package — so nothing +is registered globally. -/ @@ -67,7 +69,7 @@ no other `GaugeJet` instance. `GaugeGroupI` and gauge algebra `GaugeAlgebra`. Nothing is redefined. Every data field is an existing Standard Model construction and every proof field an existing Standard Model lemma. -/ -noncomputable instance instGaugeJet : +noncomputable def gaugeJet : GaugeJet JetGaugeGroupI GaugeAlgebra GaugeGroupI JetGaugeAlgebra where eval := JetGaugeGroupI.eval ofConstant := JetGaugeGroupI.ofConstant @@ -101,24 +103,19 @@ the direction in which the existing Standard Model lemmas become applicable. -/ @[simp] -lemma gaugeJet_eval : GaugeJet.eval GaugeAlgebra (G := JetGaugeGroupI) = - JetGaugeGroupI.eval := rfl +lemma gaugeJet_eval : gaugeJet.eval = JetGaugeGroupI.eval := rfl @[simp] -lemma gaugeJet_ofConstant : GaugeJet.ofConstant GaugeAlgebra (G := JetGaugeGroupI) = - JetGaugeGroupI.ofConstant := rfl +lemma gaugeJet_ofConstant : gaugeJet.ofConstant = JetGaugeGroupI.ofConstant := rfl @[simp] -lemma gaugeJet_evalLie : GaugeJet.evalLie JetGaugeGroupI (𝔤 := GaugeAlgebra) = - JetGaugeAlgebra.eval := rfl +lemma gaugeJet_evalLie : gaugeJet.evalLie = JetGaugeAlgebra.eval := rfl @[simp] -lemma gaugeJet_ofConstantLie : GaugeJet.ofConstantLie JetGaugeGroupI (𝔤 := GaugeAlgebra) = - JetGaugeAlgebra.ofConstant := rfl +lemma gaugeJet_ofConstantLie : gaugeJet.ofConstantLie = JetGaugeAlgebra.ofConstant := rfl @[simp] -lemma gaugeJet_adjointValue : GaugeJet.adjointValue JetGaugeGroupI (𝔤 := GaugeAlgebra) = - GaugeAlgebra.adjoint := rfl +lemma gaugeJet_adjointValue : gaugeJet.adjointValue = GaugeAlgebra.adjoint := rfl /-! @@ -127,22 +124,19 @@ lemma gaugeJet_adjointValue : GaugeJet.adjointValue JetGaugeGroupI (𝔤 := Gaug -/ @[simp] -lemma gaugeJet_deriv (μ : Fin 1 ⊕ Fin 3) : - GaugeJet.deriv JetGaugeGroupI GaugeAlgebra μ = JetGaugeAlgebra.deriv μ := rfl +lemma gaugeJet_deriv (μ : Fin 1 ⊕ Fin 3) : gaugeJet.deriv μ = JetGaugeAlgebra.deriv μ := rfl /-- The generic iterated derivative is the Standard Model iterated derivative, both being the same fold of `JetGaugeAlgebra.deriv` over the multiset of directions. -/ @[simp] lemma gaugeJet_iteratedDeriv (s : Multiset (Fin 1 ⊕ Fin 3)) : - GaugeJet.iteratedDeriv JetGaugeGroupI GaugeAlgebra s = JetGaugeAlgebra.iteratedDeriv s := - rfl + gaugeJet.iteratedDeriv s = JetGaugeAlgebra.iteratedDeriv s := rfl @[simp] -lemma gaugeJet_adjoint : GaugeJet.adjoint GaugeAlgebra (G := JetGaugeGroupI) = - JetGaugeAlgebra.adjoint := rfl +lemma gaugeJet_adjoint : gaugeJet.adjoint = JetGaugeAlgebra.adjoint := rfl @[simp] -lemma gaugeJet_mc : GaugeJet.mc GaugeAlgebra (G := JetGaugeGroupI) = maurerCartanForm := rfl +lemma gaugeJet_mc : gaugeJet.mc = maurerCartanForm := rfl /-! @@ -156,11 +150,10 @@ covariant-derivative development already uses under the same name. @[simp] lemma gaugeJet_adjointCoeff (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : - _root_.IsGaugeField.adjointCoeff (𝔤 := GaugeAlgebra) U x = IsGaugeField.adjointCoeff U x := - rfl + _root_.IsGaugeField.adjointCoeff gaugeJet U x = IsGaugeField.adjointCoeff U x := rfl @[simp] lemma gaugeJet_adjointDualCoeff (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : - _root_.adjointDualCoeff (𝔤 := GaugeAlgebra) U x = adjointDualCoeff U x := rfl + _root_.adjointDualCoeff gaugeJet U x = adjointDualCoeff U x := rfl end StandardModel From b884c76590cca3912ca7081a90337e96128c13ab Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 8 Sep 2026 05:09:22 +0100 Subject: [PATCH 288/367] feat: Update IsCovStandardModel --- Physlib.lean | 40 +- .../CovFieldAlgebra/Basic.lean | 132 +- .../AlgebraRealization/CovStandardModel.lean | 272 +-- .../MassWeight/Filtration.lean | 91 +- .../CovAlgebraRealization/Basic.lean | 1573 ++++++++++++----- .../FermionGaugeSector/Basic.lean | 39 +- .../FermionGaugeSector/MassWeight.lean | 35 +- .../GaugeHiggsSector/Basic.lean | 31 +- .../GaugeHiggsSector/MassWeight.lean | 59 +- .../Generators.lean | 64 +- .../MassWeight.lean | 58 +- .../MassWeight/Filtration.lean | 32 +- .../MassWeight/Invariants.lean | 40 +- .../MixedSector/Basic.lean | 31 +- .../Sectors.lean | 55 +- .../YukawaSector/Basic.lean | 37 +- .../YukawaSector/Families/BarHiggs.lean | 32 +- .../YukawaSector/Families/Higgs.lean | 32 +- .../YukawaSector/Families/Symbols.lean | 52 +- .../GaugeWeightDecomposition.lean | 75 +- .../YukawaSector/MassDimEight.lean | 121 +- .../YukawaSector/MassDimLTEight.lean | 37 +- .../StandardModel/CovJetAlgebra/Basic.lean | 768 ++++++++ .../StandardModel/CovJetAlgebra/Sectors.lean | 555 ++++++ .../IsCovStandardModel/Basic.lean | 425 ----- .../JetAlgebra/AlgebraRealization.lean | 20 +- .../LorentzGroup/Boosts/WeightGrading.lean | 2 +- 27 files changed, 2898 insertions(+), 1810 deletions(-) rename Physlib/Particles/StandardModel/{IsCovStandardModel => CovAlgebraRealization}/FermionGaugeSector/Basic.lean (80%) rename Physlib/Particles/StandardModel/{IsCovStandardModel => CovAlgebraRealization}/FermionGaugeSector/MassWeight.lean (81%) rename Physlib/Particles/StandardModel/{IsCovStandardModel => CovAlgebraRealization}/GaugeHiggsSector/Basic.lean (84%) rename Physlib/Particles/StandardModel/{IsCovStandardModel => CovAlgebraRealization}/GaugeHiggsSector/MassWeight.lean (90%) rename Physlib/Particles/StandardModel/{IsCovStandardModel => CovAlgebraRealization}/Generators.lean (93%) rename Physlib/Particles/StandardModel/{IsCovStandardModel => CovAlgebraRealization}/MassWeight.lean (87%) rename Physlib/Particles/StandardModel/{IsCovStandardModel => CovAlgebraRealization}/MassWeight/Filtration.lean (90%) rename Physlib/Particles/StandardModel/{IsCovStandardModel => CovAlgebraRealization}/MassWeight/Invariants.lean (92%) rename Physlib/Particles/StandardModel/{IsCovStandardModel => CovAlgebraRealization}/MixedSector/Basic.lean (76%) rename Physlib/Particles/StandardModel/{IsCovStandardModel => CovAlgebraRealization}/Sectors.lean (93%) rename Physlib/Particles/StandardModel/{IsCovStandardModel => CovAlgebraRealization}/YukawaSector/Basic.lean (86%) rename Physlib/Particles/StandardModel/{IsCovStandardModel => CovAlgebraRealization}/YukawaSector/Families/BarHiggs.lean (94%) rename Physlib/Particles/StandardModel/{IsCovStandardModel => CovAlgebraRealization}/YukawaSector/Families/Higgs.lean (94%) rename Physlib/Particles/StandardModel/{IsCovStandardModel => CovAlgebraRealization}/YukawaSector/Families/Symbols.lean (93%) rename Physlib/Particles/StandardModel/{IsCovStandardModel => CovAlgebraRealization}/YukawaSector/GaugeWeightDecomposition.lean (93%) rename Physlib/Particles/StandardModel/{IsCovStandardModel => CovAlgebraRealization}/YukawaSector/MassDimEight.lean (89%) rename Physlib/Particles/StandardModel/{IsCovStandardModel => CovAlgebraRealization}/YukawaSector/MassDimLTEight.lean (90%) create mode 100644 Physlib/Particles/StandardModel/CovJetAlgebra/Basic.lean create mode 100644 Physlib/Particles/StandardModel/CovJetAlgebra/Sectors.lean delete mode 100644 Physlib/Particles/StandardModel/IsCovStandardModel/Basic.lean diff --git a/Physlib.lean b/Physlib.lean index 00995250d..2416d4085 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -184,6 +184,7 @@ public import Physlib.Mathematics.SchurTriangulation public import Physlib.Mathematics.SpecialFunctions.EllipticIntegral public import Physlib.Mathematics.SpecialFunctions.PhysHermite public import Physlib.Mathematics.SymmetricAlgebra +public import Physlib.Mathematics.TensorProductComm public import Physlib.Mathematics.Trigonometry.SinSq public import Physlib.Mathematics.Trigonometry.Tanh public import Physlib.Mathematics.VariationalCalculus.Basic @@ -255,6 +256,7 @@ public import Physlib.Particles.QED.LorentzInvariance public import Physlib.Particles.QED.MassDimension public import Physlib.Particles.StandardModel.AlgebraRealization.Basic public import Physlib.Particles.StandardModel.AlgebraRealization.Commutations +public import Physlib.Particles.StandardModel.AlgebraRealization.CovFieldAlgebra.Basic public import Physlib.Particles.StandardModel.AlgebraRealization.CovStandardModel public import Physlib.Particles.StandardModel.AlgebraRealization.CovariantDeriv public import Physlib.Particles.StandardModel.AlgebraRealization.MassWeight.Basic @@ -266,6 +268,26 @@ public import Physlib.Particles.StandardModel.AnomalyCancellation.NoGrav.One.Lem public import Physlib.Particles.StandardModel.AnomalyCancellation.NoGrav.One.LinearParameterization public import Physlib.Particles.StandardModel.AnomalyCancellation.Permutations public import Physlib.Particles.StandardModel.Basic +public import Physlib.Particles.StandardModel.CovAlgebraRealization.Basic +public import Physlib.Particles.StandardModel.CovAlgebraRealization.FermionGaugeSector.Basic +public import Physlib.Particles.StandardModel.CovAlgebraRealization.FermionGaugeSector.MassWeight +public import Physlib.Particles.StandardModel.CovAlgebraRealization.GaugeHiggsSector.Basic +public import Physlib.Particles.StandardModel.CovAlgebraRealization.GaugeHiggsSector.MassWeight +public import Physlib.Particles.StandardModel.CovAlgebraRealization.Generators +public import Physlib.Particles.StandardModel.CovAlgebraRealization.MassWeight +public import Physlib.Particles.StandardModel.CovAlgebraRealization.MassWeight.Filtration +public import Physlib.Particles.StandardModel.CovAlgebraRealization.MassWeight.Invariants +public import Physlib.Particles.StandardModel.CovAlgebraRealization.MixedSector.Basic +public import Physlib.Particles.StandardModel.CovAlgebraRealization.Sectors +public import Physlib.Particles.StandardModel.CovAlgebraRealization.YukawaSector.Basic +public import Physlib.Particles.StandardModel.CovAlgebraRealization.YukawaSector.Families.BarHiggs +public import Physlib.Particles.StandardModel.CovAlgebraRealization.YukawaSector.Families.Higgs +public import Physlib.Particles.StandardModel.CovAlgebraRealization.YukawaSector.Families.Symbols +public import Physlib.Particles.StandardModel.CovAlgebraRealization.YukawaSector.GaugeWeightDecomposition +public import Physlib.Particles.StandardModel.CovAlgebraRealization.YukawaSector.MassDimEight +public import Physlib.Particles.StandardModel.CovAlgebraRealization.YukawaSector.MassDimLTEight +public import Physlib.Particles.StandardModel.CovJetAlgebra.Basic +public import Physlib.Particles.StandardModel.CovJetAlgebra.Sectors public import Physlib.Particles.StandardModel.Fermions.DownSinglet.Basic public import Physlib.Particles.StandardModel.Fermions.DownSinglet.GaugeAlgebraAction public import Physlib.Particles.StandardModel.Fermions.JetAlgebra.Basic @@ -318,24 +340,6 @@ 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.FermionGaugeSector.MassWeight -public import Physlib.Particles.StandardModel.IsCovStandardModel.GaugeHiggsSector.Basic -public import Physlib.Particles.StandardModel.IsCovStandardModel.GaugeHiggsSector.MassWeight -public import Physlib.Particles.StandardModel.IsCovStandardModel.Generators -public import Physlib.Particles.StandardModel.IsCovStandardModel.MassWeight -public import Physlib.Particles.StandardModel.IsCovStandardModel.MassWeight.Filtration -public import Physlib.Particles.StandardModel.IsCovStandardModel.MassWeight.Invariants -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.IsCovStandardModel.YukawaSector.Families.BarHiggs -public import Physlib.Particles.StandardModel.IsCovStandardModel.YukawaSector.Families.Higgs -public import Physlib.Particles.StandardModel.IsCovStandardModel.YukawaSector.Families.Symbols -public import Physlib.Particles.StandardModel.IsCovStandardModel.YukawaSector.GaugeWeightDecomposition -public import Physlib.Particles.StandardModel.IsCovStandardModel.YukawaSector.MassDimEight -public import Physlib.Particles.StandardModel.IsCovStandardModel.YukawaSector.MassDimLTEight public import Physlib.Particles.StandardModel.IsFermionSector.Basic public import Physlib.Particles.StandardModel.IsFermionSector.Components public import Physlib.Particles.StandardModel.IsFermionSector.DerivSubmodule.BoostWeightDecomposition diff --git a/Physlib/Particles/StandardModel/AlgebraRealization/CovFieldAlgebra/Basic.lean b/Physlib/Particles/StandardModel/AlgebraRealization/CovFieldAlgebra/Basic.lean index e2be58e2a..cb990295c 100644 --- a/Physlib/Particles/StandardModel/AlgebraRealization/CovFieldAlgebra/Basic.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/CovFieldAlgebra/Basic.lean @@ -15,20 +15,28 @@ symbols and are fixed by pure gauge jets, so the abstract classification `IsGaugeField.invariant_mem_adjoin_fieldStrength` applies to the field algebra written in terms of the covariant towers: a jet-gauge invariant is a polynomial in the covariant towers of the field strength and of the matter fields, gauge invariance having eliminated -the bare gauge-field symbols. `covFieldAlgebra` names the algebra those covariant towers +the bare gauge-field symbols. `covAlgebra` names the algebra those covariant towers generate, and `invariant_mem_adjoin_covDeriv` is the classification. +Section A gives the covariant towers the ordered-tuple indexing the covariant form of the +theory uses, assembles the generating set and the subalgebra, and reconciles that indexing +with the list indexing the classification theorem produces. + ## ii. Key results -- `AlgebraRealization.covFieldAlgebra` : the algebra generated by the covariant derivative +- `AlgebraRealization.covF` : the covariant derivatives of the field strength, in the + ordered-tuple indexing. +- `AlgebraRealization.covAlgebra` : the algebra generated by the covariant derivative of the field strength and the covariant derivatives of the ten matter species. - `AlgebraRealization.invariant_mem_adjoin_covDeriv` : the classification of jet-gauge invariants of the field algebra: a `repJet`-invariant element of the field algebra lies - in `covFieldAlgebra`. + in `covAlgebra`. ## iii. Table of contents -- A. The covariant field algebra and its classification of gauge invariants +- A. The covariant generators and the covariant algebra + - A.1. The generating set indexed by lists +- B. The classification of gauge invariants -/ @@ -53,46 +61,102 @@ variable {B : Type} [Ring B] [Algebra ℂ B] /-! -## A. The covariant field algebra and its classification of gauge invariants +## A. The covariant generators and the covariant algebra + +The covariant towers of section H and section K of `AlgebraRealization.CovariantDeriv` are +indexed there by multisets (for the field strength, by lists) of directions. +The covariant form of the theory 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 the covariant form of the theory. -/ +noncomputable def covF (h : AlgebraRealization B repJet repLorentz massWeightPoly) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) + (μ ν : 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 : AlgebraRealization B repJet repLorentz massWeightPoly) {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 : AlgebraRealization B repJet repLorentz massWeightPoly) : 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 `CovAlgebraRealization.fieldAlgebra` of the covariant form of the theory. -/ +def covAlgebra (h : AlgebraRealization B repJet repLorentz massWeightPoly) : Subalgebra ℂ B := + Algebra.adjoin ℂ h.covGenerators + +/-! + +### A.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 field algebra: the algebra generated by the covariant derivative of the - field strength and the covariant derivatives of the ten matter species. It is the - covariant analogue of `fieldAlgebra`, and the target of the classification of jet-gauge - invariants, `invariant_mem_adjoin_covDeriv`. -/ -noncomputable def covFieldAlgebra : Subalgebra ℂ B := - 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))) +/-- The covariant generating set, with the field-strength tower indexed by lists rather + than by ordered tuples. -/ +def covGeneratorsList (h : AlgebraRealization B repJet repLorentz massWeightPoly) : 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] + +/-! + +## B. The classification of gauge invariants + +-/ /-- The classification of gauge invariants of the field algebra: a `repJet`-invariant - element of the field algebra lies in the covariant field algebra — it is a polynomial in + element of the field algebra lies in the covariant subalgebra — it is a polynomial in the covariant derivatives of the field strength and the covariant derivatives of the matter fields. -/ theorem invariant_mem_adjoin_covDeriv {x : B} (hx : x ∈ h.fieldAlgebra) (hinv : ∀ U : JetGaugeGroupI, repJet U x = x) : - x ∈ h.covFieldAlgebra := by - show 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))) + x ∈ h.covAlgebra := by + rw [covAlgebra, covGenerators_eq_covGeneratorsList, covGeneratorsList] -- the matter towers commute with the gauge-field symbols have hcS : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (ψ : Module.Dual ℝ GaugeAlgebra), ∀ y ∈ h.matterTowers, Commute y (h.A p μ ψ) := by diff --git a/Physlib/Particles/StandardModel/AlgebraRealization/CovStandardModel.lean b/Physlib/Particles/StandardModel/AlgebraRealization/CovStandardModel.lean index 9fea3c3f4..f20208098 100644 --- a/Physlib/Particles/StandardModel/AlgebraRealization/CovStandardModel.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/CovStandardModel.lean @@ -4,7 +4,6 @@ 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.AlgebraRealization.CovFieldAlgebra.Basic public import Physlib.Particles.StandardModel.AlgebraRealization.MassWeight.Basic /-! @@ -15,21 +14,22 @@ public import Physlib.Particles.StandardModel.AlgebraRealization.MassWeight.Basi `AlgebraRealization` 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 +the base point. The covariant form of the theory 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 `AlgebraRealization` in the -ordered-tuple indexing used by `IsCovStandardModel`, assembles the subalgebra they +ordered-tuple indexing used by the covariant form of the theory, 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 second half establishes the laws those towers satisfy, which +`CovAlgebraRealization` collects into the covariant form of the theory. 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 @@ -39,13 +39,12 @@ are section L of [`CovariantDeriv.lean`](CovariantDeriv.lean): each follows from Lorentz law `AlgebraRealization` 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. +it. So every one of those laws is unconditional. ## ii. Key results - `AlgebraRealization.repGlobal` : the global gauge action, the jet action restricted along the constant jets. -- `AlgebraRealization.covAlgebra` : the subalgebra generated by the covariant towers. - `AlgebraRealization.repJet_eq_of_mem_covAlgebra_of_mem_truncationKer_zero` : pure gauge jets fix the covariant subalgebra pointwise. - `AlgebraRealization.forall_repJet_eq_iff` : the reduction theorem for the gauge group. @@ -63,13 +62,10 @@ it. So `isCovStandardModel` is unconditional. `AlgebraRealization.anticommute_covDerivIter_covDerivIter` : the statistics of a pair of towers is the statistics of the pair of bare families. - `AlgebraRealization.repLorentz_covF` : the Lorentz law of the field-strength tower. -- `AlgebraRealization.isCovStandardModel` : the covariant form of the theory. ## 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 @@ -80,7 +76,7 @@ it. So `isCovStandardModel` is unconditional. - 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 +- K. The Lorentz law of the field-strength tower ## iv. References @@ -89,8 +85,7 @@ The classification of jet-gauge invariants that section D consumes is [`CovFieldAlgebra/Basic.lean`](CovFieldAlgebra/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), +three sector structures are [`IsGaugeSector/Basic.lean`](../IsGaugeSector/Basic.lean), [`IsHiggsSector/Basic.lean`](../IsHiggsSector/Basic.lean) and [`IsFermionSector/Basic.lean`](../IsFermionSector/Basic.lean). @@ -134,89 +129,6 @@ lemma repGlobal_apply (repJet : Representation ℂ JetGaugeGroupI B) (g : GaugeG /-! -## B. The covariant generators and the covariant algebra - -The covariant towers of section H and section K of `AlgebraRealization.CovariantDeriv` 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 : AlgebraRealization B repJet repLorentz massWeightPoly) {n : ℕ} - (l : Fin n → (Fin 1 ⊕ Fin 3)) - (μ ν : 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 : AlgebraRealization B repJet repLorentz massWeightPoly) {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 : AlgebraRealization B repJet repLorentz massWeightPoly) : 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 : AlgebraRealization B repJet repLorentz massWeightPoly) : 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 : AlgebraRealization B repJet repLorentz massWeightPoly) : 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 M of `AlgebraRealization.CovariantDeriv` shows that a gauge jet with trivial @@ -307,9 +219,7 @@ theorem forall_repJet_eq_iff {x : B} (hx : x ∈ h.fieldAlgebra) : 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 + exact ⟨h.invariant_mem_adjoin_covDeriv hx hinv, fun g => hinv _⟩ · rintro ⟨hmem, hglob⟩ U have hU := JetGaugeGroupI.eq_truncationProjZero_mul_ofConstant U calc repJet U x @@ -537,7 +447,7 @@ matter symbol. Every covariant generator is a polynomial in those symbols, so th 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. +`IsGaugeSector` and the cross-sector `F_comm_*` rules at once. -/ @@ -670,7 +580,7 @@ lemma covF_commute_of_mem_covAlgebra {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) ## G. Multiplicativity of the global gauge and Lorentz actions -`IsCovStandardModel` takes the multiplicativity of the two actions on `B` as explicit +The sector structures take 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`. @@ -1236,7 +1146,7 @@ lemma anticommute_covDerivIter_covDerivIter {V W : Type} [AddCommGroup V] [Modul 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. +commutation obligations of the three sector structures. -/ @@ -2279,10 +2189,9 @@ lemma covBarE_anticomm_covBarE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 /-! -## K. The covariant form of the theory +## K. The Lorentz law of the field-strength tower -Everything above assembles into an `IsCovStandardModel` for the covariant towers, -acted on by the global gauge group and the Lorentz group. The Lorentz laws of the +The Lorentz laws of the matter towers are section L of [`CovariantDeriv.lean`](CovariantDeriv.lean); the one for the field-strength tower is `repLorentz_covF` just below, which is `IsGaugeField.repLorentz_iteratedCovDerivAdjoint_fieldStrength` read in the @@ -2304,161 +2213,6 @@ lemma repLorentz_covF (Λ : SL(2,ℂ)) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3 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 - `AlgebraRealization`: the Lorentz laws of the matter towers are section L of - `CovariantDeriv.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 μ ν) - (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 := h.repLorentz_covDerivH - repLorentz_barH := h.repLorentz_covDerivBarH } - isGaugeSector := - { repGauge_F := fun g {_n} l μ ν φ => h.repGlobal_covF g l μ ν φ - 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' μ ν μ' ν' ψ ψ' - 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 φ - 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 := 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 φ - 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 := 2454-2455) "Below this I would be expecting - the explicit form of the invariance lemmas, relating - invariance of the algebra generaged by `AlgebraRealization` to the - (global) invariance of the algebra generated by `IsCovStandardModel`." - end AlgebraRealization end StandardModel diff --git a/Physlib/Particles/StandardModel/AlgebraRealization/MassWeight/Filtration.lean b/Physlib/Particles/StandardModel/AlgebraRealization/MassWeight/Filtration.lean index fedc5f55c..10f0057c4 100644 --- a/Physlib/Particles/StandardModel/AlgebraRealization/MassWeight/Filtration.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/MassWeight/Filtration.lean @@ -5,15 +5,15 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.IsCovStandardModel.MassWeight.Filtration +public import Physlib.Particles.StandardModel.CovAlgebraRealization.MassWeight.Filtration public import Physlib.Particles.StandardModel.AlgebraRealization.CovStandardModel /-! # The mass-weight filtration of the jet Standard Model `AlgebraRealization` is written in the bare symbols, on which the whole jet gauge group acts; -`IsCovStandardModel` is written in the covariant towers, on which only the global gauge +`CovAlgebraRealization` is written in the covariant towers, on which only the global gauge group acts. [`CovStandardModel.lean`](../CovStandardModel.lean) shows that these are one -theory seen twice: `isCovStandardModel` builds the covariant form on the same algebra with +theory seen twice: `toCovAlgebraRealization` builds the covariant form on the same algebra with the same `massWeightPoly`, unconditionally, and `forall_repJet_and_repLorentz_eq_iff` says that inside the field algebra jet-gauge invariance is membership of the covariant subalgebra together with global-gauge invariance. This file carries the classification of @@ -82,7 +82,7 @@ variable {B : Type} [Ring B] [Algebra ℂ B] /-- All elements of the field algebra of mass weight exactly `n`: the intersection of the algebra generated by the bare symbols with the part on which `massWeightPoly` is the monomial `X ^ n`. This is the jet-form counterpart of - `IsCovStandardModel.massWeightSubmodule`. -/ + `CovAlgebraRealization.massWeightSubmodule`. -/ noncomputable def massWeightSubmodule (h : AlgebraRealization B repJet repLorentz massWeightPoly) (n : ℕ) : Submodule ℂ B := h.fieldAlgebra.toSubmodule @@ -166,39 +166,49 @@ lemma covAlgebra_toSubmodule_le_fieldAlgebra : include h in /-- The field algebra of the covariant form of the theory is the covariant subalgebra: the two are generated by the same set of covariant towers. -/ -lemma isCovStandardModel_fieldAlgebra : - h.isCovStandardModel.fieldAlgebra = h.covAlgebra := rfl +lemma toCovAlgebraRealization_fieldAlgebra : + h.toCovAlgebraRealization.fieldAlgebra = h.covAlgebra := by + rw [CovAlgebraRealization.fieldAlgebra, covAlgebra, covGenerators] + simp only [h.toCovAlgebraRealization_covF, h.toCovAlgebraRealization_covH, + h.toCovAlgebraRealization_covBarH, h.toCovAlgebraRealization_covD, + h.toCovAlgebraRealization_covBarD, h.toCovAlgebraRealization_covU, + h.toCovAlgebraRealization_covBarU, h.toCovAlgebraRealization_covQ, + h.toCovAlgebraRealization_covBarQ, h.toCovAlgebraRealization_covL, + h.toCovAlgebraRealization_covBarL, h.toCovAlgebraRealization_covE, + h.toCovAlgebraRealization_covBarE] include h in /-- A covariant weight piece is a weight piece that happens to be covariant: the two submodules cut the same kernel of `massWeightPoly` out of the two algebras, and one algebra sits inside the other. -/ lemma covMassWeightSubmodule_eq (w : ℕ) : - h.isCovStandardModel.massWeightSubmodule w + h.toCovAlgebraRealization.massWeightSubmodule w = h.massWeightSubmodule w ⊓ h.covAlgebra.toSubmodule := by - rw [IsCovStandardModel.massWeightSubmodule, massWeightSubmodule, inf_right_comm, + rw [CovAlgebraRealization.massWeightSubmodule, massWeightSubmodule, + h.toCovAlgebraRealization_fieldAlgebra, inf_right_comm, inf_eq_right.2 h.covAlgebra_toSubmodule_le_fieldAlgebra] - rfl include h in /-- A covariant weight piece lies in the weight piece of the field algebra. -/ lemma covMassWeightSubmodule_le (w : ℕ) : - h.isCovStandardModel.massWeightSubmodule w ≤ h.massWeightSubmodule w := by + h.toCovAlgebraRealization.massWeightSubmodule w ≤ h.massWeightSubmodule w := by rw [h.covMassWeightSubmodule_eq] exact inf_le_left include h in /-- The covariant filtration lies in the filtration of the field algebra. -/ lemma covMassWeightSubmoduleLE_le (w : ℕ) : - h.isCovStandardModel.massWeightSubmoduleLE w ≤ h.massWeightSubmoduleLE w := - h.isCovStandardModel.massWeightSubmoduleLE_le fun k hk => + h.toCovAlgebraRealization.massWeightSubmoduleLE w ≤ h.massWeightSubmoduleLE w := + h.toCovAlgebraRealization.massWeightSubmoduleLE_le fun k hk => (h.covMassWeightSubmodule_le k).trans (h.massWeightSubmodule_le_massWeightSubmoduleLE hk) include h in /-- The covariant filtration lies in the covariant subalgebra. -/ lemma covMassWeightSubmoduleLE_le_covAlgebra (w : ℕ) : - h.isCovStandardModel.massWeightSubmoduleLE w ≤ h.covAlgebra.toSubmodule := - h.isCovStandardModel.massWeightSubmoduleLE_le fun _ _ => inf_le_left + h.toCovAlgebraRealization.massWeightSubmoduleLE w ≤ h.covAlgebra.toSubmodule := by + refine h.toCovAlgebraRealization.massWeightSubmoduleLE_le fun k _ => ?_ + rw [CovAlgebraRealization.massWeightSubmodule, h.toCovAlgebraRealization_fieldAlgebra] + exact inf_le_left /-! @@ -235,13 +245,14 @@ include h in not leave the covariant algebra: on the covariant algebra the coefficient of `X ^ k` lands in the span of the covariant words of weight `k`. -/ lemma mem_covMassWeightSubmoduleLE {w : ℕ} {x : B} (hx : x ∈ h.massWeightSubmoduleLE w) - (hcov : x ∈ h.covAlgebra) : x ∈ h.isCovStandardModel.massWeightSubmoduleLE w := by + (hcov : x ∈ h.covAlgebra) : x ∈ h.toCovAlgebraRealization.massWeightSubmoduleLE w := by rw [h.eq_sum_coeff_massWeightPoly hx] refine Submodule.sum_mem _ fun k hk => ?_ - refine h.isCovStandardModel.massWeightSubmodule_le_massWeightSubmoduleLE + refine h.toCovAlgebraRealization.massWeightSubmodule_le_massWeightSubmoduleLE (Nat.lt_succ_iff.1 (Finset.mem_range.1 hk)) ?_ - rw [h.isCovStandardModel.massWeightSubmodule_eq_span] - exact h.isCovStandardModel.coeff_massWeightPoly_mem_span k hcov + rw [h.toCovAlgebraRealization.massWeightSubmodule_eq_span] + exact h.toCovAlgebraRealization.coeff_massWeightPoly_mem_span k + (h.toCovAlgebraRealization_fieldAlgebra ▸ hcov) /-! @@ -252,8 +263,8 @@ lemma mem_covMassWeightSubmoduleLE {w : ℕ} {x : B} (hx : x ∈ h.massWeightSub include h in /-- The span of the covariant filtration lies in the covariant subalgebra. -/ lemma covStandardModelSpanLE_le_covAlgebra (w : ℕ) : - h.isCovStandardModel.standardModelSpanLE w ≤ h.covAlgebra.toSubmodule := - (h.isCovStandardModel.standardModelSpanLE_le_massWeightSubmoduleLE w).trans + h.toCovAlgebraRealization.standardModelSpanLE w ≤ h.covAlgebra.toSubmodule := + (h.toCovAlgebraRealization.standardModelSpanLE_le_massWeightSubmoduleLE w).trans (h.covMassWeightSubmoduleLE_le_covAlgebra w) include h in @@ -261,11 +272,11 @@ include h in gauge group, not just the global one: it is covariant and globally invariant, which is what the reduction theorem asks for. -/ lemma forall_repJet_of_mem_covStandardModelSpanLE {w : ℕ} {y : B} - (hy : y ∈ h.isCovStandardModel.standardModelSpanLE w) (U : JetGaugeGroupI) : + (hy : y ∈ h.toCovAlgebraRealization.standardModelSpanLE w) (U : JetGaugeGroupI) : repJet U y = y := by have hycov : y ∈ h.covAlgebra := h.covStandardModelSpanLE_le_covAlgebra w hy exact (h.forall_repJet_eq_iff (h.covAlgebra_le_fieldAlgebra hycov)).2 - ⟨hycov, fun g => h.isCovStandardModel.repGauge_of_mem_standardModelSpanLE w g hy⟩ U + ⟨hycov, fun g => h.toCovAlgebraRealization.repGauge_of_mem_standardModelSpanLE w g hy⟩ U include h in /-- The classification of the Standard Model up to mass dimension four in its jet form: an @@ -285,7 +296,7 @@ theorem mem_massWeightSubmoduleLE_eight_sup_and_invariant_iff (S : Submodule ℂ ∧ ∀ Λ : SL(2,ℂ), repLorentz Λ x = x) ↔ ∃ y ∈ S, (∀ U : JetGaugeGroupI, repJet U y = y) ∧ (∀ Λ : SL(2,ℂ), repLorentz Λ y = y) - ∧ x - y ∈ h.isCovStandardModel.standardModelSpanLE 8 := by + ∧ x - y ∈ h.toCovAlgebraRealization.standardModelSpanLE 8 := by have hSglobal : ∀ g : GaugeGroupI, ∀ y ∈ S, repGlobal repJet g y ∈ S := fun g y hy => hS _ y hy constructor @@ -299,13 +310,13 @@ theorem mem_massWeightSubmoduleLE_eight_sup_and_invariant_iff (S : Submodule ℂ have hveq : v = x - s := by rw [← hvs, add_sub_cancel_right] rw [hveq] exact sub_mem hxcov (hScov hs) - have hxcovLE : x ∈ h.isCovStandardModel.massWeightSubmoduleLE 8 ⊔ S := by + have hxcovLE : x ∈ h.toCovAlgebraRealization.massWeightSubmoduleLE 8 ⊔ S := by rw [← hvs] exact Submodule.add_mem _ (Submodule.mem_sup_left (h.mem_covMassWeightSubmoduleLE hv hvcov)) (Submodule.mem_sup_right hs) obtain ⟨y, hyS, hyG, hyL, hxy⟩ := - (h.isCovStandardModel.mem_massWeightSubmoduleLE_eight_sup_and_gauge_lorentz_invariant_iff + (h.toCovAlgebraRealization.mem_massWeightSubmoduleLE_eight_sup_and_gauge_lorentz_invariant_iff S hSglobal hSL x).1 ⟨hxcovLE, hglob, hL⟩ exact ⟨y, hyS, fun U => (h.forall_repJet_eq_iff (h.covAlgebra_le_fieldAlgebra (hScov hyS))).2 ⟨hScov hyS, hyG⟩ U, hyL, hxy⟩ @@ -313,14 +324,14 @@ theorem mem_massWeightSubmoduleLE_eight_sup_and_invariant_iff (S : Submodule ℂ refine ⟨?_, fun U => ?_, fun Λ => ?_⟩ · have hsum : x - y + y ∈ h.massWeightSubmoduleLE 8 ⊔ S := Submodule.add_mem _ (Submodule.mem_sup_left (h.covMassWeightSubmoduleLE_le 8 - (h.isCovStandardModel.standardModelSpanLE_le_massWeightSubmoduleLE 8 hxy))) + (h.toCovAlgebraRealization.standardModelSpanLE_le_massWeightSubmoduleLE 8 hxy))) (Submodule.mem_sup_right hyS) simpa using hsum · have hstep : repJet U (x - y + y) = x - y + y := by rw [map_add, h.forall_repJet_of_mem_covStandardModelSpanLE hxy U, hyG U] simpa using hstep · have hstep : repLorentz Λ (x - y + y) = x - y + y := by - rw [map_add, h.isCovStandardModel.repLorentz_of_mem_standardModelSpanLE 8 Λ hxy, + rw [map_add, h.toCovAlgebraRealization.repLorentz_of_mem_standardModelSpanLE 8 Λ hxy, hyL Λ] simpa using hstep @@ -346,12 +357,12 @@ theorem mem_massWeightSubmoduleLE_eight_sup_and_invariant_iff_lagrangian (S : Su ∧ ∀ Λ : SL(2,ℂ), repLorentz Λ x = x) ↔ ∃ y ∈ S, (∀ U : JetGaugeGroupI, repJet U y = y) ∧ (∀ Λ : SL(2,ℂ), repLorentz Λ y = y) - ∧ x - y ∈ (1 : Submodule ℂ B) ⊔ (h.isCovStandardModel.isHiggsSector.dotSpan 0 0 - ⊔ (h.isCovStandardModel.isGaugeSector.lorentzContractionEightSpan - ⊔ h.isCovStandardModel.isHiggsSector.lorentzContractionEightSpan - ⊔ (h.isCovStandardModel.isFermionSector.kineticSpan - ⊔ h.isCovStandardModel.yukawaSpan))) := by - rw [← h.isCovStandardModel.standardModelSpanLE_eight] + ∧ x - y ∈ (1 : Submodule ℂ B) ⊔ (h.toCovAlgebraRealization.isHiggsSector.dotSpan 0 0 + ⊔ (h.toCovAlgebraRealization.isGaugeSector.lorentzContractionEightSpan + ⊔ h.toCovAlgebraRealization.isHiggsSector.lorentzContractionEightSpan + ⊔ (h.toCovAlgebraRealization.isFermionSector.kineticSpan + ⊔ h.toCovAlgebraRealization.yukawaSpan))) := by + rw [← h.toCovAlgebraRealization.standardModelSpanLE_eight] exact h.mem_massWeightSubmoduleLE_eight_sup_and_invariant_iff S hS hSL hScov x /-! @@ -373,7 +384,7 @@ include h in theorem mem_massWeightSubmoduleLE_eight_and_invariant_iff (x : B) : (x ∈ h.massWeightSubmoduleLE 8 ∧ (∀ U : JetGaugeGroupI, repJet U x = x) ∧ ∀ Λ : SL(2,ℂ), repLorentz Λ x = x) - ↔ x ∈ h.isCovStandardModel.standardModelSpanLE 8 := by + ↔ x ∈ h.toCovAlgebraRealization.standardModelSpanLE 8 := by have key := h.mem_massWeightSubmoduleLE_eight_sup_and_invariant_iff ⊥ (fun U y hy => by rw [Submodule.mem_bot] at hy; simp [hy]) (fun Λ y hy => by rw [Submodule.mem_bot] at hy; simp [hy]) bot_le x @@ -393,12 +404,12 @@ include h in theorem mem_massWeightSubmoduleLE_eight_and_invariant_iff_lagrangian (x : B) : (x ∈ h.massWeightSubmoduleLE 8 ∧ (∀ U : JetGaugeGroupI, repJet U x = x) ∧ ∀ Λ : SL(2,ℂ), repLorentz Λ x = x) - ↔ x ∈ (1 : Submodule ℂ B) ⊔ (h.isCovStandardModel.isHiggsSector.dotSpan 0 0 - ⊔ (h.isCovStandardModel.isGaugeSector.lorentzContractionEightSpan - ⊔ h.isCovStandardModel.isHiggsSector.lorentzContractionEightSpan - ⊔ (h.isCovStandardModel.isFermionSector.kineticSpan - ⊔ h.isCovStandardModel.yukawaSpan))) := by - rw [← h.isCovStandardModel.standardModelSpanLE_eight] + ↔ x ∈ (1 : Submodule ℂ B) ⊔ (h.toCovAlgebraRealization.isHiggsSector.dotSpan 0 0 + ⊔ (h.toCovAlgebraRealization.isGaugeSector.lorentzContractionEightSpan + ⊔ h.toCovAlgebraRealization.isHiggsSector.lorentzContractionEightSpan + ⊔ (h.toCovAlgebraRealization.isFermionSector.kineticSpan + ⊔ h.toCovAlgebraRealization.yukawaSpan))) := by + rw [← h.toCovAlgebraRealization.standardModelSpanLE_eight] exact h.mem_massWeightSubmoduleLE_eight_and_invariant_iff x end AlgebraRealization diff --git a/Physlib/Particles/StandardModel/CovAlgebraRealization/Basic.lean b/Physlib/Particles/StandardModel/CovAlgebraRealization/Basic.lean index d76d295c1..99e43766f 100644 --- a/Physlib/Particles/StandardModel/CovAlgebraRealization/Basic.lean +++ b/Physlib/Particles/StandardModel/CovAlgebraRealization/Basic.lean @@ -4,21 +4,63 @@ Released under Apache 2.0 license as described in the file LICENSE. Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.AlgebraRealization.CovStandardModel +public import Physlib.Particles.StandardModel.CovJetAlgebra.Sectors /-! -# The covariant jet algebra +# The covariant algebra valued Standard Model ## i. Overview -Placeholder. +An algebra `B` carries a covariant Standard Model when the covariant fields of the Standard +Model, and every polynomial expression in them, sit inside it compatibly with the global +gauge action, the Lorentz action and the mass-weight grading. The covariant jet algebra +`StandardModel.CovJetAlgebra` is the universal object with those fields, so the statement is +a single one: an algebra map `CovJetAlgebra →ₐ[ℂ] B`, equivariant for the global gauge group +and the Lorentz group and compatible with `massWeightPoly`. That is the structure +`CovAlgebraRealization`, together with the two demands that the group actions be +multiplicative on the whole of `B` and not merely on the image of the map. + +It stands to the covariant theory exactly as `AlgebraRealization` stands to the structure of +bare derivative symbols it replaced. The thirteen covariant towers are derived rather than +given — section B — and every law they satisfy is the covariant jet algebra's own law pushed +along the map. Section C does that transport once for each shape a law takes, and section D +assembles them: the three sectors — gauge, Higgs and fermion — and the commutation of towers +of different sectors, which is what the classification of invariants is written in terms of. + +Section E closes the circle in the other direction: a Standard Model in the bare symbols +carries a covariant one, by restricting its defining algebra map to the covariant +subalgebra. + +A `CovAlgebraRealization` inherits every relation the covariant towers satisfy inside the +jet algebra — the Ricci identity relating the antisymmetric part of a second covariant +derivative to the field strength, for one. It is therefore strictly stronger than a bare +list of the sector laws. ## ii. Key results -Placeholder. +- `StandardModel.CovAlgebraRealization` : an algebra is a covariant Standard Model when it + receives an equivariant algebra map from the covariant jet algebra. +- `CovAlgebraRealization.id` : the covariant jet algebra is a covariant Standard Model, + along the identity algebra map. +- `CovAlgebraRealization.F`, `CovAlgebraRealization.H` and their companions : the thirteen + covariant towers of a covariant Standard Model. +- `CovAlgebraRealization.isHiggsSector`, `CovAlgebraRealization.isGaugeSector`, + `CovAlgebraRealization.isFermionSector` : the three sectors of those towers. +- `CovAlgebraRealization.F_comm_H` and its companions : the towers of different sectors + commute. +- `AlgebraRealization.toCovAlgebraRealization` : every Standard Model carries a covariant + Standard Model. ## iii. Table of contents -- A. The covariant subalgebra is the covariant field algebra +- A. The identity realization +- B. The covariant fields of a covariant Standard Model +- C. Transporting a law along the defining map +- D. The sectors, the statistics and the field algebra + - D.1. The cross-sector commutation rules + - D.2. The field algebra +- E. Naturality of the covariant derivative +- F. Every Standard Model is a covariant Standard Model + - F.1. The covariant towers agree -/ @@ -33,476 +75,1165 @@ namespace StandardModel open TensorProduct Matrix MatrixGroups Lorentz -namespace AlgebraRealization - -variable {B : Type} [Ring B] [Algebra ℂ B] - {repJet : Representation ℂ JetGaugeGroupI B} - {repLorentz : Representation ℂ SL(2,ℂ) B} - {massWeightPoly : B →ₐ[ℂ] Polynomial B} - (h : AlgebraRealization B repJet repLorentz massWeightPoly) +/-- The algebra `B`, with a gauge action, a Lorentz action and a mass-weight grading, is a + covariant Standard Model when it receives an algebra map from the covariant jet algebra of + the Standard Model which is equivariant for both actions and compatible with the grading. + The covariant fields of the Standard Model then sit inside `B` as the images of the + covariant jet algebra's own, and every law they satisfy there is the covariant jet + algebra's own law pushed along the map. It is the covariant counterpart of + `AlgebraRealization`: where that asks for an equivariant algebra map out of `JetAlgebra`, + on which the whole jet gauge group acts, this asks for one out of `CovJetAlgebra`, on + which only the global gauge group acts. The last two fields are not consequences of the + first four: an equivariant map forces the two actions to be multiplicative only on its + image, whereas the sector structures demand them multiplicative on the whole of `B`. -/ +structure CovAlgebraRealization (B : Type) [Ring B] [Algebra ℂ B] + (repGauge : Representation ℂ GaugeGroupI B) + (repLorentz : Representation ℂ SL(2,ℂ) B) + (massWeightPoly : B →ₐ[ℂ] Polynomial B) where + /-- The algebra map out of the covariant jet algebra of the Standard Model: it is what places + the covariant fields of the Standard Model, and every polynomial expression in them, + inside `B`. -/ + toAlgHom : CovJetAlgebra →ₐ[ℂ] B + /-- The map is equivariant for the global gauge group: the gauge action on `B` restricts along + it to the covariant jet algebra's own. -/ + map_repGauge : ∀ (g : GaugeGroupI) (x : CovJetAlgebra), + toAlgHom (CovJetAlgebra.repGaugeGroupI g x) = repGauge g (toAlgHom x) + /-- The map is equivariant for the Lorentz group: the Lorentz action on `B` restricts along it + to the covariant jet algebra's own. -/ + map_repLorentz : ∀ (Λ : SL(2,ℂ)) (x : CovJetAlgebra), + toAlgHom (CovJetAlgebra.repLorentzGroup Λ x) = repLorentz Λ (toAlgHom x) + /-- The map carries the mass-weight grading of the covariant jet algebra to that of `B`: the + mass-weight polynomial of an image is the image of the mass-weight polynomial. -/ + map_massWeight : ∀ x : CovJetAlgebra, massWeightPoly (toAlgHom x) + = Polynomial.mapAlgHom toAlgHom (CovJetAlgebra.massWeightPoly x) + /-- The gauge action preserves products on the whole of `B`, not merely on the image of the + covariant jet algebra: gauge transformations act by algebra endomorphisms. -/ + repGauge_mul : ∀ (g : GaugeGroupI) (b₁ b₂ : B), + repGauge g (b₁ * b₂) = repGauge g b₁ * repGauge g b₂ + /-- 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₂ + +namespace CovAlgebraRealization /-! -## A. The covariant subalgebra is the covariant field algebra - --/ - -/-- The covariant field algebra of `CovFieldAlgebra.Basic` and the covariant subalgebra of - `CovStandardModel` are the same subalgebra: their generating sets are the two indexings - of the covariant towers, which agree. -/ -lemma covFieldAlgebra_eq_covAlgebra : h.covFieldAlgebra = h.covAlgebra := by - rw [covAlgebra, covGenerators_eq_covGeneratorsList] - rfl - -/-! +## A. The identity realization -### A.1. The covariant towers lie in the covariant subalgebra +The covariant jet algebra of the Standard Model is a covariant Standard Model along the +identity algebra map, since `CovAlgebraRealization` asks precisely for an equivariant +algebra map out of it. The four compatibility laws hold by definition, and the two +multiplicativity laws are the ones the global gauge action and the Lorentz action were +shown to satisfy when they were built. -/ -/-- The field-strength tower lies in the covariant subalgebra. -/ -lemma covF_mem_covAlgebra {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ GaugeAlgebra) : h.covF l μ ν φ ∈ h.covAlgebra := - Algebra.subset_adjoin <| Or.inl <| Or.inl <| Set.mem_iUnion_of_mem n <| - Set.mem_iUnion_of_mem l <| Set.mem_iUnion_of_mem μ <| Set.mem_iUnion_of_mem ν <| ⟨φ, rfl⟩ - -/-- The Higgs tower lies in the covariant subalgebra. -/ -lemma covDerivH_mem_covAlgebra {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ HiggsVec) : h.covDerivH l φ ∈ h.covAlgebra := - Algebra.subset_adjoin <| Or.inl <| Or.inr <| Set.mem_iUnion_of_mem n <| - Set.mem_iUnion_of_mem l <| Or.inl ⟨φ, rfl⟩ - -/-- The conjugate Higgs tower lies in the covariant subalgebra. -/ -lemma covDerivBarH_mem_covAlgebra {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule HiggsVec)) : h.covDerivBarH l φ ∈ h.covAlgebra := - Algebra.subset_adjoin <| Or.inl <| Or.inr <| Set.mem_iUnion_of_mem n <| - Set.mem_iUnion_of_mem l <| Or.inr ⟨φ, rfl⟩ - -/-- The down-type quark tower lies in the covariant subalgebra. -/ -lemma covDerivD_mem_covAlgebra (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ DownSinglet) : h.covDerivD i l φ ∈ h.covAlgebra := - Algebra.subset_adjoin <| Or.inr <| Set.mem_iUnion_of_mem i <| Set.mem_iUnion_of_mem n <| - Set.mem_iUnion_of_mem l <| Or.inl <| Or.inl <| Or.inl <| Or.inl <| Or.inl <| Or.inl <| - Or.inl <| Or.inl <| Or.inl <| ⟨φ, rfl⟩ - -/-- The conjugate down-type quark tower lies in the covariant subalgebra. -/ -lemma covDerivBarD_mem_covAlgebra (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule DownSinglet)) : h.covDerivBarD i l φ ∈ h.covAlgebra := - Algebra.subset_adjoin <| Or.inr <| Set.mem_iUnion_of_mem i <| Set.mem_iUnion_of_mem n <| - Set.mem_iUnion_of_mem l <| Or.inl <| Or.inl <| Or.inl <| Or.inl <| Or.inl <| Or.inl <| - Or.inl <| Or.inl <| Or.inr <| ⟨φ, rfl⟩ - -/-- The up-type quark tower lies in the covariant subalgebra. -/ -lemma covDerivU_mem_covAlgebra (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ UpSinglet) : h.covDerivU i l φ ∈ h.covAlgebra := - Algebra.subset_adjoin <| Or.inr <| Set.mem_iUnion_of_mem i <| Set.mem_iUnion_of_mem n <| - Set.mem_iUnion_of_mem l <| Or.inl <| Or.inl <| Or.inl <| Or.inl <| Or.inl <| Or.inl <| - Or.inl <| Or.inr <| ⟨φ, rfl⟩ - -/-- The conjugate up-type quark tower lies in the covariant subalgebra. -/ -lemma covDerivBarU_mem_covAlgebra (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule UpSinglet)) : h.covDerivBarU i l φ ∈ h.covAlgebra := - Algebra.subset_adjoin <| Or.inr <| Set.mem_iUnion_of_mem i <| Set.mem_iUnion_of_mem n <| - Set.mem_iUnion_of_mem l <| Or.inl <| Or.inl <| Or.inl <| Or.inl <| Or.inl <| Or.inl <| - Or.inr <| ⟨φ, rfl⟩ - -/-- The quark doublet tower lies in the covariant subalgebra. -/ -lemma covDerivQ_mem_covAlgebra (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ QuarkDoublet) : h.covDerivQ i l φ ∈ h.covAlgebra := - Algebra.subset_adjoin <| Or.inr <| Set.mem_iUnion_of_mem i <| Set.mem_iUnion_of_mem n <| - Set.mem_iUnion_of_mem l <| Or.inl <| Or.inl <| Or.inl <| Or.inl <| Or.inl <| Or.inr <| - ⟨φ, rfl⟩ - -/-- The conjugate quark doublet tower lies in the covariant subalgebra. -/ -lemma covDerivBarQ_mem_covAlgebra (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) : h.covDerivBarQ i l φ ∈ h.covAlgebra := - Algebra.subset_adjoin <| Or.inr <| Set.mem_iUnion_of_mem i <| Set.mem_iUnion_of_mem n <| - Set.mem_iUnion_of_mem l <| Or.inl <| Or.inl <| Or.inl <| Or.inl <| Or.inr <| ⟨φ, rfl⟩ - -/-- The lepton doublet tower lies in the covariant subalgebra. -/ -lemma covDerivL_mem_covAlgebra (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ LeptonDoublet) : h.covDerivL i l φ ∈ h.covAlgebra := - Algebra.subset_adjoin <| Or.inr <| Set.mem_iUnion_of_mem i <| Set.mem_iUnion_of_mem n <| - Set.mem_iUnion_of_mem l <| Or.inl <| Or.inl <| Or.inl <| Or.inr <| ⟨φ, rfl⟩ - -/-- The conjugate lepton doublet tower lies in the covariant subalgebra. -/ -lemma covDerivBarL_mem_covAlgebra (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule LeptonDoublet)) : h.covDerivBarL i l φ ∈ h.covAlgebra := - Algebra.subset_adjoin <| Or.inr <| Set.mem_iUnion_of_mem i <| Set.mem_iUnion_of_mem n <| - Set.mem_iUnion_of_mem l <| Or.inl <| Or.inl <| Or.inr <| ⟨φ, rfl⟩ - -/-- The charged-lepton singlet tower lies in the covariant subalgebra. -/ -lemma covDerivE_mem_covAlgebra (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ LeptonSinglet) : h.covDerivE i l φ ∈ h.covAlgebra := - Algebra.subset_adjoin <| Or.inr <| Set.mem_iUnion_of_mem i <| Set.mem_iUnion_of_mem n <| - Set.mem_iUnion_of_mem l <| Or.inl <| Or.inr <| ⟨φ, rfl⟩ - -/-- The conjugate charged-lepton singlet tower lies in the covariant subalgebra. -/ -lemma covDerivBarE_mem_covAlgebra (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule LeptonSinglet)) : h.covDerivBarE i l φ ∈ h.covAlgebra := - Algebra.subset_adjoin <| Or.inr <| Set.mem_iUnion_of_mem i <| Set.mem_iUnion_of_mem n <| - Set.mem_iUnion_of_mem l <| Or.inr <| ⟨φ, rfl⟩ +/-- The covariant jet algebra of the Standard Model is a covariant Standard Model: it is one + along the identity algebra map. -/ +noncomputable def id : CovAlgebraRealization CovJetAlgebra CovJetAlgebra.repGaugeGroupI + CovJetAlgebra.repLorentzGroup CovJetAlgebra.massWeightPoly where + toAlgHom := AlgHom.id ℂ CovJetAlgebra + map_repGauge _ _ := rfl + map_repLorentz _ _ := rfl + map_massWeight x := by + simp [Polynomial.mapAlgHom] + repGauge_mul := CovJetAlgebra.repGaugeGroupI_mul + repLorentz_mul := CovJetAlgebra.repLorentzGroup_mul +variable {B : Type} [Ring B] [Algebra ℂ B] + {repGauge : Representation ℂ GaugeGroupI B} + {repLorentz : Representation ℂ SL(2,ℂ) B} + {massWeightPoly : B →ₐ[ℂ] Polynomial B} + (k : CovAlgebraRealization B repGauge repLorentz massWeightPoly) /-! -## B. The covariant subalgebra is closed under the actions +## B. The covariant fields of a covariant Standard Model -The global gauge action, the Lorentz action and the mass-weight polynomial all carry a -covariant tower to a combination of covariant towers, and each is multiplicative, so each -carries the whole covariant subalgebra into itself. Those three closure facts are what let -the covariant subalgebra be regarded as an algebra with a gauge action, a Lorentz action -and a mass-weight grading of its own. +The thirteen covariant towers the theory is written in — the field strength, the Higgs +field and its conjugate, and the five fermion species in three generations with their +conjugates, each with all of its covariant derivatives — are not data of the structure. +They are the corresponding towers of the covariant jet algebra, carried into `B` along the +defining algebra map. The field-strength tower is real-linear in its value index, so the +map is restricted to `ℝ` there. -/ -include h in -/-- A property that holds of every covariant tower holds of every covariant generator: - the case analysis of the generating set, done once. -/ -lemma covGenerators_induction {P : B → Prop} - (hF : ∀ {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ GaugeAlgebra), P (h.covF l μ ν φ)) - (hH : ∀ {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ HiggsVec), - P (h.covDerivH l φ)) - (hBarH : ∀ {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule HiggsVec)), - P (h.covDerivBarH l φ)) - (hD : ∀ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ DownSinglet), P (h.covDerivD i l φ)) - (hBarD : ∀ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule DownSinglet)), P (h.covDerivBarD i l φ)) - (hU : ∀ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ UpSinglet), P (h.covDerivU i l φ)) - (hBarU : ∀ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule UpSinglet)), P (h.covDerivBarU i l φ)) - (hQ : ∀ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ QuarkDoublet), P (h.covDerivQ i l φ)) - (hBarQ : ∀ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule QuarkDoublet)), P (h.covDerivBarQ i l φ)) - (hL : ∀ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ LeptonDoublet), P (h.covDerivL i l φ)) - (hBarL : ∀ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule LeptonDoublet)), P (h.covDerivBarL i l φ)) - (hE : ∀ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ LeptonSinglet), P (h.covDerivE i l φ)) - (hBarE : ∀ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule LeptonSinglet)), P (h.covDerivBarE i l φ)) - : ∀ x ∈ h.covGenerators, P x := by - rintro x hx - 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 hF l μ ν φ - · simp only [Set.mem_iUnion] at hx - obtain ⟨n, l, hx⟩ := hx - rcases hx with ⟨φ, rfl⟩ | ⟨φ, rfl⟩ - · exact hH l φ - · exact hBarH l φ - · 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 hD i l φ - · exact hBarD i l φ - · exact hU i l φ - · exact hBarU i l φ - · exact hQ i l φ - · exact hBarQ i l φ - · exact hL i l φ - · exact hBarL i l φ - · exact hE i l φ - · exact hBarE i l φ - - -include h in -/-- A unital multiplicative endomorphism of the algebra that carries the covariant - generators into the covariant subalgebra carries the whole subalgebra into itself. -/ -lemma mapsTo_covAlgebra {f : B →ₗ[ℂ] B} (hone : f 1 = 1) - (hmul : ∀ b₁ b₂ : B, f (b₁ * b₂) = f b₁ * f b₂) - (hgen : ∀ x ∈ h.covGenerators, f x ∈ h.covAlgebra) {x : B} (hx : x ∈ h.covAlgebra) : - f x ∈ h.covAlgebra := by - induction hx using Algebra.adjoin_induction with - | mem b hb => exact hgen b hb - | algebraMap c => - rw [Algebra.algebraMap_eq_smul_one, map_smul, hone] - exact Subalgebra.smul_mem _ (one_mem _) c - | add a b _ _ iha ihb => rw [map_add]; exact add_mem iha ihb - | mul a b _ _ iha ihb => rw [hmul]; exact mul_mem iha ihb - -include h in -/-- A Lorentz slot-mixing sum of covariant towers lies in the covariant subalgebra. -/ -lemma sum_smul_mem_covAlgebra {n : ℕ} {c : (Fin n → (Fin 1 ⊕ Fin 3)) → ℂ} - {G : (Fin n → (Fin 1 ⊕ Fin 3)) → B} (hG : ∀ p, G p ∈ h.covAlgebra) : - ∑ p : Fin n → (Fin 1 ⊕ Fin 3), c p • G p ∈ h.covAlgebra := - Subalgebra.sum_mem _ fun p _ => Subalgebra.smul_mem _ (hG p) _ +/-- The covariant derivatives `∇_l F_{μν}` of the field strength inside `B`. -/ +noncomputable def covF {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : + Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B := + k.toAlgHom.toLinearMap.restrictScalars ℝ ∘ₗ CovJetAlgebra.fieldStrength l μ ν + +/-- The covariant derivatives `∇_l H` of the Higgs field inside `B`. -/ +noncomputable def covH {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ HiggsVec →ₗ[ℂ] B := + k.toAlgHom.toLinearMap ∘ₗ CovJetAlgebra.higgsField l + +/-- The covariant derivatives `∇_l H̄` of the conjugate Higgs field inside `B`. -/ +noncomputable def covBarH {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (ConjModule HiggsVec) →ₗ[ℂ] B := + k.toAlgHom.toLinearMap ∘ₗ CovJetAlgebra.conjHiggsField l + +/-- The covariant derivatives of the `i`-th generation down-type quark singlet inside `B`. -/ +noncomputable def covD (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ DownSinglet →ₗ[ℂ] B := + k.toAlgHom.toLinearMap ∘ₗ CovJetAlgebra.downSingletField i l + +/-- The covariant derivatives of the `i`-th generation conjugate down-type quark singlet + inside `B`. -/ +noncomputable def covBarD (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (ConjModule DownSinglet) →ₗ[ℂ] B := + k.toAlgHom.toLinearMap ∘ₗ CovJetAlgebra.conjDownSingletField i l + +/-- The covariant derivatives of the `i`-th generation up-type quark singlet inside `B`. -/ +noncomputable def covU (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ UpSinglet →ₗ[ℂ] B := + k.toAlgHom.toLinearMap ∘ₗ CovJetAlgebra.upSingletField i l + +/-- The covariant derivatives of the `i`-th generation conjugate up-type quark singlet inside + `B`. -/ +noncomputable def covBarU (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (ConjModule UpSinglet) →ₗ[ℂ] B := + k.toAlgHom.toLinearMap ∘ₗ CovJetAlgebra.conjUpSingletField i l + +/-- The covariant derivatives of the `i`-th generation quark doublet inside `B`. -/ +noncomputable def covQ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ QuarkDoublet →ₗ[ℂ] B := + k.toAlgHom.toLinearMap ∘ₗ CovJetAlgebra.quarkDoubletField i l + +/-- The covariant derivatives of the `i`-th generation conjugate quark doublet inside `B`. -/ +noncomputable def covBarQ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (ConjModule QuarkDoublet) →ₗ[ℂ] B := + k.toAlgHom.toLinearMap ∘ₗ CovJetAlgebra.conjQuarkDoubletField i l + +/-- The covariant derivatives of the `i`-th generation lepton doublet inside `B`. -/ +noncomputable def covL (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ LeptonDoublet →ₗ[ℂ] B := + k.toAlgHom.toLinearMap ∘ₗ CovJetAlgebra.leptonDoubletField i l + +/-- The covariant derivatives of the `i`-th generation conjugate lepton doublet inside `B`. -/ +noncomputable def covBarL (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (ConjModule LeptonDoublet) →ₗ[ℂ] B := + k.toAlgHom.toLinearMap ∘ₗ CovJetAlgebra.conjLeptonDoubletField i l + +/-- The covariant derivatives of the `i`-th generation charged-lepton singlet inside `B`. -/ +noncomputable def covE (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ LeptonSinglet →ₗ[ℂ] B := + k.toAlgHom.toLinearMap ∘ₗ CovJetAlgebra.leptonSingletField i l + +/-- The covariant derivatives of the `i`-th generation conjugate charged-lepton singlet inside + `B`. -/ +noncomputable def covBarE (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (ConjModule LeptonSinglet) →ₗ[ℂ] B := + k.toAlgHom.toLinearMap ∘ₗ CovJetAlgebra.conjLeptonSingletField i l /-! -### B.1. The global gauge action +## C. Transporting a law along the defining map + +Every law of the covariant jet algebra becomes a law of `B` when pushed along the defining +algebra map. The transport is the same in each of the shapes the laws take, so each shape +is done once: a gauge law, a commutation law, an anticommutation law, an antisymmetry, a +mass-weight eigenvalue equation and a Lorentz slot-mixing sum. Commutation needs no lemma +of its own — it is `Commute.map`. -/ -include h in -/-- The global gauge action fixes the unit of the algebra. -/ -lemma repGlobal_one (g : GaugeGroupI) : repGlobal repJet g (1 : B) = 1 := by - simpa using h.repJet_algebraMap (JetGaugeGroupI.ofConstant g) 1 - -include h in -/-- The global gauge action preserves the covariant subalgebra: it carries each covariant - tower to a tower of the same shape at a rotated value index, and it is multiplicative. -/ -lemma repGlobal_mem_covAlgebra (g : GaugeGroupI) {x : B} (hx : x ∈ h.covAlgebra) : - repGlobal repJet g x ∈ h.covAlgebra := - h.mapsTo_covAlgebra (h.repGlobal_one g) (h.repJet_A.gauge_mul _) - (h.covGenerators_induction - (fun l μ ν φ => by - rw [h.repGlobal_covF]; exact h.covF_mem_covAlgebra _ _ _ _) - (fun l φ => by rw [h.repGlobal_covDerivH]; exact h.covDerivH_mem_covAlgebra _ _) - (fun l φ => by rw [h.repGlobal_covDerivBarH]; exact h.covDerivBarH_mem_covAlgebra _ _) - (fun i {_n} l φ => by - rw [h.repGlobal_covDerivD]; exact h.covDerivD_mem_covAlgebra _ _ _) - (fun i {_n} l φ => by - rw [h.repGlobal_covDerivBarD]; exact h.covDerivBarD_mem_covAlgebra _ _ _) - (fun i {_n} l φ => by - rw [h.repGlobal_covDerivU]; exact h.covDerivU_mem_covAlgebra _ _ _) - (fun i {_n} l φ => by - rw [h.repGlobal_covDerivBarU]; exact h.covDerivBarU_mem_covAlgebra _ _ _) - (fun i {_n} l φ => by - rw [h.repGlobal_covDerivQ]; exact h.covDerivQ_mem_covAlgebra _ _ _) - (fun i {_n} l φ => by - rw [h.repGlobal_covDerivBarQ]; exact h.covDerivBarQ_mem_covAlgebra _ _ _) - (fun i {_n} l φ => by - rw [h.repGlobal_covDerivL]; exact h.covDerivL_mem_covAlgebra _ _ _) - (fun i {_n} l φ => by - rw [h.repGlobal_covDerivBarL]; exact h.covDerivBarL_mem_covAlgebra _ _ _) - (fun i {_n} l φ => by - rw [h.repGlobal_covDerivE]; exact h.covDerivE_mem_covAlgebra _ _ _) - (fun i {_n} l φ => by - rw [h.repGlobal_covDerivBarE]; exact h.covDerivBarE_mem_covAlgebra _ _ _)) hx +/-- A gauge transformation law transports along the defining map: the map is equivariant for + the global gauge group. -/ +lemma map_repGauge_eq {g : GaugeGroupI} {x y : CovJetAlgebra} + (hxy : CovJetAlgebra.repGaugeGroupI g x = y) : + repGauge g (k.toAlgHom x) = k.toAlgHom y := by + rw [← k.map_repGauge, hxy] + +/-- An anticommutation law transports along the defining map: the map preserves products and + negation. -/ +lemma map_anticomm {x y : CovJetAlgebra} (hxy : x * y = -(y * x)) : + k.toAlgHom x * k.toAlgHom y = -(k.toAlgHom y * k.toAlgHom x) := by + rw [← map_mul, ← map_mul, hxy, map_neg] + +/-- An antisymmetry transports along the defining map: the map preserves negation. -/ +lemma map_neg_eq {x y : CovJetAlgebra} (hxy : x = -y) : + k.toAlgHom x = -k.toAlgHom y := by + rw [hxy, map_neg] + +/-- A mass-weight eigenvalue equation transports along the defining map: the map carries the + grading of the covariant jet algebra to that of `B`. -/ +lemma map_massWeight_monomial {n : ℕ} {x : CovJetAlgebra} + (hx : CovJetAlgebra.massWeightPoly x = Polynomial.monomial n x) : + massWeightPoly (k.toAlgHom x) = Polynomial.monomial n (k.toAlgHom x) := by + rw [k.map_massWeight, hx, Polynomial.mapAlgHom_monomial] + +/-- A Lorentz transformation law of a covariant tower transports along the defining map: the + slot mixing is a finite sum of scalar multiples, and the map is linear and equivariant. -/ +lemma map_lorentz {V : Type} [AddCommGroup V] [Module ℂ V] + {rep : Representation ℂ SL(2,ℂ) V} + {G : {n : ℕ} → (Fin n → (Fin 1 ⊕ Fin 3)) → Module.Dual ℂ V →ₗ[ℂ] CovJetAlgebra} + (hG : IsLorentzCovDerivTransforms CovJetAlgebra.repLorentzGroup rep G) : + IsLorentzCovDerivTransforms repLorentz rep + (fun {_n} l => k.toAlgHom.toLinearMap ∘ₗ G l) := by + intro Λ n l φ + show repLorentz Λ (k.toAlgHom (G l φ)) = _ + rw [← k.map_repLorentz, hG Λ n l φ, map_sum] + exact Finset.sum_congr rfl fun p _ => map_smul k.toAlgHom _ _ /-! -### B.2. The Lorentz action +## D. The sectors, the statistics and the field algebra + +The covariant form of the theory splits into three sectors — gauge, Higgs and fermion — +and the towers of different sectors commute. Those are the results the classification of +invariants is written in terms of, and this section makes them available by dot notation on +a covariant Standard Model, each one the covariant jet algebra's own law pushed along the +defining map. The field algebra the +covariant towers generate is here too, together with the centrality of the bosonic towers +inside it. -/ -include h in +/-- The Higgs sector of a covariant Standard Model. -/ +theorem isHiggsSector : IsHiggsSector B repGauge k.repGauge_mul repLorentz k.repLorentz_mul + (fun _n l => k.covH l) (fun _n l => k.covBarH l) massWeightPoly where + H_equivariant := fun g φ _n l => + k.map_repGauge_eq (CovJetAlgebra.isHiggsSector.H_equivariant g φ _n l) + barH_equivariant := fun g φ _n l => + k.map_repGauge_eq (CovJetAlgebra.isHiggsSector.barH_equivariant g φ _n l) + H_comm_H := fun φ ψ _n₁ _n₂ l₁ l₂ => + (CovJetAlgebra.isHiggsSector.H_comm_H φ ψ _n₁ _n₂ l₁ l₂).map k.toAlgHom + H_comm_barH := fun φ ψ _n₁ _n₂ l₁ l₂ => + (CovJetAlgebra.isHiggsSector.H_comm_barH φ ψ _n₁ _n₂ l₁ l₂).map k.toAlgHom + barH_comm_barH := fun φ ψ _n₁ _n₂ l₁ l₂ => + (CovJetAlgebra.isHiggsSector.barH_comm_barH φ ψ _n₁ _n₂ l₁ l₂).map k.toAlgHom + H_massWeight := fun φ _n l => + k.map_massWeight_monomial (CovJetAlgebra.isHiggsSector.H_massWeight φ _n l) + barH_massWeight := fun φ _n l => + k.map_massWeight_monomial (CovJetAlgebra.isHiggsSector.barH_massWeight φ _n l) + repLorentz_H := k.map_lorentz CovJetAlgebra.isHiggsSector.repLorentz_H + repLorentz_barH := k.map_lorentz CovJetAlgebra.isHiggsSector.repLorentz_barH + +/-- The gauge sector of a covariant Standard Model. -/ +theorem isGaugeSector : IsGaugeSector B repGauge k.repGauge_mul repLorentz k.repLorentz_mul + (fun {_n} l μ ν => k.covF l μ ν) massWeightPoly where + repGauge_F := fun g {_n} l μ ν φ => + k.map_repGauge_eq (CovJetAlgebra.isGaugeSector.repGauge_F g l μ ν φ) + repLorentz_F := fun Λ n l μ ν φ => by + show repLorentz Λ (k.toAlgHom (CovJetAlgebra.fieldStrength l μ ν φ)) = _ + rw [← k.map_repLorentz, + CovJetAlgebra.isGaugeSector.repLorentz_F Λ n l μ ν φ, map_sum] + refine Finset.sum_congr rfl fun p _ => ?_ + rw [map_smul, map_sum] + congr 1 + refine Finset.sum_congr rfl fun a _ => ?_ + rw [map_smul, map_sum] + congr 1 + exact Finset.sum_congr rfl fun b _ => map_smul k.toAlgHom _ _ + massWeight_F := fun {_n} l μ ν φ => + k.map_massWeight_monomial (CovJetAlgebra.isGaugeSector.massWeight_F l μ ν φ) + F_comm_F := fun {_n _m} l μ ν ψ l' μ' ν' ψ' => + (CovJetAlgebra.isGaugeSector.F_comm_F l μ ν ψ l' μ' ν' ψ').map k.toAlgHom + F_antisymm := fun {_n} l μ ν φ => + k.map_neg_eq (CovJetAlgebra.isGaugeSector.F_antisymm l μ ν φ) + +/-- The fermion sector of a covariant Standard Model. -/ +theorem isFermionSector : IsFermionSector B repGauge k.repGauge_mul repLorentz k.repLorentz_mul + (fun {_n} i l => k.covD i l) (fun {_n} i l => k.covBarD i l) + (fun {_n} i l => k.covU i l) (fun {_n} i l => k.covBarU i l) + (fun {_n} i l => k.covQ i l) (fun {_n} i l => k.covBarQ i l) + (fun {_n} i l => k.covL i l) (fun {_n} i l => k.covBarL i l) + (fun {_n} i l => k.covE i l) (fun {_n} i l => k.covBarE i l) massWeightPoly where + repGauge_d := fun g i {_n} l φ => + k.map_repGauge_eq (CovJetAlgebra.isFermionSector.repGauge_d g i l φ) + repGauge_bard := fun g i {_n} l φ => + k.map_repGauge_eq (CovJetAlgebra.isFermionSector.repGauge_bard g i l φ) + repGauge_u := fun g i {_n} l φ => + k.map_repGauge_eq (CovJetAlgebra.isFermionSector.repGauge_u g i l φ) + repGauge_baru := fun g i {_n} l φ => + k.map_repGauge_eq (CovJetAlgebra.isFermionSector.repGauge_baru g i l φ) + repGauge_Q := fun g i {_n} l φ => + k.map_repGauge_eq (CovJetAlgebra.isFermionSector.repGauge_Q g i l φ) + repGauge_barQ := fun g i {_n} l φ => + k.map_repGauge_eq (CovJetAlgebra.isFermionSector.repGauge_barQ g i l φ) + repGauge_L := fun g i {_n} l φ => + k.map_repGauge_eq (CovJetAlgebra.isFermionSector.repGauge_L g i l φ) + repGauge_barL := fun g i {_n} l φ => + k.map_repGauge_eq (CovJetAlgebra.isFermionSector.repGauge_barL g i l φ) + repGauge_e := fun g i {_n} l φ => + k.map_repGauge_eq (CovJetAlgebra.isFermionSector.repGauge_e g i l φ) + repGauge_bare := fun g i {_n} l φ => + k.map_repGauge_eq (CovJetAlgebra.isFermionSector.repGauge_bare g i l φ) + repLorentz_d := fun i => k.map_lorentz (CovJetAlgebra.isFermionSector.repLorentz_d i) + repLorentz_bard := fun i => + k.map_lorentz (CovJetAlgebra.isFermionSector.repLorentz_bard i) + repLorentz_u := fun i => k.map_lorentz (CovJetAlgebra.isFermionSector.repLorentz_u i) + repLorentz_baru := fun i => + k.map_lorentz (CovJetAlgebra.isFermionSector.repLorentz_baru i) + repLorentz_Q := fun i => k.map_lorentz (CovJetAlgebra.isFermionSector.repLorentz_Q i) + repLorentz_barQ := fun i => + k.map_lorentz (CovJetAlgebra.isFermionSector.repLorentz_barQ i) + repLorentz_L := fun i => k.map_lorentz (CovJetAlgebra.isFermionSector.repLorentz_L i) + repLorentz_barL := fun i => + k.map_lorentz (CovJetAlgebra.isFermionSector.repLorentz_barL i) + repLorentz_e := fun i => k.map_lorentz (CovJetAlgebra.isFermionSector.repLorentz_e i) + repLorentz_bare := fun i => + k.map_lorentz (CovJetAlgebra.isFermionSector.repLorentz_bare i) + massWeight_d := fun i {_n} l φ => + k.map_massWeight_monomial (CovJetAlgebra.isFermionSector.massWeight_d i l φ) + massWeight_bard := fun i {_n} l φ => + k.map_massWeight_monomial (CovJetAlgebra.isFermionSector.massWeight_bard i l φ) + massWeight_u := fun i {_n} l φ => + k.map_massWeight_monomial (CovJetAlgebra.isFermionSector.massWeight_u i l φ) + massWeight_baru := fun i {_n} l φ => + k.map_massWeight_monomial (CovJetAlgebra.isFermionSector.massWeight_baru i l φ) + massWeight_Q := fun i {_n} l φ => + k.map_massWeight_monomial (CovJetAlgebra.isFermionSector.massWeight_Q i l φ) + massWeight_barQ := fun i {_n} l φ => + k.map_massWeight_monomial (CovJetAlgebra.isFermionSector.massWeight_barQ i l φ) + massWeight_L := fun i {_n} l φ => + k.map_massWeight_monomial (CovJetAlgebra.isFermionSector.massWeight_L i l φ) + massWeight_barL := fun i {_n} l φ => + k.map_massWeight_monomial (CovJetAlgebra.isFermionSector.massWeight_barL i l φ) + massWeight_e := fun i {_n} l φ => + k.map_massWeight_monomial (CovJetAlgebra.isFermionSector.massWeight_e i l φ) + massWeight_bare := fun i {_n} l φ => + k.map_massWeight_monomial (CovJetAlgebra.isFermionSector.massWeight_bare i l φ) + d_anticomm_d := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.d_anticomm_d i j l l' φ φ') + d_anticomm_bard := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.d_anticomm_bard i j l l' φ φ') + d_anticomm_u := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.d_anticomm_u i j l l' φ φ') + d_anticomm_baru := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.d_anticomm_baru i j l l' φ φ') + d_anticomm_Q := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.d_anticomm_Q i j l l' φ φ') + d_anticomm_barQ := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.d_anticomm_barQ i j l l' φ φ') + d_anticomm_L := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.d_anticomm_L i j l l' φ φ') + d_anticomm_barL := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.d_anticomm_barL i j l l' φ φ') + d_anticomm_e := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.d_anticomm_e i j l l' φ φ') + d_anticomm_bare := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.d_anticomm_bare i j l l' φ φ') + bard_anticomm_bard := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.bard_anticomm_bard i j l l' φ φ') + bard_anticomm_u := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.bard_anticomm_u i j l l' φ φ') + bard_anticomm_baru := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.bard_anticomm_baru i j l l' φ φ') + bard_anticomm_Q := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.bard_anticomm_Q i j l l' φ φ') + bard_anticomm_barQ := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.bard_anticomm_barQ i j l l' φ φ') + bard_anticomm_L := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.bard_anticomm_L i j l l' φ φ') + bard_anticomm_barL := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.bard_anticomm_barL i j l l' φ φ') + bard_anticomm_e := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.bard_anticomm_e i j l l' φ φ') + bard_anticomm_bare := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.bard_anticomm_bare i j l l' φ φ') + u_anticomm_u := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.u_anticomm_u i j l l' φ φ') + u_anticomm_baru := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.u_anticomm_baru i j l l' φ φ') + u_anticomm_Q := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.u_anticomm_Q i j l l' φ φ') + u_anticomm_barQ := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.u_anticomm_barQ i j l l' φ φ') + u_anticomm_L := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.u_anticomm_L i j l l' φ φ') + u_anticomm_barL := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.u_anticomm_barL i j l l' φ φ') + u_anticomm_e := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.u_anticomm_e i j l l' φ φ') + u_anticomm_bare := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.u_anticomm_bare i j l l' φ φ') + baru_anticomm_baru := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.baru_anticomm_baru i j l l' φ φ') + baru_anticomm_Q := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.baru_anticomm_Q i j l l' φ φ') + baru_anticomm_barQ := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.baru_anticomm_barQ i j l l' φ φ') + baru_anticomm_L := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.baru_anticomm_L i j l l' φ φ') + baru_anticomm_barL := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.baru_anticomm_barL i j l l' φ φ') + baru_anticomm_e := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.baru_anticomm_e i j l l' φ φ') + baru_anticomm_bare := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.baru_anticomm_bare i j l l' φ φ') + Q_anticomm_Q := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.Q_anticomm_Q i j l l' φ φ') + Q_anticomm_barQ := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.Q_anticomm_barQ i j l l' φ φ') + Q_anticomm_L := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.Q_anticomm_L i j l l' φ φ') + Q_anticomm_barL := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.Q_anticomm_barL i j l l' φ φ') + Q_anticomm_e := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.Q_anticomm_e i j l l' φ φ') + Q_anticomm_bare := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.Q_anticomm_bare i j l l' φ φ') + barQ_anticomm_barQ := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.barQ_anticomm_barQ i j l l' φ φ') + barQ_anticomm_L := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.barQ_anticomm_L i j l l' φ φ') + barQ_anticomm_barL := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.barQ_anticomm_barL i j l l' φ φ') + barQ_anticomm_e := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.barQ_anticomm_e i j l l' φ φ') + barQ_anticomm_bare := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.barQ_anticomm_bare i j l l' φ φ') + L_anticomm_L := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.L_anticomm_L i j l l' φ φ') + L_anticomm_barL := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.L_anticomm_barL i j l l' φ φ') + L_anticomm_e := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.L_anticomm_e i j l l' φ φ') + L_anticomm_bare := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.L_anticomm_bare i j l l' φ φ') + barL_anticomm_barL := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.barL_anticomm_barL i j l l' φ φ') + barL_anticomm_e := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.barL_anticomm_e i j l l' φ φ') + barL_anticomm_bare := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.barL_anticomm_bare i j l l' φ φ') + e_anticomm_e := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.e_anticomm_e i j l l' φ φ') + e_anticomm_bare := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.e_anticomm_bare i j l l' φ φ') + bare_anticomm_bare := fun i j {_n _m} l l' φ φ' => + k.map_anticomm (CovJetAlgebra.isFermionSector.bare_anticomm_bare i j l l' φ φ') + +include k in +/-- The gauge action fixes the unit of the algebra: it is multiplicative, and every element of + the group is invertible. -/ +lemma repGauge_one (g : GaugeGroupI) : repGauge g (1 : B) = 1 := by + obtain ⟨v, hv⟩ : ∃ v, repGauge g v = 1 := + ⟨repGauge g⁻¹ 1, by + rw [← Module.End.mul_apply, ← map_mul, mul_inv_cancel, map_one repGauge, + Module.End.one_apply]⟩ + have h1 := k.repGauge_mul g v 1 + rw [mul_one, hv, one_mul] at h1 + exact h1.symm + +include k in /-- The Lorentz action fixes the unit of the algebra. -/ lemma repLorentz_one (Λ : SL(2,ℂ)) : repLorentz Λ (1 : B) = 1 := by obtain ⟨v, hv⟩ : ∃ v, repLorentz Λ v = 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 Λ v 1 + have h1 := k.repLorentz_mul Λ v 1 rw [mul_one, hv, one_mul] at h1 exact h1.symm -include h in -/-- The Lorentz action preserves the covariant subalgebra: it carries each covariant tower - to a slot-mixing sum of towers of the same shape, and it is multiplicative. -/ -lemma repLorentz_mem_covAlgebra (Λ : SL(2,ℂ)) {x : B} (hx : x ∈ h.covAlgebra) : - repLorentz Λ x ∈ h.covAlgebra := - h.mapsTo_covAlgebra (h.repLorentz_one Λ) (h.repLorentz_mul Λ) - (h.covGenerators_induction - (fun l μ ν φ => by - rw [h.repLorentz_covF] - exact Subalgebra.sum_mem _ fun p _ => Subalgebra.smul_mem _ - (Subalgebra.sum_mem _ fun a _ => Subalgebra.smul_mem _ - (Subalgebra.sum_mem _ fun b _ => Subalgebra.smul_mem _ - (h.covF_mem_covAlgebra _ _ _ _) _) _) _) - (fun l φ => by - rw [h.repLorentz_covDerivH] - exact h.sum_smul_mem_covAlgebra fun p => h.covDerivH_mem_covAlgebra _ _) - (fun l φ => by - rw [h.repLorentz_covDerivBarH] - exact h.sum_smul_mem_covAlgebra fun p => h.covDerivBarH_mem_covAlgebra _ _) - (fun i {_n} l φ => by - rw [h.repLorentz_covDerivD] - exact h.sum_smul_mem_covAlgebra fun p => h.covDerivD_mem_covAlgebra _ _ _) - (fun i {_n} l φ => by - rw [h.repLorentz_covDerivBarD] - exact h.sum_smul_mem_covAlgebra fun p => h.covDerivBarD_mem_covAlgebra _ _ _) - (fun i {_n} l φ => by - rw [h.repLorentz_covDerivU] - exact h.sum_smul_mem_covAlgebra fun p => h.covDerivU_mem_covAlgebra _ _ _) - (fun i {_n} l φ => by - rw [h.repLorentz_covDerivBarU] - exact h.sum_smul_mem_covAlgebra fun p => h.covDerivBarU_mem_covAlgebra _ _ _) - (fun i {_n} l φ => by - rw [h.repLorentz_covDerivQ] - exact h.sum_smul_mem_covAlgebra fun p => h.covDerivQ_mem_covAlgebra _ _ _) - (fun i {_n} l φ => by - rw [h.repLorentz_covDerivBarQ] - exact h.sum_smul_mem_covAlgebra fun p => h.covDerivBarQ_mem_covAlgebra _ _ _) - (fun i {_n} l φ => by - rw [h.repLorentz_covDerivL] - exact h.sum_smul_mem_covAlgebra fun p => h.covDerivL_mem_covAlgebra _ _ _) - (fun i {_n} l φ => by - rw [h.repLorentz_covDerivBarL] - exact h.sum_smul_mem_covAlgebra fun p => h.covDerivBarL_mem_covAlgebra _ _ _) - (fun i {_n} l φ => by - rw [h.repLorentz_covDerivE] - exact h.sum_smul_mem_covAlgebra fun p => h.covDerivE_mem_covAlgebra _ _ _) - (fun i {_n} l φ => by - rw [h.repLorentz_covDerivBarE] - exact h.sum_smul_mem_covAlgebra fun p => h.covDerivBarE_mem_covAlgebra _ _ _)) hx +/-! + +### D.1. The cross-sector commutation rules + +-/ + +/-- The cross-sector commutation rule `F_comm_H` of a covariant Standard Model. -/ +lemma 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 (k.covF l μ ν ψ) (k.covH l' φ) := + (CovJetAlgebra.F_comm_H l μ ν ψ l' φ).map k.toAlgHom + +/-- The cross-sector commutation rule `F_comm_barH` of a covariant Standard Model. -/ +lemma 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 (k.covF l μ ν ψ) (k.covBarH l' φ) := + (CovJetAlgebra.F_comm_barH l μ ν ψ l' φ).map k.toAlgHom + +/-- The cross-sector commutation rule `F_comm_d` of a covariant Standard Model. -/ +lemma 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 (k.covF l μ ν ψ) (k.covD i l' φ) := + (CovJetAlgebra.F_comm_d l μ ν ψ i l' φ).map k.toAlgHom + +/-- The cross-sector commutation rule `F_comm_bard` of a covariant Standard Model. -/ +lemma 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 (k.covF l μ ν ψ) (k.covBarD i l' φ) := + (CovJetAlgebra.F_comm_bard l μ ν ψ i l' φ).map k.toAlgHom + +/-- The cross-sector commutation rule `F_comm_u` of a covariant Standard Model. -/ +lemma 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 (k.covF l μ ν ψ) (k.covU i l' φ) := + (CovJetAlgebra.F_comm_u l μ ν ψ i l' φ).map k.toAlgHom + +/-- The cross-sector commutation rule `F_comm_baru` of a covariant Standard Model. -/ +lemma 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 (k.covF l μ ν ψ) (k.covBarU i l' φ) := + (CovJetAlgebra.F_comm_baru l μ ν ψ i l' φ).map k.toAlgHom + +/-- The cross-sector commutation rule `F_comm_Q` of a covariant Standard Model. -/ +lemma 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 (k.covF l μ ν ψ) (k.covQ i l' φ) := + (CovJetAlgebra.F_comm_Q l μ ν ψ i l' φ).map k.toAlgHom + +/-- The cross-sector commutation rule `F_comm_barQ` of a covariant Standard Model. -/ +lemma 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 (k.covF l μ ν ψ) (k.covBarQ i l' φ) := + (CovJetAlgebra.F_comm_barQ l μ ν ψ i l' φ).map k.toAlgHom + +/-- The cross-sector commutation rule `F_comm_L` of a covariant Standard Model. -/ +lemma 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 (k.covF l μ ν ψ) (k.covL i l' φ) := + (CovJetAlgebra.F_comm_L l μ ν ψ i l' φ).map k.toAlgHom + +/-- The cross-sector commutation rule `F_comm_barL` of a covariant Standard Model. -/ +lemma 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 (k.covF l μ ν ψ) (k.covBarL i l' φ) := + (CovJetAlgebra.F_comm_barL l μ ν ψ i l' φ).map k.toAlgHom + +/-- The cross-sector commutation rule `F_comm_e` of a covariant Standard Model. -/ +lemma 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 (k.covF l μ ν ψ) (k.covE i l' φ) := + (CovJetAlgebra.F_comm_e l μ ν ψ i l' φ).map k.toAlgHom + +/-- The cross-sector commutation rule `F_comm_bare` of a covariant Standard Model. -/ +lemma 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 (k.covF l μ ν ψ) (k.covBarE i l' φ) := + (CovJetAlgebra.F_comm_bare l μ ν ψ i l' φ).map k.toAlgHom + +/-- The cross-sector commutation rule `H_comm_d` of a covariant Standard Model. -/ +lemma 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 (k.covH l φ) (k.covD i l' φ') := + (CovJetAlgebra.H_comm_d l φ i l' φ').map k.toAlgHom + +/-- The cross-sector commutation rule `H_comm_bard` of a covariant Standard Model. -/ +lemma 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 (k.covH l φ) (k.covBarD i l' φ') := + (CovJetAlgebra.H_comm_bard l φ i l' φ').map k.toAlgHom + +/-- The cross-sector commutation rule `H_comm_u` of a covariant Standard Model. -/ +lemma 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 (k.covH l φ) (k.covU i l' φ') := + (CovJetAlgebra.H_comm_u l φ i l' φ').map k.toAlgHom + +/-- The cross-sector commutation rule `H_comm_baru` of a covariant Standard Model. -/ +lemma 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 (k.covH l φ) (k.covBarU i l' φ') := + (CovJetAlgebra.H_comm_baru l φ i l' φ').map k.toAlgHom + +/-- The cross-sector commutation rule `H_comm_Q` of a covariant Standard Model. -/ +lemma 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 (k.covH l φ) (k.covQ i l' φ') := + (CovJetAlgebra.H_comm_Q l φ i l' φ').map k.toAlgHom + +/-- The cross-sector commutation rule `H_comm_barQ` of a covariant Standard Model. -/ +lemma 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 (k.covH l φ) (k.covBarQ i l' φ') := + (CovJetAlgebra.H_comm_barQ l φ i l' φ').map k.toAlgHom + +/-- The cross-sector commutation rule `H_comm_L` of a covariant Standard Model. -/ +lemma 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 (k.covH l φ) (k.covL i l' φ') := + (CovJetAlgebra.H_comm_L l φ i l' φ').map k.toAlgHom + +/-- The cross-sector commutation rule `H_comm_barL` of a covariant Standard Model. -/ +lemma 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 (k.covH l φ) (k.covBarL i l' φ') := + (CovJetAlgebra.H_comm_barL l φ i l' φ').map k.toAlgHom + +/-- The cross-sector commutation rule `H_comm_e` of a covariant Standard Model. -/ +lemma 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 (k.covH l φ) (k.covE i l' φ') := + (CovJetAlgebra.H_comm_e l φ i l' φ').map k.toAlgHom + +/-- The cross-sector commutation rule `H_comm_bare` of a covariant Standard Model. -/ +lemma 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 (k.covH l φ) (k.covBarE i l' φ') := + (CovJetAlgebra.H_comm_bare l φ i l' φ').map k.toAlgHom + +/-- The cross-sector commutation rule `barH_comm_d` of a covariant Standard Model. -/ +lemma 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 (k.covBarH l φ) (k.covD i l' φ') := + (CovJetAlgebra.barH_comm_d l φ i l' φ').map k.toAlgHom + +/-- The cross-sector commutation rule `barH_comm_bard` of a covariant Standard Model. -/ +lemma 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 (k.covBarH l φ) (k.covBarD i l' φ') := + (CovJetAlgebra.barH_comm_bard l φ i l' φ').map k.toAlgHom + +/-- The cross-sector commutation rule `barH_comm_u` of a covariant Standard Model. -/ +lemma 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 (k.covBarH l φ) (k.covU i l' φ') := + (CovJetAlgebra.barH_comm_u l φ i l' φ').map k.toAlgHom + +/-- The cross-sector commutation rule `barH_comm_baru` of a covariant Standard Model. -/ +lemma 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 (k.covBarH l φ) (k.covBarU i l' φ') := + (CovJetAlgebra.barH_comm_baru l φ i l' φ').map k.toAlgHom + +/-- The cross-sector commutation rule `barH_comm_Q` of a covariant Standard Model. -/ +lemma 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 (k.covBarH l φ) (k.covQ i l' φ') := + (CovJetAlgebra.barH_comm_Q l φ i l' φ').map k.toAlgHom + +/-- The cross-sector commutation rule `barH_comm_barQ` of a covariant Standard Model. -/ +lemma 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 (k.covBarH l φ) (k.covBarQ i l' φ') := + (CovJetAlgebra.barH_comm_barQ l φ i l' φ').map k.toAlgHom + +/-- The cross-sector commutation rule `barH_comm_L` of a covariant Standard Model. -/ +lemma 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 (k.covBarH l φ) (k.covL i l' φ') := + (CovJetAlgebra.barH_comm_L l φ i l' φ').map k.toAlgHom + +/-- The cross-sector commutation rule `barH_comm_barL` of a covariant Standard Model. -/ +lemma 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 (k.covBarH l φ) (k.covBarL i l' φ') := + (CovJetAlgebra.barH_comm_barL l φ i l' φ').map k.toAlgHom + +/-- The cross-sector commutation rule `barH_comm_e` of a covariant Standard Model. -/ +lemma 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 (k.covBarH l φ) (k.covE i l' φ') := + (CovJetAlgebra.barH_comm_e l φ i l' φ').map k.toAlgHom + +/-- The cross-sector commutation rule `barH_comm_bare` of a covariant Standard Model. -/ +lemma 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 (k.covBarH l φ) (k.covBarE i l' φ') := + (CovJetAlgebra.barH_comm_bare l φ i l' φ').map k.toAlgHom /-! -### B.3. The mass-weight polynomial +### D.2. The field algebra -/ -include h in -/-- A monomial with a coefficient in the covariant subalgebra is the image of a monomial - over the covariant subalgebra. -/ -private lemma monomial_mem_range {n : ℕ} {y : B} (hy : y ∈ h.covAlgebra) : - Polynomial.monomial n y ∈ (Polynomial.mapAlgHom h.covAlgebra.val).range := - ⟨Polynomial.monomial n ⟨y, hy⟩, by simp⟩ - -include h in -/-- The mass-weight polynomial carries the covariant subalgebra into the polynomials with - coefficients in it: each covariant tower is an eigenvector whose eigenvector is the tower - itself, and the mass-weight polynomial is an algebra map. -/ -lemma massWeightPoly_mem_range_mapAlgHom {x : B} (hx : x ∈ h.covAlgebra) : - massWeightPoly x ∈ (Polynomial.mapAlgHom h.covAlgebra.val).range := by - have hgen : ∀ y ∈ h.covGenerators, - massWeightPoly y ∈ (Polynomial.mapAlgHom h.covAlgebra.val).range := - h.covGenerators_induction - (fun l μ ν φ => by - rw [h.massWeight_covF] - exact h.monomial_mem_range (h.covF_mem_covAlgebra l μ ν φ)) - (fun l φ => by - rw [h.massWeight_covDerivH] - exact h.monomial_mem_range (h.covDerivH_mem_covAlgebra l φ)) - (fun l φ => by - rw [h.massWeight_covDerivBarH] - exact h.monomial_mem_range (h.covDerivBarH_mem_covAlgebra l φ)) - (fun i {_n} l φ => by - rw [h.massWeight_covDerivD] - exact h.monomial_mem_range (h.covDerivD_mem_covAlgebra i l φ)) - (fun i {_n} l φ => by - rw [h.massWeight_covDerivBarD] - exact h.monomial_mem_range (h.covDerivBarD_mem_covAlgebra i l φ)) - (fun i {_n} l φ => by - rw [h.massWeight_covDerivU] - exact h.monomial_mem_range (h.covDerivU_mem_covAlgebra i l φ)) - (fun i {_n} l φ => by - rw [h.massWeight_covDerivBarU] - exact h.monomial_mem_range (h.covDerivBarU_mem_covAlgebra i l φ)) - (fun i {_n} l φ => by - rw [h.massWeight_covDerivQ] - exact h.monomial_mem_range (h.covDerivQ_mem_covAlgebra i l φ)) - (fun i {_n} l φ => by - rw [h.massWeight_covDerivBarQ] - exact h.monomial_mem_range (h.covDerivBarQ_mem_covAlgebra i l φ)) - (fun i {_n} l φ => by - rw [h.massWeight_covDerivL] - exact h.monomial_mem_range (h.covDerivL_mem_covAlgebra i l φ)) - (fun i {_n} l φ => by - rw [h.massWeight_covDerivBarL] - exact h.monomial_mem_range (h.covDerivBarL_mem_covAlgebra i l φ)) - (fun i {_n} l φ => by - rw [h.massWeight_covDerivE] - exact h.monomial_mem_range (h.covDerivE_mem_covAlgebra i l φ)) - (fun i {_n} l φ => by - rw [h.massWeight_covDerivBarE] - exact h.monomial_mem_range (h.covDerivBarE_mem_covAlgebra i l φ)) - induction hx using Algebra.adjoin_induction with - | mem b hb => exact hgen b hb - | algebraMap c => exact ⟨algebraMap ℂ (Polynomial ↥h.covAlgebra) c, by simp⟩ - | add a b _ _ iha ihb => rw [map_add]; exact add_mem iha ihb - | mul a b _ _ iha ihb => rw [map_mul]; exact mul_mem iha ihb +/-- The algebra generated by all the covariant fields of a covariant 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 : Subalgebra ℂ B := + Algebra.adjoin ℂ + ((⋃ (n : ℕ) (l : Fin n → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3), + Set.range (k.covF l μ ν)) ∪ + (⋃ (n : ℕ) (l : Fin n → Fin 1 ⊕ Fin 3), Set.range (k.covH l) ∪ Set.range (k.covBarH l)) ∪ + (⋃ (i : Fin 3) (n : ℕ) (l : Fin n → Fin 1 ⊕ Fin 3), + Set.range (k.covD i l) ∪ Set.range (k.covBarD i l) ∪ + Set.range (k.covU i l) ∪ Set.range (k.covBarU i l) ∪ + Set.range (k.covQ i l) ∪ Set.range (k.covBarQ i l) ∪ + Set.range (k.covL i l) ∪ Set.range (k.covBarL i l) ∪ + Set.range (k.covE i l) ∪ Set.range (k.covBarE i l))) + +lemma F_commute_mem_fieldAlgebra {n : ℕ} {l : Fin n → Fin 1 ⊕ Fin 3} {μ ν : Fin 1 ⊕ Fin 3} + (φ : Module.Dual ℝ GaugeAlgebra) (x : B) (hx : x ∈ k.fieldAlgebra) : + k.covF l μ ν φ * x = x * k.covF l μ ν φ := by + rw [fieldAlgebra] at hx + refine (IsGaugeField.commute_of_mem_adjoin (y := k.covF 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 (k.isGaugeSector.F_comm_F l μ ν φ l' μ' ν' ψ).symm + · exact (k.F_comm_H l μ ν φ l' φ').symm + · exact (k.F_comm_barH l μ ν φ l' φ').symm + · obtain (((((((((⟨φ', rfl⟩ | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | + ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) := hz + · exact (k.F_comm_d l μ ν φ i l' φ').symm + · exact (k.F_comm_bard l μ ν φ i l' φ').symm + · exact (k.F_comm_u l μ ν φ i l' φ').symm + · exact (k.F_comm_baru l μ ν φ i l' φ').symm + · exact (k.F_comm_Q l μ ν φ i l' φ').symm + · exact (k.F_comm_barQ l μ ν φ i l' φ').symm + · exact (k.F_comm_L l μ ν φ i l' φ').symm + · exact (k.F_comm_barL l μ ν φ i l' φ').symm + · exact (k.F_comm_e l μ ν φ i l' φ').symm + · exact (k.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 ∈ k.fieldAlgebra) : + k.covH l φ * x = x * k.covH l φ := by + rw [fieldAlgebra] at hx + refine (IsGaugeField.commute_of_mem_adjoin (y := k.covH 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 k.F_comm_H l' μ' ν' ψ l φ + · exact k.isHiggsSector.H_comm_H φ' φ _ _ l' l + · exact (k.isHiggsSector.H_comm_barH φ φ' _ _ l l').symm + · obtain (((((((((⟨φ', rfl⟩ | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | + ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) := hz + · exact (k.H_comm_d l φ i l' φ').symm + · exact (k.H_comm_bard l φ i l' φ').symm + · exact (k.H_comm_u l φ i l' φ').symm + · exact (k.H_comm_baru l φ i l' φ').symm + · exact (k.H_comm_Q l φ i l' φ').symm + · exact (k.H_comm_barQ l φ i l' φ').symm + · exact (k.H_comm_L l φ i l' φ').symm + · exact (k.H_comm_barL l φ i l' φ').symm + · exact (k.H_comm_e l φ i l' φ').symm + · exact (k.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 ∈ k.fieldAlgebra) : + k.covBarH l φ * x = x * k.covBarH l φ := by + rw [fieldAlgebra] at hx + refine (IsGaugeField.commute_of_mem_adjoin (y := k.covBarH 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 k.F_comm_barH l' μ' ν' ψ l φ + · exact k.isHiggsSector.H_comm_barH φ' φ _ _ l' l + · exact k.isHiggsSector.barH_comm_barH φ' φ _ _ l' l + · obtain (((((((((⟨φ', rfl⟩ | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | + ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) | ⟨φ', rfl⟩) := hz + · exact (k.barH_comm_d l φ i l' φ').symm + · exact (k.barH_comm_bard l φ i l' φ').symm + · exact (k.barH_comm_u l φ i l' φ').symm + · exact (k.barH_comm_baru l φ i l' φ').symm + · exact (k.barH_comm_Q l φ i l' φ').symm + · exact (k.barH_comm_barQ l φ i l' φ').symm + · exact (k.barH_comm_L l φ i l' φ').symm + · exact (k.barH_comm_barL l φ i l' φ').symm + · exact (k.barH_comm_e l φ i l' φ').symm + · exact (k.barH_comm_bare l φ i l' φ').symm + +end CovAlgebraRealization /-! -## C. The covariant subalgebra as an algebra in its own right +## E. Naturality of the covariant derivative -The three closure facts of section B let the covariant subalgebra carry a gauge action, a -Lorentz action and a mass-weight polynomial of its own: each is the ambient one restricted, -and each is recorded here together with the lemma identifying it with the ambient one on -underlying elements. The mass-weight polynomial takes a little more care than the two -actions, because its target is the polynomials over the subalgebra rather than the -subalgebra itself; the identification is through the injection -`Polynomial.mapAlgHom h.covAlgebra.val`. +A covariant tower is built from the bare families by two operations only: the pairing of an +adjoint family against a matter one (`IsGaugeField.actionFam`), and the bracket of two +adjoint families (`IsGaugeField.bracketFam`). Each expands, in bases of the gauge algebra +and of the value space, as a finite double sum of scalar multiples of products of +components, so each commutes with an algebra map. The whole recursion therefore does, and +that is the content of this section: the covariant towers of a Standard Model are the jet +algebra's own covariant towers pushed along the defining map. -/ -/-- The global gauge action on the covariant subalgebra: the ambient global gauge action, - which section B shows preserves it. -/ -noncomputable def covRepGauge : Representation ℂ GaugeGroupI ↥h.covAlgebra where - toFun g := LinearMap.restrict (repGlobal repJet g) fun _ hx => h.repGlobal_mem_covAlgebra g hx - map_one' := by - refine LinearMap.ext fun x => Subtype.ext ?_ - show repGlobal repJet 1 (x : B) = (x : B) - rw [map_one] - rfl - map_mul' g₁ g₂ := by - refine LinearMap.ext fun x => Subtype.ext ?_ - show repGlobal repJet (g₁ * g₂) (x : B) = repGlobal repJet g₁ (repGlobal repJet g₂ (x : B)) - rw [map_mul] - rfl +namespace IsGaugeField + +variable {B B' : Type} [Ring B] [Algebra ℂ B] [Ring B'] [Algebra ℂ B'] + {V : Type} [AddCommGroup V] [Module ℂ V] [Module.Finite ℂ V] + +/-- Composing an adjoint-indexed family with an algebra map. -/ +noncomputable abbrev mapAdj (Φ : B →ₐ[ℂ] B') + (f : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B' := + Φ.toLinearMap.restrictScalars ℝ ∘ₗ f + +/-- An algebra map over `ℂ` is real-linear. -/ +lemma map_real_smul (Φ : B →ₐ[ℂ] B') (r : ℝ) (b : B) : Φ (r • b) = r • Φ b := + (Φ.toLinearMap.restrictScalars ℝ).map_smul r b + +/-- The action pairing commutes with an algebra map: it is a finite double sum of scalar + multiples of products of components. -/ +lemma actionFam_map (Φ : B →ₐ[ℂ] B') (act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℂ] V) + (f : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) (g : Module.Dual ℂ V →ₗ[ℂ] B) + (φ : Module.Dual ℂ V) : + Φ (actionFam act f g φ) = actionFam act (mapAdj Φ f) (Φ.toLinearMap ∘ₗ g) φ := by + rw [actionFam, actionFam, + dualPairEquiv_symm_eq_sum (Module.finBasis ℝ GaugeAlgebra) f, + dualPairEquivC_symm_eq_sum (Module.finBasis ℂ V) g, + dualPairEquiv_symm_eq_sum (Module.finBasis ℝ GaugeAlgebra) (mapAdj Φ f), + dualPairEquivC_symm_eq_sum (Module.finBasis ℂ V) (Φ.toLinearMap ∘ₗ g)] + simp only [map_sum, LinearMap.sum_apply, tensorAction_tmul, dualPairEquivC_tmul, + map_smul, map_mul, LinearMap.coe_comp, Function.comp_apply, + LinearMap.coe_restrictScalars, AlgHom.toLinearMap_apply] + +/-- The bracket of two adjoint families commutes with an algebra map. -/ +lemma bracketFam_map (Φ : B →ₐ[ℂ] B') (f g : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (φ : Module.Dual ℝ GaugeAlgebra) : + Φ (bracketFam f g φ) = bracketFam (mapAdj Φ f) (mapAdj Φ g) φ := by + rw [bracketFam, bracketFam, + dualPairEquiv_symm_eq_sum (Module.finBasis ℝ GaugeAlgebra) f, + dualPairEquiv_symm_eq_sum (Module.finBasis ℝ GaugeAlgebra) g, + dualPairEquiv_symm_eq_sum (Module.finBasis ℝ GaugeAlgebra) (mapAdj Φ f), + dualPairEquiv_symm_eq_sum (Module.finBasis ℝ GaugeAlgebra) (mapAdj Φ g)] + simp only [map_sum, LinearMap.sum_apply, tensorBracket_tmul, dualPairEquiv_tmul, + map_real_smul, map_mul, LinearMap.coe_comp, Function.comp_apply, + LinearMap.coe_restrictScalars, AlgHom.toLinearMap_apply] + +variable {act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℂ] V} + {A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} + {A' : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B'} + +/-- The action pairing of two families related by an algebra map is the pairing of the images. -/ +lemma actionFam_map' (Φ : B →ₐ[ℂ] B') + {f : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} {f' : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B'} + (hf : ∀ ψ, Φ (f ψ) = f' ψ) + {g : Module.Dual ℂ V →ₗ[ℂ] B} {g' : Module.Dual ℂ V →ₗ[ℂ] B'} (hg : ∀ χ, Φ (g χ) = g' χ) + (φ : Module.Dual ℂ V) : + Φ (actionFam act f g φ) = actionFam act f' g' φ := by + rw [actionFam_map Φ act f g φ, show mapAdj Φ f = f' from LinearMap.ext hf, + show Φ.toLinearMap ∘ₗ g = g' from LinearMap.ext hg] + +/-- The bracket of two adjoint families related by an algebra map is the bracket of the + images. -/ +lemma bracketFam_map' (Φ : B →ₐ[ℂ] B') + {f : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} {f' : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B'} + (hf : ∀ ψ, Φ (f ψ) = f' ψ) + {g : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} {g' : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B'} + (hg : ∀ ψ, Φ (g ψ) = g' ψ) (φ : Module.Dual ℝ GaugeAlgebra) : + Φ (bracketFam f g φ) = bracketFam f' g' φ := by + rw [bracketFam_map Φ f g φ, show mapAdj Φ f = f' from LinearMap.ext hf, + show mapAdj Φ g = g' from LinearMap.ext hg] + +/-- The derived action family commutes with an algebra map. -/ +lemma actionFamConv_map' (Φ : B →ₐ[ℂ] B') (hA : ∀ p ρ ψ, Φ (A p ρ ψ) = A' p ρ ψ) + {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B} + {F' : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B'} + (hF : ∀ s χ, Φ (F s χ) = F' s χ) (ρ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ V) : + Φ (actionFamConv A act ρ F s φ) = actionFamConv A' act ρ F' s φ := by + rw [actionFamConv, actionFamConv, Multiset.sum_linearMap_apply, Multiset.sum_linearMap_apply, + Multiset.map_map, Multiset.map_map, map_multiset_sum, Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p _ => ?_) + exact actionFam_map' Φ (hA p.1 ρ) (hF p.2) φ + +/-- The derived bracket family commutes with an algebra map. -/ +lemma bracketFamConv_map' (Φ : B →ₐ[ℂ] B') (hA : ∀ p ρ ψ, Φ (A p ρ ψ) = A' p ρ ψ) + {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} + {F' : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B'} + (hF : ∀ s χ, Φ (F s χ) = F' s χ) (ρ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℝ GaugeAlgebra) : + Φ (bracketFamConv A ρ F s φ) = bracketFamConv A' ρ F' s φ := by + rw [bracketFamConv, bracketFamConv, Multiset.sum_linearMap_apply, + Multiset.sum_linearMap_apply, Multiset.map_map, Multiset.map_map, map_multiset_sum, + Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p _ => ?_) + exact bracketFam_map' Φ (hA p.1 ρ) (hF p.2) φ + +/-- The derived commutator family commutes with an algebra map. -/ +lemma commutatorFam_map' (Φ : B →ₐ[ℂ] B') (hA : ∀ p ρ ψ, Φ (A p ρ ψ) = A' p ρ ψ) + (μ ν : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra) : + Φ (commutatorFam A μ ν s φ) = commutatorFam A' μ ν s φ := by + rw [commutatorFam, commutatorFam, Multiset.sum_linearMap_apply, + Multiset.sum_linearMap_apply, Multiset.map_map, Multiset.map_map, map_multiset_sum, + Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p _ => ?_) + exact bracketFam_map' Φ (hA p.1 μ) (hA p.2 ν) φ + +/-- The field strength commutes with an algebra map. -/ +lemma fieldStrength_map' (Φ : B →ₐ[ℂ] B') (hA : ∀ p ρ ψ, Φ (A p ρ ψ) = A' p ρ ψ) + (μ ν : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra) : + Φ (fieldStrength A μ ν s φ) = fieldStrength A' μ ν s φ := by + rw [fieldStrength_apply, fieldStrength_apply, map_add, map_sub, hA, hA, + commutatorFam_map' Φ hA] + +/-- The covariant derivative of a matter family commutes with an algebra map. -/ +lemma covDerivAction_map' (Φ : B →ₐ[ℂ] B') (hA : ∀ p ρ ψ, Φ (A p ρ ψ) = A' p ρ ψ) + {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B} + {F' : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B'} + (hF : ∀ s χ, Φ (F s χ) = F' s χ) (ρ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ V) : + Φ (covDerivAction A act F ρ s φ) = covDerivAction A' act F' ρ s φ := by + rw [covDerivAction_apply, covDerivAction_apply, map_add, hF, actionFamConv_map' Φ hA hF] + +/-- The covariant derivative of an adjoint family commutes with an algebra map. -/ +lemma covDerivAdjoint_map' (Φ : B →ₐ[ℂ] B') (hA : ∀ p ρ ψ, Φ (A p ρ ψ) = A' p ρ ψ) + {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} + {F' : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B'} + (hF : ∀ s χ, Φ (F s χ) = F' s χ) (ρ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℝ GaugeAlgebra) : + Φ (covDerivAdjoint A F ρ s φ) = covDerivAdjoint A' F' ρ s φ := by + rw [covDerivAdjoint_apply, covDerivAdjoint_apply, map_add, hF, bracketFamConv_map' Φ hA hF] + +/-- The iterated covariant derivative of a matter family commutes with an algebra map. -/ +lemma covDerivIter_map' (Φ : B →ₐ[ℂ] B') (hA : ∀ p ρ ψ, Φ (A p ρ ψ) = A' p ρ ψ) + {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B} + {F' : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B'} + (hF : ∀ s χ, Φ (F s χ) = F' s χ) : + ∀ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ V), + Φ (covDerivIter A act F n l s φ) = covDerivIter A' act F' n l s φ + | 0, _, s, φ => hF s φ + | n + 1, l, s, φ => + covDerivAction_map' Φ hA + (fun s' χ => covDerivIter_map' Φ hA hF n (fun i => l i.succ) s' χ) (l 0) s φ + +/-- The iterated covariant derivative of an adjoint family commutes with an algebra map. -/ +lemma iteratedCovDerivAdjoint_map' (Φ : B →ₐ[ℂ] B') (hA : ∀ p ρ ψ, Φ (A p ρ ψ) = A' p ρ ψ) + {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} + {F' : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B'} + (hF : ∀ s χ, Φ (F s χ) = F' s χ) : + ∀ (l : List (Fin 1 ⊕ Fin 3)) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℝ GaugeAlgebra), + Φ (iteratedCovDerivAdjoint A l F s φ) = iteratedCovDerivAdjoint A' l F' s φ + | [], s, φ => hF s φ + | ρ :: l, s, φ => + covDerivAdjoint_map' Φ hA + (fun s' χ => iteratedCovDerivAdjoint_map' Φ hA hF l s' χ) ρ s φ + +end IsGaugeField -@[simp] -lemma coe_covRepGauge (g : GaugeGroupI) (x : ↥h.covAlgebra) : - (h.covRepGauge g x : B) = repGlobal repJet g (x : B) := rfl - -/-- The Lorentz action on the covariant subalgebra: the ambient Lorentz action, which - section B shows preserves it. -/ -noncomputable def covRepLorentz : Representation ℂ SL(2,ℂ) ↥h.covAlgebra where - toFun Λ := LinearMap.restrict (repLorentz Λ) fun _ hx => h.repLorentz_mem_covAlgebra Λ hx - map_one' := by - refine LinearMap.ext fun x => Subtype.ext ?_ - show repLorentz 1 (x : B) = (x : B) - rw [map_one] - rfl - map_mul' Λ₁ Λ₂ := by - refine LinearMap.ext fun x => Subtype.ext ?_ - show repLorentz (Λ₁ * Λ₂) (x : B) = repLorentz Λ₁ (repLorentz Λ₂ (x : B)) - rw [map_mul] - rfl +/-! -@[simp] -lemma coe_covRepLorentz (Λ : SL(2,ℂ)) (x : ↥h.covAlgebra) : - (h.covRepLorentz Λ x : B) = repLorentz Λ (x : B) := rfl - -include h in -/-- Polynomials over the covariant subalgebra inject into polynomials over the algebra. -/ -lemma mapAlgHom_val_injective : - Function.Injective (Polynomial.mapAlgHom h.covAlgebra.val) := by - rw [Polynomial.coe_mapAlgHom] - exact Polynomial.map_injective _ Subtype.val_injective - -/-- The mass-weight polynomial of the covariant subalgebra: the ambient mass-weight - polynomial, whose value on the subalgebra has all of its coefficients in the subalgebra - by section B. -/ -noncomputable def covMassWeightPoly : ↥h.covAlgebra →ₐ[ℂ] Polynomial ↥h.covAlgebra := - (AlgEquiv.ofInjective (Polynomial.mapAlgHom h.covAlgebra.val) - h.mapAlgHom_val_injective).symm.toAlgHom.comp - (AlgHom.codRestrict (massWeightPoly.comp h.covAlgebra.val) _ - fun x => h.massWeightPoly_mem_range_mapAlgHom x.2) +## F. Every Standard Model is a covariant Standard Model -@[simp] -lemma mapAlgHom_covMassWeightPoly (x : ↥h.covAlgebra) : - Polynomial.mapAlgHom h.covAlgebra.val (h.covMassWeightPoly x) = massWeightPoly (x : B) := - congrArg Subtype.val ((AlgEquiv.ofInjective (Polynomial.mapAlgHom h.covAlgebra.val) - h.mapAlgHom_val_injective).apply_symm_apply - ⟨massWeightPoly (x : B), h.massWeightPoly_mem_range_mapAlgHom x.2⟩) - -/-- A mass-weight eigenvalue equation in the covariant subalgebra is the ambient one. -/ -lemma covMassWeightPoly_eq_monomial_iff {n : ℕ} (x : ↥h.covAlgebra) : - h.covMassWeightPoly x = Polynomial.monomial n x - ↔ massWeightPoly (x : B) = Polynomial.monomial n (x : B) := by - constructor - · intro hx - rw [← h.mapAlgHom_covMassWeightPoly, hx, Polynomial.mapAlgHom_monomial] - rfl - · intro hx - refine h.mapAlgHom_val_injective ?_ - rw [h.mapAlgHom_covMassWeightPoly, hx, Polynomial.mapAlgHom_monomial] - rfl +A Standard Model in the bare symbols carries one in the covariant towers: its defining +algebra map out of the jet algebra restricts to the covariant field algebra, and the +restriction is equivariant for the global gauge group and the Lorentz group and compatible +with the mass-weight grading, because the unrestricted map is. The thirteen covariant +towers of the resulting covariant Standard Model are, on the nose, the covariant towers of +`AlgebraRealization.CovStandardModel`. +-/ + +namespace AlgebraRealization + +variable {B : Type} [Ring B] [Algebra ℂ B] + {repJet : Representation ℂ JetGaugeGroupI B} + {repLorentz : Representation ℂ SL(2,ℂ) B} + {massWeightPoly : B →ₐ[ℂ] Polynomial B} + (h : AlgebraRealization B repJet repLorentz massWeightPoly) + +/-- A Standard Model is a covariant Standard Model, for the global gauge group: the defining + algebra map out of the jet algebra, restricted to the covariant jet algebra. -/ +noncomputable def toCovAlgebraRealization : + CovAlgebraRealization B (repGlobal repJet) repLorentz massWeightPoly where + toAlgHom := h.toAlgHom.comp AlgebraRealization.id.covAlgebra.val + map_repGauge g x := h.map_repJet (JetGaugeGroupI.ofConstant g) (x : JetAlgebra) + map_repLorentz Λ x := h.map_repLorentz Λ (x : JetAlgebra) + map_massWeight x := by + show massWeightPoly (h.toAlgHom (x : JetAlgebra)) = _ + rw [h.map_massWeight, ← AlgebraRealization.id.mapAlgHom_covMassWeightPoly x] + exact AlgHom.congr_fun + (Polynomial.mapAlgHom_comp _ h.toAlgHom AlgebraRealization.id.covAlgebra.val) _ + repGauge_mul := h.repGlobal_mul + repLorentz_mul := h.repLorentz_mul + +/-! + +### F.1. The covariant towers agree + +-/ + +/-- The defining map of a Standard Model carries the jet algebra's gauge-field symbols to its + own: both are the jet algebra's, one of them pushed forward. -/ +lemma toAlgHom_id_A (p : Multiset (Fin 1 ⊕ Fin 3)) (ρ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra) : + h.toAlgHom (AlgebraRealization.id.A p ρ ψ) = h.A p ρ ψ := rfl + +/-- The field-strength tower of the covariant Standard Model carried by a Standard Model is + its own field-strength tower. -/ +@[simp] +lemma toCovAlgebraRealization_covF {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (μ ν : Fin 1 ⊕ Fin 3) : + h.toCovAlgebraRealization.covF l μ ν = h.covF l μ ν := by + refine LinearMap.ext fun φ => ?_ + have hb : h.toCovAlgebraRealization.covF l μ ν φ + = h.toAlgHom (AlgebraRealization.id.covF l μ ν φ) := rfl + rw [hb] + exact IsGaugeField.iteratedCovDerivAdjoint_map' h.toAlgHom h.toAlgHom_id_A + (F := IsGaugeField.fieldStrength AlgebraRealization.id.A μ ν) + (F' := IsGaugeField.fieldStrength h.A μ ν) + (fun s χ => IsGaugeField.fieldStrength_map' (A := AlgebraRealization.id.A) (A' := h.A) + h.toAlgHom h.toAlgHom_id_A μ ν s χ) + (List.ofFn l) 0 φ + +/-- The higgs tower of the covariant Standard Model carried by a Standard Model is its own. -/ +@[simp] +lemma toCovAlgebraRealization_covH {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + h.toCovAlgebraRealization.covH l = h.covDerivH l := by + refine LinearMap.ext fun φ => ?_ + have hb : h.toCovAlgebraRealization.covH l φ + = h.toAlgHom (AlgebraRealization.id.covDerivH l φ) := rfl + rw [hb] + exact IsGaugeField.covDerivIter_map' h.toAlgHom h.toAlgHom_id_A + (F := AlgebraRealization.id.H ) (F' := h.H ) (fun s χ => rfl) n l 0 φ + +/-- The conjugate higgs tower of the covariant Standard Model carried by a Standard Model is + its own. -/ +@[simp] +lemma toCovAlgebraRealization_covBarH {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + h.toCovAlgebraRealization.covBarH l = h.covDerivBarH l := by + refine LinearMap.ext fun φ => ?_ + have hb : h.toCovAlgebraRealization.covBarH l φ + = h.toAlgHom (AlgebraRealization.id.covDerivBarH l φ) := rfl + rw [hb] + exact IsGaugeField.covDerivIter_map' h.toAlgHom h.toAlgHom_id_A + (F := AlgebraRealization.id.barH ) (F' := h.barH ) (fun s χ => rfl) n l 0 φ + +/-- The down-type quark tower of the covariant Standard Model carried by a Standard Model is + its own. -/ +@[simp] +lemma toCovAlgebraRealization_covD (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + h.toCovAlgebraRealization.covD i l = h.covDerivD i l := by + refine LinearMap.ext fun φ => ?_ + have hb : h.toCovAlgebraRealization.covD i l φ + = h.toAlgHom (AlgebraRealization.id.covDerivD i l φ) := rfl + rw [hb] + exact IsGaugeField.covDerivIter_map' h.toAlgHom h.toAlgHom_id_A + (F := AlgebraRealization.id.d i ) (F' := h.d i ) (fun s χ => rfl) n l 0 φ + +/-- The conjugate down-type quark tower of the covariant Standard Model carried by a Standard + Model is its own. -/ +@[simp] +lemma toCovAlgebraRealization_covBarD (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + h.toCovAlgebraRealization.covBarD i l = h.covDerivBarD i l := by + refine LinearMap.ext fun φ => ?_ + have hb : h.toCovAlgebraRealization.covBarD i l φ + = h.toAlgHom (AlgebraRealization.id.covDerivBarD i l φ) := rfl + rw [hb] + exact IsGaugeField.covDerivIter_map' h.toAlgHom h.toAlgHom_id_A + (F := AlgebraRealization.id.bard i ) (F' := h.bard i ) (fun s χ => rfl) n l 0 φ + +/-- The up-type quark tower of the covariant Standard Model carried by a Standard Model is its + own. -/ +@[simp] +lemma toCovAlgebraRealization_covU (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + h.toCovAlgebraRealization.covU i l = h.covDerivU i l := by + refine LinearMap.ext fun φ => ?_ + have hb : h.toCovAlgebraRealization.covU i l φ + = h.toAlgHom (AlgebraRealization.id.covDerivU i l φ) := rfl + rw [hb] + exact IsGaugeField.covDerivIter_map' h.toAlgHom h.toAlgHom_id_A + (F := AlgebraRealization.id.u i ) (F' := h.u i ) (fun s χ => rfl) n l 0 φ + +/-- The conjugate up-type quark tower of the covariant Standard Model carried by a Standard + Model is its own. -/ +@[simp] +lemma toCovAlgebraRealization_covBarU (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + h.toCovAlgebraRealization.covBarU i l = h.covDerivBarU i l := by + refine LinearMap.ext fun φ => ?_ + have hb : h.toCovAlgebraRealization.covBarU i l φ + = h.toAlgHom (AlgebraRealization.id.covDerivBarU i l φ) := rfl + rw [hb] + exact IsGaugeField.covDerivIter_map' h.toAlgHom h.toAlgHom_id_A + (F := AlgebraRealization.id.baru i ) (F' := h.baru i ) (fun s χ => rfl) n l 0 φ + +/-- The quark doublet tower of the covariant Standard Model carried by a Standard Model is its + own. -/ +@[simp] +lemma toCovAlgebraRealization_covQ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + h.toCovAlgebraRealization.covQ i l = h.covDerivQ i l := by + refine LinearMap.ext fun φ => ?_ + have hb : h.toCovAlgebraRealization.covQ i l φ + = h.toAlgHom (AlgebraRealization.id.covDerivQ i l φ) := rfl + rw [hb] + exact IsGaugeField.covDerivIter_map' h.toAlgHom h.toAlgHom_id_A + (F := AlgebraRealization.id.Q i ) (F' := h.Q i ) (fun s χ => rfl) n l 0 φ + +/-- The conjugate quark doublet tower of the covariant Standard Model carried by a Standard + Model is its own. -/ +@[simp] +lemma toCovAlgebraRealization_covBarQ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + h.toCovAlgebraRealization.covBarQ i l = h.covDerivBarQ i l := by + refine LinearMap.ext fun φ => ?_ + have hb : h.toCovAlgebraRealization.covBarQ i l φ + = h.toAlgHom (AlgebraRealization.id.covDerivBarQ i l φ) := rfl + rw [hb] + exact IsGaugeField.covDerivIter_map' h.toAlgHom h.toAlgHom_id_A + (F := AlgebraRealization.id.barQ i ) (F' := h.barQ i ) (fun s χ => rfl) n l 0 φ + +/-- The lepton doublet tower of the covariant Standard Model carried by a Standard Model is + its own. -/ +@[simp] +lemma toCovAlgebraRealization_covL (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + h.toCovAlgebraRealization.covL i l = h.covDerivL i l := by + refine LinearMap.ext fun φ => ?_ + have hb : h.toCovAlgebraRealization.covL i l φ + = h.toAlgHom (AlgebraRealization.id.covDerivL i l φ) := rfl + rw [hb] + exact IsGaugeField.covDerivIter_map' h.toAlgHom h.toAlgHom_id_A + (F := AlgebraRealization.id.L i ) (F' := h.L i ) (fun s χ => rfl) n l 0 φ + +/-- The conjugate lepton doublet tower of the covariant Standard Model carried by a Standard + Model is its own. -/ +@[simp] +lemma toCovAlgebraRealization_covBarL (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + h.toCovAlgebraRealization.covBarL i l = h.covDerivBarL i l := by + refine LinearMap.ext fun φ => ?_ + have hb : h.toCovAlgebraRealization.covBarL i l φ + = h.toAlgHom (AlgebraRealization.id.covDerivBarL i l φ) := rfl + rw [hb] + exact IsGaugeField.covDerivIter_map' h.toAlgHom h.toAlgHom_id_A + (F := AlgebraRealization.id.barL i ) (F' := h.barL i ) (fun s χ => rfl) n l 0 φ + +/-- The charged-lepton singlet tower of the covariant Standard Model carried by a Standard + Model is its own. -/ +@[simp] +lemma toCovAlgebraRealization_covE (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + h.toCovAlgebraRealization.covE i l = h.covDerivE i l := by + refine LinearMap.ext fun φ => ?_ + have hb : h.toCovAlgebraRealization.covE i l φ + = h.toAlgHom (AlgebraRealization.id.covDerivE i l φ) := rfl + rw [hb] + exact IsGaugeField.covDerivIter_map' h.toAlgHom h.toAlgHom_id_A + (F := AlgebraRealization.id.e i ) (F' := h.e i ) (fun s χ => rfl) n l 0 φ + +/-- The conjugate charged-lepton singlet tower of the covariant Standard Model carried by a + Standard Model is its own. -/ +@[simp] +lemma toCovAlgebraRealization_covBarE (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + h.toCovAlgebraRealization.covBarE i l = h.covDerivBarE i l := by + refine LinearMap.ext fun φ => ?_ + have hb : h.toCovAlgebraRealization.covBarE i l φ + = h.toAlgHom (AlgebraRealization.id.covDerivBarE i l φ) := rfl + rw [hb] + exact IsGaugeField.covDerivIter_map' h.toAlgHom h.toAlgHom_id_A + (F := AlgebraRealization.id.bare i ) (F' := h.bare i ) (fun s χ => rfl) n l 0 φ end AlgebraRealization + end StandardModel diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/FermionGaugeSector/Basic.lean b/Physlib/Particles/StandardModel/CovAlgebraRealization/FermionGaugeSector/Basic.lean similarity index 80% rename from Physlib/Particles/StandardModel/IsCovStandardModel/FermionGaugeSector/Basic.lean rename to Physlib/Particles/StandardModel/CovAlgebraRealization/FermionGaugeSector/Basic.lean index 5777f8bf6..f35bc1b68 100644 --- a/Physlib/Particles/StandardModel/IsCovStandardModel/FermionGaugeSector/Basic.lean +++ b/Physlib/Particles/StandardModel/CovAlgebraRealization/FermionGaugeSector/Basic.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.IsCovStandardModel.Sectors +public import Physlib.Particles.StandardModel.CovAlgebraRealization.Sectors /-! # The mixed gauge-fermion sector @@ -35,32 +35,13 @@ namespace StandardModel open TensorProduct Matrix MatrixGroups Lorentz -namespace IsCovStandardModel +namespace CovAlgebraRealization 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) + (h : CovAlgebraRealization B repGauge repLorentz massWeightPoly) /-! @@ -76,13 +57,13 @@ 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 μ ν)), + (ν : Fin 1 ⊕ Fin 3), Set.range (h.covF 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 + Set.range (h.covD i l) ∪ Set.range (h.covBarD i l) ∪ + Set.range (h.covU i l) ∪ Set.range (h.covBarU i l) ∪ + Set.range (h.covQ i l) ∪ Set.range (h.covBarQ i l) ∪ + Set.range (h.covL i l) ∪ Set.range (h.covBarL i l) ∪ + Set.range (h.covE i l) ∪ Set.range (h.covBarE 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 @@ -226,6 +207,6 @@ lemma sectorMassWeight_gauge_fermion_seven : have := h.mul_mem_sectorMassWeight hx hy rwa [hset] at this -end IsCovStandardModel +end CovAlgebraRealization end StandardModel diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/FermionGaugeSector/MassWeight.lean b/Physlib/Particles/StandardModel/CovAlgebraRealization/FermionGaugeSector/MassWeight.lean similarity index 81% rename from Physlib/Particles/StandardModel/IsCovStandardModel/FermionGaugeSector/MassWeight.lean rename to Physlib/Particles/StandardModel/CovAlgebraRealization/FermionGaugeSector/MassWeight.lean index e989d9e98..6916a67a0 100644 --- a/Physlib/Particles/StandardModel/IsCovStandardModel/FermionGaugeSector/MassWeight.lean +++ b/Physlib/Particles/StandardModel/CovAlgebraRealization/FermionGaugeSector/MassWeight.lean @@ -5,8 +5,8 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.IsCovStandardModel.FermionGaugeSector.Basic -public import Physlib.Particles.StandardModel.IsCovStandardModel.YukawaSector.MassDimLTEight +public import Physlib.Particles.StandardModel.CovAlgebraRealization.FermionGaugeSector.Basic +public import Physlib.Particles.StandardModel.CovAlgebraRealization.YukawaSector.MassDimLTEight public import Physlib.Particles.StandardModel.IsGaugeSector.DerivSubmodule.BoostWeightDecomposition -- The fermion boost weights enter only inside the proofs below, so this import is kept -- private: its public form is one character over the line-length limit. @@ -53,36 +53,13 @@ namespace StandardModel open TensorProduct Matrix MatrixGroups Lorentz Lorentz.BoostWeight -namespace IsCovStandardModel +namespace CovAlgebraRealization 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) + (h : CovAlgebraRealization B repGauge repLorentz massWeightPoly) /-! @@ -101,7 +78,7 @@ their product, and even plus odd is odd. private noncomputable def gaugeFermionBoostWeight (a b : ℕ) (i : Fin 3) : WeightDecomposition repLorentz i (h.isGaugeSector.derivSubmodule a * h.isFermionSector.derivSubmodule b) := - WeightDecomposition.mulOfMul hrepLorentz_mul + WeightDecomposition.mulOfMul h.repLorentz_mul (h.isGaugeSector.derivSubmoduleBoostWeight a i) (h.isFermionSector.derivSubmoduleBoostWeight b i) @@ -204,6 +181,6 @@ theorem mem_sectorMassWeight_gauge_fermion_lt_nine_sup_and_gauge_lorentz_invaria ⟨fun hx => ⟨h.mem_of_invariant_sectorMassWeight_gauge_fermion_lt_nine_sup w hw S hSL hx.1 hx.2.2, hx.2⟩, fun hx => ⟨Submodule.mem_sup_right hx.1, hx.2⟩⟩ -end IsCovStandardModel +end CovAlgebraRealization end StandardModel diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/GaugeHiggsSector/Basic.lean b/Physlib/Particles/StandardModel/CovAlgebraRealization/GaugeHiggsSector/Basic.lean similarity index 84% rename from Physlib/Particles/StandardModel/IsCovStandardModel/GaugeHiggsSector/Basic.lean rename to Physlib/Particles/StandardModel/CovAlgebraRealization/GaugeHiggsSector/Basic.lean index c701b9961..243f32692 100644 --- a/Physlib/Particles/StandardModel/IsCovStandardModel/GaugeHiggsSector/Basic.lean +++ b/Physlib/Particles/StandardModel/CovAlgebraRealization/GaugeHiggsSector/Basic.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.IsCovStandardModel.Sectors +public import Physlib.Particles.StandardModel.CovAlgebraRealization.Sectors public import Physlib.Particles.StandardModel.IsHiggsSector.MassWeight.Basic /-! # The mixed gauge-Higgs sector @@ -35,41 +35,22 @@ namespace StandardModel open TensorProduct Matrix MatrixGroups Lorentz -namespace IsCovStandardModel +namespace CovAlgebraRealization 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) + (h : CovAlgebraRealization B repGauge repLorentz massWeightPoly) /-- 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 μ ν)), + (ν : Fin 1 ⊕ Fin 3), Set.range (h.covF l μ ν)), ∀ b ∈ (⋃ (k : ℕ) (dd : Fin k → (Fin 1 ⊕ Fin 3)), - Set.range (H dd) ∪ Set.range (barH dd)), Commute a b := by + Set.range (h.covH dd) ∪ Set.range (h.covBarH 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 @@ -251,6 +232,6 @@ lemma sectorMassWeight_gauge_higgs_eight : ho 1 (by decide), ho 3 (by decide), ho 5 (by decide), ho 7 (by decide), bot_le] -end IsCovStandardModel +end CovAlgebraRealization end StandardModel diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/GaugeHiggsSector/MassWeight.lean b/Physlib/Particles/StandardModel/CovAlgebraRealization/GaugeHiggsSector/MassWeight.lean similarity index 90% rename from Physlib/Particles/StandardModel/IsCovStandardModel/GaugeHiggsSector/MassWeight.lean rename to Physlib/Particles/StandardModel/CovAlgebraRealization/GaugeHiggsSector/MassWeight.lean index 9da4d6ee9..ac3693cc9 100644 --- a/Physlib/Particles/StandardModel/IsCovStandardModel/GaugeHiggsSector/MassWeight.lean +++ b/Physlib/Particles/StandardModel/CovAlgebraRealization/GaugeHiggsSector/MassWeight.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.IsCovStandardModel.GaugeHiggsSector.Basic +public import Physlib.Particles.StandardModel.CovAlgebraRealization.GaugeHiggsSector.Basic public import Physlib.Particles.StandardModel.IsGaugeSector.MassWeight.MassDimLTEight /-! # The gauge-Higgs invariants below mass weight nine @@ -217,36 +217,13 @@ lemma repLorentz_mem_sup_of_stable {V W : Submodule ℂ B} end Peeling -namespace IsCovStandardModel +namespace CovAlgebraRealization 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) + (h : CovAlgebraRealization B repGauge repLorentz massWeightPoly) /-! @@ -308,12 +285,12 @@ theorem mem_of_lorentz_invariant_derivSubmodule_zero_mul_fixed_sup (C : Submodul (hx : x ∈ h.isGaugeSector.derivSubmodule 0 * C ⊔ S) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by have hT : ∀ i : Module.Dual ℝ GaugeAlgebra × C, IsBiLorentz B repLorentz - (fun l : Fin 2 → Fin 1 ⊕ Fin 3 => F ![] (l 0) (l 1) i.1 * (i.2 : B)) := - fun i => (h.isGaugeSector.isBiLorentz_F_underived i.1).mul_fixed hrepLorentz_mul + (fun l : Fin 2 → Fin 1 ⊕ Fin 3 => h.covF ![] (l 0) (l 1) i.1 * (i.2 : B)) := + fun i => (h.isGaugeSector.isBiLorentz_F_underived i.1).mul_fixed h.repLorentz_mul fun g => hC g (i.2 : B) i.2.2 have hzero : ∀ i : Module.Dual ℝ GaugeAlgebra × C, IsBiLorentz.metricContraction - (T := fun l : Fin 2 → Fin 1 ⊕ Fin 3 => F ![] (l 0) (l 1) i.1 * (i.2 : B)) = 0 := by + (T := fun l : Fin 2 → Fin 1 ⊕ Fin 3 => h.covF ![] (l 0) (l 1) i.1 * (i.2 : B)) = 0 := by intro i refine IsGaugeSector.metricContraction_eq_zero_of_antisymm fun a b => ?_ simp only [Matrix.cons_val_zero, Matrix.cons_val_one] @@ -342,8 +319,8 @@ theorem mem_of_lorentz_invariant_derivSubmodule_one_mul_fixed_sup (C : Submodule (hx : x ∈ h.isGaugeSector.derivSubmodule 1 * C ⊔ S) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by have hT : ∀ i : Module.Dual ℝ GaugeAlgebra × C, IsTriLorentz B repLorentz - (fun l : Fin 3 → Fin 1 ⊕ Fin 3 => F ![l 0] (l 1) (l 2) i.1 * (i.2 : B)) := - fun i => (h.isGaugeSector.isTriLorentz_F_deriv_one i.1).mul_fixed hrepLorentz_mul + (fun l : Fin 3 → Fin 1 ⊕ Fin 3 => h.covF ![l 0] (l 1) (l 2) i.1 * (i.2 : B)) := + fun i => (h.isGaugeSector.isTriLorentz_F_deriv_one i.1).mul_fixed h.repLorentz_mul fun g => hC g (i.2 : B) i.2.2 refine mem_of_lorentz_invariant_iSup_isTriLorentz_span hT S hSL ?_ hinv refine sup_le_sup_right ?_ S hx @@ -369,9 +346,9 @@ theorem mem_of_lorentz_invariant_derivSubmodule_zero_mul_higgs_one_sup (S : Subm (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by have hU : ∀ (j : Module.Dual ℂ HiggsVec ⊕ Module.Dual ℂ (ConjModule HiggsVec)) (g : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3), - repLorentz g (Sum.elim (fun φ => H ![μ] φ) (fun ψ => barH ![μ] ψ) j) + repLorentz g (Sum.elim (fun φ => h.covH ![μ] φ) (fun ψ => h.covBarH ![μ] ψ) j) = ∑ ν : Fin 1 ⊕ Fin 3, (((SL2C.toLorentzGroup g).1 ν μ : ℝ) : ℂ) • - Sum.elim (fun φ => H ![ν] φ) (fun ψ => barH ![ν] ψ) j := by + Sum.elim (fun φ => h.covH ![ν] φ) (fun ψ => h.covBarH ![ν] ψ) j := by rintro (φ | ψ) g μ · simp only [Sum.elim_inl] rw [h.isHiggsSector.repLorentz_H_apply g φ 1 ![μ], IsGaugeSector.sum_cov_one] @@ -381,16 +358,16 @@ theorem mem_of_lorentz_invariant_derivSubmodule_zero_mul_higgs_one_sup (S : Subm exact Finset.sum_congr rfl fun ν _ => by simp have hT : ∀ i : Module.Dual ℝ GaugeAlgebra × (Module.Dual ℂ HiggsVec ⊕ Module.Dual ℂ (ConjModule HiggsVec)), - IsTriLorentz B repLorentz (fun l : Fin 3 → Fin 1 ⊕ Fin 3 => F ![] (l 0) (l 1) i.1 * - Sum.elim (fun φ => H ![l 2] φ) (fun ψ => barH ![l 2] ψ) i.2) := + IsTriLorentz B repLorentz (fun l : Fin 3 → Fin 1 ⊕ Fin 3 => h.covF ![] (l 0) (l 1) i.1 * + Sum.elim (fun φ => h.covH ![l 2] φ) (fun ψ => h.covBarH ![l 2] ψ) i.2) := fun i => (h.isGaugeSector.isBiLorentz_F_underived i.1).isTriLorentz_mul_vector - hrepLorentz_mul (hU i.2) + h.repLorentz_mul (hU i.2) refine mem_of_lorentz_invariant_iSup_isTriLorentz_span hT S hSL ?_ hinv refine sup_le_sup_right ?_ S hx refine Submodule.mul_le.mpr fun a ha b hb => ?_ have key : ∀ (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), h.isHiggsSector.derivSubmodule 1 - ≤ Submodule.comap (LinearMap.mulLeft ℂ (F ![] μ ν φ)) (⨆ i, (hT i).span) := by + ≤ Submodule.comap (LinearMap.mulLeft ℂ (h.covF ![] μ ν φ)) (⨆ i, (hT i).span) := by intro μ ν φ rw [IsHiggsSector.derivSubmodule] refine sup_le ?_ ?_ @@ -461,13 +438,13 @@ theorem mem_of_lorentz_invariant_sectorMassWeight_gauge_higgs_eight_sup (S : Sub fun g y hy => h.repLorentz_eq_self_of_mem_higgs_derivSubmodule_zero g hy have hH0H0 : ∀ (g : SL(2,ℂ)), ∀ y ∈ h.isHiggsSector.derivSubmodule 0 * h.isHiggsSector.derivSubmodule 0, repLorentz g y = y := - repLorentz_eq_self_of_mem_mul hrepLorentz_mul hH0 hH0 + repLorentz_eq_self_of_mem_mul h.repLorentz_mul hH0 hH0 have hGst : ∀ (n : ℕ) (g : SL(2,ℂ)), ∀ y ∈ h.isGaugeSector.derivSubmodule n, repLorentz g y ∈ h.isGaugeSector.derivSubmodule n := fun n g y hy => h.isGaugeSector.derivSubmodule_map_repLorentz_le n g ⟨y, hy, rfl⟩ - have hBst := repLorentz_mem_mul_of_stable hrepLorentz_mul (hGst 0) + have hBst := repLorentz_mem_mul_of_stable h.repLorentz_mul (hGst 0) (repLorentz_mem_of_fixed hH0H0) - have hCst := repLorentz_mem_mul_of_stable hrepLorentz_mul (hGst 1) + have hCst := repLorentz_mem_mul_of_stable h.repLorentz_mul (hGst 1) (repLorentz_mem_of_fixed hH0) rw [h.sectorMassWeight_gauge_higgs_eight, mul_assoc, sup_assoc, sup_assoc] at hx exact h.mem_of_lorentz_invariant_derivSubmodule_one_mul_fixed_sup _ hH0 S hSL @@ -540,6 +517,6 @@ theorem mem_sectorMassWeight_gauge_higgs_lt_nine_sup_and_gauge_lorentz_invariant ⟨fun hx => ⟨h.mem_of_invariant_sectorMassWeight_gauge_higgs_lt_nine_sup w hw S hSL hx.1 hx.2.2, hx.2⟩, fun hx => ⟨Submodule.mem_sup_right hx.1, hx.2⟩⟩ -end IsCovStandardModel +end CovAlgebraRealization end StandardModel diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/Generators.lean b/Physlib/Particles/StandardModel/CovAlgebraRealization/Generators.lean similarity index 93% rename from Physlib/Particles/StandardModel/IsCovStandardModel/Generators.lean rename to Physlib/Particles/StandardModel/CovAlgebraRealization/Generators.lean index 327caf8bf..4c870c9e4 100644 --- a/Physlib/Particles/StandardModel/IsCovStandardModel/Generators.lean +++ b/Physlib/Particles/StandardModel/CovAlgebraRealization/Generators.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.IsCovStandardModel.Basic +public import Physlib.Particles.StandardModel.CovAlgebraRealization.Basic public import Mathlib.Algebra.Algebra.NonUnitalSubalgebra /-! # The covariant generators of the field algebra @@ -17,7 +17,7 @@ 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`. +The grading of the algebra by mass weight is in `CovAlgebraRealization.MassWeight`. -/ @@ -28,32 +28,13 @@ namespace StandardModel open TensorProduct Matrix MatrixGroups Lorentz -namespace IsCovStandardModel +namespace CovAlgebraRealization 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) + (h : CovAlgebraRealization B repGauge repLorentz massWeightPoly) /-! @@ -355,21 +336,20 @@ 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 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) - | .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) + (h : CovAlgebraRealization B repGauge repLorentz massWeightPoly) : Generators → B + | .H _ l j => h.covH l (HiggsVec.orthonormBasis.toBasis.coord j) + | .barH _ l j => h.covBarH l (HiggsVec.orthonormBasis.toBasis.conj.coord j) + | .F _ l μ ν j => h.covF l μ ν (GaugeAlgebra.stdBasis.coord j) + | .d i _ l j => h.covD i l (DownSinglet.basis.coord j) + | .bard i _ l j => h.covBarD i l (DownSinglet.basis.conj.coord j) + | .u i _ l j => h.covU i l (UpSinglet.basis.coord j) + | .baru i _ l j => h.covBarU i l (UpSinglet.basis.conj.coord j) + | .Q i _ l j => h.covQ i l (QuarkDoublet.basis.coord j) + | .barQ i _ l j => h.covBarQ i l (QuarkDoublet.basis.conj.coord j) + | .L i _ l j => h.covL i l (LeptonDoublet.basis.coord j) + | .barL i _ l j => h.covBarL i l (LeptonDoublet.basis.conj.coord j) + | .e i _ l j => h.covE i l (LeptonSinglet.basis.coord j) + | .bare i _ l j => h.covBarE i l (LeptonSinglet.basis.conj.coord j) /-- Every covariant generator is a `massWeightPoly`-eigenvector of its weight. -/ lemma massWeightPoly_generatorVal (g : Generators) : @@ -566,7 +546,7 @@ of the product of their total weights. 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 + Commute (h.covF 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' _ @@ -585,7 +565,7 @@ lemma commute_F_generatorVal {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : /-- 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 + Commute (h.covH l φ) (h.generatorVal g) := by cases g with | H n' l' j => exact h.isHiggsSector.H_comm_H φ _ _ _ l l' | barH n' l' j => exact h.isHiggsSector.H_comm_barH φ _ _ _ l l' @@ -605,7 +585,7 @@ lemma commute_H_generatorVal {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) 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 + Commute (h.covBarH l φ) (h.generatorVal g) := by cases g with | 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' @@ -1068,6 +1048,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] -end IsCovStandardModel +end CovAlgebraRealization end StandardModel diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/MassWeight.lean b/Physlib/Particles/StandardModel/CovAlgebraRealization/MassWeight.lean similarity index 87% rename from Physlib/Particles/StandardModel/IsCovStandardModel/MassWeight.lean rename to Physlib/Particles/StandardModel/CovAlgebraRealization/MassWeight.lean index df89e1b6d..bda580903 100644 --- a/Physlib/Particles/StandardModel/IsCovStandardModel/MassWeight.lean +++ b/Physlib/Particles/StandardModel/CovAlgebraRealization/MassWeight.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.IsCovStandardModel.Generators +public import Physlib.Particles.StandardModel.CovAlgebraRealization.Generators /-! # The mass-weight grading of the field algebra @@ -25,32 +25,13 @@ namespace StandardModel open TensorProduct Matrix MatrixGroups Lorentz -namespace IsCovStandardModel +namespace CovAlgebraRealization 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) + (h : CovAlgebraRealization B repGauge repLorentz massWeightPoly) /-! @@ -64,8 +45,7 @@ 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 hrepGauge_mul repLorentz hrepLorentz_mul - massWeightPoly H barH F d bard u baru Q barQ L barL e bare) (n : ℕ) : Submodule ℂ B := + (h : CovAlgebraRealization B repGauge repLorentz massWeightPoly) (n : ℕ) : Submodule ℂ B := (h.fieldAlgebra).toSubmodule ⊓ LinearMap.ker (massWeightPoly.toLinearMap - (Polynomial.monomial n : B →ₗ[B] Polynomial B).restrictScalars ℂ) @@ -222,7 +202,7 @@ lemma mul_mem_massWeightSubmodule {w w2 : ℕ} {x y : B} /-- 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 + (φ : Module.Dual ℂ HiggsVec) : h.covH 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 _ _ ?_ @@ -232,7 +212,7 @@ lemma H_mem_massWeightSubmodule {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) /-- 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 + h.covBarH 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 _ _ ?_ @@ -242,7 +222,7 @@ lemma barH_mem_massWeightSubmodule {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) /-- 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 + h.covF 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 _ => ?_ @@ -253,7 +233,7 @@ lemma F_mem_massWeightSubmodule {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) /-- 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 + (φ : Module.Dual ℂ DownSinglet) : h.covD 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 _ _ ?_ @@ -265,7 +245,7 @@ lemma d_mem_massWeightSubmodule (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ F `(-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 + h.covD i l φ * x = ((-1 : ℂ) ^ w) • (x * h.covD i l φ) := by rw [h.mul_eq_smul_mul_of_mem_massWeightSubmodule (h.d_mem_massWeightSubmodule i l φ) hx] congr 1 rw [pow_mul] @@ -275,7 +255,7 @@ lemma d_supercommute_mem_massWeightSubmodule (i : Fin 3) {n : ℕ} {l : Fin n /-- 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 + (φ : Module.Dual ℂ (ConjModule DownSinglet)) : h.covBarD 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 _ _ ?_ @@ -284,7 +264,7 @@ lemma bard_mem_massWeightSubmodule (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 /-- 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 + (φ : Module.Dual ℂ UpSinglet) : h.covU 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 _ _ ?_ @@ -293,7 +273,7 @@ lemma u_mem_massWeightSubmodule (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ F /-- 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 + (φ : Module.Dual ℂ (ConjModule UpSinglet)) : h.covBarU 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 _ _ ?_ @@ -302,7 +282,7 @@ lemma baru_mem_massWeightSubmodule (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 /-- 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 + (φ : Module.Dual ℂ QuarkDoublet) : h.covQ 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 _ _ ?_ @@ -311,7 +291,7 @@ lemma Q_mem_massWeightSubmodule (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ F /-- 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 + (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) : h.covBarQ 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 _ _ ?_ @@ -320,7 +300,7 @@ lemma barQ_mem_massWeightSubmodule (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 /-- 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 + (φ : Module.Dual ℂ LeptonDoublet) : h.covL 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 _ _ ?_ @@ -329,7 +309,7 @@ lemma L_mem_massWeightSubmodule (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ F /-- 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 + (φ : Module.Dual ℂ (ConjModule LeptonDoublet)) : h.covBarL 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 _ _ ?_ @@ -338,7 +318,7 @@ lemma barL_mem_massWeightSubmodule (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 /-- 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 + (φ : Module.Dual ℂ LeptonSinglet) : h.covE 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 _ _ ?_ @@ -347,7 +327,7 @@ lemma e_mem_massWeightSubmodule (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ F /-- 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 + (φ : Module.Dual ℂ (ConjModule LeptonSinglet)) : h.covBarE 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 _ _ ?_ @@ -579,6 +559,6 @@ lemma invaraint_of_eq_sum_massWeightSubmodule {n : ℕ} {x : B} ∀ 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 CovAlgebraRealization end StandardModel diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/MassWeight/Filtration.lean b/Physlib/Particles/StandardModel/CovAlgebraRealization/MassWeight/Filtration.lean similarity index 90% rename from Physlib/Particles/StandardModel/IsCovStandardModel/MassWeight/Filtration.lean rename to Physlib/Particles/StandardModel/CovAlgebraRealization/MassWeight/Filtration.lean index d240cb756..ebed5bfa3 100644 --- a/Physlib/Particles/StandardModel/IsCovStandardModel/MassWeight/Filtration.lean +++ b/Physlib/Particles/StandardModel/CovAlgebraRealization/MassWeight/Filtration.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.IsCovStandardModel.MassWeight.Invariants +public import Physlib.Particles.StandardModel.CovAlgebraRealization.MassWeight.Invariants /-! # The mass-weight filtration and the constant term @@ -51,37 +51,13 @@ namespace StandardModel open TensorProduct Matrix MatrixGroups Lorentz -namespace IsCovStandardModel +namespace CovAlgebraRealization 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) + (h : CovAlgebraRealization B repGauge repLorentz massWeightPoly) /-! @@ -413,6 +389,6 @@ theorem mem_massWeightSubmoduleLE_eight_sup_and_gauge_lorentz_invariant_iff_lagr rw [← h.standardModelSpanLE_eight] exact h.mem_massWeightSubmoduleLE_eight_sup_and_gauge_lorentz_invariant_iff S hS hSL x -end IsCovStandardModel +end CovAlgebraRealization end StandardModel diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/MassWeight/Invariants.lean b/Physlib/Particles/StandardModel/CovAlgebraRealization/MassWeight/Invariants.lean similarity index 92% rename from Physlib/Particles/StandardModel/IsCovStandardModel/MassWeight/Invariants.lean rename to Physlib/Particles/StandardModel/CovAlgebraRealization/MassWeight/Invariants.lean index 6acd658d4..35c50d6f0 100644 --- a/Physlib/Particles/StandardModel/IsCovStandardModel/MassWeight/Invariants.lean +++ b/Physlib/Particles/StandardModel/CovAlgebraRealization/MassWeight/Invariants.lean @@ -5,10 +5,10 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.IsCovStandardModel.FermionGaugeSector.MassWeight -public import Physlib.Particles.StandardModel.IsCovStandardModel.GaugeHiggsSector.MassWeight -public import Physlib.Particles.StandardModel.IsCovStandardModel.MixedSector.Basic -public import Physlib.Particles.StandardModel.IsCovStandardModel.YukawaSector.MassDimEight +public import Physlib.Particles.StandardModel.CovAlgebraRealization.FermionGaugeSector.MassWeight +public import Physlib.Particles.StandardModel.CovAlgebraRealization.GaugeHiggsSector.MassWeight +public import Physlib.Particles.StandardModel.CovAlgebraRealization.MixedSector.Basic +public import Physlib.Particles.StandardModel.CovAlgebraRealization.YukawaSector.MassDimEight public import Physlib.Particles.StandardModel.IsFermionSector.MassWeight.MassDimEight public import Physlib.Particles.StandardModel.IsFermionSector.MassWeight.MassDimLTEight public import Physlib.Particles.StandardModel.IsGaugeSector.MassWeight.MassDimEight @@ -35,7 +35,7 @@ The join is the delicate step. `massWeightSubmodule_eq_iSup_sectorMassWeight` wr weight-`w` submodule as the join of the eight sectors' weight-`w` parts, but reading off from an invariant of the whole that its eight pieces are separately invariant would need the pieces to be determined by their sum — the independence of the sectors, which does -not follow from `IsCovStandardModel` and is deliberately left open in `Sectors.lean`. +not follow from `CovAlgebraRealization` and is deliberately left open in `Sectors.lean`. Nothing here uses it. The classifications are carried in the shared form `Peels σ V W` of `Peeling.lean` — every `σ`-invariant of `V ⊔ S` lies in `W ⊔ S`, for every `σ`-stable `S` @@ -70,37 +70,13 @@ namespace StandardModel open TensorProduct Matrix MatrixGroups Lorentz -namespace IsCovStandardModel +namespace CovAlgebraRealization 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) + (h : CovAlgebraRealization B repGauge repLorentz massWeightPoly) /-! @@ -559,6 +535,6 @@ theorem mem_massWeightSubmodule_four_sup_and_gauge_lorentz_invariant_iff_higgsMa exact h.mem_massWeightSubmodule_sup_and_gauge_lorentz_invariant_iff 4 (by norm_num) (by norm_num) S hS hSL x -end IsCovStandardModel +end CovAlgebraRealization end StandardModel diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/MixedSector/Basic.lean b/Physlib/Particles/StandardModel/CovAlgebraRealization/MixedSector/Basic.lean similarity index 76% rename from Physlib/Particles/StandardModel/IsCovStandardModel/MixedSector/Basic.lean rename to Physlib/Particles/StandardModel/CovAlgebraRealization/MixedSector/Basic.lean index 6763943fe..009ba466f 100644 --- a/Physlib/Particles/StandardModel/IsCovStandardModel/MixedSector/Basic.lean +++ b/Physlib/Particles/StandardModel/CovAlgebraRealization/MixedSector/Basic.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.IsCovStandardModel.Sectors +public import Physlib.Particles.StandardModel.CovAlgebraRealization.Sectors /-! # The mixed sector @@ -40,36 +40,13 @@ namespace StandardModel open TensorProduct Matrix MatrixGroups Lorentz -namespace IsCovStandardModel +namespace CovAlgebraRealization 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) + (h : CovAlgebraRealization B repGauge repLorentz massWeightPoly) /-! @@ -159,6 +136,6 @@ theorem mem_sectorMassWeight_mixed_lt_nine_sup_and_gauge_lorentz_invariant_iff_m ⟨fun hx => ⟨h.mem_of_invariant_sectorMassWeight_mixed_lt_nine_sup w hw S hx.1, hx.2⟩, fun hx => ⟨Submodule.mem_sup_right hx.1, hx.2⟩⟩ -end IsCovStandardModel +end CovAlgebraRealization end StandardModel diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/Sectors.lean b/Physlib/Particles/StandardModel/CovAlgebraRealization/Sectors.lean similarity index 93% rename from Physlib/Particles/StandardModel/IsCovStandardModel/Sectors.lean rename to Physlib/Particles/StandardModel/CovAlgebraRealization/Sectors.lean index 8921f1c16..ddeba9b88 100644 --- a/Physlib/Particles/StandardModel/IsCovStandardModel/Sectors.lean +++ b/Physlib/Particles/StandardModel/CovAlgebraRealization/Sectors.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.IsCovStandardModel.MassWeight +public import Physlib.Particles.StandardModel.CovAlgebraRealization.MassWeight /-! # The sectors of the field algebra @@ -29,32 +29,13 @@ namespace StandardModel open TensorProduct Matrix MatrixGroups Lorentz -namespace IsCovStandardModel +namespace CovAlgebraRealization 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) + (h : CovAlgebraRealization B repGauge repLorentz massWeightPoly) /-! ## The different sectors of the Standard Model @@ -167,7 +148,7 @@ 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 + (φ : Module.Dual ℂ HiggsVec) : h.covH 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 _ ?_ @@ -177,7 +158,7 @@ lemma H_mem_sector {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) /-- 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 + h.covBarH 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 _ ?_ @@ -186,7 +167,7 @@ lemma barH_mem_sector {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) /-- 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 + (φ : Module.Dual ℝ GaugeAlgebra) : h.covF 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 _ => ?_ @@ -197,7 +178,7 @@ lemma F_mem_sector {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ /-- 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 + (φ : Module.Dual ℂ DownSinglet) : h.covD 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 _ ?_ @@ -206,7 +187,7 @@ lemma d_mem_sector (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) /-- 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 + (φ : Module.Dual ℂ (ConjModule DownSinglet)) : h.covBarD 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 _ ?_ @@ -215,7 +196,7 @@ lemma bard_mem_sector (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) /-- 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 + (φ : Module.Dual ℂ UpSinglet) : h.covU 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 _ ?_ @@ -224,7 +205,7 @@ lemma u_mem_sector (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) /-- 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 + (φ : Module.Dual ℂ (ConjModule UpSinglet)) : h.covBarU 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 _ ?_ @@ -233,7 +214,7 @@ lemma baru_mem_sector (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) /-- 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 + (φ : Module.Dual ℂ QuarkDoublet) : h.covQ 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 _ ?_ @@ -242,7 +223,7 @@ lemma Q_mem_sector (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) /-- 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 + (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) : h.covBarQ 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 _ ?_ @@ -251,7 +232,7 @@ lemma barQ_mem_sector (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) /-- 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 + (φ : Module.Dual ℂ LeptonDoublet) : h.covL 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 _ ?_ @@ -260,7 +241,7 @@ lemma L_mem_sector (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) /-- 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 + (φ : Module.Dual ℂ (ConjModule LeptonDoublet)) : h.covBarL 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 _ ?_ @@ -269,7 +250,7 @@ lemma barL_mem_sector (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) /-- 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 + (φ : Module.Dual ℂ LeptonSinglet) : h.covE 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 _ ?_ @@ -278,7 +259,7 @@ lemma e_mem_sector (i : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) /-- 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 + (φ : Module.Dual ℂ (ConjModule LeptonSinglet)) : h.covBarE 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 _ ?_ @@ -1057,10 +1038,10 @@ lemma sector_invariant {w : ℕ} (x : B) (hx : x ∈ h.fieldAlgebra) (∀ 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 + -- of what is missing; it does not follow from `CovAlgebraRealization`, whose axioms -- are all equations and so survive quotients that the independence does not. sorry -end IsCovStandardModel +end CovAlgebraRealization end StandardModel diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/Basic.lean b/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/Basic.lean similarity index 86% rename from Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/Basic.lean rename to Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/Basic.lean index 915ac5708..c93b6b4f5 100644 --- a/Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/Basic.lean +++ b/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/Basic.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.IsCovStandardModel.Sectors +public import Physlib.Particles.StandardModel.CovAlgebraRealization.Sectors public import Physlib.Particles.StandardModel.IsHiggsSector.MassWeight.Basic /-! # The Yukawa sector's mass-weight submodules @@ -32,32 +32,13 @@ namespace StandardModel open TensorProduct Matrix MatrixGroups Lorentz -namespace IsCovStandardModel +namespace CovAlgebraRealization 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) + (h : CovAlgebraRealization B repGauge repLorentz massWeightPoly) /-! @@ -75,12 +56,12 @@ 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)), + Set.range (h.covH dd) ∪ Set.range (h.covBarH 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 + Set.range (h.covD i dd) ∪ Set.range (h.covBarD i dd) ∪ Set.range (h.covU i dd) ∪ + Set.range (h.covBarU i dd) ∪ Set.range (h.covQ i dd) ∪ Set.range (h.covBarQ i dd) ∪ + Set.range (h.covL i dd) ∪ Set.range (h.covBarL i dd) ∪ Set.range (h.covE i dd) ∪ + Set.range (h.covBarE 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 <;> @@ -320,6 +301,6 @@ lemma sectorMassWeight_higgs_fermion_eight : rw [hb, h.isFermionSector.massWeightSubmodule_one_eq, Submodule.mul_bot] exact bot_le -end IsCovStandardModel +end CovAlgebraRealization end StandardModel diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/Families/BarHiggs.lean b/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/Families/BarHiggs.lean similarity index 94% rename from Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/Families/BarHiggs.lean rename to Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/Families/BarHiggs.lean index b06844ae2..b3079d614 100644 --- a/Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/Families/BarHiggs.lean +++ b/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/Families/BarHiggs.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.IsCovStandardModel.YukawaSector.Families.Higgs +public import Physlib.Particles.StandardModel.CovAlgebraRealization.YukawaSector.Families.Higgs /-! # The Yukawa terms built on the conjugate Higgs symbol @@ -50,37 +50,13 @@ namespace StandardModel open TensorProduct Matrix MatrixGroups Lorentz Pointwise ComplexConjugate -namespace IsCovStandardModel +namespace CovAlgebraRealization 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) + (h : CovAlgebraRealization B repGauge repLorentz massWeightPoly) /-! @@ -749,6 +725,6 @@ lemma yukawaSpan_le_inf : (le_inf (le_inf h.barLeptonYukawaSpan_le_sectorMassWeight h.barLeptonYukawaSpan_le_invariants) h.barLeptonYukawaSpan_le_lorentzInvariants) -end IsCovStandardModel +end CovAlgebraRealization end StandardModel diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/Families/Higgs.lean b/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/Families/Higgs.lean similarity index 94% rename from Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/Families/Higgs.lean rename to Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/Families/Higgs.lean index e631fefea..b8c874366 100644 --- a/Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/Families/Higgs.lean +++ b/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/Families/Higgs.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.IsCovStandardModel.YukawaSector.Families.Symbols +public import Physlib.Particles.StandardModel.CovAlgebraRealization.YukawaSector.Families.Symbols /-! # The Yukawa terms built on the Higgs symbol @@ -58,37 +58,13 @@ namespace StandardModel open TensorProduct Matrix MatrixGroups Lorentz Pointwise ComplexConjugate -namespace IsCovStandardModel +namespace CovAlgebraRealization 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) + (h : CovAlgebraRealization B repGauge repLorentz massWeightPoly) /-! @@ -737,6 +713,6 @@ lemma leptonYukawaSpan_le_lorentzInvariants : h.leptonYukawaSpan ≤ repLorentz. iSup_le fun f => iSup_le fun f' => (Submodule.span_singleton_le_iff_mem _ _).2 ((Representation.mem_invariants _ _).2 (h.repLorentz_leptonYukawa f f')) -end IsCovStandardModel +end CovAlgebraRealization end StandardModel diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/Families/Symbols.lean b/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/Families/Symbols.lean similarity index 93% rename from Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/Families/Symbols.lean rename to Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/Families/Symbols.lean index 432f1811a..1d655855b 100644 --- a/Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/Families/Symbols.lean +++ b/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/Families/Symbols.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.IsCovStandardModel.YukawaSector.Basic +public import Physlib.Particles.StandardModel.CovAlgebraRealization.YukawaSector.Basic public import Physlib.Particles.StandardModel.IsFermionSector.Components public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU3FunAntiFun @@ -69,37 +69,13 @@ namespace StandardModel open TensorProduct Matrix MatrixGroups Lorentz Pointwise ComplexConjugate -namespace IsCovStandardModel +namespace CovAlgebraRealization 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) + (h : CovAlgebraRealization B repGauge repLorentz massWeightPoly) /-! @@ -622,61 +598,61 @@ lemma barHiggs_mem_derivSubmodule {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (i : /-- The range of a down-singlet symbol map lies in the fermion derivative submodule. -/ lemma range_d_le_derivSubmodule (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : - LinearMap.range (d f l) ≤ h.isFermionSector.derivSubmodule n := + LinearMap.range (h.covD f l) ≤ h.isFermionSector.derivSubmodule n := le_iSup₂_of_le f l (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left ( le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left ( le_sup_of_le_left (le_sup_of_le_left le_sup_left)))))))) /-- The range of a conjugate down-singlet symbol map lies in the fermion derivative submodule. -/ lemma range_bard_le_derivSubmodule (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : - LinearMap.range (bard f l) ≤ h.isFermionSector.derivSubmodule n := + LinearMap.range (h.covBarD f l) ≤ h.isFermionSector.derivSubmodule n := le_iSup₂_of_le f l (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left ( le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left ( le_sup_of_le_left (le_sup_of_le_left le_sup_right)))))))) /-- The range of an up-singlet symbol map lies in the fermion derivative submodule. -/ lemma range_u_le_derivSubmodule (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : - LinearMap.range (u f l) ≤ h.isFermionSector.derivSubmodule n := + LinearMap.range (h.covU f l) ≤ h.isFermionSector.derivSubmodule n := le_iSup₂_of_le f l (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left ( le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left ( le_sup_of_le_left le_sup_right))))))) /-- The range of a conjugate up-singlet symbol map lies in the fermion derivative submodule. -/ lemma range_baru_le_derivSubmodule (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : - LinearMap.range (baru f l) ≤ h.isFermionSector.derivSubmodule n := + LinearMap.range (h.covBarU f l) ≤ h.isFermionSector.derivSubmodule n := le_iSup₂_of_le f l (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left ( le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left le_sup_right)))))) /-- The range of a quark-doublet symbol map lies in the fermion derivative submodule. -/ lemma range_Q_le_derivSubmodule (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : - LinearMap.range (Q f l) ≤ h.isFermionSector.derivSubmodule n := + LinearMap.range (h.covQ f l) ≤ h.isFermionSector.derivSubmodule n := le_iSup₂_of_le f l (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left ( le_sup_of_le_left (le_sup_of_le_left le_sup_right))))) /-- The range of a conjugate quark-doublet symbol map lies in the fermion derivative submodule. -/ lemma range_barQ_le_derivSubmodule (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : - LinearMap.range (barQ f l) ≤ h.isFermionSector.derivSubmodule n := + LinearMap.range (h.covBarQ f l) ≤ h.isFermionSector.derivSubmodule n := le_iSup₂_of_le f l (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left ( le_sup_of_le_left le_sup_right)))) /-- The range of a lepton-doublet symbol map lies in the fermion derivative submodule. -/ lemma range_L_le_derivSubmodule (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : - LinearMap.range (L f l) ≤ h.isFermionSector.derivSubmodule n := + LinearMap.range (h.covL f l) ≤ h.isFermionSector.derivSubmodule n := le_iSup₂_of_le f l (le_sup_of_le_left (le_sup_of_le_left (le_sup_of_le_left le_sup_right))) /-- The range of a conjugate lepton-doublet symbol map lies in the fermion derivative submodule. -/ lemma range_barL_le_derivSubmodule (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : - LinearMap.range (barL f l) ≤ h.isFermionSector.derivSubmodule n := + LinearMap.range (h.covBarL f l) ≤ h.isFermionSector.derivSubmodule n := le_iSup₂_of_le f l (le_sup_of_le_left (le_sup_of_le_left le_sup_right)) /-- The range of a lepton-singlet symbol map lies in the fermion derivative submodule. -/ lemma range_e_le_derivSubmodule (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : - LinearMap.range (e f l) ≤ h.isFermionSector.derivSubmodule n := + LinearMap.range (h.covE f l) ≤ h.isFermionSector.derivSubmodule n := le_iSup₂_of_le f l (le_sup_of_le_left le_sup_right) /-- The range of a conjugate lepton-singlet symbol map lies in the fermion derivative submodule. -/ lemma range_bare_le_derivSubmodule (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : - LinearMap.range (bare f l) ≤ h.isFermionSector.derivSubmodule n := + LinearMap.range (h.covBarE f l) ≤ h.isFermionSector.derivSubmodule n := le_iSup₂_of_le f l le_sup_right /-- A `d` component lies in the fermion derivative submodule. -/ @@ -791,6 +767,6 @@ lemma mul_mul_swap_eq_neg {n m : ℕ} (a : B) {x y : B} a * (y * x) = -(a * (x * y)) := by rw [h.isFermionSector.anticomm_of_mem_derivSubmodule hy hx, mul_neg] -end IsCovStandardModel +end CovAlgebraRealization end StandardModel diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/GaugeWeightDecomposition.lean b/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/GaugeWeightDecomposition.lean similarity index 93% rename from Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/GaugeWeightDecomposition.lean rename to Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/GaugeWeightDecomposition.lean index 8716a097b..f9b214332 100644 --- a/Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/GaugeWeightDecomposition.lean +++ b/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/GaugeWeightDecomposition.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.IsCovStandardModel.YukawaSector.Basic +public import Physlib.Particles.StandardModel.CovAlgebraRealization.YukawaSector.Basic public import Physlib.Particles.StandardModel.IsFermionSector.MassWeight.GaugeWeightDecomposition public import Physlib.Particles.StandardModel.IsHiggsSector.DerivSubmodule.GaugeWeightDecomposition /-! @@ -56,36 +56,13 @@ namespace StandardModel open TensorProduct Matrix MatrixGroups Lorentz Pointwise -namespace IsCovStandardModel +namespace CovAlgebraRealization 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) + (h : CovAlgebraRealization B repGauge repLorentz massWeightPoly) /-! @@ -630,26 +607,26 @@ lemma sectorMassWeightEightGaugeWeight_piece_zero : * (h.isFermionSector.derivSubmodule 0 * h.isFermionSector.derivSubmodule 0) = ⨆ (f : Fin 3) (f' : Fin 3), (h.isHiggsSector.higgsSubmodule 0 ⊔ h.isHiggsSector.barHiggsSubmodule 0) - * ((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 + * ((LinearMap.range (h.covD f ![]) ⊔ + LinearMap.range (h.covBarD f ![]) ⊔ + LinearMap.range (h.covU f ![]) ⊔ + LinearMap.range (h.covBarU f ![]) ⊔ + LinearMap.range (h.covQ f ![]) ⊔ + LinearMap.range (h.covBarQ f ![]) ⊔ + LinearMap.range (h.covL f ![]) ⊔ + LinearMap.range (h.covBarL f ![]) ⊔ + LinearMap.range (h.covE f ![]) ⊔ + LinearMap.range (h.covBarE f ![])) + * (LinearMap.range (h.covD f' ![]) ⊔ + LinearMap.range (h.covBarD f' ![]) ⊔ + LinearMap.range (h.covU f' ![]) ⊔ + LinearMap.range (h.covBarU f' ![]) ⊔ + LinearMap.range (h.covQ f' ![]) ⊔ + LinearMap.range (h.covBarQ f' ![]) ⊔ + LinearMap.range (h.covL f' ![]) ⊔ + LinearMap.range (h.covBarL f' ![]) ⊔ + LinearMap.range (h.covE f' ![]) ⊔ + LinearMap.range (h.covBarE f' ![]))) := by rw [IsHiggsSector.derivSubmodule, h.isFermionSector.derivSubmodule_zero_eq, Submodule.iSup_mul, Submodule.mul_iSup] exact iSup_congr fun f => by rw [Submodule.mul_iSup, Submodule.mul_iSup] @@ -662,8 +639,8 @@ lemma sectorMassWeightEightGaugeWeight_piece_zero : (d' := GaugeWeightDecomposition.mul (d := h.isFermionSector.derivSubmoduleGaugeWeight 0) (d' := h.isFermionSector.derivSubmoduleGaugeWeight 0))) - (d' := GaugeWeightDecomposition.iSup hrepGauge_mul fun f => - GaugeWeightDecomposition.iSup hrepGauge_mul fun f' => + (d' := GaugeWeightDecomposition.iSup h.repGauge_mul fun f => + GaugeWeightDecomposition.iSup h.repGauge_mul fun f' => GaugeWeightDecomposition.mul (d := GaugeWeightDecomposition.sup (d := h.isHiggsSector.higgsSubmoduleGaugeWeight 0) @@ -709,6 +686,6 @@ lemma mem_sectorMassWeightEight_piece_zero_sup_of_invariant {S : Submodule ℂ B x ∈ h.sectorMassWeightEightGaugeWeight.piece 0 ⊔ S := GaugeWeightDecomposition.mem_piece_zero_sup_of_invariant _ hS hx hinv -end IsCovStandardModel +end CovAlgebraRealization end StandardModel diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/MassDimEight.lean b/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/MassDimEight.lean similarity index 89% rename from Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/MassDimEight.lean rename to Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/MassDimEight.lean index f5d667d1e..405a79924 100644 --- a/Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/MassDimEight.lean +++ b/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/MassDimEight.lean @@ -5,8 +5,8 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.IsCovStandardModel.YukawaSector.Families.BarHiggs -public import Physlib.Particles.StandardModel.IsCovStandardModel.YukawaSector.GaugeWeightDecomposition +public import Physlib.Particles.StandardModel.CovAlgebraRealization.YukawaSector.Families.BarHiggs +public import Physlib.Particles.StandardModel.CovAlgebraRealization.YukawaSector.GaugeWeightDecomposition public import Physlib.Particles.StandardModel.Peeling /-! # The Yukawa sector at mass weight eight @@ -63,36 +63,13 @@ namespace StandardModel open TensorProduct Matrix MatrixGroups Lorentz Pointwise ComplexConjugate -namespace IsCovStandardModel +namespace CovAlgebraRealization 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) + (h : CovAlgebraRealization B repGauge repLorentz massWeightPoly) /-! @@ -105,7 +82,7 @@ lemma higgsSubmodule_zero_le : h.isHiggsSector.higgsSubmodule 0 ≤ ⨆ i, ℂ ∙ h.isHiggsSector.higgs ![] i := by refine iSup_le fun l => ?_ rw [show l = (![] : Fin 0 → Fin 1 ⊕ Fin 3) from Subsingleton.elim _ _, - range_eq_iSup_span_dualBasis HiggsVec.orthonormBasis.toBasis (H ![])] + range_eq_iSup_span_dualBasis HiggsVec.orthonormBasis.toBasis (h.covH ![])] exact le_rfl /-- The conjugate Higgs submodule without derivatives lies in the span of the conjugate @@ -114,68 +91,68 @@ lemma barHiggsSubmodule_zero_le : h.isHiggsSector.barHiggsSubmodule 0 ≤ ⨆ i, ℂ ∙ h.isHiggsSector.barHiggs ![] i := by refine iSup_le fun l => ?_ rw [show l = (![] : Fin 0 → Fin 1 ⊕ Fin 3) from Subsingleton.elim _ _, - range_eq_iSup_span_dualBasis HiggsVec.orthonormBasis.toBasis.conj (barH ![])] + range_eq_iSup_span_dualBasis HiggsVec.orthonormBasis.toBasis.conj (h.covBarH ![])] exact le_rfl /-- The range of the down-singlet symbol map is the span of its components. -/ lemma range_d_eq (f : Fin 3) : - LinearMap.range (d f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) + LinearMap.range (h.covD f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) = ⨆ j, ℂ ∙ h.isFermionSector.dComponent f ![] j := - range_eq_iSup_span_dualBasis DownSinglet.basis (d f ![]) + range_eq_iSup_span_dualBasis DownSinglet.basis (h.covD f ![]) /-- The range of the conjugate down-singlet symbol map is the span of its components. -/ lemma range_bard_eq (f : Fin 3) : - LinearMap.range (bard f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) + LinearMap.range (h.covBarD f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) = ⨆ j, ℂ ∙ h.isFermionSector.bardComponent f ![] j := - range_eq_iSup_span_dualBasis DownSinglet.basis.conj (bard f ![]) + range_eq_iSup_span_dualBasis DownSinglet.basis.conj (h.covBarD f ![]) /-- The range of the up-singlet symbol map is the span of its components. -/ lemma range_u_eq (f : Fin 3) : - LinearMap.range (u f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) + LinearMap.range (h.covU f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) = ⨆ j, ℂ ∙ h.isFermionSector.uComponent f ![] j := - range_eq_iSup_span_dualBasis UpSinglet.basis (u f ![]) + range_eq_iSup_span_dualBasis UpSinglet.basis (h.covU f ![]) /-- The range of the conjugate up-singlet symbol map is the span of its components. -/ lemma range_baru_eq (f : Fin 3) : - LinearMap.range (baru f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) + LinearMap.range (h.covBarU f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) = ⨆ j, ℂ ∙ h.isFermionSector.baruComponent f ![] j := - range_eq_iSup_span_dualBasis UpSinglet.basis.conj (baru f ![]) + range_eq_iSup_span_dualBasis UpSinglet.basis.conj (h.covBarU f ![]) /-- The range of the quark-doublet symbol map is the span of its components. -/ lemma range_Q_eq (f : Fin 3) : - LinearMap.range (Q f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) + LinearMap.range (h.covQ f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) = ⨆ j, ℂ ∙ h.isFermionSector.QComponent f ![] j := - range_eq_iSup_span_dualBasis QuarkDoublet.basis (Q f ![]) + range_eq_iSup_span_dualBasis QuarkDoublet.basis (h.covQ f ![]) /-- The range of the conjugate quark-doublet symbol map is the span of its components. -/ lemma range_barQ_eq (f : Fin 3) : - LinearMap.range (barQ f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) + LinearMap.range (h.covBarQ f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) = ⨆ j, ℂ ∙ h.isFermionSector.barQComponent f ![] j := - range_eq_iSup_span_dualBasis QuarkDoublet.basis.conj (barQ f ![]) + range_eq_iSup_span_dualBasis QuarkDoublet.basis.conj (h.covBarQ f ![]) /-- The range of the lepton-doublet symbol map is the span of its components. -/ lemma range_L_eq (f : Fin 3) : - LinearMap.range (L f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) + LinearMap.range (h.covL f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) = ⨆ j, ℂ ∙ h.isFermionSector.LComponent f ![] j := - range_eq_iSup_span_dualBasis LeptonDoublet.basis (L f ![]) + range_eq_iSup_span_dualBasis LeptonDoublet.basis (h.covL f ![]) /-- The range of the conjugate lepton-doublet symbol map is the span of its components. -/ lemma range_barL_eq (f : Fin 3) : - LinearMap.range (barL f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) + LinearMap.range (h.covBarL f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) = ⨆ j, ℂ ∙ h.isFermionSector.barLComponent f ![] j := - range_eq_iSup_span_dualBasis LeptonDoublet.basis.conj (barL f ![]) + range_eq_iSup_span_dualBasis LeptonDoublet.basis.conj (h.covBarL f ![]) /-- The range of the lepton-singlet symbol map is the span of its components. -/ lemma range_e_eq (f : Fin 3) : - LinearMap.range (e f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) + LinearMap.range (h.covE f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) = ⨆ j, ℂ ∙ h.isFermionSector.eComponent f ![] j := - range_eq_iSup_span_dualBasis LeptonSinglet.basis (e f ![]) + range_eq_iSup_span_dualBasis LeptonSinglet.basis (h.covE f ![]) /-- The range of the conjugate lepton-singlet symbol map is the span of its components. -/ lemma range_bare_eq (f : Fin 3) : - LinearMap.range (bare f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) + LinearMap.range (h.covBarE f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) = ⨆ j, ℂ ∙ h.isFermionSector.bareComponent f ![] j := - range_eq_iSup_span_dualBasis LeptonSinglet.basis.conj (bare f ![]) + range_eq_iSup_span_dualBasis LeptonSinglet.basis.conj (h.covBarE f ![]) /-! @@ -223,7 +200,7 @@ include h in /-- The range of the down-singlet symbol map is carried into itself by both groups. -/ lemma isStableUnder_range_d (f : Fin 3) : IsStableUnder (gaugeLorentzMaps repGauge repLorentz) - (LinearMap.range (d f (![] : Fin 0 → Fin 1 ⊕ Fin 3))) := + (LinearMap.range (h.covD f (![] : Fin 0 → Fin 1 ⊕ Fin 3))) := isStableUnder_gaugeLorentzMaps_iff.2 ⟨isStableUnder_range_repGauge fun g φ => h.isFermionSector.repGauge_d g f ![] φ, fun Λ => isStableUnder_range_repLorentz (h.isFermionSector.repLorentz_d f) Λ⟩ @@ -233,7 +210,7 @@ include h in groups. -/ lemma isStableUnder_range_bard (f : Fin 3) : IsStableUnder (gaugeLorentzMaps repGauge repLorentz) - (LinearMap.range (bard f (![] : Fin 0 → Fin 1 ⊕ Fin 3))) := + (LinearMap.range (h.covBarD f (![] : Fin 0 → Fin 1 ⊕ Fin 3))) := isStableUnder_gaugeLorentzMaps_iff.2 ⟨isStableUnder_range_repGauge fun g φ => h.isFermionSector.repGauge_bard g f ![] φ, fun Λ => isStableUnder_range_repLorentz (h.isFermionSector.repLorentz_bard f) Λ⟩ @@ -242,7 +219,7 @@ include h in /-- The range of the up-singlet symbol map is carried into itself by both groups. -/ lemma isStableUnder_range_u (f : Fin 3) : IsStableUnder (gaugeLorentzMaps repGauge repLorentz) - (LinearMap.range (u f (![] : Fin 0 → Fin 1 ⊕ Fin 3))) := + (LinearMap.range (h.covU f (![] : Fin 0 → Fin 1 ⊕ Fin 3))) := isStableUnder_gaugeLorentzMaps_iff.2 ⟨isStableUnder_range_repGauge fun g φ => h.isFermionSector.repGauge_u g f ![] φ, fun Λ => isStableUnder_range_repLorentz (h.isFermionSector.repLorentz_u f) Λ⟩ @@ -252,7 +229,7 @@ include h in groups. -/ lemma isStableUnder_range_baru (f : Fin 3) : IsStableUnder (gaugeLorentzMaps repGauge repLorentz) - (LinearMap.range (baru f (![] : Fin 0 → Fin 1 ⊕ Fin 3))) := + (LinearMap.range (h.covBarU f (![] : Fin 0 → Fin 1 ⊕ Fin 3))) := isStableUnder_gaugeLorentzMaps_iff.2 ⟨isStableUnder_range_repGauge fun g φ => h.isFermionSector.repGauge_baru g f ![] φ, fun Λ => isStableUnder_range_repLorentz (h.isFermionSector.repLorentz_baru f) Λ⟩ @@ -261,7 +238,7 @@ include h in /-- The range of the quark-doublet symbol map is carried into itself by both groups. -/ lemma isStableUnder_range_Q (f : Fin 3) : IsStableUnder (gaugeLorentzMaps repGauge repLorentz) - (LinearMap.range (Q f (![] : Fin 0 → Fin 1 ⊕ Fin 3))) := + (LinearMap.range (h.covQ f (![] : Fin 0 → Fin 1 ⊕ Fin 3))) := isStableUnder_gaugeLorentzMaps_iff.2 ⟨isStableUnder_range_repGauge fun g φ => h.isFermionSector.repGauge_Q g f ![] φ, fun Λ => isStableUnder_range_repLorentz (h.isFermionSector.repLorentz_Q f) Λ⟩ @@ -271,7 +248,7 @@ include h in groups. -/ lemma isStableUnder_range_barQ (f : Fin 3) : IsStableUnder (gaugeLorentzMaps repGauge repLorentz) - (LinearMap.range (barQ f (![] : Fin 0 → Fin 1 ⊕ Fin 3))) := + (LinearMap.range (h.covBarQ f (![] : Fin 0 → Fin 1 ⊕ Fin 3))) := isStableUnder_gaugeLorentzMaps_iff.2 ⟨isStableUnder_range_repGauge fun g φ => h.isFermionSector.repGauge_barQ g f ![] φ, fun Λ => isStableUnder_range_repLorentz (h.isFermionSector.repLorentz_barQ f) Λ⟩ @@ -280,7 +257,7 @@ include h in /-- The range of the lepton-doublet symbol map is carried into itself by both groups. -/ lemma isStableUnder_range_L (f : Fin 3) : IsStableUnder (gaugeLorentzMaps repGauge repLorentz) - (LinearMap.range (L f (![] : Fin 0 → Fin 1 ⊕ Fin 3))) := + (LinearMap.range (h.covL f (![] : Fin 0 → Fin 1 ⊕ Fin 3))) := isStableUnder_gaugeLorentzMaps_iff.2 ⟨isStableUnder_range_repGauge fun g φ => h.isFermionSector.repGauge_L g f ![] φ, fun Λ => isStableUnder_range_repLorentz (h.isFermionSector.repLorentz_L f) Λ⟩ @@ -290,7 +267,7 @@ include h in groups. -/ lemma isStableUnder_range_barL (f : Fin 3) : IsStableUnder (gaugeLorentzMaps repGauge repLorentz) - (LinearMap.range (barL f (![] : Fin 0 → Fin 1 ⊕ Fin 3))) := + (LinearMap.range (h.covBarL f (![] : Fin 0 → Fin 1 ⊕ Fin 3))) := isStableUnder_gaugeLorentzMaps_iff.2 ⟨isStableUnder_range_repGauge fun g φ => h.isFermionSector.repGauge_barL g f ![] φ, fun Λ => isStableUnder_range_repLorentz (h.isFermionSector.repLorentz_barL f) Λ⟩ @@ -299,7 +276,7 @@ include h in /-- The range of the lepton-singlet symbol map is carried into itself by both groups. -/ lemma isStableUnder_range_e (f : Fin 3) : IsStableUnder (gaugeLorentzMaps repGauge repLorentz) - (LinearMap.range (e f (![] : Fin 0 → Fin 1 ⊕ Fin 3))) := + (LinearMap.range (h.covE f (![] : Fin 0 → Fin 1 ⊕ Fin 3))) := isStableUnder_gaugeLorentzMaps_iff.2 ⟨isStableUnder_range_repGauge fun g φ => h.isFermionSector.repGauge_e g f ![] φ, fun Λ => isStableUnder_range_repLorentz (h.isFermionSector.repLorentz_e f) Λ⟩ @@ -309,7 +286,7 @@ include h in groups. -/ lemma isStableUnder_range_bare (f : Fin 3) : IsStableUnder (gaugeLorentzMaps repGauge repLorentz) - (LinearMap.range (bare f (![] : Fin 0 → Fin 1 ⊕ Fin 3))) := + (LinearMap.range (h.covBarE f (![] : Fin 0 → Fin 1 ⊕ Fin 3))) := isStableUnder_gaugeLorentzMaps_iff.2 ⟨isStableUnder_range_repGauge fun g φ => h.isFermionSector.repGauge_bare g f ![] φ, fun Λ => isStableUnder_range_repLorentz (h.isFermionSector.repLorentz_bare f) Λ⟩ @@ -328,36 +305,36 @@ lands inside the join of the six. /-- The submodule of the down-type block `H d barQ` of a family pair. -/ noncomputable def downBlockSubmodule (f f' : Fin 3) : Submodule ℂ B := - h.isHiggsSector.higgsSubmodule 0 * (LinearMap.range (d f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) - * LinearMap.range (barQ f' (![] : Fin 0 → Fin 1 ⊕ Fin 3))) + h.isHiggsSector.higgsSubmodule 0 * (LinearMap.range (h.covD f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) + * LinearMap.range (h.covBarQ f' (![] : Fin 0 → Fin 1 ⊕ Fin 3))) /-- The submodule of the up-type block `H baru Q` of a family pair. -/ noncomputable def upBlockSubmodule (f f' : Fin 3) : Submodule ℂ B := - h.isHiggsSector.higgsSubmodule 0 * (LinearMap.range (baru f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) - * LinearMap.range (Q f' (![] : Fin 0 → Fin 1 ⊕ Fin 3))) + h.isHiggsSector.higgsSubmodule 0 * (LinearMap.range (h.covBarU f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) + * LinearMap.range (h.covQ f' (![] : Fin 0 → Fin 1 ⊕ Fin 3))) /-- The submodule of the charged-lepton block `H barL e` of a family pair. -/ noncomputable def leptonBlockSubmodule (f f' : Fin 3) : Submodule ℂ B := - h.isHiggsSector.higgsSubmodule 0 * (LinearMap.range (barL f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) - * LinearMap.range (e f' (![] : Fin 0 → Fin 1 ⊕ Fin 3))) + h.isHiggsSector.higgsSubmodule 0 * (LinearMap.range (h.covBarL f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) + * LinearMap.range (h.covE f' (![] : Fin 0 → Fin 1 ⊕ Fin 3))) /-- The submodule of the conjugate down-type block `barH bard Q` of a family pair. -/ noncomputable def barDownBlockSubmodule (f f' : Fin 3) : Submodule ℂ B := h.isHiggsSector.barHiggsSubmodule 0 - * (LinearMap.range (bard f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) - * LinearMap.range (Q f' (![] : Fin 0 → Fin 1 ⊕ Fin 3))) + * (LinearMap.range (h.covBarD f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) + * LinearMap.range (h.covQ f' (![] : Fin 0 → Fin 1 ⊕ Fin 3))) /-- The submodule of the conjugate up-type block `barH u barQ` of a family pair. -/ noncomputable def barUpBlockSubmodule (f f' : Fin 3) : Submodule ℂ B := h.isHiggsSector.barHiggsSubmodule 0 - * (LinearMap.range (u f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) - * LinearMap.range (barQ f' (![] : Fin 0 → Fin 1 ⊕ Fin 3))) + * (LinearMap.range (h.covU f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) + * LinearMap.range (h.covBarQ f' (![] : Fin 0 → Fin 1 ⊕ Fin 3))) /-- The submodule of the conjugate charged-lepton block `barH L bare` of a family pair. -/ noncomputable def barLeptonBlockSubmodule (f f' : Fin 3) : Submodule ℂ B := h.isHiggsSector.barHiggsSubmodule 0 - * (LinearMap.range (L f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) - * LinearMap.range (bare f' (![] : Fin 0 → Fin 1 ⊕ Fin 3))) + * (LinearMap.range (h.covL f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) + * LinearMap.range (h.covBarE f' (![] : Fin 0 → Fin 1 ⊕ Fin 3))) /-- The down-type block submodule is carried into itself by both groups. -/ lemma isStableUnder_downBlockSubmodule (f f' : Fin 3) : @@ -877,6 +854,6 @@ theorem mem_sectorMassWeight_higgs_fermion_eight_sup_and_gauge_lorentz_invariant rw [map_add, (Representation.mem_invariants _ _).1 hL g, hyL g] simpa using hstep -end IsCovStandardModel +end CovAlgebraRealization end StandardModel diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/MassDimLTEight.lean b/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/MassDimLTEight.lean similarity index 90% rename from Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/MassDimLTEight.lean rename to Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/MassDimLTEight.lean index 43e118302..3c1cad739 100644 --- a/Physlib/Particles/StandardModel/IsCovStandardModel/YukawaSector/MassDimLTEight.lean +++ b/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/MassDimLTEight.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.IsCovStandardModel.YukawaSector.Basic +public import Physlib.Particles.StandardModel.CovAlgebraRealization.YukawaSector.Basic public import Physlib.Particles.StandardModel.IsHiggsSector.DerivSubmodule.BoostWeightDecomposition public import Physlib.Relativity.LorentzGroup.Invariants.IsQuadLorentz -- The fermion boost weights enter only inside the proofs below, so this import is kept @@ -208,36 +208,13 @@ namespace StandardModel open TensorProduct Matrix MatrixGroups Lorentz Lorentz.BoostWeight -namespace IsCovStandardModel +namespace CovAlgebraRealization 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) + (h : CovAlgebraRealization B repGauge repLorentz massWeightPoly) /-! @@ -259,7 +236,7 @@ fermion turns the total odd. private noncomputable def higgsFermionBoostWeight (a b : ℕ) (i : Fin 3) : WeightDecomposition repLorentz i (h.isHiggsSector.derivSubmodule a * h.isFermionSector.derivSubmodule b) := - WeightDecomposition.mulOfMul hrepLorentz_mul + WeightDecomposition.mulOfMul h.repLorentz_mul (h.isHiggsSector.derivSubmoduleBoostWeight a i) (h.isFermionSector.derivSubmoduleBoostWeight b i) @@ -276,8 +253,8 @@ private noncomputable def higgsSqFermionBoostWeight (a b c : ℕ) (i : Fin 3) : WeightDecomposition repLorentz i (h.isHiggsSector.derivSubmodule a * h.isHiggsSector.derivSubmodule b * h.isFermionSector.derivSubmodule c) := - WeightDecomposition.mulOfMul hrepLorentz_mul - (WeightDecomposition.mulOfMul hrepLorentz_mul + WeightDecomposition.mulOfMul h.repLorentz_mul + (WeightDecomposition.mulOfMul h.repLorentz_mul (h.isHiggsSector.derivSubmoduleBoostWeight a i) (h.isHiggsSector.derivSubmoduleBoostWeight b i)) (h.isFermionSector.derivSubmoduleBoostWeight c i) @@ -404,6 +381,6 @@ theorem mem_sectorMassWeight_higgs_fermion_lt_eight_sup_and_gauge_lorentz_invari ⟨fun hx => ⟨h.mem_of_lorentz_invariant_sectorMassWeight_higgs_fermion_lt_eight_sup w hw S hSL hx.1 hx.2.2, hx.2⟩, fun hx => ⟨Submodule.mem_sup_right hx.1, hx.2⟩⟩ -end IsCovStandardModel +end CovAlgebraRealization end StandardModel diff --git a/Physlib/Particles/StandardModel/CovJetAlgebra/Basic.lean b/Physlib/Particles/StandardModel/CovJetAlgebra/Basic.lean new file mode 100644 index 000000000..8fa157892 --- /dev/null +++ b/Physlib/Particles/StandardModel/CovJetAlgebra/Basic.lean @@ -0,0 +1,768 @@ +/- +Copyright (c) 2026 Joseph Tooby-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.AlgebraRealization.CovStandardModel +/-! +# The covariant jet algebra + +## i. Overview + +`AlgebraRealization.covAlgebra` is the subalgebra of an algebra with a Standard Model +generated by the covariant towers — the covariant derivatives of the field strength and of +the twelve matter species. Section A records that each covariant tower lies in it. + +Sections B and C make that subalgebra an algebra in its own right. The global gauge action, +the Lorentz action and the mass-weight polynomial each carry a covariant tower to a +combination of covariant towers and each is multiplicative, so each preserves the +subalgebra; restricting them gives the subalgebra a gauge action, a Lorentz action and a +mass-weight grading. The mass-weight polynomial needs the most care, since its target is +the polynomials over the subalgebra rather than the subalgebra itself. + +Section D takes the case that matters. The covariant subalgebra of the *jet* algebra of +the Standard Model — that is, of `AlgebraRealization.id` — is `CovJetAlgebra`, the algebra +in which every covariant expression of the Standard Model lives and nothing else. It comes +with the global gauge action, the Lorentz action, the mass-weight polynomial and the +thirteen covariant towers, and is the covariant counterpart of `JetAlgebra`: what +`JetAlgebra` is to `AlgebraRealization`, `CovJetAlgebra` is to `CovAlgebraRealization`. + +That it is itself a covariant Standard Model is +[`Sectors.lean`](Sectors.lean). + +## ii. Key results + +- `StandardModel.CovJetAlgebra` : the covariant jet algebra of the Standard Model. +- `StandardModel.CovJetAlgebra.repGaugeGroupI`, + `StandardModel.CovJetAlgebra.repLorentzGroup`, + `StandardModel.CovJetAlgebra.massWeightPoly` : its gauge action, Lorentz action and + mass-weight polynomial. +- `StandardModel.CovJetAlgebra.fieldStrength`, `StandardModel.CovJetAlgebra.higgsField` + and their companions : its thirteen covariant towers. +- `AlgebraRealization.repGlobal_mem_covAlgebra`, + `AlgebraRealization.repLorentz_mem_covAlgebra`, + `AlgebraRealization.massWeightPoly_mem_range_mapAlgHom` : the three closure facts. + +## iii. Table of contents + +- A. The covariant towers lie in the covariant subalgebra +- B. The covariant subalgebra is closed under the actions + - B.1. The global gauge action + - B.2. The Lorentz action + - B.3. The mass-weight polynomial +- C. The covariant subalgebra as an algebra in its own right + - C.1. Corestricting a family of symbols +- D. The covariant jet algebra + +-/ + +@[expose] public section + +set_option maxHeartbeats 4000000 +set_option synthInstance.maxHeartbeats 1000000 +set_option synthInstance.maxSize 2048 +set_option maxRecDepth 8000 + +namespace StandardModel + +open TensorProduct Matrix MatrixGroups Lorentz + +namespace AlgebraRealization + +variable {B : Type} [Ring B] [Algebra ℂ B] + {repJet : Representation ℂ JetGaugeGroupI B} + {repLorentz : Representation ℂ SL(2,ℂ) B} + {massWeightPoly : B →ₐ[ℂ] Polynomial B} + (h : AlgebraRealization B repJet repLorentz massWeightPoly) + +/-! + +## A. The covariant towers lie in the covariant subalgebra + +-/ + +/-- The field-strength tower lies in the covariant subalgebra. -/ +lemma covF_mem_covAlgebra {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra) : h.covF l μ ν φ ∈ h.covAlgebra := + Algebra.subset_adjoin <| Or.inl <| Or.inl <| Set.mem_iUnion_of_mem n <| + Set.mem_iUnion_of_mem l <| Set.mem_iUnion_of_mem μ <| Set.mem_iUnion_of_mem ν <| ⟨φ, rfl⟩ + +/-- The Higgs tower lies in the covariant subalgebra. -/ +lemma covDerivH_mem_covAlgebra {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ HiggsVec) : h.covDerivH l φ ∈ h.covAlgebra := + Algebra.subset_adjoin <| Or.inl <| Or.inr <| Set.mem_iUnion_of_mem n <| + Set.mem_iUnion_of_mem l <| Or.inl ⟨φ, rfl⟩ + +/-- The conjugate Higgs tower lies in the covariant subalgebra. -/ +lemma covDerivBarH_mem_covAlgebra {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule HiggsVec)) : h.covDerivBarH l φ ∈ h.covAlgebra := + Algebra.subset_adjoin <| Or.inl <| Or.inr <| Set.mem_iUnion_of_mem n <| + Set.mem_iUnion_of_mem l <| Or.inr ⟨φ, rfl⟩ + +/-- The down-type quark tower lies in the covariant subalgebra. -/ +lemma covDerivD_mem_covAlgebra (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ DownSinglet) : h.covDerivD i l φ ∈ h.covAlgebra := + Algebra.subset_adjoin <| Or.inr <| Set.mem_iUnion_of_mem i <| Set.mem_iUnion_of_mem n <| + Set.mem_iUnion_of_mem l <| Or.inl <| Or.inl <| Or.inl <| Or.inl <| Or.inl <| Or.inl <| + Or.inl <| Or.inl <| Or.inl <| ⟨φ, rfl⟩ + +/-- The conjugate down-type quark tower lies in the covariant subalgebra. -/ +lemma covDerivBarD_mem_covAlgebra (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule DownSinglet)) : h.covDerivBarD i l φ ∈ h.covAlgebra := + Algebra.subset_adjoin <| Or.inr <| Set.mem_iUnion_of_mem i <| Set.mem_iUnion_of_mem n <| + Set.mem_iUnion_of_mem l <| Or.inl <| Or.inl <| Or.inl <| Or.inl <| Or.inl <| Or.inl <| + Or.inl <| Or.inl <| Or.inr <| ⟨φ, rfl⟩ + +/-- The up-type quark tower lies in the covariant subalgebra. -/ +lemma covDerivU_mem_covAlgebra (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ UpSinglet) : h.covDerivU i l φ ∈ h.covAlgebra := + Algebra.subset_adjoin <| Or.inr <| Set.mem_iUnion_of_mem i <| Set.mem_iUnion_of_mem n <| + Set.mem_iUnion_of_mem l <| Or.inl <| Or.inl <| Or.inl <| Or.inl <| Or.inl <| Or.inl <| + Or.inl <| Or.inr <| ⟨φ, rfl⟩ + +/-- The conjugate up-type quark tower lies in the covariant subalgebra. -/ +lemma covDerivBarU_mem_covAlgebra (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule UpSinglet)) : h.covDerivBarU i l φ ∈ h.covAlgebra := + Algebra.subset_adjoin <| Or.inr <| Set.mem_iUnion_of_mem i <| Set.mem_iUnion_of_mem n <| + Set.mem_iUnion_of_mem l <| Or.inl <| Or.inl <| Or.inl <| Or.inl <| Or.inl <| Or.inl <| + Or.inr <| ⟨φ, rfl⟩ + +/-- The quark doublet tower lies in the covariant subalgebra. -/ +lemma covDerivQ_mem_covAlgebra (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ QuarkDoublet) : h.covDerivQ i l φ ∈ h.covAlgebra := + Algebra.subset_adjoin <| Or.inr <| Set.mem_iUnion_of_mem i <| Set.mem_iUnion_of_mem n <| + Set.mem_iUnion_of_mem l <| Or.inl <| Or.inl <| Or.inl <| Or.inl <| Or.inl <| Or.inr <| + ⟨φ, rfl⟩ + +/-- The conjugate quark doublet tower lies in the covariant subalgebra. -/ +lemma covDerivBarQ_mem_covAlgebra (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) : h.covDerivBarQ i l φ ∈ h.covAlgebra := + Algebra.subset_adjoin <| Or.inr <| Set.mem_iUnion_of_mem i <| Set.mem_iUnion_of_mem n <| + Set.mem_iUnion_of_mem l <| Or.inl <| Or.inl <| Or.inl <| Or.inl <| Or.inr <| ⟨φ, rfl⟩ + +/-- The lepton doublet tower lies in the covariant subalgebra. -/ +lemma covDerivL_mem_covAlgebra (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ LeptonDoublet) : h.covDerivL i l φ ∈ h.covAlgebra := + Algebra.subset_adjoin <| Or.inr <| Set.mem_iUnion_of_mem i <| Set.mem_iUnion_of_mem n <| + Set.mem_iUnion_of_mem l <| Or.inl <| Or.inl <| Or.inl <| Or.inr <| ⟨φ, rfl⟩ + +/-- The conjugate lepton doublet tower lies in the covariant subalgebra. -/ +lemma covDerivBarL_mem_covAlgebra (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule LeptonDoublet)) : h.covDerivBarL i l φ ∈ h.covAlgebra := + Algebra.subset_adjoin <| Or.inr <| Set.mem_iUnion_of_mem i <| Set.mem_iUnion_of_mem n <| + Set.mem_iUnion_of_mem l <| Or.inl <| Or.inl <| Or.inr <| ⟨φ, rfl⟩ + +/-- The charged-lepton singlet tower lies in the covariant subalgebra. -/ +lemma covDerivE_mem_covAlgebra (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ LeptonSinglet) : h.covDerivE i l φ ∈ h.covAlgebra := + Algebra.subset_adjoin <| Or.inr <| Set.mem_iUnion_of_mem i <| Set.mem_iUnion_of_mem n <| + Set.mem_iUnion_of_mem l <| Or.inl <| Or.inr <| ⟨φ, rfl⟩ + +/-- The conjugate charged-lepton singlet tower lies in the covariant subalgebra. -/ +lemma covDerivBarE_mem_covAlgebra (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule LeptonSinglet)) : h.covDerivBarE i l φ ∈ h.covAlgebra := + Algebra.subset_adjoin <| Or.inr <| Set.mem_iUnion_of_mem i <| Set.mem_iUnion_of_mem n <| + Set.mem_iUnion_of_mem l <| Or.inr <| ⟨φ, rfl⟩ + + +/-! + +## B. The covariant subalgebra is closed under the actions + +The global gauge action, the Lorentz action and the mass-weight polynomial all carry a +covariant tower to a combination of covariant towers, and each is multiplicative, so each +carries the whole covariant subalgebra into itself. Those three closure facts are what let +the covariant subalgebra be regarded as an algebra with a gauge action, a Lorentz action +and a mass-weight grading of its own. + +-/ + +include h in +/-- A property that holds of every covariant tower holds of every covariant generator: + the case analysis of the generating set, done once. -/ +lemma covGenerators_induction {P : B → Prop} + (hF : ∀ {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra), P (h.covF l μ ν φ)) + (hH : ∀ {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ HiggsVec), + P (h.covDerivH l φ)) + (hBarH : ∀ {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule HiggsVec)), + P (h.covDerivBarH l φ)) + (hD : ∀ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ DownSinglet), P (h.covDerivD i l φ)) + (hBarD : ∀ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule DownSinglet)), P (h.covDerivBarD i l φ)) + (hU : ∀ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ UpSinglet), P (h.covDerivU i l φ)) + (hBarU : ∀ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule UpSinglet)), P (h.covDerivBarU i l φ)) + (hQ : ∀ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ QuarkDoublet), P (h.covDerivQ i l φ)) + (hBarQ : ∀ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule QuarkDoublet)), P (h.covDerivBarQ i l φ)) + (hL : ∀ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ LeptonDoublet), P (h.covDerivL i l φ)) + (hBarL : ∀ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule LeptonDoublet)), P (h.covDerivBarL i l φ)) + (hE : ∀ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ LeptonSinglet), P (h.covDerivE i l φ)) + (hBarE : ∀ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule LeptonSinglet)), P (h.covDerivBarE i l φ)) + : ∀ x ∈ h.covGenerators, P x := by + rintro x hx + 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 hF l μ ν φ + · simp only [Set.mem_iUnion] at hx + obtain ⟨n, l, hx⟩ := hx + rcases hx with ⟨φ, rfl⟩ | ⟨φ, rfl⟩ + · exact hH l φ + · exact hBarH l φ + · 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 hD i l φ + · exact hBarD i l φ + · exact hU i l φ + · exact hBarU i l φ + · exact hQ i l φ + · exact hBarQ i l φ + · exact hL i l φ + · exact hBarL i l φ + · exact hE i l φ + · exact hBarE i l φ + + +include h in +/-- A unital multiplicative endomorphism of the algebra that carries the covariant + generators into the covariant subalgebra carries the whole subalgebra into itself. -/ +lemma mapsTo_covAlgebra {f : B →ₗ[ℂ] B} (hone : f 1 = 1) + (hmul : ∀ b₁ b₂ : B, f (b₁ * b₂) = f b₁ * f b₂) + (hgen : ∀ x ∈ h.covGenerators, f x ∈ h.covAlgebra) {x : B} (hx : x ∈ h.covAlgebra) : + f x ∈ h.covAlgebra := by + induction hx using Algebra.adjoin_induction with + | mem b hb => exact hgen b hb + | algebraMap c => + rw [Algebra.algebraMap_eq_smul_one, map_smul, hone] + exact Subalgebra.smul_mem _ (one_mem _) c + | add a b _ _ iha ihb => rw [map_add]; exact add_mem iha ihb + | mul a b _ _ iha ihb => rw [hmul]; exact mul_mem iha ihb + +include h in +/-- A Lorentz slot-mixing sum of covariant towers lies in the covariant subalgebra. -/ +lemma sum_smul_mem_covAlgebra {n : ℕ} {c : (Fin n → (Fin 1 ⊕ Fin 3)) → ℂ} + {G : (Fin n → (Fin 1 ⊕ Fin 3)) → B} (hG : ∀ p, G p ∈ h.covAlgebra) : + ∑ p : Fin n → (Fin 1 ⊕ Fin 3), c p • G p ∈ h.covAlgebra := + Subalgebra.sum_mem _ fun p _ => Subalgebra.smul_mem _ (hG p) _ + +/-! + +### B.1. The global gauge action + +-/ + +include h in +/-- The global gauge action fixes the unit of the algebra. -/ +lemma repGlobal_one (g : GaugeGroupI) : repGlobal repJet g (1 : B) = 1 := by + simpa using h.repJet_algebraMap (JetGaugeGroupI.ofConstant g) 1 + +include h in +/-- The global gauge action preserves the covariant subalgebra: it carries each covariant + tower to a tower of the same shape at a rotated value index, and it is multiplicative. -/ +lemma repGlobal_mem_covAlgebra (g : GaugeGroupI) {x : B} (hx : x ∈ h.covAlgebra) : + repGlobal repJet g x ∈ h.covAlgebra := + h.mapsTo_covAlgebra (h.repGlobal_one g) (h.repJet_A.gauge_mul _) + (h.covGenerators_induction + (fun l μ ν φ => by + rw [h.repGlobal_covF]; exact h.covF_mem_covAlgebra _ _ _ _) + (fun l φ => by rw [h.repGlobal_covDerivH]; exact h.covDerivH_mem_covAlgebra _ _) + (fun l φ => by rw [h.repGlobal_covDerivBarH]; exact h.covDerivBarH_mem_covAlgebra _ _) + (fun i {_n} l φ => by + rw [h.repGlobal_covDerivD]; exact h.covDerivD_mem_covAlgebra _ _ _) + (fun i {_n} l φ => by + rw [h.repGlobal_covDerivBarD]; exact h.covDerivBarD_mem_covAlgebra _ _ _) + (fun i {_n} l φ => by + rw [h.repGlobal_covDerivU]; exact h.covDerivU_mem_covAlgebra _ _ _) + (fun i {_n} l φ => by + rw [h.repGlobal_covDerivBarU]; exact h.covDerivBarU_mem_covAlgebra _ _ _) + (fun i {_n} l φ => by + rw [h.repGlobal_covDerivQ]; exact h.covDerivQ_mem_covAlgebra _ _ _) + (fun i {_n} l φ => by + rw [h.repGlobal_covDerivBarQ]; exact h.covDerivBarQ_mem_covAlgebra _ _ _) + (fun i {_n} l φ => by + rw [h.repGlobal_covDerivL]; exact h.covDerivL_mem_covAlgebra _ _ _) + (fun i {_n} l φ => by + rw [h.repGlobal_covDerivBarL]; exact h.covDerivBarL_mem_covAlgebra _ _ _) + (fun i {_n} l φ => by + rw [h.repGlobal_covDerivE]; exact h.covDerivE_mem_covAlgebra _ _ _) + (fun i {_n} l φ => by + rw [h.repGlobal_covDerivBarE]; exact h.covDerivBarE_mem_covAlgebra _ _ _)) hx + +/-! + +### B.2. The Lorentz action + +-/ + +include h in +/-- The Lorentz action fixes the unit of the algebra. -/ +lemma repLorentz_one (Λ : SL(2,ℂ)) : repLorentz Λ (1 : B) = 1 := by + obtain ⟨v, hv⟩ : ∃ v, repLorentz Λ v = 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 Λ v 1 + rw [mul_one, hv, one_mul] at h1 + exact h1.symm + +include h in +/-- The Lorentz action preserves the covariant subalgebra: it carries each covariant tower + to a slot-mixing sum of towers of the same shape, and it is multiplicative. -/ +lemma repLorentz_mem_covAlgebra (Λ : SL(2,ℂ)) {x : B} (hx : x ∈ h.covAlgebra) : + repLorentz Λ x ∈ h.covAlgebra := + h.mapsTo_covAlgebra (h.repLorentz_one Λ) (h.repLorentz_mul Λ) + (h.covGenerators_induction + (fun l μ ν φ => by + rw [h.repLorentz_covF] + exact Subalgebra.sum_mem _ fun p _ => Subalgebra.smul_mem _ + (Subalgebra.sum_mem _ fun a _ => Subalgebra.smul_mem _ + (Subalgebra.sum_mem _ fun b _ => Subalgebra.smul_mem _ + (h.covF_mem_covAlgebra _ _ _ _) _) _) _) + (fun l φ => by + rw [h.repLorentz_covDerivH] + exact h.sum_smul_mem_covAlgebra fun p => h.covDerivH_mem_covAlgebra _ _) + (fun l φ => by + rw [h.repLorentz_covDerivBarH] + exact h.sum_smul_mem_covAlgebra fun p => h.covDerivBarH_mem_covAlgebra _ _) + (fun i {_n} l φ => by + rw [h.repLorentz_covDerivD] + exact h.sum_smul_mem_covAlgebra fun p => h.covDerivD_mem_covAlgebra _ _ _) + (fun i {_n} l φ => by + rw [h.repLorentz_covDerivBarD] + exact h.sum_smul_mem_covAlgebra fun p => h.covDerivBarD_mem_covAlgebra _ _ _) + (fun i {_n} l φ => by + rw [h.repLorentz_covDerivU] + exact h.sum_smul_mem_covAlgebra fun p => h.covDerivU_mem_covAlgebra _ _ _) + (fun i {_n} l φ => by + rw [h.repLorentz_covDerivBarU] + exact h.sum_smul_mem_covAlgebra fun p => h.covDerivBarU_mem_covAlgebra _ _ _) + (fun i {_n} l φ => by + rw [h.repLorentz_covDerivQ] + exact h.sum_smul_mem_covAlgebra fun p => h.covDerivQ_mem_covAlgebra _ _ _) + (fun i {_n} l φ => by + rw [h.repLorentz_covDerivBarQ] + exact h.sum_smul_mem_covAlgebra fun p => h.covDerivBarQ_mem_covAlgebra _ _ _) + (fun i {_n} l φ => by + rw [h.repLorentz_covDerivL] + exact h.sum_smul_mem_covAlgebra fun p => h.covDerivL_mem_covAlgebra _ _ _) + (fun i {_n} l φ => by + rw [h.repLorentz_covDerivBarL] + exact h.sum_smul_mem_covAlgebra fun p => h.covDerivBarL_mem_covAlgebra _ _ _) + (fun i {_n} l φ => by + rw [h.repLorentz_covDerivE] + exact h.sum_smul_mem_covAlgebra fun p => h.covDerivE_mem_covAlgebra _ _ _) + (fun i {_n} l φ => by + rw [h.repLorentz_covDerivBarE] + exact h.sum_smul_mem_covAlgebra fun p => h.covDerivBarE_mem_covAlgebra _ _ _)) hx + +/-! + +### B.3. The mass-weight polynomial + +-/ + +include h in +/-- A monomial with a coefficient in the covariant subalgebra is the image of a monomial + over the covariant subalgebra. -/ +private lemma monomial_mem_range {n : ℕ} {y : B} (hy : y ∈ h.covAlgebra) : + Polynomial.monomial n y ∈ (Polynomial.mapAlgHom h.covAlgebra.val).range := + ⟨Polynomial.monomial n ⟨y, hy⟩, by simp⟩ + +include h in +/-- The mass-weight polynomial carries the covariant subalgebra into the polynomials with + coefficients in it: each covariant tower is an eigenvector whose eigenvector is the tower + itself, and the mass-weight polynomial is an algebra map. -/ +lemma massWeightPoly_mem_range_mapAlgHom {x : B} (hx : x ∈ h.covAlgebra) : + massWeightPoly x ∈ (Polynomial.mapAlgHom h.covAlgebra.val).range := by + have hgen : ∀ y ∈ h.covGenerators, + massWeightPoly y ∈ (Polynomial.mapAlgHom h.covAlgebra.val).range := + h.covGenerators_induction + (fun l μ ν φ => by + rw [h.massWeight_covF] + exact h.monomial_mem_range (h.covF_mem_covAlgebra l μ ν φ)) + (fun l φ => by + rw [h.massWeight_covDerivH] + exact h.monomial_mem_range (h.covDerivH_mem_covAlgebra l φ)) + (fun l φ => by + rw [h.massWeight_covDerivBarH] + exact h.monomial_mem_range (h.covDerivBarH_mem_covAlgebra l φ)) + (fun i {_n} l φ => by + rw [h.massWeight_covDerivD] + exact h.monomial_mem_range (h.covDerivD_mem_covAlgebra i l φ)) + (fun i {_n} l φ => by + rw [h.massWeight_covDerivBarD] + exact h.monomial_mem_range (h.covDerivBarD_mem_covAlgebra i l φ)) + (fun i {_n} l φ => by + rw [h.massWeight_covDerivU] + exact h.monomial_mem_range (h.covDerivU_mem_covAlgebra i l φ)) + (fun i {_n} l φ => by + rw [h.massWeight_covDerivBarU] + exact h.monomial_mem_range (h.covDerivBarU_mem_covAlgebra i l φ)) + (fun i {_n} l φ => by + rw [h.massWeight_covDerivQ] + exact h.monomial_mem_range (h.covDerivQ_mem_covAlgebra i l φ)) + (fun i {_n} l φ => by + rw [h.massWeight_covDerivBarQ] + exact h.monomial_mem_range (h.covDerivBarQ_mem_covAlgebra i l φ)) + (fun i {_n} l φ => by + rw [h.massWeight_covDerivL] + exact h.monomial_mem_range (h.covDerivL_mem_covAlgebra i l φ)) + (fun i {_n} l φ => by + rw [h.massWeight_covDerivBarL] + exact h.monomial_mem_range (h.covDerivBarL_mem_covAlgebra i l φ)) + (fun i {_n} l φ => by + rw [h.massWeight_covDerivE] + exact h.monomial_mem_range (h.covDerivE_mem_covAlgebra i l φ)) + (fun i {_n} l φ => by + rw [h.massWeight_covDerivBarE] + exact h.monomial_mem_range (h.covDerivBarE_mem_covAlgebra i l φ)) + induction hx using Algebra.adjoin_induction with + | mem b hb => exact hgen b hb + | algebraMap c => exact ⟨algebraMap ℂ (Polynomial ↥h.covAlgebra) c, by simp⟩ + | add a b _ _ iha ihb => rw [map_add]; exact add_mem iha ihb + | mul a b _ _ iha ihb => rw [map_mul]; exact mul_mem iha ihb + +/-! + +## C. The covariant subalgebra as an algebra in its own right + +The three closure facts of section B let the covariant subalgebra carry a gauge action, a +Lorentz action and a mass-weight polynomial of its own: each is the ambient one restricted, +and each is recorded here together with the lemma identifying it with the ambient one on +underlying elements. The mass-weight polynomial takes a little more care than the two +actions, because its target is the polynomials over the subalgebra rather than the +subalgebra itself; the identification is through the injection +`Polynomial.mapAlgHom h.covAlgebra.val`. + +-/ + +/-- The global gauge action on the covariant subalgebra: the ambient global gauge action, + which section B shows preserves it. -/ +noncomputable def covRepGauge : Representation ℂ GaugeGroupI ↥h.covAlgebra where + toFun g := + { toFun := fun x => ⟨repGlobal repJet g (x : B), h.repGlobal_mem_covAlgebra g x.2⟩ + map_add' := fun x y => Subtype.ext (map_add _ _ _) + map_smul' := fun c x => Subtype.ext (map_smul _ _ _) } + map_one' := by + refine LinearMap.ext fun x => Subtype.ext ?_ + show repGlobal repJet 1 (x : B) = (x : B) + rw [map_one] + rfl + map_mul' g₁ g₂ := by + refine LinearMap.ext fun x => Subtype.ext ?_ + show repGlobal repJet (g₁ * g₂) (x : B) = repGlobal repJet g₁ (repGlobal repJet g₂ (x : B)) + rw [map_mul] + rfl + +@[simp] +lemma coe_covRepGauge (g : GaugeGroupI) (x : ↥h.covAlgebra) : + (h.covRepGauge g x : B) = repGlobal repJet g (x : B) := rfl + +/-- The Lorentz action on the covariant subalgebra: the ambient Lorentz action, which + section B shows preserves it. -/ +noncomputable def covRepLorentz : Representation ℂ SL(2,ℂ) ↥h.covAlgebra where + toFun Λ := + { toFun := fun x => ⟨repLorentz Λ (x : B), h.repLorentz_mem_covAlgebra Λ x.2⟩ + map_add' := fun x y => Subtype.ext (map_add _ _ _) + map_smul' := fun c x => Subtype.ext (map_smul _ _ _) } + map_one' := by + refine LinearMap.ext fun x => Subtype.ext ?_ + show repLorentz 1 (x : B) = (x : B) + rw [map_one] + rfl + map_mul' Λ₁ Λ₂ := by + refine LinearMap.ext fun x => Subtype.ext ?_ + show repLorentz (Λ₁ * Λ₂) (x : B) = repLorentz Λ₁ (repLorentz Λ₂ (x : B)) + rw [map_mul] + rfl + +@[simp] +lemma coe_covRepLorentz (Λ : SL(2,ℂ)) (x : ↥h.covAlgebra) : + (h.covRepLorentz Λ x : B) = repLorentz Λ (x : B) := rfl + +include h in +/-- Polynomials over the covariant subalgebra inject into polynomials over the algebra. -/ +lemma mapAlgHom_val_injective : + Function.Injective (Polynomial.mapAlgHom h.covAlgebra.val) := by + rw [Polynomial.coe_mapAlgHom] + exact Polynomial.map_injective _ Subtype.val_injective + +/-- The mass-weight polynomial of the covariant subalgebra: the ambient mass-weight + polynomial, whose value on the subalgebra has all of its coefficients in the subalgebra + by section B. -/ +noncomputable def covMassWeightPoly : ↥h.covAlgebra →ₐ[ℂ] Polynomial ↥h.covAlgebra := + (AlgEquiv.ofInjective (Polynomial.mapAlgHom h.covAlgebra.val) + h.mapAlgHom_val_injective).symm.toAlgHom.comp + (AlgHom.codRestrict (massWeightPoly.comp h.covAlgebra.val) _ + fun x => h.massWeightPoly_mem_range_mapAlgHom x.2) + +@[simp] +lemma mapAlgHom_covMassWeightPoly (x : ↥h.covAlgebra) : + Polynomial.mapAlgHom h.covAlgebra.val (h.covMassWeightPoly x) = massWeightPoly (x : B) := + congrArg Subtype.val ((AlgEquiv.ofInjective (Polynomial.mapAlgHom h.covAlgebra.val) + h.mapAlgHom_val_injective).apply_symm_apply + ⟨massWeightPoly (x : B), h.massWeightPoly_mem_range_mapAlgHom x.2⟩) + +/-- A mass-weight eigenvalue equation in the covariant subalgebra is the ambient one. -/ +lemma covMassWeightPoly_eq_monomial_iff {n : ℕ} (x : ↥h.covAlgebra) : + h.covMassWeightPoly x = Polynomial.monomial n x + ↔ massWeightPoly (x : B) = Polynomial.monomial n (x : B) := by + constructor + · intro hx + rw [← h.mapAlgHom_covMassWeightPoly, hx, Polynomial.mapAlgHom_monomial] + rfl + · intro hx + refine h.mapAlgHom_val_injective ?_ + rw [h.mapAlgHom_covMassWeightPoly, hx, Polynomial.mapAlgHom_monomial] + rfl + + +/-! + +### C.1. Corestricting a family of symbols + +-/ + +/-- A family of symbols whose values lie in the covariant subalgebra, read as a family + valued in that subalgebra. -/ +noncomputable def corestrict {V : Type} [AddCommGroup V] [Module ℂ V] + (G : Module.Dual ℂ V →ₗ[ℂ] B) (hG : ∀ φ, G φ ∈ h.covAlgebra) : + Module.Dual ℂ V →ₗ[ℂ] ↥h.covAlgebra where + toFun φ := ⟨G φ, hG φ⟩ + map_add' φ ψ := Subtype.ext (map_add G φ ψ) + map_smul' c φ := Subtype.ext (map_smul G c φ) + +@[simp] +lemma coe_corestrict {V : Type} [AddCommGroup V] [Module ℂ V] + (G : Module.Dual ℂ V →ₗ[ℂ] B) (hG : ∀ φ, G φ ∈ h.covAlgebra) (φ : Module.Dual ℂ V) : + (h.corestrict G hG φ : B) = G φ := rfl + +/-- The real-linear analogue of `corestrict`, for the gauge-algebra valued family. -/ +noncomputable def corestrictReal (G : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (hG : ∀ φ, G φ ∈ h.covAlgebra) : + Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] ↥h.covAlgebra where + toFun φ := ⟨G φ, hG φ⟩ + map_add' φ ψ := Subtype.ext (map_add G φ ψ) + map_smul' c φ := Subtype.ext (map_smul G c φ) + +@[simp] +lemma coe_corestrictReal (G : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) + (hG : ∀ φ, G φ ∈ h.covAlgebra) (φ : Module.Dual ℝ GaugeAlgebra) : + (h.corestrictReal G hG φ : B) = G φ := rfl + +end AlgebraRealization + +/-! + +## D. The covariant jet algebra + +The covariant field algebra of the jet algebra of the Standard Model — equivalently, by +section A, its covariant subalgebra — is the algebra in which every covariant expression of +the Standard Model lives, and nothing else. It carries a global gauge action, a Lorentz +action, a mass-weight polynomial and the thirteen covariant towers, all of them the jet +algebra's own restricted to it. It is the universal object of the covariant theory in the +sense that `JetAlgebra` is the universal object of the theory in the bare symbols. + +-/ + +/-- The covariant jet algebra of the Standard Model: the covariant field algebra of the + jet algebra. Its elements are exactly the polynomial expressions in the covariant + derivatives of the field strength and of the twelve matter towers. -/ +abbrev CovJetAlgebra : Type := ↥(AlgebraRealization.id.covAlgebra) + +/-- The covariant jet algebra is a ring: it is a subalgebra of the jet algebra. The + instance is given explicitly because the generic `Subalgebra.toRing` is not found by + instance search at this concrete algebra. -/ +noncomputable instance : Ring CovJetAlgebra := + @Subalgebra.toRing ℂ JetAlgebra _ _ _ AlgebraRealization.id.covAlgebra + +/-- The covariant jet algebra is a complex algebra, stated at the ring instance just + given. -/ +noncomputable instance : Algebra ℂ CovJetAlgebra := + @Subalgebra.algebra ℂ JetAlgebra _ _ _ AlgebraRealization.id.covAlgebra + +namespace CovJetAlgebra + +/-- The action of the global gauge group on the covariant jet algebra. -/ +noncomputable abbrev repGaugeGroupI : Representation ℂ GaugeGroupI CovJetAlgebra := + AlgebraRealization.id.covRepGauge + +/-- The action of the Lorentz group on the covariant jet algebra. -/ +noncomputable abbrev repLorentzGroup : Representation ℂ SL(2,ℂ) CovJetAlgebra := + AlgebraRealization.id.covRepLorentz + +/-- The mass-weight polynomial of the covariant jet algebra. -/ +noncomputable abbrev massWeightPoly : CovJetAlgebra →ₐ[ℂ] Polynomial CovJetAlgebra := + AlgebraRealization.id.covMassWeightPoly + +/-- In the covariant jet algebra, the tower of covariant derivatives of the field + strength. -/ +noncomputable def fieldStrength {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : + Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] CovJetAlgebra := + AlgebraRealization.id.corestrictReal (AlgebraRealization.id.covF l μ ν) + (AlgebraRealization.id.covF_mem_covAlgebra l μ ν) + +@[simp] +lemma coe_fieldStrength {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra) : + (fieldStrength l μ ν φ : JetAlgebra) = AlgebraRealization.id.covF l μ ν φ := rfl +/-- In the covariant jet algebra, the tower of covariant derivatives of the Higgs field. -/ +noncomputable def higgsField {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ HiggsVec →ₗ[ℂ] CovJetAlgebra := + AlgebraRealization.id.corestrict (AlgebraRealization.id.covDerivH l) + (AlgebraRealization.id.covDerivH_mem_covAlgebra l) + +@[simp] +lemma coe_higgsField {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ HiggsVec) : + (higgsField l φ : JetAlgebra) = AlgebraRealization.id.covDerivH l φ := rfl + +/-- In the covariant jet algebra, the tower of covariant derivatives of the conjugate Higgs + field. -/ +noncomputable def conjHiggsField {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (ConjModule HiggsVec) →ₗ[ℂ] CovJetAlgebra := + AlgebraRealization.id.corestrict (AlgebraRealization.id.covDerivBarH l) + (AlgebraRealization.id.covDerivBarH_mem_covAlgebra l) + +@[simp] +lemma coe_conjHiggsField {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule HiggsVec)) : + (conjHiggsField l φ : JetAlgebra) = AlgebraRealization.id.covDerivBarH l φ := rfl + +/-- In the covariant jet algebra, the tower of covariant derivatives of the down-type quark + singlet of the `i`-th generation. -/ +noncomputable def downSingletField (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ DownSinglet →ₗ[ℂ] CovJetAlgebra := + AlgebraRealization.id.corestrict (AlgebraRealization.id.covDerivD i l) + (AlgebraRealization.id.covDerivD_mem_covAlgebra i l) + +@[simp] +lemma coe_downSingletField (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ DownSinglet) : + (downSingletField i l φ : JetAlgebra) = AlgebraRealization.id.covDerivD i l φ := rfl + +/-- In the covariant jet algebra, the tower of covariant derivatives of the conjugate down- + type quark singlet of the `i`-th generation. -/ +noncomputable def conjDownSingletField (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (ConjModule DownSinglet) →ₗ[ℂ] CovJetAlgebra := + AlgebraRealization.id.corestrict (AlgebraRealization.id.covDerivBarD i l) + (AlgebraRealization.id.covDerivBarD_mem_covAlgebra i l) + +@[simp] +lemma coe_conjDownSingletField (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule DownSinglet)) : + (conjDownSingletField i l φ : JetAlgebra) = AlgebraRealization.id.covDerivBarD i l φ := rfl + +/-- In the covariant jet algebra, the tower of covariant derivatives of the up-type quark + singlet of the `i`-th generation. -/ +noncomputable def upSingletField (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ UpSinglet →ₗ[ℂ] CovJetAlgebra := + AlgebraRealization.id.corestrict (AlgebraRealization.id.covDerivU i l) + (AlgebraRealization.id.covDerivU_mem_covAlgebra i l) + +@[simp] +lemma coe_upSingletField (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ UpSinglet) : + (upSingletField i l φ : JetAlgebra) = AlgebraRealization.id.covDerivU i l φ := rfl + +/-- In the covariant jet algebra, the tower of covariant derivatives of the conjugate up-type + quark singlet of the `i`-th generation. -/ +noncomputable def conjUpSingletField (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (ConjModule UpSinglet) →ₗ[ℂ] CovJetAlgebra := + AlgebraRealization.id.corestrict (AlgebraRealization.id.covDerivBarU i l) + (AlgebraRealization.id.covDerivBarU_mem_covAlgebra i l) + +@[simp] +lemma coe_conjUpSingletField (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule UpSinglet)) : + (conjUpSingletField i l φ : JetAlgebra) = AlgebraRealization.id.covDerivBarU i l φ := rfl + +/-- In the covariant jet algebra, the tower of covariant derivatives of the quark doublet of + the `i`-th generation. -/ +noncomputable def quarkDoubletField (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ QuarkDoublet →ₗ[ℂ] CovJetAlgebra := + AlgebraRealization.id.corestrict (AlgebraRealization.id.covDerivQ i l) + (AlgebraRealization.id.covDerivQ_mem_covAlgebra i l) + +@[simp] +lemma coe_quarkDoubletField (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ QuarkDoublet) : + (quarkDoubletField i l φ : JetAlgebra) = AlgebraRealization.id.covDerivQ i l φ := rfl + +/-- In the covariant jet algebra, the tower of covariant derivatives of the conjugate quark + doublet of the `i`-th generation. -/ +noncomputable def conjQuarkDoubletField (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (ConjModule QuarkDoublet) →ₗ[ℂ] CovJetAlgebra := + AlgebraRealization.id.corestrict (AlgebraRealization.id.covDerivBarQ i l) + (AlgebraRealization.id.covDerivBarQ_mem_covAlgebra i l) + +@[simp] +lemma coe_conjQuarkDoubletField (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) : + (conjQuarkDoubletField i l φ : JetAlgebra) = AlgebraRealization.id.covDerivBarQ i l φ := rfl + +/-- In the covariant jet algebra, the tower of covariant derivatives of the lepton doublet of + the `i`-th generation. -/ +noncomputable def leptonDoubletField (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ LeptonDoublet →ₗ[ℂ] CovJetAlgebra := + AlgebraRealization.id.corestrict (AlgebraRealization.id.covDerivL i l) + (AlgebraRealization.id.covDerivL_mem_covAlgebra i l) + +@[simp] +lemma coe_leptonDoubletField (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ LeptonDoublet) : + (leptonDoubletField i l φ : JetAlgebra) = AlgebraRealization.id.covDerivL i l φ := rfl + +/-- In the covariant jet algebra, the tower of covariant derivatives of the conjugate lepton + doublet of the `i`-th generation. -/ +noncomputable def conjLeptonDoubletField (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (ConjModule LeptonDoublet) →ₗ[ℂ] CovJetAlgebra := + AlgebraRealization.id.corestrict (AlgebraRealization.id.covDerivBarL i l) + (AlgebraRealization.id.covDerivBarL_mem_covAlgebra i l) + +@[simp] +lemma coe_conjLeptonDoubletField (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule LeptonDoublet)) : + (conjLeptonDoubletField i l φ : JetAlgebra) = AlgebraRealization.id.covDerivBarL i l φ := rfl + +/-- In the covariant jet algebra, the tower of covariant derivatives of the charged-lepton + singlet of the `i`-th generation. -/ +noncomputable def leptonSingletField (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ LeptonSinglet →ₗ[ℂ] CovJetAlgebra := + AlgebraRealization.id.corestrict (AlgebraRealization.id.covDerivE i l) + (AlgebraRealization.id.covDerivE_mem_covAlgebra i l) + +@[simp] +lemma coe_leptonSingletField (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ LeptonSinglet) : + (leptonSingletField i l φ : JetAlgebra) = AlgebraRealization.id.covDerivE i l φ := rfl + +/-- In the covariant jet algebra, the tower of covariant derivatives of the conjugate charged- + lepton singlet of the `i`-th generation. -/ +noncomputable def conjLeptonSingletField (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (ConjModule LeptonSinglet) →ₗ[ℂ] CovJetAlgebra := + AlgebraRealization.id.corestrict (AlgebraRealization.id.covDerivBarE i l) + (AlgebraRealization.id.covDerivBarE_mem_covAlgebra i l) + +@[simp] +lemma coe_conjLeptonSingletField (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule LeptonSinglet)) : + (conjLeptonSingletField i l φ : JetAlgebra) = AlgebraRealization.id.covDerivBarE i l φ := rfl + +end CovJetAlgebra + +end StandardModel diff --git a/Physlib/Particles/StandardModel/CovJetAlgebra/Sectors.lean b/Physlib/Particles/StandardModel/CovJetAlgebra/Sectors.lean new file mode 100644 index 000000000..0e07eb0af --- /dev/null +++ b/Physlib/Particles/StandardModel/CovJetAlgebra/Sectors.lean @@ -0,0 +1,555 @@ +/- +Copyright (c) 2026 Joseph Tooby-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.CovJetAlgebra.Basic +public import Physlib.Particles.StandardModel.IsHiggsSector.Basic +public import Physlib.Particles.StandardModel.IsGaugeSector.MassWeight.Basic +public import Physlib.Particles.StandardModel.IsFermionSector.MassWeight.Basic +/-! +# The sectors of the covariant jet algebra + +## i. Overview + +The covariant jet algebra of `CovJetAlgebra.Basic` carries the thirteen covariant towers, +the global gauge action, the Lorentz action and the mass-weight polynomial. This file +records that they split into the three sectors — gauge, Higgs and fermion — and that the +towers of different sectors commute: every gauge-equivariance, Lorentz, mass-weight and +commutation law of the covariant form of the Standard Model holds there. + +Nothing new is proved. Each law is the corresponding law of `AlgebraRealization.id` — the +jet algebra's own — read on the subalgebra, where equality is equality of underlying jet +algebra elements. The three shapes a law takes each get a small transport lemma in section +A, and section B assembles the structure. + +`CovJetAlgebra` is to the covariant theory what `JetAlgebra` is to the theory in the bare +symbols: the object every other covariant Standard Model receives its fields from. That is +the content of `CovAlgebraRealization`. + +## ii. Key results + +- `StandardModel.CovJetAlgebra.isHiggsSector`, `StandardModel.CovJetAlgebra.isGaugeSector`, + `StandardModel.CovJetAlgebra.isFermionSector` : the three sectors of the covariant jet + algebra. +- `StandardModel.CovJetAlgebra.F_comm_H` and its companions : the towers of different + sectors commute. + +## iii. Table of contents + +- A. Transporting a law to the covariant jet algebra +- B. The three sectors and the cross-sector commutation rules + +-/ + +@[expose] public section + +set_option maxHeartbeats 4000000 +set_option synthInstance.maxHeartbeats 1000000 +set_option synthInstance.maxSize 2048 +set_option maxRecDepth 8000 + +namespace StandardModel + +open TensorProduct Matrix MatrixGroups Lorentz + +namespace CovJetAlgebra + +/-! + +## A. Transporting a law to the covariant jet algebra + +A law of the covariant jet algebra is an equation between elements of a subalgebra of the +jet algebra, so it is the jet algebra's own law under `Subtype.ext`. Three shapes need more +than that: the multiplicativity of the two actions, which is the ambient multiplicativity; +a mass-weight eigenvalue equation, whose target is the polynomials over the subalgebra; and +a Lorentz law, whose right-hand side is a sum of scalar multiples that the coercion has to +be pushed through. + +-/ + +/-- The global gauge action on the covariant jet algebra is multiplicative. -/ +lemma repGaugeGroupI_mul (g : GaugeGroupI) (x y : CovJetAlgebra) : + repGaugeGroupI g (x * y) = repGaugeGroupI g x * repGaugeGroupI g y := + Subtype.ext (AlgebraRealization.id.repGlobal_mul g (x : JetAlgebra) (y : JetAlgebra)) + +/-- The Lorentz action on the covariant jet algebra is multiplicative. -/ +lemma repLorentzGroup_mul (Λ : SL(2,ℂ)) (x y : CovJetAlgebra) : + repLorentzGroup Λ (x * y) = repLorentzGroup Λ x * repLorentzGroup Λ y := + Subtype.ext (JetAlgebra.repLorentzGroup_apply_mul Λ (x : JetAlgebra) (y : JetAlgebra)) + +/-- A mass-weight eigenvalue equation of the jet algebra, for an element of the covariant jet + algebra, is a mass-weight eigenvalue equation there. -/ +lemma massWeightPoly_eq_monomial {n : ℕ} {x : CovJetAlgebra} + (hx : JetAlgebra.massWeightPoly (x : JetAlgebra) + = Polynomial.monomial n (x : JetAlgebra)) : + massWeightPoly x = Polynomial.monomial n x := + (AlgebraRealization.id.covMassWeightPoly_eq_monomial_iff x).mpr hx + +/-- A Lorentz law of the jet algebra, for a family valued in the covariant jet algebra, is a + Lorentz law there: the coercion is additive and commutes with scalar multiplication. -/ +lemma isLorentzCovDerivTransforms_of {V : Type} [AddCommGroup V] [Module ℂ V] + {rep : Representation ℂ SL(2,ℂ) V} + {G : {n : ℕ} → (Fin n → (Fin 1 ⊕ Fin 3)) → Module.Dual ℂ V →ₗ[ℂ] CovJetAlgebra} + (hG : ∀ (Λ : SL(2,ℂ)) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V), + JetAlgebra.repLorentzGroup Λ ((G l φ : CovJetAlgebra) : JetAlgebra) = + ∑ p : Fin n → (Fin 1 ⊕ Fin 3), + (∏ i, (((SL2C.toLorentzGroup Λ).1 (p i) (l i) : ℝ) : ℂ)) • + ((G p (rep.dual Λ φ) : CovJetAlgebra) : JetAlgebra)) : + IsLorentzCovDerivTransforms repLorentzGroup rep G := fun Λ n l φ => + Subtype.ext <| by + simp only [AlgebraRealization.coe_covRepLorentz, AddSubmonoidClass.coe_finsetSum, SetLike.val_smul] + exact hG Λ n l φ + +/-! + +## B. The three sectors and the cross-sector commutation rules + +-/ + +/-- The Higgs sector of the covariant jet algebra. -/ +theorem isHiggsSector : IsHiggsSector CovJetAlgebra repGaugeGroupI repGaugeGroupI_mul + repLorentzGroup repLorentzGroup_mul (fun _n l => higgsField l) + (fun _n l => conjHiggsField l) massWeightPoly where + H_equivariant := fun g φ _n l => + Subtype.ext (AlgebraRealization.id.repGlobal_covDerivH g l φ) + barH_equivariant := fun g φ _n l => + Subtype.ext (AlgebraRealization.id.repGlobal_covDerivBarH g l φ) + H_comm_H := fun φ ψ _n₁ _n₂ l₁ l₂ => + Subtype.ext (AlgebraRealization.id.covH_comm_covH l₁ l₂ φ ψ) + H_comm_barH := fun φ ψ _n₁ _n₂ l₁ l₂ => + Subtype.ext (AlgebraRealization.id.covH_comm_covBarH l₁ l₂ φ ψ) + barH_comm_barH := fun φ ψ _n₁ _n₂ l₁ l₂ => + Subtype.ext (AlgebraRealization.id.covBarH_comm_covBarH l₁ l₂ φ ψ) + H_massWeight := fun φ _n l => + massWeightPoly_eq_monomial (AlgebraRealization.id.massWeight_covDerivH l φ) + barH_massWeight := fun φ _n l => + massWeightPoly_eq_monomial (AlgebraRealization.id.massWeight_covDerivBarH l φ) + repLorentz_H := isLorentzCovDerivTransforms_of AlgebraRealization.id.repLorentz_covDerivH + repLorentz_barH := + isLorentzCovDerivTransforms_of AlgebraRealization.id.repLorentz_covDerivBarH + +/-- The gauge sector of the covariant jet algebra. -/ +theorem isGaugeSector : IsGaugeSector CovJetAlgebra repGaugeGroupI repGaugeGroupI_mul + repLorentzGroup repLorentzGroup_mul (fun {_n} l μ ν => fieldStrength l μ ν) + massWeightPoly where + repGauge_F := fun g {_n} l μ ν φ => + Subtype.ext (AlgebraRealization.id.repGlobal_covF g l μ ν φ) + repLorentz_F := fun Λ n l μ ν φ => Subtype.ext <| by + simp only [AlgebraRealization.coe_covRepLorentz, AddSubmonoidClass.coe_finsetSum, + SetLike.val_smul, coe_fieldStrength] + exact AlgebraRealization.id.repLorentz_covF Λ n l μ ν φ + massWeight_F := fun {_n} l μ ν φ => + massWeightPoly_eq_monomial (AlgebraRealization.id.massWeight_covF l μ ν φ) + F_comm_F := fun {_n _m} l μ ν ψ l' μ' ν' ψ' => + Subtype.ext (AlgebraRealization.id.covF_comm_covF l l' μ ν μ' ν' ψ ψ') + F_antisymm := fun {_n} l μ ν φ => Subtype.ext (AlgebraRealization.id.covF_swap l μ ν φ) + +/-- The fermion sector of the covariant jet algebra. -/ +theorem isFermionSector : IsFermionSector CovJetAlgebra repGaugeGroupI repGaugeGroupI_mul + repLorentzGroup repLorentzGroup_mul + (fun {_n} i l => downSingletField i l) (fun {_n} i l => conjDownSingletField i l) + (fun {_n} i l => upSingletField i l) (fun {_n} i l => conjUpSingletField i l) + (fun {_n} i l => quarkDoubletField i l) (fun {_n} i l => conjQuarkDoubletField i l) + (fun {_n} i l => leptonDoubletField i l) (fun {_n} i l => conjLeptonDoubletField i l) + (fun {_n} i l => leptonSingletField i l) (fun {_n} i l => conjLeptonSingletField i l) + massWeightPoly where + repGauge_d := fun g i {_n} l φ => + Subtype.ext (AlgebraRealization.id.repGlobal_covDerivD g i l φ) + repGauge_bard := fun g i {_n} l φ => + Subtype.ext (AlgebraRealization.id.repGlobal_covDerivBarD g i l φ) + repGauge_u := fun g i {_n} l φ => + Subtype.ext (AlgebraRealization.id.repGlobal_covDerivU g i l φ) + repGauge_baru := fun g i {_n} l φ => + Subtype.ext (AlgebraRealization.id.repGlobal_covDerivBarU g i l φ) + repGauge_Q := fun g i {_n} l φ => + Subtype.ext (AlgebraRealization.id.repGlobal_covDerivQ g i l φ) + repGauge_barQ := fun g i {_n} l φ => + Subtype.ext (AlgebraRealization.id.repGlobal_covDerivBarQ g i l φ) + repGauge_L := fun g i {_n} l φ => + Subtype.ext (AlgebraRealization.id.repGlobal_covDerivL g i l φ) + repGauge_barL := fun g i {_n} l φ => + Subtype.ext (AlgebraRealization.id.repGlobal_covDerivBarL g i l φ) + repGauge_e := fun g i {_n} l φ => + Subtype.ext (AlgebraRealization.id.repGlobal_covDerivE g i l φ) + repGauge_bare := fun g i {_n} l φ => + Subtype.ext (AlgebraRealization.id.repGlobal_covDerivBarE g i l φ) + repLorentz_d := fun i => + isLorentzCovDerivTransforms_of (AlgebraRealization.id.repLorentz_covDerivD i) + repLorentz_bard := fun i => + isLorentzCovDerivTransforms_of (AlgebraRealization.id.repLorentz_covDerivBarD i) + repLorentz_u := fun i => + isLorentzCovDerivTransforms_of (AlgebraRealization.id.repLorentz_covDerivU i) + repLorentz_baru := fun i => + isLorentzCovDerivTransforms_of (AlgebraRealization.id.repLorentz_covDerivBarU i) + repLorentz_Q := fun i => + isLorentzCovDerivTransforms_of (AlgebraRealization.id.repLorentz_covDerivQ i) + repLorentz_barQ := fun i => + isLorentzCovDerivTransforms_of (AlgebraRealization.id.repLorentz_covDerivBarQ i) + repLorentz_L := fun i => + isLorentzCovDerivTransforms_of (AlgebraRealization.id.repLorentz_covDerivL i) + repLorentz_barL := fun i => + isLorentzCovDerivTransforms_of (AlgebraRealization.id.repLorentz_covDerivBarL i) + repLorentz_e := fun i => + isLorentzCovDerivTransforms_of (AlgebraRealization.id.repLorentz_covDerivE i) + repLorentz_bare := fun i => + isLorentzCovDerivTransforms_of (AlgebraRealization.id.repLorentz_covDerivBarE i) + massWeight_d := fun i {_n} l φ => + massWeightPoly_eq_monomial (AlgebraRealization.id.massWeight_covDerivD i l φ) + massWeight_bard := fun i {_n} l φ => + massWeightPoly_eq_monomial (AlgebraRealization.id.massWeight_covDerivBarD i l φ) + massWeight_u := fun i {_n} l φ => + massWeightPoly_eq_monomial (AlgebraRealization.id.massWeight_covDerivU i l φ) + massWeight_baru := fun i {_n} l φ => + massWeightPoly_eq_monomial (AlgebraRealization.id.massWeight_covDerivBarU i l φ) + massWeight_Q := fun i {_n} l φ => + massWeightPoly_eq_monomial (AlgebraRealization.id.massWeight_covDerivQ i l φ) + massWeight_barQ := fun i {_n} l φ => + massWeightPoly_eq_monomial (AlgebraRealization.id.massWeight_covDerivBarQ i l φ) + massWeight_L := fun i {_n} l φ => + massWeightPoly_eq_monomial (AlgebraRealization.id.massWeight_covDerivL i l φ) + massWeight_barL := fun i {_n} l φ => + massWeightPoly_eq_monomial (AlgebraRealization.id.massWeight_covDerivBarL i l φ) + massWeight_e := fun i {_n} l φ => + massWeightPoly_eq_monomial (AlgebraRealization.id.massWeight_covDerivE i l φ) + massWeight_bare := fun i {_n} l φ => + massWeightPoly_eq_monomial (AlgebraRealization.id.massWeight_covDerivBarE i l φ) + d_anticomm_d := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covD_anticomm_covD i j l l' φ φ') + d_anticomm_bard := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covD_anticomm_covBarD i j l l' φ φ') + d_anticomm_u := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covD_anticomm_covU i j l l' φ φ') + d_anticomm_baru := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covD_anticomm_covBarU i j l l' φ φ') + d_anticomm_Q := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covD_anticomm_covQ i j l l' φ φ') + d_anticomm_barQ := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covD_anticomm_covBarQ i j l l' φ φ') + d_anticomm_L := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covD_anticomm_covL i j l l' φ φ') + d_anticomm_barL := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covD_anticomm_covBarL i j l l' φ φ') + d_anticomm_e := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covD_anticomm_covE i j l l' φ φ') + d_anticomm_bare := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covD_anticomm_covBarE i j l l' φ φ') + bard_anticomm_bard := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covBarD_anticomm_covBarD i j l l' φ φ') + bard_anticomm_u := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covBarD_anticomm_covU i j l l' φ φ') + bard_anticomm_baru := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covBarD_anticomm_covBarU i j l l' φ φ') + bard_anticomm_Q := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covBarD_anticomm_covQ i j l l' φ φ') + bard_anticomm_barQ := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covBarD_anticomm_covBarQ i j l l' φ φ') + bard_anticomm_L := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covBarD_anticomm_covL i j l l' φ φ') + bard_anticomm_barL := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covBarD_anticomm_covBarL i j l l' φ φ') + bard_anticomm_e := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covBarD_anticomm_covE i j l l' φ φ') + bard_anticomm_bare := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covBarD_anticomm_covBarE i j l l' φ φ') + u_anticomm_u := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covU_anticomm_covU i j l l' φ φ') + u_anticomm_baru := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covU_anticomm_covBarU i j l l' φ φ') + u_anticomm_Q := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covU_anticomm_covQ i j l l' φ φ') + u_anticomm_barQ := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covU_anticomm_covBarQ i j l l' φ φ') + u_anticomm_L := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covU_anticomm_covL i j l l' φ φ') + u_anticomm_barL := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covU_anticomm_covBarL i j l l' φ φ') + u_anticomm_e := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covU_anticomm_covE i j l l' φ φ') + u_anticomm_bare := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covU_anticomm_covBarE i j l l' φ φ') + baru_anticomm_baru := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covBarU_anticomm_covBarU i j l l' φ φ') + baru_anticomm_Q := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covBarU_anticomm_covQ i j l l' φ φ') + baru_anticomm_barQ := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covBarU_anticomm_covBarQ i j l l' φ φ') + baru_anticomm_L := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covBarU_anticomm_covL i j l l' φ φ') + baru_anticomm_barL := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covBarU_anticomm_covBarL i j l l' φ φ') + baru_anticomm_e := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covBarU_anticomm_covE i j l l' φ φ') + baru_anticomm_bare := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covBarU_anticomm_covBarE i j l l' φ φ') + Q_anticomm_Q := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covQ_anticomm_covQ i j l l' φ φ') + Q_anticomm_barQ := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covQ_anticomm_covBarQ i j l l' φ φ') + Q_anticomm_L := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covQ_anticomm_covL i j l l' φ φ') + Q_anticomm_barL := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covQ_anticomm_covBarL i j l l' φ φ') + Q_anticomm_e := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covQ_anticomm_covE i j l l' φ φ') + Q_anticomm_bare := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covQ_anticomm_covBarE i j l l' φ φ') + barQ_anticomm_barQ := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covBarQ_anticomm_covBarQ i j l l' φ φ') + barQ_anticomm_L := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covBarQ_anticomm_covL i j l l' φ φ') + barQ_anticomm_barL := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covBarQ_anticomm_covBarL i j l l' φ φ') + barQ_anticomm_e := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covBarQ_anticomm_covE i j l l' φ φ') + barQ_anticomm_bare := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covBarQ_anticomm_covBarE i j l l' φ φ') + L_anticomm_L := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covL_anticomm_covL i j l l' φ φ') + L_anticomm_barL := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covL_anticomm_covBarL i j l l' φ φ') + L_anticomm_e := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covL_anticomm_covE i j l l' φ φ') + L_anticomm_bare := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covL_anticomm_covBarE i j l l' φ φ') + barL_anticomm_barL := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covBarL_anticomm_covBarL i j l l' φ φ') + barL_anticomm_e := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covBarL_anticomm_covE i j l l' φ φ') + barL_anticomm_bare := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covBarL_anticomm_covBarE i j l l' φ φ') + e_anticomm_e := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covE_anticomm_covE i j l l' φ φ') + e_anticomm_bare := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covE_anticomm_covBarE i j l l' φ φ') + bare_anticomm_bare := fun i j {_n _m} l l' φ φ' => + Subtype.ext (AlgebraRealization.id.covBarE_anticomm_covBarE i j l l' φ φ') + +/-- The cross-sector commutation rule `F_comm_H` in the covariant jet algebra. -/ +lemma 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 (fieldStrength l μ ν ψ) (higgsField l' φ) := + Subtype.ext (AlgebraRealization.id.covF_comm_covH l μ ν ψ l' φ) + +/-- The cross-sector commutation rule `F_comm_barH` in the covariant jet algebra. -/ +lemma 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 (fieldStrength l μ ν ψ) (conjHiggsField l' φ) := + Subtype.ext (AlgebraRealization.id.covF_comm_covBarH l μ ν ψ l' φ) + +/-- The cross-sector commutation rule `F_comm_d` in the covariant jet algebra. -/ +lemma 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 (fieldStrength l μ ν ψ) (downSingletField i l' φ) := + Subtype.ext (AlgebraRealization.id.covF_comm_covD l μ ν ψ i l' φ) + +/-- The cross-sector commutation rule `F_comm_bard` in the covariant jet algebra. -/ +lemma 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 (fieldStrength l μ ν ψ) (conjDownSingletField i l' φ) := + Subtype.ext (AlgebraRealization.id.covF_comm_covBarD l μ ν ψ i l' φ) + +/-- The cross-sector commutation rule `F_comm_u` in the covariant jet algebra. -/ +lemma 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 (fieldStrength l μ ν ψ) (upSingletField i l' φ) := + Subtype.ext (AlgebraRealization.id.covF_comm_covU l μ ν ψ i l' φ) + +/-- The cross-sector commutation rule `F_comm_baru` in the covariant jet algebra. -/ +lemma 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 (fieldStrength l μ ν ψ) (conjUpSingletField i l' φ) := + Subtype.ext (AlgebraRealization.id.covF_comm_covBarU l μ ν ψ i l' φ) + +/-- The cross-sector commutation rule `F_comm_Q` in the covariant jet algebra. -/ +lemma 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 (fieldStrength l μ ν ψ) (quarkDoubletField i l' φ) := + Subtype.ext (AlgebraRealization.id.covF_comm_covQ l μ ν ψ i l' φ) + +/-- The cross-sector commutation rule `F_comm_barQ` in the covariant jet algebra. -/ +lemma 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 (fieldStrength l μ ν ψ) (conjQuarkDoubletField i l' φ) := + Subtype.ext (AlgebraRealization.id.covF_comm_covBarQ l μ ν ψ i l' φ) + +/-- The cross-sector commutation rule `F_comm_L` in the covariant jet algebra. -/ +lemma 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 (fieldStrength l μ ν ψ) (leptonDoubletField i l' φ) := + Subtype.ext (AlgebraRealization.id.covF_comm_covL l μ ν ψ i l' φ) + +/-- The cross-sector commutation rule `F_comm_barL` in the covariant jet algebra. -/ +lemma 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 (fieldStrength l μ ν ψ) (conjLeptonDoubletField i l' φ) := + Subtype.ext (AlgebraRealization.id.covF_comm_covBarL l μ ν ψ i l' φ) + +/-- The cross-sector commutation rule `F_comm_e` in the covariant jet algebra. -/ +lemma 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 (fieldStrength l μ ν ψ) (leptonSingletField i l' φ) := + Subtype.ext (AlgebraRealization.id.covF_comm_covE l μ ν ψ i l' φ) + +/-- The cross-sector commutation rule `F_comm_bare` in the covariant jet algebra. -/ +lemma 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 (fieldStrength l μ ν ψ) (conjLeptonSingletField i l' φ) := + Subtype.ext (AlgebraRealization.id.covF_comm_covBarE l μ ν ψ i l' φ) + +/-- The cross-sector commutation rule `H_comm_d` in the covariant jet algebra. -/ +lemma 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 (higgsField l φ) (downSingletField i l' φ') := + Subtype.ext (AlgebraRealization.id.covH_comm_covD i l l' φ φ') + +/-- The cross-sector commutation rule `H_comm_bard` in the covariant jet algebra. -/ +lemma 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 (higgsField l φ) (conjDownSingletField i l' φ') := + Subtype.ext (AlgebraRealization.id.covH_comm_covBarD i l l' φ φ') + +/-- The cross-sector commutation rule `H_comm_u` in the covariant jet algebra. -/ +lemma 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 (higgsField l φ) (upSingletField i l' φ') := + Subtype.ext (AlgebraRealization.id.covH_comm_covU i l l' φ φ') + +/-- The cross-sector commutation rule `H_comm_baru` in the covariant jet algebra. -/ +lemma 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 (higgsField l φ) (conjUpSingletField i l' φ') := + Subtype.ext (AlgebraRealization.id.covH_comm_covBarU i l l' φ φ') + +/-- The cross-sector commutation rule `H_comm_Q` in the covariant jet algebra. -/ +lemma 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 (higgsField l φ) (quarkDoubletField i l' φ') := + Subtype.ext (AlgebraRealization.id.covH_comm_covQ i l l' φ φ') + +/-- The cross-sector commutation rule `H_comm_barQ` in the covariant jet algebra. -/ +lemma 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 (higgsField l φ) (conjQuarkDoubletField i l' φ') := + Subtype.ext (AlgebraRealization.id.covH_comm_covBarQ i l l' φ φ') + +/-- The cross-sector commutation rule `H_comm_L` in the covariant jet algebra. -/ +lemma 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 (higgsField l φ) (leptonDoubletField i l' φ') := + Subtype.ext (AlgebraRealization.id.covH_comm_covL i l l' φ φ') + +/-- The cross-sector commutation rule `H_comm_barL` in the covariant jet algebra. -/ +lemma 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 (higgsField l φ) (conjLeptonDoubletField i l' φ') := + Subtype.ext (AlgebraRealization.id.covH_comm_covBarL i l l' φ φ') + +/-- The cross-sector commutation rule `H_comm_e` in the covariant jet algebra. -/ +lemma 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 (higgsField l φ) (leptonSingletField i l' φ') := + Subtype.ext (AlgebraRealization.id.covH_comm_covE i l l' φ φ') + +/-- The cross-sector commutation rule `H_comm_bare` in the covariant jet algebra. -/ +lemma 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 (higgsField l φ) (conjLeptonSingletField i l' φ') := + Subtype.ext (AlgebraRealization.id.covH_comm_covBarE i l l' φ φ') + +/-- The cross-sector commutation rule `barH_comm_d` in the covariant jet algebra. -/ +lemma 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 (conjHiggsField l φ) (downSingletField i l' φ') := + Subtype.ext (AlgebraRealization.id.covBarH_comm_covD i l l' φ φ') + +/-- The cross-sector commutation rule `barH_comm_bard` in the covariant jet algebra. -/ +lemma 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 (conjHiggsField l φ) (conjDownSingletField i l' φ') := + Subtype.ext (AlgebraRealization.id.covBarH_comm_covBarD i l l' φ φ') + +/-- The cross-sector commutation rule `barH_comm_u` in the covariant jet algebra. -/ +lemma 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 (conjHiggsField l φ) (upSingletField i l' φ') := + Subtype.ext (AlgebraRealization.id.covBarH_comm_covU i l l' φ φ') + +/-- The cross-sector commutation rule `barH_comm_baru` in the covariant jet algebra. -/ +lemma 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 (conjHiggsField l φ) (conjUpSingletField i l' φ') := + Subtype.ext (AlgebraRealization.id.covBarH_comm_covBarU i l l' φ φ') + +/-- The cross-sector commutation rule `barH_comm_Q` in the covariant jet algebra. -/ +lemma 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 (conjHiggsField l φ) (quarkDoubletField i l' φ') := + Subtype.ext (AlgebraRealization.id.covBarH_comm_covQ i l l' φ φ') + +/-- The cross-sector commutation rule `barH_comm_barQ` in the covariant jet algebra. -/ +lemma 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 (conjHiggsField l φ) (conjQuarkDoubletField i l' φ') := + Subtype.ext (AlgebraRealization.id.covBarH_comm_covBarQ i l l' φ φ') + +/-- The cross-sector commutation rule `barH_comm_L` in the covariant jet algebra. -/ +lemma 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 (conjHiggsField l φ) (leptonDoubletField i l' φ') := + Subtype.ext (AlgebraRealization.id.covBarH_comm_covL i l l' φ φ') + +/-- The cross-sector commutation rule `barH_comm_barL` in the covariant jet algebra. -/ +lemma 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 (conjHiggsField l φ) (conjLeptonDoubletField i l' φ') := + Subtype.ext (AlgebraRealization.id.covBarH_comm_covBarL i l l' φ φ') + +/-- The cross-sector commutation rule `barH_comm_e` in the covariant jet algebra. -/ +lemma 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 (conjHiggsField l φ) (leptonSingletField i l' φ') := + Subtype.ext (AlgebraRealization.id.covBarH_comm_covE i l l' φ φ') + +/-- The cross-sector commutation rule `barH_comm_bare` in the covariant jet algebra. -/ +lemma 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 (conjHiggsField l φ) (conjLeptonSingletField i l' φ') := + Subtype.ext (AlgebraRealization.id.covBarH_comm_covBarE i l l' φ φ') + +end CovJetAlgebra + +end StandardModel diff --git a/Physlib/Particles/StandardModel/IsCovStandardModel/Basic.lean b/Physlib/Particles/StandardModel/IsCovStandardModel/Basic.lean deleted file mode 100644 index cb977979c..000000000 --- a/Physlib/Particles/StandardModel/IsCovStandardModel/Basic.lean +++ /dev/null @@ -1,425 +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.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 -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 - -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. - -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`. - -## 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 - -namespace StandardModel - -open TensorProduct Matrix MatrixGroups Lorentz - -structure IsCovStandardModel (B : Type) [Ring B] [Algebra ℂ 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 - (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 - 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), - 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 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), - 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' φ') - -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) - -/-- 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 - -/-! - -## 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 - --/ - -/-- 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 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 μ ν)) ∪ - (⋃ (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.1. Basic commutation relations - --/ - -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.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⟩) | - ⟨φ', 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.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 - · 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.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 - · 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/JetAlgebra/AlgebraRealization.lean b/Physlib/Particles/StandardModel/JetAlgebra/AlgebraRealization.lean index a12c8ba23..32566ecba 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/AlgebraRealization.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/AlgebraRealization.lean @@ -253,11 +253,11 @@ theorem mem_massWeightSubmoduleLE_eight_and_invariant_iff_lagrangian (x : JetAlg ∧ (∀ U : JetGaugeGroupI, repJetGaugeGroupI U x = x) ∧ ∀ Λ : SL(2,ℂ), repLorentzGroup Λ x = x) ↔ x ∈ 1 - ⊔ (AlgebraRealization.id.isCovStandardModel.isHiggsSector.dotSpan 0 0 - ⊔ (AlgebraRealization.id.isCovStandardModel.isGaugeSector.lorentzContractionEightSpan - ⊔ AlgebraRealization.id.isCovStandardModel.isHiggsSector.lorentzContractionEightSpan - ⊔ (AlgebraRealization.id.isCovStandardModel.isFermionSector.kineticSpan - ⊔ AlgebraRealization.id.isCovStandardModel.yukawaSpan))) := by + ⊔ (AlgebraRealization.id.toCovAlgebraRealization.isHiggsSector.dotSpan 0 0 + ⊔ (AlgebraRealization.id.toCovAlgebraRealization.isGaugeSector.lorentzContractionEightSpan + ⊔ AlgebraRealization.id.toCovAlgebraRealization.isHiggsSector.lorentzContractionEightSpan + ⊔ (AlgebraRealization.id.toCovAlgebraRealization.isFermionSector.kineticSpan + ⊔ AlgebraRealization.id.toCovAlgebraRealization.yukawaSpan))) := by rw [← algebraRealization_massWeightSubmoduleLE] exact AlgebraRealization.id.mem_massWeightSubmoduleLE_eight_and_invariant_iff_lagrangian x @@ -286,11 +286,11 @@ theorem mem_massWeightSubmoduleLE_eight_sup_and_invariant_iff_lagrangian ↔ ∃ y ∈ S, (∀ U : JetGaugeGroupI, repJetGaugeGroupI U y = y) ∧ (∀ Λ : SL(2,ℂ), repLorentzGroup Λ y = y) ∧ x - y ∈ 1 - ⊔ (AlgebraRealization.id.isCovStandardModel.isHiggsSector.dotSpan 0 0 - ⊔ (AlgebraRealization.id.isCovStandardModel.isGaugeSector.lorentzContractionEightSpan - ⊔ AlgebraRealization.id.isCovStandardModel.isHiggsSector.lorentzContractionEightSpan - ⊔ (AlgebraRealization.id.isCovStandardModel.isFermionSector.kineticSpan - ⊔ AlgebraRealization.id.isCovStandardModel.yukawaSpan))) := by + ⊔ (AlgebraRealization.id.toCovAlgebraRealization.isHiggsSector.dotSpan 0 0 + ⊔ (AlgebraRealization.id.toCovAlgebraRealization.isGaugeSector.lorentzContractionEightSpan + ⊔ AlgebraRealization.id.toCovAlgebraRealization.isHiggsSector.lorentzContractionEightSpan + ⊔ (AlgebraRealization.id.toCovAlgebraRealization.isFermionSector.kineticSpan + ⊔ AlgebraRealization.id.toCovAlgebraRealization.yukawaSpan))) := by rw [← algebraRealization_massWeightSubmoduleLE] exact AlgebraRealization.id.mem_massWeightSubmoduleLE_eight_sup_and_invariant_iff_lagrangian S hS hSL hScov x diff --git a/Physlib/Relativity/LorentzGroup/Boosts/WeightGrading.lean b/Physlib/Relativity/LorentzGroup/Boosts/WeightGrading.lean index 071de2b5d..53ae2986b 100644 --- a/Physlib/Relativity/LorentzGroup/Boosts/WeightGrading.lean +++ b/Physlib/Relativity/LorentzGroup/Boosts/WeightGrading.lean @@ -25,7 +25,7 @@ in the weight-zero one. A `WeightDecomposition` records a finitely supported family of subspaces of pure boost weight joining to a given submodule; it is transported along equalities and joined here. The product of two decompositions, which needs only multiplicativity of the representation, is -built where it is used, in `IsCovStandardModel/YukawaSector/MassDimLTEight.lean`, together +built where it is used, in `CovAlgebraRealization/YukawaSector/MassDimLTEight.lean`, together with the parity argument that a submodule of odd boost weights carries no invariant. ## ii. Key results From c25c019dd9fac774811c7ff39c104810633a07c3 Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Tue, 8 Sep 2026 09:37:50 +0400 Subject: [PATCH 289/367] feat: the Standard Model as a GaugeFieldData Adds `StandardModel.instGaugeJetLeibniz`, discharged by the existing `JetGaugeAlgebra.eval_iteratedDeriv_adjointMap`, so a datum over `StandardModel.gaugeJet` no longer assumes its Taylor-Leibniz law. Adds `StandardModel.HiggsVec.matterField`, the Higgs as a `MatterField` of mass weight two, with the four projection rules of the fermion adapters. Adds `StandardModel.FermionType`, its `matterField` and `StandardModel.fieldData : GaugeFieldData gaugeJet`: three generations of each of the five fermion types, indexed by `FermionType x Fin 3`, and one Higgs multiplet, with the computation, coverage and mass-weight rules `fieldData_fermion`, `fieldData_boson`, `card_fieldData_fermionSpecies`, `card_fieldData_bosonSpecies`, `fieldData_fermion_massWeight`, `fieldData_boson_massWeight` and the two `fieldData_massWeightScale..._basis_tmul` scaling lemmas. --- Physlib.lean | 2 + .../Particles/StandardModel/FieldData.lean | 212 ++++++++++++++++++ .../StandardModel/GaugeGroup/GaugeJet.lean | 23 +- .../StandardModel/HiggsBoson/MatterField.lean | 74 ++++++ 4 files changed, 310 insertions(+), 1 deletion(-) create mode 100644 Physlib/Particles/StandardModel/FieldData.lean create mode 100644 Physlib/Particles/StandardModel/HiggsBoson/MatterField.lean diff --git a/Physlib.lean b/Physlib.lean index 2416d4085..8d5b033c9 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -301,6 +301,7 @@ public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet.Basic public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet.GaugeAlgebraAction public import Physlib.Particles.StandardModel.Fermions.UpSinglet.Basic public import Physlib.Particles.StandardModel.Fermions.UpSinglet.GaugeAlgebraAction +public import Physlib.Particles.StandardModel.FieldData public import Physlib.Particles.StandardModel.GaugeAlgebra.Basic public import Physlib.Particles.StandardModel.GaugeAlgebra.Basis public import Physlib.Particles.StandardModel.GaugeAlgebra.InfinitesimalAction @@ -339,6 +340,7 @@ 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.MatterField public import Physlib.Particles.StandardModel.HiggsBoson.Potential public import Physlib.Particles.StandardModel.IsFermionSector.Basic public import Physlib.Particles.StandardModel.IsFermionSector.Components diff --git a/Physlib/Particles/StandardModel/FieldData.lean b/Physlib/Particles/StandardModel/FieldData.lean new file mode 100644 index 000000000..e0ee30aa5 --- /dev/null +++ b/Physlib/Particles/StandardModel/FieldData.lean @@ -0,0 +1,212 @@ +/- +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.ClassicalFieldTheory.JetAlgebra.GaugeFieldData +public import Physlib.Particles.StandardModel.Fermions.MatterField +public import Physlib.Particles.StandardModel.GaugeGroup.GaugeJet +public import Physlib.Particles.StandardModel.HiggsBoson.MatterField +/-! +# The field data of the Standard Model + +## i. Overview + +`GaugeFieldData jets` is the matter content of a gauge theory over a gauge context: a +family of fermionic species and a family of bosonic species, each given by a +`MatterField`. The Standard Model has all the pieces — `StandardModel.gaugeJet` with its +Taylor–Leibniz law, and the five fermion types and the Higgs already packaged as matter +fields — and this file assembles them into `StandardModel.fieldData`. + +The fermionic species are indexed by `FermionType × Fin 3`: fifteen multiplets, one of the +five types in one of the three generations, each occurring exactly once. The matter field +does not depend on the generation, three generations being three copies of one multiplet +distinguished only by their Yukawa couplings, which are not field data. The bosonic family +has the single Higgs multiplet. The gauge bosons are not a species: their generator space +is fixed by the gauge algebra alone, and `GaugeFieldData` supplies it as the connection +sector. + +From the datum the generic theory produces the generator spaces, the local field algebra +`fieldData.LocalAlgebra`, the transformation data and the realization arrow, with no +further Standard Model input. + +## ii. Key results + +- `StandardModel.FermionType` : the five fermion types. +- `StandardModel.fieldData` : the field data of the Standard Model. +- `StandardModel.card_fieldData_fermionSpecies`, + `StandardModel.card_fieldData_bosonSpecies` : fifteen fermionic multiplets, one Higgs. +- `StandardModel.fieldData_massWeightScaleFermion_inclFermion_basis_tmul` : a fermionic + component function `∂_s ψ_α` scales by `c ^ (3 + 2 |s|)`. + +## iii. Table of contents + +- A. The fermion types +- B. The field datum +- C. The mass weights + +-/ + +@[expose] public section + +open TensorProduct + +namespace StandardModel + +/-! + +## A. The fermion types + +-/ + +/-- The five fermion types of the Standard Model. Each occurs in three generations, which + are indexed separately. -/ +inductive FermionType where + /-- The lepton doublet, `(1, 2)_{-3}`. -/ + | leptonDoublet : FermionType + /-- The charged-lepton singlet, `(1, 1)_{-6}`. -/ + | leptonSinglet : FermionType + /-- The quark doublet, `(3, 2)_{1}`. -/ + | quarkDoublet : FermionType + /-- The up-type quark singlet, `(3, 1)_{4}`. -/ + | upSinglet : FermionType + /-- The down-type quark singlet, `(3, 1)_{-2}`. -/ + | downSinglet : FermionType +deriving DecidableEq + +namespace FermionType + +/-- There are five fermion types. -/ +instance : Fintype FermionType where + elems := {.leptonDoublet, .leptonSinglet, .quarkDoublet, .upSinglet, .downSinglet} + complete := fun t => by cases t <;> decide + +/-- The matter field of a fermion type, one of the five existing adapters. It is the same + in every generation. -/ +noncomputable def matterField : FermionType → MatterField JetGaugeGroupI + | .leptonDoublet => LeptonDoublet.matterField + | .leptonSinglet => LeptonSinglet.matterField + | .quarkDoublet => QuarkDoublet.matterField + | .upSinglet => UpSinglet.matterField + | .downSinglet => DownSinglet.matterField + +@[simp] +lemma matterField_leptonDoublet : + matterField .leptonDoublet = LeptonDoublet.matterField := rfl + +@[simp] +lemma matterField_leptonSinglet : + matterField .leptonSinglet = LeptonSinglet.matterField := rfl + +@[simp] +lemma matterField_quarkDoublet : + matterField .quarkDoublet = QuarkDoublet.matterField := rfl + +@[simp] +lemma matterField_upSinglet : matterField .upSinglet = UpSinglet.matterField := rfl + +@[simp] +lemma matterField_downSinglet : matterField .downSinglet = DownSinglet.matterField := rfl + +/-- Every Standard Model fermion carries mass weight three. -/ +@[simp] +lemma matterField_massWeight (t : FermionType) : (matterField t).massWeight = 3 := by + cases t <;> rfl + +end FermionType + +/-! + +## B. The field datum + +-/ + +/-- The field data of the Standard Model: three generations of each of the five fermion + types and one Higgs multiplet, over the gauge context `StandardModel.gaugeJet`. -/ +noncomputable def fieldData : GaugeFieldData gaugeJet where + FermionSpecies := FermionType × Fin 3 + fermion := fun t => t.1.matterField + BosonSpecies := Unit + boson := fun _ => HiggsVec.matterField + +@[simp] +lemma fieldData_fermionSpecies : fieldData.FermionSpecies = (FermionType × Fin 3) := rfl + +/-- A fermionic species is the multiplet of its type, in every generation. -/ +@[simp] +lemma fieldData_fermion (t : FermionType) (i : Fin 3) : + fieldData.fermion (t, i) = t.matterField := rfl + +@[simp] +lemma fieldData_bosonSpecies : fieldData.BosonSpecies = Unit := rfl + +/-- The one bosonic species is the Higgs multiplet. -/ +@[simp] +lemma fieldData_boson (j : fieldData.BosonSpecies) : + fieldData.boson j = HiggsVec.matterField := rfl + +/-- Fifteen fermionic multiplets: each of the five types in each of the three + generations, exactly once. -/ +lemma card_fieldData_fermionSpecies : Nat.card fieldData.FermionSpecies = 15 := by + show Nat.card (FermionType × Fin 3) = 15 + rw [Nat.card_eq_fintype_card, Fintype.card_prod] + rfl + +/-- Exactly one bosonic multiplet, the Higgs. -/ +lemma card_fieldData_bosonSpecies : Nat.card fieldData.BosonSpecies = 1 := by + show Nat.card Unit = 1 + simp + +/-! + +## C. The mass weights + +A Standard Model fermion carries mass weight three and the Higgs weight two, in the units +in which a derivative has weight two. The first two are read off the matter fields, the +third is already built into the generator spaces. + +-/ + +/-- Every fermionic species of the datum carries mass weight three. -/ +@[simp] +lemma fieldData_fermion_massWeight (j : fieldData.FermionSpecies) : + (fieldData.fermion j).massWeight = 3 := + FermionType.matterField_massWeight j.1 + +/-- The Higgs multiplet carries mass weight two. -/ +@[simp] +lemma fieldData_boson_massWeight (j : fieldData.BosonSpecies) : + (fieldData.boson j).massWeight = 2 := rfl + +/-- A fermionic component function `∂_s ψ_α` scales by `c ^ (3 + 2 |s|)`, whichever type + and generation it belongs to. -/ +lemma fieldData_massWeightScaleFermion_inclFermion_basis_tmul (c : ℂ) + (j : fieldData.FermionSpecies) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (fieldData.FermionValue j)) : + fieldData.massWeightScaleFermion c (fieldData.inclFermion j + ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : + JetComponentSpace (fieldData.FermionValue j))) + = c ^ (3 + 2 * Multiset.card s) • fieldData.inclFermion j + ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : + JetComponentSpace (fieldData.FermionValue j)) := by + have h := GaugeFieldData.massWeightScaleFermion_inclFermion_basis_tmul + (T := fieldData) c j s φ + rwa [fieldData_fermion_massWeight] at h + +/-- A Higgs component function `∂_s H_α` scales by `c ^ (2 + 2 |s|)`. -/ +lemma fieldData_massWeightScaleBoson_inclBoson_basis_tmul (c : ℂ) + (j : fieldData.BosonSpecies) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (fieldData.BosonValue j)) : + fieldData.massWeightScaleBoson c (fieldData.inclBoson j + ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : + JetComponentSpace (fieldData.BosonValue j))) + = c ^ (2 + 2 * Multiset.card s) • fieldData.inclBoson j + ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : + JetComponentSpace (fieldData.BosonValue j)) := by + have h := GaugeFieldData.massWeightScaleBoson_inclBoson_basis_tmul + (T := fieldData) c j s φ + rwa [fieldData_boson_massWeight] at h + +end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeGroup/GaugeJet.lean b/Physlib/Particles/StandardModel/GaugeGroup/GaugeJet.lean index 9f79ab1b9..86a62b8c4 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/GaugeJet.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/GaugeJet.lean @@ -8,6 +8,7 @@ module public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeField.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.Matter.CovariantDeriv public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.Basic +public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.GaugeAction public import Physlib.Particles.StandardModel.GaugeGroup.MaurerCartan.Basic public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.CovariantDeriv /-! @@ -24,7 +25,8 @@ This file packages those existing constructions as the named term `StandardModel.gaugeJet`, and records the rules that compute the generic interface back to the Standard Model definition it came from, so the existing Standard Model lemmas apply to it unchanged. It is a term, not an instance: every generic construction receives it as an -argument. `GaugeJetLeibniz` is not instantiated here. +argument. Its extra law `GaugeJetLeibniz` is a property of that package rather than a +choice, so it is an instance, discharged by the existing Taylor–Leibniz theorem. ## ii. Key results @@ -36,6 +38,8 @@ argument. `GaugeJetLeibniz` is not instantiated here. Model iterated derivative. - `StandardModel.gaugeJet_adjointCoeff`, `StandardModel.gaugeJet_adjointDualCoeff` : the generic base-point adjoint transport at this package is the existing Standard Model one. +- `StandardModel.instGaugeJetLeibniz` : the package obeys the Taylor–Leibniz rule for the + adjoint action. ## iii. Table of contents @@ -44,6 +48,7 @@ argument. `GaugeJetLeibniz` is not instantiated here. - B.1. The group and Lie algebra data - B.2. The derivative, the adjoint action and the Maurer–Cartan form - C. The generic adjoint transport is the Standard Model adjoint transport +- D. The Taylor–Leibniz rule -/ @@ -156,4 +161,20 @@ lemma gaugeJet_adjointCoeff (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3) lemma gaugeJet_adjointDualCoeff (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : _root_.adjointDualCoeff gaugeJet U x = adjointDualCoeff U x := rfl +/-! + +## D. The Taylor–Leibniz rule + +-/ + +/-- The Standard Model package obeys the Taylor–Leibniz rule for the adjoint action. The + class field is the existing theorem `JetGaugeAlgebra.eval_iteratedDeriv_adjointMap`: the + `IsGaugeField.adjointCoeff U p.1` appearing there is by definition the composite + `evalLie ∘ ∂_{p.1} ∘ Ad_U ∘ ofConstantLie` that the field writes out. + + Unlike the package itself this is a property of it and not a choice, so it is an + instance. -/ +instance instGaugeJetLeibniz : GaugeJetLeibniz gaugeJet where + evalLie_iteratedDeriv_adjoint := JetGaugeAlgebra.eval_iteratedDeriv_adjointMap + end StandardModel diff --git a/Physlib/Particles/StandardModel/HiggsBoson/MatterField.lean b/Physlib/Particles/StandardModel/HiggsBoson/MatterField.lean new file mode 100644 index 000000000..9b005418f --- /dev/null +++ b/Physlib/Particles/StandardModel/HiggsBoson/MatterField.lean @@ -0,0 +1,74 @@ +/- +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.ClassicalFieldTheory.GaugeTheory.Matter.MatterField +public import Physlib.Particles.StandardModel.HiggsBoson.JetAlgebra.Basic +/-! +# The Standard Model Higgs field as a matter field + +## i. Overview + +`MatterField G` bundles the value space of one field of a gauge theory with jet gauge +group `G`, its Lorentz representation, the fibrewise action of the jets of gauge +transformations, and its mass weight. The Higgs already carries all four, and this file +collects them, as `Physlib.Particles.StandardModel.Fermions.MatterField` does for the five +fermion types. Nothing is redefined and no convention is changed: the `2_{3}` jet action +and its fibrewise-linearity proof are the ones in +`Physlib.Particles.StandardModel.HiggsBoson.JetAlgebra.Basic`, the Higgs is a Lorentz +scalar, and mass weight two is the weight already fixed by +`HiggsJetAlgebra.massWeightScale`. + +## ii. Key results + +- `StandardModel.HiggsVec.matterField` : the Higgs field as a matter field, with the four + projection rules identifying its fields with the existing definitions. + +## iii. Table of contents + +- A. The Higgs as a matter field + +-/ + +@[expose] public section + +open Matrix MatrixGroups + +namespace StandardModel + +namespace HiggsVec + +/-! + +## A. The Higgs as a matter field + +-/ + +/-- The Higgs field as a matter field of `JetGaugeGroupI`, valued in `HiggsVec`, in the + `2_{3}` representation of the gauge group, a Lorentz scalar, of mass weight two. -/ +noncomputable def matterField : MatterField JetGaugeGroupI where + V := HiggsVec + repLorentz := Representation.trivial ℂ SL(2,ℂ) HiggsVec + repJet := repJetGaugeGroupI + repJet_smul := repJetGaugeGroupI_smul + massWeight := 2 + +@[simp] +lemma matterField_V : matterField.V = HiggsVec := rfl + +@[simp] +lemma matterField_repLorentz : + matterField.repLorentz = Representation.trivial ℂ SL(2,ℂ) HiggsVec := rfl + +@[simp] +lemma matterField_repJet : matterField.repJet = repJetGaugeGroupI := rfl + +@[simp] +lemma matterField_massWeight : matterField.massWeight = 2 := rfl + +end HiggsVec + +end StandardModel From 12135aecf847c8c9f38ff156d3c6a0126623f20d Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Tue, 8 Sep 2026 11:16:03 +0400 Subject: [PATCH 290/367] refactor: the generation index moves into the FermionType constructors --- .../Particles/StandardModel/FieldData.lean | 109 +++++++++--------- 1 file changed, 54 insertions(+), 55 deletions(-) diff --git a/Physlib/Particles/StandardModel/FieldData.lean b/Physlib/Particles/StandardModel/FieldData.lean index e0ee30aa5..9a6b9a47c 100644 --- a/Physlib/Particles/StandardModel/FieldData.lean +++ b/Physlib/Particles/StandardModel/FieldData.lean @@ -20,13 +20,14 @@ family of fermionic species and a family of bosonic species, each given by a Taylor–Leibniz law, and the five fermion types and the Higgs already packaged as matter fields — and this file assembles them into `StandardModel.fieldData`. -The fermionic species are indexed by `FermionType × Fin 3`: fifteen multiplets, one of the -five types in one of the three generations, each occurring exactly once. The matter field -does not depend on the generation, three generations being three copies of one multiplet -distinguished only by their Yukawa couplings, which are not field data. The bosonic family -has the single Higgs multiplet. The gauge bosons are not a species: their generator space -is fixed by the gauge algebra alone, and `GaugeFieldData` supplies it as the connection -sector. +The fermionic species are the constructors of `FermionType`: fifteen multiplets, one of +the five types in one of the three generations, each occurring exactly once. The +generation index is an argument of each constructor, so the species type is the +enumeration itself and carries no further factor. The matter field does not depend on the +generation, three generations being three copies of one multiplet distinguished only by +their Yukawa couplings, which are not field data. The bosonic family has the single Higgs +multiplet. The gauge bosons are not a species: their generator space is fixed by the gauge +algebra alone, and `GaugeFieldData` supplies it as the connection sector. From the datum the generic theory produces the generator spaces, the local field algebra `fieldData.LocalAlgebra`, the transformation data and the realization arrow, with no @@ -34,7 +35,8 @@ further Standard Model input. ## ii. Key results -- `StandardModel.FermionType` : the five fermion types. +- `StandardModel.FermionType` : the fifteen fermion species, the five types in each of + the three generations. - `StandardModel.fieldData` : the field data of the Standard Model. - `StandardModel.card_fieldData_fermionSpecies`, `StandardModel.card_fieldData_bosonSpecies` : fifteen fermionic multiplets, one Higgs. @@ -43,7 +45,7 @@ further Standard Model input. ## iii. Table of contents -- A. The fermion types +- A. The fermion species - B. The field datum - C. The mass weights @@ -57,60 +59,58 @@ namespace StandardModel /-! -## A. The fermion types +## A. The fermion species -/ -/-- The five fermion types of the Standard Model. Each occurs in three generations, which - are indexed separately. -/ +/-- The fifteen fermion species of the Standard Model: each of the five fermion types in + each of the three generations, the generation `i : Fin 3` carried by the constructor. + Two generations of one type share a representation package but are distinct species. -/ inductive FermionType where - /-- The lepton doublet, `(1, 2)_{-3}`. -/ - | leptonDoublet : FermionType - /-- The charged-lepton singlet, `(1, 1)_{-6}`. -/ - | leptonSinglet : FermionType - /-- The quark doublet, `(3, 2)_{1}`. -/ - | quarkDoublet : FermionType - /-- The up-type quark singlet, `(3, 1)_{4}`. -/ - | upSinglet : FermionType - /-- The down-type quark singlet, `(3, 1)_{-2}`. -/ - | downSinglet : FermionType -deriving DecidableEq + /-- The lepton doublet of generation `i`, `(1, 2)_{-3}`. -/ + | leptonDoublet (i : Fin 3) : FermionType + /-- The charged-lepton singlet of generation `i`, `(1, 1)_{-6}`. -/ + | leptonSinglet (i : Fin 3) : FermionType + /-- The quark doublet of generation `i`, `(3, 2)_{1}`. -/ + | quarkDoublet (i : Fin 3) : FermionType + /-- The up-type quark singlet of generation `i`, `(3, 1)_{4}`. -/ + | upSinglet (i : Fin 3) : FermionType + /-- The down-type quark singlet of generation `i`, `(3, 1)_{-2}`. -/ + | downSinglet (i : Fin 3) : FermionType +deriving DecidableEq, Fintype namespace FermionType -/-- There are five fermion types. -/ -instance : Fintype FermionType where - elems := {.leptonDoublet, .leptonSinglet, .quarkDoublet, .upSinglet, .downSinglet} - complete := fun t => by cases t <;> decide - -/-- The matter field of a fermion type, one of the five existing adapters. It is the same - in every generation. -/ +/-- The matter field of a fermion species, one of the five existing adapters. It is the + same in every generation. -/ noncomputable def matterField : FermionType → MatterField JetGaugeGroupI - | .leptonDoublet => LeptonDoublet.matterField - | .leptonSinglet => LeptonSinglet.matterField - | .quarkDoublet => QuarkDoublet.matterField - | .upSinglet => UpSinglet.matterField - | .downSinglet => DownSinglet.matterField + | .leptonDoublet _ => LeptonDoublet.matterField + | .leptonSinglet _ => LeptonSinglet.matterField + | .quarkDoublet _ => QuarkDoublet.matterField + | .upSinglet _ => UpSinglet.matterField + | .downSinglet _ => DownSinglet.matterField @[simp] -lemma matterField_leptonDoublet : - matterField .leptonDoublet = LeptonDoublet.matterField := rfl +lemma matterField_leptonDoublet (i : Fin 3) : + matterField (.leptonDoublet i) = LeptonDoublet.matterField := rfl @[simp] -lemma matterField_leptonSinglet : - matterField .leptonSinglet = LeptonSinglet.matterField := rfl +lemma matterField_leptonSinglet (i : Fin 3) : + matterField (.leptonSinglet i) = LeptonSinglet.matterField := rfl @[simp] -lemma matterField_quarkDoublet : - matterField .quarkDoublet = QuarkDoublet.matterField := rfl +lemma matterField_quarkDoublet (i : Fin 3) : + matterField (.quarkDoublet i) = QuarkDoublet.matterField := rfl @[simp] -lemma matterField_upSinglet : matterField .upSinglet = UpSinglet.matterField := rfl +lemma matterField_upSinglet (i : Fin 3) : + matterField (.upSinglet i) = UpSinglet.matterField := rfl @[simp] -lemma matterField_downSinglet : matterField .downSinglet = DownSinglet.matterField := rfl +lemma matterField_downSinglet (i : Fin 3) : + matterField (.downSinglet i) = DownSinglet.matterField := rfl -/-- Every Standard Model fermion carries mass weight three. -/ +/-- Every Standard Model fermion carries mass weight three, in every generation. -/ @[simp] lemma matterField_massWeight (t : FermionType) : (matterField t).massWeight = 3 := by cases t <;> rfl @@ -126,18 +126,17 @@ end FermionType /-- The field data of the Standard Model: three generations of each of the five fermion types and one Higgs multiplet, over the gauge context `StandardModel.gaugeJet`. -/ noncomputable def fieldData : GaugeFieldData gaugeJet where - FermionSpecies := FermionType × Fin 3 - fermion := fun t => t.1.matterField + FermionSpecies := FermionType + fermion := FermionType.matterField BosonSpecies := Unit boson := fun _ => HiggsVec.matterField @[simp] -lemma fieldData_fermionSpecies : fieldData.FermionSpecies = (FermionType × Fin 3) := rfl +lemma fieldData_fermionSpecies : fieldData.FermionSpecies = FermionType := rfl -/-- A fermionic species is the multiplet of its type, in every generation. -/ +/-- A fermionic species is the multiplet of its type, whichever generation it is in. -/ @[simp] -lemma fieldData_fermion (t : FermionType) (i : Fin 3) : - fieldData.fermion (t, i) = t.matterField := rfl +lemma fieldData_fermion (t : FermionType) : fieldData.fermion t = t.matterField := rfl @[simp] lemma fieldData_bosonSpecies : fieldData.BosonSpecies = Unit := rfl @@ -150,8 +149,8 @@ lemma fieldData_boson (j : fieldData.BosonSpecies) : /-- Fifteen fermionic multiplets: each of the five types in each of the three generations, exactly once. -/ lemma card_fieldData_fermionSpecies : Nat.card fieldData.FermionSpecies = 15 := by - show Nat.card (FermionType × Fin 3) = 15 - rw [Nat.card_eq_fintype_card, Fintype.card_prod] + show Nat.card FermionType = 15 + rw [Nat.card_eq_fintype_card] rfl /-- Exactly one bosonic multiplet, the Higgs. -/ @@ -173,15 +172,15 @@ third is already built into the generator spaces. @[simp] lemma fieldData_fermion_massWeight (j : fieldData.FermionSpecies) : (fieldData.fermion j).massWeight = 3 := - FermionType.matterField_massWeight j.1 + FermionType.matterField_massWeight j /-- The Higgs multiplet carries mass weight two. -/ @[simp] lemma fieldData_boson_massWeight (j : fieldData.BosonSpecies) : (fieldData.boson j).massWeight = 2 := rfl -/-- A fermionic component function `∂_s ψ_α` scales by `c ^ (3 + 2 |s|)`, whichever type - and generation it belongs to. -/ +/-- A fermionic component function `∂_s ψ_α` scales by `c ^ (3 + 2 |s|)`, whichever + species it belongs to. -/ lemma fieldData_massWeightScaleFermion_inclFermion_basis_tmul (c : ℂ) (j : fieldData.FermionSpecies) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (fieldData.FermionValue j)) : From 6c178d14f7bedc805a37142d3b2a638220813ecd Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 8 Sep 2026 08:58:03 +0100 Subject: [PATCH 291/367] feat: Update IsHiggsSector --- Physlib.lean | 9 +- .../Mathematics/SubalgebraRestriction.lean | 118 ++++++ Physlib/Meta/TODO/Basic.lean | 50 ++- .../AlgebraRealization/Basic.lean | 49 +-- .../CovAlgebraRealization/Basic.lean | 47 ++- .../GaugeHiggsSector/MassWeight.lean | 4 +- .../CovAlgebraRealization/MassWeight.lean | 8 +- .../CovAlgebraRealization/Sectors.lean | 8 +- .../YukawaSector/MassDimEight.lean | 5 +- .../StandardModel/IsHiggsSector/Basic.lean | 306 +++++++++----- .../IsHiggsSector/DerivSubmodule/Basic.lean | 20 +- .../BoostWeightDecomposition.lean | 65 ++- .../GaugeWeightDecomposition.lean | 9 +- .../IsHiggsSector/MassWeight/Basic.lean | 8 +- .../MassWeight/GaugeWeightDecomposition.lean | 36 +- .../MassWeight/MassDimEight.lean | 10 +- .../MassWeight/MassDimLTEight.lean | 10 +- .../{ => JetAlgebra}/CovJetAlgebra/Basic.lean | 54 ++- .../JetAlgebra/CovJetAlgebra/Higgs.lean | 399 ++++++++++++++++++ .../CovJetAlgebra/Sectors.lean | 92 +--- .../StandardModel/JetAlgebra/Realization.lean | 66 +++ scripts/insert_todo.py | 15 +- scripts/todos.py | 20 +- 23 files changed, 1024 insertions(+), 384 deletions(-) create mode 100644 Physlib/Mathematics/SubalgebraRestriction.lean rename Physlib/Particles/StandardModel/{ => JetAlgebra}/CovJetAlgebra/Basic.lean (93%) create mode 100644 Physlib/Particles/StandardModel/JetAlgebra/CovJetAlgebra/Higgs.lean rename Physlib/Particles/StandardModel/{ => JetAlgebra}/CovJetAlgebra/Sectors.lean (86%) create mode 100644 Physlib/Particles/StandardModel/JetAlgebra/Realization.lean diff --git a/Physlib.lean b/Physlib.lean index 8d5b033c9..2ef3af95e 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -183,6 +183,7 @@ public import Physlib.Mathematics.SO3.Basic public import Physlib.Mathematics.SchurTriangulation public import Physlib.Mathematics.SpecialFunctions.EllipticIntegral public import Physlib.Mathematics.SpecialFunctions.PhysHermite +public import Physlib.Mathematics.SubalgebraRestriction public import Physlib.Mathematics.SymmetricAlgebra public import Physlib.Mathematics.TensorProductComm public import Physlib.Mathematics.Trigonometry.SinSq @@ -286,8 +287,6 @@ public import Physlib.Particles.StandardModel.CovAlgebraRealization.YukawaSector public import Physlib.Particles.StandardModel.CovAlgebraRealization.YukawaSector.GaugeWeightDecomposition public import Physlib.Particles.StandardModel.CovAlgebraRealization.YukawaSector.MassDimEight public import Physlib.Particles.StandardModel.CovAlgebraRealization.YukawaSector.MassDimLTEight -public import Physlib.Particles.StandardModel.CovJetAlgebra.Basic -public import Physlib.Particles.StandardModel.CovJetAlgebra.Sectors public import Physlib.Particles.StandardModel.Fermions.DownSinglet.Basic public import Physlib.Particles.StandardModel.Fermions.DownSinglet.GaugeAlgebraAction public import Physlib.Particles.StandardModel.Fermions.JetAlgebra.Basic @@ -369,6 +368,9 @@ public import Physlib.Particles.StandardModel.IsHiggsSector.MassWeight.MassDimEi public import Physlib.Particles.StandardModel.IsHiggsSector.MassWeight.MassDimLTEight public import Physlib.Particles.StandardModel.JetAlgebra.AlgebraRealization public import Physlib.Particles.StandardModel.JetAlgebra.Basic +public import Physlib.Particles.StandardModel.JetAlgebra.CovJetAlgebra.Basic +public import Physlib.Particles.StandardModel.JetAlgebra.CovJetAlgebra.Higgs +public import Physlib.Particles.StandardModel.JetAlgebra.CovJetAlgebra.Sectors public import Physlib.Particles.StandardModel.JetAlgebra.FieldAlgebra public import Physlib.Particles.StandardModel.JetAlgebra.GaugeAction public import Physlib.Particles.StandardModel.JetAlgebra.Generators @@ -376,6 +378,7 @@ 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.MassWeightPoly +public import Physlib.Particles.StandardModel.JetAlgebra.Realization public import Physlib.Particles.StandardModel.JetAlgebra.TransformsIn public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.Basic public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.GaugeAction @@ -762,4 +765,4 @@ public import Physlib.Units.WithDim.Mass public import Physlib.Units.WithDim.Momentum public import Physlib.Units.WithDim.Pressure public import Physlib.Units.WithDim.Speed -public import Physlib.Units.WithDim.Velocity +public import Physlib.Units.WithDim.Velocity \ No newline at end of file diff --git a/Physlib/Mathematics/SubalgebraRestriction.lean b/Physlib/Mathematics/SubalgebraRestriction.lean new file mode 100644 index 000000000..f9dc893b2 --- /dev/null +++ b/Physlib/Mathematics/SubalgebraRestriction.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 Mathlib.Algebra.Algebra.Subalgebra.Basic +public import Mathlib.Algebra.Polynomial.AlgebraMap +/-! +# Restricting a polynomial-valued algebra map to a subalgebra + +## i. Overview + +A grading of an algebra `A` is often recorded by an algebra map `f : A →ₐ[R] A[X]`, the +weight-`n` part being the eigenspace on which `f` is the monomial `X ^ n`. A subalgebra `S` +of `A` inherits such a grading exactly when `f` carries `S` into the polynomials with +coefficients in `S`, and this file supplies the two steps that gives. + +Section A reduces the closure condition to the generators: since `f` is an algebra map and +the polynomials with coefficients in `S` form a subalgebra of `A[X]`, it is enough that +each generator lands there. Section B turns the closure condition into an algebra map +`S →ₐ[R] S[X]`, through the injection of `S[X]` into `A[X]`, and records that an eigenvalue +equation in `S` is the ambient one. + +Nothing here is about any particular algebra. It is stated for an arbitrary `S` so that it +can be used at concrete algebras, where unfolding instances to check the corresponding +statement directly would be expensive. + +## ii. Key results + +- `Subalgebra.mem_range_mapAlgHom_of_adjoin` : the closure condition follows from the + generators. +- `Subalgebra.polyRestrict` : the restricted map `S →ₐ[R] S[X]`. +- `Subalgebra.polyRestrict_eq_monomial_iff` : an eigenvalue equation in `S` is the ambient + one. + +## iii. Table of contents + +- A. Closure from the generators +- B. The restricted map + +-/ + +@[expose] public section + +namespace Subalgebra + +variable {R A : Type*} [CommRing R] [Ring A] [Algebra R A] + +/-! + +## A. Closure from the generators + +-/ + +/-- The polynomials with coefficients in a subalgebra, as a subalgebra of the polynomials + with coefficients in the ambient algebra. -/ +noncomputable abbrev polyRange (S : Subalgebra R A) : Subalgebra R (Polynomial A) := + (Polynomial.mapAlgHom S.val).range + +/-- A monomial with a coefficient in `S` has coefficients in `S`. -/ +lemma monomial_mem_polyRange {S : Subalgebra R A} {n : ℕ} {y : A} (hy : y ∈ S) : + Polynomial.monomial n y ∈ S.polyRange := + ⟨Polynomial.monomial n ⟨y, hy⟩, by simp⟩ + +/-- If an algebra map into the polynomials sends every generator of an adjoined subalgebra + into the polynomials over `S`, it sends the whole subalgebra there: the condition cuts out + a subalgebra, and the generators lie in it. -/ +lemma mem_range_mapAlgHom_of_adjoin {G : Set A} {f : A →ₐ[R] Polynomial A} + (S : Subalgebra R A) (hgen : ∀ y ∈ G, f y ∈ S.polyRange) + {x : A} (hx : x ∈ Algebra.adjoin R G) : f x ∈ S.polyRange := by + induction hx using Algebra.adjoin_induction with + | mem b hb => exact hgen b hb + | algebraMap c => exact ⟨algebraMap R (Polynomial S) c, by simp⟩ + | add a b _ _ iha ihb => rw [map_add]; exact add_mem iha ihb + | mul a b _ _ iha ihb => rw [map_mul]; exact mul_mem iha ihb + +/-! + +## B. The restricted map + +-/ + +/-- Polynomials over a subalgebra inject into polynomials over the ambient algebra. -/ +lemma mapAlgHom_val_injective (S : Subalgebra R A) : + Function.Injective (Polynomial.mapAlgHom S.val) := by + rw [Polynomial.coe_mapAlgHom] + exact Polynomial.map_injective _ Subtype.val_injective + +/-- An algebra map into the polynomials, restricted to a subalgebra it carries into the + polynomials over that subalgebra. -/ +noncomputable def polyRestrict (S : Subalgebra R A) (f : A →ₐ[R] Polynomial A) + (hf : ∀ x : S, f (x : A) ∈ S.polyRange) : S →ₐ[R] Polynomial S := + (AlgEquiv.ofInjective (Polynomial.mapAlgHom S.val) S.mapAlgHom_val_injective).symm.toAlgHom.comp + (AlgHom.codRestrict (f.comp S.val) _ hf) + +@[simp] +lemma mapAlgHom_polyRestrict {S : Subalgebra R A} {f : A →ₐ[R] Polynomial A} + (hf : ∀ x : S, f (x : A) ∈ S.polyRange) (x : S) : + Polynomial.mapAlgHom S.val (S.polyRestrict f hf x) = f (x : A) := + congrArg Subtype.val ((AlgEquiv.ofInjective (Polynomial.mapAlgHom S.val) + S.mapAlgHom_val_injective).apply_symm_apply ⟨f (x : A), hf x⟩) + +/-- An eigenvalue equation for the restricted map is the ambient eigenvalue equation. -/ +lemma polyRestrict_eq_monomial_iff {S : Subalgebra R A} {f : A →ₐ[R] Polynomial A} + (hf : ∀ x : S, f (x : A) ∈ S.polyRange) {n : ℕ} (x : S) : + S.polyRestrict f hf x = Polynomial.monomial n x + ↔ f (x : A) = Polynomial.monomial n (x : A) := by + constructor + · intro hx + rw [← mapAlgHom_polyRestrict hf x, hx, Polynomial.mapAlgHom_monomial] + rfl + · intro hx + refine S.mapAlgHom_val_injective ?_ + rw [mapAlgHom_polyRestrict hf x, hx, Polynomial.mapAlgHom_monomial] + rfl + +end Subalgebra diff --git a/Physlib/Meta/TODO/Basic.lean b/Physlib/Meta/TODO/Basic.lean index b2cfee2b7..6fb996b6b 100644 --- a/Physlib/Meta/TODO/Basic.lean +++ b/Physlib/Meta/TODO/Basic.lean @@ -24,6 +24,16 @@ 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. +A TODO item can also record the date on which the note was added, with an optional +`(date := ...)` clause, which comes after the `(lines := ...)` clause (if any) and before +the string: + +- `TODO (date := 2026-09-08) "..."` records that the note was added on that date. +- `TODO (lines := 82) (date := 2026-09-08) "..."` combines both clauses. + +A TODO item written without a `(date := ...)` clause carries no date, which is the +behaviour of every TODO item written before dates existed. + ## Note on the syntax The clause is written `(lines := 201-223)` rather than `#L201-L223` because the latter @@ -39,7 +49,7 @@ which a command is legal, which is not in general the line below the selection: 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. +up. The date clause is written with today's date, automatically. 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 @@ -74,6 +84,9 @@ structure todoInfo where endLine : Nat := line /-- The tag of the TODO item -/ tag : String + /-- The date the note was added, as `YYYY-MM-DD`, read off an optional + `(date := ...)` clause. `none` for a note written before dates existed. -/ + dateAdded : Option String := none /-- Environment extension to store `todo ...`. -/ meta initialize todoExtension : SimplePersistentEnvExtension todoInfo (Array todoInfo) ← @@ -87,8 +100,14 @@ meta initialize todoExtension : SimplePersistentEnvExtension todoInfo (Array tod `(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 " (todoLines)? str : command +/-- Syntax for the optional date on which a `TODO ...` command was added, written +`(date := 2026-09-08)`. -/ +syntax todoDate := "(" &"date" " := " num "-" num "-" num ")" + +/-- Syntax for the `TODO ...` command. The two clauses are wrapped in `atomic` so that, +with only a `(date := ...)` clause present, the attempt to parse a `(lines := ...)` +clause backtracks past the `(` it shares with `(date := ...)` instead of erroring. -/ +syntax (name := todo_comment) "TODO " (atomic(todoLines))? (atomic(todoDate))? 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 @@ -109,10 +128,27 @@ meta def todoLinesOfSyntax (stx : Syntax) (line : Nat) : throwError "The `TODO` command was given a range of lines ending before it starts" return (first, last) +/-- Pads a number to two digits, e.g. `9` to `"09"`, for rendering a date. -/ +meta def padDatePart (n : Nat) : String := if n < 10 then s!"0{n}" else toString n + +/-- The date of a `TODO ...` command, read off from the optional `(date := ...)` clause, +as `YYYY-MM-DD`. `none` when no such clause is present. -/ +meta def todoDateOfSyntax (stx : Syntax) : Elab.Command.CommandElabM (Option String) := do + if stx.getNumArgs == 0 then + return none + let clause := stx[0] + let some year := clause[3].isNatLit? | + throwError "Invalid date for the `TODO` command" + let some month := clause[5].isNatLit? | + throwError "Invalid date for the `TODO` command" + let some day := clause[7].isNatLit? | + throwError "Invalid date for the `TODO` command" + return some s!"{year}-{padDatePart month}-{padDatePart day}" + /-- Elaborator for the `TODO ...` command -/ @[command_elab todo_comment] meta def elabTODO : Elab.Command.CommandElab := fun stx => do - let some str := stx[2].isStrLit? | + let some str := stx[3].isStrLit? | throwError "Invalid syntax for `TODO` command" let some pos := stx.getPos? | throwError "Invalid syntax for `TODO` command" @@ -121,11 +157,13 @@ meta def elabTODO : Elab.Command.CommandElab := fun stx => do let fileMap ← getFileMap let commandLine := (fileMap.toPosition pos).line let (line, endLine) ← todoLinesOfSyntax stx[1] commandLine + let dateAdded ← todoDateOfSyntax stx[2] let modName := env.mainModule let todoInfo : todoInfo := { - content := str, fileName := modName, line := line, endLine := endLine, tag := tag} + content := str, fileName := modName, line := line, endLine := endLine, tag := tag, + dateAdded := dateAdded} modifyEnv fun env => todoExtension.addEntry env todoInfo - Elab.Command.liftTermElabM <| Lean.Elab.Term.addTermInfo' stx[2] + Elab.Command.liftTermElabM <| Lean.Elab.Term.addTermInfo' stx[3] (Lean.mkStrLit s!"TODO tag: {tag}") (expectedType? := none) end Physlib diff --git a/Physlib/Particles/StandardModel/AlgebraRealization/Basic.lean b/Physlib/Particles/StandardModel/AlgebraRealization/Basic.lean index 0310d4afe..972884b22 100644 --- a/Physlib/Particles/StandardModel/AlgebraRealization/Basic.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/Basic.lean @@ -45,8 +45,6 @@ their gauge covariance and the classification of jet-gauge invariants. - `StandardModel.AlgebraRealization` : an algebra is a Standard Model when it receives an equivariant algebra map from the jet algebra. -- `AlgebraRealization.id` : the jet algebra of the Standard Model is a Standard Model, along - the identity algebra map. - `AlgebraRealization.A`, `AlgebraRealization.H` and their companions : the thirteen families of derivative symbols of a Standard Model. - `AlgebraRealization.repJet_A`, `AlgebraRealization.repLorentz_H`, @@ -55,12 +53,11 @@ their gauge covariance and the classification of jet-gauge invariants. ## iii. Table of contents -- A. The identity realization -- B. The fields of a Standard Model -- C. Transporting a fact along the defining map -- D. The gauge transformation of the fields -- E. The Lorentz transformation of the fields -- F. The mass weights of the fields +- A. The fields of a Standard Model +- B. Transporting a fact along the defining map +- C. The gauge transformation of the fields +- D. The Lorentz transformation of the fields +- E. The mass weights of the fields -/ @@ -114,34 +111,6 @@ structure AlgebraRealization (B : Type) [Ring B] [Algebra ℂ B] namespace AlgebraRealization -/-! - -## A. The identity realization - -The jet algebra of the Standard Model is a Standard Model along the identity algebra map, -since `AlgebraRealization` asks precisely for an equivariant algebra map out of the jet -algebra. The four compatibility laws hold by definition, and the two multiplicativity laws -are the ones the jet gauge action and the Lorentz action were shown to satisfy when they -were built. - -This is the point at which the abstract theory of `AlgebraRealization` — its covariant -reduction, its mass-weight filtration and its classification of invariants — becomes a -theory of the concrete algebra in which a Standard Model Lagrangian is written. - --/ - -/-- The jet algebra of the Standard Model is a Standard Model: it is one along the identity - algebra map. -/ -noncomputable def id : AlgebraRealization JetAlgebra JetAlgebra.repJetGaugeGroupI - JetAlgebra.repLorentzGroup JetAlgebra.massWeightPoly where - toAlgHom := AlgHom.id ℂ JetAlgebra - map_repJet _ _ := rfl - map_repLorentz _ _ := rfl - map_massWeight x := by - simp [Polynomial.mapAlgHom] - repJet_mul := JetAlgebra.isGaugeField.gauge_mul - repLorentz_mul := JetAlgebra.repLorentzGroup_apply_mul - variable {B : Type} [Ring B] [Algebra ℂ B] {repJet : Representation ℂ JetGaugeGroupI B} {repLorentz : Representation ℂ SL(2,ℂ) B} @@ -150,7 +119,7 @@ variable {B : Type} [Ring B] [Algebra ℂ B] /-! -## B. The fields of a Standard Model +## A. The fields of a Standard Model The thirteen families of derivative symbols the theory is written in — the gauge field, the Higgs field and its conjugate, and the five fermion species in three generations with @@ -230,7 +199,7 @@ noncomputable def bare (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : /-! -## C. Transporting a fact along the defining map +## B. Transporting a fact along the defining map Every law the old structure demanded as an axiom is now a theorem, proved once for the jet algebra and transported along `toAlgHom`. The transport is the same in each of the shapes @@ -267,7 +236,7 @@ private lemma map_family_repLorentz {V : Type} [AddCommGroup V] [Module ℂ V] /-! -## D. The gauge transformation of the fields +## C. The gauge transformation of the fields The gauge field is a gauge field — Lorentz covector symbols, the all-orders adjoint Leibniz convolution with the Maurer–Cartan shift, and a multiplicative gauge action — and @@ -360,7 +329,7 @@ lemma repJet_bare : ∀ i, TransformsIn repJet (repConj LeptonSinglet.repJetGaug /-! -## E. The Lorentz transformation of the fields +## D. The Lorentz transformation of the fields The derivative slots of every field mix by per-slot Lorentz matrices, and the value index by the contragredient of the species' Lorentz representation: the Higgs is a scalar, the diff --git a/Physlib/Particles/StandardModel/CovAlgebraRealization/Basic.lean b/Physlib/Particles/StandardModel/CovAlgebraRealization/Basic.lean index 99e43766f..4e2f9869d 100644 --- a/Physlib/Particles/StandardModel/CovAlgebraRealization/Basic.lean +++ b/Physlib/Particles/StandardModel/CovAlgebraRealization/Basic.lean @@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE. Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.CovJetAlgebra.Sectors +public import Physlib.Particles.StandardModel.JetAlgebra.CovJetAlgebra.Sectors /-! # The covariant algebra valued Standard Model @@ -292,25 +292,32 @@ inside it. -/ -/-- The Higgs sector of a covariant Standard Model. -/ -theorem isHiggsSector : IsHiggsSector B repGauge k.repGauge_mul repLorentz k.repLorentz_mul - (fun _n l => k.covH l) (fun _n l => k.covBarH l) massWeightPoly where - H_equivariant := fun g φ _n l => - k.map_repGauge_eq (CovJetAlgebra.isHiggsSector.H_equivariant g φ _n l) - barH_equivariant := fun g φ _n l => - k.map_repGauge_eq (CovJetAlgebra.isHiggsSector.barH_equivariant g φ _n l) - H_comm_H := fun φ ψ _n₁ _n₂ l₁ l₂ => - (CovJetAlgebra.isHiggsSector.H_comm_H φ ψ _n₁ _n₂ l₁ l₂).map k.toAlgHom - H_comm_barH := fun φ ψ _n₁ _n₂ l₁ l₂ => - (CovJetAlgebra.isHiggsSector.H_comm_barH φ ψ _n₁ _n₂ l₁ l₂).map k.toAlgHom - barH_comm_barH := fun φ ψ _n₁ _n₂ l₁ l₂ => - (CovJetAlgebra.isHiggsSector.barH_comm_barH φ ψ _n₁ _n₂ l₁ l₂).map k.toAlgHom - H_massWeight := fun φ _n l => - k.map_massWeight_monomial (CovJetAlgebra.isHiggsSector.H_massWeight φ _n l) - barH_massWeight := fun φ _n l => - k.map_massWeight_monomial (CovJetAlgebra.isHiggsSector.barH_massWeight φ _n l) - repLorentz_H := k.map_lorentz CovJetAlgebra.isHiggsSector.repLorentz_H - repLorentz_barH := k.map_lorentz CovJetAlgebra.isHiggsSector.repLorentz_barH +/-- The Higgs sector of a covariant Standard Model: the defining map restricted to the + covariant jet algebra of the Higgs field. -/ +noncomputable def isHiggsSector : + IsHiggsSector B repGauge repLorentz massWeightPoly where + toAlgHom := k.toAlgHom.comp CovJetAlgebra.higgsSubalgebra.val + map_rep g x := k.map_repGauge g (x : CovJetAlgebra) + map_repLorentz Λ x := k.map_repLorentz Λ (x : CovJetAlgebra) + map_massWeight x := by + show massWeightPoly (k.toAlgHom (x : CovJetAlgebra)) = _ + rw [k.map_massWeight, ← Subalgebra.mapAlgHom_polyRestrict + CovJetAlgebra.massWeightPoly_mem_polyRange x] + exact AlgHom.congr_fun (Polynomial.mapAlgHom_comp _ k.toAlgHom + CovJetAlgebra.higgsSubalgebra.val) _ + rep_mul := k.repGauge_mul + repLorentz_mul := k.repLorentz_mul + +/-- The Higgs towers of the Higgs sector of a covariant Standard Model are its own. -/ +@[simp] +lemma isHiggsSector_covH (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : + k.isHiggsSector.covH n l = k.covH l := rfl + +/-- The conjugate Higgs towers of the Higgs sector of a covariant Standard Model are its + own. -/ +@[simp] +lemma isHiggsSector_covBarH (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : + k.isHiggsSector.covBarH n l = k.covBarH l := rfl /-- The gauge sector of a covariant Standard Model. -/ theorem isGaugeSector : IsGaugeSector B repGauge k.repGauge_mul repLorentz k.repLorentz_mul diff --git a/Physlib/Particles/StandardModel/CovAlgebraRealization/GaugeHiggsSector/MassWeight.lean b/Physlib/Particles/StandardModel/CovAlgebraRealization/GaugeHiggsSector/MassWeight.lean index ac3693cc9..9ac1bde0b 100644 --- a/Physlib/Particles/StandardModel/CovAlgebraRealization/GaugeHiggsSector/MassWeight.lean +++ b/Physlib/Particles/StandardModel/CovAlgebraRealization/GaugeHiggsSector/MassWeight.lean @@ -350,10 +350,10 @@ theorem mem_of_lorentz_invariant_derivSubmodule_zero_mul_higgs_one_sup (S : Subm = ∑ ν : Fin 1 ⊕ Fin 3, (((SL2C.toLorentzGroup g).1 ν μ : ℝ) : ℂ) • Sum.elim (fun φ => h.covH ![ν] φ) (fun ψ => h.covBarH ![ν] ψ) j := by rintro (φ | ψ) g μ - · simp only [Sum.elim_inl] + · simp only [Sum.elim_inl, ← h.isHiggsSector_covH 1 ![μ]] rw [h.isHiggsSector.repLorentz_H_apply g φ 1 ![μ], IsGaugeSector.sum_cov_one] exact Finset.sum_congr rfl fun ν _ => by simp - · simp only [Sum.elim_inr] + · simp only [Sum.elim_inr, ← h.isHiggsSector_covBarH 1 ![μ]] rw [h.isHiggsSector.repLorentz_barH_apply g ψ 1 ![μ], IsGaugeSector.sum_cov_one] exact Finset.sum_congr rfl fun ν _ => by simp have hT : ∀ i : Module.Dual ℝ GaugeAlgebra × diff --git a/Physlib/Particles/StandardModel/CovAlgebraRealization/MassWeight.lean b/Physlib/Particles/StandardModel/CovAlgebraRealization/MassWeight.lean index bda580903..6315c33ca 100644 --- a/Physlib/Particles/StandardModel/CovAlgebraRealization/MassWeight.lean +++ b/Physlib/Particles/StandardModel/CovAlgebraRealization/MassWeight.lean @@ -340,11 +340,11 @@ 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] + simp only [generatorVal, ← h.isHiggsSector_covH n l] rw [h.isHiggsSector.H_equivariant g _ n l] exact h.H_mem_massWeightSubmodule l _ | barH n l j => - simp only [generatorVal] + simp only [generatorVal, ← h.isHiggsSector_covBarH n l] rw [h.isHiggsSector.barH_equivariant g _ n l] exact h.barH_mem_massWeightSubmodule l _ | F n l μ ν j => @@ -398,12 +398,12 @@ 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] + simp only [generatorVal, ← h.isHiggsSector_covH 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] + simp only [generatorVal, ← h.isHiggsSector_covBarH n l] rw [h.isHiggsSector.repLorentz_barH Λ n l _] exact Submodule.sum_mem _ fun p _ => Submodule.smul_mem _ _ (h.barH_mem_massWeightSubmodule p _) diff --git a/Physlib/Particles/StandardModel/CovAlgebraRealization/Sectors.lean b/Physlib/Particles/StandardModel/CovAlgebraRealization/Sectors.lean index ddeba9b88..da1c2154b 100644 --- a/Physlib/Particles/StandardModel/CovAlgebraRealization/Sectors.lean +++ b/Physlib/Particles/StandardModel/CovAlgebraRealization/Sectors.lean @@ -271,11 +271,11 @@ 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] + simp only [generatorVal, Generators.kind, ← h.isHiggsSector_covH n l] rw [h.isHiggsSector.H_equivariant g _ n l] exact h.H_mem_sector l _ | barH n l j => - simp only [generatorVal, Generators.kind] + simp only [generatorVal, Generators.kind, ← h.isHiggsSector_covBarH n l] rw [h.isHiggsSector.barH_equivariant g _ n l] exact h.barH_mem_sector l _ | F n l μ ν j => @@ -329,11 +329,11 @@ 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] + simp only [generatorVal, Generators.kind, ← h.isHiggsSector_covH n l] 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] + simp only [generatorVal, Generators.kind, ← h.isHiggsSector_covBarH n l] rw [h.isHiggsSector.repLorentz_barH Λ n l _] exact sum_mem fun p _ => SMulMemClass.smul_mem _ (h.barH_mem_sector p _) | F n l μ ν j => diff --git a/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/MassDimEight.lean b/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/MassDimEight.lean index 405a79924..993cda075 100644 --- a/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/MassDimEight.lean +++ b/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/MassDimEight.lean @@ -82,7 +82,7 @@ lemma higgsSubmodule_zero_le : h.isHiggsSector.higgsSubmodule 0 ≤ ⨆ i, ℂ ∙ h.isHiggsSector.higgs ![] i := by refine iSup_le fun l => ?_ rw [show l = (![] : Fin 0 → Fin 1 ⊕ Fin 3) from Subsingleton.elim _ _, - range_eq_iSup_span_dualBasis HiggsVec.orthonormBasis.toBasis (h.covH ![])] + range_eq_iSup_span_dualBasis HiggsVec.orthonormBasis.toBasis (h.isHiggsSector.covH 0 ![])] exact le_rfl /-- The conjugate Higgs submodule without derivatives lies in the span of the conjugate @@ -91,7 +91,8 @@ lemma barHiggsSubmodule_zero_le : h.isHiggsSector.barHiggsSubmodule 0 ≤ ⨆ i, ℂ ∙ h.isHiggsSector.barHiggs ![] i := by refine iSup_le fun l => ?_ rw [show l = (![] : Fin 0 → Fin 1 ⊕ Fin 3) from Subsingleton.elim _ _, - range_eq_iSup_span_dualBasis HiggsVec.orthonormBasis.toBasis.conj (h.covBarH ![])] + range_eq_iSup_span_dualBasis HiggsVec.orthonormBasis.toBasis.conj + (h.isHiggsSector.covBarH 0 ![])] exact le_rfl /-- The range of the down-singlet symbol map is the span of its components. -/ diff --git a/Physlib/Particles/StandardModel/IsHiggsSector/Basic.lean b/Physlib/Particles/StandardModel/IsHiggsSector/Basic.lean index b968f2d86..9c487e6ed 100644 --- a/Physlib/Particles/StandardModel/IsHiggsSector/Basic.lean +++ b/Physlib/Particles/StandardModel/IsHiggsSector/Basic.lean @@ -6,6 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.HiggsBoson.Basic +public import Physlib.Particles.StandardModel.JetAlgebra.CovJetAlgebra.Higgs public import Physlib.Relativity.IsLorentzDeriv public import Physlib.Relativity.LightConeDeriv public import Physlib.Relativity.SL2C.AxisRotations @@ -24,19 +25,24 @@ public import Mathlib.RepresentationTheory.Invariants /-! # 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 ℂ HiggsVec →ₗ[ℂ] B` -and -`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 `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`, -and `barHiggsSubModule` be the submodule of `B` generated by the images of `barH`. +An algebra `B` carries a Higgs sector when the covariant towers `∇_l H` and `∇_l H̄`, and +every polynomial expression in them, sit inside it compatibly with the global gauge action, +the Lorentz action and the mass-weight grading. `CovHiggsJetAlgebra` is the universal object +with those towers, so the statement is a single one: an algebra map +`CovHiggsJetAlgebra →ₐ[ℂ] B`, equivariant for the global gauge group and the Lorentz group +and compatible with `massWeightPoly`. That is the structure `IsHiggsSector`, together with +the two demands that the group actions be multiplicative on the whole of `B`. + +The two towers are then derived: `h.covH` and `h.covBarH` are the covariant jet algebra of +the Higgs field's own towers pushed along the map, and every law they satisfy — the gauge +equivariance `H_equivariant` and `barH_equivariant`, the commutation `H_comm_H`, +`H_comm_barH` and `barH_comm_barH`, the mass weights `H_massWeight` and `barH_massWeight`, +and the Lorentz laws `repLorentz_H` and `repLorentz_barH` — is that algebra's own law +pushed along it. They carry the names they carried when they were axioms, so they are used +exactly as before. + +We let `higgsSubmodule` be the submodule of `B` generated by the images of `covH`, +and `barHiggsSubmodule` be the submodule of `B` generated by the images of `covBarH`. The algebra `B` carries a grading due to hypercharge, through its representation of the global gauge group. This grading can be used to eliminate @@ -74,121 +80,194 @@ So we must have that `(u+v+w) TT = (u+v+w) M / 4`, and hence @[expose] public section +set_option maxHeartbeats 4000000 +set_option synthInstance.maxHeartbeats 1000000 +set_option synthInstance.maxSize 2048 +set_option maxRecDepth 8000 + namespace StandardModel open TensorProduct Matrix MatrixGroups Lorentz Lorentz.SL2C -/-- 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; - * 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. -/ +/-- The algebra `B`, with a gauge action, a Lorentz action and a mass-weight grading, + carries a Higgs sector when it receives an algebra map from the covariant jet algebra of + the Higgs field which is equivariant for both actions and compatible with the grading. + The covariant towers `∇_l H` and `∇_l H̄` then sit inside `B` as the images of that + algebra's own, and every law they satisfy there is its law pushed along the map. + + It is the Higgs-sector counterpart of `CovAlgebraRealization`, and stands to + `CovHiggsJetAlgebra` as that does to `CovJetAlgebra`. + + The last two fields are not consequences of the first three: an equivariant map forces + the two actions to be multiplicative only on its image, whereas the sector needs them + multiplicative on the whole of `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 - /-- 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) 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)) n l, - rep g (barH n l φ) = barH n l (HiggsVec.repGaugeGroupI.conj.dual g φ) - /-- 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. -/ - H_comm_barH : ∀ φ ψ n1 n2 l1 l2, Commute (H n1 l1 φ) (barH n2 l2 ψ) - /-- Two conjugate Higgs symbols commute. -/ - 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 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) + (massWeightPoly : B →ₐ[ℂ] Polynomial B) where + /-- The algebra map out of the covariant jet algebra of the Higgs field: it is what + places the Higgs towers, and every polynomial expression in them, inside `B`. -/ + toAlgHom : CovHiggsJetAlgebra →ₐ[ℂ] B + /-- The map is equivariant for the global gauge group. -/ + map_rep : ∀ (g : GaugeGroupI) (x : CovHiggsJetAlgebra), + toAlgHom (CovHiggsJetAlgebra.repGaugeGroupI g x) = rep g (toAlgHom x) + /-- The map is equivariant for the Lorentz group. -/ + map_repLorentz : ∀ (Λ : SL(2,ℂ)) (x : CovHiggsJetAlgebra), + toAlgHom (CovHiggsJetAlgebra.repLorentzGroup Λ x) = repLorentz Λ (toAlgHom x) + /-- The map carries the mass-weight grading of the covariant jet algebra of the Higgs + field to that of `B`. -/ + map_massWeight : ∀ x : CovHiggsJetAlgebra, massWeightPoly (toAlgHom x) + = Polynomial.mapAlgHom toAlgHom (CovHiggsJetAlgebra.massWeightPoly x) + /-- Gauge transformations act on `B` by algebra maps. -/ + 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. -/ + repLorentz_mul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂ set_option linter.unusedVariables false namespace IsHiggsSector 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) - -/-- 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 + (h : IsHiggsSector B rep repLorentz massWeightPoly) + +/-! + +## A. The Higgs towers and their laws + +The two towers the sector is written in are not data of the structure. They are the towers +of the covariant jet algebra of the Higgs field, carried into `B` along the defining +algebra map, and every law they satisfy is that algebra's law pushed along it. + +-/ + +/-- The covariant derivatives `∇_l H` of the Higgs field inside `B`. -/ +noncomputable def covH (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ HiggsVec →ₗ[ℂ] B := + h.toAlgHom.toLinearMap ∘ₗ CovHiggsJetAlgebra.higgsField l + +/-- The covariant derivatives `∇_l H̄` of the conjugate Higgs field inside `B`. -/ +noncomputable def covBarH (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (ConjModule HiggsVec) →ₗ[ℂ] B := + h.toAlgHom.toLinearMap ∘ₗ CovHiggsJetAlgebra.conjHiggsField l + +/-- A gauge law of the covariant jet algebra of the Higgs field transports along the + defining map. -/ +lemma map_rep_eq {g : GaugeGroupI} {x y : CovHiggsJetAlgebra} + (hxy : CovHiggsJetAlgebra.repGaugeGroupI g x = y) : + rep g (h.toAlgHom x) = h.toAlgHom y := by + rw [← h.map_rep, hxy] + +/-- A mass-weight eigenvalue equation transports along the defining map. -/ +lemma map_massWeight_monomial {n : ℕ} {x : CovHiggsJetAlgebra} + (hx : CovHiggsJetAlgebra.massWeightPoly x = Polynomial.monomial n x) : + massWeightPoly (h.toAlgHom x) = Polynomial.monomial n (h.toAlgHom x) := by + rw [h.map_massWeight, hx, Polynomial.mapAlgHom_monomial] + +/-- The Higgs symbol carries the dual of the gauge representation on `HiggsVec`: the + `SU(2)` index transforms contragrediently, and the hypercharge character by `u⁻³`. -/ +lemma H_equivariant (g : GaugeGroupI) (φ : Module.Dual ℂ HiggsVec) (n : ℕ) + (l : Fin n → (Fin 1 ⊕ Fin 3)) : + rep g (h.covH n l φ) = h.covH n l (HiggsVec.repGaugeGroupI.dual g φ) := + h.map_rep_eq (CovHiggsJetAlgebra.repGaugeGroupI_higgsField g l φ) + +/-- The conjugate Higgs symbol carries the conjugate-dual of the gauge representation: + the physicists' `H^† ↦ H^† g^†`. -/ +lemma barH_equivariant (g : GaugeGroupI) (φ : Module.Dual ℂ (ConjModule HiggsVec)) (n : ℕ) + (l : Fin n → (Fin 1 ⊕ Fin 3)) : + rep g (h.covBarH n l φ) = h.covBarH n l (HiggsVec.repGaugeGroupI.conj.dual g φ) := + h.map_rep_eq (CovHiggsJetAlgebra.repGaugeGroupI_conjHiggsField g l φ) + +/-- The Higgs is bosonic: two Higgs symbols commute. -/ +lemma H_comm_H (φ ψ : Module.Dual ℂ HiggsVec) (n1 n2 : ℕ) + (l1 : Fin n1 → (Fin 1 ⊕ Fin 3)) (l2 : Fin n2 → (Fin 1 ⊕ Fin 3)) : + Commute (h.covH n1 l1 φ) (h.covH n2 l2 ψ) := + (CovHiggsJetAlgebra.commute_higgsField_higgsField l1 l2 φ ψ).map h.toAlgHom + +/-- A Higgs symbol commutes with a conjugate Higgs symbol. -/ +lemma H_comm_barH (φ : Module.Dual ℂ HiggsVec) (ψ : Module.Dual ℂ (ConjModule HiggsVec)) + (n1 n2 : ℕ) (l1 : Fin n1 → (Fin 1 ⊕ Fin 3)) (l2 : Fin n2 → (Fin 1 ⊕ Fin 3)) : + Commute (h.covH n1 l1 φ) (h.covBarH n2 l2 ψ) := + (CovHiggsJetAlgebra.commute_higgsField_conjHiggsField l1 l2 φ ψ).map h.toAlgHom + +/-- Two conjugate Higgs symbols commute. -/ +lemma barH_comm_barH (φ ψ : Module.Dual ℂ (ConjModule HiggsVec)) (n1 n2 : ℕ) + (l1 : Fin n1 → (Fin 1 ⊕ Fin 3)) (l2 : Fin n2 → (Fin 1 ⊕ Fin 3)) : + Commute (h.covBarH n1 l1 φ) (h.covBarH n2 l2 ψ) := + (CovHiggsJetAlgebra.commute_conjHiggsField_conjHiggsField l1 l2 φ ψ).map h.toAlgHom + +/-- The mass weight of the Higgs tower is `2 * (1 + n)`. -/ +lemma H_massWeight (φ : Module.Dual ℂ HiggsVec) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : + massWeightPoly (h.covH n l φ) = Polynomial.monomial (2 * (1 + n)) (h.covH n l φ) := + h.map_massWeight_monomial (CovHiggsJetAlgebra.massWeightPoly_higgsField l φ) + +/-- The mass weight of the conjugate Higgs tower is `2 * (1 + n)`. -/ +lemma barH_massWeight (φ : Module.Dual ℂ (ConjModule HiggsVec)) (n : ℕ) + (l : Fin n → (Fin 1 ⊕ Fin 3)) : + massWeightPoly (h.covBarH n l φ) + = Polynomial.monomial (2 * (1 + n)) (h.covBarH n l φ) := + h.map_massWeight_monomial (CovHiggsJetAlgebra.massWeightPoly_conjHiggsField l φ) + +/-- A Lorentz law of the covariant jet algebra of the Higgs field transports along the + defining map. -/ +lemma map_lorentz {V : Type} [AddCommGroup V] [Module ℂ V] + {repV : Representation ℂ SL(2,ℂ) V} + {G : {n : ℕ} → (Fin n → (Fin 1 ⊕ Fin 3)) → Module.Dual ℂ V →ₗ[ℂ] CovHiggsJetAlgebra} + (hG : IsLorentzCovDerivTransforms CovHiggsJetAlgebra.repLorentzGroup repV G) : + IsLorentzCovDerivTransforms repLorentz repV + (fun {_n} l => h.toAlgHom.toLinearMap ∘ₗ G l) := by + intro Λ n l φ + show repLorentz Λ (h.toAlgHom (G l φ)) = _ + rw [← h.map_repLorentz, hG Λ n l φ, map_sum] + exact Finset.sum_congr rfl fun p _ => map_smul h.toAlgHom _ _ + +/-- 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. -/ +lemma repLorentz_H : IsLorentzCovDerivTransforms repLorentz + (Representation.trivial ℂ SL(2,ℂ) HiggsVec) (fun {n} => h.covH n) := + h.map_lorentz CovHiggsJetAlgebra.isLorentzCovDerivTransforms_higgsField + +/-- The conjugate Higgs tower transforms as the covariant derivatives of a Lorentz scalar, + through the conjugate of the trivial representation. -/ +lemma repLorentz_barH : IsLorentzCovDerivTransforms repLorentz + (Representation.trivial ℂ SL(2,ℂ) HiggsVec).conj (fun {n} => h.covBarH n) := + h.map_lorentz CovHiggsJetAlgebra.isLorentzCovDerivTransforms_conjHiggsField 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 + repLorentz g (h.covH n l φ) = ∑ (a : Fin n → Fin 1 ⊕ Fin 3), + (∏ (i : Fin n), (((SL2C.toLorentzGroup g).1 (a i) (l i) : ℝ) : ℂ)) • h.covH 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 + repLorentz g (h.covBarH n l φ) = ∑ (a : Fin n → Fin 1 ⊕ Fin 3), + (∏ (i : Fin n), (((SL2C.toLorentzGroup g).1 (a i) (l i) : ℝ) : ℂ)) • h.covBarH n a φ := by simpa only [Representation.conj_trivial_dual_apply] using h.repLorentz_barH g n l φ /-! -## A. The basic generators and the submodules generated by them. +## B. The basic generators and the submodules generated by them. -/ /-- The component `∇_d H^i` in the algebra. -/ -noncomputable def higgs (h : IsHiggsSector B rep hrep_mul repLorentz hrepLorentz_mul H barH - massWeightPoly) +noncomputable def higgs (h : IsHiggsSector B rep repLorentz massWeightPoly) {n : ℕ} (d : Fin n → (Fin 1 ⊕ Fin 3)) (i : Fin 2) :B := - H n d (HiggsVec.orthonormBasis.toBasis.dualBasis i) + h.covH n d (HiggsVec.orthonormBasis.toBasis.dualBasis i) /-- The component `∇_d barH^i` in the algebra. -/ -noncomputable def barHiggs (h : IsHiggsSector B rep hrep_mul repLorentz hrepLorentz_mul H barH - massWeightPoly) +noncomputable def barHiggs (h : IsHiggsSector B rep repLorentz massWeightPoly) {n : ℕ} (d : Fin n → (Fin 1 ⊕ Fin 3)) (i : Fin 2) : B := - barH n d (HiggsVec.orthonormBasis.toBasis.conj.dualBasis i) + h.covBarH n d (HiggsVec.orthonormBasis.toBasis.conj.dualBasis i) /-! @@ -236,15 +315,13 @@ 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 : 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) +noncomputable def higgsSubmodule (h : IsHiggsSector B rep repLorentz massWeightPoly) (n : ℕ) : + Submodule ℂ B := ⨆ d : Fin n → (Fin 1 ⊕ Fin 3), LinearMap.range (h.covH 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 : 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) +noncomputable def barHiggsSubmodule (h : IsHiggsSector B rep repLorentz massWeightPoly) + (n : ℕ) : Submodule ℂ B := ⨆ d : Fin n → (Fin 1 ⊕ Fin 3), LinearMap.range (h.covBarH n d) /-! @@ -257,8 +334,8 @@ 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 + h.higgsSubmodule n2 ≤ LinearMap.ker (LinearMap.mulLeft ℂ (h.covBarH n1 d1 φ) + - LinearMap.mulRight ℂ (h.covBarH n1 d1 φ)) := by intro d1 φ rw [higgsSubmodule] refine iSup_le fun d2 => ?_ @@ -292,8 +369,8 @@ 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 + h.higgsSubmodule n2 ≤ LinearMap.ker (LinearMap.mulLeft ℂ (h.covH n1 d1 φ) + - LinearMap.mulRight ℂ (h.covH n1 d1 φ)) := by intro d1 φ rw [higgsSubmodule] refine iSup_le fun d2 => ?_ @@ -327,8 +404,8 @@ 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 + h.barHiggsSubmodule n2 ≤ LinearMap.ker (LinearMap.mulLeft ℂ (h.covBarH n1 d1 φ) + - LinearMap.mulRight ℂ (h.covBarH n1 d1 φ)) := by intro d1 φ rw [barHiggsSubmodule] refine iSup_le fun d2 => ?_ @@ -563,7 +640,7 @@ noncomputable instance higgsSubmoduleGaugeWeight (n : ℕ) : 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 + LinearMap.range (h.covH 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 @@ -636,7 +713,7 @@ noncomputable instance barHiggsSubmoduleGaugeWeight (n : ℕ) : 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 + LinearMap.range (h.covBarH 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 @@ -676,8 +753,7 @@ open Lorentz.BoostWeight noncomputable def dot (x y : Fin 2 → B) : B := x 0 * y 0 + x 1 * y 1 -noncomputable def dotGaugeHiggs (h : IsHiggsSector B rep hrep_mul repLorentz hrepLorentz_mul H barH - massWeightPoly) +noncomputable def dotGaugeHiggs (h : IsHiggsSector B rep repLorentz 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 @@ -871,20 +947,19 @@ lemma trivialWeightDecomposition_piece (i : Fin 3) (k : ℤ) : /-! -## B. The higgs algebra +## C. The Higgs algebra -/ /-- The algebra generated by the Higgs, it's conjugate and all their derivatives. -/ -def higgsAlgebra (h : IsHiggsSector B rep hrep_mul repLorentz hrepLorentz_mul H barH - massWeightPoly) : +def higgsAlgebra (h : IsHiggsSector B rep repLorentz massWeightPoly) : Subalgebra ℂ B := (Algebra.adjoin ℂ (⋃ (k : ℕ) (d : Fin k → (Fin 1 ⊕ Fin 3)), - Set.range (H k d) ∪ Set.range (barH k d))) + Set.range (h.covH k d) ∪ Set.range (h.covBarH k d))) /-! -## B. Mass weight submodules +## D. Mass weight submodules -/ @@ -893,8 +968,7 @@ 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 : IsHiggsSector B rep hrep_mul repLorentz hrepLorentz_mul H barH - massWeightPoly) (n : ℕ) : + (h : IsHiggsSector B rep repLorentz massWeightPoly) (n : ℕ) : Submodule ℂ B := h.higgsAlgebra.toSubmodule ⊓ LinearMap.ker (massWeightPoly.toLinearMap @@ -904,9 +978,9 @@ noncomputable def massWeightSubmodule 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)), + Set.range (h.covH k d) ∪ Set.range (h.covBarH 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 + Set.range (h.covH k d) ∪ Set.range (h.covBarH 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 <;> @@ -991,7 +1065,7 @@ lemma massWeightSubmodule_map_rep_le (n : ℕ) (g : GaugeGroupI) : 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 + Set.range (h.covH k d) ∪ Set.range (h.covBarH 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 @@ -1441,7 +1515,7 @@ lemma massWeightSubmodule_eight_eq : /-! -## C. Gauge invariance +## E. Gauge invariance -/ diff --git a/Physlib/Particles/StandardModel/IsHiggsSector/DerivSubmodule/Basic.lean b/Physlib/Particles/StandardModel/IsHiggsSector/DerivSubmodule/Basic.lean index 7223157e6..50d82aaaf 100644 --- a/Physlib/Particles/StandardModel/IsHiggsSector/DerivSubmodule/Basic.lean +++ b/Physlib/Particles/StandardModel/IsHiggsSector/DerivSubmodule/Basic.lean @@ -31,28 +31,22 @@ 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) + (h : IsHiggsSector B rep repLorentz 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 := +noncomputable def derivSubmodule (h : IsHiggsSector B rep repLorentz 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 + ≤ LinearMap.ker (LinearMap.mulLeft ℂ (h.covH k d φ) + - LinearMap.mulRight ℂ (h.covH k d φ)) := by rw [derivSubmodule] refine sup_le ?_ ?_ · rw [higgsSubmodule] @@ -73,8 +67,8 @@ lemma derivSubmodule_le_ker_H {n k : ℕ} (d : Fin k → (Fin 1 ⊕ Fin 3)) 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 + ≤ LinearMap.ker (LinearMap.mulLeft ℂ (h.covBarH k d φ) + - LinearMap.mulRight ℂ (h.covBarH k d φ)) := by rw [derivSubmodule] refine sup_le ?_ ?_ · rw [higgsSubmodule] diff --git a/Physlib/Particles/StandardModel/IsHiggsSector/DerivSubmodule/BoostWeightDecomposition.lean b/Physlib/Particles/StandardModel/IsHiggsSector/DerivSubmodule/BoostWeightDecomposition.lean index 91b35d89a..a0d581b35 100644 --- a/Physlib/Particles/StandardModel/IsHiggsSector/DerivSubmodule/BoostWeightDecomposition.lean +++ b/Physlib/Particles/StandardModel/IsHiggsSector/DerivSubmodule/BoostWeightDecomposition.lean @@ -86,16 +86,9 @@ 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) + (h : IsHiggsSector B rep repLorentz massWeightPoly) /-! @@ -109,7 +102,7 @@ include h in 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) := + RotatesIndices (Representation.trivial ℂ SL(2,ℂ) HiggsVec).dual repLorentz (h.covH n) := fun g l φ => h.repLorentz_H g n l φ include h in @@ -117,7 +110,7 @@ include h in 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) := + RotatesIndices (Representation.trivial ℂ SL(2,ℂ) HiggsVec).conj.dual repLorentz (h.covBarH n) := fun g l φ => h.repLorentz_barH g n l φ /-! @@ -158,16 +151,16 @@ lemma mem_boostWeightSubmodule_barHiggsValue (i : Fin 3) /-- **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) +noncomputable def lightConeHiggs (h : IsHiggsSector B rep repLorentz massWeightPoly) + {n : ℕ} (i : Fin 3) (c : Fin n → Fin 4) (φ : Module.Dual ℂ HiggsVec) : B := - lightConeDeriv (H n) i c φ + lightConeDeriv (h.covH 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) +noncomputable def lightConeBarHiggs (h : IsHiggsSector B rep repLorentz massWeightPoly) + {n : ℕ} (i : Fin 3) (c : Fin n → Fin 4) (φ : Module.Dual ℂ (ConjModule HiggsVec)) : B := - lightConeDeriv (barH n) i c φ + lightConeDeriv (h.covBarH 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 @@ -178,7 +171,7 @@ lemma lightConeHiggs_mem {n : ℕ} (i : Fin 3) (c : Fin n → Fin 4) 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 + simpa using lightConeDeriv_mem (h.covH n) (h.rotatesIndices_H n) i c (mem_boostWeightSubmodule_higgsValue i φ) /-- **The light-cone conjugate-Higgs symbols have definite boost weight**, carried entirely @@ -188,13 +181,13 @@ lemma lightConeBarHiggs_mem {n : ℕ} (i : Fin 3) (c : Fin n → Fin 4) 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 + simpa using lightConeDeriv_mem (h.covBarH 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) + LinearMap.range (lightConeDeriv (h.covH n) i c) ≤ boostWeightSubmodule repLorentz i (∑ j, lightConeWeight (c j)) := by rintro _ ⟨φ, rfl⟩ exact h.lightConeHiggs_mem i c φ @@ -202,7 +195,7 @@ lemma range_lightConeDeriv_H_le {n : ℕ} (i : Fin 3) (c : Fin n → Fin 4) : 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) + LinearMap.range (lightConeDeriv (h.covBarH n) i c) ≤ boostWeightSubmodule repLorentz i (∑ j, lightConeWeight (c j)) := by rintro _ ⟨φ, rfl⟩ exact h.lightConeBarHiggs_mem i c φ @@ -216,28 +209,28 @@ lemma range_lightConeDeriv_barH_le {n : ℕ} (i : Fin 3) (c : Fin n → Fin 4) : /-- 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 + (⨆ d : Fin n → (Fin 1 ⊕ Fin 3), LinearMap.range (h.covH 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 + (⨆ d : Fin n → (Fin 1 ⊕ Fin 3), LinearMap.range (h.covBarH 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) : +noncomputable def higgsSubmoduleBoostWeight (h : IsHiggsSector B rep repLorentz massWeightPoly) + (n : ℕ) (i : Fin 3) : WeightDecomposition repLorentz i (h.higgsSubmodule n) := - (IsDerivativeCollection.boostDecomp (H n) (h.rotatesIndices_H n) i + (IsDerivativeCollection.boostDecomp (h.covH 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) : +noncomputable def barHiggsSubmoduleBoostWeight (h : IsHiggsSector B rep repLorentz massWeightPoly) + (n : ℕ) (i : Fin 3) : WeightDecomposition repLorentz i (h.barHiggsSubmodule n) := - (IsDerivativeCollection.boostDecomp (barH n) (h.rotatesIndices_barH n) i + (IsDerivativeCollection.boostDecomp (h.covBarH 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 @@ -245,10 +238,10 @@ noncomputable def barHiggsSubmoduleBoostWeight (h : IsHiggsSector B rep hrep_mul 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 + LinearMap.range (lightConeDeriv (h.covH n) i c) := by show (⨆ c : Fin n → Fin 4, ((higgsValueWeight i).piece (k - ∑ j, lightConeWeight (c j))).map - (lightConeDeriv (H n) i c)) = _ + (lightConeDeriv (h.covH 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, @@ -261,10 +254,10 @@ lemma higgsSubmoduleBoostWeight_piece (n : ℕ) (i : Fin 3) (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 + LinearMap.range (lightConeDeriv (h.covBarH n) i c) := by show (⨆ c : Fin n → Fin 4, ((barHiggsValueWeight i).piece (k - ∑ j, lightConeWeight (c j))).map - (lightConeDeriv (barH n) i c)) = _ + (lightConeDeriv (h.covBarH 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, @@ -281,8 +274,8 @@ lemma barHiggsSubmoduleBoostWeight_piece (n : ℕ) (i : Fin 3) (k : ℤ) : /-- **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) : +noncomputable def derivSubmoduleBoostWeight (h : IsHiggsSector B rep repLorentz massWeightPoly) + (n : ℕ) (i : Fin 3) : WeightDecomposition repLorentz i (h.derivSubmodule n) := ((h.higgsSubmoduleBoostWeight n i).sup (h.barHiggsSubmoduleBoostWeight n i)).copy (by rw [derivSubmodule]) @@ -292,9 +285,9 @@ noncomputable def derivSubmoduleBoostWeight (h : IsHiggsSector B rep hrep_mul re 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)) + LinearMap.range (lightConeDeriv (h.covH n) i c)) ⊔ ⨆ (c : Fin n → Fin 4) (_ : (∑ j, lightConeWeight (c j)) = k), - LinearMap.range (lightConeDeriv (barH n) i c) := by + LinearMap.range (lightConeDeriv (h.covBarH 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] diff --git a/Physlib/Particles/StandardModel/IsHiggsSector/DerivSubmodule/GaugeWeightDecomposition.lean b/Physlib/Particles/StandardModel/IsHiggsSector/DerivSubmodule/GaugeWeightDecomposition.lean index 9d1e0ecaa..799e4a553 100644 --- a/Physlib/Particles/StandardModel/IsHiggsSector/DerivSubmodule/GaugeWeightDecomposition.lean +++ b/Physlib/Particles/StandardModel/IsHiggsSector/DerivSubmodule/GaugeWeightDecomposition.lean @@ -28,16 +28,9 @@ 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) + (h : IsHiggsSector B rep repLorentz 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 diff --git a/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/Basic.lean b/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/Basic.lean index 0fe8e8dfd..b2f1ece82 100644 --- a/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/Basic.lean +++ b/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/Basic.lean @@ -31,15 +31,9 @@ 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) + (h : IsHiggsSector B rep repLorentz massWeightPoly) /-- The derivative submodule sits in the mass-weight submodule of weight `2 * (1 + n)`. -/ lemma derivSubmodule_le_massWeightSubmodule (n : ℕ) : diff --git a/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/GaugeWeightDecomposition.lean b/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/GaugeWeightDecomposition.lean index b21a41111..00949e0f2 100644 --- a/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/GaugeWeightDecomposition.lean +++ b/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/GaugeWeightDecomposition.lean @@ -66,16 +66,9 @@ 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) + (h : IsHiggsSector B rep repLorentz massWeightPoly) /-! @@ -257,15 +250,15 @@ 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 := +noncomputable def higgsBarHiggsSpan (h : IsHiggsSector B rep repLorentz 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 := +noncomputable def quarticSpan (h : IsHiggsSector B rep repLorentz 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 @@ -560,8 +553,8 @@ lemma barHiggs_mul_barHiggs_comm {n m : ℕ} (d : Fin n → (Fin 1 ⊕ Fin 3)) /-- The isospin family of a Higgs tower carrying `n` derivatives against a conjugate tower carrying `m`: the conjugate symbol supplies the fundamental index and so goes in the first slot, the Higgs symbol the anti-fundamental one. -/ -noncomputable def isoFamily (h : IsHiggsSector B rep hrep_mul repLorentz - hrepLorentz_mul H barH massWeightPoly) {n m : ℕ} (d : Fin n → (Fin 1 ⊕ Fin 3)) +noncomputable def isoFamily (h : IsHiggsSector B rep repLorentz massWeightPoly) + {n m : ℕ} (d : Fin n → (Fin 1 ⊕ Fin 3)) (d' : Fin m → (Fin 1 ⊕ Fin 3)) : (Fin 2 → Fin 2) → B := fun l => h.barHiggs d' (l 0) * h.higgs d (l 1) @@ -586,8 +579,8 @@ lemma deltaContraction_isoFamily {n m : ℕ} (d : Fin n → (Fin 1 ⊕ Fin 3)) /-- The span of the isospin contractions of a Higgs tower carrying `n` derivatives against a conjugate tower carrying `m`: the gauge invariants the isospin classification leaves at those two derivative orders. -/ -noncomputable def dotSpan (h : IsHiggsSector B rep hrep_mul repLorentz - hrepLorentz_mul H barH massWeightPoly) (n m : ℕ) : Submodule ℂ B := +noncomputable def dotSpan (h : IsHiggsSector B rep repLorentz massWeightPoly) + (n m : ℕ) : Submodule ℂ B := ⨆ (d : Fin n → (Fin 1 ⊕ Fin 3)) (d' : Fin m → (Fin 1 ⊕ Fin 3)), ℂ ∙ h.dotGaugeHiggs d d' include h in @@ -628,8 +621,7 @@ lemma higgsBarHiggsSpan_le_isoFamily_span (n m : ℕ) : /-- The re-index of an underived Higgs symbol by the antisymmetric symbol, `H̃⁰ = H¹` and `H̃¹ = -H⁰`. `SU(2)` is pseudo-real, so this turns the anti-fundamental index of a Higgs symbol into a fundamental one, which is what the quartic family needs. -/ -noncomputable def tildeHiggs (h : IsHiggsSector B rep hrep_mul repLorentz - hrepLorentz_mul H barH massWeightPoly) (i : Fin 2) : B := +noncomputable def tildeHiggs (h : IsHiggsSector B rep repLorentz massWeightPoly) (i : Fin 2) : B := ∑ m : Fin 2, IsSU2BiFundamental.epsilon i m • h.higgs (![] : Fin 0 → (Fin 1 ⊕ Fin 3)) m /-- The re-index at isospin zero is the Higgs symbol of isospin one. -/ @@ -663,8 +655,8 @@ lemma rep_su2_tildeHiggs (V : specialUnitaryGroup (Fin 2) ℂ) (i : Fin 2) : /-- The quartic isospin family: two conjugate Higgs symbols against two re-indexed Higgs symbols, each of the four carrying a fundamental isospin index. -/ -noncomputable def quadFamily (h : IsHiggsSector B rep hrep_mul repLorentz - hrepLorentz_mul H barH massWeightPoly) : (Fin 4 → Fin 2) → B := +noncomputable def quadFamily (h : IsHiggsSector B rep repLorentz massWeightPoly) : + (Fin 4 → Fin 2) → B := fun l => h.barHiggs (![] : Fin 0 → (Fin 1 ⊕ Fin 3)) (l 0) * (h.tildeHiggs (l 1) * (h.barHiggs (![] : Fin 0 → (Fin 1 ⊕ Fin 3)) (l 2) * h.tildeHiggs (l 3))) @@ -832,8 +824,8 @@ lemma exists_mem_of_invariant_biSup_isSU2FunAntiFun_span {ι : Type} [DecidableE /-- The span of the components of all the isospin families of a Higgs tower carrying `n` derivatives against a conjugate tower carrying `m`. This is the gauge-stable enlargement of the pairing span of section C. -/ -noncomputable def isoSpan (h : IsHiggsSector B rep hrep_mul repLorentz - hrepLorentz_mul H barH massWeightPoly) (n m : ℕ) : Submodule ℂ B := +noncomputable def isoSpan (h : IsHiggsSector B rep repLorentz massWeightPoly) + (n m : ℕ) : Submodule ℂ B := ⨆ (d : Fin n → (Fin 1 ⊕ Fin 3)) (d' : Fin m → (Fin 1 ⊕ Fin 3)), IsSU2BiFundamental.span (h.isoFamily d d') diff --git a/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/MassDimEight.lean b/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/MassDimEight.lean index 668c030e1..bcadc05e8 100644 --- a/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/MassDimEight.lean +++ b/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/MassDimEight.lean @@ -50,15 +50,9 @@ 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) + (h : IsHiggsSector B rep repLorentz massWeightPoly) /-! @@ -298,7 +292,7 @@ the kinetic term and the quartic potential. terms `□H† H` and `H† □H`, the kinetic term `∂^μ H† ∂_μ H`, and the quartic potential `(H† H)²`. -/ noncomputable def lorentzContractionEightSpan - (h : IsHiggsSector B rep hrep_mul repLorentz hrepLorentz_mul H barH massWeightPoly) : + (h : IsHiggsSector B rep repLorentz massWeightPoly) : Submodule ℂ B := ℂ ∙ IsBiLorentz.metricContraction (T := fun d : Fin 2 → Fin 1 ⊕ Fin 3 => h.dotGaugeHiggs d ![]) diff --git a/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/MassDimLTEight.lean b/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/MassDimLTEight.lean index ae2663697..00679e654 100644 --- a/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/MassDimLTEight.lean +++ b/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/MassDimLTEight.lean @@ -53,15 +53,9 @@ 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) + (h : IsHiggsSector B rep repLorentz massWeightPoly) /-! @@ -272,7 +266,7 @@ happen to be trivial. `0 < w < 8`: the line through the Higgs mass term at weight four, and nothing at any other weight. -/ noncomputable def lorentzContractionLTEightSpan - (h : IsHiggsSector B rep hrep_mul repLorentz hrepLorentz_mul H barH massWeightPoly) + (h : IsHiggsSector B rep repLorentz massWeightPoly) (w : ℕ) : Submodule ℂ B := if w = 4 then h.dotSpan 0 0 else ⊥ diff --git a/Physlib/Particles/StandardModel/CovJetAlgebra/Basic.lean b/Physlib/Particles/StandardModel/JetAlgebra/CovJetAlgebra/Basic.lean similarity index 93% rename from Physlib/Particles/StandardModel/CovJetAlgebra/Basic.lean rename to Physlib/Particles/StandardModel/JetAlgebra/CovJetAlgebra/Basic.lean index 8fa157892..1653d04e7 100644 --- a/Physlib/Particles/StandardModel/CovJetAlgebra/Basic.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/CovJetAlgebra/Basic.lean @@ -5,6 +5,7 @@ Authors: Joseph Tooby-Smith -/ module public import Physlib.Particles.StandardModel.AlgebraRealization.CovStandardModel +public import Physlib.Particles.StandardModel.JetAlgebra.Realization /-! # The covariant jet algebra @@ -54,6 +55,7 @@ That it is itself a covariant Standard Model is - C. The covariant subalgebra as an algebra in its own right - C.1. Corestricting a family of symbols - D. The covariant jet algebra +- E. Transporting a law to the covariant jet algebra -/ @@ -207,8 +209,8 @@ lemma covGenerators_induction {P : B → Prop} (hE : ∀ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ LeptonSinglet), P (h.covDerivE i l φ)) (hBarE : ∀ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule LeptonSinglet)), P (h.covDerivBarE i l φ)) - : ∀ x ∈ h.covGenerators, P x := by + (φ : Module.Dual ℂ (ConjModule LeptonSinglet)), P (h.covDerivBarE i l φ)) : + ∀ x ∈ h.covGenerators, P x := by rintro x hx rw [covGenerators] at hx rcases hx with hx | hx @@ -763,6 +765,54 @@ lemma coe_conjLeptonSingletField (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ (φ : Module.Dual ℂ (ConjModule LeptonSinglet)) : (conjLeptonSingletField i l φ : JetAlgebra) = AlgebraRealization.id.covDerivBarE i l φ := rfl +/-! + +## E. Transporting a law to the covariant jet algebra + +A law of the covariant jet algebra is an equation between elements of a subalgebra of the +jet algebra, so it is the jet algebra's own law under `Subtype.ext`. Three shapes need more +than that: the multiplicativity of the two actions, which is the ambient multiplicativity; +a mass-weight eigenvalue equation, whose target is the polynomials over the subalgebra; and +a Lorentz law, whose right-hand side is a sum of scalar multiples that the coercion has to +be pushed through. + +-/ + +/-- The global gauge action on the covariant jet algebra is multiplicative. -/ +lemma repGaugeGroupI_mul (g : GaugeGroupI) (x y : CovJetAlgebra) : + repGaugeGroupI g (x * y) = repGaugeGroupI g x * repGaugeGroupI g y := + Subtype.ext (AlgebraRealization.id.repGlobal_mul g (x : JetAlgebra) (y : JetAlgebra)) + +/-- The Lorentz action on the covariant jet algebra is multiplicative. -/ +lemma repLorentzGroup_mul (Λ : SL(2,ℂ)) (x y : CovJetAlgebra) : + repLorentzGroup Λ (x * y) = repLorentzGroup Λ x * repLorentzGroup Λ y := + Subtype.ext (JetAlgebra.repLorentzGroup_apply_mul Λ (x : JetAlgebra) (y : JetAlgebra)) + +/-- A mass-weight eigenvalue equation of the jet algebra, for an element of the covariant jet + algebra, is a mass-weight eigenvalue equation there. -/ +lemma massWeightPoly_eq_monomial {n : ℕ} {x : CovJetAlgebra} + (hx : JetAlgebra.massWeightPoly (x : JetAlgebra) + = Polynomial.monomial n (x : JetAlgebra)) : + massWeightPoly x = Polynomial.monomial n x := + (AlgebraRealization.id.covMassWeightPoly_eq_monomial_iff x).mpr hx + +/-- A Lorentz law of the jet algebra, for a family valued in the covariant jet algebra, is a + Lorentz law there: the coercion is additive and commutes with scalar multiplication. -/ +lemma isLorentzCovDerivTransforms_of {V : Type} [AddCommGroup V] [Module ℂ V] + {rep : Representation ℂ SL(2,ℂ) V} + {G : {n : ℕ} → (Fin n → (Fin 1 ⊕ Fin 3)) → Module.Dual ℂ V →ₗ[ℂ] CovJetAlgebra} + (hG : ∀ (Λ : SL(2,ℂ)) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V), + JetAlgebra.repLorentzGroup Λ ((G l φ : CovJetAlgebra) : JetAlgebra) = + ∑ p : Fin n → (Fin 1 ⊕ Fin 3), + (∏ i, (((SL2C.toLorentzGroup Λ).1 (p i) (l i) : ℝ) : ℂ)) • + ((G p (rep.dual Λ φ) : CovJetAlgebra) : JetAlgebra)) : + IsLorentzCovDerivTransforms repLorentzGroup rep G := fun Λ n l φ => + Subtype.ext <| by + simp only [AlgebraRealization.coe_covRepLorentz, AddSubmonoidClass.coe_finsetSum, + SetLike.val_smul] + exact hG Λ n l φ + + end CovJetAlgebra end StandardModel diff --git a/Physlib/Particles/StandardModel/JetAlgebra/CovJetAlgebra/Higgs.lean b/Physlib/Particles/StandardModel/JetAlgebra/CovJetAlgebra/Higgs.lean new file mode 100644 index 000000000..1c28932ed --- /dev/null +++ b/Physlib/Particles/StandardModel/JetAlgebra/CovJetAlgebra/Higgs.lean @@ -0,0 +1,399 @@ +/- +Copyright (c) 2026 Joseph Tooby-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.SubalgebraRestriction +public import Physlib.Particles.StandardModel.JetAlgebra.CovJetAlgebra.Basic +/-! +# The covariant jet algebra of the Higgs field + +## i. Overview + +The Higgs sector of the Standard Model is written in the covariant towers `∇_l H` and +`∇_l H̄` alone. Inside `CovJetAlgebra` those towers generate a subalgebra, and this file +gives it: `CovHiggsJetAlgebra`, the covariant jet algebra of the Higgs field. + +Everything the sector needs is inherited. The global gauge action carries a Higgs tower to +a Higgs tower at a rotated value index, the Lorentz action carries one to a slot-mixing sum +of Higgs towers, and the mass-weight polynomial makes each an eigenvector whose eigenvector +is the tower itself. Each of the three therefore preserves the subalgebra, and restricting +them gives it a gauge action, a Lorentz action and a mass-weight grading of its own, +together with the two towers. + +`CovHiggsJetAlgebra` is to the Higgs sector what `CovJetAlgebra` is to the Standard Model: +the object every Higgs sector receives its fields from, which is the content of +`IsHiggsSector`. + +## ii. Key results + +- `StandardModel.CovHiggsJetAlgebra` : the covariant jet algebra of the Higgs field. +- `StandardModel.CovHiggsJetAlgebra.repGaugeGroupI`, + `StandardModel.CovHiggsJetAlgebra.repLorentzGroup`, + `StandardModel.CovHiggsJetAlgebra.massWeightPoly` : its gauge action, Lorentz action and + mass-weight polynomial. +- `StandardModel.CovHiggsJetAlgebra.higgsField`, + `StandardModel.CovHiggsJetAlgebra.conjHiggsField` : its two covariant towers. + +## iii. Table of contents + +- A. The Higgs subalgebra of the covariant jet algebra +- B. The subalgebra is closed under the actions + - B.1. The mass-weight polynomial +- C. The covariant jet algebra of the Higgs field +- D. The laws of the Higgs towers + +-/ + +@[expose] public section + +set_option maxHeartbeats 4000000 +set_option synthInstance.maxHeartbeats 1000000 +set_option synthInstance.maxSize 2048 +set_option maxRecDepth 8000 + +namespace StandardModel + +open TensorProduct Matrix MatrixGroups Lorentz + +namespace CovJetAlgebra + +/-! + +## A. The Higgs subalgebra of the covariant jet algebra + +-/ + +/-- The covariant towers of the Higgs field and of its conjugate, as a subset of the + covariant jet algebra. -/ +noncomputable def higgsGenerators : Set CovJetAlgebra := + ⋃ (n : ℕ) (l : Fin n → Fin 1 ⊕ Fin 3), + Set.range (higgsField l) ∪ Set.range (conjHiggsField l) + +/-- The subalgebra of the covariant jet algebra generated by the Higgs towers. -/ +noncomputable def higgsSubalgebra : Subalgebra ℂ CovJetAlgebra := Algebra.adjoin ℂ higgsGenerators + +/-- The Higgs tower lies in the Higgs subalgebra. -/ +lemma higgsField_mem_higgsSubalgebra {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ HiggsVec) : higgsField l φ ∈ higgsSubalgebra := + Algebra.subset_adjoin <| Set.mem_iUnion_of_mem n <| Set.mem_iUnion_of_mem l <| + Or.inl ⟨φ, rfl⟩ + +/-- The conjugate Higgs tower lies in the Higgs subalgebra. -/ +lemma conjHiggsField_mem_higgsSubalgebra {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule HiggsVec)) : conjHiggsField l φ ∈ higgsSubalgebra := + Algebra.subset_adjoin <| Set.mem_iUnion_of_mem n <| Set.mem_iUnion_of_mem l <| + Or.inr ⟨φ, rfl⟩ + +/-- A property that holds of both Higgs towers holds of every Higgs generator. -/ +lemma higgsGenerators_induction {P : CovJetAlgebra → Prop} + (hH : ∀ {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ HiggsVec), + P (higgsField l φ)) + (hBarH : ∀ {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule HiggsVec)), P (conjHiggsField l φ)) : + ∀ x ∈ higgsGenerators, P x := by + rintro x hx + rw [higgsGenerators] at hx + simp only [Set.mem_iUnion] at hx + obtain ⟨n, l, hx⟩ := hx + rcases hx with ⟨φ, rfl⟩ | ⟨φ, rfl⟩ + · exact hH l φ + · exact hBarH l φ + +/-! + +## B. The subalgebra is closed under the actions + +-/ + +/-- A unital multiplicative endomorphism carrying the Higgs towers into the Higgs + subalgebra carries the whole subalgebra into itself. -/ +lemma mapsTo_higgsSubalgebra {f : CovJetAlgebra →ₗ[ℂ] CovJetAlgebra} (hone : f 1 = 1) + (hmul : ∀ b₁ b₂ : CovJetAlgebra, f (b₁ * b₂) = f b₁ * f b₂) + (hgen : ∀ x ∈ higgsGenerators, f x ∈ higgsSubalgebra) + {x : CovJetAlgebra} (hx : x ∈ higgsSubalgebra) : f x ∈ higgsSubalgebra := by + induction hx using Algebra.adjoin_induction with + | mem b hb => exact hgen b hb + | algebraMap c => + rw [Algebra.algebraMap_eq_smul_one, map_smul, hone] + exact Subalgebra.smul_mem _ (one_mem _) c + | add a b _ _ iha ihb => rw [map_add]; exact add_mem iha ihb + | mul a b _ _ iha ihb => rw [hmul]; exact mul_mem iha ihb + +/-- A Lorentz slot-mixing sum of Higgs towers lies in the Higgs subalgebra. -/ +lemma sum_smul_mem_higgsSubalgebra {n : ℕ} {c : (Fin n → (Fin 1 ⊕ Fin 3)) → ℂ} + {G : (Fin n → (Fin 1 ⊕ Fin 3)) → CovJetAlgebra} (hG : ∀ p, G p ∈ higgsSubalgebra) : + ∑ p : Fin n → (Fin 1 ⊕ Fin 3), c p • G p ∈ higgsSubalgebra := + Subalgebra.sum_mem _ fun p _ => Subalgebra.smul_mem _ (hG p) _ + +/-- The global gauge action preserves the Higgs subalgebra. -/ +lemma repGaugeGroupI_mem_higgsSubalgebra (g : GaugeGroupI) {x : CovJetAlgebra} + (hx : x ∈ higgsSubalgebra) : repGaugeGroupI g x ∈ higgsSubalgebra := by + refine mapsTo_higgsSubalgebra ?_ (repGaugeGroupI_mul g) ?_ hx + · exact Subtype.ext (AlgebraRealization.id.repGlobal_one g) + · refine higgsGenerators_induction (fun l φ => ?_) (fun l φ => ?_) + · rw [show repGaugeGroupI g (higgsField l φ) = higgsField l _ from + Subtype.ext (AlgebraRealization.id.repGlobal_covDerivH g l φ)] + exact higgsField_mem_higgsSubalgebra _ _ + · rw [show repGaugeGroupI g (conjHiggsField l φ) = conjHiggsField l _ from + Subtype.ext (AlgebraRealization.id.repGlobal_covDerivBarH g l φ)] + exact conjHiggsField_mem_higgsSubalgebra _ _ + +/-- The Lorentz action preserves the Higgs subalgebra. -/ +lemma repLorentzGroup_mem_higgsSubalgebra (Λ : SL(2,ℂ)) {x : CovJetAlgebra} + (hx : x ∈ higgsSubalgebra) : repLorentzGroup Λ x ∈ higgsSubalgebra := by + refine mapsTo_higgsSubalgebra ?_ (repLorentzGroup_mul Λ) ?_ hx + · exact Subtype.ext (AlgebraRealization.id.repLorentz_one Λ) + · refine higgsGenerators_induction (fun l φ => ?_) (fun l φ => ?_) + · rw [isLorentzCovDerivTransforms_of + (fun Λ n l φ => AlgebraRealization.id.repLorentz_covDerivH Λ n l φ) Λ _ l φ] + exact sum_smul_mem_higgsSubalgebra fun p => higgsField_mem_higgsSubalgebra _ _ + · rw [isLorentzCovDerivTransforms_of + (fun Λ n l φ => AlgebraRealization.id.repLorentz_covDerivBarH Λ n l φ) Λ _ l φ] + exact sum_smul_mem_higgsSubalgebra fun p => conjHiggsField_mem_higgsSubalgebra _ _ + +/-! + +### B.1. The mass-weight polynomial + +-/ + +/-- The mass-weight polynomial carries the Higgs subalgebra into the polynomials with + coefficients in it: each Higgs tower is an eigenvector whose eigenvector is the tower + itself, and the mass-weight polynomial is an algebra map. -/ +lemma massWeightPoly_mem_polyRange (x : higgsSubalgebra) : + massWeightPoly (x : CovJetAlgebra) ∈ higgsSubalgebra.polyRange := + higgsSubalgebra.mem_range_mapAlgHom_of_adjoin + (higgsGenerators_induction + (fun l φ => by + rw [massWeightPoly_eq_monomial (AlgebraRealization.id.massWeight_covDerivH l φ)] + exact Subalgebra.monomial_mem_polyRange (higgsField_mem_higgsSubalgebra l φ)) + (fun l φ => by + rw [massWeightPoly_eq_monomial (AlgebraRealization.id.massWeight_covDerivBarH l φ)] + exact Subalgebra.monomial_mem_polyRange (conjHiggsField_mem_higgsSubalgebra l φ))) + x.2 + +/-! + +## C. The covariant jet algebra of the Higgs field + +-/ + +end CovJetAlgebra + +/-- The covariant jet algebra of the Higgs field: the subalgebra of the covariant jet + algebra of the Standard Model generated by the covariant towers of the Higgs field and of + its conjugate. Its elements are exactly the polynomial expressions in `∇_l H` and + `∇_l H̄`. -/ +abbrev CovHiggsJetAlgebra : Type := ↥CovJetAlgebra.higgsSubalgebra + +/-- The covariant jet algebra of the Higgs field is a ring. The instance is given + explicitly because the generic `Subalgebra.toRing` is not found by instance search at this + concrete algebra. -/ +noncomputable instance : Ring CovHiggsJetAlgebra := + @Subalgebra.toRing ℂ CovJetAlgebra _ _ _ CovJetAlgebra.higgsSubalgebra + +/-- The covariant jet algebra of the Higgs field is a complex algebra, stated at the ring + instance just given. -/ +noncomputable instance : Algebra ℂ CovHiggsJetAlgebra := + @Subalgebra.algebra ℂ CovJetAlgebra _ _ _ CovJetAlgebra.higgsSubalgebra + +namespace CovHiggsJetAlgebra + +open CovJetAlgebra + +/-- The action of the global gauge group on the covariant jet algebra of the Higgs + field. -/ +noncomputable def repGaugeGroupI : Representation ℂ GaugeGroupI CovHiggsJetAlgebra where + toFun g := + { toFun := fun x => ⟨CovJetAlgebra.repGaugeGroupI g (x : CovJetAlgebra), + repGaugeGroupI_mem_higgsSubalgebra g x.2⟩ + map_add' := fun x y => Subtype.ext (map_add _ _ _) + map_smul' := fun c x => Subtype.ext (map_smul _ _ _) } + map_one' := by + refine LinearMap.ext fun x => Subtype.ext ?_ + show CovJetAlgebra.repGaugeGroupI 1 (x : CovJetAlgebra) = (x : CovJetAlgebra) + rw [map_one] + rfl + map_mul' g₁ g₂ := by + refine LinearMap.ext fun x => Subtype.ext ?_ + show CovJetAlgebra.repGaugeGroupI (g₁ * g₂) (x : CovJetAlgebra) + = CovJetAlgebra.repGaugeGroupI g₁ (CovJetAlgebra.repGaugeGroupI g₂ (x : CovJetAlgebra)) + rw [map_mul] + rfl + +@[simp] +lemma coe_repGaugeGroupI (g : GaugeGroupI) (x : CovHiggsJetAlgebra) : + (repGaugeGroupI g x : CovJetAlgebra) = CovJetAlgebra.repGaugeGroupI g (x : CovJetAlgebra) := + rfl + +/-- The action of the Lorentz group on the covariant jet algebra of the Higgs field. -/ +noncomputable def repLorentzGroup : Representation ℂ SL(2,ℂ) CovHiggsJetAlgebra where + toFun Λ := + { toFun := fun x => ⟨CovJetAlgebra.repLorentzGroup Λ (x : CovJetAlgebra), + repLorentzGroup_mem_higgsSubalgebra Λ x.2⟩ + map_add' := fun x y => Subtype.ext (map_add _ _ _) + map_smul' := fun c x => Subtype.ext (map_smul _ _ _) } + map_one' := by + refine LinearMap.ext fun x => Subtype.ext ?_ + show CovJetAlgebra.repLorentzGroup 1 (x : CovJetAlgebra) = (x : CovJetAlgebra) + rw [map_one] + rfl + map_mul' Λ₁ Λ₂ := by + refine LinearMap.ext fun x => Subtype.ext ?_ + show CovJetAlgebra.repLorentzGroup (Λ₁ * Λ₂) (x : CovJetAlgebra) + = CovJetAlgebra.repLorentzGroup Λ₁ (CovJetAlgebra.repLorentzGroup Λ₂ (x : CovJetAlgebra)) + rw [map_mul] + rfl + +@[simp] +lemma coe_repLorentzGroup (Λ : SL(2,ℂ)) (x : CovHiggsJetAlgebra) : + (repLorentzGroup Λ x : CovJetAlgebra) + = CovJetAlgebra.repLorentzGroup Λ (x : CovJetAlgebra) := rfl + +/-- The mass-weight polynomial of the covariant jet algebra of the Higgs field. -/ +noncomputable def massWeightPoly : + CovHiggsJetAlgebra →ₐ[ℂ] Polynomial CovHiggsJetAlgebra := + CovJetAlgebra.higgsSubalgebra.polyRestrict CovJetAlgebra.massWeightPoly + CovJetAlgebra.massWeightPoly_mem_polyRange + +/-- A mass-weight eigenvalue equation in the covariant jet algebra of the Higgs field is + the covariant jet algebra's own. -/ +lemma massWeightPoly_eq_monomial {n : ℕ} {x : CovHiggsJetAlgebra} + (hx : CovJetAlgebra.massWeightPoly (x : CovJetAlgebra) + = Polynomial.monomial n (x : CovJetAlgebra)) : + massWeightPoly x = Polynomial.monomial n x := + (Subalgebra.polyRestrict_eq_monomial_iff _ x).mpr hx + +/-- In the covariant jet algebra of the Higgs field, the tower of covariant derivatives of + the Higgs field. -/ +noncomputable def higgsField {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ HiggsVec →ₗ[ℂ] CovHiggsJetAlgebra where + toFun φ := ⟨CovJetAlgebra.higgsField l φ, higgsField_mem_higgsSubalgebra l φ⟩ + map_add' φ ψ := Subtype.ext (map_add _ φ ψ) + map_smul' c φ := Subtype.ext (map_smul _ c φ) + +@[simp] +lemma coe_higgsField {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ HiggsVec) : + (higgsField l φ : CovJetAlgebra) = CovJetAlgebra.higgsField l φ := rfl + +/-- In the covariant jet algebra of the Higgs field, the tower of covariant derivatives of + the conjugate Higgs field. -/ +noncomputable def conjHiggsField {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (ConjModule HiggsVec) →ₗ[ℂ] CovHiggsJetAlgebra where + toFun φ := ⟨CovJetAlgebra.conjHiggsField l φ, conjHiggsField_mem_higgsSubalgebra l φ⟩ + map_add' φ ψ := Subtype.ext (map_add _ φ ψ) + map_smul' c φ := Subtype.ext (map_smul _ c φ) + +@[simp] +lemma coe_conjHiggsField {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule HiggsVec)) : + (conjHiggsField l φ : CovJetAlgebra) = CovJetAlgebra.conjHiggsField l φ := rfl + +/-! + +## D. The laws of the Higgs towers + +The nine laws the Higgs sector is written in, at the covariant jet algebra of the Higgs +field: the gauge equivariance of the two towers, their commutation, their mass weights and +their Lorentz transformation. Each is the covariant jet algebra's own law, which is in turn +the jet algebra's own, read on the subalgebra. + +-/ + +/-- The global gauge action on the covariant jet algebra of the Higgs field is + multiplicative. -/ +lemma repGaugeGroupI_mul (g : GaugeGroupI) (x y : CovHiggsJetAlgebra) : + repGaugeGroupI g (x * y) = repGaugeGroupI g x * repGaugeGroupI g y := + Subtype.ext (CovJetAlgebra.repGaugeGroupI_mul g (x : CovJetAlgebra) (y : CovJetAlgebra)) + +/-- The Lorentz action on the covariant jet algebra of the Higgs field is + multiplicative. -/ +lemma repLorentzGroup_mul (Λ : SL(2,ℂ)) (x y : CovHiggsJetAlgebra) : + repLorentzGroup Λ (x * y) = repLorentzGroup Λ x * repLorentzGroup Λ y := + Subtype.ext (CovJetAlgebra.repLorentzGroup_mul Λ (x : CovJetAlgebra) (y : CovJetAlgebra)) + +/-- A Lorentz law of the covariant jet algebra, for a family valued in the covariant jet + algebra of the Higgs field, is a Lorentz law there. -/ +lemma isLorentzCovDerivTransforms_of {V : Type} [AddCommGroup V] [Module ℂ V] + {rep : Representation ℂ SL(2,ℂ) V} + {G : {n : ℕ} → (Fin n → (Fin 1 ⊕ Fin 3)) → Module.Dual ℂ V →ₗ[ℂ] CovHiggsJetAlgebra} + (hG : ∀ (Λ : SL(2,ℂ)) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V), + CovJetAlgebra.repLorentzGroup Λ ((G l φ : CovHiggsJetAlgebra) : CovJetAlgebra) = + ∑ p : Fin n → (Fin 1 ⊕ Fin 3), + (∏ i, (((SL2C.toLorentzGroup Λ).1 (p i) (l i) : ℝ) : ℂ)) • + ((G p (rep.dual Λ φ) : CovHiggsJetAlgebra) : CovJetAlgebra)) : + IsLorentzCovDerivTransforms repLorentzGroup rep G := fun Λ n l φ => + Subtype.ext <| by + simp only [coe_repLorentzGroup, AddSubmonoidClass.coe_finsetSum, SetLike.val_smul] + exact hG Λ n l φ + +/-- The Higgs tower is equivariant for the global gauge group. -/ +lemma repGaugeGroupI_higgsField (g : GaugeGroupI) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ HiggsVec) : + repGaugeGroupI g (higgsField l φ) = higgsField l (HiggsVec.repGaugeGroupI.dual g φ) := + Subtype.ext (Subtype.ext (AlgebraRealization.id.repGlobal_covDerivH g l φ)) + +/-- The conjugate Higgs tower is equivariant for the global gauge group. -/ +lemma repGaugeGroupI_conjHiggsField (g : GaugeGroupI) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule HiggsVec)) : + repGaugeGroupI g (conjHiggsField l φ) + = conjHiggsField l (HiggsVec.repGaugeGroupI.conj.dual g φ) := + Subtype.ext (Subtype.ext (AlgebraRealization.id.repGlobal_covDerivBarH g l φ)) + +/-- Two Higgs towers commute. -/ +lemma commute_higgsField_higgsField {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ ψ : Module.Dual ℂ HiggsVec) : + Commute (higgsField l φ) (higgsField l' ψ) := + Subtype.ext (Subtype.ext (AlgebraRealization.id.covH_comm_covH l l' φ ψ)) + +/-- A Higgs tower commutes with a conjugate Higgs tower. -/ +lemma commute_higgsField_conjHiggsField {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ HiggsVec) + (ψ : Module.Dual ℂ (ConjModule HiggsVec)) : + Commute (higgsField l φ) (conjHiggsField l' ψ) := + Subtype.ext (Subtype.ext (AlgebraRealization.id.covH_comm_covBarH l l' φ ψ)) + +/-- Two conjugate Higgs towers commute. -/ +lemma commute_conjHiggsField_conjHiggsField {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ ψ : Module.Dual ℂ (ConjModule HiggsVec)) : + Commute (conjHiggsField l φ) (conjHiggsField l' ψ) := + Subtype.ext (Subtype.ext (AlgebraRealization.id.covBarH_comm_covBarH l l' φ ψ)) + +/-- The mass weight of the Higgs tower is `2 * (1 + n)`. -/ +lemma massWeightPoly_higgsField {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ HiggsVec) : + massWeightPoly (higgsField l φ) + = Polynomial.monomial (2 * (1 + n)) (higgsField l φ) := + massWeightPoly_eq_monomial + (CovJetAlgebra.massWeightPoly_eq_monomial (AlgebraRealization.id.massWeight_covDerivH l φ)) + +/-- The mass weight of the conjugate Higgs tower is `2 * (1 + n)`. -/ +lemma massWeightPoly_conjHiggsField {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule HiggsVec)) : + massWeightPoly (conjHiggsField l φ) + = Polynomial.monomial (2 * (1 + n)) (conjHiggsField l φ) := + massWeightPoly_eq_monomial (CovJetAlgebra.massWeightPoly_eq_monomial + (AlgebraRealization.id.massWeight_covDerivBarH l φ)) + +/-- The Higgs tower transforms as the covariant derivatives of a Lorentz scalar. -/ +lemma isLorentzCovDerivTransforms_higgsField : + IsLorentzCovDerivTransforms repLorentzGroup + (Representation.trivial ℂ SL(2,ℂ) HiggsVec) (fun {_n} l => higgsField l) := + isLorentzCovDerivTransforms_of fun Λ n l φ => + CovJetAlgebra.isLorentzCovDerivTransforms_of + (fun Λ n l φ => AlgebraRealization.id.repLorentz_covDerivH Λ n l φ) Λ n l φ + +/-- The conjugate Higgs tower transforms as the covariant derivatives of a Lorentz + scalar. -/ +lemma isLorentzCovDerivTransforms_conjHiggsField : + IsLorentzCovDerivTransforms repLorentzGroup + (Representation.trivial ℂ SL(2,ℂ) HiggsVec).conj (fun {_n} l => conjHiggsField l) := + isLorentzCovDerivTransforms_of fun Λ n l φ => + CovJetAlgebra.isLorentzCovDerivTransforms_of + (fun Λ n l φ => AlgebraRealization.id.repLorentz_covDerivBarH Λ n l φ) Λ n l φ + +end CovHiggsJetAlgebra + +end StandardModel diff --git a/Physlib/Particles/StandardModel/CovJetAlgebra/Sectors.lean b/Physlib/Particles/StandardModel/JetAlgebra/CovJetAlgebra/Sectors.lean similarity index 86% rename from Physlib/Particles/StandardModel/CovJetAlgebra/Sectors.lean rename to Physlib/Particles/StandardModel/JetAlgebra/CovJetAlgebra/Sectors.lean index 0e07eb0af..94ad519c8 100644 --- a/Physlib/Particles/StandardModel/CovJetAlgebra/Sectors.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/CovJetAlgebra/Sectors.lean @@ -4,8 +4,9 @@ Released under Apache 2.0 license as described in the file LICENSE. Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.CovJetAlgebra.Basic +public import Physlib.Particles.StandardModel.JetAlgebra.CovJetAlgebra.Basic public import Physlib.Particles.StandardModel.IsHiggsSector.Basic +public import Physlib.Particles.StandardModel.JetAlgebra.CovJetAlgebra.Higgs public import Physlib.Particles.StandardModel.IsGaugeSector.MassWeight.Basic public import Physlib.Particles.StandardModel.IsFermionSector.MassWeight.Basic /-! @@ -21,8 +22,8 @@ commutation law of the covariant form of the Standard Model holds there. Nothing new is proved. Each law is the corresponding law of `AlgebraRealization.id` — the jet algebra's own — read on the subalgebra, where equality is equality of underlying jet -algebra elements. The three shapes a law takes each get a small transport lemma in section -A, and section B assembles the structure. +algebra elements. The transport lemmas the three shapes need are section E of +[`Basic.lean`](Basic.lean); this file assembles them. `CovJetAlgebra` is to the covariant theory what `JetAlgebra` is to the theory in the bare symbols: the object every other covariant Standard Model receives its fields from. That is @@ -38,8 +39,7 @@ the content of `CovAlgebraRealization`. ## iii. Table of contents -- A. Transporting a law to the covariant jet algebra -- B. The three sectors and the cross-sector commutation rules +- A. The three sectors and the cross-sector commutation rules -/ @@ -58,77 +58,23 @@ namespace CovJetAlgebra /-! -## A. Transporting a law to the covariant jet algebra - -A law of the covariant jet algebra is an equation between elements of a subalgebra of the -jet algebra, so it is the jet algebra's own law under `Subtype.ext`. Three shapes need more -than that: the multiplicativity of the two actions, which is the ambient multiplicativity; -a mass-weight eigenvalue equation, whose target is the polynomials over the subalgebra; and -a Lorentz law, whose right-hand side is a sum of scalar multiples that the coercion has to -be pushed through. - --/ - -/-- The global gauge action on the covariant jet algebra is multiplicative. -/ -lemma repGaugeGroupI_mul (g : GaugeGroupI) (x y : CovJetAlgebra) : - repGaugeGroupI g (x * y) = repGaugeGroupI g x * repGaugeGroupI g y := - Subtype.ext (AlgebraRealization.id.repGlobal_mul g (x : JetAlgebra) (y : JetAlgebra)) - -/-- The Lorentz action on the covariant jet algebra is multiplicative. -/ -lemma repLorentzGroup_mul (Λ : SL(2,ℂ)) (x y : CovJetAlgebra) : - repLorentzGroup Λ (x * y) = repLorentzGroup Λ x * repLorentzGroup Λ y := - Subtype.ext (JetAlgebra.repLorentzGroup_apply_mul Λ (x : JetAlgebra) (y : JetAlgebra)) - -/-- A mass-weight eigenvalue equation of the jet algebra, for an element of the covariant jet - algebra, is a mass-weight eigenvalue equation there. -/ -lemma massWeightPoly_eq_monomial {n : ℕ} {x : CovJetAlgebra} - (hx : JetAlgebra.massWeightPoly (x : JetAlgebra) - = Polynomial.monomial n (x : JetAlgebra)) : - massWeightPoly x = Polynomial.monomial n x := - (AlgebraRealization.id.covMassWeightPoly_eq_monomial_iff x).mpr hx - -/-- A Lorentz law of the jet algebra, for a family valued in the covariant jet algebra, is a - Lorentz law there: the coercion is additive and commutes with scalar multiplication. -/ -lemma isLorentzCovDerivTransforms_of {V : Type} [AddCommGroup V] [Module ℂ V] - {rep : Representation ℂ SL(2,ℂ) V} - {G : {n : ℕ} → (Fin n → (Fin 1 ⊕ Fin 3)) → Module.Dual ℂ V →ₗ[ℂ] CovJetAlgebra} - (hG : ∀ (Λ : SL(2,ℂ)) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V), - JetAlgebra.repLorentzGroup Λ ((G l φ : CovJetAlgebra) : JetAlgebra) = - ∑ p : Fin n → (Fin 1 ⊕ Fin 3), - (∏ i, (((SL2C.toLorentzGroup Λ).1 (p i) (l i) : ℝ) : ℂ)) • - ((G p (rep.dual Λ φ) : CovJetAlgebra) : JetAlgebra)) : - IsLorentzCovDerivTransforms repLorentzGroup rep G := fun Λ n l φ => - Subtype.ext <| by - simp only [AlgebraRealization.coe_covRepLorentz, AddSubmonoidClass.coe_finsetSum, SetLike.val_smul] - exact hG Λ n l φ - -/-! - -## B. The three sectors and the cross-sector commutation rules +## A. The three sectors and the cross-sector commutation rules -/ -/-- The Higgs sector of the covariant jet algebra. -/ -theorem isHiggsSector : IsHiggsSector CovJetAlgebra repGaugeGroupI repGaugeGroupI_mul - repLorentzGroup repLorentzGroup_mul (fun _n l => higgsField l) - (fun _n l => conjHiggsField l) massWeightPoly where - H_equivariant := fun g φ _n l => - Subtype.ext (AlgebraRealization.id.repGlobal_covDerivH g l φ) - barH_equivariant := fun g φ _n l => - Subtype.ext (AlgebraRealization.id.repGlobal_covDerivBarH g l φ) - H_comm_H := fun φ ψ _n₁ _n₂ l₁ l₂ => - Subtype.ext (AlgebraRealization.id.covH_comm_covH l₁ l₂ φ ψ) - H_comm_barH := fun φ ψ _n₁ _n₂ l₁ l₂ => - Subtype.ext (AlgebraRealization.id.covH_comm_covBarH l₁ l₂ φ ψ) - barH_comm_barH := fun φ ψ _n₁ _n₂ l₁ l₂ => - Subtype.ext (AlgebraRealization.id.covBarH_comm_covBarH l₁ l₂ φ ψ) - H_massWeight := fun φ _n l => - massWeightPoly_eq_monomial (AlgebraRealization.id.massWeight_covDerivH l φ) - barH_massWeight := fun φ _n l => - massWeightPoly_eq_monomial (AlgebraRealization.id.massWeight_covDerivBarH l φ) - repLorentz_H := isLorentzCovDerivTransforms_of AlgebraRealization.id.repLorentz_covDerivH - repLorentz_barH := - isLorentzCovDerivTransforms_of AlgebraRealization.id.repLorentz_covDerivBarH +/-- The Higgs sector of the covariant jet algebra: its Higgs towers are the covariant jet + algebra of the Higgs field, included. -/ +noncomputable def isHiggsSector : + IsHiggsSector CovJetAlgebra repGaugeGroupI repLorentzGroup massWeightPoly where + toAlgHom := higgsSubalgebra.val + map_rep _ _ := rfl + map_repLorentz _ _ := rfl + map_massWeight x := (Subalgebra.mapAlgHom_polyRestrict _ x).symm + rep_mul := repGaugeGroupI_mul + repLorentz_mul := repLorentzGroup_mul + +TODO (lines := 64-75) (date := 2026-09-08) "This should be + renamed to IsHiggsSector.id" /-- The gauge sector of the covariant jet algebra. -/ theorem isGaugeSector : IsGaugeSector CovJetAlgebra repGaugeGroupI repGaugeGroupI_mul diff --git a/Physlib/Particles/StandardModel/JetAlgebra/Realization.lean b/Physlib/Particles/StandardModel/JetAlgebra/Realization.lean new file mode 100644 index 000000000..3b142e2ea --- /dev/null +++ b/Physlib/Particles/StandardModel/JetAlgebra/Realization.lean @@ -0,0 +1,66 @@ +/- +Copyright (c) 2026 Joseph Tooby-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.AlgebraRealization.Basic +/-! +# The jet algebra of the Standard Model is a Standard Model + +## i. Overview + +`AlgebraRealization` asks an algebra for an equivariant algebra map out of the jet algebra +of the Standard Model. The jet algebra therefore carries one for free — the identity — and +that is all this file records. The four compatibility laws hold by definition, and the two +multiplicativity laws are the ones the jet gauge action and the Lorentz action were shown +to satisfy when they were built. + +It is the point at which the abstract theory of `AlgebraRealization` — its covariant +reduction, its mass-weight filtration and its classification of invariants — becomes a +theory of the concrete algebra in which a Standard Model Lagrangian is written, and it is +the first file on the concrete side of that divide. What the instance then buys, once the +covariant reduction is available, is [`CovJetAlgebra/Basic.lean`](CovJetAlgebra/Basic.lean); +what it buys for the classification is +[`AlgebraRealization.lean`](AlgebraRealization.lean). + +## ii. Key results + +- `StandardModel.AlgebraRealization.id` : the jet algebra of the Standard Model is a + Standard Model, along the identity algebra map. + +## iii. Table of contents + +- A. The identity realization + +-/ + +@[expose] public section + +namespace StandardModel + +namespace AlgebraRealization + +open TensorProduct Matrix MatrixGroups Lorentz + +/-! + +## A. The identity realization + +-/ + +/-- The jet algebra of the Standard Model is a Standard Model: it is one along the identity + algebra map. -/ +noncomputable def id : AlgebraRealization JetAlgebra JetAlgebra.repJetGaugeGroupI + JetAlgebra.repLorentzGroup JetAlgebra.massWeightPoly where + toAlgHom := AlgHom.id ℂ JetAlgebra + map_repJet _ _ := rfl + map_repLorentz _ _ := rfl + map_massWeight x := by + simp [Polynomial.mapAlgHom] + repJet_mul := JetAlgebra.isGaugeField.gauge_mul + repLorentz_mul := JetAlgebra.repLorentzGroup_apply_mul + +end AlgebraRealization + +end StandardModel diff --git a/scripts/insert_todo.py b/scripts/insert_todo.py index 35bb9b6c1..7e734700d 100644 --- a/scripts/insert_todo.py +++ b/scripts/insert_todo.py @@ -25,6 +25,7 @@ from __future__ import annotations import argparse +import datetime import os import re import sys @@ -119,13 +120,15 @@ def names_lines(lines: list[str], start: int, end: int) -> bool: 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.""" + one that names no lines at all. Always carries today's date.""" 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' + parts = ["TODO"] + if start is not None: + lines = f"{start}-{end}" if end > start else f"{start}" + parts.append(f"(lines := {lines})") + parts.append(f"(date := {datetime.date.today().isoformat()})") + parts.append(f'"{escaped}"') + return " ".join(parts) + "\n" def goto(path: str, line: int, column: int, settle: float) -> None: diff --git a/scripts/todos.py b/scripts/todos.py index f2efb3069..b8363646e 100644 --- a/scripts/todos.py +++ b/scripts/todos.py @@ -32,8 +32,10 @@ EXCLUDE = re.compile(r"(^|/)(Meta|scripts)/") # TODO "..." and TODO (lines := 82) "..." / TODO (lines := 201-223) "..." (Lean command) +# An optional (date := YYYY-MM-DD) clause may follow the lines clause. CMD_START = re.compile( - r'^\s*TODO\s*(?:\(\s*lines\s*:=\s*(\d+)\s*(?:-\s*(\d+)\s*)?\)\s*)?"' + r'^\s*TODO\s*(?:\(\s*lines\s*:=\s*(\d+)\s*(?:-\s*(\d+)\s*)?\)\s*)?' + r'(?:\(\s*date\s*:=\s*(\d+-\d+-\d+)\s*\)\s*)?"' ) DOC_LINE = re.compile(r"^\s*/-!\s*TODO:\s*") # /-! TODO: ... -/ LOOSE = re.compile(r"todo", re.I) @@ -66,14 +68,21 @@ class Todo(NamedTuple): kind: str content: str at: int + date_added: str = "" 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 "") + """`name` and the code range, saying where the note is when that differs, and + the date it was added when the `TODO` carries one.""" + label = f"{name}:{self.lines()}" + if self.at != self.line: + label += f" (at {self.at})" + if self.date_added: + label += f" [{self.date_added}]" + return label def git(repo, *args): @@ -127,6 +136,7 @@ def parse_file(path, text): 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 + date_added = cmd.group(3) or "" body = line[line.index('"') + 1:] while '"' not in body.replace('\\"', ""): i += 1 @@ -136,7 +146,7 @@ def parse_file(path, text): if '"' in body: body = body[:body.rindex('"')] items.append(Todo(path, first, last, "cmd", - " ".join(body.split()), start + 1)) + " ".join(body.split()), start + 1, date_added)) i += 1 continue @@ -269,6 +279,8 @@ def emit_md(items, meta, repo_url, link_ref): 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})" + if todo.date_added: + row += f"  `{todo.date_added}`" out.append(row) out.append("") From ae05883ca46cfe03cc465d8d8272083475f8ddda Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 8 Sep 2026 09:11:53 +0100 Subject: [PATCH 292/367] feat: UPdate IsHiggsSector --- Physlib.lean | 16 ++++++------- .../AlgebraRealization/CovStandardModel.lean | 8 +++---- .../HiggsAlgebraCovRealization}/Basic.lean | 24 +++++++++---------- .../DerivSubmodule/Basic.lean | 10 ++++---- .../BoostWeightDecomposition.lean | 22 ++++++++--------- .../GaugeWeightDecomposition.lean | 8 +++---- .../MassWeight/Basic.lean | 10 ++++---- .../MassWeight/GaugeWeightDecomposition.lean | 24 +++++++++---------- .../MassWeight/MassDimEight.lean | 10 ++++---- .../MassWeight/MassDimLTEight.lean | 10 ++++---- .../MassWeight/Filtration.lean | 4 ++-- .../CovAlgebraRealization/Basic.lean | 2 +- .../GaugeHiggsSector/Basic.lean | 4 ++-- .../GaugeHiggsSector/MassWeight.lean | 12 +++++----- .../MassWeight/Filtration.lean | 4 ++-- .../MassWeight/Invariants.lean | 10 ++++---- .../CovAlgebraRealization/Sectors.lean | 6 ++--- .../YukawaSector/Basic.lean | 4 ++-- .../GaugeWeightDecomposition.lean | 4 ++-- .../YukawaSector/MassDimLTEight.lean | 2 +- .../BoostWeightDecomposition.lean | 22 ++++++++--------- .../BoostWeightDecomposition.lean | 14 +++++------ .../JetAlgebra/AlgebraRealization.lean | 2 +- .../JetAlgebra/CovJetAlgebra/Higgs.lean | 2 +- .../JetAlgebra/CovJetAlgebra/Sectors.lean | 6 ++--- .../JetComponentSpace/CovariantDeriv.lean | 2 +- 26 files changed, 121 insertions(+), 121 deletions(-) rename Physlib/Particles/StandardModel/{IsHiggsSector => AlgebraRealization/HiggsAlgebraCovRealization}/Basic.lean (98%) rename Physlib/Particles/StandardModel/{IsHiggsSector => AlgebraRealization/HiggsAlgebraCovRealization}/DerivSubmodule/Basic.lean (95%) rename Physlib/Particles/StandardModel/{IsHiggsSector => AlgebraRealization/HiggsAlgebraCovRealization}/DerivSubmodule/BoostWeightDecomposition.lean (93%) rename Physlib/Particles/StandardModel/{IsHiggsSector => AlgebraRealization/HiggsAlgebraCovRealization}/DerivSubmodule/GaugeWeightDecomposition.lean (88%) rename Physlib/Particles/StandardModel/{IsHiggsSector => AlgebraRealization/HiggsAlgebraCovRealization}/MassWeight/Basic.lean (92%) rename Physlib/Particles/StandardModel/{IsHiggsSector => AlgebraRealization/HiggsAlgebraCovRealization}/MassWeight/GaugeWeightDecomposition.lean (98%) rename Physlib/Particles/StandardModel/{IsHiggsSector => AlgebraRealization/HiggsAlgebraCovRealization}/MassWeight/MassDimEight.lean (98%) rename Physlib/Particles/StandardModel/{IsHiggsSector => AlgebraRealization/HiggsAlgebraCovRealization}/MassWeight/MassDimLTEight.lean (98%) diff --git a/Physlib.lean b/Physlib.lean index 2ef3af95e..f8df8098c 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -260,6 +260,14 @@ public import Physlib.Particles.StandardModel.AlgebraRealization.Commutations public import Physlib.Particles.StandardModel.AlgebraRealization.CovFieldAlgebra.Basic public import Physlib.Particles.StandardModel.AlgebraRealization.CovStandardModel public import Physlib.Particles.StandardModel.AlgebraRealization.CovariantDeriv +public import Physlib.Particles.StandardModel.AlgebraRealization.HiggsAlgebraCovRealization.Basic +public import Physlib.Particles.StandardModel.AlgebraRealization.HiggsAlgebraCovRealization.DerivSubmodule.Basic +public import Physlib.Particles.StandardModel.AlgebraRealization.HiggsAlgebraCovRealization.DerivSubmodule.BoostWeightDecomposition +public import Physlib.Particles.StandardModel.AlgebraRealization.HiggsAlgebraCovRealization.DerivSubmodule.GaugeWeightDecomposition +public import Physlib.Particles.StandardModel.AlgebraRealization.HiggsAlgebraCovRealization.MassWeight.Basic +public import Physlib.Particles.StandardModel.AlgebraRealization.HiggsAlgebraCovRealization.MassWeight.GaugeWeightDecomposition +public import Physlib.Particles.StandardModel.AlgebraRealization.HiggsAlgebraCovRealization.MassWeight.MassDimEight +public import Physlib.Particles.StandardModel.AlgebraRealization.HiggsAlgebraCovRealization.MassWeight.MassDimLTEight public import Physlib.Particles.StandardModel.AlgebraRealization.MassWeight.Basic public import Physlib.Particles.StandardModel.AlgebraRealization.MassWeight.Filtration public import Physlib.Particles.StandardModel.AnomalyCancellation.Basic @@ -358,14 +366,6 @@ public import Physlib.Particles.StandardModel.IsGaugeSector.MassWeight.Basic 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.IsHiggsSector.Basic -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.IsHiggsSector.MassWeight.MassDimEight -public import Physlib.Particles.StandardModel.IsHiggsSector.MassWeight.MassDimLTEight public import Physlib.Particles.StandardModel.JetAlgebra.AlgebraRealization public import Physlib.Particles.StandardModel.JetAlgebra.Basic public import Physlib.Particles.StandardModel.JetAlgebra.CovJetAlgebra.Basic diff --git a/Physlib/Particles/StandardModel/AlgebraRealization/CovStandardModel.lean b/Physlib/Particles/StandardModel/AlgebraRealization/CovStandardModel.lean index f20208098..d1c65de6b 100644 --- a/Physlib/Particles/StandardModel/AlgebraRealization/CovStandardModel.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/CovStandardModel.lean @@ -87,7 +87,7 @@ jet into a pure jet and a constant jet is `JetGaugeGroupI.eq_truncationProjZero_mul_ofConstant`. The three sector structures are [`IsGaugeSector/Basic.lean`](../IsGaugeSector/Basic.lean), -[`IsHiggsSector/Basic.lean`](../IsHiggsSector/Basic.lean) and +[`HiggsAlgebraCovRealization/Basic.lean`](../HiggsAlgebraCovRealization/Basic.lean) and [`IsFermionSector/Basic.lean`](../IsFermionSector/Basic.lean). -/ @@ -253,7 +253,7 @@ tower through the base-point Taylor coefficient of its representation alone. Eva 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`. +`IsGaugeSector`, `HiggsAlgebraCovRealization` and `IsFermionSector`. -/ @@ -642,7 +642,7 @@ sum of products of them. The weight-`w` eigenspace of `massWeightPoly` is a subm 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 +are therefore eigenvectors, of the weights `IsGaugeSector`, `HiggsAlgebraCovRealization` and `IsFermionSector` demand. -/ @@ -818,7 +818,7 @@ lemma iteratedCovDerivAdjoint_ofFn_zero_mem_massWeightEigenspace (c : ℕ) ### 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: +mass weights that `IsGaugeSector`, `HiggsAlgebraCovRealization` and `IsFermionSector` demand: `2 * (2 + n)` for the field strength, `2 * (1 + n)` for the Higgs, and `3 + 2 * n` for the fermions. diff --git a/Physlib/Particles/StandardModel/IsHiggsSector/Basic.lean b/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/Basic.lean similarity index 98% rename from Physlib/Particles/StandardModel/IsHiggsSector/Basic.lean rename to Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/Basic.lean index 9c487e6ed..4ea1183e3 100644 --- a/Physlib/Particles/StandardModel/IsHiggsSector/Basic.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/Basic.lean @@ -30,7 +30,7 @@ every polynomial expression in them, sit inside it compatibly with the global ga the Lorentz action and the mass-weight grading. `CovHiggsJetAlgebra` is the universal object with those towers, so the statement is a single one: an algebra map `CovHiggsJetAlgebra →ₐ[ℂ] B`, equivariant for the global gauge group and the Lorentz group -and compatible with `massWeightPoly`. That is the structure `IsHiggsSector`, together with +and compatible with `massWeightPoly`. That is the structure `HiggsAlgebraCovRealization`, together with the two demands that the group actions be multiplicative on the whole of `B`. The two towers are then derived: `h.covH` and `h.covBarH` are the covariant jet algebra of @@ -101,7 +101,7 @@ open TensorProduct Matrix MatrixGroups Lorentz Lorentz.SL2C The last two fields are not consequences of the first three: an equivariant map forces the two actions to be multiplicative only on its image, whereas the sector needs them multiplicative on the whole of `B`. -/ -structure IsHiggsSector (B : Type) [Ring B] [Algebra ℂ B] +structure HiggsAlgebraCovRealization (B : Type) [Ring B] [Algebra ℂ B] (rep : Representation ℂ GaugeGroupI B) (repLorentz : Representation ℂ SL(2,ℂ) B) (massWeightPoly : B →ₐ[ℂ] Polynomial B) where @@ -125,13 +125,13 @@ structure IsHiggsSector (B : Type) [Ring B] [Algebra ℂ B] repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂ set_option linter.unusedVariables false -namespace IsHiggsSector +namespace HiggsAlgebraCovRealization variable {B : Type} [Ring B] [Algebra ℂ B] {rep : Representation ℂ GaugeGroupI B} {repLorentz : Representation ℂ SL(2,ℂ) B} {massWeightPoly : B →ₐ[ℂ] Polynomial B} - (h : IsHiggsSector B rep repLorentz massWeightPoly) + (h : HiggsAlgebraCovRealization B rep repLorentz massWeightPoly) /-! @@ -260,12 +260,12 @@ lemma repLorentz_barH_apply (g : SL(2,ℂ)) (φ : Module.Dual ℂ (ConjModule Hi -/ /-- The component `∇_d H^i` in the algebra. -/ -noncomputable def higgs (h : IsHiggsSector B rep repLorentz massWeightPoly) +noncomputable def higgs (h : HiggsAlgebraCovRealization B rep repLorentz massWeightPoly) {n : ℕ} (d : Fin n → (Fin 1 ⊕ Fin 3)) (i : Fin 2) :B := h.covH n d (HiggsVec.orthonormBasis.toBasis.dualBasis i) /-- The component `∇_d barH^i` in the algebra. -/ -noncomputable def barHiggs (h : IsHiggsSector B rep repLorentz massWeightPoly) +noncomputable def barHiggs (h : HiggsAlgebraCovRealization B rep repLorentz massWeightPoly) {n : ℕ} (d : Fin n → (Fin 1 ⊕ Fin 3)) (i : Fin 2) : B := h.covBarH n d (HiggsVec.orthonormBasis.toBasis.conj.dualBasis i) @@ -315,12 +315,12 @@ 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`. -/ -noncomputable def higgsSubmodule (h : IsHiggsSector B rep repLorentz massWeightPoly) (n : ℕ) : +noncomputable def higgsSubmodule (h : HiggsAlgebraCovRealization B rep repLorentz massWeightPoly) (n : ℕ) : Submodule ℂ B := ⨆ d : Fin n → (Fin 1 ⊕ Fin 3), LinearMap.range (h.covH 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`. -/ -noncomputable def barHiggsSubmodule (h : IsHiggsSector B rep repLorentz massWeightPoly) +noncomputable def barHiggsSubmodule (h : HiggsAlgebraCovRealization B rep repLorentz massWeightPoly) (n : ℕ) : Submodule ℂ B := ⨆ d : Fin n → (Fin 1 ⊕ Fin 3), LinearMap.range (h.covBarH n d) /-! @@ -753,7 +753,7 @@ open Lorentz.BoostWeight noncomputable def dot (x y : Fin 2 → B) : B := x 0 * y 0 + x 1 * y 1 -noncomputable def dotGaugeHiggs (h : IsHiggsSector B rep repLorentz massWeightPoly) +noncomputable def dotGaugeHiggs (h : HiggsAlgebraCovRealization B rep repLorentz 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 @@ -953,7 +953,7 @@ lemma trivialWeightDecomposition_piece (i : Fin 3) (k : ℤ) : /-- The algebra generated by the Higgs, it's conjugate and all their derivatives. -/ -def higgsAlgebra (h : IsHiggsSector B rep repLorentz massWeightPoly) : +def higgsAlgebra (h : HiggsAlgebraCovRealization B rep repLorentz massWeightPoly) : Subalgebra ℂ B := (Algebra.adjoin ℂ (⋃ (k : ℕ) (d : Fin k → (Fin 1 ⊕ Fin 3)), Set.range (h.covH k d) ∪ Set.range (h.covBarH k d))) @@ -968,7 +968,7 @@ 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 : IsHiggsSector B rep repLorentz massWeightPoly) (n : ℕ) : + (h : HiggsAlgebraCovRealization B rep repLorentz massWeightPoly) (n : ℕ) : Submodule ℂ B := h.higgsAlgebra.toSubmodule ⊓ LinearMap.ker (massWeightPoly.toLinearMap @@ -1523,6 +1523,6 @@ lemma massWeightSubmodule_eight_eq : noncomputable def gaugeInvariantOfMassDim (M : ℕ) : Submodule ℂ B := h.massWeightSubmodule M ⊓ Representation.invariants rep -end IsHiggsSector +end HiggsAlgebraCovRealization end StandardModel diff --git a/Physlib/Particles/StandardModel/IsHiggsSector/DerivSubmodule/Basic.lean b/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/DerivSubmodule/Basic.lean similarity index 95% rename from Physlib/Particles/StandardModel/IsHiggsSector/DerivSubmodule/Basic.lean rename to Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/DerivSubmodule/Basic.lean index 50d82aaaf..09108d408 100644 --- a/Physlib/Particles/StandardModel/IsHiggsSector/DerivSubmodule/Basic.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/DerivSubmodule/Basic.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.IsHiggsSector.Basic +public import Physlib.Particles.StandardModel.AlgebraRealization.HiggsAlgebraCovRealization.Basic /-! # The derivative submodules of the Higgs sector @@ -25,7 +25,7 @@ namespace StandardModel open TensorProduct Matrix MatrixGroups Lorentz -namespace IsHiggsSector +namespace HiggsAlgebraCovRealization set_option linter.unusedVariables false @@ -33,11 +33,11 @@ variable {B : Type} [Ring B] [Algebra ℂ B] {rep : Representation ℂ GaugeGroupI B} {repLorentz : Representation ℂ SL(2,ℂ) B} {massWeightPoly : B →ₐ[ℂ] Polynomial B} - (h : IsHiggsSector B rep repLorentz massWeightPoly) + (h : HiggsAlgebraCovRealization B rep repLorentz massWeightPoly) /-- The submodule of `B` generated by the Higgs symbols and their conjugates carrying `n` derivatives. -/ -noncomputable def derivSubmodule (h : IsHiggsSector B rep repLorentz massWeightPoly) +noncomputable def derivSubmodule (h : HiggsAlgebraCovRealization B rep repLorentz massWeightPoly) (n : ℕ) : Submodule ℂ B := h.higgsSubmodule n ⊔ h.barHiggsSubmodule n @@ -172,6 +172,6 @@ lemma derivSubmodule_map_repLorentz (n : ℕ) (Λ : SL(2,ℂ)) : ⟨repLorentz Λ⁻¹ b, h.derivSubmodule_map_repLorentz_le n Λ⁻¹ ⟨b, hb, rfl⟩, repLorentz.self_inv_apply Λ b⟩ -end IsHiggsSector +end HiggsAlgebraCovRealization end StandardModel diff --git a/Physlib/Particles/StandardModel/IsHiggsSector/DerivSubmodule/BoostWeightDecomposition.lean b/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/DerivSubmodule/BoostWeightDecomposition.lean similarity index 93% rename from Physlib/Particles/StandardModel/IsHiggsSector/DerivSubmodule/BoostWeightDecomposition.lean rename to Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/DerivSubmodule/BoostWeightDecomposition.lean index a0d581b35..ced439f79 100644 --- a/Physlib/Particles/StandardModel/IsHiggsSector/DerivSubmodule/BoostWeightDecomposition.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/DerivSubmodule/BoostWeightDecomposition.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.IsHiggsSector.DerivSubmodule.Basic +public import Physlib.Particles.StandardModel.AlgebraRealization.HiggsAlgebraCovRealization.DerivSubmodule.Basic /-! # The boost weight decomposition of the Higgs sector @@ -18,7 +18,7 @@ This is the simplest of the three sectors. The Higgs symbols `H n l φ` and `ba 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 +And the value space is *Lorentz trivial*: `HiggsAlgebraCovRealization.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. @@ -44,7 +44,7 @@ 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 + sits in weight zero. `HiggsAlgebraCovRealization.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) : @@ -80,7 +80,7 @@ namespace StandardModel open TensorProduct Matrix MatrixGroups Lorentz Lorentz.BoostWeight -namespace IsHiggsSector +namespace HiggsAlgebraCovRealization set_option linter.unusedVariables false @@ -88,7 +88,7 @@ variable {B : Type} [Ring B] [Algebra ℂ B] {rep : Representation ℂ GaugeGroupI B} {repLorentz : Representation ℂ SL(2,ℂ) B} {massWeightPoly : B →ₐ[ℂ] Polynomial B} - (h : IsHiggsSector B rep repLorentz massWeightPoly) + (h : HiggsAlgebraCovRealization B rep repLorentz massWeightPoly) /-! @@ -151,13 +151,13 @@ lemma mem_boostWeightSubmodule_barHiggsValue (i : Fin 3) /-- **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 repLorentz massWeightPoly) +noncomputable def lightConeHiggs (h : HiggsAlgebraCovRealization B rep repLorentz massWeightPoly) {n : ℕ} (i : Fin 3) (c : Fin n → Fin 4) (φ : Module.Dual ℂ HiggsVec) : B := lightConeDeriv (h.covH n) i c φ /-- **The light-cone conjugate-Higgs symbols.** -/ -noncomputable def lightConeBarHiggs (h : IsHiggsSector B rep repLorentz massWeightPoly) +noncomputable def lightConeBarHiggs (h : HiggsAlgebraCovRealization B rep repLorentz massWeightPoly) {n : ℕ} (i : Fin 3) (c : Fin n → Fin 4) (φ : Module.Dual ℂ (ConjModule HiggsVec)) : B := lightConeDeriv (h.covBarH n) i c φ @@ -220,14 +220,14 @@ lemma iSup_range_barH (n : ℕ) : /-- **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 repLorentz massWeightPoly) +noncomputable def higgsSubmoduleBoostWeight (h : HiggsAlgebraCovRealization B rep repLorentz massWeightPoly) (n : ℕ) (i : Fin 3) : WeightDecomposition repLorentz i (h.higgsSubmodule n) := (IsDerivativeCollection.boostDecomp (h.covH 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 repLorentz massWeightPoly) +noncomputable def barHiggsSubmoduleBoostWeight (h : HiggsAlgebraCovRealization B rep repLorentz massWeightPoly) (n : ℕ) (i : Fin 3) : WeightDecomposition repLorentz i (h.barHiggsSubmodule n) := (IsDerivativeCollection.boostDecomp (h.covBarH n) (h.rotatesIndices_barH n) i @@ -274,7 +274,7 @@ lemma barHiggsSubmoduleBoostWeight_piece (n : ℕ) (i : Fin 3) (k : ℤ) : /-- **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 repLorentz massWeightPoly) +noncomputable def derivSubmoduleBoostWeight (h : HiggsAlgebraCovRealization B rep repLorentz massWeightPoly) (n : ℕ) (i : Fin 3) : WeightDecomposition repLorentz i (h.derivSubmodule n) := ((h.higgsSubmoduleBoostWeight n i).sup @@ -332,7 +332,7 @@ lemma two_dvd_of_mem_derivSubmoduleBoostWeight_supp (n : ℕ) (i : Fin 3) {k : refine Finset.dvd_sum fun j _ => ?_ rcases hw (c j) with hj | hj | hj <;> rw [hj] <;> norm_num -end IsHiggsSector +end HiggsAlgebraCovRealization end StandardModel diff --git a/Physlib/Particles/StandardModel/IsHiggsSector/DerivSubmodule/GaugeWeightDecomposition.lean b/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/DerivSubmodule/GaugeWeightDecomposition.lean similarity index 88% rename from Physlib/Particles/StandardModel/IsHiggsSector/DerivSubmodule/GaugeWeightDecomposition.lean rename to Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/DerivSubmodule/GaugeWeightDecomposition.lean index 799e4a553..9b448249e 100644 --- a/Physlib/Particles/StandardModel/IsHiggsSector/DerivSubmodule/GaugeWeightDecomposition.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/DerivSubmodule/GaugeWeightDecomposition.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.IsHiggsSector.DerivSubmodule.Basic +public import Physlib.Particles.StandardModel.AlgebraRealization.HiggsAlgebraCovRealization.DerivSubmodule.Basic /-! # The gauge weight decomposition of the Higgs sector @@ -22,7 +22,7 @@ namespace StandardModel open TensorProduct Matrix MatrixGroups Lorentz -namespace IsHiggsSector +namespace HiggsAlgebraCovRealization set_option linter.unusedVariables false @@ -30,7 +30,7 @@ variable {B : Type} [Ring B] [Algebra ℂ B] {rep : Representation ℂ GaugeGroupI B} {repLorentz : Representation ℂ SL(2,ℂ) B} {massWeightPoly : B →ₐ[ℂ] Polynomial B} - (h : IsHiggsSector B rep repLorentz massWeightPoly) + (h : HiggsAlgebraCovRealization B rep repLorentz 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 @@ -53,6 +53,6 @@ lemma derivSubmoduleGaugeWeight_supp (n : ℕ) : = {((0, 0, -1, -3) : GaugeWeight), (0, 0, 1, -3), (0, 0, 1, 3), (0, 0, -1, 3)} := rfl -end IsHiggsSector +end HiggsAlgebraCovRealization end StandardModel diff --git a/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/Basic.lean b/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/MassWeight/Basic.lean similarity index 92% rename from Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/Basic.lean rename to Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/MassWeight/Basic.lean index b2f1ece82..849fdf6a2 100644 --- a/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/Basic.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/MassWeight/Basic.lean @@ -5,12 +5,12 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.IsHiggsSector.DerivSubmodule.Basic +public import Physlib.Particles.StandardModel.AlgebraRealization.HiggsAlgebraCovRealization.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 +`HiggsAlgebraCovRealization.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 @@ -25,7 +25,7 @@ namespace StandardModel open TensorProduct Matrix MatrixGroups Lorentz -namespace IsHiggsSector +namespace HiggsAlgebraCovRealization set_option linter.unusedVariables false @@ -33,7 +33,7 @@ variable {B : Type} [Ring B] [Algebra ℂ B] {rep : Representation ℂ GaugeGroupI B} {repLorentz : Representation ℂ SL(2,ℂ) B} {massWeightPoly : B →ₐ[ℂ] Polynomial B} - (h : IsHiggsSector B rep repLorentz massWeightPoly) + (h : HiggsAlgebraCovRealization B rep repLorentz massWeightPoly) /-- The derivative submodule sits in the mass-weight submodule of weight `2 * (1 + n)`. -/ lemma derivSubmodule_le_massWeightSubmodule (n : ℕ) : @@ -96,6 +96,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] -end IsHiggsSector +end HiggsAlgebraCovRealization end StandardModel diff --git a/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/GaugeWeightDecomposition.lean b/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/MassWeight/GaugeWeightDecomposition.lean similarity index 98% rename from Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/GaugeWeightDecomposition.lean rename to Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/MassWeight/GaugeWeightDecomposition.lean index 00949e0f2..1e21e9efd 100644 --- a/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/GaugeWeightDecomposition.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/MassWeight/GaugeWeightDecomposition.lean @@ -5,8 +5,8 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.IsHiggsSector.MassWeight.Basic -public import Physlib.Particles.StandardModel.IsHiggsSector.DerivSubmodule.GaugeWeightDecomposition +public import Physlib.Particles.StandardModel.AlgebraRealization.HiggsAlgebraCovRealization.MassWeight.Basic +public import Physlib.Particles.StandardModel.AlgebraRealization.HiggsAlgebraCovRealization.DerivSubmodule.GaugeWeightDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU2AntiFundamental public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU2QuadFundamental /-! @@ -60,7 +60,7 @@ namespace StandardModel open TensorProduct Matrix MatrixGroups Lorentz ComplexConjugate -namespace IsHiggsSector +namespace HiggsAlgebraCovRealization set_option linter.unusedVariables false @@ -68,7 +68,7 @@ variable {B : Type} [Ring B] [Algebra ℂ B] {rep : Representation ℂ GaugeGroupI B} {repLorentz : Representation ℂ SL(2,ℂ) B} {massWeightPoly : B →ₐ[ℂ] Polynomial B} - (h : IsHiggsSector B rep repLorentz massWeightPoly) + (h : HiggsAlgebraCovRealization B rep repLorentz massWeightPoly) /-! @@ -250,14 +250,14 @@ 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 repLorentz massWeightPoly) +noncomputable def higgsBarHiggsSpan (h : HiggsAlgebraCovRealization B rep repLorentz 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 repLorentz massWeightPoly) +noncomputable def quarticSpan (h : HiggsAlgebraCovRealization B rep repLorentz massWeightPoly) (i j : Fin 2) : Submodule ℂ B := ℂ ∙ (h.higgs ![] i * h.barHiggs ![] i * h.higgs ![] j * h.barHiggs ![] j) @@ -553,7 +553,7 @@ lemma barHiggs_mul_barHiggs_comm {n m : ℕ} (d : Fin n → (Fin 1 ⊕ Fin 3)) /-- The isospin family of a Higgs tower carrying `n` derivatives against a conjugate tower carrying `m`: the conjugate symbol supplies the fundamental index and so goes in the first slot, the Higgs symbol the anti-fundamental one. -/ -noncomputable def isoFamily (h : IsHiggsSector B rep repLorentz massWeightPoly) +noncomputable def isoFamily (h : HiggsAlgebraCovRealization B rep repLorentz massWeightPoly) {n m : ℕ} (d : Fin n → (Fin 1 ⊕ Fin 3)) (d' : Fin m → (Fin 1 ⊕ Fin 3)) : (Fin 2 → Fin 2) → B := fun l => h.barHiggs d' (l 0) * h.higgs d (l 1) @@ -579,7 +579,7 @@ lemma deltaContraction_isoFamily {n m : ℕ} (d : Fin n → (Fin 1 ⊕ Fin 3)) /-- The span of the isospin contractions of a Higgs tower carrying `n` derivatives against a conjugate tower carrying `m`: the gauge invariants the isospin classification leaves at those two derivative orders. -/ -noncomputable def dotSpan (h : IsHiggsSector B rep repLorentz massWeightPoly) +noncomputable def dotSpan (h : HiggsAlgebraCovRealization B rep repLorentz massWeightPoly) (n m : ℕ) : Submodule ℂ B := ⨆ (d : Fin n → (Fin 1 ⊕ Fin 3)) (d' : Fin m → (Fin 1 ⊕ Fin 3)), ℂ ∙ h.dotGaugeHiggs d d' @@ -621,7 +621,7 @@ lemma higgsBarHiggsSpan_le_isoFamily_span (n m : ℕ) : /-- The re-index of an underived Higgs symbol by the antisymmetric symbol, `H̃⁰ = H¹` and `H̃¹ = -H⁰`. `SU(2)` is pseudo-real, so this turns the anti-fundamental index of a Higgs symbol into a fundamental one, which is what the quartic family needs. -/ -noncomputable def tildeHiggs (h : IsHiggsSector B rep repLorentz massWeightPoly) (i : Fin 2) : B := +noncomputable def tildeHiggs (h : HiggsAlgebraCovRealization B rep repLorentz massWeightPoly) (i : Fin 2) : B := ∑ m : Fin 2, IsSU2BiFundamental.epsilon i m • h.higgs (![] : Fin 0 → (Fin 1 ⊕ Fin 3)) m /-- The re-index at isospin zero is the Higgs symbol of isospin one. -/ @@ -655,7 +655,7 @@ lemma rep_su2_tildeHiggs (V : specialUnitaryGroup (Fin 2) ℂ) (i : Fin 2) : /-- The quartic isospin family: two conjugate Higgs symbols against two re-indexed Higgs symbols, each of the four carrying a fundamental isospin index. -/ -noncomputable def quadFamily (h : IsHiggsSector B rep repLorentz massWeightPoly) : +noncomputable def quadFamily (h : HiggsAlgebraCovRealization B rep repLorentz massWeightPoly) : (Fin 4 → Fin 2) → B := fun l => h.barHiggs (![] : Fin 0 → (Fin 1 ⊕ Fin 3)) (l 0) * (h.tildeHiggs (l 1) @@ -824,7 +824,7 @@ lemma exists_mem_of_invariant_biSup_isSU2FunAntiFun_span {ι : Type} [DecidableE /-- The span of the components of all the isospin families of a Higgs tower carrying `n` derivatives against a conjugate tower carrying `m`. This is the gauge-stable enlargement of the pairing span of section C. -/ -noncomputable def isoSpan (h : IsHiggsSector B rep repLorentz massWeightPoly) +noncomputable def isoSpan (h : HiggsAlgebraCovRealization B rep repLorentz massWeightPoly) (n m : ℕ) : Submodule ℂ B := ⨆ (d : Fin n → (Fin 1 ⊕ Fin 3)) (d' : Fin m → (Fin 1 ⊕ Fin 3)), IsSU2BiFundamental.span (h.isoFamily d d') @@ -1164,6 +1164,6 @@ lemma gaugeInvariantOfMassDim_eight_eq_dotSpan : (h.dotGaugeHiggs_mem_massWeightSubmodule ![] ![])) · rw [h.rep_mul, h.rep_dotGaugeHiggs_invariant] -end IsHiggsSector +end HiggsAlgebraCovRealization end StandardModel diff --git a/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/MassDimEight.lean b/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/MassWeight/MassDimEight.lean similarity index 98% rename from Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/MassDimEight.lean rename to Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/MassWeight/MassDimEight.lean index bcadc05e8..6e70ded42 100644 --- a/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/MassDimEight.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/MassWeight/MassDimEight.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.IsHiggsSector.MassWeight.MassDimLTEight +public import Physlib.Particles.StandardModel.AlgebraRealization.HiggsAlgebraCovRealization.MassWeight.MassDimLTEight public import Physlib.Relativity.LorentzGroup.Invariants.IsBiLorentz /-! # The Higgs invariants of mass weight eight @@ -44,7 +44,7 @@ namespace StandardModel open TensorProduct Matrix MatrixGroups Lorentz ComplexConjugate -namespace IsHiggsSector +namespace HiggsAlgebraCovRealization set_option linter.unusedVariables false @@ -52,7 +52,7 @@ variable {B : Type} [Ring B] [Algebra ℂ B] {rep : Representation ℂ GaugeGroupI B} {repLorentz : Representation ℂ SL(2,ℂ) B} {massWeightPoly : B →ₐ[ℂ] Polynomial B} - (h : IsHiggsSector B rep repLorentz massWeightPoly) + (h : HiggsAlgebraCovRealization B rep repLorentz massWeightPoly) /-! @@ -292,7 +292,7 @@ the kinetic term and the quartic potential. terms `□H† H` and `H† □H`, the kinetic term `∂^μ H† ∂_μ H`, and the quartic potential `(H† H)²`. -/ noncomputable def lorentzContractionEightSpan - (h : IsHiggsSector B rep repLorentz massWeightPoly) : + (h : HiggsAlgebraCovRealization B rep repLorentz massWeightPoly) : Submodule ℂ B := ℂ ∙ IsBiLorentz.metricContraction (T := fun d : Fin 2 → Fin 1 ⊕ Fin 3 => h.dotGaugeHiggs d ![]) @@ -502,6 +502,6 @@ theorem mem_massWeightSubmodule_eight_sup_and_gauge_lorentz_invariant_iff rw [map_add, h.repLorentz_of_mem_lorentzContractionEightSpan g hxy, hyL g] simpa using hstep -end IsHiggsSector +end HiggsAlgebraCovRealization end StandardModel diff --git a/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/MassDimLTEight.lean b/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/MassWeight/MassDimLTEight.lean similarity index 98% rename from Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/MassDimLTEight.lean rename to Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/MassWeight/MassDimLTEight.lean index 00679e654..9197deeb4 100644 --- a/Physlib/Particles/StandardModel/IsHiggsSector/MassWeight/MassDimLTEight.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/MassWeight/MassDimLTEight.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.IsHiggsSector.MassWeight.GaugeWeightDecomposition +public import Physlib.Particles.StandardModel.AlgebraRealization.HiggsAlgebraCovRealization.MassWeight.GaugeWeightDecomposition public import Physlib.Relativity.LorentzGroup.Invariants.IsSingleLorentz /-! # The Higgs invariants below mass weight eight @@ -47,7 +47,7 @@ namespace StandardModel open TensorProduct Matrix MatrixGroups Lorentz ComplexConjugate -namespace IsHiggsSector +namespace HiggsAlgebraCovRealization set_option linter.unusedVariables false @@ -55,7 +55,7 @@ variable {B : Type} [Ring B] [Algebra ℂ B] {rep : Representation ℂ GaugeGroupI B} {repLorentz : Representation ℂ SL(2,ℂ) B} {massWeightPoly : B →ₐ[ℂ] Polynomial B} - (h : IsHiggsSector B rep repLorentz massWeightPoly) + (h : HiggsAlgebraCovRealization B rep repLorentz massWeightPoly) /-! @@ -266,7 +266,7 @@ happen to be trivial. `0 < w < 8`: the line through the Higgs mass term at weight four, and nothing at any other weight. -/ noncomputable def lorentzContractionLTEightSpan - (h : IsHiggsSector B rep repLorentz massWeightPoly) + (h : HiggsAlgebraCovRealization B rep repLorentz massWeightPoly) (w : ℕ) : Submodule ℂ B := if w = 4 then h.dotSpan 0 0 else ⊥ @@ -396,6 +396,6 @@ theorem mem_massWeightSubmodule_lt_eight_sup_and_gauge_lorentz_invariant_iff_mem exact ⟨sup_le_sup_right (h.lorentzContractionLTEightSpan_le_massWeightSubmodule w) S hxm, hG, hL⟩ -end IsHiggsSector +end HiggsAlgebraCovRealization end StandardModel diff --git a/Physlib/Particles/StandardModel/AlgebraRealization/MassWeight/Filtration.lean b/Physlib/Particles/StandardModel/AlgebraRealization/MassWeight/Filtration.lean index 10f0057c4..de5738af0 100644 --- a/Physlib/Particles/StandardModel/AlgebraRealization/MassWeight/Filtration.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/MassWeight/Filtration.lean @@ -341,11 +341,11 @@ include h in under both groups, is fixed by the jet gauge group and the Lorentz group exactly when it is a combination of the constant term, of mass dimension zero, - the Higgs mass term `H† H`, of mass dimension two (`IsHiggsSector.dotSpan`), + the Higgs mass term `H† H`, of mass dimension two (`HiggsAlgebraCovRealization.dotSpan`), and the Standard-Model Lagrangian of mass dimension four — the gauge kinetic and theta terms of the three gauge groups (`IsGaugeSector.lorentzContractionEightSpan`), the Higgs kinetic term, its quartic potential and its two box terms - (`IsHiggsSector.lorentzContractionEightSpan`), the kinetic terms of the ten fermion + (`HiggsAlgebraCovRealization.lorentzContractionEightSpan`), the kinetic terms of the ten fermion species over the nine family pairs (`IsFermionSector.kineticSpan`), and the six Yukawa couplings over the nine family pairs (`yukawaSpan`) — up to a remainder in `S` fixed by both groups, and nothing else. -/ diff --git a/Physlib/Particles/StandardModel/CovAlgebraRealization/Basic.lean b/Physlib/Particles/StandardModel/CovAlgebraRealization/Basic.lean index 4e2f9869d..446fde349 100644 --- a/Physlib/Particles/StandardModel/CovAlgebraRealization/Basic.lean +++ b/Physlib/Particles/StandardModel/CovAlgebraRealization/Basic.lean @@ -295,7 +295,7 @@ inside it. /-- The Higgs sector of a covariant Standard Model: the defining map restricted to the covariant jet algebra of the Higgs field. -/ noncomputable def isHiggsSector : - IsHiggsSector B repGauge repLorentz massWeightPoly where + HiggsAlgebraCovRealization B repGauge repLorentz massWeightPoly where toAlgHom := k.toAlgHom.comp CovJetAlgebra.higgsSubalgebra.val map_rep g x := k.map_repGauge g (x : CovJetAlgebra) map_repLorentz Λ x := k.map_repLorentz Λ (x : CovJetAlgebra) diff --git a/Physlib/Particles/StandardModel/CovAlgebraRealization/GaugeHiggsSector/Basic.lean b/Physlib/Particles/StandardModel/CovAlgebraRealization/GaugeHiggsSector/Basic.lean index 243f32692..ddadc05ee 100644 --- a/Physlib/Particles/StandardModel/CovAlgebraRealization/GaugeHiggsSector/Basic.lean +++ b/Physlib/Particles/StandardModel/CovAlgebraRealization/GaugeHiggsSector/Basic.lean @@ -6,7 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.CovAlgebraRealization.Sectors -public import Physlib.Particles.StandardModel.IsHiggsSector.MassWeight.Basic +public import Physlib.Particles.StandardModel.AlgebraRealization.HiggsAlgebraCovRealization.MassWeight.Basic /-! # The mixed gauge-Higgs sector @@ -59,7 +59,7 @@ lemma commute_of_mem_gaugeAlgebra_of_mem_higgsAlgebra {x y : B} · exact h.F_comm_H l μ ν φ dd φ' · exact h.F_comm_barH l μ ν φ dd φ' rw [IsGaugeSector.gaugeAlgebra] at hx - rw [IsHiggsSector.higgsAlgebra] at hy + rw [HiggsAlgebraCovRealization.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 diff --git a/Physlib/Particles/StandardModel/CovAlgebraRealization/GaugeHiggsSector/MassWeight.lean b/Physlib/Particles/StandardModel/CovAlgebraRealization/GaugeHiggsSector/MassWeight.lean index 9ac1bde0b..6509e613b 100644 --- a/Physlib/Particles/StandardModel/CovAlgebraRealization/GaugeHiggsSector/MassWeight.lean +++ b/Physlib/Particles/StandardModel/CovAlgebraRealization/GaugeHiggsSector/MassWeight.lean @@ -242,9 +242,9 @@ lemma repLorentz_eq_self_of_mem_higgs_derivSubmodule_zero (g : SL(2,ℂ)) {y : B (hy : y ∈ h.isHiggsSector.derivSubmodule 0) : repLorentz g y = y := by have key : h.isHiggsSector.derivSubmodule 0 ≤ LinearMap.ker (repLorentz g - LinearMap.id) := by - rw [IsHiggsSector.derivSubmodule] + rw [HiggsAlgebraCovRealization.derivSubmodule] refine sup_le ?_ ?_ - · rw [IsHiggsSector.higgsSubmodule] + · rw [HiggsAlgebraCovRealization.higgsSubmodule] refine iSup_le fun l => ?_ rintro _ ⟨φ, rfl⟩ simp only [LinearMap.mem_ker, LinearMap.sub_apply, LinearMap.id_apply, sub_eq_zero] @@ -253,7 +253,7 @@ lemma repLorentz_eq_self_of_mem_higgs_derivSubmodule_zero (g : SL(2,ℂ)) {y : B (fun b _ hb => absurd (Subsingleton.elim b ![]) hb) (fun hb => absurd (Finset.mem_univ _) hb), Fin.prod_univ_zero, one_smul, Subsingleton.elim l ![]] - · rw [IsHiggsSector.barHiggsSubmodule] + · rw [HiggsAlgebraCovRealization.barHiggsSubmodule] refine iSup_le fun l => ?_ rintro _ ⟨φ, rfl⟩ simp only [LinearMap.mem_ker, LinearMap.sub_apply, LinearMap.id_apply, sub_eq_zero] @@ -369,9 +369,9 @@ theorem mem_of_lorentz_invariant_derivSubmodule_zero_mul_higgs_one_sup (S : Subm h.isHiggsSector.derivSubmodule 1 ≤ Submodule.comap (LinearMap.mulLeft ℂ (h.covF ![] μ ν φ)) (⨆ i, (hT i).span) := by intro μ ν φ - rw [IsHiggsSector.derivSubmodule] + rw [HiggsAlgebraCovRealization.derivSubmodule] refine sup_le ?_ ?_ - · rw [IsHiggsSector.higgsSubmodule] + · rw [HiggsAlgebraCovRealization.higgsSubmodule] refine iSup_le fun dd => ?_ obtain ⟨ρ, rfl⟩ : ∃ ρ, dd = ![ρ] := ⟨dd 0, (IsGaugeSector.etaExpand_cov_one dd).symm⟩ rintro _ ⟨ψ, rfl⟩ @@ -381,7 +381,7 @@ theorem mem_of_lorentz_invariant_derivSubmodule_zero_mul_higgs_one_sup (S : Subm simp only [Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.cons_val_two, Matrix.tail_cons, Sum.elim_inl] exact Submodule.mem_span_singleton_self _ - · rw [IsHiggsSector.barHiggsSubmodule] + · rw [HiggsAlgebraCovRealization.barHiggsSubmodule] refine iSup_le fun dd => ?_ obtain ⟨ρ, rfl⟩ : ∃ ρ, dd = ![ρ] := ⟨dd 0, (IsGaugeSector.etaExpand_cov_one dd).symm⟩ rintro _ ⟨ψ, rfl⟩ diff --git a/Physlib/Particles/StandardModel/CovAlgebraRealization/MassWeight/Filtration.lean b/Physlib/Particles/StandardModel/CovAlgebraRealization/MassWeight/Filtration.lean index ebed5bfa3..2b4d8f8a9 100644 --- a/Physlib/Particles/StandardModel/CovAlgebraRealization/MassWeight/Filtration.lean +++ b/Physlib/Particles/StandardModel/CovAlgebraRealization/MassWeight/Filtration.lean @@ -367,11 +367,11 @@ theorem mem_massWeightSubmoduleLE_eight_sup_and_gauge_lorentz_invariant_iff_mem `massWeightSubmoduleLE 8 ⊔ S`, for `S` a submodule stable under both groups, is fixed by the gauge group and the Lorentz group exactly when it is a combination of the constant term, of mass dimension zero, - the Higgs mass term `H† H`, of mass dimension two (`IsHiggsSector.dotSpan`), + the Higgs mass term `H† H`, of mass dimension two (`HiggsAlgebraCovRealization.dotSpan`), and the Standard-Model Lagrangian of mass dimension four — the gauge kinetic and theta terms of the three gauge groups (`IsGaugeSector.lorentzContractionEightSpan`), the Higgs kinetic term, its quartic potential and its two box terms - (`IsHiggsSector.lorentzContractionEightSpan`), the kinetic terms of the ten fermion + (`HiggsAlgebraCovRealization.lorentzContractionEightSpan`), the kinetic terms of the ten fermion species over the nine family pairs (`IsFermionSector.kineticSpan`), and the six Yukawa couplings over the nine family pairs (`yukawaSpan`) — up to a remainder in `S` fixed by both groups, and nothing else. -/ diff --git a/Physlib/Particles/StandardModel/CovAlgebraRealization/MassWeight/Invariants.lean b/Physlib/Particles/StandardModel/CovAlgebraRealization/MassWeight/Invariants.lean index 35c50d6f0..264608c22 100644 --- a/Physlib/Particles/StandardModel/CovAlgebraRealization/MassWeight/Invariants.lean +++ b/Physlib/Particles/StandardModel/CovAlgebraRealization/MassWeight/Invariants.lean @@ -12,7 +12,7 @@ public import Physlib.Particles.StandardModel.CovAlgebraRealization.YukawaSector public import Physlib.Particles.StandardModel.IsFermionSector.MassWeight.MassDimEight public import Physlib.Particles.StandardModel.IsFermionSector.MassWeight.MassDimLTEight public import Physlib.Particles.StandardModel.IsGaugeSector.MassWeight.MassDimEight -public import Physlib.Particles.StandardModel.IsHiggsSector.MassWeight.MassDimEight +public import Physlib.Particles.StandardModel.AlgebraRealization.HiggsAlgebraCovRealization.MassWeight.MassDimEight /-! # The invariant content of the Standard Model @@ -109,14 +109,14 @@ lemma standardModelSpan_eight : /-- At mass weight four the span is the line through the Higgs mass term `H† H`, the one invariant of the Standard Model below mass dimension four. -/ lemma standardModelSpan_four : h.standardModelSpan 4 = h.isHiggsSector.dotSpan 0 0 := by - rw [standardModelSpan, if_neg (by norm_num), IsHiggsSector.lorentzContractionLTEightSpan, + rw [standardModelSpan, if_neg (by norm_num), HiggsAlgebraCovRealization.lorentzContractionLTEightSpan, if_pos rfl] /-- At every mass weight other than four and eight the span is trivial: apart from the Higgs mass term there is no Standard-Model term below mass dimension four. -/ lemma standardModelSpan_eq_bot {w : ℕ} (hw : w ≠ 8) (hw4 : w ≠ 4) : h.standardModelSpan w = ⊥ := by - rw [standardModelSpan, if_neg hw, IsHiggsSector.lorentzContractionLTEightSpan, + rw [standardModelSpan, if_neg hw, HiggsAlgebraCovRealization.lorentzContractionLTEightSpan, if_neg hw4] /-! @@ -166,7 +166,7 @@ lemma standardModelSpan_le_massWeightSubmodule (w : ℕ) : · subst hw4 exact (h.isHiggsSector.lorentzContractionLTEightSpan_le_massWeightSubmodule 4).trans (h.isHiggsSector_massWeightSubmodule_le (by norm_num)) - · rw [IsHiggsSector.lorentzContractionLTEightSpan, if_neg hw4] + · rw [HiggsAlgebraCovRealization.lorentzContractionLTEightSpan, if_neg hw4] exact bot_le /-- The span at weight `w` is fixed pointwise by the gauge and Lorentz groups together: @@ -486,7 +486,7 @@ theorem mem_massWeightSubmodule_sup_and_gauge_lorentz_invariant_iff_mem (w : ℕ the gauge kinetic and theta terms of the three gauge groups (`IsGaugeSector.lorentzContractionEightSpan`), the Higgs kinetic term, its quartic potential and its two box terms - (`IsHiggsSector.lorentzContractionEightSpan`), + (`HiggsAlgebraCovRealization.lorentzContractionEightSpan`), the kinetic terms of the ten fermion species over the nine family pairs (`IsFermionSector.kineticSpan`), and the six Yukawa couplings over the nine family pairs (`yukawaSpan`), diff --git a/Physlib/Particles/StandardModel/CovAlgebraRealization/Sectors.lean b/Physlib/Particles/StandardModel/CovAlgebraRealization/Sectors.lean index da1c2154b..4047a5600 100644 --- a/Physlib/Particles/StandardModel/CovAlgebraRealization/Sectors.lean +++ b/Physlib/Particles/StandardModel/CovAlgebraRealization/Sectors.lean @@ -579,7 +579,7 @@ 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 + rw [Subalgebra.mem_toSubmodule, HiggsAlgebraCovRealization.higgsAlgebra] at hx induction hx using Algebra.adjoin_induction with | mem y hy => apply Submodule.mem_sup_left @@ -618,7 +618,7 @@ lemma sectorMassWeight_higgs_le (w : ℕ) : exact List.mem_toFinset.mpr (List.mem_map_of_mem hg) rw [hS] at hmem' simpa using hmem' - rw [IsHiggsSector.higgsAlgebra] + rw [HiggsAlgebraCovRealization.higgsAlgebra] cases g with | H n l j => exact Algebra.subset_adjoin (Set.mem_iUnion.mpr ⟨n, Set.mem_iUnion.mpr @@ -637,7 +637,7 @@ lemma sectorMassWeight_higgs_le (w : ℕ) : | 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] + rw [HiggsAlgebraCovRealization.massWeightSubmodule] refine Submodule.mem_inf.mpr ⟨(Subalgebra.mem_toSubmodule _).mpr hmem, ?_⟩ rw [LinearMap.mem_ker] simp only [LinearMap.sub_apply, AlgHom.toLinearMap_apply, diff --git a/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/Basic.lean b/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/Basic.lean index c93b6b4f5..265a55a79 100644 --- a/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/Basic.lean +++ b/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/Basic.lean @@ -6,7 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.CovAlgebraRealization.Sectors -public import Physlib.Particles.StandardModel.IsHiggsSector.MassWeight.Basic +public import Physlib.Particles.StandardModel.AlgebraRealization.HiggsAlgebraCovRealization.MassWeight.Basic /-! # The Yukawa sector's mass-weight submodules @@ -87,7 +87,7 @@ lemma commute_of_mem_higgsAlgebra_of_mem_fermionAlgebra {x y : B} · exact h.barH_comm_barL _ _ _ _ _ · exact h.barH_comm_e _ _ _ _ _ · exact h.barH_comm_bare _ _ _ _ _ - rw [IsHiggsSector.higgsAlgebra] at hx + rw [HiggsAlgebraCovRealization.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 diff --git a/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/GaugeWeightDecomposition.lean b/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/GaugeWeightDecomposition.lean index f9b214332..833f7555f 100644 --- a/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/GaugeWeightDecomposition.lean +++ b/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/GaugeWeightDecomposition.lean @@ -7,7 +7,7 @@ module public import Physlib.Particles.StandardModel.CovAlgebraRealization.YukawaSector.Basic public import Physlib.Particles.StandardModel.IsFermionSector.MassWeight.GaugeWeightDecomposition -public import Physlib.Particles.StandardModel.IsHiggsSector.DerivSubmodule.GaugeWeightDecomposition +public import Physlib.Particles.StandardModel.AlgebraRealization.HiggsAlgebraCovRealization.DerivSubmodule.GaugeWeightDecomposition /-! # The gauge weight decomposition of the Yukawa sector at mass weight eight @@ -627,7 +627,7 @@ lemma sectorMassWeightEightGaugeWeight_piece_zero : LinearMap.range (h.covBarL f' ![]) ⊔ LinearMap.range (h.covE f' ![]) ⊔ LinearMap.range (h.covBarE f' ![]))) := by - rw [IsHiggsSector.derivSubmodule, h.isFermionSector.derivSubmodule_zero_eq, + rw [HiggsAlgebraCovRealization.derivSubmodule, h.isFermionSector.derivSubmodule_zero_eq, Submodule.iSup_mul, Submodule.mul_iSup] exact iSup_congr fun f => by rw [Submodule.mul_iSup, Submodule.mul_iSup] show (GaugeWeightDecomposition.mul (d := h.isHiggsSector.derivSubmoduleGaugeWeight 0) diff --git a/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/MassDimLTEight.lean b/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/MassDimLTEight.lean index 3c1cad739..757d68cd2 100644 --- a/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/MassDimLTEight.lean +++ b/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/MassDimLTEight.lean @@ -6,7 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.CovAlgebraRealization.YukawaSector.Basic -public import Physlib.Particles.StandardModel.IsHiggsSector.DerivSubmodule.BoostWeightDecomposition +public import Physlib.Particles.StandardModel.AlgebraRealization.HiggsAlgebraCovRealization.DerivSubmodule.BoostWeightDecomposition public import Physlib.Relativity.LorentzGroup.Invariants.IsQuadLorentz -- The fermion boost weights enter only inside the proofs below, so this import is kept -- private: its public form is one character over the line-length limit. diff --git a/Physlib/Particles/StandardModel/IsFermionSector/DerivSubmodule/BoostWeightDecomposition.lean b/Physlib/Particles/StandardModel/IsFermionSector/DerivSubmodule/BoostWeightDecomposition.lean index 64b33f407..365db15d6 100644 --- a/Physlib/Particles/StandardModel/IsFermionSector/DerivSubmodule/BoostWeightDecomposition.lean +++ b/Physlib/Particles/StandardModel/IsFermionSector/DerivSubmodule/BoostWeightDecomposition.lean @@ -7,7 +7,7 @@ module public import Physlib.Particles.StandardModel.IsFermionSector.Basic public import Physlib.Relativity.Fermions.Weyl.BoostWeight -public import Physlib.Particles.StandardModel.IsHiggsSector.Basic +public import Physlib.Particles.StandardModel.AlgebraRealization.HiggsAlgebraCovRealization.Basic /-! # The boost weight decomposition of the fermion sector @@ -322,7 +322,7 @@ lemma rotatesIndices_bare (f : Fin 3) (n : ℕ) : 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) + HiggsAlgebraCovRealization.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 @@ -334,7 +334,7 @@ noncomputable def boostWeight_d (f : Fin 3) (n : ℕ) (i : Fin 3) : 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) + HiggsAlgebraCovRealization.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 @@ -346,7 +346,7 @@ noncomputable def boostWeight_bard (f : Fin 3) (n : ℕ) (i : Fin 3) : 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) + HiggsAlgebraCovRealization.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 @@ -358,7 +358,7 @@ noncomputable def boostWeight_u (f : Fin 3) (n : ℕ) (i : Fin 3) : 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) + HiggsAlgebraCovRealization.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 @@ -370,7 +370,7 @@ noncomputable def boostWeight_baru (f : Fin 3) (n : ℕ) (i : Fin 3) : 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) + HiggsAlgebraCovRealization.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) @@ -383,7 +383,7 @@ noncomputable def boostWeight_Q (f : Fin 3) (n : ℕ) (i : Fin 3) : 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) + HiggsAlgebraCovRealization.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) @@ -396,7 +396,7 @@ noncomputable def boostWeight_barQ (f : Fin 3) (n : ℕ) (i : Fin 3) : 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) + HiggsAlgebraCovRealization.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 @@ -408,7 +408,7 @@ noncomputable def boostWeight_L (f : Fin 3) (n : ℕ) (i : Fin 3) : 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) + HiggsAlgebraCovRealization.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 @@ -420,7 +420,7 @@ noncomputable def boostWeight_barL (f : Fin 3) (n : ℕ) (i : Fin 3) : 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) + HiggsAlgebraCovRealization.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 @@ -432,7 +432,7 @@ noncomputable def boostWeight_e (f : Fin 3) (n : ℕ) (i : Fin 3) : 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) + HiggsAlgebraCovRealization.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 diff --git a/Physlib/Particles/StandardModel/IsGaugeSector/DerivSubmodule/BoostWeightDecomposition.lean b/Physlib/Particles/StandardModel/IsGaugeSector/DerivSubmodule/BoostWeightDecomposition.lean index 43f749953..37f1f403f 100644 --- a/Physlib/Particles/StandardModel/IsGaugeSector/DerivSubmodule/BoostWeightDecomposition.lean +++ b/Physlib/Particles/StandardModel/IsGaugeSector/DerivSubmodule/BoostWeightDecomposition.lean @@ -6,7 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.IsGaugeSector.Basic -public import Physlib.Particles.StandardModel.IsHiggsSector.Basic +public import Physlib.Particles.StandardModel.AlgebraRealization.HiggsAlgebraCovRealization.Basic /-! # The boost weight decomposition of the gauge sector @@ -21,7 +21,7 @@ the same Lorentz matrix. So the symbols are repackaged, by `fieldStrengthSymbol 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, +which is exactly the shape `HiggsAlgebraCovRealization.RotatesIndices` asks for, with the trivial representation on `ℂ` recording that the value index carries no Lorentz weight. @@ -72,7 +72,7 @@ end Lorentz.BoostWeight.WeightDecomposition namespace StandardModel open Matrix MatrixGroups Lorentz Lorentz.BoostWeight -open IsHiggsSector.IsDerivativeCollection +open HiggsAlgebraCovRealization.IsDerivativeCollection /-- Each light-cone direction carries weight `+2`, `-2` or `0`. -/ lemma lightConeWeight_eq_two_or_neg_two_or_zero (κ : Fin 4) : @@ -228,7 +228,7 @@ noncomputable def symbolBoostWeight 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) + (HiggsAlgebraCovRealization.trivialWeightDecomposition i) /-- The weight-`k` piece at one value index is spanned by the light-cone field strengths whose slots have total weight `k`. -/ @@ -237,15 +237,15 @@ lemma symbolBoostWeight_piece {n : ℕ} (i : Fin 3) (φ : Module.Dual ℝ GaugeA = ⨆ (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 + ((HiggsAlgebraCovRealization.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, + HiggsAlgebraCovRealization.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), + · rw [HiggsAlgebraCovRealization.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 diff --git a/Physlib/Particles/StandardModel/JetAlgebra/AlgebraRealization.lean b/Physlib/Particles/StandardModel/JetAlgebra/AlgebraRealization.lean index 32566ecba..4eef41f60 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/AlgebraRealization.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/AlgebraRealization.lean @@ -241,7 +241,7 @@ towers for the classification to say anything about it. a combination of the constant term, the Higgs mass term `H† H`, and the Standard Model Lagrangian of mass dimension four: the gauge kinetic and theta terms (`IsGaugeSector.lorentzContractionEightSpan`), the Higgs kinetic term, quartic potential - and box terms (`IsHiggsSector.lorentzContractionEightSpan`), the fermion kinetic terms + and box terms (`HiggsAlgebraCovRealization.lorentzContractionEightSpan`), the fermion kinetic terms (`IsFermionSector.kineticSpan`) and the Yukawa couplings (`yukawaSpan`) — and nothing else. diff --git a/Physlib/Particles/StandardModel/JetAlgebra/CovJetAlgebra/Higgs.lean b/Physlib/Particles/StandardModel/JetAlgebra/CovJetAlgebra/Higgs.lean index 1c28932ed..8d62e134f 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/CovJetAlgebra/Higgs.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/CovJetAlgebra/Higgs.lean @@ -24,7 +24,7 @@ together with the two towers. `CovHiggsJetAlgebra` is to the Higgs sector what `CovJetAlgebra` is to the Standard Model: the object every Higgs sector receives its fields from, which is the content of -`IsHiggsSector`. +`HiggsAlgebraCovRealization`. ## ii. Key results diff --git a/Physlib/Particles/StandardModel/JetAlgebra/CovJetAlgebra/Sectors.lean b/Physlib/Particles/StandardModel/JetAlgebra/CovJetAlgebra/Sectors.lean index 94ad519c8..229211f7e 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/CovJetAlgebra/Sectors.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/CovJetAlgebra/Sectors.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module public import Physlib.Particles.StandardModel.JetAlgebra.CovJetAlgebra.Basic -public import Physlib.Particles.StandardModel.IsHiggsSector.Basic +public import Physlib.Particles.StandardModel.AlgebraRealization.HiggsAlgebraCovRealization.Basic public import Physlib.Particles.StandardModel.JetAlgebra.CovJetAlgebra.Higgs public import Physlib.Particles.StandardModel.IsGaugeSector.MassWeight.Basic public import Physlib.Particles.StandardModel.IsFermionSector.MassWeight.Basic @@ -65,7 +65,7 @@ namespace CovJetAlgebra /-- The Higgs sector of the covariant jet algebra: its Higgs towers are the covariant jet algebra of the Higgs field, included. -/ noncomputable def isHiggsSector : - IsHiggsSector CovJetAlgebra repGaugeGroupI repLorentzGroup massWeightPoly where + HiggsAlgebraCovRealization CovJetAlgebra repGaugeGroupI repLorentzGroup massWeightPoly where toAlgHom := higgsSubalgebra.val map_rep _ _ := rfl map_repLorentz _ _ := rfl @@ -74,7 +74,7 @@ noncomputable def isHiggsSector : repLorentz_mul := repLorentzGroup_mul TODO (lines := 64-75) (date := 2026-09-08) "This should be - renamed to IsHiggsSector.id" + renamed to HiggsAlgebraCovRealization.id" /-- The gauge sector of the covariant jet algebra. -/ theorem isGaugeSector : IsGaugeSector CovJetAlgebra repGaugeGroupI repGaugeGroupI_mul diff --git a/Physlib/Particles/StandardModel/Matter/JetComponentSpace/CovariantDeriv.lean b/Physlib/Particles/StandardModel/Matter/JetComponentSpace/CovariantDeriv.lean index 634eba788..9c258c6e8 100644 --- a/Physlib/Particles/StandardModel/Matter/JetComponentSpace/CovariantDeriv.lean +++ b/Physlib/Particles/StandardModel/Matter/JetComponentSpace/CovariantDeriv.lean @@ -493,7 +493,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 `IsHiggsSector`. The result is again a + indexing as the derivative labels of `HiggsAlgebraCovRealization`. The result is again a family of derivative symbols; the physical iterated covariant derivative is its value at the empty multiset. -/ noncomputable def covDerivIter From 8cd7332757220706c20bfd5a31d679fe64669a71 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 8 Sep 2026 10:21:02 +0100 Subject: [PATCH 293/367] feat: Update MatterField --- Physlib.lean | 2 +- .../GaugeTheory/Matter/Charge.lean | 17 ++++-- .../Basic.lean} | 57 ++++++++++++------- .../JetAlgebra/GaugeFieldData.lean | 10 ++-- .../StandardModel/Fermions/MatterField.lean | 47 ++++++++++----- .../Particles/StandardModel/FieldData.lean | 6 +- .../StandardModel/HiggsBoson/MatterField.lean | 16 ++++-- 7 files changed, 101 insertions(+), 54 deletions(-) rename Physlib/ClassicalFieldTheory/GaugeTheory/{Matter/MatterField.lean => MatterField/Basic.lean} (60%) diff --git a/Physlib.lean b/Physlib.lean index f8df8098c..d54b1e87d 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -12,7 +12,7 @@ public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeField.TransformsInAd 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.GaugeTheory.MatterField.Basic public import Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.Basic public import Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.ConstantGaugeAction public import Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.GaugeAction diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/Matter/Charge.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/Matter/Charge.lean index 067fd4897..865f5d1af 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/Matter/Charge.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/Matter/Charge.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.ClassicalFieldTheory.GaugeTheory.Matter.MatterField +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.Basic /-! # Charged matter fields under `U(1)` jets @@ -100,10 +100,13 @@ lemma chargeRep_smul (n : ℤ) (U : unitary JetRing) (χ : JetRing) (z : JetRing /-- **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] + `U(1)`, in any gauge context `jets` whose jet group is `unitary JetRing`. None of the + data below depends on `jets` beyond that, so it is supplied polymorphically. -/ +noncomputable def charged {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + (jets : GaugeJet (unitary JetRing) 𝔤 G₀ 𝔤J) [Module.Free ℂ V] [Module.Finite ℂ V] (repLorentz : Representation ℂ SL(2,ℂ) V) (n : ℤ) (w : ℕ) : - MatterField (unitary JetRing) where + MatterField jets where V := V repLorentz := repLorentz repJet := chargeRep n V @@ -111,8 +114,10 @@ noncomputable def charged [Module.Free ℂ V] [Module.Finite ℂ V] massWeight := w @[simp] -lemma charged_V [Module.Free ℂ V] [Module.Finite ℂ V] +lemma charged_V {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + (jets : GaugeJet (unitary JetRing) 𝔤 G₀ 𝔤J) [Module.Free ℂ V] [Module.Finite ℂ V] (repLorentz : Representation ℂ SL(2,ℂ) V) (n : ℤ) (w : ℕ) : - (charged repLorentz n w).V = V := rfl + (charged jets repLorentz n w).V = V := rfl end MatterField diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/Matter/MatterField.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Basic.lean similarity index 60% rename from Physlib/ClassicalFieldTheory/GaugeTheory/Matter/MatterField.lean rename to Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Basic.lean index 88f91fdb3..fd376d528 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/Matter/MatterField.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Basic.lean @@ -5,6 +5,7 @@ Authors: Joseph Tooby-Smith -/ module +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeJet public import Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.ConstantGaugeAction public import Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.LorentzAction public import Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.MassDim @@ -14,22 +15,28 @@ public import Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.Statistics ## 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 +A matter field of a gauge theory 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. +All of this is relative to a gauge context `jets : GaugeJet G 𝔤 G₀ 𝔤J`: the jet gauge +group `G` the field's jet action is a representation of, and the global group `G₀`, Lie +algebras `𝔤`, `𝔤J` and structure maps that make `G` the jets of `G₀` rather than an +unrelated group. Fixing `jets` rather than `G` alone is what lets the global gauge action +`repConstant` below be taken along the *canonical* inclusion `jets.ofConstant`, instead of +an arbitrary homomorphism supplied by hand. + +`MatterField jets` 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.repConstant` : the global gauge action, along `jets.ofConstant`. - `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. @@ -51,11 +58,13 @@ open Matrix MatrixGroups TensorProduct -/ -/-- **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 +/-- **A matter field** of a gauge theory over the gauge context `jets : GaugeJet G 𝔤 G₀ 𝔤J`: + 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] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + (jets : GaugeJet G 𝔤 G₀ 𝔤J) where /-- The target space of the field. -/ V : Type [instAddCommGroup : AddCommGroup V] @@ -66,6 +75,8 @@ structure MatterField (G : Type) [Group G] where 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 action of the gauge algebra. -/ + repAlgebra : 𝔤 →ₗ[ℝ] V →ₗ[ℂ] 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. -/ @@ -76,7 +87,9 @@ attribute [instance] MatterField.instAddCommGroup MatterField.instModule namespace MatterField -variable {G : Type} [Group G] (M : MatterField G) +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : GaugeJet G 𝔤 G₀ 𝔤J} (M : MatterField jets) /-! @@ -102,10 +115,10 @@ variable (A : Type) [Ring A] [Algebra ℂ A] [IsFieldAlgebra M.V A] 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 global gauge action on a field algebra of the matter field, along the canonical + inclusion `jets.ofConstant : G₀ →* G` of the constant jets. -/ +noncomputable def repConstant : Representation ℂ G₀ A := + FieldAlgebra.repConstant jets.ofConstant M.repJet M.repJet_smul /-- The Lorentz action on a field algebra of the matter field. -/ noncomputable def repLorentzGroup : Representation ℂ SL(2,ℂ) A := @@ -120,8 +133,8 @@ lemma repJetAlgebra_ι (U : G) (x : JetComponentSpace M.V) : 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 repConstant_apply (g : G₀) : + M.repConstant A g = M.repJetAlgebra A (jets.ofConstant g) := rfl lemma repLorentzGroup_ι (Λ : SL(2,ℂ)) (x : JetComponentSpace M.V) : M.repLorentzGroup A Λ (FieldAlgebra.ι A x) = diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/GaugeFieldData.lean b/Physlib/ClassicalFieldTheory/JetAlgebra/GaugeFieldData.lean index ee9888398..d36459f1a 100644 --- a/Physlib/ClassicalFieldTheory/JetAlgebra/GaugeFieldData.lean +++ b/Physlib/ClassicalFieldTheory/JetAlgebra/GaugeFieldData.lean @@ -6,7 +6,7 @@ Authors: Nathaneal Sajan module public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Basic -public import Physlib.ClassicalFieldTheory.GaugeTheory.Matter.MatterField +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.Basic public import Physlib.ClassicalFieldTheory.JetAlgebra.SpeciesGenerators /-! # The field data of a gauge theory and its local field algebra @@ -19,7 +19,7 @@ group `G₀` with finite-dimensional real Lie algebra `𝔤`, a jet group `G` wi algebra `𝔤J`, a gauge-jet package `jets : GaugeJet G 𝔤 G₀ 𝔤J` relating them and its Taylor–Leibniz law `GaugeJetLeibniz jets`. The matter content is a finite family of fermionic species and a finite family of bosonic species, each given by an existing -`MatterField G`. +`MatterField jets`. `GaugeFieldData jets` bundles the matter content over such a context. From it this file derives, with no further data, @@ -96,7 +96,7 @@ different context. `GaugeFieldData` adds only the matter content on top of it. with global group `G₀`, a finite-dimensional real gauge algebra `𝔤` with jet algebra `𝔤J` and a gauge-jet package `jets` over them, it records a finite family of fermionic species and a finite family of bosonic species, each given by an existing - `MatterField G`. + `MatterField jets`. Nothing is repeated from `MatterField`, whose fields already carry the value space, the Lorentz representation, the gauge-jet action and the mass weight of a species. Nothing is @@ -115,13 +115,13 @@ structure GaugeFieldData {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieA [decidableEqFermionSpecies : DecidableEq FermionSpecies] [finiteFermionSpecies : Finite FermionSpecies] /-- The matter field of each fermionic species. -/ - fermion : FermionSpecies → MatterField G + fermion : FermionSpecies → MatterField jets /-- The index type of the bosonic species. -/ BosonSpecies : Type [decidableEqBosonSpecies : DecidableEq BosonSpecies] [finiteBosonSpecies : Finite BosonSpecies] /-- The matter field of each bosonic species. -/ - boson : BosonSpecies → MatterField G + boson : BosonSpecies → MatterField jets attribute [instance] GaugeFieldData.decidableEqFermionSpecies GaugeFieldData.finiteFermionSpecies GaugeFieldData.decidableEqBosonSpecies diff --git a/Physlib/Particles/StandardModel/Fermions/MatterField.lean b/Physlib/Particles/StandardModel/Fermions/MatterField.lean index a3d17d67c..3b3690fd8 100644 --- a/Physlib/Particles/StandardModel/Fermions/MatterField.lean +++ b/Physlib/Particles/StandardModel/Fermions/MatterField.lean @@ -5,8 +5,9 @@ Authors: Nathaneal Sajan -/ module -public import Physlib.ClassicalFieldTheory.GaugeTheory.Matter.MatterField +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.Basic public import Physlib.Particles.StandardModel.Fermions.DownSinglet.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.GaugeJet public import Physlib.Particles.StandardModel.Fermions.LeptonDoublet.Basic public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.Basic public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet.Basic @@ -16,8 +17,8 @@ public import Physlib.Particles.StandardModel.Fermions.UpSinglet.Basic ## i. Overview -`MatterField G` bundles the value space of one field of a gauge theory with jet gauge -group `G`, its Lorentz representation, the fibrewise action of the jets of gauge +`MatterField jets` bundles the value space of one field of a gauge theory over a gauge +context `jets`, its Lorentz representation, the fibrewise action of the jets of gauge transformations on the jets of the field, and its mass weight. The five Standard Model fermion types already carry all four, and this file collects them. Nothing is redefined and no convention is changed. The chirality, the gauge representation, the hypercharge @@ -68,12 +69,13 @@ namespace StandardModel namespace LeptonDoublet -/-- The lepton doublet as a matter field of `JetGaugeGroupI`, in the `(1, 2)_{-3}` +/-- The lepton doublet as a matter field of `StandardModel.gaugeJet`, in the `(1, 2)_{-3}` representation with its left-handed Lorentz action. -/ -noncomputable def matterField : MatterField JetGaugeGroupI where +noncomputable def matterField : MatterField gaugeJet where V := LeptonDoublet repLorentz := repLorentzGroup repJet := repJetGaugeGroupI + repAlgebra := gaugeAlgebraAction repJet_smul := repJetGaugeGroupI_smul massWeight := 3 @@ -86,6 +88,9 @@ lemma matterField_repLorentz : matterField.repLorentz = repLorentzGroup := rfl @[simp] lemma matterField_repJet : matterField.repJet = repJetGaugeGroupI := rfl +@[simp] +lemma matterField_repAlgebra : matterField.repAlgebra = gaugeAlgebraAction := rfl + @[simp] lemma matterField_massWeight : matterField.massWeight = 3 := rfl @@ -99,12 +104,13 @@ end LeptonDoublet namespace LeptonSinglet -/-- The charged-lepton singlet as a matter field of `JetGaugeGroupI`, in the +/-- The charged-lepton singlet as a matter field of `StandardModel.gaugeJet`, in the `(1, 1)_{-6}` representation with its right-handed Lorentz action. -/ -noncomputable def matterField : MatterField JetGaugeGroupI where +noncomputable def matterField : MatterField gaugeJet where V := LeptonSinglet repLorentz := repLorentzGroup repJet := repJetGaugeGroupI + repAlgebra := gaugeAlgebraAction repJet_smul := repJetGaugeGroupI_smul massWeight := 3 @@ -117,6 +123,9 @@ lemma matterField_repLorentz : matterField.repLorentz = repLorentzGroup := rfl @[simp] lemma matterField_repJet : matterField.repJet = repJetGaugeGroupI := rfl +@[simp] +lemma matterField_repAlgebra : matterField.repAlgebra = gaugeAlgebraAction := rfl + @[simp] lemma matterField_massWeight : matterField.massWeight = 3 := rfl @@ -132,12 +141,13 @@ end LeptonSinglet namespace QuarkDoublet -/-- The quark doublet as a matter field of `JetGaugeGroupI`, in the `(3, 2)_{1}` +/-- The quark doublet as a matter field of `StandardModel.gaugeJet`, in the `(3, 2)_{1}` representation with its left-handed Lorentz action. -/ -noncomputable def matterField : MatterField JetGaugeGroupI where +noncomputable def matterField : MatterField gaugeJet where V := QuarkDoublet repLorentz := repLorentzGroup repJet := repJetGaugeGroupI + repAlgebra := gaugeAlgebraAction repJet_smul := repJetGaugeGroupI_smul massWeight := 3 @@ -150,6 +160,9 @@ lemma matterField_repLorentz : matterField.repLorentz = repLorentzGroup := rfl @[simp] lemma matterField_repJet : matterField.repJet = repJetGaugeGroupI := rfl +@[simp] +lemma matterField_repAlgebra : matterField.repAlgebra = gaugeAlgebraAction := rfl + @[simp] lemma matterField_massWeight : matterField.massWeight = 3 := rfl @@ -163,12 +176,13 @@ end QuarkDoublet namespace UpSinglet -/-- The up-type quark singlet as a matter field of `JetGaugeGroupI`, in the +/-- The up-type quark singlet as a matter field of `StandardModel.gaugeJet`, in the `(3, 1)_{4}` representation with its right-handed Lorentz action. -/ -noncomputable def matterField : MatterField JetGaugeGroupI where +noncomputable def matterField : MatterField gaugeJet where V := UpSinglet repLorentz := repLorentzGroup repJet := repJetGaugeGroupI + repAlgebra := gaugeAlgebraAction repJet_smul := repJetGaugeGroupI_smul massWeight := 3 @@ -181,6 +195,9 @@ lemma matterField_repLorentz : matterField.repLorentz = repLorentzGroup := rfl @[simp] lemma matterField_repJet : matterField.repJet = repJetGaugeGroupI := rfl +@[simp] +lemma matterField_repAlgebra : matterField.repAlgebra = gaugeAlgebraAction := rfl + @[simp] lemma matterField_massWeight : matterField.massWeight = 3 := rfl @@ -194,12 +211,13 @@ end UpSinglet namespace DownSinglet -/-- The down-type quark singlet as a matter field of `JetGaugeGroupI`, in the +/-- The down-type quark singlet as a matter field of `StandardModel.gaugeJet`, in the `(3, 1)_{-2}` representation with its right-handed Lorentz action. -/ -noncomputable def matterField : MatterField JetGaugeGroupI where +noncomputable def matterField : MatterField gaugeJet where V := DownSinglet repLorentz := repLorentzGroup repJet := repJetGaugeGroupI + repAlgebra := gaugeAlgebraAction repJet_smul := repJetGaugeGroupI_smul massWeight := 3 @@ -212,6 +230,9 @@ lemma matterField_repLorentz : matterField.repLorentz = repLorentzGroup := rfl @[simp] lemma matterField_repJet : matterField.repJet = repJetGaugeGroupI := rfl +@[simp] +lemma matterField_repAlgebra : matterField.repAlgebra = gaugeAlgebraAction := rfl + @[simp] lemma matterField_massWeight : matterField.massWeight = 3 := rfl diff --git a/Physlib/Particles/StandardModel/FieldData.lean b/Physlib/Particles/StandardModel/FieldData.lean index 9a6b9a47c..cfde5373c 100644 --- a/Physlib/Particles/StandardModel/FieldData.lean +++ b/Physlib/Particles/StandardModel/FieldData.lean @@ -66,7 +66,7 @@ namespace StandardModel /-- The fifteen fermion species of the Standard Model: each of the five fermion types in each of the three generations, the generation `i : Fin 3` carried by the constructor. Two generations of one type share a representation package but are distinct species. -/ -inductive FermionType where +inductive FermionType (Extention : Type) where /-- The lepton doublet of generation `i`, `(1, 2)_{-3}`. -/ | leptonDoublet (i : Fin 3) : FermionType /-- The charged-lepton singlet of generation `i`, `(1, 1)_{-6}`. -/ @@ -77,13 +77,15 @@ inductive FermionType where | upSinglet (i : Fin 3) : FermionType /-- The down-type quark singlet of generation `i`, `(3, 1)_{-2}`. -/ | downSinglet (i : Fin 3) : FermionType + /-- Fermionic extensions of the standard model. -/ + | extention (e : Extention) : FermionType deriving DecidableEq, Fintype namespace FermionType /-- The matter field of a fermion species, one of the five existing adapters. It is the same in every generation. -/ -noncomputable def matterField : FermionType → MatterField JetGaugeGroupI +noncomputable def matterField : FermionType → MatterField gaugeJet | .leptonDoublet _ => LeptonDoublet.matterField | .leptonSinglet _ => LeptonSinglet.matterField | .quarkDoublet _ => QuarkDoublet.matterField diff --git a/Physlib/Particles/StandardModel/HiggsBoson/MatterField.lean b/Physlib/Particles/StandardModel/HiggsBoson/MatterField.lean index 9b005418f..cf076b91c 100644 --- a/Physlib/Particles/StandardModel/HiggsBoson/MatterField.lean +++ b/Physlib/Particles/StandardModel/HiggsBoson/MatterField.lean @@ -5,15 +5,17 @@ Authors: Nathaneal Sajan -/ module -public import Physlib.ClassicalFieldTheory.GaugeTheory.Matter.MatterField +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.GaugeJet +public import Physlib.Particles.StandardModel.HiggsBoson.GaugeAlgebraAction public import Physlib.Particles.StandardModel.HiggsBoson.JetAlgebra.Basic /-! # The Standard Model Higgs field as a matter field ## i. Overview -`MatterField G` bundles the value space of one field of a gauge theory with jet gauge -group `G`, its Lorentz representation, the fibrewise action of the jets of gauge +`MatterField jets` bundles the value space of one field of a gauge theory over a gauge +context `jets`, its Lorentz representation, the fibrewise action of the jets of gauge transformations, and its mass weight. The Higgs already carries all four, and this file collects them, as `Physlib.Particles.StandardModel.Fermions.MatterField` does for the five fermion types. Nothing is redefined and no convention is changed: the `2_{3}` jet action @@ -47,12 +49,13 @@ namespace HiggsVec -/ -/-- The Higgs field as a matter field of `JetGaugeGroupI`, valued in `HiggsVec`, in the +/-- The Higgs field as a matter field of `StandardModel.gaugeJet`, valued in `HiggsVec`, in the `2_{3}` representation of the gauge group, a Lorentz scalar, of mass weight two. -/ -noncomputable def matterField : MatterField JetGaugeGroupI where +noncomputable def matterField : MatterField gaugeJet where V := HiggsVec repLorentz := Representation.trivial ℂ SL(2,ℂ) HiggsVec repJet := repJetGaugeGroupI + repAlgebra := gaugeAlgebraAction repJet_smul := repJetGaugeGroupI_smul massWeight := 2 @@ -66,6 +69,9 @@ lemma matterField_repLorentz : @[simp] lemma matterField_repJet : matterField.repJet = repJetGaugeGroupI := rfl +@[simp] +lemma matterField_repAlgebra : matterField.repAlgebra = gaugeAlgebraAction := rfl + @[simp] lemma matterField_massWeight : matterField.massWeight = 2 := rfl From c1206d04ea3e51f915ce3d1860641107199b11bc Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 8 Sep 2026 11:59:00 +0100 Subject: [PATCH 294/367] feat: Clean up LocalGaugeData --- Physlib.lean | 7 +- .../GaugeTheory/GaugeBoson/Basic.lean | 2 +- .../GaugeTheory/GaugeBoson/GaugeAction.lean | 6 +- .../GaugeTheory/GaugeBoson/IsGaugeField.lean | 6 +- .../GaugeTheory/GaugeField/Basic.lean | 48 +-- .../GaugeTheory/GaugeField/FieldStrength.lean | 2 +- .../GaugeField/TransformsInAdjoint.lean | 2 +- .../Basic.lean} | 54 ++-- .../LocalGaugeData}/InfinitesimalAction.lean | 226 +++++++------- .../LocalGaugeData/TransformsIn.lean | 92 ++++++ .../GaugeTheory/Matter/Charge.lean | 4 +- .../GaugeTheory/Matter/CovariantDeriv.lean | 30 +- .../GaugeTheory/MatterField/Basic.lean | 20 +- .../JetAlgebra/GaugeFieldData.lean | 14 +- .../AlgebraRealization/CovStandardModel.lean | 208 +++++++------ .../AlgebraRealization/CovariantDeriv.lean | 66 ++-- .../Fermions/DownSinglet/Basic.lean | 2 +- .../DownSinglet/GaugeAlgebraAction.lean | 16 +- .../LeptonDoublet/GaugeAlgebraAction.lean | 14 +- .../LeptonSinglet/GaugeAlgebraAction.lean | 14 +- .../StandardModel/Fermions/MatterField.lean | 37 ++- .../QuarkDoublet/GaugeAlgebraAction.lean | 14 +- .../UpSinglet/GaugeAlgebraAction.lean | 14 +- .../Particles/StandardModel/FieldData.lean | 10 +- .../StandardModel/GaugeGroup/GaugeJet.lean | 180 ----------- .../GaugeGroup/LocalGaugeData.lean | 294 ++++++++++++++++++ .../HiggsBoson/GaugeAlgebraAction.lean | 14 +- .../StandardModel/HiggsBoson/MatterField.lean | 10 +- .../JetAlgebra/TransformsIn.lean | 2 +- .../Matter/JetComponentSpace/Basic.lean | 18 ++ .../JetComponentSpace/CovariantDeriv.lean | 2 +- 31 files changed, 834 insertions(+), 594 deletions(-) rename Physlib/ClassicalFieldTheory/GaugeTheory/{GaugeJet.lean => LocalGaugeData/Basic.lean} (84%) rename Physlib/{Particles/StandardModel/GaugeAlgebra => ClassicalFieldTheory/GaugeTheory/LocalGaugeData}/InfinitesimalAction.lean (71%) create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/TransformsIn.lean delete mode 100644 Physlib/Particles/StandardModel/GaugeGroup/GaugeJet.lean create mode 100644 Physlib/Particles/StandardModel/GaugeGroup/LocalGaugeData.lean diff --git a/Physlib.lean b/Physlib.lean index d54b1e87d..5bdd2bd99 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -9,7 +9,9 @@ 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.LocalGaugeData.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.TransformsIn public import Physlib.ClassicalFieldTheory.GaugeTheory.Matter.Charge public import Physlib.ClassicalFieldTheory.GaugeTheory.Matter.CovariantDeriv public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.Basic @@ -311,7 +313,6 @@ public import Physlib.Particles.StandardModel.Fermions.UpSinglet.GaugeAlgebraAct public import Physlib.Particles.StandardModel.FieldData public import Physlib.Particles.StandardModel.GaugeAlgebra.Basic public import Physlib.Particles.StandardModel.GaugeAlgebra.Basis -public import Physlib.Particles.StandardModel.GaugeAlgebra.InfinitesimalAction public import Physlib.Particles.StandardModel.GaugeAlgebra.JetGaugeAlgebra public import Physlib.Particles.StandardModel.GaugeAlgebra.RootDecomposition public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.Basic @@ -324,7 +325,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.MassWeightPoly -public import Physlib.Particles.StandardModel.GaugeGroup.GaugeJet public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.Basic public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU2Adjoint @@ -339,6 +339,7 @@ public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU3FunAnti public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsU1BiAdjoint public import Physlib.Particles.StandardModel.GaugeGroup.JetGaugeGroup.Basic public import Physlib.Particles.StandardModel.GaugeGroup.JetGaugeGroup.Truncation +public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData public import Physlib.Particles.StandardModel.GaugeGroup.MaurerCartan.Basic public import Physlib.Particles.StandardModel.GaugeGroup.MaurerCartan.Truncation public import Physlib.Particles.StandardModel.GaugeGroup.SU2PermDecomposition diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Basic.lean index f5ddaac56..b6878a4ee 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Basic.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeJet +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Basic public import Physlib.Relativity.DerivAlgebra public import Physlib.Mathematics.SymmetricAlgebra public import Mathlib.LinearAlgebra.Dual.Lemmas diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeAction.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeAction.lean index bf4173128..aa720ff29 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeAction.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeAction.lean @@ -63,8 +63,8 @@ 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 {jets : GaugeJet G 𝔤 G₀ 𝔤J} -variable [GaugeJetLeibniz jets] +variable {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} +variable [LocalGaugeDataLeibniz jets] set_option maxHeartbeats 1000000 @@ -345,7 +345,7 @@ lemma mcBosonCoeff_mul (U V : G) (s : Multiset (Fin 1 ⊕ Fin 3)) : map_add, map_add, show jets.adjoint U (jets.mc V μ) = jets.adjoint U (jets.mc V μ) from rfl, - GaugeJetLeibniz.evalLie_iteratedDeriv_adjoint, TensorProduct.tmul_add, + LocalGaugeDataLeibniz.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)) diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/IsGaugeField.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/IsGaugeField.lean index 791d3728d..9c7afa497 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/IsGaugeField.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/IsGaugeField.lean @@ -14,7 +14,7 @@ public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeField.Basic 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 gauge-jet package `jets` with the Taylor–Leibniz rule `GaugeJetLeibniz jets`. +for any local-gauge-data package `jets` with the Taylor–Leibniz rule `LocalGaugeDataLeibniz jets`. -/ @[expose] public section @@ -23,8 +23,8 @@ 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 {jets : GaugeJet G 𝔤 G₀ 𝔤J} -variable [GaugeJetLeibniz jets] +variable {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} +variable [LocalGaugeDataLeibniz jets] set_option maxHeartbeats 1000000 diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/Basic.lean index c17cb6f9c..8953ea504 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/Basic.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeJet +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Basic public import Physlib.Mathematics.MultisetAntidiagonal public import Physlib.Relativity.IsLorentzDeriv public import Physlib.Relativity.Tensors.ComplexTensor.Basic @@ -15,10 +15,10 @@ public import Physlib.Relativity.SL2C.Basic /-! # Algebra valued gauge bosons -This file is stated for a supplied gauge-jet package `jets : GaugeJet G 𝔤 G₀ 𝔤J` +This file is stated for a supplied local-gauge-data package `jets : LocalGaugeData G 𝔤 G₀ 𝔤J` (jets of a gauge group `G₀` with Lie algebra `𝔤`), which every declaration below takes -as an argument; the Standard Model package is `StandardModel.gaugeJet` in -`Physlib.Particles.StandardModel.GaugeGroup.GaugeJet`. +as an argument; the Standard Model package is `StandardModel.localGaugeData` in +`Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData`. 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 @@ -69,7 +69,7 @@ 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 {jets : GaugeJet G 𝔤 G₀ 𝔤J} +variable {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} variable (jets) in @@ -91,7 +91,7 @@ lemma adjointDualCoeff_zero (U : G) : 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] + LocalGaugeData.iteratedDeriv_zero, LinearMap.id_coe, id_eq] exact jets.evalLie_adjoint_ofConstantLie U a /-- For a gauge jet whose value at the base point is the identity, the zeroth dual @@ -102,7 +102,7 @@ lemma adjointDualCoeff_zero_of_eval_eq_one {U : G} (hU : (jets.eval U) = 1) : 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 + `∂_μ (Ad_U x) = Ad_U (∂_μ x) − ⁅ω_μ(U), Ad_U x⁆` (`LocalGaugeData.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 @@ -115,7 +115,7 @@ lemma adjointDualCoeff_singleton (U : G) 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, + LocalGaugeData.iteratedDeriv_singleton, LocalGaugeData.iteratedDeriv_zero, LinearMap.id_coe, id_eq] rw [jets.deriv_adjoint, jets.deriv_ofConstantLie, map_zero, zero_sub, map_neg, @@ -124,18 +124,18 @@ lemma adjointDualCoeff_singleton (U : G) section Truncation -variable [GaugeJetTruncation jets] +variable [LocalGaugeDataTruncation jets] /-- **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 jets n) {x : Multiset (Fin 1 ⊕ Fin 3)} + (hU : U ∈ LocalGaugeDataTruncation.truncationKer jets n) {x : Multiset (Fin 1 ⊕ Fin 3)} (hx : x ≠ 0) (hxn : x.card ≤ n) : adjointDualCoeff jets U x = 0 := by refine LinearMap.ext fun φ => LinearMap.ext fun b => ?_ simp only [LinearMap.zero_apply] show φ (jets.evalLie (jets.iteratedDeriv x (jets.adjoint U (jets.ofConstantLie b)))) = 0 - rw [GaugeJetTruncation.evalLie_iteratedDeriv_adjoint_ofConstantLie_eq_zero hU hx hxn b, + rw [LocalGaugeDataTruncation.evalLie_iteratedDeriv_adjoint_ofConstantLie_eq_zero hU hx hxn b, map_zero] end Truncation @@ -248,7 +248,7 @@ lemma repGauge_deriv_apply (hA : IsGaugeField jets repLorentz repGauge A) 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 + LocalGaugeData.iteratedDeriv_singleton] at h refine h.trans ?_ abel @@ -491,13 +491,13 @@ lemma _root_.adjointDualCoeff_pair (U : G) jets.adjoint U (jets.ofConstantLie a)⁆ + ⁅jets.mc U μ, ⁅jets.mc U ρ, jets.adjoint U (jets.ofConstantLie a)⁆⁆ := by - rw [GaugeJet.iteratedDeriv_cons, LinearMap.comp_apply, - GaugeJet.iteratedDeriv_singleton, hderiv μ, map_neg, + rw [LocalGaugeData.iteratedDeriv_cons, LinearMap.comp_apply, + LocalGaugeData.iteratedDeriv_singleton, hderiv μ, map_neg, jets.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, - GaugeJet.iteratedDeriv_zero, GaugeJet.iteratedDeriv_singleton, + LocalGaugeData.iteratedDeriv_zero, LocalGaugeData.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] @@ -532,8 +532,8 @@ lemma repGauge_deriv_deriv_apply (hA : IsGaugeField jets repLorentz repGauge A) 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 + Multiset.sum_cons, Multiset.sum_singleton, LocalGaugeData.iteratedDeriv_cons, + LinearMap.comp_apply, LocalGaugeData.iteratedDeriv_singleton] at h refine h.trans ?_ abel @@ -845,7 +845,7 @@ lemma _root_.adjointTransport_bracket (U : G) jets.evalLie (jets.iteratedDeriv p.2 (jets.adjoint U (jets.ofConstantLie b)))⁆).sum := by rw [jets.ofConstantLie_lie, jets.adjoint_lie, - GaugeJet.iteratedDeriv_bracket, map_multiset_sum, Multiset.map_map] + LocalGaugeData.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]) @@ -931,10 +931,10 @@ lemma _root_.adjointDualCoeff_cons (U : G) (jets.adjoint U (jets.ofConstantLie 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, jets.deriv_adjoint, + LocalGaugeData.iteratedDeriv_add, LinearMap.comp_apply, + LocalGaugeData.iteratedDeriv_singleton, jets.deriv_adjoint, jets.deriv_ofConstantLie, map_zero, zero_sub, map_neg, - GaugeJet.iteratedDeriv_bracket] + LocalGaugeData.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, @@ -963,12 +963,12 @@ lemma _root_.eval_iteratedDeriv_maurerCartan_structure 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] + LocalGaugeData.iteratedDeriv_add, LinearMap.comp_apply, + LocalGaugeData.iteratedDeriv_singleton] have h0 := congrArg (fun z => jets.evalLie (jets.iteratedDeriv s z)) (jets.mc_structure U μ ν) simp only [map_add, map_sub, map_zero] at h0 - rw [hconv, hconv, GaugeJet.iteratedDeriv_bracket, map_multiset_sum, + rw [hconv, hconv, LocalGaugeData.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 ?_ diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/FieldStrength.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/FieldStrength.lean index 261969226..d7ffceb5c 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/FieldStrength.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/FieldStrength.lean @@ -37,7 +37,7 @@ 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 {jets : GaugeJet G 𝔤 G₀ 𝔤J} +variable {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} namespace IsGaugeField diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/TransformsInAdjoint.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/TransformsInAdjoint.lean index 8dc294004..618b5ef44 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/TransformsInAdjoint.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/TransformsInAdjoint.lean @@ -33,7 +33,7 @@ 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 {jets : GaugeJet G 𝔤 G₀ 𝔤J} +variable {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} namespace IsGaugeField diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeJet.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Basic.lean similarity index 84% rename from Physlib/ClassicalFieldTheory/GaugeTheory/GaugeJet.lean rename to Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Basic.lean index 43d5ce802..949c2d720 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeJet.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Basic.lean @@ -10,7 +10,7 @@ public import Mathlib.RepresentationTheory.Basic public import Mathlib.Algebra.Group.Subgroup.Basic public import Physlib.Relativity.DerivAlgebra /-! -# Jets of a gauge group +# Local gauge data ## i. Overview @@ -19,8 +19,8 @@ local Lagrangian sees of it is its *jet* at the base point. The jet gauge transf 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 structure `GaugeJet G 𝔤 G₀ 𝔤J`, exactly the structure of this -situation that the transformation laws of gauge fields and matter fields use: +This file records, as the structure `LocalGaugeData 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; @@ -30,41 +30,41 @@ situation that the transformation laws of gauge fields and matter fields use: * 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. -A term `jets : GaugeJet G 𝔤 G₀ 𝔤J` is supplied, not inferred: every construction below, -and every construction downstream, takes the package it works over as an ordinary +A term `jets : LocalGaugeData G 𝔤 G₀ 𝔤J` is supplied, not inferred: every construction +below, and every construction downstream, takes the package it works over as an ordinary argument. The four carriers do not determine it — a truncated jet group beside the full one is the same four carriers with different data — so there is nothing canonical for instance search to choose. 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`), packaged as `StandardModel.gaugeJet`; nothing here +(`StandardModel.JetGaugeGroupI`), packaged as `StandardModel.localGaugeData`; nothing here depends on that choice. ## ii. Key results -- `GaugeJet` : the structure. -- `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 of a given package, - 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. +- `LocalGaugeData` : the structure. +- `LocalGaugeData.iteratedDeriv` : the iterated derivative `∂_s` on `𝔤J` along a multiset + of directions, with `iteratedDeriv_cons`, `iteratedDeriv_add` and the iterated Leibniz + rule `iteratedDeriv_bracket`. +- `LocalGaugeDataLeibniz` : the Taylor–Leibniz rule for the adjoint action of a given + package, the input to the gauge action on the algebra of gauge-boson symbols. +- `LocalGaugeDataTruncation` : 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` +/-- **Local gauge data.** 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. This is data attached to the four carriers, not a property of them, and it is passed - explicitly: the generic theory takes `jets : GaugeJet G 𝔤 G₀ 𝔤J` as an argument rather + explicitly: the generic theory takes `jets : LocalGaugeData G 𝔤 G₀ 𝔤J` as an argument rather than searching for it. -/ -structure GaugeJet (G : Type) [Group G] (𝔤 : Type) [LieRing 𝔤] [LieAlgebra ℝ 𝔤] +structure LocalGaugeData (G : Type) [Group G] (𝔤 : Type) [LieRing 𝔤] [LieAlgebra ℝ 𝔤] (G₀ : Type) [Group G₀] (𝔤J : Type) [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] where /-- Evaluation of a gauge jet at the base point. -/ eval : G →* G₀ @@ -103,11 +103,11 @@ structure GaugeJet (G : Type) [Group G] (𝔤 : Type) [LieRing 𝔤] [LieAlgebra evalLie_adjoint_ofConstantLie : ∀ (U : G) (a : 𝔤), evalLie (adjoint U (ofConstantLie a)) = adjointValue (eval U) a -namespace GaugeJet +namespace LocalGaugeData variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - (jets : GaugeJet G 𝔤 G₀ 𝔤J) + (jets : LocalGaugeData G 𝔤 G₀ 𝔤J) /-- A constant jet evaluates to its constant. -/ lemma evalLie_ofConstantLie (a : 𝔤) : jets.evalLie (jets.ofConstantLie a) = a := by @@ -210,9 +210,9 @@ lemma iteratedDeriv_ofConstantLie_of_ne_zero {p : Multiset (Fin 1 ⊕ Fin 3)} (h · rw [iteratedDeriv_zero, LinearMap.id_apply, deriv_ofConstantLie] · rw [ih ht, map_zero] -TODO "Add product of GaugeJet." +TODO "Add product of LocalGaugeData." -end GaugeJet +end LocalGaugeData /-! @@ -220,7 +220,7 @@ end GaugeJet -/ -/-- **The Taylor–Leibniz rule for the adjoint action** of a gauge-jet package `jets`: the +/-- **The Taylor–Leibniz rule for the adjoint action** of a local-gauge-data package `jets`: 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 @@ -229,9 +229,9 @@ end GaugeJet It is an extra law of one package, so `jets` is its only explicit parameter and the carriers are read off from it. -/ -class GaugeJetLeibniz {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] +class LocalGaugeDataLeibniz {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - (jets : GaugeJet G 𝔤 G₀ 𝔤J) where + (jets : LocalGaugeData G 𝔤 G₀ 𝔤J) where evalLie_iteratedDeriv_adjoint : ∀ (U : G) (x : Multiset (Fin 1 ⊕ Fin 3)) (Y : 𝔤J), jets.evalLie (jets.iteratedDeriv x (jets.adjoint U Y)) = (x.antidiagonal.map fun p => jets.evalLie (jets.iteratedDeriv p.1 @@ -249,11 +249,11 @@ class GaugeJetLeibniz {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlge derivatives of the adjoint action of order between `1` and `n` vanish at the base point. - Like `GaugeJetLeibniz` this is an extra law of one package `jets`, its only explicit + Like `LocalGaugeDataLeibniz` this is an extra law of one package `jets`, its only explicit parameter. -/ -class GaugeJetTruncation {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] +class LocalGaugeDataTruncation {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - (jets : GaugeJet G 𝔤 G₀ 𝔤J) where + (jets : LocalGaugeData G 𝔤 G₀ 𝔤J) where /-- The subgroup of jets trivial to order `n`. -/ truncationKer : ℕ → Subgroup G evalLie_iteratedDeriv_adjoint_ofConstantLie_eq_zero : ∀ {U : G} {n : ℕ}, diff --git a/Physlib/Particles/StandardModel/GaugeAlgebra/InfinitesimalAction.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/InfinitesimalAction.lean similarity index 71% rename from Physlib/Particles/StandardModel/GaugeAlgebra/InfinitesimalAction.lean rename to Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/InfinitesimalAction.lean index e52150bd0..86c3247f2 100644 --- a/Physlib/Particles/StandardModel/GaugeAlgebra/InfinitesimalAction.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/InfinitesimalAction.lean @@ -5,28 +5,35 @@ 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 +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.TransformsIn +public import Physlib.ClassicalFieldTheory.JetAlgebra.JetComponentSpace.GaugeAction /-! # The infinitesimal action underlying a matter representation ## i. Overview 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`. +an action `act : 𝔤 →ₗ[ℝ] 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 `rep`. +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`. + +Everything is stated over a supplied local-gauge-data package +`jets : LocalGaugeData G 𝔤 G₀ 𝔤J`; nothing depends on the Standard Model choice of it. ## ii. Key results -- `GaugeAlgebra.IsInfinitesimalActionOf` : `act` is the infinitesimal action underlying +- `LocalGaugeData.IsInfinitesimalActionOf` : `act` is the infinitesimal action underlying `rep`. -- `TransformsIn.covDerivAction` : the covariant derivative preserves `TransformsIn`. +- `LocalGaugeData.TransformsIn.covDerivAction` : the covariant derivative preserves + `TransformsIn`. +- `LocalGaugeData.TransformsIn.covDerivIter` : so does every iterated covariant + derivative. +- `LocalGaugeData.IsInfinitesimalActionOf.conj` : the conjugate action underlies the + conjugate representation. ## iii. Table of contents @@ -38,18 +45,23 @@ derivative preserves the gauge tensors, `TransformsIn.covDerivAction`. @[expose] public section -namespace StandardModel +set_option linter.unusedSectionVars false + open Matrix MatrixGroups TensorProduct MvPowerSeries + variable {B : Type} [Ring B] [Algebra ℂ B] variable {V : Type} [AddCommGroup V] [Module ℂ V] +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] +variable {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] +variable {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} -namespace GaugeAlgebra +namespace LocalGaugeData open IsGaugeField 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} +variable {repGauge : Representation ℂ G B} +variable {A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B} /-! @@ -73,32 +85,31 @@ 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) - (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) : Prop where - repCoeff_cons : ∀ (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) - (x : Multiset (Fin 1 ⊕ Fin 3)), +structure IsInfinitesimalActionOf (jets : LocalGaugeData G 𝔤 G₀ 𝔤J) + (act : 𝔤 →ₗ[ℝ] V →ₗ[ℂ] V) + (rep : Representation ℂ G (JetRing ⊗[ℂ] V)) : Prop where + repCoeff_cons : ∀ (U : G) (μ : 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), + act (jets.evalLie (jets.iteratedDeriv p.1 (jets.mc U μ))) ∘ₗ + repCoeff rep U p.2).sum) + repCoeff_act : ∀ (U : G) (x : Multiset (Fin 1 ⊕ Fin 3)) (c : 𝔤), repCoeff rep U x ∘ₗ act c = ((x.antidiagonal.map fun p => - act (adjointCoeff U p.1 c) ∘ₗ repCoeff rep U p.2).sum) + act (adjointCoeff jets 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) + {act : 𝔤 →ₗ[ℝ] V →ₗ[ℂ] V} + {rep : Representation ℂ G (JetRing ⊗[ℂ] V)} + (h : IsInfinitesimalActionOf jets act rep) (U : G) (μ : 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 + repDualCoeff rep U p.2 (φ ∘ₗ act (jets.evalLie + (jets.iteratedDeriv p.1 (jets.mc 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, @@ -117,8 +128,8 @@ lemma IsInfinitesimalActionOf.repDualCoeff_cons section MatterCovariance -variable {rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)} -variable {act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℂ] V} +variable {rep : Representation ℂ G (JetRing ⊗[ℂ] V)} +variable {act : 𝔤 →ₗ[ℝ] V →ₗ[ℂ] V} variable [FiniteDimensional ℂ V] /-- The action of families against the dual representation coefficients: the @@ -127,16 +138,16 @@ variable [FiniteDimensional ℂ V] `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) + (h : IsInfinitesimalActionOf jets act rep) (U : G) + (x : Multiset (Fin 1 ⊕ Fin 3)) (f : Module.Dual ℝ 𝔤 →ₗ[ℝ] 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) + actionFam act (f ∘ₗ adjointDualCoeff jets U p.1) (g ∘ₗ repDualCoeff rep U p.2) φ).sum := by - have hT : ∀ (c : GaugeAlgebra) (v : V), repCoeff rep U x (act c v) = + have hT : ∀ (c : 𝔤) (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 + act (adjointCoeff jets 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, @@ -146,7 +157,7 @@ lemma IsInfinitesimalActionOf.actionFam_repDualCoeff 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, + ← tensorAction_map_right_antidiagonal act (adjointCoeff jets 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] @@ -158,11 +169,11 @@ omit [FiniteDimensional ℂ V] in 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 _root_.StandardModel.TransformsIn.repGauge_cons +lemma 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)) + (hact : IsInfinitesimalActionOf jets act rep) + (U : G) (κ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V) : repGauge U (F (κ ::ₘ s) φ) = (s.antidiagonal.map fun p => @@ -170,8 +181,8 @@ lemma _root_.StandardModel.TransformsIn.repGauge_cons - (s.antidiagonal.map fun p => (p.1.antidiagonal.map fun q => F p.2 (repDualCoeff rep U⁻¹ q.2 - (φ ∘ₗ act (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv q.1 - (maurerCartanForm U⁻¹ κ)))))).sum).sum := by + (φ ∘ₗ act (jets.evalLie (jets.iteratedDeriv q.1 + (jets.mc 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] @@ -180,8 +191,8 @@ lemma _root_.StandardModel.TransformsIn.repGauge_cons -(s.antidiagonal.map fun p => (p.1.antidiagonal.map fun q => F p.2 (repDualCoeff rep U⁻¹ q.2 - (φ ∘ₗ act (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv q.1 - (maurerCartanForm U⁻¹ κ)))))).sum).sum := by + (φ ∘ₗ act (jets.evalLie (jets.iteratedDeriv q.1 + (jets.mc 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_multiset_sum, Multiset.map_map] @@ -194,12 +205,12 @@ set_option maxHeartbeats 2000000 in convolution through `act` survives — the analogue of `TransformsInAdjoint.repGauge_bracketFamConv` with a matter field in the second slot. -/ -lemma _root_.StandardModel.TransformsIn.repGauge_actionFamConv - (hA : IsGaugeField repLorentz repGauge A) +lemma TransformsIn.repGauge_actionFamConv + (hA : IsGaugeField jets repLorentz repGauge A) {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) + (hact : IsInfinitesimalActionOf jets act rep) + (U : G) (s : Multiset (Fin 1 ⊕ Fin 3)) (ρ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ V) : repGauge U (actionFamConv A act ρ F s φ) = (s.antidiagonal.map fun p => @@ -207,13 +218,13 @@ lemma _root_.StandardModel.TransformsIn.repGauge_actionFamConv + (s.antidiagonal.map fun p => (p.2.antidiagonal.map fun r => F r.2 (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), + (φ ∘ₗ act (jets.evalLie (jets.iteratedDeriv p.1 + (jets.mc 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 (ψ (JetGaugeAlgebra.eval - (JetGaugeAlgebra.iteratedDeriv u (maurerCartanForm U⁻¹ ρ)))) := by + ((u.antidiagonal.map fun q => A q.2 ρ ∘ₗ adjointDualCoeff jets U⁻¹ q.1).sum) ψ + + algebraMap ℂ B (ψ (jets.evalLie + (jets.iteratedDeriv u (jets.mc U⁻¹ ρ)))) := by intro u ψ rw [hA.gauge_apply_deriv U u ρ ψ, Multiset.sum_linearMap_apply, Multiset.map_map] congr 1 @@ -225,13 +236,13 @@ lemma _root_.StandardModel.TransformsIn.repGauge_actionFamConv congr 1 have hMa : (s.antidiagonal.map fun p => actionFam act ((p.1.antidiagonal.map fun q => - A q.2 ρ ∘ₗ adjointDualCoeff U⁻¹ q.1).sum) + A q.2 ρ ∘ₗ adjointDualCoeff jets U⁻¹ q.1).sum) ((p.2.antidiagonal.map fun r => 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 (A q.2 ρ ∘ₗ adjointDualCoeff U⁻¹ q.1) + actionFam act (A q.2 ρ ∘ₗ adjointDualCoeff jets 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, @@ -247,7 +258,7 @@ lemma _root_.StandardModel.TransformsIn.repGauge_actionFamConv (s.antidiagonal.map fun p => (p.1.antidiagonal.map fun q => (p.2.antidiagonal.map fun r => - actionFam act (A r.1 ρ ∘ₗ adjointDualCoeff U⁻¹ q.1) + actionFam act (A r.1 ρ ∘ₗ adjointDualCoeff jets 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 [actionFamConv, Multiset.sum_linearMap_apply, Multiset.map_map, @@ -256,16 +267,16 @@ lemma _root_.StandardModel.TransformsIn.repGauge_actionFamConv 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 (A b ρ ∘ₗ adjointDualCoeff U⁻¹ a) + actionFam act (A b ρ ∘ₗ adjointDualCoeff jets 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 => F r.2 ∘ₗ repDualCoeff rep U⁻¹ r.1).sum) - (φ ∘ₗ act (JetGaugeAlgebra.eval - (JetGaugeAlgebra.iteratedDeriv p.1 (maurerCartanForm U⁻¹ ρ)))) = + (φ ∘ₗ act (jets.evalLie + (jets.iteratedDeriv p.1 (jets.mc U⁻¹ ρ)))) = (p.2.antidiagonal.map fun r => F r.2 (repDualCoeff rep U⁻¹ r.1 - (φ ∘ₗ act (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.1 - (maurerCartanForm U⁻¹ ρ)))))).sum := by + (φ ∘ₗ act (jets.evalLie (jets.iteratedDeriv p.1 + (jets.mc U⁻¹ ρ)))))).sum := by intro p rw [Multiset.sum_linearMap_apply, Multiset.map_map] refine congrArg Multiset.sum (Multiset.map_congr rfl fun r hr => ?_) @@ -284,16 +295,16 @@ 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 _root_.StandardModel.TransformsIn.covDerivAction - (hA : IsGaugeField repLorentz repGauge A) +theorem TransformsIn.covDerivAction + (hA : IsGaugeField jets repLorentz repGauge A) {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B} (hF : TransformsIn repGauge rep F) - (hact : IsInfinitesimalActionOf act rep) (ρ : Fin 1 ⊕ Fin 3) : + (hact : IsInfinitesimalActionOf jets act rep) (ρ : Fin 1 ⊕ Fin 3) : 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 - rw [covDerivAction_apply, map_add] + rw [IsGaugeField.covDerivAction_apply, map_add] have hR : (s.antidiagonal.map fun p => IsGaugeField.covDerivAction A act F ρ p.2 (repDualCoeff rep U⁻¹ p.1 φ)).sum = (s.antidiagonal.map fun p => @@ -302,21 +313,21 @@ theorem _root_.StandardModel.TransformsIn.covDerivAction 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] + rw [IsGaugeField.covDerivAction_apply] have hcancel : (s.antidiagonal.map fun p => (p.1.antidiagonal.map fun q => F p.2 (repDualCoeff rep U⁻¹ q.2 - (φ ∘ₗ act (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv q.1 - (maurerCartanForm U⁻¹ ρ)))))).sum).sum = + (φ ∘ₗ act (jets.evalLie (jets.iteratedDeriv q.1 + (jets.mc U⁻¹ ρ)))))).sum).sum = (s.antidiagonal.map fun p => (p.2.antidiagonal.map fun r => F r.2 (repDualCoeff rep U⁻¹ r.1 - (φ ∘ₗ act (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p.1 - (maurerCartanForm U⁻¹ ρ)))))).sum).sum := + (φ ∘ₗ act (jets.evalLie (jets.iteratedDeriv p.1 + (jets.mc U⁻¹ ρ)))))).sum).sum := Multiset.sum_antidiagonal_assoc s (fun a b c => F c (repDualCoeff rep U⁻¹ b - (φ ∘ₗ act (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv a - (maurerCartanForm U⁻¹ ρ)))))) + (φ ∘ₗ act (jets.evalLie (jets.iteratedDeriv a + (jets.mc U⁻¹ ρ)))))) rw [hL, hF.repGauge_cons hact U ρ s φ, hF.repGauge_actionFamConv hA hact U s ρ φ, hR, hcancel] abel @@ -325,11 +336,11 @@ theorem _root_.StandardModel.TransformsIn.covDerivAction 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) +theorem TransformsIn.covDerivIter + (hA : IsGaugeField jets repLorentz repGauge A) {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B} (hF : TransformsIn repGauge rep F) - (hact : IsInfinitesimalActionOf act rep) + (hact : IsInfinitesimalActionOf jets act rep) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : TransformsIn repGauge rep (IsGaugeField.covDerivIter A act F n l) := by induction n with @@ -337,26 +348,6 @@ theorem _root_.StandardModel.TransformsIn.covDerivIter | 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 /-! @@ -369,20 +360,20 @@ section ConjugateAction /-- **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 +noncomputable def actionConj (act : 𝔤 →ₗ[ℝ] V →ₗ[ℂ] V) : + 𝔤 →ₗ[ℝ] 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) : +lemma actionConj_apply (act : 𝔤 →ₗ[ℝ] V →ₗ[ℂ] V) (c : 𝔤) : 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. -/ + `JetComponentSpace.repConj` carries the conjugated representation. -/ noncomputable def conjJetEquiv : ConjModule (JetRing ⊗[ℂ] V) ≃ₗ[ℂ] JetRing ⊗[ℂ] ConjModule V := (ConjModule.tensorEquiv (k := ℂ) (M := JetRing) (N := V)).symm.trans @@ -397,13 +388,14 @@ lemma conjJetEquiv_conjEquiv_tmul (g : JetRing) (u : V) : section ConjRep -variable {rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)} -variable {act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℂ] V} +variable {rep : Representation ℂ G (JetRing ⊗[ℂ] V)} +variable {act : 𝔤 →ₗ[ℝ] 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)) +lemma repConj_conjJetEquiv (rep : Representation ℂ G (JetRing ⊗[ℂ] V)) + (U : G) (w : JetRing ⊗[ℂ] V) : + JetComponentSpace.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)))) = _ @@ -413,9 +405,10 @@ lemma repConj_conjJetEquiv (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗ /-- **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 +lemma repCoeff_repConj (rep : Representation ℂ G (JetRing ⊗[ℂ] V)) + (U : G) (x : Multiset (Fin 1 ⊕ Fin 3)) : + repCoeff (JetComponentSpace.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), @@ -455,23 +448,24 @@ lemma repCoeff_repConj (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ (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))) = _ + show jetEval (jetIteratedDeriv x + (JetComponentSpace.repConj rep U (jetOfConstant v))) = _ 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} +lemma repCoeff_repConj_zero_eq_id {W : G} (hrep : repCoeff rep W 0 = LinearMap.id) : - repCoeff (repConj rep) W 0 = LinearMap.id := by + repCoeff (JetComponentSpace.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 inputs are real. -/ -theorem IsInfinitesimalActionOf.conj (h : IsInfinitesimalActionOf act rep) : - IsInfinitesimalActionOf (actionConj act) (repConj rep) := by +theorem IsInfinitesimalActionOf.conj (h : IsInfinitesimalActionOf jets act rep) : + IsInfinitesimalActionOf jets (actionConj act) (JetComponentSpace.repConj rep) := by constructor · intro U μ x rw [repCoeff_repConj, h.repCoeff_cons U μ x, ConjModule.endConj_neg, @@ -492,6 +486,4 @@ end ConjRep end ConjugateAction -end GaugeAlgebra - -end StandardModel +end LocalGaugeData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/TransformsIn.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/TransformsIn.lean new file mode 100644 index 000000000..9575aa0e4 --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/TransformsIn.lean @@ -0,0 +1,92 @@ +/- +Copyright (c) 2026 Joseph Tooby-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.CovariantDeriv +/-! +# Gauge tensors in a representation + +## i. Overview + +A matter field valued in a representation space `V` has symbols `[∂_s ψ^i]` contracted +against duals of `V`. It is a *gauge tensor* — it *transforms in* the representation +`rep` of the jet gauge group — when each derivative symbol transforms by the Leibniz +convolution of the base-point Taylor coefficients `repDualCoeff` of `rep` against the +lower symbols, with no inhomogeneous term. This is the generalization of +`TransformsInAdjoint` from the adjoint representation to an arbitrary one, and the +property preserved by the covariant derivative in +`Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction`. + +Nothing here depends on the local gauge data beyond the group `G` acting; the definition +lives in the `LocalGaugeData` namespace with the transformation laws that consume it. + +## ii. Key results + +- `LocalGaugeData.TransformsIn` : the gauge tensors of a representation. +- `LocalGaugeData.TransformsIn.repGauge_zero` : the underived symbol transforms through + the base-point value of the gauge jet alone. +- `LocalGaugeData.TransformsIn.repGauge_eq_of_eval_eq_one` : a jet with trivial base-point + value fixes the underived symbol, when the representation is trivial on such jets. + +-/ + +@[expose] public section + +set_option linter.unusedSectionVars false + +open Matrix MatrixGroups TensorProduct MvPowerSeries + +variable {B : Type} [Ring B] [Algebra ℂ B] +variable {V : Type} [AddCommGroup V] [Module ℂ V] +variable {G : Type} [Group G] + +namespace LocalGaugeData + +open IsGaugeField + +/-- 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 `AlgebraRealization`. -/ +def 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 + +variable {repGauge : Representation ℂ G B} + {rep : Representation ℂ G (JetRing ⊗[ℂ] V)} + {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B} + +/-- A matter gauge tensor transforms at the base point through the dual coefficient of the + base-point value of the gauge jet alone: the antidiagonal of the empty multiset has a + single term. -/ +lemma TransformsIn.repGauge_zero (hF : TransformsIn repGauge rep F) (U : G) + (φ : Module.Dual ℂ V) : + repGauge U (F 0 φ) = F 0 (repDualCoeff rep U⁻¹ 0 φ) := by + simpa only [Multiset.antidiagonal_zero, Multiset.map_singleton, + Multiset.sum_singleton] using hF U φ 0 + +/-- **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 TransformsIn.repGauge_eq_of_eval_eq_one {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} (hF : TransformsIn repGauge rep F) + (hrep : ∀ {W : G}, jets.eval W = 1 → repCoeff rep W 0 = LinearMap.id) + {U : G} (hU : jets.eval U = 1) (φ : Module.Dual ℂ V) : + repGauge U (F 0 φ) = F 0 φ := by + have hinv : jets.eval U⁻¹ = 1 := by rw [map_inv, hU, inv_one] + rw [hF.repGauge_zero U φ, + show repDualCoeff rep U⁻¹ 0 = (repCoeff rep U⁻¹ 0).dualMap from rfl, hrep hinv] + rfl + +end LocalGaugeData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/Matter/Charge.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/Matter/Charge.lean index 865f5d1af..9fbf0587c 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/Matter/Charge.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/Matter/Charge.lean @@ -104,7 +104,7 @@ lemma chargeRep_smul (n : ℤ) (U : unitary JetRing) (χ : JetRing) (z : JetRing data below depends on `jets` beyond that, so it is supplied polymorphically. -/ noncomputable def charged {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - (jets : GaugeJet (unitary JetRing) 𝔤 G₀ 𝔤J) [Module.Free ℂ V] [Module.Finite ℂ V] + (jets : LocalGaugeData (unitary JetRing) 𝔤 G₀ 𝔤J) [Module.Free ℂ V] [Module.Finite ℂ V] (repLorentz : Representation ℂ SL(2,ℂ) V) (n : ℤ) (w : ℕ) : MatterField jets where V := V @@ -116,7 +116,7 @@ noncomputable def charged {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] @[simp] lemma charged_V {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - (jets : GaugeJet (unitary JetRing) 𝔤 G₀ 𝔤J) [Module.Free ℂ V] [Module.Finite ℂ V] + (jets : LocalGaugeData (unitary JetRing) 𝔤 G₀ 𝔤J) [Module.Free ℂ V] [Module.Finite ℂ V] (repLorentz : Representation ℂ SL(2,ℂ) V) (n : ℤ) (w : ℕ) : (charged jets repLorentz n w).V = V := rfl diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/Matter/CovariantDeriv.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/Matter/CovariantDeriv.lean index 43491048c..d2c3d136a 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/Matter/CovariantDeriv.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/Matter/CovariantDeriv.lean @@ -32,9 +32,9 @@ 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 gauge tensors of a representation themselves — `LocalGaugeData.TransformsIn`, the +generalization of `TransformsInAdjoint` — are defined on top of `repDualCoeff` in +`Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.TransformsIn`. ## The covariant derivative @@ -50,7 +50,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.GaugeAlgebra.InfinitesimalAction`. +in `Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction`. -/ @@ -62,7 +62,7 @@ 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 {jets : GaugeJet G 𝔤 G₀ 𝔤J} +variable {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} variable {V : Type} [AddCommGroup V] [Module ℂ V] namespace IsGaugeField @@ -108,20 +108,6 @@ noncomputable def repDualCoeff (rep : Representation ℂ G (JetRing ⊗[ℂ] V)) 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 `AlgebraRealization`. -/ -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 @@ -667,7 +653,7 @@ end Action section Leibniz -variable [GaugeJetLeibniz jets] +variable [LocalGaugeDataLeibniz jets] /-- **The adjoint Taylor coefficients are multiplicative up to convolution**: the coefficient of a product of jets of gauge transformations is the antidiagonal @@ -683,7 +669,7 @@ lemma adjointCoeff_mul (U V : G) (x : Multiset (Fin 1 ⊕ Fin 3)) : rw [adjointCoeff] simp only [LinearMap.coe_comp, Function.comp_apply, LieHom.coe_toLinearMap, map_mul, Module.End.mul_apply], - GaugeJetLeibniz.evalLie_iteratedDeriv_adjoint] + LocalGaugeDataLeibniz.evalLie_iteratedDeriv_adjoint] exact congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => by rw [Function.comp_apply, LinearMap.comp_apply] rfl) @@ -696,7 +682,7 @@ lemma adjointCoeff_one (p : Multiset (Fin 1 ⊕ Fin 3)) : 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, + · rw [LocalGaugeData.iteratedDeriv_zero, LinearMap.id_apply, LocalGaugeData.evalLie_ofConstantLie, if_pos rfl, LinearMap.id_apply] · rw [jets.iteratedDeriv_ofConstantLie_of_ne_zero hp, map_zero, if_neg hp, LinearMap.zero_apply] diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Basic.lean index fd376d528..ba8bf17d9 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Basic.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeJet +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction public import Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.ConstantGaugeAction public import Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.LorentzAction public import Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.MassDim @@ -20,7 +20,7 @@ finite-dimensional complex vector space `V` in which the field takes its values, 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. -All of this is relative to a gauge context `jets : GaugeJet G 𝔤 G₀ 𝔤J`: the jet gauge +All of this is relative to a gauge context `jets : LocalGaugeData G 𝔤 G₀ 𝔤J`: the jet gauge group `G` the field's jet action is a representation of, and the global group `G₀`, Lie algebras `𝔤`, `𝔤J` and structure maps that make `G` the jets of `G₀` rather than an unrelated group. Fixing `jets` rather than `G` alone is what lets the global gauge action @@ -58,13 +58,14 @@ open Matrix MatrixGroups TensorProduct -/ -/-- **A matter field** of a gauge theory over the gauge context `jets : GaugeJet G 𝔤 G₀ 𝔤J`: +/-- **A matter field** of a gauge theory over the gauge context `jets : LocalGaugeData G 𝔤 G₀ 𝔤J`: 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`). -/ + fibrewise action of `G` on the jets `JetRing ⊗[ℂ] V` of the field, the infinitesimal + action of the gauge algebra generating it, and the mass weight of the field (in the units + in which a derivative has weight `2`). -/ structure MatterField {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - (jets : GaugeJet G 𝔤 G₀ 𝔤J) where + (jets : LocalGaugeData G 𝔤 G₀ 𝔤J) where /-- The target space of the field. -/ V : Type [instAddCommGroup : AddCommGroup V] @@ -79,6 +80,11 @@ structure MatterField {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlge repAlgebra : 𝔤 →ₗ[ℝ] V →ₗ[ℂ] 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 action of the gauge algebra generates the action of the jets of gauge + transformations: it is the infinitesimal action underlying `repJet`, the physicists' + `i dρ(T^a)`. This is what makes the covariant derivative of the field transform + covariantly. -/ + repAlgebra_isInfinitesimalAction : jets.IsInfinitesimalActionOf repAlgebra repJet /-- The mass weight of the field. -/ massWeight : ℕ @@ -89,7 +95,7 @@ namespace MatterField variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : GaugeJet G 𝔤 G₀ 𝔤J} (M : MatterField jets) + {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} (M : MatterField jets) /-! diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/GaugeFieldData.lean b/Physlib/ClassicalFieldTheory/JetAlgebra/GaugeFieldData.lean index d36459f1a..89a1fc956 100644 --- a/Physlib/ClassicalFieldTheory/JetAlgebra/GaugeFieldData.lean +++ b/Physlib/ClassicalFieldTheory/JetAlgebra/GaugeFieldData.lean @@ -16,8 +16,8 @@ public import Physlib.ClassicalFieldTheory.JetAlgebra.SpeciesGenerators A gauge theory is fixed, before any Lagrangian is chosen, by a gauge context and a matter content. The gauge context is the existing jet data of the gauge group, namely a global group `G₀` with finite-dimensional real Lie algebra `𝔤`, a jet group `G` with jet Lie -algebra `𝔤J`, a gauge-jet package `jets : GaugeJet G 𝔤 G₀ 𝔤J` relating them and its -Taylor–Leibniz law `GaugeJetLeibniz jets`. The matter content is a finite family of +algebra `𝔤J`, a local-gauge-data package `jets : LocalGaugeData G 𝔤 G₀ 𝔤J` relating them and its +Taylor–Leibniz law `LocalGaugeDataLeibniz jets`. The matter content is a finite family of fermionic species and a finite family of bosonic species, each given by an existing `MatterField jets`. @@ -85,7 +85,7 @@ open Matrix MatrixGroups TensorProduct ## A. The gauge context and the field datum The gauge context is the parameter list of the structure below, namely the two groups, the -two Lie algebras, the supplied gauge-jet package `jets` and its Taylor–Leibniz law. It is +two Lie algebras, the supplied local-gauge-data package `jets` and its Taylor–Leibniz law. It is `jets` that makes `𝔤` the gauge algebra of `G` rather than an unrelated Lie algebra, and it is supplied rather than inferred, so a second package over the same carriers is a different context. `GaugeFieldData` adds only the matter content on top of it. @@ -94,12 +94,12 @@ different context. `GaugeFieldData` adds only the matter content on top of it. /-- The field data of a gauge theory. Over a gauge context, given by a jet gauge group `G` with global group `G₀`, a finite-dimensional real gauge algebra `𝔤` with jet algebra - `𝔤J` and a gauge-jet package `jets` over them, it records a finite family of fermionic + `𝔤J` and a local-gauge-data package `jets` over them, it records a finite family of fermionic species and a finite family of bosonic species, each given by an existing `MatterField jets`. Nothing is repeated from `MatterField`, whose fields already carry the value space, the - Lorentz representation, the gauge-jet action and the mass weight of a species. Nothing is + Lorentz representation, the local-gauge-data action and the mass weight of a species. Nothing is repeated from the gauge context either, and the gauge bosons are not a species, since their generator space is determined by `𝔤` alone. @@ -109,7 +109,7 @@ different context. `GaugeFieldData` adds only the matter content on top of it. conditions, none of them imposed here. -/ structure GaugeFieldData {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - (jets : GaugeJet G 𝔤 G₀ 𝔤J) [GaugeJetLeibniz jets] where + (jets : LocalGaugeData G 𝔤 G₀ 𝔤J) [LocalGaugeDataLeibniz jets] where /-- The index type of the fermionic species. -/ FermionSpecies : Type [decidableEqFermionSpecies : DecidableEq FermionSpecies] @@ -131,7 +131,7 @@ namespace GaugeFieldData variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : GaugeJet G 𝔤 G₀ 𝔤J} [GaugeJetLeibniz jets] (T : GaugeFieldData jets) + {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} [LocalGaugeDataLeibniz jets] (T : GaugeFieldData jets) /-! diff --git a/Physlib/Particles/StandardModel/AlgebraRealization/CovStandardModel.lean b/Physlib/Particles/StandardModel/AlgebraRealization/CovStandardModel.lean index d1c65de6b..0718a9b7f 100644 --- a/Physlib/Particles/StandardModel/AlgebraRealization/CovStandardModel.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/CovStandardModel.lean @@ -293,7 +293,7 @@ lemma repDualCoeff_repConj_zero_ofConstant_inv {V : Type} [AddCommGroup V] [Modu 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, + IsGaugeField.repDualCoeff, repCoeff_repConj, repCoeff_zero_ofConstant (hg g⁻¹)] rfl @@ -487,7 +487,7 @@ lemma commute_gaugeSymbol_of_mem_covGenerators (p : Multiset (Fin 1 ⊕ Fin 3)) · exact (h.A_comm_H p ρ ψ s' φ').symm · refine IsGaugeField.commute_of_mem_adjoin ?_ (IsGaugeField.covDerivIter_mem_adjoin_symbols - (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.barH n l 0 φ) + (LocalGaugeData.actionConj HiggsVec.gaugeAlgebraAction) h.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 @@ -503,7 +503,7 @@ lemma commute_gaugeSymbol_of_mem_covGenerators (p : Multiset (Fin 1 ⊕ Fin 3)) · exact (h.A_comm_d p ρ ψ i s' φ').symm · refine IsGaugeField.commute_of_mem_adjoin ?_ (IsGaugeField.covDerivIter_mem_adjoin_symbols - (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (h.bard i) n l 0 φ) + (LocalGaugeData.actionConj DownSinglet.gaugeAlgebraAction) (h.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 @@ -515,7 +515,7 @@ lemma commute_gaugeSymbol_of_mem_covGenerators (p : Multiset (Fin 1 ⊕ Fin 3)) · exact (h.A_comm_u p ρ ψ i s' φ').symm · refine IsGaugeField.commute_of_mem_adjoin ?_ (IsGaugeField.covDerivIter_mem_adjoin_symbols - (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (h.baru i) n l 0 φ) + (LocalGaugeData.actionConj UpSinglet.gaugeAlgebraAction) (h.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 @@ -527,7 +527,7 @@ lemma commute_gaugeSymbol_of_mem_covGenerators (p : Multiset (Fin 1 ⊕ Fin 3)) · exact (h.A_comm_Q p ρ ψ i s' φ').symm · refine IsGaugeField.commute_of_mem_adjoin ?_ (IsGaugeField.covDerivIter_mem_adjoin_symbols - (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (h.barQ i) n l 0 φ) + (LocalGaugeData.actionConj QuarkDoublet.gaugeAlgebraAction) (h.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 @@ -539,7 +539,7 @@ lemma commute_gaugeSymbol_of_mem_covGenerators (p : Multiset (Fin 1 ⊕ Fin 3)) · exact (h.A_comm_L p ρ ψ i s' φ').symm · refine IsGaugeField.commute_of_mem_adjoin ?_ (IsGaugeField.covDerivIter_mem_adjoin_symbols - (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (h.barL i) n l 0 φ) + (LocalGaugeData.actionConj LeptonDoublet.gaugeAlgebraAction) (h.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 @@ -551,7 +551,7 @@ lemma commute_gaugeSymbol_of_mem_covGenerators (p : Multiset (Fin 1 ⊕ Fin 3)) · exact (h.A_comm_e p ρ ψ i s' φ').symm · refine IsGaugeField.commute_of_mem_adjoin ?_ (IsGaugeField.covDerivIter_mem_adjoin_symbols - (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (h.bare i) n l 0 φ) + (LocalGaugeData.actionConj LeptonSinglet.gaugeAlgebraAction) (h.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 @@ -862,7 +862,7 @@ lemma massWeight_covDerivBarH {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) rw [show 2 * (1 + n) = 2 + 2 * n from by ring] exact mem_massWeightEigenspace_iff.mp (h.covDerivIter_zero_mem_massWeightEigenspace - (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.barH 2 + (LocalGaugeData.actionConj HiggsVec.gaugeAlgebraAction) h.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] @@ -887,7 +887,7 @@ lemma massWeight_covDerivBarD (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fi Polynomial.monomial (3 + 2 * n) (h.covDerivBarD i l φ) := by exact mem_massWeightEigenspace_iff.mp (h.covDerivIter_zero_mem_massWeightEigenspace - (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (h.bard i) 3 + (LocalGaugeData.actionConj DownSinglet.gaugeAlgebraAction) (h.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 φ) @@ -910,7 +910,7 @@ lemma massWeight_covDerivBarU (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fi Polynomial.monomial (3 + 2 * n) (h.covDerivBarU i l φ) := by exact mem_massWeightEigenspace_iff.mp (h.covDerivIter_zero_mem_massWeightEigenspace - (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (h.baru i) 3 + (LocalGaugeData.actionConj UpSinglet.gaugeAlgebraAction) (h.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 φ) @@ -933,7 +933,7 @@ lemma massWeight_covDerivBarQ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fi Polynomial.monomial (3 + 2 * n) (h.covDerivBarQ i l φ) := by exact mem_massWeightEigenspace_iff.mp (h.covDerivIter_zero_mem_massWeightEigenspace - (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (h.barQ i) 3 + (LocalGaugeData.actionConj QuarkDoublet.gaugeAlgebraAction) (h.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 φ) @@ -956,7 +956,7 @@ lemma massWeight_covDerivBarL (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fi Polynomial.monomial (3 + 2 * n) (h.covDerivBarL i l φ) := by exact mem_massWeightEigenspace_iff.mp (h.covDerivIter_zero_mem_massWeightEigenspace - (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (h.barL i) 3 + (LocalGaugeData.actionConj LeptonDoublet.gaugeAlgebraAction) (h.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 φ) @@ -979,7 +979,7 @@ lemma massWeight_covDerivBarE (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fi Polynomial.monomial (3 + 2 * n) (h.covDerivBarE i l φ) := by exact mem_massWeightEigenspace_iff.mp (h.covDerivIter_zero_mem_massWeightEigenspace - (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (h.bare i) 3 + (LocalGaugeData.actionConj LeptonSinglet.gaugeAlgebraAction) (h.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 φ) @@ -1195,7 +1195,7 @@ lemma covF_comm_covBarH {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (μ ν : F (ψ : 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) h.barH + h.commute_covF_covDerivIter (LocalGaugeData.actionConj HiggsVec.gaugeAlgebraAction) h.barH h.A_comm_barH l μ ν ψ m l' 0 φ include h in @@ -1213,7 +1213,7 @@ lemma covF_comm_covBarD {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (μ ν : F (ψ : 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) (h.bard i) + h.commute_covF_covDerivIter (LocalGaugeData.actionConj DownSinglet.gaugeAlgebraAction) (h.bard i) (fun p μ ψ t χ => h.A_comm_bard p μ ψ i t χ) l μ ν ψ m l' 0 φ include h in @@ -1231,7 +1231,7 @@ lemma covF_comm_covBarU {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (μ ν : F (ψ : 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) (h.baru i) + h.commute_covF_covDerivIter (LocalGaugeData.actionConj UpSinglet.gaugeAlgebraAction) (h.baru i) (fun p μ ψ t χ => h.A_comm_baru p μ ψ i t χ) l μ ν ψ m l' 0 φ include h in @@ -1249,7 +1249,7 @@ lemma covF_comm_covBarQ {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (μ ν : F (ψ : 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) (h.barQ i) + h.commute_covF_covDerivIter (LocalGaugeData.actionConj QuarkDoublet.gaugeAlgebraAction) (h.barQ i) (fun p μ ψ t χ => h.A_comm_barQ p μ ψ i t χ) l μ ν ψ m l' 0 φ include h in @@ -1267,8 +1267,8 @@ lemma covF_comm_covBarL {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (μ ν : F (ψ : 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) (h.barL i) - (fun p μ ψ t χ => h.A_comm_barL p μ ψ i t χ) l μ ν ψ m l' 0 φ + h.commute_covF_covDerivIter (LocalGaugeData.actionConj LeptonDoublet.gaugeAlgebraAction) + (h.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. -/ @@ -1285,8 +1285,8 @@ lemma covF_comm_covBarE {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (μ ν : F (ψ : 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) (h.bare i) - (fun p μ ψ t χ => h.A_comm_bare p μ ψ i t χ) l μ ν ψ m l' 0 φ + h.commute_covF_covDerivIter (LocalGaugeData.actionConj LeptonSinglet.gaugeAlgebraAction) + (h.bare i) (fun p μ ψ t χ => h.A_comm_bare p μ ψ i t χ) l μ ν ψ m l' 0 φ include h in /-- Two Higgs towers commute. -/ @@ -1303,7 +1303,8 @@ lemma covH_comm_covBarH {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (l' : Fin (φ : Module.Dual ℂ HiggsVec) (φ' : Module.Dual ℂ (ConjModule HiggsVec)) : Commute (h.covDerivH l φ) (h.covDerivBarH l' φ') := h.commute_covDerivIter_covDerivIter HiggsVec.gaugeAlgebraAction h.H - (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.barH h.A_comm_A h.A_comm_H h.A_comm_barH + (LocalGaugeData.actionConj HiggsVec.gaugeAlgebraAction) h.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 @@ -1311,8 +1312,8 @@ include h in 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' φ') := - h.commute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.barH - (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.barH h.A_comm_A h.A_comm_barH + h.commute_covDerivIter_covDerivIter (LocalGaugeData.actionConj HiggsVec.gaugeAlgebraAction) h.barH + (LocalGaugeData.actionConj HiggsVec.gaugeAlgebraAction) h.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 @@ -1331,7 +1332,7 @@ lemma covH_comm_covBarD {n m : ℕ} (i : Fin 3) (l : Fin n → (Fin 1 ⊕ Fin 3) (φ' : Module.Dual ℂ (ConjModule DownSinglet)) : Commute (h.covDerivH l φ) (h.covDerivBarD i l' φ') := h.commute_covDerivIter_covDerivIter HiggsVec.gaugeAlgebraAction h.H - (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (h.bard i) h.A_comm_A h.A_comm_H + (LocalGaugeData.actionConj DownSinglet.gaugeAlgebraAction) (h.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 φ' @@ -1352,7 +1353,7 @@ lemma covH_comm_covBarU {n m : ℕ} (i : Fin 3) (l : Fin n → (Fin 1 ⊕ Fin 3) (φ' : Module.Dual ℂ (ConjModule UpSinglet)) : Commute (h.covDerivH l φ) (h.covDerivBarU i l' φ') := h.commute_covDerivIter_covDerivIter HiggsVec.gaugeAlgebraAction h.H - (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (h.baru i) h.A_comm_A h.A_comm_H + (LocalGaugeData.actionConj UpSinglet.gaugeAlgebraAction) (h.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 φ' @@ -1373,7 +1374,7 @@ lemma covH_comm_covBarQ {n m : ℕ} (i : Fin 3) (l : Fin n → (Fin 1 ⊕ Fin 3) (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)) : Commute (h.covDerivH l φ) (h.covDerivBarQ i l' φ') := h.commute_covDerivIter_covDerivIter HiggsVec.gaugeAlgebraAction h.H - (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (h.barQ i) h.A_comm_A h.A_comm_H + (LocalGaugeData.actionConj QuarkDoublet.gaugeAlgebraAction) (h.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 φ' @@ -1394,7 +1395,7 @@ lemma covH_comm_covBarL {n m : ℕ} (i : Fin 3) (l : Fin n → (Fin 1 ⊕ Fin 3) (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)) : Commute (h.covDerivH l φ) (h.covDerivBarL i l' φ') := h.commute_covDerivIter_covDerivIter HiggsVec.gaugeAlgebraAction h.H - (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (h.barL i) h.A_comm_A h.A_comm_H + (LocalGaugeData.actionConj LeptonDoublet.gaugeAlgebraAction) (h.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 φ' @@ -1415,7 +1416,7 @@ lemma covH_comm_covBarE {n m : ℕ} (i : Fin 3) (l : Fin n → (Fin 1 ⊕ Fin 3) (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)) : Commute (h.covDerivH l φ) (h.covDerivBarE i l' φ') := h.commute_covDerivIter_covDerivIter HiggsVec.gaugeAlgebraAction h.H - (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (h.bare i) h.A_comm_A h.A_comm_H + (LocalGaugeData.actionConj LeptonSinglet.gaugeAlgebraAction) (h.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 φ' @@ -1425,7 +1426,7 @@ 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' φ') := - h.commute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.barH + h.commute_covDerivIter_covDerivIter (LocalGaugeData.actionConj HiggsVec.gaugeAlgebraAction) h.barH DownSinglet.gaugeAlgebraAction (h.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 φ' @@ -1436,8 +1437,8 @@ lemma covBarH_comm_covBarD {n m : ℕ} (i : Fin 3) (l : Fin n → (Fin 1 ⊕ Fin (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule HiggsVec)) (φ' : Module.Dual ℂ (ConjModule DownSinglet)) : Commute (h.covDerivBarH l φ) (h.covDerivBarD i l' φ') := - h.commute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.barH - (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (h.bard i) h.A_comm_A h.A_comm_barH + h.commute_covDerivIter_covDerivIter (LocalGaugeData.actionConj HiggsVec.gaugeAlgebraAction) h.barH + (LocalGaugeData.actionConj DownSinglet.gaugeAlgebraAction) (h.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 φ' @@ -1447,7 +1448,7 @@ 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' φ') := - h.commute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.barH + h.commute_covDerivIter_covDerivIter (LocalGaugeData.actionConj HiggsVec.gaugeAlgebraAction) h.barH UpSinglet.gaugeAlgebraAction (h.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 φ' @@ -1458,8 +1459,8 @@ lemma covBarH_comm_covBarU {n m : ℕ} (i : Fin 3) (l : Fin n → (Fin 1 ⊕ Fin (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule HiggsVec)) (φ' : Module.Dual ℂ (ConjModule UpSinglet)) : Commute (h.covDerivBarH l φ) (h.covDerivBarU i l' φ') := - h.commute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.barH - (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (h.baru i) h.A_comm_A h.A_comm_barH + h.commute_covDerivIter_covDerivIter (LocalGaugeData.actionConj HiggsVec.gaugeAlgebraAction) h.barH + (LocalGaugeData.actionConj UpSinglet.gaugeAlgebraAction) (h.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 φ' @@ -1469,7 +1470,7 @@ 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' φ') := - h.commute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.barH + h.commute_covDerivIter_covDerivIter (LocalGaugeData.actionConj HiggsVec.gaugeAlgebraAction) h.barH QuarkDoublet.gaugeAlgebraAction (h.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 φ' @@ -1480,8 +1481,8 @@ lemma covBarH_comm_covBarQ {n m : ℕ} (i : Fin 3) (l : Fin n → (Fin 1 ⊕ Fin (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule HiggsVec)) (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)) : Commute (h.covDerivBarH l φ) (h.covDerivBarQ i l' φ') := - h.commute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.barH - (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (h.barQ i) h.A_comm_A h.A_comm_barH + h.commute_covDerivIter_covDerivIter (LocalGaugeData.actionConj HiggsVec.gaugeAlgebraAction) h.barH + (LocalGaugeData.actionConj QuarkDoublet.gaugeAlgebraAction) (h.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 φ' @@ -1491,7 +1492,7 @@ 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' φ') := - h.commute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.barH + h.commute_covDerivIter_covDerivIter (LocalGaugeData.actionConj HiggsVec.gaugeAlgebraAction) h.barH LeptonDoublet.gaugeAlgebraAction (h.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 φ' @@ -1502,8 +1503,8 @@ lemma covBarH_comm_covBarL {n m : ℕ} (i : Fin 3) (l : Fin n → (Fin 1 ⊕ Fin (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule HiggsVec)) (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)) : Commute (h.covDerivBarH l φ) (h.covDerivBarL i l' φ') := - h.commute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.barH - (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (h.barL i) h.A_comm_A h.A_comm_barH + h.commute_covDerivIter_covDerivIter (LocalGaugeData.actionConj HiggsVec.gaugeAlgebraAction) h.barH + (LocalGaugeData.actionConj LeptonDoublet.gaugeAlgebraAction) (h.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 φ' @@ -1513,7 +1514,7 @@ 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' φ') := - h.commute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.barH + h.commute_covDerivIter_covDerivIter (LocalGaugeData.actionConj HiggsVec.gaugeAlgebraAction) h.barH LeptonSinglet.gaugeAlgebraAction (h.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 φ' @@ -1524,8 +1525,8 @@ lemma covBarH_comm_covBarE {n m : ℕ} (i : Fin 3) (l : Fin n → (Fin 1 ⊕ Fin (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule HiggsVec)) (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)) : Commute (h.covDerivBarH l φ) (h.covDerivBarE i l' φ') := - h.commute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.barH - (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (h.bare i) h.A_comm_A h.A_comm_barH + h.commute_covDerivIter_covDerivIter (LocalGaugeData.actionConj HiggsVec.gaugeAlgebraAction) h.barH + (LocalGaugeData.actionConj LeptonSinglet.gaugeAlgebraAction) (h.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 φ' @@ -1549,7 +1550,7 @@ lemma covD_anticomm_covBarD (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ h.covDerivD i l φ * h.covDerivBarD j l' φ' = -(h.covDerivBarD j l' φ' * h.covDerivD i l φ) := h.anticommute_covDerivIter_covDerivIter DownSinglet.gaugeAlgebraAction (h.d i) - (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (h.bard j) h.A_comm_A + (LocalGaugeData.actionConj DownSinglet.gaugeAlgebraAction) (h.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 φ' @@ -1572,7 +1573,7 @@ lemma covD_anticomm_covBarU (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ h.covDerivD i l φ * h.covDerivBarU j l' φ' = -(h.covDerivBarU j l' φ' * h.covDerivD i l φ) := h.anticommute_covDerivIter_covDerivIter DownSinglet.gaugeAlgebraAction (h.d i) - (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (h.baru j) h.A_comm_A + (LocalGaugeData.actionConj UpSinglet.gaugeAlgebraAction) (h.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 φ' @@ -1596,7 +1597,7 @@ lemma covD_anticomm_covBarQ (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ h.covDerivD i l φ * h.covDerivBarQ j l' φ' = -(h.covDerivBarQ j l' φ' * h.covDerivD i l φ) := h.anticommute_covDerivIter_covDerivIter DownSinglet.gaugeAlgebraAction (h.d i) - (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (h.barQ j) h.A_comm_A + (LocalGaugeData.actionConj QuarkDoublet.gaugeAlgebraAction) (h.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 φ' @@ -1620,7 +1621,7 @@ lemma covD_anticomm_covBarL (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ h.covDerivD i l φ * h.covDerivBarL j l' φ' = -(h.covDerivBarL j l' φ' * h.covDerivD i l φ) := h.anticommute_covDerivIter_covDerivIter DownSinglet.gaugeAlgebraAction (h.d i) - (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (h.barL j) h.A_comm_A + (LocalGaugeData.actionConj LeptonDoublet.gaugeAlgebraAction) (h.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 φ' @@ -1644,7 +1645,7 @@ lemma covD_anticomm_covBarE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ h.covDerivD i l φ * h.covDerivBarE j l' φ' = -(h.covDerivBarE j l' φ' * h.covDerivD i l φ) := h.anticommute_covDerivIter_covDerivIter DownSinglet.gaugeAlgebraAction (h.d i) - (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (h.bare j) h.A_comm_A + (LocalGaugeData.actionConj LeptonSinglet.gaugeAlgebraAction) (h.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 φ' @@ -1655,8 +1656,8 @@ lemma covBarD_anticomm_covBarD (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 (φ' : Module.Dual ℂ (ConjModule DownSinglet)) : h.covDerivBarD i l φ * h.covDerivBarD j l' φ' = -(h.covDerivBarD j l' φ' * h.covDerivBarD i l φ) := - h.anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) - (h.bard i) (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (h.bard j) h.A_comm_A + h.anticommute_covDerivIter_covDerivIter (LocalGaugeData.actionConj DownSinglet.gaugeAlgebraAction) + (h.bard i) (LocalGaugeData.actionConj DownSinglet.gaugeAlgebraAction) (h.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 φ' @@ -1667,7 +1668,7 @@ lemma covBarD_anticomm_covU (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ (φ' : Module.Dual ℂ UpSinglet) : h.covDerivBarD i l φ * h.covDerivU j l' φ' = -(h.covDerivU j l' φ' * h.covDerivBarD i l φ) := - h.anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) + h.anticommute_covDerivIter_covDerivIter (LocalGaugeData.actionConj DownSinglet.gaugeAlgebraAction) (h.bard i) UpSinglet.gaugeAlgebraAction (h.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 φ' @@ -1679,8 +1680,8 @@ lemma covBarD_anticomm_covBarU (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 (φ' : Module.Dual ℂ (ConjModule UpSinglet)) : h.covDerivBarD i l φ * h.covDerivBarU j l' φ' = -(h.covDerivBarU j l' φ' * h.covDerivBarD i l φ) := - h.anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) - (h.bard i) (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (h.baru j) h.A_comm_A + h.anticommute_covDerivIter_covDerivIter (LocalGaugeData.actionConj DownSinglet.gaugeAlgebraAction) + (h.bard i) (LocalGaugeData.actionConj UpSinglet.gaugeAlgebraAction) (h.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 φ' @@ -1691,7 +1692,7 @@ lemma covBarD_anticomm_covQ (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ (φ' : Module.Dual ℂ QuarkDoublet) : h.covDerivBarD i l φ * h.covDerivQ j l' φ' = -(h.covDerivQ j l' φ' * h.covDerivBarD i l φ) := - h.anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) + h.anticommute_covDerivIter_covDerivIter (LocalGaugeData.actionConj DownSinglet.gaugeAlgebraAction) (h.bard i) QuarkDoublet.gaugeAlgebraAction (h.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 φ' @@ -1703,8 +1704,8 @@ lemma covBarD_anticomm_covBarQ (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)) : h.covDerivBarD i l φ * h.covDerivBarQ j l' φ' = -(h.covDerivBarQ j l' φ' * h.covDerivBarD i l φ) := - h.anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) - (h.bard i) (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (h.barQ j) h.A_comm_A + h.anticommute_covDerivIter_covDerivIter (LocalGaugeData.actionConj DownSinglet.gaugeAlgebraAction) + (h.bard i) (LocalGaugeData.actionConj QuarkDoublet.gaugeAlgebraAction) (h.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 φ' @@ -1715,7 +1716,7 @@ lemma covBarD_anticomm_covL (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ (φ' : Module.Dual ℂ LeptonDoublet) : h.covDerivBarD i l φ * h.covDerivL j l' φ' = -(h.covDerivL j l' φ' * h.covDerivBarD i l φ) := - h.anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) + h.anticommute_covDerivIter_covDerivIter (LocalGaugeData.actionConj DownSinglet.gaugeAlgebraAction) (h.bard i) LeptonDoublet.gaugeAlgebraAction (h.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 φ' @@ -1727,8 +1728,8 @@ lemma covBarD_anticomm_covBarL (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)) : h.covDerivBarD i l φ * h.covDerivBarL j l' φ' = -(h.covDerivBarL j l' φ' * h.covDerivBarD i l φ) := - h.anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) - (h.bard i) (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (h.barL j) h.A_comm_A + h.anticommute_covDerivIter_covDerivIter (LocalGaugeData.actionConj DownSinglet.gaugeAlgebraAction) + (h.bard i) (LocalGaugeData.actionConj LeptonDoublet.gaugeAlgebraAction) (h.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 φ' @@ -1739,7 +1740,7 @@ lemma covBarD_anticomm_covE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ (φ' : Module.Dual ℂ LeptonSinglet) : h.covDerivBarD i l φ * h.covDerivE j l' φ' = -(h.covDerivE j l' φ' * h.covDerivBarD i l φ) := - h.anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) + h.anticommute_covDerivIter_covDerivIter (LocalGaugeData.actionConj DownSinglet.gaugeAlgebraAction) (h.bard i) LeptonSinglet.gaugeAlgebraAction (h.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 φ' @@ -1751,8 +1752,8 @@ lemma covBarD_anticomm_covBarE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)) : h.covDerivBarD i l φ * h.covDerivBarE j l' φ' = -(h.covDerivBarE j l' φ' * h.covDerivBarD i l φ) := - h.anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) - (h.bard i) (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (h.bare j) h.A_comm_A + h.anticommute_covDerivIter_covDerivIter (LocalGaugeData.actionConj DownSinglet.gaugeAlgebraAction) + (h.bard i) (LocalGaugeData.actionConj LeptonSinglet.gaugeAlgebraAction) (h.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 φ' @@ -1775,7 +1776,7 @@ lemma covU_anticomm_covBarU (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ h.covDerivU i l φ * h.covDerivBarU j l' φ' = -(h.covDerivBarU j l' φ' * h.covDerivU i l φ) := h.anticommute_covDerivIter_covDerivIter UpSinglet.gaugeAlgebraAction (h.u i) - (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (h.baru j) h.A_comm_A + (LocalGaugeData.actionConj UpSinglet.gaugeAlgebraAction) (h.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 φ' @@ -1798,7 +1799,7 @@ lemma covU_anticomm_covBarQ (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ h.covDerivU i l φ * h.covDerivBarQ j l' φ' = -(h.covDerivBarQ j l' φ' * h.covDerivU i l φ) := h.anticommute_covDerivIter_covDerivIter UpSinglet.gaugeAlgebraAction (h.u i) - (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (h.barQ j) h.A_comm_A + (LocalGaugeData.actionConj QuarkDoublet.gaugeAlgebraAction) (h.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 φ' @@ -1822,7 +1823,7 @@ lemma covU_anticomm_covBarL (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ h.covDerivU i l φ * h.covDerivBarL j l' φ' = -(h.covDerivBarL j l' φ' * h.covDerivU i l φ) := h.anticommute_covDerivIter_covDerivIter UpSinglet.gaugeAlgebraAction (h.u i) - (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (h.barL j) h.A_comm_A + (LocalGaugeData.actionConj LeptonDoublet.gaugeAlgebraAction) (h.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 φ' @@ -1846,7 +1847,7 @@ lemma covU_anticomm_covBarE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ h.covDerivU i l φ * h.covDerivBarE j l' φ' = -(h.covDerivBarE j l' φ' * h.covDerivU i l φ) := h.anticommute_covDerivIter_covDerivIter UpSinglet.gaugeAlgebraAction (h.u i) - (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (h.bare j) h.A_comm_A + (LocalGaugeData.actionConj LeptonSinglet.gaugeAlgebraAction) (h.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 φ' @@ -1857,8 +1858,8 @@ lemma covBarU_anticomm_covBarU (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 (φ' : Module.Dual ℂ (ConjModule UpSinglet)) : h.covDerivBarU i l φ * h.covDerivBarU j l' φ' = -(h.covDerivBarU j l' φ' * h.covDerivBarU i l φ) := - h.anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) - (h.baru i) (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (h.baru j) h.A_comm_A + h.anticommute_covDerivIter_covDerivIter (LocalGaugeData.actionConj UpSinglet.gaugeAlgebraAction) + (h.baru i) (LocalGaugeData.actionConj UpSinglet.gaugeAlgebraAction) (h.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 φ' @@ -1869,7 +1870,7 @@ lemma covBarU_anticomm_covQ (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ (φ' : Module.Dual ℂ QuarkDoublet) : h.covDerivBarU i l φ * h.covDerivQ j l' φ' = -(h.covDerivQ j l' φ' * h.covDerivBarU i l φ) := - h.anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) + h.anticommute_covDerivIter_covDerivIter (LocalGaugeData.actionConj UpSinglet.gaugeAlgebraAction) (h.baru i) QuarkDoublet.gaugeAlgebraAction (h.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 φ' @@ -1881,8 +1882,8 @@ lemma covBarU_anticomm_covBarQ (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)) : h.covDerivBarU i l φ * h.covDerivBarQ j l' φ' = -(h.covDerivBarQ j l' φ' * h.covDerivBarU i l φ) := - h.anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) - (h.baru i) (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (h.barQ j) h.A_comm_A + h.anticommute_covDerivIter_covDerivIter (LocalGaugeData.actionConj UpSinglet.gaugeAlgebraAction) + (h.baru i) (LocalGaugeData.actionConj QuarkDoublet.gaugeAlgebraAction) (h.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 φ' @@ -1893,7 +1894,7 @@ lemma covBarU_anticomm_covL (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ (φ' : Module.Dual ℂ LeptonDoublet) : h.covDerivBarU i l φ * h.covDerivL j l' φ' = -(h.covDerivL j l' φ' * h.covDerivBarU i l φ) := - h.anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) + h.anticommute_covDerivIter_covDerivIter (LocalGaugeData.actionConj UpSinglet.gaugeAlgebraAction) (h.baru i) LeptonDoublet.gaugeAlgebraAction (h.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 φ' @@ -1905,8 +1906,8 @@ lemma covBarU_anticomm_covBarL (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)) : h.covDerivBarU i l φ * h.covDerivBarL j l' φ' = -(h.covDerivBarL j l' φ' * h.covDerivBarU i l φ) := - h.anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) - (h.baru i) (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (h.barL j) h.A_comm_A + h.anticommute_covDerivIter_covDerivIter (LocalGaugeData.actionConj UpSinglet.gaugeAlgebraAction) + (h.baru i) (LocalGaugeData.actionConj LeptonDoublet.gaugeAlgebraAction) (h.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 φ' @@ -1917,7 +1918,7 @@ lemma covBarU_anticomm_covE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ (φ' : Module.Dual ℂ LeptonSinglet) : h.covDerivBarU i l φ * h.covDerivE j l' φ' = -(h.covDerivE j l' φ' * h.covDerivBarU i l φ) := - h.anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) + h.anticommute_covDerivIter_covDerivIter (LocalGaugeData.actionConj UpSinglet.gaugeAlgebraAction) (h.baru i) LeptonSinglet.gaugeAlgebraAction (h.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 φ' @@ -1929,8 +1930,8 @@ lemma covBarU_anticomm_covBarE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)) : h.covDerivBarU i l φ * h.covDerivBarE j l' φ' = -(h.covDerivBarE j l' φ' * h.covDerivBarU i l φ) := - h.anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) - (h.baru i) (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (h.bare j) h.A_comm_A + h.anticommute_covDerivIter_covDerivIter (LocalGaugeData.actionConj UpSinglet.gaugeAlgebraAction) + (h.baru i) (LocalGaugeData.actionConj LeptonSinglet.gaugeAlgebraAction) (h.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 φ' @@ -1954,7 +1955,7 @@ lemma covQ_anticomm_covBarQ (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ h.covDerivQ i l φ * h.covDerivBarQ j l' φ' = -(h.covDerivBarQ j l' φ' * h.covDerivQ i l φ) := h.anticommute_covDerivIter_covDerivIter QuarkDoublet.gaugeAlgebraAction (h.Q i) - (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (h.barQ j) h.A_comm_A + (LocalGaugeData.actionConj QuarkDoublet.gaugeAlgebraAction) (h.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 φ' @@ -1978,7 +1979,7 @@ lemma covQ_anticomm_covBarL (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ h.covDerivQ i l φ * h.covDerivBarL j l' φ' = -(h.covDerivBarL j l' φ' * h.covDerivQ i l φ) := h.anticommute_covDerivIter_covDerivIter QuarkDoublet.gaugeAlgebraAction (h.Q i) - (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (h.barL j) h.A_comm_A + (LocalGaugeData.actionConj LeptonDoublet.gaugeAlgebraAction) (h.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 φ' @@ -2002,7 +2003,7 @@ lemma covQ_anticomm_covBarE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ h.covDerivQ i l φ * h.covDerivBarE j l' φ' = -(h.covDerivBarE j l' φ' * h.covDerivQ i l φ) := h.anticommute_covDerivIter_covDerivIter QuarkDoublet.gaugeAlgebraAction (h.Q i) - (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (h.bare j) h.A_comm_A + (LocalGaugeData.actionConj LeptonSinglet.gaugeAlgebraAction) (h.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 φ' @@ -2013,8 +2014,9 @@ lemma covBarQ_anticomm_covBarQ (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)) : h.covDerivBarQ i l φ * h.covDerivBarQ j l' φ' = -(h.covDerivBarQ j l' φ' * h.covDerivBarQ i l φ) := - h.anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) - (h.barQ i) (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (h.barQ j) h.A_comm_A + h.anticommute_covDerivIter_covDerivIter + (LocalGaugeData.actionConj QuarkDoublet.gaugeAlgebraAction) + (h.barQ i) (LocalGaugeData.actionConj QuarkDoublet.gaugeAlgebraAction) (h.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 φ' @@ -2025,7 +2027,8 @@ lemma covBarQ_anticomm_covL (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ (φ' : Module.Dual ℂ LeptonDoublet) : h.covDerivBarQ i l φ * h.covDerivL j l' φ' = -(h.covDerivL j l' φ' * h.covDerivBarQ i l φ) := - h.anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) + h.anticommute_covDerivIter_covDerivIter + (LocalGaugeData.actionConj QuarkDoublet.gaugeAlgebraAction) (h.barQ i) LeptonDoublet.gaugeAlgebraAction (h.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 φ' @@ -2037,8 +2040,9 @@ lemma covBarQ_anticomm_covBarL (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)) : h.covDerivBarQ i l φ * h.covDerivBarL j l' φ' = -(h.covDerivBarL j l' φ' * h.covDerivBarQ i l φ) := - h.anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) - (h.barQ i) (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (h.barL j) h.A_comm_A + h.anticommute_covDerivIter_covDerivIter + (LocalGaugeData.actionConj QuarkDoublet.gaugeAlgebraAction) + (h.barQ i) (LocalGaugeData.actionConj LeptonDoublet.gaugeAlgebraAction) (h.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 φ' @@ -2049,7 +2053,8 @@ lemma covBarQ_anticomm_covE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ (φ' : Module.Dual ℂ LeptonSinglet) : h.covDerivBarQ i l φ * h.covDerivE j l' φ' = -(h.covDerivE j l' φ' * h.covDerivBarQ i l φ) := - h.anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) + h.anticommute_covDerivIter_covDerivIter + (LocalGaugeData.actionConj QuarkDoublet.gaugeAlgebraAction) (h.barQ i) LeptonSinglet.gaugeAlgebraAction (h.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 φ' @@ -2061,8 +2066,9 @@ lemma covBarQ_anticomm_covBarE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)) : h.covDerivBarQ i l φ * h.covDerivBarE j l' φ' = -(h.covDerivBarE j l' φ' * h.covDerivBarQ i l φ) := - h.anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) - (h.barQ i) (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (h.bare j) h.A_comm_A + h.anticommute_covDerivIter_covDerivIter + (LocalGaugeData.actionConj QuarkDoublet.gaugeAlgebraAction) + (h.barQ i) (LocalGaugeData.actionConj LeptonSinglet.gaugeAlgebraAction) (h.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 φ' @@ -2086,7 +2092,7 @@ lemma covL_anticomm_covBarL (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ h.covDerivL i l φ * h.covDerivBarL j l' φ' = -(h.covDerivBarL j l' φ' * h.covDerivL i l φ) := h.anticommute_covDerivIter_covDerivIter LeptonDoublet.gaugeAlgebraAction (h.L i) - (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (h.barL j) h.A_comm_A + (LocalGaugeData.actionConj LeptonDoublet.gaugeAlgebraAction) (h.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 φ' @@ -2110,7 +2116,7 @@ lemma covL_anticomm_covBarE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ h.covDerivL i l φ * h.covDerivBarE j l' φ' = -(h.covDerivBarE j l' φ' * h.covDerivL i l φ) := h.anticommute_covDerivIter_covDerivIter LeptonDoublet.gaugeAlgebraAction (h.L i) - (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (h.bare j) h.A_comm_A + (LocalGaugeData.actionConj LeptonSinglet.gaugeAlgebraAction) (h.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 φ' @@ -2121,8 +2127,9 @@ lemma covBarL_anticomm_covBarL (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)) : h.covDerivBarL i l φ * h.covDerivBarL j l' φ' = -(h.covDerivBarL j l' φ' * h.covDerivBarL i l φ) := - h.anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) - (h.barL i) (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (h.barL j) h.A_comm_A + h.anticommute_covDerivIter_covDerivIter + (LocalGaugeData.actionConj LeptonDoublet.gaugeAlgebraAction) + (h.barL i) (LocalGaugeData.actionConj LeptonDoublet.gaugeAlgebraAction) (h.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 φ' @@ -2133,7 +2140,8 @@ lemma covBarL_anticomm_covE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ (φ' : Module.Dual ℂ LeptonSinglet) : h.covDerivBarL i l φ * h.covDerivE j l' φ' = -(h.covDerivE j l' φ' * h.covDerivBarL i l φ) := - h.anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) + h.anticommute_covDerivIter_covDerivIter + (LocalGaugeData.actionConj LeptonDoublet.gaugeAlgebraAction) (h.barL i) LeptonSinglet.gaugeAlgebraAction (h.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 φ' @@ -2145,8 +2153,9 @@ lemma covBarL_anticomm_covBarE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)) : h.covDerivBarL i l φ * h.covDerivBarE j l' φ' = -(h.covDerivBarE j l' φ' * h.covDerivBarL i l φ) := - h.anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) - (h.barL i) (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (h.bare j) h.A_comm_A + h.anticommute_covDerivIter_covDerivIter + (LocalGaugeData.actionConj LeptonDoublet.gaugeAlgebraAction) + (h.barL i) (LocalGaugeData.actionConj LeptonSinglet.gaugeAlgebraAction) (h.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 φ' @@ -2170,7 +2179,7 @@ lemma covE_anticomm_covBarE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ h.covDerivE i l φ * h.covDerivBarE j l' φ' = -(h.covDerivBarE j l' φ' * h.covDerivE i l φ) := h.anticommute_covDerivIter_covDerivIter LeptonSinglet.gaugeAlgebraAction (h.e i) - (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (h.bare j) h.A_comm_A + (LocalGaugeData.actionConj LeptonSinglet.gaugeAlgebraAction) (h.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 φ' @@ -2181,8 +2190,9 @@ lemma covBarE_anticomm_covBarE (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)) : h.covDerivBarE i l φ * h.covDerivBarE j l' φ' = -(h.covDerivBarE j l' φ' * h.covDerivBarE i l φ) := - h.anticommute_covDerivIter_covDerivIter (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) - (h.bare i) (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (h.bare j) h.A_comm_A + h.anticommute_covDerivIter_covDerivIter + (LocalGaugeData.actionConj LeptonSinglet.gaugeAlgebraAction) + (h.bare i) (LocalGaugeData.actionConj LeptonSinglet.gaugeAlgebraAction) (h.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 φ' diff --git a/Physlib/Particles/StandardModel/AlgebraRealization/CovariantDeriv.lean b/Physlib/Particles/StandardModel/AlgebraRealization/CovariantDeriv.lean index 2185db9e0..09f4d1748 100644 --- a/Physlib/Particles/StandardModel/AlgebraRealization/CovariantDeriv.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/CovariantDeriv.lean @@ -5,6 +5,7 @@ Authors: Joseph Tooby-Smith -/ module public import Physlib.Particles.StandardModel.AlgebraRealization.Commutations +public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData /-! # The covariant derivatives of a Standard Model @@ -922,17 +923,6 @@ lemma commute_covDerivIter rintro y (⟨s, μ', ψ', rfl⟩ | ⟨s, φ', rfl⟩) exacts [hAA s p μ' μ ψ' ψ, (hAF p μ ψ s φ').symm] -omit [FiniteDimensional ℂ V] in -/-- A matter gauge tensor transforms at the base point through the dual coefficient of the - base-point value of the gauge jet alone. -/ -lemma _root_.StandardModel.TransformsIn.repGauge_zero - {rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)} - {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B} (hF : TransformsIn repGauge rep F) - (U : JetGaugeGroupI) (φ : Module.Dual ℂ V) : - repGauge U (F 0 φ) = F 0 (repDualCoeff rep U⁻¹ 0 φ) := by - simpa only [Multiset.antidiagonal_zero, Multiset.map_singleton, Multiset.sum_singleton] using - hF U φ 0 - /-- An adjoint gauge tensor transforms at the base point through the dual adjoint coefficient of the base-point value of the gauge jet alone. -/ lemma TransformsInAdjoint.repGauge_zero @@ -951,7 +941,7 @@ end IsGaugeField The field algebra is the algebra generated by every derivative symbol of the theory. The covariant towers are the iterated covariant derivatives of the twelve matter families along ordered tuples of directions, evaluated at the empty multiset, each built with the -infinitesimal action of its species (`GaugeAlgebra.actionConj` of it for a conjugate +infinitesimal action of its species (`LocalGaugeData.actionConj` of it for a conjugate family), together with the iterated covariant derivative of the field strength along a list of directions. The set `matterTowers` collects the twelve matter towers, and `matterTowers_induction` is the case split over them that the rest of the file runs. @@ -992,7 +982,7 @@ noncomputable def covDerivH {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : /-- The iterated covariant derivative of the conjugate Higgs field. -/ noncomputable def covDerivBarH {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : Module.Dual ℂ (ConjModule HiggsVec) →ₗ[ℂ] B := - IsGaugeField.covDerivIter h.A (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) h.barH n l 0 + IsGaugeField.covDerivIter h.A (LocalGaugeData.actionConj HiggsVec.gaugeAlgebraAction) h.barH n l 0 /-- The iterated covariant derivative of the down-type quarks. -/ noncomputable def covDerivD (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : @@ -1002,7 +992,7 @@ noncomputable def covDerivD (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin /-- The iterated covariant derivative of the conjugate down-type quarks. -/ noncomputable def covDerivBarD (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : Module.Dual ℂ (ConjModule DownSinglet) →ₗ[ℂ] B := - IsGaugeField.covDerivIter h.A (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) + IsGaugeField.covDerivIter h.A (LocalGaugeData.actionConj DownSinglet.gaugeAlgebraAction) (h.bard i) n l 0 /-- The iterated covariant derivative of the up-type quarks. -/ @@ -1013,7 +1003,7 @@ noncomputable def covDerivU (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin /-- The iterated covariant derivative of the conjugate up-type quarks. -/ noncomputable def covDerivBarU (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : Module.Dual ℂ (ConjModule UpSinglet) →ₗ[ℂ] B := - IsGaugeField.covDerivIter h.A (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) + IsGaugeField.covDerivIter h.A (LocalGaugeData.actionConj UpSinglet.gaugeAlgebraAction) (h.baru i) n l 0 /-- The iterated covariant derivative of the quark doublets. -/ @@ -1024,7 +1014,7 @@ noncomputable def covDerivQ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin /-- The iterated covariant derivative of the conjugate quark doublets. -/ noncomputable def covDerivBarQ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : Module.Dual ℂ (ConjModule QuarkDoublet) →ₗ[ℂ] B := - IsGaugeField.covDerivIter h.A (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) + IsGaugeField.covDerivIter h.A (LocalGaugeData.actionConj QuarkDoublet.gaugeAlgebraAction) (h.barQ i) n l 0 /-- The iterated covariant derivative of the lepton doublets. -/ @@ -1035,7 +1025,7 @@ noncomputable def covDerivL (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin /-- The iterated covariant derivative of the conjugate lepton doublets. -/ noncomputable def covDerivBarL (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : Module.Dual ℂ (ConjModule LeptonDoublet) →ₗ[ℂ] B := - IsGaugeField.covDerivIter h.A (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) + IsGaugeField.covDerivIter h.A (LocalGaugeData.actionConj LeptonDoublet.gaugeAlgebraAction) (h.barL i) n l 0 /-- The iterated covariant derivative of the lepton singlets. -/ @@ -1046,7 +1036,7 @@ noncomputable def covDerivE (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin /-- The iterated covariant derivative of the conjugate lepton singlets. -/ noncomputable def covDerivBarE (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : Module.Dual ℂ (ConjModule LeptonSinglet) →ₗ[ℂ] B := - IsGaugeField.covDerivIter h.A (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) + IsGaugeField.covDerivIter h.A (LocalGaugeData.actionConj LeptonSinglet.gaugeAlgebraAction) (h.bare i) n l 0 /-- The iterated covariant derivative `∇_{l₁} ⋯ ∇_{lₙ} F_{μν}` of the field strength of the @@ -1138,7 +1128,7 @@ lemma fieldAlgebra_eq_covDeriv : · exact IsGaugeField.symbol_mem_adjoin HiggsVec.gaugeAlgebraAction h.H hA (fun n l φ => Or.inr (Or.inl (Set.mem_iUnion_of_mem n (Set.mem_iUnion_of_mem l (by simp [covDerivH]))))) s φ - · exact IsGaugeField.symbol_mem_adjoin (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) + · exact IsGaugeField.symbol_mem_adjoin (LocalGaugeData.actionConj HiggsVec.gaugeAlgebraAction) h.barH hA (fun n l φ => Or.inr (Or.inl (Set.mem_iUnion_of_mem n (Set.mem_iUnion_of_mem l (by simp [covDerivBarH]))))) s φ · simp only [Set.mem_iUnion] at hb @@ -1149,35 +1139,35 @@ lemma fieldAlgebra_eq_covDeriv : (fun n l φ => Or.inr (Or.inr (Set.mem_iUnion_of_mem i (Set.mem_iUnion_of_mem n (Set.mem_iUnion_of_mem l (by simp [covDerivD])))))) s φ · exact IsGaugeField.symbol_mem_adjoin - (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) (h.bard i) hA + (LocalGaugeData.actionConj DownSinglet.gaugeAlgebraAction) (h.bard i) hA (fun n l φ => Or.inr (Or.inr (Set.mem_iUnion_of_mem i (Set.mem_iUnion_of_mem n (Set.mem_iUnion_of_mem l (by simp [covDerivBarD])))))) s φ · exact IsGaugeField.symbol_mem_adjoin UpSinglet.gaugeAlgebraAction (h.u i) hA (fun n l φ => Or.inr (Or.inr (Set.mem_iUnion_of_mem i (Set.mem_iUnion_of_mem n (Set.mem_iUnion_of_mem l (by simp [covDerivU])))))) s φ · exact IsGaugeField.symbol_mem_adjoin - (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) (h.baru i) hA + (LocalGaugeData.actionConj UpSinglet.gaugeAlgebraAction) (h.baru i) hA (fun n l φ => Or.inr (Or.inr (Set.mem_iUnion_of_mem i (Set.mem_iUnion_of_mem n (Set.mem_iUnion_of_mem l (by simp [covDerivBarU])))))) s φ · exact IsGaugeField.symbol_mem_adjoin QuarkDoublet.gaugeAlgebraAction (h.Q i) hA (fun n l φ => Or.inr (Or.inr (Set.mem_iUnion_of_mem i (Set.mem_iUnion_of_mem n (Set.mem_iUnion_of_mem l (by simp [covDerivQ])))))) s φ · exact IsGaugeField.symbol_mem_adjoin - (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) (h.barQ i) hA + (LocalGaugeData.actionConj QuarkDoublet.gaugeAlgebraAction) (h.barQ i) hA (fun n l φ => Or.inr (Or.inr (Set.mem_iUnion_of_mem i (Set.mem_iUnion_of_mem n (Set.mem_iUnion_of_mem l (by simp [covDerivBarQ])))))) s φ · exact IsGaugeField.symbol_mem_adjoin LeptonDoublet.gaugeAlgebraAction (h.L i) hA (fun n l φ => Or.inr (Or.inr (Set.mem_iUnion_of_mem i (Set.mem_iUnion_of_mem n (Set.mem_iUnion_of_mem l (by simp [covDerivL])))))) s φ · exact IsGaugeField.symbol_mem_adjoin - (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) (h.barL i) hA + (LocalGaugeData.actionConj LeptonDoublet.gaugeAlgebraAction) (h.barL i) hA (fun n l φ => Or.inr (Or.inr (Set.mem_iUnion_of_mem i (Set.mem_iUnion_of_mem n (Set.mem_iUnion_of_mem l (by simp [covDerivBarL])))))) s φ · exact IsGaugeField.symbol_mem_adjoin LeptonSinglet.gaugeAlgebraAction (h.e i) hA (fun n l φ => Or.inr (Or.inr (Set.mem_iUnion_of_mem i (Set.mem_iUnion_of_mem n (Set.mem_iUnion_of_mem l (by simp [covDerivE])))))) s φ · exact IsGaugeField.symbol_mem_adjoin - (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) (h.bare i) hA + (LocalGaugeData.actionConj LeptonSinglet.gaugeAlgebraAction) (h.bare i) hA (fun n l φ => Or.inr (Or.inr (Set.mem_iUnion_of_mem i (Set.mem_iUnion_of_mem n (Set.mem_iUnion_of_mem l (by simp [covDerivBarE])))))) s φ -- every symbol of a tower is a polynomial in the gauge-field symbols and its bare symbols @@ -1213,7 +1203,7 @@ lemma transformsIn_covDerivH (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : representation. -/ lemma transformsIn_covDerivBarH (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : TransformsIn repJet (repConj HiggsVec.repJetGaugeGroupI) - (IsGaugeField.covDerivIter h.A (GaugeAlgebra.actionConj HiggsVec.gaugeAlgebraAction) + (IsGaugeField.covDerivIter h.A (LocalGaugeData.actionConj HiggsVec.gaugeAlgebraAction) h.barH n l) := TransformsIn.covDerivIter h.repJet_A h.repJet_barH HiggsVec.isInfinitesimalActionOf.conj n l @@ -1227,7 +1217,7 @@ lemma transformsIn_covDerivD (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin representation. -/ lemma transformsIn_covDerivBarD (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : TransformsIn repJet (repConj DownSinglet.repJetGaugeGroupI) - (IsGaugeField.covDerivIter h.A (GaugeAlgebra.actionConj DownSinglet.gaugeAlgebraAction) + (IsGaugeField.covDerivIter h.A (LocalGaugeData.actionConj DownSinglet.gaugeAlgebraAction) (h.bard i) n l) := TransformsIn.covDerivIter h.repJet_A (h.repJet_bard i) DownSinglet.isInfinitesimalActionOf.conj n l @@ -1242,7 +1232,7 @@ lemma transformsIn_covDerivU (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin representation. -/ lemma transformsIn_covDerivBarU (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : TransformsIn repJet (repConj UpSinglet.repJetGaugeGroupI) - (IsGaugeField.covDerivIter h.A (GaugeAlgebra.actionConj UpSinglet.gaugeAlgebraAction) + (IsGaugeField.covDerivIter h.A (LocalGaugeData.actionConj UpSinglet.gaugeAlgebraAction) (h.baru i) n l) := TransformsIn.covDerivIter h.repJet_A (h.repJet_baru i) UpSinglet.isInfinitesimalActionOf.conj n l @@ -1256,7 +1246,7 @@ lemma transformsIn_covDerivQ (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin representation. -/ lemma transformsIn_covDerivBarQ (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : TransformsIn repJet (repConj QuarkDoublet.repJetGaugeGroupI) - (IsGaugeField.covDerivIter h.A (GaugeAlgebra.actionConj QuarkDoublet.gaugeAlgebraAction) + (IsGaugeField.covDerivIter h.A (LocalGaugeData.actionConj QuarkDoublet.gaugeAlgebraAction) (h.barQ i) n l) := TransformsIn.covDerivIter h.repJet_A (h.repJet_barQ i) QuarkDoublet.isInfinitesimalActionOf.conj n l @@ -1271,7 +1261,7 @@ lemma transformsIn_covDerivL (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin representation. -/ lemma transformsIn_covDerivBarL (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : TransformsIn repJet (repConj LeptonDoublet.repJetGaugeGroupI) - (IsGaugeField.covDerivIter h.A (GaugeAlgebra.actionConj LeptonDoublet.gaugeAlgebraAction) + (IsGaugeField.covDerivIter h.A (LocalGaugeData.actionConj LeptonDoublet.gaugeAlgebraAction) (h.barL i) n l) := TransformsIn.covDerivIter h.repJet_A (h.repJet_barL i) LeptonDoublet.isInfinitesimalActionOf.conj n l @@ -1286,7 +1276,7 @@ lemma transformsIn_covDerivE (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin representation. -/ lemma transformsIn_covDerivBarE (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : TransformsIn repJet (repConj LeptonSinglet.repJetGaugeGroupI) - (IsGaugeField.covDerivIter h.A (GaugeAlgebra.actionConj LeptonSinglet.gaugeAlgebraAction) + (IsGaugeField.covDerivIter h.A (LocalGaugeData.actionConj LeptonSinglet.gaugeAlgebraAction) (h.bare i) n l) := TransformsIn.covDerivIter h.repJet_A (h.repJet_bare i) LeptonSinglet.isInfinitesimalActionOf.conj n l @@ -1403,7 +1393,7 @@ lemma repJet_covDerivBarH_of_mem_truncationKer_zero {n : ℕ} (l : Fin n → (Fi (U : JetGaugeGroupI.truncationKer 0) (φ : Module.Dual ℂ (ConjModule HiggsVec)) : 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 + (fun hW => repCoeff_repConj_zero_eq_id (HiggsVec.repCoeff_zero_of_eval_eq_one hW)) U φ /-- A pure gauge jet fixes the covariant tower of the down-type quarks. -/ @@ -1420,7 +1410,7 @@ lemma repJet_covDerivBarD_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} (φ : Module.Dual ℂ (ConjModule DownSinglet)) : 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 + (fun hW => repCoeff_repConj_zero_eq_id (DownSinglet.repCoeff_zero_of_eval_eq_one hW)) U φ /-- A pure gauge jet fixes the covariant tower of the up-type quarks. -/ @@ -1437,7 +1427,7 @@ lemma repJet_covDerivBarU_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} (φ : Module.Dual ℂ (ConjModule UpSinglet)) : 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 + (fun hW => repCoeff_repConj_zero_eq_id (UpSinglet.repCoeff_zero_of_eval_eq_one hW)) U φ /-- A pure gauge jet fixes the covariant tower of the quark doublets. -/ @@ -1454,7 +1444,7 @@ lemma repJet_covDerivBarQ_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) : 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 + (fun hW => repCoeff_repConj_zero_eq_id (QuarkDoublet.repCoeff_zero_of_eval_eq_one hW)) U φ /-- A pure gauge jet fixes the covariant tower of the lepton doublets. -/ @@ -1471,7 +1461,7 @@ lemma repJet_covDerivBarL_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} (φ : Module.Dual ℂ (ConjModule LeptonDoublet)) : 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 + (fun hW => repCoeff_repConj_zero_eq_id (LeptonDoublet.repCoeff_zero_of_eval_eq_one hW)) U φ /-- A pure gauge jet fixes the covariant tower of the lepton singlets. -/ @@ -1488,7 +1478,7 @@ lemma repJet_covDerivBarE_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} (φ : Module.Dual ℂ (ConjModule LeptonSinglet)) : 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 + (fun hW => repCoeff_repConj_zero_eq_id (LeptonSinglet.repCoeff_zero_of_eval_eq_one hW)) U φ /-- The covariant tower of the field strength is antisymmetric in its two covector @@ -1548,8 +1538,8 @@ 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) := + LocalGaugeData.actionConj act c (rep.conj Λ v) = + rep.conj Λ (LocalGaugeData.actionConj act c v) := congrArg (conjEquiv (k := ℂ) (M := V)) (h c Λ _) end GaugeLorentzComm diff --git a/Physlib/Particles/StandardModel/Fermions/DownSinglet/Basic.lean b/Physlib/Particles/StandardModel/Fermions/DownSinglet/Basic.lean index e211476da..1961cc029 100644 --- a/Physlib/Particles/StandardModel/Fermions/DownSinglet/Basic.lean +++ b/Physlib/Particles/StandardModel/Fermions/DownSinglet/Basic.lean @@ -10,7 +10,7 @@ public import Physlib.Relativity.Fermions.Weyl.BoostWeight public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.JetGaugeGroup.Basic public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.CovariantDeriv -public import Physlib.Particles.StandardModel.GaugeAlgebra.InfinitesimalAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.Basic public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.GaugeAction public import Physlib.Relativity.Tensors.ComplexTensor.Basic diff --git a/Physlib/Particles/StandardModel/Fermions/DownSinglet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/DownSinglet/GaugeAlgebraAction.lean index bc38720d3..fde361816 100644 --- a/Physlib/Particles/StandardModel/Fermions/DownSinglet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/DownSinglet/GaugeAlgebraAction.lean @@ -6,7 +6,8 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.Fermions.DownSinglet.Basic -public import Physlib.Particles.StandardModel.GaugeAlgebra.InfinitesimalAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction +public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.GaugeAction public import Mathlib.LinearAlgebra.TensorProduct.Pi public import Mathlib.Analysis.Normed.Lp.Matrix @@ -21,7 +22,7 @@ public import Physlib.Mathematics.TensorProductComm 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`. +`LocalGaugeData.IsInfinitesimalActionOf`. ## ii. Key results @@ -46,7 +47,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 — -`GaugeAlgebra.IsInfinitesimalActionOf` — is proved at the end of this file. +`LocalGaugeData.IsInfinitesimalActionOf` — is proved at the end of this file. -/ @@ -106,7 +107,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 - `GaugeAlgebra.IsInfinitesimalActionOf`. -/ + `LocalGaugeData.IsInfinitesimalActionOf`. -/ noncomputable def gaugeAlgebraAction : GaugeAlgebra →ₗ[ℝ] DownSinglet →ₗ[ℂ] DownSinglet where toFun c := colourEnd (actionMatrix c) @@ -137,7 +138,7 @@ noncomputable def gaugeAlgebraAction : ## 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 +jet gauge action, in the sense of `LocalGaugeData.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. @@ -530,9 +531,11 @@ set_option maxHeartbeats 1000000 in coefficients obey the Maurer–Cartan Leibniz law and intertwine the action with the adjoint transports. -/ theorem isInfinitesimalActionOf : - GaugeAlgebra.IsInfinitesimalActionOf gaugeAlgebraAction repJetGaugeGroupI := by + localGaugeData.IsInfinitesimalActionOf gaugeAlgebraAction repJetGaugeGroupI := by constructor · intro U μ x + simp only [localGaugeData_repCoeff, localGaugeData_evalLie, + localGaugeData_iteratedDeriv, localGaugeData_mc] have hMcons : ((downMatrix U).map fun f => constantCoeff ((μ ::ₘ x).foldl (fun h ρ => pderiv ℂ ρ h) f)) = -((x.antidiagonal.map fun p => @@ -564,6 +567,7 @@ theorem isInfinitesimalActionOf : rw [Function.comp_apply, colourEnd_mul, repCoeff_eq] rfl · intro U x c + simp only [localGaugeData_repCoeff, localGaugeData_adjointCoeff] 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] diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean index 44909cec2..cdd5ae35e 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean @@ -6,7 +6,8 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.Fermions.LeptonDoublet.Basic -public import Physlib.Particles.StandardModel.GaugeAlgebra.InfinitesimalAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction +public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.GaugeAction public import Mathlib.LinearAlgebra.TensorProduct.Pi public import Mathlib.Analysis.Normed.Lp.Matrix @@ -21,7 +22,7 @@ The infinitesimal `(1, 2)_{-3}` action of the gauge algebra on the lepton double 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 +`LocalGaugeData.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. @@ -113,7 +114,7 @@ noncomputable def actionMatrix (c : GaugeAlgebra) : Matrix (Fin 2) (Fin 2) ℂ : 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`. -/ + `LocalGaugeData.IsInfinitesimalActionOf`. -/ noncomputable def gaugeAlgebraAction : GaugeAlgebra →ₗ[ℝ] LeptonDoublet →ₗ[ℂ] LeptonDoublet where toFun c := weakEnd (actionMatrix c) @@ -144,7 +145,7 @@ noncomputable def gaugeAlgebraAction : ## 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 +jet gauge action, in the sense of `LocalGaugeData.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. @@ -543,9 +544,11 @@ set_option maxHeartbeats 1000000 in coefficients obey the Maurer–Cartan Leibniz law and intertwine the action with the adjoint transports. -/ theorem isInfinitesimalActionOf : - GaugeAlgebra.IsInfinitesimalActionOf gaugeAlgebraAction repJetGaugeGroupI := by + localGaugeData.IsInfinitesimalActionOf gaugeAlgebraAction repJetGaugeGroupI := by constructor · intro U μ x + simp only [localGaugeData_repCoeff, localGaugeData_evalLie, + localGaugeData_iteratedDeriv, localGaugeData_mc] have hMcons : ((doubletMatrix U).map fun f => constantCoeff ((μ ::ₘ x).foldl (fun h ρ => pderiv ℂ ρ h) f)) = -((x.antidiagonal.map fun p => @@ -577,6 +580,7 @@ theorem isInfinitesimalActionOf : rw [Function.comp_apply, weakEnd_mul, repCoeff_eq] rfl · intro U x c + simp only [localGaugeData_repCoeff, localGaugeData_adjointCoeff] 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] diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/GaugeAlgebraAction.lean index 09c84c55d..36f4c3ca3 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/GaugeAlgebraAction.lean @@ -6,7 +6,8 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.Basic -public import Physlib.Particles.StandardModel.GaugeAlgebra.InfinitesimalAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction +public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.GaugeAction /-! # The gauge-algebra action on the charged-lepton singlet @@ -17,7 +18,7 @@ The charged-lepton singlet carries the `(1, 1)_{-6}` representation of the gauge 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`. +the sense of `LocalGaugeData.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 @@ -67,7 +68,7 @@ derivative is scalar multiplication by `i (-6)` times the `u(1)` value. 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`. -/ + `LocalGaugeData.IsInfinitesimalActionOf`. -/ noncomputable def gaugeAlgebraAction : GaugeAlgebra →ₗ[ℝ] LeptonSinglet →ₗ[ℂ] LeptonSinglet where toFun c := (Complex.I * (-(6 : ℂ) * c.toU1Value)) @@ -247,7 +248,7 @@ lemma jetPhase_pderiv (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : ## E. The infinitesimal action underlies the jet gauge action -Both laws of `GaugeAlgebra.IsInfinitesimalActionOf` reduce through `repCoeff_eq` to +Both laws of `LocalGaugeData.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. @@ -260,9 +261,11 @@ set_option maxHeartbeats 1000000 in Taylor coefficients obey the Maurer–Cartan Leibniz law and intertwine the action with the adjoint transports. -/ theorem isInfinitesimalActionOf : - GaugeAlgebra.IsInfinitesimalActionOf gaugeAlgebraAction repJetGaugeGroupI := by + localGaugeData.IsInfinitesimalActionOf gaugeAlgebraAction repJetGaugeGroupI := by constructor · intro U μ x + simp only [localGaugeData_repCoeff, localGaugeData_evalLie, + localGaugeData_iteratedDeriv, localGaugeData_mc] have hMcons : constantCoeff ((μ ::ₘ x).foldl (fun h ρ => pderiv ℂ ρ h) (jetPhase U)) = -((x.antidiagonal.map fun p => Complex.I * (-(6 : ℂ) * (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv @@ -279,6 +282,7 @@ theorem isInfinitesimalActionOf : 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 + simp only [localGaugeData_repCoeff, localGaugeData_adjointCoeff] 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 diff --git a/Physlib/Particles/StandardModel/Fermions/MatterField.lean b/Physlib/Particles/StandardModel/Fermions/MatterField.lean index 3b3690fd8..d493b48d2 100644 --- a/Physlib/Particles/StandardModel/Fermions/MatterField.lean +++ b/Physlib/Particles/StandardModel/Fermions/MatterField.lean @@ -6,12 +6,12 @@ Authors: Nathaneal Sajan module public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.Basic -public import Physlib.Particles.StandardModel.Fermions.DownSinglet.Basic -public import Physlib.Particles.StandardModel.GaugeGroup.GaugeJet -public import Physlib.Particles.StandardModel.Fermions.LeptonDoublet.Basic -public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.Basic -public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet.Basic -public import Physlib.Particles.StandardModel.Fermions.UpSinglet.Basic +public import Physlib.Particles.StandardModel.Fermions.DownSinglet.GaugeAlgebraAction +public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData +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 /-! # The Standard Model fermions as matter fields @@ -69,13 +69,14 @@ namespace StandardModel namespace LeptonDoublet -/-- The lepton doublet as a matter field of `StandardModel.gaugeJet`, in the `(1, 2)_{-3}` +/-- The lepton doublet as a matter field of `StandardModel.localGaugeData`, in the `(1, 2)_{-3}` representation with its left-handed Lorentz action. -/ -noncomputable def matterField : MatterField gaugeJet where +noncomputable def matterField : MatterField localGaugeData where V := LeptonDoublet repLorentz := repLorentzGroup repJet := repJetGaugeGroupI repAlgebra := gaugeAlgebraAction + repAlgebra_isInfinitesimalAction := isInfinitesimalActionOf repJet_smul := repJetGaugeGroupI_smul massWeight := 3 @@ -104,13 +105,14 @@ end LeptonDoublet namespace LeptonSinglet -/-- The charged-lepton singlet as a matter field of `StandardModel.gaugeJet`, in the +/-- The charged-lepton singlet as a matter field of `StandardModel.localGaugeData`, in the `(1, 1)_{-6}` representation with its right-handed Lorentz action. -/ -noncomputable def matterField : MatterField gaugeJet where +noncomputable def matterField : MatterField localGaugeData where V := LeptonSinglet repLorentz := repLorentzGroup repJet := repJetGaugeGroupI repAlgebra := gaugeAlgebraAction + repAlgebra_isInfinitesimalAction := isInfinitesimalActionOf repJet_smul := repJetGaugeGroupI_smul massWeight := 3 @@ -141,13 +143,14 @@ end LeptonSinglet namespace QuarkDoublet -/-- The quark doublet as a matter field of `StandardModel.gaugeJet`, in the `(3, 2)_{1}` +/-- The quark doublet as a matter field of `StandardModel.localGaugeData`, in the `(3, 2)_{1}` representation with its left-handed Lorentz action. -/ -noncomputable def matterField : MatterField gaugeJet where +noncomputable def matterField : MatterField localGaugeData where V := QuarkDoublet repLorentz := repLorentzGroup repJet := repJetGaugeGroupI repAlgebra := gaugeAlgebraAction + repAlgebra_isInfinitesimalAction := isInfinitesimalActionOf repJet_smul := repJetGaugeGroupI_smul massWeight := 3 @@ -176,13 +179,14 @@ end QuarkDoublet namespace UpSinglet -/-- The up-type quark singlet as a matter field of `StandardModel.gaugeJet`, in the +/-- The up-type quark singlet as a matter field of `StandardModel.localGaugeData`, in the `(3, 1)_{4}` representation with its right-handed Lorentz action. -/ -noncomputable def matterField : MatterField gaugeJet where +noncomputable def matterField : MatterField localGaugeData where V := UpSinglet repLorentz := repLorentzGroup repJet := repJetGaugeGroupI repAlgebra := gaugeAlgebraAction + repAlgebra_isInfinitesimalAction := isInfinitesimalActionOf repJet_smul := repJetGaugeGroupI_smul massWeight := 3 @@ -211,13 +215,14 @@ end UpSinglet namespace DownSinglet -/-- The down-type quark singlet as a matter field of `StandardModel.gaugeJet`, in the +/-- The down-type quark singlet as a matter field of `StandardModel.localGaugeData`, in the `(3, 1)_{-2}` representation with its right-handed Lorentz action. -/ -noncomputable def matterField : MatterField gaugeJet where +noncomputable def matterField : MatterField localGaugeData where V := DownSinglet repLorentz := repLorentzGroup repJet := repJetGaugeGroupI repAlgebra := gaugeAlgebraAction + repAlgebra_isInfinitesimalAction := isInfinitesimalActionOf repJet_smul := repJetGaugeGroupI_smul massWeight := 3 diff --git a/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/GaugeAlgebraAction.lean index d5b219615..f02ae564e 100644 --- a/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/GaugeAlgebraAction.lean @@ -6,7 +6,8 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet.Basic -public import Physlib.Particles.StandardModel.GaugeAlgebra.InfinitesimalAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction +public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.GaugeAction public import Mathlib.LinearAlgebra.TensorProduct.Pi public import Mathlib.LinearAlgebra.Matrix.Kronecker @@ -23,7 +24,7 @@ parts of the algebra element act on the combined colour–weak index through the 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`. +in the sense of `LocalGaugeData.IsInfinitesimalActionOf`. ## ii. Key results @@ -133,7 +134,7 @@ noncomputable def actionMatrix (c : GaugeAlgebra) : 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`. -/ + `LocalGaugeData.IsInfinitesimalActionOf`. -/ noncomputable def gaugeAlgebraAction : GaugeAlgebra →ₗ[ℝ] QuarkDoublet →ₗ[ℂ] QuarkDoublet where toFun c := colourWeakEnd (actionMatrix c) @@ -172,7 +173,7 @@ noncomputable def gaugeAlgebraAction : ## 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 +jet gauge action, in the sense of `LocalGaugeData.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 @@ -652,9 +653,11 @@ set_option maxHeartbeats 1000000 in coefficients obey the Maurer–Cartan Leibniz law and intertwine the action with the adjoint transports. -/ theorem isInfinitesimalActionOf : - GaugeAlgebra.IsInfinitesimalActionOf gaugeAlgebraAction repJetGaugeGroupI := by + localGaugeData.IsInfinitesimalActionOf gaugeAlgebraAction repJetGaugeGroupI := by constructor · intro U μ x + simp only [localGaugeData_repCoeff, localGaugeData_evalLie, + localGaugeData_iteratedDeriv, localGaugeData_mc] have hMcons : ((jetGaugeMatrix U).map fun f => constantCoeff ((μ ::ₘ x).foldl (fun h ρ => pderiv ℂ ρ h) f)) = -((x.antidiagonal.map fun p => @@ -687,6 +690,7 @@ theorem isInfinitesimalActionOf : rw [Function.comp_apply, colourWeakEnd_mul, repCoeff_eq] rfl · intro U x c + simp only [localGaugeData_repCoeff, localGaugeData_adjointCoeff] 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] diff --git a/Physlib/Particles/StandardModel/Fermions/UpSinglet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/UpSinglet/GaugeAlgebraAction.lean index cfcb00ac6..d7ba0ba46 100644 --- a/Physlib/Particles/StandardModel/Fermions/UpSinglet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/UpSinglet/GaugeAlgebraAction.lean @@ -6,7 +6,8 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.Fermions.UpSinglet.Basic -public import Physlib.Particles.StandardModel.GaugeAlgebra.InfinitesimalAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction +public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.GaugeAction public import Mathlib.LinearAlgebra.TensorProduct.Pi public import Mathlib.Analysis.Normed.Lp.Matrix @@ -22,7 +23,7 @@ the algebra element acts on the colour index and the hypercharge part scales, bo 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`. +`LocalGaugeData.IsInfinitesimalActionOf`. ## ii. Key results @@ -114,7 +115,7 @@ noncomputable def actionMatrix (c : GaugeAlgebra) : Matrix (Fin 3) (Fin 3) ℂ : 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`. -/ + `LocalGaugeData.IsInfinitesimalActionOf`. -/ noncomputable def gaugeAlgebraAction : GaugeAlgebra →ₗ[ℝ] UpSinglet →ₗ[ℂ] UpSinglet where toFun c := colourEnd (actionMatrix c) @@ -147,7 +148,7 @@ noncomputable def gaugeAlgebraAction : ## 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 +jet gauge action, in the sense of `LocalGaugeData.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. @@ -524,9 +525,11 @@ set_option maxHeartbeats 1000000 in coefficients obey the Maurer–Cartan Leibniz law and intertwine the action with the adjoint transports. -/ theorem isInfinitesimalActionOf : - GaugeAlgebra.IsInfinitesimalActionOf gaugeAlgebraAction repJetGaugeGroupI := by + localGaugeData.IsInfinitesimalActionOf gaugeAlgebraAction repJetGaugeGroupI := by constructor · intro U μ x + simp only [localGaugeData_repCoeff, localGaugeData_evalLie, + localGaugeData_iteratedDeriv, localGaugeData_mc] have hMcons : ((upMatrix U).map fun f => constantCoeff ((μ ::ₘ x).foldl (fun h ρ => pderiv ℂ ρ h) f)) = -((x.antidiagonal.map fun p => @@ -558,6 +561,7 @@ theorem isInfinitesimalActionOf : rw [Function.comp_apply, colourEnd_mul, repCoeff_eq] rfl · intro U x c + simp only [localGaugeData_repCoeff, localGaugeData_adjointCoeff] 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] diff --git a/Physlib/Particles/StandardModel/FieldData.lean b/Physlib/Particles/StandardModel/FieldData.lean index cfde5373c..e8a358b78 100644 --- a/Physlib/Particles/StandardModel/FieldData.lean +++ b/Physlib/Particles/StandardModel/FieldData.lean @@ -7,7 +7,7 @@ module public import Physlib.ClassicalFieldTheory.JetAlgebra.GaugeFieldData public import Physlib.Particles.StandardModel.Fermions.MatterField -public import Physlib.Particles.StandardModel.GaugeGroup.GaugeJet +public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData public import Physlib.Particles.StandardModel.HiggsBoson.MatterField /-! # The field data of the Standard Model @@ -16,7 +16,7 @@ public import Physlib.Particles.StandardModel.HiggsBoson.MatterField `GaugeFieldData jets` is the matter content of a gauge theory over a gauge context: a family of fermionic species and a family of bosonic species, each given by a -`MatterField`. The Standard Model has all the pieces — `StandardModel.gaugeJet` with its +`MatterField`. The Standard Model has all the pieces — `StandardModel.localGaugeData` with its Taylor–Leibniz law, and the five fermion types and the Higgs already packaged as matter fields — and this file assembles them into `StandardModel.fieldData`. @@ -85,7 +85,7 @@ namespace FermionType /-- The matter field of a fermion species, one of the five existing adapters. It is the same in every generation. -/ -noncomputable def matterField : FermionType → MatterField gaugeJet +noncomputable def matterField : FermionType → MatterField localGaugeData | .leptonDoublet _ => LeptonDoublet.matterField | .leptonSinglet _ => LeptonSinglet.matterField | .quarkDoublet _ => QuarkDoublet.matterField @@ -126,8 +126,8 @@ end FermionType -/ /-- The field data of the Standard Model: three generations of each of the five fermion - types and one Higgs multiplet, over the gauge context `StandardModel.gaugeJet`. -/ -noncomputable def fieldData : GaugeFieldData gaugeJet where + types and one Higgs multiplet, over the gauge context `StandardModel.localGaugeData`. -/ +noncomputable def fieldData : GaugeFieldData localGaugeData where FermionSpecies := FermionType fermion := FermionType.matterField BosonSpecies := Unit diff --git a/Physlib/Particles/StandardModel/GaugeGroup/GaugeJet.lean b/Physlib/Particles/StandardModel/GaugeGroup/GaugeJet.lean deleted file mode 100644 index 86a62b8c4..000000000 --- a/Physlib/Particles/StandardModel/GaugeGroup/GaugeJet.lean +++ /dev/null @@ -1,180 +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.ClassicalFieldTheory.GaugeTheory.GaugeField.Basic -public import Physlib.ClassicalFieldTheory.GaugeTheory.Matter.CovariantDeriv -public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.Basic -public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.GaugeAction -public import Physlib.Particles.StandardModel.GaugeGroup.MaurerCartan.Basic -public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.CovariantDeriv -/-! -# The Standard Model gauge group as jets of a gauge group - -## i. Overview - -The generic transformation laws of gauge and matter fields are stated against a supplied -gauge-jet package `jets : GaugeJet G 𝔤 G₀ 𝔤J`. The Standard Model already carries all of -its data, for the jet gauge group `JetGaugeGroupI` of `SU(3) × SU(2) × U(1)` with jet Lie -algebra `JetGaugeAlgebra`, global group `GaugeGroupI` and gauge algebra `GaugeAlgebra`. - -This file packages those existing constructions as the named term -`StandardModel.gaugeJet`, and records the rules that compute the generic interface back to -the Standard Model definition it came from, so the existing Standard Model lemmas apply to -it unchanged. It is a term, not an instance: every generic construction receives it as an -argument. Its extra law `GaugeJetLeibniz` is a property of that package rather than a -choice, so it is an instance, discharged by the existing Taylor–Leibniz theorem. - -## ii. Key results - -- `StandardModel.gaugeJet` : the Standard Model gauge group as jets of a gauge group. -- `StandardModel.gaugeJet_eval`, `StandardModel.gaugeJet_deriv`, - `StandardModel.gaugeJet_mc`, … : the generic interface computed back to the Standard - Model definitions. -- `StandardModel.gaugeJet_iteratedDeriv` : the generic iterated derivative is the Standard - Model iterated derivative. -- `StandardModel.gaugeJet_adjointCoeff`, `StandardModel.gaugeJet_adjointDualCoeff` : the - generic base-point adjoint transport at this package is the existing Standard Model one. -- `StandardModel.instGaugeJetLeibniz` : the package obeys the Taylor–Leibniz rule for the - adjoint action. - -## iii. Table of contents - -- A. The gauge-jet package -- B. The generic interface in Standard Model terms - - B.1. The group and Lie algebra data - - B.2. The derivative, the adjoint action and the Maurer–Cartan form -- C. The generic adjoint transport is the Standard Model adjoint transport -- D. The Taylor–Leibniz rule - --/ - -@[expose] public section - -namespace StandardModel - -open JetGaugeAlgebra - -/-! - -## A. The gauge-jet package - -`GaugeJet` is an ordinary structure, so this is a named term supplied at each use site, -not an instance found by search. The four carriers do not determine it — a truncated jet -group over the same gauge group would be a second, equally canonical package — so nothing -is registered globally. - --/ - -/-- The Standard Model gauge group as jets of a gauge group, for the jet gauge group - `JetGaugeGroupI` and its Lie algebra `JetGaugeAlgebra` over the global group - `GaugeGroupI` and gauge algebra `GaugeAlgebra`. Nothing is redefined. Every data field - is an existing Standard Model construction and every proof field an existing Standard - Model lemma. -/ -noncomputable def gaugeJet : - GaugeJet JetGaugeGroupI GaugeAlgebra GaugeGroupI JetGaugeAlgebra where - eval := JetGaugeGroupI.eval - ofConstant := JetGaugeGroupI.ofConstant - eval_ofConstant := JetGaugeGroupI.eval_ofConstant - evalLie := JetGaugeAlgebra.eval - ofConstantLie := JetGaugeAlgebra.ofConstant - ofConstantLie_lie := JetGaugeAlgebra.ofConstant_lie - deriv := JetGaugeAlgebra.deriv - deriv_comm := JetGaugeAlgebra.deriv_comm - deriv_bracket := JetGaugeAlgebra.deriv_bracket - deriv_ofConstantLie := JetGaugeAlgebra.deriv_ofConstant - adjoint := JetGaugeAlgebra.adjoint - adjoint_lie := JetGaugeAlgebra.adjointMap_lie - mc := maurerCartanForm - mc_one := fun μ => congrFun maurerCartanForm_one μ - mc_cocycle := maurerCartanForm_cocycle - mc_structure := maurerCartanForm_structure - deriv_adjoint := deriv_adjointMap - adjointValue := GaugeAlgebra.adjoint - evalLie_adjoint_ofConstantLie := JetGaugeAlgebra.eval_adjointMap_ofConstant - -/-! - -## B. The generic interface in Standard Model terms - -These rules point from the generic interface to the Standard Model definitions, which is -the direction in which the existing Standard Model lemmas become applicable. - -### B.1. The group and Lie algebra data - --/ - -@[simp] -lemma gaugeJet_eval : gaugeJet.eval = JetGaugeGroupI.eval := rfl - -@[simp] -lemma gaugeJet_ofConstant : gaugeJet.ofConstant = JetGaugeGroupI.ofConstant := rfl - -@[simp] -lemma gaugeJet_evalLie : gaugeJet.evalLie = JetGaugeAlgebra.eval := rfl - -@[simp] -lemma gaugeJet_ofConstantLie : gaugeJet.ofConstantLie = JetGaugeAlgebra.ofConstant := rfl - -@[simp] -lemma gaugeJet_adjointValue : gaugeJet.adjointValue = GaugeAlgebra.adjoint := rfl - -/-! - -### B.2. The derivative, the adjoint action and the Maurer–Cartan form - --/ - -@[simp] -lemma gaugeJet_deriv (μ : Fin 1 ⊕ Fin 3) : gaugeJet.deriv μ = JetGaugeAlgebra.deriv μ := rfl - -/-- The generic iterated derivative is the Standard Model iterated derivative, both being - the same fold of `JetGaugeAlgebra.deriv` over the multiset of directions. -/ -@[simp] -lemma gaugeJet_iteratedDeriv (s : Multiset (Fin 1 ⊕ Fin 3)) : - gaugeJet.iteratedDeriv s = JetGaugeAlgebra.iteratedDeriv s := rfl - -@[simp] -lemma gaugeJet_adjoint : gaugeJet.adjoint = JetGaugeAlgebra.adjoint := rfl - -@[simp] -lemma gaugeJet_mc : gaugeJet.mc = maurerCartanForm := rfl - -/-! - -## C. The generic adjoint transport is the Standard Model adjoint transport - -The composite `evalLie ∘ ∂_x ∘ Ad_U ∘ ofConstantLie`, by which the generic theory -transports the gauge algebra to the base point, is the map the Standard Model -covariant-derivative development already uses under the same name. - --/ - -@[simp] -lemma gaugeJet_adjointCoeff (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : - _root_.IsGaugeField.adjointCoeff gaugeJet U x = IsGaugeField.adjointCoeff U x := rfl - -@[simp] -lemma gaugeJet_adjointDualCoeff (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : - _root_.adjointDualCoeff gaugeJet U x = adjointDualCoeff U x := rfl - -/-! - -## D. The Taylor–Leibniz rule - --/ - -/-- The Standard Model package obeys the Taylor–Leibniz rule for the adjoint action. The - class field is the existing theorem `JetGaugeAlgebra.eval_iteratedDeriv_adjointMap`: the - `IsGaugeField.adjointCoeff U p.1` appearing there is by definition the composite - `evalLie ∘ ∂_{p.1} ∘ Ad_U ∘ ofConstantLie` that the field writes out. - - Unlike the package itself this is a property of it and not a choice, so it is an - instance. -/ -instance instGaugeJetLeibniz : GaugeJetLeibniz gaugeJet where - evalLie_iteratedDeriv_adjoint := JetGaugeAlgebra.eval_iteratedDeriv_adjointMap - -end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeGroup/LocalGaugeData.lean b/Physlib/Particles/StandardModel/GaugeGroup/LocalGaugeData.lean new file mode 100644 index 000000000..22ff9c69c --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeGroup/LocalGaugeData.lean @@ -0,0 +1,294 @@ +/- +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.ClassicalFieldTheory.GaugeTheory.GaugeField.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.Matter.CovariantDeriv +public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.Basic +public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.GaugeAction +public import Physlib.Particles.StandardModel.GaugeGroup.MaurerCartan.Basic +public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.CovariantDeriv +/-! +# The Standard Model gauge group as jets of a gauge group + +## i. Overview + +The generic transformation laws of gauge and matter fields are stated against a supplied +local-gauge-data package `jets : LocalGaugeData G 𝔤 G₀ 𝔤J`. The Standard Model already +carries all of its data, for the jet gauge group `JetGaugeGroupI` of `SU(3) × SU(2) × U(1)` +with jet Lie algebra `JetGaugeAlgebra`, global group `GaugeGroupI` and gauge algebra +`GaugeAlgebra`. + +This file packages those existing constructions as the named term +`StandardModel.localGaugeData`, and records the rules that compute the generic interface back to +the Standard Model definition it came from, so the existing Standard Model lemmas apply to +it unchanged. It is a term, not an instance: every generic construction receives it as an +argument. Its extra law `LocalGaugeDataLeibniz` is a property of that package rather than a +choice, so it is an instance, discharged by the existing Taylor–Leibniz theorem. + +## ii. Key results + +- `StandardModel.localGaugeData` : the Standard Model gauge group as jets of a gauge group. +- `StandardModel.localGaugeData_eval`, `StandardModel.localGaugeData_deriv`, + `StandardModel.localGaugeData_mc`, … : the generic interface computed back to the Standard + Model definitions. +- `StandardModel.localGaugeData_iteratedDeriv` : the generic iterated derivative is the Standard + Model iterated derivative. +- `StandardModel.localGaugeData_adjointCoeff`, `StandardModel.localGaugeData_adjointDualCoeff` : the + generic base-point adjoint transport at this package is the existing Standard Model one. +- `StandardModel.localGaugeData_repCoeff` : the generic base-point Taylor coefficient of a + representation is the Standard Model one. +- `StandardModel.IsGaugeField.toLocalGaugeData` : a Standard Model gauge field is a gauge + field of the package. +- `StandardModel.TransformsIn.repGauge_zero`, + `StandardModel.TransformsIn.covDerivAction`, `StandardModel.TransformsIn.covDerivIter`, + `StandardModel.TransformsIn.repGauge_eq_of_mem_truncationKer_zero` : the generic + covariance theorems of the covariant derivative, read at this package. +- `StandardModel.instLocalGaugeDataLeibniz` : the package obeys the Taylor–Leibniz rule for the + adjoint action. + +## iii. Table of contents + +- A. The local-gauge-data package +- B. The generic interface in Standard Model terms + - B.1. The group and Lie algebra data + - B.2. The derivative, the adjoint action and the Maurer–Cartan form +- C. The generic adjoint transport is the Standard Model adjoint transport + - C.1. Gauge fields + - C.2. The generic covariance theorems in Standard Model terms +- D. The Taylor–Leibniz rule + +-/ + +@[expose] public section + +namespace StandardModel + +open JetGaugeAlgebra TensorProduct Matrix MatrixGroups + +/-! + +## A. The local-gauge-data package + +`LocalGaugeData` is an ordinary structure, so this is a named term supplied at each use site, +not an instance found by search. The four carriers do not determine it — a truncated jet +group over the same gauge group would be a second, equally canonical package — so nothing +is registered globally. + +-/ + +/-- The Standard Model gauge group as jets of a gauge group, for the jet gauge group + `JetGaugeGroupI` and its Lie algebra `JetGaugeAlgebra` over the global group + `GaugeGroupI` and gauge algebra `GaugeAlgebra`. Nothing is redefined. Every data field + is an existing Standard Model construction and every proof field an existing Standard + Model lemma. -/ +noncomputable def localGaugeData : + LocalGaugeData JetGaugeGroupI GaugeAlgebra GaugeGroupI JetGaugeAlgebra where + eval := JetGaugeGroupI.eval + ofConstant := JetGaugeGroupI.ofConstant + eval_ofConstant := JetGaugeGroupI.eval_ofConstant + evalLie := JetGaugeAlgebra.eval + ofConstantLie := JetGaugeAlgebra.ofConstant + ofConstantLie_lie := JetGaugeAlgebra.ofConstant_lie + deriv := JetGaugeAlgebra.deriv + deriv_comm := JetGaugeAlgebra.deriv_comm + deriv_bracket := JetGaugeAlgebra.deriv_bracket + deriv_ofConstantLie := JetGaugeAlgebra.deriv_ofConstant + adjoint := JetGaugeAlgebra.adjoint + adjoint_lie := JetGaugeAlgebra.adjointMap_lie + mc := maurerCartanForm + mc_one := fun μ => congrFun maurerCartanForm_one μ + mc_cocycle := maurerCartanForm_cocycle + mc_structure := maurerCartanForm_structure + deriv_adjoint := deriv_adjointMap + adjointValue := GaugeAlgebra.adjoint + evalLie_adjoint_ofConstantLie := JetGaugeAlgebra.eval_adjointMap_ofConstant + +/-! + +## B. The generic interface in Standard Model terms + +These rules point from the generic interface to the Standard Model definitions, which is +the direction in which the existing Standard Model lemmas become applicable. + +### B.1. The group and Lie algebra data + +-/ + +@[simp] +lemma localGaugeData_eval : localGaugeData.eval = JetGaugeGroupI.eval := rfl + +@[simp] +lemma localGaugeData_ofConstant : localGaugeData.ofConstant = JetGaugeGroupI.ofConstant := rfl + +@[simp] +lemma localGaugeData_evalLie : localGaugeData.evalLie = JetGaugeAlgebra.eval := rfl + +@[simp] +lemma localGaugeData_ofConstantLie : + localGaugeData.ofConstantLie = JetGaugeAlgebra.ofConstant := rfl + +@[simp] +lemma localGaugeData_adjointValue : localGaugeData.adjointValue = GaugeAlgebra.adjoint := rfl + +/-! + +### B.2. The derivative, the adjoint action and the Maurer–Cartan form + +-/ + +@[simp] +lemma localGaugeData_deriv (μ : Fin 1 ⊕ Fin 3) : + localGaugeData.deriv μ = JetGaugeAlgebra.deriv μ := rfl + +/-- The generic iterated derivative is the Standard Model iterated derivative, both being + the same fold of `JetGaugeAlgebra.deriv` over the multiset of directions. -/ +@[simp] +lemma localGaugeData_iteratedDeriv (s : Multiset (Fin 1 ⊕ Fin 3)) : + localGaugeData.iteratedDeriv s = JetGaugeAlgebra.iteratedDeriv s := rfl + +@[simp] +lemma localGaugeData_adjoint : localGaugeData.adjoint = JetGaugeAlgebra.adjoint := rfl + +@[simp] +lemma localGaugeData_mc : localGaugeData.mc = maurerCartanForm := rfl + +/-! + +## C. The generic adjoint transport is the Standard Model adjoint transport + +The composite `evalLie ∘ ∂_x ∘ Ad_U ∘ ofConstantLie`, by which the generic theory +transports the gauge algebra to the base point, is the map the Standard Model +covariant-derivative development already uses under the same name. + +-/ + +@[simp] +lemma localGaugeData_adjointCoeff (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : + _root_.IsGaugeField.adjointCoeff localGaugeData U x = IsGaugeField.adjointCoeff U x := rfl + +@[simp] +lemma localGaugeData_adjointDualCoeff (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : + _root_.adjointDualCoeff localGaugeData U x = adjointDualCoeff U x := rfl + +/-- The generic base-point Taylor coefficient of a representation is the Standard Model + one. Neither side mentions the package — both are `jetEval ∘ ∂_x ∘ rep U ∘ jetOfConstant` + — but the two `jet`-level operations are defined in different namespaces, and this rule + points from the generic one to the Standard Model one. -/ +@[simp] +lemma localGaugeData_repCoeff {V : Type} [AddCommGroup V] [Module ℂ V] + (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) (U : JetGaugeGroupI) + (x : Multiset (Fin 1 ⊕ Fin 3)) : + _root_.IsGaugeField.repCoeff rep U x = IsGaugeField.repCoeff rep U x := rfl + +@[simp] +lemma localGaugeData_repDualCoeff {V : Type} [AddCommGroup V] [Module ℂ V] + (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) (U : JetGaugeGroupI) + (x : Multiset (Fin 1 ⊕ Fin 3)) : + _root_.IsGaugeField.repDualCoeff rep U x = IsGaugeField.repDualCoeff rep U x := rfl + +/-! + +### C.1. Gauge fields + +-/ + +/-- **A Standard Model gauge field is a gauge field of the package.** The two structures + have the same three fields: the generic `adjointDualCoeff` and Maurer–Cartan form at + `localGaugeData` are the Standard Model ones, so each law transfers unchanged. This is + the bridge along which the generic covariance theorems apply to the Standard Model. -/ +lemma IsGaugeField.toLocalGaugeData {B : Type} [Ring B] [Algebra ℂ B] + {repLorentz : Representation ℂ SL(2,ℂ) B} {repGauge : Representation ℂ JetGaugeGroupI B} + {A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} + (hA : IsGaugeField repLorentz repGauge A) : + _root_.IsGaugeField localGaugeData repLorentz repGauge A where + lorentz_apply := hA.lorentz_apply + gauge_apply_deriv := hA.gauge_apply_deriv + gauge_mul := hA.gauge_mul + +/-! + +### C.2. The generic covariance theorems in Standard Model terms + +The covariance of the covariant derivative is proved once, generically, in +`Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction`. The +Standard Model `TransformsIn`, `covDerivAction` and `covDerivIter` are the generic ones +at `localGaugeData`, so those theorems specialize; only the gauge-field hypothesis needs +the bridge `IsGaugeField.toLocalGaugeData`. + +-/ + +section Covariance + +variable {B : Type} [Ring B] [Algebra ℂ B] {V : Type} [AddCommGroup V] [Module ℂ V] + [FiniteDimensional ℂ V] + {repLorentz : Representation ℂ SL(2,ℂ) B} {repGauge : Representation ℂ JetGaugeGroupI B} + {A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} + {rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)} + {act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℂ] V} + {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B} + +omit [FiniteDimensional ℂ V] in +/-- A matter gauge tensor transforms at the base point through the dual coefficient of the + base-point value of the gauge jet alone: the generic + `LocalGaugeData.TransformsIn.repGauge_zero`. -/ +lemma TransformsIn.repGauge_zero (hF : TransformsIn repGauge rep F) (U : JetGaugeGroupI) + (φ : Module.Dual ℂ V) : + repGauge U (F 0 φ) = F 0 (IsGaugeField.repDualCoeff rep U⁻¹ 0 φ) := + _root_.LocalGaugeData.TransformsIn.repGauge_zero hF U φ + +/-- **The covariant derivative preserves `TransformsIn`**, for the Standard Model: the + generic `LocalGaugeData.TransformsIn.covDerivAction` read at `localGaugeData`. -/ +theorem TransformsIn.covDerivAction (hA : IsGaugeField repLorentz repGauge A) + (hF : TransformsIn repGauge rep F) + (hact : localGaugeData.IsInfinitesimalActionOf act rep) + (ρ : Fin 1 ⊕ Fin 3) : + TransformsIn repGauge rep (IsGaugeField.covDerivAction A act F ρ) := + _root_.LocalGaugeData.TransformsIn.covDerivAction hA.toLocalGaugeData hF hact ρ + +/-- **Every iterated covariant derivative preserves `TransformsIn`**, for the Standard + Model: the recursion of `TransformsIn.covDerivAction` over the tuple of directions. -/ +theorem TransformsIn.covDerivIter (hA : IsGaugeField repLorentz repGauge A) + (hF : TransformsIn repGauge rep F) + (hact : localGaugeData.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 are fixed by pure jets**, for the Standard Model: the generic + `LocalGaugeData.TransformsIn.repGauge_eq_of_eval_eq_one`, with membership in the zeroth truncation + kernel read as triviality of the base-point value. -/ +lemma TransformsIn.repGauge_eq_of_mem_truncationKer_zero + (hF : TransformsIn repGauge rep F) + (hrep : ∀ {W : JetGaugeGroupI}, W.eval = 1 → IsGaugeField.repCoeff rep W 0 = LinearMap.id) + (U : JetGaugeGroupI.truncationKer 0) (φ : Module.Dual ℂ V) : + repGauge U.1 (F 0 φ) = F 0 φ := + _root_.LocalGaugeData.TransformsIn.repGauge_eq_of_eval_eq_one (jets := localGaugeData) hF hrep + (JetGaugeGroupI.mem_truncationKer_zero_iff.mp U.2) φ + +end Covariance + +/-! + +## D. The Taylor–Leibniz rule + +-/ + +/-- The Standard Model package obeys the Taylor–Leibniz rule for the adjoint action. The + class field is the existing theorem `JetGaugeAlgebra.eval_iteratedDeriv_adjointMap`: the + `IsGaugeField.adjointCoeff U p.1` appearing there is by definition the composite + `evalLie ∘ ∂_{p.1} ∘ Ad_U ∘ ofConstantLie` that the field writes out. + + Unlike the package itself this is a property of it and not a choice, so it is an + instance. -/ +instance instLocalGaugeDataLeibniz : LocalGaugeDataLeibniz localGaugeData where + evalLie_iteratedDeriv_adjoint := JetGaugeAlgebra.eval_iteratedDeriv_adjointMap + +end StandardModel diff --git a/Physlib/Particles/StandardModel/HiggsBoson/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/HiggsBoson/GaugeAlgebraAction.lean index 8a31ae0ba..f2c6b40df 100644 --- a/Physlib/Particles/StandardModel/HiggsBoson/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/HiggsBoson/GaugeAlgebraAction.lean @@ -6,7 +6,8 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.HiggsBoson.JetAlgebra.Basic -public import Physlib.Particles.StandardModel.GaugeAlgebra.InfinitesimalAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction +public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.GaugeAction public import Mathlib.LinearAlgebra.TensorProduct.Pi public import Mathlib.Analysis.Normed.Lp.Matrix @@ -20,7 +21,7 @@ The infinitesimal `(1, 2)_{3}` action of the gauge algebra on the Higgs doublet: 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 +`LocalGaugeData.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 @@ -104,7 +105,7 @@ noncomputable def actionMatrix (c : GaugeAlgebra) : Matrix (Fin 2) (Fin 2) ℂ : 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`. -/ + `LocalGaugeData.IsInfinitesimalActionOf`. -/ noncomputable def gaugeAlgebraAction : GaugeAlgebra →ₗ[ℝ] HiggsVec →ₗ[ℂ] HiggsVec where toFun c := weakEnd (actionMatrix c) @@ -135,7 +136,7 @@ noncomputable def gaugeAlgebraAction : ## 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 +jet gauge action, in the sense of `LocalGaugeData.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. @@ -437,9 +438,11 @@ set_option maxHeartbeats 1000000 in coefficients obey the Maurer–Cartan Leibniz law and intertwine the action with the adjoint transports. -/ theorem isInfinitesimalActionOf : - GaugeAlgebra.IsInfinitesimalActionOf gaugeAlgebraAction repJetGaugeGroupI := by + localGaugeData.IsInfinitesimalActionOf gaugeAlgebraAction repJetGaugeGroupI := by constructor · intro U μ x + simp only [localGaugeData_repCoeff, localGaugeData_evalLie, + localGaugeData_iteratedDeriv, localGaugeData_mc] have hMcons : ((jetGaugeMatrix U).map fun f => constantCoeff ((μ ::ₘ x).foldl (fun h ρ => pderiv ℂ ρ h) f)) = -((x.antidiagonal.map fun p => @@ -471,6 +474,7 @@ theorem isInfinitesimalActionOf : rw [Function.comp_apply, weakEnd_mul, repCoeff_eq] rfl · intro U x c + simp only [localGaugeData_repCoeff, localGaugeData_adjointCoeff] 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] diff --git a/Physlib/Particles/StandardModel/HiggsBoson/MatterField.lean b/Physlib/Particles/StandardModel/HiggsBoson/MatterField.lean index cf076b91c..7f9300281 100644 --- a/Physlib/Particles/StandardModel/HiggsBoson/MatterField.lean +++ b/Physlib/Particles/StandardModel/HiggsBoson/MatterField.lean @@ -6,7 +6,7 @@ Authors: Nathaneal Sajan module public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.Basic -public import Physlib.Particles.StandardModel.GaugeGroup.GaugeJet +public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData public import Physlib.Particles.StandardModel.HiggsBoson.GaugeAlgebraAction public import Physlib.Particles.StandardModel.HiggsBoson.JetAlgebra.Basic /-! @@ -49,13 +49,15 @@ namespace HiggsVec -/ -/-- The Higgs field as a matter field of `StandardModel.gaugeJet`, valued in `HiggsVec`, in the - `2_{3}` representation of the gauge group, a Lorentz scalar, of mass weight two. -/ -noncomputable def matterField : MatterField gaugeJet where +/-- The Higgs field as a matter field of `StandardModel.localGaugeData`, valued in + `HiggsVec`, in the `2_{3}` representation of the gauge group, a Lorentz scalar, of mass + weight two. -/ +noncomputable def matterField : MatterField localGaugeData where V := HiggsVec repLorentz := Representation.trivial ℂ SL(2,ℂ) HiggsVec repJet := repJetGaugeGroupI repAlgebra := gaugeAlgebraAction + repAlgebra_isInfinitesimalAction := isInfinitesimalActionOf repJet_smul := repJetGaugeGroupI_smul massWeight := 2 diff --git a/Physlib/Particles/StandardModel/JetAlgebra/TransformsIn.lean b/Physlib/Particles/StandardModel/JetAlgebra/TransformsIn.lean index 9f0c714fe..697888d00 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/TransformsIn.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/TransformsIn.lean @@ -275,7 +275,7 @@ private lemma repDualCoeff_repConj_transpose {V W : Type} [AddCommGroup V] [Modu refine LinearMap.ext fun v => ?_ show φ (ConjModule.map p (IsGaugeField.repCoeff (repConj repV) U s v)) = φ (IsGaugeField.repCoeff (repConj repW) U s (ConjModule.map p v)) - rw [GaugeAlgebra.repCoeff_repConj, GaugeAlgebra.repCoeff_repConj] + rw [repCoeff_repConj, repCoeff_repConj] exact congrArg φ (LinearMap.congr_fun (hp U s) v) /-- The jet gauge transformation law of the conjugate symbols of a fermion species: the law diff --git a/Physlib/Particles/StandardModel/Matter/JetComponentSpace/Basic.lean b/Physlib/Particles/StandardModel/Matter/JetComponentSpace/Basic.lean index 8997b63c6..43a6cd638 100644 --- a/Physlib/Particles/StandardModel/Matter/JetComponentSpace/Basic.lean +++ b/Physlib/Particles/StandardModel/Matter/JetComponentSpace/Basic.lean @@ -6,6 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.GaugeGroup.JetGaugeGroup.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.CovariantDeriv public import Mathlib.LinearAlgebra.Contraction public import Mathlib.LinearAlgebra.TensorProduct.Prod @@ -253,6 +254,23 @@ lemma repConj_apply_tmul (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ (TensorProduct.congr JetRing.starConjEquiv (LinearEquiv.refl ℂ (ConjModule V)))) (conjEquiv (k := ℂ) (M := JetRing ⊗[ℂ] V) (rep U (star f ⊗ₜ[ℂ] v))) := rfl +/-- **The base-point Taylor coefficients of the conjugate representation are the + conjugated coefficients.** This is the generic `LocalGaugeData.repCoeff_repConj`, read at + the Standard Model `repConj`: the two conjugate representations are the same map. -/ +lemma repCoeff_repConj (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) + (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : + IsGaugeField.repCoeff (repConj rep) U x + = ConjModule.endConj (IsGaugeField.repCoeff rep U x) := + _root_.LocalGaugeData.repCoeff_repConj rep U x + +/-- The base-point triviality of the zeroth Taylor coefficient passes to the conjugate + representation. -/ +lemma repCoeff_repConj_zero_eq_id + {rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)} {W : JetGaugeGroupI} + (hrep : IsGaugeField.repCoeff rep W 0 = LinearMap.id) : + IsGaugeField.repCoeff (repConj rep) W 0 = LinearMap.id := + _root_.LocalGaugeData.repCoeff_repConj_zero_eq_id hrep + /-- **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. -/ diff --git a/Physlib/Particles/StandardModel/Matter/JetComponentSpace/CovariantDeriv.lean b/Physlib/Particles/StandardModel/Matter/JetComponentSpace/CovariantDeriv.lean index 9c258c6e8..b0aaa55ed 100644 --- a/Physlib/Particles/StandardModel/Matter/JetComponentSpace/CovariantDeriv.lean +++ b/Physlib/Particles/StandardModel/Matter/JetComponentSpace/CovariantDeriv.lean @@ -50,7 +50,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.GaugeAlgebra.InfinitesimalAction`. +in `Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction`. -/ From 1b9f6aef08d10e032c1516e367bb9e1fdd64eb60 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 8 Sep 2026 12:56:24 +0100 Subject: [PATCH 295/367] feat: Generalize some properties of MaurerCartan --- Physlib.lean | 1 + .../GaugeTheory/GaugeBoson/GaugeAction.lean | 34 +-- .../GaugeTheory/GaugeField/Basic.lean | 102 ++++---- .../GaugeTheory/GaugeField/FieldStrength.lean | 22 +- .../GaugeField/TransformsInAdjoint.lean | 18 +- .../GaugeTheory/LocalGaugeData/Basic.lean | 69 +++++- .../LocalGaugeData/InfinitesimalAction.lean | 22 +- .../LocalGaugeData/MaurerCartan.lean | 219 +++++++++++++++++ .../DownSinglet/GaugeAlgebraAction.lean | 2 +- .../LeptonDoublet/GaugeAlgebraAction.lean | 2 +- .../LeptonSinglet/GaugeAlgebraAction.lean | 2 +- .../QuarkDoublet/GaugeAlgebraAction.lean | 2 +- .../UpSinglet/GaugeAlgebraAction.lean | 2 +- .../AlgebraValued/Symmeterized.lean | 11 +- .../GaugeGroup/LocalGaugeData.lean | 42 +++- .../GaugeGroup/MaurerCartan/Basic.lean | 229 +----------------- .../GaugeGroup/MaurerCartan/Truncation.lean | 90 ++++++- .../HiggsBoson/GaugeAlgebraAction.lean | 2 +- 18 files changed, 521 insertions(+), 350 deletions(-) create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/MaurerCartan.lean diff --git a/Physlib.lean b/Physlib.lean index 5bdd2bd99..3ede70e2c 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -11,6 +11,7 @@ public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeField.FieldStrength public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeField.TransformsInAdjoint public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.MaurerCartan public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.TransformsIn public import Physlib.ClassicalFieldTheory.GaugeTheory.Matter.Charge public import Physlib.ClassicalFieldTheory.GaugeTheory.Matter.CovariantDeriv diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeAction.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeAction.lean index aa720ff29..48392b4b8 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeAction.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeAction.lean @@ -15,7 +15,7 @@ public import Physlib.Mathematics.MultisetAntidiagonal ## 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 +`A_μ ↦ Ad_U A_μ + maurerCartan(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 @@ -291,14 +291,14 @@ variable (jets) in noncomputable def mcBosonCoeff (U : G) (s : Multiset (Fin 1 ⊕ Fin 3)) : (GaugeBoson 𝔤) := ⟨∑ μ, Lorentz.CoVector.basis μ ⊗ₜ[ℝ] - jets.evalLie (jets.iteratedDeriv s (jets.mc U μ))⟩ + jets.evalLie (jets.iteratedDeriv s (jets.maurerCartan U μ))⟩ @[simp] lemma mcBosonCoeff_one (s : Multiset (Fin 1 ⊕ Fin 3)) : mcBosonCoeff jets 1 s = 0 := by rw [show (0 : (GaugeBoson 𝔤)) = ⟨0⟩ from rfl, mcBosonCoeff] congr 1 refine Finset.sum_eq_zero fun μ _ => ?_ - rw [show jets.mc 1 μ = 0 from jets.mc_one μ, map_zero, + rw [show jets.maurerCartan 1 μ = 0 from jets.maurerCartan_one μ, map_zero, map_zero, TensorProduct.tmul_zero] /-- The Maurer–Cartan Taylor coefficients of a product: the cocycle identity, with the @@ -313,12 +313,12 @@ lemma mcBosonCoeff_mul (U V : G) (s : Multiset (Fin 1 ⊕ Fin 3)) : (GaugeBoson.valLinEquiv 𝔤) (mcBosonCoeff jets W t) = ∑ μ, Lorentz.CoVector.basis μ ⊗ₜ[ℝ] jets.evalLie (jets.iteratedDeriv t - (jets.mc W μ)) := fun W t => rfl + (jets.maurerCartan W μ)) := fun W t => rfl have hB : ∀ p q : Multiset (Fin 1 ⊕ Fin 3), (GaugeBoson.valLinEquiv 𝔤) (GaugeBoson.adjointTransport jets U p (mcBosonCoeff jets V q)) = ∑ μ, Lorentz.CoVector.basis μ ⊗ₜ[ℝ] IsGaugeField.adjointCoeff jets U p (jets.evalLie - (jets.iteratedDeriv q (jets.mc V μ))) := by + (jets.iteratedDeriv q (jets.maurerCartan V μ))) := by intro p q rw [show (GaugeBoson.valLinEquiv 𝔤) (GaugeBoson.adjointTransport jets U p (mcBosonCoeff jets V q)) @@ -332,19 +332,19 @@ lemma mcBosonCoeff_mul (U V : G) (s : Multiset (Fin 1 ⊕ Fin 3)) : rw [TensorProduct.map_tmul, LinearMap.id_apply] have hA : (GaugeBoson.valLinEquiv 𝔤) (mcBosonCoeff jets (U * V) s) = ∑ μ, (Lorentz.CoVector.basis μ ⊗ₜ[ℝ] - jets.evalLie (jets.iteratedDeriv s (jets.mc U μ)) + jets.evalLie (jets.iteratedDeriv s (jets.maurerCartan U μ)) + (s.antidiagonal.map fun p => Lorentz.CoVector.basis μ ⊗ₜ[ℝ] IsGaugeField.adjointCoeff jets U p.1 (jets.evalLie - (jets.iteratedDeriv p.2 (jets.mc V μ)))).sum) := by + (jets.iteratedDeriv p.2 (jets.maurerCartan V μ)))).sum) := by rw [hE] refine Finset.sum_congr rfl fun μ _ => ?_ - rw [show jets.mc (U * V) μ - = jets.mc U μ + jets.adjoint U (jets.mc V μ) from - jets.mc_cocycle U V μ, + rw [show jets.maurerCartan (U * V) μ + = jets.maurerCartan U μ + jets.adjoint U (jets.maurerCartan V μ) from + jets.maurerCartan_cocycle U V μ, map_add, map_add, - show jets.adjoint U (jets.mc V μ) - = jets.adjoint U (jets.mc V μ) from rfl, + show jets.adjoint U (jets.maurerCartan V μ) + = jets.adjoint U (jets.maurerCartan V μ) from rfl, LocalGaugeDataLeibniz.evalLie_iteratedDeriv_adjoint, TensorProduct.tmul_add, Multiset.tmul_sum, Multiset.map_map] exact congrArg (fun z => _ + z) @@ -484,11 +484,11 @@ 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 jets W s) = φ (jets.evalLie (jets.iteratedDeriv s - (jets.mc W μ))) := by + (jets.maurerCartan W μ))) := by have hsum : mcBosonCoeff jets W s = ∑ ν, (⟨Lorentz.CoVector.basis ν ⊗ₜ[ℝ] jets.evalLie (jets.iteratedDeriv s - (jets.mc W ν))⟩ : (GaugeBoson 𝔤)) := by + (jets.maurerCartan W ν))⟩ : (GaugeBoson 𝔤)) := by apply (GaugeBoson.valLinEquiv 𝔤).injective rw [map_sum] rfl @@ -498,7 +498,7 @@ lemma componentDual_dualBasis_mcBosonCoeff (W : G) rw [Module.Basis.dualBasis_apply_self, ite_mul, one_mul, zero_mul]] rw [Finset.sum_ite_eq' Finset.univ μ (fun ν => φ (jets.evalLie (jets.iteratedDeriv s - (jets.mc W ν)))), if_pos (Finset.mem_univ μ)] + (jets.maurerCartan 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 @@ -511,7 +511,7 @@ theorem repJet_iteratedJetDeriv_ofA (U : G) (iteratedJetDeriv 𝔤) p.2 ((ofA 𝔤) μ (adjointDualCoeff jets U⁻¹ p.1 φ))).sum + algebraMap ℝ (GaugeJetAlgebra 𝔤) (φ (jets.evalLie (jets.iteratedDeriv s - (jets.mc U⁻¹ μ)))) := by + (jets.maurerCartan U⁻¹ μ)))) := by rw [iteratedJetDeriv_ofA, repJet_ι, transport_basis_tmul, mcShift_basis_tmul, componentDual_dualBasis_mcBosonCoeff, map_multiset_sum, Multiset.map_map] congr 1 @@ -590,7 +590,7 @@ theorem complexRepJet_iteratedD_one_tmul_ofA (U : G) ((1 : ℂ) ⊗ₜ[ℝ] (ofA 𝔤) μ (adjointDualCoeff jets U⁻¹ p.1 φ))).sum + algebraMap ℂ (ℂ ⊗[ℝ] (GaugeJetAlgebra 𝔤)) (((φ (jets.evalLie (jets.iteratedDeriv s - (jets.mc U⁻¹ μ))) : ℝ)) : ℂ) := by + (jets.maurerCartan U⁻¹ μ))) : ℝ)) : ℂ) := by rw [iteratedD_complexJetDeriv_one_tmul, complexRepJet_tmul, repJet_iteratedJetDeriv_ofA, TensorProduct.tmul_add, Multiset.tmul_sum, Multiset.map_map, one_tmul_algebraMap] diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/Basic.lean index 8953ea504..e150972ff 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/Basic.lean @@ -31,15 +31,15 @@ satisfies, with nothing postulated beyond them. 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)_μ`, + `A_μ ↦ Ad_g A_μ + maurerCartan(g)_μ`, -where `mc(g)_μ = i (∂_μ g) g⁻¹` is the Maurer–Cartan form. The symbols `[∂_s A_μ^a]` +where `maurerCartan(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)|`, + ` + (∂_s maurerCartan(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 @@ -56,7 +56,7 @@ of the jet group `G` and not merely of its value group `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⁻¹ μ))`, +* `(∂_s maurerCartan(g⁻¹)_μ)|` is `JetGaugeAlgebra.eval (iteratedDeriv s (maurerCartanForm g⁻¹ μ))`, a constant algebra element, paired with `φ` and embedded in `B` as a scalar. -/ @@ -111,7 +111,7 @@ lemma adjointDualCoeff_singleton (U : G) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : adjointDualCoeff jets U {μ} φ = -adjointDualCoeff jets U 0 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 - (jets.evalLie (jets.mc U μ))) := by + (jets.evalLie (jets.maurerCartan 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, @@ -153,7 +153,7 @@ variable (jets) in * 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 + Leibniz expansion of `A_μ ↦ Ad_{U⁻¹} A_μ + maurerCartan(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) @@ -176,7 +176,7 @@ structure IsGaugeField (repLorentz : Representation ℂ SL(2,ℂ) B) (s.antidiagonal.map fun p => (A p.2 μ (adjointDualCoeff jets U⁻¹ p.1 φ))).sum + algebraMap ℂ B (φ (jets.evalLie (jets.iteratedDeriv s - (jets.mc U⁻¹ μ)))) + (jets.maurerCartan 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), @@ -224,7 +224,7 @@ noncomputable def commutator lemma repGauge_apply (hA : IsGaugeField jets repLorentz repGauge A) (U : G) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : repGauge U (A 0 μ φ) = A 0 μ (adjointDualCoeff jets U⁻¹ ∅ φ) + - algebraMap ℂ B (φ (jets.evalLie (jets.mc U⁻¹ μ))) := by + algebraMap ℂ B (φ (jets.evalLie (jets.maurerCartan U⁻¹ μ))) := by simpa [show (∅ : Multiset (Fin 1 ⊕ Fin 3)) = 0 from rfl] using hA.gauge_apply_deriv U 0 μ φ @@ -237,7 +237,7 @@ lemma repGauge_deriv_apply (hA : IsGaugeField jets repLorentz repGauge A) repGauge U (A {ρ} σ φ) = A {ρ} σ (adjointDualCoeff jets U⁻¹ 0 φ) + A 0 σ (adjointDualCoeff jets U⁻¹ {ρ} φ) + algebraMap ℂ B (φ (jets.evalLie - (jets.deriv ρ (jets.mc U⁻¹ σ)))) := by + (jets.deriv ρ (jets.maurerCartan 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 @@ -371,7 +371,7 @@ lemma tensorBracket_one_left (c : 𝔤) (t : B ⊗[ℝ] 𝔤) : 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 + `c_μ = maurerCartan(U⁻¹)_μ|₀` the constant Maurer–Cartan shift, bilinearity of the bracket gives `⁅A_μ, A_ν⁆ ↦ Ad₀ ⁅A_μ, A_ν⁆ + ⁅Ad₀ A_μ, c_ν⁆ + ⁅c_μ, Ad₀ A_ν⁆ + ⁅c_μ, c_ν⁆`: @@ -386,18 +386,18 @@ lemma repGauge_commutator (hA : IsGaugeField jets repLorentz repGauge A) repGauge U (commutator A μ ν φ) = commutator A μ ν (adjointDualCoeff jets U⁻¹ 0 φ) - A 0 μ (adjointDualCoeff jets U⁻¹ 0 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 - (jets.evalLie (jets.mc U⁻¹ ν)))) + (jets.evalLie (jets.maurerCartan U⁻¹ ν)))) + A 0 ν (adjointDualCoeff jets U⁻¹ 0 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 - (jets.evalLie (jets.mc U⁻¹ μ)))) - + algebraMap ℂ B (φ ⁅jets.evalLie (jets.mc U⁻¹ μ), - jets.evalLie (jets.mc U⁻¹ ν)⁆) := by + (jets.evalLie (jets.maurerCartan U⁻¹ μ)))) + + algebraMap ℂ B (φ ⁅jets.evalLie (jets.maurerCartan U⁻¹ μ), + jets.evalLie (jets.maurerCartan U⁻¹ ν)⁆) := by -- the linear maps and constants of the transformation law set Φ : B →ₗ[ℝ] B := (repGauge U).restrictScalars ℝ with hΦdef set T₀ : 𝔤 →ₗ[ℝ] 𝔤 := (jets.evalLie).toLinearMap ∘ₗ jets.iteratedDeriv 0 ∘ₗ jets.adjoint U⁻¹ ∘ₗ jets.ofConstantLie with hT₀def - set cμ : 𝔤 := jets.evalLie (jets.mc U⁻¹ μ) with hcμ - set cν : 𝔤 := jets.evalLie (jets.mc U⁻¹ ν) with hcν + set cμ : 𝔤 := jets.evalLie (jets.maurerCartan U⁻¹ μ) with hcμ + set cν : 𝔤 := jets.evalLie (jets.maurerCartan U⁻¹ ν) with hcν set s : B ⊗[ℝ] 𝔤 := dualPairEquiv.symm (A 0 μ) with hs set t : B ⊗[ℝ] 𝔤 := dualPairEquiv.symm (A 0 ν) with ht have hcoeff : adjointDualCoeff jets U⁻¹ 0 = T₀.dualMap := by rw [hT₀def]; rfl @@ -411,7 +411,7 @@ lemma repGauge_commutator (hA : IsGaugeField jets repLorentz repGauge A) have hfam : ∀ (ρ : Fin 1 ⊕ Fin 3), Φ ∘ₗ A 0 ρ = A 0 ρ ∘ₗ T₀.dualMap + dualPairEquiv ((1 : B) ⊗ₜ[ℝ] jets.evalLie - (jets.mc U⁻¹ ρ)) := by + (jets.maurerCartan U⁻¹ ρ)) := by intro ρ refine LinearMap.ext fun ψ => ?_ simp only [LinearMap.comp_apply, LinearMap.add_apply, hΦdef, @@ -475,21 +475,21 @@ lemma _root_.adjointDualCoeff_pair (U : G) (ρ μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : adjointDualCoeff jets U (ρ ::ₘ {μ}) φ = -adjointDualCoeff jets U 0 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 - (jets.evalLie (jets.deriv ρ (jets.mc U μ)))) + (jets.evalLie (jets.deriv ρ (jets.maurerCartan U μ)))) - adjointDualCoeff jets U {ρ} (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 - (jets.evalLie (jets.mc U μ))) := by + (jets.evalLie (jets.maurerCartan U μ))) := by refine LinearMap.ext fun a => ?_ have hderiv : ∀ τ : Fin 1 ⊕ Fin 3, jets.deriv τ (jets.adjoint U (jets.ofConstantLie a)) = - -⁅jets.mc U τ, + -⁅jets.maurerCartan U τ, jets.adjoint U (jets.ofConstantLie a)⁆ := fun τ => by rw [jets.deriv_adjoint, jets.deriv_ofConstantLie, map_zero, zero_sub] have hkey : jets.iteratedDeriv (ρ ::ₘ {μ}) (jets.adjoint U (jets.ofConstantLie a)) = - -⁅jets.deriv ρ (jets.mc U μ), + -⁅jets.deriv ρ (jets.maurerCartan U μ), jets.adjoint U (jets.ofConstantLie a)⁆ - + ⁅jets.mc U μ, ⁅jets.mc U ρ, + + ⁅jets.maurerCartan U μ, ⁅jets.maurerCartan U ρ, jets.adjoint U (jets.ofConstantLie a)⁆⁆ := by rw [LocalGaugeData.iteratedDeriv_cons, LinearMap.comp_apply, LocalGaugeData.iteratedDeriv_singleton, hderiv μ, map_neg, @@ -515,7 +515,7 @@ lemma repGauge_deriv_deriv_apply (hA : IsGaugeField jets repLorentz repGauge A) + A {σ} τ (adjointDualCoeff jets U⁻¹ {ρ} φ) + A 0 τ (adjointDualCoeff jets U⁻¹ (ρ ::ₘ {σ}) φ) + algebraMap ℂ B (φ (jets.evalLie (jets.deriv ρ - (jets.deriv σ (jets.mc U⁻¹ τ))))) := by + (jets.deriv σ (jets.maurerCartan 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 @@ -921,12 +921,12 @@ lemma _root_.adjointDualCoeff_cons (U : G) -((x.antidiagonal.map fun p => adjointDualCoeff jets U p.2 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie (jets.iteratedDeriv p.1 - (jets.mc U μ))))).sum) := by + (jets.maurerCartan U μ))))).sum) := by refine LinearMap.ext fun a => ?_ have hkey : jets.iteratedDeriv (μ ::ₘ x) (jets.adjoint U (jets.ofConstantLie a)) = -((x.antidiagonal.map fun p => - ⁅jets.iteratedDeriv p.1 (jets.mc U μ), + ⁅jets.iteratedDeriv p.1 (jets.maurerCartan U μ), jets.iteratedDeriv p.2 (jets.adjoint U (jets.ofConstantLie a))⁆).sum) := by rw [show (μ ::ₘ x : Multiset (Fin 1 ⊕ Fin 3)) = x + {μ} from by @@ -949,14 +949,14 @@ lemma _root_.adjointDualCoeff_cons (U : G) lemma _root_.eval_iteratedDeriv_maurerCartan_structure (U : G) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : jets.evalLie (jets.iteratedDeriv (μ ::ₘ s) - (jets.mc U ν)) = + (jets.maurerCartan U ν)) = jets.evalLie (jets.iteratedDeriv (ν ::ₘ s) - (jets.mc U μ)) + (jets.maurerCartan U μ)) - (s.antidiagonal.map fun p => ⁅jets.evalLie (jets.iteratedDeriv p.1 - (jets.mc U μ)), + (jets.maurerCartan U μ)), jets.evalLie (jets.iteratedDeriv p.2 - (jets.mc U ν))⁆).sum := by + (jets.maurerCartan U ν))⁆).sum := by have hconv : ∀ (κ : Fin 1 ⊕ Fin 3) (z : 𝔤J), jets.iteratedDeriv s (jets.deriv κ z) = jets.iteratedDeriv (κ ::ₘ s) z := by @@ -966,33 +966,33 @@ lemma _root_.eval_iteratedDeriv_maurerCartan_structure LocalGaugeData.iteratedDeriv_add, LinearMap.comp_apply, LocalGaugeData.iteratedDeriv_singleton] have h0 := congrArg (fun z => jets.evalLie (jets.iteratedDeriv s z)) - (jets.mc_structure U μ ν) + (jets.maurerCartan_structure U μ ν) simp only [map_add, map_sub, map_zero] at h0 rw [hconv, hconv, LocalGaugeData.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 jets.evalLie (jets.iteratedDeriv (μ ::ₘ s) - (jets.mc U ν)) + (jets.maurerCartan U ν)) + (s.antidiagonal.map fun p => ⁅jets.evalLie (jets.iteratedDeriv p.1 - (jets.mc U μ)), + (jets.maurerCartan U μ)), jets.evalLie (jets.iteratedDeriv p.2 - (jets.mc U ν))⁆).sum + (jets.maurerCartan U ν))⁆).sum = (jets.evalLie (jets.iteratedDeriv (μ ::ₘ s) - (jets.mc U ν)) + (jets.maurerCartan U ν)) - jets.evalLie (jets.iteratedDeriv (ν ::ₘ s) - (jets.mc U μ)) + (jets.maurerCartan U μ)) + (s.antidiagonal.map fun p => ⁅jets.evalLie (jets.iteratedDeriv p.1 - (jets.mc U μ)), + (jets.maurerCartan U μ)), jets.evalLie (jets.iteratedDeriv p.2 - (jets.mc U ν))⁆).sum) + (jets.maurerCartan U ν))⁆).sum) + jets.evalLie (jets.iteratedDeriv (ν ::ₘ s) - (jets.mc U μ)) := by + (jets.maurerCartan U μ)) := by abel _ = jets.evalLie (jets.iteratedDeriv (ν ::ₘ s) - (jets.mc U μ)) := by + (jets.maurerCartan U μ)) := by rw [h0, zero_add] /-! @@ -1015,9 +1015,9 @@ lemma repGauge_cons_apply (hA : IsGaugeField jets repLorentz repGauge A) (p.1.antidiagonal.map fun q => A p.2 τ (adjointDualCoeff jets U⁻¹ q.2 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie - (jets.iteratedDeriv q.1 (jets.mc U⁻¹ κ)))))).sum).sum + (jets.iteratedDeriv q.1 (jets.maurerCartan U⁻¹ κ)))))).sum).sum + algebraMap ℂ B (φ (jets.evalLie (jets.iteratedDeriv (κ ::ₘ s) - (jets.mc U⁻¹ τ)))) := by + (jets.maurerCartan U⁻¹ τ)))) := by rw [hA.gauge_apply_deriv U (κ ::ₘ s) τ φ] congr 1 simp only [Multiset.antidiagonal_cons, Multiset.map_add, Multiset.sum_add, @@ -1028,7 +1028,7 @@ lemma repGauge_cons_apply (hA : IsGaugeField jets repLorentz repGauge A) (p.1.antidiagonal.map fun q => A p.2 τ (adjointDualCoeff jets U⁻¹ q.2 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie - (jets.iteratedDeriv q.1 (jets.mc U⁻¹ κ)))))).sum).sum := by + (jets.iteratedDeriv q.1 (jets.maurerCartan 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] @@ -1051,24 +1051,24 @@ lemma repGauge_commutatorFam (hA : IsGaugeField jets repLorentz repGauge A) (p.2.antidiagonal.map fun r => A r.2 ν (adjointDualCoeff jets U⁻¹ r.1 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie - (jets.iteratedDeriv p.1 (jets.mc U⁻¹ μ)))))).sum).sum + (jets.iteratedDeriv p.1 (jets.maurerCartan U⁻¹ μ)))))).sum).sum - (s.antidiagonal.map fun p => (p.1.antidiagonal.map fun q => A q.2 μ (adjointDualCoeff jets U⁻¹ q.1 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie - (jets.iteratedDeriv p.2 (jets.mc U⁻¹ ν)))))).sum).sum + (jets.iteratedDeriv p.2 (jets.maurerCartan U⁻¹ ν)))))).sum).sum + (s.antidiagonal.map fun p => algebraMap ℂ B (φ ⁅jets.evalLie (jets.iteratedDeriv p.1 - (jets.mc U⁻¹ μ)), + (jets.maurerCartan U⁻¹ μ)), jets.evalLie (jets.iteratedDeriv p.2 - (jets.mc U⁻¹ ν))⁆)).sum := by + (jets.maurerCartan 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 jets U⁻¹ q.1).sum) ψ + algebraMap ℂ B (ψ (jets.evalLie - (jets.iteratedDeriv u (jets.mc U⁻¹ τ)))) := by + (jets.iteratedDeriv u (jets.maurerCartan U⁻¹ τ)))) := by intro τ u ψ rw [hA.gauge_apply_deriv U u τ ψ, Multiset.sum_linearMap_apply, Multiset.map_map] congr 1 @@ -1110,11 +1110,11 @@ lemma repGauge_commutatorFam (hA : IsGaugeField jets repLorentz repGauge A) have hCg : ∀ p : Multiset (Fin 1 ⊕ Fin 3) × Multiset (Fin 1 ⊕ Fin 3), ((p.2.antidiagonal.map fun r => A r.2 ν ∘ₗ adjointDualCoeff jets U⁻¹ r.1).sum) (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie - (jets.iteratedDeriv p.1 (jets.mc U⁻¹ μ)))) = + (jets.iteratedDeriv p.1 (jets.maurerCartan U⁻¹ μ)))) = (p.2.antidiagonal.map fun r => A r.2 ν (adjointDualCoeff jets U⁻¹ r.1 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie - (jets.iteratedDeriv p.1 (jets.mc U⁻¹ μ)))))).sum := by + (jets.iteratedDeriv p.1 (jets.maurerCartan U⁻¹ μ)))))).sum := by intro p rw [Multiset.sum_linearMap_apply, Multiset.map_map] refine congrArg Multiset.sum (Multiset.map_congr rfl fun r hr => ?_) @@ -1122,11 +1122,11 @@ lemma repGauge_commutatorFam (hA : IsGaugeField jets repLorentz repGauge A) have hCf : ∀ p : Multiset (Fin 1 ⊕ Fin 3) × Multiset (Fin 1 ⊕ Fin 3), ((p.1.antidiagonal.map fun q => A q.2 μ ∘ₗ adjointDualCoeff jets U⁻¹ q.1).sum) (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie - (jets.iteratedDeriv p.2 (jets.mc U⁻¹ ν)))) = + (jets.iteratedDeriv p.2 (jets.maurerCartan U⁻¹ ν)))) = (p.1.antidiagonal.map fun q => A q.2 μ (adjointDualCoeff jets U⁻¹ q.1 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie - (jets.iteratedDeriv p.2 (jets.mc U⁻¹ ν)))))).sum := by + (jets.iteratedDeriv p.2 (jets.maurerCartan U⁻¹ ν)))))).sum := by intro p rw [Multiset.sum_linearMap_apply, Multiset.map_map] refine congrArg Multiset.sum (Multiset.map_congr rfl fun q hq => ?_) diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/FieldStrength.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/FieldStrength.lean index d7ffceb5c..578391407 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/FieldStrength.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/FieldStrength.lean @@ -174,47 +174,47 @@ theorem repGauge_fieldStrength (hA : IsGaugeField jets repLorentz repGauge A) (p.1.antidiagonal.map fun q => A p.2 ν (adjointDualCoeff jets U⁻¹ q.2 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie - (jets.iteratedDeriv q.1 (jets.mc U⁻¹ μ)))))).sum).sum = + (jets.iteratedDeriv q.1 (jets.maurerCartan U⁻¹ μ)))))).sum).sum = (s.antidiagonal.map fun p => (p.2.antidiagonal.map fun r => A r.2 ν (adjointDualCoeff jets U⁻¹ r.1 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie - (jets.iteratedDeriv p.1 (jets.mc U⁻¹ μ)))))).sum).sum := + (jets.iteratedDeriv p.1 (jets.maurerCartan U⁻¹ μ)))))).sum).sum := Multiset.sum_antidiagonal_assoc s (fun a b c => A c ν (adjointDualCoeff jets U⁻¹ b (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie - (jets.iteratedDeriv a (jets.mc U⁻¹ μ)))))) + (jets.iteratedDeriv a (jets.maurerCartan U⁻¹ μ)))))) have hcancel₂ : (s.antidiagonal.map fun p => (p.1.antidiagonal.map fun q => A p.2 μ (adjointDualCoeff jets U⁻¹ q.2 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie - (jets.iteratedDeriv q.1 (jets.mc U⁻¹ ν)))))).sum).sum = + (jets.iteratedDeriv q.1 (jets.maurerCartan U⁻¹ ν)))))).sum).sum = (s.antidiagonal.map fun p => (p.1.antidiagonal.map fun q => A q.2 μ (adjointDualCoeff jets U⁻¹ q.1 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie - (jets.iteratedDeriv p.2 (jets.mc U⁻¹ ν)))))).sum).sum := by + (jets.iteratedDeriv p.2 (jets.maurerCartan U⁻¹ ν)))))).sum).sum := by refine (Multiset.sum_antidiagonal_assoc s (fun a b c => A c μ (adjointDualCoeff jets U⁻¹ b (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie - (jets.iteratedDeriv a (jets.mc U⁻¹ ν))))))).trans ?_ + (jets.iteratedDeriv a (jets.maurerCartan U⁻¹ ν))))))).trans ?_ exact Multiset.sum_antidiagonal_swap s (fun a b => (b.antidiagonal.map fun q => A q.2 μ (adjointDualCoeff jets U⁻¹ q.1 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie - (jets.iteratedDeriv a (jets.mc U⁻¹ ν)))))).sum) + (jets.iteratedDeriv a (jets.maurerCartan 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 : Θ (jets.evalLie (jets.iteratedDeriv (μ ::ₘ s) - (jets.mc U⁻¹ ν))) = + (jets.maurerCartan U⁻¹ ν))) = Θ (jets.evalLie (jets.iteratedDeriv (ν ::ₘ s) - (jets.mc U⁻¹ μ))) + (jets.maurerCartan U⁻¹ μ))) - (s.antidiagonal.map fun p => Θ ⁅jets.evalLie (jets.iteratedDeriv p.1 - (jets.mc U⁻¹ μ)), + (jets.maurerCartan U⁻¹ μ)), jets.evalLie (jets.iteratedDeriv p.2 - (jets.mc U⁻¹ ν))⁆).sum := by + (jets.maurerCartan U⁻¹ ν))⁆).sum := by rw [eval_iteratedDeriv_maurerCartan_structure U⁻¹ s μ ν, map_sub, map_multiset_sum, Multiset.map_map] congr 1 diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/TransformsInAdjoint.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/TransformsInAdjoint.lean index 618b5ef44..1518e6b45 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/TransformsInAdjoint.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/TransformsInAdjoint.lean @@ -106,7 +106,7 @@ lemma TransformsInAdjoint.repGauge_cons F p.2 (adjointDualCoeff jets U⁻¹ q.2 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie (jets.iteratedDeriv q.1 - (jets.mc U⁻¹ κ)))))).sum).sum := by + (jets.maurerCartan 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] @@ -117,7 +117,7 @@ lemma TransformsInAdjoint.repGauge_cons F p.2 (adjointDualCoeff jets U⁻¹ q.2 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie (jets.iteratedDeriv q.1 - (jets.mc U⁻¹ κ)))))).sum).sum := by + (jets.maurerCartan 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] @@ -143,12 +143,12 @@ lemma TransformsInAdjoint.repGauge_bracketFamConv F r.2 (adjointDualCoeff jets U⁻¹ r.1 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie (jets.iteratedDeriv p.1 - (jets.mc U⁻¹ ρ)))))).sum).sum := by + (jets.maurerCartan 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 jets U⁻¹ q.1).sum) ψ + algebraMap ℂ B (ψ (jets.evalLie - (jets.iteratedDeriv u (jets.mc U⁻¹ ρ)))) := by + (jets.iteratedDeriv u (jets.maurerCartan U⁻¹ ρ)))) := by intro u ψ rw [hA.gauge_apply_deriv U u ρ ψ, Multiset.sum_linearMap_apply, Multiset.map_map] congr 1 @@ -196,11 +196,11 @@ lemma TransformsInAdjoint.repGauge_bracketFamConv have hCg : ∀ p : Multiset (Fin 1 ⊕ Fin 3) × Multiset (Fin 1 ⊕ Fin 3), ((p.2.antidiagonal.map fun r => F r.2 ∘ₗ adjointDualCoeff jets U⁻¹ r.1).sum) (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie - (jets.iteratedDeriv p.1 (jets.mc U⁻¹ ρ)))) = + (jets.iteratedDeriv p.1 (jets.maurerCartan U⁻¹ ρ)))) = (p.2.antidiagonal.map fun r => F r.2 (adjointDualCoeff jets U⁻¹ r.1 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie - (jets.iteratedDeriv p.1 (jets.mc U⁻¹ ρ)))))).sum := by + (jets.iteratedDeriv p.1 (jets.maurerCartan U⁻¹ ρ)))))).sum := by intro p rw [Multiset.sum_linearMap_apply, Multiset.map_map] refine congrArg Multiset.sum (Multiset.map_congr rfl fun r hr => ?_) @@ -246,17 +246,17 @@ theorem TransformsInAdjoint.covDerivAdjoint F p.2 (adjointDualCoeff jets U⁻¹ q.2 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie (jets.iteratedDeriv q.1 - (jets.mc U⁻¹ ρ)))))).sum).sum = + (jets.maurerCartan U⁻¹ ρ)))))).sum).sum = (s.antidiagonal.map fun p => (p.2.antidiagonal.map fun r => F r.2 (adjointDualCoeff jets U⁻¹ r.1 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie (jets.iteratedDeriv p.1 - (jets.mc U⁻¹ ρ)))))).sum).sum := + (jets.maurerCartan U⁻¹ ρ)))))).sum).sum := Multiset.sum_antidiagonal_assoc s (fun a b c => F c (adjointDualCoeff jets U⁻¹ b (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie - (jets.iteratedDeriv a (jets.mc U⁻¹ ρ)))))) + (jets.iteratedDeriv a (jets.maurerCartan U⁻¹ ρ)))))) rw [hL, hF.repGauge_cons U ρ s φ, hF.repGauge_bracketFamConv hA U s ρ φ, hR, hcancel] abel diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Basic.lean index 949c2d720..ecd66d939 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Basic.lean @@ -27,8 +27,8 @@ this situation that the transformation laws of gauge fields and matter fields us * 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. +* the Maurer–Cartan form `maurerCartan U μ = i (∂_μ U) U⁻¹`, with its flatness equation + `maurerCartan_structure` and the Leibniz rule `deriv_adjoint` for the adjoint action. A term `jets : LocalGaugeData G 𝔤 G₀ 𝔤J` is supplied, not inferred: every construction below, and every construction downstream, takes the package it works over as an ordinary @@ -47,6 +47,9 @@ depends on that choice. - `LocalGaugeData.iteratedDeriv` : the iterated derivative `∂_s` on `𝔤J` along a multiset of directions, with `iteratedDeriv_cons`, `iteratedDeriv_add` and the iterated Leibniz rule `iteratedDeriv_bracket`. +- `LocalGaugeData.maurerCartan_eq_of_deriv_adjoint` : the Maurer–Cartan form is determined + by the Leibniz rule `deriv_adjoint` up to the centre of `𝔤J`, and so is genuine data + only because that centre can be nonzero. - `LocalGaugeDataLeibniz` : the Taylor–Leibniz rule for the adjoint action of a given package, the input to the gauge action on the algebra of gauge-boson symbols. - `LocalGaugeDataTruncation` : the filtration of `G` by the order to which a jet is @@ -86,16 +89,21 @@ structure LocalGaugeData (G : Type) [Group G] (𝔤 : Type) [LieRing 𝔤] [LieA 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 + maurerCartan : G → (Fin 1 ⊕ Fin 3) → 𝔤J + maurerCartan_one : ∀ μ, maurerCartan 1 μ = 0 + /-- A constant gauge transformation has vanishing Maurer–Cartan form: it has no + spacetime dependence to differentiate. -/ + maurerCartan_ofConstant : ∀ (g : G₀) (μ : Fin 1 ⊕ Fin 3), maurerCartan (ofConstant g) μ = 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 μ) + maurerCartan_cocycle : ∀ (U V : G) (μ : Fin 1 ⊕ Fin 3), + maurerCartan (U * V) μ = maurerCartan U μ + adjoint U (maurerCartan 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 + maurerCartan_structure : ∀ (U : G) (μ ν : Fin 1 ⊕ Fin 3), + deriv μ (maurerCartan U ν) - deriv ν (maurerCartan U μ) + + ⁅maurerCartan U μ, maurerCartan 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⁆ + deriv μ (adjoint U x) = adjoint U (deriv μ x) - ⁅maurerCartan 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 @@ -120,6 +128,30 @@ lemma evalLie_adjoint_ofConstantLie_of_eval_eq_one {U : G} (hU : jets.eval U = 1 jets.evalLie (jets.adjoint U (jets.ofConstantLie a)) = a := by rw [evalLie_adjoint_ofConstantLie, hU, map_one, Module.End.one_apply] +/-- **The Maurer–Cartan form is determined by the Leibniz rule, up to the centre.** Since + `adjoint U` is invertible, `deriv_adjoint` says exactly that the inner derivation + `⁅maurerCartan U μ, ·⁆` is `adjoint U ∘ deriv μ ∘ adjoint U⁻¹ − deriv μ`; so any other + form obeying the same rule differs from it by something acting trivially in the adjoint + representation of `𝔤J`. It follows that the Maurer–Cartan form is redundant data exactly + when that representation is faithful — which it is not for the Standard Model, whose jet + gauge algebra has a central `u(1)` factor. That is why `maurerCartan` is a field of the + structure rather than a construction from the rest of it. -/ +lemma maurerCartan_eq_of_deriv_adjoint + (hfaithful : ∀ x y : 𝔤J, (∀ z : 𝔤J, ⁅x, z⁆ = ⁅y, z⁆) → x = y) + (ω : G → (Fin 1 ⊕ Fin 3) → 𝔤J) + (hω : ∀ (U : G) (μ : Fin 1 ⊕ Fin 3) (x : 𝔤J), + jets.deriv μ (jets.adjoint U x) + = jets.adjoint U (jets.deriv μ x) - ⁅ω U μ, jets.adjoint U x⁆) : + ω = jets.maurerCartan := by + funext U μ + refine hfaithful _ _ fun z => ?_ + have hz : jets.adjoint U (jets.adjoint U⁻¹ z) = z := by + rw [← Module.End.mul_apply, ← map_mul, mul_inv_cancel, map_one, Module.End.one_apply] + have h1 := hω U μ (jets.adjoint U⁻¹ z) + have h2 := jets.deriv_adjoint U μ (jets.adjoint U⁻¹ z) + rw [hz] at h1 h2 + exact sub_right_injective (h1.symm.trans h2) + /-! ## A. The iterated derivative @@ -198,6 +230,27 @@ lemma iteratedDeriv_bracket (s : Multiset (Fin 1 ⊕ Fin 3)) (a b : 𝔤J) : Multiset.map_map, Function.comp_apply, Prod.map_fst, Prod.map_snd, id_eq] abel +/-- **The base-point Taylor data of a bracket is determined by that of its arguments.** + If the base-point values of the iterated derivatives of `a` and `b` along sub-multisets + of `w` agree with those of `a'` and `b'`, then so do those of the brackets: the iterated + Leibniz rule expands the bracket over the antidiagonal of `w`, whose parts are all + sub-multisets of `w`. -/ +lemma evalLie_iteratedDeriv_bracket_congr (w : Multiset (Fin 1 ⊕ Fin 3)) (a b a' b' : 𝔤J) + (ha : ∀ p ≤ w, jets.evalLie (jets.iteratedDeriv p a) + = jets.evalLie (jets.iteratedDeriv p a')) + (hb : ∀ p ≤ w, jets.evalLie (jets.iteratedDeriv p b) + = jets.evalLie (jets.iteratedDeriv p b')) : + jets.evalLie (jets.iteratedDeriv w ⁅a, b⁆) + = jets.evalLie (jets.iteratedDeriv w ⁅a', b'⁆) := by + rw [iteratedDeriv_bracket, iteratedDeriv_bracket, map_multiset_sum, map_multiset_sum, + Multiset.map_map, Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) + have hw := Multiset.mem_antidiagonal.mp hp + have h1 : p.1 ≤ w := Multiset.le_iff_exists_add.mpr ⟨p.2, hw.symm⟩ + have h2 : p.2 ≤ w := Multiset.le_iff_exists_add.mpr ⟨p.1, by rw [← hw, add_comm]⟩ + simp only [Function.comp_apply] + rw [LieHom.map_lie, LieHom.map_lie, ha p.1 h1, hb p.2 h2] + /-- 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) diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/InfinitesimalAction.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/InfinitesimalAction.lean index 86c3247f2..b2a6bc9f9 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/InfinitesimalAction.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/InfinitesimalAction.lean @@ -91,7 +91,7 @@ structure IsInfinitesimalActionOf (jets : LocalGaugeData G 𝔤 G₀ 𝔤J) repCoeff_cons : ∀ (U : G) (μ : Fin 1 ⊕ Fin 3) (x : Multiset (Fin 1 ⊕ Fin 3)), repCoeff rep U (μ ::ₘ x) = -((x.antidiagonal.map fun p => - act (jets.evalLie (jets.iteratedDeriv p.1 (jets.mc U μ))) ∘ₗ + act (jets.evalLie (jets.iteratedDeriv p.1 (jets.maurerCartan U μ))) ∘ₗ repCoeff rep U p.2).sum) repCoeff_act : ∀ (U : G) (x : Multiset (Fin 1 ⊕ Fin 3)) (c : 𝔤), repCoeff rep U x ∘ₗ act c = @@ -109,7 +109,7 @@ lemma IsInfinitesimalActionOf.repDualCoeff_cons repDualCoeff rep U (μ ::ₘ x) φ = -((x.antidiagonal.map fun p => repDualCoeff rep U p.2 (φ ∘ₗ act (jets.evalLie - (jets.iteratedDeriv p.1 (jets.mc U μ))))).sum) := by + (jets.iteratedDeriv p.1 (jets.maurerCartan 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, @@ -182,7 +182,7 @@ lemma TransformsIn.repGauge_cons (p.1.antidiagonal.map fun q => F p.2 (repDualCoeff rep U⁻¹ q.2 (φ ∘ₗ act (jets.evalLie (jets.iteratedDeriv q.1 - (jets.mc U⁻¹ κ)))))).sum).sum := by + (jets.maurerCartan 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] @@ -192,7 +192,7 @@ lemma TransformsIn.repGauge_cons (p.1.antidiagonal.map fun q => F p.2 (repDualCoeff rep U⁻¹ q.2 (φ ∘ₗ act (jets.evalLie (jets.iteratedDeriv q.1 - (jets.mc U⁻¹ κ)))))).sum).sum := by + (jets.maurerCartan 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_multiset_sum, Multiset.map_map] @@ -219,12 +219,12 @@ lemma TransformsIn.repGauge_actionFamConv (p.2.antidiagonal.map fun r => F r.2 (repDualCoeff rep U⁻¹ r.1 (φ ∘ₗ act (jets.evalLie (jets.iteratedDeriv p.1 - (jets.mc U⁻¹ ρ)))))).sum).sum := by + (jets.maurerCartan 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 jets U⁻¹ q.1).sum) ψ + algebraMap ℂ B (ψ (jets.evalLie - (jets.iteratedDeriv u (jets.mc U⁻¹ ρ)))) := by + (jets.iteratedDeriv u (jets.maurerCartan U⁻¹ ρ)))) := by intro u ψ rw [hA.gauge_apply_deriv U u ρ ψ, Multiset.sum_linearMap_apply, Multiset.map_map] congr 1 @@ -272,11 +272,11 @@ lemma TransformsIn.repGauge_actionFamConv have hCg : ∀ p : Multiset (Fin 1 ⊕ Fin 3) × Multiset (Fin 1 ⊕ Fin 3), ((p.2.antidiagonal.map fun r => F r.2 ∘ₗ repDualCoeff rep U⁻¹ r.1).sum) (φ ∘ₗ act (jets.evalLie - (jets.iteratedDeriv p.1 (jets.mc U⁻¹ ρ)))) = + (jets.iteratedDeriv p.1 (jets.maurerCartan U⁻¹ ρ)))) = (p.2.antidiagonal.map fun r => F r.2 (repDualCoeff rep U⁻¹ r.1 (φ ∘ₗ act (jets.evalLie (jets.iteratedDeriv p.1 - (jets.mc U⁻¹ ρ)))))).sum := by + (jets.maurerCartan U⁻¹ ρ)))))).sum := by intro p rw [Multiset.sum_linearMap_apply, Multiset.map_map] refine congrArg Multiset.sum (Multiset.map_congr rfl fun r hr => ?_) @@ -318,16 +318,16 @@ theorem TransformsIn.covDerivAction (p.1.antidiagonal.map fun q => F p.2 (repDualCoeff rep U⁻¹ q.2 (φ ∘ₗ act (jets.evalLie (jets.iteratedDeriv q.1 - (jets.mc U⁻¹ ρ)))))).sum).sum = + (jets.maurerCartan U⁻¹ ρ)))))).sum).sum = (s.antidiagonal.map fun p => (p.2.antidiagonal.map fun r => F r.2 (repDualCoeff rep U⁻¹ r.1 (φ ∘ₗ act (jets.evalLie (jets.iteratedDeriv p.1 - (jets.mc U⁻¹ ρ)))))).sum).sum := + (jets.maurerCartan U⁻¹ ρ)))))).sum).sum := Multiset.sum_antidiagonal_assoc s (fun a b c => F c (repDualCoeff rep U⁻¹ b (φ ∘ₗ act (jets.evalLie (jets.iteratedDeriv a - (jets.mc U⁻¹ ρ)))))) + (jets.maurerCartan U⁻¹ ρ)))))) rw [hL, hF.repGauge_cons hact U ρ s φ, hF.repGauge_actionFamConv hA hact U s ρ φ, hR, hcancel] abel diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/MaurerCartan.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/MaurerCartan.lean new file mode 100644 index 000000000..64d022920 --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/MaurerCartan.lean @@ -0,0 +1,219 @@ +/- +Copyright (c) 2026 Joseph Tooby-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.LocalGaugeData.Basic +/-! +# The Maurer–Cartan form of a local gauge data package + +## i. Overview + +The Maurer–Cartan form `ω_μ(U) = i (∂_μ U) U⁻¹` of a package +`jets : LocalGaugeData G 𝔤 G₀ 𝔤J` is the field `jets.maurerCartan`, subject to the cocycle +law `maurerCartan_cocycle`, its value `maurerCartan_one` on the identity and +`maurerCartan_ofConstant` on constants, and the flatness (structural) equation +`maurerCartan_structure`. This file develops what follows from those laws alone, for any +package: nothing here mentions a particular gauge group. + +The main construction is the *symmetrized* Maurer–Cartan form + + `ω̄_r(U) = (1 / |r|) ∑_{μ ∈ r} ∂_{r − {μ}} ω_μ(U)`, + +the average over which direction of the multiset `r` is carried by the form itself rather +than by a derivative. Its point is `iteratedDeriv_maurerCartan_eq_symmetrized_add`: an +iterated +derivative `∂_s ω_μ(U)` is the symmetrized form at `μ ::ₘ s` plus an average of iterated +derivatives of *brackets* of Maurer–Cartan forms in strictly fewer directions — the +structural equation used to trade an antisymmetric part for lower-order data. Iterating +that gives `evalLie_iteratedDeriv_maurerCartan_eq_of_symmetrized_eq`: the base-point Taylor +data of `ω` is determined by the base-point symmetrized data. + +## ii. Key results + +- `LocalGaugeData.maurerCartan_inv` : `ω_μ(U⁻¹) = − Ad_{U⁻¹} ω_μ(U)`. +- `LocalGaugeData.symmetrizedMaurerCartanForm` : the symmetrized Maurer–Cartan form, with + `symmetrizedMaurerCartanForm_singleton` and the recursion + `symmetrizedMaurerCartanForm_cons`. +- `LocalGaugeData.iteratedDeriv_maurerCartan_eq_symmetrized_add` : the symmetrization + defect is an average of brackets in fewer directions. +- `LocalGaugeData.evalLie_iteratedDeriv_maurerCartan_eq_of_symmetrized_eq` : the base-point + symmetrized data determines the base-point Taylor data of `ω`. + +## iii. Table of contents + +- A. The Maurer–Cartan form on inverses +- B. The symmetrized Maurer–Cartan form +- C. Determination of the Maurer–Cartan form by its symmetrized coefficients + +-/ + +@[expose] public section + +namespace LocalGaugeData + +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + (jets : LocalGaugeData G 𝔤 G₀ 𝔤J) + +/-! + +## A. The Maurer–Cartan form on inverses + +-/ + +/-- **The Maurer–Cartan form of an inverse**: `ω_μ(U⁻¹) = − Ad_{U⁻¹} ω_μ(U)`, the cocycle + law applied to `U⁻¹ U = 1`. -/ +lemma maurerCartan_inv (U : G) (μ : Fin 1 ⊕ Fin 3) : + jets.maurerCartan U⁻¹ μ = - jets.adjoint U⁻¹ (jets.maurerCartan U μ) := by + have h := jets.maurerCartan_cocycle U⁻¹ U μ + rw [inv_mul_cancel, jets.maurerCartan_one] at h + exact eq_neg_of_add_eq_zero_left h.symm + +/-! + +## B. The symmetrized Maurer–Cartan form + +-/ + +/-- **The symmetrized Maurer–Cartan form** `ω̄_r(U) = (1/|r|) ∑_{μ ∈ r} ∂_{r − {μ}} ω_μ(U)`: + the average, over the directions of `r`, of the Maurer–Cartan form in one direction + differentiated along the remaining ones. -/ +noncomputable def symmetrizedMaurerCartanForm (U : G) (r : Multiset (Fin 1 ⊕ Fin 3)) : 𝔤J := + ((1/(r.card : ℝ) : ℝ) • (r.map fun μ => + (jets.iteratedDeriv (r - {μ}) (jets.maurerCartan U μ))).sum) + +@[simp] +lemma symmetrizedMaurerCartanForm_apply_zero (U : G) : + jets.symmetrizedMaurerCartanForm U 0 = 0 := by + simp [symmetrizedMaurerCartanForm] + +@[simp] +lemma symmetrizedMaurerCartanForm_one : jets.symmetrizedMaurerCartanForm 1 = 0 := by + funext r + simp [symmetrizedMaurerCartanForm, jets.maurerCartan_one] + +@[simp] +lemma symmetrizedMaurerCartanForm_ofConstant (g : G₀) : + jets.symmetrizedMaurerCartanForm (jets.ofConstant g) = 0 := by + funext r + simp [symmetrizedMaurerCartanForm, jets.maurerCartan_ofConstant] + +@[simp] +lemma symmetrizedMaurerCartanForm_singleton (U : G) (μ : Fin 1 ⊕ Fin 3) : + jets.symmetrizedMaurerCartanForm U {μ} = jets.maurerCartan U μ := by + simp [symmetrizedMaurerCartanForm, iteratedDeriv_zero] + +/-- The recursion for the symmetrized Maurer–Cartan form: peeling one direction off the + multiset. -/ +lemma symmetrizedMaurerCartanForm_cons (U : G) (μ : Fin 1 ⊕ Fin 3) + (r : Multiset (Fin 1 ⊕ Fin 3)) : jets.symmetrizedMaurerCartanForm U (μ ::ₘ r) = + (1/(r.card + 1 : ℝ) : ℝ) • (jets.iteratedDeriv r (jets.maurerCartan U μ)) + + ((r.card : ℝ)/(r.card + 1 : ℝ)) • + jets.deriv μ (jets.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 ν => + jets.deriv μ (jets.iteratedDeriv (r - {ν}) (jets.maurerCartan U ν))) = + (r.map fun ν => + jets.iteratedDeriv (r - {ν}) (jets.maurerCartan U ν)).map (jets.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] + +/-! + +## C. 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 structural equation + `maurerCartan_structure` used to trade the antisymmetric part for lower-order data. -/ +lemma iteratedDeriv_maurerCartan_eq_symmetrized_add (U : G) + (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : + jets.iteratedDeriv s (jets.maurerCartan U μ) = + jets.symmetrizedMaurerCartanForm U (μ ::ₘ s) + + (1/(s.card + 1 : ℝ)) • (s.map fun ν => + jets.iteratedDeriv (s.erase ν) + ⁅jets.maurerCartan U μ, jets.maurerCartan U ν⁆).sum := by + -- each bracket term is a difference of two iterated derivatives of `ω` + have hswap : ∀ ν ∈ s, + jets.iteratedDeriv (s.erase ν) ⁅jets.maurerCartan U μ, jets.maurerCartan U ν⁆ = + jets.iteratedDeriv s (jets.maurerCartan U μ) - + jets.iteratedDeriv (μ ::ₘ s.erase ν) (jets.maurerCartan U ν) := by + intro ν hν + have hb : ⁅jets.maurerCartan U μ, jets.maurerCartan U ν⁆ = + jets.deriv ν (jets.maurerCartan U μ) - jets.deriv μ (jets.maurerCartan U ν) := by + have h1 : jets.deriv μ (jets.maurerCartan U ν) - jets.deriv ν (jets.maurerCartan U μ) = + -⁅jets.maurerCartan U μ, jets.maurerCartan U ν⁆ := + eq_neg_of_add_eq_zero_left (jets.maurerCartan_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 evalLie_iteratedDeriv_maurerCartan_eq_of_symmetrized_eq (U V : G) (n : ℕ) + (hsym : ∀ r, jets.evalLie (jets.symmetrizedMaurerCartanForm U r) = + jets.evalLie (jets.symmetrizedMaurerCartanForm V r)) + (ih : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), s.card < n → + jets.evalLie (jets.iteratedDeriv s (jets.maurerCartan U μ)) = + jets.evalLie (jets.iteratedDeriv s (jets.maurerCartan V μ))) + (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (hs : s.card = n) : + jets.evalLie (jets.iteratedDeriv s (jets.maurerCartan U μ)) = + jets.evalLie (jets.iteratedDeriv s (jets.maurerCartan V μ)) := by + rw [iteratedDeriv_maurerCartan_eq_symmetrized_add jets U s μ, + iteratedDeriv_maurerCartan_eq_symmetrized_add jets V s μ, + map_add, map_add, map_smul, map_smul, hsym] + refine congrArg (fun z => jets.evalLie (jets.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 jets.evalLie_iteratedDeriv_bracket_congr (s.erase ν) _ _ _ _ + (fun p hp => ih p μ (hlt p hp)) (fun p hp => ih p ν (hlt p hp)) + +end LocalGaugeData diff --git a/Physlib/Particles/StandardModel/Fermions/DownSinglet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/DownSinglet/GaugeAlgebraAction.lean index fde361816..3b1a3a705 100644 --- a/Physlib/Particles/StandardModel/Fermions/DownSinglet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/DownSinglet/GaugeAlgebraAction.lean @@ -535,7 +535,7 @@ theorem isInfinitesimalActionOf : constructor · intro U μ x simp only [localGaugeData_repCoeff, localGaugeData_evalLie, - localGaugeData_iteratedDeriv, localGaugeData_mc] + localGaugeData_iteratedDeriv, localGaugeData_maurerCartan] have hMcons : ((downMatrix U).map fun f => constantCoeff ((μ ::ₘ x).foldl (fun h ρ => pderiv ℂ ρ h) f)) = -((x.antidiagonal.map fun p => diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean index cdd5ae35e..f48851d5f 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean @@ -548,7 +548,7 @@ theorem isInfinitesimalActionOf : constructor · intro U μ x simp only [localGaugeData_repCoeff, localGaugeData_evalLie, - localGaugeData_iteratedDeriv, localGaugeData_mc] + localGaugeData_iteratedDeriv, localGaugeData_maurerCartan] have hMcons : ((doubletMatrix U).map fun f => constantCoeff ((μ ::ₘ x).foldl (fun h ρ => pderiv ℂ ρ h) f)) = -((x.antidiagonal.map fun p => diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/GaugeAlgebraAction.lean index 36f4c3ca3..f221437b6 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/GaugeAlgebraAction.lean @@ -265,7 +265,7 @@ theorem isInfinitesimalActionOf : constructor · intro U μ x simp only [localGaugeData_repCoeff, localGaugeData_evalLie, - localGaugeData_iteratedDeriv, localGaugeData_mc] + localGaugeData_iteratedDeriv, localGaugeData_maurerCartan] have hMcons : constantCoeff ((μ ::ₘ x).foldl (fun h ρ => pderiv ℂ ρ h) (jetPhase U)) = -((x.antidiagonal.map fun p => Complex.I * (-(6 : ℂ) * (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv diff --git a/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/GaugeAlgebraAction.lean index f02ae564e..973923366 100644 --- a/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/GaugeAlgebraAction.lean @@ -657,7 +657,7 @@ theorem isInfinitesimalActionOf : constructor · intro U μ x simp only [localGaugeData_repCoeff, localGaugeData_evalLie, - localGaugeData_iteratedDeriv, localGaugeData_mc] + localGaugeData_iteratedDeriv, localGaugeData_maurerCartan] have hMcons : ((jetGaugeMatrix U).map fun f => constantCoeff ((μ ::ₘ x).foldl (fun h ρ => pderiv ℂ ρ h) f)) = -((x.antidiagonal.map fun p => diff --git a/Physlib/Particles/StandardModel/Fermions/UpSinglet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/UpSinglet/GaugeAlgebraAction.lean index d7ba0ba46..f26d82884 100644 --- a/Physlib/Particles/StandardModel/Fermions/UpSinglet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/UpSinglet/GaugeAlgebraAction.lean @@ -529,7 +529,7 @@ theorem isInfinitesimalActionOf : constructor · intro U μ x simp only [localGaugeData_repCoeff, localGaugeData_evalLie, - localGaugeData_iteratedDeriv, localGaugeData_mc] + localGaugeData_iteratedDeriv, localGaugeData_maurerCartan] have hMcons : ((upMatrix U).map fun f => constantCoeff ((μ ::ₘ x).foldl (fun h ρ => pderiv ℂ ρ h) f)) = -((x.antidiagonal.map fun p => diff --git a/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Symmeterized.lean b/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Symmeterized.lean index 38bf0e58e..7f61d31ed 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Symmeterized.lean +++ b/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Symmeterized.lean @@ -430,7 +430,8 @@ theorem symbolAdjoin_eq_symFieldAdjoin_top : `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 + This is the symbol-level counterpart of `LocalGaugeData.symmetrizedMaurerCartanForm`: + the gauge group acts on the symmetrized derivative coordinates through the symmetrized Maurer–Cartan data. -/ lemma repGauge_symmetrizedDeriv (hA : IsGaugeField repLorentz repGauge A) @@ -440,7 +441,8 @@ lemma repGauge_symmetrizedDeriv (hA : IsGaugeField repLorentz repGauge A) (1/(s.card : ℝ)) • (s.map fun μ => ((s - {μ}).antidiagonal.map fun p => A p.2 μ (adjointDualCoeff U⁻¹ p.1 φ)).sum).sum - + algebraMap ℂ B (φ (JetGaugeAlgebra.eval (symmetrizedMaurerCartanForm U⁻¹ s))) := by + + algebraMap ℂ B (φ (JetGaugeAlgebra.eval + (localGaugeData.symmetrizedMaurerCartanForm U⁻¹ s))) := by set L : JetGaugeAlgebra →ₗ[ℝ] B := (Algebra.linearMap ℂ B).restrictScalars ℝ ∘ₗ Algebra.linearMap ℝ ℂ ∘ₗ φ ∘ₗ JetGaugeAlgebra.eval.toLinearMap with hL @@ -457,8 +459,9 @@ lemma repGauge_symmetrizedDeriv (hA : IsGaugeField repLorentz repGauge A) 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] + _ = algebraMap ℂ B (φ (JetGaugeAlgebra.eval + (localGaugeData.symmetrizedMaurerCartanForm U⁻¹ s))) := by + rw [localGaugeData_symmetrizedMaurerCartanForm_eq] rfl /-- **The action of the truncation kernel on the symmetrized derivatives is through diff --git a/Physlib/Particles/StandardModel/GaugeGroup/LocalGaugeData.lean b/Physlib/Particles/StandardModel/GaugeGroup/LocalGaugeData.lean index 22ff9c69c..0eb8eb080 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/LocalGaugeData.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/LocalGaugeData.lean @@ -7,6 +7,7 @@ module public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeField.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.MaurerCartan public import Physlib.ClassicalFieldTheory.GaugeTheory.Matter.CovariantDeriv public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.Basic public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.GaugeAction @@ -34,8 +35,8 @@ choice, so it is an instance, discharged by the existing Taylor–Leibniz theore - `StandardModel.localGaugeData` : the Standard Model gauge group as jets of a gauge group. - `StandardModel.localGaugeData_eval`, `StandardModel.localGaugeData_deriv`, - `StandardModel.localGaugeData_mc`, … : the generic interface computed back to the Standard - Model definitions. + `StandardModel.localGaugeData_maurerCartan`, … : the generic interface computed back to + the Standard Model definitions. - `StandardModel.localGaugeData_iteratedDeriv` : the generic iterated derivative is the Standard Model iterated derivative. - `StandardModel.localGaugeData_adjointCoeff`, `StandardModel.localGaugeData_adjointDualCoeff` : the @@ -100,10 +101,11 @@ noncomputable def localGaugeData : deriv_ofConstantLie := JetGaugeAlgebra.deriv_ofConstant adjoint := JetGaugeAlgebra.adjoint adjoint_lie := JetGaugeAlgebra.adjointMap_lie - mc := maurerCartanForm - mc_one := fun μ => congrFun maurerCartanForm_one μ - mc_cocycle := maurerCartanForm_cocycle - mc_structure := maurerCartanForm_structure + maurerCartan := maurerCartanForm + maurerCartan_one := fun μ => congrFun maurerCartanForm_one μ + maurerCartan_ofConstant := fun g μ => congrFun (maurerCartanForm_ofConstant g) μ + maurerCartan_cocycle := maurerCartanForm_cocycle + maurerCartan_structure := maurerCartanForm_structure deriv_adjoint := deriv_adjointMap adjointValue := GaugeAlgebra.adjoint evalLie_adjoint_ofConstantLie := JetGaugeAlgebra.eval_adjointMap_ofConstant @@ -155,7 +157,33 @@ lemma localGaugeData_iteratedDeriv (s : Multiset (Fin 1 ⊕ Fin 3)) : lemma localGaugeData_adjoint : localGaugeData.adjoint = JetGaugeAlgebra.adjoint := rfl @[simp] -lemma localGaugeData_mc : localGaugeData.mc = maurerCartanForm := rfl +lemma localGaugeData_maurerCartan : localGaugeData.maurerCartan = maurerCartanForm := rfl + +/-- The symmetrized Maurer–Cartan form of the package, written out in Standard Model + terms: the generic iterated derivative and Maurer–Cartan form are the Standard Model + ones, so the average is the one the component computations use. -/ +lemma localGaugeData_symmetrizedMaurerCartanForm_eq (U : JetGaugeGroupI) + (r : Multiset (Fin 1 ⊕ Fin 3)) : + localGaugeData.symmetrizedMaurerCartanForm U r = + (1/(r.card : ℝ) : ℝ) • (r.map fun μ => + JetGaugeAlgebra.iteratedDeriv (r - {μ}) (maurerCartanForm U μ)).sum := rfl + +/-- The symmetrization defect of the Maurer–Cartan form in Standard Model terms: the + generic `LocalGaugeData.iteratedDeriv_maurerCartan_eq_symmetrized_add` read at this package. -/ +lemma iteratedDeriv_maurerCartanForm_eq_symmetrized_add (U : JetGaugeGroupI) + (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : + JetGaugeAlgebra.iteratedDeriv s (maurerCartanForm U μ) = + localGaugeData.symmetrizedMaurerCartanForm U (μ ::ₘ s) + + (1/(s.card + 1 : ℝ)) • (s.map fun ν => + JetGaugeAlgebra.iteratedDeriv (s.erase ν) + ⁅maurerCartanForm U μ, maurerCartanForm U ν⁆).sum := + localGaugeData.iteratedDeriv_maurerCartan_eq_symmetrized_add U s μ + +/-- **The Maurer–Cartan form of an inverse**: the generic `LocalGaugeData.maurerCartan_inv` read at + this package. -/ +lemma maurerCartanForm_inv (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : + maurerCartanForm U⁻¹ μ = - JetGaugeAlgebra.adjoint U⁻¹ (maurerCartanForm U μ) := + localGaugeData.maurerCartan_inv U μ /-! diff --git a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean index 5e995ecd0..72fe95b06 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean @@ -29,13 +29,21 @@ We will use `ω^a_ν` to denote the `a`-th component of the Maurer–Cartan form 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: +It satisfies the following properties, proved here from the matrix definition: - *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)` +These four are exactly the Maurer–Cartan laws of a local gauge data package. What follows +from them alone — the value on inverses, the symmetrized Maurer–Cartan form and the +determination of `ω` by its symmetrized base-point data — is proved once, for any package, +in `Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.MaurerCartan`, and read back at +`StandardModel.localGaugeData` in +`Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData`. What remains here is what the +matrix definition itself gives: the vanishing of `ω` exactly on constant jets, and the +integration of the structural equation. + -/ @[expose] public section @@ -102,10 +110,6 @@ 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 μ @@ -380,219 +384,6 @@ lemma exists_deriv_eq_of_maurerCartanForm_structure /-! -## The symmeterized Maurer–Cartan form - --/ - - -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_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 - ext <;> simp [symmetrizedMaurerCartanForm, maurerCartanForm_ofConstant] - -@[simp] -lemma symmetrizedMaurerCartanForm_singleton (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : - 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] - -/-! - -## 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 - - -/-- 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. -/ -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)) - -/-! - ## The derivative of the adjoint action -/ diff --git a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Truncation.lean b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Truncation.lean index f67c448af..4a0180111 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Truncation.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Truncation.lean @@ -7,6 +7,7 @@ module public import Physlib.Particles.StandardModel.Basic public import Physlib.Particles.StandardModel.GaugeGroup.MaurerCartan.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData public import Physlib.Particles.StandardModel.GaugeGroup.JetGaugeGroup.Truncation public import Physlib.Particles.StandardModel.GaugeAlgebra.JetGaugeAlgebra public import Physlib.Relativity.Tensors.ComplexTensor.Basic @@ -88,6 +89,80 @@ lemma exists_maurerCartanForm_eq_of_structure simp +/-- 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 (localGaugeData.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 [localGaugeData_symmetrizedMaurerCartanForm_eq, 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 (localGaugeData.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 [localGaugeData_symmetrizedMaurerCartanForm_eq, 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 (localGaugeData.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 [localGaugeData_symmetrizedMaurerCartanForm_eq, 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μ) + /-! ## Freeness: injectivity of the symmetrized Maurer–Cartan data @@ -99,18 +174,18 @@ lemma exists_maurerCartanForm_eq_of_structure 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) + eval (localGaugeData.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`, + by strong induction with `LocalGaugeData.evalLie_iteratedDeriv_maurerCartan_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 + have hsym : ∀ r, eval (localGaugeData.symmetrizedMaurerCartanForm U.1 r) = + eval (localGaugeData.symmetrizedMaurerCartanForm V.1 r) := by intro r by_cases hr : r = 0 · subst hr @@ -124,7 +199,7 @@ lemma symmetrizedMaurerCartanCoeff_injective : Function.Injective symmetrizedMau 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 + exact localGaugeData.evalLie_iteratedDeriv_maurerCartan_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 @@ -140,7 +215,8 @@ lemma symmetrizedMaurerCartanCoeff_injective : Function.Injective symmetrizedMau 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 + symmetrizedMaurerCartanCoeff U x + = eval (localGaugeData.symmetrizedMaurerCartanForm U.1 x.1) := rfl lemma symmetrizedMaurerCartanCoeff_toSU3_eq (U : JetGaugeGroupI.truncationKer 0) (P : Matrix (Fin 3) (Fin 3) JetRing) @@ -358,7 +434,7 @@ lemma mem_truncationKer_of_symmetrizedMaurerCartanCoeff_eq_zero | _ 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 h1 : eval (localGaugeData.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 diff --git a/Physlib/Particles/StandardModel/HiggsBoson/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/HiggsBoson/GaugeAlgebraAction.lean index f2c6b40df..28a354136 100644 --- a/Physlib/Particles/StandardModel/HiggsBoson/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/HiggsBoson/GaugeAlgebraAction.lean @@ -442,7 +442,7 @@ theorem isInfinitesimalActionOf : constructor · intro U μ x simp only [localGaugeData_repCoeff, localGaugeData_evalLie, - localGaugeData_iteratedDeriv, localGaugeData_mc] + localGaugeData_iteratedDeriv, localGaugeData_maurerCartan] have hMcons : ((jetGaugeMatrix U).map fun f => constantCoeff ((μ ::ₘ x).foldl (fun h ρ => pderiv ℂ ρ h) f)) = -((x.antidiagonal.map fun p => From cc7dac3004afb29ac7eedb230950ae6d883e62f1 Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Tue, 8 Sep 2026 15:23:02 +0400 Subject: [PATCH 296/367] refactor: one local field algebra, GaugeFieldData.LocalFieldAlgebra --- Physlib.lean | 1 + .../JetAlgebra/GaugeFieldData.lean | 233 +---- .../JetAlgebra/LocalFieldAlgebra.lean | 950 ++++++++++-------- .../JetAlgebra/SpeciesGenerators.lean | 455 +-------- Physlib/Mathematics/AlgebraGeneration.lean | 325 ++++++ Physlib/Mathematics/SymmetricAlgebra.lean | 11 +- .../Particles/StandardModel/FieldData.lean | 3 +- 7 files changed, 886 insertions(+), 1092 deletions(-) create mode 100644 Physlib/Mathematics/AlgebraGeneration.lean diff --git a/Physlib.lean b/Physlib.lean index 3ede70e2c..41ed3da3b 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -140,6 +140,7 @@ public import Physlib.FluidDynamics.ThermodynamicCauchyFlow.Basic public import Physlib.FluidDynamics.ThermodynamicCauchyFlow.Bernoulli public import Physlib.FluidDynamics.ThermodynamicCauchyFlow.Isentropic public import Physlib.LatticeQFT.Basic +public import Physlib.Mathematics.AlgebraGeneration public import Physlib.Mathematics.Calculus.AdjFDeriv public import Physlib.Mathematics.Calculus.Divergence public import Physlib.Mathematics.Calculus.Gradient diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/GaugeFieldData.lean b/Physlib/ClassicalFieldTheory/JetAlgebra/GaugeFieldData.lean index 89a1fc956..8c9f81a8d 100644 --- a/Physlib/ClassicalFieldTheory/JetAlgebra/GaugeFieldData.lean +++ b/Physlib/ClassicalFieldTheory/JetAlgebra/GaugeFieldData.lean @@ -9,7 +9,7 @@ public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.Basic public import Physlib.ClassicalFieldTheory.JetAlgebra.SpeciesGenerators /-! -# The field data of a gauge theory and its local field algebra +# The field data of a gauge theory and its generator spaces ## i. Overview @@ -27,15 +27,18 @@ derives, with no further data, * the fermionic and bosonic generator spaces, as `SpeciesComponentSpace` of the families of value spaces; * the connection generator space, as the existing `GaugeBoson.JetComponentSpace 𝔤`; -* the local field algebra `GaugeFieldData.LocalAlgebra`, the `SpeciesLocalFieldAlgebra` of - those three, with its generator inclusions and their relations; -* the realization arrow, by which a compatible assignment of the generators in any - associative unital complex algebra `B`, not assumed commutative, extends to one and only - one `LocalAlgebra →ₐ[ℂ] B`. +* the Lorentz and jet gauge actions and the mass-weight scaling on those spaces, + assembled species by species. -That is the chain `T → J(T) → B`. It is field and transformation data before a Lagrangian, -so packaging the species' representations separately certifies no physical compatibility -between them, and no invariance is claimed here. +The algebra built on the three generator spaces, `GaugeFieldData.LocalFieldAlgebra`, and +its mapping-out universal property are in +`Physlib.ClassicalFieldTheory.JetAlgebra.LocalFieldAlgebra`, which imports this file. The +split is one of subject matter: here the datum and the spaces it determines, there the +algebra of local expressions on them. + +It is field and transformation data before a Lagrangian, so packaging the species' +representations separately certifies no physical compatibility between them, and no +invariance is claimed here. The generator spaces carry derivative symbols of every order and are infinite-dimensional however few species there are. Finiteness of the species types and of the value spaces is @@ -46,12 +49,8 @@ not inherited by them. - `GaugeFieldData` : the matter content of a gauge theory over a gauge context. - `GaugeFieldData.FermionGenerators`, `GaugeFieldData.BosonGenerators` : the species generator spaces. -- `GaugeFieldData.LocalAlgebra` : the local field algebra `J(T)` of the datum. -- `GaugeFieldData.ιFermion`, `GaugeFieldData.ιBoson`, `GaugeFieldData.ιConnection` : the - generator inclusions, with their statistics. -- `GaugeFieldData.Assignment`, `GaugeFieldData.lift_ιFermion`, - `GaugeFieldData.existsUnique_algHom` : the realization arrow `J(T) →ₐ[ℂ] B` and its - uniqueness. +- `GaugeFieldData.inclFermion`, `GaugeFieldData.inclBoson` : the inclusion of the + component space of one species. - `GaugeFieldData.repLorentzFermion`, `GaugeFieldData.repJetFermion` : the Lorentz and jet gauge actions assembled on the generator spaces. - `GaugeFieldData.massWeightScaleFermion` : the mass-weight scaling carrying the weight of @@ -63,16 +62,10 @@ not inherited by them. - B. The generator spaces - B.1. The species generator spaces - B.2. The connection generator space -- C. The local field algebra of the datum - - C.1. The generator inclusions - - C.2. The statistics of the generators -- D. Realizations of the datum - - D.1. The induced algebra homomorphism - - D.2. Uniqueness -- E. The transformation data on the generator spaces - - E.1. The Lorentz action - - E.2. The jet gauge action - - E.3. The mass weights +- C. The transformation data on the generator spaces + - C.1. The Lorentz action + - C.2. The jet gauge action + - C.3. The mass weights -/ @@ -180,189 +173,7 @@ third generator family of the local field algebra is a real vector space, comple once inside the algebra. Finite dimensionality of `𝔤` is what makes `Module.Dual ℝ 𝔤` the span of the adjoint components, so that these generators really are the `A_μ^a`. -## C. The local field algebra of the datum - --/ - -/-- The local field algebra `J(T)` of a gauge-field datum, in which the local expressions - of the theory, such as Lagrangian terms, currents and field strengths, live before any - of them is selected. Its fermionic generators are the component functions of the - fermionic species, its bosonic generators those of the bosonic species, and its - connection generators the component functions of the gauge bosons of `𝔤`. - - All the fermionic species share one exterior algebra, so their generators anticommute - across species and not only within one. -/ -abbrev LocalAlgebra : Type := - SpeciesLocalFieldAlgebra T.FermionValue T.BosonValue (GaugeBoson.JetComponentSpace 𝔤) - -/-! - -### C.1. The generator inclusions - --/ - -/-- The generators of one fermionic species inside the local field algebra. -/ -noncomputable def ιFermion (i : T.FermionSpecies) : - JetComponentSpace (T.FermionValue i) →ₗ[ℂ] T.LocalAlgebra := - SpeciesLocalFieldAlgebra.ιFermionSpecies T.FermionValue T.BosonValue - (GaugeBoson.JetComponentSpace 𝔤) i - -/-- The generators of one bosonic species inside the local field algebra. -/ -noncomputable def ιBoson (j : T.BosonSpecies) : - JetComponentSpace (T.BosonValue j) →ₗ[ℂ] T.LocalAlgebra := - SpeciesLocalFieldAlgebra.ιBosonSpecies T.FermionValue T.BosonValue - (GaugeBoson.JetComponentSpace 𝔤) j - -/-- The connection generators inside the local field algebra. They are only real-linear, - since the connection generator space is real. -/ -noncomputable def ιConnection : GaugeBoson.JetComponentSpace 𝔤 →ₗ[ℝ] T.LocalAlgebra := - LocalFieldAlgebra.ιConnection (SpeciesComponentSpace T.FermionValue) - (SpeciesComponentSpace T.BosonValue) (GaugeBoson.JetComponentSpace 𝔤) - -variable {T} - -lemma ιFermion_apply (i : T.FermionSpecies) (x : JetComponentSpace (T.FermionValue i)) : - T.ιFermion i x - = LocalFieldAlgebra.ιFermion T.FermionGenerators T.BosonGenerators - (GaugeBoson.JetComponentSpace 𝔤) (T.inclFermion i x) := rfl - -lemma ιBoson_apply (j : T.BosonSpecies) (y : JetComponentSpace (T.BosonValue j)) : - T.ιBoson j y - = LocalFieldAlgebra.ιBoson T.FermionGenerators T.BosonGenerators - (GaugeBoson.JetComponentSpace 𝔤) (T.inclBoson j y) := rfl - -/-! - -### C.2. The statistics of the generators - -The relations of the local field algebra, read at the datum. Fermi statistics holds on the -fermionic generators, across species as well as within one, and everything else commutes. -None of this is new content. Each lemma is the corresponding relation of -`SpeciesLocalFieldAlgebra` with the datum's generator spaces supplied explicitly, which is -what keeps the elaboration directed at the tensor product. - --/ - -/-- A fermionic generator squares to zero. -/ -@[simp] -lemma ιFermion_mul_self (i : T.FermionSpecies) (x : JetComponentSpace (T.FermionValue i)) : - T.ιFermion i x * T.ιFermion i x = 0 := - SpeciesLocalFieldAlgebra.ιFermionSpecies_mul_self (Vf := T.FermionValue) - (Vb := T.BosonValue) (EA := GaugeBoson.JetComponentSpace 𝔤) i x - -/-- The generators of two fermionic species of the datum anticommute. The species - enter one exterior algebra through different summands of the fermionic generator space, - so this is ordinary exterior anticommutation and not an extra relation. -/ -lemma ιFermion_mul_swap (i j : T.FermionSpecies) (x : JetComponentSpace (T.FermionValue i)) - (y : JetComponentSpace (T.FermionValue j)) : - T.ιFermion i x * T.ιFermion j y = -(T.ιFermion j y * T.ιFermion i x) := - SpeciesLocalFieldAlgebra.ιFermionSpecies_mul_swap (Vf := T.FermionValue) - (Vb := T.BosonValue) (EA := GaugeBoson.JetComponentSpace 𝔤) i j x y - -/-- Bosonic generators commute, across species as well as within one. -/ -lemma ιBoson_commute (i j : T.BosonSpecies) (x : JetComponentSpace (T.BosonValue i)) - (y : JetComponentSpace (T.BosonValue j)) : - Commute (T.ιBoson i x) (T.ιBoson j y) := - SpeciesLocalFieldAlgebra.ιBosonSpecies_commute (Vf := T.FermionValue) - (Vb := T.BosonValue) (EA := GaugeBoson.JetComponentSpace 𝔤) i j x y - -/-- A bosonic generator commutes with a fermionic one, bosons being even. -/ -lemma ιBoson_commute_ιFermion (j : T.BosonSpecies) (i : T.FermionSpecies) - (y : JetComponentSpace (T.BosonValue j)) (x : JetComponentSpace (T.FermionValue i)) : - Commute (T.ιBoson j y) (T.ιFermion i x) := - SpeciesLocalFieldAlgebra.ιBosonSpecies_commute_ιFermionSpecies (Vf := T.FermionValue) - (Vb := T.BosonValue) (EA := GaugeBoson.JetComponentSpace 𝔤) j i y x - -/-- A bosonic generator commutes with a connection generator. -/ -lemma ιBoson_commute_ιConnection (j : T.BosonSpecies) - (y : JetComponentSpace (T.BosonValue j)) (v : GaugeBoson.JetComponentSpace 𝔤) : - Commute (T.ιBoson j y) (T.ιConnection v) := - SpeciesLocalFieldAlgebra.ιBosonSpecies_commute_ιConnection (Vf := T.FermionValue) - (Vb := T.BosonValue) (EA := GaugeBoson.JetComponentSpace 𝔤) j y v - -/-- A connection generator commutes with a fermionic one, the connection being even. -/ -lemma ιConnection_commute_ιFermion (v : GaugeBoson.JetComponentSpace 𝔤) - (i : T.FermionSpecies) (x : JetComponentSpace (T.FermionValue i)) : - Commute (T.ιConnection v) (T.ιFermion i x) := - SpeciesLocalFieldAlgebra.ιConnection_commute_ιFermionSpecies (Vf := T.FermionValue) - (Vb := T.BosonValue) (EA := GaugeBoson.JetComponentSpace 𝔤) v i x - -/-- Connection generators commute pairwise. -/ -lemma ιConnection_commute (v w : GaugeBoson.JetComponentSpace 𝔤) : - Commute (T.ιConnection v) (T.ιConnection w) := - LocalFieldAlgebra.ιConnection_commute (Ef := T.FermionGenerators) - (Eb := T.BosonGenerators) (EA := GaugeBoson.JetComponentSpace 𝔤) v w - -variable (T) - -/-! - -## D. Realizations of the datum - --/ - -/-- A compatible realization of the datum in an algebra `B`, which is not assumed - commutative. It consists of one linear map per fermionic species, one per bosonic - species and one real-linear map on the connection generators, subject to exactly the - statistics of section C.2. The algebra map it induces is `SpeciesAssignment.lift`, of - type `T.LocalAlgebra →ₐ[ℂ] B`. -/ -abbrev Assignment (B : Type*) [Ring B] [Algebra ℂ B] : Type _ := - SpeciesAssignment T.FermionValue T.BosonValue (GaugeBoson.JetComponentSpace 𝔤) B - -variable {T} {B : Type*} [Ring B] [Algebra ℂ B] (d : T.Assignment B) - -/-! - -### D.1. The induced algebra homomorphism - --/ - -@[simp] -lemma lift_ιFermion (i : T.FermionSpecies) (x : JetComponentSpace (T.FermionValue i)) : - d.lift (T.ιFermion i x) = d.fermion i x := - d.lift_ιFermionSpecies i x - -@[simp] -lemma lift_ιBoson (j : T.BosonSpecies) (y : JetComponentSpace (T.BosonValue j)) : - d.lift (T.ιBoson j y) = d.boson j y := - d.lift_ιBosonSpecies j y - -@[simp] -lemma lift_ιConnection (v : GaugeBoson.JetComponentSpace 𝔤) : - d.lift (T.ιConnection v) = d.connection v := - d.lift_ιConnection v - -/-! - -### D.2. Uniqueness - --/ - -/-- Two algebra maps out of `J(T)` are equal as soon as they agree on the generators of - every species and on the connection generators. -/ -lemma algHom_ext {Φ Ψ : T.LocalAlgebra →ₐ[ℂ] B} - (hf : ∀ i x, Φ (T.ιFermion i x) = Ψ (T.ιFermion i x)) - (hb : ∀ j y, Φ (T.ιBoson j y) = Ψ (T.ιBoson j y)) - (ha : ∀ v, Φ (T.ιConnection v) = Ψ (T.ιConnection v)) : Φ = Ψ := - SpeciesAssignment.algHom_ext (Vf := T.FermionValue) (Vb := T.BosonValue) - (EA := GaugeBoson.JetComponentSpace 𝔤) hf hb ha - -/-- The realization arrow of the datum. A compatible realization of the generators in an - arbitrary, in particular noncommutative, complex algebra `B` extends to one and only one - complex algebra homomorphism `J(T) →ₐ[ℂ] B`. Injectivity is neither claimed nor wanted, - since a realization may identify local expressions. -/ -lemma existsUnique_algHom : - ∃! Φ : T.LocalAlgebra →ₐ[ℂ] B, - (∀ i x, Φ (T.ιFermion i x) = d.fermion i x) ∧ - (∀ j y, Φ (T.ιBoson j y) = d.boson j y) ∧ - (∀ v, Φ (T.ιConnection v) = d.connection v) := - d.existsUnique_algHom - -variable (T) - -/-! - -## E. The transformation data on the generator spaces +## C. The transformation data on the generator spaces The datum supplies, per species, a Lorentz representation and a fibrewise action of the gauge jets. Both land on the generator spaces species by species, so both are assembled by @@ -370,7 +181,7 @@ gauge jets. Both land on the generator spaces species by species, so both are as Lorentz transformations act on nonconstant gauge jets, and nothing extends them to the algebra `J(T)`. -### E.1. The Lorentz action +### C.1. The Lorentz action -/ @@ -405,7 +216,7 @@ variable (T) /-! -### E.2. The jet gauge action +### C.2. The jet gauge action -/ @@ -444,7 +255,7 @@ variable (T) /-! -### E.3. The mass weights +### C.3. The mass weights -/ diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/LocalFieldAlgebra.lean b/Physlib/ClassicalFieldTheory/JetAlgebra/LocalFieldAlgebra.lean index 6f3ac9df7..0a4e5d2bc 100644 --- a/Physlib/ClassicalFieldTheory/JetAlgebra/LocalFieldAlgebra.lean +++ b/Physlib/ClassicalFieldTheory/JetAlgebra/LocalFieldAlgebra.lean @@ -5,88 +5,93 @@ Authors: Nathaneal Sajan -/ module +public import Physlib.ClassicalFieldTheory.JetAlgebra.GaugeFieldData +public import Physlib.Mathematics.AlgebraGeneration public import Physlib.Mathematics.SymmetricAlgebra public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basic public import Mathlib.LinearAlgebra.Complex.Module /-! -# The local field algebra and its mapping-out universal property +# The local field algebra of a gauge theory and its universal property ## i. Overview The local field algebra of a field theory is the algebra in which its local expressions, -such as Lagrangian terms, currents and field strengths, live. It is built from three -generator spaces, a complex space `Ef` of fermionic derivative symbols, a complex space -`Eb` of bosonic matter derivative symbols, and a real space `EA` of connection derivative -symbols. Writing `Λ` for the exterior algebra and `Sym` for the symmetric algebra, it is +such as Lagrangian terms, currents and field strengths, live. A `GaugeFieldData jets` +already determines its three generator spaces, the fermionic and bosonic species +generators `T.FermionGenerators` and `T.BosonGenerators` and the connection generators +`GaugeBoson.JetComponentSpace 𝔤`, and this file builds the algebra on them. Writing `Λ` +for the exterior algebra and `Sym` for the symmetric algebra, it is -`LocalFieldAlgebra Ef Eb EA = (Λ_ℂ Ef ⊗[ℂ] Sym_ℂ Eb) ⊗[ℂ] (ℂ ⊗[ℝ] Sym_ℝ EA)`, +`T.LocalFieldAlgebra = + (Λ_ℂ E_f(T) ⊗[ℂ] Sym_ℂ E_b(T)) ⊗[ℂ] (ℂ ⊗[ℝ] Sym_ℝ E_A(T))`, the shape of `StandardModel.JetAlgebra` with the Standard Model's species replaced by -arbitrary generator spaces. All fermionic generators enter a single exterior algebra, so -that symbols of different species anticommute with each other and not merely with -themselves. The connection generators are real and are complexified once, a connection -being a real object whose algebra of polynomials is then extended to complex coefficients. -Nothing here is finite-dimensional, the generator spaces being spaces of ordinary -derivative symbols of arbitrary order. - -This file proves the algebra's mapping-out universal property. An `Assignment` of the -three generator families in an associative unital complex algebra `B`, not assumed -commutative, subject to exactly the relations the generators themselves satisfy, extends -to a unique complex algebra homomorphism `LocalFieldAlgebra Ef Eb EA →ₐ[ℂ] B`. That is -what makes the carrier canonical rather than merely a convenient tensor product, and it is -what a realization of a field theory in an abstract algebra is built from. - -The construction has one subtlety. Mathlib's `SymmetricAlgebra.lift` requires a -commutative target, while `B` need not be commutative. The bosonic and connection -generators are therefore lifted into `Assignment.evenSubalgebra`, the subalgebra of `B` -generated by their images, which the hypotheses make commutative, and the result is -composed with its inclusion. The connection factor is then extended from `ℝ` to `ℂ` by -`AlgHom.liftEquiv`, which, unlike the symmetric lift, does accept a noncommutative target. -Uniqueness likewise cannot use `SymmetricAlgebra.algHom_ext`, whose target is commutative; -it uses generation instead, through `adjoin_generators_eq_top`. +those of the datum. All fermionic generators of all species enter a single exterior +algebra, so that symbols of different species anticommute with each other and not merely +with themselves; separate exterior algebras joined by an ordinary tensor product would +make them commute. The connection generators are real and are complexified once, a +connection being a real object whose algebra of polynomials is then extended to complex +coefficients. Nothing here is finite-dimensional, the generator spaces being spaces of +ordinary derivative symbols of arbitrary order however few species the datum has. + +The file proves the algebra's mapping-out universal property. A compatible `T.Assignment` +of the generators in an associative unital complex algebra `B`, not assumed commutative, +extends to a unique complex algebra homomorphism `T.LocalFieldAlgebra →ₐ[ℂ] B`. That is +the realization arrow `T → J(T) → B`, and it is what makes the carrier canonical rather +than merely a convenient tensor product. + +An assignment is given species by species, and its Fermi statistics is two conditions, not +one. `fermion_mul_self` within a species does not imply `fermion_mul_swap` across species: +by `DirectSum.mul_self_iff_lof` the square-zero condition on the assembled fermionic map is +exactly the conjunction of the two, and the cross terms of `(x + y) * (x + y)` for `x` and +`y` in different species are what the second condition kills. + +The construction has one subtlety. Mathlib's `SymmetricAlgebra.lift` requires a commutative +target, while `B` need not be commutative. The bosonic and connection generators are +therefore lifted into `Assignment.evenSubalgebra`, the subalgebra of `B` generated by their +images, which the hypotheses make commutative, and the result is composed with its +inclusion. The connection factor is then extended from `ℝ` to `ℂ` by `AlgHom.liftEquiv`, +which, unlike the symmetric lift, does accept a noncommutative target. Uniqueness likewise +cannot use `SymmetricAlgebra.algHom_ext`, whose target is commutative; it uses generation +instead, through `adjoin_generators_eq_top`. ## ii. Key results -- `LocalFieldAlgebra` : the algebra, with the generator maps `ιFermion`, `ιBoson`, - `ιConnection` and the relations they satisfy. -- `LocalFieldAlgebra.adjoin_generators_eq_top` : the algebra is generated by the three +- `GaugeFieldData.LocalFieldAlgebra` : the local field algebra `J(T)` of a field datum, + with the generator maps `ιFermion`, `ιBoson`, `ιConnection` and the relations they + satisfy. +- `GaugeFieldData.ιFermion_mul_swap` : the generators of two different fermionic species + anticommute, which is polarization of the square-zero relation and not an extra + relation. +- `GaugeFieldData.adjoin_generators_eq_top` : the algebra is generated by the three families. -- `LocalFieldAlgebra.Assignment` : a compatible assignment of the three generator families - in an arbitrary complex algebra. -- `LinearMap.mul_swap_of_mul_self`, `LocalFieldAlgebra.ιFermion_mul_swap`, - `LocalFieldAlgebra.Assignment.fermion_mul_swap` : polarization, by which the square-zero - relation on the whole fermionic generator space already carries anticommutation across - species. -- `LocalFieldAlgebra.Assignment.lift` : the induced algebra homomorphism, with the +- `GaugeFieldData.Assignment` : a compatible species-wise assignment of the generators in + an arbitrary complex algebra. +- `GaugeFieldData.Assignment.lift` : the induced algebra homomorphism, with the computation lemmas `lift_ιFermion`, `lift_ιBoson` and `lift_ιConnection`. -- `LocalFieldAlgebra.algHom_ext` : two algebra maps agreeing on the generators are equal. -- `LocalFieldAlgebra.Assignment.existsUnique_algHom` : the mapping-out universal - property. -- `LocalFieldAlgebra.liftEquiv` : compatible assignments in `B` are the same thing as - algebra maps into `B`. -- `LocalFieldAlgebra.Assignment.range_lift` : the range is the subalgebra generated by the - three images. +- `GaugeFieldData.algHom_ext` : two algebra maps agreeing on the generators are equal. +- `GaugeFieldData.Assignment.existsUnique_algHom` : the mapping-out universal property. +- `GaugeFieldData.liftEquiv` : compatible assignments in `B` are the same thing as algebra + maps into `B`. +- `GaugeFieldData.Assignment.range_lift` : the range is the subalgebra generated by the + assignment images. ## iii. Table of contents -- A. Generation, commutation and tensor products - - A.1. Consequences of a generating set - - A.2. Generating a tensor product - - A.3. Polarization -- B. The local field algebra - - B.1. The factor inclusions and the generators - - B.2. The relations satisfied by the generators - - B.3. Generation by the three families -- C. Compatible generator assignments - - C.1. Polarization of the fermionic assignment - - C.2. The commutative subalgebra of even images - - C.3. The three factor maps - - C.4. Commutation of the factor images -- D. The mapping-out universal property - - D.1. The induced algebra homomorphism - - D.2. Uniqueness - - D.3. Assignments are the same thing as algebra maps - - D.4. The range of the induced map +- A. The local field algebra of a field datum + - A.1. The factor inclusions and the generators + - A.2. The relations satisfied by the generators + - A.3. Generation by the three families +- B. Compatible generator assignments + - B.1. The assembled generator maps + - B.2. The commutative subalgebra of even images + - B.3. The three factor maps + - B.4. Commutation of the factor images +- C. The mapping-out universal property + - C.1. The induced algebra homomorphism + - C.2. Uniqueness + - C.3. Assignments are the same thing as algebra maps + - C.4. The range of the induced map -/ @@ -94,413 +99,432 @@ it uses generation instead, through `adjoin_generators_eq_top`. open TensorProduct -/-! - -## A. Generation, commutation and tensor products - -Facts about algebras generated by a set, stated for a general base ring because they carry -no physics. They are the minimal API needed to lift into, and to prove uniqueness into, a -target that is not assumed commutative. - --/ - -namespace Algebra - -section Generation - -variable {R A B : Type*} [CommSemiring R] [Semiring A] [Algebra R A] [Semiring B] - [Algebra R B] - -/-! - -### A.1. Consequences of a generating set - --/ - -/-- If `s` generates `A` and a subalgebra `S` of `B` contains the image of `s`, then it - contains the whole range of an algebra map `A →ₐ[R] B`. -/ -lemma range_le_of_adjoin_eq_top {s : Set A} (hs : Algebra.adjoin R s = ⊤) (φ : A →ₐ[R] B) - {S : Subalgebra R B} (h : ∀ x ∈ s, φ x ∈ S) : φ.range ≤ S := by - rw [← Algebra.map_top, ← hs, AlgHom.map_adjoin] - exact Algebra.adjoin_le (Set.image_subset_iff.mpr h) - -/-- If `s` generates `A` and `y` commutes with the image of `s` under an algebra map, then - `y` commutes with the whole image. This is what extends a commutation relation from - generators to a factor of a tensor product. -/ -lemma commute_of_adjoin_eq_top {s : Set A} (hs : Algebra.adjoin R s = ⊤) (φ : A →ₐ[R] B) - {y : B} (h : ∀ x ∈ s, Commute (φ x) y) (a : A) : Commute (φ a) y := by - have ha : a ∈ Algebra.adjoin R s := hs ▸ Algebra.mem_top - induction ha using Algebra.adjoin_induction with - | mem x hx => exact h x hx - | algebraMap r => rw [AlgHom.commutes]; exact Algebra.commute_algebraMap_left r y - | add u v _ _ hu hv => rw [map_add]; exact hu.add_left hv - | mul u v _ _ hu hv => rw [map_mul]; exact hu.mul_left hv - -end Generation - -namespace TensorProduct - -/-! - -### A.2. Generating a tensor product - --/ - -section Factors - -variable {R A B : Type*} [CommSemiring R] [Semiring A] [Algebra R A] [Semiring B] - [Algebra R B] - -/-- A subalgebra of `A ⊗[R] B` containing every `a ⊗ₜ 1` and every `1 ⊗ₜ b` contains - everything, since a pure tensor is the product of the two. -/ -lemma mem_of_tmul_one_of_one_tmul {S : Subalgebra R (A ⊗[R] B)} - (hA : ∀ a : A, a ⊗ₜ[R] (1 : B) ∈ S) (hB : ∀ b : B, (1 : A) ⊗ₜ[R] b ∈ S) - (x : A ⊗[R] B) : x ∈ S := by - induction x using _root_.TensorProduct.induction_on with - | zero => exact zero_mem _ - | add u v hu hv => exact add_mem hu hv - | tmul a b => - have h : a ⊗ₜ[R] b = (a ⊗ₜ[R] (1 : B)) * ((1 : A) ⊗ₜ[R] b) := by - rw [Algebra.TensorProduct.tmul_mul_tmul, mul_one, one_mul] - exact h ▸ mul_mem (hA a) (hB b) - -/-- A subalgebra of `A ⊗[R] B` containing every `a ⊗ₜ 1` and every `1 ⊗ₜ b` is the whole - algebra. -/ -lemma eq_top_of_tmul_one_of_one_tmul {S : Subalgebra R (A ⊗[R] B)} - (hA : ∀ a : A, a ⊗ₜ[R] (1 : B) ∈ S) (hB : ∀ b : B, (1 : A) ⊗ₜ[R] b ∈ S) : S = ⊤ := - _root_.Algebra.eq_top_iff.mpr fun x => mem_of_tmul_one_of_one_tmul hA hB x - -end Factors - -section BaseChange - -variable {R A : Type*} [CommSemiring R] [Semiring A] [Algebra R A] -variable (S : Type*) [CommSemiring S] [Algebra R S] (s : Set A) - -/-- Extension of scalars on the elements `1 ⊗ₜ a`. If `s` generates `A` over `R` then - every `1 ⊗ₜ a` lies in the `S`-subalgebra of `S ⊗[R] A` generated by `1 ⊗ₜ s`. -/ -lemma mem_adjoin_one_tmul (hs : Algebra.adjoin R s = ⊤) (a : A) : - (1 : S) ⊗ₜ[R] a ∈ Algebra.adjoin S ((fun a : A => (1 : S) ⊗ₜ[R] a) '' s) := by - have ha : a ∈ Algebra.adjoin R s := hs ▸ Algebra.mem_top - induction ha using Algebra.adjoin_induction with - | mem x hx => exact Algebra.subset_adjoin ⟨x, hx, rfl⟩ - | algebraMap r => - have h : (1 : S) ⊗ₜ[R] (algebraMap R A r) - = algebraMap S (S ⊗[R] A) (algebraMap R S r) := by - simp [Algebra.algebraMap_eq_smul_one, _root_.TensorProduct.tmul_smul, - _root_.TensorProduct.smul_tmul', Algebra.TensorProduct.one_def] - rw [h] - exact Subalgebra.algebraMap_mem _ _ - | add x y _ _ hx hy => rw [_root_.TensorProduct.tmul_add]; exact add_mem hx hy - | mul x y _ _ hx hy => - have h : (1 : S) ⊗ₜ[R] (x * y) = ((1 : S) ⊗ₜ[R] x) * ((1 : S) ⊗ₜ[R] y) := by - rw [Algebra.TensorProduct.tmul_mul_tmul, one_mul] - rw [h] - exact mul_mem hx hy - -/-- Every element of a base change lies in the subalgebra generated by the `1 ⊗ₜ s`. -/ -lemma mem_adjoin_one_tmul_of_generates (hs : Algebra.adjoin R s = ⊤) (x : S ⊗[R] A) : - x ∈ Algebra.adjoin S ((fun a : A => (1 : S) ⊗ₜ[R] a) '' s) := by - induction x using _root_.TensorProduct.induction_on with - | zero => exact zero_mem _ - | add u v hu hv => exact add_mem hu hv - | tmul z a => - have h : z ⊗ₜ[R] a = z • ((1 : S) ⊗ₜ[R] a) := by - rw [_root_.TensorProduct.smul_tmul', smul_eq_mul, mul_one] - exact h ▸ Subalgebra.smul_mem _ (mem_adjoin_one_tmul S s hs a) z - -/-- Extension of scalars preserves generation. If `s` generates `A` over `R` then the - elements `1 ⊗ₜ a`, for `a ∈ s`, generate `S ⊗[R] A` over `S`. -/ -lemma adjoin_one_tmul_eq_top (hs : Algebra.adjoin R s = ⊤) : - Algebra.adjoin S ((fun a : A => (1 : S) ⊗ₜ[R] a) '' s) - = (⊤ : Subalgebra S (S ⊗[R] A)) := - _root_.Algebra.eq_top_iff.mpr fun x => mem_adjoin_one_tmul_of_generates S s hs x - -end BaseChange - -end TensorProduct - -end Algebra - -/-! - -### A.3. Polarization - --/ +namespace GaugeFieldData -/-- Polarization. If every value of a linear map into a ring squares to zero, then any two - values anticommute. Applied to a space of fermionic generators, this is what makes the - single relation "every vector squares to zero" carry the anticommutation of distinct - generators, including generators of different species, which sit in the same space. -/ -lemma LinearMap.mul_swap_of_mul_self {R M B : Type*} [CommSemiring R] [AddCommMonoid M] - [Module R M] [Ring B] [Algebra R B] (f : M →ₗ[R] B) (h : ∀ v, f v * f v = 0) (v w : M) : - f v * f w = -(f w * f v) := by - have hvw := h (v + w) - rw [map_add, add_mul, mul_add, mul_add, h v, h w, zero_add, add_zero] at hvw - exact eq_neg_of_add_eq_zero_left hvw +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} [LocalGaugeDataLeibniz jets] (T : GaugeFieldData jets) /-! -## B. The local field algebra +## A. The local field algebra of a field datum -/ -variable (Ef Eb EA : Type*) [AddCommGroup Ef] [Module ℂ Ef] [AddCommGroup Eb] - [Module ℂ Eb] [AddCommGroup EA] [Module ℝ EA] +/-- The local field algebra `J(T)` of a gauge-field datum, in which the local expressions + of the theory, such as Lagrangian terms, currents and field strengths, live before any of + them is selected. It is the exterior algebra of the fermionic generators tensored with + the symmetric algebra of the bosonic generators, tensored with the complexified symmetric + algebra of the connection generators. -/-- The local field algebra on a complex space `Ef` of fermionic generators, a complex - space `Eb` of bosonic generators and a real space `EA` of connection generators. It is - the exterior algebra of the fermions tensored with the symmetric algebra of the bosons, - tensored with the complexified symmetric algebra of the connection. A local expression - of a field theory, such as a Lagrangian term or a current, is an element of it. - - All fermionic generators share one exterior algebra, so that symbols of different species - anticommute; separate exterior algebras joined by an ordinary tensor product would make - them commute instead. The factor order matches `StandardModel.JetAlgebra`. -/ -abbrev LocalFieldAlgebra : Type _ := - (ExteriorAlgebra ℂ Ef ⊗[ℂ] SymmetricAlgebra ℂ Eb) ⊗[ℂ] (ℂ ⊗[ℝ] SymmetricAlgebra ℝ EA) - -namespace LocalFieldAlgebra + All the fermionic species share one exterior algebra, so their generators anticommute + across species and not only within one. The factor order matches + `StandardModel.JetAlgebra`. -/ +abbrev LocalFieldAlgebra : Type := + (ExteriorAlgebra ℂ T.FermionGenerators ⊗[ℂ] SymmetricAlgebra ℂ T.BosonGenerators) ⊗[ℂ] + (ℂ ⊗[ℝ] SymmetricAlgebra ℝ (GaugeBoson.JetComponentSpace 𝔤)) /-! -### B.1. The factor inclusions and the generators +### A.1. The factor inclusions and the generators -/ /-- The inclusion of the fermionic factor. -/ -noncomputable def includeFermion : ExteriorAlgebra ℂ Ef →ₐ[ℂ] LocalFieldAlgebra Ef Eb EA := - (Algebra.TensorProduct.includeLeft - (R := ℂ) (S := ℂ) (B := ℂ ⊗[ℝ] SymmetricAlgebra ℝ EA)).comp +noncomputable def includeFermion : + ExteriorAlgebra ℂ T.FermionGenerators →ₐ[ℂ] T.LocalFieldAlgebra := + (Algebra.TensorProduct.includeLeft (R := ℂ) (S := ℂ) + (B := ℂ ⊗[ℝ] SymmetricAlgebra ℝ (GaugeBoson.JetComponentSpace 𝔤))).comp Algebra.TensorProduct.includeLeft /-- The inclusion of the bosonic factor. -/ -noncomputable def includeBoson : SymmetricAlgebra ℂ Eb →ₐ[ℂ] LocalFieldAlgebra Ef Eb EA := - (Algebra.TensorProduct.includeLeft - (R := ℂ) (S := ℂ) (B := ℂ ⊗[ℝ] SymmetricAlgebra ℝ EA)).comp +noncomputable def includeBoson : + SymmetricAlgebra ℂ T.BosonGenerators →ₐ[ℂ] T.LocalFieldAlgebra := + (Algebra.TensorProduct.includeLeft (R := ℂ) (S := ℂ) + (B := ℂ ⊗[ℝ] SymmetricAlgebra ℝ (GaugeBoson.JetComponentSpace 𝔤))).comp Algebra.TensorProduct.includeRight /-- The inclusion of the complexified connection factor. -/ noncomputable def includeConnection : - (ℂ ⊗[ℝ] SymmetricAlgebra ℝ EA) →ₐ[ℂ] LocalFieldAlgebra Ef Eb EA := + (ℂ ⊗[ℝ] SymmetricAlgebra ℝ (GaugeBoson.JetComponentSpace 𝔤)) →ₐ[ℂ] + T.LocalFieldAlgebra := Algebra.TensorProduct.includeRight -/-- The fermionic generators of the local field algebra. -/ -noncomputable def ιFermion : Ef →ₗ[ℂ] LocalFieldAlgebra Ef Eb EA := - (includeFermion Ef Eb EA).toLinearMap ∘ₗ ExteriorAlgebra.ι ℂ - -/-- The bosonic generators of the local field algebra. -/ -noncomputable def ιBoson : Eb →ₗ[ℂ] LocalFieldAlgebra Ef Eb EA := - (includeBoson Ef Eb EA).toLinearMap ∘ₗ SymmetricAlgebra.ι ℂ Eb - -/-- The connection generators of the local field algebra. They are only real-linear, the - connection generator space being a real vector space, complexified inside the algebra. -/ -noncomputable def ιConnection : EA →ₗ[ℝ] LocalFieldAlgebra Ef Eb EA := - ((includeConnection Ef Eb EA).restrictScalars ℝ).toLinearMap ∘ₗ - (Algebra.TensorProduct.includeRight - (R := ℝ) (A := ℂ) (B := SymmetricAlgebra ℝ EA)).toLinearMap ∘ₗ - SymmetricAlgebra.ι ℝ EA +/-- All the fermionic generators of the datum at once, the whole fermionic generator space + inside the algebra. Fermi statistics is a condition on this map, not on the species maps + separately. -/ +noncomputable def ιFermionTotal : T.FermionGenerators →ₗ[ℂ] T.LocalFieldAlgebra := + (T.includeFermion).toLinearMap ∘ₗ ExteriorAlgebra.ι ℂ -variable {Ef Eb EA} +/-- All the bosonic generators of the datum at once. -/ +noncomputable def ιBosonTotal : T.BosonGenerators →ₗ[ℂ] T.LocalFieldAlgebra := + (T.includeBoson).toLinearMap ∘ₗ SymmetricAlgebra.ι ℂ T.BosonGenerators -lemma ιFermion_apply (v : Ef) : - ιFermion Ef Eb EA v - = (ExteriorAlgebra.ι ℂ v ⊗ₜ[ℂ] (1 : SymmetricAlgebra ℂ Eb)) - ⊗ₜ[ℂ] (1 : ℂ ⊗[ℝ] SymmetricAlgebra ℝ EA) := rfl - -lemma ιBoson_apply (v : Eb) : - ιBoson Ef Eb EA v - = ((1 : ExteriorAlgebra ℂ Ef) ⊗ₜ[ℂ] SymmetricAlgebra.ι ℂ Eb v) - ⊗ₜ[ℂ] (1 : ℂ ⊗[ℝ] SymmetricAlgebra ℝ EA) := rfl - -lemma ιConnection_apply (v : EA) : - ιConnection Ef Eb EA v - = (1 : ExteriorAlgebra ℂ Ef ⊗[ℂ] SymmetricAlgebra ℂ Eb) - ⊗ₜ[ℂ] ((1 : ℂ) ⊗ₜ[ℝ] SymmetricAlgebra.ι ℝ EA v) := rfl +/-- The connection generators inside the local field algebra. They are only real-linear, + the connection generator space being a real vector space, complexified inside the + algebra. -/ +noncomputable def ιConnection : + GaugeBoson.JetComponentSpace 𝔤 →ₗ[ℝ] T.LocalFieldAlgebra := + ((T.includeConnection).restrictScalars ℝ).toLinearMap ∘ₗ + (Algebra.TensorProduct.includeRight (R := ℝ) (A := ℂ) + (B := SymmetricAlgebra ℝ (GaugeBoson.JetComponentSpace 𝔤))).toLinearMap ∘ₗ + SymmetricAlgebra.ι ℝ (GaugeBoson.JetComponentSpace 𝔤) + +/-- The generators of one fermionic species inside the local field algebra. -/ +noncomputable def ιFermion (i : T.FermionSpecies) : + JetComponentSpace (T.FermionValue i) →ₗ[ℂ] T.LocalFieldAlgebra := + T.ιFermionTotal ∘ₗ T.inclFermion i + +/-- The generators of one bosonic species inside the local field algebra. -/ +noncomputable def ιBoson (j : T.BosonSpecies) : + JetComponentSpace (T.BosonValue j) →ₗ[ℂ] T.LocalFieldAlgebra := + T.ιBosonTotal ∘ₗ T.inclBoson j + +variable {T} + +lemma ιFermionTotal_apply (v : T.FermionGenerators) : + T.ιFermionTotal v + = (ExteriorAlgebra.ι ℂ v ⊗ₜ[ℂ] (1 : SymmetricAlgebra ℂ T.BosonGenerators)) + ⊗ₜ[ℂ] (1 : ℂ ⊗[ℝ] SymmetricAlgebra ℝ (GaugeBoson.JetComponentSpace 𝔤)) := rfl + +lemma ιBosonTotal_apply (v : T.BosonGenerators) : + T.ιBosonTotal v + = ((1 : ExteriorAlgebra ℂ T.FermionGenerators) ⊗ₜ[ℂ] + SymmetricAlgebra.ι ℂ T.BosonGenerators v) + ⊗ₜ[ℂ] (1 : ℂ ⊗[ℝ] SymmetricAlgebra ℝ (GaugeBoson.JetComponentSpace 𝔤)) := rfl + +lemma ιConnection_apply (v : GaugeBoson.JetComponentSpace 𝔤) : + T.ιConnection v + = (1 : ExteriorAlgebra ℂ T.FermionGenerators ⊗[ℂ] SymmetricAlgebra ℂ T.BosonGenerators) + ⊗ₜ[ℂ] ((1 : ℂ) ⊗ₜ[ℝ] + SymmetricAlgebra.ι ℝ (GaugeBoson.JetComponentSpace 𝔤) v) := rfl + +lemma ιFermion_apply (i : T.FermionSpecies) (x : JetComponentSpace (T.FermionValue i)) : + T.ιFermion i x = T.ιFermionTotal (T.inclFermion i x) := rfl + +lemma ιBoson_apply (j : T.BosonSpecies) (y : JetComponentSpace (T.BosonValue j)) : + T.ιBoson j y = T.ιBosonTotal (T.inclBoson j y) := rfl /-! -### B.2. The relations satisfied by the generators +### A.2. The relations satisfied by the generators These are the relations a compatible assignment is asked to reproduce, namely Fermi -statistics on the fermionic generators and commutativity everywhere else. +statistics on the fermionic generators and commutativity everywhere else. They are stated +first for the whole generator spaces, which is where Fermi statistics belongs, and then +read one species at a time. -/ /-- A fermionic generator squares to zero. This is Fermi statistics, in the form that implies anticommutation across the whole fermionic generator space by polarization. -/ @[simp] -lemma ιFermion_mul_self (v : Ef) : - ιFermion Ef Eb EA v * ιFermion Ef Eb EA v = 0 := by - simp [ιFermion_apply, Algebra.TensorProduct.tmul_mul_tmul] +lemma ιFermionTotal_mul_self (v : T.FermionGenerators) : + T.ιFermionTotal v * T.ιFermionTotal v = 0 := by + simp [ιFermionTotal_apply, Algebra.TensorProduct.tmul_mul_tmul] /-- Two fermionic generators anticommute, including generators of two different species, which share the one exterior algebra. This is not an extra relation, being - `ιFermion_mul_self` polarized. -/ -lemma ιFermion_mul_swap (v w : Ef) : - ιFermion Ef Eb EA v * ιFermion Ef Eb EA w - = -(ιFermion Ef Eb EA w * ιFermion Ef Eb EA v) := by + `ιFermionTotal_mul_self` polarized. -/ +lemma ιFermionTotal_mul_swap (v w : T.FermionGenerators) : + T.ιFermionTotal v * T.ιFermionTotal w = -(T.ιFermionTotal w * T.ιFermionTotal v) := by have h : ExteriorAlgebra.ι ℂ v * ExteriorAlgebra.ι ℂ w = -(ExteriorAlgebra.ι ℂ w * ExteriorAlgebra.ι (R := ℂ) v) := eq_neg_of_add_eq_zero_left (ExteriorAlgebra.ι_add_mul_swap (R := ℂ) v w) - simp [ιFermion_apply, Algebra.TensorProduct.tmul_mul_tmul, h, TensorProduct.neg_tmul] + simp [ιFermionTotal_apply, Algebra.TensorProduct.tmul_mul_tmul, h, TensorProduct.neg_tmul] /-- Two bosonic generators commute. -/ -lemma ιBoson_commute (v w : Eb) : - Commute (ιBoson Ef Eb EA v) (ιBoson Ef Eb EA w) := by - simp [Commute, SemiconjBy, ιBoson_apply, Algebra.TensorProduct.tmul_mul_tmul, mul_comm] +lemma ιBosonTotal_commute (v w : T.BosonGenerators) : + Commute (T.ιBosonTotal v) (T.ιBosonTotal w) := by + simp [Commute, SemiconjBy, ιBosonTotal_apply, Algebra.TensorProduct.tmul_mul_tmul, mul_comm] /-- Two connection generators commute. -/ -lemma ιConnection_commute (v w : EA) : - Commute (ιConnection Ef Eb EA v) (ιConnection Ef Eb EA w) := by +lemma ιConnection_commute (v w : GaugeBoson.JetComponentSpace 𝔤) : + Commute (T.ιConnection v) (T.ιConnection w) := by simp [Commute, SemiconjBy, ιConnection_apply, Algebra.TensorProduct.tmul_mul_tmul, mul_comm] /-- A bosonic generator commutes with a connection generator. -/ -lemma ιBoson_commute_ιConnection (v : Eb) (w : EA) : - Commute (ιBoson Ef Eb EA v) (ιConnection Ef Eb EA w) := by - simp [Commute, SemiconjBy, ιBoson_apply, ιConnection_apply, +lemma ιBosonTotal_commute_ιConnection (v : T.BosonGenerators) + (w : GaugeBoson.JetComponentSpace 𝔤) : + Commute (T.ιBosonTotal v) (T.ιConnection w) := by + simp [Commute, SemiconjBy, ιBosonTotal_apply, ιConnection_apply, Algebra.TensorProduct.tmul_mul_tmul, mul_comm] /-- A bosonic generator commutes with a fermionic generator, bosons being even. -/ -lemma ιBoson_commute_ιFermion (v : Eb) (w : Ef) : - Commute (ιBoson Ef Eb EA v) (ιFermion Ef Eb EA w) := by - simp [Commute, SemiconjBy, ιBoson_apply, ιFermion_apply, +lemma ιBosonTotal_commute_ιFermionTotal (v : T.BosonGenerators) (w : T.FermionGenerators) : + Commute (T.ιBosonTotal v) (T.ιFermionTotal w) := by + simp [Commute, SemiconjBy, ιBosonTotal_apply, ιFermionTotal_apply, Algebra.TensorProduct.tmul_mul_tmul, mul_comm] -/-- A connection generator commutes with a fermionic generator, the connection being even. -/ -lemma ιConnection_commute_ιFermion (v : EA) (w : Ef) : - Commute (ιConnection Ef Eb EA v) (ιFermion Ef Eb EA w) := by - simp [Commute, SemiconjBy, ιConnection_apply, ιFermion_apply, +/-- A connection generator commutes with a fermionic generator, the connection being + even. -/ +lemma ιConnection_commute_ιFermionTotal (v : GaugeBoson.JetComponentSpace 𝔤) + (w : T.FermionGenerators) : Commute (T.ιConnection v) (T.ιFermionTotal w) := by + simp [Commute, SemiconjBy, ιConnection_apply, ιFermionTotal_apply, Algebra.TensorProduct.tmul_mul_tmul, mul_comm] -variable (Ef Eb EA) +/-- A fermionic generator of a species squares to zero. -/ +@[simp] +lemma ιFermion_mul_self (i : T.FermionSpecies) (x : JetComponentSpace (T.FermionValue i)) : + T.ιFermion i x * T.ιFermion i x = 0 := + ιFermionTotal_mul_self (T.inclFermion i x) + +/-- The generators of two fermionic species of the datum anticommute. The species enter + one exterior algebra through different summands of the fermionic generator space, so this + is ordinary exterior anticommutation and not an extra relation; it is what separate + exterior algebras joined by an ordinary tensor product would lose. -/ +lemma ιFermion_mul_swap (i j : T.FermionSpecies) (x : JetComponentSpace (T.FermionValue i)) + (y : JetComponentSpace (T.FermionValue j)) : + T.ιFermion i x * T.ιFermion j y = -(T.ιFermion j y * T.ιFermion i x) := + ιFermionTotal_mul_swap (T.inclFermion i x) (T.inclFermion j y) + +/-- Bosonic generators commute, across species as well as within one. -/ +lemma ιBoson_commute (i j : T.BosonSpecies) (x : JetComponentSpace (T.BosonValue i)) + (y : JetComponentSpace (T.BosonValue j)) : + Commute (T.ιBoson i x) (T.ιBoson j y) := + ιBosonTotal_commute (T.inclBoson i x) (T.inclBoson j y) + +/-- A bosonic generator commutes with a fermionic one, bosons being even. -/ +lemma ιBoson_commute_ιFermion (j : T.BosonSpecies) (i : T.FermionSpecies) + (y : JetComponentSpace (T.BosonValue j)) (x : JetComponentSpace (T.FermionValue i)) : + Commute (T.ιBoson j y) (T.ιFermion i x) := + ιBosonTotal_commute_ιFermionTotal (T.inclBoson j y) (T.inclFermion i x) + +/-- A bosonic generator commutes with a connection generator. -/ +lemma ιBoson_commute_ιConnection (j : T.BosonSpecies) + (y : JetComponentSpace (T.BosonValue j)) (v : GaugeBoson.JetComponentSpace 𝔤) : + Commute (T.ιBoson j y) (T.ιConnection v) := + ιBosonTotal_commute_ιConnection (T.inclBoson j y) v + +/-- A connection generator commutes with a fermionic one, the connection being even. -/ +lemma ιConnection_commute_ιFermion (v : GaugeBoson.JetComponentSpace 𝔤) + (i : T.FermionSpecies) (x : JetComponentSpace (T.FermionValue i)) : + Commute (T.ιConnection v) (T.ιFermion i x) := + ιConnection_commute_ιFermionTotal v (T.inclFermion i x) + +variable (T) /-! -### B.3. Generation by the three families +### A.3. Generation by the three families -/ /-- The generators of the local field algebra, the images of the three generator spaces. -/ -noncomputable def generators : Set (LocalFieldAlgebra Ef Eb EA) := - Set.range (ιFermion Ef Eb EA) ∪ Set.range (ιBoson Ef Eb EA) - ∪ Set.range (ιConnection Ef Eb EA) +noncomputable def generators : Set T.LocalFieldAlgebra := + Set.range T.ιFermionTotal ∪ Set.range T.ιBosonTotal ∪ Set.range T.ιConnection -/-- The matter factor `Λ_ℂ Ef ⊗[ℂ] Sym_ℂ Eb` is generated by the images of the fermionic - and bosonic generators. -/ +/-- The matter factor `Λ_ℂ E_f(T) ⊗[ℂ] Sym_ℂ E_b(T)` is generated by the images of the + fermionic and bosonic generators. -/ lemma adjoin_matter_generators_eq_top : Algebra.adjoin ℂ - (Set.range (fun v : Ef => - ExteriorAlgebra.ι ℂ v ⊗ₜ[ℂ] (1 : SymmetricAlgebra ℂ Eb)) - ∪ Set.range (fun v : Eb => - (1 : ExteriorAlgebra ℂ Ef) ⊗ₜ[ℂ] SymmetricAlgebra.ι ℂ Eb v)) = ⊤ := by + (Set.range (fun v : T.FermionGenerators => + ExteriorAlgebra.ι ℂ v ⊗ₜ[ℂ] (1 : SymmetricAlgebra ℂ T.BosonGenerators)) + ∪ Set.range (fun v : T.BosonGenerators => + (1 : ExteriorAlgebra ℂ T.FermionGenerators) ⊗ₜ[ℂ] + SymmetricAlgebra.ι ℂ T.BosonGenerators v)) = ⊤ := by refine Algebra.TensorProduct.eq_top_of_tmul_one_of_one_tmul (fun a => ?_) (fun b => ?_) · exact Algebra.range_le_of_adjoin_eq_top CliffordAlgebra.adjoin_range_ι - (Algebra.TensorProduct.includeLeft (R := ℂ) (S := ℂ) (B := SymmetricAlgebra ℂ Eb)) + (Algebra.TensorProduct.includeLeft (R := ℂ) (S := ℂ) + (B := SymmetricAlgebra ℂ T.BosonGenerators)) (by rintro _ ⟨v, rfl⟩; exact Algebra.subset_adjoin (Or.inl ⟨v, rfl⟩)) ⟨a, rfl⟩ · exact Algebra.range_le_of_adjoin_eq_top SymmetricAlgebra.adjoin_range_ι - (Algebra.TensorProduct.includeRight (R := ℂ) (A := ExteriorAlgebra ℂ Ef)) + (Algebra.TensorProduct.includeRight (R := ℂ) + (A := ExteriorAlgebra ℂ T.FermionGenerators)) (by rintro _ ⟨v, rfl⟩; exact Algebra.subset_adjoin (Or.inr ⟨v, rfl⟩)) ⟨b, rfl⟩ /-- The local field algebra is generated by its three families of generators. Every element is a polynomial in the fermionic, bosonic and connection symbols; this is the algebraic form of "every local expression is a polynomial in the fields and their derivatives", and it is what forces uniqueness in the universal property. -/ -lemma adjoin_generators_eq_top : - Algebra.adjoin ℂ (generators Ef Eb EA) = ⊤ := by +lemma adjoin_generators_eq_top : Algebra.adjoin ℂ T.generators = ⊤ := by refine Algebra.TensorProduct.eq_top_of_tmul_one_of_one_tmul (fun m => ?_) (fun y => ?_) - · refine Algebra.range_le_of_adjoin_eq_top (adjoin_matter_generators_eq_top Ef Eb) + · refine Algebra.range_le_of_adjoin_eq_top (adjoin_matter_generators_eq_top T) (Algebra.TensorProduct.includeLeft (R := ℂ) (S := ℂ) - (B := ℂ ⊗[ℝ] SymmetricAlgebra ℝ EA)) ?_ ⟨m, rfl⟩ + (B := ℂ ⊗[ℝ] SymmetricAlgebra ℝ (GaugeBoson.JetComponentSpace 𝔤))) ?_ ⟨m, rfl⟩ rintro _ (⟨v, rfl⟩ | ⟨v, rfl⟩) · exact Algebra.subset_adjoin (Or.inl (Or.inl ⟨v, rfl⟩)) · exact Algebra.subset_adjoin (Or.inl (Or.inr ⟨v, rfl⟩)) · refine Algebra.range_le_of_adjoin_eq_top - (Algebra.TensorProduct.adjoin_one_tmul_eq_top ℂ (Set.range (SymmetricAlgebra.ι ℝ EA)) + (Algebra.TensorProduct.adjoin_one_tmul_eq_top ℂ + (Set.range (SymmetricAlgebra.ι ℝ (GaugeBoson.JetComponentSpace 𝔤))) SymmetricAlgebra.adjoin_range_ι) (Algebra.TensorProduct.includeRight (R := ℂ) - (A := ExteriorAlgebra ℂ Ef ⊗[ℂ] SymmetricAlgebra ℂ Eb)) ?_ ⟨y, rfl⟩ + (A := ExteriorAlgebra ℂ T.FermionGenerators ⊗[ℂ] + SymmetricAlgebra ℂ T.BosonGenerators)) ?_ ⟨y, rfl⟩ rintro _ ⟨_, ⟨v, rfl⟩, rfl⟩ exact Algebra.subset_adjoin (Or.inr ⟨v, rfl⟩) -/-- Two algebra maps out of the local field algebra agreeing on the generators are - equal. The target is not assumed commutative, so this cannot be deduced from - `SymmetricAlgebra.algHom_ext`; it comes from generation. -/ -lemma algHom_ext {B : Type*} [Ring B] [Algebra ℂ B] - {Φ Ψ : LocalFieldAlgebra Ef Eb EA →ₐ[ℂ] B} - (hf : ∀ v, Φ (ιFermion Ef Eb EA v) = Ψ (ιFermion Ef Eb EA v)) - (hb : ∀ v, Φ (ιBoson Ef Eb EA v) = Ψ (ιBoson Ef Eb EA v)) - (ha : ∀ v, Φ (ιConnection Ef Eb EA v) = Ψ (ιConnection Ef Eb EA v)) : Φ = Ψ := - AlgHom.ext_of_adjoin_eq_top (adjoin_generators_eq_top Ef Eb EA) (by +/-- Two algebra maps out of the local field algebra agreeing on the whole of the three + generator spaces are equal. The target is not assumed commutative, so this cannot be + deduced from `SymmetricAlgebra.algHom_ext`; it comes from generation. -/ +lemma algHom_ext_generators {B : Type*} [Ring B] [Algebra ℂ B] + {Φ Ψ : T.LocalFieldAlgebra →ₐ[ℂ] B} + (hf : ∀ v, Φ (T.ιFermionTotal v) = Ψ (T.ιFermionTotal v)) + (hb : ∀ v, Φ (T.ιBosonTotal v) = Ψ (T.ιBosonTotal v)) + (ha : ∀ v, Φ (T.ιConnection v) = Ψ (T.ιConnection v)) : Φ = Ψ := + AlgHom.ext_of_adjoin_eq_top (adjoin_generators_eq_top T) (by rintro _ ((⟨v, rfl⟩ | ⟨v, rfl⟩) | ⟨v, rfl⟩) exacts [hf v, hb v, ha v]) +variable {T} + +/-- Two algebra maps out of `J(T)` are equal as soon as they agree on the generators of + every species and on the connection generators. A linear map out of the fermionic + generator space is determined by its restrictions to the species, so the species-wise + hypotheses already give the hypotheses of `algHom_ext_generators`. -/ +lemma algHom_ext {B : Type*} [Ring B] [Algebra ℂ B] {Φ Ψ : T.LocalFieldAlgebra →ₐ[ℂ] B} + (hf : ∀ i x, Φ (T.ιFermion i x) = Ψ (T.ιFermion i x)) + (hb : ∀ j y, Φ (T.ιBoson j y) = Ψ (T.ιBoson j y)) + (ha : ∀ v, Φ (T.ιConnection v) = Ψ (T.ιConnection v)) : Φ = Ψ := + algHom_ext_generators T + (fun v => LinearMap.congr_fun (SpeciesComponentSpace.hom_ext + (F := Φ.toLinearMap ∘ₗ T.ιFermionTotal) + (G := Ψ.toLinearMap ∘ₗ T.ιFermionTotal) hf) v) + (fun v => LinearMap.congr_fun (SpeciesComponentSpace.hom_ext + (F := Φ.toLinearMap ∘ₗ T.ιBosonTotal) + (G := Ψ.toLinearMap ∘ₗ T.ιBosonTotal) hb) v) + ha + +variable (T) + /-! -## C. Compatible generator assignments +## B. Compatible generator assignments -/ -/-- A compatible assignment of the generators of the local field algebra in a complex - algebra `B`, given by three linear maps subject to exactly the relations of section B.2. - The algebra `B` is not assumed commutative, and the commutation conditions are imposed - only between the assigned images, not between an image and an arbitrary element of `B`. - - The condition `fermion_mul_self` is imposed on every vector of `Ef`, including sums - across species; over `ℂ` it implies, by polarization, that distinct fermionic images - anticommute. -/ +/-- A compatible assignment of the generators of the local field algebra of a datum in a + complex algebra `B`, given by one linear map per fermionic species, one per bosonic + species and one real-linear map on the connection generators, subject to exactly the + relations of section A.2. The algebra `B` is not assumed commutative, and the commutation + conditions are imposed only between the assigned images, not between an image and an + arbitrary element of `B`. + + `fermion_mul_swap` is not redundant. The square-zero condition the algebra imposes is on + the whole fermionic generator space, and by `DirectSum.mul_self_iff_lof` that condition is + equivalent to `fermion_mul_self` together with `fermion_mul_swap`; species-wise + square-zero alone leaves the cross terms of `(x + y) * (x + y)` for `x` and `y` in + different species. -/ @[ext] structure Assignment (B : Type*) [Ring B] [Algebra ℂ B] where - /-- The images of the fermionic generators. -/ - fermion : Ef →ₗ[ℂ] B - /-- The images of the bosonic generators. -/ - boson : Eb →ₗ[ℂ] B + /-- The images of the generators of each fermionic species. -/ + fermion : ∀ i, JetComponentSpace (T.FermionValue i) →ₗ[ℂ] B + /-- The images of the generators of each bosonic species. -/ + boson : ∀ j, JetComponentSpace (T.BosonValue j) →ₗ[ℂ] B /-- The images of the connection generators; only real-linear, as the connection generator space is real. -/ - connection : EA →ₗ[ℝ] B - /-- Fermi statistics, every fermionic image squaring to zero. -/ - fermion_mul_self : ∀ v, fermion v * fermion v = 0 - /-- Bosonic images commute pairwise. -/ - boson_commute : ∀ v w, Commute (boson v) (boson w) + connection : GaugeBoson.JetComponentSpace 𝔤 →ₗ[ℝ] B + /-- Fermi statistics within a species. -/ + fermion_mul_self : ∀ i x, fermion i x * fermion i x = 0 + /-- Fermi statistics across species, which does not follow from `fermion_mul_self`. -/ + fermion_mul_swap : ∀ i j x y, fermion i x * fermion j y = -(fermion j y * fermion i x) + /-- Bosonic images commute, across species as well as within one. -/ + boson_commute : ∀ i j x y, Commute (boson i x) (boson j y) /-- Connection images commute pairwise. -/ connection_commute : ∀ v w, Commute (connection v) (connection w) /-- Bosonic and connection images commute with each other. -/ - boson_commute_connection : ∀ v w, Commute (boson v) (connection w) + boson_commute_connection : ∀ j y w, Commute (boson j y) (connection w) /-- Bosonic images commute with fermionic images. -/ - boson_commute_fermion : ∀ v w, Commute (boson v) (fermion w) + boson_commute_fermion : ∀ j i y x, Commute (boson j y) (fermion i x) /-- Connection images commute with fermionic images. -/ - connection_commute_fermion : ∀ v w, Commute (connection v) (fermion w) - -section Assignments + connection_commute_fermion : ∀ v i x, Commute (connection v) (fermion i x) + +variable {T} + +/-- Species-wise square-zero is not square-zero. The condition the local field algebra + imposes on the assembled fermionic map is equivalent to the two fields + `Assignment.fermion_mul_self` and `Assignment.fermion_mul_swap` together; the second is + vacuous only for a family with at most one species. -/ +lemma assemble_mul_self_iff {B : Type*} [Ring B] [Algebra ℂ B] + (f : ∀ i, JetComponentSpace (T.FermionValue i) →ₗ[ℂ] B) : + (∀ v, SpeciesComponentSpace.assemble T.FermionValue f v * + SpeciesComponentSpace.assemble T.FermionValue f v = 0) + ↔ ((∀ i x, f i x * f i x = 0) ∧ + ∀ i j x y, f i x * f j y = -(f j y * f i x)) := by + rw [DirectSum.mul_self_iff_lof] + simp namespace Assignment -variable {Ef Eb EA} -variable {B : Type*} [Ring B] [Algebra ℂ B] (d : Assignment Ef Eb EA B) +variable {B : Type*} [Ring B] [Algebra ℂ B] (d : T.Assignment B) /-! -### C.1. Polarization of the fermionic assignment +### B.1. The assembled generator maps + +The relations of an assignment are given species by species; the lifts out of the exterior +and symmetric algebras need them on the whole generator spaces. The extension lemmas of +`Physlib.Mathematics.AlgebraGeneration` supply that, the summands of the direct sum playing +the role of the generators. -/ -/-- The images of two fermionic generators anticommute. Only `fermion_mul_self` is - assumed, and only vector by vector; because it is assumed on the whole of `Ef`, including - sums across species, polarization already yields the cross-species anticommutation. So - demanding anticommutation as a separate field of `Assignment` would be redundant. -/ -lemma fermion_mul_swap (v w : Ef) : - d.fermion v * d.fermion w = -(d.fermion w * d.fermion v) := - d.fermion.mul_swap_of_mul_self d.fermion_mul_self v w +/-- The images of all the fermionic generators at once, assembled from the species. -/ +def fermionTotal : T.FermionGenerators →ₗ[ℂ] B := + SpeciesComponentSpace.assemble T.FermionValue d.fermion + +/-- The images of all the bosonic generators at once. -/ +def bosonTotal : T.BosonGenerators →ₗ[ℂ] B := + SpeciesComponentSpace.assemble T.BosonValue d.boson + +@[simp] +lemma fermionTotal_inclFermion (i : T.FermionSpecies) + (x : JetComponentSpace (T.FermionValue i)) : + d.fermionTotal (T.inclFermion i x) = d.fermion i x := + SpeciesComponentSpace.assemble_incl d.fermion i x + +@[simp] +lemma bosonTotal_inclBoson (j : T.BosonSpecies) (y : JetComponentSpace (T.BosonValue j)) : + d.bosonTotal (T.inclBoson j y) = d.boson j y := + SpeciesComponentSpace.assemble_incl d.boson j y + +/-- The assembled fermionic images square to zero, which is more than the species-wise + condition and needs the cross-species anticommutation as well. -/ +lemma fermionTotal_mul_self (v : T.FermionGenerators) : + d.fermionTotal v * d.fermionTotal v = 0 := + (assemble_mul_self_iff d.fermion).2 ⟨d.fermion_mul_self, d.fermion_mul_swap⟩ v + +/-- The images of two fermionic generators anticommute. Only `fermion_mul_self` and + `fermion_mul_swap` are assumed, and only species by species; because their conjunction is + square-zero on the whole generator space, polarization yields the relation for arbitrary + vectors, sums across species included. -/ +lemma fermionTotal_mul_swap (v w : T.FermionGenerators) : + d.fermionTotal v * d.fermionTotal w = -(d.fermionTotal w * d.fermionTotal v) := + d.fermionTotal.mul_swap_of_mul_self d.fermionTotal_mul_self v w + +/-- The assembled bosonic images commute pairwise. -/ +lemma bosonTotal_commute (v w : T.BosonGenerators) : + Commute (d.bosonTotal v) (d.bosonTotal w) := + DirectSum.commute_of_lof (fun i j x y => by simpa using d.boson_commute i j x y) v w + +/-- The assembled bosonic images commute with the connection images. -/ +lemma bosonTotal_commute_connection (v : T.BosonGenerators) + (w : GaugeBoson.JetComponentSpace 𝔤) : Commute (d.bosonTotal v) (d.connection w) := + DirectSum.commute_of_lof_left (fun j y => by + simpa using d.boson_commute_connection j y w) v + +/-- The assembled bosonic images commute with the assembled fermionic images. -/ +lemma bosonTotal_commute_fermionTotal (v : T.BosonGenerators) (w : T.FermionGenerators) : + Commute (d.bosonTotal v) (d.fermionTotal w) := + DirectSum.commute_of_lof (fun j i y x => by + simpa using d.boson_commute_fermion j i y x) v w + +/-- The connection images commute with the assembled fermionic images. -/ +lemma connection_commute_fermionTotal (v : GaugeBoson.JetComponentSpace 𝔤) + (w : T.FermionGenerators) : Commute (d.connection v) (d.fermionTotal w) := + (DirectSum.commute_of_lof_left (fun i x => by + simpa using (d.connection_commute_fermion v i x).symm) w).symm /-! -### C.2. The commutative subalgebra of even images +### B.2. The commutative subalgebra of even images -/ /-- The even generator images, the bosonic and connection images together. -/ -def evenGenerators : Set B := Set.range d.boson ∪ Set.range d.connection +def evenGenerators : Set B := Set.range d.bosonTotal ∪ Set.range d.connection /-- The commutative subalgebra of `B` generated by the even images. The bosonic and connection assignments are lifted into it, because `SymmetricAlgebra.lift` requires a @@ -510,90 +534,99 @@ def evenSubalgebra : Subalgebra ℂ B := Algebra.adjoin ℂ d.evenGenerators instance : IsMulCommutative d.evenSubalgebra := by refine Algebra.isMulCommutative_adjoin ℂ ?_ rintro x (⟨v, rfl⟩ | ⟨v, rfl⟩) y (⟨w, rfl⟩ | ⟨w, rfl⟩) - · exact d.boson_commute v w - · exact d.boson_commute_connection v w - · exact (d.boson_commute_connection w v).symm + · exact d.bosonTotal_commute v w + · exact d.bosonTotal_commute_connection v w + · exact (d.bosonTotal_commute_connection w v).symm · exact d.connection_commute v w open scoped IsMulCommutative /-- The bosonic assignment, corestricted to the commutative subalgebra of even images. -/ -def bosonGenerator : Eb →ₗ[ℂ] d.evenSubalgebra where - toFun v := ⟨d.boson v, Algebra.subset_adjoin (Or.inl ⟨v, rfl⟩)⟩ +def bosonGenerator : T.BosonGenerators →ₗ[ℂ] d.evenSubalgebra where + toFun v := ⟨d.bosonTotal v, Algebra.subset_adjoin (Or.inl ⟨v, rfl⟩)⟩ map_add' v w := Subtype.ext (by simp) map_smul' c v := Subtype.ext (by simp) /-- The connection assignment, corestricted to the commutative subalgebra of even images. -/ -def connectionGenerator : EA →ₗ[ℝ] d.evenSubalgebra where +noncomputable def connectionGenerator : + GaugeBoson.JetComponentSpace 𝔤 →ₗ[ℝ] d.evenSubalgebra where toFun v := ⟨d.connection v, Algebra.subset_adjoin (Or.inr ⟨v, rfl⟩)⟩ map_add' v w := Subtype.ext (by simp) map_smul' c v := Subtype.ext (by simp) /-! -### C.3. The three factor maps +### B.3. The three factor maps -/ -/-- The algebra map out of the fermionic factor, the exterior lift of the fermionic - assignment, which already accepts an associative, possibly noncommutative, target. -/ -noncomputable def fermionHom : ExteriorAlgebra ℂ Ef →ₐ[ℂ] B := - ExteriorAlgebra.lift ℂ ⟨d.fermion, d.fermion_mul_self⟩ +/-- The algebra map out of the fermionic factor, the exterior lift of the assembled + fermionic images, which already accepts an associative, possibly noncommutative, + target. -/ +noncomputable def fermionHom : ExteriorAlgebra ℂ T.FermionGenerators →ₐ[ℂ] B := + ExteriorAlgebra.lift ℂ ⟨d.fermionTotal, d.fermionTotal_mul_self⟩ /-- The algebra map out of the bosonic factor, the symmetric lift into the commutative subalgebra of even images, followed by its inclusion. -/ -noncomputable def bosonHom : SymmetricAlgebra ℂ Eb →ₐ[ℂ] B := +noncomputable def bosonHom : SymmetricAlgebra ℂ T.BosonGenerators →ₐ[ℂ] B := d.evenSubalgebra.val.comp (SymmetricAlgebra.lift d.bosonGenerator) /-- The real algebra map out of the real connection factor. -/ -noncomputable def connectionHomReal : SymmetricAlgebra ℝ EA →ₐ[ℝ] B := +noncomputable def connectionHomReal : + SymmetricAlgebra ℝ (GaugeBoson.JetComponentSpace 𝔤) →ₐ[ℝ] B := (d.evenSubalgebra.val.restrictScalars ℝ).comp (SymmetricAlgebra.lift d.connectionGenerator) /-- The algebra map out of the complexified connection factor, obtained from `connectionHomReal` by the universal property of extension of scalars, which, unlike the symmetric lift, accepts a noncommutative target. -/ -noncomputable def connectionHom : (ℂ ⊗[ℝ] SymmetricAlgebra ℝ EA) →ₐ[ℂ] B := +noncomputable def connectionHom : + (ℂ ⊗[ℝ] SymmetricAlgebra ℝ (GaugeBoson.JetComponentSpace 𝔤)) →ₐ[ℂ] B := AlgHom.liftEquiv ℝ ℂ _ B d.connectionHomReal @[simp] -lemma fermionHom_ι (v : Ef) : d.fermionHom (ExteriorAlgebra.ι ℂ v) = d.fermion v := - ExteriorAlgebra.lift_ι_apply (R := ℂ) d.fermion d.fermion_mul_self v +lemma fermionHom_ι (v : T.FermionGenerators) : + d.fermionHom (ExteriorAlgebra.ι ℂ v) = d.fermionTotal v := by + simp [fermionHom] @[simp] -lemma bosonHom_ι (v : Eb) : d.bosonHom (SymmetricAlgebra.ι ℂ Eb v) = d.boson v := by +lemma bosonHom_ι (v : T.BosonGenerators) : + d.bosonHom (SymmetricAlgebra.ι ℂ T.BosonGenerators v) = d.bosonTotal v := by simp [bosonHom, bosonGenerator] @[simp] -lemma connectionHomReal_ι (v : EA) : - d.connectionHomReal (SymmetricAlgebra.ι ℝ EA v) = d.connection v := by +lemma connectionHomReal_ι (v : GaugeBoson.JetComponentSpace 𝔤) : + d.connectionHomReal (SymmetricAlgebra.ι ℝ (GaugeBoson.JetComponentSpace 𝔤) v) + = d.connection v := by simp [connectionHomReal, connectionGenerator] @[simp] -lemma connectionHom_tmul (z : ℂ) (p : SymmetricAlgebra ℝ EA) : +lemma connectionHom_tmul (z : ℂ) + (p : SymmetricAlgebra ℝ (GaugeBoson.JetComponentSpace 𝔤)) : d.connectionHom (z ⊗ₜ[ℝ] p) = z • d.connectionHomReal p := rfl /-! -### C.4. Commutation of the factor images +### B.4. Commutation of the factor images The tensor-product lifts need commutation between whole factor images, which the hypotheses supply only on generators. `Algebra.commute_of_adjoin_eq_top` propagates it. -/ -lemma fermionHom_commute_bosonHom (x : ExteriorAlgebra ℂ Ef) (y : SymmetricAlgebra ℂ Eb) : +lemma fermionHom_commute_bosonHom (x : ExteriorAlgebra ℂ T.FermionGenerators) + (y : SymmetricAlgebra ℂ T.BosonGenerators) : Commute (d.fermionHom x) (d.bosonHom y) := by refine Algebra.commute_of_adjoin_eq_top CliffordAlgebra.adjoin_range_ι d.fermionHom ?_ x rintro _ ⟨v, rfl⟩ refine (Algebra.commute_of_adjoin_eq_top SymmetricAlgebra.adjoin_range_ι d.bosonHom ?_ y).symm rintro _ ⟨w, rfl⟩ - simpa using d.boson_commute_fermion w v + simpa using d.bosonTotal_commute_fermionTotal w v -lemma fermionHom_commute_connectionHom (x : ExteriorAlgebra ℂ Ef) - (y : ℂ ⊗[ℝ] SymmetricAlgebra ℝ EA) : +lemma fermionHom_commute_connectionHom (x : ExteriorAlgebra ℂ T.FermionGenerators) + (y : ℂ ⊗[ℝ] SymmetricAlgebra ℝ (GaugeBoson.JetComponentSpace 𝔤)) : Commute (d.fermionHom x) (d.connectionHom y) := by refine Algebra.commute_of_adjoin_eq_top CliffordAlgebra.adjoin_range_ι d.fermionHom ?_ x rintro _ ⟨v, rfl⟩ @@ -606,10 +639,10 @@ lemma fermionHom_commute_connectionHom (x : ExteriorAlgebra ℂ Ef) refine (Algebra.commute_of_adjoin_eq_top SymmetricAlgebra.adjoin_range_ι d.connectionHomReal ?_ p).symm rintro _ ⟨w, rfl⟩ - simpa using d.connection_commute_fermion w v + simpa using d.connection_commute_fermionTotal w v -lemma bosonHom_commute_connectionHom (x : SymmetricAlgebra ℂ Eb) - (y : ℂ ⊗[ℝ] SymmetricAlgebra ℝ EA) : +lemma bosonHom_commute_connectionHom (x : SymmetricAlgebra ℂ T.BosonGenerators) + (y : ℂ ⊗[ℝ] SymmetricAlgebra ℝ (GaugeBoson.JetComponentSpace 𝔤)) : Commute (d.bosonHom x) (d.connectionHom y) := by refine Algebra.commute_of_adjoin_eq_top SymmetricAlgebra.adjoin_range_ι d.bosonHom ?_ x rintro _ ⟨v, rfl⟩ @@ -622,28 +655,29 @@ lemma bosonHom_commute_connectionHom (x : SymmetricAlgebra ℂ Eb) refine (Algebra.commute_of_adjoin_eq_top SymmetricAlgebra.adjoin_range_ι d.connectionHomReal ?_ p).symm rintro _ ⟨w, rfl⟩ - simpa using (d.boson_commute_connection v w).symm + simpa using (d.bosonTotal_commute_connection v w).symm /-! -## D. The mapping-out universal property +## C. The mapping-out universal property -/ /-! -### D.1. The induced algebra homomorphism +### C.1. The induced algebra homomorphism -/ -/-- The algebra map out of the matter factor `Λ_ℂ Ef ⊗[ℂ] Sym_ℂ Eb`. -/ +/-- The algebra map out of the matter factor `Λ_ℂ E_f(T) ⊗[ℂ] Sym_ℂ E_b(T)`. -/ noncomputable def matterHom : - (ExteriorAlgebra ℂ Ef ⊗[ℂ] SymmetricAlgebra ℂ Eb) →ₐ[ℂ] B := + (ExteriorAlgebra ℂ T.FermionGenerators ⊗[ℂ] SymmetricAlgebra ℂ T.BosonGenerators) →ₐ[ℂ] + B := Algebra.TensorProduct.lift d.fermionHom d.bosonHom d.fermionHom_commute_bosonHom lemma matterHom_commute_connectionHom - (x : ExteriorAlgebra ℂ Ef ⊗[ℂ] SymmetricAlgebra ℂ Eb) - (y : ℂ ⊗[ℝ] SymmetricAlgebra ℝ EA) : + (x : ExteriorAlgebra ℂ T.FermionGenerators ⊗[ℂ] SymmetricAlgebra ℂ T.BosonGenerators) + (y : ℂ ⊗[ℝ] SymmetricAlgebra ℝ (GaugeBoson.JetComponentSpace 𝔤)) : Commute (d.matterHom x) (d.connectionHom y) := by induction x using TensorProduct.induction_on with | zero => simp @@ -653,73 +687,90 @@ lemma matterHom_commute_connectionHom exact (d.fermionHom_commute_connectionHom a y).mul_left (d.bosonHom_commute_connectionHom b y) -/-- The algebra homomorphism induced by a compatible assignment. -/ -noncomputable def lift : LocalFieldAlgebra Ef Eb EA →ₐ[ℂ] B := +/-- The realization arrow of the datum: the algebra homomorphism `J(T) →ₐ[ℂ] B` induced by + a compatible assignment. -/ +noncomputable def lift : T.LocalFieldAlgebra →ₐ[ℂ] B := Algebra.TensorProduct.lift d.matterHom d.connectionHom d.matterHom_commute_connectionHom @[simp] -lemma lift_ιFermion (v : Ef) : d.lift (ιFermion Ef Eb EA v) = d.fermion v := by - simp [lift, ιFermion_apply, matterHom] +lemma lift_ιFermionTotal (v : T.FermionGenerators) : + d.lift (T.ιFermionTotal v) = d.fermionTotal v := by + simp [lift, ιFermionTotal_apply, matterHom] @[simp] -lemma lift_ιBoson (v : Eb) : d.lift (ιBoson Ef Eb EA v) = d.boson v := by - simp [lift, ιBoson_apply, matterHom] +lemma lift_ιBosonTotal (v : T.BosonGenerators) : + d.lift (T.ιBosonTotal v) = d.bosonTotal v := by + simp [lift, ιBosonTotal_apply, matterHom] @[simp] -lemma lift_ιConnection (v : EA) : d.lift (ιConnection Ef Eb EA v) = d.connection v := by +lemma lift_ιConnection (v : GaugeBoson.JetComponentSpace 𝔤) : + d.lift (T.ιConnection v) = d.connection v := by simp [lift, ιConnection_apply, matterHom] +@[simp] +lemma lift_ιFermion (i : T.FermionSpecies) (x : JetComponentSpace (T.FermionValue i)) : + d.lift (T.ιFermion i x) = d.fermion i x := by + rw [ιFermion_apply, d.lift_ιFermionTotal, d.fermionTotal_inclFermion] + +@[simp] +lemma lift_ιBoson (j : T.BosonSpecies) (y : JetComponentSpace (T.BosonValue j)) : + d.lift (T.ιBoson j y) = d.boson j y := by + rw [ιBoson_apply, d.lift_ιBosonTotal, d.bosonTotal_inclBoson] + /-! -### D.2. Uniqueness +### C.2. Uniqueness -/ -/-- The mapping-out universal property of the local field algebra. A compatible assignment - of the three generator families in an arbitrary, in particular noncommutative, complex - algebra `B` extends to one and only one complex algebra homomorphism out of the local - field algebra. -/ +/-- The mapping-out universal property of the local field algebra of a datum. A compatible + assignment of the generators of every species, and of the connection, in an arbitrary, in + particular noncommutative, complex algebra `B` extends to one and only one complex algebra + homomorphism `J(T) →ₐ[ℂ] B`. Injectivity is neither claimed nor wanted, since a + realization may identify local expressions. -/ lemma existsUnique_algHom : - ∃! Φ : LocalFieldAlgebra Ef Eb EA →ₐ[ℂ] B, - (∀ v, Φ (ιFermion Ef Eb EA v) = d.fermion v) ∧ - (∀ v, Φ (ιBoson Ef Eb EA v) = d.boson v) ∧ - (∀ v, Φ (ιConnection Ef Eb EA v) = d.connection v) := + ∃! Φ : T.LocalFieldAlgebra →ₐ[ℂ] B, + (∀ i x, Φ (T.ιFermion i x) = d.fermion i x) ∧ + (∀ j y, Φ (T.ιBoson j y) = d.boson j y) ∧ + (∀ v, Φ (T.ιConnection v) = d.connection v) := ⟨d.lift, ⟨d.lift_ιFermion, d.lift_ιBoson, d.lift_ιConnection⟩, fun _ hΦ => - algHom_ext Ef Eb EA (fun v => (hΦ.1 v).trans (d.lift_ιFermion v).symm) - (fun v => (hΦ.2.1 v).trans (d.lift_ιBoson v).symm) + algHom_ext (fun i x => (hΦ.1 i x).trans (d.lift_ιFermion i x).symm) + (fun j y => (hΦ.2.1 j y).trans (d.lift_ιBoson j y).symm) (fun v => (hΦ.2.2 v).trans (d.lift_ιConnection v).symm)⟩ /-! -### D.3. Assignments are the same thing as algebra maps +### C.3. Assignments are the same thing as algebra maps -/ /-- The compatible assignment obtained by pushing one forward along an algebra map, every relation being preserved by an algebra homomorphism. -/ -def comp {C : Type*} [Ring C] [Algebra ℂ C] (φ : B →ₐ[ℂ] C) : Assignment Ef Eb EA C where - fermion := φ.toLinearMap ∘ₗ d.fermion - boson := φ.toLinearMap ∘ₗ d.boson +noncomputable def comp {C : Type*} [Ring C] [Algebra ℂ C] (φ : B →ₐ[ℂ] C) : + T.Assignment C where + fermion i := φ.toLinearMap ∘ₗ d.fermion i + boson j := φ.toLinearMap ∘ₗ d.boson j connection := (φ.restrictScalars ℝ).toLinearMap ∘ₗ d.connection - fermion_mul_self v := by simpa using congrArg φ (d.fermion_mul_self v) - boson_commute v w := (d.boson_commute v w).map φ + fermion_mul_self i x := by simpa using congrArg φ (d.fermion_mul_self i x) + fermion_mul_swap i j x y := by simpa using congrArg φ (d.fermion_mul_swap i j x y) + boson_commute i j x y := (d.boson_commute i j x y).map φ connection_commute v w := (d.connection_commute v w).map φ - boson_commute_connection v w := (d.boson_commute_connection v w).map φ - boson_commute_fermion v w := (d.boson_commute_fermion v w).map φ - connection_commute_fermion v w := (d.connection_commute_fermion v w).map φ + boson_commute_connection j y w := (d.boson_commute_connection j y w).map φ + boson_commute_fermion j i y x := (d.boson_commute_fermion j i y x).map φ + connection_commute_fermion v i x := (d.connection_commute_fermion v i x).map φ end Assignment -end Assignments +variable (T) -/-- The tautological assignment, with the generators of the local field algebra assigned - to themselves. Its relations are those of section B.2. -/ -noncomputable def canonicalAssignment : - Assignment Ef Eb EA (LocalFieldAlgebra Ef Eb EA) where - fermion := ιFermion Ef Eb EA - boson := ιBoson Ef Eb EA - connection := ιConnection Ef Eb EA +/-- The tautological assignment, with the generators of the local field algebra assigned to + themselves. Its relations are those of section A.2. -/ +noncomputable def canonicalAssignment : T.Assignment T.LocalFieldAlgebra where + fermion := T.ιFermion + boson := T.ιBoson + connection := T.ιConnection fermion_mul_self := ιFermion_mul_self + fermion_mul_swap := ιFermion_mul_swap boson_commute := ιBoson_commute connection_commute := ιConnection_commute boson_commute_connection := ιBoson_commute_ιConnection @@ -730,51 +781,58 @@ noncomputable def canonicalAssignment : universal property as an equivalence of types rather than a linear equivalence, neither side being a module in a way the other respects. -/ noncomputable def liftEquiv (B : Type*) [Ring B] [Algebra ℂ B] : - Assignment Ef Eb EA B ≃ (LocalFieldAlgebra Ef Eb EA →ₐ[ℂ] B) where + T.Assignment B ≃ (T.LocalFieldAlgebra →ₐ[ℂ] B) where toFun d := d.lift - invFun Φ := (canonicalAssignment Ef Eb EA).comp Φ - left_inv d := by - ext v - exacts [d.lift_ιFermion v, d.lift_ιBoson v, d.lift_ιConnection v] + invFun Φ := (canonicalAssignment T).comp Φ + left_inv d := + Assignment.ext (funext fun i => LinearMap.ext fun x => d.lift_ιFermion i x) + (funext fun j => LinearMap.ext fun y => d.lift_ιBoson j y) + (LinearMap.ext fun v => d.lift_ιConnection v) right_inv Φ := - algHom_ext Ef Eb EA - (((canonicalAssignment Ef Eb EA).comp Φ).lift_ιFermion) - (((canonicalAssignment Ef Eb EA).comp Φ).lift_ιBoson) - (((canonicalAssignment Ef Eb EA).comp Φ).lift_ιConnection) + algHom_ext (((canonicalAssignment T).comp Φ).lift_ιFermion) + (((canonicalAssignment T).comp Φ).lift_ιBoson) + (((canonicalAssignment T).comp Φ).lift_ιConnection) + +variable {T} /-! -### D.4. The range of the induced map +### C.4. The range of the induced map -/ -section Range - namespace Assignment -variable {Ef Eb EA} -variable {B : Type*} [Ring B] [Algebra ℂ B] (d : Assignment Ef Eb EA B) +variable {B : Type*} [Ring B] [Algebra ℂ B] (d : T.Assignment B) -/-- The range of the induced map is the complex subalgebra generated by the three - assignment images. No injectivity is claimed or required, since a realization of a field - theory may identify local expressions. -/ +/-- The range of the induced map is the complex subalgebra generated by the images of the + species and of the connection. No injectivity is claimed or required, since a realization + of a field theory may identify local expressions. -/ lemma range_lift : d.lift.range = Algebra.adjoin ℂ - (Set.range d.fermion ∪ Set.range d.boson ∪ Set.range d.connection) := by + ((⋃ i, Set.range (d.fermion i)) ∪ (⋃ j, Set.range (d.boson j)) + ∪ Set.range d.connection) := by refine le_antisymm ?_ (Algebra.adjoin_le ?_) - · refine Algebra.range_le_of_adjoin_eq_top (adjoin_generators_eq_top Ef Eb EA) d.lift ?_ + · refine Algebra.range_le_of_adjoin_eq_top (adjoin_generators_eq_top T) d.lift ?_ rintro _ ((⟨v, rfl⟩ | ⟨v, rfl⟩) | ⟨v, rfl⟩) - · exact d.lift_ιFermion v ▸ Algebra.subset_adjoin (Or.inl (Or.inl ⟨v, rfl⟩)) - · exact d.lift_ιBoson v ▸ Algebra.subset_adjoin (Or.inl (Or.inr ⟨v, rfl⟩)) + · rw [d.lift_ιFermionTotal] + refine DirectSum.mem_of_lof (fun i x => ?_) v + rw [show DirectSum.lof ℂ _ _ i x = T.inclFermion i x from rfl, + d.fermionTotal_inclFermion] + exact Algebra.subset_adjoin (Or.inl (Or.inl (Set.mem_iUnion.mpr ⟨i, x, rfl⟩))) + · rw [d.lift_ιBosonTotal] + refine DirectSum.mem_of_lof (fun j y => ?_) v + rw [show DirectSum.lof ℂ _ _ j y = T.inclBoson j y from rfl, d.bosonTotal_inclBoson] + exact Algebra.subset_adjoin (Or.inl (Or.inr (Set.mem_iUnion.mpr ⟨j, y, rfl⟩))) · exact d.lift_ιConnection v ▸ Algebra.subset_adjoin (Or.inr ⟨v, rfl⟩) - · rintro _ ((⟨v, rfl⟩ | ⟨v, rfl⟩) | ⟨v, rfl⟩) - · exact ⟨ιFermion Ef Eb EA v, d.lift_ιFermion v⟩ - · exact ⟨ιBoson Ef Eb EA v, d.lift_ιBoson v⟩ - · exact ⟨ιConnection Ef Eb EA v, d.lift_ιConnection v⟩ + · rintro y hy + simp only [Set.mem_union, Set.mem_iUnion, Set.mem_range] at hy + obtain ((⟨i, x, rfl⟩ | ⟨j, x, rfl⟩) | ⟨v, rfl⟩) := hy + · exact ⟨T.ιFermion i x, d.lift_ιFermion i x⟩ + · exact ⟨T.ιBoson j x, d.lift_ιBoson j x⟩ + · exact ⟨T.ιConnection v, d.lift_ιConnection v⟩ end Assignment -end Range - -end LocalFieldAlgebra +end GaugeFieldData diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/SpeciesGenerators.lean b/Physlib/ClassicalFieldTheory/JetAlgebra/SpeciesGenerators.lean index b04754ba9..ec5721f4d 100644 --- a/Physlib/ClassicalFieldTheory/JetAlgebra/SpeciesGenerators.lean +++ b/Physlib/ClassicalFieldTheory/JetAlgebra/SpeciesGenerators.lean @@ -6,7 +6,6 @@ Authors: Nathaneal Sajan module public import Physlib.ClassicalFieldTheory.JetAlgebra.JetComponentSpace.Basic -public import Physlib.ClassicalFieldTheory.JetAlgebra.LocalFieldAlgebra public import Mathlib.Algebra.DirectSum.Module /-! # The generator spaces of a family of species @@ -14,10 +13,11 @@ public import Mathlib.Algebra.DirectSum.Module ## i. Overview A field theory carries several species of field, each with its own value space, its own -Lorentz representation and its own mass weight. The local field algebra of -`Physlib.ClassicalFieldTheory.JetAlgebra.LocalFieldAlgebra` takes one complex space of -fermionic generators and one of bosonic generators, so a multi-species theory has to -present its species as a single generator space. +Lorentz representation and its own mass weight. The local field algebra built in +`Physlib.ClassicalFieldTheory.JetAlgebra.LocalFieldAlgebra` is an exterior algebra on one +complex space of fermionic generators tensored with a symmetric algebra on one complex +space of bosonic generators, so a multi-species theory has to present its species as a +single generator space. This file does that with a direct sum of component spaces. For a family `V : ι → Type` of value spaces the total generator space is @@ -34,18 +34,14 @@ assumed finite, and the component spaces are infinite-dimensional in any case, s derivative label ranges over all multisets of directions. Only `DecidableEq ι` is used, and only to have the summand inclusions. -The subtle point is Fermi statistics. `LocalFieldAlgebra.Assignment` asks for -`fermion v * fermion v = 0` on the whole fermionic generator space, and imposing it on -each species separately is strictly weaker. By `DirectSum.mul_self_iff_lof`, square-zero -on the total space is equivalent to square-zero on each species together with -anticommutation between the images of any two species. So a species assignment must carry -the cross-species anticommutation as data, and `SpeciesAssignment.fermion_mul_swap` is -that field. +The subtle point, settled in `Physlib.Mathematics.AlgebraGeneration` rather than here, is +Fermi statistics. A square-zero condition on the total space is strictly stronger than the +same condition on each species: by `DirectSum.mul_self_iff_lof` it is equivalent to +square-zero on each species together with anticommutation between the images of any two +species. The generator space assembled here is what makes that distinction expressible. ## ii. Key results -- `DirectSum.mul_self_iff_lof` : square-zero on a direct sum is square-zero on each - summand plus anticommutation across summands. - `SpeciesComponentSpace` : the total component space of a family of species. - `SpeciesComponentSpace.incl`, `SpeciesComponentSpace.assemble`, `SpeciesComponentSpace.hom_ext`, `SpeciesComponentSpace.existsUnique_linearMap` : the @@ -59,31 +55,15 @@ that field. - `JetComponentSpace.comap_comp_massWeightScale` : the scaling of a single component space is natural in the value space, hence species-blind, which is the reason for the direct sum. -- `SpeciesLocalFieldAlgebra` : the local field algebra of a family of fermionic and a - family of bosonic species. -- `SpeciesLocalFieldAlgebra.ιFermionSpecies_mul_swap` : the generators of two different - fermionic species anticommute. -- `SpeciesAssignment`, `SpeciesAssignment.lift`, - `SpeciesAssignment.existsUnique_algHom` : the universal property in species form. ## iii. Table of contents -- A. Maps out of a direct sum into a ring - - A.1. Commutation - - A.2. Anticommutation and the square-zero condition -- B. The component space of a family of species - - B.1. The species inclusions and the assembly of linear maps - - B.2. Functoriality in the family of value spaces - - B.3. The species-diagonal representation - - B.4. Unequal mass weights - - B.5. Why the weights are recorded per species -- C. The local field algebra of a family of species - - C.1. The species generators - - C.2. Cross-species statistics -- D. Species assignments and the universal property - - D.1. The assembled assignment - - D.2. The induced algebra homomorphism and its computation rules - - D.3. Uniqueness +- A. The component space of a family of species + - A.1. The species inclusions and the assembly of linear maps + - A.2. Functoriality in the family of value spaces + - A.3. The species-diagonal representation + - A.4. Unequal mass weights + - A.5. Why the weights are recorded per species -/ @@ -93,107 +73,7 @@ open TensorProduct DirectSum /-! -## A. Maps out of a direct sum into a ring - -A linear map out of a direct sum is determined by its restrictions to the summands, so a -relation between the images of two such maps which is stable under addition in each -argument need only be checked on the summands. The lemmas below are the instances of that -principle used later, and carry no physics. - --/ - -namespace DirectSum - -section OfLof - -variable {ι κ : Type*} [DecidableEq ι] [DecidableEq κ] - {M : ι → Type*} [∀ i, AddCommGroup (M i)] [∀ i, Module ℂ (M i)] - {N : κ → Type*} [∀ j, AddCommGroup (N j)] [∀ j, Module ℂ (N j)] - {B : Type*} [Ring B] [Algebra ℂ B] - -/-! - -### A.1. Commutation - --/ - -/-- If the image of every summand commutes with a fixed element, so does the whole - image. -/ -lemma commute_of_lof_left {F : (⨁ i, M i) →ₗ[ℂ] B} {b : B} - (h : ∀ i x, Commute (F (lof ℂ ι M i x)) b) (v : ⨁ i, M i) : Commute (F v) b := by - induction v using DirectSum.induction_on with - | zero => rw [map_zero]; exact Commute.zero_left b - | of i x => exact h i x - | add v w hv hw => rw [map_add]; exact hv.add_left hw - -/-- Commutation extends from the summands. If the image of every summand of one direct - sum commutes with the image of every summand of another, then the two images commute - elementwise. -/ -lemma commute_of_lof {F : (⨁ i, M i) →ₗ[ℂ] B} {G : (⨁ j, N j) →ₗ[ℂ] B} - (h : ∀ i j x y, Commute (F (lof ℂ ι M i x)) (G (lof ℂ κ N j y))) - (v : ⨁ i, M i) (w : ⨁ j, N j) : Commute (F v) (G w) := - commute_of_lof_left (fun i x => - (commute_of_lof_left (fun j y => (h i j x y).symm) w).symm) v - -/-! - -### A.2. Anticommutation and the square-zero condition - --/ - -/-- Anticommutation extends from the summands. -/ -lemma mul_swap_of_lof {F : (⨁ i, M i) →ₗ[ℂ] B} - (h : ∀ i j x y, F (lof ℂ ι M i x) * F (lof ℂ ι M j y) - = -(F (lof ℂ ι M j y) * F (lof ℂ ι M i x))) - (v w : ⨁ i, M i) : F v * F w = -(F w * F v) := by - induction v using DirectSum.induction_on with - | zero => simp - | of i x => - induction w using DirectSum.induction_on with - | zero => simp - | of j y => exact h i j x y - | add w₁ w₂ h₁ h₂ => rw [map_add, mul_add, add_mul, h₁, h₂, neg_add] - | add v₁ v₂ h₁ h₂ => rw [map_add, add_mul, mul_add, h₁, h₂, neg_add] - -/-- Square-zero extends from the summands, given anticommutation across them. The - cross terms of `(x + y) * (x + y)` cancel exactly because the two images anticommute; - square-zero on each summand alone would leave them. -/ -lemma mul_self_of_lof {F : (⨁ i, M i) →ₗ[ℂ] B} - (hsq : ∀ i x, F (lof ℂ ι M i x) * F (lof ℂ ι M i x) = 0) - (hswap : ∀ i j x y, F (lof ℂ ι M i x) * F (lof ℂ ι M j y) - = -(F (lof ℂ ι M j y) * F (lof ℂ ι M i x))) - (v : ⨁ i, M i) : F v * F v = 0 := by - have key := mul_swap_of_lof hswap - induction v using DirectSum.induction_on with - | zero => simp - | of i x => exact hsq i x - | add v w hv hw => - have h : F (v + w) * F (v + w) - = F v * F v + (F v * F w + F w * F v) + F w * F w := by - rw [map_add]; noncomm_ring - rw [h, hv, hw, key v w] - abel - -/-- Square-zero on a direct sum is not square-zero summand by summand. It is equivalent to - square-zero on each summand together with anticommutation between the images of any two - summands, the second condition being vacuous only when there is at most one summand. - This is the precise sense in which Fermi statistics for a family of species is more than - the Fermi statistics of the individual species. -/ -lemma mul_self_iff_lof {F : (⨁ i, M i) →ₗ[ℂ] B} : - (∀ v, F v * F v = 0) ↔ - ((∀ i x, F (lof ℂ ι M i x) * F (lof ℂ ι M i x) = 0) ∧ - ∀ i j x y, F (lof ℂ ι M i x) * F (lof ℂ ι M j y) - = -(F (lof ℂ ι M j y) * F (lof ℂ ι M i x))) := - ⟨fun h => ⟨fun _ _ => h _, fun _ _ _ _ => F.mul_swap_of_mul_self h _ _⟩, - fun h v => mul_self_of_lof h.1 h.2 v⟩ - -end OfLof - -end DirectSum - -/-! - -## B. The component space of a family of species +## A. The component space of a family of species -/ @@ -211,7 +91,7 @@ namespace SpeciesComponentSpace /-! -### B.1. The species inclusions and the assembly of linear maps +### A.1. The species inclusions and the assembly of linear maps -/ @@ -251,7 +131,7 @@ lemma existsUnique_linearMap (f : ∀ i, JetComponentSpace (V i) →ₗ[ℂ] N) /-! -### B.2. Functoriality in the family of value spaces +### A.2. Functoriality in the family of value spaces Component functions are covectors on the value space, so the total component space is contravariant in the family of value spaces, exactly as a single one is. The species-wise @@ -290,7 +170,7 @@ lemma comap_comp (U : ι → Type*) [∀ i, AddCommGroup (U i)] [∀ i, Module /-! -### B.3. The species-diagonal representation +### A.3. The species-diagonal representation A symmetry of a field theory acts on each species separately, a Lorentz transformation through that species' Lorentz representation and a gauge jet through that species' jet @@ -330,7 +210,7 @@ lemma rep_incl {H : Type*} [Monoid H] (ρ : ∀ i, Representation ℂ H (JetComp /-! -### B.4. Unequal mass weights +### A.4. Unequal mass weights The mass weight is a property of a species, not of the theory, a fermion carrying weight `3` and a scalar weight `2`. The total component space records one weight per species, @@ -389,7 +269,7 @@ end ComponentSpace /-! -### B.5. Why the weights are recorded per species +### A.5. Why the weights are recorded per species -/ @@ -410,294 +290,3 @@ lemma JetComponentSpace.comap_comp_massWeightScale {V W : Type*} [AddCommGroup V simp only [JetComponentSpace.comap, JetComponentSpace.massWeightScale, LinearMap.comp_smul, LinearMap.smul_comp, LinearMap.prodMap_comp, ← TensorProduct.map_comp, LinearMap.comp_id, LinearMap.id_comp] - -/-! - -## C. The local field algebra of a family of species - --/ - -section SpeciesAlgebra - -variable {ιf ιb : Type*} [DecidableEq ιf] [DecidableEq ιb] - (Vf : ιf → Type*) [∀ i, AddCommGroup (Vf i)] [∀ i, Module ℂ (Vf i)] - (Vb : ιb → Type*) [∀ j, AddCommGroup (Vb j)] [∀ j, Module ℂ (Vb j)] - (EA : Type*) [AddCommGroup EA] [Module ℝ EA] - -/-- The local field algebra of a family of species. Its fermionic generators are the - component functions of a family of fermionic species, its bosonic generators those of a - family of bosonic species, and its connection generator space is left abstract. All the - fermionic species share one exterior algebra, so their generators anticommute across - species and not merely within one. -/ -abbrev SpeciesLocalFieldAlgebra : Type _ := - LocalFieldAlgebra (SpeciesComponentSpace Vf) (SpeciesComponentSpace Vb) EA - -namespace SpeciesLocalFieldAlgebra - -open LocalFieldAlgebra - -/-! - -### C.1. The species generators - --/ - -/-- The fermionic generators contributed by one species. -/ -noncomputable def ιFermionSpecies (i : ιf) : - JetComponentSpace (Vf i) →ₗ[ℂ] SpeciesLocalFieldAlgebra Vf Vb EA := - (ιFermion (SpeciesComponentSpace Vf) (SpeciesComponentSpace Vb) EA).comp - (SpeciesComponentSpace.incl Vf i) - -/-- The bosonic generators contributed by one species. -/ -noncomputable def ιBosonSpecies (j : ιb) : - JetComponentSpace (Vb j) →ₗ[ℂ] SpeciesLocalFieldAlgebra Vf Vb EA := - (ιBoson (SpeciesComponentSpace Vf) (SpeciesComponentSpace Vb) EA).comp - (SpeciesComponentSpace.incl Vb j) - -variable {Vf Vb EA} - -omit [DecidableEq ιb] in -lemma ιFermionSpecies_apply (i : ιf) (x : JetComponentSpace (Vf i)) : - ιFermionSpecies Vf Vb EA i x - = ιFermion (SpeciesComponentSpace Vf) (SpeciesComponentSpace Vb) EA - (SpeciesComponentSpace.incl Vf i x) := rfl - -omit [DecidableEq ιf] in -lemma ιBosonSpecies_apply (j : ιb) (y : JetComponentSpace (Vb j)) : - ιBosonSpecies Vf Vb EA j y - = ιBoson (SpeciesComponentSpace Vf) (SpeciesComponentSpace Vb) EA - (SpeciesComponentSpace.incl Vb j y) := rfl - -/-! - -### C.2. Cross-species statistics - -The five relations of `LocalFieldAlgebra`, read one species at a time. Each is the -corresponding relation of the total generator space evaluated at the images of the species -inclusions, so none is new mathematical content; what they record is that the inclusions -do not disturb the statistics. - --/ - -omit [DecidableEq ιb] in -/-- A fermionic generator squares to zero. -/ -@[simp] -lemma ιFermionSpecies_mul_self (i : ιf) (x : JetComponentSpace (Vf i)) : - ιFermionSpecies Vf Vb EA i x * ιFermionSpecies Vf Vb EA i x = 0 := - ιFermion_mul_self (Ef := SpeciesComponentSpace Vf) (Eb := SpeciesComponentSpace Vb) - (EA := EA) (SpeciesComponentSpace.incl Vf i x) - -omit [DecidableEq ιb] in -/-- Fermionic generators of two different species anticommute. The two species enter - the same exterior algebra through different summands of the total component space, so - this is the ordinary exterior anticommutation, not an extra relation; it is what - separate exterior algebras joined by an ordinary tensor product would lose. -/ -lemma ιFermionSpecies_mul_swap (i j : ιf) (x : JetComponentSpace (Vf i)) - (y : JetComponentSpace (Vf j)) : - ιFermionSpecies Vf Vb EA i x * ιFermionSpecies Vf Vb EA j y - = -(ιFermionSpecies Vf Vb EA j y * ιFermionSpecies Vf Vb EA i x) := - ιFermion_mul_swap (Ef := SpeciesComponentSpace Vf) (Eb := SpeciesComponentSpace Vb) - (EA := EA) (SpeciesComponentSpace.incl Vf i x) (SpeciesComponentSpace.incl Vf j y) - -omit [DecidableEq ιf] in -/-- Bosonic generators commute, across species as well as within one. -/ -lemma ιBosonSpecies_commute (i j : ιb) (x : JetComponentSpace (Vb i)) - (y : JetComponentSpace (Vb j)) : - Commute (ιBosonSpecies Vf Vb EA i x) (ιBosonSpecies Vf Vb EA j y) := - ιBoson_commute (Ef := SpeciesComponentSpace Vf) (Eb := SpeciesComponentSpace Vb) - (EA := EA) (SpeciesComponentSpace.incl Vb i x) (SpeciesComponentSpace.incl Vb j y) - -/-- A bosonic generator commutes with a fermionic one, bosons being even. -/ -lemma ιBosonSpecies_commute_ιFermionSpecies (j : ιb) (i : ιf) - (y : JetComponentSpace (Vb j)) (x : JetComponentSpace (Vf i)) : - Commute (ιBosonSpecies Vf Vb EA j y) (ιFermionSpecies Vf Vb EA i x) := - ιBoson_commute_ιFermion (Ef := SpeciesComponentSpace Vf) (Eb := SpeciesComponentSpace Vb) - (EA := EA) (SpeciesComponentSpace.incl Vb j y) (SpeciesComponentSpace.incl Vf i x) - -omit [DecidableEq ιf] in -/-- A bosonic generator commutes with a connection generator. -/ -lemma ιBosonSpecies_commute_ιConnection (j : ιb) (y : JetComponentSpace (Vb j)) (v : EA) : - Commute (ιBosonSpecies Vf Vb EA j y) - (ιConnection (SpeciesComponentSpace Vf) (SpeciesComponentSpace Vb) EA v) := - ιBoson_commute_ιConnection (Ef := SpeciesComponentSpace Vf) - (Eb := SpeciesComponentSpace Vb) (EA := EA) (SpeciesComponentSpace.incl Vb j y) v - -omit [DecidableEq ιb] in -/-- A connection generator commutes with a fermionic one, the connection being even. -/ -lemma ιConnection_commute_ιFermionSpecies (v : EA) (i : ιf) - (x : JetComponentSpace (Vf i)) : - Commute (ιConnection (SpeciesComponentSpace Vf) (SpeciesComponentSpace Vb) EA v) - (ιFermionSpecies Vf Vb EA i x) := - ιConnection_commute_ιFermion (Ef := SpeciesComponentSpace Vf) - (Eb := SpeciesComponentSpace Vb) (EA := EA) v (SpeciesComponentSpace.incl Vf i x) - -end SpeciesLocalFieldAlgebra - -/-! - -## D. Species assignments and the universal property - --/ - -open SpeciesLocalFieldAlgebra in -/-- A compatible assignment for a family of species in a complex algebra `B`, which is not - assumed commutative. It consists of one linear map per fermionic species, one per - bosonic species, and one real-linear map on the connection generator space, subject to - the relations of section C.2 read species by species. - - `fermion_mul_swap` is not redundant. `LocalFieldAlgebra.Assignment` demands - `fermion v * fermion v = 0` on the whole fermionic generator space, and by - `DirectSum.mul_self_iff_lof` that condition is equivalent to `fermion_mul_self` together - with `fermion_mul_swap`, since species-wise square-zero alone leaves the cross terms of - `(x + y) * (x + y)` for `x` and `y` in different species. -/ -structure SpeciesAssignment (B : Type*) [Ring B] [Algebra ℂ B] where - /-- The images of the generators of each fermionic species. -/ - fermion : ∀ i, JetComponentSpace (Vf i) →ₗ[ℂ] B - /-- The images of the generators of each bosonic species. -/ - boson : ∀ j, JetComponentSpace (Vb j) →ₗ[ℂ] B - /-- The images of the connection generators; only real-linear. -/ - connection : EA →ₗ[ℝ] B - /-- Fermi statistics within a species. -/ - fermion_mul_self : ∀ i x, fermion i x * fermion i x = 0 - /-- Fermi statistics across species, which does not follow from `fermion_mul_self`. -/ - fermion_mul_swap : ∀ i j x y, fermion i x * fermion j y = -(fermion j y * fermion i x) - /-- Bosonic images commute, across species as well as within one. -/ - boson_commute : ∀ i j x y, Commute (boson i x) (boson j y) - /-- Connection images commute pairwise. -/ - connection_commute : ∀ v w, Commute (connection v) (connection w) - /-- Bosonic and connection images commute with each other. -/ - boson_commute_connection : ∀ j y w, Commute (boson j y) (connection w) - /-- Bosonic images commute with fermionic images. -/ - boson_commute_fermion : ∀ j i y x, Commute (boson j y) (fermion i x) - /-- Connection images commute with fermionic images. -/ - connection_commute_fermion : ∀ v i x, Commute (connection v) (fermion i x) - -namespace SpeciesAssignment - -open SpeciesLocalFieldAlgebra - -variable {Vf Vb EA} -variable {B : Type*} [Ring B] [Algebra ℂ B] - -/-! - -### D.1. The assembled assignment - --/ - -/-- Species-wise square-zero is not square-zero. The condition - `LocalFieldAlgebra.Assignment` imposes on the assembled fermionic map is equivalent to - the two fields `fermion_mul_self` and `fermion_mul_swap` of `SpeciesAssignment` - together; the second is vacuous only for a family with at most one species. -/ -lemma assemble_mul_self_iff (f : ∀ i, JetComponentSpace (Vf i) →ₗ[ℂ] B) : - (∀ v, SpeciesComponentSpace.assemble Vf f v * SpeciesComponentSpace.assemble Vf f v = 0) - ↔ ((∀ i x, f i x * f i x = 0) ∧ - ∀ i j x y, f i x * f j y = -(f j y * f i x)) := by - rw [DirectSum.mul_self_iff_lof] - simp - -variable (d : SpeciesAssignment Vf Vb EA B) - -/-- The compatible assignment assembled from a species assignment. Each of the five - relations of `LocalFieldAlgebra.Assignment` is quantified over the whole generator - space; each is obtained from its species-wise form by the extension lemmas of section - A. -/ -def toAssignment : LocalFieldAlgebra.Assignment - (SpeciesComponentSpace Vf) (SpeciesComponentSpace Vb) EA B where - fermion := SpeciesComponentSpace.assemble Vf d.fermion - boson := SpeciesComponentSpace.assemble Vb d.boson - connection := d.connection - fermion_mul_self := - (assemble_mul_self_iff d.fermion).2 ⟨d.fermion_mul_self, d.fermion_mul_swap⟩ - boson_commute := DirectSum.commute_of_lof fun i j x y => by - simpa using d.boson_commute i j x y - connection_commute := d.connection_commute - boson_commute_connection := fun v w => - DirectSum.commute_of_lof_left (fun j y => by - simpa using d.boson_commute_connection j y w) v - boson_commute_fermion := DirectSum.commute_of_lof fun j i y x => by - simpa using d.boson_commute_fermion j i y x - connection_commute_fermion := fun v w => - (DirectSum.commute_of_lof_left (fun i x => by - simpa using (d.connection_commute_fermion v i x).symm) w).symm - -@[simp] -lemma toAssignment_fermion : - d.toAssignment.fermion = SpeciesComponentSpace.assemble Vf d.fermion := rfl - -@[simp] -lemma toAssignment_boson : - d.toAssignment.boson = SpeciesComponentSpace.assemble Vb d.boson := rfl - -@[simp] -lemma toAssignment_connection : d.toAssignment.connection = d.connection := rfl - -/-! - -### D.2. The induced algebra homomorphism and its computation rules - --/ - -/-- The algebra homomorphism induced by a species assignment. -/ -noncomputable def lift : SpeciesLocalFieldAlgebra Vf Vb EA →ₐ[ℂ] B := - d.toAssignment.lift - -@[simp] -lemma lift_ιFermionSpecies (i : ιf) (x : JetComponentSpace (Vf i)) : - d.lift (ιFermionSpecies Vf Vb EA i x) = d.fermion i x := by - rw [lift, ιFermionSpecies_apply, LocalFieldAlgebra.Assignment.lift_ιFermion, - toAssignment_fermion, SpeciesComponentSpace.assemble_incl] - -@[simp] -lemma lift_ιBosonSpecies (j : ιb) (y : JetComponentSpace (Vb j)) : - d.lift (ιBosonSpecies Vf Vb EA j y) = d.boson j y := by - rw [lift, ιBosonSpecies_apply, LocalFieldAlgebra.Assignment.lift_ιBoson, - toAssignment_boson, SpeciesComponentSpace.assemble_incl] - -@[simp] -lemma lift_ιConnection (v : EA) : - d.lift (LocalFieldAlgebra.ιConnection - (SpeciesComponentSpace Vf) (SpeciesComponentSpace Vb) EA v) = d.connection v := - d.toAssignment.lift_ιConnection v - -/-! - -### D.3. Uniqueness - --/ - -/-- Two algebra maps agreeing on every species are equal. -/ -lemma algHom_ext {Φ Ψ : SpeciesLocalFieldAlgebra Vf Vb EA →ₐ[ℂ] B} - (hf : ∀ i x, Φ (ιFermionSpecies Vf Vb EA i x) = Ψ (ιFermionSpecies Vf Vb EA i x)) - (hb : ∀ j y, Φ (ιBosonSpecies Vf Vb EA j y) = Ψ (ιBosonSpecies Vf Vb EA j y)) - (ha : ∀ v, Φ (LocalFieldAlgebra.ιConnection - (SpeciesComponentSpace Vf) (SpeciesComponentSpace Vb) EA v) - = Ψ (LocalFieldAlgebra.ιConnection - (SpeciesComponentSpace Vf) (SpeciesComponentSpace Vb) EA v)) : Φ = Ψ := - LocalFieldAlgebra.algHom_ext _ _ EA - (fun v => LinearMap.congr_fun (SpeciesComponentSpace.hom_ext - (F := Φ.toLinearMap.comp (LocalFieldAlgebra.ιFermion _ _ EA)) - (G := Ψ.toLinearMap.comp (LocalFieldAlgebra.ιFermion _ _ EA)) hf) v) - (fun w => LinearMap.congr_fun (SpeciesComponentSpace.hom_ext - (F := Φ.toLinearMap.comp (LocalFieldAlgebra.ιBoson _ _ EA)) - (G := Ψ.toLinearMap.comp (LocalFieldAlgebra.ιBoson _ _ EA)) hb) w) - ha - -/-- The mapping-out universal property in species form. A compatible species assignment in - an arbitrary associative complex algebra `B` extends to one and only one complex algebra - homomorphism out of the local field algebra of the family. -/ -lemma existsUnique_algHom : - ∃! Φ : SpeciesLocalFieldAlgebra Vf Vb EA →ₐ[ℂ] B, - (∀ i x, Φ (ιFermionSpecies Vf Vb EA i x) = d.fermion i x) ∧ - (∀ j y, Φ (ιBosonSpecies Vf Vb EA j y) = d.boson j y) ∧ - (∀ v, Φ (LocalFieldAlgebra.ιConnection - (SpeciesComponentSpace Vf) (SpeciesComponentSpace Vb) EA v) = d.connection v) := - ⟨d.lift, ⟨d.lift_ιFermionSpecies, d.lift_ιBosonSpecies, d.lift_ιConnection⟩, fun _ hΦ => - algHom_ext (fun i x => (hΦ.1 i x).trans (d.lift_ιFermionSpecies i x).symm) - (fun j y => (hΦ.2.1 j y).trans (d.lift_ιBosonSpecies j y).symm) - (fun v => (hΦ.2.2 v).trans (d.lift_ιConnection v).symm)⟩ - -end SpeciesAssignment - -end SpeciesAlgebra - diff --git a/Physlib/Mathematics/AlgebraGeneration.lean b/Physlib/Mathematics/AlgebraGeneration.lean new file mode 100644 index 000000000..742151a34 --- /dev/null +++ b/Physlib/Mathematics/AlgebraGeneration.lean @@ -0,0 +1,325 @@ +/- +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 Mathlib.Algebra.DirectSum.Module +public import Mathlib.RingTheory.Adjoin.Basic +public import Mathlib.RingTheory.TensorProduct.Basic +public import Mathlib.Tactic.NoncommRing +/-! +# Relations checked on generators + +## i. Overview + +A relation between elements of an algebra which is stable under the algebra operations +need only be checked on a generating family. This file collects the instances of that +principle needed to present a large algebra by generators and relations without assuming +the target commutative, where the usual lifts through commutative algebras are +unavailable. + +There are four groups of results. The first says what a generating set of an algebra gives +about a map out of it, namely that its range, and its commutation with a fixed element, +are already determined on the generators. The second generates a tensor product, both from +its two factors and along an extension of scalars. The third is polarization, by which a +linear map into a ring whose every value squares to zero has pairwise anticommuting +values. The fourth is the same principle for a direct sum, whose summands play the role of +the generators. + +Nothing here has physics content, and nothing is assumed finite. + +## ii. Key results + +- `Algebra.range_le_of_adjoin_eq_top`, `Algebra.commute_of_adjoin_eq_top` : the range of an + algebra map, and its commutation with an element, are determined on a generating set. +- `Algebra.TensorProduct.eq_top_of_tmul_one_of_one_tmul` : a tensor product is generated by + its two factors. +- `Algebra.TensorProduct.adjoin_one_tmul_eq_top` : extension of scalars preserves + generation. +- `LinearMap.mul_swap_of_mul_self` : polarization. +- `DirectSum.mem_of_lof` : a subalgebra containing the image of every summand contains the + whole image. +- `DirectSum.mul_self_iff_lof` : square-zero on a direct sum is square-zero on each + summand plus anticommutation across summands. + +## iii. Table of contents + +- A. Algebras generated by a set +- B. Generating a tensor product + - B.1. Generation by the two factors + - B.2. Generation after an extension of scalars +- C. Polarization +- D. Maps out of a direct sum into a ring + - D.1. Membership and commutation + - D.2. Anticommutation and the square-zero condition + +-/ + +@[expose] public section + +open TensorProduct + +namespace Algebra + +/-! + +## A. Algebras generated by a set + +-/ + +section Generation + +variable {R A B : Type*} [CommSemiring R] [Semiring A] [Algebra R A] [Semiring B] + [Algebra R B] + +/-- If `s` generates `A` and a subalgebra `S` of `B` contains the image of `s`, then it + contains the whole range of an algebra map `A →ₐ[R] B`. -/ +lemma range_le_of_adjoin_eq_top {s : Set A} (hs : Algebra.adjoin R s = ⊤) (φ : A →ₐ[R] B) + {S : Subalgebra R B} (h : ∀ x ∈ s, φ x ∈ S) : φ.range ≤ S := by + rw [← Algebra.map_top, ← hs, AlgHom.map_adjoin] + exact Algebra.adjoin_le (Set.image_subset_iff.mpr h) + +/-- If `s` generates `A` and `y` commutes with the image of `s` under an algebra map, then + `y` commutes with the whole image. This is what extends a commutation relation from + generators to a factor of a tensor product. -/ +lemma commute_of_adjoin_eq_top {s : Set A} (hs : Algebra.adjoin R s = ⊤) (φ : A →ₐ[R] B) + {y : B} (h : ∀ x ∈ s, Commute (φ x) y) (a : A) : Commute (φ a) y := by + have ha : a ∈ Algebra.adjoin R s := hs ▸ Algebra.mem_top + induction ha using Algebra.adjoin_induction with + | mem x hx => exact h x hx + | algebraMap r => rw [AlgHom.commutes]; exact Algebra.commute_algebraMap_left r y + | add u v _ _ hu hv => rw [map_add]; exact hu.add_left hv + | mul u v _ _ hu hv => rw [map_mul]; exact hu.mul_left hv + +end Generation + +namespace TensorProduct + +/-! + +## B. Generating a tensor product + +### B.1. Generation by the two factors + +-/ + +section Factors + +variable {R A B : Type*} [CommSemiring R] [Semiring A] [Algebra R A] [Semiring B] + [Algebra R B] + +/-- A subalgebra of `A ⊗[R] B` containing every `a ⊗ₜ 1` and every `1 ⊗ₜ b` contains + everything, since a pure tensor is the product of the two. -/ +lemma mem_of_tmul_one_of_one_tmul {S : Subalgebra R (A ⊗[R] B)} + (hA : ∀ a : A, a ⊗ₜ[R] (1 : B) ∈ S) (hB : ∀ b : B, (1 : A) ⊗ₜ[R] b ∈ S) + (x : A ⊗[R] B) : x ∈ S := by + induction x using _root_.TensorProduct.induction_on with + | zero => exact zero_mem _ + | add u v hu hv => exact add_mem hu hv + | tmul a b => + have h : a ⊗ₜ[R] b = (a ⊗ₜ[R] (1 : B)) * ((1 : A) ⊗ₜ[R] b) := by + rw [Algebra.TensorProduct.tmul_mul_tmul, mul_one, one_mul] + exact h ▸ mul_mem (hA a) (hB b) + +/-- A subalgebra of `A ⊗[R] B` containing every `a ⊗ₜ 1` and every `1 ⊗ₜ b` is the whole + algebra. -/ +lemma eq_top_of_tmul_one_of_one_tmul {S : Subalgebra R (A ⊗[R] B)} + (hA : ∀ a : A, a ⊗ₜ[R] (1 : B) ∈ S) (hB : ∀ b : B, (1 : A) ⊗ₜ[R] b ∈ S) : S = ⊤ := + _root_.Algebra.eq_top_iff.mpr fun x => mem_of_tmul_one_of_one_tmul hA hB x + +end Factors + +/-! + +### B.2. Generation after an extension of scalars + +-/ + +section BaseChange + +variable {R A : Type*} [CommSemiring R] [Semiring A] [Algebra R A] +variable (S : Type*) [CommSemiring S] [Algebra R S] (s : Set A) + +/-- Extension of scalars on the elements `1 ⊗ₜ a`. If `s` generates `A` over `R` then + every `1 ⊗ₜ a` lies in the `S`-subalgebra of `S ⊗[R] A` generated by `1 ⊗ₜ s`. -/ +lemma mem_adjoin_one_tmul (hs : Algebra.adjoin R s = ⊤) (a : A) : + (1 : S) ⊗ₜ[R] a ∈ Algebra.adjoin S ((fun a : A => (1 : S) ⊗ₜ[R] a) '' s) := by + have ha : a ∈ Algebra.adjoin R s := hs ▸ Algebra.mem_top + induction ha using Algebra.adjoin_induction with + | mem x hx => exact Algebra.subset_adjoin ⟨x, hx, rfl⟩ + | algebraMap r => + have h : (1 : S) ⊗ₜ[R] (algebraMap R A r) + = algebraMap S (S ⊗[R] A) (algebraMap R S r) := by + simp [Algebra.algebraMap_eq_smul_one, _root_.TensorProduct.tmul_smul, + _root_.TensorProduct.smul_tmul', Algebra.TensorProduct.one_def] + rw [h] + exact Subalgebra.algebraMap_mem _ _ + | add x y _ _ hx hy => rw [_root_.TensorProduct.tmul_add]; exact add_mem hx hy + | mul x y _ _ hx hy => + have h : (1 : S) ⊗ₜ[R] (x * y) = ((1 : S) ⊗ₜ[R] x) * ((1 : S) ⊗ₜ[R] y) := by + rw [Algebra.TensorProduct.tmul_mul_tmul, one_mul] + rw [h] + exact mul_mem hx hy + +/-- Every element of a base change lies in the subalgebra generated by the `1 ⊗ₜ s`. -/ +lemma mem_adjoin_one_tmul_of_generates (hs : Algebra.adjoin R s = ⊤) (x : S ⊗[R] A) : + x ∈ Algebra.adjoin S ((fun a : A => (1 : S) ⊗ₜ[R] a) '' s) := by + induction x using _root_.TensorProduct.induction_on with + | zero => exact zero_mem _ + | add u v hu hv => exact add_mem hu hv + | tmul z a => + have h : z ⊗ₜ[R] a = z • ((1 : S) ⊗ₜ[R] a) := by + rw [_root_.TensorProduct.smul_tmul', smul_eq_mul, mul_one] + exact h ▸ Subalgebra.smul_mem _ (mem_adjoin_one_tmul S s hs a) z + +/-- Extension of scalars preserves generation. If `s` generates `A` over `R` then the + elements `1 ⊗ₜ a`, for `a ∈ s`, generate `S ⊗[R] A` over `S`. -/ +lemma adjoin_one_tmul_eq_top (hs : Algebra.adjoin R s = ⊤) : + Algebra.adjoin S ((fun a : A => (1 : S) ⊗ₜ[R] a) '' s) + = (⊤ : Subalgebra S (S ⊗[R] A)) := + _root_.Algebra.eq_top_iff.mpr fun x => mem_adjoin_one_tmul_of_generates S s hs x + +end BaseChange + +end TensorProduct + +end Algebra + +/-! + +## C. Polarization + +-/ + +/-- Polarization. If every value of a linear map into a ring squares to zero, then any two + values anticommute. Applied to a space of fermionic generators, this is what makes the + single relation "every vector squares to zero" carry the anticommutation of distinct + generators, including generators of different species, which sit in the same space. -/ +lemma LinearMap.mul_swap_of_mul_self {R M B : Type*} [CommSemiring R] [AddCommMonoid M] + [Module R M] [Ring B] [Algebra R B] (f : M →ₗ[R] B) (h : ∀ v, f v * f v = 0) (v w : M) : + f v * f w = -(f w * f v) := by + have hvw := h (v + w) + rw [map_add, add_mul, mul_add, mul_add, h v, h w, zero_add, add_zero] at hvw + exact eq_neg_of_add_eq_zero_left hvw + +/-! + +## D. Maps out of a direct sum into a ring + +A linear map out of a direct sum is determined by its restrictions to the summands, so a +relation between the images of two such maps which is stable under addition in each +argument need only be checked on the summands. The lemmas below are the instances of that +principle used when the generators of an algebra are grouped into summands. + +-/ + +namespace DirectSum + +section OfLof + +variable {R ι κ : Type*} [CommSemiring R] [DecidableEq ι] [DecidableEq κ] + {M : ι → Type*} [∀ i, AddCommMonoid (M i)] [∀ i, Module R (M i)] + {N : κ → Type*} [∀ j, AddCommMonoid (N j)] [∀ j, Module R (N j)] + +/-! + +### D.1. Membership and commutation + +-/ + +section Semiring + +variable {B : Type*} [Semiring B] [Algebra R B] + +/-- If a subalgebra contains the image of every summand, it contains the whole image. -/ +lemma mem_of_lof {S : Subalgebra R B} {F : (⨁ i, M i) →ₗ[R] B} + (h : ∀ i x, F (lof R ι M i x) ∈ S) (v : ⨁ i, M i) : F v ∈ S := by + induction v using DirectSum.induction_on with + | zero => rw [map_zero]; exact zero_mem S + | of i x => rw [← lof_eq_of R]; exact h i x + | add v w hv hw => rw [map_add]; exact add_mem hv hw + +/-- If the image of every summand commutes with a fixed element, so does the whole + image. -/ +lemma commute_of_lof_left {F : (⨁ i, M i) →ₗ[R] B} {b : B} + (h : ∀ i x, Commute (F (lof R ι M i x)) b) (v : ⨁ i, M i) : Commute (F v) b := by + induction v using DirectSum.induction_on with + | zero => rw [map_zero]; exact Commute.zero_left b + | of i x => rw [← lof_eq_of R]; exact h i x + | add v w hv hw => rw [map_add]; exact hv.add_left hw + +/-- Commutation extends from the summands. If the image of every summand of one direct + sum commutes with the image of every summand of another, then the two images commute + elementwise. -/ +lemma commute_of_lof {F : (⨁ i, M i) →ₗ[R] B} {G : (⨁ j, N j) →ₗ[R] B} + (h : ∀ i j x y, Commute (F (lof R ι M i x)) (G (lof R κ N j y))) + (v : ⨁ i, M i) (w : ⨁ j, N j) : Commute (F v) (G w) := + commute_of_lof_left (fun i x => + (commute_of_lof_left (fun j y => (h i j x y).symm) w).symm) v + +end Semiring + +/-! + +### D.2. Anticommutation and the square-zero condition + +-/ + +section Ring + +variable {B : Type*} [Ring B] [Algebra R B] + +/-- Anticommutation extends from the summands. -/ +lemma mul_swap_of_lof {F : (⨁ i, M i) →ₗ[R] B} + (h : ∀ i j x y, F (lof R ι M i x) * F (lof R ι M j y) + = -(F (lof R ι M j y) * F (lof R ι M i x))) + (v w : ⨁ i, M i) : F v * F w = -(F w * F v) := by + induction v using DirectSum.induction_on with + | zero => simp + | of i x => + rw [← lof_eq_of R] + induction w using DirectSum.induction_on with + | zero => simp + | of j y => rw [← lof_eq_of R]; exact h i j x y + | add w₁ w₂ h₁ h₂ => rw [map_add, mul_add, add_mul, h₁, h₂, neg_add] + | add v₁ v₂ h₁ h₂ => rw [map_add, add_mul, mul_add, h₁, h₂, neg_add] + +/-- Square-zero extends from the summands, given anticommutation across them. The + cross terms of `(x + y) * (x + y)` cancel exactly because the two images anticommute; + square-zero on each summand alone would leave them. -/ +lemma mul_self_of_lof {F : (⨁ i, M i) →ₗ[R] B} + (hsq : ∀ i x, F (lof R ι M i x) * F (lof R ι M i x) = 0) + (hswap : ∀ i j x y, F (lof R ι M i x) * F (lof R ι M j y) + = -(F (lof R ι M j y) * F (lof R ι M i x))) + (v : ⨁ i, M i) : F v * F v = 0 := by + have key := mul_swap_of_lof hswap + induction v using DirectSum.induction_on with + | zero => simp + | of i x => rw [← lof_eq_of R]; exact hsq i x + | add v w hv hw => + have h : F (v + w) * F (v + w) + = F v * F v + (F v * F w + F w * F v) + F w * F w := by + rw [map_add]; noncomm_ring + rw [h, hv, hw, key v w] + abel + +/-- Square-zero on a direct sum is not square-zero summand by summand. It is equivalent to + square-zero on each summand together with anticommutation between the images of any two + summands, the second condition being vacuous only when there is at most one summand. + This is the precise sense in which Fermi statistics for a family of species is more than + the Fermi statistics of the individual species. -/ +lemma mul_self_iff_lof {F : (⨁ i, M i) →ₗ[R] B} : + (∀ v, F v * F v = 0) ↔ + ((∀ i x, F (lof R ι M i x) * F (lof R ι M i x) = 0) ∧ + ∀ i j x y, F (lof R ι M i x) * F (lof R ι M j y) + = -(F (lof R ι M j y) * F (lof R ι M i x))) := + ⟨fun h => ⟨fun _ _ => h _, fun _ _ _ _ => F.mul_swap_of_mul_self h _ _⟩, + fun h v => mul_self_of_lof h.1 h.2 v⟩ + +end Ring + +end OfLof + +end DirectSum diff --git a/Physlib/Mathematics/SymmetricAlgebra.lean b/Physlib/Mathematics/SymmetricAlgebra.lean index 0220e807f..1953e6871 100644 --- a/Physlib/Mathematics/SymmetricAlgebra.lean +++ b/Physlib/Mathematics/SymmetricAlgebra.lean @@ -84,7 +84,14 @@ lemma congr_apply_ι (e : M ≃ₗ[R] N) (x : M) : congr e (ι R M x) = ι R N ( -/ -/-- The symmetric algebra is generated, as an `R`-algebra, by the degree-one elements. -/ +section Generation + +variable {R M : Type*} [CommSemiring R] [AddCommMonoid M] [Module R M] + +/-- The symmetric algebra is generated, as an `R`-algebra, by the degree-one elements. + Only a commutative semiring of scalars and a module are needed, so that the statement + applies to a module whose additive structure is not presented as a group, such as a + direct sum. -/ @[simp] lemma adjoin_range_ι : Algebra.adjoin R (Set.range (ι R M)) = (⊤ : Subalgebra R (SymmetricAlgebra R M)) := by @@ -97,6 +104,8 @@ lemma adjoin_range_ι : | add a b ha hb => exact add_mem ha hb exact top_le_iff.mp fun x _ => h x +end Generation + /-! ## C. The symmetric algebra of a direct sum diff --git a/Physlib/Particles/StandardModel/FieldData.lean b/Physlib/Particles/StandardModel/FieldData.lean index e8a358b78..be1843ad9 100644 --- a/Physlib/Particles/StandardModel/FieldData.lean +++ b/Physlib/Particles/StandardModel/FieldData.lean @@ -6,6 +6,7 @@ Authors: Nathaneal Sajan module public import Physlib.ClassicalFieldTheory.JetAlgebra.GaugeFieldData +public import Physlib.ClassicalFieldTheory.JetAlgebra.LocalFieldAlgebra public import Physlib.Particles.StandardModel.Fermions.MatterField public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData public import Physlib.Particles.StandardModel.HiggsBoson.MatterField @@ -30,7 +31,7 @@ multiplet. The gauge bosons are not a species: their generator space is fixed by algebra alone, and `GaugeFieldData` supplies it as the connection sector. From the datum the generic theory produces the generator spaces, the local field algebra -`fieldData.LocalAlgebra`, the transformation data and the realization arrow, with no +`fieldData.LocalFieldAlgebra`, the transformation data and the realization arrow, with no further Standard Model input. ## ii. Key results From 5b437647f3ff5ca59118bf8e2053903b8342f3bf Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 8 Sep 2026 15:14:36 +0100 Subject: [PATCH 297/367] feat: Move around Maurer-Cartan proof --- .../LocalGaugeData/MaurerCartan.lean | 48 +++++++++++++++++++ .../GaugeGroup/MaurerCartan/Truncation.lean | 41 ++++------------ 2 files changed, 58 insertions(+), 31 deletions(-) diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/MaurerCartan.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/MaurerCartan.lean index 64d022920..83d39eed7 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/MaurerCartan.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/MaurerCartan.lean @@ -41,6 +41,8 @@ data of `ω` is determined by the base-point symmetrized data. defect is an average of brackets in fewer directions. - `LocalGaugeData.evalLie_iteratedDeriv_maurerCartan_eq_of_symmetrized_eq` : the base-point symmetrized data determines the base-point Taylor data of `ω`. +- `LocalGaugeData.evalLie_iteratedDeriv_maurerCartan_eq_zero_of_symmetrized_eq_zero` : the + base-point half of Maurer–Cartan triangularity. ## iii. Table of contents @@ -189,6 +191,52 @@ lemma iteratedDeriv_maurerCartan_eq_symmetrized_add (U : G) push_cast match_scalars <;> field_simp <;> ring +/-- **Maurer–Cartan triangularity, base-point half**: if the base-point symmetrized + Maurer–Cartan data of `U` vanish in every nonempty multiset of at most `n` directions, + then so do all its base-point Maurer–Cartan Taylor coefficients below order `n`. The + induction is on the order: the symmetrization defect + `iteratedDeriv_maurerCartan_eq_symmetrized_add` expresses `∂_s ω_μ` through the + symmetrized form, which vanishes by hypothesis, and brackets of `ω`s differentiated + strictly fewer times, which vanish by the inductive hypothesis through + `evalLie_iteratedDeriv_bracket_congr`. -/ +lemma evalLie_iteratedDeriv_maurerCartan_eq_zero_of_symmetrized_eq_zero (U : G) {n : ℕ} + (h : ∀ r : Multiset (Fin 1 ⊕ Fin 3), r ≠ 0 → r.card ≤ n → + jets.evalLie (jets.symmetrizedMaurerCartanForm U r) = 0) + (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (hs : s.card < n) : + jets.evalLie (jets.iteratedDeriv s (jets.maurerCartan U μ)) = 0 := by + have hall : ∀ (k : ℕ) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), s.card = k → + k < n → jets.evalLie (jets.iteratedDeriv s (jets.maurerCartan U μ)) = 0 := by + intro k + induction k using Nat.strong_induction_on with + | _ k ih => + intro s μ hs hk + rw [iteratedDeriv_maurerCartan_eq_symmetrized_add jets U s μ, map_add, map_smul] + have h1 : jets.evalLie (jets.symmetrizedMaurerCartanForm U (μ ::ₘ s)) = 0 := by + refine h (μ ::ₘ s) Multiset.cons_ne_zero ?_ + rw [Multiset.card_cons, hs] + omega + have h2 : jets.evalLie ((s.map fun ν => jets.iteratedDeriv (s.erase ν) + ⁅jets.maurerCartan U μ, jets.maurerCartan U ν⁆).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 ν → + jets.evalLie (jets.iteratedDeriv p (jets.maurerCartan U ρ)) = + jets.evalLie (jets.iteratedDeriv p (0 : 𝔤J)) := 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 [jets.evalLie_iteratedDeriv_bracket_congr (s.erase ν) _ _ 0 0 + (hzero μ) (hzero ν)] + simp + rw [h1, h2] + simp + exact hall s.card s μ rfl hs + /-- **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 4a0180111..2f2ad6b4e 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Truncation.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Truncation.lean @@ -425,38 +425,17 @@ lemma mem_truncationKer_of_symmetrizedMaurerCartanCoeff_eq_zero 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. + -- Step 1: the base-point Maurer–Cartan Taylor data vanish below order `n`. This is + -- the generic `LocalGaugeData.evalLie_iteratedDeriv_maurerCartan_eq_zero_of_symmetrized_eq_zero`, + -- which follows from the symmetrization defect formula alone. 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 (localGaugeData.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 + s.card = k → k < n → eval (iteratedDeriv s (maurerCartanForm U.1 μ)) = 0 := + fun _ s μ hk hkn => + localGaugeData.evalLie_iteratedDeriv_maurerCartan_eq_zero_of_symmetrized_eq_zero U.1 + (fun r hr hrn => by + have hcoeff := h r hr hrn + rw [symmetrizedMaurerCartanCoeff_apply] at hcoeff + exact hcoeff) s μ (hk ▸ hkn) -- 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), From 8cfd3d3fb461a4537034bdaccfb4b13d0503eaba Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 8 Sep 2026 18:19:55 +0100 Subject: [PATCH 298/367] refactor: derive the LocalGaugeData theory generally and upstream the Standard Model copies MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit LocalGaugeData gains the base-point laws `evalLie_ofConstantLie` and `evalLie_adjoint` (`maurerCartan_one` becomes a lemma); the Taylor–Leibniz rule `LocalGaugeData.evalLie_iteratedDeriv_adjoint` and the truncation filtration `LocalGaugeData.truncationKer` (with `truncationKer_normal`, `truncationProjZero`, `symmetrizedMaurerCartanCoeff`) are now theorems and definitions in the general layer, replacing the classes `LocalGaugeDataLeibniz` and `LocalGaugeDataTruncation`. The adjoint Taylor coefficients move to `LocalGaugeData/AdjointCoeff.lean` as `adjointCoeff` and `adjointDualCoeff`. The mixins `LocalGaugeData.Faithful` and `LocalGaugeData.Free` record Taylor determinacy and freeness of the symmetrized Maurer–Cartan data; the classification of gauge invariants is generalized to `GaugeField/Symmetrized.lean` and `GaugeJetAlgebra.invariant_mem_adjoin_fieldStrength`, and the matter-symbol transformation law to `JetComponentSpace/TransformsIn.lean`. The Standard Model supplies `localGaugeData` with `Faithful` and `Free` instances (`JetGaugeAlgebra.eval_adjointMap`, `symmetrizedMaurerCartanCoeff_surjective`), the comparison `JetGaugeGroupI.truncation_eq_one_of_mem_truncationKer`, and the component lemmas `localGaugeData_adjointCoeff_toSU3Matrix` and companions. Its copies of the gauge-boson jet algebra, the algebra-valued gauge field theory, and the jet component space are deleted, and all Standard Model files use the general definitions at `GaugeAlgebra` and `localGaugeData`. Co-Authored-By: Claude Fable 5.1 --- Physlib.lean | 18 +- .../GaugeTheory/GaugeBoson/Basic.lean | 5 +- .../GaugeTheory/GaugeBoson/GaugeAction.lean | 91 +- .../GaugeTheory/GaugeBoson/IsGaugeField.lean | 38 +- .../GaugeTheory/GaugeField/Basic.lean | 309 +--- .../GaugeTheory/GaugeField/FieldStrength.lean | 29 +- .../GaugeTheory/GaugeField/Symmetrized.lean} | 460 +++--- .../GaugeField/TransformsInAdjoint.lean | 66 +- .../LocalGaugeData/AdjointCoeff.lean | 322 +++++ .../GaugeTheory/LocalGaugeData/Basic.lean | 183 ++- .../LocalGaugeData/InfinitesimalAction.lean | 38 +- .../LocalGaugeData/MaurerCartan.lean | 56 +- .../LocalGaugeData/TransformsIn.lean | 20 +- .../LocalGaugeData/Truncation.lean | 398 ++++++ .../GaugeTheory/Matter/CovariantDeriv.lean | 55 - .../JetAlgebra/GaugeFieldData.lean | 8 +- .../JetComponentSpace/TransformsIn.lean | 38 +- .../JetAlgebra/LocalFieldAlgebra.lean | 2 +- Physlib/Mathematics/MultisetAntidiagonal.lean | 32 +- .../AlgebraRealization/Basic.lean | 45 +- .../CovFieldAlgebra/Basic.lean | 2 +- .../AlgebraRealization/CovStandardModel.lean | 31 +- .../AlgebraRealization/CovariantDeriv.lean | 151 +- .../CovAlgebraRealization/Basic.lean | 2 + .../Fermions/DownSinglet/Basic.lean | 6 +- .../DownSinglet/GaugeAlgebraAction.lean | 38 +- .../Fermions/JetAlgebra/Species.lean | 3 +- .../Fermions/LeptonDoublet/Basic.lean | 3 +- .../LeptonDoublet/GaugeAlgebraAction.lean | 38 +- .../LeptonSinglet/GaugeAlgebraAction.lean | 20 +- .../Fermions/QuarkDoublet/Basic.lean | 3 +- .../QuarkDoublet/GaugeAlgebraAction.lean | 38 +- .../Fermions/UpSinglet/Basic.lean | 3 +- .../UpSinglet/GaugeAlgebraAction.lean | 38 +- .../GaugeAlgebra/JetGaugeAlgebra.lean | 110 +- .../GaugeBosons/AlgebraValued/Basic.lean | 1251 ----------------- .../AlgebraValued/FieldStrength.lean | 203 --- .../AlgebraValued/TransformsInAdjoint.lean | 261 ---- .../GaugeBosons/GaugeJetAlgebra/Basic.lean | 257 ---- .../GaugeJetAlgebra/GaugeAction.lean | 913 ------------ .../GaugeJetAlgebra/Invariants.lean | 148 -- .../GaugeBosons/GaugeJetAlgebra/JetDeriv.lean | 370 ----- .../GaugeJetAlgebra/LorentzAction.lean | 307 ---- .../GaugeJetAlgebra/MassWeightPoly.lean | 103 +- .../GaugeGroup/JetGaugeGroup/Basic.lean | 35 +- .../GaugeGroup/JetGaugeGroup/Truncation.lean | 443 +++--- .../GaugeGroup/LocalGaugeData.lean | 275 +--- .../GaugeGroup/MaurerCartan/Freeness.lean | 393 ++++++ .../GaugeGroup/MaurerCartan/Truncation.lean | 619 -------- .../HiggsBoson/GaugeAlgebraAction.lean | 38 +- .../StandardModel/JetAlgebra/Basic.lean | 18 +- .../JetAlgebra/FieldAlgebra.lean | 46 +- .../StandardModel/JetAlgebra/GaugeAction.lean | 15 +- .../StandardModel/JetAlgebra/Generators.lean | 4 +- .../StandardModel/JetAlgebra/Invariants.lean | 31 +- .../StandardModel/JetAlgebra/JetDeriv.lean | 49 +- .../JetAlgebra/LorentzAction.lean | 18 +- .../JetAlgebra/MassWeightPoly.lean | 14 +- .../JetAlgebra/TransformsIn.lean | 64 +- .../Matter/BosonicAlgebra/Basic.lean | 3 +- .../Matter/BosonicAlgebra/GaugeAction.lean | 23 +- .../Matter/BosonicAlgebra/TransformsIn.lean | 42 +- .../Matter/FermionicAlgebra/Basic.lean | 3 +- .../Matter/FermionicAlgebra/GaugeAction.lean | 23 +- .../Matter/FermionicAlgebra/Prod.lean | 3 +- .../Matter/FermionicAlgebra/TransformsIn.lean | 42 +- .../Matter/JetComponentSpace/Basic.lean | 869 ------------ .../JetComponentSpace/CovariantDeriv.lean | 755 ---------- Physlib/Relativity/JetRing/Matrix.lean | 33 + 69 files changed, 2684 insertions(+), 7686 deletions(-) rename Physlib/{Particles/StandardModel/GaugeBosons/AlgebraValued/Symmeterized.lean => ClassicalFieldTheory/GaugeTheory/GaugeField/Symmetrized.lean} (82%) create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/AdjointCoeff.lean create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Truncation.lean rename Physlib/{Particles/StandardModel/Matter => ClassicalFieldTheory/JetAlgebra}/JetComponentSpace/TransformsIn.lean (87%) delete mode 100644 Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Basic.lean delete mode 100644 Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/FieldStrength.lean delete mode 100644 Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/TransformsInAdjoint.lean delete mode 100644 Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/Basic.lean delete mode 100644 Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/GaugeAction.lean delete mode 100644 Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/Invariants.lean delete mode 100644 Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/JetDeriv.lean delete mode 100644 Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/LorentzAction.lean create mode 100644 Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Freeness.lean delete mode 100644 Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Truncation.lean delete mode 100644 Physlib/Particles/StandardModel/Matter/JetComponentSpace/Basic.lean delete mode 100644 Physlib/Particles/StandardModel/Matter/JetComponentSpace/CovariantDeriv.lean diff --git a/Physlib.lean b/Physlib.lean index 41ed3da3b..3490037c5 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -8,11 +8,14 @@ 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.Symmetrized public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeField.TransformsInAdjoint +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.AdjointCoeff public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.MaurerCartan public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.TransformsIn +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Truncation public import Physlib.ClassicalFieldTheory.GaugeTheory.Matter.Charge public import Physlib.ClassicalFieldTheory.GaugeTheory.Matter.CovariantDeriv public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.Basic @@ -30,6 +33,7 @@ public import Physlib.ClassicalFieldTheory.JetAlgebra.GaugeFieldData public import Physlib.ClassicalFieldTheory.JetAlgebra.Jet public import Physlib.ClassicalFieldTheory.JetAlgebra.JetComponentSpace.Basic public import Physlib.ClassicalFieldTheory.JetAlgebra.JetComponentSpace.GaugeAction +public import Physlib.ClassicalFieldTheory.JetAlgebra.JetComponentSpace.TransformsIn public import Physlib.ClassicalFieldTheory.JetAlgebra.LocalFieldAlgebra public import Physlib.ClassicalFieldTheory.JetAlgebra.SpeciesGenerators public import Physlib.ClassicalFieldTheory.Local.Variation @@ -317,15 +321,6 @@ public import Physlib.Particles.StandardModel.GaugeAlgebra.Basic public import Physlib.Particles.StandardModel.GaugeAlgebra.Basis public import Physlib.Particles.StandardModel.GaugeAlgebra.JetGaugeAlgebra public import Physlib.Particles.StandardModel.GaugeAlgebra.RootDecomposition -public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.Basic -public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.FieldStrength -public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.Symmeterized -public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.TransformsInAdjoint -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.MassWeightPoly public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.Basic @@ -343,7 +338,7 @@ public import Physlib.Particles.StandardModel.GaugeGroup.JetGaugeGroup.Basic public import Physlib.Particles.StandardModel.GaugeGroup.JetGaugeGroup.Truncation public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData public import Physlib.Particles.StandardModel.GaugeGroup.MaurerCartan.Basic -public import Physlib.Particles.StandardModel.GaugeGroup.MaurerCartan.Truncation +public import Physlib.Particles.StandardModel.GaugeGroup.MaurerCartan.Freeness public import Physlib.Particles.StandardModel.GaugeGroup.SU2PermDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.SU3PermDecomposition public import Physlib.Particles.StandardModel.HiggsBoson.Basic @@ -399,9 +394,6 @@ public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.MassDim public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.MassWeightPoly public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.Prod public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.TransformsIn -public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.Basic -public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.CovariantDeriv -public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.TransformsIn public import Physlib.Particles.StandardModel.Peeling public import Physlib.Particles.StandardModel.Representations public import Physlib.Particles.SuperSymmetry.MSSMNu.AnomalyCancellation.B3 diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Basic.lean index b6878a4ee..5b0ddbf2d 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Basic.lean @@ -23,7 +23,7 @@ built here in the same way as the `BBoson` jet algebra, but non-abelian and **wi 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`. +`StandardModel.GaugeAlgebra`. 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 @@ -37,7 +37,8 @@ Following the split promised for this directory, the structure is: - `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.repValue` : the global gauge action on the target space, from a + representation of the value group. - `GaugeBoson.JetComponentSpace` : the span of the component functions `∂_s A_μ^φ`. - `GaugeJetAlgebra` : the jet algebra of the gauge bosons. - `GaugeJetAlgebra.ofComponent`, `GaugeJetAlgebra.ofA` : the generators. diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeAction.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeAction.lean index 48392b4b8..5be7aac7f 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeAction.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeAction.lean @@ -21,39 +21,29 @@ against lower component functions, and the constant part is the Taylor coefficie 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. +The linear part is built from the adjoint Taylor coefficients `LocalGaugeData.adjointCoeff` of +the package, whose multiplicativity up to convolution is the Taylor–Leibniz theorem +`LocalGaugeData.evalLie_iteratedDeriv_adjoint`; it makes the transport multiplicative and +gives the cocycle identity for the Maurer–Cartan shift. ## 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. +- `GaugeBoson.adjointTransport` : the adjoint Taylor coefficients on the target space. - `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`. +- `GaugeJetAlgebra.repJet` : the action of the jet gauge group on the jet algebra. +- `GaugeJetAlgebra.repJet_iteratedJetDeriv_ofA` : the transformation law of the derivative + generators, in the form used by `IsGaugeField`. +- `GaugeJetAlgebra.complexRepJet` : the action on the complexified jet algebra. ## 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 +- A. The transport on the component space +- B. The Maurer–Cartan shift +- C. The action of the jet gauge group + - C.1. The transformation law of the generators + - C.2. The complexified action -/ @@ -64,7 +54,6 @@ 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 {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} -variable [LocalGaugeDataLeibniz jets] set_option maxHeartbeats 1000000 @@ -73,7 +62,7 @@ open TensorProduct MvPowerSeries /-! -## C. The transport on the component space +## A. The transport on the component space -/ @@ -85,17 +74,17 @@ variable (jets) in noncomputable def adjointTransport (U : G) (p : Multiset (Fin 1 ⊕ Fin 3)) : (GaugeBoson 𝔤) →ₗ[ℝ] (GaugeBoson 𝔤) := (valLinEquiv 𝔤).symm.toLinearMap ∘ₗ - TensorProduct.map LinearMap.id (IsGaugeField.adjointCoeff jets U p) ∘ₗ + TensorProduct.map LinearMap.id (jets.adjointCoeff U p) ∘ₗ (valLinEquiv 𝔤).toLinearMap lemma adjointTransport_mk_tmul (U : G) (p : Multiset (Fin 1 ⊕ Fin 3)) (v : Lorentz.CoVector) (a : 𝔤) : - adjointTransport jets U p ⟨v ⊗ₜ[ℝ] a⟩ = ⟨v ⊗ₜ[ℝ] IsGaugeField.adjointCoeff jets U p a⟩ := rfl + adjointTransport jets U p ⟨v ⊗ₜ[ℝ] a⟩ = ⟨v ⊗ₜ[ℝ] jets.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 jets 1 p = if p = 0 then LinearMap.id else 0 := by - rw [adjointTransport, IsGaugeField.adjointCoeff_one] + rw [adjointTransport, jets.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 => ?_ @@ -126,9 +115,9 @@ lemma adjointTransport_mul (U V : G) (p : Multiset (Fin 1 ⊕ Fin 3)) : | tmul x a => apply (valLinEquiv 𝔤).injective rw [adjointTransport_mk_tmul, map_multiset_sum, Multiset.map_map, valLinEquiv_apply, - show ((⟨x ⊗ₜ[ℝ] IsGaugeField.adjointCoeff jets (U * V) p a⟩ : (GaugeBoson 𝔤))).val - = x ⊗ₜ[ℝ] IsGaugeField.adjointCoeff jets (U * V) p a from rfl, - IsGaugeField.adjointCoeff_mul, Multiset.sum_linearMap_apply, Multiset.map_map, + show ((⟨x ⊗ₜ[ℝ] jets.adjointCoeff (U * V) p a⟩ : (GaugeBoson 𝔤))).val + = x ⊗ₜ[ℝ] jets.adjointCoeff (U * V) p a from rfl, + jets.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, @@ -146,7 +135,7 @@ lemma dualMap_adjointTransport_componentDual (U : G) (p : Multiset (Fin 1 ⊕ Fin 3)) (ω : Module.Dual ℝ Lorentz.CoVector) (φ : Module.Dual ℝ 𝔤) : (adjointTransport jets U p).dualMap ((componentDual 𝔤) ω φ) - = (componentDual 𝔤) ω (φ ∘ₗ IsGaugeField.adjointCoeff jets U p) := by + = (componentDual 𝔤) ω (φ ∘ₗ jets.adjointCoeff U p) := by refine LinearMap.ext fun v => ?_ obtain ⟨m⟩ := v induction m using TensorProduct.induction_on with @@ -175,7 +164,7 @@ noncomputable def transportFun (U : G) (s : Multiset (Fin 1 ⊕ Fin 3)) : ((GaugeBoson.adjointTransport jets U p.1).dualMap)).sum variable (jets) in -/-- **The linear part of the gauge action on the jet component space**: on a component +/-- 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) : @@ -223,14 +212,14 @@ lemma transport_one : transport jets (1 : G) = LinearMap.id := by (fun p => DerivAlgebraReal.basisMultiset p.2 ⊗ₜ[ℝ] ((if p.1 = 0 then LinearMap.id else 0) : (GaugeBoson 𝔤) →ₗ[ℝ] (GaugeBoson 𝔤)).dualMap ψ) - (fun p hp => by + (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 +/-- 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 : G) : @@ -277,7 +266,7 @@ end GaugeJetAlgebra /-! -## D. The Maurer–Cartan shift +## B. The Maurer–Cartan shift -/ @@ -317,12 +306,12 @@ lemma mcBosonCoeff_mul (U V : G) (s : Multiset (Fin 1 ⊕ Fin 3)) : have hB : ∀ p q : Multiset (Fin 1 ⊕ Fin 3), (GaugeBoson.valLinEquiv 𝔤) (GaugeBoson.adjointTransport jets U p (mcBosonCoeff jets V q)) = ∑ μ, Lorentz.CoVector.basis μ ⊗ₜ[ℝ] - IsGaugeField.adjointCoeff jets U p (jets.evalLie + jets.adjointCoeff U p (jets.evalLie (jets.iteratedDeriv q (jets.maurerCartan V μ))) := by intro p q rw [show (GaugeBoson.valLinEquiv 𝔤) (GaugeBoson.adjointTransport jets U p (mcBosonCoeff jets V q)) - = TensorProduct.map LinearMap.id (IsGaugeField.adjointCoeff jets U p) + = TensorProduct.map LinearMap.id (jets.adjointCoeff U p) ((GaugeBoson.valLinEquiv 𝔤) (mcBosonCoeff jets V q)) from by rw [GaugeBoson.adjointTransport] simp only [LinearMap.coe_comp, LinearEquiv.coe_coe, Function.comp_apply, @@ -335,7 +324,7 @@ lemma mcBosonCoeff_mul (U V : G) (s : Multiset (Fin 1 ⊕ Fin 3)) : jets.evalLie (jets.iteratedDeriv s (jets.maurerCartan U μ)) + (s.antidiagonal.map fun p => Lorentz.CoVector.basis μ ⊗ₜ[ℝ] - IsGaugeField.adjointCoeff jets U p.1 (jets.evalLie + jets.adjointCoeff U p.1 (jets.evalLie (jets.iteratedDeriv p.2 (jets.maurerCartan V μ)))).sum) := by rw [hE] refine Finset.sum_congr rfl fun μ _ => ?_ @@ -345,7 +334,7 @@ lemma mcBosonCoeff_mul (U V : G) (s : Multiset (Fin 1 ⊕ Fin 3)) : map_add, map_add, show jets.adjoint U (jets.maurerCartan V μ) = jets.adjoint U (jets.maurerCartan V μ) from rfl, - LocalGaugeDataLeibniz.evalLie_iteratedDeriv_adjoint, TensorProduct.tmul_add, + jets.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)) @@ -354,7 +343,7 @@ lemma mcBosonCoeff_mul (U V : G) (s : Multiset (Fin 1 ⊕ Fin 3)) : congr 1 variable (jets) in -/-- **The Maurer–Cartan shift**: the linear functional on the component space pairing a +/-- 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 𝔤) →ₗ[ℝ] ℝ := @@ -373,7 +362,7 @@ lemma mcShift_one : mcShift jets (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.** -/ +/-- The cocycle identity for the Maurer–Cartan shift. -/ lemma mcShift_mul (U V : G) : mcShift jets (U * V) = mcShift jets V ∘ₗ transport jets U + mcShift jets U := by refine GaugeBoson.JetComponentSpace.ext_of_basis fun s ψ => ?_ @@ -389,7 +378,7 @@ lemma mcShift_mul (U V : G) : /-! -## E. The action of the jet gauge group +## C. The action of the jet gauge group -/ @@ -407,7 +396,7 @@ lemma gaugeGen_apply (U : G) (x : (GaugeBoson.JetComponentSpace 𝔤)) : + algebraMap ℝ (GaugeJetAlgebra 𝔤) (mcShift jets U⁻¹ x) := rfl variable (jets) in -/-- **The action of the jet gauge group on the gauge-boson jet algebra**: the substitution +/-- 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 @@ -474,7 +463,7 @@ lemma repJet_algebraMap (U : G) (r : ℝ) : /-! -### E.1. The transformation law of the generators +### C.1. The transformation law of the generators -/ @@ -500,7 +489,7 @@ lemma componentDual_dualBasis_mcBosonCoeff (W : G) (fun ν => φ (jets.evalLie (jets.iteratedDeriv s (jets.maurerCartan W ν)))), if_pos (Finset.mem_univ μ)] -/-- **The transformation law of the derivative generators**, in the form used by +/-- 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⁻¹`. -/ @@ -508,7 +497,7 @@ theorem repJet_iteratedJetDeriv_ofA (U : G) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : repJet jets U ((iteratedJetDeriv 𝔤) s ((ofA 𝔤) μ φ)) = (s.antidiagonal.map fun p => - (iteratedJetDeriv 𝔤) p.2 ((ofA 𝔤) μ (adjointDualCoeff jets U⁻¹ p.1 φ))).sum + (iteratedJetDeriv 𝔤) p.2 ((ofA 𝔤) μ (jets.adjointDualCoeff U⁻¹ p.1 φ))).sum + algebraMap ℝ (GaugeJetAlgebra 𝔤) (φ (jets.evalLie (jets.iteratedDeriv s (jets.maurerCartan U⁻¹ μ)))) := by @@ -522,7 +511,7 @@ theorem repJet_iteratedJetDeriv_ofA (U : G) /-! -### E.2. The complexified action +### C.2. The complexified action -/ @@ -579,7 +568,7 @@ lemma one_tmul_algebraMap (r : ℝ) : = (((r : ℝ) : ℂ)) • ((1 : ℂ) ⊗ₜ[ℝ] (1 : (GaugeJetAlgebra 𝔤))) from (algebraMap_smul ℂ r _).symm, Algebra.TensorProduct.one_def] -/-- **The transformation law of the derivative generators on the complexification**: the +/-- 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 ℝ 𝔤) : @@ -587,7 +576,7 @@ theorem complexRepJet_iteratedD_one_tmul_ofA (U : G) ((1 : ℂ) ⊗ₜ[ℝ] (ofA 𝔤) μ φ)) = (s.antidiagonal.map fun p => Lorentz.iteratedD (complexJetDeriv 𝔤) complexJetDeriv_comm p.2 - ((1 : ℂ) ⊗ₜ[ℝ] (ofA 𝔤) μ (adjointDualCoeff jets U⁻¹ p.1 φ))).sum + ((1 : ℂ) ⊗ₜ[ℝ] (ofA 𝔤) μ (jets.adjointDualCoeff U⁻¹ p.1 φ))).sum + algebraMap ℂ (ℂ ⊗[ℝ] (GaugeJetAlgebra 𝔤)) (((φ (jets.evalLie (jets.iteratedDeriv s (jets.maurerCartan U⁻¹ μ))) : ℝ)) : ℂ) := by diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/IsGaugeField.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/IsGaugeField.lean index 9c7afa497..881408d72 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/IsGaugeField.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/IsGaugeField.lean @@ -7,14 +7,17 @@ module public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LorentzAction public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeAction -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeField.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeField.Symmetrized /-! # 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 local-gauge-data package `jets` with the Taylor–Leibniz rule `LocalGaugeDataLeibniz jets`. +for any local-gauge-data package `jets`. For a free package the classification of invariants +of `Physlib.ClassicalFieldTheory.GaugeTheory.GaugeField.Symmetrized` then applies: a gauge +invariant of the gauge-boson jet algebra is a polynomial in the covariant derivatives of the +field strength, `GaugeJetAlgebra.invariant_mem_adjoin_fieldStrength`. -/ @[expose] public section @@ -24,7 +27,6 @@ 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 {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} -variable [LocalGaugeDataLeibniz jets] set_option maxHeartbeats 1000000 @@ -67,7 +69,7 @@ lemma gaugeField_apply (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) -/ variable (jets) in -/-- **The complexified gauge-boson jet algebra is a gauge field**: its derivative symbols +/-- 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. -/ @@ -90,5 +92,33 @@ theorem isGaugeField : gauge_apply_deriv U s μ φ := complexRepJet_iteratedD_one_tmul_ofA U s μ φ gauge_mul U b₁ b₂ := complexRepJet_apply_mul U b₁ b₂ +/-! + +## B. The classification of gauge invariants + +-/ + +variable (jets) in +/-- The classification of gauge invariants of the gauge-boson jet algebra: for a free + package, 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 [jets.Free] (S : Set (ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤)) + (hS : ∀ y ∈ S, ∀ U : jets.truncationKer 0, complexRepJet jets U.1 y = y) + {x : ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤} + (hx : x ∈ Algebra.adjoin ℂ ({b : ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤 | + ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), + b = gaugeField 𝔤 p μ φ} ∪ S)) + (hinv : ∀ U : G, complexRepJet jets U x = x) : + x ∈ Algebra.adjoin ℂ ({b : ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤 | + ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), + b = IsGaugeField.iteratedCovDerivAdjoint (gaugeField 𝔤) l + (IsGaugeField.fieldStrength (gaugeField 𝔤) ν lam) 0 φ} ∪ S) := + IsGaugeField.invariant_mem_adjoin_fieldStrength (isGaugeField jets) + (fun _ _ _ _ _ _ => Commute.all _ _) + S (fun _ _ _ _ _ => Commute.all _ _) hS hx hinv end GaugeJetAlgebra diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/Basic.lean index e150972ff..e94e036f5 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/Basic.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.AdjointCoeff public import Physlib.Mathematics.MultisetAntidiagonal public import Physlib.Relativity.IsLorentzDeriv public import Physlib.Relativity.Tensors.ComplexTensor.Basic @@ -51,7 +51,7 @@ of the jet group `G` and not merely of its value group `G₀`. * `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 jets g⁻¹ x φ`: +* `∂_x (Ad_{g⁻¹})^a_b|` acting on the dual index is `jets.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)` @@ -72,74 +72,6 @@ variable {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra variable {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} -variable (jets) in -/-- 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 ℝ 𝔤 := - ((jets.evalLie).toLinearMap ∘ₗ jets.iteratedDeriv x ∘ₗ - jets.adjoint U ∘ₗ jets.ofConstantLie).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 jets U 0 = (jets.adjointValue - (jets.eval U)).dualMap := by - rw [adjointDualCoeff] - refine congrArg LinearMap.dualMap (LinearMap.ext fun a => ?_) - simp only [LinearMap.coe_comp, Function.comp_apply, LieHom.coe_toLinearMap, - LocalGaugeData.iteratedDeriv_zero, LinearMap.id_coe, id_eq] - exact jets.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 : (jets.eval U) = 1) : - adjointDualCoeff jets 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⁆` (`LocalGaugeData.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 jets U {μ} φ = - -adjointDualCoeff jets U 0 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 - (jets.evalLie (jets.maurerCartan 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, - LocalGaugeData.iteratedDeriv_singleton, LocalGaugeData.iteratedDeriv_zero, - LinearMap.id_coe, id_eq] - rw [jets.deriv_adjoint, - jets.deriv_ofConstantLie, map_zero, zero_sub, map_neg, - map_neg, LieHom.map_lie] - simp - -section Truncation - -variable [LocalGaugeDataTruncation jets] - -/-- **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 ∈ LocalGaugeDataTruncation.truncationKer jets n) {x : Multiset (Fin 1 ⊕ Fin 3)} - (hx : x ≠ 0) (hxn : x.card ≤ n) : adjointDualCoeff jets U x = 0 := by - refine LinearMap.ext fun φ => LinearMap.ext fun b => ?_ - simp only [LinearMap.zero_apply] - show φ (jets.evalLie (jets.iteratedDeriv x - (jets.adjoint U (jets.ofConstantLie b)))) = 0 - rw [LocalGaugeDataTruncation.evalLie_iteratedDeriv_adjoint_ofConstantLie_eq_zero hU hx hxn b, - map_zero] - -end Truncation - open Lorentz variable (jets) in @@ -173,7 +105,7 @@ structure IsGaugeField (repLorentz : Representation ℂ SL(2,ℂ) B) 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 jets U⁻¹ p.1 φ))).sum + (s.antidiagonal.map fun p => (A p.2 μ (jets.adjointDualCoeff U⁻¹ p.1 φ))).sum + algebraMap ℂ B (φ (jets.evalLie (jets.iteratedDeriv s (jets.maurerCartan U⁻¹ μ)))) @@ -223,7 +155,7 @@ noncomputable def commutator action of the value of `U⁻¹` plus the Maurer–Cartan shift. -/ lemma repGauge_apply (hA : IsGaugeField jets repLorentz repGauge A) (U : G) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : - repGauge U (A 0 μ φ) = A 0 μ (adjointDualCoeff jets U⁻¹ ∅ φ) + + repGauge U (A 0 μ φ) = A 0 μ (jets.adjointDualCoeff U⁻¹ ∅ φ) + algebraMap ℂ B (φ (jets.evalLie (jets.maurerCartan U⁻¹ μ))) := by simpa [show (∅ : Multiset (Fin 1 ⊕ Fin 3)) = 0 from rfl] using hA.gauge_apply_deriv U 0 μ φ @@ -235,7 +167,7 @@ lemma repGauge_apply (hA : IsGaugeField jets repLorentz repGauge A) (U : G) lemma repGauge_deriv_apply (hA : IsGaugeField jets repLorentz repGauge A) (U : G) (ρ σ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : repGauge U (A {ρ} σ φ) = - A {ρ} σ (adjointDualCoeff jets U⁻¹ 0 φ) + A 0 σ (adjointDualCoeff jets U⁻¹ {ρ} φ) + + A {ρ} σ (jets.adjointDualCoeff U⁻¹ 0 φ) + A 0 σ (jets.adjointDualCoeff U⁻¹ {ρ} φ) + algebraMap ℂ B (φ (jets.evalLie (jets.deriv ρ (jets.maurerCartan U⁻¹ σ)))) := by have hanti : ({ρ} : Multiset (Fin 1 ⊕ Fin 3)).antidiagonal = @@ -384,10 +316,10 @@ set_option maxHeartbeats 1000000 in lemma repGauge_commutator (hA : IsGaugeField jets repLorentz repGauge A) (U : G) (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : repGauge U (commutator A μ ν φ) = - commutator A μ ν (adjointDualCoeff jets U⁻¹ 0 φ) - - A 0 μ (adjointDualCoeff jets U⁻¹ 0 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 + commutator A μ ν (jets.adjointDualCoeff U⁻¹ 0 φ) + - A 0 μ (jets.adjointDualCoeff U⁻¹ 0 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie (jets.maurerCartan U⁻¹ ν)))) - + A 0 ν (adjointDualCoeff jets U⁻¹ 0 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 + + A 0 ν (jets.adjointDualCoeff U⁻¹ 0 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie (jets.maurerCartan U⁻¹ μ)))) + algebraMap ℂ B (φ ⁅jets.evalLie (jets.maurerCartan U⁻¹ μ), jets.evalLie (jets.maurerCartan U⁻¹ ν)⁆) := by @@ -400,7 +332,7 @@ lemma repGauge_commutator (hA : IsGaugeField jets repLorentz repGauge A) set cν : 𝔤 := jets.evalLie (jets.maurerCartan U⁻¹ ν) with hcν set s : B ⊗[ℝ] 𝔤 := dualPairEquiv.symm (A 0 μ) with hs set t : B ⊗[ℝ] 𝔤 := dualPairEquiv.symm (A 0 ν) with ht - have hcoeff : adjointDualCoeff jets U⁻¹ 0 = T₀.dualMap := by rw [hT₀def]; rfl + have hcoeff : jets.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 @@ -466,54 +398,16 @@ lemma repGauge_commutator (hA : IsGaugeField jets repLorentz repGauge A) -/ -/-- 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 jets U (ρ ::ₘ {μ}) φ = - -adjointDualCoeff jets U 0 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 - (jets.evalLie (jets.deriv ρ (jets.maurerCartan U μ)))) - - adjointDualCoeff jets U {ρ} (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 - (jets.evalLie (jets.maurerCartan U μ))) := by - refine LinearMap.ext fun a => ?_ - have hderiv : ∀ τ : Fin 1 ⊕ Fin 3, - jets.deriv τ (jets.adjoint U (jets.ofConstantLie a)) = - -⁅jets.maurerCartan U τ, - jets.adjoint U (jets.ofConstantLie a)⁆ := - fun τ => by rw [jets.deriv_adjoint, - jets.deriv_ofConstantLie, map_zero, zero_sub] - have hkey : jets.iteratedDeriv (ρ ::ₘ {μ}) - (jets.adjoint U (jets.ofConstantLie a)) = - -⁅jets.deriv ρ (jets.maurerCartan U μ), - jets.adjoint U (jets.ofConstantLie a)⁆ - + ⁅jets.maurerCartan U μ, ⁅jets.maurerCartan U ρ, - jets.adjoint U (jets.ofConstantLie a)⁆⁆ := by - rw [LocalGaugeData.iteratedDeriv_cons, LinearMap.comp_apply, - LocalGaugeData.iteratedDeriv_singleton, hderiv μ, map_neg, - jets.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, - LocalGaugeData.iteratedDeriv_zero, LocalGaugeData.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 jets repLorentz repGauge A) (U : G) (ρ σ τ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : repGauge U (A (ρ ::ₘ {σ}) τ φ) = - A (ρ ::ₘ {σ}) τ (adjointDualCoeff jets U⁻¹ 0 φ) - + A {ρ} τ (adjointDualCoeff jets U⁻¹ {σ} φ) - + A {σ} τ (adjointDualCoeff jets U⁻¹ {ρ} φ) - + A 0 τ (adjointDualCoeff jets U⁻¹ (ρ ::ₘ {σ}) φ) + A (ρ ::ₘ {σ}) τ (jets.adjointDualCoeff U⁻¹ 0 φ) + + A {ρ} τ (jets.adjointDualCoeff U⁻¹ {σ} φ) + + A {σ} τ (jets.adjointDualCoeff U⁻¹ {ρ} φ) + + A 0 τ (jets.adjointDualCoeff U⁻¹ (ρ ::ₘ {σ}) φ) + algebraMap ℂ B (φ (jets.evalLie (jets.deriv ρ (jets.deriv σ (jets.maurerCartan U⁻¹ τ))))) := by have hanti₁ : ({σ} : Multiset (Fin 1 ⊕ Fin 3)).antidiagonal = @@ -828,27 +722,10 @@ lemma bracketFam_sum_right (f : Module.Dual ℝ 𝔤 →ₗ[ℝ] B) /-! -## The all-orders transport, coefficient, and structural identities +## The bracket of families against the adjoint coefficients -/ -/-- 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 : 𝔤) : - jets.evalLie (jets.iteratedDeriv x - (jets.adjoint U (jets.ofConstantLie ⁅a, b⁆))) = - (x.antidiagonal.map fun p => - ⁅jets.evalLie (jets.iteratedDeriv p.1 - (jets.adjoint U (jets.ofConstantLie a))), - jets.evalLie (jets.iteratedDeriv p.2 - (jets.adjoint U (jets.ofConstantLie b)))⁆).sum := by - rw [jets.ofConstantLie_lie, jets.adjoint_lie, - LocalGaugeData.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`. -/ @@ -885,116 +762,24 @@ lemma tensorBracket_map_right_antidiagonal `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 jets U x φ) = + bracketFam f g (jets.adjointDualCoeff U x φ) = (x.antidiagonal.map fun p => - bracketFam (f ∘ₗ adjointDualCoeff jets U p.1) - (g ∘ₗ adjointDualCoeff jets U p.2) φ).sum := by - set T : Multiset (Fin 1 ⊕ Fin 3) → 𝔤 →ₗ[ℝ] 𝔤 := fun m => - (jets.evalLie).toLinearMap ∘ₗ jets.iteratedDeriv m ∘ₗ - jets.adjoint U ∘ₗ jets.ofConstantLie with hTdef - have hcoeff : ∀ m, adjointDualCoeff jets 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 + bracketFam (f ∘ₗ jets.adjointDualCoeff U p.1) + (g ∘ₗ jets.adjointDualCoeff U p.2) φ).sum := by + have hcoeff : ∀ m, jets.adjointDualCoeff U m = (jets.adjointCoeff U m).dualMap := + fun m => rfl rw [hcoeff x, - show bracketFam f g ((T x).dualMap φ) = - dualPairEquiv ((TensorProduct.map LinearMap.id (T x)) (tensorBracket + show bracketFam f g ((jets.adjointCoeff U x).dualMap φ) = + dualPairEquiv ((TensorProduct.map LinearMap.id (jets.adjointCoeff U 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] + (dualPairEquiv_map_right (jets.adjointCoeff U x) _ φ).symm, + ← tensorBracket_map_right_antidiagonal (jets.adjointCoeff U) x (jets.adjointCoeff_lie U x), + 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 jets U (μ ::ₘ x) φ = - -((x.antidiagonal.map fun p => - adjointDualCoeff jets U p.2 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 - (jets.evalLie (jets.iteratedDeriv p.1 - (jets.maurerCartan U μ))))).sum) := by - refine LinearMap.ext fun a => ?_ - have hkey : jets.iteratedDeriv (μ ::ₘ x) - (jets.adjoint U (jets.ofConstantLie a)) = - -((x.antidiagonal.map fun p => - ⁅jets.iteratedDeriv p.1 (jets.maurerCartan U μ), - jets.iteratedDeriv p.2 - (jets.adjoint U (jets.ofConstantLie a))⁆).sum) := by - rw [show (μ ::ₘ x : Multiset (Fin 1 ⊕ Fin 3)) = x + {μ} from by - rw [add_comm, Multiset.singleton_add], - LocalGaugeData.iteratedDeriv_add, LinearMap.comp_apply, - LocalGaugeData.iteratedDeriv_singleton, jets.deriv_adjoint, - jets.deriv_ofConstantLie, map_zero, zero_sub, map_neg, - LocalGaugeData.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) : - jets.evalLie (jets.iteratedDeriv (μ ::ₘ s) - (jets.maurerCartan U ν)) = - jets.evalLie (jets.iteratedDeriv (ν ::ₘ s) - (jets.maurerCartan U μ)) - - (s.antidiagonal.map fun p => - ⁅jets.evalLie (jets.iteratedDeriv p.1 - (jets.maurerCartan U μ)), - jets.evalLie (jets.iteratedDeriv p.2 - (jets.maurerCartan U ν))⁆).sum := by - have hconv : ∀ (κ : Fin 1 ⊕ Fin 3) (z : 𝔤J), - jets.iteratedDeriv s (jets.deriv κ z) = - jets.iteratedDeriv (κ ::ₘ s) z := by - intro κ z - rw [show (κ ::ₘ s : Multiset (Fin 1 ⊕ Fin 3)) = s + {κ} from by - rw [add_comm, Multiset.singleton_add], - LocalGaugeData.iteratedDeriv_add, LinearMap.comp_apply, - LocalGaugeData.iteratedDeriv_singleton] - have h0 := congrArg (fun z => jets.evalLie (jets.iteratedDeriv s z)) - (jets.maurerCartan_structure U μ ν) - simp only [map_add, map_sub, map_zero] at h0 - rw [hconv, hconv, LocalGaugeData.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 jets.evalLie (jets.iteratedDeriv (μ ::ₘ s) - (jets.maurerCartan U ν)) - + (s.antidiagonal.map fun p => - ⁅jets.evalLie (jets.iteratedDeriv p.1 - (jets.maurerCartan U μ)), - jets.evalLie (jets.iteratedDeriv p.2 - (jets.maurerCartan U ν))⁆).sum - = (jets.evalLie (jets.iteratedDeriv (μ ::ₘ s) - (jets.maurerCartan U ν)) - - jets.evalLie (jets.iteratedDeriv (ν ::ₘ s) - (jets.maurerCartan U μ)) - + (s.antidiagonal.map fun p => - ⁅jets.evalLie (jets.iteratedDeriv p.1 - (jets.maurerCartan U μ)), - jets.evalLie (jets.iteratedDeriv p.2 - (jets.maurerCartan U ν))⁆).sum) - + jets.evalLie (jets.iteratedDeriv (ν ::ₘ s) - (jets.maurerCartan U μ)) := by - abel - _ = jets.evalLie (jets.iteratedDeriv (ν ::ₘ s) - (jets.maurerCartan U μ)) := by - rw [h0, zero_add] - /-! ## The gauge transformation of iterated derivatives @@ -1003,17 +788,17 @@ lemma _root_.eval_iteratedDeriv_maurerCartan_structure /-- 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 + `LocalGaugeData.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 jets 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 jets U⁻¹ p.1 φ)).sum + A (κ ::ₘ p.2) τ (jets.adjointDualCoeff U⁻¹ p.1 φ)).sum - (s.antidiagonal.map fun p => (p.1.antidiagonal.map fun q => - A p.2 τ (adjointDualCoeff jets U⁻¹ q.2 + A p.2 τ (jets.adjointDualCoeff U⁻¹ q.2 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie (jets.iteratedDeriv q.1 (jets.maurerCartan U⁻¹ κ)))))).sum).sum + algebraMap ℂ B (φ (jets.evalLie (jets.iteratedDeriv (κ ::ₘ s) @@ -1023,15 +808,15 @@ lemma repGauge_cons_apply (hA : IsGaugeField jets repLorentz repGauge A) 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 jets U⁻¹ (κ ::ₘ p.1) φ)) s.antidiagonal).sum = + A p.2 τ (jets.adjointDualCoeff U⁻¹ (κ ::ₘ p.1) φ)) s.antidiagonal).sum = -(s.antidiagonal.map fun p => (p.1.antidiagonal.map fun q => - A p.2 τ (adjointDualCoeff jets U⁻¹ q.2 + A p.2 τ (jets.adjointDualCoeff U⁻¹ q.2 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie (jets.iteratedDeriv q.1 (jets.maurerCartan 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] + rw [jets.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] @@ -1046,15 +831,15 @@ lemma repGauge_commutatorFam (hA : IsGaugeField jets repLorentz repGauge A) (φ : Module.Dual ℝ 𝔤) : repGauge U (commutatorFam A μ ν s φ) = (s.antidiagonal.map fun p => - commutatorFam A μ ν p.2 (adjointDualCoeff jets U⁻¹ p.1 φ)).sum + commutatorFam A μ ν p.2 (jets.adjointDualCoeff U⁻¹ p.1 φ)).sum + (s.antidiagonal.map fun p => (p.2.antidiagonal.map fun r => - A r.2 ν (adjointDualCoeff jets U⁻¹ r.1 + A r.2 ν (jets.adjointDualCoeff U⁻¹ r.1 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie (jets.iteratedDeriv p.1 (jets.maurerCartan U⁻¹ μ)))))).sum).sum - (s.antidiagonal.map fun p => (p.1.antidiagonal.map fun q => - A q.2 μ (adjointDualCoeff jets U⁻¹ q.1 + A q.2 μ (jets.adjointDualCoeff U⁻¹ q.1 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie (jets.iteratedDeriv p.2 (jets.maurerCartan U⁻¹ ν)))))).sum).sum + (s.antidiagonal.map fun p => @@ -1066,7 +851,7 @@ lemma repGauge_commutatorFam (hA : IsGaugeField jets repLorentz repGauge A) 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 jets U⁻¹ q.1).sum) ψ + ((u.antidiagonal.map fun q => A q.2 τ ∘ₗ jets.adjointDualCoeff U⁻¹ q.1).sum) ψ + algebraMap ℂ B (ψ (jets.evalLie (jets.iteratedDeriv u (jets.maurerCartan U⁻¹ τ)))) := by intro τ u ψ @@ -1074,13 +859,13 @@ lemma repGauge_commutatorFam (hA : IsGaugeField jets repLorentz repGauge A) 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 jets U⁻¹ q.1).sum) - ((p.2.antidiagonal.map fun r => A r.2 ν ∘ₗ adjointDualCoeff jets U⁻¹ r.1).sum) φ).sum = + bracketFam ((p.1.antidiagonal.map fun q => A q.2 μ ∘ₗ jets.adjointDualCoeff U⁻¹ q.1).sum) + ((p.2.antidiagonal.map fun r => A r.2 ν ∘ₗ jets.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 jets U⁻¹ q.1) - (A r.2 ν ∘ₗ adjointDualCoeff jets U⁻¹ r.1) φ).sum).sum).sum := by + bracketFam (A q.2 μ ∘ₗ jets.adjointDualCoeff U⁻¹ q.1) + (A r.2 ν ∘ₗ jets.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] @@ -1091,12 +876,12 @@ lemma repGauge_commutatorFam (hA : IsGaugeField jets repLorentz repGauge A) 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 jets U⁻¹ p.1 φ)).sum = + commutatorFam A μ ν p.2 (jets.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 jets U⁻¹ q.1) - (A r.2 ν ∘ₗ adjointDualCoeff jets U⁻¹ q.2) φ).sum).sum).sum := by + bracketFam (A r.1 μ ∘ₗ jets.adjointDualCoeff U⁻¹ q.1) + (A r.2 ν ∘ₗ jets.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 @@ -1104,15 +889,15 @@ lemma repGauge_commutatorFam (hA : IsGaugeField jets repLorentz repGauge A) 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 jets U⁻¹ a) - (A d ν ∘ₗ adjointDualCoeff jets U⁻¹ c) φ).trans hMc.symm) + bracketFam (A b μ ∘ₗ jets.adjointDualCoeff U⁻¹ a) + (A d ν ∘ₗ jets.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 jets U⁻¹ r.1).sum) + ((p.2.antidiagonal.map fun r => A r.2 ν ∘ₗ jets.adjointDualCoeff U⁻¹ r.1).sum) (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie (jets.iteratedDeriv p.1 (jets.maurerCartan U⁻¹ μ)))) = (p.2.antidiagonal.map fun r => - A r.2 ν (adjointDualCoeff jets U⁻¹ r.1 + A r.2 ν (jets.adjointDualCoeff U⁻¹ r.1 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie (jets.iteratedDeriv p.1 (jets.maurerCartan U⁻¹ μ)))))).sum := by intro p @@ -1120,11 +905,11 @@ lemma repGauge_commutatorFam (hA : IsGaugeField jets repLorentz repGauge A) 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 jets U⁻¹ q.1).sum) + ((p.1.antidiagonal.map fun q => A q.2 μ ∘ₗ jets.adjointDualCoeff U⁻¹ q.1).sum) (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie (jets.iteratedDeriv p.2 (jets.maurerCartan U⁻¹ ν)))) = (p.1.antidiagonal.map fun q => - A q.2 μ (adjointDualCoeff jets U⁻¹ q.1 + A q.2 μ (jets.adjointDualCoeff U⁻¹ q.1 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie (jets.iteratedDeriv p.2 (jets.maurerCartan U⁻¹ ν)))))).sum := by intro p diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/FieldStrength.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/FieldStrength.lean index 578391407..bc990b7b4 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/FieldStrength.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/FieldStrength.lean @@ -7,6 +7,7 @@ module public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeField.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeField.TransformsInAdjoint +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.MaurerCartan /-! # The field strength @@ -154,53 +155,53 @@ theorem repGauge_fieldStrength (hA : IsGaugeField jets repLorentz repGauge A) (φ : Module.Dual ℝ 𝔤) : repGauge U (fieldStrength A μ ν s φ) = (s.antidiagonal.map fun p => - fieldStrength A μ ν p.2 (adjointDualCoeff jets U⁻¹ p.1 φ)).sum := by + fieldStrength A μ ν p.2 (jets.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 jets U⁻¹ p.1 φ)).sum = + fieldStrength A μ ν p.2 (jets.adjointDualCoeff U⁻¹ p.1 φ)).sum = (s.antidiagonal.map fun p => - A (μ ::ₘ p.2) ν (adjointDualCoeff jets U⁻¹ p.1 φ)).sum + A (μ ::ₘ p.2) ν (jets.adjointDualCoeff U⁻¹ p.1 φ)).sum - (s.antidiagonal.map fun p => - A (ν ::ₘ p.2) μ (adjointDualCoeff jets U⁻¹ p.1 φ)).sum + A (ν ::ₘ p.2) μ (jets.adjointDualCoeff U⁻¹ p.1 φ)).sum + (s.antidiagonal.map fun p => - commutatorFam A μ ν p.2 (adjointDualCoeff jets U⁻¹ p.1 φ)).sum := by + commutatorFam A μ ν p.2 (jets.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 jets U⁻¹ q.2 + A p.2 ν (jets.adjointDualCoeff U⁻¹ q.2 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie (jets.iteratedDeriv q.1 (jets.maurerCartan U⁻¹ μ)))))).sum).sum = (s.antidiagonal.map fun p => (p.2.antidiagonal.map fun r => - A r.2 ν (adjointDualCoeff jets U⁻¹ r.1 + A r.2 ν (jets.adjointDualCoeff U⁻¹ r.1 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie (jets.iteratedDeriv p.1 (jets.maurerCartan U⁻¹ μ)))))).sum).sum := Multiset.sum_antidiagonal_assoc s (fun a b c => - A c ν (adjointDualCoeff jets U⁻¹ b + A c ν (jets.adjointDualCoeff U⁻¹ b (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie (jets.iteratedDeriv a (jets.maurerCartan U⁻¹ μ)))))) have hcancel₂ : (s.antidiagonal.map fun p => (p.1.antidiagonal.map fun q => - A p.2 μ (adjointDualCoeff jets U⁻¹ q.2 + A p.2 μ (jets.adjointDualCoeff U⁻¹ q.2 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie (jets.iteratedDeriv q.1 (jets.maurerCartan U⁻¹ ν)))))).sum).sum = (s.antidiagonal.map fun p => (p.1.antidiagonal.map fun q => - A q.2 μ (adjointDualCoeff jets U⁻¹ q.1 + A q.2 μ (jets.adjointDualCoeff U⁻¹ q.1 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie (jets.iteratedDeriv p.2 (jets.maurerCartan U⁻¹ ν)))))).sum).sum := by refine (Multiset.sum_antidiagonal_assoc s (fun a b c => - A c μ (adjointDualCoeff jets U⁻¹ b + A c μ (jets.adjointDualCoeff U⁻¹ b (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie (jets.iteratedDeriv a (jets.maurerCartan U⁻¹ ν))))))).trans ?_ exact Multiset.sum_antidiagonal_swap s (fun a b => (b.antidiagonal.map fun q => - A q.2 μ (adjointDualCoeff jets U⁻¹ q.1 + A q.2 μ (jets.adjointDualCoeff U⁻¹ q.1 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie (jets.iteratedDeriv a (jets.maurerCartan U⁻¹ ν)))))).sum) set Θ : 𝔤 →+ B := ((algebraMap ℂ B).toAddMonoidHom.comp @@ -215,7 +216,7 @@ theorem repGauge_fieldStrength (hA : IsGaugeField jets repLorentz repGauge A) (jets.maurerCartan U⁻¹ μ)), jets.evalLie (jets.iteratedDeriv p.2 (jets.maurerCartan U⁻¹ ν))⁆).sum := by - rw [eval_iteratedDeriv_maurerCartan_structure U⁻¹ s μ ν, map_sub, map_multiset_sum, + rw [jets.evalLie_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 μ φ, @@ -237,7 +238,7 @@ theorem transformsInAdjoint_fieldStrength (hA : IsGaugeField jets repLorentz rep lemma repGauge_fieldStrength_zero (hA : IsGaugeField jets repLorentz repGauge A) (U : G) (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : repGauge U (fieldStrength A μ ν 0 φ) = - fieldStrength A μ ν 0 (adjointDualCoeff jets U⁻¹ 0 φ) := by + fieldStrength A μ ν 0 (jets.adjointDualCoeff U⁻¹ 0 φ) := by rw [hA.repGauge_fieldStrength U 0 μ ν φ, Multiset.antidiagonal_zero, Multiset.map_singleton, Multiset.sum_singleton] diff --git a/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Symmeterized.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/Symmetrized.lean similarity index 82% rename from Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Symmeterized.lean rename to Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/Symmetrized.lean index 7f61d31ed..386bfb124 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Symmeterized.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/Symmetrized.lean @@ -5,67 +5,105 @@ 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 Physlib.ClassicalFieldTheory.GaugeTheory.GaugeField.FieldStrength +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Truncation public import Mathlib.LinearAlgebra.Basis.Defs public import Mathlib.LinearAlgebra.Dimension.Free /-! +# The symmetrized derivatives of a gauge field and the classification of invariants -# The symmetrized field strength tensor +## i. Overview -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. +The derivative symbols `∂_s A_μ` of a gauge field are not all independent modulo the +covariant objects: the antisymmetric parts of the derivatives assemble into the field +strength and its covariant derivatives, and what remains is the *symmetrized* derivative -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_{μν}`. + `sym(∂_s A)_μ := (1/|s|) ∑_{ν ∈ s} ∂_{s − ν} 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. +with the direction of the field averaged into the derivative multiset. Two facts about these +coordinates, both for any package `jets`, are proved here. + +First, the generation theorem `symbolAdjoin_eq_symFieldAdjoin`: the algebra generated by the +symbols `∂_s A_μ` of order at most `n` is generated by the symmetrized symbols of order at +most `n + 1` together with the covariant derivatives of the field strength of order less than +`n`. + +Second, the gauge action on the symmetrized symbols: a jet acts on `sym(∂_s A)` by the +symmetrized adjoint convolution plus a translation by the symmetrized Maurer–Cartan data of +the jet, `repGauge_symmetrizedDeriv`. For a jet trivial to order `|s| − 1` the convolution +collapses and the action is a pure translation, `repGauge_symmetrizedDeriv_translation`. +When the package is `Free`, every translation is realized by such a jet. + +Together these give the classification of invariants `invariant_mem_adjoin_fieldStrength`: a +gauge-invariant polynomial in the gauge-field symbols, and in any further generators fixed by +the pure jets, is a polynomial in the covariant derivatives of the field strength and those +generators. Invariance under the translations strips the symmetrized symbols order by order, +by a Vandermonde argument that needs no algebraic independence, only that the gauge-field +symbols commute with each other and with the further generators. + +## ii. Key results + +- `IsGaugeField.symmetrizedDeriv` : the symmetrized derivative symbols. +- `IsGaugeField.iteratedCovDerivAdjoint` : the iterated covariant derivative of an adjoint + family along a list of directions. +- `IsGaugeField.symbolAdjoin_eq_symFieldAdjoin` : the generation theorem. +- `IsGaugeField.repGauge_symmetrizedDeriv` : the gauge action on the symmetrized symbols. +- `IsGaugeField.repGauge_symmetrizedDeriv_translation` : deep jets act by pure translations. +- `IsGaugeField.invariant_mem_adjoin_fieldStrength` : the classification of invariants. + +## iii. Table of contents + +- A. The symmetrized derivative symbols +- B. The generation theorem +- C. The gauge action on the symmetrized derivatives +- D. Centrality, and invariance under the pure jets +- E. The classification of invariants -/ @[expose] public section -namespace StandardModel -namespace IsGaugeField +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 {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} + +namespace IsGaugeField 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} +variable {repGauge : Representation ℂ G B} +variable {A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] 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 := + (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B) + (φ : Module.Dual ℝ 𝔤) : B := ((1/(s.card : ℝ) : ℝ) • (s.map fun μ => A (s - {μ}) μ φ).sum) @[simp] lemma symmetrizedDeriv_singleton (μ : Fin 1 ⊕ Fin 3) - (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) - (φ : Module.Dual ℝ GaugeAlgebra) : + (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B) + (φ : Module.Dual ℝ 𝔤) : symmetrizedDeriv ({μ}) A φ = A 0 μ φ := by simp [symmetrizedDeriv] @[simp] lemma symmetrizedDeriv_empty - (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) - (φ : Module.Dual ℝ GaugeAlgebra) : + (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B) + (φ : Module.Dual ℝ 𝔤) : symmetrizedDeriv 0 A φ = 0 := by simp [symmetrizedDeriv] 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) + (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B) + (φ : Module.Dual ℝ 𝔤) (μ : Fin 1 ⊕ Fin 3) : A s μ φ - symmetrizedDeriv (μ ::ₘ s) A φ = ((1/(s.card + 1 : ℝ)) • ((s.map fun ν => A s μ φ - @@ -80,7 +118,7 @@ lemma deriv_sub_symmetrizedDeriv_eq_sum (s : Multiset (Fin 1 ⊕ Fin 3)) /-! -## The generation theorem: symbols = symmetrized symbols + field strength +## B. The generation theorem: symbols = symmetrized symbols + field strength The chain of lemmas below implements the outline in the module docstring, leading to @@ -98,19 +136,19 @@ convolution, both of which stay inside the symbol subalgebras by construction. 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 : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) : + (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B) : List (Fin 1 ⊕ Fin 3) → - (Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B) → - Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B + (Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B) → + Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B | [], F => F | ρ :: 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 = A p μ φ} ≤ + (φ : Module.Dual ℝ 𝔤), 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 = A p μ φ} := by + (φ : Module.Dual ℝ 𝔤), p.card ≤ m ∧ b = A p μ φ} := by refine Algebra.adjoin_mono fun b => ?_ rintro ⟨p, μ, φ, h, rfl⟩ exact ⟨p, μ, φ, h.trans hnm, rfl⟩ @@ -118,16 +156,16 @@ lemma adjoin_symbols_mono {n m : ℕ} (hnm : n ≤ m) : /-- 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} + {f g : Module.Dual ℝ 𝔤 →ₗ[ℝ] B} (hf : ∀ ψ, f ψ ∈ Algebra.adjoin ℂ {b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) - (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), p.card ≤ n ∧ + (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), p.card ≤ n ∧ 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 ∧ + (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), p.card ≤ n ∧ b = A p μ φ}) - (φ : Module.Dual ℝ GaugeAlgebra) : + (φ : Module.Dual ℝ 𝔤) : bracketFam f g φ ∈ Algebra.adjoin ℂ {b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) - (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), p.card ≤ n ∧ + (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), p.card ≤ n ∧ b = A p μ φ} := by rw [bracketFam_apply_eq_sum] refine Subalgebra.sum_mem _ fun j _ => Subalgebra.sum_mem _ fun k _ => ?_ @@ -138,10 +176,10 @@ lemma bracketFam_mem_adjoin_symbols {n : ℕ} one higher than the number of derivatives. -/ lemma fieldStrength_mem_adjoin_symbols (q : Multiset (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ GaugeAlgebra) : + (φ : Module.Dual ℝ 𝔤) : 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 ∧ + (φ : Module.Dual ℝ 𝔤), p.card ≤ q.card + 1 ∧ b = A p μ φ} := by rw [fieldStrength_apply] refine add_mem (sub_mem ?_ ?_) ?_ @@ -150,18 +188,18 @@ lemma fieldStrength_mem_adjoin_symbols · exact adjoin_symbols_mono (Nat.le_succ q.card) (commutatorFam_mem A q ν lam φ) -/-- **Outline step 6** (unitriangularity of the covariant tower): the covariant and +/-- Outline step 6 (unitriangularity of the covariant tower): the covariant and 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) - (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra) : + (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤) : 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 + s.card ∧ + (φ : Module.Dual ℝ 𝔤), p.card ≤ l.length + s.card ∧ b = A p μ φ} := by induction l generalizing s φ with | nil => @@ -214,22 +252,22 @@ lemma iteratedCovDerivAdjoint_sub_mem · simp only [Multiset.card_add, Multiset.coe_card, List.length_cons] omega -/-- **Outline step 7** (chaining the memberships): every derivative symbol of order +/-- 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 symbol_mem_symFieldAdjoin_sup (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ GaugeAlgebra) : + (φ : Module.Dual ℝ 𝔤) : A s μ φ ∈ Algebra.adjoin ℂ - ({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra), + ({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤), 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 ∧ + (φ : Module.Dual ℝ 𝔤), l.length < s.card ∧ 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) ∧ + (φ : Module.Dual ℝ 𝔤), p.card ≤ (s.card - 1) ∧ b = A p μ φ} := by rw [sub_eq_iff_eq_add.mp (deriv_sub_symmetrizedDeriv_eq_sum s A φ μ)] refine add_mem ?_ ?_ @@ -251,7 +289,7 @@ lemma symbol_mem_symFieldAdjoin_sup · 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 φ) + have h := congrArg (fun f : Module.Dual ℝ 𝔤 →ₗ[ℝ] B => f φ) (pair_eq_fieldStrength_sub_commutatorFam A ν μ (s - {ν})) simp only [LinearMap.sub_apply] at h rw [← h, hνs, hμs] @@ -282,59 +320,59 @@ lemma symbol_mem_symFieldAdjoin_sup 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 +/-- 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 (n : ℕ) : Algebra.adjoin ℂ {b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ GaugeAlgebra), p.card ≤ n ∧ b = A p μ φ} = + (φ : Module.Dual ℝ 𝔤), p.card ≤ n ∧ b = A p μ φ} = Algebra.adjoin ℂ - ({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra), + ({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤), 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 ∧ + (φ : Module.Dual ℝ 𝔤), l.length < n ∧ 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 → + (φ : Module.Dual ℝ 𝔤), p.card ≤ m → m ≤ n → A p μ φ ∈ Algebra.adjoin ℂ - ({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra), + ({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤), 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 ∧ + (φ : Module.Dual ℝ 𝔤), l.length < n ∧ 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), + ({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤), 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 ∧ + (φ : Module.Dual ℝ 𝔤), l.length < p.card ∧ b = iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ}) ≤ Algebra.adjoin ℂ - ({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra), + ({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤), 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 ∧ + (φ : Module.Dual ℝ 𝔤), l.length < n ∧ 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) ∧ + (κ : Fin 1 ⊕ Fin 3) (ψ : Module.Dual ℝ 𝔤), q.card ≤ (p.card - 1) ∧ b = A q κ ψ} ≤ Algebra.adjoin ℂ - ({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra), + ({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤), 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 ∧ + (φ : Module.Dual ℝ 𝔤), l.length < n ∧ b = iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ}) := by refine Algebra.adjoin_le ?_ rintro b ⟨q, κ, ψ, hqc, rfl⟩ @@ -371,7 +409,7 @@ theorem symbolAdjoin_eq_symFieldAdjoin (n : ℕ) : · simp only [Multiset.card_add, Multiset.coe_card, Multiset.card_zero] omega -/-- **The generation theorem, unbounded version**: the derivative symbols of the gauge +/-- 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, @@ -381,12 +419,12 @@ theorem symbolAdjoin_eq_symFieldAdjoin (n : ℕ) : generator on either side appears at some finite order. -/ theorem symbolAdjoin_eq_symFieldAdjoin_top : Algebra.adjoin ℂ {b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ GaugeAlgebra), b = A p μ φ} = + (φ : Module.Dual ℝ 𝔤), b = A p μ φ} = Algebra.adjoin ℂ - ({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra), + ({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤), r ≠ 0 ∧ b = symmetrizedDeriv r A φ} ∪ {b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ GaugeAlgebra), + (φ : Module.Dual ℝ 𝔤), b = iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ}) := by refine le_antisymm (Algebra.adjoin_le ?_) (Algebra.adjoin_le ?_) · rintro b ⟨p, μ, φ, rfl⟩ @@ -397,10 +435,10 @@ theorem symbolAdjoin_eq_symFieldAdjoin_top : · 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 ∧ + (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), p.card ≤ n ∧ b = A p μ φ} ≤ Algebra.adjoin ℂ {b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ GaugeAlgebra), b = A p μ φ} := by + (φ : Module.Dual ℝ 𝔤), b = A p μ φ} := by intro n refine Algebra.adjoin_mono ?_ rintro b ⟨p, μ, ψ, _, rfl⟩ @@ -417,11 +455,11 @@ theorem symbolAdjoin_eq_symFieldAdjoin_top : /-! -## The gauge action on the symmetrized derivatives +## C. The gauge action on the symmetrized derivatives -/ -/-- **The gauge transformation of the symmetrized derivatives**: averaging the +/-- 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 @@ -434,57 +472,57 @@ theorem symbolAdjoin_eq_symFieldAdjoin_top : the gauge group acts on the symmetrized derivative coordinates through the symmetrized Maurer–Cartan data. -/ -lemma repGauge_symmetrizedDeriv (hA : IsGaugeField repLorentz repGauge A) - (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℝ GaugeAlgebra) : +lemma repGauge_symmetrizedDeriv (hA : IsGaugeField jets repLorentz repGauge A) + (U : G) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℝ 𝔤) : repGauge U (symmetrizedDeriv s A φ) = (1/(s.card : ℝ)) • (s.map fun μ => ((s - {μ}).antidiagonal.map fun p => - A p.2 μ (adjointDualCoeff U⁻¹ p.1 φ)).sum).sum - + algebraMap ℂ B (φ (JetGaugeAlgebra.eval - (localGaugeData.symmetrizedMaurerCartanForm U⁻¹ s))) := by - set L : JetGaugeAlgebra →ₗ[ℝ] B := + A p.2 μ (jets.adjointDualCoeff U⁻¹ p.1 φ)).sum).sum + + algebraMap ℂ B (φ (jets.evalLie + (jets.symmetrizedMaurerCartanForm U⁻¹ s))) := by + set L : 𝔤J →ₗ[ℝ] B := (Algebra.linearMap ℂ B).restrictScalars ℝ ∘ₗ Algebra.linearMap ℝ ℂ ∘ₗ - φ ∘ₗ JetGaugeAlgebra.eval.toLinearMap with hL + φ ∘ₗ jets.evalLie.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 + calc (1/(s.card : ℝ)) • (s.map fun μ => algebraMap ℂ B (φ (jets.evalLie + (jets.iteratedDeriv (s - {μ}) (jets.maurerCartan U⁻¹ μ))))).sum = (1/(s.card : ℝ)) • (s.map fun μ => - L (JetGaugeAlgebra.iteratedDeriv (s - {μ}) (maurerCartanForm U⁻¹ μ))).sum := rfl + L (jets.iteratedDeriv (s - {μ}) (jets.maurerCartan U⁻¹ μ))).sum := rfl _ = L ((1/(s.card : ℝ)) • (s.map fun μ => - JetGaugeAlgebra.iteratedDeriv (s - {μ}) (maurerCartanForm U⁻¹ μ)).sum) := by + jets.iteratedDeriv (s - {μ}) (jets.maurerCartan U⁻¹ μ)).sum) := by rw [map_smul, map_multiset_sum, Multiset.map_map] simp only [Function.comp_def] - _ = algebraMap ℂ B (φ (JetGaugeAlgebra.eval - (localGaugeData.symmetrizedMaurerCartanForm U⁻¹ s))) := by - rw [localGaugeData_symmetrizedMaurerCartanForm_eq] + _ = algebraMap ℂ B (φ (jets.evalLie + (jets.symmetrizedMaurerCartanForm U⁻¹ s))) := by + rw [LocalGaugeData.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 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) - (U : JetGaugeGroupI.truncationKer 0) (s : Multiset (Fin 1 ⊕ Fin 3)) (hs : s ≠ 0) - (φ : Module.Dual ℝ GaugeAlgebra) : + (hA : IsGaugeField jets repLorentz repGauge A) + (U : jets.truncationKer 0) (s : Multiset (Fin 1 ⊕ Fin 3)) (hs : s ≠ 0) + (φ : Module.Dual ℝ 𝔤) : repGauge U.1 (symmetrizedDeriv s A φ) = (1/(s.card : ℝ)) • (s.map fun μ => ((s - {μ}).antidiagonal.map fun p => - A p.2 μ (adjointDualCoeff (U.1)⁻¹ p.1 φ)).sum).sum - + algebraMap ℂ B (φ (symmetrizedMaurerCartanCoeff U⁻¹ ⟨s, hs⟩)) := by + A p.2 μ (jets.adjointDualCoeff (U.1)⁻¹ p.1 φ)).sum).sum + + algebraMap ℂ B (φ (jets.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, +/-- 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. @@ -493,23 +531,23 @@ lemma repGauge_symmetrizedDeriv_truncationKer 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) - (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), +lemma exists_repGauge_symmetrizedDeriv_shift [jets.Free] + (hA : IsGaugeField jets repLorentz repGauge A) + (c : {r : Multiset (Fin 1 ⊕ Fin 3) // r ≠ 0} → 𝔤) : + ∃ U : jets.truncationKer 0, + ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (hs : s ≠ 0) (φ : Module.Dual ℝ 𝔤), repGauge U.1 (symmetrizedDeriv s A φ) = (1/(s.card : ℝ)) • (s.map fun μ => ((s - {μ}).antidiagonal.map fun p => - A p.2 μ (adjointDualCoeff (U.1)⁻¹ p.1 φ)).sum).sum + A p.2 μ (jets.adjointDualCoeff (U.1)⁻¹ p.1 φ)).sum).sum + algebraMap ℂ B (φ (c ⟨s, hs⟩)) := by - obtain ⟨V, hV⟩ := symmetrizedMaurerCartanCoeff_surjective c + obtain ⟨V, hV⟩ := jets.symmetrizedMaurerCartanCoeff_surjective c 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 +## D. Centrality of the gauge-field symbols, and invariance under the pure jets 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 @@ -528,9 +566,9 @@ lemma smul_mem_center (r : ℝ) {x : B} (hx : x ∈ Subring.center B) : exact Subring.mul_mem _ (algebraMap_mem_center _) hx /-- The bracket of component families with central components is central. -/ -lemma bracketFam_mem_center {f g : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} +lemma bracketFam_mem_center {f g : Module.Dual ℝ 𝔤 →ₗ[ℝ] B} (hf : ∀ ψ, f ψ ∈ Subring.center B) (hg : ∀ ψ, g ψ ∈ Subring.center B) - (φ : Module.Dual ℝ GaugeAlgebra) : + (φ : Module.Dual ℝ 𝔤) : bracketFam f g φ ∈ Subring.center B := by rw [bracketFam_apply_eq_sum] refine Subring.sum_mem _ fun j _ => Subring.sum_mem _ fun k _ => ?_ @@ -539,22 +577,22 @@ lemma bracketFam_mem_center {f g : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} /-- 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) + (φ : Module.Dual ℝ 𝔤), A p μ φ ∈ Subring.center B) (ν lam : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℝ GaugeAlgebra) : + (φ : Module.Dual ℝ 𝔤) : 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 +/-- 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 (hc : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ GaugeAlgebra), A p μ φ ∈ Subring.center B) + (φ : Module.Dual ℝ 𝔤), A p μ φ ∈ Subring.center B) (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) - (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra) : + (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤) : iteratedCovDerivAdjoint A l (fieldStrength A ν lam) s φ ∈ Subring.center B := by induction l generalizing s φ with | nil => @@ -575,49 +613,49 @@ lemma iteratedCovDerivAdjoint_fieldStrength_mem_center 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 +/-- 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), A p μ φ ∈ Subring.center B) - (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra) : + (φ : Module.Dual ℝ 𝔤), A p μ φ ∈ Subring.center B) + (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤) : 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 exact hc _ _ _ -/-- **3.** Anything that transforms in the adjoint is invariant under the kernel of +/-- 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 - {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} - (hF : TransformsInAdjoint repGauge F) - (U : JetGaugeGroupI.truncationKer 0) (φ : Module.Dual ℝ GaugeAlgebra) : + {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B} + (hF : TransformsInAdjoint jets repGauge F) + (U : jets.truncationKer 0) (φ : Module.Dual ℝ 𝔤) : 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 [adjointDualCoeff_zero_of_eval_eq_one hinv] using hF U.1 φ 0 + have hinv : jets.eval (U.1)⁻¹ = 1 := by + rw [map_inv, jets.mem_truncationKer_zero_iff.mp U.2, inv_one] + simpa [jets.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 +/-- 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)) + (hA : IsGaugeField jets repLorentz repGauge A) (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) : - TransformsInAdjoint repGauge + TransformsInAdjoint jets 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 +/-- 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) - (U : JetGaugeGroupI.truncationKer 0) (l : List (Fin 1 ⊕ Fin 3)) - (ν lam : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : + (hA : IsGaugeField jets repLorentz repGauge A) + (U : jets.truncationKer 0) (l : List (Fin 1 ⊕ Fin 3)) + (ν lam : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : repGauge U.1 (iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ) = iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ := (transformsInAdjoint_iteratedCovDerivAdjoint hA l ν @@ -625,7 +663,7 @@ lemma repGauge_iteratedCovDerivAdjoint_fieldStrength_of_mem_truncationKer_zero /-! -## The classification of invariants +## E. 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 @@ -659,13 +697,13 @@ The strategy, by downward induction on the top symbol order `N` present in `x`: determined by `adjoin X` and `S`. -/ 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 ∧ + (φ : Module.Dual ℝ 𝔤), p.card ≤ n ∧ b = A p μ φ} ∪ S) = Algebra.adjoin ℂ - (({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra), + (({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤), 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 ∧ + (φ : Module.Dual ℝ 𝔤), l.length < n ∧ b = iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ}) ∪ S) := by rw [Algebra.adjoin_union, Algebra.adjoin_union, symbolAdjoin_eq_symFieldAdjoin (A := A) n] @@ -674,17 +712,17 @@ theorem symbolAdjoin_union_eq_symFieldAdjoin_union (n : ℕ) (S : Set B) : 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), + (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), 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 ∧ + (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), p.card ≤ n ∧ 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 ∧ + (φ : Module.Dual ℝ 𝔤), p.card ≤ n ∧ b = A p μ φ} ∪ S) ≤ Algebra.adjoin ℂ ({b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ GaugeAlgebra), p.card ≤ m ∧ + (φ : Module.Dual ℝ 𝔤), p.card ≤ m ∧ b = A p μ φ} ∪ S) := by intro n m hnm refine Algebra.adjoin_mono (Set.union_subset_union_left S ?_) @@ -705,19 +743,19 @@ lemma exists_le_of_mem_adjoin_symbols_union (S : Set B) {x : B} 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 +/-- 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) - (U : JetGaugeGroupI.truncationKer 0) (s : Multiset (Fin 1 ⊕ Fin 3)) (hs : s ≠ 0) + (hA : IsGaugeField jets repLorentz repGauge A) + (U : jets.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) : + jets.adjointDualCoeff (U.1)⁻¹ x = 0) + (φ : Module.Dual ℝ 𝔤) : repGauge U.1 (symmetrizedDeriv s A φ) = symmetrizedDeriv s A φ + - algebraMap ℂ B (φ (symmetrizedMaurerCartanCoeff U⁻¹ ⟨s, hs⟩)) := by + algebraMap ℂ B (φ (jets.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 have hcollapse : ∀ (t : Multiset (Fin 1 ⊕ Fin 3)) @@ -751,15 +789,15 @@ theorem repGauge_symmetrizedDeriv_translation 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 + have hinv1 : jets.eval (U.1)⁻¹ = 1 := by + rw [map_inv, jets.mem_truncationKer_zero_iff.mp U.2, inv_one] + have hid := jets.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 → - A p.2 μ (adjointDualCoeff (U.1)⁻¹ p.1 φ) = 0 := by + A p.2 μ (jets.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] @@ -772,21 +810,21 @@ theorem repGauge_symmetrizedDeriv_translation rw [hcollapse (s - {μ}) _ hvan, hid] rfl -/-- **Realization of top-order translations**: any coefficient family supported at +/-- 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) +theorem exists_translation_of_support [jets.Free] + (N : ℕ) (c : {r : Multiset (Fin 1 ⊕ Fin 3) // r ≠ 0} → 𝔤) (hcN : ∀ r, r.1.card ≠ N → c r = 0) : - ∃ U : JetGaugeGroupI.truncationKer 0, - symmetrizedMaurerCartanCoeff U⁻¹ = c ∧ + ∃ U : jets.truncationKer 0, + jets.symmetrizedMaurerCartanCoeff U⁻¹ = c ∧ ∀ x : Multiset (Fin 1 ⊕ Fin 3), x ≠ 0 → x.card < N → - adjointDualCoeff (U.1)⁻¹ x = 0 := by - obtain ⟨V, hV⟩ := symmetrizedMaurerCartanCoeff_surjective c + jets.adjointDualCoeff (U.1)⁻¹ x = 0 := by + obtain ⟨V, hV⟩ := jets.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) ?_ + have hVmem : V.1 ∈ jets.truncationKer (N - 1) := by + refine jets.mem_truncationKer_of_symmetrizedMaurerCartanCoeff_eq_zero V (N - 1) ?_ intro r hr hrcard rw [hV] refine hcN ⟨r, hr⟩ ?_ @@ -794,9 +832,9 @@ theorem exists_translation_of_support 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 + have hcoe : ((V⁻¹ : jets.truncationKer 0).1)⁻¹ = V.1 := by simp rw [hcoe] - exact adjointDualCoeff_eq_zero_of_mem_truncationKer hVmem hx (by omega) + exact jets.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 @@ -1019,7 +1057,7 @@ lemma mem_of_translationInvariant_single (R : Subalgebra ℂ B) (y : B) 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 +/-- 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 @@ -1102,8 +1140,8 @@ lemma commute_of_mem_adjoin {X : Set B} {y : B} (hX : ∀ x ∈ X, Commute x y) 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) : + (φ : Module.Dual ℝ 𝔤), Commute y (A p μ φ)) + (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤) : Commute y (symmetrizedDeriv r A φ) := by rw [symmetrizedDeriv, ← algebraMap_smul ℂ ((1 : ℝ)/(r.card : ℝ))] refine Commute.smul_right ?_ _ @@ -1115,10 +1153,10 @@ lemma commute_symmetrizedDeriv_right {y : B} gauge-field symbols. -/ lemma iteratedCovDerivAdjoint_fieldStrength_mem_adjoin_symbols (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ GaugeAlgebra) : + (φ : Module.Dual ℝ 𝔤) : 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 + (ψ : Module.Dual ℝ 𝔤), 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) φ) + @@ -1134,41 +1172,41 @@ lemma iteratedCovDerivAdjoint_fieldStrength_mem_adjoin_symbols exact ⟨p, μ, ψ, rfl⟩ set_option maxHeartbeats 1000000 in -/-- **The classification of invariants**: a gauge-invariant element of the subalgebra +/-- 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 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) +theorem invariant_mem_adjoin_fieldStrength [jets.Free] + (hA : IsGaugeField jets repLorentz repGauge A) (hcomm : ∀ (p q : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) - (φ ψ : Module.Dual ℝ GaugeAlgebra), Commute (A p μ φ) (A q ν ψ)) + (φ ψ : Module.Dual ℝ 𝔤), 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) + (φ : Module.Dual ℝ 𝔤), ∀ y ∈ S, Commute y (A p μ φ)) + (hS : ∀ y ∈ S, ∀ U : jets.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), + (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), b = A p μ φ} ∪ S)) - (hinv : ∀ U : JetGaugeGroupI, repGauge U x = x) : + (hinv : ∀ U : G, repGauge U x = x) : x ∈ Algebra.adjoin ℂ ({b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ GaugeAlgebra), + (φ : Module.Dual ℝ 𝔤), 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), + (φ : Module.Dual ℝ 𝔤), b = iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ} ∪ S), - ∀ U : JetGaugeGroupI.truncationKer 0, repGauge U.1 y = y := by + ∀ U : jets.truncationKer 0, repGauge U.1 y = y := by rintro y (⟨l, ν, lam, φ, rfl⟩ | hyS) U · exact repGauge_iteratedCovDerivAdjoint_fieldStrength_of_mem_truncationKer_zero 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 + have hone : ∀ U : G, 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 @@ -1181,42 +1219,42 @@ theorem invariant_mem_adjoin_fieldStrength -- 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), + ({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤), 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), + (φ : Module.Dual ℝ 𝔤), b = iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ} ∪ S)) → - (∀ U : JetGaugeGroupI.truncationKer 0, repGauge U.1 z = z) → + (∀ U : jets.truncationKer 0, repGauge U.1 z = z) → z ∈ Algebra.adjoin ℂ - ({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra), + ({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤), 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), + (φ : Module.Dual ℝ 𝔤), b = iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ} ∪ S)) := by intro m z hz hzinv - set bv := Module.Free.chooseBasis ℝ GaugeAlgebra with hbv + set bv := Module.Free.chooseBasis ℝ 𝔤 with hbv set R₀ : Subalgebra ℂ B := Algebra.adjoin ℂ - ({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra), + ({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤), 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), + (φ : Module.Dual ℝ 𝔤), 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 := + set Y : Sym (Fin 1 ⊕ Fin 3) (m + 1) × Module.Free.ChooseBasisIndex ℝ 𝔤 → B := 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) × - Module.Free.ChooseBasisIndex ℝ GaugeAlgebra → ℝ, - ∃ U : JetGaugeGroupI.truncationKer 0, - symmetrizedMaurerCartanCoeff U⁻¹ = (fun r => + Module.Free.ChooseBasisIndex ℝ 𝔤 → ℝ, + ∃ U : jets.truncationKer 0, + jets.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 := + jets.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 := + Module.Free.ChooseBasisIndex ℝ 𝔤 → ℝ) → B →+* B := fun t => { toFun := repGauge (Ut t).1 map_one' := hone (Ut t).1 @@ -1232,10 +1270,10 @@ theorem invariant_mem_adjoin_fieldStrength 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 := + jets.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 + have hshift : jets.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] @@ -1257,11 +1295,11 @@ theorem invariant_mem_adjoin_fieldStrength 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 := + jets.adjointDualCoeff ((Ut t).1)⁻¹ x' = 0 := fun x' hx' hxc => hUt2 t x' hx' (by omega) - have hval : bv.coord j (symmetrizedMaurerCartanCoeff (Ut t)⁻¹ + have hval : bv.coord j (jets.symmetrizedMaurerCartanCoeff (Ut t)⁻¹ ⟨(ps : Multiset (Fin 1 ⊕ Fin 3)), hp0⟩) = t (ps, j) := by - have hcoeff : symmetrizedMaurerCartanCoeff (Ut t)⁻¹ + have hcoeff : jets.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] @@ -1278,18 +1316,18 @@ theorem invariant_mem_adjoin_fieldStrength (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 + have hdual : ∀ ψ : Module.Dual ℝ 𝔤, ∑ 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), + have hexpand : ∀ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤), symmetrizedDeriv r A φ = ∑ j, φ (bv j) • symmetrizedDeriv r A (bv.coord j) := by intro r φ - set L : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B := + set L : Module.Dual ℝ 𝔤 →ₗ[ℝ] B := { toFun := fun ψ => symmetrizedDeriv r A ψ, map_add' := fun ψ ψ' => by simp only [symmetrizedDeriv, map_add] @@ -1321,13 +1359,13 @@ theorem invariant_mem_adjoin_fieldStrength · 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), + (c : Module.Dual ℝ 𝔤) (r : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℝ 𝔤), 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) := + (c : Module.Dual ℝ 𝔤) (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 @@ -1357,31 +1395,31 @@ theorem invariant_mem_adjoin_fieldStrength 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), + (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), b = A p μ φ} ∪ ({b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ GaugeAlgebra), + (φ : Module.Dual ℝ 𝔤), 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 ∧ + (φ : Module.Dual ℝ 𝔤), p.card ≤ k ∧ b = A p μ φ} ∪ ({b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ GaugeAlgebra), + (φ : Module.Dual ℝ 𝔤), 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 ∧ + (φ : Module.Dual ℝ 𝔤), r ≠ 0 ∧ r.card ≤ k + 1 ∧ b = symmetrizedDeriv r A φ} ∪ ({b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ GaugeAlgebra), + (φ : Module.Dual ℝ 𝔤), b = iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ} ∪ S)) := by intro k z hzk rw [symbolAdjoin_union_eq_symFieldAdjoin_union k ({b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ GaugeAlgebra), + (φ : Module.Dual ℝ 𝔤), 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) @@ -1391,14 +1429,14 @@ theorem invariant_mem_adjoin_fieldStrength -- 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 ∧ + (φ : Module.Dual ℝ 𝔤), r ≠ 0 ∧ r.card ≤ k ∧ b = symmetrizedDeriv r A φ} ∪ ({b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ GaugeAlgebra), + (φ : Module.Dual ℝ 𝔤), b = iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ} ∪ S)) → - (∀ U : JetGaugeGroupI.truncationKer 0, repGauge U.1 z = z) → + (∀ U : jets.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), + (φ : Module.Dual ℝ 𝔤), b = iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ} ∪ S) := by intro k induction k with @@ -1414,5 +1452,3 @@ theorem invariant_mem_adjoin_fieldStrength exact hiter (n + 1) x (hconv n x hxn) fun U => hinv U.1 end IsGaugeField - -end StandardModel diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/TransformsInAdjoint.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/TransformsInAdjoint.lean index 1518e6b45..e93dcef18 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/TransformsInAdjoint.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/TransformsInAdjoint.lean @@ -51,7 +51,17 @@ 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 jets U⁻¹ p.1 φ)).sum + (s.antidiagonal.map fun p => F p.2 (jets.adjointDualCoeff U⁻¹ p.1 φ)).sum + +/-- An adjoint gauge tensor transforms at the base point through the dual adjoint + coefficient of the value of the gauge jet alone: the antidiagonal of the empty multiset + has a single term. -/ +lemma TransformsInAdjoint.repGauge_zero + {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B} + (hF : TransformsInAdjoint jets repGauge F) (U : G) (φ : Module.Dual ℝ 𝔤) : + repGauge U (F 0 φ) = F 0 (jets.adjointDualCoeff U⁻¹ 0 φ) := by + simpa only [Multiset.antidiagonal_zero, Multiset.map_singleton, Multiset.sum_singleton] + using hF U φ 0 /-- **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 @@ -90,7 +100,7 @@ lemma covDerivAdjoint_apply -/ /-- If `F` transforms in the adjoint, so do its `κ ::ₘ s`-derived symbols with the - extra derivative traced through `adjointDualCoeff_cons`: the Leibniz splittings + extra derivative traced through `LocalGaugeData.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 @@ -100,10 +110,10 @@ lemma TransformsInAdjoint.repGauge_cons (φ : Module.Dual ℝ 𝔤) : repGauge U (F (κ ::ₘ s) φ) = (s.antidiagonal.map fun p => - F (κ ::ₘ p.2) (adjointDualCoeff jets U⁻¹ p.1 φ)).sum + F (κ ::ₘ p.2) (jets.adjointDualCoeff U⁻¹ p.1 φ)).sum - (s.antidiagonal.map fun p => (p.1.antidiagonal.map fun q => - F p.2 (adjointDualCoeff jets U⁻¹ q.2 + F p.2 (jets.adjointDualCoeff U⁻¹ q.2 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie (jets.iteratedDeriv q.1 (jets.maurerCartan U⁻¹ κ)))))).sum).sum := by @@ -111,16 +121,16 @@ lemma TransformsInAdjoint.repGauge_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] have hsec : (Multiset.map (fun p => - F p.2 (adjointDualCoeff jets U⁻¹ (κ ::ₘ p.1) φ)) s.antidiagonal).sum = + F p.2 (jets.adjointDualCoeff U⁻¹ (κ ::ₘ p.1) φ)) s.antidiagonal).sum = -(s.antidiagonal.map fun p => (p.1.antidiagonal.map fun q => - F p.2 (adjointDualCoeff jets U⁻¹ q.2 + F p.2 (jets.adjointDualCoeff U⁻¹ q.2 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie (jets.iteratedDeriv q.1 (jets.maurerCartan 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] + rw [jets.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] @@ -137,16 +147,16 @@ lemma TransformsInAdjoint.repGauge_bracketFamConv (φ : Module.Dual ℝ 𝔤) : repGauge U (bracketFamConv A ρ F s φ) = (s.antidiagonal.map fun p => - bracketFamConv A ρ F p.2 (adjointDualCoeff jets U⁻¹ p.1 φ)).sum + bracketFamConv A ρ F p.2 (jets.adjointDualCoeff U⁻¹ p.1 φ)).sum + (s.antidiagonal.map fun p => (p.2.antidiagonal.map fun r => - F r.2 (adjointDualCoeff jets U⁻¹ r.1 + F r.2 (jets.adjointDualCoeff U⁻¹ r.1 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie (jets.iteratedDeriv p.1 (jets.maurerCartan 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 jets U⁻¹ q.1).sum) ψ + ((u.antidiagonal.map fun q => A q.2 ρ ∘ₗ jets.adjointDualCoeff U⁻¹ q.1).sum) ψ + algebraMap ℂ B (ψ (jets.evalLie (jets.iteratedDeriv u (jets.maurerCartan U⁻¹ ρ)))) := by intro u ψ @@ -154,20 +164,20 @@ lemma TransformsInAdjoint.repGauge_bracketFamConv 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 jets U⁻¹ r.1).sum) ψ + ((u.antidiagonal.map fun r => F r.2 ∘ₗ jets.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 jets U⁻¹ q.1).sum) - ((p.2.antidiagonal.map fun r => F r.2 ∘ₗ adjointDualCoeff jets U⁻¹ r.1).sum) φ).sum = + bracketFam ((p.1.antidiagonal.map fun q => A q.2 ρ ∘ₗ jets.adjointDualCoeff U⁻¹ q.1).sum) + ((p.2.antidiagonal.map fun r => F r.2 ∘ₗ jets.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 jets U⁻¹ q.1) - (F r.2 ∘ₗ adjointDualCoeff jets U⁻¹ r.1) φ).sum).sum).sum := by + bracketFam (A q.2 ρ ∘ₗ jets.adjointDualCoeff U⁻¹ q.1) + (F r.2 ∘ₗ jets.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] @@ -178,12 +188,12 @@ lemma TransformsInAdjoint.repGauge_bracketFamConv 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 jets U⁻¹ p.1 φ)).sum = + bracketFamConv A ρ F p.2 (jets.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 jets U⁻¹ q.1) - (F r.2 ∘ₗ adjointDualCoeff jets U⁻¹ q.2) φ).sum).sum).sum := by + bracketFam (A r.1 ρ ∘ₗ jets.adjointDualCoeff U⁻¹ q.1) + (F r.2 ∘ₗ jets.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 @@ -191,14 +201,14 @@ lemma TransformsInAdjoint.repGauge_bracketFamConv 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 jets U⁻¹ a) - (F d ∘ₗ adjointDualCoeff jets U⁻¹ c) φ).trans hMc.symm) + bracketFam (A b ρ ∘ₗ jets.adjointDualCoeff U⁻¹ a) + (F d ∘ₗ jets.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 jets U⁻¹ r.1).sum) + ((p.2.antidiagonal.map fun r => F r.2 ∘ₗ jets.adjointDualCoeff U⁻¹ r.1).sum) (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie (jets.iteratedDeriv p.1 (jets.maurerCartan U⁻¹ ρ)))) = (p.2.antidiagonal.map fun r => - F r.2 (adjointDualCoeff jets U⁻¹ r.1 + F r.2 (jets.adjointDualCoeff U⁻¹ r.1 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie (jets.iteratedDeriv p.1 (jets.maurerCartan U⁻¹ ρ)))))).sum := by intro p @@ -233,28 +243,28 @@ theorem TransformsInAdjoint.covDerivAdjoint 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 jets U⁻¹ p.1 φ)).sum = + IsGaugeField.covDerivAdjoint A F ρ p.2 (jets.adjointDualCoeff U⁻¹ p.1 φ)).sum = (s.antidiagonal.map fun p => - F (ρ ::ₘ p.2) (adjointDualCoeff jets U⁻¹ p.1 φ)).sum + F (ρ ::ₘ p.2) (jets.adjointDualCoeff U⁻¹ p.1 φ)).sum + (s.antidiagonal.map fun p => - bracketFamConv A ρ F p.2 (adjointDualCoeff jets U⁻¹ p.1 φ)).sum := by + bracketFamConv A ρ F p.2 (jets.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 jets U⁻¹ q.2 + F p.2 (jets.adjointDualCoeff U⁻¹ q.2 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie (jets.iteratedDeriv q.1 (jets.maurerCartan U⁻¹ ρ)))))).sum).sum = (s.antidiagonal.map fun p => (p.2.antidiagonal.map fun r => - F r.2 (adjointDualCoeff jets U⁻¹ r.1 + F r.2 (jets.adjointDualCoeff U⁻¹ r.1 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie (jets.iteratedDeriv p.1 (jets.maurerCartan U⁻¹ ρ)))))).sum).sum := Multiset.sum_antidiagonal_assoc s (fun a b c => - F c (adjointDualCoeff jets U⁻¹ b + F c (jets.adjointDualCoeff U⁻¹ b (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie (jets.iteratedDeriv a (jets.maurerCartan U⁻¹ ρ)))))) rw [hL, hF.repGauge_cons U ρ s φ, hF.repGauge_bracketFamConv hA U s ρ φ, diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/AdjointCoeff.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/AdjointCoeff.lean new file mode 100644 index 000000000..cfbb2e3ca --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/AdjointCoeff.lean @@ -0,0 +1,322 @@ +/- +Copyright (c) 2026 Joseph Tooby-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.LocalGaugeData.Basic +/-! +# The Taylor coefficients of the adjoint action + +## i. Overview + +A gauge jet `U` acts on the gauge algebra of jets by the adjoint action `Ad_U`. What the +transformation law of a gauge field `A_μ ↦ Ad_U A_μ + ω_μ(U)` sees of `Ad_U`, after +differentiating `x` times and evaluating at the base point, is the physicists' +`∂_x (Ad_U)^a_b|₀`: a linear map `adjointCoeff U x : 𝔤 →ₗ[ℝ] 𝔤` on the constant gauge +algebra, and its transpose `adjointDualCoeff U x` on the dual index carried by the field +symbols. This file develops these coefficients for any package `jets`. + +The central result is the Taylor–Leibniz theorem `evalLie_iteratedDeriv_adjoint`: the +base-point Taylor coefficients of `Ad_U Y` for an arbitrary jet `Y` are the antidiagonal +convolution of the coefficients of `Ad_U` with those of `Y`. For a matrix group it is the +Leibniz rule for products of matrices of power series; here it is derived from the Leibniz +rule `deriv_adjoint` for a single derivative, by induction on the number of derivatives. +Its corollaries are the multiplicativity `adjointCoeff_mul` of the coefficients up to +convolution, and the recursion `adjointCoeff_cons` expressing one more derivative of a +coefficient through the Maurer–Cartan form. + +## ii. Key results + +- `LocalGaugeData.adjointCoeff` : the coefficient `∂_x (Ad_U)|₀`, with its values + `adjointCoeff_zero` at the base point and `adjointCoeff_one` on the identity jet. +- `LocalGaugeData.adjointCoeff_cons` : one more derivative of a coefficient is minus the + antidiagonal convolution of `ad` of the derived Maurer–Cartan form against lower + coefficients. +- `LocalGaugeData.evalLie_iteratedDeriv_adjoint` : the Taylor–Leibniz theorem. +- `LocalGaugeData.adjointCoeff_mul` : the coefficients of a product are the convolution + of the coefficients of the factors. +- `LocalGaugeData.adjointDualCoeff` : the transposed coefficients, with + `adjointDualCoeff_singleton`, `adjointDualCoeff_pair` and `adjointDualCoeff_cons`. + +## iii. Table of contents + +- A. The adjoint Taylor coefficients +- B. The recursion through the Maurer–Cartan form +- C. The Taylor–Leibniz theorem +- D. The dual coefficients + +-/ + +@[expose] public section + +namespace LocalGaugeData + +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + (jets : LocalGaugeData G 𝔤 G₀ 𝔤J) + +/-! + +## A. The adjoint Taylor coefficients + +-/ + +/-- The physicists' `∂_x (Ad_U)^a_b|₀`: include a constant gauge algebra element into + jets, act by the adjoint of `U`, differentiate `x` times, and evaluate at the base + point. For `x = 0` this is the adjoint action of the value of `U`; for `x ≠ 0` it sees + the derivatives of the gauge transformation. -/ +noncomputable def adjointCoeff (U : G) (x : Multiset (Fin 1 ⊕ Fin 3)) : 𝔤 →ₗ[ℝ] 𝔤 := + jets.evalLie.toLinearMap ∘ₗ jets.iteratedDeriv x ∘ₗ jets.adjoint U ∘ₗ jets.ofConstantLie + +lemma adjointCoeff_apply (U : G) (x : Multiset (Fin 1 ⊕ Fin 3)) (a : 𝔤) : + jets.adjointCoeff U x a = + jets.evalLie (jets.iteratedDeriv x (jets.adjoint U (jets.ofConstantLie a))) := rfl + +/-- The zeroth coefficient is the adjoint action of the value of the jet. -/ +@[simp] +lemma adjointCoeff_zero (U : G) : jets.adjointCoeff U 0 = jets.adjointValue (jets.eval U) := by + refine LinearMap.ext fun a => ?_ + rw [adjointCoeff_apply, iteratedDeriv_zero, LinearMap.id_apply, evalLie_adjoint_ofConstantLie] + +/-- A jet with trivial value has trivial zeroth coefficient. -/ +lemma adjointCoeff_zero_of_eval_eq_one {U : G} (hU : jets.eval U = 1) : + jets.adjointCoeff U 0 = LinearMap.id := by + rw [adjointCoeff_zero, hU, map_one, Module.End.one_eq_id] + +/-- The coefficients of the identity jet: only the base point survives. -/ +lemma adjointCoeff_one (p : Multiset (Fin 1 ⊕ Fin 3)) : + jets.adjointCoeff (1 : G) p = if p = 0 then LinearMap.id else 0 := by + refine LinearMap.ext fun a => ?_ + rw [adjointCoeff_apply, map_one, Module.End.one_apply] + rcases eq_or_ne p 0 with rfl | hp + · rw [iteratedDeriv_zero, LinearMap.id_apply, evalLie_ofConstantLie, if_pos rfl, + LinearMap.id_apply] + · rw [jets.iteratedDeriv_ofConstantLie_of_ne_zero hp, map_zero, if_neg hp, + LinearMap.zero_apply] + +/-- The coefficients are derivations of the bracket up to convolution, by the iterated + Leibniz rule for the jet bracket. -/ +lemma adjointCoeff_lie (U : G) (x : Multiset (Fin 1 ⊕ Fin 3)) (a b : 𝔤) : + jets.adjointCoeff U x ⁅a, b⁆ = + (x.antidiagonal.map fun p => ⁅jets.adjointCoeff U p.1 a, jets.adjointCoeff U p.2 b⁆).sum := by + simp only [adjointCoeff_apply] + rw [jets.ofConstantLie_lie, jets.adjoint_lie, 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]) + +/-! + +## B. The recursion through the Maurer–Cartan form + +-/ + +/-- One derivative of the adjoint action on a constant is minus the bracket with the + Maurer–Cartan form: the Leibniz rule `deriv_adjoint` with the constant's derivative + killed. -/ +lemma deriv_adjoint_ofConstantLie (U : G) (μ : Fin 1 ⊕ Fin 3) (a : 𝔤) : + jets.deriv μ (jets.adjoint U (jets.ofConstantLie a)) = + -⁅jets.maurerCartan U μ, jets.adjoint U (jets.ofConstantLie a)⁆ := by + rw [jets.deriv_adjoint, jets.deriv_ofConstantLie, map_zero, zero_sub] + +/-- One more derivative of a coefficient: differentiating the adjoint once produces minus + `ad` of the Maurer–Cartan form, and the remaining derivatives distribute over the bracket + by the Leibniz rule. -/ +lemma adjointCoeff_cons (U : G) (μ : Fin 1 ⊕ Fin 3) (x : Multiset (Fin 1 ⊕ Fin 3)) : + jets.adjointCoeff U (μ ::ₘ x) = + -((x.antidiagonal.map fun p => + LieAlgebra.ad ℝ 𝔤 (jets.evalLie (jets.iteratedDeriv p.1 (jets.maurerCartan U μ))) ∘ₗ + jets.adjointCoeff U p.2).sum) := by + refine LinearMap.ext fun a => ?_ + rw [adjointCoeff_apply, iteratedDeriv_cons_eq_comp_deriv, LinearMap.comp_apply, + deriv_adjoint_ofConstantLie, map_neg, iteratedDeriv_bracket, map_neg, map_multiset_sum, + Multiset.map_map, LinearMap.neg_apply, 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, LinearMap.comp_apply, LieHom.map_lie, LieAlgebra.ad_apply, + adjointCoeff_apply] + +/-! + +## C. The Taylor–Leibniz theorem + +-/ + +/-- The inductive step of the Taylor–Leibniz theorem: the rule for `μ ::ₘ s` derivatives + follows from the rule for every sub-multiset of `s`. Peeling off `∂_μ` by the Leibniz + rule `deriv_adjoint` leaves `Ad_U (∂_μ Y)`, handled by the rule for `s`, and a bracket + with the Maurer–Cartan form, handled by the rule for the parts of `s`; on the other side + the coefficients at `μ ::ₘ p` unfold by `adjointCoeff_cons`, and the two triple sums + agree by coassociativity of the antidiagonal. -/ +lemma evalLie_iteratedDeriv_adjoint_cons (U : G) (μ : Fin 1 ⊕ Fin 3) + (s : Multiset (Fin 1 ⊕ Fin 3)) (Y : 𝔤J) + (ih : ∀ t ≤ s, ∀ Z : 𝔤J, jets.evalLie (jets.iteratedDeriv t (jets.adjoint U Z)) = + (t.antidiagonal.map fun p => + jets.adjointCoeff U p.1 (jets.evalLie (jets.iteratedDeriv p.2 Z))).sum) : + jets.evalLie (jets.iteratedDeriv (μ ::ₘ s) (jets.adjoint U Y)) = + ((μ ::ₘ s).antidiagonal.map fun p => + jets.adjointCoeff U p.1 (jets.evalLie (jets.iteratedDeriv p.2 Y))).sum := by + have hL : jets.evalLie (jets.iteratedDeriv (μ ::ₘ s) (jets.adjoint U Y)) = + (s.antidiagonal.map fun p => + jets.adjointCoeff U p.1 (jets.evalLie (jets.iteratedDeriv (μ ::ₘ p.2) Y))).sum + - (s.antidiagonal.map fun p => (p.2.antidiagonal.map fun q => + ⁅jets.evalLie (jets.iteratedDeriv p.1 (jets.maurerCartan U μ)), + jets.adjointCoeff U q.1 (jets.evalLie (jets.iteratedDeriv q.2 Y))⁆).sum).sum := by + rw [iteratedDeriv_cons_eq_comp_deriv, LinearMap.comp_apply, jets.deriv_adjoint, map_sub, + map_sub, ih s le_rfl, iteratedDeriv_bracket, map_multiset_sum, Multiset.map_map] + congr 1 + · refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) + rw [iteratedDeriv_cons_eq_comp_deriv, LinearMap.comp_apply] + · refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) + rw [Function.comp_apply, LieHom.map_lie, ih p.2 (Multiset.snd_le_of_mem_antidiagonal hp), + ← LieAlgebra.ad_apply (R := ℝ), map_multiset_sum, Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun q hq => ?_) + simp only [Function.comp_apply, LieAlgebra.ad_apply] + have hR : ((μ ::ₘ s).antidiagonal.map fun p => + jets.adjointCoeff U p.1 (jets.evalLie (jets.iteratedDeriv p.2 Y))).sum = + (s.antidiagonal.map fun p => + jets.adjointCoeff U p.1 (jets.evalLie (jets.iteratedDeriv (μ ::ₘ p.2) Y))).sum + - (s.antidiagonal.map fun p => (p.1.antidiagonal.map fun q => + ⁅jets.evalLie (jets.iteratedDeriv q.1 (jets.maurerCartan U μ)), + jets.adjointCoeff U q.2 (jets.evalLie (jets.iteratedDeriv p.2 Y))⁆).sum).sum := by + rw [Multiset.antidiagonal_cons, Multiset.map_add, Multiset.sum_add, Multiset.map_map, + Multiset.map_map, sub_eq_add_neg, ← Multiset.sum_map_neg''] + congr 1 + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) + rw [Function.comp_apply, Prod.map_fst, Prod.map_snd, id_eq, adjointCoeff_cons, + LinearMap.neg_apply, Multiset.sum_linearMap_apply, Multiset.map_map] + refine congrArg Neg.neg (congrArg Multiset.sum (Multiset.map_congr rfl fun q hq => ?_)) + rw [Function.comp_apply, LinearMap.comp_apply, LieAlgebra.ad_apply] + rw [hL, hR] + congr 1 + exact (Multiset.sum_antidiagonal_assoc s fun a b c => + ⁅jets.evalLie (jets.iteratedDeriv a (jets.maurerCartan U μ)), + jets.adjointCoeff U b (jets.evalLie (jets.iteratedDeriv c Y))⁆).symm + +/-- The Taylor–Leibniz theorem for the adjoint action: the base-point Taylor coefficients + of `Ad_U Y` are the antidiagonal convolution of the coefficients `adjointCoeff U` of + `Ad_U` with those of `Y`. For a matrix group this is the Leibniz rule for products of + matrices of power series; here it follows from the single-derivative Leibniz rule + `deriv_adjoint` by strong induction on the number of derivatives. -/ +theorem evalLie_iteratedDeriv_adjoint (U : G) (x : Multiset (Fin 1 ⊕ Fin 3)) (Y : 𝔤J) : + jets.evalLie (jets.iteratedDeriv x (jets.adjoint U Y)) = + (x.antidiagonal.map fun p => + jets.adjointCoeff U p.1 (jets.evalLie (jets.iteratedDeriv p.2 Y))).sum := by + suffices h : ∀ (n : ℕ) (x : Multiset (Fin 1 ⊕ Fin 3)), x.card = n → ∀ Y : 𝔤J, + jets.evalLie (jets.iteratedDeriv x (jets.adjoint U Y)) = + (x.antidiagonal.map fun p => + jets.adjointCoeff U p.1 (jets.evalLie (jets.iteratedDeriv p.2 Y))).sum from + h x.card x rfl Y + intro n + induction n using Nat.strong_induction_on with + | _ n ih => + intro x hx Y + rcases eq_or_ne x 0 with rfl | hx0 + · simp [Multiset.antidiagonal_zero, jets.evalLie_adjoint] + · obtain ⟨μ, hμ⟩ := Multiset.card_pos_iff_exists_mem.mp (Multiset.card_pos.mpr hx0) + rw [← Multiset.cons_erase hμ] + refine jets.evalLie_iteratedDeriv_adjoint_cons U μ (x.erase μ) Y fun t ht Z => ?_ + refine ih t.card ?_ t rfl Z + have h1 := Multiset.card_le_card ht + have h2 := Multiset.card_erase_lt_of_mem hμ + omega + +/-- The base-point Taylor data of `Ad_U Y` vanish up to a given order whenever those of + `Y` do. -/ +lemma evalLie_iteratedDeriv_adjoint_eq_zero (U : G) {Y : 𝔤J} {s : Multiset (Fin 1 ⊕ Fin 3)} + (h : ∀ q ≤ s, jets.evalLie (jets.iteratedDeriv q Y) = 0) : + jets.evalLie (jets.iteratedDeriv s (jets.adjoint U Y)) = 0 := by + rw [evalLie_iteratedDeriv_adjoint] + refine Multiset.sum_eq_zero fun z hz => ?_ + obtain ⟨p, hp, rfl⟩ := Multiset.mem_map.mp hz + rw [h p.2 (Multiset.snd_le_of_mem_antidiagonal hp), map_zero] + +/-- The coefficients are multiplicative up to convolution: the coefficient of a product of + jets is the antidiagonal convolution of the coefficients of the factors. -/ +lemma adjointCoeff_mul (U V : G) (x : Multiset (Fin 1 ⊕ Fin 3)) : + jets.adjointCoeff (U * V) x = + (x.antidiagonal.map fun p => jets.adjointCoeff U p.1 ∘ₗ jets.adjointCoeff V p.2).sum := by + refine LinearMap.ext fun a => ?_ + rw [Multiset.sum_linearMap_apply, Multiset.map_map, adjointCoeff_apply, map_mul, + Module.End.mul_apply, evalLie_iteratedDeriv_adjoint] + exact congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => by + rw [Function.comp_apply, LinearMap.comp_apply] + rfl) + +/-! + +## D. The dual coefficients + +-/ + +/-- The physicists' `∂_x (Ad_U)^a_b|₀` acting on the dual adjoint index of a gauge-field + symbol: the transpose of `adjointCoeff U x`. -/ +noncomputable def adjointDualCoeff (U : G) (x : Multiset (Fin 1 ⊕ Fin 3)) : + Module.Dual ℝ 𝔤 →ₗ[ℝ] Module.Dual ℝ 𝔤 := + (jets.adjointCoeff U x).dualMap + +lemma adjointDualCoeff_apply (U : G) (x : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤) + (a : 𝔤) : jets.adjointDualCoeff U x φ a = φ (jets.adjointCoeff U x a) := rfl + +/-- The zeroth dual coefficient is the dual of the adjoint action of the value of the + jet. -/ +lemma adjointDualCoeff_zero (U : G) : + jets.adjointDualCoeff U 0 = (jets.adjointValue (jets.eval U)).dualMap := by + rw [adjointDualCoeff, adjointCoeff_zero] + +/-- A jet with trivial value has trivial zeroth dual coefficient. -/ +lemma adjointDualCoeff_zero_of_eval_eq_one {U : G} (hU : jets.eval U = 1) : + jets.adjointDualCoeff U 0 = LinearMap.id := by + rw [adjointDualCoeff, jets.adjointCoeff_zero_of_eval_eq_one hU, LinearMap.dualMap_id] + +/-- The dual form of `adjointCoeff_cons`: one more derivative of a dual coefficient is + minus the antidiagonal convolution of lower dual coefficients against `ad` of the derived + Maurer–Cartan form. -/ +lemma adjointDualCoeff_cons (U : G) (μ : Fin 1 ⊕ Fin 3) (x : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℝ 𝔤) : + jets.adjointDualCoeff U (μ ::ₘ x) φ = + -((x.antidiagonal.map fun p => + jets.adjointDualCoeff U p.2 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 + (jets.evalLie (jets.iteratedDeriv p.1 (jets.maurerCartan U μ))))).sum) := by + refine LinearMap.ext fun a => ?_ + rw [adjointDualCoeff_apply, adjointCoeff_cons, LinearMap.neg_apply, map_neg, + Multiset.sum_linearMap_apply, Multiset.map_map, map_multiset_sum, Multiset.map_map, + LinearMap.neg_apply, Multiset.sum_linearMap_apply, Multiset.map_map] + refine congrArg Neg.neg (congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_)) + rfl + +/-- The dual coefficient at a single derivative is minus the underived coefficient + precomposed with `ad` of the base-point Maurer–Cartan form. This is what cancels the + Leibniz cross terms of the gauge law against the commutator cross terms in the field + strength. -/ +lemma adjointDualCoeff_singleton (U : G) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + jets.adjointDualCoeff U {μ} φ = + -jets.adjointDualCoeff U 0 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 + (jets.evalLie (jets.maurerCartan U μ))) := by + rw [show ({μ} : Multiset (Fin 1 ⊕ Fin 3)) = μ ::ₘ 0 from rfl, adjointDualCoeff_cons] + simp [Multiset.antidiagonal_zero] + +/-- The dual coefficient at two derivatives: the underived coefficient against `ad` of the + derived Maurer–Cartan form, and the once-derived coefficient against `ad` of the + Maurer–Cartan form itself. -/ +lemma adjointDualCoeff_pair (U : G) (ρ μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + jets.adjointDualCoeff U (ρ ::ₘ {μ}) φ = + -jets.adjointDualCoeff U 0 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 + (jets.evalLie (jets.deriv ρ (jets.maurerCartan U μ)))) + - jets.adjointDualCoeff U {ρ} (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 + (jets.evalLie (jets.maurerCartan 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 + rw [show (ρ ::ₘ {μ} : Multiset (Fin 1 ⊕ Fin 3)) = μ ::ₘ {ρ} from Multiset.cons_swap ρ μ 0, + adjointDualCoeff_cons, hanti] + simp only [Multiset.insert_eq_cons, Multiset.map_cons, Multiset.map_singleton, + Multiset.sum_cons, Multiset.sum_singleton, iteratedDeriv_zero, iteratedDeriv_singleton, + LinearMap.id_apply] + abel + +end LocalGaugeData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Basic.lean index ecd66d939..8b204f110 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Basic.lean @@ -8,6 +8,7 @@ module public import Mathlib.Algebra.Lie.Basic public import Mathlib.RepresentationTheory.Basic public import Mathlib.Algebra.Group.Subgroup.Basic +public import Physlib.Mathematics.MultisetAntidiagonal public import Physlib.Relativity.DerivAlgebra /-! # Local gauge data @@ -26,9 +27,18 @@ this situation that the transformation laws of gauge fields and matter fields us 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 `maurerCartan U μ = i (∂_μ U) U⁻¹`, with its flatness equation - `maurerCartan_structure` and the Leibniz rule `deriv_adjoint` for the adjoint action. +* the adjoint action of `G` on `𝔤J`, by Lie algebra automorphisms, evaluating at the base + point to the adjoint action of `G₀` on `𝔤`; +* the Maurer–Cartan form `maurerCartan U μ = i (∂_μ U) U⁻¹`, with its cocycle law, its + flatness equation `maurerCartan_structure` and the Leibniz rule `deriv_adjoint` for the + adjoint action. + +Everything else — the Taylor coefficients of the adjoint action, the truncation filtration +of `G`, the symmetrized Maurer–Cartan form — is *derived* from these laws in the sibling +files of this folder. Two further properties, which are true of any honest jet group but are +not consequences of the transformation laws, are collected in the mixin `Faithful`: an +element of `𝔤J` is determined by its base-point Taylor data, and a jet with vanishing +Maurer–Cartan form is constant. A term `jets : LocalGaugeData G 𝔤 G₀ 𝔤J` is supplied, not inferred: every construction below, and every construction downstream, takes the package it works over as an ordinary @@ -44,23 +54,35 @@ depends on that choice. ## ii. Key results - `LocalGaugeData` : the structure. -- `LocalGaugeData.iteratedDeriv` : the iterated derivative `∂_s` on `𝔤J` along a multiset - of directions, with `iteratedDeriv_cons`, `iteratedDeriv_add` and the iterated Leibniz - rule `iteratedDeriv_bracket`. +- `LocalGaugeData.maurerCartan_one`, `LocalGaugeData.maurerCartan_inv` : the values of the + Maurer–Cartan form on the identity and on inverses, from the cocycle law. - `LocalGaugeData.maurerCartan_eq_of_deriv_adjoint` : the Maurer–Cartan form is determined by the Leibniz rule `deriv_adjoint` up to the centre of `𝔤J`, and so is genuine data only because that centre can be nonzero. -- `LocalGaugeDataLeibniz` : the Taylor–Leibniz rule for the adjoint action of a given - package, the input to the gauge action on the algebra of gauge-boson symbols. -- `LocalGaugeDataTruncation` : 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. +- `LocalGaugeData.iteratedDeriv` : the iterated derivative `∂_s` on `𝔤J` along a multiset + of directions, with `iteratedDeriv_cons`, `iteratedDeriv_add` and the iterated Leibniz + rule `iteratedDeriv_bracket`. +- `LocalGaugeData.Faithful` : the jets are determined by their base-point Taylor data. + +## iii. Table of contents + +- A. The structure +- B. First consequences of the laws +- C. The iterated derivative +- D. Faithful packages -/ @[expose] public section -/-- **Local gauge data.** 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 +/-! + +## A. The structure + +-/ + +/-- Local gauge data. 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. @@ -79,6 +101,7 @@ structure LocalGaugeData (G : Type) [Group G] (𝔤 : Type) [LieRing 𝔤] [LieA /-- A constant Lie algebra element as a jet. -/ ofConstantLie : 𝔤 →ₗ[ℝ] 𝔤J ofConstantLie_lie : ∀ a b, ofConstantLie ⁅a, b⁆ = ⁅ofConstantLie a, ofConstantLie b⁆ + evalLie_ofConstantLie : ∀ a, evalLie (ofConstantLie a) = a /-- 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) @@ -88,9 +111,12 @@ structure LocalGaugeData (G : Type) [Group G] (𝔤 : Type) [LieRing 𝔤] [LieA /-- 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 adjoint representation of the value group on its Lie algebra. -/ + adjointValue : Representation ℝ G₀ 𝔤 + /-- At the base point the adjoint action of a jet is the adjoint action of its value. -/ + evalLie_adjoint : ∀ (U : G) (x : 𝔤J), evalLie (adjoint U x) = adjointValue (eval U) (evalLie x) /-- The Maurer–Cartan form `i (∂_μ U) U⁻¹` of a gauge jet. -/ maurerCartan : G → (Fin 1 ⊕ Fin 3) → 𝔤J - maurerCartan_one : ∀ μ, maurerCartan 1 μ = 0 /-- A constant gauge transformation has vanishing Maurer–Cartan form: it has no spacetime dependence to differentiate. -/ maurerCartan_ofConstant : ∀ (g : G₀) (μ : Fin 1 ⊕ Fin 3), maurerCartan (ofConstant g) μ = 0 @@ -104,12 +130,6 @@ structure LocalGaugeData (G : Type) [Group G] (𝔤 : Type) [LieRing 𝔤] [LieA /-- 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) - ⁅maurerCartan 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 LocalGaugeData @@ -117,18 +137,39 @@ variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] (jets : LocalGaugeData G 𝔤 G₀ 𝔤J) -/-- A constant jet evaluates to its constant. -/ -lemma evalLie_ofConstantLie (a : 𝔤) : jets.evalLie (jets.ofConstantLie a) = a := by - have h := jets.evalLie_adjoint_ofConstantLie 1 a - simp only [map_one, Module.End.one_apply] at h - exact h +/-! + +## B. First consequences of the laws + +-/ + +/-- The Maurer–Cartan form of the identity vanishes: the cocycle law at `1 * 1 = 1`. -/ +@[simp] +lemma maurerCartan_one (μ : Fin 1 ⊕ Fin 3) : jets.maurerCartan 1 μ = 0 := by + have h := jets.maurerCartan_cocycle 1 1 μ + rw [one_mul, map_one, Module.End.one_apply] at h + exact add_left_cancel (h.symm.trans (add_zero _).symm) + +/-- The Maurer–Cartan form of an inverse: `ω_μ(U⁻¹) = − Ad_{U⁻¹} ω_μ(U)`, the cocycle + law applied to `U⁻¹ U = 1`. -/ +lemma maurerCartan_inv (U : G) (μ : Fin 1 ⊕ Fin 3) : + jets.maurerCartan U⁻¹ μ = - jets.adjoint U⁻¹ (jets.maurerCartan U μ) := by + have h := jets.maurerCartan_cocycle U⁻¹ U μ + rw [inv_mul_cancel, jets.maurerCartan_one] at h + exact eq_neg_of_add_eq_zero_left h.symm + +/-- At the base point, the adjoint action of a jet on a constant is the adjoint action of + its value. -/ +lemma evalLie_adjoint_ofConstantLie (U : G) (a : 𝔤) : + jets.evalLie (jets.adjoint U (jets.ofConstantLie a)) = jets.adjointValue (jets.eval U) a := by + rw [jets.evalLie_adjoint, jets.evalLie_ofConstantLie] /-- A jet with trivial value acts trivially on constants at the base point. -/ lemma evalLie_adjoint_ofConstantLie_of_eval_eq_one {U : G} (hU : jets.eval U = 1) (a : 𝔤) : jets.evalLie (jets.adjoint U (jets.ofConstantLie a)) = a := by rw [evalLie_adjoint_ofConstantLie, hU, map_one, Module.End.one_apply] -/-- **The Maurer–Cartan form is determined by the Leibniz rule, up to the centre.** Since +/-- The Maurer–Cartan form is determined by the Leibniz rule, up to the centre. Since `adjoint U` is invertible, `deriv_adjoint` says exactly that the inner derivation `⁅maurerCartan U μ, ·⁆` is `adjoint U ∘ deriv μ ∘ adjoint U⁻¹ − deriv μ`; so any other form obeying the same rule differs from it by something acting trivially in the adjoint @@ -154,7 +195,7 @@ lemma maurerCartan_eq_of_deriv_adjoint /-! -## A. The iterated derivative +## C. The iterated derivative -/ @@ -206,6 +247,14 @@ lemma iteratedDeriv_singleton (μ : Fin 1 ⊕ Fin 3) : rw [show ({μ} : Multiset (Fin 1 ⊕ Fin 3)) = μ ::ₘ 0 from rfl, iteratedDeriv_cons, iteratedDeriv_zero, LinearMap.comp_id] +/-- Since derivatives commute, the direction added by `cons` may be taken first as well + as last. -/ +lemma iteratedDeriv_cons_eq_comp_deriv (μ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : + jets.iteratedDeriv (μ ::ₘ s) = (jets.iteratedDeriv s).comp (jets.deriv μ) := by + rw [show (μ ::ₘ s : Multiset (Fin 1 ⊕ Fin 3)) = s + {μ} from by + rw [add_comm, Multiset.singleton_add], + iteratedDeriv_add, iteratedDeriv_singleton] + /-- 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) : @@ -230,7 +279,7 @@ lemma iteratedDeriv_bracket (s : Multiset (Fin 1 ⊕ Fin 3)) (a b : 𝔤J) : Multiset.map_map, Function.comp_apply, Prod.map_fst, Prod.map_snd, id_eq] abel -/-- **The base-point Taylor data of a bracket is determined by that of its arguments.** +/-- The base-point Taylor data of a bracket is determined by that of its arguments. If the base-point values of the iterated derivatives of `a` and `b` along sub-multisets of `w` agree with those of `a'` and `b'`, then so do those of the brackets: the iterated Leibniz rule expands the bracket over the antidiagonal of `w`, whose parts are all @@ -245,11 +294,9 @@ lemma evalLie_iteratedDeriv_bracket_congr (w : Multiset (Fin 1 ⊕ Fin 3)) (a b rw [iteratedDeriv_bracket, iteratedDeriv_bracket, map_multiset_sum, map_multiset_sum, Multiset.map_map, Multiset.map_map] refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) - have hw := Multiset.mem_antidiagonal.mp hp - have h1 : p.1 ≤ w := Multiset.le_iff_exists_add.mpr ⟨p.2, hw.symm⟩ - have h2 : p.2 ≤ w := Multiset.le_iff_exists_add.mpr ⟨p.1, by rw [← hw, add_comm]⟩ simp only [Function.comp_apply] - rw [LieHom.map_lie, LieHom.map_lie, ha p.1 h1, hb p.2 h2] + rw [LieHom.map_lie, LieHom.map_lie, ha p.1 (Multiset.fst_le_of_mem_antidiagonal hp), + hb p.2 (Multiset.snd_le_of_mem_antidiagonal hp)] /-- The iterated derivative of a constant jet vanishes for a nonempty multiset of directions. -/ @@ -265,50 +312,42 @@ lemma iteratedDeriv_ofConstantLie_of_ne_zero {p : Multiset (Fin 1 ⊕ Fin 3)} (h TODO "Add product of LocalGaugeData." -end LocalGaugeData - /-! -## B. The Taylor–Leibniz rule for the adjoint action - --/ - -/-- **The Taylor–Leibniz rule for the adjoint action** of a local-gauge-data package `jets`: 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. - - It is an extra law of one package, so `jets` is its only explicit parameter and the - carriers are read off from it. -/ -class LocalGaugeDataLeibniz {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - (jets : LocalGaugeData G 𝔤 G₀ 𝔤J) where - evalLie_iteratedDeriv_adjoint : ∀ (U : G) (x : Multiset (Fin 1 ⊕ Fin 3)) (Y : 𝔤J), - jets.evalLie (jets.iteratedDeriv x (jets.adjoint U Y)) - = (x.antidiagonal.map fun p => jets.evalLie (jets.iteratedDeriv p.1 - (jets.adjoint U (jets.ofConstantLie - (jets.evalLie (jets.iteratedDeriv p.2 Y)))))).sum +## D. Faithful packages -/-! - -## C. Truncation +The transformation laws never ask that the jets be *honest* jets: nothing in the structure +prevents `𝔤J` from carrying elements invisible to every base-point derivative. The two laws +below say that it does not, and together they make a pure jet (`eval U = 1`) recoverable +from its Maurer–Cartan form; see `LocalGaugeData.maurerCartan_injOn_truncationKer_zero`. +They hold for the full jet group of any matrix group and for its truncations, but are +recorded separately from the structure because the covariance theory does not need them. -/ -/-- **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. - - Like `LocalGaugeDataLeibniz` this is an extra law of one package `jets`, its only explicit - parameter. -/ -class LocalGaugeDataTruncation {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - (jets : LocalGaugeData 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 : 𝔤, jets.evalLie (jets.iteratedDeriv x (jets.adjoint U (jets.ofConstantLie b))) = 0 +/-- A package is faithful when an element of `𝔤J` is determined by the base-point values + of its iterated derivatives (Taylor determinacy) and a jet with vanishing Maurer–Cartan + form is the constant jet of its value. -/ +class Faithful (jets : LocalGaugeData G 𝔤 G₀ 𝔤J) : Prop where + ext_of_evalLie_iteratedDeriv : ∀ {x y : 𝔤J}, + (∀ s : Multiset (Fin 1 ⊕ Fin 3), + jets.evalLie (jets.iteratedDeriv s x) = jets.evalLie (jets.iteratedDeriv s y)) → x = y + eq_ofConstant_of_maurerCartan_eq_zero : ∀ {U : G}, + jets.maurerCartan U = 0 → U = jets.ofConstant (jets.eval U) + +/-- Taylor determinacy of a faithful package, in the form of an extensionality lemma. -/ +lemma ext_of_evalLie_iteratedDeriv [jets.Faithful] {x y : 𝔤J} + (h : ∀ s : Multiset (Fin 1 ⊕ Fin 3), + jets.evalLie (jets.iteratedDeriv s x) = jets.evalLie (jets.iteratedDeriv s y)) : + x = y := + Faithful.ext_of_evalLie_iteratedDeriv h + +/-- In a faithful package, the Maurer–Cartan form vanishes exactly on the constant jets. -/ +lemma maurerCartan_eq_zero_iff [jets.Faithful] (U : G) : + jets.maurerCartan U = 0 ↔ U = jets.ofConstant (jets.eval U) := by + refine ⟨Faithful.eq_ofConstant_of_maurerCartan_eq_zero, fun h => ?_⟩ + funext μ + rw [h, jets.maurerCartan_ofConstant] + rfl + +end LocalGaugeData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/InfinitesimalAction.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/InfinitesimalAction.lean index b2a6bc9f9..f4b0276b3 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/InfinitesimalAction.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/InfinitesimalAction.lean @@ -77,10 +77,10 @@ variable {A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual * `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`); + adjoint representation this is `LocalGaugeData.adjointCoeff_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 + is `LocalGaugeData.adjointCoeff_lie`); 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 @@ -96,11 +96,11 @@ structure IsInfinitesimalActionOf (jets : LocalGaugeData G 𝔤 G₀ 𝔤J) repCoeff_act : ∀ (U : G) (x : Multiset (Fin 1 ⊕ Fin 3)) (c : 𝔤), repCoeff rep U x ∘ₗ act c = ((x.antidiagonal.map fun p => - act (adjointCoeff jets U p.1 c) ∘ₗ repCoeff rep U p.2).sum) + act (jets.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`. -/ + derived Maurer–Cartan form — the analogue of `LocalGaugeData.adjointDualCoeff_cons`. -/ lemma IsInfinitesimalActionOf.repDualCoeff_cons {act : 𝔤 →ₗ[ℝ] V →ₗ[ℂ] V} {rep : Representation ℂ G (JetRing ⊗[ℂ] V)} @@ -143,11 +143,11 @@ lemma IsInfinitesimalActionOf.actionFam_repDualCoeff (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 jets U p.1) + actionFam act (f ∘ₗ jets.adjointDualCoeff U p.1) (g ∘ₗ repDualCoeff rep U p.2) φ).sum := by have hT : ∀ (c : 𝔤) (v : V), repCoeff rep U x (act c v) = (x.antidiagonal.map fun p => - act (adjointCoeff jets U p.1 c) (repCoeff rep U p.2 v)).sum := by + act (jets.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, @@ -157,7 +157,7 @@ lemma IsInfinitesimalActionOf.actionFam_repDualCoeff 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 jets U) (repCoeff rep U) x hT, + ← tensorAction_map_right_antidiagonal act (jets.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] @@ -222,7 +222,7 @@ lemma TransformsIn.repGauge_actionFamConv (jets.maurerCartan 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 jets U⁻¹ q.1).sum) ψ + ((u.antidiagonal.map fun q => A q.2 ρ ∘ₗ jets.adjointDualCoeff U⁻¹ q.1).sum) ψ + algebraMap ℂ B (ψ (jets.evalLie (jets.iteratedDeriv u (jets.maurerCartan U⁻¹ ρ)))) := by intro u ψ @@ -236,13 +236,13 @@ lemma TransformsIn.repGauge_actionFamConv congr 1 have hMa : (s.antidiagonal.map fun p => actionFam act ((p.1.antidiagonal.map fun q => - A q.2 ρ ∘ₗ adjointDualCoeff jets U⁻¹ q.1).sum) + A q.2 ρ ∘ₗ jets.adjointDualCoeff U⁻¹ q.1).sum) ((p.2.antidiagonal.map fun r => 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 (A q.2 ρ ∘ₗ adjointDualCoeff jets U⁻¹ q.1) + actionFam act (A q.2 ρ ∘ₗ jets.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, @@ -258,7 +258,7 @@ lemma TransformsIn.repGauge_actionFamConv (s.antidiagonal.map fun p => (p.1.antidiagonal.map fun q => (p.2.antidiagonal.map fun r => - actionFam act (A r.1 ρ ∘ₗ adjointDualCoeff jets U⁻¹ q.1) + actionFam act (A r.1 ρ ∘ₗ jets.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 [actionFamConv, Multiset.sum_linearMap_apply, Multiset.map_map, @@ -267,7 +267,7 @@ lemma TransformsIn.repGauge_actionFamConv 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 (A b ρ ∘ₗ adjointDualCoeff jets U⁻¹ a) + actionFam act (A b ρ ∘ₗ jets.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 => F r.2 ∘ₗ repDualCoeff rep U⁻¹ r.1).sum) @@ -289,7 +289,7 @@ lemma TransformsIn.repGauge_actionFamConv Multiset.sum_map_add, hM] set_option maxHeartbeats 2000000 in -/-- **The covariant derivative preserves `TransformsIn`**: if `F` transforms in the +/-- The covariant derivative preserves `TransformsIn`: if `F` transforms in the representation `rep` and `act` is the infinitesimal action underlying `rep`, then `∇_ρ F = [∂_ρ F] + A_ρ · F` transforms in `rep`. The single inhomogeneous convolution of `[∂_{ρ ::ₘ s} F]` cancels the single `act` cross-term convolution of @@ -332,7 +332,7 @@ theorem TransformsIn.covDerivAction hR, hcancel] abel -/-- **Every iterated covariant derivative preserves `TransformsIn`**: if `F` transforms +/-- 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. -/ @@ -358,7 +358,7 @@ end MatterCovariance section ConjugateAction -/-- **The conjugate of an infinitesimal action**: the same maps, read on the conjugate +/-- The conjugate of an infinitesimal action: the same maps, read on the conjugate module — the generators of the conjugate representation. -/ noncomputable def actionConj (act : 𝔤 →ₗ[ℝ] V →ₗ[ℂ] V) : 𝔤 →ₗ[ℝ] ConjModule V →ₗ[ℂ] ConjModule V where @@ -402,8 +402,8 @@ lemma repConj_conjJetEquiv (rep : Representation ℂ G (JetRing ⊗[ℂ] V)) 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 +/-- 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 ℂ G (JetRing ⊗[ℂ] V)) (U : G) (x : Multiset (Fin 1 ⊕ Fin 3)) : @@ -460,8 +460,8 @@ lemma repCoeff_repConj_zero_eq_id {W : G} repCoeff (JetComponentSpace.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 +/-- 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 jets act rep) : diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/MaurerCartan.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/MaurerCartan.lean index 83d39eed7..80d12b8bb 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/MaurerCartan.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/MaurerCartan.lean @@ -13,10 +13,9 @@ public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Basic The Maurer–Cartan form `ω_μ(U) = i (∂_μ U) U⁻¹` of a package `jets : LocalGaugeData G 𝔤 G₀ 𝔤J` is the field `jets.maurerCartan`, subject to the cocycle -law `maurerCartan_cocycle`, its value `maurerCartan_one` on the identity and -`maurerCartan_ofConstant` on constants, and the flatness (structural) equation -`maurerCartan_structure`. This file develops what follows from those laws alone, for any -package: nothing here mentions a particular gauge group. +law `maurerCartan_cocycle`, its value `maurerCartan_ofConstant` on constants, and the +flatness (structural) equation `maurerCartan_structure`. This file develops what follows +from those laws alone, for any package: nothing here mentions a particular gauge group. The main construction is the *symmetrized* Maurer–Cartan form @@ -24,16 +23,18 @@ The main construction is the *symmetrized* Maurer–Cartan form the average over which direction of the multiset `r` is carried by the form itself rather than by a derivative. Its point is `iteratedDeriv_maurerCartan_eq_symmetrized_add`: an -iterated -derivative `∂_s ω_μ(U)` is the symmetrized form at `μ ::ₘ s` plus an average of iterated -derivatives of *brackets* of Maurer–Cartan forms in strictly fewer directions — the -structural equation used to trade an antisymmetric part for lower-order data. Iterating +iterated derivative `∂_s ω_μ(U)` is the symmetrized form at `μ ::ₘ s` plus an average of +iterated derivatives of *brackets* of Maurer–Cartan forms in strictly fewer directions — +the structural equation used to trade an antisymmetric part for lower-order data. Iterating that gives `evalLie_iteratedDeriv_maurerCartan_eq_of_symmetrized_eq`: the base-point Taylor -data of `ω` is determined by the base-point symmetrized data. +data of `ω` is determined by the base-point symmetrized data. How this determines a pure +jet, and the truncation filtration it defines, is the subject of +`Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Truncation`. ## ii. Key results -- `LocalGaugeData.maurerCartan_inv` : `ω_μ(U⁻¹) = − Ad_{U⁻¹} ω_μ(U)`. +- `LocalGaugeData.evalLie_iteratedDeriv_maurerCartan_structure` : the structural equation + at the base point, to all orders. - `LocalGaugeData.symmetrizedMaurerCartanForm` : the symmetrized Maurer–Cartan form, with `symmetrizedMaurerCartanForm_singleton` and the recursion `symmetrizedMaurerCartanForm_cons`. @@ -46,7 +47,7 @@ data of `ω` is determined by the base-point symmetrized data. ## iii. Table of contents -- A. The Maurer–Cartan form on inverses +- A. The structural equation at the base point - B. The symmetrized Maurer–Cartan form - C. Determination of the Maurer–Cartan form by its symmetrized coefficients @@ -62,17 +63,28 @@ variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] /-! -## A. The Maurer–Cartan form on inverses +## A. The structural equation at the base point -/ -/-- **The Maurer–Cartan form of an inverse**: `ω_μ(U⁻¹) = − Ad_{U⁻¹} ω_μ(U)`, the cocycle - law applied to `U⁻¹ U = 1`. -/ -lemma maurerCartan_inv (U : G) (μ : Fin 1 ⊕ Fin 3) : - jets.maurerCartan U⁻¹ μ = - jets.adjoint U⁻¹ (jets.maurerCartan U μ) := by - have h := jets.maurerCartan_cocycle U⁻¹ U μ - rw [inv_mul_cancel, jets.maurerCartan_one] at h - exact eq_neg_of_add_eq_zero_left h.symm +/-- 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 evalLie_iteratedDeriv_maurerCartan_structure + (U : G) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : + jets.evalLie (jets.iteratedDeriv (μ ::ₘ s) (jets.maurerCartan U ν)) = + jets.evalLie (jets.iteratedDeriv (ν ::ₘ s) (jets.maurerCartan U μ)) + - (s.antidiagonal.map fun p => + ⁅jets.evalLie (jets.iteratedDeriv p.1 (jets.maurerCartan U μ)), + jets.evalLie (jets.iteratedDeriv p.2 (jets.maurerCartan U ν))⁆).sum := by + have h0 := congrArg (fun z => jets.evalLie (jets.iteratedDeriv s z)) + (jets.maurerCartan_structure U μ ν) + simp only [map_add, map_sub, map_zero] at h0 + rw [← LinearMap.comp_apply, ← iteratedDeriv_cons_eq_comp_deriv, ← LinearMap.comp_apply, + ← iteratedDeriv_cons_eq_comp_deriv, iteratedDeriv_bracket, map_multiset_sum, + Multiset.map_map, + Multiset.map_congr rfl (fun p hp => by rw [Function.comp_apply, LieHom.map_lie])] at h0 + exact eq_sub_of_add_eq (sub_eq_zero.mp (by rw [← h0]; abel)) /-! @@ -80,7 +92,7 @@ lemma maurerCartan_inv (U : G) (μ : Fin 1 ⊕ Fin 3) : -/ -/-- **The symmetrized Maurer–Cartan form** `ω̄_r(U) = (1/|r|) ∑_{μ ∈ r} ∂_{r − {μ}} ω_μ(U)`: +/-- The symmetrized Maurer–Cartan form `ω̄_r(U) = (1/|r|) ∑_{μ ∈ r} ∂_{r − {μ}} ω_μ(U)`: the average, over the directions of `r`, of the Maurer–Cartan form in one direction differentiated along the remaining ones. -/ noncomputable def symmetrizedMaurerCartanForm (U : G) (r : Multiset (Fin 1 ⊕ Fin 3)) : 𝔤J := @@ -191,7 +203,7 @@ lemma iteratedDeriv_maurerCartan_eq_symmetrized_add (U : G) push_cast match_scalars <;> field_simp <;> ring -/-- **Maurer–Cartan triangularity, base-point half**: if the base-point symmetrized +/-- Maurer–Cartan triangularity, base-point half: if the base-point symmetrized Maurer–Cartan data of `U` vanish in every nonempty multiset of at most `n` directions, then so do all its base-point Maurer–Cartan Taylor coefficients below order `n`. The induction is on the order: the symmetrization defect @@ -237,7 +249,7 @@ lemma evalLie_iteratedDeriv_maurerCartan_eq_zero_of_symmetrized_eq_zero (U : G) simp exact hall s.card s μ rfl hs -/-- **Determination step**: if the base-point symmetrized Maurer–Cartan data of `U` and +/-- 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 evalLie_iteratedDeriv_maurerCartan_eq_of_symmetrized_eq (U V : G) (n : ℕ) diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/TransformsIn.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/TransformsIn.lean index 9575aa0e4..ff71ddecc 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/TransformsIn.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/TransformsIn.lean @@ -6,6 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.ClassicalFieldTheory.GaugeTheory.Matter.CovariantDeriv +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Truncation /-! # Gauge tensors in a representation @@ -28,8 +29,9 @@ lives in the `LocalGaugeData` namespace with the transformation laws that consum - `LocalGaugeData.TransformsIn` : the gauge tensors of a representation. - `LocalGaugeData.TransformsIn.repGauge_zero` : the underived symbol transforms through the base-point value of the gauge jet alone. -- `LocalGaugeData.TransformsIn.repGauge_eq_of_eval_eq_one` : a jet with trivial base-point - value fixes the underived symbol, when the representation is trivial on such jets. +- `LocalGaugeData.TransformsIn.repGauge_eq_of_eval_eq_one`, + `LocalGaugeData.TransformsIn.repGauge_eq_of_mem_truncationKer_zero` : a pure jet fixes the + underived symbol, when the representation is trivial on such jets. -/ @@ -74,8 +76,8 @@ lemma TransformsIn.repGauge_zero (hF : TransformsIn repGauge rep F) (U : G) simpa only [Multiset.antidiagonal_zero, Multiset.map_singleton, Multiset.sum_singleton] using hF U φ 0 -/-- **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 +/-- 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 TransformsIn.repGauge_eq_of_eval_eq_one {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] @@ -89,4 +91,14 @@ lemma TransformsIn.repGauge_eq_of_eval_eq_one {𝔤 : Type} [LieRing 𝔤] [LieA show repDualCoeff rep U⁻¹ 0 = (repCoeff rep U⁻¹ 0).dualMap from rfl, hrep hinv] rfl +/-- Matter gauge tensors are fixed by pure jets: the members of the zeroth truncation kernel + are the jets with trivial base-point value, so `repGauge_eq_of_eval_eq_one` applies. -/ +lemma TransformsIn.repGauge_eq_of_mem_truncationKer_zero {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} (hF : TransformsIn repGauge rep F) + (hrep : ∀ {W : G}, jets.eval W = 1 → repCoeff rep W 0 = LinearMap.id) + (U : jets.truncationKer 0) (φ : Module.Dual ℂ V) : + repGauge U.1 (F 0 φ) = F 0 φ := + hF.repGauge_eq_of_eval_eq_one hrep (jets.mem_truncationKer_zero_iff.mp U.2) φ + end LocalGaugeData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Truncation.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Truncation.lean new file mode 100644 index 000000000..f9e957737 --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Truncation.lean @@ -0,0 +1,398 @@ +/- +Copyright (c) 2026 Joseph Tooby-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.LocalGaugeData.AdjointCoeff +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.MaurerCartan +/-! +# The truncation filtration of the jet gauge group + +## i. Overview + +A jet of gauge transformations is *trivial to order `n`* when it agrees with the identity +up to and including its `n`-th derivatives. For a matrix group this is a statement about +Taylor coefficients of matrix entries; for an abstract package `jets` it is phrased through +the two things the package provides at the base point, the value `eval U` and the +Maurer–Cartan form: `U` is trivial to order `n` when `eval U = 1` and the base-point Taylor +coefficients of `ω_μ(U)` vanish below order `n`. The Taylor–Leibniz theorem makes these +jets a subgroup `truncationKer n`, normal in `G`, and the subgroups decrease with `n`. + +The zeroth member, the *pure jets* with `eval U = 1`, is the complement of the constant +jets: every jet factors uniquely as a pure jet times the constant jet of its value, +`truncationProjZero`. When the package is `Faithful`, a pure jet is determined by its +Maurer–Cartan form, and hence by the base-point values of the symmetrized Maurer–Cartan +form, `symmetrizedMaurerCartanCoeff`; and membership in `truncationKer n` is exactly the +vanishing of those symmetrized data up to order `n`. + +What a jet trivial to order `n` does to the fields is the point of the filtration: all its +adjoint Taylor coefficients of order between `1` and `n` vanish, +`adjointCoeff_eq_zero_of_mem_truncationKer`, so it acts on the gauge-field symbols with at +most `n` derivatives by a pure translation. + +## ii. Key results + +- `LocalGaugeData.truncationKer` : the jets trivial to order `n`, as a subgroup. +- `LocalGaugeData.mem_truncationKer_zero_iff` : the pure jets. +- `LocalGaugeData.adjointCoeff_eq_zero_of_mem_truncationKer` : deep jets kill the positive + adjoint coefficients. +- `LocalGaugeData.truncationKer_normal` : the filtration is by normal subgroups. +- `LocalGaugeData.truncationProjZero` : the projection of a jet onto the pure jets. +- `LocalGaugeData.maurerCartan_injOn_truncationKer_zero` : a pure jet of a faithful package + is determined by its Maurer–Cartan form. +- `LocalGaugeData.symmetrizedMaurerCartanCoeff_injective` : and by its symmetrized + Maurer–Cartan data. +- `LocalGaugeData.mem_truncationKer_iff_symmetrizedMaurerCartanCoeff_eq_zero` : the + filtration through the symmetrized data. +- `LocalGaugeData.Free` : the symmetrized data are free coordinates on the pure jets. + +## iii. Table of contents + +- A. The truncation filtration +- B. The adjoint coefficients of a deep jet +- C. Normality +- D. The projection onto the pure jets +- E. Pure jets and their Maurer–Cartan data +- F. Free packages + +-/ + +@[expose] public section + +namespace LocalGaugeData + +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + (jets : LocalGaugeData G 𝔤 G₀ 𝔤J) + +/-! + +## A. The truncation filtration + +-/ + +/-- The jets trivial to order `n`: value the identity, and base-point Taylor coefficients + of the Maurer–Cartan form vanishing below order `n`. Closure under products and inverses + is the cocycle law together with the Taylor–Leibniz theorem for the adjoint action. -/ +noncomputable def truncationKer (n : ℕ) : Subgroup G where + carrier := {U | jets.eval U = 1 ∧ ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), + s.card < n → jets.evalLie (jets.iteratedDeriv s (jets.maurerCartan U μ)) = 0} + one_mem' := ⟨map_one _, fun s μ _ => by rw [maurerCartan_one, map_zero, map_zero]⟩ + mul_mem' := by + intro U V hU hV + refine ⟨by rw [map_mul, hU.1, hV.1, one_mul], fun s μ hs => ?_⟩ + rw [maurerCartan_cocycle, map_add, map_add, hU.2 s μ hs, zero_add] + exact jets.evalLie_iteratedDeriv_adjoint_eq_zero U fun q hq => + hV.2 q μ (lt_of_le_of_lt (Multiset.card_le_card hq) hs) + inv_mem' := by + intro U hU + refine ⟨by rw [map_inv, hU.1, inv_one], fun s μ hs => ?_⟩ + rw [maurerCartan_inv, map_neg, map_neg, neg_eq_zero] + exact jets.evalLie_iteratedDeriv_adjoint_eq_zero U⁻¹ fun q hq => + hU.2 q μ (lt_of_le_of_lt (Multiset.card_le_card hq) hs) + +lemma mem_truncationKer_iff {n : ℕ} {U : G} : + U ∈ jets.truncationKer n ↔ jets.eval U = 1 ∧ + ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), s.card < n → + jets.evalLie (jets.iteratedDeriv s (jets.maurerCartan U μ)) = 0 := Iff.rfl + +lemma eval_eq_one_of_mem_truncationKer {n : ℕ} {U : G} (hU : U ∈ jets.truncationKer n) : + jets.eval U = 1 := hU.1 + +lemma evalLie_iteratedDeriv_maurerCartan_eq_zero_of_mem_truncationKer {n : ℕ} {U : G} + (hU : U ∈ jets.truncationKer n) {s : Multiset (Fin 1 ⊕ Fin 3)} (hs : s.card < n) + (μ : Fin 1 ⊕ Fin 3) : jets.evalLie (jets.iteratedDeriv s (jets.maurerCartan U μ)) = 0 := + hU.2 s μ hs + +/-- The filtration decreases: a jet trivial to order `n` is trivial to every lower order. -/ +lemma truncationKer_antitone : Antitone jets.truncationKer := + fun _ _ hmn _ hU => ⟨hU.1, fun s μ hs => hU.2 s μ (lt_of_lt_of_le hs hmn)⟩ + +/-- The zeroth truncation kernel is the group of pure jets, those with identity value. -/ +lemma mem_truncationKer_zero_iff {U : G} : U ∈ jets.truncationKer 0 ↔ jets.eval U = 1 := + ⟨fun h => h.1, fun h => ⟨h, fun _ _ hs => absurd hs (Nat.not_lt_zero _)⟩⟩ + +/-! + +## B. The adjoint coefficients of a deep jet + +-/ + +/-- Deep jets kill the positive adjoint coefficients: for a jet trivial to order `n`, the + adjoint coefficients of order between `1` and `n` vanish. One derivative of the adjoint + is `ad` of the Maurer–Cartan form, whose base-point data vanish below order `n`. -/ +lemma adjointCoeff_eq_zero_of_mem_truncationKer {n : ℕ} {U : G} (hU : U ∈ jets.truncationKer n) + {x : Multiset (Fin 1 ⊕ Fin 3)} (hx : x ≠ 0) (hxn : x.card ≤ n) : + jets.adjointCoeff U x = 0 := by + obtain ⟨μ, hμ⟩ := Multiset.card_pos_iff_exists_mem.mp (Multiset.card_pos.mpr hx) + rw [← Multiset.cons_erase hμ, adjointCoeff_cons, neg_eq_zero] + refine Multiset.sum_eq_zero fun z hz => ?_ + obtain ⟨p, hp, rfl⟩ := Multiset.mem_map.mp hz + have h1 := Multiset.card_le_card (Multiset.fst_le_of_mem_antidiagonal hp) + have h2 := Multiset.card_erase_add_one hμ + rw [hU.2 p.1 μ (by omega), map_zero, LinearMap.zero_comp] + +/-- The dual form of `adjointCoeff_eq_zero_of_mem_truncationKer`. -/ +lemma adjointDualCoeff_eq_zero_of_mem_truncationKer {n : ℕ} {U : G} + (hU : U ∈ jets.truncationKer n) {x : Multiset (Fin 1 ⊕ Fin 3)} (hx : x ≠ 0) + (hxn : x.card ≤ n) : jets.adjointDualCoeff U x = 0 := by + rw [adjointDualCoeff, jets.adjointCoeff_eq_zero_of_mem_truncationKer hU hx hxn] + exact LinearMap.ext fun φ => LinearMap.ext fun a => map_zero φ + +/-- Up to order `n`, a jet trivial to order `n` has the adjoint coefficients of the + identity. -/ +lemma adjointCoeff_eq_one_of_mem_truncationKer {n : ℕ} {U : G} (hU : U ∈ jets.truncationKer n) + {x : Multiset (Fin 1 ⊕ Fin 3)} (hxn : x.card ≤ n) : + jets.adjointCoeff U x = jets.adjointCoeff 1 x := by + rw [adjointCoeff_one] + split_ifs with h + · subst h + exact jets.adjointCoeff_zero_of_eval_eq_one hU.1 + · exact jets.adjointCoeff_eq_zero_of_mem_truncationKer hU h hxn + +/-- Up to order `n`, a jet trivial to order `n` is invisible on the right of a product. -/ +lemma adjointCoeff_mul_of_mem_truncationKer_right (g : G) {n : ℕ} {U : G} + (hU : U ∈ jets.truncationKer n) {x : Multiset (Fin 1 ⊕ Fin 3)} (hxn : x.card ≤ n) : + jets.adjointCoeff (g * U) x = jets.adjointCoeff g x := by + rw [adjointCoeff_mul, Multiset.sum_antidiagonal_eq_of_snd_ne_zero x _ fun p hp hp2 => ?_] + · rw [jets.adjointCoeff_zero_of_eval_eq_one hU.1, LinearMap.comp_id] + · rw [jets.adjointCoeff_eq_zero_of_mem_truncationKer hU hp2 + ((Multiset.card_le_card (Multiset.snd_le_of_mem_antidiagonal hp)).trans hxn), + LinearMap.comp_zero] + +/-- Up to order `n`, a jet trivial to order `n` is invisible on the left of a product. -/ +lemma adjointCoeff_mul_of_mem_truncationKer_left (g : G) {n : ℕ} {U : G} + (hU : U ∈ jets.truncationKer n) {x : Multiset (Fin 1 ⊕ Fin 3)} (hxn : x.card ≤ n) : + jets.adjointCoeff (U * g) x = jets.adjointCoeff g x := by + rw [adjointCoeff_mul, Multiset.sum_antidiagonal_eq_of_fst_ne_zero x _ fun p hp hp1 => ?_] + · rw [jets.adjointCoeff_zero_of_eval_eq_one hU.1, LinearMap.id_comp] + · rw [jets.adjointCoeff_eq_zero_of_mem_truncationKer hU hp1 + ((Multiset.card_le_card (Multiset.fst_le_of_mem_antidiagonal hp)).trans hxn), + LinearMap.zero_comp] + +/-- Up to order `n`, a conjugate of a jet trivial to order `n` has the adjoint + coefficients of the identity. -/ +lemma adjointCoeff_conj_of_mem_truncationKer (g : G) {n : ℕ} {U : G} + (hU : U ∈ jets.truncationKer n) {x : Multiset (Fin 1 ⊕ Fin 3)} (hxn : x.card ≤ n) : + jets.adjointCoeff (g * U * g⁻¹) x = jets.adjointCoeff 1 x := by + rw [adjointCoeff_mul, Multiset.map_congr rfl (fun p hp => by + rw [jets.adjointCoeff_mul_of_mem_truncationKer_right g hU + ((Multiset.card_le_card (Multiset.fst_le_of_mem_antidiagonal hp)).trans hxn)]), + ← adjointCoeff_mul, mul_inv_cancel] + +/-- Up to order `n`, a conjugate of a jet trivial to order `n` acts trivially on the + base-point Taylor data of the jet Lie algebra. -/ +lemma evalLie_iteratedDeriv_adjoint_conj_of_mem_truncationKer (g : G) {n : ℕ} {U : G} + (hU : U ∈ jets.truncationKer n) {s : Multiset (Fin 1 ⊕ Fin 3)} (hs : s.card ≤ n) + (Y : 𝔤J) : jets.evalLie (jets.iteratedDeriv s (jets.adjoint (g * U * g⁻¹) Y)) = + jets.evalLie (jets.iteratedDeriv s Y) := by + rw [evalLie_iteratedDeriv_adjoint, Multiset.sum_antidiagonal_eq_of_fst_ne_zero s _ + fun p hp hp1 => ?_] + · rw [jets.adjointCoeff_conj_of_mem_truncationKer g hU (by simp), adjointCoeff_one, + if_pos rfl, LinearMap.id_apply] + · rw [jets.adjointCoeff_conj_of_mem_truncationKer g hU + ((Multiset.card_le_card (Multiset.fst_le_of_mem_antidiagonal hp)).trans hs), + adjointCoeff_one, if_neg hp1, LinearMap.zero_apply] + +/-! + +## C. Normality + +-/ + +/-- The Maurer–Cartan form of a conjugate, by the cocycle law: the conjugating jet + contributes its own form and its transport by the conjugate. -/ +lemma maurerCartan_conj (g U : G) (μ : Fin 1 ⊕ Fin 3) : + jets.maurerCartan (g * U * g⁻¹) μ = + jets.maurerCartan g μ + jets.adjoint g (jets.maurerCartan U μ) + - jets.adjoint (g * U * g⁻¹) (jets.maurerCartan g μ) := by + rw [jets.maurerCartan_cocycle (g * U) g⁻¹, jets.maurerCartan_cocycle g U, maurerCartan_inv, + map_neg, map_mul jets.adjoint (g * U) g⁻¹, Module.End.mul_apply, sub_eq_add_neg] + +/-- The truncation kernels are normal subgroups: conjugating a jet trivial to order `n` + gives a jet trivial to order `n`. -/ +instance truncationKer_normal (n : ℕ) : (jets.truncationKer n).Normal where + conj_mem U hU g := by + refine ⟨by rw [map_mul, map_mul, hU.1, mul_one, map_inv, mul_inv_cancel], fun s μ hs => ?_⟩ + rw [maurerCartan_conj, map_sub, map_add, map_sub, map_add, + jets.evalLie_iteratedDeriv_adjoint_conj_of_mem_truncationKer g hU hs.le, + jets.evalLie_iteratedDeriv_adjoint_eq_zero g fun q hq => + hU.2 q μ (lt_of_le_of_lt (Multiset.card_le_card hq) hs), + add_zero, sub_self] + +/-! + +## D. The projection onto the pure jets + +-/ + +/-- The projection of a jet onto the pure jets, stripping its value: `U ↦ U · (U₀)⁻¹`. + This is not a group homomorphism; it is the cocycle of the splitting of `G` by the + constant jets. -/ +noncomputable def truncationProjZero (U : G) : jets.truncationKer 0 := + ⟨U * (jets.ofConstant (jets.eval U))⁻¹, jets.mem_truncationKer_zero_iff.mpr + (by rw [map_mul, map_inv, eval_ofConstant, mul_inv_cancel])⟩ + +@[simp] +lemma coe_truncationProjZero (U : G) : + (jets.truncationProjZero U : G) = U * (jets.ofConstant (jets.eval U))⁻¹ := rfl + +/-- Every jet is its pure part times the constant jet of its value. -/ +lemma eq_truncationProjZero_mul_ofConstant (U : G) : + U = jets.truncationProjZero U * jets.ofConstant (jets.eval U) := by + simp + +lemma truncationProjZero_surjective : Function.Surjective jets.truncationProjZero := by + intro V + refine ⟨V, Subtype.ext ?_⟩ + rw [coe_truncationProjZero, jets.mem_truncationKer_zero_iff.mp V.2, map_one, inv_one, + mul_one] + +/-- The pure part of a jet is trivial exactly when the jet is constant. -/ +lemma truncationProjZero_eq_one_iff {U : G} : + jets.truncationProjZero U = 1 ↔ U = jets.ofConstant (jets.eval U) := by + rw [← Subtype.coe_inj, coe_truncationProjZero, Subgroup.coe_one, mul_inv_eq_one] + +@[simp] +lemma truncationProjZero_ofConstant (g : G₀) : + jets.truncationProjZero (jets.ofConstant g) = 1 := by + rw [truncationProjZero_eq_one_iff, eval_ofConstant] + +/-- Stripping the value of a jet does not change its Maurer–Cartan form: by the cocycle + law, right multiplication by a constant jet drops out. -/ +@[simp] +lemma maurerCartan_truncationProjZero (U : G) (μ : Fin 1 ⊕ Fin 3) : + jets.maurerCartan (jets.truncationProjZero U) μ = jets.maurerCartan U μ := by + rw [coe_truncationProjZero, ← map_inv, maurerCartan_cocycle, maurerCartan_ofConstant, + map_zero, add_zero] + +/-! + +## E. Pure jets and their 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 : jets.truncationKer 0) + (r : {r : Multiset (Fin 1 ⊕ Fin 3) // r ≠ 0}) : 𝔤 := + jets.evalLie (jets.symmetrizedMaurerCartanForm U.1 r.1) + +lemma symmetrizedMaurerCartanCoeff_apply (U : jets.truncationKer 0) + (r : {r : Multiset (Fin 1 ⊕ Fin 3) // r ≠ 0}) : + jets.symmetrizedMaurerCartanCoeff U r = + jets.evalLie (jets.symmetrizedMaurerCartanForm U.1 r.1) := rfl + +/-- Maurer–Cartan triangularity: a pure jet whose symmetrized Maurer–Cartan data vanish + up to order `n` is trivial to order `n`. The symmetrized data control the Taylor data of + the Maurer–Cartan form through the symmetrization defect. -/ +lemma mem_truncationKer_of_symmetrizedMaurerCartanCoeff_eq_zero (U : jets.truncationKer 0) + (n : ℕ) (h : ∀ (r : Multiset (Fin 1 ⊕ Fin 3)) (hr : r ≠ 0), r.card ≤ n → + jets.symmetrizedMaurerCartanCoeff U ⟨r, hr⟩ = 0) : + U.1 ∈ jets.truncationKer n := + ⟨U.2.1, fun s μ hs => jets.evalLie_iteratedDeriv_maurerCartan_eq_zero_of_symmetrized_eq_zero + U.1 (fun r hr hrn => h r hr hrn) s μ hs⟩ + +/-- Conversely, the symmetrized Maurer–Cartan data of a jet trivial to order `n` vanish + up to order `n`: each term of the symmetrized form carries fewer than `n` derivatives. -/ +lemma symmetrizedMaurerCartanCoeff_eq_zero_of_mem_truncationKer {U : jets.truncationKer 0} + {n : ℕ} (hU : U.1 ∈ jets.truncationKer n) {r : Multiset (Fin 1 ⊕ Fin 3)} (hr : r ≠ 0) + (hrn : r.card ≤ n) : jets.symmetrizedMaurerCartanCoeff U ⟨r, hr⟩ = 0 := by + change jets.evalLie (jets.symmetrizedMaurerCartanForm U.1 r) = 0 + rw [symmetrizedMaurerCartanForm, map_smul, map_multiset_sum, Multiset.map_map] + refine smul_eq_zero_of_right _ (Multiset.sum_eq_zero fun z hz => ?_) + obtain ⟨μ, hμ, rfl⟩ := Multiset.mem_map.mp hz + refine hU.2 _ μ ?_ + have h1 := Multiset.card_pos.mpr hr + rw [Multiset.sub_singleton, Multiset.card_erase_of_mem hμ, Nat.pred_eq_sub_one] + omega + +/-- The truncation filtration through the symmetrized Maurer–Cartan data: a pure jet is + trivial to order `n` exactly when its symmetrized data vanish up to order `n`. -/ +lemma mem_truncationKer_iff_symmetrizedMaurerCartanCoeff_eq_zero (U : jets.truncationKer 0) + (n : ℕ) : U.1 ∈ jets.truncationKer n ↔ + ∀ (r : Multiset (Fin 1 ⊕ Fin 3)) (hr : r ≠ 0), r.card ≤ n → + jets.symmetrizedMaurerCartanCoeff U ⟨r, hr⟩ = 0 := + ⟨fun hU _ hr hrn => jets.symmetrizedMaurerCartanCoeff_eq_zero_of_mem_truncationKer hU hr hrn, + jets.mem_truncationKer_of_symmetrizedMaurerCartanCoeff_eq_zero U n⟩ + +section Faithful + +variable [jets.Faithful] + +/-- A pure jet of a faithful package is determined by its Maurer–Cartan form. By the + cocycle and inverse laws `ω(V⁻¹ U) = Ad_{V⁻¹}(ω(U) − ω(V)) = 0`, so `V⁻¹ U` is the + constant jet of its value, which is the identity. -/ +lemma maurerCartan_injOn_truncationKer_zero {U V : G} (hU : U ∈ jets.truncationKer 0) + (hV : V ∈ jets.truncationKer 0) (h : jets.maurerCartan U = jets.maurerCartan V) : + U = V := by + have h1 : jets.maurerCartan (V⁻¹ * U) = 0 := by + funext μ + rw [maurerCartan_cocycle, maurerCartan_inv, congrFun h μ, neg_add_cancel, Pi.zero_apply] + have h2 := (jets.maurerCartan_eq_zero_iff _).mp h1 + rw [map_mul, map_inv, jets.mem_truncationKer_zero_iff.mp hU, + jets.mem_truncationKer_zero_iff.mp hV, inv_one, one_mul, map_one] at h2 + exact (inv_mul_eq_one.mp h2).symm + +/-- A pure jet of a faithful package is determined by its symmetrized Maurer–Cartan data. + The symmetrized data determine all base-point Taylor data of the Maurer–Cartan form by + strong induction on the order, hence the form itself by Taylor determinacy, hence the + jet by `maurerCartan_injOn_truncationKer_zero`. -/ +lemma symmetrizedMaurerCartanCoeff_injective : + Function.Injective jets.symmetrizedMaurerCartanCoeff := by + intro U V h + have hsym : ∀ r, jets.evalLie (jets.symmetrizedMaurerCartanForm U.1 r) = + jets.evalLie (jets.symmetrizedMaurerCartanForm V.1 r) := by + intro r + rcases eq_or_ne r 0 with rfl | hr + · simp + · exact congrFun h ⟨r, hr⟩ + have hall : ∀ (n : ℕ) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), s.card = n → + jets.evalLie (jets.iteratedDeriv s (jets.maurerCartan U.1 μ)) = + jets.evalLie (jets.iteratedDeriv s (jets.maurerCartan V.1 μ)) := by + intro n + induction n using Nat.strong_induction_on with + | _ n ih => + intro s μ hs + exact jets.evalLie_iteratedDeriv_maurerCartan_eq_of_symmetrized_eq U.1 V.1 n hsym + (fun p ν hp => ih p.card hp p ν rfl) s μ hs + refine Subtype.ext (jets.maurerCartan_injOn_truncationKer_zero U.2 V.2 (funext fun μ => ?_)) + exact jets.ext_of_evalLie_iteratedDeriv fun s => hall s.card s μ rfl + +end Faithful + +/-! + +## F. Free packages + +-/ + +/-- A package is free when it is faithful and, moreover, every family of gauge-algebra + elements indexed by nonempty multisets of directions is the symmetrized Maurer–Cartan + data of some pure jet. The symmetrized data are then free coordinates on the pure jets. + This holds for the full jet group of any matrix group, by integrating the radial + equation; like `Faithful` it is recorded separately from the structure because the + covariance theory does not need it, only the classification of invariants does. -/ +class Free (jets : LocalGaugeData G 𝔤 G₀ 𝔤J) : Prop extends Faithful jets where + symmetrizedMaurerCartanCoeff_surjective : Function.Surjective jets.symmetrizedMaurerCartanCoeff + +section Free + +variable [jets.Free] + +lemma symmetrizedMaurerCartanCoeff_surjective : + Function.Surjective jets.symmetrizedMaurerCartanCoeff := + Free.symmetrizedMaurerCartanCoeff_surjective + +/-- The symmetrized Maurer–Cartan data are free coordinates on the pure jets of a free + package. -/ +lemma symmetrizedMaurerCartanCoeff_bijective : + Function.Bijective jets.symmetrizedMaurerCartanCoeff := + ⟨jets.symmetrizedMaurerCartanCoeff_injective, jets.symmetrizedMaurerCartanCoeff_surjective⟩ + +end Free + +end LocalGaugeData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/Matter/CovariantDeriv.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/Matter/CovariantDeriv.lean index d2c3d136a..8aacfe62d 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/Matter/CovariantDeriv.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/Matter/CovariantDeriv.lean @@ -79,17 +79,6 @@ variable {A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual -/ -variable (jets) in -/-- 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)) : - 𝔤 →ₗ[ℝ] 𝔤 := - (jets.evalLie).toLinearMap ∘ₗ jets.iteratedDeriv x ∘ₗ - jets.adjoint U ∘ₗ jets.ofConstantLie - -lemma adjointDualCoeff_eq_dualMap (U : G) (x : Multiset (Fin 1 ⊕ Fin 3)) : - adjointDualCoeff jets U x = (adjointCoeff jets 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' @@ -645,50 +634,6 @@ theorem adjoin_symbols_eq_adjoin_covDerivIter (act : 𝔤 →ₗ[ℝ] V →ₗ[ end Action -/-! - -## E. Multiplicativity of the adjoint Taylor coefficients - --/ - -section Leibniz - -variable [LocalGaugeDataLeibniz jets] - -/-- **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 jets (U * V) x - = (x.antidiagonal.map fun p => adjointCoeff jets U p.1 ∘ₗ adjointCoeff jets V p.2).sum := by - refine LinearMap.ext fun a => ?_ - rw [Multiset.sum_linearMap_apply, Multiset.map_map, - show adjointCoeff jets (U * V) x a - = jets.evalLie (jets.iteratedDeriv x (jets.adjoint U - (jets.adjoint V (jets.ofConstantLie a)))) from by - rw [adjointCoeff] - simp only [LinearMap.coe_comp, Function.comp_apply, LieHom.coe_toLinearMap, map_mul, - Module.End.mul_apply], - LocalGaugeDataLeibniz.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 jets (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 [LocalGaugeData.iteratedDeriv_zero, LinearMap.id_apply, LocalGaugeData.evalLie_ofConstantLie, - if_pos rfl, LinearMap.id_apply] - · rw [jets.iteratedDeriv_ofConstantLie_of_ne_zero hp, map_zero, if_neg hp, - LinearMap.zero_apply] - -end Leibniz - end IsGaugeField diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/GaugeFieldData.lean b/Physlib/ClassicalFieldTheory/JetAlgebra/GaugeFieldData.lean index 8c9f81a8d..b3107cf0c 100644 --- a/Physlib/ClassicalFieldTheory/JetAlgebra/GaugeFieldData.lean +++ b/Physlib/ClassicalFieldTheory/JetAlgebra/GaugeFieldData.lean @@ -16,8 +16,8 @@ public import Physlib.ClassicalFieldTheory.JetAlgebra.SpeciesGenerators A gauge theory is fixed, before any Lagrangian is chosen, by a gauge context and a matter content. The gauge context is the existing jet data of the gauge group, namely a global group `G₀` with finite-dimensional real Lie algebra `𝔤`, a jet group `G` with jet Lie -algebra `𝔤J`, a local-gauge-data package `jets : LocalGaugeData G 𝔤 G₀ 𝔤J` relating them and its -Taylor–Leibniz law `LocalGaugeDataLeibniz jets`. The matter content is a finite family of +algebra `𝔤J`, and a local-gauge-data package `jets : LocalGaugeData G 𝔤 G₀ 𝔤J` relating them. The +matter content is a finite family of fermionic species and a finite family of bosonic species, each given by an existing `MatterField jets`. @@ -102,7 +102,7 @@ different context. `GaugeFieldData` adds only the matter content on top of it. conditions, none of them imposed here. -/ structure GaugeFieldData {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - (jets : LocalGaugeData G 𝔤 G₀ 𝔤J) [LocalGaugeDataLeibniz jets] where + (jets : LocalGaugeData G 𝔤 G₀ 𝔤J) where /-- The index type of the fermionic species. -/ FermionSpecies : Type [decidableEqFermionSpecies : DecidableEq FermionSpecies] @@ -124,7 +124,7 @@ namespace GaugeFieldData variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} [LocalGaugeDataLeibniz jets] (T : GaugeFieldData jets) + {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} (T : GaugeFieldData jets) /-! diff --git a/Physlib/Particles/StandardModel/Matter/JetComponentSpace/TransformsIn.lean b/Physlib/ClassicalFieldTheory/JetAlgebra/JetComponentSpace/TransformsIn.lean similarity index 87% rename from Physlib/Particles/StandardModel/Matter/JetComponentSpace/TransformsIn.lean rename to Physlib/ClassicalFieldTheory/JetAlgebra/JetComponentSpace/TransformsIn.lean index fe91b9356..f0335117e 100644 --- a/Physlib/Particles/StandardModel/Matter/JetComponentSpace/TransformsIn.lean +++ b/Physlib/ClassicalFieldTheory/JetAlgebra/JetComponentSpace/TransformsIn.lean @@ -5,18 +5,20 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.Basic +public import Physlib.ClassicalFieldTheory.JetAlgebra.JetComponentSpace.GaugeAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.Matter.CovariantDeriv /-! # The transformation law of a derivative symbol ## i. Overview -`StandardModel.TransformsIn` demands of a family of component functions that each +`LocalGaugeData.TransformsIn` demands of a family of component functions that each derivative symbol transform by the all-orders Leibniz convolution of the base-point Taylor coefficients `IsGaugeField.repDualCoeff` of the gauge jet. What the gauge action on the jet component space is *built* from is `symbolAction`, the action of the coefficient `jetCoeff rep U⁻¹ : JetRing ⊗ End V` through `DerivAlgebraComplex.jetRingAction` on the -derivative label. This file identifies the two. +derivative label. This file identifies the two, for any group `G` acting fibrewise on the +jets of the field. The bridge is `DerivAlgebraComplex.jetRingAction_basis_multiset`, which puts the action of a jet on a derivative monomial into the convolution form that `TransformsIn` wants. What @@ -32,13 +34,14 @@ is an instance of the same lemma rather than a second proof. ## ii. Key results -- `StandardModel.jetCoeffAt` : the base-point Taylor coefficient of a jet of endomorphisms. -- `StandardModel.jetCoeffAt_jetCoeff` : on the gauge coefficient it is +- `JetComponentSpace.jetCoeffAt` : the base-point Taylor coefficient of a jet of + endomorphisms. +- `JetComponentSpace.jetCoeffAt_jetCoeff` : on the gauge coefficient it is `IsGaugeField.repCoeff`. -- `StandardModel.symbolAction_basis_tmul` : a coefficient acts on a derivative monomial by - the Leibniz convolution of its base-point Taylor coefficients. -- `StandardModel.repDual_basis_tmul` : the transformation law of the derivative symbol - `∂_s ψ_φ`, in the form demanded by `StandardModel.TransformsIn`. +- `JetComponentSpace.symbolAction_basis_tmul` : a coefficient acts on a derivative monomial + by the Leibniz convolution of its base-point Taylor coefficients. +- `JetComponentSpace.repDual_basis_tmul` : the transformation law of the derivative symbol + `∂_s ψ_φ`, in the form demanded by `LocalGaugeData.TransformsIn`. ## iii. Table of contents @@ -54,11 +57,10 @@ is an instance of the same lemma rather than a second proof. @[expose] public section -namespace StandardModel - open Matrix MatrixGroups TensorProduct MvPowerSeries variable {V : Type} [AddCommGroup V] [Module ℂ V] +variable {G : Type} [Group G] /-! @@ -82,6 +84,8 @@ lemma jetIteratedDeriv_tmul (x : Multiset (Fin 1 ⊕ Fin 3)) (f : JetRing) (v : rw [jetIteratedDeriv_cons, LinearMap.comp_apply, ih, jetDeriv_tmul, Multiset.foldl_cons, JetRing.foldl_pderiv_pderiv] +namespace JetComponentSpace + /-! ### A.2. The coefficient at a multiset of directions @@ -126,7 +130,7 @@ lemma jetCoeffAt_apply (x : Multiset (Fin 1 ⊕ Fin 3)) representation: `jetCoeff rep U` reproduces `rep U` on constant jets, and both sides of this identity read off the same derivative of that. -/ lemma jetCoeffAt_jetCoeff [Module.Free ℂ V] [Module.Finite ℂ V] - (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) (U : JetGaugeGroupI) + (rep : Representation ℂ G (JetRing ⊗[ℂ] V)) (U : G) (x : Multiset (Fin 1 ⊕ Fin 3)) : jetCoeffAt x (jetCoeff rep U) = IsGaugeField.repCoeff rep U x := by refine LinearMap.ext fun v => ?_ @@ -211,15 +215,15 @@ lemma symbolAction_basis_tmul (c : JetRing ⊗[ℂ] Module.End ℂ V) /-- The transformation law of the derivative symbol `∂_s ψ_φ` under the jet gauge group: the all-orders Leibniz convolution of the dual representation coefficients `IsGaugeField.repDualCoeff` against lower symbols, with no inhomogeneous term. This is - the identity the `StandardModel.TransformsIn` obligations of a matter field rest on. + the identity the `LocalGaugeData.TransformsIn` obligations of a matter field rest on. Nothing here is special to the unconjugated half of the component space: the conjugate half is this lemma at `repConj rep`. -/ lemma repDual_basis_tmul [Module.Free ℂ V] [Module.Finite ℂ V] - (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) - (hlin : ∀ (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] V), + (rep : Representation ℂ G (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : G) (χ : JetRing) (z : JetRing ⊗[ℂ] V), rep U (χ • z) = χ • rep U z) - (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V) : + (U : G) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V) : repDual rep hlin U (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) = (s.antidiagonal.map fun p => DerivAlgebraComplex.basis p.2 ⊗ₜ[ℂ] @@ -229,4 +233,4 @@ lemma repDual_basis_tmul [Module.Free ℂ V] [Module.Finite ℂ V] exact congrArg Multiset.sum (Multiset.map_congr rfl fun p _ => by rw [jetCoeffAt_jetCoeff, IsGaugeField.repDualCoeff]) -end StandardModel +end JetComponentSpace diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/LocalFieldAlgebra.lean b/Physlib/ClassicalFieldTheory/JetAlgebra/LocalFieldAlgebra.lean index 0a4e5d2bc..b77708a62 100644 --- a/Physlib/ClassicalFieldTheory/JetAlgebra/LocalFieldAlgebra.lean +++ b/Physlib/ClassicalFieldTheory/JetAlgebra/LocalFieldAlgebra.lean @@ -103,7 +103,7 @@ namespace GaugeFieldData variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} [LocalGaugeDataLeibniz jets] (T : GaugeFieldData jets) + {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} (T : GaugeFieldData jets) /-! diff --git a/Physlib/Mathematics/MultisetAntidiagonal.lean b/Physlib/Mathematics/MultisetAntidiagonal.lean index 595d70700..14d0be5a9 100644 --- a/Physlib/Mathematics/MultisetAntidiagonal.lean +++ b/Physlib/Mathematics/MultisetAntidiagonal.lean @@ -109,11 +109,22 @@ lemma sum_map_finsetSum {α β M : Type*} [AddCommMonoid M] 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 first part of a splitting of `s` is a sub-multiset of `s`. -/ +lemma fst_le_of_mem_antidiagonal {ι : Type*} {s : Multiset ι} {p : Multiset ι × Multiset ι} + (hp : p ∈ s.antidiagonal) : p.1 ≤ s := + Multiset.le_iff_exists_add.mpr ⟨p.2, (Multiset.mem_antidiagonal.mp hp).symm⟩ + +/-- The second part of a splitting of `s` is a sub-multiset of `s`. -/ +lemma snd_le_of_mem_antidiagonal {ι : Type*} {s : Multiset ι} {p : Multiset ι × Multiset ι} + (hp : p ∈ s.antidiagonal) : p.2 ≤ s := + Multiset.le_iff_exists_add.mpr + ⟨p.1, by rw [add_comm]; exact (Multiset.mem_antidiagonal.mp hp).symm⟩ + /-- 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) : + (hF : ∀ p ∈ s.antidiagonal, 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] @@ -123,21 +134,28 @@ lemma sum_antidiagonal_eq_of_fst_ne_zero {ι M : Type*} [AddCommMonoid M] 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 + refine hF _ ?_ (Multiset.cons_ne_zero) + rw [Multiset.antidiagonal_cons, Multiset.mem_add] + exact Or.inr (Multiset.mem_map_of_mem _ hp), + add_zero, ih (F ∘ Prod.map id (Multiset.cons a)) fun p hp hp1 => hF _ ?_ hp1] + · rfl + · rw [Multiset.antidiagonal_cons, Multiset.mem_add] + exact Or.inl (Multiset.mem_map_of_mem _ hp) /-- 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) : + (hF : ∀ p ∈ s.antidiagonal, 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 + refine Multiset.sum_antidiagonal_eq_of_fst_ne_zero s (fun p => F (p.2, p.1)) + fun p hp hp1 => hF _ ?_ hp1 + rw [Multiset.mem_antidiagonal] at hp ⊢ + rw [add_comm] + exact hp /-- The exchange of the second and third slot in a nested antidiagonal sum. -/ lemma sum_antidiagonal_middle_exchange {ι M : Type*} [AddCommMonoid M] diff --git a/Physlib/Particles/StandardModel/AlgebraRealization/Basic.lean b/Physlib/Particles/StandardModel/AlgebraRealization/Basic.lean index 972884b22..b1f9ac9b3 100644 --- a/Physlib/Particles/StandardModel/AlgebraRealization/Basic.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/Basic.lean @@ -9,7 +9,8 @@ public import Physlib.Particles.StandardModel.Fermions.LeptonDoublet.GaugeAlgebr 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.ClassicalFieldTheory.GaugeTheory.GaugeField.Symmetrized +public import Physlib.Particles.StandardModel.GaugeGroup.MaurerCartan.Freeness public import Physlib.Particles.StandardModel.HiggsBoson.GaugeAlgebraAction public import Physlib.Particles.StandardModel.JetAlgebra.TransformsIn /-! @@ -215,8 +216,8 @@ eigenvalue equation for the mass weights; the anticommutation shape is transport private lemma map_family_repJet {V : Type} [AddCommGroup V] [Module ℂ V] {rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)} {G : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] JetAlgebra} - (hG : TransformsIn (B := JetAlgebra) JetAlgebra.repJetGaugeGroupI rep G) : - TransformsIn repJet rep fun s => h.toAlgHom.toLinearMap ∘ₗ G s := by + (hG : LocalGaugeData.TransformsIn (B := JetAlgebra) JetAlgebra.repJetGaugeGroupI rep G) : + LocalGaugeData.TransformsIn repJet rep fun s => h.toAlgHom.toLinearMap ∘ₗ G s := by intro U φ s show repJet U (h.toAlgHom _) = _ rw [← h.map_repJet, hG U φ s, map_multiset_sum, Multiset.map_map] @@ -247,7 +248,7 @@ barred families in the conjugate of it. /-- The law `repJet_A` of a Standard Model, obtained from the corresponding law of the jet algebra by pushing it along the defining algebra map. -/ -lemma repJet_A : IsGaugeField repLorentz repJet h.A where +lemma repJet_A : IsGaugeField localGaugeData repLorentz repJet h.A where lorentz_apply := by intro Λ n l μ φ have key := congrArg h.toAlgHom (JetAlgebra.isGaugeField.lorentz_apply Λ n l μ φ) @@ -269,62 +270,74 @@ lemma repJet_A : IsGaugeField repLorentz repJet h.A where /-- The law `repJet_H` of a Standard Model, obtained from the corresponding law of the jet algebra by pushing it along the defining algebra map. -/ -lemma repJet_H : TransformsIn repJet HiggsVec.repJetGaugeGroupI h.H := +lemma repJet_H : LocalGaugeData.TransformsIn repJet HiggsVec.repJetGaugeGroupI h.H := h.map_family_repJet JetAlgebra.transformsIn_higgsField /-- The law `repJet_barH` of a Standard Model, obtained from the corresponding law of the jet algebra by pushing it along the defining algebra map. -/ -lemma repJet_barH : TransformsIn repJet (repConj HiggsVec.repJetGaugeGroupI) h.barH := +lemma repJet_barH : + LocalGaugeData.TransformsIn repJet (JetComponentSpace.repConj HiggsVec.repJetGaugeGroupI) + h.barH := h.map_family_repJet JetAlgebra.transformsIn_conjHiggsField /-- The law `repJet_d` of a Standard Model, obtained from the corresponding law of the jet algebra by pushing it along the defining algebra map. -/ -lemma repJet_d : ∀ i, TransformsIn repJet DownSinglet.repJetGaugeGroupI (h.d i) := +lemma repJet_d : ∀ i, LocalGaugeData.TransformsIn repJet DownSinglet.repJetGaugeGroupI (h.d i) := fun i => h.map_family_repJet (JetAlgebra.transformsIn_downSingletField i) /-- The law `repJet_bard` of a Standard Model, obtained from the corresponding law of the jet algebra by pushing it along the defining algebra map. -/ -lemma repJet_bard : ∀ i, TransformsIn repJet (repConj DownSinglet.repJetGaugeGroupI) (h.bard i) := +lemma repJet_bard : ∀ i, + LocalGaugeData.TransformsIn repJet (JetComponentSpace.repConj DownSinglet.repJetGaugeGroupI) + (h.bard i) := fun i => h.map_family_repJet (JetAlgebra.transformsIn_conjDownSingletField i) /-- The law `repJet_u` of a Standard Model, obtained from the corresponding law of the jet algebra by pushing it along the defining algebra map. -/ -lemma repJet_u : ∀ i, TransformsIn repJet UpSinglet.repJetGaugeGroupI (h.u i) := +lemma repJet_u : ∀ i, LocalGaugeData.TransformsIn repJet UpSinglet.repJetGaugeGroupI (h.u i) := fun i => h.map_family_repJet (JetAlgebra.transformsIn_upSingletField i) /-- The law `repJet_baru` of a Standard Model, obtained from the corresponding law of the jet algebra by pushing it along the defining algebra map. -/ -lemma repJet_baru : ∀ i, TransformsIn repJet (repConj UpSinglet.repJetGaugeGroupI) (h.baru i) := +lemma repJet_baru : ∀ i, + LocalGaugeData.TransformsIn repJet (JetComponentSpace.repConj UpSinglet.repJetGaugeGroupI) + (h.baru i) := fun i => h.map_family_repJet (JetAlgebra.transformsIn_conjUpSingletField i) /-- The law `repJet_Q` of a Standard Model, obtained from the corresponding law of the jet algebra by pushing it along the defining algebra map. -/ -lemma repJet_Q : ∀ i, TransformsIn repJet QuarkDoublet.repJetGaugeGroupI (h.Q i) := +lemma repJet_Q : ∀ i, LocalGaugeData.TransformsIn repJet QuarkDoublet.repJetGaugeGroupI (h.Q i) := fun i => h.map_family_repJet (JetAlgebra.transformsIn_quarkDoubletField i) /-- The law `repJet_barQ` of a Standard Model, obtained from the corresponding law of the jet algebra by pushing it along the defining algebra map. -/ -lemma repJet_barQ : ∀ i, TransformsIn repJet (repConj QuarkDoublet.repJetGaugeGroupI) (h.barQ i) := +lemma repJet_barQ : ∀ i, + LocalGaugeData.TransformsIn repJet (JetComponentSpace.repConj QuarkDoublet.repJetGaugeGroupI) + (h.barQ i) := fun i => h.map_family_repJet (JetAlgebra.transformsIn_conjQuarkDoubletField i) /-- The law `repJet_L` of a Standard Model, obtained from the corresponding law of the jet algebra by pushing it along the defining algebra map. -/ -lemma repJet_L : ∀ i, TransformsIn repJet LeptonDoublet.repJetGaugeGroupI (h.L i) := +lemma repJet_L : ∀ i, LocalGaugeData.TransformsIn repJet LeptonDoublet.repJetGaugeGroupI (h.L i) := fun i => h.map_family_repJet (JetAlgebra.transformsIn_leptonDoubletField i) /-- The law `repJet_barL` of a Standard Model, obtained from the corresponding law of the jet algebra by pushing it along the defining algebra map. -/ -lemma repJet_barL : ∀ i, TransformsIn repJet (repConj LeptonDoublet.repJetGaugeGroupI) (h.barL i) := +lemma repJet_barL : ∀ i, + LocalGaugeData.TransformsIn repJet (JetComponentSpace.repConj LeptonDoublet.repJetGaugeGroupI) + (h.barL i) := fun i => h.map_family_repJet (JetAlgebra.transformsIn_conjLeptonDoubletField i) /-- The law `repJet_e` of a Standard Model, obtained from the corresponding law of the jet algebra by pushing it along the defining algebra map. -/ -lemma repJet_e : ∀ i, TransformsIn repJet LeptonSinglet.repJetGaugeGroupI (h.e i) := +lemma repJet_e : ∀ i, LocalGaugeData.TransformsIn repJet LeptonSinglet.repJetGaugeGroupI (h.e i) := fun i => h.map_family_repJet (JetAlgebra.transformsIn_leptonSingletField i) /-- The law `repJet_bare` of a Standard Model, obtained from the corresponding law of the jet algebra by pushing it along the defining algebra map. -/ -lemma repJet_bare : ∀ i, TransformsIn repJet (repConj LeptonSinglet.repJetGaugeGroupI) (h.bare i) := +lemma repJet_bare : ∀ i, + LocalGaugeData.TransformsIn repJet (JetComponentSpace.repConj LeptonSinglet.repJetGaugeGroupI) + (h.bare i) := fun i => h.map_family_repJet (JetAlgebra.transformsIn_conjLeptonSingletField i) /-! diff --git a/Physlib/Particles/StandardModel/AlgebraRealization/CovFieldAlgebra/Basic.lean b/Physlib/Particles/StandardModel/AlgebraRealization/CovFieldAlgebra/Basic.lean index cb990295c..1b91712ee 100644 --- a/Physlib/Particles/StandardModel/AlgebraRealization/CovFieldAlgebra/Basic.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/CovFieldAlgebra/Basic.lean @@ -187,7 +187,7 @@ theorem invariant_mem_adjoin_covDeriv {x : B} · exact fun i n l φ => IsGaugeField.commute_covDerivIter _ _ h.A_comm_A (fun s μ ψ s' φ => h.A_comm_bare s μ ψ i s' φ) n l φ p μ ψ -- the matter towers are fixed by pure gauge jets - have hS : ∀ y ∈ h.matterTowers, ∀ U : JetGaugeGroupI.truncationKer 0, repJet U.1 y = y := by + have hS : ∀ y ∈ h.matterTowers, ∀ U : localGaugeData.truncationKer 0, repJet U.1 y = y := by intro y hy U exact h.matterTowers_induction (fun y => repJet U.1 y = y) hy (fun _ l φ => h.repJet_covDerivH_of_mem_truncationKer_zero l U φ) diff --git a/Physlib/Particles/StandardModel/AlgebraRealization/CovStandardModel.lean b/Physlib/Particles/StandardModel/AlgebraRealization/CovStandardModel.lean index 0718a9b7f..6287b35dc 100644 --- a/Physlib/Particles/StandardModel/AlgebraRealization/CovStandardModel.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/CovStandardModel.lean @@ -84,7 +84,7 @@ The classification of jet-gauge invariants that section D consumes is `AlgebraRealization.invariant_mem_adjoin_covDeriv`, proved in [`CovFieldAlgebra/Basic.lean`](CovFieldAlgebra/Basic.lean); the splitting of a gauge jet into a pure jet and a constant jet is -`JetGaugeGroupI.eq_truncationProjZero_mul_ofConstant`. The +`localGaugeData.eq_truncationProjZero_mul_ofConstant`. The three sector structures are [`IsGaugeSector/Basic.lean`](../IsGaugeSector/Basic.lean), [`HiggsAlgebraCovRealization/Basic.lean`](../HiggsAlgebraCovRealization/Basic.lean) and @@ -157,7 +157,7 @@ include h in `AlgebraRealization.CovariantDeriv` together with the field-strength case of `AlgebraRealization.CovFieldAlgebra.Basic`. -/ lemma repJet_eq_of_mem_covGenerators_of_mem_truncationKer_zero - (U : JetGaugeGroupI.truncationKer 0) {x : B} (hx : x ∈ h.covGenerators) : + (U : localGaugeData.truncationKer 0) {x : B} (hx : x ∈ h.covGenerators) : repJet U.1 x = x := by rw [covGenerators] at hx rcases hx with hx | hx @@ -189,7 +189,7 @@ 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) : + (U : localGaugeData.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 @@ -221,17 +221,17 @@ theorem forall_repJet_eq_iff {x : B} (hx : x ∈ h.fieldAlgebra) : · intro hinv exact ⟨h.invariant_mem_adjoin_covDeriv hx hinv, fun g => hinv _⟩ · rintro ⟨hmem, hglob⟩ U - have hU := JetGaugeGroupI.eq_truncationProjZero_mul_ofConstant U + have hU := localGaugeData.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 ((localGaugeData.truncationProjZero U : JetGaugeGroupI) * + JetGaugeGroupI.ofConstant U.eval) x := congrArg (fun W => repJet W x) hU + _ = repJet (localGaugeData.truncationProjZero U : JetGaugeGroupI) (repJet (JetGaugeGroupI.ofConstant U.eval) x) := by rw [map_mul]; rfl - _ = repJet (JetGaugeGroupI.truncationProjZero U : JetGaugeGroupI) x := by + _ = repJet (localGaugeData.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 + (localGaugeData.truncationProjZero U) hmem include h in /-- The reduction theorem in the form used for Lagrangians: for an element of the field @@ -289,20 +289,21 @@ lemma repDualCoeff_repConj_zero_ofConstant_inv {V : Type} [AddCommGroup V] [Modu {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 = + IsGaugeField.repDualCoeff (JetComponentSpace.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, repCoeff_repConj, + IsGaugeField.repDualCoeff, LocalGaugeData.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 = +lemma localGaugeData.adjointDualCoeff_zero_ofConstant_inv (g : GaugeGroupI) : + localGaugeData.adjointDualCoeff (JetGaugeGroupI.ofConstant g)⁻¹ 0 = (GaugeAlgebra.adjointMap g⁻¹).dualMap := by - rw [adjointDualCoeff_zero, map_inv, JetGaugeGroupI.eval_ofConstant] + rw [localGaugeData.adjointDualCoeff_zero, map_inv, localGaugeData_eval, + JetGaugeGroupI.eval_ofConstant] rfl include h in @@ -315,7 +316,7 @@ lemma repGlobal_covF (g : GaugeGroupI) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3 rw [repGlobal_apply] refine (h.repJet_covDerivFieldStrength (JetGaugeGroupI.ofConstant g) (List.ofFn l) μ ν φ).trans ?_ - rw [adjointDualCoeff_zero_ofConstant_inv] + rw [localGaugeData.adjointDualCoeff_zero_ofConstant_inv] rfl include h in diff --git a/Physlib/Particles/StandardModel/AlgebraRealization/CovariantDeriv.lean b/Physlib/Particles/StandardModel/AlgebraRealization/CovariantDeriv.lean index 09f4d1748..d3d21dc2c 100644 --- a/Physlib/Particles/StandardModel/AlgebraRealization/CovariantDeriv.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/CovariantDeriv.lean @@ -450,6 +450,8 @@ covariant tower needs. namespace IsGaugeField +open _root_.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) → @@ -480,7 +482,7 @@ lemma exists_ofFn_eq (x : 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,ℂ)) +lemma repLorentz_apply_mix (hA : IsGaugeField localGaugeData 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, L[Λ] a μ • A t a χ) x 0 := by obtain ⟨n, l, rfl⟩ := exists_ofFn_eq x @@ -503,7 +505,7 @@ lemma isLorentzDerivTransforms_mix {rep : Representation ℂ SL(2,ℂ) V} `lorentzMix`, and the right-hand families are replaced by their transforms. -/ lemma repLorentz_sum_derivConv (hmul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂) - (hA : IsGaugeField repLorentz repGauge A) (Λ : SL(2,ℂ)) (ρ : Fin 1 ⊕ Fin 3) + (hA : IsGaugeField localGaugeData repLorentz repGauge A) (Λ : SL(2,ℂ)) (ρ : Fin 1 ⊕ Fin 3) {ι κ : Type} [Fintype ι] [Fintype κ] (bg : Module.Basis ι ℝ GaugeAlgebra) (coef : ι → κ → ℂ) (g g' : κ → Multiset (Fin 1 ⊕ Fin 3) → B) (hg : ∀ k y, repLorentz Λ (g k y) = lorentzMix Λ (g' k) y 0) (s : Multiset (Fin 1 ⊕ Fin 3)) : @@ -561,7 +563,7 @@ lemma actionFamConv_sum_fam {ι : Type} [Fintype ι] (ρ : Fin 1 ⊕ Fin 3) (c : 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) + (hA : IsGaugeField localGaugeData 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) : @@ -622,7 +624,7 @@ lemma actionFamConv_comp_dual (T : V →ₗ[ℂ] V) mixes by `lorentzMix`, while the value index transforms contragrediently. -/ lemma repLorentz_covDerivIter {rep : Representation ℂ SL(2,ℂ) V} (hmul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂) - (hA : IsGaugeField repLorentz repGauge A) + (hA : IsGaugeField localGaugeData 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,ℂ)) @@ -645,7 +647,7 @@ lemma repLorentz_covDerivIter {rep : Representation ℂ SL(2,ℂ) V} action with the Lorentz action on the value space. -/ theorem isLorentzCovDerivTransforms_covDerivIter {rep : Representation ℂ SL(2,ℂ) V} (hmul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂) - (hA : IsGaugeField repLorentz repGauge A) + (hA : IsGaugeField localGaugeData 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) : @@ -693,7 +695,7 @@ lemma bracketFamConv_sum_fam {ι : Type} [Fintype ι] (ρ : Fin 1 ⊕ Fin 3) (c /-- 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) + (hA : IsGaugeField localGaugeData 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) : @@ -708,7 +710,7 @@ lemma repLorentz_bracketFamConv 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,ℂ)) + (hA : IsGaugeField localGaugeData 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)) @@ -745,7 +747,7 @@ lemma iteratedCovDerivAdjoint_sum_fam {ι : Type} [Fintype ι] (c : ι → ℂ) 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) + (hA : IsGaugeField localGaugeData 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, L[Λ] a μ • ∑ b, L[Λ] b ν • fieldStrength A a b t φ) x 0 := by @@ -786,7 +788,7 @@ lemma repLorentz_fieldStrength_mix 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 : ℕ) + (hA : IsGaugeField localGaugeData 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 φ) = @@ -885,6 +887,8 @@ convolution over the empty multiset having a single term. namespace IsGaugeField +open _root_.IsGaugeField + variable {B : Type} [Ring B] [Algebra ℂ B] {repGauge : Representation ℂ JetGaugeGroupI B} variable {A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} variable {V : Type} [AddCommGroup V] [Module ℂ V] [FiniteDimensional ℂ V] @@ -923,15 +927,6 @@ lemma commute_covDerivIter rintro y (⟨s, μ', ψ', rfl⟩ | ⟨s, φ', rfl⟩) exacts [hAA s p μ' μ ψ' ψ, (hAF p μ ψ s φ').symm] -/-- An adjoint gauge tensor transforms at the base point through the dual adjoint - coefficient of the base-point value of the gauge jet alone. -/ -lemma TransformsInAdjoint.repGauge_zero - {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} - (hF : TransformsInAdjoint repGauge F) (U : JetGaugeGroupI) (φ : Module.Dual ℝ GaugeAlgebra) : - repGauge U (F 0 φ) = F 0 (adjointDualCoeff U⁻¹ 0 φ) := by - simpa only [Multiset.antidiagonal_zero, Multiset.map_singleton, Multiset.sum_singleton] using - hF U φ 0 - end IsGaugeField /-! @@ -1187,7 +1182,8 @@ lemma fieldAlgebra_eq_covDeriv : ## J. Gauge covariance of the covariant towers Each matter tower transforms in the representation of its species, by -`TransformsIn.covDerivIter`; the field-strength tower transforms in the adjoint. At the +`LocalGaugeData.TransformsIn.covDerivIter`; the field-strength tower transforms in the adjoint. +At the base point that is the action of the base-point value of the gauge jet alone, and a pure gauge jet — one with trivial base-point value — fixes every tower. @@ -1195,90 +1191,98 @@ gauge jet — one with trivial base-point value — fixes every tower. /-- The covariant tower of the Higgs transforms in the Higgs representation. -/ lemma transformsIn_covDerivH (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : - TransformsIn repJet HiggsVec.repJetGaugeGroupI + LocalGaugeData.TransformsIn repJet HiggsVec.repJetGaugeGroupI (IsGaugeField.covDerivIter h.A HiggsVec.gaugeAlgebraAction h.H n l) := - TransformsIn.covDerivIter h.repJet_A h.repJet_H HiggsVec.isInfinitesimalActionOf n l + LocalGaugeData.TransformsIn.covDerivIter h.repJet_A h.repJet_H + HiggsVec.isInfinitesimalActionOf n l /-- The covariant tower of the conjugate Higgs transforms in the conjugate Higgs representation. -/ lemma transformsIn_covDerivBarH (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : - TransformsIn repJet (repConj HiggsVec.repJetGaugeGroupI) + LocalGaugeData.TransformsIn repJet (JetComponentSpace.repConj HiggsVec.repJetGaugeGroupI) (IsGaugeField.covDerivIter h.A (LocalGaugeData.actionConj HiggsVec.gaugeAlgebraAction) h.barH n l) := - TransformsIn.covDerivIter h.repJet_A h.repJet_barH HiggsVec.isInfinitesimalActionOf.conj n l + LocalGaugeData.TransformsIn.covDerivIter h.repJet_A h.repJet_barH + HiggsVec.isInfinitesimalActionOf.conj n l /-- The covariant tower of the down-type quarks transforms in their representation. -/ lemma transformsIn_covDerivD (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : - TransformsIn repJet DownSinglet.repJetGaugeGroupI + LocalGaugeData.TransformsIn repJet DownSinglet.repJetGaugeGroupI (IsGaugeField.covDerivIter h.A DownSinglet.gaugeAlgebraAction (h.d i) n l) := - TransformsIn.covDerivIter h.repJet_A (h.repJet_d i) DownSinglet.isInfinitesimalActionOf n l + LocalGaugeData.TransformsIn.covDerivIter h.repJet_A (h.repJet_d i) + DownSinglet.isInfinitesimalActionOf n l /-- The covariant tower of the conjugate down-type quarks transforms in their conjugate representation. -/ lemma transformsIn_covDerivBarD (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : - TransformsIn repJet (repConj DownSinglet.repJetGaugeGroupI) + LocalGaugeData.TransformsIn repJet (JetComponentSpace.repConj DownSinglet.repJetGaugeGroupI) (IsGaugeField.covDerivIter h.A (LocalGaugeData.actionConj DownSinglet.gaugeAlgebraAction) (h.bard i) n l) := - TransformsIn.covDerivIter h.repJet_A (h.repJet_bard i) + LocalGaugeData.TransformsIn.covDerivIter h.repJet_A (h.repJet_bard i) DownSinglet.isInfinitesimalActionOf.conj n l /-- The covariant tower of the up-type quarks transforms in their representation. -/ lemma transformsIn_covDerivU (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : - TransformsIn repJet UpSinglet.repJetGaugeGroupI + LocalGaugeData.TransformsIn repJet UpSinglet.repJetGaugeGroupI (IsGaugeField.covDerivIter h.A UpSinglet.gaugeAlgebraAction (h.u i) n l) := - TransformsIn.covDerivIter h.repJet_A (h.repJet_u i) UpSinglet.isInfinitesimalActionOf n l + LocalGaugeData.TransformsIn.covDerivIter h.repJet_A (h.repJet_u i) + UpSinglet.isInfinitesimalActionOf n l /-- The covariant tower of the conjugate up-type quarks transforms in their conjugate representation. -/ lemma transformsIn_covDerivBarU (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : - TransformsIn repJet (repConj UpSinglet.repJetGaugeGroupI) + LocalGaugeData.TransformsIn repJet (JetComponentSpace.repConj UpSinglet.repJetGaugeGroupI) (IsGaugeField.covDerivIter h.A (LocalGaugeData.actionConj UpSinglet.gaugeAlgebraAction) (h.baru i) n l) := - TransformsIn.covDerivIter h.repJet_A (h.repJet_baru i) UpSinglet.isInfinitesimalActionOf.conj n l + LocalGaugeData.TransformsIn.covDerivIter h.repJet_A (h.repJet_baru i) + UpSinglet.isInfinitesimalActionOf.conj n l /-- The covariant tower of the quark doublets transforms in their representation. -/ lemma transformsIn_covDerivQ (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : - TransformsIn repJet QuarkDoublet.repJetGaugeGroupI + LocalGaugeData.TransformsIn repJet QuarkDoublet.repJetGaugeGroupI (IsGaugeField.covDerivIter h.A QuarkDoublet.gaugeAlgebraAction (h.Q i) n l) := - TransformsIn.covDerivIter h.repJet_A (h.repJet_Q i) QuarkDoublet.isInfinitesimalActionOf n l + LocalGaugeData.TransformsIn.covDerivIter h.repJet_A (h.repJet_Q i) + QuarkDoublet.isInfinitesimalActionOf n l /-- The covariant tower of the conjugate quark doublets transforms in their conjugate representation. -/ lemma transformsIn_covDerivBarQ (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : - TransformsIn repJet (repConj QuarkDoublet.repJetGaugeGroupI) + LocalGaugeData.TransformsIn repJet (JetComponentSpace.repConj QuarkDoublet.repJetGaugeGroupI) (IsGaugeField.covDerivIter h.A (LocalGaugeData.actionConj QuarkDoublet.gaugeAlgebraAction) (h.barQ i) n l) := - TransformsIn.covDerivIter h.repJet_A (h.repJet_barQ i) + LocalGaugeData.TransformsIn.covDerivIter h.repJet_A (h.repJet_barQ i) QuarkDoublet.isInfinitesimalActionOf.conj n l /-- The covariant tower of the lepton doublets transforms in their representation. -/ lemma transformsIn_covDerivL (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : - TransformsIn repJet LeptonDoublet.repJetGaugeGroupI + LocalGaugeData.TransformsIn repJet LeptonDoublet.repJetGaugeGroupI (IsGaugeField.covDerivIter h.A LeptonDoublet.gaugeAlgebraAction (h.L i) n l) := - TransformsIn.covDerivIter h.repJet_A (h.repJet_L i) LeptonDoublet.isInfinitesimalActionOf n l + LocalGaugeData.TransformsIn.covDerivIter h.repJet_A (h.repJet_L i) + LeptonDoublet.isInfinitesimalActionOf n l /-- The covariant tower of the conjugate lepton doublets transforms in their conjugate representation. -/ lemma transformsIn_covDerivBarL (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : - TransformsIn repJet (repConj LeptonDoublet.repJetGaugeGroupI) + LocalGaugeData.TransformsIn repJet (JetComponentSpace.repConj LeptonDoublet.repJetGaugeGroupI) (IsGaugeField.covDerivIter h.A (LocalGaugeData.actionConj LeptonDoublet.gaugeAlgebraAction) (h.barL i) n l) := - TransformsIn.covDerivIter h.repJet_A (h.repJet_barL i) + LocalGaugeData.TransformsIn.covDerivIter h.repJet_A (h.repJet_barL i) LeptonDoublet.isInfinitesimalActionOf.conj n l /-- The covariant tower of the lepton singlets transforms in their representation. -/ lemma transformsIn_covDerivE (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : - TransformsIn repJet LeptonSinglet.repJetGaugeGroupI + LocalGaugeData.TransformsIn repJet LeptonSinglet.repJetGaugeGroupI (IsGaugeField.covDerivIter h.A LeptonSinglet.gaugeAlgebraAction (h.e i) n l) := - TransformsIn.covDerivIter h.repJet_A (h.repJet_e i) LeptonSinglet.isInfinitesimalActionOf n l + LocalGaugeData.TransformsIn.covDerivIter h.repJet_A (h.repJet_e i) + LeptonSinglet.isInfinitesimalActionOf n l /-- The covariant tower of the conjugate lepton singlets transforms in their conjugate representation. -/ lemma transformsIn_covDerivBarE (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : - TransformsIn repJet (repConj LeptonSinglet.repJetGaugeGroupI) + LocalGaugeData.TransformsIn repJet (JetComponentSpace.repConj LeptonSinglet.repJetGaugeGroupI) (IsGaugeField.covDerivIter h.A (LocalGaugeData.actionConj LeptonSinglet.gaugeAlgebraAction) (h.bare i) n l) := - TransformsIn.covDerivIter h.repJet_A (h.repJet_bare i) + LocalGaugeData.TransformsIn.covDerivIter h.repJet_A (h.repJet_bare i) LeptonSinglet.isInfinitesimalActionOf.conj n l /-- The covariant tower of the Higgs transforms through the base point of a gauge jet. -/ @@ -1293,7 +1297,9 @@ lemma repJet_covDerivH {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGauge lemma repJet_covDerivBarH {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI) (φ : Module.Dual ℂ (ConjModule HiggsVec)) : repJet U (h.covDerivBarH l φ) = - h.covDerivBarH l (IsGaugeField.repDualCoeff (repConj HiggsVec.repJetGaugeGroupI) U⁻¹ 0 φ) := + h.covDerivBarH l + (IsGaugeField.repDualCoeff (JetComponentSpace.repConj HiggsVec.repJetGaugeGroupI) + U⁻¹ 0 φ) := (h.transformsIn_covDerivBarH n l).repGauge_zero U φ /-- The covariant tower of the down-type quarks transforms through the base point of a @@ -1310,7 +1316,8 @@ lemma repJet_covDerivBarD (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule DownSinglet)) : repJet U (h.covDerivBarD i l φ) = h.covDerivBarD i l - (IsGaugeField.repDualCoeff (repConj DownSinglet.repJetGaugeGroupI) U⁻¹ 0 φ) := + (IsGaugeField.repDualCoeff (JetComponentSpace.repConj DownSinglet.repJetGaugeGroupI) + U⁻¹ 0 φ) := (h.transformsIn_covDerivBarD i n l).repGauge_zero U φ /-- The covariant tower of the up-type quarks transforms through the base point of a gauge @@ -1327,7 +1334,8 @@ lemma repJet_covDerivBarU (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule UpSinglet)) : repJet U (h.covDerivBarU i l φ) = h.covDerivBarU i l - (IsGaugeField.repDualCoeff (repConj UpSinglet.repJetGaugeGroupI) U⁻¹ 0 φ) := + (IsGaugeField.repDualCoeff (JetComponentSpace.repConj UpSinglet.repJetGaugeGroupI) + U⁻¹ 0 φ) := (h.transformsIn_covDerivBarU i n l).repGauge_zero U φ /-- The covariant tower of the quark doublets transforms through the base point of a gauge @@ -1344,7 +1352,8 @@ lemma repJet_covDerivBarQ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) : repJet U (h.covDerivBarQ i l φ) = h.covDerivBarQ i l - (IsGaugeField.repDualCoeff (repConj QuarkDoublet.repJetGaugeGroupI) U⁻¹ 0 φ) := + (IsGaugeField.repDualCoeff (JetComponentSpace.repConj QuarkDoublet.repJetGaugeGroupI) + U⁻¹ 0 φ) := (h.transformsIn_covDerivBarQ i n l).repGauge_zero U φ /-- The covariant tower of the lepton doublets transforms through the base point of a gauge @@ -1361,7 +1370,8 @@ lemma repJet_covDerivBarL (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule LeptonDoublet)) : repJet U (h.covDerivBarL i l φ) = h.covDerivBarL i l - (IsGaugeField.repDualCoeff (repConj LeptonDoublet.repJetGaugeGroupI) U⁻¹ 0 φ) := + (IsGaugeField.repDualCoeff (JetComponentSpace.repConj LeptonDoublet.repJetGaugeGroupI) + U⁻¹ 0 φ) := (h.transformsIn_covDerivBarL i n l).repGauge_zero U φ /-- The covariant tower of the lepton singlets transforms through the base point of a gauge @@ -1378,27 +1388,28 @@ lemma repJet_covDerivBarE (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ (ConjModule LeptonSinglet)) : repJet U (h.covDerivBarE i l φ) = h.covDerivBarE i l - (IsGaugeField.repDualCoeff (repConj LeptonSinglet.repJetGaugeGroupI) U⁻¹ 0 φ) := + (IsGaugeField.repDualCoeff (JetComponentSpace.repConj LeptonSinglet.repJetGaugeGroupI) + U⁻¹ 0 φ) := (h.transformsIn_covDerivBarE i n l).repGauge_zero U φ /-- A pure gauge jet fixes the covariant tower of the Higgs. -/ lemma repJet_covDerivH_of_mem_truncationKer_zero {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) - (U : JetGaugeGroupI.truncationKer 0) (φ : Module.Dual ℂ HiggsVec) : + (U : localGaugeData.truncationKer 0) (φ : Module.Dual ℂ HiggsVec) : 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 φ /-- A pure gauge jet fixes the covariant tower of the conjugate Higgs. -/ lemma repJet_covDerivBarH_of_mem_truncationKer_zero {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) - (U : JetGaugeGroupI.truncationKer 0) (φ : Module.Dual ℂ (ConjModule HiggsVec)) : + (U : localGaugeData.truncationKer 0) (φ : Module.Dual ℂ (ConjModule HiggsVec)) : repJet U.1 (h.covDerivBarH l φ) = h.covDerivBarH l φ := (h.transformsIn_covDerivBarH n l).repGauge_eq_of_mem_truncationKer_zero - (fun hW => repCoeff_repConj_zero_eq_id + (fun hW => LocalGaugeData.repCoeff_repConj_zero_eq_id (HiggsVec.repCoeff_zero_of_eval_eq_one hW)) U φ /-- A pure gauge jet fixes the covariant tower of the down-type quarks. -/ lemma repJet_covDerivD_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} - (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI.truncationKer 0) + (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : localGaugeData.truncationKer 0) (φ : Module.Dual ℂ DownSinglet) : repJet U.1 (h.covDerivD i l φ) = h.covDerivD i l φ := (h.transformsIn_covDerivD i n l).repGauge_eq_of_mem_truncationKer_zero @@ -1406,16 +1417,16 @@ lemma repJet_covDerivD_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} /-- A pure gauge jet fixes the covariant tower of the conjugate down-type quarks. -/ lemma repJet_covDerivBarD_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} - (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI.truncationKer 0) + (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : localGaugeData.truncationKer 0) (φ : Module.Dual ℂ (ConjModule DownSinglet)) : 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 => repCoeff_repConj_zero_eq_id + (fun hW => LocalGaugeData.repCoeff_repConj_zero_eq_id (DownSinglet.repCoeff_zero_of_eval_eq_one hW)) U φ /-- A pure gauge jet fixes the covariant tower of the up-type quarks. -/ lemma repJet_covDerivU_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} - (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI.truncationKer 0) + (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : localGaugeData.truncationKer 0) (φ : Module.Dual ℂ UpSinglet) : repJet U.1 (h.covDerivU i l φ) = h.covDerivU i l φ := (h.transformsIn_covDerivU i n l).repGauge_eq_of_mem_truncationKer_zero @@ -1423,16 +1434,16 @@ lemma repJet_covDerivU_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} /-- A pure gauge jet fixes the covariant tower of the conjugate up-type quarks. -/ lemma repJet_covDerivBarU_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} - (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI.truncationKer 0) + (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : localGaugeData.truncationKer 0) (φ : Module.Dual ℂ (ConjModule UpSinglet)) : 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 => repCoeff_repConj_zero_eq_id + (fun hW => LocalGaugeData.repCoeff_repConj_zero_eq_id (UpSinglet.repCoeff_zero_of_eval_eq_one hW)) U φ /-- A pure gauge jet fixes the covariant tower of the quark doublets. -/ lemma repJet_covDerivQ_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} - (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI.truncationKer 0) + (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : localGaugeData.truncationKer 0) (φ : Module.Dual ℂ QuarkDoublet) : repJet U.1 (h.covDerivQ i l φ) = h.covDerivQ i l φ := (h.transformsIn_covDerivQ i n l).repGauge_eq_of_mem_truncationKer_zero @@ -1440,16 +1451,16 @@ lemma repJet_covDerivQ_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} /-- A pure gauge jet fixes the covariant tower of the conjugate quark doublets. -/ lemma repJet_covDerivBarQ_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} - (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI.truncationKer 0) + (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : localGaugeData.truncationKer 0) (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) : 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 => repCoeff_repConj_zero_eq_id + (fun hW => LocalGaugeData.repCoeff_repConj_zero_eq_id (QuarkDoublet.repCoeff_zero_of_eval_eq_one hW)) U φ /-- A pure gauge jet fixes the covariant tower of the lepton doublets. -/ lemma repJet_covDerivL_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} - (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI.truncationKer 0) + (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : localGaugeData.truncationKer 0) (φ : Module.Dual ℂ LeptonDoublet) : repJet U.1 (h.covDerivL i l φ) = h.covDerivL i l φ := (h.transformsIn_covDerivL i n l).repGauge_eq_of_mem_truncationKer_zero @@ -1457,16 +1468,16 @@ lemma repJet_covDerivL_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} /-- A pure gauge jet fixes the covariant tower of the conjugate lepton doublets. -/ lemma repJet_covDerivBarL_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} - (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI.truncationKer 0) + (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : localGaugeData.truncationKer 0) (φ : Module.Dual ℂ (ConjModule LeptonDoublet)) : 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 => repCoeff_repConj_zero_eq_id + (fun hW => LocalGaugeData.repCoeff_repConj_zero_eq_id (LeptonDoublet.repCoeff_zero_of_eval_eq_one hW)) U φ /-- A pure gauge jet fixes the covariant tower of the lepton singlets. -/ lemma repJet_covDerivE_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} - (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI.truncationKer 0) + (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : localGaugeData.truncationKer 0) (φ : Module.Dual ℂ LeptonSinglet) : repJet U.1 (h.covDerivE i l φ) = h.covDerivE i l φ := (h.transformsIn_covDerivE i n l).repGauge_eq_of_mem_truncationKer_zero @@ -1474,11 +1485,11 @@ lemma repJet_covDerivE_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} /-- A pure gauge jet fixes the covariant tower of the conjugate lepton singlets. -/ lemma repJet_covDerivBarE_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} - (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI.truncationKer 0) + (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : localGaugeData.truncationKer 0) (φ : Module.Dual ℂ (ConjModule LeptonSinglet)) : 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 => repCoeff_repConj_zero_eq_id + (fun hW => LocalGaugeData.repCoeff_repConj_zero_eq_id (LeptonSinglet.repCoeff_zero_of_eval_eq_one hW)) U φ /-- The covariant tower of the field strength is antisymmetric in its two covector @@ -1495,7 +1506,7 @@ lemma covDerivFieldStrength_swap (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ /-- The covariant tower of the field strength transforms in the adjoint. -/ lemma transformsInAdjoint_covDerivFieldStrength (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : - IsGaugeField.TransformsInAdjoint repJet + IsGaugeField.TransformsInAdjoint localGaugeData repJet (IsGaugeField.iteratedCovDerivAdjoint h.A l (IsGaugeField.fieldStrength h.A μ ν)) := IsGaugeField.transformsInAdjoint_iteratedCovDerivAdjoint h.repJet_A l μ ν @@ -1504,12 +1515,12 @@ lemma transformsInAdjoint_covDerivFieldStrength (l : List (Fin 1 ⊕ Fin 3)) 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 φ) := + h.covDerivFieldStrength l μ ν (localGaugeData.adjointDualCoeff U⁻¹ 0 φ) := (h.transformsInAdjoint_covDerivFieldStrength l μ ν).repGauge_zero U φ /-- A pure gauge jet fixes the covariant tower of the field strength. -/ lemma repJet_covDerivFieldStrength_of_mem_truncationKer_zero - (U : JetGaugeGroupI.truncationKer 0) (l : List (Fin 1 ⊕ Fin 3)) + (U : localGaugeData.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 diff --git a/Physlib/Particles/StandardModel/CovAlgebraRealization/Basic.lean b/Physlib/Particles/StandardModel/CovAlgebraRealization/Basic.lean index 446fde349..cbb0d6ec3 100644 --- a/Physlib/Particles/StandardModel/CovAlgebraRealization/Basic.lean +++ b/Physlib/Particles/StandardModel/CovAlgebraRealization/Basic.lean @@ -879,6 +879,8 @@ algebra's own covariant towers pushed along the defining map. namespace IsGaugeField +open _root_.IsGaugeField + variable {B B' : Type} [Ring B] [Algebra ℂ B] [Ring B'] [Algebra ℂ B'] {V : Type} [AddCommGroup V] [Module ℂ V] [Module.Finite ℂ V] diff --git a/Physlib/Particles/StandardModel/Fermions/DownSinglet/Basic.lean b/Physlib/Particles/StandardModel/Fermions/DownSinglet/Basic.lean index 1961cc029..f12951f64 100644 --- a/Physlib/Particles/StandardModel/Fermions/DownSinglet/Basic.lean +++ b/Physlib/Particles/StandardModel/Fermions/DownSinglet/Basic.lean @@ -9,10 +9,10 @@ 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.JetGaugeGroup.Basic -public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.CovariantDeriv public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction -public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.Basic -public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.GaugeAction +public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData +public import Physlib.ClassicalFieldTheory.JetAlgebra.JetComponentSpace.GaugeAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeAction 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/DownSinglet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/DownSinglet/GaugeAlgebraAction.lean index 3b1a3a705..405d6bca5 100644 --- a/Physlib/Particles/StandardModel/Fermions/DownSinglet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/DownSinglet/GaugeAlgebraAction.lean @@ -8,7 +8,7 @@ module public import Physlib.Particles.StandardModel.Fermions.DownSinglet.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData -public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.GaugeAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeAction public import Mathlib.LinearAlgebra.TensorProduct.Pi public import Mathlib.Analysis.Normed.Lp.Matrix public import Mathlib.RingTheory.TensorProduct.Maps @@ -269,7 +269,7 @@ private lemma pderivColour_comp_foldColour (μ : Fin 1 ⊕ Fin 3) entrywise derivative on the colour coordinates. -/ private lemma jetValLinEquiv_jetDeriv (μ : Fin 1 ⊕ Fin 3) (z : JetRing ⊗[ℂ] DownSinglet) : - jetValLinEquiv (StandardModel.jetDeriv μ z) + jetValLinEquiv (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] @@ -281,7 +281,7 @@ private lemma jetValLinEquiv_jetDeriv (μ : Fin 1 ⊕ Fin 3) 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)) + rw [show 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, @@ -300,22 +300,22 @@ private lemma jetValLinEquiv_jetDeriv (μ : Fin 1 ⊕ Fin 3) 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) + jetValLinEquiv (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, + rw [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, + rw [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) + valLinEquiv (jetEval z) = (TensorProduct.map LinearMap.id ccColour) (jetValLinEquiv z) := by induction z using TensorProduct.induction_on with | zero => simp; rfl @@ -328,7 +328,7 @@ private lemma valLinEquiv_jetEval (z : JetRing ⊗[ℂ] DownSinglet) : simp rfl | tmul ψ c => - rw [StandardModel.jetEval_tmul, map_smul, + rw [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, @@ -443,12 +443,12 @@ lemma repCoeff_eq (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : 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, + = jetEval (jetIteratedDeriv x + (repJetGaugeGroupI U (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] + jetOfConstant_apply] obtain ⟨w⟩ := d induction w using TensorProduct.induction_on with | zero => @@ -534,7 +534,7 @@ theorem isInfinitesimalActionOf : localGaugeData.IsInfinitesimalActionOf gaugeAlgebraAction repJetGaugeGroupI := by constructor · intro U μ x - simp only [localGaugeData_repCoeff, localGaugeData_evalLie, + simp only [localGaugeData_evalLie, localGaugeData_iteratedDeriv, localGaugeData_maurerCartan] have hMcons : ((downMatrix U).map fun f => constantCoeff ((μ ::ₘ x).foldl (fun h ρ => pderiv ℂ ρ h) f)) @@ -558,7 +558,7 @@ theorem isInfinitesimalActionOf : 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] + JetRing.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] @@ -567,7 +567,7 @@ theorem isInfinitesimalActionOf : rw [Function.comp_apply, colourEnd_mul, repCoeff_eq] rfl · intro U x c - simp only [localGaugeData_repCoeff, localGaugeData_adjointCoeff] + simp only [localGaugeData_adjointCoeff_apply] 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] @@ -599,7 +599,7 @@ theorem isInfinitesimalActionOf : 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) + actionMatrix (localGaugeData.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 @@ -607,20 +607,20 @@ theorem isInfinitesimalActionOf : = ((downMatrix U).map fun f => constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) * actionMatrix c := by - rw [hconst, matrix_constantCoeff_foldl_pderiv_mul, + rw [hconst, JetRing.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]), + (fun p _ hp => by rw [if_neg hp, Matrix.mul_zero]), if_pos rfl] - rw [← h1, downMatrix_mul_jetActionMatrix, matrix_constantCoeff_foldl_pderiv_mul] + rw [← h1, downMatrix_mul_jetActionMatrix, JetRing.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]) + = localGaugeData.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))) diff --git a/Physlib/Particles/StandardModel/Fermions/JetAlgebra/Species.lean b/Physlib/Particles/StandardModel/Fermions/JetAlgebra/Species.lean index c75d140ce..ee46a8c0e 100644 --- a/Physlib/Particles/StandardModel/Fermions/JetAlgebra/Species.lean +++ b/Physlib/Particles/StandardModel/Fermions/JetAlgebra/Species.lean @@ -6,7 +6,8 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.Fermions.JetAlgebra.Basic -public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.CovariantDeriv +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction +public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData /-! # Species compatibility inside the fermionic target space diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/Basic.lean b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/Basic.lean index 7d338b018..7671b44aa 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/Basic.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/Basic.lean @@ -9,7 +9,8 @@ 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.JetGaugeGroup.Basic -public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.CovariantDeriv +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction +public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData 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/LeptonDoublet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean index f48851d5f..4acf714ba 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean @@ -8,7 +8,7 @@ module public import Physlib.Particles.StandardModel.Fermions.LeptonDoublet.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData -public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.GaugeAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeAction public import Mathlib.LinearAlgebra.TensorProduct.Pi public import Mathlib.Analysis.Normed.Lp.Matrix public import Mathlib.RingTheory.TensorProduct.Maps @@ -276,7 +276,7 @@ private lemma pderivWeak_comp_foldWeak (μ : Fin 1 ⊕ Fin 3) entrywise derivative on the weak coordinates. -/ private lemma jetValLinEquiv_jetDeriv (μ : Fin 1 ⊕ Fin 3) (z : JetRing ⊗[ℂ] LeptonDoublet) : - jetValLinEquiv (StandardModel.jetDeriv μ z) + jetValLinEquiv (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] @@ -288,7 +288,7 @@ private lemma jetValLinEquiv_jetDeriv (μ : Fin 1 ⊕ Fin 3) 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)) + rw [show 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, @@ -307,22 +307,22 @@ private lemma jetValLinEquiv_jetDeriv (μ : Fin 1 ⊕ Fin 3) 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) + jetValLinEquiv (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, + rw [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, + rw [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) + valLinEquiv (jetEval z) = (TensorProduct.map LinearMap.id ccWeak) (jetValLinEquiv z) := by induction z using TensorProduct.induction_on with | zero => simp; rfl @@ -335,7 +335,7 @@ private lemma valLinEquiv_jetEval (z : JetRing ⊗[ℂ] LeptonDoublet) : simp rfl | tmul ψ c => - rw [StandardModel.jetEval_tmul, map_smul, + rw [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, @@ -456,12 +456,12 @@ lemma repCoeff_eq (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : 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, + = jetEval (jetIteratedDeriv x + (repJetGaugeGroupI U (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] + jetOfConstant_apply] obtain ⟨w⟩ := d induction w using TensorProduct.induction_on with | zero => @@ -547,7 +547,7 @@ theorem isInfinitesimalActionOf : localGaugeData.IsInfinitesimalActionOf gaugeAlgebraAction repJetGaugeGroupI := by constructor · intro U μ x - simp only [localGaugeData_repCoeff, localGaugeData_evalLie, + simp only [localGaugeData_evalLie, localGaugeData_iteratedDeriv, localGaugeData_maurerCartan] have hMcons : ((doubletMatrix U).map fun f => constantCoeff ((μ ::ₘ x).foldl (fun h ρ => pderiv ℂ ρ h) f)) @@ -571,7 +571,7 @@ theorem isInfinitesimalActionOf : 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] + JetRing.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] @@ -580,7 +580,7 @@ theorem isInfinitesimalActionOf : rw [Function.comp_apply, weakEnd_mul, repCoeff_eq] rfl · intro U x c - simp only [localGaugeData_repCoeff, localGaugeData_adjointCoeff] + simp only [localGaugeData_adjointCoeff_apply] 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] @@ -612,7 +612,7 @@ theorem isInfinitesimalActionOf : 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) + actionMatrix (localGaugeData.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 @@ -620,20 +620,20 @@ theorem isInfinitesimalActionOf : = ((doubletMatrix U).map fun f => constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) * actionMatrix c := by - rw [hconst, matrix_constantCoeff_foldl_pderiv_mul, + rw [hconst, JetRing.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]), + (fun p _ hp => by rw [if_neg hp, Matrix.mul_zero]), if_pos rfl] - rw [← h1, doubletMatrix_mul_jetActionMatrix, matrix_constantCoeff_foldl_pderiv_mul] + rw [← h1, doubletMatrix_mul_jetActionMatrix, JetRing.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]) + = localGaugeData.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))) diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/GaugeAlgebraAction.lean index f221437b6..5e7987a89 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/GaugeAlgebraAction.lean @@ -8,7 +8,7 @@ module public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData -public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.GaugeAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeAction /-! # The gauge-algebra action on the charged-lepton singlet @@ -181,10 +181,10 @@ lemma repCoeff_eq (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : • (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, + = jetEval (jetIteratedDeriv x + (repJetGaugeGroupI U (jetOfConstant l))) from rfl, + jetOfConstant_apply, repJetGaugeGroupI_tmul, mul_one, + jetIteratedDeriv_tmul, jetEval_tmul, jetPhase_eq, LinearMap.smul_apply, LinearMap.id_apply] /-- At the base point, a gauge jet with trivial value acts trivially: the zeroth @@ -264,7 +264,7 @@ theorem isInfinitesimalActionOf : localGaugeData.IsInfinitesimalActionOf gaugeAlgebraAction repJetGaugeGroupI := by constructor · intro U μ x - simp only [localGaugeData_repCoeff, localGaugeData_evalLie, + simp only [localGaugeData_evalLie, localGaugeData_iteratedDeriv, localGaugeData_maurerCartan] have hMcons : constantCoeff ((μ ::ₘ x).foldl (fun h ρ => pderiv ℂ ρ h) (jetPhase U)) = -((x.antidiagonal.map fun p => @@ -282,16 +282,16 @@ theorem isInfinitesimalActionOf : 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 - simp only [localGaugeData_repCoeff, localGaugeData_adjointCoeff] + simp only [localGaugeData_adjointCoeff_apply] have hterm : ∀ p : Multiset (Fin 1 ⊕ Fin 3) × Multiset (Fin 1 ⊕ Fin 3), - gaugeAlgebraAction (IsGaugeField.adjointCoeff U p.1 c) + gaugeAlgebraAction (localGaugeData.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] + localGaugeData_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))) @@ -312,7 +312,7 @@ theorem isInfinitesimalActionOf : (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, + • (LinearMap.id : LeptonSinglet →ₗ[ℂ] LeptonSinglet)) (fun p _ hp => hvan p hp), show ((0 : Multiset (Fin 1 ⊕ Fin 3)).foldl (fun h ρ => pderiv ℂ ρ h) (C c.toU1Value : JetRing)) = C c.toU1Value from rfl, constantCoeff_C] diff --git a/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/Basic.lean b/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/Basic.lean index a79c5db2e..56baa5f0f 100644 --- a/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/Basic.lean +++ b/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/Basic.lean @@ -9,7 +9,8 @@ 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.JetGaugeGroup.Basic -public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.CovariantDeriv +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction +public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData 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/QuarkDoublet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/GaugeAlgebraAction.lean index 973923366..23a4057d1 100644 --- a/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/GaugeAlgebraAction.lean @@ -8,7 +8,7 @@ module public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData -public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.GaugeAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeAction public import Mathlib.LinearAlgebra.TensorProduct.Pi public import Mathlib.LinearAlgebra.Matrix.Kronecker public import Mathlib.Analysis.Normed.Lp.Matrix @@ -309,7 +309,7 @@ private lemma pderivColourWeak_comp_foldColourWeak (μ : Fin 1 ⊕ Fin 3) entrywise derivative on the colour–weak coordinates. -/ private lemma jetValLinEquiv_jetDeriv (μ : Fin 1 ⊕ Fin 3) (z : JetRing ⊗[ℂ] QuarkDoublet) : - jetValLinEquiv (StandardModel.jetDeriv μ z) + jetValLinEquiv (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] @@ -328,7 +328,7 @@ private lemma jetValLinEquiv_jetDeriv (μ : Fin 1 ⊕ Fin 3) rw [TensorProduct.zero_tmul]; rfl, TensorProduct.tmul_zero, map_zero, map_zero, map_zero] | tmul ψ c => - rw [show StandardModel.jetDeriv μ + rw [show jetDeriv μ (f ⊗ₜ[ℂ] (⟨ψ ⊗ₜ[ℂ] c ⊗ₜ[ℂ] w⟩ : QuarkDoublet)) = (pderiv ℂ μ f) ⊗ₜ[ℂ] (⟨ψ ⊗ₜ[ℂ] c ⊗ₜ[ℂ] w⟩ : QuarkDoublet) from rfl, show jetValLinEquiv @@ -362,23 +362,23 @@ private lemma jetValLinEquiv_jetDeriv (μ : Fin 1 ⊕ Fin 3) 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) + jetValLinEquiv (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, + rw [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, + rw [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) + colourWeakValLinEquiv (jetEval z) = (TensorProduct.map LinearMap.id ccColourWeak) (jetValLinEquiv z) := by induction z using TensorProduct.induction_on with | zero => simp @@ -397,7 +397,7 @@ private lemma colourWeakValLinEquiv_jetEval (z : JetRing ⊗[ℂ] QuarkDoublet) rw [TensorProduct.zero_tmul]; rfl, TensorProduct.tmul_zero] simp | tmul ψ c => - rw [StandardModel.jetEval_tmul, map_smul, + rw [jetEval_tmul, map_smul, show colourWeakValLinEquiv (⟨ψ ⊗ₜ[ℂ] c ⊗ₜ[ℂ] w⟩ : QuarkDoublet) = ψ ⊗ₜ[ℂ] (WithLp.toLp 2 fun q => colourWeakEquiv (c ⊗ₜ[ℂ] w) q) from rfl, @@ -530,12 +530,12 @@ lemma repCoeff_eq (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : 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, + = jetEval (jetIteratedDeriv x + (repJetGaugeGroupI U (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] + jetOfConstant_apply] obtain ⟨v⟩ := d induction v using TensorProduct.induction_on with | zero => @@ -656,7 +656,7 @@ theorem isInfinitesimalActionOf : localGaugeData.IsInfinitesimalActionOf gaugeAlgebraAction repJetGaugeGroupI := by constructor · intro U μ x - simp only [localGaugeData_repCoeff, localGaugeData_evalLie, + simp only [localGaugeData_evalLie, localGaugeData_iteratedDeriv, localGaugeData_maurerCartan] have hMcons : ((jetGaugeMatrix U).map fun f => constantCoeff ((μ ::ₘ x).foldl (fun h ρ => pderiv ℂ ρ h) f)) @@ -680,7 +680,7 @@ theorem isInfinitesimalActionOf : 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] + JetRing.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, @@ -690,7 +690,7 @@ theorem isInfinitesimalActionOf : rw [Function.comp_apply, colourWeakEnd_mul, repCoeff_eq] rfl · intro U x c - simp only [localGaugeData_repCoeff, localGaugeData_adjointCoeff] + simp only [localGaugeData_adjointCoeff_apply] 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] @@ -729,7 +729,7 @@ theorem isInfinitesimalActionOf : 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) + actionMatrix (localGaugeData.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 @@ -738,21 +738,21 @@ theorem isInfinitesimalActionOf : = ((jetGaugeMatrix U).map fun f => constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) * actionMatrix c := by - rw [hconst, matrix_constantCoeff_foldl_pderiv_mul, + rw [hconst, JetRing.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]), + (fun p _ hp => by rw [if_neg hp, Matrix.mul_zero]), if_pos rfl] rw [← h1, jetGaugeMatrix_mul_jetActionMatrix, - matrix_constantCoeff_foldl_pderiv_mul] + JetRing.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]) + = localGaugeData.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))) diff --git a/Physlib/Particles/StandardModel/Fermions/UpSinglet/Basic.lean b/Physlib/Particles/StandardModel/Fermions/UpSinglet/Basic.lean index e0d94e52b..d4d1647eb 100644 --- a/Physlib/Particles/StandardModel/Fermions/UpSinglet/Basic.lean +++ b/Physlib/Particles/StandardModel/Fermions/UpSinglet/Basic.lean @@ -9,7 +9,8 @@ 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.JetGaugeGroup.Basic -public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.CovariantDeriv +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction +public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData 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/UpSinglet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/UpSinglet/GaugeAlgebraAction.lean index f26d82884..6388beb4d 100644 --- a/Physlib/Particles/StandardModel/Fermions/UpSinglet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/UpSinglet/GaugeAlgebraAction.lean @@ -8,7 +8,7 @@ module public import Physlib.Particles.StandardModel.Fermions.UpSinglet.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData -public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.GaugeAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeAction public import Mathlib.LinearAlgebra.TensorProduct.Pi public import Mathlib.Analysis.Normed.Lp.Matrix public import Mathlib.RingTheory.TensorProduct.Maps @@ -270,7 +270,7 @@ private lemma pderivColour_comp_foldColour (μ : Fin 1 ⊕ Fin 3) entrywise derivative on the colour coordinates. -/ private lemma jetValLinEquiv_jetDeriv (μ : Fin 1 ⊕ Fin 3) (z : JetRing ⊗[ℂ] UpSinglet) : - jetValLinEquiv (StandardModel.jetDeriv μ z) + jetValLinEquiv (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] @@ -282,7 +282,7 @@ private lemma jetValLinEquiv_jetDeriv (μ : Fin 1 ⊕ Fin 3) 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)) + rw [show 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, @@ -301,22 +301,22 @@ private lemma jetValLinEquiv_jetDeriv (μ : Fin 1 ⊕ Fin 3) 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) + jetValLinEquiv (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, + rw [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, + rw [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) + valLinEquiv (jetEval z) = (TensorProduct.map LinearMap.id ccColour) (jetValLinEquiv z) := by induction z using TensorProduct.induction_on with | zero => simp; rfl @@ -329,7 +329,7 @@ private lemma valLinEquiv_jetEval (z : JetRing ⊗[ℂ] UpSinglet) : simp rfl | tmul ψ c => - rw [StandardModel.jetEval_tmul, map_smul, + rw [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, @@ -436,12 +436,12 @@ lemma repCoeff_eq (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : 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, + = jetEval (jetIteratedDeriv x + (repJetGaugeGroupI U (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] + jetOfConstant_apply] obtain ⟨w⟩ := d induction w using TensorProduct.induction_on with | zero => @@ -528,7 +528,7 @@ theorem isInfinitesimalActionOf : localGaugeData.IsInfinitesimalActionOf gaugeAlgebraAction repJetGaugeGroupI := by constructor · intro U μ x - simp only [localGaugeData_repCoeff, localGaugeData_evalLie, + simp only [localGaugeData_evalLie, localGaugeData_iteratedDeriv, localGaugeData_maurerCartan] have hMcons : ((upMatrix U).map fun f => constantCoeff ((μ ::ₘ x).foldl (fun h ρ => pderiv ℂ ρ h) f)) @@ -552,7 +552,7 @@ theorem isInfinitesimalActionOf : 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] + JetRing.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] @@ -561,7 +561,7 @@ theorem isInfinitesimalActionOf : rw [Function.comp_apply, colourEnd_mul, repCoeff_eq] rfl · intro U x c - simp only [localGaugeData_repCoeff, localGaugeData_adjointCoeff] + simp only [localGaugeData_adjointCoeff_apply] 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] @@ -593,7 +593,7 @@ theorem isInfinitesimalActionOf : 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) + actionMatrix (localGaugeData.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 @@ -601,20 +601,20 @@ theorem isInfinitesimalActionOf : = ((upMatrix U).map fun f => constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) * actionMatrix c := by - rw [hconst, matrix_constantCoeff_foldl_pderiv_mul, + rw [hconst, JetRing.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]), + (fun p _ hp => by rw [if_neg hp, Matrix.mul_zero]), if_pos rfl] - rw [← h1, upMatrix_mul_jetActionMatrix, matrix_constantCoeff_foldl_pderiv_mul] + rw [← h1, upMatrix_mul_jetActionMatrix, JetRing.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]) + = localGaugeData.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))) diff --git a/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean b/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean index de8b113e8..7c4eef26f 100644 --- a/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean +++ b/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean @@ -395,30 +395,6 @@ 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 - - - - 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 @@ -607,6 +583,26 @@ lemma eval_toU1Value_eq (a : JetGaugeAlgebra) : show Multiset.toFinsupp (0 : Multiset (Fin 1 ⊕ Fin 3)) = 0 from map_zero _, coeff_zero_eq_constantCoeff] +/-- 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] + /-- Taylor determinacy: a jet gauge algebra element is determined by the base-point values of its iterated derivatives. -/ @@ -679,44 +675,6 @@ theorem ext_of_eval_iteratedDeriv {x y : JetGaugeAlgebra} · 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 @@ -786,35 +744,27 @@ 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 +/-- At the base point the adjoint action of a gauge jet is the adjoint action of its + value: the constant coefficient of `U x U†` is `U₀ x₀ U₀†`. -/ +lemma eval_adjointMap (U : JetGaugeGroupI) (x : JetGaugeAlgebra) : + eval (adjointMap U x) = GaugeAlgebra.adjoint U.eval (eval x) := 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] + GaugeAlgebra.adjoint_toSU3Matrix] + rw [hmap, hmap, map_mul, map_mul, JetRing.mapMatrix_constantCoeff_star] 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] + GaugeAlgebra.adjoint_toSU2Matrix] + rw [hmap, hmap, map_mul, map_mul, JetRing.mapMatrix_constantCoeff_star] rfl - · simp [eval_apply, taylorCoeff_toU1Value, adjointMap_toU1Value, ofConstant_toU1Value, - coeff_zero_eq_constantCoeff, constantCoeff_C, GaugeAlgebra.adjoint_toU1Value] + · simp [eval_apply, taylorCoeff_toU1Value, adjointMap_toU1Value, + GaugeAlgebra.adjoint_toU1Value] /-- The constant inclusion is a morphism of Lie algebras: constants bracket to constants. -/ diff --git a/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Basic.lean b/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Basic.lean deleted file mode 100644 index 99561d7f3..000000000 --- a/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/Basic.lean +++ /dev/null @@ -1,1251 +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.JetGaugeGroup.Truncation -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 TensorProduct MvPowerSeries -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).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 - 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 - 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 - -/-- **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] - -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 ℂ JetGaugeGroupI B) - (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,ℂ)) (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 (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 - local expressions as algebra homomorphisms. -/ - gauge_mul : ∀ (U : JetGaugeGroupI) (b₁ b₂ : B), - repGauge U (b₁ * b₂) = repGauge U b₁ * repGauge U b₂ - -namespace IsGaugeField - -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} - -/-- 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 : 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 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 : JetGaugeGroupI) - (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : - repGauge U (A 0 μ φ) = A 0 μ (adjointDualCoeff U⁻¹ ∅ φ) + - algebraMap ℂ B (φ (JetGaugeAlgebra.eval (maurerCartanForm 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 : JetGaugeGroupI) (ρ σ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : - repGauge U (A {ρ} σ φ) = - A {ρ} σ (adjointDualCoeff U⁻¹ 0 φ) + A 0 σ (adjointDualCoeff U⁻¹ {ρ} φ) + - algebraMap ℂ B (φ (JetGaugeAlgebra.eval - (JetGaugeAlgebra.deriv ρ (maurerCartanForm 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, - JetGaugeAlgebra.iteratedDeriv_singleton] at h - refine h.trans ?_ - abel - -/-! - -## 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 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 0 μ (adjointDualCoeff U⁻¹ 0 (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra - (JetGaugeAlgebra.eval (maurerCartanForm U⁻¹ ν)))) - + A 0 ν (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 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 - 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 0 ρ = A 0 ρ ∘ₗ 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.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 ℝ 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, 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_.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) - (U : JetGaugeGroupI) (ρ σ τ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : - 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 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, JetGaugeAlgebra.iteratedDeriv_cons, - LinearMap.comp_apply, JetGaugeAlgebra.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 ℝ GaugeAlgebra →ₗ[ℝ] B) : - Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] 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 ℝ 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 - 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 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) : - 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 - -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 : 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] - -/-- 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) : - 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] - -/-! - -## 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_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 (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 ℝ 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 => - 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 ℝ 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_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 : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ GaugeAlgebra) : - 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 ℝ GaugeAlgebra (JetGaugeAlgebra.eval - (JetGaugeAlgebra.iteratedDeriv p.1 (maurerCartanForm U⁻¹ μ)))))).sum).sum - - (s.antidiagonal.map fun p => - (p.1.antidiagonal.map fun q => - A q.2 μ (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 (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 ψ - 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 ℝ GaugeAlgebra (JetGaugeAlgebra.eval - (JetGaugeAlgebra.iteratedDeriv p.1 (maurerCartanForm U⁻¹ μ)))) = - (p.2.antidiagonal.map fun r => - A r.2 ν (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] - 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 ℝ GaugeAlgebra (JetGaugeAlgebra.eval - (JetGaugeAlgebra.iteratedDeriv p.2 (maurerCartanForm U⁻¹ ν)))) = - (p.1.antidiagonal.map fun q => - A q.2 μ (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] - -- 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 - -end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/FieldStrength.lean b/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/FieldStrength.lean deleted file mode 100644 index 37645cf93..000000000 --- a/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/FieldStrength.lean +++ /dev/null @@ -1,203 +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.AlgebraValued.Basic -public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.TransformsInAdjoint -public import Physlib.Particles.StandardModel.GaugeAlgebra.Basis -/-! - -# 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 - -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 : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] 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 ℝ GaugeAlgebra →ₗ[ℝ] B) - (μ ν : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : - Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B := - A (μ ::ₘ s) ν - A (ν ::ₘ s) μ + commutatorFam A μ ν s - -@[simp] -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_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 (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 ℝ GaugeAlgebra (JetGaugeAlgebra.eval - (JetGaugeAlgebra.iteratedDeriv q.1 (maurerCartanForm U⁻¹ μ)))))).sum).sum = - (s.antidiagonal.map fun p => - (p.2.antidiagonal.map fun r => - A r.2 ν (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 => - A c ν (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 => - A p.2 μ (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 => - A q.2 μ (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 => - A c μ (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 => - A q.2 μ (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_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 : 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 - -end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/TransformsInAdjoint.lean b/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/TransformsInAdjoint.lean deleted file mode 100644 index 93d369b4b..000000000 --- a/Physlib/Particles/StandardModel/GaugeBosons/AlgebraValued/TransformsInAdjoint.lean +++ /dev/null @@ -1,261 +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.AlgebraValued.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 - -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 : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] 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 ℂ 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 (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 = [∂_ρ 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 ℝ 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 := - F (ρ ::ₘ s) + bracketFamConv A ρ F s - -@[simp] -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 - -/-! - -## 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 ℝ GaugeAlgebra →ₗ[ℝ] B} - (hF : TransformsInAdjoint repGauge F) - (U : JetGaugeGroupI) (κ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℝ GaugeAlgebra) : - 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 ℝ 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 => - 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 ℝ 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_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 ℝ GaugeAlgebra →ₗ[ℝ] B} - (hF : TransformsInAdjoint repGauge F) - (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) (ρ : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ GaugeAlgebra) : - 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 ℝ 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 (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 ψ - 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 (F u ψ) = - ((u.antidiagonal.map fun r => F r.2 ∘ₗ adjointDualCoeff U⁻¹ r.1).sum) ψ - + algebraMap ℂ B (ψ (0 : GaugeAlgebra)) := 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 ℝ GaugeAlgebra (JetGaugeAlgebra.eval - (JetGaugeAlgebra.iteratedDeriv p.1 (maurerCartanForm U⁻¹ ρ)))) = - (p.2.antidiagonal.map fun r => - F r.2 (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] - 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 ℝ GaugeAlgebra →ₗ[ℝ] 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 ℝ GaugeAlgebra (JetGaugeAlgebra.eval - (JetGaugeAlgebra.iteratedDeriv q.1 - (maurerCartanForm U⁻¹ ρ)))))).sum).sum = - (s.antidiagonal.map fun p => - (p.2.antidiagonal.map fun r => - F r.2 (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 => - F c (adjointDualCoeff U⁻¹ b - (φ ∘ₗ LieAlgebra.ad ℝ GaugeAlgebra (JetGaugeAlgebra.eval - (JetGaugeAlgebra.iteratedDeriv a (maurerCartanForm U⁻¹ ρ)))))) - rw [hL, hF.repGauge_cons U ρ s φ, hF.repGauge_bracketFamConv hA U s ρ φ, - hR, hcancel] - abel - -end IsGaugeField - -end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/Basic.lean b/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/Basic.lean deleted file mode 100644 index 070d660be..000000000 --- a/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/Basic.lean +++ /dev/null @@ -1,257 +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.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 deleted file mode 100644 index 271629b63..000000000 --- a/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/GaugeAction.lean +++ /dev/null @@ -1,913 +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.GaugeJetAlgebra.JetDeriv -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 - -## 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 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 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 deleted file mode 100644 index 78b160e39..000000000 --- a/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/Invariants.lean +++ /dev/null @@ -1,148 +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.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 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 -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 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 - invariants. - -## iii. Table of contents - -- A. The gauge-field structure - - A.1. The gauge-field derivative symbols - - 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 derivative symbols - --/ - -/-- 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 := - (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 ℝ GaugeAlgebra) : - 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 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₂ - -/-! - -## 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 = 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 l - (IsGaugeField.fieldStrength gaugeField ν lam) 0 φ} ∪ S) := - IsGaugeField.invariant_mem_adjoin_fieldStrength isGaugeField - (fun _ _ _ _ _ _ => Commute.all _ _) - S (fun _ _ _ _ _ => Commute.all _ _) 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 deleted file mode 100644 index 54349c19d..000000000 --- a/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/JetDeriv.lean +++ /dev/null @@ -1,370 +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.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 deleted file mode 100644 index 91405ae33..000000000 --- a/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/LorentzAction.lean +++ /dev/null @@ -1,307 +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.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/MassWeightPoly.lean b/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/MassWeightPoly.lean index ce51d904a..b5dbb37b8 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/MassWeightPoly.lean +++ b/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/MassWeightPoly.lean @@ -5,7 +5,8 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.JetDeriv +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.JetDeriv +public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData /-! # The mass-weight polynomial on the gauge-boson jet algebra @@ -16,10 +17,10 @@ grading: the generator `∂_s A_μ^φ` is sent to `X ^ (2 + 2 |s|)` times itself carrying mass weight two and each derivative two more. The gauge-boson jet algebra is real, but the jet algebra of the Standard Model uses its -complexification `ℂ ⊗[ℝ] GaugeJetAlgebra`. So the grading is built in two steps: the -universal property of the symmetric algebra gives a real algebra map landing in -`Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra)` — a commutative target, so there is no side -condition — and the universal property of the tensor product extends it along the scalars +complexification `ℂ ⊗[ℝ] GaugeJetAlgebra GaugeAlgebra`. So the grading is built in two steps: +the universal property of the symmetric algebra gives a real algebra map landing in +`Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra GaugeAlgebra)` — a commutative target, so there is no +side condition — and the universal property of the tensor product extends it along the scalars to `complexMassWeightPoly`, which is what the ambient theory sees. ## ii. Key results @@ -57,40 +58,43 @@ open TensorProduct -/ /-- The monomial map into polynomials over the complexified jet algebra, as a map of - `ℝ`-modules rather than of `ℂ ⊗[ℝ] GaugeJetAlgebra`-modules. -/ + `ℝ`-modules rather than of modules over the complexified jet algebra. -/ noncomputable def monomialₗ (n : ℕ) : - (ℂ ⊗[ℝ] GaugeJetAlgebra) →ₗ[ℝ] Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra) := + (ℂ ⊗[ℝ] GaugeJetAlgebra GaugeAlgebra) →ₗ[ℝ] + Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra GaugeAlgebra) := (Polynomial.monomial n).restrictScalars ℝ @[simp] -lemma monomialₗ_apply (n : ℕ) (x : ℂ ⊗[ℝ] GaugeJetAlgebra) : +lemma monomialₗ_apply (n : ℕ) (x : ℂ ⊗[ℝ] GaugeJetAlgebra GaugeAlgebra) : monomialₗ n x = Polynomial.monomial n x := rfl /-- A component function, viewed inside the complexified jet algebra: the generator `∂_s A_μ^φ` tensored with the scalar one. -/ noncomputable def ιComplex : - GaugeBoson.JetComponentSpace →ₗ[ℝ] ℂ ⊗[ℝ] GaugeJetAlgebra := + (GaugeBoson.JetComponentSpace GaugeAlgebra) →ₗ[ℝ] ℂ ⊗[ℝ] GaugeJetAlgebra GaugeAlgebra := Algebra.TensorProduct.includeRight.toLinearMap.comp - (SymmetricAlgebra.ι ℝ GaugeBoson.JetComponentSpace) + (SymmetricAlgebra.ι ℝ (GaugeBoson.JetComponentSpace GaugeAlgebra)) @[simp] -lemma ιComplex_apply (x : GaugeBoson.JetComponentSpace) : - ιComplex x = (1 : ℂ) ⊗ₜ[ℝ] SymmetricAlgebra.ι ℝ GaugeBoson.JetComponentSpace x := rfl +lemma ιComplex_apply (x : (GaugeBoson.JetComponentSpace GaugeAlgebra)) : + ιComplex x = + (1 : ℂ) ⊗ₜ[ℝ] SymmetricAlgebra.ι ℝ (GaugeBoson.JetComponentSpace GaugeAlgebra) x := rfl /-- The mass-weight polynomial of a component function: the linear map sending the symbol `∂_s A^φ` to `X ^ (2 + 2 |s|)` times itself, read off from the multiset basis of the real derivative symbols. -/ noncomputable def jetComponentPoly : - GaugeBoson.JetComponentSpace →ₗ[ℝ] Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra) := + (GaugeBoson.JetComponentSpace GaugeAlgebra) →ₗ[ℝ] + Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra GaugeAlgebra) := TensorProduct.lift (DerivAlgebraReal.basisMultiset.constr ℝ fun s => (monomialₗ (2 + 2 * Multiset.card s)).comp - (ιComplex.comp (TensorProduct.mk ℝ DerivAlgebraReal (Module.Dual ℝ GaugeBoson) - (DerivAlgebraReal.basisMultiset s)))) + (ιComplex.comp (TensorProduct.mk ℝ DerivAlgebraReal + (Module.Dual ℝ (GaugeBoson GaugeAlgebra)) (DerivAlgebraReal.basisMultiset s)))) /-- On the symbol `∂_s A^φ` the component map is the monomial of degree `2 + 2 |s|`: the gauge field contributes two and each derivative two more. -/ lemma jetComponentPoly_basisMultiset_tmul (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℝ GaugeBoson) : + (φ : Module.Dual ℝ (GaugeBoson GaugeAlgebra)) : jetComponentPoly (DerivAlgebraReal.basisMultiset s ⊗ₜ[ℝ] φ) = Polynomial.monomial (2 + 2 * Multiset.card s) (ιComplex (DerivAlgebraReal.basisMultiset s ⊗ₜ[ℝ] φ)) := by @@ -107,14 +111,15 @@ lemma jetComponentPoly_basisMultiset_tmul (s : Multiset (Fin 1 ⊕ Fin 3)) a generator of mass weight `n` to `X ^ n` times its image in the complexification. It needs no side condition because the target is commutative. -/ noncomputable def massWeightPoly : - GaugeJetAlgebra →ₐ[ℝ] Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra) := by - exact SymmetricAlgebra.lift (R := ℝ) (M := GaugeBoson.JetComponentSpace) - (A := Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra)) jetComponentPoly + GaugeJetAlgebra GaugeAlgebra →ₐ[ℝ] + Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra GaugeAlgebra) := by + exact SymmetricAlgebra.lift (R := ℝ) (M := (GaugeBoson.JetComponentSpace GaugeAlgebra)) + (A := Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra GaugeAlgebra)) jetComponentPoly /-- On a component function the mass-weight polynomial is the component-function map. -/ @[simp] -lemma massWeightPoly_ι (x : GaugeBoson.JetComponentSpace) : - massWeightPoly (SymmetricAlgebra.ι ℝ GaugeBoson.JetComponentSpace x) = +lemma massWeightPoly_ι (x : (GaugeBoson.JetComponentSpace GaugeAlgebra)) : + massWeightPoly (SymmetricAlgebra.ι ℝ (GaugeBoson.JetComponentSpace GaugeAlgebra) x) = jetComponentPoly x := by rw [massWeightPoly, SymmetricAlgebra.lift_ι_apply] @@ -122,18 +127,21 @@ lemma massWeightPoly_ι (x : GaugeBoson.JetComponentSpace) : @[simp] lemma massWeightPoly_iteratedJetDeriv_ofA (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : - massWeightPoly (iteratedJetDeriv s (ofA μ φ)) = - Polynomial.monomial (2 + 2 * Multiset.card s) - ((1 : ℂ) ⊗ₜ[ℝ] iteratedJetDeriv s (ofA μ φ)) := by - rw [iteratedJetDeriv_ofA, massWeightPoly_ι, - show LagrangianTheory.dualRealJetAlgebraBasis s = DerivAlgebraReal.basisMultiset s from rfl, - jetComponentPoly_basisMultiset_tmul, ιComplex_apply] + massWeightPoly (GaugeJetAlgebra.iteratedJetDeriv GaugeAlgebra s + (GaugeJetAlgebra.ofA GaugeAlgebra μ φ)) = + Polynomial.monomial (2 + 2 * Multiset.card s) ((1 : ℂ) ⊗ₜ[ℝ] + GaugeJetAlgebra.iteratedJetDeriv GaugeAlgebra s + (GaugeJetAlgebra.ofA GaugeAlgebra μ φ)) := by + rw [GaugeJetAlgebra.iteratedJetDeriv_ofA, massWeightPoly_ι, jetComponentPoly_basisMultiset_tmul, + ιComplex_apply] /-- The undifferentiated gauge field has mass weight two — mass dimension one. -/ lemma massWeightPoly_ofA (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : - massWeightPoly (ofA μ φ) = Polynomial.monomial 2 ((1 : ℂ) ⊗ₜ[ℝ] ofA μ φ) := by + massWeightPoly (GaugeJetAlgebra.ofA GaugeAlgebra μ φ) = + Polynomial.monomial 2 ((1 : ℂ) ⊗ₜ[ℝ] GaugeJetAlgebra.ofA GaugeAlgebra μ φ) := by have h := massWeightPoly_iteratedJetDeriv_ofA (0 : Multiset (Fin 1 ⊕ Fin 3)) μ φ - rwa [iteratedJetDeriv_zero, LinearMap.id_apply, Multiset.card_zero, Nat.mul_zero, + rwa [GaugeJetAlgebra.iteratedJetDeriv_zero, LinearMap.id_apply, Multiset.card_zero, + Nat.mul_zero, Nat.add_zero] at h /-! @@ -146,17 +154,19 @@ lemma massWeightPoly_ofA (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgeb map obtained from the real one by extending the scalars, the grading the jet algebra of the Standard Model sees on its gauge sector. -/ noncomputable def complexMassWeightPoly : - (ℂ ⊗[ℝ] GaugeJetAlgebra) →ₐ[ℂ] Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra) := by - refine Algebra.TensorProduct.lift (R := ℝ) (S := ℂ) (A := ℂ) (B := GaugeJetAlgebra) - (C := Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra)) - (Algebra.ofId ℂ (Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra))) massWeightPoly ?_ + (ℂ ⊗[ℝ] GaugeJetAlgebra GaugeAlgebra) →ₐ[ℂ] + Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra GaugeAlgebra) := by + refine Algebra.TensorProduct.lift (R := ℝ) (S := ℂ) (A := ℂ) + (B := GaugeJetAlgebra GaugeAlgebra) + (C := Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra GaugeAlgebra)) + (Algebra.ofId ℂ (Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra GaugeAlgebra))) massWeightPoly ?_ intro x y - exact Commute.all (S := Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra)) _ _ + exact Commute.all (S := Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra GaugeAlgebra)) _ _ /-- On a pure tensor the complexified grading is the scalar times the real grading. -/ -lemma complexMassWeightPoly_tmul (z : ℂ) (x : GaugeJetAlgebra) : +lemma complexMassWeightPoly_tmul (z : ℂ) (x : GaugeJetAlgebra GaugeAlgebra) : complexMassWeightPoly (z ⊗ₜ[ℝ] x) = - Polynomial.C (z ⊗ₜ[ℝ] (1 : GaugeJetAlgebra)) * massWeightPoly x := by + Polynomial.C (z ⊗ₜ[ℝ] (1 : GaugeJetAlgebra GaugeAlgebra)) * massWeightPoly x := by rw [complexMassWeightPoly, Algebra.TensorProduct.lift_tmul] congr 1 @@ -166,9 +176,11 @@ set_option maxHeartbeats 400000 in @[simp] lemma complexMassWeightPoly_tmul_iteratedJetDeriv_ofA (z : ℂ) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : - complexMassWeightPoly (z ⊗ₜ[ℝ] iteratedJetDeriv s (ofA μ φ)) = - Polynomial.monomial (2 + 2 * Multiset.card s) - (z ⊗ₜ[ℝ] iteratedJetDeriv s (ofA μ φ)) := by + complexMassWeightPoly (z ⊗ₜ[ℝ] GaugeJetAlgebra.iteratedJetDeriv GaugeAlgebra s + (GaugeJetAlgebra.ofA GaugeAlgebra μ φ)) = + Polynomial.monomial (2 + 2 * Multiset.card s) (z ⊗ₜ[ℝ] + GaugeJetAlgebra.iteratedJetDeriv GaugeAlgebra s + (GaugeJetAlgebra.ofA GaugeAlgebra μ φ)) := by rw [complexMassWeightPoly_tmul, massWeightPoly_iteratedJetDeriv_ofA, ← Polynomial.monomial_zero_left, Polynomial.monomial_mul_monomial, Nat.zero_add, Algebra.TensorProduct.tmul_mul_tmul, mul_one, one_mul] @@ -182,7 +194,7 @@ lemma complexMassWeightPoly_tmul_iteratedJetDeriv_ofA (z : ℂ) /-- Setting the formal variable to one collapses the component map back to the component function it graded. The derivative monomials span, so it is enough to check this on the multiset basis. -/ -lemma jetComponentPoly_eval_one (x : GaugeBoson.JetComponentSpace) : +lemma jetComponentPoly_eval_one (x : (GaugeBoson.JetComponentSpace GaugeAlgebra)) : (jetComponentPoly x).eval 1 = ιComplex x := by induction x using TensorProduct.induction_on with | zero => rw [map_zero, Polynomial.eval_zero, map_zero] @@ -204,13 +216,14 @@ lemma jetComponentPoly_eval_one (x : GaugeBoson.JetComponentSpace) : set_option maxHeartbeats 400000 in /-- Setting the formal variable to one recovers the original element, viewed in the complexification. -/ -lemma massWeightPoly_eval_one (x : GaugeJetAlgebra) : +lemma massWeightPoly_eval_one (x : GaugeJetAlgebra GaugeAlgebra) : (massWeightPoly x).eval 1 = - Algebra.TensorProduct.includeRight (R := ℝ) (A := ℂ) (B := GaugeJetAlgebra) x := by - have h : (Polynomial.eval₂AlgHom (AlgHom.id ℝ (ℂ ⊗[ℝ] GaugeJetAlgebra)) 1 + Algebra.TensorProduct.includeRight (R := ℝ) (A := ℂ) + (B := GaugeJetAlgebra GaugeAlgebra) x := by + have h : (Polynomial.eval₂AlgHom (AlgHom.id ℝ (ℂ ⊗[ℝ] GaugeJetAlgebra GaugeAlgebra)) 1 fun b => Commute.one_right b).comp massWeightPoly = (Algebra.TensorProduct.includeRight : - GaugeJetAlgebra →ₐ[ℝ] ℂ ⊗[ℝ] GaugeJetAlgebra) := by + GaugeJetAlgebra GaugeAlgebra →ₐ[ℝ] ℂ ⊗[ℝ] GaugeJetAlgebra GaugeAlgebra) := by refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun y => ?_) simp change Polynomial.eval₂ (RingHom.id _) 1 (jetComponentPoly y) = _ @@ -220,7 +233,7 @@ lemma massWeightPoly_eval_one (x : GaugeJetAlgebra) : /-- Setting the formal variable to one recovers the original element of the complexified jet algebra: the mass-weight pieces sum back to it. -/ -lemma complexMassWeightPoly_eval_one (y : ℂ ⊗[ℝ] GaugeJetAlgebra) : +lemma complexMassWeightPoly_eval_one (y : ℂ ⊗[ℝ] GaugeJetAlgebra GaugeAlgebra) : (complexMassWeightPoly y).eval 1 = y := by induction y using TensorProduct.induction_on with | zero => rw [map_zero, Polynomial.eval_zero] diff --git a/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeGroup/Basic.lean b/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeGroup/Basic.lean index 7b5b9de6d..3766c0fe3 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeGroup/Basic.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeGroup/Basic.lean @@ -37,8 +37,6 @@ 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 @@ -83,6 +81,22 @@ The payoff is that the derivative bookkeeping disappears into th transformations — which is exactly right, since so is a Lagrangian at a point. +## ii. Key results + +- `JetGaugeGroupI` : the jets of gauge transformations, the gauge group with coefficients + in `JetRing`. +- `JetGaugeGroupI.eval`, `JetGaugeGroupI.ofConstant` : evaluation at the base point and + the constant jets, with `eval_ofConstant`. +- `JetGaugeGroupI.deriv` : the entrywise formal derivative of a jet, with the Leibniz rule + `deriv_mul` and the hermiticity and tracelessness of `i (∂_μ U) U⁻¹` that make the + Maurer–Cartan form take values in the jet gauge algebra. + +## iii. Table of contents + +- A. The jet gauge group +- B. Evaluation at the base point +- C. The derivative +- D. Constant jets -/ @@ -95,7 +109,7 @@ open scoped Nat /-! -## B. The jet gauge group +## A. 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 @@ -127,7 +141,7 @@ def toVal (U : JetGaugeGroupI) : Matrix (Fin 3) (Fin 3) JetRing × Matrix (Fin 2 /-! -## C. Evaluation at the base point +## B. 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 @@ -179,7 +193,7 @@ noncomputable def eval : JetGaugeGroupI →* GaugeGroupI := /-! -## The derivative +## C. 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. @@ -357,17 +371,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] -/-- 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/JetGaugeGroup/Truncation.lean b/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeGroup/Truncation.lean index 7d0dd37e8..fb78b840f 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeGroup/Truncation.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeGroup/Truncation.lean @@ -5,20 +5,37 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.Basic -public import Physlib.Particles.StandardModel.GaugeGroup.JetGaugeGroup.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 Mathlib.RingTheory.MvPowerSeries.Derivative -public import Physlib.Mathematics.MvPolynomialTranslation -public import Mathlib.Algebra.MvPolynomial.Derivation +public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData /-! -# Truncation of the Jet gauge group +# Truncation of the jet gauge group + +## i. Overview + +Truncating a jet of gauge transformations at order `n` sets to zero, in every matrix +entry, the Taylor coefficients of total degree above `n`. This `truncation n` is a plain +function into the matrix data, not a homomorphism into `JetGaugeGroupI`: deleting the +coefficients above order `n` breaks unitarity and multiplicativity at the orders between +`n + 1` and `2n`. + +The homomorphic notion of a jet *trivial to order `n`* is the truncation filtration of the +local-gauge-data package, `localGaugeData.truncationKer n`, defined in +`Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Truncation` through the value and +the Maurer–Cartan form of the jet alone. This file compares the two notions: a jet trivial to +order `n` in that sense truncates to the identity, `truncation_eq_one_of_mem_truncationKer`. +The argument is the Euler identity `∑_ρ x_ρ ∂_ρ f = (degree) f` on power series, applied to +the radial relation `∂_ρ U = −i ω_ρ(U) U` between a jet and its Maurer–Cartan form. + +## ii. Key results + +- `JetGaugeGroupI.truncation` : the `n`-th truncation of a jet. +- `JetGaugeGroupI.truncation_eq_one_of_mem_truncationKer` : jets trivial to order `n` + truncate to the identity. + +## iii. Table of contents + +- A. The truncation +- B. Aside: vanishing of coefficients from the Euler identity +- C. The comparison with the Maurer–Cartan filtration -/ @@ -30,16 +47,16 @@ 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. +open JetGaugeAlgebra JetRing + +/-! + +## A. The truncation + +-/ - 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. -/ +/-- 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. -/ 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), @@ -54,201 +71,211 @@ lemma truncation_one (n : ℕ) : truncation n (1 : JetGaugeGroupI) = 1 := /-! -## The kernel of truncation +## B. Aside: vanishing of coefficients from the Euler identity -/ - -/-- 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 [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 [eval, evalSU, RingHom.mapMatrix_apply, Matrix.map_apply, - Matrix.one_apply, apply_ite constantCoeff] using - JetRing.truncation_zero_eq_iff.mp h2 - · 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 ?_ ?_) - · 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 [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 [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 [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 := - 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 +/-- A product with a factor whose coefficients vanish below degree `n` has coefficients + vanishing below degree `n`. -/ +lemma coeff_mul_eq_zero_of_lt {n : ℕ} {w : JetRing} + (hw : ∀ q : (Fin 1 ⊕ Fin 3) →₀ ℕ, Finsupp.degree q < n → coeff q w = 0) (v : JetRing) + {q : (Fin 1 ⊕ Fin 3) →₀ ℕ} (hq : Finsupp.degree q < n) : coeff q (w * v) = 0 := by + 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] + +/-- The Euler vanishing principle: a power series all of whose first derivatives have + coefficients vanishing below degree `n` has vanishing coefficients in every nonzero degree + up to `n`, since `∑_ρ x_ρ ∂_ρ f` has the coefficient of `f` at `p` scaled by the degree + of `p`. -/ +lemma coeff_eq_zero_of_coeff_pderiv_eq_zero {n : ℕ} {f : JetRing} + (hf : ∀ (ρ : Fin 1 ⊕ Fin 3) (q : (Fin 1 ⊕ Fin 3) →₀ ℕ), Finsupp.degree q < n → + coeff q (pderiv ℂ ρ f) = 0) + {p : (Fin 1 ⊕ Fin 3) →₀ ℕ} (hp : p ≠ 0) (hpn : Finsupp.degree p ≤ n) : coeff p f = 0 := by + 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 + +/-- A power series satisfying a radial relation `∂_ρ f = x_ρ f`, with the `x_ρ` vanishing + below degree `n`, has no coefficients in nonzero degree up to `n`. -/ +lemma coeff_eq_zero_of_pderiv_eq_mul {n : ℕ} {f : JetRing} {x : (Fin 1 ⊕ Fin 3) → JetRing} + (hd : ∀ ρ, pderiv ℂ ρ f = x ρ * f) + (hx : ∀ (ρ : Fin 1 ⊕ Fin 3) (q : (Fin 1 ⊕ Fin 3) →₀ ℕ), Finsupp.degree q < n → + coeff q (x ρ) = 0) + {p : (Fin 1 ⊕ Fin 3) →₀ ℕ} (hp : p ≠ 0) (hpn : Finsupp.degree p ≤ n) : coeff p f = 0 := + coeff_eq_zero_of_coeff_pderiv_eq_zero + (fun ρ q hq => by rw [hd ρ]; exact coeff_mul_eq_zero_of_lt (hx ρ) f hq) hp hpn + +/-- The matrix form of `coeff_eq_zero_of_pderiv_eq_mul`: the entries of a matrix of power + series satisfying `∂_ρ A = X_ρ A`, with the `X_ρ` vanishing below degree `n`, have no + coefficients in nonzero degree up to `n`. -/ +lemma coeff_entry_eq_zero_of_map_pderiv_eq_mul {κ : Type} [Fintype κ] [DecidableEq κ] {n : ℕ} + {A : Matrix κ κ JetRing} {X : (Fin 1 ⊕ Fin 3) → Matrix κ κ JetRing} + (hd : ∀ ρ, A.map (pderiv ℂ ρ) = X ρ * A) + (hX : ∀ (ρ : Fin 1 ⊕ Fin 3) (q : (Fin 1 ⊕ Fin 3) →₀ ℕ), Finsupp.degree q < n → + ∀ i j, coeff q (X ρ i j) = 0) + (i j : κ) {p : (Fin 1 ⊕ Fin 3) →₀ ℕ} (hp : p ≠ 0) (hpn : Finsupp.degree p ≤ n) : + coeff p (A i j) = 0 := by + refine coeff_eq_zero_of_coeff_pderiv_eq_zero (fun ρ q hq => ?_) hp hpn + have h1 : pderiv ℂ ρ (A i j) = (X ρ * A) i j := by rw [← hd ρ, Matrix.map_apply] + rw [h1, Matrix.mul_apply, map_sum] + exact Finset.sum_eq_zero fun k _ => coeff_mul_eq_zero_of_lt (fun q' hq' => hX ρ q' hq' i k) _ hq + +/-- A matrix of power series with identity value and no coefficients in nonzero degree up + to `n` truncates to the identity. -/ +lemma matrix_map_truncation_eq_one {κ : Type} [Fintype κ] [DecidableEq κ] {n : ℕ} + {A : Matrix κ κ JetRing} (h0 : (constantCoeff : JetRing →+* ℂ).mapMatrix A = 1) + (hA : ∀ (i j : κ) (p : (Fin 1 ⊕ Fin 3) →₀ ℕ), p ≠ 0 → Finsupp.degree p ≤ n → + coeff p (A i j) = 0) : + A.map (JetRing.truncation n) = (1 : Matrix κ κ JetRing).map (JetRing.truncation n) := by + 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 N => N i j) h0 + simpa [RingHom.mapMatrix_apply, Matrix.map_apply, Matrix.one_apply, + apply_ite constantCoeff, coeff_zero_eq_constantCoeff] using h3 + · rw [hA 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)] + +/-- A power series with value `1` and no coefficients in nonzero degree up to `n` + truncates to `1`. -/ +lemma truncation_eq_one_of_coeff {n : ℕ} {f : JetRing} (h0 : constantCoeff f = 1) + (hf : ∀ p : (Fin 1 ⊕ Fin 3) →₀ ℕ, p ≠ 0 → Finsupp.degree p ≤ n → coeff p f = 0) : + JetRing.truncation n f = JetRing.truncation n (1 : JetRing) := by + 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 + · simpa [coeff_zero_eq_constantCoeff] using h0 + · rw [hf 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)] /-! -## The projection onto the zeroth truncation kernel +## C. The comparison with the Maurer–Cartan filtration -/ -/-- 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] +/-- The base-point Taylor data of the Maurer–Cartan form of a jet trivial to order `n`, + read as power-series coefficients of its `su(3)` entries: they vanish below degree `n`. -/ +lemma coeff_maurerCartanForm_toSU3Matrix_eq_zero_of_mem_truncationKer {U : JetGaugeGroupI} + {n : ℕ} (hU : U ∈ localGaugeData.truncationKer n) (ρ : Fin 1 ⊕ Fin 3) + {m : (Fin 1 ⊕ Fin 3) →₀ ℕ} (hm : Finsupp.degree m < n) (i j : Fin 3) : + coeff m ((maurerCartanForm U ρ).toSU3Matrix i j) = 0 := by + have h0 := hU.2 (Finsupp.toMultiset m) ρ (by + rw [← degree_toFinsupp_eq_card, Finsupp.toMultiset_toFinsupp]; exact hm) + have h1 := congrArg (fun a => GaugeAlgebra.toSU3Matrix a i j) h0 + simp only [localGaugeData_evalLie, localGaugeData_iteratedDeriv, localGaugeData_maurerCartan, + GaugeAlgebra.zero_toSU3Matrix, Matrix.zero_apply] at h1 + rw [eval_toSU3Matrix_apply, iteratedDeriv_toSU3Matrix, Matrix.map_apply, + constantCoeff_foldl_pderiv, Finsupp.toMultiset_toFinsupp] at h1 + exact (mul_eq_zero.mp h1).resolve_left (Nat.cast_ne_zero.mpr + (Finset.prod_ne_zero_iff.mpr fun ν _ => Nat.factorial_ne_zero _)) + +/-- The `su(2)` entries of `coeff_maurerCartanForm_toSU3Matrix_eq_zero_of_mem_truncationKer`. -/ +lemma coeff_maurerCartanForm_toSU2Matrix_eq_zero_of_mem_truncationKer {U : JetGaugeGroupI} + {n : ℕ} (hU : U ∈ localGaugeData.truncationKer n) (ρ : Fin 1 ⊕ Fin 3) + {m : (Fin 1 ⊕ Fin 3) →₀ ℕ} (hm : Finsupp.degree m < n) (i j : Fin 2) : + coeff m ((maurerCartanForm U ρ).toSU2Matrix i j) = 0 := by + have h0 := hU.2 (Finsupp.toMultiset m) ρ (by + rw [← degree_toFinsupp_eq_card, Finsupp.toMultiset_toFinsupp]; exact hm) + have h1 := congrArg (fun a => GaugeAlgebra.toSU2Matrix a i j) h0 + simp only [localGaugeData_evalLie, localGaugeData_iteratedDeriv, localGaugeData_maurerCartan, + GaugeAlgebra.zero_toSU2Matrix, Matrix.zero_apply] at h1 + rw [eval_toSU2Matrix_apply, iteratedDeriv_toSU2Matrix, Matrix.map_apply, + constantCoeff_foldl_pderiv, Finsupp.toMultiset_toFinsupp] at h1 + exact (mul_eq_zero.mp h1).resolve_left (Nat.cast_ne_zero.mpr + (Finset.prod_ne_zero_iff.mpr fun ν _ => Nat.factorial_ne_zero _)) + +/-- The `u(1)` value of `coeff_maurerCartanForm_toSU3Matrix_eq_zero_of_mem_truncationKer`. -/ +lemma coeff_maurerCartanForm_toU1Value_eq_zero_of_mem_truncationKer {U : JetGaugeGroupI} + {n : ℕ} (hU : U ∈ localGaugeData.truncationKer n) (ρ : Fin 1 ⊕ Fin 3) + {m : (Fin 1 ⊕ Fin 3) →₀ ℕ} (hm : Finsupp.degree m < n) : + coeff m (maurerCartanForm U ρ).toU1Value = 0 := by + have h0 := hU.2 (Finsupp.toMultiset m) ρ (by + rw [← degree_toFinsupp_eq_card, Finsupp.toMultiset_toFinsupp]; exact hm) + have h1 := congrArg GaugeAlgebra.toU1Value h0 + simp only [localGaugeData_evalLie, localGaugeData_iteratedDeriv, localGaugeData_maurerCartan, + GaugeAlgebra.zero_toU1Value] at h1 + rw [eval_toU1Value_eq, iteratedDeriv_toU1Value, constantCoeff_foldl_pderiv, + Finsupp.toMultiset_toFinsupp] at h1 + exact (mul_eq_zero.mp h1).resolve_left (Nat.cast_ne_zero.mpr + (Finset.prod_ne_zero_iff.mpr fun ν _ => Nat.factorial_ne_zero _)) + +/-- Maurer–Cartan triangularity for the Standard Model: a jet trivial to order `n` in the + sense of the Maurer–Cartan filtration truncates to the identity at order `n`. On each + factor the radial relation `∂_ρ U = −i ω_ρ(U) U` and the Euler vanishing principle + propagate the vanishing of the Maurer–Cartan coefficients below degree `n` to the + vanishing of the coefficients of `U` in nonzero degree up to `n`. -/ +theorem truncation_eq_one_of_mem_truncationKer {U : JetGaugeGroupI} {n : ℕ} + (hU : U ∈ localGaugeData.truncationKer n) : truncation n U = 1 := by + have hstar3 : star U.1.1 * U.1.1 = 1 := by + have h1 := (Matrix.mem_specialUnitaryGroup_iff.mp U.1.2).1 + rwa [Matrix.mem_unitaryGroup_iff'] at h1 + have hstar2 : star U.2.1.1 * U.2.1.1 = 1 := by + have h1 := (Matrix.mem_specialUnitaryGroup_iff.mp U.2.1.2).1 + rwa [Matrix.mem_unitaryGroup_iff'] at h1 + have hstar1 : star U.2.2.1 * U.2.2.1 = 1 := (Unitary.mem_iff.mp U.2.2.2).1 + -- the radial relation `∂_ρ U = (−i ω_ρ) U` on each factor + have hd3 : ∀ ρ, U.1.1.map (pderiv ℂ ρ) = + ((-Complex.I) • (maurerCartanForm U ρ).toSU3Matrix) * U.1.1 := fun ρ => by + rw [maurerCartanForm_toSU3Matrix, smul_smul, neg_mul, Complex.I_mul_I, neg_neg, + one_smul, mul_assoc, hstar3, mul_one] + have hd2 : ∀ ρ, U.2.1.1.map (pderiv ℂ ρ) = + ((-Complex.I) • (maurerCartanForm U ρ).toSU2Matrix) * U.2.1.1 := fun ρ => by + rw [maurerCartanForm_toSU2Matrix, smul_smul, neg_mul, Complex.I_mul_I, neg_neg, + one_smul, mul_assoc, hstar2, mul_one] + have hd1 : ∀ ρ, pderiv ℂ ρ U.2.2.1 = + ((-Complex.I) • (maurerCartanForm U ρ).toU1Value) * U.2.2.1 := fun ρ => by + rw [maurerCartanForm_toU1Value, smul_smul, neg_mul, Complex.I_mul_I, neg_neg, + one_smul, mul_assoc, hstar1, mul_one] + have heval : U.eval = 1 := hU.1 + rw [← truncation_one n] + refine Prod.ext ?_ (Prod.ext ?_ ?_) + · exact matrix_map_truncation_eq_one (congrArg (fun p => (p.1 : Matrix (Fin 3) (Fin 3) ℂ)) heval) + fun i j p hp hpn => coeff_entry_eq_zero_of_map_pderiv_eq_mul hd3 + (fun ρ q hq i j => by + rw [Matrix.smul_apply, map_smul, + coeff_maurerCartanForm_toSU3Matrix_eq_zero_of_mem_truncationKer hU ρ hq, smul_zero]) + i j hp hpn + · exact matrix_map_truncation_eq_one + (congrArg (fun p => (p.2.1 : Matrix (Fin 2) (Fin 2) ℂ)) heval) + fun i j p hp hpn => coeff_entry_eq_zero_of_map_pderiv_eq_mul hd2 + (fun ρ q hq i j => by + rw [Matrix.smul_apply, map_smul, + coeff_maurerCartanForm_toSU2Matrix_eq_zero_of_mem_truncationKer hU ρ hq, smul_zero]) + i j hp hpn + · exact truncation_eq_one_of_coeff (congrArg (fun p => (p.2.2 : ℂ)) heval) + fun p hp hpn => coeff_eq_zero_of_pderiv_eq_mul hd1 + (fun ρ q hq => by + rw [map_smul, coeff_maurerCartanForm_toU1Value_eq_zero_of_mem_truncationKer hU ρ hq, + smul_zero]) + hp hpn end JetGaugeGroupI + end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeGroup/LocalGaugeData.lean b/Physlib/Particles/StandardModel/GaugeGroup/LocalGaugeData.lean index 0eb8eb080..226de972c 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/LocalGaugeData.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/LocalGaugeData.lean @@ -5,63 +5,45 @@ Authors: Nathaneal Sajan -/ module -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeField.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction -public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.MaurerCartan -public import Physlib.ClassicalFieldTheory.GaugeTheory.Matter.CovariantDeriv -public import Physlib.Particles.StandardModel.GaugeBosons.AlgebraValued.Basic -public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.GaugeAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Truncation public import Physlib.Particles.StandardModel.GaugeGroup.MaurerCartan.Basic -public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.CovariantDeriv /-! -# The Standard Model gauge group as jets of a gauge group +# The Standard Model gauge group as local gauge data ## i. Overview -The generic transformation laws of gauge and matter fields are stated against a supplied -local-gauge-data package `jets : LocalGaugeData G 𝔤 G₀ 𝔤J`. The Standard Model already -carries all of its data, for the jet gauge group `JetGaugeGroupI` of `SU(3) × SU(2) × U(1)` -with jet Lie algebra `JetGaugeAlgebra`, global group `GaugeGroupI` and gauge algebra -`GaugeAlgebra`. +The generic theory of gauge and matter fields is stated against a supplied local-gauge-data +package `jets : LocalGaugeData G 𝔤 G₀ 𝔤J`. The Standard Model already carries all of its +data, for the jet gauge group `JetGaugeGroupI` of `SU(3) × SU(2) × U(1)` with jet Lie algebra +`JetGaugeAlgebra`, global group `GaugeGroupI` and gauge algebra `GaugeAlgebra`. This file packages those existing constructions as the named term -`StandardModel.localGaugeData`, and records the rules that compute the generic interface back to -the Standard Model definition it came from, so the existing Standard Model lemmas apply to -it unchanged. It is a term, not an instance: every generic construction receives it as an -argument. Its extra law `LocalGaugeDataLeibniz` is a property of that package rather than a -choice, so it is an instance, discharged by the existing Taylor–Leibniz theorem. +`StandardModel.localGaugeData`, and records the rules that compute the generic interface +back to the Standard Model definition it came from, so that the existing Standard Model +lemmas apply to it unchanged. It is a term, not an instance: every generic construction +receives it as an argument. Its faithfulness — Taylor determinacy of the jet gauge algebra +and the vanishing of the Maurer–Cartan form exactly on constant jets — is a property of that +package rather than a choice, so it is an instance. + +Everything the generic theory derives from a package is thereby available for the Standard +Model: the Taylor–Leibniz theorem for the adjoint action, the truncation filtration of the +jet gauge group by the Maurer–Cartan form, the covariance of the covariant derivative, and +the determination of a pure jet by its symmetrized Maurer–Cartan data. ## ii. Key results -- `StandardModel.localGaugeData` : the Standard Model gauge group as jets of a gauge group. +- `StandardModel.localGaugeData` : the Standard Model gauge group as local gauge data. - `StandardModel.localGaugeData_eval`, `StandardModel.localGaugeData_deriv`, - `StandardModel.localGaugeData_maurerCartan`, … : the generic interface computed back to - the Standard Model definitions. -- `StandardModel.localGaugeData_iteratedDeriv` : the generic iterated derivative is the Standard - Model iterated derivative. -- `StandardModel.localGaugeData_adjointCoeff`, `StandardModel.localGaugeData_adjointDualCoeff` : the - generic base-point adjoint transport at this package is the existing Standard Model one. -- `StandardModel.localGaugeData_repCoeff` : the generic base-point Taylor coefficient of a - representation is the Standard Model one. -- `StandardModel.IsGaugeField.toLocalGaugeData` : a Standard Model gauge field is a gauge - field of the package. -- `StandardModel.TransformsIn.repGauge_zero`, - `StandardModel.TransformsIn.covDerivAction`, `StandardModel.TransformsIn.covDerivIter`, - `StandardModel.TransformsIn.repGauge_eq_of_mem_truncationKer_zero` : the generic - covariance theorems of the covariant derivative, read at this package. -- `StandardModel.instLocalGaugeDataLeibniz` : the package obeys the Taylor–Leibniz rule for the - adjoint action. + `StandardModel.localGaugeData_maurerCartan`, `StandardModel.localGaugeData_adjointCoeff_apply`, + … : the generic interface computed back to the Standard Model definitions. +- `StandardModel.instFaithfulLocalGaugeData` : the package is faithful. ## iii. Table of contents - A. The local-gauge-data package - B. The generic interface in Standard Model terms - - B.1. The group and Lie algebra data - - B.2. The derivative, the adjoint action and the Maurer–Cartan form -- C. The generic adjoint transport is the Standard Model adjoint transport - - C.1. Gauge fields - - C.2. The generic covariance theorems in Standard Model terms -- D. The Taylor–Leibniz rule +- C. Faithfulness -/ @@ -69,7 +51,7 @@ choice, so it is an instance, discharged by the existing Taylor–Leibniz theore namespace StandardModel -open JetGaugeAlgebra TensorProduct Matrix MatrixGroups +open JetGaugeAlgebra /-! @@ -82,7 +64,7 @@ is registered globally. -/ -/-- The Standard Model gauge group as jets of a gauge group, for the jet gauge group +/-- The Standard Model gauge group as local gauge data, for the jet gauge group `JetGaugeGroupI` and its Lie algebra `JetGaugeAlgebra` over the global group `GaugeGroupI` and gauge algebra `GaugeAlgebra`. Nothing is redefined. Every data field is an existing Standard Model construction and every proof field an existing Standard @@ -95,20 +77,20 @@ noncomputable def localGaugeData : evalLie := JetGaugeAlgebra.eval ofConstantLie := JetGaugeAlgebra.ofConstant ofConstantLie_lie := JetGaugeAlgebra.ofConstant_lie + evalLie_ofConstantLie := JetGaugeAlgebra.eval_ofConstant deriv := JetGaugeAlgebra.deriv deriv_comm := JetGaugeAlgebra.deriv_comm deriv_bracket := JetGaugeAlgebra.deriv_bracket deriv_ofConstantLie := JetGaugeAlgebra.deriv_ofConstant adjoint := JetGaugeAlgebra.adjoint adjoint_lie := JetGaugeAlgebra.adjointMap_lie + adjointValue := GaugeAlgebra.adjoint + evalLie_adjoint := JetGaugeAlgebra.eval_adjointMap maurerCartan := maurerCartanForm - maurerCartan_one := fun μ => congrFun maurerCartanForm_one μ maurerCartan_ofConstant := fun g μ => congrFun (maurerCartanForm_ofConstant g) μ maurerCartan_cocycle := maurerCartanForm_cocycle maurerCartan_structure := maurerCartanForm_structure deriv_adjoint := deriv_adjointMap - adjointValue := GaugeAlgebra.adjoint - evalLie_adjoint_ofConstantLie := JetGaugeAlgebra.eval_adjointMap_ofConstant /-! @@ -117,8 +99,6 @@ noncomputable def localGaugeData : These rules point from the generic interface to the Standard Model definitions, which is the direction in which the existing Standard Model lemmas become applicable. -### B.1. The group and Lie algebra data - -/ @[simp] @@ -137,12 +117,6 @@ lemma localGaugeData_ofConstantLie : @[simp] lemma localGaugeData_adjointValue : localGaugeData.adjointValue = GaugeAlgebra.adjoint := rfl -/-! - -### B.2. The derivative, the adjoint action and the Maurer–Cartan form - --/ - @[simp] lemma localGaugeData_deriv (μ : Fin 1 ⊕ Fin 3) : localGaugeData.deriv μ = JetGaugeAlgebra.deriv μ := rfl @@ -159,164 +133,59 @@ lemma localGaugeData_adjoint : localGaugeData.adjoint = JetGaugeAlgebra.adjoint @[simp] lemma localGaugeData_maurerCartan : localGaugeData.maurerCartan = maurerCartanForm := rfl -/-- The symmetrized Maurer–Cartan form of the package, written out in Standard Model - terms: the generic iterated derivative and Maurer–Cartan form are the Standard Model - ones, so the average is the one the component computations use. -/ -lemma localGaugeData_symmetrizedMaurerCartanForm_eq (U : JetGaugeGroupI) - (r : Multiset (Fin 1 ⊕ Fin 3)) : - localGaugeData.symmetrizedMaurerCartanForm U r = - (1/(r.card : ℝ) : ℝ) • (r.map fun μ => - JetGaugeAlgebra.iteratedDeriv (r - {μ}) (maurerCartanForm U μ)).sum := rfl - -/-- The symmetrization defect of the Maurer–Cartan form in Standard Model terms: the - generic `LocalGaugeData.iteratedDeriv_maurerCartan_eq_symmetrized_add` read at this package. -/ -lemma iteratedDeriv_maurerCartanForm_eq_symmetrized_add (U : JetGaugeGroupI) - (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : - JetGaugeAlgebra.iteratedDeriv s (maurerCartanForm U μ) = - localGaugeData.symmetrizedMaurerCartanForm U (μ ::ₘ s) + - (1/(s.card + 1 : ℝ)) • (s.map fun ν => - JetGaugeAlgebra.iteratedDeriv (s.erase ν) - ⁅maurerCartanForm U μ, maurerCartanForm U ν⁆).sum := - localGaugeData.iteratedDeriv_maurerCartan_eq_symmetrized_add U s μ - -/-- **The Maurer–Cartan form of an inverse**: the generic `LocalGaugeData.maurerCartan_inv` read at - this package. -/ -lemma maurerCartanForm_inv (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : - maurerCartanForm U⁻¹ μ = - JetGaugeAlgebra.adjoint U⁻¹ (maurerCartanForm U μ) := - localGaugeData.maurerCartan_inv U μ - -/-! - -## C. The generic adjoint transport is the Standard Model adjoint transport - -The composite `evalLie ∘ ∂_x ∘ Ad_U ∘ ofConstantLie`, by which the generic theory -transports the gauge algebra to the base point, is the map the Standard Model -covariant-derivative development already uses under the same name. - --/ - -@[simp] -lemma localGaugeData_adjointCoeff (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : - _root_.IsGaugeField.adjointCoeff localGaugeData U x = IsGaugeField.adjointCoeff U x := rfl - +/-- The adjoint Taylor coefficients of the package, written out in Standard Model terms. -/ @[simp] -lemma localGaugeData_adjointDualCoeff (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : - _root_.adjointDualCoeff localGaugeData U x = adjointDualCoeff U x := rfl - -/-- The generic base-point Taylor coefficient of a representation is the Standard Model - one. Neither side mentions the package — both are `jetEval ∘ ∂_x ∘ rep U ∘ jetOfConstant` - — but the two `jet`-level operations are defined in different namespaces, and this rule - points from the generic one to the Standard Model one. -/ -@[simp] -lemma localGaugeData_repCoeff {V : Type} [AddCommGroup V] [Module ℂ V] - (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) (U : JetGaugeGroupI) - (x : Multiset (Fin 1 ⊕ Fin 3)) : - _root_.IsGaugeField.repCoeff rep U x = IsGaugeField.repCoeff rep U x := rfl - -@[simp] -lemma localGaugeData_repDualCoeff {V : Type} [AddCommGroup V] [Module ℂ V] - (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) (U : JetGaugeGroupI) - (x : Multiset (Fin 1 ⊕ Fin 3)) : - _root_.IsGaugeField.repDualCoeff rep U x = IsGaugeField.repDualCoeff rep U x := rfl +lemma localGaugeData_adjointCoeff_apply (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) + (a : GaugeAlgebra) : + localGaugeData.adjointCoeff U x a = + JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv x + (JetGaugeAlgebra.adjointMap U (JetGaugeAlgebra.ofConstant a))) := rfl + +/-- The `su(3)` component of the adjoint Taylor coefficients. -/ +lemma localGaugeData_adjointCoeff_toSU3Matrix (U : JetGaugeGroupI) + (p : Multiset (Fin 1 ⊕ Fin 3)) (b : GaugeAlgebra) : + (localGaugeData.adjointCoeff U p b).toSU3Matrix + = ((U.1.1 * b.toSU3Matrix.map (MvPowerSeries.C : ℂ → JetRing) * star U.1.1).map fun f => + MvPowerSeries.constantCoeff (p.foldl (fun h ρ => MvPowerSeries.pderiv ℂ ρ h) f)) := by + rw [localGaugeData_adjointCoeff_apply, eval_iteratedDeriv_toSU3Matrix, adjointMap_toSU3Matrix, + ofConstant_toSU3Matrix] + +/-- The `su(2)` component of the adjoint Taylor coefficients. -/ +lemma localGaugeData_adjointCoeff_toSU2Matrix (U : JetGaugeGroupI) + (p : Multiset (Fin 1 ⊕ Fin 3)) (b : GaugeAlgebra) : + (localGaugeData.adjointCoeff U p b).toSU2Matrix + = ((U.2.1.1 * b.toSU2Matrix.map (MvPowerSeries.C : ℂ → JetRing) * star U.2.1.1).map + fun f => MvPowerSeries.constantCoeff + (p.foldl (fun h ρ => MvPowerSeries.pderiv ℂ ρ h) f)) := by + rw [localGaugeData_adjointCoeff_apply, eval_iteratedDeriv_toSU2Matrix, adjointMap_toSU2Matrix, + ofConstant_toSU2Matrix] + +/-- The `u(1)` component of the adjoint Taylor coefficients. -/ +lemma localGaugeData_adjointCoeff_toU1Value (U : JetGaugeGroupI) + (p : Multiset (Fin 1 ⊕ Fin 3)) (b : GaugeAlgebra) : + (localGaugeData.adjointCoeff U p b).toU1Value + = MvPowerSeries.constantCoeff (p.foldl (fun h ρ => MvPowerSeries.pderiv ℂ ρ h) + (MvPowerSeries.C b.toU1Value)) := by + rw [localGaugeData_adjointCoeff_apply, eval_iteratedDeriv_toU1Value, adjointMap_toU1Value, + ofConstant_toU1Value] /-! -### C.1. Gauge fields +## C. Faithfulness -/ -/-- **A Standard Model gauge field is a gauge field of the package.** The two structures - have the same three fields: the generic `adjointDualCoeff` and Maurer–Cartan form at - `localGaugeData` are the Standard Model ones, so each law transfers unchanged. This is - the bridge along which the generic covariance theorems apply to the Standard Model. -/ -lemma IsGaugeField.toLocalGaugeData {B : Type} [Ring B] [Algebra ℂ B] - {repLorentz : Representation ℂ SL(2,ℂ) B} {repGauge : Representation ℂ JetGaugeGroupI B} - {A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} - (hA : IsGaugeField repLorentz repGauge A) : - _root_.IsGaugeField localGaugeData repLorentz repGauge A where - lorentz_apply := hA.lorentz_apply - gauge_apply_deriv := hA.gauge_apply_deriv - gauge_mul := hA.gauge_mul - -/-! - -### C.2. The generic covariance theorems in Standard Model terms - -The covariance of the covariant derivative is proved once, generically, in -`Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction`. The -Standard Model `TransformsIn`, `covDerivAction` and `covDerivIter` are the generic ones -at `localGaugeData`, so those theorems specialize; only the gauge-field hypothesis needs -the bridge `IsGaugeField.toLocalGaugeData`. - --/ - -section Covariance - -variable {B : Type} [Ring B] [Algebra ℂ B] {V : Type} [AddCommGroup V] [Module ℂ V] - [FiniteDimensional ℂ V] - {repLorentz : Representation ℂ SL(2,ℂ) B} {repGauge : Representation ℂ JetGaugeGroupI B} - {A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} - {rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)} - {act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℂ] V} - {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B} - -omit [FiniteDimensional ℂ V] in -/-- A matter gauge tensor transforms at the base point through the dual coefficient of the - base-point value of the gauge jet alone: the generic - `LocalGaugeData.TransformsIn.repGauge_zero`. -/ -lemma TransformsIn.repGauge_zero (hF : TransformsIn repGauge rep F) (U : JetGaugeGroupI) - (φ : Module.Dual ℂ V) : - repGauge U (F 0 φ) = F 0 (IsGaugeField.repDualCoeff rep U⁻¹ 0 φ) := - _root_.LocalGaugeData.TransformsIn.repGauge_zero hF U φ - -/-- **The covariant derivative preserves `TransformsIn`**, for the Standard Model: the - generic `LocalGaugeData.TransformsIn.covDerivAction` read at `localGaugeData`. -/ -theorem TransformsIn.covDerivAction (hA : IsGaugeField repLorentz repGauge A) - (hF : TransformsIn repGauge rep F) - (hact : localGaugeData.IsInfinitesimalActionOf act rep) - (ρ : Fin 1 ⊕ Fin 3) : - TransformsIn repGauge rep (IsGaugeField.covDerivAction A act F ρ) := - _root_.LocalGaugeData.TransformsIn.covDerivAction hA.toLocalGaugeData hF hact ρ - -/-- **Every iterated covariant derivative preserves `TransformsIn`**, for the Standard - Model: the recursion of `TransformsIn.covDerivAction` over the tuple of directions. -/ -theorem TransformsIn.covDerivIter (hA : IsGaugeField repLorentz repGauge A) - (hF : TransformsIn repGauge rep F) - (hact : localGaugeData.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 are fixed by pure jets**, for the Standard Model: the generic - `LocalGaugeData.TransformsIn.repGauge_eq_of_eval_eq_one`, with membership in the zeroth truncation - kernel read as triviality of the base-point value. -/ -lemma TransformsIn.repGauge_eq_of_mem_truncationKer_zero - (hF : TransformsIn repGauge rep F) - (hrep : ∀ {W : JetGaugeGroupI}, W.eval = 1 → IsGaugeField.repCoeff rep W 0 = LinearMap.id) - (U : JetGaugeGroupI.truncationKer 0) (φ : Module.Dual ℂ V) : - repGauge U.1 (F 0 φ) = F 0 φ := - _root_.LocalGaugeData.TransformsIn.repGauge_eq_of_eval_eq_one (jets := localGaugeData) hF hrep - (JetGaugeGroupI.mem_truncationKer_zero_iff.mp U.2) φ - -end Covariance - -/-! - -## D. The Taylor–Leibniz rule - --/ - -/-- The Standard Model package obeys the Taylor–Leibniz rule for the adjoint action. The - class field is the existing theorem `JetGaugeAlgebra.eval_iteratedDeriv_adjointMap`: the - `IsGaugeField.adjointCoeff U p.1` appearing there is by definition the composite - `evalLie ∘ ∂_{p.1} ∘ Ad_U ∘ ofConstantLie` that the field writes out. - +/-- The Standard Model package is faithful: an element of the jet gauge algebra is + determined by the base-point values of its iterated derivatives, and a jet whose + Maurer–Cartan form vanishes is the constant jet of its value. Both are statements about + power series, proved from the matrix definitions in + `JetGaugeAlgebra.ext_of_eval_iteratedDeriv` and `maurerCartanForm_eq_zero_iff_ofConstant`. Unlike the package itself this is a property of it and not a choice, so it is an instance. -/ -instance instLocalGaugeDataLeibniz : LocalGaugeDataLeibniz localGaugeData where - evalLie_iteratedDeriv_adjoint := JetGaugeAlgebra.eval_iteratedDeriv_adjointMap +instance instFaithfulLocalGaugeData : localGaugeData.Faithful where + ext_of_evalLie_iteratedDeriv h := JetGaugeAlgebra.ext_of_eval_iteratedDeriv h + eq_ofConstant_of_maurerCartan_eq_zero h := by + obtain ⟨c, hc⟩ := (maurerCartanForm_eq_zero_iff_ofConstant _).mp h + rw [hc, localGaugeData_eval, localGaugeData_ofConstant, JetGaugeGroupI.eval_ofConstant] end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Freeness.lean b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Freeness.lean new file mode 100644 index 000000000..6cb5cca6a --- /dev/null +++ b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Freeness.lean @@ -0,0 +1,393 @@ +/- +Copyright (c) 2026 Joseph Tooby-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.LocalGaugeData +public import Physlib.Relativity.JetRing.Matrix +/-! +# Freeness of the Maurer–Cartan data of the Standard Model jets + +## i. Overview + +For any faithful local-gauge-data package, a pure jet (one with identity value) is +determined by its symmetrized Maurer–Cartan data, the base-point values of the symmetrized +Maurer–Cartan form indexed by nonempty multisets of directions: +`LocalGaugeData.symmetrizedMaurerCartanCoeff` is injective. For the Standard Model jets it +is also *surjective*: every family of gauge-algebra elements indexed by nonempty multisets +is the symmetrized Maurer–Cartan data of some pure jet. Together, the symmetrized data are +free coordinates on the pure jets. + +Surjectivity is a statement about power series, proved here from the matrix definitions. +The radial component `ρ = ∑_μ x_μ ω_μ` of the Maurer–Cartan form carries exactly the +symmetrized data, so it suffices to solve the Euler system `E U = −i ρ U`, `U(0) = 1` for +a prescribed `ρ`; this is done factor by factor by `JetRing.exists_matrix_eulerTransport`, +with unitarity and unit determinant from the Euler vanishing principle. The same +integration technique, applied to the full structural equation, shows that every flat jet +1-form is the Maurer–Cartan form of a pure jet, `exists_maurerCartanForm_eq_of_structure`. + +## ii. Key results + +- `StandardModel.exists_maurerCartanForm_eq_of_structure` : every flat jet 1-form is the + Maurer–Cartan form of a pure jet. +- `StandardModel.symmetrizedMaurerCartanCoeff_surjective` : every family of symmetrized + data is realized by a pure jet. +- `StandardModel.instFreeLocalGaugeData` : the package is free, so the symmetrized data are + free coordinates on the pure jets. + +## iii. Table of contents + +- A. Integrating the structural equation +- B. The symmetrized Maurer–Cartan data in components +- C. Surjectivity of the symmetrized Maurer–Cartan data + +-/ + +@[expose] public section + +namespace StandardModel + +open MvPowerSeries JetGaugeAlgebra JetRing + +/-! + +## A. Integrating the structural equation + +-/ + +/-- Every flat jet 1-form is the Maurer–Cartan form of a pure jet: the converse of the + structural equation. The jet is the parallel transport + `exists_deriv_eq_of_maurerCartanForm_structure`, and unitarity turns + `∂_μ U = −i ω_μ U` into `ω_μ = i (∂_μ U) U⁻¹`. -/ +lemma exists_maurerCartanForm_eq_of_structure + (ω : (Fin 1 ⊕ Fin 3) → JetGaugeAlgebra) + (hω : ∀ μ ν, deriv μ (ω ν) - deriv ν (ω μ) + ⁅ω μ, ω ν⁆ = 0) : + ∃ U ∈ localGaugeData.truncationKer 0, maurerCartanForm U = ω := by + obtain ⟨U, hU0, hU⟩ := exists_deriv_eq_of_maurerCartanForm_structure ω hω + refine ⟨U, localGaugeData.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 + +/-! + +## B. The symmetrized Maurer–Cartan data in components + +-/ + +/-- 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 (localGaugeData.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 [LocalGaugeData.symmetrizedMaurerCartanForm] + simp only [localGaugeData_iteratedDeriv, localGaugeData_maurerCartan] + rw [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 (localGaugeData.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 [LocalGaugeData.symmetrizedMaurerCartanForm] + simp only [localGaugeData_iteratedDeriv, localGaugeData_maurerCartan] + rw [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 (localGaugeData.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 [LocalGaugeData.symmetrizedMaurerCartanForm] + simp only [localGaugeData_iteratedDeriv, localGaugeData_maurerCartan] + rw [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μ) + +/-- The `su(3)` entry of the symmetrized Maurer–Cartan data, through the radial component + `∑_μ x_μ ω_μ` of the Maurer–Cartan form: a coefficient of that component, normalized by + the factorials of the multiset. -/ +lemma symmetrizedMaurerCartanCoeff_toSU3_eq (U : localGaugeData.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) : + (localGaugeData.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 [LocalGaugeData.symmetrizedMaurerCartanCoeff_apply, localGaugeData_evalLie, + eval_symmetrizedMaurerCartanForm_toSU3_apply, sum_constantCoeff_foldl_erase, hentry] + +/-- The `su(2)` entry of the symmetrized Maurer–Cartan data through the radial + component. -/ +lemma symmetrizedMaurerCartanCoeff_toSU2_eq (U : localGaugeData.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) : + (localGaugeData.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 [LocalGaugeData.symmetrizedMaurerCartanCoeff_apply, localGaugeData_evalLie, + eval_symmetrizedMaurerCartanForm_toSU2_apply, sum_constantCoeff_foldl_erase, hentry] + +/-- The `u(1)` value of the symmetrized Maurer–Cartan data through the radial + component. -/ +lemma symmetrizedMaurerCartanCoeff_toU1_eq (U : localGaugeData.truncationKer 0) + (p : JetRing) + (hrad : ∑ μ, (X μ : JetRing) • (maurerCartanForm U.1 μ).toU1Value = p) + (r : Multiset (Fin 1 ⊕ Fin 3)) (hr : r ≠ 0) : + (localGaugeData.symmetrizedMaurerCartanCoeff U ⟨r, hr⟩).toU1Value = + (1/(Multiset.card r : ℝ)) • (((∏ ν, Nat.factorial (r.count ν) : ℕ) : ℂ) * + coeff (Multiset.toFinsupp r) p) := by + rw [LocalGaugeData.symmetrizedMaurerCartanCoeff_apply, localGaugeData_evalLie, + eval_symmetrizedMaurerCartanForm_toU1Value, sum_constantCoeff_foldl_erase, hrad] + +/-! + +## C. Surjectivity of the symmetrized Maurer–Cartan data + +-/ + +/-- The factorwise construction behind surjectivity: for every hermitian family `E` of + matrices indexed by nonempty multisets there is a unitary Euler transport `V` based at + `1` whose radial Maurer–Cartan component `P = ∑_μ x_μ · i (∂_μ V) V†` has, at the + monomial `r`, the coefficient `|r| / ∏ (r.count ν)!` times `E r`; and `V` has unit + determinant when the `E r` are traceless. -/ +lemma exists_eulerTransport_of_symmetrized {κ : Type} [Fintype κ] [DecidableEq κ] + (E : {r : Multiset (Fin 1 ⊕ Fin 3) // r ≠ 0} → Matrix κ κ ℂ) + (hEstar : ∀ 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 + classical + 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) + +/-- Freeness, surjectivity half: every prescribed family of symmetrized Maurer–Cartan + data is realized by a pure jet, assembled factor by factor from + `exists_eulerTransport_of_symmetrized`. -/ +theorem symmetrizedMaurerCartanCoeff_surjective : + Function.Surjective localGaugeData.symmetrizedMaurerCartanCoeff := by + classical + intro c + obtain ⟨V₃, P₃, hV₃0, hV₃u, hrad₃, hdet₃, hcoeff₃⟩ := + exists_eulerTransport_of_symmetrized (κ := 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₂⟩ := + exists_eulerTransport_of_symmetrized (κ := 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₁⟩ := + exists_eulerTransport_of_symmetrized (κ := 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⟩⟩), + localGaugeData.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 + +/-- The Standard Model package is free: the symmetrized Maurer–Cartan data are free + coordinates on its pure jets. Injectivity is the general + `LocalGaugeData.symmetrizedMaurerCartanCoeff_injective` of a faithful package, and + surjectivity is `symmetrizedMaurerCartanCoeff_surjective`. -/ +instance instFreeLocalGaugeData : localGaugeData.Free where + toFaithful := inferInstance + symmetrizedMaurerCartanCoeff_surjective := symmetrizedMaurerCartanCoeff_surjective + +end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Truncation.lean b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Truncation.lean deleted file mode 100644 index 2f2ad6b4e..000000000 --- a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Truncation.lean +++ /dev/null @@ -1,619 +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.LocalGaugeData -public import Physlib.Particles.StandardModel.GaugeGroup.JetGaugeGroup.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 Mathlib.RingTheory.MvPowerSeries.Derivative -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 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. -/ -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 - -lemma exists_maurerCartanForm_eq_of_structure - (ω : (Fin 1 ⊕ Fin 3) → JetGaugeAlgebra) - (hω : ∀ μ ν, deriv μ (ω ν) - deriv ν (ω μ) + ⁅ω μ, ω ν⁆ = 0) : - ∃ U ∈ JetGaugeGroupI.truncationKer 0, maurerCartanForm U = ω := by - 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 - - -/-- 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 (localGaugeData.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 [localGaugeData_symmetrizedMaurerCartanForm_eq, 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 (localGaugeData.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 [localGaugeData_symmetrizedMaurerCartanForm_eq, 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 (localGaugeData.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 [localGaugeData_symmetrizedMaurerCartanForm_eq, 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μ) - -/-! - -## 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 (localGaugeData.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 `LocalGaugeData.evalLie_iteratedDeriv_maurerCartan_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 (localGaugeData.symmetrizedMaurerCartanForm U.1 r) = - eval (localGaugeData.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 localGaugeData.evalLie_iteratedDeriv_maurerCartan_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) - -/-! - -## 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 (localGaugeData.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 - - -/-- **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`. This is - -- the generic `LocalGaugeData.evalLie_iteratedDeriv_maurerCartan_eq_zero_of_symmetrized_eq_zero`, - -- which follows from the symmetrization defect formula alone. - 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 := - fun _ s μ hk hkn => - localGaugeData.evalLie_iteratedDeriv_maurerCartan_eq_zero_of_symmetrized_eq_zero U.1 - (fun r hr hrn => by - have hcoeff := h r hr hrn - rw [symmetrizedMaurerCartanCoeff_apply] at hcoeff - exact hcoeff) s μ (hk ▸ hkn) - -- 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 diff --git a/Physlib/Particles/StandardModel/HiggsBoson/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/HiggsBoson/GaugeAlgebraAction.lean index 28a354136..64fc85979 100644 --- a/Physlib/Particles/StandardModel/HiggsBoson/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/HiggsBoson/GaugeAlgebraAction.lean @@ -8,7 +8,7 @@ module public import Physlib.Particles.StandardModel.HiggsBoson.JetAlgebra.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData -public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.GaugeAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeAction public import Mathlib.LinearAlgebra.TensorProduct.Pi public import Mathlib.Analysis.Normed.Lp.Matrix public import Mathlib.RingTheory.TensorProduct.Maps @@ -243,13 +243,13 @@ private lemma pderivWeak_comp_foldWeak (μ : Fin 1 ⊕ Fin 3) entrywise derivative on the weak coordinates. -/ private lemma jetValLinEquiv_jetDeriv (μ : Fin 1 ⊕ Fin 3) (z : JetRing ⊗[ℂ] HiggsVec) : - jetValLinEquiv (StandardModel.jetDeriv μ z) + jetValLinEquiv (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] + rw [jetDeriv_tmul, jetValLinEquiv_tmul, jetValLinEquiv_tmul] refine WithLp.ofLp_injective 2 ?_ funext i exact (Derivation.map_smul (pderiv ℂ μ) (v.ofLp i) f).symm @@ -258,26 +258,26 @@ private lemma jetValLinEquiv_jetDeriv (μ : Fin 1 ⊕ Fin 3) 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) + jetValLinEquiv (jetIteratedDeriv x z) = foldWeak x (jetValLinEquiv z) := by induction x using Multiset.induction_on with | empty => - rw [StandardModel.jetIteratedDeriv_zero, LinearMap.id_apply, + rw [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, + rw [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 + 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] + rw [jetEval_tmul, jetValLinEquiv_tmul] refine WithLp.ofLp_injective 2 ?_ funext i show (constantCoeff f • v).ofLp i = constantCoeff (v.ofLp i • f) @@ -383,10 +383,10 @@ lemma repCoeff_eq (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : 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 (jetIteratedDeriv x + (repJetGaugeGroupI U (jetOfConstant v))) from rfl, jetEval_eq, jetValLinEquiv_jetIteratedDeriv, repJetGaugeGroupI_apply, - LinearEquiv.apply_symm_apply, StandardModel.jetOfConstant_apply, + LinearEquiv.apply_symm_apply, jetOfConstant_apply, jetValLinEquiv_tmul] refine WithLp.ofLp_injective 2 ?_ funext j @@ -441,7 +441,7 @@ theorem isInfinitesimalActionOf : localGaugeData.IsInfinitesimalActionOf gaugeAlgebraAction repJetGaugeGroupI := by constructor · intro U μ x - simp only [localGaugeData_repCoeff, localGaugeData_evalLie, + simp only [localGaugeData_evalLie, localGaugeData_iteratedDeriv, localGaugeData_maurerCartan] have hMcons : ((jetGaugeMatrix U).map fun f => constantCoeff ((μ ::ₘ x).foldl (fun h ρ => pderiv ℂ ρ h) f)) @@ -465,7 +465,7 @@ theorem isInfinitesimalActionOf : 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] + JetRing.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] @@ -474,7 +474,7 @@ theorem isInfinitesimalActionOf : rw [Function.comp_apply, weakEnd_mul, repCoeff_eq] rfl · intro U x c - simp only [localGaugeData_repCoeff, localGaugeData_adjointCoeff] + simp only [localGaugeData_adjointCoeff_apply] 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] @@ -506,7 +506,7 @@ theorem isInfinitesimalActionOf : 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) + actionMatrix (localGaugeData.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 @@ -514,21 +514,21 @@ theorem isInfinitesimalActionOf : = ((jetGaugeMatrix U).map fun f => constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) * actionMatrix c := by - rw [hconst, matrix_constantCoeff_foldl_pderiv_mul, + rw [hconst, JetRing.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]), + (fun p _ hp => by rw [if_neg hp, Matrix.mul_zero]), if_pos rfl] rw [← h1, jetGaugeMatrix_mul_jetActionMatrix, - matrix_constantCoeff_foldl_pderiv_mul] + JetRing.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]) + = localGaugeData.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))) diff --git a/Physlib/Particles/StandardModel/JetAlgebra/Basic.lean b/Physlib/Particles/StandardModel/JetAlgebra/Basic.lean index 573caf344..9eeb3540a 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/Basic.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/Basic.lean @@ -7,7 +7,8 @@ module public import Physlib.Particles.StandardModel.Fermions.JetAlgebra.Basic public import Physlib.Particles.StandardModel.HiggsBoson.JetAlgebra.Basic -public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData /-! # The jet algebra of the Standard Model @@ -16,7 +17,8 @@ public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.Basic 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 +(complexified) gauge-boson jet algebra `GaugeJetAlgebra GaugeAlgebra`. The bosonic factors +commute with everything, so the ordinary tensor product is correct; the anticommutativity of the fermions lives entirely inside the fermionic factor. @@ -62,7 +64,7 @@ open TensorProduct Matrix MatrixGroups and gauge-boson jet algebras. A Standard Model Lagrangian is an element of this algebra. -/ abbrev JetAlgebra : Type := - (FermionJetAlgebra ⊗[ℂ] HiggsJetAlgebra) ⊗[ℂ] (ℂ ⊗[ℝ] GaugeJetAlgebra) + (FermionJetAlgebra ⊗[ℂ] HiggsJetAlgebra) ⊗[ℂ] (ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) namespace JetAlgebra @@ -75,20 +77,20 @@ namespace JetAlgebra /-- The inclusion of the fermionic sector. -/ noncomputable def includeFermion : FermionJetAlgebra →ₐ[ℂ] JetAlgebra := (Algebra.TensorProduct.includeLeft - (R := ℂ) (S := ℂ) (B := ℂ ⊗[ℝ] GaugeJetAlgebra)).comp + (R := ℂ) (S := ℂ) (B := ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra))).comp Algebra.TensorProduct.includeLeft /-- The inclusion of the Higgs sector. -/ noncomputable def includeHiggs : HiggsJetAlgebra →ₐ[ℂ] JetAlgebra := (Algebra.TensorProduct.includeLeft - (R := ℂ) (S := ℂ) (B := ℂ ⊗[ℝ] GaugeJetAlgebra)).comp + (R := ℂ) (S := ℂ) (B := ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra))).comp Algebra.TensorProduct.includeRight /-- The inclusion of the gauge sector. -/ -noncomputable def includeGauge : (ℂ ⊗[ℝ] GaugeJetAlgebra) →ₐ[ℂ] JetAlgebra := +noncomputable def includeGauge : (ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) →ₐ[ℂ] JetAlgebra := Algebra.TensorProduct.includeRight -lemma includeGauge_apply (y : ℂ ⊗[ℝ] GaugeJetAlgebra) : +lemma includeGauge_apply (y : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) : includeGauge y = ((1 : FermionJetAlgebra) ⊗ₜ[ℂ] (1 : HiggsJetAlgebra)) ⊗ₜ[ℂ] y := rfl @@ -116,7 +118,7 @@ private lemma tensor_includeRight_comm {A B : Type*} [Ring A] [Algebra ℂ A] /-- The image of the gauge sector is central: gauge-boson symbols commute with everything, as bosons must. -/ -lemma includeGauge_commute (y : ℂ ⊗[ℝ] GaugeJetAlgebra) (x : JetAlgebra) : +lemma includeGauge_commute (y : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) (x : JetAlgebra) : x * includeGauge y = includeGauge y * x := tensor_includeRight_comm y x diff --git a/Physlib/Particles/StandardModel/JetAlgebra/FieldAlgebra.lean b/Physlib/Particles/StandardModel/JetAlgebra/FieldAlgebra.lean index cfb5062fb..93e9f76ef 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/FieldAlgebra.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/FieldAlgebra.lean @@ -33,8 +33,10 @@ Two things do not come for free. The fermion families are indexed by covectors o *individual species*, while the fermionic generation theorem produces every covector on the total target space `FermionSpace`; the gap is closed by `FermionSpace.span_speciesDual_eq_top`, which says the pulled-back covectors span. And the -gauge sector's generation theorem is a statement over `ℝ` about `GaugeJetAlgebra`, whereas -the gauge tensor factor is the complexification `ℂ ⊗[ℝ] GaugeJetAlgebra`; the extra complex +gauge sector's generation theorem is a statement over `ℝ` about `GaugeJetAlgebra GaugeAlgebra`, +whereas +the gauge tensor factor is the complexification `ℂ ⊗[ℝ] GaugeJetAlgebra GaugeAlgebra`; the extra +complex scalar is supplied by the algebra map, since `z ⊗ₜ x = (z ⊗ₜ 1) * (1 ⊗ₜ x)` and the first factor is the image of `z` under `algebraMap`. @@ -344,8 +346,10 @@ lemma includeFermion_mem_adjoin_generators (f : FermionJetAlgebra) : ### B.4. The gauge sector -The gauge tensor factor is the complexification `ℂ ⊗[ℝ] GaugeJetAlgebra`, while the gauge -sector's generation theorem is a statement over `ℝ` about `GaugeJetAlgebra` itself. The +The gauge tensor factor is the complexification `ℂ ⊗[ℝ] GaugeJetAlgebra GaugeAlgebra`, while the +gauge +sector's generation theorem is a statement over `ℝ` about `GaugeJetAlgebra GaugeAlgebra` itself. +The real part of the factor is handled by that theorem transported along the real algebra map `x ↦ 1 ⊗ₜ x`; the complex scalar is then supplied by `z ⊗ₜ x = (z ⊗ₜ 1) * (1 ⊗ₜ x)`, whose first factor is the image of `z` under `algebraMap` and so lies in every subalgebra. @@ -355,10 +359,10 @@ first factor is the image of `z` under `algebraMap` and so lies in every subalge /-- The iterated derivative of the complexification acts on a pure tensor through the gauge sector's own iterated derivative. -/ lemma iteratedD_complexJetDeriv_tmul (s : Multiset (Fin 1 ⊕ Fin 3)) (z : ℂ) - (x : GaugeJetAlgebra) : - Lorentz.iteratedD GaugeJetAlgebra.complexJetDeriv + (x : (GaugeJetAlgebra GaugeAlgebra)) : + Lorentz.iteratedD (GaugeJetAlgebra.complexJetDeriv GaugeAlgebra) GaugeJetAlgebra.complexJetDeriv_comm s (z ⊗ₜ[ℝ] x) - = z ⊗ₜ[ℝ] GaugeJetAlgebra.iteratedJetDeriv s x := by + = z ⊗ₜ[ℝ] (GaugeJetAlgebra.iteratedJetDeriv GaugeAlgebra) s x := by induction s using Multiset.induction_on with | empty => rw [Lorentz.iteratedD_zero, GaugeJetAlgebra.iteratedJetDeriv_zero, LinearMap.id_apply, @@ -372,14 +376,14 @@ lemma iteratedD_complexJetDeriv_tmul (s : Multiset (Fin 1 ⊕ Fin 3)) (z : ℂ) inclusion of the gauge sector precomposed with the inclusion of the real part of the complexification. It is a map of `ℝ`-algebras, which is the level at which the gauge sector's generation theorem is stated. -/ -noncomputable def includeGaugeReal : GaugeJetAlgebra →ₐ[ℝ] JetAlgebra := +noncomputable def includeGaugeReal : (GaugeJetAlgebra GaugeAlgebra) →ₐ[ℝ] JetAlgebra := (AlgHom.restrictScalars ℝ includeGauge).comp - (Algebra.TensorProduct.includeRight (R := ℝ) (A := ℂ) (B := GaugeJetAlgebra)) + (Algebra.TensorProduct.includeRight (R := ℝ) (A := ℂ) (B := (GaugeJetAlgebra GaugeAlgebra))) /-- The real gauge inclusion is the gauge inclusion of the pure tensor with complex part one. -/ @[simp] -lemma includeGaugeReal_apply (x : GaugeJetAlgebra) : +lemma includeGaugeReal_apply (x : (GaugeJetAlgebra GaugeAlgebra)) : includeGaugeReal x = includeGauge ((1 : ℂ) ⊗ₜ[ℝ] x) := rfl /-- A gauge-field symbol is the gauge sector's own derivative symbol, included through the @@ -387,15 +391,15 @@ lemma includeGaugeReal_apply (x : GaugeJetAlgebra) : lemma gaugeField_eq_includeGaugeReal (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : gaugeField s μ φ - = includeGaugeReal (GaugeJetAlgebra.iteratedJetDeriv s - (GaugeJetAlgebra.ofA μ φ)) := by + = includeGaugeReal ((GaugeJetAlgebra.iteratedJetDeriv GaugeAlgebra) s + ((GaugeJetAlgebra.ofA GaugeAlgebra) μ φ)) := by rw [gaugeField_apply, includeGaugeReal_apply, GaugeJetAlgebra.gaugeField_apply, iteratedD_complexJetDeriv_tmul] /-- Every element of the real gauge sector lies in the algebra generated by the symbols: the gauge-boson jet algebra is generated over `ℝ` by the derivative symbols of the gauge field, and those are the gauge family. -/ -lemma includeGaugeReal_mem_adjoin_generators (x : GaugeJetAlgebra) : +lemma includeGaugeReal_mem_adjoin_generators (x : (GaugeJetAlgebra GaugeAlgebra)) : includeGaugeReal x ∈ Algebra.adjoin ℂ generators := by have h : includeGaugeReal x ∈ (Algebra.adjoin ℂ generators).restrictScalars ℝ := by refine mem_of_adjoin_eq_top includeGaugeReal @@ -409,16 +413,16 @@ lemma includeGaugeReal_mem_adjoin_generators (x : GaugeJetAlgebra) : /-- Every element of the complexified gauge sector lies in the algebra generated by the symbols: a pure tensor splits as a complex scalar times the image of its real part. -/ -lemma includeGauge_mem_adjoin_generators (y : ℂ ⊗[ℝ] GaugeJetAlgebra) : +lemma includeGauge_mem_adjoin_generators (y : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) : includeGauge y ∈ Algebra.adjoin ℂ generators := by induction y using TensorProduct.induction_on with | zero => rw [map_zero]; exact zero_mem _ | add a b ha hb => rw [map_add]; exact add_mem ha hb | tmul z x => - have hsplit : (z ⊗ₜ[ℝ] x : ℂ ⊗[ℝ] GaugeJetAlgebra) - = algebraMap ℂ (ℂ ⊗[ℝ] GaugeJetAlgebra) z * ((1 : ℂ) ⊗ₜ[ℝ] x) := by - rw [show algebraMap ℂ (ℂ ⊗[ℝ] GaugeJetAlgebra) z - = z ⊗ₜ[ℝ] (1 : GaugeJetAlgebra) from rfl, + have hsplit : (z ⊗ₜ[ℝ] x : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) + = algebraMap ℂ (ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) z * ((1 : ℂ) ⊗ₜ[ℝ] x) := by + rw [show algebraMap ℂ (ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) z + = z ⊗ₜ[ℝ] (1 : (GaugeJetAlgebra GaugeAlgebra)) from rfl, Algebra.TensorProduct.tmul_mul_tmul, mul_one, one_mul] rw [hsplit, map_mul, AlgHom.commutes] exact mul_mem (Subalgebra.algebraMap_mem _ z) @@ -443,13 +447,13 @@ private lemma tensor_tmul_tmul {A B C : Type*} [Ring A] [Algebra ℂ A] [Ring B] /-- A pure tensor of the jet algebra is the product of the three sector inclusions applied to its factors. -/ lemma includeFermion_mul_includeHiggs_mul_includeGauge (a : FermionJetAlgebra) - (b : HiggsJetAlgebra) (c : ℂ ⊗[ℝ] GaugeJetAlgebra) : + (b : HiggsJetAlgebra) (c : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) : includeFermion a * includeHiggs b * includeGauge c = (a ⊗ₜ[ℂ] b) ⊗ₜ[ℂ] c := tensor_tmul_tmul a b c /-- Every pure tensor of the jet algebra lies in the algebra generated by the symbols. -/ lemma tmul_mem_adjoin_generators (w : FermionJetAlgebra ⊗[ℂ] HiggsJetAlgebra) - (y : ℂ ⊗[ℝ] GaugeJetAlgebra) : + (y : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) : (w ⊗ₜ[ℂ] y : JetAlgebra) ∈ Algebra.adjoin ℂ generators := by induction w using TensorProduct.induction_on with | zero => rw [TensorProduct.zero_tmul]; exact zero_mem _ @@ -474,7 +478,7 @@ theorem adjoin_generators_eq_top : Algebra.adjoin ℂ generators = (⊤ : Subalgebra ℂ JetAlgebra) := by refine top_le_iff.mp ?_ rw [← Algebra.TensorProduct.adjoin_tmul_eq_top ℂ - (FermionJetAlgebra ⊗[ℂ] HiggsJetAlgebra) (ℂ ⊗[ℝ] GaugeJetAlgebra)] + (FermionJetAlgebra ⊗[ℂ] HiggsJetAlgebra) (ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra))] refine Algebra.adjoin_le ?_ rintro _ ⟨w, y, rfl⟩ exact tmul_mem_adjoin_generators w y diff --git a/Physlib/Particles/StandardModel/JetAlgebra/GaugeAction.lean b/Physlib/Particles/StandardModel/JetAlgebra/GaugeAction.lean index 88a25dd59..5b8a0d120 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/GaugeAction.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/GaugeAction.lean @@ -8,7 +8,8 @@ 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 +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeAction +public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData /-! # The jet gauge action on the jet algebra of the Standard Model @@ -57,15 +58,15 @@ namespace JetAlgebra transform independently. -/ noncomputable def repJetGaugeGroupI : Representation ℂ JetGaugeGroupI JetAlgebra := (FermionJetAlgebra.repJetGaugeGroupI.tprod HiggsJetAlgebra.repJetGaugeGroupI).tprod - GaugeJetAlgebra.complexRepJetGaugeGroupI + (GaugeJetAlgebra.complexRepJet localGaugeData) @[simp] lemma repJetGaugeGroupI_tmul (U : JetGaugeGroupI) - (w : FermionJetAlgebra ⊗[ℂ] HiggsJetAlgebra) (g : ℂ ⊗[ℝ] GaugeJetAlgebra) : + (w : FermionJetAlgebra ⊗[ℂ] HiggsJetAlgebra) (g : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) : repJetGaugeGroupI U (w ⊗ₜ[ℂ] g) = ((FermionJetAlgebra.repJetGaugeGroupI.tprod HiggsJetAlgebra.repJetGaugeGroupI) U w) - ⊗ₜ[ℂ] (GaugeJetAlgebra.complexRepJetGaugeGroupI U g) := rfl + ⊗ₜ[ℂ] ((GaugeJetAlgebra.complexRepJet localGaugeData) U g) := rfl /-! @@ -81,7 +82,7 @@ lemma repJetGaugeGroupI_apply_mul (U : JetGaugeGroupI) (x y : JetAlgebra) : (Representation.tprod_apply_mul _ _ (FermionicAlgebra.repJetGaugeGroupI_apply_mul _ _) (BosonicAlgebra.repJetGaugeGroupI_apply_mul _ _)) - GaugeJetAlgebra.complexRepJetGaugeGroupI_apply_mul U x y + GaugeJetAlgebra.complexRepJet_apply_mul U x y /-! @@ -91,9 +92,9 @@ lemma repJetGaugeGroupI_apply_mul (U : JetGaugeGroupI) (x y : JetAlgebra) : /-- The jet gauge action restricts to the gauge sector's own action. -/ lemma repJetGaugeGroupI_includeGauge (U : JetGaugeGroupI) - (y : ℂ ⊗[ℝ] GaugeJetAlgebra) : + (y : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) : repJetGaugeGroupI U (includeGauge y) - = includeGauge (GaugeJetAlgebra.complexRepJetGaugeGroupI U y) := by + = includeGauge ((GaugeJetAlgebra.complexRepJet localGaugeData) U y) := by rw [includeGauge_apply, repJetGaugeGroupI_tmul, show (FermionJetAlgebra.repJetGaugeGroupI.tprod HiggsJetAlgebra.repJetGaugeGroupI) U diff --git a/Physlib/Particles/StandardModel/JetAlgebra/Generators.lean b/Physlib/Particles/StandardModel/JetAlgebra/Generators.lean index 77b1dda11..fa0579a9f 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/Generators.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/Generators.lean @@ -448,7 +448,7 @@ together with the membership of each family; the instance then instantiates them lemma gaugeField_commute (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (ψ : Module.Dual ℝ GaugeAlgebra) (x : JetAlgebra) : Commute (gaugeField s μ ψ) x := - (includeGauge_commute (GaugeJetAlgebra.gaugeField s μ ψ) x).symm + (includeGauge_commute ((GaugeJetAlgebra.gaugeField GaugeAlgebra) s μ ψ) x).symm /-! @@ -504,7 +504,7 @@ lemma MemHiggsSector.commute_of_memFermionSector {x y : JetAlgebra} (hx : MemHiggsSector x) (hy : MemFermionSector y) : Commute x y := by obtain ⟨h, rfl⟩ := hx obtain ⟨f, rfl⟩ := hy - exact tensor_left_comm_right (C := ℂ ⊗[ℝ] GaugeJetAlgebra) f h + exact tensor_left_comm_right (C := ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) f h /-! diff --git a/Physlib/Particles/StandardModel/JetAlgebra/Invariants.lean b/Physlib/Particles/StandardModel/JetAlgebra/Invariants.lean index da38feb46..7b81b5aab 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/Invariants.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/Invariants.lean @@ -7,7 +7,8 @@ module public import Physlib.Particles.StandardModel.JetAlgebra.LorentzAction public import Physlib.Particles.StandardModel.JetAlgebra.GaugeAction -public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.Invariants +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.IsGaugeField +public import Physlib.Particles.StandardModel.GaugeGroup.MaurerCartan.Freeness /-! # Gauge invariants of the jet algebra of the Standard Model @@ -16,7 +17,7 @@ public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.Invari 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 +`Physlib.ClassicalFieldTheory.GaugeTheory.GaugeField`. 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 @@ -75,16 +76,16 @@ open TensorProduct Matrix MatrixGroups 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 s μ φ) + toFun φ := includeGauge ((GaugeJetAlgebra.gaugeField GaugeAlgebra) s μ φ) map_add' φ ψ := by rw [map_add, map_add] map_smul' r φ := by - rw [map_smul, ← algebraMap_smul ℂ r (GaugeJetAlgebra.gaugeField s μ φ), map_smul, + rw [map_smul, ← algebraMap_smul ℂ r ((GaugeJetAlgebra.gaugeField GaugeAlgebra) s μ φ), map_smul, algebraMap_smul, RingHom.id_apply] @[simp] lemma gaugeField_apply (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : - gaugeField s μ φ = includeGauge (GaugeJetAlgebra.gaugeField s μ φ) := rfl + gaugeField s μ φ = includeGauge ((GaugeJetAlgebra.gaugeField GaugeAlgebra) s μ φ) := rfl /-! @@ -95,9 +96,9 @@ lemma gaugeField_apply (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) /-- 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) : + (y : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) : Lorentz.iteratedD jetDeriv jetDeriv_comm s (includeGauge y) - = includeGauge (Lorentz.iteratedD GaugeJetAlgebra.complexJetDeriv + = includeGauge (Lorentz.iteratedD (GaugeJetAlgebra.complexJetDeriv GaugeAlgebra) GaugeJetAlgebra.complexJetDeriv_comm s y) := by induction s using Multiset.induction_on with | empty => @@ -114,7 +115,7 @@ lemma iteratedD_includeGauge (s : Multiset (Fin 1 ⊕ Fin 3)) -/ /-- The gauge sector lands in the centre of the jet algebra. -/ -lemma includeGauge_mem_center (y : ℂ ⊗[ℝ] GaugeJetAlgebra) : +lemma includeGauge_mem_center (y : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) : includeGauge y ∈ Subring.center JetAlgebra := Subring.mem_center_iff.mpr fun z => includeGauge_commute y z @@ -130,12 +131,12 @@ lemma includeGauge_mem_center (y : ℂ ⊗[ℝ] GaugeJetAlgebra) : 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 where + IsGaugeField localGaugeData (B := JetAlgebra) repLorentzGroup repJetGaugeGroupI gaugeField where lorentz_apply Λ n l μ φ := (repLorentzGroup_includeGauge Λ - (GaugeJetAlgebra.gaugeField (List.ofFn l) μ φ)).trans <| + ((GaugeJetAlgebra.gaugeField GaugeAlgebra) (List.ofFn l) μ φ)).trans <| (congrArg includeGauge - (GaugeJetAlgebra.isGaugeField.lorentz_apply Λ n l μ φ)).trans <| + ((GaugeJetAlgebra.isGaugeField localGaugeData).lorentz_apply Λ n l μ φ)).trans <| (map_sum includeGauge _ Finset.univ).trans <| Finset.sum_congr rfl fun p _ => (map_smul includeGauge _ _).trans <| @@ -145,7 +146,7 @@ theorem isGaugeField : gauge_apply_deriv U s μ φ := (repJetGaugeGroupI_includeGauge U _).trans <| (congrArg includeGauge - (GaugeJetAlgebra.isGaugeField.gauge_apply_deriv U s μ φ)).trans <| by + ((GaugeJetAlgebra.isGaugeField localGaugeData).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 => rfl)) rfl @@ -167,7 +168,7 @@ theorem isGaugeField : 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) + (hS : ∀ y ∈ S, ∀ U : localGaugeData.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) @@ -182,11 +183,11 @@ theorem invariant_mem_adjoin_fieldStrength (S : Set JetAlgebra) IsGaugeField.invariant_mem_adjoin_fieldStrength isGaugeField (fun p q μ ν φ ψ => Subring.mem_center_iff.mp - (includeGauge_mem_center (GaugeJetAlgebra.gaugeField q ν ψ)) _) + (includeGauge_mem_center ((GaugeJetAlgebra.gaugeField GaugeAlgebra) q ν ψ)) _) S (fun p μ φ y _ => Subring.mem_center_iff.mp - (includeGauge_mem_center (GaugeJetAlgebra.gaugeField p μ φ)) y) + (includeGauge_mem_center ((GaugeJetAlgebra.gaugeField GaugeAlgebra) p μ φ)) y) hS hx hinv end JetAlgebra diff --git a/Physlib/Particles/StandardModel/JetAlgebra/JetDeriv.lean b/Physlib/Particles/StandardModel/JetAlgebra/JetDeriv.lean index 09361dd22..65a78bb0c 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/JetDeriv.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/JetDeriv.lean @@ -8,7 +8,8 @@ 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 +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.JetDeriv +public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData /-! # The total derivative on the jet algebra of the Standard Model @@ -72,7 +73,7 @@ noncomputable def jetDeriv (μ : Fin 1 ⊕ Fin 3) : JetAlgebra →ₗ[ℂ] JetAl LinearMap.id + TensorProduct.map (TensorProduct.map LinearMap.id (BosonicAlgebra.jetDeriv μ)) LinearMap.id - + TensorProduct.map LinearMap.id (GaugeJetAlgebra.complexJetDeriv μ) + + TensorProduct.map LinearMap.id ((GaugeJetAlgebra.complexJetDeriv GaugeAlgebra) μ) /-! @@ -81,11 +82,11 @@ noncomputable def jetDeriv (μ : Fin 1 ⊕ Fin 3) : JetAlgebra →ₗ[ℂ] JetAl -/ lemma jetDeriv_tmul (μ : Fin 1 ⊕ Fin 3) (f : FermionJetAlgebra) (h : HiggsJetAlgebra) - (g : ℂ ⊗[ℝ] GaugeJetAlgebra) : + (g : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) : jetDeriv μ ((f ⊗ₜ[ℂ] h) ⊗ₜ[ℂ] g) = ((FermionicAlgebra.jetDeriv μ f) ⊗ₜ[ℂ] h) ⊗ₜ[ℂ] g + (f ⊗ₜ[ℂ] (BosonicAlgebra.jetDeriv μ h)) ⊗ₜ[ℂ] g - + (f ⊗ₜ[ℂ] h) ⊗ₜ[ℂ] (GaugeJetAlgebra.complexJetDeriv μ g) := rfl + + (f ⊗ₜ[ℂ] h) ⊗ₜ[ℂ] ((GaugeJetAlgebra.complexJetDeriv GaugeAlgebra) μ g) := rfl /-! @@ -100,8 +101,10 @@ derivative survives, and each inclusion intertwines the two derivatives. /-- The gauge sector's derivative annihilates the unit of the complexified gauge jet algebra. -/ private lemma complexJetDeriv_one (μ : Fin 1 ⊕ Fin 3) : - GaugeJetAlgebra.complexJetDeriv μ (1 : ℂ ⊗[ℝ] GaugeJetAlgebra) = 0 := by - rw [show (1 : ℂ ⊗[ℝ] GaugeJetAlgebra) = (1 : ℂ) ⊗ₜ[ℝ] (1 : GaugeJetAlgebra) from rfl, + (GaugeJetAlgebra.complexJetDeriv GaugeAlgebra) μ + (1 : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) = 0 := by + rw [show (1 : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) + = (1 : ℂ) ⊗ₜ[ℝ] (1 : (GaugeJetAlgebra GaugeAlgebra)) from rfl, GaugeJetAlgebra.complexJetDeriv_tmul, GaugeJetAlgebra.jetDeriv_one, TensorProduct.tmul_zero] @@ -110,7 +113,7 @@ private lemma complexJetDeriv_one (μ : Fin 1 ⊕ Fin 3) : lemma jetDeriv_includeFermion (μ : Fin 1 ⊕ Fin 3) (f : FermionJetAlgebra) : jetDeriv μ (includeFermion f) = includeFermion (FermionicAlgebra.jetDeriv μ f) := by have hincl : ∀ x : FermionJetAlgebra, includeFermion x - = (x ⊗ₜ[ℂ] (1 : HiggsJetAlgebra)) ⊗ₜ[ℂ] (1 : ℂ ⊗[ℝ] GaugeJetAlgebra) := + = (x ⊗ₜ[ℂ] (1 : HiggsJetAlgebra)) ⊗ₜ[ℂ] (1 : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) := fun _ => rfl rw [hincl f, jetDeriv_tmul, show BosonicAlgebra.jetDeriv (V := HiggsVec) μ (1 : HiggsJetAlgebra) = 0 from @@ -123,7 +126,7 @@ lemma jetDeriv_includeFermion (μ : Fin 1 ⊕ Fin 3) (f : FermionJetAlgebra) : lemma jetDeriv_includeHiggs (μ : Fin 1 ⊕ Fin 3) (h : HiggsJetAlgebra) : jetDeriv μ (includeHiggs h) = includeHiggs (BosonicAlgebra.jetDeriv μ h) := by have hincl : ∀ x : HiggsJetAlgebra, includeHiggs x - = ((1 : FermionJetAlgebra) ⊗ₜ[ℂ] x) ⊗ₜ[ℂ] (1 : ℂ ⊗[ℝ] GaugeJetAlgebra) := + = ((1 : FermionJetAlgebra) ⊗ₜ[ℂ] x) ⊗ₜ[ℂ] (1 : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) := fun _ => rfl rw [hincl h, jetDeriv_tmul, show FermionicAlgebra.jetDeriv (V := FermionSpace) μ (1 : FermionJetAlgebra) = 0 from @@ -133,8 +136,9 @@ lemma jetDeriv_includeHiggs (μ : Fin 1 ⊕ Fin 3) (h : HiggsJetAlgebra) : exact (hincl (BosonicAlgebra.jetDeriv μ h)).symm /-- 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 +lemma jetDeriv_includeGauge (μ : Fin 1 ⊕ Fin 3) (y : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) : + jetDeriv μ (includeGauge y) + = includeGauge ((GaugeJetAlgebra.complexJetDeriv GaugeAlgebra) μ y) := by rw [includeGauge_apply, jetDeriv_tmul, show FermionicAlgebra.jetDeriv (V := FermionSpace) μ (1 : FermionJetAlgebra) = 0 from FermionicAlgebra.jetDeriv_one μ, @@ -219,18 +223,18 @@ private lemma add₃_derivation {R : Type*} [NonUnitalNonAssocRing R] 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) + (B := ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) (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) + (B := ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) (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 GaugeAlgebra) μ) (GaugeJetAlgebra.complexJetDeriv_mul μ) x y exact add₃_derivation h₁ h₂ h₃ @@ -260,18 +264,19 @@ 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 (M := ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)))).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), + have hG : ∀ D D' : (ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) →ₗ[ℂ] + (ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)), (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)), + (D' : (ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) →ₗ[ℂ] (ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra))), (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 @@ -295,13 +300,15 @@ lemma jetDeriv_comm (μ ν : Fin 1 ⊕ Fin 3) : = 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))) + ((congrArg (fun m => TensorProduct.map m + (LinearMap.id (M := ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)))) ((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))) + ((congrArg (fun m => TensorProduct.map m + (LinearMap.id (M := ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)))) ((hHH _ _).trans ((congrArg (fun d => TensorProduct.map (LinearMap.id (M := FermionJetAlgebra)) d) (BosonicAlgebra.jetDeriv_comm μ ν)).trans (hHH _ _).symm))).trans @@ -311,11 +318,13 @@ lemma jetDeriv_comm (μ ν : Fin 1 ⊕ Fin 3) : (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))) + ((congrArg (fun m => TensorProduct.map m + (LinearMap.id (M := ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)))) (hFH (FermionicAlgebra.jetDeriv μ) (BosonicAlgebra.jetDeriv ν))).trans (hW _ _).symm) have h21 := (hW _ _).trans - ((congrArg (fun m => TensorProduct.map m (LinearMap.id (M := ℂ ⊗[ℝ] GaugeJetAlgebra))) + ((congrArg (fun m => TensorProduct.map m + (LinearMap.id (M := ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)))) (hFH (FermionicAlgebra.jetDeriv ν) (BosonicAlgebra.jetDeriv μ)).symm).trans (hW _ _).symm) exact add₃_comp_comm h11 h12 (hWG _ _) h21 h22 (hWG _ _) (hWG _ _).symm diff --git a/Physlib/Particles/StandardModel/JetAlgebra/LorentzAction.lean b/Physlib/Particles/StandardModel/JetAlgebra/LorentzAction.lean index 571ee8db5..a09d407bf 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/LorentzAction.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/LorentzAction.lean @@ -8,7 +8,7 @@ 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 +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LorentzAction /-! # The Lorentz action on the jet algebra of the Standard Model @@ -64,14 +64,14 @@ namespace JetAlgebra transform independently. -/ noncomputable def repLorentzGroup : Representation ℂ SL(2,ℂ) JetAlgebra := (FermionJetAlgebra.repLorentzGroup.tprod HiggsJetAlgebra.repLorentzGroup).tprod - GaugeJetAlgebra.complexRepLorentzGroup + (GaugeJetAlgebra.complexRepLorentzGroup GaugeAlgebra) @[simp] lemma repLorentzGroup_tmul (Λ : SL(2,ℂ)) (w : FermionJetAlgebra ⊗[ℂ] HiggsJetAlgebra) - (g : ℂ ⊗[ℝ] GaugeJetAlgebra) : + (g : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) : repLorentzGroup Λ (w ⊗ₜ[ℂ] g) = ((FermionJetAlgebra.repLorentzGroup.tprod HiggsJetAlgebra.repLorentzGroup) Λ w) - ⊗ₜ[ℂ] (GaugeJetAlgebra.complexRepLorentzGroup Λ g) := rfl + ⊗ₜ[ℂ] ((GaugeJetAlgebra.complexRepLorentzGroup GaugeAlgebra) Λ g) := rfl /-! @@ -95,9 +95,9 @@ lemma repLorentzGroup_apply_mul (Λ : SL(2,ℂ)) (x y : JetAlgebra) : -/ /-- The Lorentz action restricts to the gauge sector's own action. -/ -lemma repLorentzGroup_includeGauge (Λ : SL(2,ℂ)) (y : ℂ ⊗[ℝ] GaugeJetAlgebra) : +lemma repLorentzGroup_includeGauge (Λ : SL(2,ℂ)) (y : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) : repLorentzGroup Λ (includeGauge y) - = includeGauge (GaugeJetAlgebra.complexRepLorentzGroup Λ y) := by + = includeGauge ((GaugeJetAlgebra.complexRepLorentzGroup GaugeAlgebra) Λ y) := by rw [includeGauge_apply, repLorentzGroup_tmul, show (FermionJetAlgebra.repLorentzGroup.tprod HiggsJetAlgebra.repLorentzGroup) Λ ((1 : FermionJetAlgebra) ⊗ₜ[ℂ] (1 : HiggsJetAlgebra)) @@ -158,11 +158,11 @@ lemma repLorentzGroup_jetDeriv (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) (x : JetA 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 ν) + (LinearMap.id (M := ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra))) + + TensorProduct.map LinearMap.id ((GaugeJetAlgebra.complexJetDeriv GaugeAlgebra) ν) = jetDeriv ν := fun ν => congrArg (fun m => m + TensorProduct.map LinearMap.id - (GaugeJetAlgebra.complexJetDeriv ν)) (TensorProduct.map_add_left _ _ _) + ((GaugeJetAlgebra.complexJetDeriv GaugeAlgebra) ν)) (TensorProduct.map_add_left _ _ _) have hFH : ∀ (ν : Fin 1 ⊕ Fin 3) (w : FermionJetAlgebra ⊗[ℂ] HiggsJetAlgebra), (FermionJetAlgebra.repLorentzGroup.tprod HiggsJetAlgebra.repLorentzGroup) Λ ((TensorProduct.map (FermionicAlgebra.jetDeriv (V := FermionSpace) ν) diff --git a/Physlib/Particles/StandardModel/JetAlgebra/MassWeightPoly.lean b/Physlib/Particles/StandardModel/JetAlgebra/MassWeightPoly.lean index a3dc8c69e..c130533d4 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/MassWeightPoly.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/MassWeightPoly.lean @@ -114,7 +114,7 @@ lemma commute_mapAlgHom {A B C : Type*} [Semiring A] [Algebra ℂ A] [Semiring B in the gauge sector: the gauge sector is central, so the commutation holds coefficient by coefficient. -/ lemma commute_mapAlgHom_includeGauge (p : Polynomial JetAlgebra) - (q : Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra)) : + (q : Polynomial (ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra))) : Commute p (Polynomial.mapAlgHom includeGauge q) := by induction q using Polynomial.induction_on' with | add q₁ q₂ h₁ h₂ => rw [map_add]; exact h₁.add_right h₂ @@ -151,7 +151,7 @@ noncomputable def higgsMassWeightPoly : HiggsJetAlgebra →ₐ[ℂ] Polynomial J /-- The gauge-boson mass-weight grading, transported into the full jet algebra. The gauge symbols have mass dimension one, hence mass weight two. -/ noncomputable def gaugeMassWeightPoly : - (ℂ ⊗[ℝ] GaugeJetAlgebra) →ₐ[ℂ] Polynomial JetAlgebra := + (ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) →ₐ[ℂ] Polynomial JetAlgebra := (Polynomial.mapAlgHom includeGauge).comp GaugeJetAlgebra.complexMassWeightPoly /-- The mass-weight grading on the matter factor of the jet algebra: the fermionic and @@ -173,7 +173,7 @@ noncomputable def matterMassWeightPoly : outer lift being the centrality of the gauge sector. -/ noncomputable def massWeightPoly : JetAlgebra →ₐ[ℂ] Polynomial JetAlgebra := Algebra.TensorProduct.lift (R := ℂ) (S := ℂ) - (A := FermionJetAlgebra ⊗[ℂ] HiggsJetAlgebra) (B := ℂ ⊗[ℝ] GaugeJetAlgebra) + (A := FermionJetAlgebra ⊗[ℂ] HiggsJetAlgebra) (B := ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) (C := Polynomial JetAlgebra) matterMassWeightPoly gaugeMassWeightPoly fun _ _ => commute_mapAlgHom_includeGauge _ _ @@ -190,7 +190,7 @@ generator computation below is one of them followed by a sector generator lemma. /-- On a pure tensor the grading is the product of the matter and gauge gradings. -/ lemma massWeightPoly_tmul (x : FermionJetAlgebra ⊗[ℂ] HiggsJetAlgebra) - (y : ℂ ⊗[ℝ] GaugeJetAlgebra) : + (y : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) : massWeightPoly (x ⊗ₜ[ℂ] y) = matterMassWeightPoly x * gaugeMassWeightPoly y := rfl /-- On a pure tensor the matter grading is the product of the fermionic and Higgs @@ -205,7 +205,7 @@ lemma massWeightPoly_includeFermion (a : FermionJetAlgebra) : massWeightPoly (includeFermion a) = Polynomial.mapAlgHom includeFermion (FermionicAlgebra.massWeightPoly 3 a) := by rw [show includeFermion a = (a ⊗ₜ[ℂ] (1 : HiggsJetAlgebra)) ⊗ₜ[ℂ] - (1 : ℂ ⊗[ℝ] GaugeJetAlgebra) from rfl, massWeightPoly_tmul, + (1 : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) from rfl, massWeightPoly_tmul, matterMassWeightPoly_tmul, map_one, map_one, mul_one, mul_one] rfl @@ -215,13 +215,13 @@ lemma massWeightPoly_includeHiggs (h : HiggsJetAlgebra) : massWeightPoly (includeHiggs h) = Polynomial.mapAlgHom includeHiggs (BosonicAlgebra.massWeightPoly 2 h) := by rw [show includeHiggs h = ((1 : FermionJetAlgebra) ⊗ₜ[ℂ] h) ⊗ₜ[ℂ] - (1 : ℂ ⊗[ℝ] GaugeJetAlgebra) from rfl, massWeightPoly_tmul, + (1 : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) from rfl, massWeightPoly_tmul, matterMassWeightPoly_tmul, map_one, map_one, mul_one, one_mul] rfl /-- On the gauge sector the grading is the gauge sector's own grading, pushed forward along the gauge inclusion. -/ -lemma massWeightPoly_includeGauge (y : ℂ ⊗[ℝ] GaugeJetAlgebra) : +lemma massWeightPoly_includeGauge (y : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) : massWeightPoly (includeGauge y) = Polynomial.mapAlgHom includeGauge (GaugeJetAlgebra.complexMassWeightPoly y) := by rw [show includeGauge y = ((1 : FermionJetAlgebra) ⊗ₜ[ℂ] (1 : HiggsJetAlgebra)) diff --git a/Physlib/Particles/StandardModel/JetAlgebra/TransformsIn.lean b/Physlib/Particles/StandardModel/JetAlgebra/TransformsIn.lean index 697888d00..52566b2a6 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/TransformsIn.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/TransformsIn.lean @@ -88,12 +88,12 @@ they do — they are actions by algebra maps. /-- The fermionic inclusion puts the unit in the Higgs and gauge factors. -/ lemma includeFermion_apply (f : FermionJetAlgebra) : includeFermion f = ((f ⊗ₜ[ℂ] (1 : HiggsJetAlgebra)) ⊗ₜ[ℂ] - (1 : ℂ ⊗[ℝ] GaugeJetAlgebra)) := rfl + (1 : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra))) := rfl /-- The Higgs inclusion puts the unit in the fermionic and gauge factors. -/ lemma includeHiggs_apply (h : HiggsJetAlgebra) : includeHiggs h = (((1 : FermionJetAlgebra) ⊗ₜ[ℂ] h) ⊗ₜ[ℂ] - (1 : ℂ ⊗[ℝ] GaugeJetAlgebra)) := rfl + (1 : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra))) := rfl /-! @@ -103,13 +103,15 @@ lemma includeHiggs_apply (h : HiggsJetAlgebra) : /-- The jet gauge action on the complexified gauge sector fixes the unit. -/ lemma complexRepJetGaugeGroupI_apply_one (U : JetGaugeGroupI) : - GaugeJetAlgebra.complexRepJetGaugeGroupI U (1 : ℂ ⊗[ℝ] GaugeJetAlgebra) = 1 := by - rw [Algebra.TensorProduct.one_def, GaugeJetAlgebra.complexRepJetGaugeGroupI_tmul, - GaugeJetAlgebra.repJetGaugeGroupI_apply_one] + (GaugeJetAlgebra.complexRepJet localGaugeData) U + (1 : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) = 1 := by + rw [Algebra.TensorProduct.one_def, GaugeJetAlgebra.complexRepJet_tmul, + GaugeJetAlgebra.repJet_apply_one] /-- The Lorentz action on the complexified gauge sector fixes the unit. -/ lemma complexRepLorentzGroup_apply_one (Λ : SL(2,ℂ)) : - GaugeJetAlgebra.complexRepLorentzGroup Λ (1 : ℂ ⊗[ℝ] GaugeJetAlgebra) = 1 := by + (GaugeJetAlgebra.complexRepLorentzGroup GaugeAlgebra) Λ + (1 : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) = 1 := by rw [Algebra.TensorProduct.one_def, GaugeJetAlgebra.complexRepLorentzGroup_tmul, GaugeJetAlgebra.repLorentzGroup_apply_one] @@ -199,7 +201,7 @@ the total target space `FermionSpace` down to the individual species. /-- The Higgs symbols transform in the jet gauge representation carried by the jets of the Higgs field. -/ theorem transformsIn_higgsField : - TransformsIn (B := JetAlgebra) repJetGaugeGroupI HiggsVec.repJetGaugeGroupI + LocalGaugeData.TransformsIn (B := JetAlgebra) repJetGaugeGroupI HiggsVec.repJetGaugeGroupI higgsField := by intro U φ s rw [higgsField_eq_includeHiggs, repJetGaugeGroupI_includeHiggs, @@ -214,7 +216,8 @@ theorem transformsIn_higgsField : /-- The conjugate Higgs symbols transform in the conjugate of the jet gauge representation carried by the jets of the Higgs field. -/ theorem transformsIn_conjHiggsField : - TransformsIn (B := JetAlgebra) repJetGaugeGroupI (repConj HiggsVec.repJetGaugeGroupI) + LocalGaugeData.TransformsIn (B := JetAlgebra) repJetGaugeGroupI + (JetComponentSpace.repConj HiggsVec.repJetGaugeGroupI) conjHiggsField := by intro U φ s rw [conjHiggsField_eq_includeHiggs, repJetGaugeGroupI_includeHiggs, @@ -242,7 +245,7 @@ private lemma transformsIn_species {W : Type} [AddCommGroup W] [Module ℂ W] = (repW U).comp (LinearMap.lTensor JetRing p)) {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ W →ₗ[ℂ] JetAlgebra} (hF : ∀ s φ, F s φ = fermionSymbol s (Module.Dual.transpose p φ)) : - TransformsIn (B := JetAlgebra) repJetGaugeGroupI repW F := by + LocalGaugeData.TransformsIn (B := JetAlgebra) repJetGaugeGroupI repW F := by intro U φ s rw [hF, fermionSymbol_eq_includeFermion, repJetGaugeGroupI_includeFermion, show FermionJetAlgebra.repJetGaugeGroupI U @@ -268,14 +271,14 @@ private lemma repDualCoeff_repConj_transpose {V W : Type} [AddCommGroup V] [Modu p.comp (IsGaugeField.repCoeff repV U s) = (IsGaugeField.repCoeff repW U s).comp p) (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule W)) : - IsGaugeField.repDualCoeff (repConj repV) U s + IsGaugeField.repDualCoeff (JetComponentSpace.repConj repV) U s (Module.Dual.transpose (ConjModule.map p) φ) = Module.Dual.transpose (ConjModule.map p) - (IsGaugeField.repDualCoeff (repConj repW) U s φ) := by + (IsGaugeField.repDualCoeff (JetComponentSpace.repConj repW) U s φ) := by refine LinearMap.ext fun v => ?_ - show φ (ConjModule.map p (IsGaugeField.repCoeff (repConj repV) U s v)) - = φ (IsGaugeField.repCoeff (repConj repW) U s (ConjModule.map p v)) - rw [repCoeff_repConj, repCoeff_repConj] + show φ (ConjModule.map p (IsGaugeField.repCoeff (JetComponentSpace.repConj repV) U s v)) + = φ (IsGaugeField.repCoeff (JetComponentSpace.repConj repW) U s (ConjModule.map p v)) + rw [LocalGaugeData.repCoeff_repConj, LocalGaugeData.repCoeff_repConj] exact congrArg φ (LinearMap.congr_fun (hp U s) v) /-- The jet gauge transformation law of the conjugate symbols of a fermion species: the law @@ -288,7 +291,8 @@ private lemma transformsIn_conjSpecies {W : Type} [AddCommGroup W] [Module ℂ W {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule W) →ₗ[ℂ] JetAlgebra} (hF : ∀ s φ, F s φ = conjFermionSymbol s (Module.Dual.transpose (ConjModule.map p) φ)) : - TransformsIn (B := JetAlgebra) repJetGaugeGroupI (repConj repW) F := by + LocalGaugeData.TransformsIn (B := JetAlgebra) repJetGaugeGroupI + (JetComponentSpace.repConj repW) F := by intro U φ s rw [hF, conjFermionSymbol_eq_includeFermion, repJetGaugeGroupI_includeFermion, show FermionJetAlgebra.repJetGaugeGroupI U @@ -306,7 +310,7 @@ private lemma transformsIn_conjSpecies {W : Type} [AddCommGroup W] [Module ℂ W /-- The symbols of the `i`-th generation down-type quark singlet transform in the jet gauge representation carried by the jets of that species. -/ theorem transformsIn_downSingletField (i : Fin 3) : - TransformsIn (B := JetAlgebra) repJetGaugeGroupI DownSinglet.repJetGaugeGroupI + LocalGaugeData.TransformsIn (B := JetAlgebra) repJetGaugeGroupI DownSinglet.repJetGaugeGroupI (downSingletField i) := transformsIn_species _ _ (FermionSpace.lTensor_downSingletProj_repJetGaugeGroupI i) (downSingletField_eq_fermionSymbol i) @@ -314,8 +318,8 @@ theorem transformsIn_downSingletField (i : Fin 3) : /-- The conjugate symbols of the `i`-th generation down-type quark singlet transform in the conjugate of the jet gauge representation carried by the jets of that species. -/ theorem transformsIn_conjDownSingletField (i : Fin 3) : - TransformsIn (B := JetAlgebra) repJetGaugeGroupI - (repConj DownSinglet.repJetGaugeGroupI) (conjDownSingletField i) := + LocalGaugeData.TransformsIn (B := JetAlgebra) repJetGaugeGroupI + (JetComponentSpace.repConj DownSinglet.repJetGaugeGroupI) (conjDownSingletField i) := transformsIn_conjSpecies _ _ (FermionSpace.lTensor_downSingletProj_repJetGaugeGroupI i) (conjDownSingletField_eq_conjFermionSymbol i) @@ -323,7 +327,7 @@ theorem transformsIn_conjDownSingletField (i : Fin 3) : /-- The symbols of the `i`-th generation up-type quark singlet transform in the jet gauge representation carried by the jets of that species. -/ theorem transformsIn_upSingletField (i : Fin 3) : - TransformsIn (B := JetAlgebra) repJetGaugeGroupI UpSinglet.repJetGaugeGroupI + LocalGaugeData.TransformsIn (B := JetAlgebra) repJetGaugeGroupI UpSinglet.repJetGaugeGroupI (upSingletField i) := transformsIn_species _ _ (FermionSpace.lTensor_upSingletProj_repJetGaugeGroupI i) (upSingletField_eq_fermionSymbol i) @@ -331,8 +335,8 @@ theorem transformsIn_upSingletField (i : Fin 3) : /-- The conjugate symbols of the `i`-th generation up-type quark singlet transform in the conjugate of the jet gauge representation carried by the jets of that species. -/ theorem transformsIn_conjUpSingletField (i : Fin 3) : - TransformsIn (B := JetAlgebra) repJetGaugeGroupI - (repConj UpSinglet.repJetGaugeGroupI) (conjUpSingletField i) := + LocalGaugeData.TransformsIn (B := JetAlgebra) repJetGaugeGroupI + (JetComponentSpace.repConj UpSinglet.repJetGaugeGroupI) (conjUpSingletField i) := transformsIn_conjSpecies _ _ (FermionSpace.lTensor_upSingletProj_repJetGaugeGroupI i) (conjUpSingletField_eq_conjFermionSymbol i) @@ -340,7 +344,7 @@ theorem transformsIn_conjUpSingletField (i : Fin 3) : /-- The symbols of the `i`-th generation quark doublet transform in the jet gauge representation carried by the jets of that species. -/ theorem transformsIn_quarkDoubletField (i : Fin 3) : - TransformsIn (B := JetAlgebra) repJetGaugeGroupI QuarkDoublet.repJetGaugeGroupI + LocalGaugeData.TransformsIn (B := JetAlgebra) repJetGaugeGroupI QuarkDoublet.repJetGaugeGroupI (quarkDoubletField i) := transformsIn_species _ _ (FermionSpace.lTensor_quarkDoubletProj_repJetGaugeGroupI i) (quarkDoubletField_eq_fermionSymbol i) @@ -348,8 +352,8 @@ theorem transformsIn_quarkDoubletField (i : Fin 3) : /-- The conjugate symbols of the `i`-th generation quark doublet transform in the conjugate of the jet gauge representation carried by the jets of that species. -/ theorem transformsIn_conjQuarkDoubletField (i : Fin 3) : - TransformsIn (B := JetAlgebra) repJetGaugeGroupI - (repConj QuarkDoublet.repJetGaugeGroupI) (conjQuarkDoubletField i) := + LocalGaugeData.TransformsIn (B := JetAlgebra) repJetGaugeGroupI + (JetComponentSpace.repConj QuarkDoublet.repJetGaugeGroupI) (conjQuarkDoubletField i) := transformsIn_conjSpecies _ _ (FermionSpace.lTensor_quarkDoubletProj_repJetGaugeGroupI i) (conjQuarkDoubletField_eq_conjFermionSymbol i) @@ -357,7 +361,7 @@ theorem transformsIn_conjQuarkDoubletField (i : Fin 3) : /-- The symbols of the `i`-th generation lepton doublet transform in the jet gauge representation carried by the jets of that species. -/ theorem transformsIn_leptonDoubletField (i : Fin 3) : - TransformsIn (B := JetAlgebra) repJetGaugeGroupI LeptonDoublet.repJetGaugeGroupI + LocalGaugeData.TransformsIn (B := JetAlgebra) repJetGaugeGroupI LeptonDoublet.repJetGaugeGroupI (leptonDoubletField i) := transformsIn_species _ _ (FermionSpace.lTensor_leptonDoubletProj_repJetGaugeGroupI i) (leptonDoubletField_eq_fermionSymbol i) @@ -365,8 +369,8 @@ theorem transformsIn_leptonDoubletField (i : Fin 3) : /-- The conjugate symbols of the `i`-th generation lepton doublet transform in the conjugate of the jet gauge representation carried by the jets of that species. -/ theorem transformsIn_conjLeptonDoubletField (i : Fin 3) : - TransformsIn (B := JetAlgebra) repJetGaugeGroupI - (repConj LeptonDoublet.repJetGaugeGroupI) (conjLeptonDoubletField i) := + LocalGaugeData.TransformsIn (B := JetAlgebra) repJetGaugeGroupI + (JetComponentSpace.repConj LeptonDoublet.repJetGaugeGroupI) (conjLeptonDoubletField i) := transformsIn_conjSpecies _ _ (FermionSpace.lTensor_leptonDoubletProj_repJetGaugeGroupI i) (conjLeptonDoubletField_eq_conjFermionSymbol i) @@ -374,7 +378,7 @@ theorem transformsIn_conjLeptonDoubletField (i : Fin 3) : /-- The symbols of the `i`-th generation charged-lepton singlet transform in the jet gauge representation carried by the jets of that species. -/ theorem transformsIn_leptonSingletField (i : Fin 3) : - TransformsIn (B := JetAlgebra) repJetGaugeGroupI LeptonSinglet.repJetGaugeGroupI + LocalGaugeData.TransformsIn (B := JetAlgebra) repJetGaugeGroupI LeptonSinglet.repJetGaugeGroupI (leptonSingletField i) := transformsIn_species _ _ (FermionSpace.lTensor_leptonSingletProj_repJetGaugeGroupI i) (leptonSingletField_eq_fermionSymbol i) @@ -382,8 +386,8 @@ theorem transformsIn_leptonSingletField (i : Fin 3) : /-- The conjugate symbols of the `i`-th generation charged-lepton singlet transform in the conjugate of the jet gauge representation carried by the jets of that species. -/ theorem transformsIn_conjLeptonSingletField (i : Fin 3) : - TransformsIn (B := JetAlgebra) repJetGaugeGroupI - (repConj LeptonSinglet.repJetGaugeGroupI) (conjLeptonSingletField i) := + LocalGaugeData.TransformsIn (B := JetAlgebra) repJetGaugeGroupI + (JetComponentSpace.repConj LeptonSinglet.repJetGaugeGroupI) (conjLeptonSingletField i) := transformsIn_conjSpecies _ _ (FermionSpace.lTensor_leptonSingletProj_repJetGaugeGroupI i) (conjLeptonSingletField_eq_conjFermionSymbol i) /-! diff --git a/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/Basic.lean b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/Basic.lean index 625eddffb..5043b4dcd 100644 --- a/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/Basic.lean +++ b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/Basic.lean @@ -5,7 +5,8 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.Basic +public import Physlib.ClassicalFieldTheory.JetAlgebra.JetComponentSpace.GaugeAction +public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData public import Physlib.Mathematics.SymmetricAlgebra /-! # The bosonic algebra of a matter field diff --git a/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/GaugeAction.lean b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/GaugeAction.lean index 54f2db96b..550de5ed2 100644 --- a/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/GaugeAction.lean +++ b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/GaugeAction.lean @@ -64,7 +64,7 @@ noncomputable def repJetGaugeGroupI rep U (χ • z) = χ • rep U z) : Representation ℂ JetGaugeGroupI (BosonicAlgebra V) where toFun U := - (SymmetricAlgebra.map (JetComponentSpace.repJetGaugeGroupI rep hlin U)).toLinearMap + (SymmetricAlgebra.map (JetComponentSpace.repJet 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 @@ -77,7 +77,7 @@ lemma repJetGaugeGroupI_apply 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 + SymmetricAlgebra.map (JetComponentSpace.repJet rep hlin U) x := rfl @[simp] lemma repJetGaugeGroupI_apply_one @@ -105,7 +105,7 @@ lemma repJetGaugeGroupI_ι 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 + SymmetricAlgebra.ι ℂ _ (JetComponentSpace.repJet 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 @@ -146,11 +146,12 @@ lemma repJetGaugeGroupI_ofField rw [ofField_apply, repJetGaugeGroupI_ι, ofField_apply] congr 1 refine Prod.ext ?_ ?_ - · exact repDual_one_tmul rep hlin U φ - · rw [JetComponentSpace.repJetGaugeGroupI_snd] + · 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 +/-- **`ofConjField` is gauge equivariant**, for the conjugate action + `JetComponentSpace.repConj rep` on the jets of the conjugate field — which is the physicists' `φ̄ ↦ φ̄ U†`. -/ lemma repJetGaugeGroupI_ofConjField (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) @@ -159,13 +160,14 @@ lemma repJetGaugeGroupI_ofConjField (U : JetGaugeGroupI) (φ : Module.Dual ℂ (ConjModule V)) : repJetGaugeGroupI rep hlin U (ofConjField φ) = ofConjField (Module.Dual.transpose - (jetEval ∘ₗ (repConj rep U⁻¹).comp jetOfConstant) φ) := by + (jetEval ∘ₗ (JetComponentSpace.repConj rep U⁻¹).comp jetOfConstant) φ) := by rw [ofConjField_apply, repJetGaugeGroupI_ι, ofConjField_apply] congr 1 refine Prod.ext ?_ ?_ - · rw [JetComponentSpace.repJetGaugeGroupI_fst] + · rw [JetComponentSpace.repJet_fst] exact map_zero _ - · exact repDual_one_tmul (repConj rep) (repConj_smul_comm hlin) U φ + · exact JetComponentSpace.repDual_one_tmul (JetComponentSpace.repConj rep) + (JetComponentSpace.repConj_smul_comm hlin) U φ /-! @@ -231,7 +233,8 @@ lemma repGaugeGroupI_ofConjField (g : GaugeGroupI) (φ : Module.Dual ℂ (ConjModule V)) : repGaugeGroupI rep hlin g (ofConjField φ) = ofConjField (Module.Dual.transpose - (jetEval ∘ₗ (repConj rep (JetGaugeGroupI.ofConstant g⁻¹)).comp jetOfConstant) φ) := by + (jetEval ∘ₗ (JetComponentSpace.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] diff --git a/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/TransformsIn.lean b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/TransformsIn.lean index d111b31ad..7c8f46d20 100644 --- a/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/TransformsIn.lean +++ b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/TransformsIn.lean @@ -7,7 +7,7 @@ module public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.GaugeAction public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.JetDeriv -public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.TransformsIn +public import Physlib.ClassicalFieldTheory.JetAlgebra.JetComponentSpace.TransformsIn /-! # The transformation law of the bosonic generators @@ -18,14 +18,15 @@ public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.Transform do not: a jet of gauge transformations mixes `∂_s ψ_φ` with the lower generators `∂_{s₂} ψ_φ`, weighted by the base-point Taylor coefficients `IsGaugeField.repDualCoeff` of the gauge jet at the complementary multiset `s₁`. This file proves that all-orders Leibniz -law, in the form `StandardModel.TransformsIn` demands. +law, in the form `LocalGaugeData.TransformsIn` demands. All the work is in `StandardModel.repDual_basis_tmul`, the corresponding statement on the jet component space. The symmetric algebra contributes only linearity: the generators are the image of the component space under `SymmetricAlgebra.ι`, and a multiset sum passes through a linear map. -The conjugate generators are the same statement for the conjugate action `repConj rep` on +The conjugate generators are the same statement for the conjugate action +`JetComponentSpace.repConj rep` on the jets of the conjugate field, which is what the conjugate half of the component space carries; so they are an instance of the same lemma, not a second proof. @@ -37,7 +38,7 @@ carries; so they are an instance of the same lemma, not a second proof. law of the conjugate derivative generators `∂_s ψ̄_φ`. - `BosonicAlgebra.transformsIn_iteratedJetDeriv_ofField`, `BosonicAlgebra.transformsIn_iteratedJetDeriv_ofConjField` : the same, packaged as - `StandardModel.TransformsIn`. + `LocalGaugeData.TransformsIn`. ## iii. Table of contents @@ -118,23 +119,23 @@ lemma repJetGaugeGroupI_iteratedJetDeriv_ofField (s.antidiagonal.map fun p => iteratedJetDeriv p.2 (ofField (IsGaugeField.repDualCoeff rep U⁻¹ p.1 φ))).sum := by rw [iteratedJetDeriv_ofField, repJetGaugeGroupI_ι, - show JetComponentSpace.repJetGaugeGroupI rep hlin U + show JetComponentSpace.repJet rep hlin U ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace V) - = (repDual rep hlin U (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ), 0) from by + = (JetComponentSpace.repDual rep hlin U (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ), 0) from by refine Prod.ext rfl ?_ - rw [JetComponentSpace.repJetGaugeGroupI_snd] + rw [JetComponentSpace.repJet_snd] exact map_zero _, - repDual_basis_tmul, sum_inl, Multiset.map_map] + JetComponentSpace.repDual_basis_tmul, sum_inl, Multiset.map_map] refine congrArg Multiset.sum (Multiset.map_congr rfl fun p _ => ?_) rw [Function.comp_apply, iteratedJetDeriv_ofField] /-- The derivative generators of a matter field transform in the representation `rep` - carried by its jets, in the sense demanded by `StandardModel.TransformsIn`. -/ + carried by its jets, in the sense demanded by `LocalGaugeData.TransformsIn`. -/ theorem transformsIn_iteratedJetDeriv_ofField (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) (hlin : ∀ (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] V), rep U (χ • z) = χ • rep U z) : - TransformsIn (repJetGaugeGroupI rep hlin) rep + LocalGaugeData.TransformsIn (repJetGaugeGroupI rep hlin) rep fun s => (iteratedJetDeriv s).comp (ofField (V := V)) := fun U φ s => repJetGaugeGroupI_iteratedJetDeriv_ofField rep hlin U φ s @@ -145,7 +146,8 @@ theorem transformsIn_iteratedJetDeriv_ofField -/ /-- The transformation law of the derivative generators of the conjugate matter field. It - is the law of the field itself for the conjugate action `repConj rep` on the jets of the + is the law of the field itself for the conjugate action `JetComponentSpace.repConj rep` on + the jets of the conjugate field — the physicists' `ψ̄ ↦ ψ̄ U†` and its derivatives. -/ lemma repJetGaugeGroupI_iteratedJetDeriv_ofConjField (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) @@ -156,27 +158,29 @@ lemma repJetGaugeGroupI_iteratedJetDeriv_ofConjField repJetGaugeGroupI rep hlin U (iteratedJetDeriv s (ofConjField φ)) = (s.antidiagonal.map fun p => iteratedJetDeriv p.2 - (ofConjField (IsGaugeField.repDualCoeff (repConj rep) U⁻¹ p.1 φ))).sum := by + (ofConjField + (IsGaugeField.repDualCoeff (JetComponentSpace.repConj rep) U⁻¹ p.1 φ))).sum := by rw [iteratedJetDeriv_ofConjField, repJetGaugeGroupI_ι, - show JetComponentSpace.repJetGaugeGroupI rep hlin U + show JetComponentSpace.repJet rep hlin U ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace V) - = (0, repDual (repConj rep) (repConj_smul_comm hlin) U + = (0, JetComponentSpace.repDual (JetComponentSpace.repConj rep) + (JetComponentSpace.repConj_smul_comm hlin) U (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ)) from by refine Prod.ext ?_ rfl - rw [JetComponentSpace.repJetGaugeGroupI_fst] + rw [JetComponentSpace.repJet_fst] exact map_zero _, - repDual_basis_tmul, sum_inr, Multiset.map_map] + JetComponentSpace.repDual_basis_tmul, sum_inr, Multiset.map_map] refine congrArg Multiset.sum (Multiset.map_congr rfl fun p _ => ?_) rw [Function.comp_apply, iteratedJetDeriv_ofConjField] /-- The derivative generators of the conjugate matter field transform in the conjugate - representation `repConj rep`, in the sense demanded by - `StandardModel.TransformsIn`. -/ + representation `JetComponentSpace.repConj rep`, in the sense demanded by + `LocalGaugeData.TransformsIn`. -/ theorem transformsIn_iteratedJetDeriv_ofConjField (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) (hlin : ∀ (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] V), rep U (χ • z) = χ • rep U z) : - TransformsIn (repJetGaugeGroupI rep hlin) (repConj rep) + LocalGaugeData.TransformsIn (repJetGaugeGroupI rep hlin) (JetComponentSpace.repConj rep) fun s => (iteratedJetDeriv s).comp (ofConjField (V := V)) := fun U φ s => repJetGaugeGroupI_iteratedJetDeriv_ofConjField rep hlin U φ s diff --git a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Basic.lean b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Basic.lean index 6b28fdab6..fe4fb8aa0 100644 --- a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Basic.lean +++ b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Basic.lean @@ -5,7 +5,8 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.Basic +public import Physlib.ClassicalFieldTheory.JetAlgebra.JetComponentSpace.GaugeAction +public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basic /-! # The fermionic algebra of a matter field diff --git a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/GaugeAction.lean b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/GaugeAction.lean index 4db30dbf3..082e3c6f8 100644 --- a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/GaugeAction.lean +++ b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/GaugeAction.lean @@ -63,7 +63,7 @@ noncomputable def repJetGaugeGroupI rep U (χ • z) = χ • rep U z) : Representation ℂ JetGaugeGroupI (FermionicAlgebra V) where toFun U := - (ExteriorAlgebra.map (JetComponentSpace.repJetGaugeGroupI rep hlin U)).toLinearMap + (ExteriorAlgebra.map (JetComponentSpace.repJet rep hlin U)).toLinearMap map_one' := by simp only [map_one, Module.End.one_eq_id, ExteriorAlgebra.map_id, AlgHom.toLinearMap_id] @@ -77,7 +77,7 @@ lemma repJetGaugeGroupI_apply 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 + ExteriorAlgebra.map (JetComponentSpace.repJet rep hlin U) x := rfl @[simp] lemma repJetGaugeGroupI_apply_one @@ -105,7 +105,7 @@ lemma repJetGaugeGroupI_ι 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 + ExteriorAlgebra.ι ℂ (JetComponentSpace.repJet 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 @@ -146,11 +146,12 @@ lemma repJetGaugeGroupI_ofField rw [ofField_apply, repJetGaugeGroupI_ι, ofField_apply] congr 1 refine Prod.ext ?_ ?_ - · exact repDual_one_tmul rep hlin U φ - · rw [JetComponentSpace.repJetGaugeGroupI_snd] + · 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 +/-- **`ofConjField` is gauge equivariant**, for the conjugate action + `JetComponentSpace.repConj rep` on the jets of the conjugate field — which is the physicists' `ψ̄ ↦ ψ̄ U†`. -/ lemma repJetGaugeGroupI_ofConjField (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) @@ -159,13 +160,14 @@ lemma repJetGaugeGroupI_ofConjField (U : JetGaugeGroupI) (φ : Module.Dual ℂ (ConjModule V)) : repJetGaugeGroupI rep hlin U (ofConjField φ) = ofConjField (Module.Dual.transpose - (jetEval ∘ₗ (repConj rep U⁻¹).comp jetOfConstant) φ) := by + (jetEval ∘ₗ (JetComponentSpace.repConj rep U⁻¹).comp jetOfConstant) φ) := by rw [ofConjField_apply, repJetGaugeGroupI_ι, ofConjField_apply] congr 1 refine Prod.ext ?_ ?_ - · rw [JetComponentSpace.repJetGaugeGroupI_fst] + · rw [JetComponentSpace.repJet_fst] exact map_zero _ - · exact repDual_one_tmul (repConj rep) (repConj_smul_comm hlin) U φ + · exact JetComponentSpace.repDual_one_tmul (JetComponentSpace.repConj rep) + (JetComponentSpace.repConj_smul_comm hlin) U φ /-! @@ -231,7 +233,8 @@ lemma repGaugeGroupI_ofConjField (g : GaugeGroupI) (φ : Module.Dual ℂ (ConjModule V)) : repGaugeGroupI rep hlin g (ofConjField φ) = ofConjField (Module.Dual.transpose - (jetEval ∘ₗ (repConj rep (JetGaugeGroupI.ofConstant g⁻¹)).comp jetOfConstant) φ) := by + (jetEval ∘ₗ (JetComponentSpace.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] diff --git a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Prod.lean b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Prod.lean index 79f5bee17..9453f1539 100644 --- a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Prod.lean +++ b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Prod.lean @@ -56,7 +56,8 @@ 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`. +with the component space itself, in +`Physlib.ClassicalFieldTheory.JetAlgebra.JetComponentSpace.Basic`. -/ diff --git a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/TransformsIn.lean b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/TransformsIn.lean index 42ebf1f4f..73a913f9a 100644 --- a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/TransformsIn.lean +++ b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/TransformsIn.lean @@ -7,7 +7,7 @@ module public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.GaugeAction public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.JetDeriv -public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.TransformsIn +public import Physlib.ClassicalFieldTheory.JetAlgebra.JetComponentSpace.TransformsIn /-! # The transformation law of the fermionic generators @@ -18,14 +18,15 @@ public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.Transform do not: a jet of gauge transformations mixes `∂_s ψ_φ` with the lower generators `∂_{s₂} ψ_φ`, weighted by the base-point Taylor coefficients `IsGaugeField.repDualCoeff` of the gauge jet at the complementary multiset `s₁`. This file proves that all-orders Leibniz -law, in the form `StandardModel.TransformsIn` demands. +law, in the form `LocalGaugeData.TransformsIn` demands. All the work is in `StandardModel.repDual_basis_tmul`, the corresponding statement on the jet component space. The exterior algebra contributes only linearity: the generators are the image of the component space under `ExteriorAlgebra.ι`, and a multiset sum passes through a linear map. -The conjugate generators are the same statement for the conjugate action `repConj rep` on +The conjugate generators are the same statement for the conjugate action +`JetComponentSpace.repConj rep` on the jets of the conjugate field, which is what the conjugate half of the component space carries; so they are an instance of the same lemma, not a second proof. @@ -37,7 +38,7 @@ carries; so they are an instance of the same lemma, not a second proof. law of the conjugate derivative generators `∂_s ψ̄_φ`. - `FermionicAlgebra.transformsIn_iteratedJetDeriv_ofField`, `FermionicAlgebra.transformsIn_iteratedJetDeriv_ofConjField` : the same, packaged as - `StandardModel.TransformsIn`. + `LocalGaugeData.TransformsIn`. ## iii. Table of contents @@ -116,23 +117,23 @@ lemma repJetGaugeGroupI_iteratedJetDeriv_ofField (s.antidiagonal.map fun p => iteratedJetDeriv p.2 (ofField (IsGaugeField.repDualCoeff rep U⁻¹ p.1 φ))).sum := by rw [iteratedJetDeriv_ofField, repJetGaugeGroupI_ι, - show JetComponentSpace.repJetGaugeGroupI rep hlin U + show JetComponentSpace.repJet rep hlin U ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace V) - = (repDual rep hlin U (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ), 0) from by + = (JetComponentSpace.repDual rep hlin U (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ), 0) from by refine Prod.ext rfl ?_ - rw [JetComponentSpace.repJetGaugeGroupI_snd] + rw [JetComponentSpace.repJet_snd] exact map_zero _, - repDual_basis_tmul, sum_inl, Multiset.map_map] + JetComponentSpace.repDual_basis_tmul, sum_inl, Multiset.map_map] refine congrArg Multiset.sum (Multiset.map_congr rfl fun p _ => ?_) rw [Function.comp_apply, iteratedJetDeriv_ofField] /-- The derivative generators of a matter field transform in the representation `rep` - carried by its jets, in the sense demanded by `StandardModel.TransformsIn`. -/ + carried by its jets, in the sense demanded by `LocalGaugeData.TransformsIn`. -/ theorem transformsIn_iteratedJetDeriv_ofField (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) (hlin : ∀ (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] V), rep U (χ • z) = χ • rep U z) : - TransformsIn (repJetGaugeGroupI rep hlin) rep + LocalGaugeData.TransformsIn (repJetGaugeGroupI rep hlin) rep fun s => (iteratedJetDeriv s).comp (ofField (V := V)) := fun U φ s => repJetGaugeGroupI_iteratedJetDeriv_ofField rep hlin U φ s @@ -143,7 +144,8 @@ theorem transformsIn_iteratedJetDeriv_ofField -/ /-- The transformation law of the derivative generators of the conjugate matter field. It - is the law of the field itself for the conjugate action `repConj rep` on the jets of the + is the law of the field itself for the conjugate action `JetComponentSpace.repConj rep` on + the jets of the conjugate field — the physicists' `ψ̄ ↦ ψ̄ U†` and its derivatives. -/ lemma repJetGaugeGroupI_iteratedJetDeriv_ofConjField (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) @@ -154,27 +156,29 @@ lemma repJetGaugeGroupI_iteratedJetDeriv_ofConjField repJetGaugeGroupI rep hlin U (iteratedJetDeriv s (ofConjField φ)) = (s.antidiagonal.map fun p => iteratedJetDeriv p.2 - (ofConjField (IsGaugeField.repDualCoeff (repConj rep) U⁻¹ p.1 φ))).sum := by + (ofConjField + (IsGaugeField.repDualCoeff (JetComponentSpace.repConj rep) U⁻¹ p.1 φ))).sum := by rw [iteratedJetDeriv_ofConjField, repJetGaugeGroupI_ι, - show JetComponentSpace.repJetGaugeGroupI rep hlin U + show JetComponentSpace.repJet rep hlin U ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace V) - = (0, repDual (repConj rep) (repConj_smul_comm hlin) U + = (0, JetComponentSpace.repDual (JetComponentSpace.repConj rep) + (JetComponentSpace.repConj_smul_comm hlin) U (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ)) from by refine Prod.ext ?_ rfl - rw [JetComponentSpace.repJetGaugeGroupI_fst] + rw [JetComponentSpace.repJet_fst] exact map_zero _, - repDual_basis_tmul, sum_inr, Multiset.map_map] + JetComponentSpace.repDual_basis_tmul, sum_inr, Multiset.map_map] refine congrArg Multiset.sum (Multiset.map_congr rfl fun p _ => ?_) rw [Function.comp_apply, iteratedJetDeriv_ofConjField] /-- The derivative generators of the conjugate matter field transform in the conjugate - representation `repConj rep`, in the sense demanded by - `StandardModel.TransformsIn`. -/ + representation `JetComponentSpace.repConj rep`, in the sense demanded by + `LocalGaugeData.TransformsIn`. -/ theorem transformsIn_iteratedJetDeriv_ofConjField (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) (hlin : ∀ (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] V), rep U (χ • z) = χ • rep U z) : - TransformsIn (repJetGaugeGroupI rep hlin) (repConj rep) + LocalGaugeData.TransformsIn (repJetGaugeGroupI rep hlin) (JetComponentSpace.repConj rep) fun s => (iteratedJetDeriv s).comp (ofConjField (V := V)) := fun U φ s => repJetGaugeGroupI_iteratedJetDeriv_ofConjField rep hlin U φ s diff --git a/Physlib/Particles/StandardModel/Matter/JetComponentSpace/Basic.lean b/Physlib/Particles/StandardModel/Matter/JetComponentSpace/Basic.lean deleted file mode 100644 index 43a6cd638..000000000 --- a/Physlib/Particles/StandardModel/Matter/JetComponentSpace/Basic.lean +++ /dev/null @@ -1,869 +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.JetGaugeGroup.Basic -public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction -public import Physlib.Particles.StandardModel.Matter.JetComponentSpace.CovariantDeriv -public import Mathlib.LinearAlgebra.Contraction -public import Mathlib.LinearAlgebra.TensorProduct.Prod -/-! -# 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. -- `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. - --/ - -@[expose] public section - -namespace StandardModel - -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)) - -/-- **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 base-point Taylor coefficients of the conjugate representation are the - conjugated coefficients.** This is the generic `LocalGaugeData.repCoeff_repConj`, read at - the Standard Model `repConj`: the two conjugate representations are the same map. -/ -lemma repCoeff_repConj (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) - (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : - IsGaugeField.repCoeff (repConj rep) U x - = ConjModule.endConj (IsGaugeField.repCoeff rep U x) := - _root_.LocalGaugeData.repCoeff_repConj rep U x - -/-- The base-point triviality of the zeroth Taylor coefficient passes to the conjugate - representation. -/ -lemma repCoeff_repConj_zero_eq_id - {rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)} {W : JetGaugeGroupI} - (hrep : IsGaugeField.repCoeff rep W 0 = LinearMap.id) : - IsGaugeField.repCoeff (repConj rep) W 0 = LinearMap.id := - _root_.LocalGaugeData.repCoeff_repConj_zero_eq_id hrep - -/-- **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 - -/-- **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 ℂ 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 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 -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] - -@[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 ℂ _ _ _ _) - -end StandardModel diff --git a/Physlib/Particles/StandardModel/Matter/JetComponentSpace/CovariantDeriv.lean b/Physlib/Particles/StandardModel/Matter/JetComponentSpace/CovariantDeriv.lean deleted file mode 100644 index b0aaa55ed..000000000 --- a/Physlib/Particles/StandardModel/Matter/JetComponentSpace/CovariantDeriv.lean +++ /dev/null @@ -1,755 +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.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 -/-! - -# 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.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction`. - --/ - -@[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 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 {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} - -/-! - -## 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 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 - -/-- 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 := - (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 `AlgebraRealization`. -/ -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 {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 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 - -lemma tensorAction_map_left (act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℂ] V) (Φ : B →ₗ[ℂ] B) - (hΦ : ∀ b₁ b₂, Φ (b₁ * b₂) = Φ b₁ * Φ b₂) (s : B ⊗[ℝ] GaugeAlgebra) - (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 : 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 - | 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 `GaugeAlgebra`-transports as an - antidiagonal convolution, so do `id ⊗ ·` over `tensorAction`. -/ -lemma tensorAction_map_right_antidiagonal (act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℂ] V) - (Tg : Multiset (Fin 1 ⊕ Fin 3) → GaugeAlgebra →ₗ[ℝ] GaugeAlgebra) - (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 ⊗[ℂ] 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 : 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 ℂ 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 ℂ 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 ℝ GaugeAlgebra →ₗ[ℝ] B) : - actionFam act f 0 = 0 := by - simp [actionFam] - -lemma actionFam_sum_left (S : Multiset (Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] 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 ℂ 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 : JetGaugeGroupI) {f f' : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} - {g g' : Module.Dual ℂ V →ₗ[ℂ] B} {cf : GaugeAlgebra} - (hf : ∀ ψ : Module.Dual ℝ GaugeAlgebra, - 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 ⊗[ℝ] GaugeAlgebra := dualPairEquiv.symm f with hs - set t : B ⊗[ℂ] V := dualPairEquivC.symm g with ht - set s' : B ⊗[ℝ] GaugeAlgebra := 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 ℝ 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 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 →ₗ[ℝ] 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 →ₗ[ℝ] 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 `HiggsAlgebraCovRealization`. 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 - -/-! - -## 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 ι ℝ 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 [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 : 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, 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 _ => ?_ - 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 : 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 ℂ 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 : 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 - 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 →ₗ[ℝ] 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 ℂ 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 | ∃ (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 ℝ GaugeAlgebra), 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 - - -end IsGaugeField - -end StandardModel diff --git a/Physlib/Relativity/JetRing/Matrix.lean b/Physlib/Relativity/JetRing/Matrix.lean index be27a354c..9c80c430f 100644 --- a/Physlib/Relativity/JetRing/Matrix.lean +++ b/Physlib/Relativity/JetRing/Matrix.lean @@ -9,6 +9,7 @@ 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 +public import Physlib.Mathematics.MultisetAntidiagonal /-! # Matrices over the jet ring @@ -473,4 +474,36 @@ lemma jacobi_fin2 (M : Matrix (Fin 2) (Fin 2) JetRing) (μ : Fin 1 ⊕ Fin 3) : map_sub, Derivation.leibniz, smul_eq_mul] ring +/-! + +## The Leibniz rule at the base point for matrices of power series + +-/ + +/-- 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 antidiagonal 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, foldl_pderiv_sum, map_sum] + simp only [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] + end JetRing From d09b3737d7c5a322a52f37c4ea204bf461fdad89 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 8 Sep 2026 19:12:49 +0100 Subject: [PATCH 299/367] refactor: shorten GaugeField/Symmetrized and MaurerCartan/Freeness MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Symmetrized.lean: named generating sets (symbolsLE, symbols, symSymbolsLE, towerLT, tower), polynomial representation through eval₂RingHom', the antidiagonal collapse from MultisetAntidiagonal, and the classification split into a Descent section (order-m subalgebra, top-order coordinates, shift families) with the main theorem a short iteration. 1454 → 1205 lines. Freeness.lean: the three component computations of the symmetrized Maurer–Cartan data factor through one scalar-component lemma. Co-Authored-By: Claude Fable 5.1 --- .../GaugeTheory/GaugeField/Symmetrized.lean | 1791 +++++++---------- .../GaugeGroup/MaurerCartan/Freeness.lean | 165 +- 2 files changed, 836 insertions(+), 1120 deletions(-) diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/Symmetrized.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/Symmetrized.lean index 386bfb124..21e0ba56e 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/Symmetrized.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/Symmetrized.lean @@ -46,18 +46,23 @@ symbols commute with each other and with the further generators. - `IsGaugeField.symmetrizedDeriv` : the symmetrized derivative symbols. - `IsGaugeField.iteratedCovDerivAdjoint` : the iterated covariant derivative of an adjoint family along a list of directions. +- `IsGaugeField.symbolsLE`, `IsGaugeField.symSymbolsLE`, `IsGaugeField.towerLT` : the + generating sets of the three towers, filtered by order. - `IsGaugeField.symbolAdjoin_eq_symFieldAdjoin` : the generation theorem. - `IsGaugeField.repGauge_symmetrizedDeriv` : the gauge action on the symmetrized symbols. - `IsGaugeField.repGauge_symmetrizedDeriv_translation` : deep jets act by pure translations. +- `IsGaugeField.mem_of_translationInvariant` : the ring-theoretic extraction principle. - `IsGaugeField.invariant_mem_adjoin_fieldStrength` : the classification of invariants. ## iii. Table of contents - A. The symmetrized derivative symbols -- B. The generation theorem -- C. The gauge action on the symmetrized derivatives -- D. Centrality, and invariance under the pure jets -- E. The classification of invariants +- B. The generating sets +- C. The generation theorem +- D. The gauge action on the symmetrized derivatives +- E. Centrality, and invariance under the pure jets +- F. Translation invariance in a ring +- G. The classification of invariants -/ @@ -78,9 +83,14 @@ 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. The symmetrized derivative symbols + +-/ -/-- 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 +/-- The symmetrized derivative symbol `sym(∂_s A)^φ`: the average over the directions + `μ ∈ s` of the symbols `∂_{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 ℝ 𝔤 →ₗ[ℝ] B) @@ -90,43 +100,64 @@ noncomputable def symmetrizedDeriv (s : Multiset (Fin 1 ⊕ Fin 3)) @[simp] lemma symmetrizedDeriv_singleton (μ : Fin 1 ⊕ Fin 3) (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B) - (φ : Module.Dual ℝ 𝔤) : - symmetrizedDeriv ({μ}) A φ = A 0 μ φ := by + (φ : Module.Dual ℝ 𝔤) : symmetrizedDeriv ({μ}) A φ = A 0 μ φ := by simp [symmetrizedDeriv] @[simp] lemma symmetrizedDeriv_empty (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B) - (φ : Module.Dual ℝ 𝔤) : - symmetrizedDeriv 0 A φ = 0 := by + (φ : Module.Dual ℝ 𝔤) : symmetrizedDeriv 0 A φ = 0 := by simp [symmetrizedDeriv] +/-- The symmetrization defect of a symbol: the average of its differences with the symbols + in which one derivative direction has been exchanged with the field direction. -/ lemma deriv_sub_symmetrizedDeriv_eq_sum (s : Multiset (Fin 1 ⊕ Fin 3)) (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B) - (φ : Module.Dual ℝ 𝔤) - (μ : Fin 1 ⊕ Fin 3) : + (φ : Module.Dual ℝ 𝔤) (μ : Fin 1 ⊕ Fin 3) : A s μ φ - symmetrizedDeriv (μ ::ₘ s) A φ = - ((1/(s.card + 1 : ℝ)) • ((s.map fun ν => A s μ φ - - A (μ ::ₘ s - {ν}) ν φ).sum)) := by + ((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, - Multiset.map_const', Multiset.sum_replicate, - ← Nat.cast_smul_eq_nsmul ℝ s.card, + 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) -/-! - -## B. The generation theorem: symbols = symmetrized symbols + field strength +/-- The symmetrized symbols are linear in the dual index. -/ +noncomputable def symmetrizedDerivₗ (s : Multiset (Fin 1 ⊕ Fin 3)) + (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B) : + Module.Dual ℝ 𝔤 →ₗ[ℝ] B where + toFun φ := symmetrizedDeriv s A φ + map_add' φ ψ := by + simp only [symmetrizedDeriv, map_add] + rw [← smul_add, ← Multiset.sum_map_add] + map_smul' c φ := by + simp only [symmetrizedDeriv, map_smul, RingHom.id_apply] + rw [show (s.map fun μ => c • A (s - {μ}) μ φ) = + (s.map fun μ => A (s - {μ}) μ φ).map (fun w => c • w) from + (Multiset.map_map _ _ _).symm, ← Multiset.smul_sum, smul_comm] + +/-- The expansion of a symmetrized symbol in a basis of the gauge algebra. -/ +lemma symmetrizedDeriv_eq_sum_coord {ι : Type} [Fintype ι] (bv : Module.Basis ι ℝ 𝔤) + (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤) : + symmetrizedDeriv s A φ = ∑ j, φ (bv j) • symmetrizedDeriv s A (bv.coord j) := by + have hdual : ∑ j, φ (bv j) • bv.coord j = φ := by + 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 _ _ + change symmetrizedDerivₗ s A φ = ∑ j, φ (bv j) • symmetrizedDerivₗ s A (bv.coord j) + conv_lhs => rw [← hdual, map_sum] + exact Finset.sum_congr rfl fun j _ => by rw [map_smul] -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 })`. +## B. The generating sets -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 three towers appearing in the generation theorem and the classification: the derivative +symbols `∂_p A_μ`, the symmetrized symbols `sym(∂_r A)`, and the covariant derivatives +`𝒟_l F` of the field strength, each filtered by the number of derivatives. -/ @@ -143,30 +174,93 @@ noncomputable def iteratedCovDerivAdjoint | [], F => F | ρ :: l, F => covDerivAdjoint A (iteratedCovDerivAdjoint A l F) ρ +variable (A) in +/-- The derivative symbols `∂_p A_μ^φ` with at most `n` derivatives. -/ +abbrev symbolsLE (n : ℕ) : Set B := + {b | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), + p.card ≤ n ∧ b = A p μ φ} + +variable (A) in +/-- All derivative symbols `∂_p A_μ^φ`. -/ +abbrev symbols : Set B := + {b | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), + b = A p μ φ} + +variable (A) in +/-- The symmetrized symbols `sym(∂_r A)^φ` with at least one and at most `n` derivatives. -/ +abbrev symSymbolsLE (n : ℕ) : Set B := + {b | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤), + r ≠ 0 ∧ r.card ≤ n ∧ b = symmetrizedDeriv r A φ} + +variable (A) in +/-- The covariant derivatives `𝒟_l F_{ν λ}^φ` of the field strength with fewer than `n` + derivatives. -/ +abbrev towerLT (n : ℕ) : Set B := + {b | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), + l.length < n ∧ b = iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ} + +variable (A) in +/-- All covariant derivatives `𝒟_l F_{ν λ}^φ` of the field strength. -/ +abbrev tower : Set B := + {b | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), + b = iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ} + +lemma symbolsLE_mono {n m : ℕ} (hnm : n ≤ m) : symbolsLE A n ⊆ symbolsLE A m := by + rintro b ⟨p, μ, φ, h, rfl⟩ + exact ⟨p, μ, φ, h.trans hnm, rfl⟩ + +lemma symbolsLE_subset_symbols (n : ℕ) : symbolsLE A n ⊆ symbols A := by + rintro b ⟨p, μ, φ, _, rfl⟩ + exact ⟨p, μ, φ, rfl⟩ + +lemma symSymbolsLE_mono {n m : ℕ} (hnm : n ≤ m) : symSymbolsLE A n ⊆ symSymbolsLE A m := by + rintro b ⟨r, φ, h0, h, rfl⟩ + exact ⟨r, φ, h0, h.trans hnm, rfl⟩ + +lemma towerLT_mono {n m : ℕ} (hnm : n ≤ m) : towerLT A n ⊆ towerLT A m := by + rintro b ⟨l, ν, lam, φ, h, rfl⟩ + exact ⟨l, ν, lam, φ, h.trans_le hnm, rfl⟩ + +lemma towerLT_subset_tower (n : ℕ) : towerLT A n ⊆ tower A := by + rintro b ⟨l, ν, lam, φ, _, rfl⟩ + exact ⟨l, ν, lam, φ, rfl⟩ + /-- 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 ℝ 𝔤), p.card ≤ n ∧ b = A p μ φ} ≤ - Algebra.adjoin ℂ {b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ 𝔤), p.card ≤ m ∧ b = A p μ φ} := by - refine Algebra.adjoin_mono fun b => ?_ - rintro ⟨p, μ, φ, h, rfl⟩ - exact ⟨p, μ, φ, h.trans hnm, rfl⟩ + Algebra.adjoin ℂ (symbolsLE A n) ≤ Algebra.adjoin ℂ (symbolsLE A m) := + Algebra.adjoin_mono (symbolsLE_mono hnm) + +/-- A symmetrized symbol with `r` derivatives is a polynomial in the symbols with fewer + than `r` derivatives. -/ +lemma symmetrizedDeriv_mem_adjoin_symbolsLE (r : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℝ 𝔤) : + symmetrizedDeriv r A φ ∈ Algebra.adjoin ℂ (symbolsLE A (r.card - 1)) := by + rw [symmetrizedDeriv, ← algebraMap_smul ℂ ((1 : ℝ)/(r.card : ℝ))] + refine Subalgebra.smul_mem _ (multiset_sum_mem _ fun x hx => ?_) _ + obtain ⟨ν, hν, rfl⟩ := Multiset.mem_map.mp hx + refine Algebra.subset_adjoin ⟨r - {ν}, ν, φ, ?_, rfl⟩ + rw [Multiset.sub_singleton, Multiset.card_erase_of_mem hν, Nat.pred_eq_sub_one] + +/-! + +## C. The generation theorem + +The chain of lemmas below leads to + + `adjoin({ ∂_p A }) = adjoin({ sym(∂_p A) } ∪ { 𝒟_q F })`. + +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 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 ℝ 𝔤 →ₗ[ℝ] B} - (hf : ∀ ψ, f ψ ∈ Algebra.adjoin ℂ {b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) - (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), p.card ≤ n ∧ - b = A p μ φ}) - (hg : ∀ ψ, g ψ ∈ Algebra.adjoin ℂ {b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) - (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), p.card ≤ n ∧ - b = A p μ φ}) - (φ : Module.Dual ℝ 𝔤) : - bracketFam f g φ ∈ Algebra.adjoin ℂ {b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) - (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), p.card ≤ n ∧ - b = A p μ φ} := by +lemma bracketFam_mem_adjoin_symbols {n : ℕ} {f g : Module.Dual ℝ 𝔤 →ₗ[ℝ] B} + (hf : ∀ ψ, f ψ ∈ Algebra.adjoin ℂ (symbolsLE A n)) + (hg : ∀ ψ, g ψ ∈ Algebra.adjoin ℂ (symbolsLE A n)) (φ : Module.Dual ℝ 𝔤) : + bracketFam f g φ ∈ Algebra.adjoin ℂ (symbolsLE A n) := by rw [bracketFam_apply_eq_sum] refine Subalgebra.sum_mem _ fun j _ => Subalgebra.sum_mem _ fun k _ => ?_ rw [← algebraMap_smul ℂ] @@ -174,38 +268,28 @@ lemma bracketFam_mem_adjoin_symbols {n : ℕ} /-- Every derivative symbol of the field strength is a symbol polynomial of order one higher than the number of derivatives. -/ -lemma fieldStrength_mem_adjoin_symbols - (q : Multiset (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) +lemma fieldStrength_mem_adjoin_symbols (q : Multiset (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : - fieldStrength A ν lam q φ ∈ - Algebra.adjoin ℂ {b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ 𝔤), p.card ≤ q.card + 1 ∧ - b = A p μ φ} := by + fieldStrength A ν lam q φ ∈ Algebra.adjoin ℂ (symbolsLE A (q.card + 1)) := by rw [fieldStrength_apply] refine add_mem (sub_mem ?_ ?_) ?_ · 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) - (commutatorFam_mem A q ν lam φ) - -/-- Outline step 6 (unitriangularity of the covariant tower): the covariant and - 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) + · exact adjoin_symbols_mono (Nat.le_succ q.card) (commutatorFam_mem A q ν lam φ) + +/-- Unitriangularity of the covariant tower: the covariant and plain derivative symbols of + the field strength differ by a polynomial in lower-order symbols. 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) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤) : 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 ℝ 𝔤), p.card ≤ l.length + s.card ∧ - b = A p μ φ} := by + Algebra.adjoin ℂ (symbolsLE A (l.length + s.card)) := by induction l generalizing s φ with | nil => simp only [iteratedCovDerivAdjoint, - show (Multiset.ofList ([] : List (Fin 1 ⊕ Fin 3))) = 0 from rfl, zero_add, - sub_self] + show (Multiset.ofList ([] : List (Fin 1 ⊕ Fin 3))) = 0 from rfl, zero_add, sub_self] exact zero_mem _ | cons ρ l ih => have hms : Multiset.ofList (ρ :: l) + s = Multiset.ofList l + (ρ ::ₘ s) := by @@ -218,269 +302,194 @@ lemma iteratedCovDerivAdjoint_sub_mem 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 φ + bracketFamConv A ρ (iteratedCovDerivAdjoint A l (fieldStrength A ν lam)) s φ from rfl, hms] abel rw [hsplit] - 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 symbol_mem_symFieldAdjoin_sup - (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + refine add_mem (adjoin_symbols_mono (by simp; omega) (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 + have h1 := Multiset.card_le_card (Multiset.fst_le_of_mem_antidiagonal hp) + have h2 := Multiset.card_le_card (Multiset.snd_le_of_mem_antidiagonal hp) + refine bracketFam_mem_adjoin_symbols (fun ψ => ?_) (fun ψ => ?_) _ + · exact Algebra.subset_adjoin ⟨p.1, ρ, ψ, by simp; omega, rfl⟩ + · rw [show 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] + refine add_mem (adjoin_symbols_mono (by simp; omega) (ih p.2 ψ)) + (adjoin_symbols_mono (by simp; omega) + (fieldStrength_mem_adjoin_symbols (Multiset.ofList l + p.2) ν lam ψ)) + +/-- 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 ℝ 𝔤) : + iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ ∈ Algebra.adjoin ℂ (symbols A) := 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] + exact add_mem + (Algebra.adjoin_mono (symbolsLE_subset_symbols _) (iteratedCovDerivAdjoint_sub_mem l ν lam 0 φ)) + (Algebra.adjoin_mono (symbolsLE_subset_symbols _) (fieldStrength_mem_adjoin_symbols _ ν lam φ)) + +/-- The inductive step of the generation theorem: 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`. -/ +lemma symbol_mem_symFieldAdjoin_sup (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : - A s μ φ ∈ - Algebra.adjoin ℂ - ({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤), - 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 ℝ 𝔤), l.length < s.card ∧ - b = iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ}) ⊔ - Algebra.adjoin ℂ {b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ 𝔤), p.card ≤ (s.card - 1) ∧ - b = A p μ φ} := by + A s μ φ ∈ Algebra.adjoin ℂ (symSymbolsLE A (s.card + 1) ∪ towerLT A s.card) ⊔ + Algebra.adjoin ℂ (symbolsLE A (s.card - 1)) := 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 : ℝ))] - 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] - 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 ℝ 𝔤 →ₗ[ℝ] 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 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_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 ?_ - (commutatorFam_mem A (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 })`. -/ + refine add_mem ?_ (SetLike.le_def.mp le_sup_left + (Algebra.subset_adjoin (Or.inl ⟨μ ::ₘ s, φ, Multiset.cons_ne_zero, by simp, rfl⟩))) + -- the antisymmetric remainder: field strength plus lower-order terms + rw [← algebraMap_smul ℂ ((1 : ℝ)/(s.card + 1 : ℝ))] + refine Subalgebra.smul_mem _ (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] + 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 ℝ 𝔤 →ₗ[ℝ] 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 ?_ (SetLike.le_def.mp le_sup_right + (adjoin_symbols_mono (by omega) (commutatorFam_mem A (s - {ν}) ν μ φ))) + -- 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 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 (SetLike.le_def.mp le_sup_left + (Algebra.subset_adjoin (Or.inr ⟨l, ν, μ, φ, by omega, rfl⟩))) ?_ + exact SetLike.le_def.mp le_sup_right (adjoin_symbols_mono (by simp; omega) + (iteratedCovDerivAdjoint_sub_mem l ν μ 0 φ)) + +/-- The generation theorem, 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({ ∂_p A : |p| ≤ n }) = adjoin({ sym(∂_p A) : |p| ≤ n + 1 } ∪ { 𝒟_q F : |q| < n })`. -/ theorem symbolAdjoin_eq_symFieldAdjoin (n : ℕ) : - Algebra.adjoin ℂ {b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ 𝔤), p.card ≤ n ∧ b = A p μ φ} = - Algebra.adjoin ℂ - ({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤), - 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 ℝ 𝔤), l.length < n ∧ - 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 + Algebra.adjoin ℂ (symbolsLE A n) = + Algebra.adjoin ℂ (symSymbolsLE A (n + 1) ∪ towerLT A n) := by + refine le_antisymm ?_ (Algebra.adjoin_le ?_) + · -- symbols are generated by symmetrized symbols and the covariant tower have main : ∀ m, ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), p.card ≤ m → m ≤ n → - A p μ φ ∈ Algebra.adjoin ℂ - ({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤), - 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 ℝ 𝔤), l.length < n ∧ - b = iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ}) := by + A p μ φ ∈ Algebra.adjoin ℂ (symSymbolsLE A (n + 1) ∪ towerLT A n) := 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 ℝ 𝔤), - 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 ℝ 𝔤), l.length < p.card ∧ - b = iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ}) ≤ - Algebra.adjoin ℂ - ({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤), - 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 ℝ 𝔤), l.length < n ∧ - 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 ℝ 𝔤), q.card ≤ (p.card - 1) ∧ - b = A q κ ψ} ≤ - Algebra.adjoin ℂ - ({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤), - 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 ℝ 𝔤), l.length < n ∧ - 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 - refine Algebra.subset_adjoin (Or.inl ⟨{κ}, ψ, by simp, by simp, ?_⟩) - rw [symmetrizedDeriv_singleton] - · exact ih q.card (by omega) q κ ψ (le_refl _) (by omega) - exact sup_le hSF hAdj (symbol_mem_symFieldAdjoin_sup p μ φ) + refine sup_le (Algebra.adjoin_mono (Set.union_subset_union + (symSymbolsLE_mono (by omega)) (towerLT_mono (by omega)))) (Algebra.adjoin_le ?_) + (symbol_mem_symFieldAdjoin_sup p μ φ) + 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 + exact Algebra.subset_adjoin (Or.inl ⟨{κ}, ψ, by simp, by simp, by simp⟩) + · exact ih q.card (by omega) q κ ψ (le_refl _) (by omega) 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_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 φ = + · exact adjoin_symbols_mono (by omega) (symmetrizedDeriv_mem_adjoin_symbolsLE r φ) + · 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 ?_ 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 - 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. -/ + fieldStrength A ν lam (Multiset.ofList l + 0) φ from by abel] + refine add_mem (adjoin_symbols_mono (by simp; omega) + (iteratedCovDerivAdjoint_sub_mem l ν lam 0 φ)) + (adjoin_symbols_mono (by simp; omega) + (fieldStrength_mem_adjoin_symbols (Multiset.ofList l + 0) ν lam φ)) + +/-- The generation theorem, unbounded version: the derivative symbols of all orders, and + the symmetrized symbols together with the full covariant field-strength tower, generate + the same subalgebra of local expressions, + + `adjoin({ ∂_p A }) = adjoin({ sym(∂_p A) } ∪ { 𝒟_q F })`. -/ theorem symbolAdjoin_eq_symFieldAdjoin_top : - Algebra.adjoin ℂ {b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ 𝔤), b = A p μ φ} = - Algebra.adjoin ℂ - ({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤), - r ≠ 0 ∧ b = symmetrizedDeriv r A φ} ∪ - {b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ 𝔤), - b = iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ}) := by + Algebra.adjoin ℂ (symbols A) = + Algebra.adjoin ℂ ({b | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤), + r ≠ 0 ∧ b = symmetrizedDeriv r A φ} ∪ tower A) := by refine le_antisymm (Algebra.adjoin_le ?_) (Algebra.adjoin_le ?_) · rintro b ⟨p, μ, φ, rfl⟩ - 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⟩) - · 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 ℝ 𝔤), p.card ≤ n ∧ - b = A p μ φ} ≤ - Algebra.adjoin ℂ {b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ 𝔤), b = A p μ φ} := 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) (r.card - 1)).ge - (Algebra.subset_adjoin (Or.inl ⟨r, φ, hr0, by omega, rfl⟩))) - · exact hmono (l.length + 1) - ((symbolAdjoin_eq_symFieldAdjoin (A := A) (l.length + 1)).ge - (Algebra.subset_adjoin (Or.inr ⟨l, ν, lam, φ, by omega, rfl⟩))) + refine Algebra.adjoin_mono ?_ ((symbolAdjoin_eq_symFieldAdjoin (A := A) p.card).le + (Algebra.subset_adjoin ⟨p, μ, φ, le_refl _, rfl⟩)) + exact Set.union_subset_union (fun b ⟨r, ψ, h0, _, h⟩ => ⟨r, ψ, h0, h⟩) + (towerLT_subset_tower _) + · rintro b (⟨r, φ, hr0, rfl⟩ | ⟨l, ν, lam, φ, rfl⟩) + · exact Algebra.adjoin_mono (symbolsLE_subset_symbols _) + (symmetrizedDeriv_mem_adjoin_symbolsLE r φ) + · exact iteratedCovDerivAdjoint_fieldStrength_mem_adjoin_symbols l ν lam φ + +/-- The generation theorem relativized to an arbitrary set `S` of extra generators. -/ +theorem symbolAdjoin_union_eq_symFieldAdjoin_union (n : ℕ) (S : Set B) : + Algebra.adjoin ℂ (symbolsLE A n ∪ S) = + Algebra.adjoin ℂ ((symSymbolsLE A (n + 1) ∪ towerLT A n) ∪ S) := by + rw [Algebra.adjoin_union, Algebra.adjoin_union, 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 ℂ (symbols A ∪ S)) : + ∃ n : ℕ, x ∈ Algebra.adjoin ℂ (symbolsLE A n ∪ S) := by + have hmono : ∀ {n m : ℕ}, n ≤ m → + Algebra.adjoin ℂ (symbolsLE A n ∪ S) ≤ Algebra.adjoin ℂ (symbolsLE A m ∪ S) := + fun hnm => Algebra.adjoin_mono (Set.union_subset_union_left S (symbolsLE_mono hnm)) + 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 _ _ 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 _ _ 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₂)⟩ /-! -## C. The gauge action on the symmetrized derivatives +## D. 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⁻¹`: +/-- 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 `LocalGaugeData.symmetrizedMaurerCartanForm`: - the gauge - group acts on the symmetrized derivative coordinates through the symmetrized - Maurer–Cartan data. -/ + `U • sym(∂_s A)^φ = (1/|s|) ∑_{μ ∈ s} ∑_{x+y=s−μ} ∂_y A_μ^{∂_x Ad*(U⁻¹) φ}` + ` + φ( sym(ω(U⁻¹))_s |₀ )`. -/ lemma repGauge_symmetrizedDeriv (hA : IsGaugeField jets repLorentz repGauge A) - (U : G) (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℝ 𝔤) : + (U : G) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤) : repGauge U (symmetrizedDeriv s A φ) = (1/(s.card : ℝ)) • (s.map fun μ => ((s - {μ}).antidiagonal.map fun p => A p.2 μ (jets.adjointDualCoeff U⁻¹ p.1 φ)).sum).sum - + algebraMap ℂ B (φ (jets.evalLie - (jets.symmetrizedMaurerCartanForm U⁻¹ s))) := by + + algebraMap ℂ B (φ (jets.evalLie (jets.symmetrizedMaurerCartanForm U⁻¹ s))) := by set L : 𝔤J →ₗ[ℝ] B := (Algebra.linearMap ℂ B).restrictScalars ℝ ∘ₗ Algebra.linearMap ℝ ℂ ∘ₗ φ ∘ₗ jets.evalLie.toLinearMap with hL @@ -497,20 +506,15 @@ lemma repGauge_symmetrizedDeriv (hA : IsGaugeField jets repLorentz repGauge A) jets.iteratedDeriv (s - {μ}) (jets.maurerCartan U⁻¹ μ)).sum) := by rw [map_smul, map_multiset_sum, Multiset.map_map] simp only [Function.comp_def] - _ = algebraMap ℂ B (φ (jets.evalLie - (jets.symmetrizedMaurerCartanForm U⁻¹ s))) := by + _ = algebraMap ℂ B (φ (jets.evalLie (jets.symmetrizedMaurerCartanForm U⁻¹ s))) := by rw [LocalGaugeData.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 jets repLorentz repGauge A) +/-- The action of a pure jet on the symmetrized derivatives is through the symmetrized + Maurer–Cartan data: for a gauge jet `U` with identity value, the inhomogeneous shift of + `sym(∂_s A)^φ` is the pairing of `φ` with the symmetrized Maurer–Cartan coefficient of + `U⁻¹` at `s`, the very data that classifies pure jets. -/ +lemma repGauge_symmetrizedDeriv_truncationKer (hA : IsGaugeField jets repLorentz repGauge A) (U : jets.truncationKer 0) (s : Multiset (Fin 1 ⊕ Fin 3)) (hs : s ≠ 0) (φ : Module.Dual ℝ 𝔤) : repGauge U.1 (symmetrizedDeriv s A φ) = @@ -521,16 +525,10 @@ lemma repGauge_symmetrizedDeriv_truncationKer 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. -/ +/-- The pure jets realize arbitrary translations of the symmetrized derivative + coordinates: for any prescribed family `c` of gauge-algebra values there is a pure jet + `U` whose action shifts every symmetrized symbol by exactly `φ (c s)`, by the freeness of + the symmetrized Maurer–Cartan data. -/ lemma exists_repGauge_symmetrizedDeriv_shift [jets.Free] (hA : IsGaugeField jets repLorentz repGauge A) (c : {r : Multiset (Fin 1 ⊕ Fin 3) // r ≠ 0} → 𝔤) : @@ -545,79 +543,116 @@ lemma exists_repGauge_symmetrizedDeriv_shift [jets.Free] refine ⟨V⁻¹, fun s hs φ => ?_⟩ rw [repGauge_symmetrizedDeriv_truncationKer hA V⁻¹ s hs φ, inv_inv, hV] +/-- 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 jets repLorentz repGauge A) + (U : jets.truncationKer 0) (s : Multiset (Fin 1 ⊕ Fin 3)) (hs : s ≠ 0) + (hU : ∀ x : Multiset (Fin 1 ⊕ Fin 3), x ≠ 0 → x.card < s.card → + jets.adjointDualCoeff (U.1)⁻¹ x = 0) + (φ : Module.Dual ℝ 𝔤) : + repGauge U.1 (symmetrizedDeriv s A φ) = + symmetrizedDeriv s A φ + + algebraMap ℂ B (φ (jets.symmetrizedMaurerCartanCoeff U⁻¹ ⟨s, hs⟩)) := by + rw [repGauge_symmetrizedDeriv_truncationKer hA U s hs φ] + congr 1 + have hid : jets.adjointDualCoeff (U.1)⁻¹ 0 = LinearMap.id := + jets.adjointDualCoeff_zero_of_eval_eq_one + (by rw [map_inv, jets.mem_truncationKer_zero_iff.mp U.2, inv_one]) + rw [symmetrizedDeriv] + congr 1 + refine congrArg Multiset.sum (Multiset.map_congr rfl fun μ hμ => ?_) + rw [Multiset.sum_antidiagonal_eq_of_fst_ne_zero _ _ fun p hp hp1 => ?_, hid] + · rfl + · have h1 := Multiset.card_le_card (Multiset.fst_le_of_mem_antidiagonal 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) + rw [hU p.1 hp1 (by omega)] + simp + +/-- Realization of top-order translations: any coefficient family supported at exactly + order `N` is realized by a pure jet trivial to order `N - 1`, by freeness of the + symmetrized Maurer–Cartan data together with Maurer–Cartan triangularity. -/ +theorem exists_translation_of_support [jets.Free] (N : ℕ) + (c : {r : Multiset (Fin 1 ⊕ Fin 3) // r ≠ 0} → 𝔤) (hcN : ∀ r, r.1.card ≠ N → c r = 0) : + ∃ U : jets.truncationKer 0, + jets.symmetrizedMaurerCartanCoeff U⁻¹ = c ∧ + ∀ x : Multiset (Fin 1 ⊕ Fin 3), x ≠ 0 → x.card < N → + jets.adjointDualCoeff (U.1)⁻¹ x = 0 := by + obtain ⟨V, hV⟩ := jets.symmetrizedMaurerCartanCoeff_surjective c + have hVmem : V.1 ∈ jets.truncationKer (N - 1) := + jets.mem_truncationKer_of_symmetrizedMaurerCartanCoeff_eq_zero V (N - 1) + fun r hr hrcard => by + have hne : r.card ≠ 0 := fun h => hr (Multiset.card_eq_zero.mp h) + rw [hV] + exact hcN ⟨r, hr⟩ (by simp only; omega) + refine ⟨V⁻¹, by rw [inv_inv, hV], fun x hx hxN => ?_⟩ + rw [show ((V⁻¹ : jets.truncationKer 0).1)⁻¹ = V.1 by simp] + exact jets.adjointDualCoeff_eq_zero_of_mem_truncationKer hVmem hx (by omega) + /-! -## D. Centrality of the gauge-field symbols, and invariance under the pure jets +## E. Centrality, and invariance under the pure jets 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 bracket is then central as well. +central in `B`, the statement that the gauge field is bosonic. Everything built from the +symbols by 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 + exact Subring.mul_mem _ (Subring.mem_center_iff.mpr fun b => (Algebra.commutes _ b).symm) hx /-- The bracket of component families with central components is central. -/ lemma bracketFam_mem_center {f g : Module.Dual ℝ 𝔤 →ₗ[ℝ] B} (hf : ∀ ψ, f ψ ∈ Subring.center B) (hg : ∀ ψ, g ψ ∈ Subring.center B) - (φ : Module.Dual ℝ 𝔤) : - bracketFam f g φ ∈ Subring.center B := by + (φ : Module.Dual ℝ 𝔤) : 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 _)) /-- 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 ℝ 𝔤), A p μ φ ∈ Subring.center B) - (ν lam : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℝ 𝔤) : + (hc : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), + A p μ φ ∈ Subring.center B) + (ν lam : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤) : 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. -/ +/-- 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 - (hc : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ 𝔤), A p μ φ ∈ Subring.center B) - (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) - (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤) : + (hc : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), + A p μ φ ∈ Subring.center B) + (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℝ 𝔤) : iteratedCovDerivAdjoint A l (fieldStrength A ν lam) s φ ∈ Subring.center B := by induction l generalizing s φ with | nil => show fieldStrength A ν lam s φ ∈ Subring.center B rw [fieldStrength_apply] - exact Subring.add_mem _ - (Subring.sub_mem _ (hc _ _ _) (hc _ _ _)) + exact Subring.add_mem _ (Subring.sub_mem _ (hc _ _ _) (hc _ _ _)) (commutatorFam_mem_center hc ν lam s φ) | cons ρ l ih => - 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] 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. -/ +/-- If the derivative symbols of the gauge field are central, so are the symmetrized + symbols. -/ lemma symmetrizedDeriv_mem_center - (hc : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ 𝔤), A p μ φ ∈ Subring.center B) + (hc : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), + A p μ φ ∈ Subring.center B) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤) : symmetrizedDeriv s A φ ∈ Subring.center B := by rw [symmetrizedDeriv] @@ -625,216 +660,102 @@ lemma symmetrizedDeriv_mem_center 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. -/ +/-- Anything that transforms in the adjoint is invariant under the pure jets: at `s = 0` + the transformation law is the dual adjoint action of the base-point value `U₀⁻¹ = 1`. -/ lemma TransformsInAdjoint.repGauge_eq_of_mem_truncationKer_zero {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B} - (hF : TransformsInAdjoint jets repGauge F) - (U : jets.truncationKer 0) (φ : Module.Dual ℝ 𝔤) : - repGauge U.1 (F 0 φ) = F 0 φ := by - have hinv : jets.eval (U.1)⁻¹ = 1 := by - rw [map_inv, jets.mem_truncationKer_zero_iff.mp U.2, inv_one] - simpa [jets.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`. -/ + (hF : TransformsInAdjoint jets repGauge F) (U : jets.truncationKer 0) + (φ : Module.Dual ℝ 𝔤) : repGauge U.1 (F 0 φ) = F 0 φ := by + rw [hF.repGauge_zero, jets.adjointDualCoeff_zero_of_eval_eq_one + (by rw [map_inv, jets.mem_truncationKer_zero_iff.mp U.2, inv_one]), LinearMap.id_apply] + +/-- 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 jets repLorentz repGauge A) (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) : - TransformsInAdjoint jets repGauge - (iteratedCovDerivAdjoint A l (fieldStrength A ν lam)) := by + TransformsInAdjoint jets 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. -/ +/-- The covariant derivatives of the field strength are invariant under the pure jets. -/ lemma repGauge_iteratedCovDerivAdjoint_fieldStrength_of_mem_truncationKer_zero - (hA : IsGaugeField jets repLorentz repGauge A) - (U : jets.truncationKer 0) (l : List (Fin 1 ⊕ Fin 3)) - (ν lam : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + (hA : IsGaugeField jets repLorentz repGauge A) (U : jets.truncationKer 0) + (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : repGauge U.1 (iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ) = iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ := - (transformsInAdjoint_iteratedCovDerivAdjoint hA l ν - lam).repGauge_eq_of_mem_truncationKer_zero U φ + (transformsInAdjoint_iteratedCovDerivAdjoint hA l ν lam).repGauge_eq_of_mem_truncationKer_zero + U φ + +/-- The gauge action fixes the unit, being multiplicative and invertible. -/ +lemma repGauge_one (hA : IsGaugeField jets repLorentz repGauge A) (U : G) : + repGauge U (1 : B) = 1 := by + 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 gauge action of a jet as a ring endomorphism of the algebra of local + expressions. -/ +def repGaugeRingHom (hA : IsGaugeField jets repLorentz repGauge A) (U : G) : B →+* B where + toFun := repGauge U + map_one' := repGauge_one hA U + map_mul' := hA.gauge_mul U + map_zero' := map_zero _ + map_add' := map_add _ + +@[simp] +lemma repGaugeRingHom_apply (hA : IsGaugeField jets repLorentz repGauge A) (U : G) (x : B) : + repGaugeRingHom hA U x = repGauge U x := rfl /-! -## E. 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. +## F. Translation invariance in a ring --/ +The extraction principle behind the classification is pure ring theory: if a family of ring +endomorphisms fixes a subalgebra `R` pointwise and translates finitely many central +elements `y i` by arbitrary prescribable scalars, then an element of the subalgebra +generated by `R` and the `y i` that is invariant under the whole family lies in `R`. The +proof chooses any polynomial representation and kills its top coefficient by evaluating the +invariance at enough shifts. -/-- 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 (n : ℕ) (S : Set B) : - Algebra.adjoin ℂ ({b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ 𝔤), p.card ≤ n ∧ - b = A p μ φ} ∪ S) = - Algebra.adjoin ℂ - (({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤), - 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 ℝ 𝔤), l.length < n ∧ - b = iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ}) ∪ S) := by - rw [Algebra.adjoin_union, Algebra.adjoin_union, - 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 ℝ 𝔤), - b = A p μ φ} ∪ S)) : - ∃ n : ℕ, x ∈ Algebra.adjoin ℂ ({b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) - (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), p.card ≤ n ∧ - 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 ℝ 𝔤), p.card ≤ n ∧ - b = A p μ φ} ∪ S) ≤ - Algebra.adjoin ℂ ({b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ 𝔤), p.card ≤ m ∧ - b = A p μ φ} ∪ 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₂)⟩ +/-- 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 -/-- 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 jets repLorentz repGauge A) - (U : jets.truncationKer 0) (s : Multiset (Fin 1 ⊕ Fin 3)) (hs : s ≠ 0) - (hU : ∀ x : Multiset (Fin 1 ⊕ Fin 3), x ≠ 0 → x.card < s.card → - jets.adjointDualCoeff (U.1)⁻¹ x = 0) - (φ : Module.Dual ℝ 𝔤) : - repGauge U.1 (symmetrizedDeriv s A φ) = - symmetrizedDeriv s A φ + - algebraMap ℂ B (φ (jets.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 - 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 : jets.eval (U.1)⁻¹ = 1 := by - rw [map_inv, jets.mem_truncationKer_zero_iff.mp U.2, inv_one] - have hid := jets.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 → - A p.2 μ (jets.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 +/-- 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 ℝ 𝔤), + Commute y (A p μ φ)) + (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤) : + Commute y (symmetrizedDeriv r A φ) := by + rw [symmetrizedDeriv, ← algebraMap_smul ℂ ((1 : ℝ)/(r.card : ℝ))] + refine Commute.smul_right (Commute.multiset_sum_right _ _ fun x hx => ?_) _ + obtain ⟨μ, hμ, rfl⟩ := Multiset.mem_map.mp hx + exact hy _ _ _ -/-- 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 [jets.Free] - (N : ℕ) (c : {r : Multiset (Fin 1 ⊕ Fin 3) // r ≠ 0} → 𝔤) - (hcN : ∀ r, r.1.card ≠ N → c r = 0) : - ∃ U : jets.truncationKer 0, - jets.symmetrizedMaurerCartanCoeff U⁻¹ = c ∧ - ∀ x : Multiset (Fin 1 ⊕ Fin 3), x ≠ 0 → x.card < N → - jets.adjointDualCoeff (U.1)⁻¹ x = 0 := by - obtain ⟨V, hV⟩ := jets.symmetrizedMaurerCartanCoeff_surjective c - -- the realizing jet is deep in the truncation filtration, by triangularity - have hVmem : V.1 ∈ jets.truncationKer (N - 1) := by - refine jets.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⁻¹ : jets.truncationKer 0).1)⁻¹ = V.1 := by simp - rw [hcoe] - exact jets.adjointDualCoeff_eq_zero_of_mem_truncationKer hVmem hx (by omega) +/-- For a bosonic gauge field the symmetrized symbols commute with each other. -/ +lemma commute_symmetrizedDeriv + (hcomm : ∀ (p q : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (φ ψ : Module.Dual ℝ 𝔤), Commute (A p μ φ) (A q ν ψ)) + (r r' : Multiset (Fin 1 ⊕ Fin 3)) (φ φ' : Module.Dual ℝ 𝔤) : + Commute (symmetrizedDeriv r A φ) (symmetrizedDeriv r' A φ') := + commute_symmetrizedDeriv_right (fun p μ ψ => + (commute_symmetrizedDeriv_right (fun p' μ' ψ' => hcomm p p' μ μ' ψ ψ') r φ).symm) r' φ' /-- A `B`-valued polynomial function of one real variable that vanishes identically has vanishing coefficients: pair with real-linear functionals, which separate @@ -851,8 +772,7 @@ lemma eq_zero_of_forall_sum_smul_pow_eq_zero {n : ℕ} {b : ℕ → B} 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] + 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 @@ -860,114 +780,64 @@ lemma eq_zero_of_forall_sum_smul_pow_eq_zero {n : ℕ} {b : ℕ → B} 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 : ∀ r ∈ R, Commute r y) +/-- Any element of the subalgebra generated by a subalgebra `R` and a single element `y` + commuting with `R` is a polynomial in `y` with coefficients in `R`: the subalgebra is the + image of `R[X]` under evaluation at `y`. -/ +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 - 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 + set ev : Polynomial R →+* B := Polynomial.eval₂RingHom' R.val.toRingHom y fun r => hy r.1 r.2 + with hev + suffices h : ∀ z ∈ R ⊔ Algebra.adjoin ℂ {y}, ∃ p : Polynomial R, z = ev p by + obtain ⟨p, rfl⟩ := h x hx + refine ⟨p.natDegree + 1, fun k => p.coeff k, fun k => (p.coeff k).2, ?_⟩ + exact Polynomial.eval₂_eq_sum_range (f := R.val.toRingHom) (x := y) + intro 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 | hby - · obtain ⟨n, r, hr, hrep⟩ := hmono b hbR 0 - exact ⟨n, r, hr, by rw [← hrep, pow_zero, mul_one]⟩ + · exact ⟨Polynomial.C ⟨b, hbR⟩, by simp [hev]⟩ · 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 := - ((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] - 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. -/ + exact ⟨Polynomial.X, by simp [hev, hby]⟩ + | algebraMap c => exact ⟨Polynomial.C ⟨algebraMap ℂ B c, Subalgebra.algebraMap_mem R c⟩, + by simp [hev]⟩ + | add u v _ _ ihu ihv => + obtain ⟨p, rfl⟩ := ihu + obtain ⟨q, rfl⟩ := ihv + exact ⟨p + q, (map_add ev p q).symm⟩ + | mul u v _ _ ihu ihv => + obtain ⟨p, rfl⟩ := ihu + obtain ⟨q, rfl⟩ := ihv + exact ⟨p * q, (map_mul ev p q).symm⟩ + +/-- The binomial expansion of the translate of a single monomial `r * y ^ k` under an + endomorphism fixing `r` and shifting `y` by a real scalar `t`. -/ +lemma map_mul_pow_eq_sum (Φ : B →+* B) {r y : B} (hr : Φ r = r) {t : ℝ} + (hy : Φ y = y + algebraMap ℂ B (t : ℂ)) (k : ℕ) : + Φ (r * y ^ k) = + ∑ j ∈ Finset.range (k + 1), t ^ j • ((k.choose j : ℂ) • (r * y ^ (k - j))) := by + have hpull : ∀ (z : ℂ) (w : B), w * algebraMap ℂ B z = z • w := fun z w => by + rw [← Algebra.commutes z w, ← Algebra.smul_def] + rw [map_mul, map_pow, hr, hy, + 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] + +/-- The single-variable extraction: an element of `R[y]` invariant under a family of ring + endomorphisms fixing `R` pointwise and translating `y` by arbitrary real scalars lies in + `R`. Invariance forces the top coefficient of any chosen polynomial representation to + vanish, by expanding the translated polynomial in powers of the shift. -/ lemma mem_of_translationInvariant_single (R : Subalgebra ℂ B) (y : 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 - -- 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 @@ -980,39 +850,23 @@ lemma mem_of_translationInvariant_single (R : Subalgebra ℂ B) (y : B) 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 + · simpa using 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 + rw [map_sum, Finset.sum_congr rfl fun k _ => map_mul_pow_eq_sum (Φ t) (hΦR t _ (hrR k)) + (hΦy t) k] + simp only [hbdef, Finset.smul_sum, smul_ite, smul_zero] + rw [Finset.sum_comm] + 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))] 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 @@ -1024,32 +878,25 @@ lemma mem_of_translationInvariant_single (R : Subalgebra ℂ B) (y : B) -- 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)] + 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] + simpa using congrArg (fun z => z - b 0) h + -- the top coefficient of the representation is the top `b`, hence vanishes 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 + rw [if_neg (Nat.succ_ne_zero m), hbdef] at h + simp only at h + rwa [Finset.sum_congr rfl fun k hk => show + (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 + have := Finset.mem_range.mp hk + simp only [show (m + 1 ≤ k) ↔ k = m + 1 by omega], + Finset.sum_ite_eq' (Finset.range (m + 2)) (m + 1) _, + if_pos (Finset.self_mem_range_succ _), Nat.choose_self, Nat.sub_self, pow_zero, + mul_one, Nat.cast_one, one_smul] 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 @@ -1057,24 +904,17 @@ lemma mem_of_translationInvariant_single (R : Subalgebra ℂ B) (y : B) 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 - 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. -/ +/-- The extraction theorem: if a family of ring endomorphisms fixes a subalgebra `R` + pointwise and translates finitely many commuting elements `y i`, each commuting with + `R`, by arbitrary prescribable scalars, then an element of the subalgebra generated by + `R` and the `y i` that is invariant under the whole family lies in `R`. The variables are + eliminated one at a time by `mem_of_translationInvariant_single`. -/ theorem mem_of_translationInvariant {ι : Type} [Fintype ι] (R : Subalgebra ℂ B) (y : ι → 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) + (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)) - {x : B} (hx : x ∈ R ⊔ Algebra.adjoin ℂ (Set.range y)) - (hinv : ∀ t, Φ t x = x) : + {x : B} (hx : x ∈ R ⊔ Algebra.adjoin ℂ (Set.range y)) (hinv : ∀ t, Φ t x = x) : x ∈ R := by classical suffices h : ∀ s : Finset ι, ∀ x : B, x ∈ R ⊔ Algebra.adjoin ℂ (y '' ↑s) → @@ -1092,11 +932,9 @@ theorem mem_of_translationInvariant {ι : Type} [Fintype ι] 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 + 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 + 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 @@ -1112,72 +950,223 @@ theorem mem_of_translationInvariant {ι : Type} [Fintype ι] 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' - (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 + refine commute_of_mem_adjoin ?_ hr + rintro b (hbR | ⟨j, _, rfl⟩) + exacts [hyR i b hbR, hyy j i] + exact ih x (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 _)) + 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 ℝ 𝔤), Commute y (A p μ φ)) +## G. The classification of invariants + +The goal is the classification theorem: a gauge-invariant element of the subalgebra +generated by the gauge-field symbols together with a set `S` of elements fixed by the pure +jets 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 symmetrized order `m + 1` present in `x`: + +* By the generation theorem, `x` is a polynomial in the symmetrized symbols of order at most + `m + 1`, the covariant tower, and `S`. +* By freeness of the symmetrized Maurer–Cartan data, there are pure jets whose data are + supported at exactly order `m + 1`. Triangularity places them in the deep truncation + kernel `truncationKer m`, so they fix every generator of order at most `m`, the covariant + tower and `S`, and act on the order-`m + 1` symmetrized symbols by pure translations with + arbitrary prescribable scalars. +* The extraction theorem `mem_of_translationInvariant` then places `x` in the subalgebra of + order at most `m`. + +-/ + +section Descent + +variable (hA : IsGaugeField jets repLorentz repGauge A) + (hcomm : ∀ (p q : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (φ ψ : Module.Dual ℝ 𝔤), Commute (A p μ φ) (A q ν ψ)) + (S : Set B) + (hcS : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), + ∀ y ∈ S, Commute y (A p μ φ)) + (hS : ∀ y ∈ S, ∀ U : jets.truncationKer 0, repGauge U.1 y = y) + (m : ℕ) + +/-! + +### G.1. The order-`m` subalgebra + +The subalgebra generated by the symmetrized symbols of order at most `m`, the covariant +tower and `S`. It is fixed by the pure jets trivial to order `m`, and its elements commute +with every symmetrized symbol. + +-/ + +include hA hS in +/-- A pure jet trivial to order `m` fixes every generator of order at most `m`: the + symmetrized symbols with at most `m` derivatives, the covariant tower and `S`. -/ +lemma repGauge_eq_of_mem_adjoin_symSymbolsLE {U : jets.truncationKer 0} + (hU : ∀ x : Multiset (Fin 1 ⊕ Fin 3), x ≠ 0 → x.card ≤ m → + jets.adjointDualCoeff (U.1)⁻¹ x = 0) + (hUsym : ∀ (r : Multiset (Fin 1 ⊕ Fin 3)) (hr : r ≠ 0), r.card ≤ m → + jets.symmetrizedMaurerCartanCoeff U⁻¹ ⟨r, hr⟩ = 0) + {z : B} (hz : z ∈ Algebra.adjoin ℂ (symSymbolsLE A m ∪ (tower A ∪ S))) : + repGauge U.1 z = z := by + induction hz using Algebra.adjoin_induction with + | mem b hb => + rcases hb with ⟨r, φ, hr0, hrm, rfl⟩ | ⟨l, ν, lam, φ, rfl⟩ | hb' + · rw [repGauge_symmetrizedDeriv_translation hA U r hr0 + (fun x hx hxc => hU x hx (by omega)) φ, hUsym r hr0 hrm, map_zero, Complex.ofReal_zero, + map_zero, add_zero] + · exact repGauge_iteratedCovDerivAdjoint_fieldStrength_of_mem_truncationKer_zero + hA U l ν lam φ + · exact hS b hb' U + | algebraMap c => rw [Algebra.algebraMap_eq_smul_one, map_smul, repGauge_one hA] + | add a b _ _ iha ihb => rw [map_add, iha, ihb] + | mul a b _ _ iha ihb => rw [hA.gauge_mul, iha, ihb] + +include hcomm hcS in +/-- Every element of the order-`m` subalgebra commutes with every symmetrized symbol. -/ +lemma commute_symmetrizedDeriv_of_mem_adjoin_symSymbolsLE + {z : B} (hz : z ∈ Algebra.adjoin ℂ (symSymbolsLE A m ∪ (tower A ∪ S))) (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤) : - 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 _ _ _ + Commute z (symmetrizedDeriv r A φ) := by + refine commute_of_mem_adjoin ?_ hz + rintro b (⟨r', φ', _, _, rfl⟩ | ⟨l, ν, lam, φ', rfl⟩ | hbS) + · exact commute_symmetrizedDeriv hcomm r' r φ' φ + · refine commute_of_mem_adjoin (fun x hx => ?_) + (iteratedCovDerivAdjoint_fieldStrength_mem_adjoin_symbols l ν lam φ') + obtain ⟨a, b2, c, rfl⟩ := hx + exact commute_symmetrizedDeriv_right (fun p' μ' φ'' => hcomm a p' b2 μ' c φ'') r φ + · exact commute_symmetrizedDeriv_right (fun p' μ' φ' => hcS p' μ' φ' b hbS) r φ + +/-! + +### G.2. The top-order coordinates and their translations + +The symmetrized symbols of order exactly `m + 1` are indexed, in a basis `bv` of the gauge +algebra, by a multiset of `m + 1` directions and a basis index. A real function `t` on that +index set prescribes a shift family supported at order `m + 1`, hence a pure jet +translating each coordinate by the corresponding value of `t`. + +-/ + +variable {ι : Type} [Fintype ι] (bv : Module.Basis ι ℝ 𝔤) + +variable (A) in +/-- The top-order coordinates: the symmetrized symbols of order `m + 1` in the basis + `bv`. -/ +noncomputable def topCoord : Sym (Fin 1 ⊕ Fin 3) (m + 1) × ι → B := + fun p => symmetrizedDeriv (p.1 : Multiset (Fin 1 ⊕ Fin 3)) A (bv.coord p.2) + +/-- The shift family supported at order `m + 1` with coordinates `t` in the basis `bv`. -/ +noncomputable def shiftFamily (t : Sym (Fin 1 ⊕ Fin 3) (m + 1) × ι → ℝ) : + {r : Multiset (Fin 1 ⊕ Fin 3) // r ≠ 0} → 𝔤 := + fun r => if h : r.1.card = m + 1 then ∑ j, t (⟨r.1, h⟩, j) • bv j else 0 + +lemma shiftFamily_eq_zero_of_card_ne (t : Sym (Fin 1 ⊕ Fin 3) (m + 1) × ι → ℝ) + (r : {r : Multiset (Fin 1 ⊕ Fin 3) // r ≠ 0}) (hr : r.1.card ≠ m + 1) : + shiftFamily m bv t r = 0 := + dif_neg hr + +lemma coord_shiftFamily (t : Sym (Fin 1 ⊕ Fin 3) (m + 1) × ι → ℝ) + (ps : Sym (Fin 1 ⊕ Fin 3) (m + 1)) (hp0 : (ps : Multiset (Fin 1 ⊕ Fin 3)) ≠ 0) (j : ι) : + bv.coord j (shiftFamily m bv t ⟨ps, hp0⟩) = t (ps, j) := by + classical + rw [shiftFamily, dif_pos (Sym.card_coe (s := ps)), 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, Finset.sum_ite_eq', Finset.mem_univ, if_true] + rfl + +include hcomm S hcS in +/-- The top-order coordinates commute with the order-`m` subalgebra. -/ +lemma commute_topCoord_of_mem_adjoin_symSymbolsLE (p : Sym (Fin 1 ⊕ Fin 3) (m + 1) × ι) + {z : B} (hz : z ∈ Algebra.adjoin ℂ (symSymbolsLE A m ∪ (tower A ∪ S))) : + Commute z (topCoord A m bv p) := + commute_symmetrizedDeriv_of_mem_adjoin_symSymbolsLE hcomm S hcS m hz _ _ + +/-- An element of the order-`m + 1` subalgebra lies in the sup of the order-`m` subalgebra + and the subalgebra generated by the top-order coordinates. -/ +lemma mem_sup_adjoin_range_topCoord {z : B} + (hz : z ∈ Algebra.adjoin ℂ (symSymbolsLE A (m + 1) ∪ (tower A ∪ S))) : + z ∈ Algebra.adjoin ℂ (symSymbolsLE A m ∪ (tower A ∪ S)) ⊔ + Algebra.adjoin ℂ (Set.range (topCoord A m bv)) := 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⟩)) + · rw [symmetrizedDeriv_eq_sum_coord bv r φ] + refine Subalgebra.sum_mem _ fun j _ => ?_ + rw [← algebraMap_smul ℂ (φ (bv j))] + exact Subalgebra.smul_mem _ (SetLike.le_def.mp le_sup_right (Algebra.subset_adjoin + (Set.mem_range_self (f := topCoord A m bv) (⟨r, by omega⟩, j)))) _ + · exact SetLike.le_def.mp le_sup_left (Algebra.subset_adjoin (Or.inr hb)) + +include hA in +/-- The pure jet realizing the shift family `t` translates each top-order coordinate by + the corresponding value of `t`. -/ +lemma repGauge_topCoord {U : jets.truncationKer 0} + (t : Sym (Fin 1 ⊕ Fin 3) (m + 1) × ι → ℝ) + (hU1 : jets.symmetrizedMaurerCartanCoeff U⁻¹ = shiftFamily m bv t) + (hU2 : ∀ x : Multiset (Fin 1 ⊕ Fin 3), x ≠ 0 → x.card < m + 1 → + jets.adjointDualCoeff (U.1)⁻¹ x = 0) + (p : Sym (Fin 1 ⊕ Fin 3) (m + 1) × ι) : + repGauge U.1 (topCoord A m bv p) = topCoord A m bv p + algebraMap ℂ B ((t p : ℝ) : ℂ) := by + obtain ⟨ps, j⟩ := p + 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 := fun h => by simp [h] at hps + show repGauge U.1 (symmetrizedDeriv (ps : Multiset (Fin 1 ⊕ Fin 3)) A (bv.coord j)) = _ + rw [repGauge_symmetrizedDeriv_translation hA U _ hp0 + (fun x hx hxc => hU2 x hx (by omega)) (bv.coord j), hU1, coord_shiftFamily] + rfl + +/-! + +### G.3. The descent + +-/ + +include hA hcomm hcS hS in +/-- The descent: an element of the order-`m + 1` subalgebra fixed by all pure jets lies + in the order-`m` subalgebra. The pure jets realizing the shift families at order + `m + 1` fix the order-`m` subalgebra and translate the top-order coordinates by arbitrary + real scalars, so `mem_of_translationInvariant` applies. -/ +lemma mem_adjoin_symSymbolsLE_of_repGauge_eq [jets.Free] {z : B} + (hz : z ∈ Algebra.adjoin ℂ (symSymbolsLE A (m + 1) ∪ (tower A ∪ S))) + (hzinv : ∀ U : jets.truncationKer 0, repGauge U.1 z = z) : + z ∈ Algebra.adjoin ℂ (symSymbolsLE A m ∪ (tower A ∪ S)) := by + classical + set bv := Module.Free.chooseBasis ℝ 𝔤 with hbv + choose Ut hUt1 hUt2 using fun t : Sym (Fin 1 ⊕ Fin 3) (m + 1) × + Module.Free.ChooseBasisIndex ℝ 𝔤 → ℝ => + exists_translation_of_support (jets := jets) (m + 1) (shiftFamily m bv t) + (shiftFamily_eq_zero_of_card_ne m bv t) + refine mem_of_translationInvariant _ (topCoord A m bv) + (fun p r hr => commute_topCoord_of_mem_adjoin_symSymbolsLE hcomm S hcS m bv p hr) + (fun p q => commute_symmetrizedDeriv hcomm _ _ _ _) + (fun t => repGaugeRingHom hA (Ut t).1) (fun t w hw => ?_) + (fun t p => repGauge_topCoord hA m bv t (hUt1 t) (hUt2 t) p) + (mem_sup_adjoin_range_topCoord S m bv hz) (fun t => hzinv (Ut t)) + refine repGauge_eq_of_mem_adjoin_symSymbolsLE hA S hS m + (fun x hx hxm => hUt2 t x hx (by omega)) (fun r hr hrm => ?_) hw + rw [hUt1 t] + exact shiftFamily_eq_zero_of_card_ne m bv t ⟨r, hr⟩ (by simp only; omega) + +end Descent + +/-! + +### G.4. The classification + +-/ -/-- 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 ℝ 𝔤) : - iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ ∈ - Algebra.adjoin ℂ {b : B | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (ψ : Module.Dual ℝ 𝔤), 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 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. -/ + (the gauge field is bosonic) and with the elements of `S`, nothing about the rest + of `B`, and no independence hypothesis. -/ theorem invariant_mem_adjoin_fieldStrength [jets.Free] (hA : IsGaugeField jets repLorentz repGauge A) (hcomm : ∀ (p q : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) @@ -1186,269 +1175,31 @@ theorem invariant_mem_adjoin_fieldStrength [jets.Free] (hcS : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), ∀ y ∈ S, Commute y (A p μ φ)) (hS : ∀ y ∈ S, ∀ U : jets.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 ℝ 𝔤), - b = A p μ φ} ∪ S)) + {x : B} (hx : x ∈ Algebra.adjoin ℂ (symbols A ∪ S)) (hinv : ∀ U : G, repGauge U x = x) : - x ∈ Algebra.adjoin ℂ ({b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ 𝔤), - 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 ℝ 𝔤), - b = iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ} ∪ S), - ∀ U : jets.truncationKer 0, repGauge U.1 y = y := by - rintro y (⟨l, ν, lam, φ, rfl⟩ | hyS) U - · exact repGauge_iteratedCovDerivAdjoint_fieldStrength_of_mem_truncationKer_zero - hA U l ν lam φ - · exact hS y hyS U - -- the gauge action preserves the unit, hence acts by ring endomorphisms - have hone : ∀ U : G, 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 ℝ 𝔤), - 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 ℝ 𝔤), - b = iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ} ∪ S)) → - (∀ U : jets.truncationKer 0, repGauge U.1 z = z) → - z ∈ Algebra.adjoin ℂ - ({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤), - r ≠ 0 ∧ r.card ≤ m ∧ b = symmetrizedDeriv r A φ} ∪ - ({b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ 𝔤), - b = iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ} ∪ S)) := by - intro m z hz hzinv - set bv := Module.Free.chooseBasis ℝ 𝔤 with hbv - set R₀ : Subalgebra ℂ B := Algebra.adjoin ℂ - ({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤), - r ≠ 0 ∧ r.card ≤ m ∧ b = symmetrizedDeriv r A φ} ∪ - ({b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ 𝔤), - b = iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ} ∪ S)) with hR₀ - set Y : Sym (Fin 1 ⊕ Fin 3) (m + 1) × Module.Free.ChooseBasisIndex ℝ 𝔤 → B := - 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) × - Module.Free.ChooseBasisIndex ℝ 𝔤 → ℝ, - ∃ U : jets.truncationKer 0, - jets.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 → - jets.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 ℝ 𝔤 → ℝ) → 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 → - jets.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 : jets.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 → - jets.adjointDualCoeff ((Ut t).1)⁻¹ x' = 0 := - fun x' hx' hxc => hUt2 t x' hx' (by omega) - have hval : bv.coord j (jets.symmetrizedMaurerCartanCoeff (Ut t)⁻¹ - ⟨(ps : Multiset (Fin 1 ⊕ Fin 3)), hp0⟩) = t (ps, j) := by - have hcoeff : jets.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 (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 - have hdual : ∀ ψ : Module.Dual ℝ 𝔤, ∑ 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 ℝ 𝔤), - symmetrizedDeriv r A φ = - ∑ j, φ (bv j) • symmetrizedDeriv r A (bv.coord j) := by - intro r φ - set L : Module.Dual ℝ 𝔤 →ₗ[ℝ] B := - { 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] - 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] - 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)) - -- 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 ℝ 𝔤) (r : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℝ 𝔤), - 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 ℝ 𝔤) (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 hRY hYY Φ hfixR₀ hΦy hzsup - (fun t => hzinv (Ut t)) - rw [hR₀] at hzR₀ - exact hzR₀ + x ∈ Algebra.adjoin ℂ (tower A ∪ S) := by -- 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 ℝ 𝔤), - b = A p μ φ} ∪ - ({b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ 𝔤), - 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 ℝ 𝔤), p.card ≤ k ∧ - b = A p μ φ} ∪ - ({b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ 𝔤), - b = iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ} ∪ S)) → - z ∈ Algebra.adjoin ℂ ({b : B | ∃ (r : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℝ 𝔤), r ≠ 0 ∧ r.card ≤ k + 1 ∧ - b = symmetrizedDeriv r A φ} ∪ - ({b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ 𝔤), - b = iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ} ∪ S)) := by - intro k z hzk - rw [symbolAdjoin_union_eq_symFieldAdjoin_union k - ({b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ 𝔤), - 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⟩ - · exact Or.inr (Or.inl ⟨l, ν, lam, φ, rfl⟩) - · exact Or.inr hb + obtain ⟨n, hxn⟩ := exists_le_of_mem_adjoin_symbols_union (tower A ∪ S) + (Algebra.adjoin_mono (Set.union_subset_union_right _ Set.subset_union_right) hx) + -- convert the bounded symbols to symmetrized symbols, absorbing the tower + have hconv : x ∈ Algebra.adjoin ℂ (symSymbolsLE A (n + 1) ∪ (tower A ∪ S)) := by + rw [symbolAdjoin_union_eq_symFieldAdjoin_union n (tower A ∪ S)] at hxn + refine Algebra.adjoin_mono ?_ hxn + rintro b ((hb | hb) | hb) + exacts [Or.inl hb, Or.inr (Or.inl (towerLT_subset_tower n hb)), 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 ℝ 𝔤), r ≠ 0 ∧ r.card ≤ k ∧ - b = symmetrizedDeriv r A φ} ∪ - ({b : B | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ 𝔤), - b = iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ} ∪ S)) → - (∀ U : jets.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 ℝ 𝔤), - b = iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ} ∪ 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 + suffices h : ∀ k, x ∈ Algebra.adjoin ℂ (symSymbolsLE A k ∪ (tower A ∪ S)) → + x ∈ Algebra.adjoin ℂ (tower A ∪ S) from h (n + 1) hconv + intro k + induction k with + | zero => + intro h0 + refine Algebra.adjoin_mono ?_ h0 + 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 hk + exact ih (mem_adjoin_symSymbolsLE_of_repGauge_eq hA hcomm S hcS hS k hk fun U => hinv U.1) end IsGaugeField diff --git a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Freeness.lean b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Freeness.lean index 6cb5cca6a..4f2d0a410 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Freeness.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Freeness.lean @@ -95,89 +95,49 @@ lemma exists_maurerCartanForm_eq_of_structure ## B. The symmetrized Maurer–Cartan data in components +The gauge algebra is a product of three matrix factors. Rather than argue factor by +factor, the passage from the symmetrized Maurer–Cartan data to the radial component +`∑_μ x_μ ω_μ` of the Maurer–Cartan form is proved once for an arbitrary real-linear scalar +`ψ` of the gauge algebra that computes evaluated iterated derivatives as base-point values +of power-series derivatives of a scalar entry `f`; the three factors are instances. + -/ -/-- 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 (localGaugeData.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 [LocalGaugeData.symmetrizedMaurerCartanForm] - simp only [localGaugeData_iteratedDeriv, localGaugeData_maurerCartan] - rw [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 (localGaugeData.symmetrizedMaurerCartanForm U r)).toSU2Matrix i j = +/-- A scalar component of the evaluated symmetrized Maurer–Cartan form: the average over + `μ ∈ r` of the base-point values of the `r − μ` derivatives of the entry `f (ω_μ)`. -/ +lemma eval_symmetrizedMaurerCartanForm_comp (ψ : GaugeAlgebra →+ ℂ) + (hψ : ∀ (c : ℝ) (a : GaugeAlgebra), ψ (c • a) = c • ψ a) (f : JetGaugeAlgebra → JetRing) + (hf : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (a : JetGaugeAlgebra), + ψ (eval (iteratedDeriv s a)) = constantCoeff (s.foldl (fun h ρ => pderiv ℂ ρ h) (f a))) + (U : JetGaugeGroupI) (r : Multiset (Fin 1 ⊕ Fin 3)) : + ψ (eval (localGaugeData.symmetrizedMaurerCartanForm U r)) = (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] + (fun h ρ => pderiv ℂ ρ h) (f (maurerCartanForm U μ)))).sum := by rw [LocalGaugeData.symmetrizedMaurerCartanForm] simp only [localGaugeData_iteratedDeriv, localGaugeData_maurerCartan] - rw [map_smul, GaugeAlgebra.smul_toSU2Matrix, Matrix.smul_apply] + rw [map_smul, hψ, map_multiset_sum, map_multiset_sum, Multiset.map_map, Multiset.map_map] 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 (localGaugeData.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 [LocalGaugeData.symmetrizedMaurerCartanForm] - simp only [localGaugeData_iteratedDeriv, localGaugeData_maurerCartan] - rw [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μ) - -/-- The `su(3)` entry of the symmetrized Maurer–Cartan data, through the radial component - `∑_μ x_μ ω_μ` of the Maurer–Cartan form: a coefficient of that component, normalized by - the factorials of the multiset. -/ + refine congrArg Multiset.sum (Multiset.map_congr rfl fun μ _ => ?_) + rw [Function.comp_apply, Function.comp_apply, hf, Multiset.sub_singleton] + +/-- A scalar component of the symmetrized Maurer–Cartan data, through the radial component + `p = ∑_μ x_μ f(ω_μ)` of the Maurer–Cartan form: a coefficient of that component, + normalized by the factorials of the multiset. -/ +lemma symmetrizedMaurerCartanCoeff_comp (ψ : GaugeAlgebra →+ ℂ) + (hψ : ∀ (c : ℝ) (a : GaugeAlgebra), ψ (c • a) = c • ψ a) (f : JetGaugeAlgebra → JetRing) + (hf : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (a : JetGaugeAlgebra), + ψ (eval (iteratedDeriv s a)) = constantCoeff (s.foldl (fun h ρ => pderiv ℂ ρ h) (f a))) + (U : localGaugeData.truncationKer 0) (p : JetRing) + (hrad : ∑ μ, (X μ : JetRing) • f (maurerCartanForm U.1 μ) = p) + (r : Multiset (Fin 1 ⊕ Fin 3)) (hr : r ≠ 0) : + ψ (localGaugeData.symmetrizedMaurerCartanCoeff U ⟨r, hr⟩) = + (1/(Multiset.card r : ℝ)) • (((∏ ν, Nat.factorial (r.count ν) : ℕ) : ℂ) * + coeff (Multiset.toFinsupp r) p) := by + rw [LocalGaugeData.symmetrizedMaurerCartanCoeff_apply, localGaugeData_evalLie, + eval_symmetrizedMaurerCartanForm_comp ψ hψ f hf, sum_constantCoeff_foldl_erase, hrad] + +/-- The `su(3)` entries of the symmetrized Maurer–Cartan data through the radial + component. -/ lemma symmetrizedMaurerCartanCoeff_toSU3_eq (U : localGaugeData.truncationKer 0) (P : Matrix (Fin 3) (Fin 3) JetRing) (hrad : ∑ μ, (X μ : JetRing) • (maurerCartanForm U.1 μ).toSU3Matrix = P) @@ -185,17 +145,18 @@ lemma symmetrizedMaurerCartanCoeff_toSU3_eq (U : localGaugeData.truncationKer 0) (localGaugeData.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 [LocalGaugeData.symmetrizedMaurerCartanCoeff_apply, localGaugeData_evalLie, - eval_symmetrizedMaurerCartanForm_toSU3_apply, sum_constantCoeff_foldl_erase, hentry] - -/-- The `su(2)` entry of the symmetrized Maurer–Cartan data through the radial + refine symmetrizedMaurerCartanCoeff_comp + (AddMonoidHom.mk' (fun a => a.toSU3Matrix i j) fun a b => by + simp [GaugeAlgebra.add_toSU3Matrix]) + (fun c a => by simp [GaugeAlgebra.smul_toSU3Matrix]) (fun a => a.toSU3Matrix i j) + (fun s a => by + rw [AddMonoidHom.mk'_apply, eval_toSU3Matrix_apply, iteratedDeriv_toSU3Matrix, + Matrix.map_apply]) + U (P i j) ?_ r hr + rw [← hrad, Matrix.sum_apply] + exact Finset.sum_congr rfl fun μ _ => rfl + +/-- The `su(2)` entries of the symmetrized Maurer–Cartan data through the radial component. -/ lemma symmetrizedMaurerCartanCoeff_toSU2_eq (U : localGaugeData.truncationKer 0) (P : Matrix (Fin 2) (Fin 2) JetRing) @@ -204,15 +165,16 @@ lemma symmetrizedMaurerCartanCoeff_toSU2_eq (U : localGaugeData.truncationKer 0) (localGaugeData.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 [LocalGaugeData.symmetrizedMaurerCartanCoeff_apply, localGaugeData_evalLie, - eval_symmetrizedMaurerCartanForm_toSU2_apply, sum_constantCoeff_foldl_erase, hentry] + refine symmetrizedMaurerCartanCoeff_comp + (AddMonoidHom.mk' (fun a => a.toSU2Matrix i j) fun a b => by + simp [GaugeAlgebra.add_toSU2Matrix]) + (fun c a => by simp [GaugeAlgebra.smul_toSU2Matrix]) (fun a => a.toSU2Matrix i j) + (fun s a => by + rw [AddMonoidHom.mk'_apply, eval_toSU2Matrix_apply, iteratedDeriv_toSU2Matrix, + Matrix.map_apply]) + U (P i j) ?_ r hr + rw [← hrad, Matrix.sum_apply] + exact Finset.sum_congr rfl fun μ _ => rfl /-- The `u(1)` value of the symmetrized Maurer–Cartan data through the radial component. -/ @@ -222,9 +184,12 @@ lemma symmetrizedMaurerCartanCoeff_toU1_eq (U : localGaugeData.truncationKer 0) (r : Multiset (Fin 1 ⊕ Fin 3)) (hr : r ≠ 0) : (localGaugeData.symmetrizedMaurerCartanCoeff U ⟨r, hr⟩).toU1Value = (1/(Multiset.card r : ℝ)) • (((∏ ν, Nat.factorial (r.count ν) : ℕ) : ℂ) * - coeff (Multiset.toFinsupp r) p) := by - rw [LocalGaugeData.symmetrizedMaurerCartanCoeff_apply, localGaugeData_evalLie, - eval_symmetrizedMaurerCartanForm_toU1Value, sum_constantCoeff_foldl_erase, hrad] + coeff (Multiset.toFinsupp r) p) := + symmetrizedMaurerCartanCoeff_comp + (AddMonoidHom.mk' (fun a => a.toU1Value) fun a b => by simp [GaugeAlgebra.add_toU1Value]) + (fun c a => by simp [GaugeAlgebra.smul_toU1Value]) (fun a => a.toU1Value) + (fun s a => by rw [AddMonoidHom.mk'_apply, eval_toU1Value_eq, iteratedDeriv_toU1Value]) + U p hrad r hr /-! From c5dec5d2cf11e1d5b6d076c2e3dba44753c9180a Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 8 Sep 2026 20:05:12 +0100 Subject: [PATCH 300/367] refactor: shorten HiggsAlgebraCovRealization/Basic Co-Authored-By: Claude Fable 5.1 --- .../HiggsAlgebraCovRealization/Basic.lean | 1674 +++++++---------- 1 file changed, 686 insertions(+), 988 deletions(-) diff --git a/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/Basic.lean b/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/Basic.lean index 4ea1183e3..a93c45050 100644 --- a/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/Basic.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/Basic.lean @@ -25,57 +25,62 @@ public import Mathlib.RepresentationTheory.Invariants /-! # The algebra valued Higgs boson +## i. Overview + An algebra `B` carries a Higgs sector when the covariant towers `∇_l H` and `∇_l H̄`, and every polynomial expression in them, sit inside it compatibly with the global gauge action, the Lorentz action and the mass-weight grading. `CovHiggsJetAlgebra` is the universal object with those towers, so the statement is a single one: an algebra map `CovHiggsJetAlgebra →ₐ[ℂ] B`, equivariant for the global gauge group and the Lorentz group -and compatible with `massWeightPoly`. That is the structure `HiggsAlgebraCovRealization`, together with -the two demands that the group actions be multiplicative on the whole of `B`. - -The two towers are then derived: `h.covH` and `h.covBarH` are the covariant jet algebra of -the Higgs field's own towers pushed along the map, and every law they satisfy — the gauge -equivariance `H_equivariant` and `barH_equivariant`, the commutation `H_comm_H`, -`H_comm_barH` and `barH_comm_barH`, the mass weights `H_massWeight` and `barH_massWeight`, -and the Lorentz laws `repLorentz_H` and `repLorentz_barH` — is that algebra's own law -pushed along it. They carry the names they carried when they were axioms, so they are used -exactly as before. - -We let `higgsSubmodule` be the submodule of `B` generated by the images of `covH`, -and `barHiggsSubmodule` be the submodule of `B` generated by the images of `covBarH`. - -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`. +and compatible with `massWeightPoly`. That is the structure `HiggsAlgebraCovRealization`, +together with the two demands that the group actions be multiplicative on the whole of `B`. + +The towers `covH` and `covBarH` are the towers of the covariant jet algebra of the Higgs +field pushed along the map, and every law they satisfy is that algebra's law pushed along +it. From them the file builds the submodules `higgsSubmodule n` and `barHiggsSubmodule n` +of terms linear in `∇_d H` and `∇_d H̄`, the algebra `higgsAlgebra` they generate, and its +mass-weight submodules `massWeightSubmodule n`. Each of these carries a gauge weight +decomposition, and the mass-weight submodules obey a recursion which is expanded at weights +`2`, `4`, `6` and `8`. These are the pieces from which the Higgs terms of the Standard Model +Lagrangian are assembled downstream. + +## ii. Key results + +- `HiggsAlgebraCovRealization` : the structure. +- `H_equivariant`, `H_comm_H`, `H_massWeight`, `repLorentz_H` and their conjugates : the + laws of the towers. +- `higgsSubmoduleGaugeWeight`, `barHiggsSubmoduleGaugeWeight` : the gauge weight + decompositions of the Higgs submodules. +- `rep_dotGaugeHiggs_invariant`, `repLorentz_dotGaugeHiggs` : the gauge invariance and the + Lorentz law of the inner product `H† H` with derivatives on the two factors. +- `massWeightSubmodule_eq` : the weight recursion, expanded in `massWeightSubmodule_two_eq` + up to `massWeightSubmodule_eight_eq`. +- `massWeightSubmoduleGaugeWeight` : the gauge weight decomposition of the mass-weight + submodules. +- `IsDerivativeCollection.boostDecomp` : the boost weight decomposition of the span of a + symbol whose derivative indices rotate as Lorentz vectors. + +## iii. Table of contents + +- A. The Higgs towers and their laws + - A.1. The gauge laws + - A.2. The commutation laws and the mass weights + - A.3. The Lorentz laws +- B. The Higgs algebra +- C. The components and the Higgs submodules + - C.1. The gauge action on the components + - C.2. The Higgs and conjugate Higgs submodules +- D. The gauge weight decomposition of the Higgs submodules +- E. The Higgs inner product +- F. The mass weight submodules + - F.1. Membership and the grading + - F.2. The weight recursion + - F.3. The odd mass weights vanish + - F.4. The gauge weight decomposition + - F.5. The low mass weights +- G. Gauge invariants +- Aside: derivative collections and boost weights -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 @@ -153,6 +158,12 @@ noncomputable def covBarH (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : Module.Dual ℂ (ConjModule HiggsVec) →ₗ[ℂ] B := h.toAlgHom.toLinearMap ∘ₗ CovHiggsJetAlgebra.conjHiggsField l +/-! + +### A.1. The gauge laws + +-/ + /-- A gauge law of the covariant jet algebra of the Higgs field transports along the defining map. -/ lemma map_rep_eq {g : GaugeGroupI} {x y : CovHiggsJetAlgebra} @@ -160,12 +171,6 @@ lemma map_rep_eq {g : GaugeGroupI} {x y : CovHiggsJetAlgebra} rep g (h.toAlgHom x) = h.toAlgHom y := by rw [← h.map_rep, hxy] -/-- A mass-weight eigenvalue equation transports along the defining map. -/ -lemma map_massWeight_monomial {n : ℕ} {x : CovHiggsJetAlgebra} - (hx : CovHiggsJetAlgebra.massWeightPoly x = Polynomial.monomial n x) : - massWeightPoly (h.toAlgHom x) = Polynomial.monomial n (h.toAlgHom x) := by - rw [h.map_massWeight, hx, Polynomial.mapAlgHom_monomial] - /-- The Higgs symbol carries the dual of the gauge representation on `HiggsVec`: the `SU(2)` index transforms contragrediently, and the hypercharge character by `u⁻³`. -/ lemma H_equivariant (g : GaugeGroupI) (φ : Module.Dual ℂ HiggsVec) (n : ℕ) @@ -180,6 +185,12 @@ lemma barH_equivariant (g : GaugeGroupI) (φ : Module.Dual ℂ (ConjModule Higgs rep g (h.covBarH n l φ) = h.covBarH n l (HiggsVec.repGaugeGroupI.conj.dual g φ) := h.map_rep_eq (CovHiggsJetAlgebra.repGaugeGroupI_conjHiggsField g l φ) +/-! + +### A.2. The commutation laws and the mass weights + +-/ + /-- The Higgs is bosonic: two Higgs symbols commute. -/ lemma H_comm_H (φ ψ : Module.Dual ℂ HiggsVec) (n1 n2 : ℕ) (l1 : Fin n1 → (Fin 1 ⊕ Fin 3)) (l2 : Fin n2 → (Fin 1 ⊕ Fin 3)) : @@ -198,6 +209,12 @@ lemma barH_comm_barH (φ ψ : Module.Dual ℂ (ConjModule HiggsVec)) (n1 n2 : Commute (h.covBarH n1 l1 φ) (h.covBarH n2 l2 ψ) := (CovHiggsJetAlgebra.commute_conjHiggsField_conjHiggsField l1 l2 φ ψ).map h.toAlgHom +/-- A mass-weight eigenvalue equation transports along the defining map. -/ +lemma map_massWeight_monomial {n : ℕ} {x : CovHiggsJetAlgebra} + (hx : CovHiggsJetAlgebra.massWeightPoly x = Polynomial.monomial n x) : + massWeightPoly (h.toAlgHom x) = Polynomial.monomial n (h.toAlgHom x) := by + rw [h.map_massWeight, hx, Polynomial.mapAlgHom_monomial] + /-- The mass weight of the Higgs tower is `2 * (1 + n)`. -/ lemma H_massWeight (φ : Module.Dual ℂ HiggsVec) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : massWeightPoly (h.covH n l φ) = Polynomial.monomial (2 * (1 + n)) (h.covH n l φ) := @@ -210,6 +227,12 @@ lemma barH_massWeight (φ : Module.Dual ℂ (ConjModule HiggsVec)) (n : ℕ) = Polynomial.monomial (2 * (1 + n)) (h.covBarH n l φ) := h.map_massWeight_monomial (CovHiggsJetAlgebra.massWeightPoly_conjHiggsField l φ) +/-! + +### A.3. The Lorentz laws + +-/ + /-- A Lorentz law of the covariant jet algebra of the Higgs field transports along the defining map. -/ lemma map_lorentz {V : Type} [AddCommGroup V] [Module ℂ V] @@ -237,8 +260,8 @@ lemma repLorentz_barH : IsLorentzCovDerivTransforms repLorentz h.map_lorentz CovHiggsJetAlgebra.isLorentzCovDerivTransforms_conjHiggsField 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. -/ +/-- The pointwise form of `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.covH n l φ) = ∑ (a : Fin n → Fin 1 ⊕ Fin 3), @@ -246,7 +269,7 @@ lemma repLorentz_H_apply (g : SL(2,ℂ)) (φ : Module.Dual ℂ HiggsVec) (n : 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`. -/ +/-- The pointwise form of `repLorentz_barH`. -/ lemma repLorentz_barH_apply (g : SL(2,ℂ)) (φ : Module.Dual ℂ (ConjModule HiggsVec)) (n : ℕ) (l : Fin n → Fin 1 ⊕ Fin 3) : repLorentz g (h.covBarH n l φ) = ∑ (a : Fin n → Fin 1 ⊕ Fin 3), @@ -255,26 +278,110 @@ lemma repLorentz_barH_apply (g : SL(2,ℂ)) (φ : Module.Dual ℂ (ConjModule Hi /-! -## B. The basic generators and the submodules generated by them. +## B. The Higgs algebra + +The subalgebra of `B` generated by every `∇_d H` and `∇_d H̄`. Its elements commute with +one another, so any two of its submodules commute as submodules; and a property closed under +sums and products which holds on the symbols and on the scalars holds on all of it. + +-/ + +/-- The subalgebra of `B` generated by the Higgs, its conjugate and all their + derivatives. -/ +def higgsAlgebra (h : HiggsAlgebraCovRealization B rep repLorentz massWeightPoly) : + Subalgebra ℂ B := (Algebra.adjoin ℂ (⋃ (k : ℕ) (d : Fin k → (Fin 1 ⊕ Fin 3)), + Set.range (h.covH k d) ∪ Set.range (h.covBarH k d))) + +/-- A Higgs symbol lies in the Higgs algebra. -/ +lemma covH_mem_higgsAlgebra {n : ℕ} (d : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ HiggsVec) : h.covH n d φ ∈ h.higgsAlgebra := + Algebra.subset_adjoin (Set.mem_iUnion₂.mpr ⟨n, d, Set.mem_union_left _ ⟨φ, rfl⟩⟩) + +/-- A conjugate Higgs symbol lies in the Higgs algebra. -/ +lemma covBarH_mem_higgsAlgebra {n : ℕ} (d : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule HiggsVec)) : h.covBarH n d φ ∈ h.higgsAlgebra := + Algebra.subset_adjoin (Set.mem_iUnion₂.mpr ⟨n, d, Set.mem_union_right _ ⟨φ, rfl⟩⟩) + +/-- Induction on the Higgs algebra: a property of elements of `B` which holds on every + Higgs and conjugate Higgs symbol and on every scalar, and is closed under sums and + products of elements of the algebra, holds on the whole algebra. -/ +lemma higgsAlgebra_induction {P : B → Prop} + (hH : ∀ (n : ℕ) (d : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ HiggsVec), + P (h.covH n d φ)) + (hbarH : ∀ (n : ℕ) (d : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule HiggsVec)), + P (h.covBarH n d φ)) + (halg : ∀ r : ℂ, P (algebraMap ℂ B r)) + (hadd : ∀ x y, x ∈ h.higgsAlgebra → y ∈ h.higgsAlgebra → P x → P y → P (x + y)) + (hmul : ∀ x y, x ∈ h.higgsAlgebra → y ∈ h.higgsAlgebra → P x → P y → P (x * y)) + {x : B} (hx : x ∈ h.higgsAlgebra) : P x := by + 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 + exacts [hH k d φ, hbarH k d φ] + | algebraMap r => exact halg r + | add x y hx hy ihx ihy => exact hadd x y hx hy ihx ihy + | mul x y hx hy ihx ihy => exact hmul x y hx hy ihx ihy + +/-- Any two elements of the Higgs algebra commute. -/ +lemma commute_of_mem_higgsAlgebra {x y : B} (hx : x ∈ h.higgsAlgebra) + (hy : y ∈ h.higgsAlgebra) : Commute x y := by + have hH : ∀ (n : ℕ) (d : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ HiggsVec), + Commute (h.covH n d φ) y := fun n d φ => + h.higgsAlgebra_induction (P := fun y => Commute (h.covH n d φ) y) + (fun _ _ _ => h.H_comm_H _ _ _ _ _ _) (fun _ _ _ => h.H_comm_barH _ _ _ _ _ _) + (fun r => Algebra.commute_algebraMap_right r _) + (fun _ _ _ _ => Commute.add_right) (fun _ _ _ _ => Commute.mul_right) hy + have hbarH : ∀ (n : ℕ) (d : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule HiggsVec)), Commute (h.covBarH n d φ) y := fun n d φ => + h.higgsAlgebra_induction (P := fun y => Commute (h.covBarH n d φ) y) + (fun _ _ _ => (h.H_comm_barH _ _ _ _ _ _).symm) (fun _ _ _ => h.barH_comm_barH _ _ _ _ _ _) + (fun r => Algebra.commute_algebraMap_right r _) + (fun _ _ _ _ => Commute.add_right) (fun _ _ _ _ => Commute.mul_right) hy + exact h.higgsAlgebra_induction (P := fun x => Commute x y) hH hbarH + (fun r => Algebra.commute_algebraMap_left r y) + (fun _ _ _ _ => Commute.add_left) (fun _ _ _ _ => Commute.mul_left) hx + +/-- Two submodules of the Higgs algebra commute. -/ +lemma mul_comm_of_le_higgsAlgebra {M N : Submodule ℂ B} + (hM : M ≤ Subalgebra.toSubmodule h.higgsAlgebra) + (hN : N ≤ Subalgebra.toSubmodule h.higgsAlgebra) : M * N = N * M := 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 (hM hx) (hN hy)).eq] + exact Submodule.mul_mem_mul hy hx + · rw [← (h.commute_of_mem_higgsAlgebra (hM hx) (hN hy)).eq] + exact Submodule.mul_mem_mul hx hy + +/-! + +## C. The components and the Higgs submodules + +The components `∇_d H^i` and `∇_d H̄^i` are the symbols evaluated on the dual of the standard +basis of `HiggsVec`. The Higgs submodule with `n` derivatives is the span of the symbols +`∇_d H` over all multi-indices `d` of length `n`, equally the span of the components. -/ /-- The component `∇_d H^i` in the algebra. -/ -noncomputable def higgs (h : HiggsAlgebraCovRealization B rep repLorentz massWeightPoly) - {n : ℕ} (d : Fin n → (Fin 1 ⊕ Fin 3)) (i : Fin 2) :B := +noncomputable def higgs (h : HiggsAlgebraCovRealization B rep repLorentz massWeightPoly) + {n : ℕ} (d : Fin n → (Fin 1 ⊕ Fin 3)) (i : Fin 2) : B := h.covH n d (HiggsVec.orthonormBasis.toBasis.dualBasis i) -/-- The component `∇_d barH^i` in the algebra. -/ +/-- The component `∇_d H̄^i` in the algebra. -/ noncomputable def barHiggs (h : HiggsAlgebraCovRealization B rep repLorentz massWeightPoly) {n : ℕ} (d : Fin n → (Fin 1 ⊕ Fin 3)) (i : Fin 2) : B := h.covBarH n d (HiggsVec.orthonormBasis.toBasis.conj.dualBasis i) /-! -### A.1. The representation of the gauge group on the components +### C.1. The gauge action on the components -/ +/-- The gauge group mixes the components of `∇_d H` by the matrix `u⁻³ g⁻¹` of the + hypercharge and `SU(2)` parts of `g⁻¹`. -/ 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 @@ -290,9 +397,11 @@ lemma rep_higgsComponent (g : GaugeGroupI) {n : ℕ} (d : Fin n → (Fin 1 ⊕ F 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) : +/-- The gauge group mixes the components of `∇_d H̄` by the conjugate matrix. -/ +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 + ∑ 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)) • @@ -308,456 +417,200 @@ lemma rep_barHiggsComponent (g : GaugeGroupI) {n : ℕ} (d : Fin n → (Fin 1 /-! -### A.2. The submodules generated by the Higges and conjugate Higgs components +### C.2. The Higgs and conjugate Higgs submodules -/ /-- 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`. -/ -noncomputable def higgsSubmodule (h : HiggsAlgebraCovRealization B rep repLorentz massWeightPoly) (n : ℕ) : +noncomputable def higgsSubmodule + (h : HiggsAlgebraCovRealization B rep repLorentz massWeightPoly) (n : ℕ) : Submodule ℂ B := ⨆ d : Fin n → (Fin 1 ⊕ Fin 3), LinearMap.range (h.covH 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`. -/ -noncomputable def barHiggsSubmodule (h : HiggsAlgebraCovRealization B rep repLorentz massWeightPoly) - (n : ℕ) : Submodule ℂ B := ⨆ d : Fin n → (Fin 1 ⊕ Fin 3), LinearMap.range (h.covBarH n d) - -/-! +noncomputable def barHiggsSubmodule + (h : HiggsAlgebraCovRealization B rep repLorentz massWeightPoly) (n : ℕ) : + Submodule ℂ B := ⨆ d : Fin n → (Fin 1 ⊕ Fin 3), LinearMap.range (h.covBarH n d) -### A.n. Commutativity of higgs and barHiggsSubmodules +/-- The Higgs submodule is spanned by the components `∇_d H^j`. -/ +lemma higgsSubmodule_eq_iSup_span (n : ℕ) : + h.higgsSubmodule n = ⨆ (d : Fin n → (Fin 1 ⊕ Fin 3)) (j : Fin 2), ℂ ∙ h.higgs d j := by + rw [higgsSubmodule] + refine iSup_congr fun d => ?_ + rw [LinearMap.range_eq_map, ← HiggsVec.orthonormBasis.toBasis.dualBasis.span_eq, + Submodule.map_span, ← Set.range_comp, Submodule.span_range_eq_iSup] + rfl + +/-- The conjugate Higgs submodule is spanned by the components `∇_d H̄^j`. -/ +lemma barHiggsSubmodule_eq_iSup_span (n : ℕ) : + h.barHiggsSubmodule n + = ⨆ (d : Fin n → (Fin 1 ⊕ Fin 3)) (j : Fin 2), ℂ ∙ h.barHiggs d j := by + rw [barHiggsSubmodule] + refine iSup_congr fun d => ?_ + rw [LinearMap.range_eq_map, ← HiggsVec.orthonormBasis.toBasis.conj.dualBasis.span_eq, + Submodule.map_span, ← Set.range_comp, Submodule.span_range_eq_iSup] + rfl + +/-- The Higgs submodule lies in the Higgs algebra. -/ +lemma higgsSubmodule_le_higgsAlgebra (n : ℕ) : + h.higgsSubmodule n ≤ Subalgebra.toSubmodule h.higgsAlgebra := by + rw [higgsSubmodule] + refine iSup_le fun d => ?_ + rintro _ ⟨φ, rfl⟩ + exact h.covH_mem_higgsAlgebra d φ --/ +/-- The conjugate Higgs submodule lies in the Higgs algebra. -/ +lemma barHiggsSubmodule_le_higgsAlgebra (n : ℕ) : + h.barHiggsSubmodule n ≤ Subalgebra.toSubmodule h.higgsAlgebra := by + rw [barHiggsSubmodule] + refine iSup_le fun d => ?_ + rintro _ ⟨φ, rfl⟩ + exact h.covBarH_mem_higgsAlgebra d φ +/-- The conjugate Higgs and Higgs submodules commute. -/ @[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 ℂ (h.covBarH n1 d1 φ) - - LinearMap.mulRight ℂ (h.covBarH 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 + = (h.higgsSubmodule n2) * (h.barHiggsSubmodule n1) := + h.mul_comm_of_le_higgsAlgebra (h.barHiggsSubmodule_le_higgsAlgebra n1) + (h.higgsSubmodule_le_higgsAlgebra n2) -lemma higgsSubmodule_comm_higgsSubmodule (n1 n2 : ℕ) (h1 : n1 < n2) : +/-- Two Higgs submodules commute. -/ +lemma higgsSubmodule_comm_higgsSubmodule (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.covH n1 d1 φ) - - LinearMap.mulRight ℂ (h.covH 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 + = (h.higgsSubmodule n2) * (h.higgsSubmodule n1) := + h.mul_comm_of_le_higgsAlgebra (h.higgsSubmodule_le_higgsAlgebra n1) + (h.higgsSubmodule_le_higgsAlgebra n2) -lemma barHiggsSubmodule_comm_barHiggsSubmodule (n1 n2 : ℕ) (h1 : n1 < n2) : +/-- Two conjugate Higgs submodules commute. -/ +lemma barHiggsSubmodule_comm_barHiggsSubmodule (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 ℂ (h.covBarH n1 d1 φ) - - LinearMap.mulRight ℂ (h.covBarH 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 + = (h.barHiggsSubmodule n2) * (h.barHiggsSubmodule n1) := + h.mul_comm_of_le_higgsAlgebra (h.barHiggsSubmodule_le_higgsAlgebra n1) + (h.barHiggsSubmodule_le_higgsAlgebra n2) /-! -### A.3. The closure of the Higgs and conjugate Higgs submodules under the gauge group +## D. The gauge weight decomposition of the Higgs submodules --/ - -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⟩ - -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⟩ - -/-! - -### A.4. The gauge decomposition +The four torus generators `gaugeTorusGen i` act on each component by a character: `∇_d H^j` +has isospin weight `-isoWeight j` and hypercharge weight `-3`, and `∇_d H̄^j` the opposite. +The general construction `doubletGaugeWeight` turns a family of such two-component +eigenvectors into a gauge weight decomposition of its span, and the two Higgs submodules +are instances of it. -/ -/-! - -#### 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] - -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 +/-- The torus generators act on `∇_d H^j` by the character of weight + `(0, 0, -isoWeight j, -3)`. -/ +lemma rep_gaugeTorusGen_higgs (i : Fin 4) {n : ℕ} (d : Fin n → (Fin 1 ⊕ Fin 3)) (j : Fin 2) : + rep (gaugeTorusGen i) (h.higgs d j) + = ((expI : ℂ) ^ GaugeWeight.coord (0, 0, -isoWeight j, -3) i) • h.higgs d j := 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_cases j <;> fin_cases i <;> + simp [gaugeTorusGen, GaugeGroupI.toU1, GaugeGroupI.toSU2, su2ExpI_inv_coe, isoWeight, Fin.sum_univ_two, expI_inv_eq_star, Matrix.one_apply, Unitary.coe_inv, hstar] -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] - -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 +/-- The torus generators act on `∇_d H̄^j` by the character of weight + `(0, 0, isoWeight j, 3)`. -/ +lemma rep_gaugeTorusGen_barHiggs (i : Fin 4) {n : ℕ} (d : Fin n → (Fin 1 ⊕ Fin 3)) + (j : Fin 2) : + rep (gaugeTorusGen i) (h.barHiggs d j) + = ((expI : ℂ) ^ GaugeWeight.coord (0, 0, isoWeight j, 3) i) • h.barHiggs d j := 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_cases j <;> fin_cases i <;> + simp [gaugeTorusGen, GaugeGroupI.toU1, GaugeGroupI.toSU2, su2ExpI_inv_coe, isoWeight, Fin.sum_univ_two, Matrix.one_apply, Unitary.coe_inv, hc] -/-! - -#### 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] +/-- The span of a family of eigenvectors of a torus generator lies in its eigenspace. -/ +lemma iSup_span_le_eigenspace {ι : Type} (i : Fin 4) (y : ι → B) (w : GaugeWeight) + (hy : ∀ d, rep (gaugeTorusGen i) (y d) = ((expI : ℂ) ^ w.coord i) • y d) : + (⨆ d, ℂ ∙ y d) ≤ Module.End.eigenspace (rep (gaugeTorusGen i)) ((expI : ℂ) ^ w.coord i) := + iSup_le fun d => (Submodule.span_singleton_le_iff_mem _ _).mpr + (Module.End.mem_eigenspace_iff.mpr (hy d)) + +/-- The gauge weight decomposition of the span of a two-component family `x d j` of torus + eigenvectors, the components `x d 0` of weight `w₀` and `x d 1` of weight `w₁ ≠ w₀`: the + weight-`w₀` piece is the span of the `x d 0` and the weight-`w₁` piece that of the + `x d 1`. -/ +@[implicit_reducible] +noncomputable def doubletGaugeWeight {ι : Type} (hmul : IsMulRep rep) (x : ι → Fin 2 → B) + (w₀ w₁ : GaugeWeight) (hw : w₀ ≠ w₁) + (hx₀ : ∀ (i : Fin 4) (d : ι), + rep (gaugeTorusGen i) (x d 0) = ((expI : ℂ) ^ w₀.coord i) • x d 0) + (hx₁ : ∀ (i : Fin 4) (d : ι), + rep (gaugeTorusGen i) (x d 1) = ((expI : ℂ) ^ w₁.coord i) • x d 1) : + GaugeWeightDecomposition rep (⨆ (d : ι) (j : Fin 2), ℂ ∙ x d j) where + piece w := if w = w₀ then ⨆ d, ℂ ∙ x d 0 else if w = w₁ then ⨆ d, ℂ ∙ x d 1 else ⊥ + supp := {w₀, w₁} + rep_mul := hmul + piece_le w y hy i := by + split_ifs at hy with h0 h1 + · rw [h0] + exact Module.End.mem_eigenspace_iff.mp + (iSup_span_le_eigenspace i (fun d => x d 0) w₀ (hx₀ i) hy) + · rw [h1] + exact Module.End.mem_eigenspace_iff.mp + (iSup_span_le_eigenspace i (fun d => x d 1) w₁ (hx₁ i) hy) + · rw [Submodule.mem_bot] at hy + subst hy + simp + piece_eq_bot w hw' := by + 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.covH 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 - --/ + refine le_antisymm (iSup_le fun w => ?_) (iSup_le fun d => iSup_le fun j => ?_) + · split_ifs + · exact iSup_mono fun d => le_iSup (fun j => ℂ ∙ x d j) 0 + · exact iSup_mono fun d => le_iSup (fun j => ℂ ∙ x d j) 1 + · exact bot_le + · fin_cases j + · exact le_iSup_of_le w₀ (by rw [if_pos rfl]; exact le_iSup (fun d => ℂ ∙ x d 0) d) + · exact le_iSup_of_le w₁ + (by rw [if_neg hw.symm, if_pos rfl]; exact le_iSup (fun d => ℂ ∙ x d 1) d) + +/-- The gauge weight decomposition of the Higgs submodule: `∇_d H⁰` spans the piece of + weight `(0, 0, -1, -3)` and `∇_d H¹` that of weight `(0, 0, 1, -3)`. -/ +noncomputable instance higgsSubmoduleGaugeWeight (n : ℕ) : + GaugeWeightDecomposition rep (h.higgsSubmodule n) := + (doubletGaugeWeight h.rep_mul (h.higgs (n := n)) (0, 0, -1, -3) (0, 0, 1, -3) (by decide) + (fun i d => h.rep_gaugeTorusGen_higgs i d 0) + (fun i d => h.rep_gaugeTorusGen_higgs i d 1)).copy _ (h.higgsSubmodule_eq_iSup_span n) -@[simps!] +/-- The gauge weight decomposition of the conjugate Higgs submodule: `∇_d H̄⁰` spans the + piece of weight `(0, 0, 1, 3)` and `∇_d H̄¹` that of weight `(0, 0, -1, 3)`. -/ 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 (h.covBarH 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 _) + GaugeWeightDecomposition rep (h.barHiggsSubmodule n) := + (doubletGaugeWeight h.rep_mul (h.barHiggs (n := n)) (0, 0, 1, 3) (0, 0, -1, 3) (by decide) + (fun i d => h.rep_gaugeTorusGen_barHiggs i d 0) + (fun i d => h.rep_gaugeTorusGen_barHiggs i d 1)).copy _ + (h.barHiggsSubmodule_eq_iSup_span n) /-! -### A.5. The inner product of higges - --/ +## E. The Higgs inner product -open Lorentz.BoostWeight +The pairing `∇_{d1} H⁰ ∇_{d2} H̄⁰ + ∇_{d1} H¹ ∇_{d2} H̄¹` is invariant under the gauge group, +since `H̄` transforms by the conjugate of the unitary matrix acting on `H`, and its two +derivative multi-indices rotate independently under the Lorentz group. -noncomputable def dot (x y : Fin 2 → B) : B := x 0 * y 0 + x 1 * y 1 +-/ +/-- The gauge-invariant pairing `∇_{d1} H^j ∇_{d2} H̄^j`, summed over the isospin index. -/ noncomputable def dotGaugeHiggs (h : HiggsAlgebraCovRealization B rep repLorentz massWeightPoly) - (d1 : Fin n1 → (Fin 1 ⊕ Fin 3)) (d2 : Fin n2 → (Fin 1 ⊕ Fin 3)) : + {n1 n2 : ℕ} (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_invariant (g : GaugeGroupI) (d1 : Fin n1 → (Fin 1 ⊕ Fin 3)) +/-- The pairing is gauge invariant: the matrix acting on `H` is unitary, and `H̄` transforms + by its conjugate. -/ +lemma rep_dotGaugeHiggs_invariant {n1 n2 : ℕ} (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 := @@ -795,125 +648,22 @@ 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) - -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} - -/-- **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 - -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. -/ +/-- The Lorentz action rotates the derivative indices of a Higgs component. -/ 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_apply] -/-- The Lorentz action rotates the derivative indices of a conjugate Higgs symbol. -/ +/-- The Lorentz action rotates the derivative indices of a conjugate Higgs component. -/ 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_apply] -/-- **The Lorentz action on the Higgs inner product.** The two factors' derivative indices - rotate independently; the inner product itself is a Lorentz scalar. -/ +/-- The Lorentz action on the Higgs inner product: the two factors' derivative indices + rotate independently, and 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₂) = @@ -924,46 +674,12 @@ lemma repLorentz_dotGaugeHiggs {m n : ℕ} (g : SL(2,ℂ)) 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 - -/-! - -## C. The Higgs algebra - --/ - -/-- The algebra generated by the Higgs, it's conjugate and - all their derivatives. -/ -def higgsAlgebra (h : HiggsAlgebraCovRealization B rep repLorentz massWeightPoly) : - Subalgebra ℂ B := (Algebra.adjoin ℂ (⋃ (k : ℕ) (d : Fin k → (Fin 1 ⊕ Fin 3)), - Set.range (h.covH k d) ∪ Set.range (h.covBarH k d))) - /-! -## D. Mass weight submodules +## F. The 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`. -/ @@ -974,379 +690,244 @@ noncomputable def massWeightSubmodule ⊓ 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.covH k d) ∪ Set.range (h.covBarH k d)), - ∀ b ∈ (⋃ (k : ℕ) (d : Fin k → (Fin 1 ⊕ Fin 3)), - Set.range (h.covH k d) ∪ Set.range (h.covBarH 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 +### F.1. Membership and the grading -/ -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.covH k d) ∪ Set.range (h.covBarH 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] - -/-! - -### 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 - -/-! +/-- An element has mass weight `n` when it lies in the Higgs algebra and `massWeightPoly` + scales it by `X ^ n`. -/ +lemma mem_massWeightSubmodule_iff {n : ℕ} {x : B} : + x ∈ h.massWeightSubmodule n + ↔ x ∈ h.higgsAlgebra ∧ massWeightPoly x = Polynomial.monomial n x := by + simp only [massWeightSubmodule, Submodule.mem_inf, Subalgebra.mem_toSubmodule, + LinearMap.mem_ker, LinearMap.sub_apply, AlgHom.toLinearMap_apply, + LinearMap.coe_restrictScalars, sub_eq_zero] + +/-- The mass weight of an element of the weight-`n` submodule. -/ +lemma massWeightPoly_of_mem_massWeightSubmodule {n : ℕ} {x : B} + (hx : x ∈ h.massWeightSubmodule n) : massWeightPoly x = Polynomial.monomial n x := + (h.mem_massWeightSubmodule_iff.mp hx).2 + +/-- The weight-`n` submodule lies in the Higgs algebra. -/ +lemma mem_higgsAlgebra_of_mem_massWeightSubmodule {n : ℕ} {x : B} + (hx : x ∈ h.massWeightSubmodule n) : x ∈ h.higgsAlgebra := + (h.mem_massWeightSubmodule_iff.mp hx).1 -### B.3. The inclusion of the Higgs and conjugate Higgs submodules in the mass weight submodule +/-- Two mass weight submodules commute. -/ +lemma massWeightSubmodule_mul_comm (n m : ℕ) : + h.massWeightSubmodule n * h.massWeightSubmodule m + = h.massWeightSubmodule m * h.massWeightSubmodule n := + h.mul_comm_of_le_higgsAlgebra inf_le_left inf_le_left --/ +/-- The scalars have mass weight zero. -/ +lemma one_le_massWeightSubmodule_zero : (1 : Submodule ℂ B) ≤ h.massWeightSubmodule 0 := + Submodule.one_le.mpr (h.mem_massWeightSubmodule_iff.mpr ⟨Subalgebra.one_mem _, by simp⟩) +/-- Mass weights add under multiplication. -/ +lemma massWeightSubmodule_mul_le (m n : ℕ) : + h.massWeightSubmodule m * h.massWeightSubmodule n ≤ h.massWeightSubmodule (m + n) := + Submodule.mul_le.mpr fun x hx y hy => by + obtain ⟨hxa, hxw⟩ := h.mem_massWeightSubmodule_iff.mp hx + obtain ⟨hya, hyw⟩ := h.mem_massWeightSubmodule_iff.mp hy + exact h.mem_massWeightSubmodule_iff.mpr ⟨Subalgebra.mul_mem _ hxa hya, + by rw [map_mul, hxw, hyw, Polynomial.monomial_mul_monomial]⟩ + +/-- The Higgs symbols with `n` derivatives have mass weight `2 * (1 + n)`. -/ 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] + exact h.mem_massWeightSubmodule_iff.mpr ⟨h.covH_mem_higgsAlgebra d φ, h.H_massWeight φ n d⟩ +/-- The conjugate Higgs symbols with `n` derivatives have mass weight `2 * (1 + n)`. -/ 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] + exact h.mem_massWeightSubmodule_iff.mpr + ⟨h.covBarH_mem_higgsAlgebra d φ, h.barH_massWeight φ n d⟩ /-! -### B.4. Decomposition of the mass weight submodule +### F.2. The weight recursion + +An element of the Higgs algebra is a polynomial in the symbols, and `massWeightPoly` reads +off its homogeneous components: the weight-`0` component is a scalar, the weight-`m` +component has mass weight `m`, and a component of positive weight is a sum of symbols of +that weight and of products of two components of lower positive weight. The last statement, +applied to an element of pure weight, is the recursion `massWeightSubmodule_eq`. -/ -lemma massWeightSubmodule_eq (i : ℕ) (hi : 0 < i) : +/-- The weight-zero component of an element of the Higgs algebra is a scalar. -/ +lemma coeff_zero_mem_one {x : B} (hx : x ∈ h.higgsAlgebra) : + (massWeightPoly x).coeff 0 ∈ (1 : Submodule ℂ B) := by + refine h.higgsAlgebra_induction + (P := fun x => (massWeightPoly x).coeff 0 ∈ (1 : Submodule ℂ B)) ?_ ?_ ?_ ?_ ?_ hx + · intro n d φ + rw [h.H_massWeight, Polynomial.coeff_monomial, if_neg (by omega)] + exact zero_mem _ + · intro n d φ + rw [h.barH_massWeight, Polynomial.coeff_monomial, if_neg (by omega)] + exact zero_mem _ + · intro r + rw [AlgHom.commutes] + simp only [Polynomial.algebraMap_apply, Polynomial.coeff_C] + exact Submodule.mem_one.mpr ⟨r, rfl⟩ + · intro x y _ _ ihx ihy + rw [map_add, Polynomial.coeff_add] + exact Submodule.add_mem _ ihx ihy + · intro x y _ _ ihx ihy + rw [map_mul, Polynomial.mul_coeff_zero] + simpa only [Submodule.one_mul] using Submodule.mul_mem_mul ihx ihy + +/-- The weight-`m` component of an element of the Higgs algebra has mass weight `m`. -/ +lemma coeff_mem_massWeightSubmodule {x : B} (hx : x ∈ h.higgsAlgebra) (m : ℕ) : + (massWeightPoly x).coeff m ∈ h.massWeightSubmodule m := by + refine h.higgsAlgebra_induction + (P := fun x => ∀ m, (massWeightPoly x).coeff m ∈ h.massWeightSubmodule m) ?_ ?_ ?_ ?_ ?_ hx m + · intro n d φ m + rw [h.H_massWeight, Polynomial.coeff_monomial] + split_ifs with hw + · subst hw + exact h.massWeightSubmodule_higgsSubmodule_le n (Submodule.mem_iSup_of_mem d ⟨φ, rfl⟩) + · exact zero_mem _ + · intro n d φ m + rw [h.barH_massWeight, Polynomial.coeff_monomial] + split_ifs with hw + · subst hw + exact h.massWeightSubmodule_barHiggsSubmodule_le n + (Submodule.mem_iSup_of_mem d ⟨φ, rfl⟩) + · exact zero_mem _ + · intro r 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 _ + · intro x y _ _ ihx ihy m + rw [map_add, Polynomial.coeff_add] + exact Submodule.add_mem _ (ihx m) (ihy m) + · intro x y _ _ ihx ihy m + rw [map_mul, Polynomial.coeff_mul] + refine Submodule.sum_mem _ fun p hp => ?_ + rw [← Finset.mem_antidiagonal.mp hp] + exact h.massWeightSubmodule_mul_le _ _ (Submodule.mul_mem_mul (ihx p.1) (ihy p.2)) + +/-- A component of positive weight `m` of an element of the Higgs algebra is a sum of + symbols of weight `m` and of products of two components of lower positive weight. -/ +lemma coeff_mem_of_pos {x : B} (hx : x ∈ h.higgsAlgebra) (m : ℕ) (hm : 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 + refine h.higgsAlgebra_induction (P := fun x => ∀ 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 : ℕ))) + ?_ ?_ ?_ ?_ ?_ hx m hm + · intro n d φ m _ + rw [h.H_massWeight, Polynomial.coeff_monomial] + split_ifs with hw + · exact Submodule.mem_sup_left (Submodule.mem_iSup_of_mem ⟨n, 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 n d φ m _ + rw [h.barH_massWeight, Polynomial.coeff_monomial] + split_ifs with hw + · exact Submodule.mem_sup_left (Submodule.mem_iSup_of_mem ⟨n, 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 _ + · intro r m hm + rw [AlgHom.commutes] + simp only [Polynomial.algebraMap_apply, Polynomial.coeff_C, if_neg (by omega : ¬ m = 0)] + exact zero_mem _ + · intro x y _ _ ihx ihy m hm + rw [map_add, Polynomial.coeff_add] + exact Submodule.add_mem _ (ihx m hm) (ihy m hm) + · intro x y hx hy ihx ihy m hm + rw [map_mul, Polynomial.coeff_mul] + refine Submodule.sum_mem _ fun p hp => ?_ + have hsum := Finset.mem_antidiagonal.mp hp + rcases Nat.eq_zero_or_pos p.1 with h1 | h1 + · rw [h1, show p.2 = m by omega] + simpa only [Submodule.one_mul] using + Submodule.mul_mem_mul (h.coeff_zero_mem_one hx) (ihy m hm) + · rcases Nat.eq_zero_or_pos p.2 with h2 | h2 + · rw [h2, show p.1 = m by omega] + simpa only [Submodule.mul_one] using + Submodule.mul_mem_mul (ihx m hm) (h.coeff_zero_mem_one hy) + · refine Submodule.mem_sup_right (Submodule.mem_iSup_of_mem + ((⟨⟨p.1, by omega⟩, ⟨p.2, by omega⟩⟩ : Fin m × Fin m)) + (Submodule.mem_iSup_of_mem (Finset.mem_filter.mpr ⟨Finset.mem_univ _, hsum⟩) ?_)) + exact Submodule.mul_mem_mul (h.coeff_mem_massWeightSubmodule hx p.1) + (h.coeff_mem_massWeightSubmodule hy p.2) + +/-- The weight recursion: a term of positive mass weight `i` is a sum of symbols of weight + `i` and of products of two terms of lower positive weight adding up to `i`. -/ +theorem 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, + · have hmain := h.coeff_mem_of_pos (h.mem_higgsAlgebra_of_mem_massWeightSubmodule hb) 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 + · refine iSup₂_le fun k hk => ?_ 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'])) + (h.massWeightSubmodule_barHiggsSubmodule_le (k : ℕ))).trans + (le_of_eq (by rw [(Finset.mem_filter.mp hk).2])) + · refine iSup₂_le fun p hp => ?_ + exact (h.massWeightSubmodule_mul_le (p.1 : ℕ) (p.2 : ℕ)).trans + (le_of_eq (by rw [(Finset.mem_filter.mp hp).2])) + +/-! + +### F.3. The odd mass weights vanish -/-- **The gauge weight decomposition of the mass weight submodules.** By recursion on the +Every symbol has even mass weight `2 * (1 + n)` and weights add under multiplication, so no +term of the Higgs algebra has odd mass weight. The proof runs the recursion: at an odd +weight the symbol part is empty, and each product has an odd factor of lower weight. + +-/ + +/-- The odd mass weight submodules are trivial. -/ +lemma massWeightSubmodule_odd_eq_bot (n : ℕ) (hn : Odd n) : + h.massWeightSubmodule n = ⊥ := by + induction n using Nat.strongRecOn with + | _ n ih => + rw [h.massWeightSubmodule_eq n hn.pos, eq_bot_iff, sup_le_iff] + obtain ⟨r, hr⟩ := hn + refine ⟨iSup₂_le fun k hk => ?_, iSup₂_le fun p hp => ?_⟩ + · have := (Finset.mem_filter.mp hk).2 + omega + · have hsum := (Finset.mem_filter.mp hp).2 + rcases Nat.even_or_odd (p.1 : ℕ) with ⟨s, hs⟩ | ho + · rw [ih p.2 p.2.isLt ⟨r - s, by omega⟩, Submodule.mul_bot] + · rw [ih p.1 p.1.isLt ho, Submodule.bot_mul] + +/-! + +### F.4. The gauge weight decomposition + +-/ + +/-- 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. -/ + 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 @@ -1375,12 +956,15 @@ noncomputable instance massWeightSubmoduleGaugeWeightOfNeZero (i : ℕ) [NeZero /-! -### B.6. Expansion of the low dimensional cases +### F.5. The low mass weights --/ +The recursion expanded at weights `2`, `4`, `6` and `8`, with the products written in a +fixed order using the commutation of the Higgs submodules. The odd weights vanish by +`massWeightSubmodule_odd_eq_bot`, so only even splittings survive. -open GaugeWeightDecomposition +-/ +/-- Weight two: the underived Higgs and conjugate Higgs. -/ lemma massWeightSubmodule_two_eq : h.massWeightSubmodule 2 = h.higgsSubmodule 0 ⊔ h.barHiggsSubmodule 0 := by rw [h.massWeightSubmodule_eq 2 (by decide)] @@ -1388,9 +972,10 @@ lemma massWeightSubmodule_two_eq : 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] + Nat.zero_mod, Nat.mod_succ, h.massWeightSubmodule_odd_eq_bot 1 (by decide), + Submodule.mul_bot, bot_le, sup_of_le_left] +/-- Weight four: the once-derived symbols and the products of two underived ones. -/ lemma massWeightSubmodule_four_eq : h.massWeightSubmodule 4 = h.higgsSubmodule 1 ⊔ h.barHiggsSubmodule 1 ⊔ h.higgsSubmodule 0 * h.higgsSubmodule 0 ⊔ h.higgsSubmodule 0 * @@ -1399,13 +984,14 @@ lemma massWeightSubmodule_four_eq : 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 [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] +/-- Weight six: the twice-derived symbols, a once-derived symbol against an underived one, + and the products of three underived ones. -/ lemma massWeightSubmodule_six_eq : h.massWeightSubmodule 6 = -- The derivative terms h.higgsSubmodule 2 ⊔ h.barHiggsSubmodule 2 ⊔ @@ -1422,8 +1008,8 @@ lemma massWeightSubmodule_six_eq : h.massWeightSubmodule 6 = 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, + 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] @@ -1432,9 +1018,11 @@ lemma massWeightSubmodule_six_eq : h.massWeightSubmodule 6 = = 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] + mul_assoc, hlc, h.higgsSubmodule_comm_higgsSubmodule 0 1, + h.barHiggsSubmodule_comm_barHiggsSubmodule 0 1, ← sup_assoc, sup_right_idem] +/-- Weight eight: the derivative terms with up to three derivatives, and the products of + four underived symbols. -/ lemma massWeightSubmodule_eight_eq : h.massWeightSubmodule 8 = -- The derivative terms @@ -1463,8 +1051,8 @@ lemma massWeightSubmodule_eight_eq : 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, + 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] @@ -1475,47 +1063,44 @@ lemma massWeightSubmodule_eight_eq : 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 + fun C => Commute.left_comm (h.higgsSubmodule_comm_higgsSubmodule 0 1) 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 + fun C => Commute.left_comm (h.barHiggsSubmodule_comm_barHiggsSubmodule 0 1) 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 + h.higgsSubmodule_comm_higgsSubmodule 0 1, + h.higgsSubmodule_comm_higgsSubmodule 0 2, + h.barHiggsSubmodule_comm_barHiggsSubmodule 0 1, + h.barHiggsSubmodule_comm_barHiggsSubmodule 0 2] + -- the products are atoms for the final reordering of the join + generalize h.higgsSubmodule 3 = v1, h.barHiggsSubmodule 3 = v2, + h.higgsSubmodule 2 * h.higgsSubmodule 0 = v3, h.higgsSubmodule 2 * h.barHiggsSubmodule 0 = v4, + h.higgsSubmodule 0 * h.barHiggsSubmodule 2 = v5, + h.barHiggsSubmodule 2 * h.barHiggsSubmodule 0 = v6, + h.higgsSubmodule 1 * h.higgsSubmodule 1 = v7, h.higgsSubmodule 1 * h.barHiggsSubmodule 1 = v8, + h.barHiggsSubmodule 1 * h.barHiggsSubmodule 1 = v9, + h.higgsSubmodule 1 * (h.higgsSubmodule 0 * h.higgsSubmodule 0) = v10, + h.higgsSubmodule 1 * (h.higgsSubmodule 0 * h.barHiggsSubmodule 0) = v11, + h.higgsSubmodule 1 * (h.barHiggsSubmodule 0 * h.barHiggsSubmodule 0) = v12, + h.higgsSubmodule 0 * (h.higgsSubmodule 0 * h.barHiggsSubmodule 1) = v13, + h.higgsSubmodule 0 * (h.barHiggsSubmodule 1 * h.barHiggsSubmodule 0) = v14, + h.barHiggsSubmodule 1 * (h.barHiggsSubmodule 0 * h.barHiggsSubmodule 0) = v15, + h.higgsSubmodule 0 * (h.higgsSubmodule 0 * (h.higgsSubmodule 0 * h.higgsSubmodule 0)) = v16, + h.higgsSubmodule 0 * (h.higgsSubmodule 0 * (h.higgsSubmodule 0 * h.barHiggsSubmodule 0)) + = v17, + h.higgsSubmodule 0 * (h.higgsSubmodule 0 * (h.barHiggsSubmodule 0 * h.barHiggsSubmodule 0)) + = v18, + h.higgsSubmodule 0 * (h.barHiggsSubmodule 0 * (h.barHiggsSubmodule 0 * h.barHiggsSubmodule 0)) + = v19, + 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] /-! -## E. Gauge invariance +## G. Gauge invariants -/ @@ -1523,6 +1108,119 @@ lemma massWeightSubmodule_eight_eq : noncomputable def gaugeInvariantOfMassDim (M : ℕ) : Submodule ℂ B := h.massWeightSubmodule M ⊓ Representation.invariants rep +/-! + +## Aside: derivative collections and boost weights + +A symbol map whose derivative indices rotate as Lorentz vectors (`RotatesIndices`) has a +boost weight decomposition of its span along each spatial axis, read off in the light-cone +basis: a slot of light-cone type `c j` contributes `lightConeWeight (c j)` on top of the +weight of the argument. `IsDerivativeCollection` records the rotation law for a symbol with +several groups of derivative indices, and `trivialWeightDecomposition` is the weight +decomposition of a Lorentz-scalar argument. Both are used by the Higgs, fermion and gauge +sectors alike, which is why they live here rather than in a sector file. + +-/ + +open Lorentz.BoostWeight + +/-- A symbol map with `α` groups of derivative indices whose every index rotates as a + Lorentz vector, the grouping being a spectator. -/ +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} + +/-- 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))) = ⊤ := fun c => + le_antisymm le_top (hw.iSup_piece.symm.le.trans (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 + +end IsDerivativeCollection + +/-- 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 + end HiggsAlgebraCovRealization end StandardModel From 1ed1a9e9c4f43cc071f7c24c1e2719e6ac8edf3f Mon Sep 17 00:00:00 2001 From: jstoobysmith Date: Tue, 8 Sep 2026 20:08:00 +0100 Subject: [PATCH 301/367] refactor: shorten AlgebraRealization/CovStandardModel Co-Authored-By: Claude Fable 5.1 --- .../AlgebraRealization/CovStandardModel.lean | 2375 ++++++----------- 1 file changed, 773 insertions(+), 1602 deletions(-) diff --git a/Physlib/Particles/StandardModel/AlgebraRealization/CovStandardModel.lean b/Physlib/Particles/StandardModel/AlgebraRealization/CovStandardModel.lean index 6287b35dc..18818a85b 100644 --- a/Physlib/Particles/StandardModel/AlgebraRealization/CovStandardModel.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/CovStandardModel.lean @@ -14,78 +14,68 @@ public import Physlib.Particles.StandardModel.AlgebraRealization.MassWeight.Basi `AlgebraRealization` 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 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 `AlgebraRealization` in the -ordered-tuple indexing used by the covariant form of the theory, 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 establishes the laws those towers satisfy, which -`CovAlgebraRealization` collects into the covariant form of the theory. -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. Their Lorentz transformation laws -are section L of [`CovariantDeriv.lean`](CovariantDeriv.lean): each follows from the -Lorentz law -`AlgebraRealization` 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 every one of those laws is unconditional. +the base point. The covariant form of the theory 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 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 +form used for classifying Lagrangians. The second establishes the laws the towers +satisfy, which `CovAlgebraRealization` collects into the covariant form of the theory: +their global gauge equivariance, their mass weights and their statistics. The twelve +matter towers are treated uniformly: section B packages a matter species as its +gauge-algebra action, its bare family, and the two facts about the family every argument +uses — it commutes with the gauge field and it is a mass-weight eigenvector — and each +later law is proved once for an arbitrary species and read off twelve times. The Lorentz +laws of the matter towers are section L of [`CovariantDeriv.lean`](CovariantDeriv.lean); +the one for the field-strength tower closes this file. ## ii. Key results - `AlgebraRealization.repGlobal` : the global gauge action, the jet action restricted along the constant jets. -- `AlgebraRealization.repJet_eq_of_mem_covAlgebra_of_mem_truncationKer_zero` : pure gauge - jets fix the covariant subalgebra pointwise. -- `AlgebraRealization.forall_repJet_eq_iff` : the reduction theorem for the gauge group. -- `AlgebraRealization.forall_repJet_and_repLorentz_eq_iff` : the reduction theorem for the - gauge group together with the Lorentz group. +- `AlgebraRealization.Species` : a matter species with the facts the laws below consume; + `AlgebraRealization.speciesH`, `AlgebraRealization.speciesD` and their companions are + the twelve matter families of the Standard Model. +- `AlgebraRealization.forall_repJet_eq_iff` and + `AlgebraRealization.forall_repJet_and_repLorentz_eq_iff` : the reduction theorem, for + the gauge group alone and together with the Lorentz group. - `AlgebraRealization.repGlobal_covF`, `AlgebraRealization.repGlobal_covDerivH` and their companions : the covariant towers are equivariant for the global gauge group. - `AlgebraRealization.covF_commute_of_mem_covAlgebra` : the field-strength tower is central in the covariant algebra. -- `AlgebraRealization.covDerivIter_mem_massWeightEigenspace` and - `AlgebraRealization.iteratedCovDerivAdjoint_mem_massWeightEigenspace` : a covariant - tower is a mass-weight eigenvector, of the weight its species and derivative order - predict. -- `AlgebraRealization.commute_covDerivIter_covDerivIter` and - `AlgebraRealization.anticommute_covDerivIter_covDerivIter` : the statistics of a pair of - towers is the statistics of the pair of bare families. +- `AlgebraRealization.Species.massWeight_tower` and `AlgebraRealization.massWeight_covF` : + a covariant tower is a mass-weight eigenvector of the weight its species and + derivative order predict. +- `AlgebraRealization.Species.commute_tower_tower` and + `AlgebraRealization.Species.anticomm_tower_tower` : the statistics of a pair of towers + is the statistics of the pair of bare families. - `AlgebraRealization.repLorentz_covF` : the Lorentz law of the field-strength tower. ## iii. Table of contents - A. The global gauge action +- B. The twelve matter species - 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 Lorentz law of the field-strength tower +- G. Sums of products: the two family pairings +- H. The mass weights of the covariant towers + - H.1. The mass weights, species by species +- I. The statistics of the covariant towers + - I.1. The statistics, species by species +- J. The Lorentz law of the field-strength tower ## iv. References The classification of jet-gauge invariants that section D consumes is -`AlgebraRealization.invariant_mem_adjoin_covDeriv`, proved in -[`CovFieldAlgebra/Basic.lean`](CovFieldAlgebra/Basic.lean); the splitting of a gauge -jet into a pure jet and a constant jet is -`localGaugeData.eq_truncationProjZero_mul_ofConstant`. The -three sector structures are +`AlgebraRealization.invariant_mem_adjoin_covDeriv` of +[`CovFieldAlgebra/Basic.lean`](CovFieldAlgebra/Basic.lean); the splitting of a gauge jet +into a pure jet and a constant jet is `localGaugeData.eq_truncationProjZero_mul_ofConstant`. +The laws of the second half are consumed by the three sector structures of [`IsGaugeSector/Basic.lean`](../IsGaugeSector/Basic.lean), [`HiggsAlgebraCovRealization/Basic.lean`](../HiggsAlgebraCovRealization/Basic.lean) and [`IsFermionSector/Basic.lean`](../IsFermionSector/Basic.lean). @@ -110,9 +100,9 @@ variable {B : Type} [Ring B] [Algebra ℂ B] ## 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. +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 global gauge action on the algebra, multiplicative like the jet action. -/ @@ -127,6 +117,142 @@ noncomputable def repGlobal (repJet : Representation ℂ JetGaugeGroupI B) : lemma repGlobal_apply (repJet : Representation ℂ JetGaugeGroupI B) (g : GaugeGroupI) (b : B) : repGlobal repJet g b = repJet (JetGaugeGroupI.ofConstant g) b := rfl +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₂ + +/-! + +## B. The twelve matter species + +Every matter tower is `IsGaugeField.covDerivIter h.A act F n l 0` for the gauge-algebra +action `act` of its species and its bare family `F`, and every law proved below for a +matter tower uses only two facts about that family: its symbols commute with the +gauge-field symbols, and they are mass-weight eigenvectors of weight `c + 2 * |t|` at the +derivative multiset `t`. A `Species` records exactly this data, the twelve matter families +of the Standard Model are its twelve instances, and `matterTowers_induction_species` and +`covGenerators_cases` are the case splits that read a law proved for an arbitrary species +off for all of them. + +-/ + +/-- A matter species of the Standard Model, as the laws of this file consume it: the + gauge-algebra action on its value space, its bare family of derivative symbols, the + mass weight `c` of its undifferentiated symbols, and the two facts that the family + commutes with the gauge-field symbols and has mass weight `c + 2 * |t|` at the + derivative multiset `t`. -/ +structure Species (V : Type) [AddCommGroup V] [Module ℂ V] where + /-- The action of the gauge algebra on the value space. -/ + act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℂ] V + /-- The bare derivative symbols of the species. -/ + F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B + /-- The mass weight of the undifferentiated symbols. -/ + c : ℕ + /-- The gauge-field symbols commute with the bare symbols. -/ + A_comm : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (ψ : Module.Dual ℝ GaugeAlgebra) + (t : Multiset (Fin 1 ⊕ Fin 3)) (χ : Module.Dual ℂ V), Commute (h.A p μ ψ) (F t χ) + /-- The bare symbol at the derivative multiset `t` has mass weight `c + 2 * |t|`. -/ + massWeight : ∀ (t : Multiset (Fin 1 ⊕ Fin 3)) (χ : Module.Dual ℂ V), + massWeightPoly (F t χ) = Polynomial.monomial (c + 2 * Multiset.card t) (F t χ) + +namespace Species + +variable {h} {V : Type} [AddCommGroup V] [Module ℂ V] [FiniteDimensional ℂ V] (S : h.Species V) + +/-- The covariant tower of the species, in the ordered-tuple indexing of the covariant + form of the theory. -/ +noncomputable def tower {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : Module.Dual ℂ V →ₗ[ℂ] B := + IsGaugeField.covDerivIter h.A S.act S.F n l 0 + +/-- The tower commutes with the gauge-field symbols: it is a polynomial in symbols that do. -/ +lemma comm_A {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V) + (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (ψ : Module.Dual ℝ GaugeAlgebra) : + Commute (S.tower l φ) (h.A p μ ψ) := + IsGaugeField.commute_covDerivIter S.act S.F h.A_comm_A S.A_comm n l φ p μ ψ + +end Species + +/-- The Higgs field, of mass weight `2`. -/ +noncomputable def speciesH : h.Species HiggsVec := + ⟨HiggsVec.gaugeAlgebraAction, h.H, 2, h.A_comm_H, + fun t χ => (h.massWeight_H t χ).trans (by rw [mul_add, mul_one])⟩ + +/-- The conjugate Higgs field, of mass weight `2`. -/ +noncomputable def speciesBarH : h.Species (ConjModule HiggsVec) := + ⟨LocalGaugeData.actionConj HiggsVec.gaugeAlgebraAction, h.barH, 2, h.A_comm_barH, + fun t χ => (h.massWeight_barH t χ).trans (by rw [mul_add, mul_one])⟩ + +/-- The down-type quarks of generation `i`, of mass weight `3`. -/ +noncomputable def speciesD (i : Fin 3) : h.Species DownSinglet := + ⟨DownSinglet.gaugeAlgebraAction, h.d i, 3, fun p μ ψ => h.A_comm_d p μ ψ i, h.massWeight_d i⟩ + +/-- The conjugate down-type quarks of generation `i`, of mass weight `3`. -/ +noncomputable def speciesBarD (i : Fin 3) : h.Species (ConjModule DownSinglet) := + ⟨LocalGaugeData.actionConj DownSinglet.gaugeAlgebraAction, h.bard i, 3, + fun p μ ψ => h.A_comm_bard p μ ψ i, h.massWeight_bard i⟩ + +/-- The up-type quarks of generation `i`, of mass weight `3`. -/ +noncomputable def speciesU (i : Fin 3) : h.Species UpSinglet := + ⟨UpSinglet.gaugeAlgebraAction, h.u i, 3, fun p μ ψ => h.A_comm_u p μ ψ i, h.massWeight_u i⟩ + +/-- The conjugate up-type quarks of generation `i`, of mass weight `3`. -/ +noncomputable def speciesBarU (i : Fin 3) : h.Species (ConjModule UpSinglet) := + ⟨LocalGaugeData.actionConj UpSinglet.gaugeAlgebraAction, h.baru i, 3, + fun p μ ψ => h.A_comm_baru p μ ψ i, h.massWeight_baru i⟩ + +/-- The quark doublets of generation `i`, of mass weight `3`. -/ +noncomputable def speciesQ (i : Fin 3) : h.Species QuarkDoublet := + ⟨QuarkDoublet.gaugeAlgebraAction, h.Q i, 3, fun p μ ψ => h.A_comm_Q p μ ψ i, h.massWeight_Q i⟩ + +/-- The conjugate quark doublets of generation `i`, of mass weight `3`. -/ +noncomputable def speciesBarQ (i : Fin 3) : h.Species (ConjModule QuarkDoublet) := + ⟨LocalGaugeData.actionConj QuarkDoublet.gaugeAlgebraAction, h.barQ i, 3, + fun p μ ψ => h.A_comm_barQ p μ ψ i, h.massWeight_barQ i⟩ + +/-- The lepton doublets of generation `i`, of mass weight `3`. -/ +noncomputable def speciesL (i : Fin 3) : h.Species LeptonDoublet := + ⟨LeptonDoublet.gaugeAlgebraAction, h.L i, 3, fun p μ ψ => h.A_comm_L p μ ψ i, h.massWeight_L i⟩ + +/-- The conjugate lepton doublets of generation `i`, of mass weight `3`. -/ +noncomputable def speciesBarL (i : Fin 3) : h.Species (ConjModule LeptonDoublet) := + ⟨LocalGaugeData.actionConj LeptonDoublet.gaugeAlgebraAction, h.barL i, 3, + fun p μ ψ => h.A_comm_barL p μ ψ i, h.massWeight_barL i⟩ + +/-- The lepton singlets of generation `i`, of mass weight `3`. -/ +noncomputable def speciesE (i : Fin 3) : h.Species LeptonSinglet := + ⟨LeptonSinglet.gaugeAlgebraAction, h.e i, 3, fun p μ ψ => h.A_comm_e p μ ψ i, h.massWeight_e i⟩ + +/-- The conjugate lepton singlets of generation `i`, of mass weight `3`. -/ +noncomputable def speciesBarE (i : Fin 3) : h.Species (ConjModule LeptonSinglet) := + ⟨LocalGaugeData.actionConj LeptonSinglet.gaugeAlgebraAction, h.bare i, 3, + fun p μ ψ => h.A_comm_bare p μ ψ i, h.massWeight_bare i⟩ + +/-- A property of every symbol of every matter tower is proved species by species: each + matter tower is the tower of one of the twelve species. -/ +lemma matterTowers_induction_species (P : B → Prop) {b : B} (hb : b ∈ h.matterTowers) + (hS : ∀ {V : Type} [AddCommGroup V] [Module ℂ V] [FiniteDimensional ℂ V] (S : h.Species V) + (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V), P (S.tower l φ)) : P b := + h.matterTowers_induction P hb (hS h.speciesH) (hS h.speciesBarH) (fun i => hS (h.speciesD i)) + (fun i => hS (h.speciesBarD i)) (fun i => hS (h.speciesU i)) (fun i => hS (h.speciesBarU i)) + (fun i => hS (h.speciesQ i)) (fun i => hS (h.speciesBarQ i)) (fun i => hS (h.speciesL i)) + (fun i => hS (h.speciesBarL i)) (fun i => hS (h.speciesE i)) (fun i => hS (h.speciesBarE i)) + +/-- A property of every covariant generator is proved for the field-strength tower and + for the matter towers. -/ +lemma covGenerators_cases (P : B → Prop) {b : B} (hb : b ∈ h.covGenerators) + (hF : ∀ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra), P (h.covF l μ ν φ)) + (hM : ∀ b ∈ h.matterTowers, P b) : P b := by + rw [covGenerators, Set.union_assoc] at hb + rcases hb with hb | hb + · simp only [Set.mem_iUnion, Set.mem_range] at hb + obtain ⟨n, l, μ, ν, φ, rfl⟩ := hb + exact hF n l μ ν φ + · exact hM b hb + /-! ## C. Pure gauge jets fix the covariant algebra @@ -142,50 +268,32 @@ include h in 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] + have hone := h.repJet_A.gauge_mul U (repJet U⁻¹ 1) 1 + rw [mul_one, ← Module.End.mul_apply, ← map_mul, mul_inv_cancel, map_one repJet, + Module.End.one_apply, one_mul] at hone + rw [Algebra.algebraMap_eq_smul_one, map_smul, ← hone] -include h in -/-- Pure gauge jets fix the covariant generators: this is section L of - `AlgebraRealization.CovariantDeriv` together with the field-strength case of - `AlgebraRealization.CovFieldAlgebra.Basic`. -/ +/-- Pure gauge jets fix the covariant generators: the thirteen cases are section L of + `AlgebraRealization.CovariantDeriv`. -/ lemma repJet_eq_of_mem_covGenerators_of_mem_truncationKer_zero (U : localGaugeData.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 φ + repJet U.1 x = x := + h.covGenerators_cases (fun x => repJet U.1 x = x) hx + (fun _ _ μ ν φ => h.repJet_covDerivFieldStrength_of_mem_truncationKer_zero U _ μ ν φ) + fun _ hb => h.matterTowers_induction (fun x => repJet U.1 x = x) hb + (fun _ l φ => h.repJet_covDerivH_of_mem_truncationKer_zero l U φ) + (fun _ l φ => h.repJet_covDerivBarH_of_mem_truncationKer_zero l U φ) + (fun i _ l φ => h.repJet_covDerivD_of_mem_truncationKer_zero i l U φ) + (fun i _ l φ => h.repJet_covDerivBarD_of_mem_truncationKer_zero i l U φ) + (fun i _ l φ => h.repJet_covDerivU_of_mem_truncationKer_zero i l U φ) + (fun i _ l φ => h.repJet_covDerivBarU_of_mem_truncationKer_zero i l U φ) + (fun i _ l φ => h.repJet_covDerivQ_of_mem_truncationKer_zero i l U φ) + (fun i _ l φ => h.repJet_covDerivBarQ_of_mem_truncationKer_zero i l U φ) + (fun i _ l φ => h.repJet_covDerivL_of_mem_truncationKer_zero i l U φ) + (fun i _ l φ => h.repJet_covDerivBarL_of_mem_truncationKer_zero i l U φ) + (fun i _ l φ => h.repJet_covDerivE_of_mem_truncationKer_zero i l U φ) + (fun i _ l φ => 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 @@ -205,39 +313,26 @@ Every gauge jet splits as a pure jet times a constant jet. On the covariant alge pure part acts trivially, so only the constant part — the global gauge group — is left. In the other direction the classification `AlgebraRealization.invariant_mem_adjoin_covDeriv` of `AlgebraRealization.CovFieldAlgebra.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. +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 - exact ⟨h.invariant_mem_adjoin_covDeriv hx hinv, fun g => hinv _⟩ - · rintro ⟨hmem, hglob⟩ U - have hU := localGaugeData.eq_truncationProjZero_mul_ofConstant U - calc repJet U x - = repJet ((localGaugeData.truncationProjZero U : JetGaugeGroupI) * - JetGaugeGroupI.ofConstant U.eval) x := congrArg (fun W => repJet W x) hU - _ = repJet (localGaugeData.truncationProjZero U : JetGaugeGroupI) - (repJet (JetGaugeGroupI.ofConstant U.eval) x) := by - rw [map_mul]; rfl - _ = repJet (localGaugeData.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 - (localGaugeData.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. -/ + refine ⟨fun hinv => ⟨h.invariant_mem_adjoin_covDeriv hx hinv, fun g => hinv _⟩, ?_⟩ + rintro ⟨hmem, hglob⟩ U + rw [localGaugeData.eq_truncationProjZero_mul_ofConstant U, map_mul, Module.End.mul_apply] + exact (congrArg (repJet (localGaugeData.truncationProjZero U).1) (hglob U.eval)).trans + (h.repJet_eq_of_mem_covAlgebra_of_mem_truncationKer_zero _ hmem) + +/-- The reduction theorem in the form used for Lagrangians: on the field algebra, invariance + under the jet gauge group and the Lorentz group is membership of the covariant algebra + with invariance under the global gauge group and the Lorentz group. -/ 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) ∧ @@ -253,7 +348,9 @@ tower through the base-point Taylor coefficient of its representation alone. Eva 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`, `HiggsAlgebraCovRealization` and `IsFermionSector`. +`IsGaugeSector`, `HiggsAlgebraCovRealization` and `IsFermionSector`: `repGlobal_covF` for the +field strength, and `repGlobal_covDerivH`, `repGlobal_covDerivD` and their companions for the +twelve matter towers, each an instance of `repGlobal_of_repJet` or of its conjugate form. -/ @@ -269,32 +366,35 @@ lemma repCoeff_zero_ofConstant {V : Type} [AddCommGroup V] [Module ℂ V] 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] +/-- A tower that transforms through the base-point dual coefficient of a gauge jet is + equivariant for the global gauge group, in the contragredient of the global + representation. -/ +lemma repGlobal_of_repJet {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⁻¹)] + {repG : Representation ℂ GaugeGroupI V} {T : Module.Dual ℂ V →ₗ[ℂ] B} + (hT : ∀ (U : JetGaugeGroupI) (φ : Module.Dual ℂ V), + repJet U (T φ) = T (IsGaugeField.repDualCoeff rep U⁻¹ 0 φ)) + (hg : ∀ g : GaugeGroupI, + rep (JetGaugeGroupI.ofConstant g) = TensorProduct.map LinearMap.id (repG g)) + (g : GaugeGroupI) (φ : Module.Dual ℂ V) : + repGlobal repJet g (T φ) = T (repG.dual g φ) := by + rw [repGlobal_apply, hT, ← map_inv JetGaugeGroupI.ofConstant, 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] +/-- The conjugate form of `repGlobal_of_repJet`: a tower transforming through the dual + coefficient of the conjugate representation is equivariant in its conjugate contragredient. -/ +lemma repGlobal_of_repJet_conj {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 (JetComponentSpace.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, LocalGaugeData.repCoeff_repConj, - repCoeff_zero_ofConstant (hg g⁻¹)] + {repG : Representation ℂ GaugeGroupI V} {T : Module.Dual ℂ (ConjModule V) →ₗ[ℂ] B} + (hT : ∀ (U : JetGaugeGroupI) (φ : Module.Dual ℂ (ConjModule V)), repJet U (T φ) = + T (IsGaugeField.repDualCoeff (JetComponentSpace.repConj rep) U⁻¹ 0 φ)) + (hg : ∀ g : GaugeGroupI, + rep (JetGaugeGroupI.ofConstant g) = TensorProduct.map LinearMap.id (repG g)) + (g : GaugeGroupI) (φ : Module.Dual ℂ (ConjModule V)) : + repGlobal repJet g (T φ) = T (repG.conj.dual g φ) := by + rw [repGlobal_apply, hT, ← map_inv JetGaugeGroupI.ofConstant, IsGaugeField.repDualCoeff, + LocalGaugeData.repCoeff_repConj, repCoeff_zero_ofConstant (hg g⁻¹)] rfl /-- At an inverse constant jet the dual adjoint coefficient is the contragredient @@ -306,310 +406,143 @@ lemma localGaugeData.adjointDualCoeff_zero_ofConstant_inv (g : GaugeGroupI) : 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) : +section + +variable (g : GaugeGroupI) (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + +/-- The field-strength tower is equivariant for the global gauge group, in the + contragredient adjoint representation. -/ +lemma repGlobal_covF (μ ν : 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 [localGaugeData.adjointDualCoeff_zero_ofConstant_inv] - rfl + rw [repGlobal_apply, ← localGaugeData.adjointDualCoeff_zero_ofConstant_inv] + exact h.repJet_covDerivFieldStrength (JetGaugeGroupI.ofConstant g) (List.ofFn l) μ ν φ -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] +lemma repGlobal_covDerivH (φ : Module.Dual ℂ HiggsVec) : + repGlobal repJet g (h.covDerivH l φ) = h.covDerivH l (HiggsVec.repGaugeGroupI.dual g φ) := + repGlobal_of_repJet (h.repJet_covDerivH l) HiggsVec.repJetGaugeGroupI_ofConstant g φ -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)) : +lemma repGlobal_covDerivBarH (φ : 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] + h.covDerivBarH l (HiggsVec.repGaugeGroupI.conj.dual g φ) := + repGlobal_of_repJet_conj (h.repJet_covDerivBarH l) HiggsVec.repJetGaugeGroupI_ofConstant g φ -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) : +lemma repGlobal_covDerivD (φ : 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] + h.covDerivD i l (DownSinglet.repGaugeGroupI.dual g φ) := + repGlobal_of_repJet (h.repJet_covDerivD i l) DownSinglet.repJetGaugeGroupI_ofConstant g φ -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)) : +lemma repGlobal_covDerivBarD (φ : 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] + h.covDerivBarD i l (DownSinglet.repGaugeGroupI.conj.dual g φ) := + repGlobal_of_repJet_conj (h.repJet_covDerivBarD i l) DownSinglet.repJetGaugeGroupI_ofConstant g φ -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] +lemma repGlobal_covDerivU (φ : Module.Dual ℂ UpSinglet) : + repGlobal repJet g (h.covDerivU i l φ) = h.covDerivU i l (UpSinglet.repGaugeGroupI.dual g φ) := + repGlobal_of_repJet (h.repJet_covDerivU i l) UpSinglet.repJetGaugeGroupI_ofConstant g φ -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)) : +lemma repGlobal_covDerivBarU (φ : 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] + h.covDerivBarU i l (UpSinglet.repGaugeGroupI.conj.dual g φ) := + repGlobal_of_repJet_conj (h.repJet_covDerivBarU i l) UpSinglet.repJetGaugeGroupI_ofConstant g φ -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) : +lemma repGlobal_covDerivQ (φ : 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] + h.covDerivQ i l (QuarkDoublet.repGaugeGroupI.dual g φ) := + repGlobal_of_repJet (h.repJet_covDerivQ i l) QuarkDoublet.repJetGaugeGroupI_ofConstant g φ -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)) : +lemma repGlobal_covDerivBarQ (φ : 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] + h.covDerivBarQ i l (QuarkDoublet.repGaugeGroupI.conj.dual g φ) := + repGlobal_of_repJet_conj (h.repJet_covDerivBarQ i l) QuarkDoublet.repJetGaugeGroupI_ofConstant g φ -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) : +lemma repGlobal_covDerivL (φ : 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] + h.covDerivL i l (LeptonDoublet.repGaugeGroupI.dual g φ) := + repGlobal_of_repJet (h.repJet_covDerivL i l) LeptonDoublet.repJetGaugeGroupI_ofConstant g φ -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)) : +lemma repGlobal_covDerivBarL (φ : 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] + h.covDerivBarL i l (LeptonDoublet.repGaugeGroupI.conj.dual g φ) := + repGlobal_of_repJet_conj (h.repJet_covDerivBarL i l) + LeptonDoublet.repJetGaugeGroupI_ofConstant g φ -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) : +lemma repGlobal_covDerivE (φ : 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] + h.covDerivE i l (LeptonSinglet.repGaugeGroupI.dual g φ) := + repGlobal_of_repJet (h.repJet_covDerivE i l) LeptonSinglet.repJetGaugeGroupI_ofConstant g φ -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)) : +lemma repGlobal_covDerivBarE (φ : 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] + h.covDerivBarE i l (LeptonSinglet.repGaugeGroupI.conj.dual g φ) := + repGlobal_of_repJet_conj (h.repJet_covDerivBarE i l) + LeptonSinglet.repJetGaugeGroupI_ofConstant g φ + +end /-! ## 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 cross-sector `F_comm_*` rules at once. +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 cross-sector +`F_comm_*` rules at once. -/ /-- The covariant derivatives of the field strength are polynomials in the gauge-field symbols. -/ -lemma covF_mem_adjoin_gaugeSymbols (h : AlgebraRealization B repJet repLorentz massWeightPoly) - {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) +lemma covF_mem_adjoin_gaugeSymbols {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 = h.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. -/ +/-- The field-strength tower commutes with anything the gauge-field symbols commute + with. -/ +lemma covF_comm_of_comm_A {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra) {y : B} + (hy : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (ρ : Fin 1 ⊕ Fin 3) (ψ' : Module.Dual ℝ GaugeAlgebra), + Commute (h.A p ρ ψ') y) : Commute (h.covF l μ ν ψ) y := by + refine IsGaugeField.commute_of_mem_adjoin ?_ (h.covF_mem_adjoin_gaugeSymbols l μ ν ψ) + rintro x ⟨p, ρ, ψ', rfl⟩ + exact hy p ρ ψ' + +/-- 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 (h.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.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 - (LocalGaugeData.actionConj HiggsVec.gaugeAlgebraAction) h.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) (h.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 - (LocalGaugeData.actionConj DownSinglet.gaugeAlgebraAction) (h.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) (h.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 - (LocalGaugeData.actionConj UpSinglet.gaugeAlgebraAction) (h.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) (h.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 - (LocalGaugeData.actionConj QuarkDoublet.gaugeAlgebraAction) (h.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) (h.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 - (LocalGaugeData.actionConj LeptonDoublet.gaugeAlgebraAction) (h.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) (h.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 - (LocalGaugeData.actionConj LeptonSinglet.gaugeAlgebraAction) (h.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. -/ + (hy : y ∈ h.covGenerators) : Commute y (h.A p ρ ψ) := + h.covGenerators_cases (fun y => Commute y (h.A p ρ ψ)) hy + (fun _ l μ ν φ => h.covF_comm_of_comm_A l μ ν φ fun s' ρ' ψ' => h.A_comm_A s' p ρ' ρ ψ' ψ) + fun _ hb => h.matterTowers_induction_species (fun y => Commute y (h.A p ρ ψ)) hb + fun S _ l φ => S.comm_A l φ p ρ ψ + +/-- The field-strength tower is central in the covariant algebra: it commutes with every + covariant generator, and commutation 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 - -The sector structures take 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₂ + (IsGaugeField.commute_of_mem_adjoin (fun _ hb => (h.covF_comm_of_comm_A l μ ν ψ fun p ρ ψ' => + (h.commute_gaugeSymbol_of_mem_covGenerators p ρ ψ' hb).symm).symm) hx).symm /-! -## H. Sums of products: the two family pairings +## G. 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. +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, which is all sections H and I use. -/ -/-- 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. -/ +/-- The action pairing of two families lands in any submodule containing the products of + their components: expanded in bases it is a finite sum of scalar multiples of them. -/ 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} @@ -623,8 +556,7 @@ lemma actionFam_apply_mem_submodule {V : Type} [AddCommGroup V] [Module ℂ V] 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. -/ + products of their components: it is the sum of the structure constants against them. -/ lemma bracketFam_apply_mem_submodule {M : Submodule ℂ B} {f g : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} (hfg : ∀ ψ χ, f ψ * g χ ∈ M) (φ : Module.Dual ℝ GaugeAlgebra) : @@ -636,15 +568,14 @@ lemma bracketFam_apply_mem_submodule {M : Submodule ℂ B} /-! -## I. The mass weights of the covariant towers +## H. 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`, `HiggsAlgebraCovRealization` and -`IsFermionSector` demand. +`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`, `HiggsAlgebraCovRealization` and `IsFermionSector` demand. -/ @@ -672,34 +603,34 @@ lemma mul_mem_massWeightEigenspace {w w' : ℕ} {b b' : B} 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), - h.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 h.A act F n l s φ ∈ - massWeightEigenspace massWeightPoly (c + 2 * n + 2 * Multiset.card s) := by +/-- A gauge-field symbol with `|p|` derivatives has mass weight `2 * (1 + |p|)`. -/ +lemma A_mem_massWeightEigenspace (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra) : + h.A p μ ψ ∈ massWeightEigenspace massWeightPoly (2 * (1 + Multiset.card p)) := + mem_massWeightEigenspace_iff.mpr (h.massWeight_A p μ ψ) + +namespace Species + +variable {h} {V : Type} [AddCommGroup V] [Module ℂ V] [FiniteDimensional ℂ V] (S : h.Species V) + +/-- The mass weight of a matter covariant tower: the `n`-fold covariant derivative of the + family at the derivative multiset `s` has weight `c + 2 * n + 2 * |s|`. Each covariant + derivative costs two units, whether it lands on the derivative index or brings down a + gauge-field factor. -/ +lemma covDerivIter_mem_massWeightEigenspace {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V) : + IsGaugeField.covDerivIter h.A S.act S.F n l s φ ∈ + massWeightEigenspace massWeightPoly (S.c + 2 * n + 2 * Multiset.card s) := by induction n generalizing s φ with | zero => rw [IsGaugeField.covDerivIter_zero] - simpa using hF s φ + simpa using mem_massWeightEigenspace_iff.mpr (S.massWeight 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 + rwa [Multiset.card_cons, show S.c + 2 * n + 2 * (Multiset.card s + 1) + = S.c + 2 * (n + 1) + 2 * Multiset.card s 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 @@ -707,29 +638,34 @@ lemma covDerivIter_mem_massWeightEigenspace {V : Type} [AddCommGroup V] [Module 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) ψ) + have hmul := mul_mem_massWeightEigenspace (h.A_mem_massWeightEigenspace 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 + rwa [show 2 * (1 + Multiset.card p.1) + (S.c + 2 * n + 2 * Multiset.card p.2) + = S.c + 2 * (n + 1) + 2 * Multiset.card s by omega] at hmul + +/-- The mass weight of the tower of a species is `c + 2 * n`: the form in which the + sector structures ask for it. -/ +lemma massWeight_tower {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V) : + massWeightPoly (S.tower l φ) = Polynomial.monomial (S.c + 2 * n) (S.tower l φ) := by + have hmem := S.covDerivIter_mem_massWeightEigenspace l 0 φ + rwa [Multiset.card_zero, mul_zero, add_zero, mem_massWeightEigenspace_iff] at hmem + +end Species /-- 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), - h.A p μ ψ ∈ massWeightEigenspace massWeightPoly (2 * (1 + Multiset.card p))) - (μ ν : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℝ GaugeAlgebra) : +lemma fieldStrength_mem_massWeightEigenspace (μ ν : Fin 1 ⊕ Fin 3) + (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra) : IsGaugeField.fieldStrength h.A μ ν s φ ∈ massWeightEigenspace massWeightPoly (4 + 2 * Multiset.card s) := by rw [IsGaugeField.fieldStrength_apply] refine add_mem (sub_mem ?_ ?_) ?_ - · have hstep := hA (μ ::ₘ s) ν φ + · have hstep := h.A_mem_massWeightEigenspace (μ ::ₘ 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) μ φ + show 2 * (1 + (Multiset.card s + 1)) = 4 + 2 * Multiset.card s by ring] at hstep + · have hstep := h.A_mem_massWeightEigenspace (ν ::ₘ s) μ φ rwa [Multiset.card_cons, - show 2 * (1 + (Multiset.card s + 1)) = 4 + 2 * Multiset.card s from by ring] at hstep + show 2 * (1 + (Multiset.card s + 1)) = 4 + 2 * Multiset.card s 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 @@ -737,17 +673,15 @@ lemma fieldStrength_mem_massWeightEigenspace 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 ν χ) + have hmul := mul_mem_massWeightEigenspace (h.A_mem_massWeightEigenspace p.1 μ ψ) + (h.A_mem_massWeightEigenspace 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 + = 4 + 2 * Multiset.card s 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. -/ + `Species.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), - h.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)) @@ -763,13 +697,11 @@ lemma iteratedCovDerivAdjoint_mem_massWeightEigenspace (c : ℕ) | cons ρ l ih => rw [show IsGaugeField.iteratedCovDerivAdjoint h.A (ρ :: l) G = IsGaugeField.covDerivAdjoint h.A (IsGaugeField.iteratedCovDerivAdjoint h.A l G) ρ - from rfl, IsGaugeField.covDerivAdjoint_apply] + from rfl, IsGaugeField.covDerivAdjoint_apply, List.length_cons] 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 + rwa [Multiset.card_cons, show c + 2 * l.length + 2 * (Multiset.card s + 1) + = c + 2 * (l.length + 1) + 2 * Multiset.card s by 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 @@ -777,284 +709,117 @@ lemma iteratedCovDerivAdjoint_mem_massWeightEigenspace (c : ℕ) 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] + have hmul := mul_mem_massWeightEigenspace (h.A_mem_massWeightEigenspace p.1 ρ ψ) + (ih p.2 χ) 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), - h.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 h.A act F n l 0 φ ∈ - massWeightEigenspace massWeightPoly (c + 2 * n) := by - have hmem := h.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), - h.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 h.A (List.ofFn l) G 0 φ ∈ - massWeightEigenspace massWeightPoly (c + 2 * n) := by - have hmem := h.iteratedCovDerivAdjoint_mem_massWeightEigenspace c hA G hG (List.ofFn l) 0 φ - rwa [List.length_ofFn, Multiset.card_zero, mul_zero, add_zero] at hmem - + = c + 2 * (l.length + 1) + 2 * Multiset.card s by omega] at hmul /-! -### I.1. The mass weights, species by species +### H.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`, `HiggsAlgebraCovRealization` and `IsFermionSector` demand: -`2 * (2 + n)` for the field strength, `2 * (1 + n)` for the Higgs, and `3 + 2 * n` -for the fermions. +The two towers of section H, evaluated at the empty derivative multiset, give the +mass weights that `IsGaugeSector`, `HiggsAlgebraCovRealization` and `IsFermionSector` +demand: `2 * (2 + n)` for the field strength (`massWeight_covF`), `2 * (1 + n)` for the +Higgs (`massWeight_covDerivH`) and `3 + 2 * n` for the fermions (`massWeight_covDerivD` +and its companions), the matter cases each being `Species.massWeight_tower` at the +corresponding species. -/ -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), - h.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 - (h.iteratedCovDerivAdjoint_ofFn_zero_mem_massWeightEigenspace 4 hA - (IsGaugeField.fieldStrength h.A μ ν) - (fun t χ => h.fieldStrength_mem_massWeightEigenspace hA μ ν t χ) l φ) +section -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 - (h.covDerivIter_zero_mem_massWeightEigenspace HiggsVec.gaugeAlgebraAction h.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 φ) +variable (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) -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)) : +/-- The mass weight of the field-strength tower is `2 * (2 + n)`: mass dimension `2 + n`. -/ +lemma massWeight_covF (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : + massWeightPoly (h.covF l μ ν φ) = Polynomial.monomial (2 * (2 + n)) (h.covF l μ ν φ) := by + have hmem := h.iteratedCovDerivAdjoint_mem_massWeightEigenspace 4 _ + (h.fieldStrength_mem_massWeightEigenspace μ ν) (List.ofFn l) 0 φ + rwa [List.length_ofFn, Multiset.card_zero, mul_zero, add_zero, + show 4 + 2 * n = 2 * (2 + n) by ring, mem_massWeightEigenspace_iff] at hmem + +lemma massWeight_covDerivH (φ : Module.Dual ℂ HiggsVec) : + massWeightPoly (h.covDerivH l φ) = Polynomial.monomial (2 * (1 + n)) (h.covDerivH l φ) := by + rw [mul_add, mul_one] + exact h.speciesH.massWeight_tower l φ + +lemma massWeight_covDerivBarH (φ : 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 - (h.covDerivIter_zero_mem_massWeightEigenspace - (LocalGaugeData.actionConj HiggsVec.gaugeAlgebraAction) h.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 φ) + rw [mul_add, mul_one] + exact h.speciesBarH.massWeight_tower 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 - (h.covDerivIter_zero_mem_massWeightEigenspace DownSinglet.gaugeAlgebraAction (h.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 φ) +lemma massWeight_covDerivD (φ : Module.Dual ℂ DownSinglet) : + massWeightPoly (h.covDerivD i l φ) = Polynomial.monomial (3 + 2 * n) (h.covDerivD i l φ) := + (h.speciesD i).massWeight_tower 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)) : +lemma massWeight_covDerivBarD (φ : Module.Dual ℂ (ConjModule DownSinglet)) : massWeightPoly (h.covDerivBarD i l φ) = - Polynomial.monomial (3 + 2 * n) (h.covDerivBarD i l φ) := by - exact mem_massWeightEigenspace_iff.mp - (h.covDerivIter_zero_mem_massWeightEigenspace - (LocalGaugeData.actionConj DownSinglet.gaugeAlgebraAction) (h.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 φ) + Polynomial.monomial (3 + 2 * n) (h.covDerivBarD i l φ) := + (h.speciesBarD i).massWeight_tower 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 - (h.covDerivIter_zero_mem_massWeightEigenspace UpSinglet.gaugeAlgebraAction (h.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 φ) +lemma massWeight_covDerivU (φ : Module.Dual ℂ UpSinglet) : + massWeightPoly (h.covDerivU i l φ) = Polynomial.monomial (3 + 2 * n) (h.covDerivU i l φ) := + (h.speciesU i).massWeight_tower 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)) : +lemma massWeight_covDerivBarU (φ : Module.Dual ℂ (ConjModule UpSinglet)) : massWeightPoly (h.covDerivBarU i l φ) = - Polynomial.monomial (3 + 2 * n) (h.covDerivBarU i l φ) := by - exact mem_massWeightEigenspace_iff.mp - (h.covDerivIter_zero_mem_massWeightEigenspace - (LocalGaugeData.actionConj UpSinglet.gaugeAlgebraAction) (h.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 φ) + Polynomial.monomial (3 + 2 * n) (h.covDerivBarU i l φ) := + (h.speciesBarU i).massWeight_tower 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 - (h.covDerivIter_zero_mem_massWeightEigenspace QuarkDoublet.gaugeAlgebraAction (h.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 φ) +lemma massWeight_covDerivQ (φ : Module.Dual ℂ QuarkDoublet) : + massWeightPoly (h.covDerivQ i l φ) = Polynomial.monomial (3 + 2 * n) (h.covDerivQ i l φ) := + (h.speciesQ i).massWeight_tower 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)) : +lemma massWeight_covDerivBarQ (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) : massWeightPoly (h.covDerivBarQ i l φ) = - Polynomial.monomial (3 + 2 * n) (h.covDerivBarQ i l φ) := by - exact mem_massWeightEigenspace_iff.mp - (h.covDerivIter_zero_mem_massWeightEigenspace - (LocalGaugeData.actionConj QuarkDoublet.gaugeAlgebraAction) (h.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 φ) + Polynomial.monomial (3 + 2 * n) (h.covDerivBarQ i l φ) := + (h.speciesBarQ i).massWeight_tower 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 - (h.covDerivIter_zero_mem_massWeightEigenspace LeptonDoublet.gaugeAlgebraAction (h.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 φ) +lemma massWeight_covDerivL (φ : Module.Dual ℂ LeptonDoublet) : + massWeightPoly (h.covDerivL i l φ) = Polynomial.monomial (3 + 2 * n) (h.covDerivL i l φ) := + (h.speciesL i).massWeight_tower 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)) : +lemma massWeight_covDerivBarL (φ : Module.Dual ℂ (ConjModule LeptonDoublet)) : massWeightPoly (h.covDerivBarL i l φ) = - Polynomial.monomial (3 + 2 * n) (h.covDerivBarL i l φ) := by - exact mem_massWeightEigenspace_iff.mp - (h.covDerivIter_zero_mem_massWeightEigenspace - (LocalGaugeData.actionConj LeptonDoublet.gaugeAlgebraAction) (h.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 φ) + Polynomial.monomial (3 + 2 * n) (h.covDerivBarL i l φ) := + (h.speciesBarL i).massWeight_tower 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 - (h.covDerivIter_zero_mem_massWeightEigenspace LeptonSinglet.gaugeAlgebraAction (h.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 φ) +lemma massWeight_covDerivE (φ : Module.Dual ℂ LeptonSinglet) : + massWeightPoly (h.covDerivE i l φ) = Polynomial.monomial (3 + 2 * n) (h.covDerivE i l φ) := + (h.speciesE i).massWeight_tower 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)) : +lemma massWeight_covDerivBarE (φ : Module.Dual ℂ (ConjModule LeptonSinglet)) : massWeightPoly (h.covDerivBarE i l φ) = - Polynomial.monomial (3 + 2 * n) (h.covDerivBarE i l φ) := by - exact mem_massWeightEigenspace_iff.mp - (h.covDerivIter_zero_mem_massWeightEigenspace - (LocalGaugeData.actionConj LeptonSinglet.gaugeAlgebraAction) (h.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 φ) + Polynomial.monomial (3 + 2 * n) (h.covDerivBarE i l φ) := + (h.speciesBarE i).massWeight_tower l φ + +end /-! -## J. The statistics of the covariant towers +## I. 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. +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 whose +bare symbols commute with the gauge field and anticommute with each other anticommute. The +anticommutation is checked term by term, through the submodule of elements anticommuting +with a fixed one. -/ -/-- 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 (h.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 h.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 (h.A p μ ψ) (h.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 (h.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 (h.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 h.A act₁ F₁ n l s φ) - (IsGaugeField.covDerivIter h.A act₂ F₂ m l' s' φ') := by - refine h.commute_covDerivIter act₁ F₁ (fun p μ ψ => ?_) (fun t χ => ?_) n l s φ - · exact (h.commute_covDerivIter act₂ F₂ (fun p' μ' ψ' => hAA p' p μ' μ ψ' ψ) - (fun t' χ' => (hAF₂ p μ ψ t' χ').symm) m l' s' φ').symm - · exact (h.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] + add_mem' {a b} (ha : x * a = -(a * x)) (hb : x * b = -(b * x)) := + show x * (a + b) = -((a + b) * x) by 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] + smul_mem' c y (hy : x * y = -(y * x)) := + show x * (c • y) = -((c • y) * x) by 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} : @@ -1072,1145 +837,551 @@ lemma mul_mem_anticommuteSubmodule {x a b : B} (ha : Commute x a) 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 (h.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 h.A act F n l s φ - = -(IsGaugeField.covDerivIter h.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 h.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 (h.A p μ ψ) (h.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 (h.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 (h.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 h.A act₁ F₁ n l s φ * - IsGaugeField.covDerivIter h.A act₂ F₂ m l' s' φ' = - -(IsGaugeField.covDerivIter h.A act₂ F₂ m l' s' φ' * - IsGaugeField.covDerivIter h.A act₁ F₁ n l s φ) := by - have step := h.anticommute_covDerivIter act₁ F₁ - (fun p μ ψ => (h.commute_covDerivIter act₂ F₂ (fun p' μ' ψ' => hAA p' p μ' μ ψ' ψ) - (fun t' χ' => (hAF₂ p μ ψ t' χ').symm) m l' s' φ')) - (fun t χ => anticomm_symm (h.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 +namespace Species +variable {h} {V W : Type} [AddCommGroup V] [Module ℂ V] [FiniteDimensional ℂ V] + [AddCommGroup W] [Module ℂ W] [FiniteDimensional ℂ W] (S : h.Species V) +/-- Anything commuting with every gauge-field symbol and with every bare symbol of the + species commutes with its tower. -/ +lemma commute_tower {y : B} + (hyA : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (ψ : Module.Dual ℝ GaugeAlgebra), + Commute (h.A p μ ψ) y) + (hyF : ∀ (t : Multiset (Fin 1 ⊕ Fin 3)) (χ : Module.Dual ℂ V), Commute (S.F t χ) y) + {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V) : Commute (S.tower l φ) y := by + refine IsGaugeField.commute_of_mem_adjoin ?_ + (IsGaugeField.covDerivIter_mem_adjoin_symbols S.act S.F n l 0 φ) + rintro x (⟨p, μ, ψ, rfl⟩ | ⟨t, χ, rfl⟩) + exacts [hyA p μ ψ, hyF t χ] + +/-- The towers of two species whose bare families commute with each other commute. The + hypothesis is stated in the shape of the bare laws `H_comm_d`. -/ +lemma commute_tower_tower (T : h.Species W) + (hST : ∀ (t : Multiset (Fin 1 ⊕ Fin 3)) (χ : Module.Dual ℂ V) (t' : Multiset (Fin 1 ⊕ Fin 3)) + (χ' : Module.Dual ℂ W), Commute (S.F t χ) (T.F t' χ')) + {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ' : Module.Dual ℂ W) : + Commute (S.tower l φ) (T.tower l' φ') := + S.commute_tower (fun p μ ψ => (T.comm_A l' φ' p μ ψ).symm) + (fun t χ => (T.commute_tower (fun p μ ψ => S.A_comm p μ ψ t χ) + (fun t' χ' => (hST t χ t' χ').symm) l' φ').symm) l φ + +/-- Anything commuting with every gauge-field symbol and anticommuting with every bare + symbol of the species anticommutes with its tower: each term of the tower is a product + of gauge-field symbols with a single bare symbol. -/ +lemma anticomm_tower {x : B} + (hxA : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (ψ : Module.Dual ℝ GaugeAlgebra), + Commute x (h.A p μ ψ)) + (hxF : ∀ (t : Multiset (Fin 1 ⊕ Fin 3)) (χ : Module.Dual ℂ V), x * S.F t χ = -(S.F t χ * x)) + {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V) : + x * S.tower l φ = -(S.tower l φ * x) := by + suffices key : ∀ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ V), + IsGaugeField.covDerivIter h.A S.act S.F n l s φ ∈ anticommuteSubmodule x from key n l 0 φ + 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 χ)) _ + +/-- The towers of two species whose bare families anticommute with each other + anticommute. The hypothesis is stated in the shape of the bare laws `d_anticomm_bard`. -/ +lemma anticomm_tower_tower (T : h.Species W) + (hST : ∀ (t t' : Multiset (Fin 1 ⊕ Fin 3)) (χ : Module.Dual ℂ V) (χ' : Module.Dual ℂ W), + S.F t χ * T.F t' χ' = -(T.F t' χ' * S.F t χ)) + {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V) + (l' : Fin m → (Fin 1 ⊕ Fin 3)) (φ' : Module.Dual ℂ W) : + S.tower l φ * T.tower l' φ' = -(T.tower l' φ' * S.tower l φ) := + anticomm_symm (S.anticomm_tower (fun p μ ψ => T.comm_A l' φ' p μ ψ) + (fun t χ => anticomm_symm (T.anticomm_tower (fun p μ ψ => (S.A_comm p μ ψ t χ).symm) + (fun t' χ' => hST t t' χ χ') l' φ')) l φ) + +/-- The field-strength tower commutes with the tower of every species. -/ +lemma covF_comm_tower {k n : ℕ} (l : Fin k → (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (ψ : Module.Dual ℝ GaugeAlgebra) (l' : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V) : + Commute (h.covF l μ ν ψ) (S.tower l' φ) := + h.covF_comm_of_comm_A l μ ν ψ fun p ρ ψ' => (S.comm_A l' φ p ρ ψ').symm + +end Species + +/-- 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' μ' ν' ψ') := + h.covF_comm_of_comm_A l μ ν ψ fun p ρ ψ₁ => + (h.covF_comm_of_comm_A l' μ' ν' ψ' fun q σ ψ₂ => h.A_comm_A q p σ ρ ψ₂ ψ₁).symm /-! -### J.1. The statistics, species by species +### I.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 the three sector structures. +commutation obligations of the three sector structures: `covF_comm_covX` for the +field-strength tower against the tower of the species `X`, `covH_comm_covX` and +`covBarH_comm_covX` for the two Higgs towers, and `covX_anticomm_covY` for each pair of +fermion species — each `Species.covF_comm_tower`, `Species.commute_tower_tower` or +`Species.anticomm_tower_tower` at the corresponding species, fed the bare law of the pair. -/ -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 (h.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 h.A act F n l' s φ) := by - refine IsGaugeField.commute_of_mem_adjoin ?_ (h.covF_mem_adjoin_gaugeSymbols l μ ν ψ) - rintro x ⟨p, ρ, ψ', rfl⟩ - exact (h.commute_covDerivIter act F (fun p' μ' ψ'' => h.A_comm_A p' p μ' ρ ψ'' ψ') - (fun t χ => (hAF p ρ ψ' t χ).symm) n l' s φ).symm +section -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 σ ρ ψ₂ ψ₁ +variable {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)) -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) : +lemma covF_comm_covH (φ : Module.Dual ℂ HiggsVec) : Commute (h.covF l μ ν ψ) (h.covDerivH l' φ) := - h.commute_covF_covDerivIter HiggsVec.gaugeAlgebraAction h.H h.A_comm_H l μ ν ψ m l' 0 φ + h.speciesH.covF_comm_tower l μ ν ψ l' φ -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)) : +lemma covF_comm_covBarH (φ : Module.Dual ℂ (ConjModule HiggsVec)) : Commute (h.covF l μ ν ψ) (h.covDerivBarH l' φ) := - h.commute_covF_covDerivIter (LocalGaugeData.actionConj HiggsVec.gaugeAlgebraAction) h.barH - h.A_comm_barH l μ ν ψ m l' 0 φ + h.speciesBarH.covF_comm_tower l μ ν ψ l' φ -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) : +lemma covF_comm_covD (φ : Module.Dual ℂ DownSinglet) : Commute (h.covF l μ ν ψ) (h.covDerivD i l' φ) := - h.commute_covF_covDerivIter DownSinglet.gaugeAlgebraAction (h.d i) - (fun p μ ψ t χ => h.A_comm_d p μ ψ i t χ) l μ ν ψ m l' 0 φ + (h.speciesD i).covF_comm_tower l μ ν ψ l' φ -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)) : +lemma covF_comm_covBarD (φ : Module.Dual ℂ (ConjModule DownSinglet)) : Commute (h.covF l μ ν ψ) (h.covDerivBarD i l' φ) := - h.commute_covF_covDerivIter (LocalGaugeData.actionConj DownSinglet.gaugeAlgebraAction) (h.bard i) - (fun p μ ψ t χ => h.A_comm_bard p μ ψ i t χ) l μ ν ψ m l' 0 φ + (h.speciesBarD i).covF_comm_tower l μ ν ψ l' φ -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) : +lemma covF_comm_covU (φ : Module.Dual ℂ UpSinglet) : Commute (h.covF l μ ν ψ) (h.covDerivU i l' φ) := - h.commute_covF_covDerivIter UpSinglet.gaugeAlgebraAction (h.u i) - (fun p μ ψ t χ => h.A_comm_u p μ ψ i t χ) l μ ν ψ m l' 0 φ + (h.speciesU i).covF_comm_tower l μ ν ψ l' φ -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)) : +lemma covF_comm_covBarU (φ : Module.Dual ℂ (ConjModule UpSinglet)) : Commute (h.covF l μ ν ψ) (h.covDerivBarU i l' φ) := - h.commute_covF_covDerivIter (LocalGaugeData.actionConj UpSinglet.gaugeAlgebraAction) (h.baru i) - (fun p μ ψ t χ => h.A_comm_baru p μ ψ i t χ) l μ ν ψ m l' 0 φ + (h.speciesBarU i).covF_comm_tower l μ ν ψ l' φ -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) : +lemma covF_comm_covQ (φ : Module.Dual ℂ QuarkDoublet) : Commute (h.covF l μ ν ψ) (h.covDerivQ i l' φ) := - h.commute_covF_covDerivIter QuarkDoublet.gaugeAlgebraAction (h.Q i) - (fun p μ ψ t χ => h.A_comm_Q p μ ψ i t χ) l μ ν ψ m l' 0 φ + (h.speciesQ i).covF_comm_tower l μ ν ψ l' φ -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)) : +lemma covF_comm_covBarQ (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) : Commute (h.covF l μ ν ψ) (h.covDerivBarQ i l' φ) := - h.commute_covF_covDerivIter (LocalGaugeData.actionConj QuarkDoublet.gaugeAlgebraAction) (h.barQ i) - (fun p μ ψ t χ => h.A_comm_barQ p μ ψ i t χ) l μ ν ψ m l' 0 φ + (h.speciesBarQ i).covF_comm_tower l μ ν ψ l' φ -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) : +lemma covF_comm_covL (φ : Module.Dual ℂ LeptonDoublet) : Commute (h.covF l μ ν ψ) (h.covDerivL i l' φ) := - h.commute_covF_covDerivIter LeptonDoublet.gaugeAlgebraAction (h.L i) - (fun p μ ψ t χ => h.A_comm_L p μ ψ i t χ) l μ ν ψ m l' 0 φ + (h.speciesL i).covF_comm_tower l μ ν ψ l' φ -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)) : +lemma covF_comm_covBarL (φ : Module.Dual ℂ (ConjModule LeptonDoublet)) : Commute (h.covF l μ ν ψ) (h.covDerivBarL i l' φ) := - h.commute_covF_covDerivIter (LocalGaugeData.actionConj LeptonDoublet.gaugeAlgebraAction) - (h.barL i) (fun p μ ψ t χ => h.A_comm_barL p μ ψ i t χ) l μ ν ψ m l' 0 φ + (h.speciesBarL i).covF_comm_tower l μ ν ψ l' φ -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) : +lemma covF_comm_covE (φ : Module.Dual ℂ LeptonSinglet) : Commute (h.covF l μ ν ψ) (h.covDerivE i l' φ) := - h.commute_covF_covDerivIter LeptonSinglet.gaugeAlgebraAction (h.e i) - (fun p μ ψ t χ => h.A_comm_e p μ ψ i t χ) l μ ν ψ m l' 0 φ + (h.speciesE i).covF_comm_tower l μ ν ψ l' φ -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)) : +lemma covF_comm_covBarE (φ : Module.Dual ℂ (ConjModule LeptonSinglet)) : Commute (h.covF l μ ν ψ) (h.covDerivBarE i l' φ) := - h.commute_covF_covDerivIter (LocalGaugeData.actionConj LeptonSinglet.gaugeAlgebraAction) - (h.bare i) (fun p μ ψ t χ => h.A_comm_bare p μ ψ i t χ) l μ ν ψ m l' 0 φ + (h.speciesBarE i).covF_comm_tower l μ ν ψ l' φ -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) : +end + +section + +variable (i j : Fin 3) {n m : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (l' : Fin m → (Fin 1 ⊕ Fin 3)) + +lemma covH_comm_covH (φ φ' : Module.Dual ℂ HiggsVec) : Commute (h.covDerivH l φ) (h.covDerivH l' φ') := - h.commute_covDerivIter_covDerivIter HiggsVec.gaugeAlgebraAction h.H - HiggsVec.gaugeAlgebraAction h.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 φ' + h.speciesH.commute_tower_tower h.speciesH (fun t χ t' χ' => h.H_comm_H t t' χ χ') l φ l' φ' -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)) : +lemma covH_comm_covBarH (φ : Module.Dual ℂ HiggsVec) (φ' : Module.Dual ℂ (ConjModule HiggsVec)) : Commute (h.covDerivH l φ) (h.covDerivBarH l' φ') := - h.commute_covDerivIter_covDerivIter HiggsVec.gaugeAlgebraAction h.H - (LocalGaugeData.actionConj HiggsVec.gaugeAlgebraAction) h.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 φ' + h.speciesH.commute_tower_tower h.speciesBarH (fun t χ t' χ' => h.H_comm_barH t t' χ χ') l φ l' φ' -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)) : +lemma covBarH_comm_covBarH (φ φ' : Module.Dual ℂ (ConjModule HiggsVec)) : Commute (h.covDerivBarH l φ) (h.covDerivBarH l' φ') := - h.commute_covDerivIter_covDerivIter (LocalGaugeData.actionConj HiggsVec.gaugeAlgebraAction) h.barH - (LocalGaugeData.actionConj HiggsVec.gaugeAlgebraAction) h.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 φ' + h.speciesBarH.commute_tower_tower h.speciesBarH + (fun t χ t' χ' => h.barH_comm_barH t t' χ χ') l φ l' φ' -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) : +lemma covH_comm_covD (φ : Module.Dual ℂ HiggsVec) (φ' : Module.Dual ℂ DownSinglet) : Commute (h.covDerivH l φ) (h.covDerivD i l' φ') := - h.commute_covDerivIter_covDerivIter HiggsVec.gaugeAlgebraAction h.H DownSinglet.gaugeAlgebraAction - (h.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 φ' + h.speciesH.commute_tower_tower (h.speciesD i) (fun t χ => h.H_comm_d t χ i) l φ l' φ' -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)) : +lemma covH_comm_covBarD (φ : Module.Dual ℂ HiggsVec) (φ' : Module.Dual ℂ (ConjModule DownSinglet)) : Commute (h.covDerivH l φ) (h.covDerivBarD i l' φ') := - h.commute_covDerivIter_covDerivIter HiggsVec.gaugeAlgebraAction h.H - (LocalGaugeData.actionConj DownSinglet.gaugeAlgebraAction) (h.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 φ' + h.speciesH.commute_tower_tower (h.speciesBarD i) (fun t χ => h.H_comm_bard t χ i) l φ l' φ' -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) : +lemma covH_comm_covU (φ : Module.Dual ℂ HiggsVec) (φ' : Module.Dual ℂ UpSinglet) : Commute (h.covDerivH l φ) (h.covDerivU i l' φ') := - h.commute_covDerivIter_covDerivIter HiggsVec.gaugeAlgebraAction h.H - UpSinglet.gaugeAlgebraAction (h.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 φ' + h.speciesH.commute_tower_tower (h.speciesU i) (fun t χ => h.H_comm_u t χ i) l φ l' φ' -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)) : +lemma covH_comm_covBarU (φ : Module.Dual ℂ HiggsVec) (φ' : Module.Dual ℂ (ConjModule UpSinglet)) : Commute (h.covDerivH l φ) (h.covDerivBarU i l' φ') := - h.commute_covDerivIter_covDerivIter HiggsVec.gaugeAlgebraAction h.H - (LocalGaugeData.actionConj UpSinglet.gaugeAlgebraAction) (h.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 φ' + h.speciesH.commute_tower_tower (h.speciesBarU i) (fun t χ => h.H_comm_baru t χ i) l φ l' φ' -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) : +lemma covH_comm_covQ (φ : Module.Dual ℂ HiggsVec) (φ' : Module.Dual ℂ QuarkDoublet) : Commute (h.covDerivH l φ) (h.covDerivQ i l' φ') := - h.commute_covDerivIter_covDerivIter HiggsVec.gaugeAlgebraAction h.H - QuarkDoublet.gaugeAlgebraAction - (h.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 φ' + h.speciesH.commute_tower_tower (h.speciesQ i) (fun t χ => h.H_comm_Q t χ i) l φ l' φ' -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) +lemma covH_comm_covBarQ (φ : Module.Dual ℂ HiggsVec) (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)) : Commute (h.covDerivH l φ) (h.covDerivBarQ i l' φ') := - h.commute_covDerivIter_covDerivIter HiggsVec.gaugeAlgebraAction h.H - (LocalGaugeData.actionConj QuarkDoublet.gaugeAlgebraAction) (h.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 φ' + h.speciesH.commute_tower_tower (h.speciesBarQ i) (fun t χ => h.H_comm_barQ t χ i) l φ l' φ' -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) : +lemma covH_comm_covL (φ : Module.Dual ℂ HiggsVec) (φ' : Module.Dual ℂ LeptonDoublet) : Commute (h.covDerivH l φ) (h.covDerivL i l' φ') := - h.commute_covDerivIter_covDerivIter HiggsVec.gaugeAlgebraAction h.H - LeptonDoublet.gaugeAlgebraAction - (h.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 φ' + h.speciesH.commute_tower_tower (h.speciesL i) (fun t χ => h.H_comm_L t χ i) l φ l' φ' -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) +lemma covH_comm_covBarL (φ : Module.Dual ℂ HiggsVec) (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)) : Commute (h.covDerivH l φ) (h.covDerivBarL i l' φ') := - h.commute_covDerivIter_covDerivIter HiggsVec.gaugeAlgebraAction h.H - (LocalGaugeData.actionConj LeptonDoublet.gaugeAlgebraAction) (h.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 φ' + h.speciesH.commute_tower_tower (h.speciesBarL i) (fun t χ => h.H_comm_barL t χ i) l φ l' φ' -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) : +lemma covH_comm_covE (φ : Module.Dual ℂ HiggsVec) (φ' : Module.Dual ℂ LeptonSinglet) : Commute (h.covDerivH l φ) (h.covDerivE i l' φ') := - h.commute_covDerivIter_covDerivIter HiggsVec.gaugeAlgebraAction h.H - LeptonSinglet.gaugeAlgebraAction - (h.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 φ' + h.speciesH.commute_tower_tower (h.speciesE i) (fun t χ => h.H_comm_e t χ i) l φ l' φ' -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) +lemma covH_comm_covBarE (φ : Module.Dual ℂ HiggsVec) (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)) : Commute (h.covDerivH l φ) (h.covDerivBarE i l' φ') := - h.commute_covDerivIter_covDerivIter HiggsVec.gaugeAlgebraAction h.H - (LocalGaugeData.actionConj LeptonSinglet.gaugeAlgebraAction) (h.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 φ' + h.speciesH.commute_tower_tower (h.speciesBarE i) (fun t χ => h.H_comm_bare t χ i) l φ l' φ' -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) : +lemma covBarH_comm_covD (φ : Module.Dual ℂ (ConjModule HiggsVec)) (φ' : Module.Dual ℂ DownSinglet) : Commute (h.covDerivBarH l φ) (h.covDerivD i l' φ') := - h.commute_covDerivIter_covDerivIter (LocalGaugeData.actionConj HiggsVec.gaugeAlgebraAction) h.barH - DownSinglet.gaugeAlgebraAction (h.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 φ' + h.speciesBarH.commute_tower_tower (h.speciesD i) (fun t χ => h.barH_comm_d t χ i) l φ l' φ' -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)) +lemma covBarH_comm_covBarD (φ : Module.Dual ℂ (ConjModule HiggsVec)) (φ' : Module.Dual ℂ (ConjModule DownSinglet)) : Commute (h.covDerivBarH l φ) (h.covDerivBarD i l' φ') := - h.commute_covDerivIter_covDerivIter (LocalGaugeData.actionConj HiggsVec.gaugeAlgebraAction) h.barH - (LocalGaugeData.actionConj DownSinglet.gaugeAlgebraAction) (h.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 φ' + h.speciesBarH.commute_tower_tower (h.speciesBarD i) (fun t χ => h.barH_comm_bard t χ i) l φ l' φ' -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) : +lemma covBarH_comm_covU (φ : Module.Dual ℂ (ConjModule HiggsVec)) (φ' : Module.Dual ℂ UpSinglet) : Commute (h.covDerivBarH l φ) (h.covDerivU i l' φ') := - h.commute_covDerivIter_covDerivIter (LocalGaugeData.actionConj HiggsVec.gaugeAlgebraAction) h.barH - UpSinglet.gaugeAlgebraAction (h.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 φ' + h.speciesBarH.commute_tower_tower (h.speciesU i) (fun t χ => h.barH_comm_u t χ i) l φ l' φ' -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)) +lemma covBarH_comm_covBarU (φ : Module.Dual ℂ (ConjModule HiggsVec)) (φ' : Module.Dual ℂ (ConjModule UpSinglet)) : Commute (h.covDerivBarH l φ) (h.covDerivBarU i l' φ') := - h.commute_covDerivIter_covDerivIter (LocalGaugeData.actionConj HiggsVec.gaugeAlgebraAction) h.barH - (LocalGaugeData.actionConj UpSinglet.gaugeAlgebraAction) (h.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 φ' + h.speciesBarH.commute_tower_tower (h.speciesBarU i) (fun t χ => h.barH_comm_baru t χ i) l φ l' φ' -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)) +lemma covBarH_comm_covQ (φ : Module.Dual ℂ (ConjModule HiggsVec)) (φ' : Module.Dual ℂ QuarkDoublet) : Commute (h.covDerivBarH l φ) (h.covDerivQ i l' φ') := - h.commute_covDerivIter_covDerivIter (LocalGaugeData.actionConj HiggsVec.gaugeAlgebraAction) h.barH - QuarkDoublet.gaugeAlgebraAction (h.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 φ' + h.speciesBarH.commute_tower_tower (h.speciesQ i) (fun t χ => h.barH_comm_Q t χ i) l φ l' φ' -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)) +lemma covBarH_comm_covBarQ (φ : Module.Dual ℂ (ConjModule HiggsVec)) (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)) : Commute (h.covDerivBarH l φ) (h.covDerivBarQ i l' φ') := - h.commute_covDerivIter_covDerivIter (LocalGaugeData.actionConj HiggsVec.gaugeAlgebraAction) h.barH - (LocalGaugeData.actionConj QuarkDoublet.gaugeAlgebraAction) (h.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 φ' + h.speciesBarH.commute_tower_tower (h.speciesBarQ i) (fun t χ => h.barH_comm_barQ t χ i) l φ l' φ' -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)) +lemma covBarH_comm_covL (φ : Module.Dual ℂ (ConjModule HiggsVec)) (φ' : Module.Dual ℂ LeptonDoublet) : Commute (h.covDerivBarH l φ) (h.covDerivL i l' φ') := - h.commute_covDerivIter_covDerivIter (LocalGaugeData.actionConj HiggsVec.gaugeAlgebraAction) h.barH - LeptonDoublet.gaugeAlgebraAction (h.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 φ' + h.speciesBarH.commute_tower_tower (h.speciesL i) (fun t χ => h.barH_comm_L t χ i) l φ l' φ' -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)) +lemma covBarH_comm_covBarL (φ : Module.Dual ℂ (ConjModule HiggsVec)) (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)) : Commute (h.covDerivBarH l φ) (h.covDerivBarL i l' φ') := - h.commute_covDerivIter_covDerivIter (LocalGaugeData.actionConj HiggsVec.gaugeAlgebraAction) h.barH - (LocalGaugeData.actionConj LeptonDoublet.gaugeAlgebraAction) (h.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 φ' + h.speciesBarH.commute_tower_tower (h.speciesBarL i) (fun t χ => h.barH_comm_barL t χ i) l φ l' φ' -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)) +lemma covBarH_comm_covE (φ : Module.Dual ℂ (ConjModule HiggsVec)) (φ' : Module.Dual ℂ LeptonSinglet) : Commute (h.covDerivBarH l φ) (h.covDerivE i l' φ') := - h.commute_covDerivIter_covDerivIter (LocalGaugeData.actionConj HiggsVec.gaugeAlgebraAction) h.barH - LeptonSinglet.gaugeAlgebraAction (h.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 φ' + h.speciesBarH.commute_tower_tower (h.speciesE i) (fun t χ => h.barH_comm_e t χ i) l φ l' φ' -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)) +lemma covBarH_comm_covBarE (φ : Module.Dual ℂ (ConjModule HiggsVec)) (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)) : Commute (h.covDerivBarH l φ) (h.covDerivBarE i l' φ') := - h.commute_covDerivIter_covDerivIter (LocalGaugeData.actionConj HiggsVec.gaugeAlgebraAction) h.barH - (LocalGaugeData.actionConj LeptonSinglet.gaugeAlgebraAction) (h.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 φ' + h.speciesBarH.commute_tower_tower (h.speciesBarE i) (fun t χ => h.barH_comm_bare t χ i) l φ l' φ' -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 φ) := - h.anticommute_covDerivIter_covDerivIter DownSinglet.gaugeAlgebraAction (h.d i) - DownSinglet.gaugeAlgebraAction (h.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 φ' +lemma covD_anticomm_covD (φ φ' : Module.Dual ℂ DownSinglet) : + h.covDerivD i l φ * h.covDerivD j l' φ' = -(h.covDerivD j l' φ' * h.covDerivD i l φ) := + (h.speciesD i).anticomm_tower_tower (h.speciesD j) (h.d_anticomm_d i j) l φ l' φ' -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) +lemma covD_anticomm_covBarD (φ : Module.Dual ℂ DownSinglet) (φ' : Module.Dual ℂ (ConjModule DownSinglet)) : - h.covDerivD i l φ * h.covDerivBarD j l' φ' = - -(h.covDerivBarD j l' φ' * h.covDerivD i l φ) := - h.anticommute_covDerivIter_covDerivIter DownSinglet.gaugeAlgebraAction (h.d i) - (LocalGaugeData.actionConj DownSinglet.gaugeAlgebraAction) (h.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 φ' + h.covDerivD i l φ * h.covDerivBarD j l' φ' = -(h.covDerivBarD j l' φ' * h.covDerivD i l φ) := + (h.speciesD i).anticomm_tower_tower (h.speciesBarD j) (h.d_anticomm_bard i j) l φ l' φ' -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 φ) := - h.anticommute_covDerivIter_covDerivIter DownSinglet.gaugeAlgebraAction (h.d i) - UpSinglet.gaugeAlgebraAction (h.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 φ' +lemma covD_anticomm_covU (φ : Module.Dual ℂ DownSinglet) (φ' : Module.Dual ℂ UpSinglet) : + h.covDerivD i l φ * h.covDerivU j l' φ' = -(h.covDerivU j l' φ' * h.covDerivD i l φ) := + (h.speciesD i).anticomm_tower_tower (h.speciesU j) (h.d_anticomm_u i j) l φ l' φ' -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) +lemma covD_anticomm_covBarU (φ : Module.Dual ℂ DownSinglet) (φ' : Module.Dual ℂ (ConjModule UpSinglet)) : - h.covDerivD i l φ * h.covDerivBarU j l' φ' = - -(h.covDerivBarU j l' φ' * h.covDerivD i l φ) := - h.anticommute_covDerivIter_covDerivIter DownSinglet.gaugeAlgebraAction (h.d i) - (LocalGaugeData.actionConj UpSinglet.gaugeAlgebraAction) (h.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 φ' + h.covDerivD i l φ * h.covDerivBarU j l' φ' = -(h.covDerivBarU j l' φ' * h.covDerivD i l φ) := + (h.speciesD i).anticomm_tower_tower (h.speciesBarU j) (h.d_anticomm_baru i j) l φ l' φ' -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 φ) := - h.anticommute_covDerivIter_covDerivIter DownSinglet.gaugeAlgebraAction (h.d i) - QuarkDoublet.gaugeAlgebraAction (h.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 φ' +lemma covD_anticomm_covQ (φ : Module.Dual ℂ DownSinglet) (φ' : Module.Dual ℂ QuarkDoublet) : + h.covDerivD i l φ * h.covDerivQ j l' φ' = -(h.covDerivQ j l' φ' * h.covDerivD i l φ) := + (h.speciesD i).anticomm_tower_tower (h.speciesQ j) (h.d_anticomm_Q i j) l φ l' φ' -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) +lemma covD_anticomm_covBarQ (φ : Module.Dual ℂ DownSinglet) (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)) : - h.covDerivD i l φ * h.covDerivBarQ j l' φ' = - -(h.covDerivBarQ j l' φ' * h.covDerivD i l φ) := - h.anticommute_covDerivIter_covDerivIter DownSinglet.gaugeAlgebraAction (h.d i) - (LocalGaugeData.actionConj QuarkDoublet.gaugeAlgebraAction) (h.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 φ' + h.covDerivD i l φ * h.covDerivBarQ j l' φ' = -(h.covDerivBarQ j l' φ' * h.covDerivD i l φ) := + (h.speciesD i).anticomm_tower_tower (h.speciesBarQ j) (h.d_anticomm_barQ i j) l φ l' φ' -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 φ) := - h.anticommute_covDerivIter_covDerivIter DownSinglet.gaugeAlgebraAction (h.d i) - LeptonDoublet.gaugeAlgebraAction (h.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 φ' +lemma covD_anticomm_covL (φ : Module.Dual ℂ DownSinglet) (φ' : Module.Dual ℂ LeptonDoublet) : + h.covDerivD i l φ * h.covDerivL j l' φ' = -(h.covDerivL j l' φ' * h.covDerivD i l φ) := + (h.speciesD i).anticomm_tower_tower (h.speciesL j) (h.d_anticomm_L i j) l φ l' φ' -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) +lemma covD_anticomm_covBarL (φ : Module.Dual ℂ DownSinglet) (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)) : - h.covDerivD i l φ * h.covDerivBarL j l' φ' = - -(h.covDerivBarL j l' φ' * h.covDerivD i l φ) := - h.anticommute_covDerivIter_covDerivIter DownSinglet.gaugeAlgebraAction (h.d i) - (LocalGaugeData.actionConj LeptonDoublet.gaugeAlgebraAction) (h.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 φ' + h.covDerivD i l φ * h.covDerivBarL j l' φ' = -(h.covDerivBarL j l' φ' * h.covDerivD i l φ) := + (h.speciesD i).anticomm_tower_tower (h.speciesBarL j) (h.d_anticomm_barL i j) l φ l' φ' -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 φ) := - h.anticommute_covDerivIter_covDerivIter DownSinglet.gaugeAlgebraAction (h.d i) - LeptonSinglet.gaugeAlgebraAction (h.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 φ' +lemma covD_anticomm_covE (φ : Module.Dual ℂ DownSinglet) (φ' : Module.Dual ℂ LeptonSinglet) : + h.covDerivD i l φ * h.covDerivE j l' φ' = -(h.covDerivE j l' φ' * h.covDerivD i l φ) := + (h.speciesD i).anticomm_tower_tower (h.speciesE j) (h.d_anticomm_e i j) l φ l' φ' -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) +lemma covD_anticomm_covBarE (φ : Module.Dual ℂ DownSinglet) (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)) : - h.covDerivD i l φ * h.covDerivBarE j l' φ' = - -(h.covDerivBarE j l' φ' * h.covDerivD i l φ) := - h.anticommute_covDerivIter_covDerivIter DownSinglet.gaugeAlgebraAction (h.d i) - (LocalGaugeData.actionConj LeptonSinglet.gaugeAlgebraAction) (h.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 φ' + h.covDerivD i l φ * h.covDerivBarE j l' φ' = -(h.covDerivBarE j l' φ' * h.covDerivD i l φ) := + (h.speciesD i).anticomm_tower_tower (h.speciesBarE j) (h.d_anticomm_bare i j) l φ l' φ' -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)) : +lemma covBarD_anticomm_covBarD (φ φ' : Module.Dual ℂ (ConjModule DownSinglet)) : h.covDerivBarD i l φ * h.covDerivBarD j l' φ' = -(h.covDerivBarD j l' φ' * h.covDerivBarD i l φ) := - h.anticommute_covDerivIter_covDerivIter (LocalGaugeData.actionConj DownSinglet.gaugeAlgebraAction) - (h.bard i) (LocalGaugeData.actionConj DownSinglet.gaugeAlgebraAction) (h.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 φ' + (h.speciesBarD i).anticomm_tower_tower (h.speciesBarD j) (h.bard_anticomm_bard i j) l φ l' φ' -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)) +lemma covBarD_anticomm_covU (φ : Module.Dual ℂ (ConjModule DownSinglet)) (φ' : Module.Dual ℂ UpSinglet) : - h.covDerivBarD i l φ * h.covDerivU j l' φ' = - -(h.covDerivU j l' φ' * h.covDerivBarD i l φ) := - h.anticommute_covDerivIter_covDerivIter (LocalGaugeData.actionConj DownSinglet.gaugeAlgebraAction) - (h.bard i) UpSinglet.gaugeAlgebraAction (h.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 φ' + h.covDerivBarD i l φ * h.covDerivU j l' φ' = -(h.covDerivU j l' φ' * h.covDerivBarD i l φ) := + (h.speciesBarD i).anticomm_tower_tower (h.speciesU j) (h.bard_anticomm_u i j) l φ l' φ' -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)) +lemma covBarD_anticomm_covBarU (φ : Module.Dual ℂ (ConjModule DownSinglet)) (φ' : Module.Dual ℂ (ConjModule UpSinglet)) : h.covDerivBarD i l φ * h.covDerivBarU j l' φ' = -(h.covDerivBarU j l' φ' * h.covDerivBarD i l φ) := - h.anticommute_covDerivIter_covDerivIter (LocalGaugeData.actionConj DownSinglet.gaugeAlgebraAction) - (h.bard i) (LocalGaugeData.actionConj UpSinglet.gaugeAlgebraAction) (h.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 φ' + (h.speciesBarD i).anticomm_tower_tower (h.speciesBarU j) (h.bard_anticomm_baru i j) l φ l' φ' -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)) +lemma covBarD_anticomm_covQ (φ : Module.Dual ℂ (ConjModule DownSinglet)) (φ' : Module.Dual ℂ QuarkDoublet) : - h.covDerivBarD i l φ * h.covDerivQ j l' φ' = - -(h.covDerivQ j l' φ' * h.covDerivBarD i l φ) := - h.anticommute_covDerivIter_covDerivIter (LocalGaugeData.actionConj DownSinglet.gaugeAlgebraAction) - (h.bard i) QuarkDoublet.gaugeAlgebraAction (h.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 φ' + h.covDerivBarD i l φ * h.covDerivQ j l' φ' = -(h.covDerivQ j l' φ' * h.covDerivBarD i l φ) := + (h.speciesBarD i).anticomm_tower_tower (h.speciesQ j) (h.bard_anticomm_Q i j) l φ l' φ' -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)) +lemma covBarD_anticomm_covBarQ (φ : Module.Dual ℂ (ConjModule DownSinglet)) (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)) : h.covDerivBarD i l φ * h.covDerivBarQ j l' φ' = -(h.covDerivBarQ j l' φ' * h.covDerivBarD i l φ) := - h.anticommute_covDerivIter_covDerivIter (LocalGaugeData.actionConj DownSinglet.gaugeAlgebraAction) - (h.bard i) (LocalGaugeData.actionConj QuarkDoublet.gaugeAlgebraAction) (h.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 φ' + (h.speciesBarD i).anticomm_tower_tower (h.speciesBarQ j) (h.bard_anticomm_barQ i j) l φ l' φ' -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)) +lemma covBarD_anticomm_covL (φ : Module.Dual ℂ (ConjModule DownSinglet)) (φ' : Module.Dual ℂ LeptonDoublet) : - h.covDerivBarD i l φ * h.covDerivL j l' φ' = - -(h.covDerivL j l' φ' * h.covDerivBarD i l φ) := - h.anticommute_covDerivIter_covDerivIter (LocalGaugeData.actionConj DownSinglet.gaugeAlgebraAction) - (h.bard i) LeptonDoublet.gaugeAlgebraAction (h.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 φ' + h.covDerivBarD i l φ * h.covDerivL j l' φ' = -(h.covDerivL j l' φ' * h.covDerivBarD i l φ) := + (h.speciesBarD i).anticomm_tower_tower (h.speciesL j) (h.bard_anticomm_L i j) l φ l' φ' -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)) +lemma covBarD_anticomm_covBarL (φ : Module.Dual ℂ (ConjModule DownSinglet)) (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)) : h.covDerivBarD i l φ * h.covDerivBarL j l' φ' = -(h.covDerivBarL j l' φ' * h.covDerivBarD i l φ) := - h.anticommute_covDerivIter_covDerivIter (LocalGaugeData.actionConj DownSinglet.gaugeAlgebraAction) - (h.bard i) (LocalGaugeData.actionConj LeptonDoublet.gaugeAlgebraAction) (h.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 φ' + (h.speciesBarD i).anticomm_tower_tower (h.speciesBarL j) (h.bard_anticomm_barL i j) l φ l' φ' -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)) +lemma covBarD_anticomm_covE (φ : Module.Dual ℂ (ConjModule DownSinglet)) (φ' : Module.Dual ℂ LeptonSinglet) : - h.covDerivBarD i l φ * h.covDerivE j l' φ' = - -(h.covDerivE j l' φ' * h.covDerivBarD i l φ) := - h.anticommute_covDerivIter_covDerivIter (LocalGaugeData.actionConj DownSinglet.gaugeAlgebraAction) - (h.bard i) LeptonSinglet.gaugeAlgebraAction (h.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 φ' + h.covDerivBarD i l φ * h.covDerivE j l' φ' = -(h.covDerivE j l' φ' * h.covDerivBarD i l φ) := + (h.speciesBarD i).anticomm_tower_tower (h.speciesE j) (h.bard_anticomm_e i j) l φ l' φ' -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)) +lemma covBarD_anticomm_covBarE (φ : Module.Dual ℂ (ConjModule DownSinglet)) (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)) : h.covDerivBarD i l φ * h.covDerivBarE j l' φ' = -(h.covDerivBarE j l' φ' * h.covDerivBarD i l φ) := - h.anticommute_covDerivIter_covDerivIter (LocalGaugeData.actionConj DownSinglet.gaugeAlgebraAction) - (h.bard i) (LocalGaugeData.actionConj LeptonSinglet.gaugeAlgebraAction) (h.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 φ' + (h.speciesBarD i).anticomm_tower_tower (h.speciesBarE j) (h.bard_anticomm_bare i j) l φ l' φ' -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 φ) := - h.anticommute_covDerivIter_covDerivIter UpSinglet.gaugeAlgebraAction (h.u i) - UpSinglet.gaugeAlgebraAction (h.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 φ' +lemma covU_anticomm_covU (φ φ' : Module.Dual ℂ UpSinglet) : + h.covDerivU i l φ * h.covDerivU j l' φ' = -(h.covDerivU j l' φ' * h.covDerivU i l φ) := + (h.speciesU i).anticomm_tower_tower (h.speciesU j) (h.u_anticomm_u i j) l φ l' φ' -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) +lemma covU_anticomm_covBarU (φ : Module.Dual ℂ UpSinglet) (φ' : Module.Dual ℂ (ConjModule UpSinglet)) : - h.covDerivU i l φ * h.covDerivBarU j l' φ' = - -(h.covDerivBarU j l' φ' * h.covDerivU i l φ) := - h.anticommute_covDerivIter_covDerivIter UpSinglet.gaugeAlgebraAction (h.u i) - (LocalGaugeData.actionConj UpSinglet.gaugeAlgebraAction) (h.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 φ' + h.covDerivU i l φ * h.covDerivBarU j l' φ' = -(h.covDerivBarU j l' φ' * h.covDerivU i l φ) := + (h.speciesU i).anticomm_tower_tower (h.speciesBarU j) (h.u_anticomm_baru i j) l φ l' φ' -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 φ) := - h.anticommute_covDerivIter_covDerivIter UpSinglet.gaugeAlgebraAction (h.u i) - QuarkDoublet.gaugeAlgebraAction (h.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 φ' +lemma covU_anticomm_covQ (φ : Module.Dual ℂ UpSinglet) (φ' : Module.Dual ℂ QuarkDoublet) : + h.covDerivU i l φ * h.covDerivQ j l' φ' = -(h.covDerivQ j l' φ' * h.covDerivU i l φ) := + (h.speciesU i).anticomm_tower_tower (h.speciesQ j) (h.u_anticomm_Q i j) l φ l' φ' -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) +lemma covU_anticomm_covBarQ (φ : Module.Dual ℂ UpSinglet) (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)) : - h.covDerivU i l φ * h.covDerivBarQ j l' φ' = - -(h.covDerivBarQ j l' φ' * h.covDerivU i l φ) := - h.anticommute_covDerivIter_covDerivIter UpSinglet.gaugeAlgebraAction (h.u i) - (LocalGaugeData.actionConj QuarkDoublet.gaugeAlgebraAction) (h.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 φ' + h.covDerivU i l φ * h.covDerivBarQ j l' φ' = -(h.covDerivBarQ j l' φ' * h.covDerivU i l φ) := + (h.speciesU i).anticomm_tower_tower (h.speciesBarQ j) (h.u_anticomm_barQ i j) l φ l' φ' -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 φ) := - h.anticommute_covDerivIter_covDerivIter UpSinglet.gaugeAlgebraAction (h.u i) - LeptonDoublet.gaugeAlgebraAction (h.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 φ' +lemma covU_anticomm_covL (φ : Module.Dual ℂ UpSinglet) (φ' : Module.Dual ℂ LeptonDoublet) : + h.covDerivU i l φ * h.covDerivL j l' φ' = -(h.covDerivL j l' φ' * h.covDerivU i l φ) := + (h.speciesU i).anticomm_tower_tower (h.speciesL j) (h.u_anticomm_L i j) l φ l' φ' -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) +lemma covU_anticomm_covBarL (φ : Module.Dual ℂ UpSinglet) (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)) : - h.covDerivU i l φ * h.covDerivBarL j l' φ' = - -(h.covDerivBarL j l' φ' * h.covDerivU i l φ) := - h.anticommute_covDerivIter_covDerivIter UpSinglet.gaugeAlgebraAction (h.u i) - (LocalGaugeData.actionConj LeptonDoublet.gaugeAlgebraAction) (h.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 φ' + h.covDerivU i l φ * h.covDerivBarL j l' φ' = -(h.covDerivBarL j l' φ' * h.covDerivU i l φ) := + (h.speciesU i).anticomm_tower_tower (h.speciesBarL j) (h.u_anticomm_barL i j) l φ l' φ' -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 φ) := - h.anticommute_covDerivIter_covDerivIter UpSinglet.gaugeAlgebraAction (h.u i) - LeptonSinglet.gaugeAlgebraAction (h.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 φ' +lemma covU_anticomm_covE (φ : Module.Dual ℂ UpSinglet) (φ' : Module.Dual ℂ LeptonSinglet) : + h.covDerivU i l φ * h.covDerivE j l' φ' = -(h.covDerivE j l' φ' * h.covDerivU i l φ) := + (h.speciesU i).anticomm_tower_tower (h.speciesE j) (h.u_anticomm_e i j) l φ l' φ' -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) +lemma covU_anticomm_covBarE (φ : Module.Dual ℂ UpSinglet) (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)) : - h.covDerivU i l φ * h.covDerivBarE j l' φ' = - -(h.covDerivBarE j l' φ' * h.covDerivU i l φ) := - h.anticommute_covDerivIter_covDerivIter UpSinglet.gaugeAlgebraAction (h.u i) - (LocalGaugeData.actionConj LeptonSinglet.gaugeAlgebraAction) (h.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 φ' + h.covDerivU i l φ * h.covDerivBarE j l' φ' = -(h.covDerivBarE j l' φ' * h.covDerivU i l φ) := + (h.speciesU i).anticomm_tower_tower (h.speciesBarE j) (h.u_anticomm_bare i j) l φ l' φ' -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)) : +lemma covBarU_anticomm_covBarU (φ φ' : Module.Dual ℂ (ConjModule UpSinglet)) : h.covDerivBarU i l φ * h.covDerivBarU j l' φ' = -(h.covDerivBarU j l' φ' * h.covDerivBarU i l φ) := - h.anticommute_covDerivIter_covDerivIter (LocalGaugeData.actionConj UpSinglet.gaugeAlgebraAction) - (h.baru i) (LocalGaugeData.actionConj UpSinglet.gaugeAlgebraAction) (h.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 φ' + (h.speciesBarU i).anticomm_tower_tower (h.speciesBarU j) (h.baru_anticomm_baru i j) l φ l' φ' -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)) +lemma covBarU_anticomm_covQ (φ : Module.Dual ℂ (ConjModule UpSinglet)) (φ' : Module.Dual ℂ QuarkDoublet) : - h.covDerivBarU i l φ * h.covDerivQ j l' φ' = - -(h.covDerivQ j l' φ' * h.covDerivBarU i l φ) := - h.anticommute_covDerivIter_covDerivIter (LocalGaugeData.actionConj UpSinglet.gaugeAlgebraAction) - (h.baru i) QuarkDoublet.gaugeAlgebraAction (h.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 φ' + h.covDerivBarU i l φ * h.covDerivQ j l' φ' = -(h.covDerivQ j l' φ' * h.covDerivBarU i l φ) := + (h.speciesBarU i).anticomm_tower_tower (h.speciesQ j) (h.baru_anticomm_Q i j) l φ l' φ' -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)) +lemma covBarU_anticomm_covBarQ (φ : Module.Dual ℂ (ConjModule UpSinglet)) (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)) : h.covDerivBarU i l φ * h.covDerivBarQ j l' φ' = -(h.covDerivBarQ j l' φ' * h.covDerivBarU i l φ) := - h.anticommute_covDerivIter_covDerivIter (LocalGaugeData.actionConj UpSinglet.gaugeAlgebraAction) - (h.baru i) (LocalGaugeData.actionConj QuarkDoublet.gaugeAlgebraAction) (h.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 φ' + (h.speciesBarU i).anticomm_tower_tower (h.speciesBarQ j) (h.baru_anticomm_barQ i j) l φ l' φ' -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)) +lemma covBarU_anticomm_covL (φ : Module.Dual ℂ (ConjModule UpSinglet)) (φ' : Module.Dual ℂ LeptonDoublet) : - h.covDerivBarU i l φ * h.covDerivL j l' φ' = - -(h.covDerivL j l' φ' * h.covDerivBarU i l φ) := - h.anticommute_covDerivIter_covDerivIter (LocalGaugeData.actionConj UpSinglet.gaugeAlgebraAction) - (h.baru i) LeptonDoublet.gaugeAlgebraAction (h.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 φ' + h.covDerivBarU i l φ * h.covDerivL j l' φ' = -(h.covDerivL j l' φ' * h.covDerivBarU i l φ) := + (h.speciesBarU i).anticomm_tower_tower (h.speciesL j) (h.baru_anticomm_L i j) l φ l' φ' -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)) +lemma covBarU_anticomm_covBarL (φ : Module.Dual ℂ (ConjModule UpSinglet)) (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)) : h.covDerivBarU i l φ * h.covDerivBarL j l' φ' = -(h.covDerivBarL j l' φ' * h.covDerivBarU i l φ) := - h.anticommute_covDerivIter_covDerivIter (LocalGaugeData.actionConj UpSinglet.gaugeAlgebraAction) - (h.baru i) (LocalGaugeData.actionConj LeptonDoublet.gaugeAlgebraAction) (h.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 φ' + (h.speciesBarU i).anticomm_tower_tower (h.speciesBarL j) (h.baru_anticomm_barL i j) l φ l' φ' -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)) +lemma covBarU_anticomm_covE (φ : Module.Dual ℂ (ConjModule UpSinglet)) (φ' : Module.Dual ℂ LeptonSinglet) : - h.covDerivBarU i l φ * h.covDerivE j l' φ' = - -(h.covDerivE j l' φ' * h.covDerivBarU i l φ) := - h.anticommute_covDerivIter_covDerivIter (LocalGaugeData.actionConj UpSinglet.gaugeAlgebraAction) - (h.baru i) LeptonSinglet.gaugeAlgebraAction (h.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 φ' + h.covDerivBarU i l φ * h.covDerivE j l' φ' = -(h.covDerivE j l' φ' * h.covDerivBarU i l φ) := + (h.speciesBarU i).anticomm_tower_tower (h.speciesE j) (h.baru_anticomm_e i j) l φ l' φ' -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)) +lemma covBarU_anticomm_covBarE (φ : Module.Dual ℂ (ConjModule UpSinglet)) (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)) : h.covDerivBarU i l φ * h.covDerivBarE j l' φ' = -(h.covDerivBarE j l' φ' * h.covDerivBarU i l φ) := - h.anticommute_covDerivIter_covDerivIter (LocalGaugeData.actionConj UpSinglet.gaugeAlgebraAction) - (h.baru i) (LocalGaugeData.actionConj LeptonSinglet.gaugeAlgebraAction) (h.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 φ' + (h.speciesBarU i).anticomm_tower_tower (h.speciesBarE j) (h.baru_anticomm_bare i j) l φ l' φ' -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 φ) := - h.anticommute_covDerivIter_covDerivIter QuarkDoublet.gaugeAlgebraAction (h.Q i) - QuarkDoublet.gaugeAlgebraAction (h.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 φ' +lemma covQ_anticomm_covQ (φ φ' : Module.Dual ℂ QuarkDoublet) : + h.covDerivQ i l φ * h.covDerivQ j l' φ' = -(h.covDerivQ j l' φ' * h.covDerivQ i l φ) := + (h.speciesQ i).anticomm_tower_tower (h.speciesQ j) (h.Q_anticomm_Q i j) l φ l' φ' -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) +lemma covQ_anticomm_covBarQ (φ : Module.Dual ℂ QuarkDoublet) (φ' : Module.Dual ℂ (ConjModule QuarkDoublet)) : - h.covDerivQ i l φ * h.covDerivBarQ j l' φ' = - -(h.covDerivBarQ j l' φ' * h.covDerivQ i l φ) := - h.anticommute_covDerivIter_covDerivIter QuarkDoublet.gaugeAlgebraAction (h.Q i) - (LocalGaugeData.actionConj QuarkDoublet.gaugeAlgebraAction) (h.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 φ' + h.covDerivQ i l φ * h.covDerivBarQ j l' φ' = -(h.covDerivBarQ j l' φ' * h.covDerivQ i l φ) := + (h.speciesQ i).anticomm_tower_tower (h.speciesBarQ j) (h.Q_anticomm_barQ i j) l φ l' φ' -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 φ) := - h.anticommute_covDerivIter_covDerivIter QuarkDoublet.gaugeAlgebraAction (h.Q i) - LeptonDoublet.gaugeAlgebraAction (h.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 φ' +lemma covQ_anticomm_covL (φ : Module.Dual ℂ QuarkDoublet) (φ' : Module.Dual ℂ LeptonDoublet) : + h.covDerivQ i l φ * h.covDerivL j l' φ' = -(h.covDerivL j l' φ' * h.covDerivQ i l φ) := + (h.speciesQ i).anticomm_tower_tower (h.speciesL j) (h.Q_anticomm_L i j) l φ l' φ' -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) +lemma covQ_anticomm_covBarL (φ : Module.Dual ℂ QuarkDoublet) (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)) : - h.covDerivQ i l φ * h.covDerivBarL j l' φ' = - -(h.covDerivBarL j l' φ' * h.covDerivQ i l φ) := - h.anticommute_covDerivIter_covDerivIter QuarkDoublet.gaugeAlgebraAction (h.Q i) - (LocalGaugeData.actionConj LeptonDoublet.gaugeAlgebraAction) (h.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 φ' + h.covDerivQ i l φ * h.covDerivBarL j l' φ' = -(h.covDerivBarL j l' φ' * h.covDerivQ i l φ) := + (h.speciesQ i).anticomm_tower_tower (h.speciesBarL j) (h.Q_anticomm_barL i j) l φ l' φ' -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 φ) := - h.anticommute_covDerivIter_covDerivIter QuarkDoublet.gaugeAlgebraAction (h.Q i) - LeptonSinglet.gaugeAlgebraAction (h.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 φ' +lemma covQ_anticomm_covE (φ : Module.Dual ℂ QuarkDoublet) (φ' : Module.Dual ℂ LeptonSinglet) : + h.covDerivQ i l φ * h.covDerivE j l' φ' = -(h.covDerivE j l' φ' * h.covDerivQ i l φ) := + (h.speciesQ i).anticomm_tower_tower (h.speciesE j) (h.Q_anticomm_e i j) l φ l' φ' -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) +lemma covQ_anticomm_covBarE (φ : Module.Dual ℂ QuarkDoublet) (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)) : - h.covDerivQ i l φ * h.covDerivBarE j l' φ' = - -(h.covDerivBarE j l' φ' * h.covDerivQ i l φ) := - h.anticommute_covDerivIter_covDerivIter QuarkDoublet.gaugeAlgebraAction (h.Q i) - (LocalGaugeData.actionConj LeptonSinglet.gaugeAlgebraAction) (h.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 φ' + h.covDerivQ i l φ * h.covDerivBarE j l' φ' = -(h.covDerivBarE j l' φ' * h.covDerivQ i l φ) := + (h.speciesQ i).anticomm_tower_tower (h.speciesBarE j) (h.Q_anticomm_bare i j) l φ l' φ' -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)) : +lemma covBarQ_anticomm_covBarQ (φ φ' : Module.Dual ℂ (ConjModule QuarkDoublet)) : h.covDerivBarQ i l φ * h.covDerivBarQ j l' φ' = -(h.covDerivBarQ j l' φ' * h.covDerivBarQ i l φ) := - h.anticommute_covDerivIter_covDerivIter - (LocalGaugeData.actionConj QuarkDoublet.gaugeAlgebraAction) - (h.barQ i) (LocalGaugeData.actionConj QuarkDoublet.gaugeAlgebraAction) (h.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 φ' + (h.speciesBarQ i).anticomm_tower_tower (h.speciesBarQ j) (h.barQ_anticomm_barQ i j) l φ l' φ' -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)) +lemma covBarQ_anticomm_covL (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) (φ' : Module.Dual ℂ LeptonDoublet) : - h.covDerivBarQ i l φ * h.covDerivL j l' φ' = - -(h.covDerivL j l' φ' * h.covDerivBarQ i l φ) := - h.anticommute_covDerivIter_covDerivIter - (LocalGaugeData.actionConj QuarkDoublet.gaugeAlgebraAction) - (h.barQ i) LeptonDoublet.gaugeAlgebraAction (h.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 φ' + h.covDerivBarQ i l φ * h.covDerivL j l' φ' = -(h.covDerivL j l' φ' * h.covDerivBarQ i l φ) := + (h.speciesBarQ i).anticomm_tower_tower (h.speciesL j) (h.barQ_anticomm_L i j) l φ l' φ' -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)) +lemma covBarQ_anticomm_covBarL (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)) : h.covDerivBarQ i l φ * h.covDerivBarL j l' φ' = -(h.covDerivBarL j l' φ' * h.covDerivBarQ i l φ) := - h.anticommute_covDerivIter_covDerivIter - (LocalGaugeData.actionConj QuarkDoublet.gaugeAlgebraAction) - (h.barQ i) (LocalGaugeData.actionConj LeptonDoublet.gaugeAlgebraAction) (h.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 φ' + (h.speciesBarQ i).anticomm_tower_tower (h.speciesBarL j) (h.barQ_anticomm_barL i j) l φ l' φ' -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)) +lemma covBarQ_anticomm_covE (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) (φ' : Module.Dual ℂ LeptonSinglet) : - h.covDerivBarQ i l φ * h.covDerivE j l' φ' = - -(h.covDerivE j l' φ' * h.covDerivBarQ i l φ) := - h.anticommute_covDerivIter_covDerivIter - (LocalGaugeData.actionConj QuarkDoublet.gaugeAlgebraAction) - (h.barQ i) LeptonSinglet.gaugeAlgebraAction (h.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 φ' + h.covDerivBarQ i l φ * h.covDerivE j l' φ' = -(h.covDerivE j l' φ' * h.covDerivBarQ i l φ) := + (h.speciesBarQ i).anticomm_tower_tower (h.speciesE j) (h.barQ_anticomm_e i j) l φ l' φ' -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)) +lemma covBarQ_anticomm_covBarE (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)) : h.covDerivBarQ i l φ * h.covDerivBarE j l' φ' = -(h.covDerivBarE j l' φ' * h.covDerivBarQ i l φ) := - h.anticommute_covDerivIter_covDerivIter - (LocalGaugeData.actionConj QuarkDoublet.gaugeAlgebraAction) - (h.barQ i) (LocalGaugeData.actionConj LeptonSinglet.gaugeAlgebraAction) (h.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 φ' + (h.speciesBarQ i).anticomm_tower_tower (h.speciesBarE j) (h.barQ_anticomm_bare i j) l φ l' φ' -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 φ) := - h.anticommute_covDerivIter_covDerivIter LeptonDoublet.gaugeAlgebraAction (h.L i) - LeptonDoublet.gaugeAlgebraAction (h.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 φ' +lemma covL_anticomm_covL (φ φ' : Module.Dual ℂ LeptonDoublet) : + h.covDerivL i l φ * h.covDerivL j l' φ' = -(h.covDerivL j l' φ' * h.covDerivL i l φ) := + (h.speciesL i).anticomm_tower_tower (h.speciesL j) (h.L_anticomm_L i j) l φ l' φ' -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) +lemma covL_anticomm_covBarL (φ : Module.Dual ℂ LeptonDoublet) (φ' : Module.Dual ℂ (ConjModule LeptonDoublet)) : - h.covDerivL i l φ * h.covDerivBarL j l' φ' = - -(h.covDerivBarL j l' φ' * h.covDerivL i l φ) := - h.anticommute_covDerivIter_covDerivIter LeptonDoublet.gaugeAlgebraAction (h.L i) - (LocalGaugeData.actionConj LeptonDoublet.gaugeAlgebraAction) (h.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 φ' + h.covDerivL i l φ * h.covDerivBarL j l' φ' = -(h.covDerivBarL j l' φ' * h.covDerivL i l φ) := + (h.speciesL i).anticomm_tower_tower (h.speciesBarL j) (h.L_anticomm_barL i j) l φ l' φ' -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 φ) := - h.anticommute_covDerivIter_covDerivIter LeptonDoublet.gaugeAlgebraAction (h.L i) - LeptonSinglet.gaugeAlgebraAction (h.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 φ' +lemma covL_anticomm_covE (φ : Module.Dual ℂ LeptonDoublet) (φ' : Module.Dual ℂ LeptonSinglet) : + h.covDerivL i l φ * h.covDerivE j l' φ' = -(h.covDerivE j l' φ' * h.covDerivL i l φ) := + (h.speciesL i).anticomm_tower_tower (h.speciesE j) (h.L_anticomm_e i j) l φ l' φ' -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) +lemma covL_anticomm_covBarE (φ : Module.Dual ℂ LeptonDoublet) (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)) : - h.covDerivL i l φ * h.covDerivBarE j l' φ' = - -(h.covDerivBarE j l' φ' * h.covDerivL i l φ) := - h.anticommute_covDerivIter_covDerivIter LeptonDoublet.gaugeAlgebraAction (h.L i) - (LocalGaugeData.actionConj LeptonSinglet.gaugeAlgebraAction) (h.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 φ' + h.covDerivL i l φ * h.covDerivBarE j l' φ' = -(h.covDerivBarE j l' φ' * h.covDerivL i l φ) := + (h.speciesL i).anticomm_tower_tower (h.speciesBarE j) (h.L_anticomm_bare i j) l φ l' φ' -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)) : +lemma covBarL_anticomm_covBarL (φ φ' : Module.Dual ℂ (ConjModule LeptonDoublet)) : h.covDerivBarL i l φ * h.covDerivBarL j l' φ' = -(h.covDerivBarL j l' φ' * h.covDerivBarL i l φ) := - h.anticommute_covDerivIter_covDerivIter - (LocalGaugeData.actionConj LeptonDoublet.gaugeAlgebraAction) - (h.barL i) (LocalGaugeData.actionConj LeptonDoublet.gaugeAlgebraAction) (h.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 φ' + (h.speciesBarL i).anticomm_tower_tower (h.speciesBarL j) (h.barL_anticomm_barL i j) l φ l' φ' -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)) +lemma covBarL_anticomm_covE (φ : Module.Dual ℂ (ConjModule LeptonDoublet)) (φ' : Module.Dual ℂ LeptonSinglet) : - h.covDerivBarL i l φ * h.covDerivE j l' φ' = - -(h.covDerivE j l' φ' * h.covDerivBarL i l φ) := - h.anticommute_covDerivIter_covDerivIter - (LocalGaugeData.actionConj LeptonDoublet.gaugeAlgebraAction) - (h.barL i) LeptonSinglet.gaugeAlgebraAction (h.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 φ' + h.covDerivBarL i l φ * h.covDerivE j l' φ' = -(h.covDerivE j l' φ' * h.covDerivBarL i l φ) := + (h.speciesBarL i).anticomm_tower_tower (h.speciesE j) (h.barL_anticomm_e i j) l φ l' φ' -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)) +lemma covBarL_anticomm_covBarE (φ : Module.Dual ℂ (ConjModule LeptonDoublet)) (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)) : h.covDerivBarL i l φ * h.covDerivBarE j l' φ' = -(h.covDerivBarE j l' φ' * h.covDerivBarL i l φ) := - h.anticommute_covDerivIter_covDerivIter - (LocalGaugeData.actionConj LeptonDoublet.gaugeAlgebraAction) - (h.barL i) (LocalGaugeData.actionConj LeptonSinglet.gaugeAlgebraAction) (h.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 φ' + (h.speciesBarL i).anticomm_tower_tower (h.speciesBarE j) (h.barL_anticomm_bare i j) l φ l' φ' -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 φ) := - h.anticommute_covDerivIter_covDerivIter LeptonSinglet.gaugeAlgebraAction (h.e i) - LeptonSinglet.gaugeAlgebraAction (h.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 φ' +lemma covE_anticomm_covE (φ φ' : Module.Dual ℂ LeptonSinglet) : + h.covDerivE i l φ * h.covDerivE j l' φ' = -(h.covDerivE j l' φ' * h.covDerivE i l φ) := + (h.speciesE i).anticomm_tower_tower (h.speciesE j) (h.e_anticomm_e i j) l φ l' φ' -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) +lemma covE_anticomm_covBarE (φ : Module.Dual ℂ LeptonSinglet) (φ' : Module.Dual ℂ (ConjModule LeptonSinglet)) : - h.covDerivE i l φ * h.covDerivBarE j l' φ' = - -(h.covDerivBarE j l' φ' * h.covDerivE i l φ) := - h.anticommute_covDerivIter_covDerivIter LeptonSinglet.gaugeAlgebraAction (h.e i) - (LocalGaugeData.actionConj LeptonSinglet.gaugeAlgebraAction) (h.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 φ' + h.covDerivE i l φ * h.covDerivBarE j l' φ' = -(h.covDerivBarE j l' φ' * h.covDerivE i l φ) := + (h.speciesE i).anticomm_tower_tower (h.speciesBarE j) (h.e_anticomm_bare i j) l φ l' φ' -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)) : +lemma covBarE_anticomm_covBarE (φ φ' : Module.Dual ℂ (ConjModule LeptonSinglet)) : h.covDerivBarE i l φ * h.covDerivBarE j l' φ' = -(h.covDerivBarE j l' φ' * h.covDerivBarE i l φ) := - h.anticommute_covDerivIter_covDerivIter - (LocalGaugeData.actionConj LeptonSinglet.gaugeAlgebraAction) - (h.bare i) (LocalGaugeData.actionConj LeptonSinglet.gaugeAlgebraAction) (h.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 φ' + (h.speciesBarE i).anticomm_tower_tower (h.speciesBarE j) (h.bare_anticomm_bare i j) l φ l' φ' +end /-! -## K. The Lorentz law of the field-strength tower +## J. The Lorentz law of the field-strength tower -The Lorentz laws of the -matter towers are section L of [`CovariantDeriv.lean`](CovariantDeriv.lean); the one for -the field-strength tower is `repLorentz_covF` just below, which is +The Lorentz laws of the matter towers are section L of +[`CovariantDeriv.lean`](CovariantDeriv.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 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. -/ From e85dce854718f89f13548fd2368414762b644b53 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 8 Sep 2026 20:12:52 +0100 Subject: [PATCH 302/367] refactor: shorten IsGaugeSector/MassWeight/MassDimEight Co-Authored-By: Claude Fable 5.1 --- .../MassWeight/MassDimEight.lean | 3107 ++++++----------- 1 file changed, 987 insertions(+), 2120 deletions(-) diff --git a/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/MassDimEight.lean b/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/MassDimEight.lean index 2da990622..ec861f004 100644 --- a/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/MassDimEight.lean +++ b/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/MassDimEight.lean @@ -21,48 +21,38 @@ algebra, so a product of two of them carries two. Restricting the value index to 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. - -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 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 +`IsU1BiAdjoint`. The gauge invariant those propositions supply is the trace contraction, +the Kronecker contraction of the two adjoint indices, the familiar kinetic pairing of two +field strengths; it has mass weight eight and is fixed by the whole gauge group. + +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, and what does not is +either a hypercharge invariant or carries an unpaired adjoint index of a non-abelian +factor, which contributes nothing by `IsSU3Adjoint` and `IsSU2Adjoint`. 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. Both shapes 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. + +- A. Spans, stability and peeling +- B. The gauge transformation of the gauge-factor field strengths +- C. Products of two underived field strengths as bi-adjoint families +- D. The weight vectors of mass weight eight inside the bi-adjoint spans +- E. The zero-weight piece of mass weight eight +- F. The unpaired non-abelian adjoint indices - 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 +- I. The Lorentz contraction span 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 +Both classifications are one-directional as stated, and the converse is that each span +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`. -/ @@ -90,7 +80,198 @@ variable {B : Type} [Ring B] [Algebra ℂ B] /-! -## A. The gauge transformation of the gauge-factor field strengths +## A. Spans, stability and peeling + +Every subspace in this file is the span `⨆ i, ℂ ∙ T i` of a finite family, and the +arguments about them reduce to a few facts about such spans. A span lies in a submodule as +soon as its generators do; a linear map carrying each generator into a submodule carries +the whole span there, and one fixing each generator fixes the span pointwise. Stability +under a linear map, and being fixed pointwise by it, pass to joins. + +Peeling is the induction that runs the classification. A family `V i` of stable +submodules, each of which can be peeled off any stable submodule `S` leaving an invariant +remainder in `S` and a difference in `W i`, can be peeled off all at once: an invariant of +`(⨆ i, V i) ⊔ S` is an invariant of `S` up to an element of `⨆ i, W i`. The bi-adjoint +families are peeled with `W i` the line through the trace contraction, the adjoint +families with `W i = ⊥`, and a submodule fixed pointwise is peeled with `W = V`. + +-/ + +/-- A span lies in a submodule as soon as its generators do. -/ +lemma iSup_span_singleton_le {ι : Sort*} (T : ι → B) {V : Submodule ℂ B} + (hV : ∀ i, T i ∈ V) : (⨆ i, ℂ ∙ T i) ≤ V := + iSup_le fun i => (Submodule.span_singleton_le_iff_mem _ _).2 (hV i) + +/-- A generator of a family with three indices lies in its span. -/ +lemma mem_iSup_span₃ {α β γ : Sort*} (T : α → β → γ → B) (a : α) (b : β) (c : γ) : + T a b c ∈ ⨆ (a) (b) (c), ℂ ∙ T a b c := + Submodule.mem_iSup_of_mem a (Submodule.mem_iSup_of_mem b + (Submodule.mem_iSup_of_mem c (Submodule.mem_span_singleton_self _))) + +/-- A combination of the generators lies in the span. -/ +lemma sum_smul_mem_iSup_span {ι : Type} [Fintype ι] (T : ι → B) (c : ι → ℂ) : + ∑ i, c i • T i ∈ ⨆ i, ℂ ∙ T i := + (Family.mem_iSup_span_singleton_iff T _).2 ⟨c, rfl⟩ + +/-- A linear map carrying each generator into a submodule carries the span there. -/ +lemma map_mem_of_mem_iSup_span {ι : Sort*} (T : ι → B) (f : B →ₗ[ℂ] B) {V : Submodule ℂ B} + (hf : ∀ i, f (T i) ∈ V) : ∀ y ∈ ⨆ i, ℂ ∙ T i, f y ∈ V := + fun _ hy => iSup_span_singleton_le T (V := V.comap f) hf hy + +/-- A linear map moving each generator to a combination of the generators carries the span + into itself; the transformation laws of this file all have this shape. -/ +lemma span_stable_of_map_eq_sum {ι : Type} [Fintype ι] (T : ι → B) (f : B →ₗ[ℂ] B) + {c : ι → ι → ℂ} (hf : ∀ l, f (T l) = ∑ a, c a l • T a) : + ∀ y ∈ ⨆ i, ℂ ∙ T i, f y ∈ ⨆ i, ℂ ∙ T i := + map_mem_of_mem_iSup_span T f fun l => by + rw [hf l] + exact sum_smul_mem_iSup_span T _ + +/-- A linear map fixing each generator fixes the span pointwise. -/ +lemma map_eq_self_of_mem_iSup_span {ι : Sort*} (T : ι → B) (f : B →ₗ[ℂ] B) + (hf : ∀ i, f (T i) = T i) : ∀ y ∈ ⨆ i, ℂ ∙ T i, f y = y := fun _ hy => + LinearMap.mem_eqLocus.1 (iSup_span_singleton_le T (V := LinearMap.eqLocus f LinearMap.id) + (fun i => LinearMap.mem_eqLocus.2 (hf i)) hy) + +/-- Being fixed pointwise passes to a join. -/ +lemma fixed_sup {V S : Submodule ℂ B} {f : B →ₗ[ℂ] B} (hV : ∀ y ∈ V, f y = y) + (hS : ∀ y ∈ S, f y = y) : ∀ y ∈ V ⊔ S, f y = y := fun _ hy => + LinearMap.mem_eqLocus.1 ((sup_le (fun _ hz => LinearMap.mem_eqLocus.2 (hV _ hz)) + fun _ hz => LinearMap.mem_eqLocus.2 (hS _ hz) : + V ⊔ S ≤ LinearMap.eqLocus f LinearMap.id) hy) + +/-- Being fixed pointwise passes to the join of a family. -/ +lemma fixed_iSup {ι : Sort*} {V : ι → Submodule ℂ B} {f : B →ₗ[ℂ] B} + (hV : ∀ i, ∀ y ∈ V i, f y = y) : ∀ y ∈ ⨆ i, V i, f y = y := fun _ hy => + LinearMap.mem_eqLocus.1 ((iSup_le fun i _ hz => LinearMap.mem_eqLocus.2 (hV i _ hz) : + (⨆ i, V i) ≤ LinearMap.eqLocus f LinearMap.id) hy) + +/-- A submodule fixed pointwise is stable. -/ +lemma stable_of_fixed {V : Submodule ℂ B} {f : B →ₗ[ℂ] B} (hV : ∀ y ∈ V, f y = y) : + ∀ y ∈ V, f y ∈ V := fun y hy => by rwa [hV y hy] + +/-- Stability passes to a join. -/ +lemma sup_stable {V S : Submodule ℂ B} {f : B →ₗ[ℂ] B} (hV : ∀ y ∈ V, f y ∈ V) + (hS : ∀ y ∈ S, f y ∈ S) : ∀ y ∈ V ⊔ S, f y ∈ V ⊔ S := fun _ hy => + (sup_le (fun _ hz => Submodule.mem_sup_left (hV _ hz)) + (fun _ hz => Submodule.mem_sup_right (hS _ hz)) : V ⊔ S ≤ (V ⊔ S).comap f) hy + +/-- Stability passes to the join of a family. -/ +lemma iSup_stable {ι : Sort*} {V : ι → Submodule ℂ B} {f : B →ₗ[ℂ] B} + (hV : ∀ i, ∀ y ∈ V i, f y ∈ V i) : ∀ y ∈ ⨆ i, V i, f y ∈ ⨆ i, V i := fun _ hy => + (iSup_le fun i _ hz => Submodule.mem_iSup_of_mem i (hV i _ hz) : + (⨆ i, V i) ≤ (⨆ i, V i).comap f) hy + +/-- Splitting off a submodule fixed pointwise: the remainder is invariant for free, being + the difference of two invariants. -/ +lemma exists_mem_of_invariant_sup_fixed {G : Type} (φ : G → B →ₗ[ℂ] B) (V S : Submodule ℂ B) + (hV : ∀ g, ∀ v ∈ V, φ g v = v) {x : B} (hx : x ∈ V ⊔ S) (hinv : ∀ g, φ g x = x) : + ∃ y ∈ S, (∀ g, φ g y = y) ∧ x - y ∈ V := by + obtain ⟨u, hu, z, hz, rfl⟩ := Submodule.mem_sup.1 hx + refine ⟨z, hz, fun g => ?_, by simpa using hu⟩ + have hg := hinv g + rwa [map_add, hV g u hu, add_right_inj] at hg + +/-- The form in which the bi-adjoint sup lemmas peel one family off: the remainder is what + is left after a multiple of the invariant vector `v` is taken away. -/ +lemma exists_sub_mem_span_singleton {G : Type} {φ : G → B →ₗ[ℂ] B} {S : Submodule ℂ B} {x v : B} + (hx : ∃ c : ℂ, ∃ y ∈ S, x = c • v + y ∧ ∀ g, φ g y = y) : + ∃ y ∈ S, (∀ g, φ g y = y) ∧ x - y ∈ ℂ ∙ v := by + obtain ⟨c, y, hyS, rfl, hyinv⟩ := hx + refine ⟨y, hyS, hyinv, ?_⟩ + rw [add_sub_cancel_right] + exact Submodule.smul_mem _ _ (Submodule.mem_span_singleton_self _) + +/-- Peeling a finite join of families off a stable submodule, one family at a time. Each + `V i` is stable and can be peeled off any stable submodule, leaving an invariant + remainder there and a difference in `W i`; the join is then peeled off all at once. -/ +lemma exists_mem_of_invariant_iSup_sup {G ι : Type} [Fintype ι] (φ : G → B →ₗ[ℂ] B) + (V W : ι → Submodule ℂ B) (hV : ∀ i g, ∀ y ∈ V i, φ g y ∈ V i) + (hpeel : ∀ (i : ι) (S : Submodule ℂ B), (∀ g, ∀ y ∈ S, φ g y ∈ S) → ∀ x ∈ V i ⊔ S, + (∀ g, φ g x = x) → ∃ y ∈ S, (∀ g, φ g y = y) ∧ x - y ∈ W i) + (S : Submodule ℂ B) (hS : ∀ g, ∀ y ∈ S, φ g y ∈ S) {x : B} (hx : x ∈ (⨆ i, V i) ⊔ S) + (hinv : ∀ g, φ g x = x) : ∃ y ∈ S, (∀ g, φ g y = y) ∧ x - y ∈ ⨆ i, W i := by + classical + suffices key : ∀ s : Finset ι, ∀ x ∈ (⨆ i ∈ s, V i) ⊔ S, (∀ g, φ g x = x) → + ∃ y ∈ S, (∀ g, φ g y = y) ∧ x - y ∈ ⨆ i ∈ s, W i by + simpa using key Finset.univ x (by simpa using hx) hinv + intro s + induction s using Finset.induction_on with + | empty => exact fun x hx hinv => ⟨x, by simpa using hx, hinv, by simp⟩ + | insert a s _ ih => + intro x hx hinv + rw [Finset.iSup_insert, sup_assoc] at hx + have hstab : ∀ g, ∀ y ∈ (⨆ i ∈ s, V i) ⊔ S, φ g y ∈ (⨆ i ∈ s, V i) ⊔ S := + fun g => sup_stable (iSup_stable fun i => iSup_stable fun _ => hV i g) (hS g) + obtain ⟨y', hy', hy'inv, hxy'⟩ := hpeel a _ hstab x hx hinv + obtain ⟨y, hyS, hyinv, hy'y⟩ := ih y' hy' hy'inv + refine ⟨y, hyS, hyinv, ?_⟩ + rw [Finset.iSup_insert, show x - y = (x - y') + (y' - y) from by abel] + exact Submodule.add_mem _ (Submodule.mem_sup_left hxy') (Submodule.mem_sup_right hy'y) + +/-- Peeling families with no invariants at all off a stable submodule leaves nothing. -/ +lemma mem_of_invariant_iSup_sup {G ι : Type} [Fintype ι] (φ : G → B →ₗ[ℂ] B) + (V : ι → Submodule ℂ B) (hV : ∀ i g, ∀ y ∈ V i, φ g y ∈ V i) + (hpeel : ∀ (i : ι) (S : Submodule ℂ B), (∀ g, ∀ y ∈ S, φ g y ∈ S) → ∀ x ∈ V i ⊔ S, + (∀ g, φ g x = x) → x ∈ S) + (S : Submodule ℂ B) (hS : ∀ g, ∀ y ∈ S, φ g y ∈ S) {x : B} (hx : x ∈ (⨆ i, V i) ⊔ S) + (hinv : ∀ g, φ g x = x) : x ∈ S := by + obtain ⟨y, hyS, -, hxy⟩ := exists_mem_of_invariant_iSup_sup φ V (fun _ => ⊥) hV + (fun i S hS x hx hinv => ⟨x, hpeel i S hS x hx hinv, hinv, by simp⟩) S hS hx hinv + rw [iSup_bot, Submodule.mem_bot, sub_eq_zero] at hxy + exact hxy ▸ hyS + +/-- The product of two lines lies in a submodule as soon as the product of the two + generators does. -/ +lemma span_singleton_mul_span_singleton_le {a b : B} {V : Submodule ℂ B} (hab : a * b ∈ V) : + (ℂ ∙ a) * (ℂ ∙ b) ≤ V := by + rw [Submodule.span_mul_span, Set.singleton_mul_singleton] + exact (Submodule.span_singleton_le_iff_mem _ _).2 hab + +/-- The product of two spans lies in a submodule as soon as the products of their + generators do. -/ +lemma iSup_span_mul_iSup_span_le {α β γ α' β' γ' : Sort*} (T : α → β → γ → B) + (T' : α' → β' → γ' → B) {V : Submodule ℂ B} (hV : ∀ a b c a' b' c', T a b c * T' a' b' c' ∈ V) : + (⨆ (a) (b) (c), ℂ ∙ T a b c) * (⨆ (a) (b) (c), ℂ ∙ T' a b c) ≤ V := by + simp only [Submodule.iSup_mul, Submodule.mul_iSup] + refine iSup_le fun _ => iSup_le fun _ => iSup_le fun _ => iSup_le fun _ => iSup_le fun _ => + iSup_le fun _ => ?_ + exact span_singleton_mul_span_singleton_le (hV _ _ _ _ _ _) + +/-- A product of two combinations is a combination indexed by pairs. -/ +lemma sum_mul_sum_eq_sum_pi_two {k : ℕ} (c₀ c₁ : Fin k → ℂ) (X Y : Fin k → B) : + (∑ a, c₀ a • X a) * ∑ b, c₁ b • Y b + = ∑ d : Fin 2 → Fin k, (c₀ (d 0) * c₁ (d 1)) • (X (d 0) * Y (d 1)) := by + rw [Fintype.sum_mul_sum, Family.sum_pi_two] + refine Finset.sum_congr rfl fun x _ => Finset.sum_congr rfl fun y _ => ?_ + rw [smul_mul_smul_comm] + simp + +/-- A multiplicative map moving a family by a matrix and fixing a vector moves the + products of the family with that vector by the same matrix. -/ +lemma map_mul_fixed_eq_sum {k : ℕ} {f : B →ₗ[ℂ] B} (hf : ∀ x y, f (x * y) = f x * f y) + {c : Fin k → Fin k → ℂ} {T : Fin k → B} (hT : ∀ l, f (T l) = ∑ a, c a l • T a) {v : B} + (hv : f v = v) (l : Fin k) : f (T l * v) = ∑ a, c a l • (T a * v) := by + rw [hf, hT, hv, Finset.sum_mul] + exact Finset.sum_congr rfl fun a _ => smul_mul_assoc _ _ _ + +/-- The mirror of `map_mul_fixed_eq_sum` with the fixed vector on the left. -/ +lemma map_fixed_mul_eq_sum {k : ℕ} {f : B →ₗ[ℂ] B} (hf : ∀ x y, f (x * y) = f x * f y) + {c : Fin k → Fin k → ℂ} {T : Fin k → B} (hT : ∀ l, f (T l) = ∑ a, c a l • T a) {v : B} + (hv : f v = v) (l : Fin k) : f (v * T l) = ∑ a, c a l • (v * T a) := by + rw [hf, hT, hv, Finset.mul_sum] + exact Finset.sum_congr rfl fun a _ => mul_smul_comm _ _ _ + +/-! + +## B. The gauge transformation of the gauge-factor field strengths + +The gauge law of `IsGaugeSector` moves the field-strength symbol by the coadjoint action of +the gauge group on its argument, which on the standard basis coordinates is the adjoint +matrix. That matrix is block diagonal, so the gluon field strengths transform among +themselves by the `su(3)` adjoint matrix of the colour factor, the `W`-boson field +strengths by the `su(2)` adjoint matrix of the isospin factor, and the hypercharge field +strength is fixed. The colour factor alone fixes the `W`-boson field strengths as well. -/ @@ -114,7 +295,7 @@ lemma repGauge_F_coord (g : GaugeGroupI) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 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) : ℝ) : ℂ) • + = ∑ a : Fin 8, ((su3AdjointMatrix (GaugeGroupI.toSU3 g) a 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] @@ -125,8 +306,8 @@ lemma repGauge_gluonField (g : GaugeGroupI) {n : ℕ} (l : Fin n → Fin 1 ⊕ F 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 + = ∑ i : Fin 3, ((su2AdjointMatrix (GaugeGroupI.toSU2 g) i 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] @@ -140,96 +321,156 @@ lemma repGauge_hyperchargeField (g : GaugeGroupI) {n : ℕ} (l : Fin n → Fin 1 Fintype.sum_sum_type, Fintype.sum_sum_type] simp +/-- The `W`-boson field strengths are fixed by the colour factor of the gauge group: the + `su(2)` block of the adjoint matrix 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, su2AdjointMatrix (GaugeGroupI.toSU2 ((U, 1, 1) : GaugeGroupI)) j i + = if j = i then 1 else 0 := by + intro j + rw [show su2AdjointMatrix (GaugeGroupI.toSU2 ((U, 1, 1) : GaugeGroupI)) j i + = GaugeAlgebra.adjointMatrix (1 : GaugeGroupI) (Sum.inr (Sum.inl j)) + (Sum.inr (Sum.inl i)) from rfl, GaugeAlgebra.adjointMatrix_one, Matrix.one_apply] + simp + simp only [hM] + simp + +/-- 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 (h.gluonField l μ ν) := + ⟨fun U c => h.repGauge_gluonField (U, 1, 1) 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 (h.wField l μ ν) := + ⟨fun U c => h.repGauge_wField (1, U, 1) l μ ν c⟩ + /-! -## B. Products of two field strengths as bi-adjoint families +## C. Products of two underived field strengths as bi-adjoint families + +A product of two underived field strengths of one gauge factor, at the four covector +indices `p`, is a family indexed by the two adjoint indices of that factor, and by section +B and the multiplicativity of the gauge action it is a bi-adjoint family in the sense of +`IsSU3BiAdjoint`, `IsSU2BiAdjoint` and `IsU1BiAdjoint`, with the transformation law +holding at every gauge element and not only at those of its own factor. Its trace +contraction, the Kronecker contraction of the two adjoint indices, is fixed by the whole +gauge group and has mass weight eight, the sum of the mass weights of its two factors; so +is the twice-derived hypercharge field strength, the other shape of mass weight eight. -/ -/-- 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 - 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 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)) := - ⟨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 - 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 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' μ' ν') := +/-- The index of a product of two underived field strengths: the two covector indices of + the first factor followed by the two 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 product of two underived gluon field strengths at the covector indices `p`, indexed + by the two `su(3)` adjoint indices it carries. -/ +noncomputable def gluonPair (p : EightIdx) (a : Fin 2 → Fin 8) : B := + h.gluonField ![] (p 0) (p 1) (a 0) * h.gluonField ![] (p 2) (p 3) (a 1) + +/-- The product of two underived `W`-boson field strengths at the covector indices `p`, + indexed by the two `su(2)` adjoint indices it carries. -/ +noncomputable def wPair (p : EightIdx) (a : Fin 2 → Fin 3) : B := + h.wField ![] (p 0) (p 1) (a 0) * h.wField ![] (p 2) (p 3) (a 1) + +/-- The product of two underived hypercharge field strengths at the covector indices `p`, + indexed by the two `u(1)` adjoint indices it carries. -/ +noncomputable def hyperchargePair (p : EightIdx) (_ : Fin 2 → Fin 1) : B := + h.hyperchargeField ![] (p 0) (p 1) * h.hyperchargeField ![] (p 2) (p 3) + +/-- The twice-derived hypercharge field strength at the derivative slots `d 0`, `d 1` and + the covector indices `d 2`, `d 3`. -/ +noncomputable def hyperchargeDeriv (d : EightIdx) : B := + h.hyperchargeField ![d 0, d 1] (d 2) (d 3) + +/-- A gauge transformation moves a gluon pair as the `SU(3)` factor of that gauge group + element moves a tensor with two `su(3)` adjoint indices. -/ +lemma isSU3BiAdjointMat_gluonPair (p : EightIdx) (g : GaugeGroupI) : + IsSU3BiAdjointMat (GaugeGroupI.toSU3 g) (repGauge g) (h.gluonPair p) := fun _ => by + simp only [gluonPair, hrepGauge_mul, h.repGauge_gluonField, sum_mul_sum_eq_sum_pi_two, + Fin.prod_univ_two] + +/-- A gluon pair is a bi-adjoint `su(3)` tensor. -/ +lemma isSU3BiAdjoint_gluonPair (p : EightIdx) : IsSU3BiAdjoint B repGauge (h.gluonPair p) := + ⟨fun U => h.isSU3BiAdjointMat_gluonPair p (U, 1, 1)⟩ + +/-- A gauge transformation moves a `W`-boson pair as the `SU(2)` factor of that gauge group + element moves a tensor with two `su(2)` adjoint indices. -/ +lemma isSU2BiAdjointMat_wPair (p : EightIdx) (g : GaugeGroupI) : + IsSU2BiAdjointMat (GaugeGroupI.toSU2 g) (repGauge g) (h.wPair p) := fun _ => by + simp only [wPair, hrepGauge_mul, h.repGauge_wField, sum_mul_sum_eq_sum_pi_two, + Fin.prod_univ_two] + +/-- A `W`-boson pair is a bi-adjoint `su(2)` tensor. -/ +lemma isSU2BiAdjoint_wPair (p : EightIdx) : IsSU2BiAdjoint B repGauge (h.wPair p) := + ⟨fun U => h.isSU2BiAdjointMat_wPair p (1, U, 1)⟩ + +/-- A gauge transformation fixes a hypercharge pair, which is the `u(1)` bi-adjoint law. -/ +lemma isU1BiAdjointMat_hyperchargePair (p : EightIdx) (g : GaugeGroupI) : + IsU1BiAdjointMat (GaugeGroupI.toU1 g) (repGauge g) (h.hyperchargePair p) := (isU1BiAdjointMat_iff _ _ _).2 fun _ => by - rw [hrepGauge_mul, h.repGauge_hyperchargeField, h.repGauge_hyperchargeField] + simp only [hyperchargePair, hrepGauge_mul, 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' μ' ν') := - ⟨fun u => h.isU1BiAdjointMat_hyperchargeField_mul l μ ν l' μ' ν' (1, 1, u)⟩ +/-- A hypercharge pair is a bi-adjoint `u(1)` tensor. -/ +lemma isU1BiAdjoint_hyperchargePair (p : EightIdx) : + IsU1BiAdjoint B repGauge (h.hyperchargePair p) := + ⟨fun u => h.isU1BiAdjointMat_hyperchargePair p (1, 1, u)⟩ -/-! +/-- The gluon trace contraction at the covector indices `p`: the Kronecker contraction of + the two colour indices of the gluon pair. -/ +noncomputable def gluonTrace (p : EightIdx) : B := (h.isSU3BiAdjoint_gluonPair p).traceContraction -## C. The bi-adjoint spans inside the mass-weight submodules +/-- The `W`-boson trace contraction at the covector indices `p`. -/ +noncomputable def wTrace (p : EightIdx) : B := (h.isSU2BiAdjoint_wPair p).traceContraction -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. +/-- The hypercharge trace contraction at the covector indices `p`. -/ +noncomputable def hyperchargeTrace (p : EightIdx) : B := + (h.isU1BiAdjoint_hyperchargePair p).traceContraction -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, 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. +/-- The gluon trace contraction is the kinetic pairing of two gluon field strengths. -/ +lemma gluonTrace_eq (p : EightIdx) : + h.gluonTrace p + = ∑ a : Fin 8, h.gluonField ![] (p 0) (p 1) a * h.gluonField ![] (p 2) (p 3) a := by + simp [gluonTrace, IsSU3BiAdjoint.traceContraction, gluonPair] --/ +/-- The `W`-boson trace contraction is the kinetic pairing of two `W`-boson field + strengths. -/ +lemma wTrace_eq (p : EightIdx) : + h.wTrace p = ∑ i : Fin 3, h.wField ![] (p 0) (p 1) i * h.wField ![] (p 2) (p 3) i := by + simp [wTrace, IsSU2BiAdjoint.traceContraction, wPair] + +/-- The hypercharge trace contraction is the product of the two hypercharge field + strengths, the `u(1)` factor being one dimensional. -/ +lemma hyperchargeTrace_eq (p : EightIdx) : + h.hyperchargeTrace p + = h.hyperchargeField ![] (p 0) (p 1) * h.hyperchargeField ![] (p 2) (p 3) := by + simp [hyperchargeTrace, IsU1BiAdjoint.traceContraction, hyperchargePair] + +/-- The gluon trace contraction is fixed by the whole gauge group. -/ +lemma repGauge_gluonTrace (g : GaugeGroupI) (p : EightIdx) : + repGauge g (h.gluonTrace p) = h.gluonTrace p := + IsSU3BiAdjoint.map_traceContraction _ (h.isSU3BiAdjointMat_gluonPair p g) + +/-- The `W`-boson trace contraction is fixed by the whole gauge group. -/ +lemma repGauge_wTrace (g : GaugeGroupI) (p : EightIdx) : + repGauge g (h.wTrace p) = h.wTrace p := + IsSU2BiAdjoint.map_traceContraction _ (h.isSU2BiAdjointMat_wPair p g) + +/-- The hypercharge trace contraction is fixed by the whole gauge group. -/ +lemma repGauge_hyperchargeTrace (g : GaugeGroupI) (p : EightIdx) : + repGauge g (h.hyperchargeTrace p) = h.hyperchargeTrace p := + IsU1BiAdjoint.map_traceContraction _ (h.isU1BiAdjointMat_hyperchargePair p g) + +/-- The twice-derived hypercharge field strength is fixed by the whole gauge group. -/ +lemma repGauge_hyperchargeDeriv (g : GaugeGroupI) (d : EightIdx) : + repGauge g (h.hyperchargeDeriv d) = h.hyperchargeDeriv d := + h.repGauge_hyperchargeField g _ _ _ /-- Every field-strength symbol lies in the derivative submodule of its own number of covariant derivatives. -/ @@ -239,282 +480,53 @@ lemma F_mem_derivSubmodule {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fi 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, 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 _ - fun g => h.isU1BiAdjointMat_hyperchargeField_mul l μ ν l' μ' ν' g) +/-- A field-strength symbol with `n` covariant derivatives has mass weight `2 * (2 + n)`. -/ +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)) := + h.derivSubmodule_le_massWeightSubmodule n (h.F_mem_derivSubmodule l μ ν φ) + +/-- A product of two underived field-strength symbols has mass weight eight. -/ +lemma F_mul_F_mem_massWeightSubmodule_eight (μ ν μ' ν' : Fin 1 ⊕ Fin 3) + (φ φ' : Module.Dual ℝ GaugeAlgebra) : + F ![] μ ν φ * F ![] μ' ν' φ' ∈ h.massWeightSubmodule 8 := by + simpa using h.massWeightSubmodule_mul_le _ _ (Submodule.mul_mem_mul + (h.F_mem_massWeightSubmodule ![] μ ν φ) (h.F_mem_massWeightSubmodule ![] μ' ν' φ')) + +/-- The gluon trace contraction has mass weight eight. -/ +lemma gluonTrace_mem_massWeightSubmodule (p : EightIdx) : + h.gluonTrace p ∈ h.massWeightSubmodule 8 := by + rw [gluonTrace_eq] + exact Submodule.sum_mem _ fun a _ => h.F_mul_F_mem_massWeightSubmodule_eight _ _ _ _ _ _ + +/-- The `W`-boson trace contraction has mass weight eight. -/ +lemma wTrace_mem_massWeightSubmodule (p : EightIdx) : h.wTrace p ∈ h.massWeightSubmodule 8 := by + rw [wTrace_eq] + exact Submodule.sum_mem _ fun i _ => h.F_mul_F_mem_massWeightSubmodule_eight _ _ _ _ _ _ + +/-- The hypercharge trace contraction has mass weight eight. -/ +lemma hyperchargeTrace_mem_massWeightSubmodule (p : EightIdx) : + h.hyperchargeTrace p ∈ h.massWeightSubmodule 8 := by + rw [hyperchargeTrace_eq] + exact h.F_mul_F_mem_massWeightSubmodule_eight _ _ _ _ _ _ + +/-- The twice-derived hypercharge field strength has mass weight `2 * (2 + 2)`, eight. -/ +lemma hyperchargeDeriv_mem_massWeightSubmodule (d : EightIdx) : + h.hyperchargeDeriv d ∈ h.massWeightSubmodule 8 := by + simpa [hyperchargeDeriv, hyperchargeField] using + h.F_mem_massWeightSubmodule ![d 0, d 1] (d 2) (d 3) (GaugeAlgebra.stdBasis.coord _) /-! -## D. The trace contractions and their mass weights +## D. The weight vectors of mass weight eight inside the bi-adjoint spans --/ - -/-- 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] - -/-- 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.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) - (μ ν : 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.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) - (μ ν : 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.map_traceContraction _ - (h.isU1BiAdjointMat_hyperchargeField_mul l μ ν l' μ' ν' g) - -/-! - -## 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 -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.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. -/ -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.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. -/ -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.map_traceContraction _ - (h.isU1BiAdjointMat_hyperchargeField_mul ![] μ ν ![] μ' ν' 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 gauge weight decomposition of the underived tower is built from the weight vectors +`adjVec` of one adjoint index. 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, the +combinations being the weight basis `wtCoeff` of the adjoint. A product of two of them is +then a combination of the components of the matching pair 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`. -/ @@ -538,35 +550,10 @@ 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 + rcases k with r | r | c <;> + simp [IsSU3BiAdjoint.wtCoeff, su3AdjIdx, adjVec, IsSU3BiAdjoint.rootIdx_castSucc, + IsSU3BiAdjoint.cartanIdx_castSucc, gluonField, add_smul, sub_smul, ite_smul, mul_ite, + Finset.sum_add_distrib, Finset.sum_sub_distrib] /-- A weight vector of the isospin part of the adjoint is the matching combination of `W`-boson field strengths. -/ @@ -574,743 +561,81 @@ 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] + rcases k with r | r | c <;> + simp [IsSU2BiAdjoint.wtCoeff, su2AdjIdx, adjVec, IsSU2BiAdjoint.rootIdx_three, + IsSU2BiAdjoint.cartanIdx_two, wField, add_smul, sub_smul, ite_smul, mul_ite, + Finset.sum_add_distrib, Finset.sum_sub_distrib] + +/-- A product of two colour weight vectors of the adjoint lies in the span of the matching + gluon pair family. -/ +lemma adjVec_mul_adjVec_mem_gluonPair_span (p : EightIdx) (k₀ k₁ : IsSU3BiAdjoint.WeightIdx) : + h.adjVec ![] (p 0) (p 1) (su3AdjIdx k₀) * h.adjVec ![] (p 2) (p 3) (su3AdjIdx k₁) + ∈ (h.isSU3BiAdjoint_gluonPair p).span := by + rw [← h.sum_wtCoeff_smul_gluonField, ← h.sum_wtCoeff_smul_gluonField, + sum_mul_sum_eq_sum_pi_two] + exact sum_smul_mem_iSup_span (h.gluonPair p) _ + +/-- A product of two isospin weight vectors of the adjoint lies in the span of the matching + `W`-boson pair family. -/ +lemma adjVec_mul_adjVec_mem_wPair_span (p : EightIdx) (k₀ k₁ : IsSU2BiAdjoint.WeightIdx) : + h.adjVec ![] (p 0) (p 1) (su2AdjIdx k₀) * h.adjVec ![] (p 2) (p 3) (su2AdjIdx k₁) + ∈ (h.isSU2BiAdjoint_wPair p).span := by + rw [← h.sum_wtCoeff_smul_wField, ← h.sum_wtCoeff_smul_wField, sum_mul_sum_eq_sum_pi_two] + exact sum_smul_mem_iSup_span (h.wPair p) _ + +/-- The join, over all covector indices, of the spans of the gluon pair families. -/ +noncomputable def gluonPairSpan : Submodule ℂ B := ⨆ p, (h.isSU3BiAdjoint_gluonPair p).span + +/-- The join, over all covector indices, of the spans of the `W`-boson pair families. -/ +noncomputable def wPairSpan : Submodule ℂ B := ⨆ p, (h.isSU2BiAdjoint_wPair p).span + +/-- The gluon root part of the zero-weight piece, the three products of a colour raising + vector against the matching lowering vector, lies in the gluon pair spans. -/ +lemma gluonRootPart_le_gluonPairSpan : h.gluonRootPart ≤ h.gluonPairSpan := by + have key : ∀ r : Fin 3, + h.rootRaisingSpan r.castSucc * h.rootLoweringSpan r.castSucc ≤ h.gluonPairSpan := + fun r => iSup_span_mul_iSup_span_le _ _ fun l μ ν l' μ' ν' => by + rw [Subsingleton.elim l ![], Subsingleton.elim l' ![]] + exact Submodule.mem_iSup_of_mem ![μ, ν, μ', ν'] (h.adjVec_mul_adjVec_mem_gluonPair_span + ![μ, ν, μ', ν'] (Sum.inl r) (Sum.inr (Sum.inl r))) 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)))))) - -/-! - -## 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; -`GaugeWeightDecomposition.mem_piece_zero_sup_of_invariant` 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. -/ +/-- The isospin root part of the zero-weight piece, the product of the isospin raising + vector against the lowering vector, lies in the `W`-boson pair spans. -/ 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)))) + iSup_span_mul_iSup_span_le _ _ fun l μ ν l' μ' ν' => by + rw [Subsingleton.elim l ![], Subsingleton.elim l' ![]] + exact Submodule.mem_iSup_of_mem ![μ, ν, μ', ν'] (h.adjVec_mul_adjVec_mem_wPair_span + ![μ, ν, μ', ν'] (Sum.inl 0) (Sum.inr (Sum.inl 0))) /-! -## 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. +## E. The zero-weight piece of mass weight eight + +`massWeightSubmoduleGaugeWeightEight_piece_zero` splits the zero-weight piece into 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, the products of two weight-zero +directions. Section D puts the two root parts inside the pair spans. The neutral part +splits by gauge group factor: a colour Cartan direction against a colour Cartan direction +is a component of a gluon pair family, the isospin Cartan direction against itself of a +`W`-boson pair family, and hypercharge against itself is a hypercharge trace contraction. +What is left pairs a weight-zero direction of one factor with one of another and carries +an unpaired adjoint index of a non-abelian factor; so does a twice-derived symbol on a +colour or isospin Cartan direction, while the twice-derived hypercharge field strengths +are fixed by the whole gauge group. + +The families with an unpaired index are collected in `colourFamily` and `isospinFamily`, +adjoint families in the sense of `IsSU3Adjoint` and `IsSU2Adjoint`: the colour factor moves +the gluon index of a mixed product and fixes the neutral factor. The piece is then bounded +by the joins of these families together with the four spans of gauge invariants. -/ -/-- 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 span of the hypercharge trace contractions. -/ +noncomputable def hyperchargeTraceSpan : Submodule ℂ B := ⨆ p, ℂ ∙ h.hyperchargeTrace p -/-- 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 span of the twice-derived hypercharge field strengths. -/ +noncomputable def hyperchargeDerivSpan : Submodule ℂ B := ⨆ d, ℂ ∙ h.hyperchargeDeriv d /-- The two neutral underived directions that pair with a colour index in the mixed neutral products: the isospin Cartan direction and hypercharge. -/ @@ -1342,30 +667,20 @@ 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.inl p => h.gluonField p.1 p.2.1 p.2.2 | 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 +/-- Each colour family 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 +lemma isSU3Adjoint_colourFamily : ∀ i : ColourIdx, IsSU3Adjoint B repGauge (h.colourFamily i) + | Sum.inl p => h.isSU3Adjoint_gluonField p.1 p.2.1 p.2.2 + | Sum.inr (Sum.inl q) => ⟨fun U => map_mul_fixed_eq_sum (hrepGauge_mul _) + (h.repGauge_gluonField (U, 1, 1) ![] q.1 q.2.1) (h.repGauge_su3_neutralVec U _ _ _)⟩ + | Sum.inr (Sum.inr q) => ⟨fun U => map_fixed_mul_eq_sum (hrepGauge_mul _) + (h.repGauge_gluonField (U, 1, 1) ![] q.1 q.2.1) (h.repGauge_su3_neutralVec U _ _ _)⟩ /-- 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 @@ -1374,121 +689,62 @@ 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 + | Sum.inl p => h.wField p.1 p.2.1 p.2.2 + | 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 +/-- Each isospin family 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 +lemma isSU2Adjoint_isospinFamily : ∀ i : IsospinIdx, IsSU2Adjoint B repGauge (h.isospinFamily i) + | Sum.inl p => h.isSU2Adjoint_wField p.1 p.2.1 p.2.2 + | Sum.inr (Sum.inl q) => ⟨fun U => map_mul_fixed_eq_sum (hrepGauge_mul _) + (h.repGauge_wField (1, U, 1) ![] (q 0) (q 1)) (h.repGauge_hyperchargeField _ _ _ _)⟩ + | Sum.inr (Sum.inr q) => ⟨fun U => map_fixed_mul_eq_sum (hrepGauge_mul _) + (h.repGauge_wField (1, U, 1) ![] (q 0) (q 1)) (h.repGauge_hyperchargeField _ _ _ _)⟩ + +/-- The isospin families 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 + | Sum.inl p, a => h.repGauge_su3_wField U p.1 p.2.1 p.2.2 a + | Sum.inr (Sum.inl q), a => by + simp only [isospinFamily, hrepGauge_mul, h.repGauge_su3_wField, h.repGauge_hyperchargeField] + | Sum.inr (Sum.inr q), a => by + simp only [isospinFamily, hrepGauge_mul, h.repGauge_su3_wField, h.repGauge_hyperchargeField] + +/-- The join of the spans of the colour families. -/ +noncomputable def unpairedColourSpan : Submodule ℂ B := + ⨆ i : ColourIdx, (h.isSU3Adjoint_colourFamily i).span + +/-- The join of the spans of the isospin families. -/ +noncomputable def unpairedIsospinSpan : Submodule ℂ B := + ⨆ i : IsospinIdx, (h.isSU2Adjoint_isospinFamily i).span + +/-- A component of a colour family lies in the join of the colour spans. -/ +lemma colourFamily_mem (i : ColourIdx) (a : Fin 8) : h.colourFamily i a ∈ h.unpairedColourSpan := + Submodule.mem_iSup_of_mem i (Family.mem_iSup_span_singleton (h.colourFamily i) a) + +/-- A component of an isospin family lies in the join of the isospin spans. -/ +lemma isospinFamily_mem (i : IsospinIdx) (a : Fin 3) : + h.isospinFamily i a ∈ h.unpairedIsospinSpan := + Submodule.mem_iSup_of_mem i (Family.mem_iSup_span_singleton (h.isospinFamily i) a) + +/-- The join of the isospin families is fixed pointwise by the colour factor. -/ +lemma repGauge_su3_of_mem_unpairedIsospinSpan (U : specialUnitaryGroup (Fin 3) ℂ) : + ∀ y ∈ h.unpairedIsospinSpan, repGauge (U, 1, 1) y = y := + fixed_iSup fun i => map_eq_self_of_mem_iSup_span _ _ (h.repGauge_su3_isospinFamily U i) + +/-- The colour Cartan directions of the underived tower: the two weight-zero directions of + the `su(3)` factor. -/ +noncomputable def colourCartanSpan : Submodule ℂ B := + ⨆ (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3) (c : Fin 2), + ℂ ∙ h.adjVec ![] μ ν (Sum.inr (Sum.inr c.castSucc.castSucc)) + +/-- The neutral directions of the underived tower: the isospin Cartan direction and + hypercharge. -/ +noncomputable def neutralSpan : Submodule ℂ B := + ⨆ (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3) (j : Fin 2), ℂ ∙ h.neutralVec μ ν j /-- A colour Cartan weight vector is the gluon field strength on the matching Cartan direction of `su(3)`. -/ @@ -1496,255 +752,279 @@ lemma adjVec_colourCartan {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin (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] + simp only [adjVec, 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 +/-- The weight-zero directions of the adjoint are the colour Cartan directions and the + neutral directions. -/ +lemma cartanSpan_le : h.cartanSpan ≤ h.colourCartanSpan ⊔ h.neutralSpan := by + refine iSup_le fun l => iSup_le fun μ => iSup_le fun ν => iSup_le fun c => ?_ + rw [Subsingleton.elim l ![], Submodule.span_singleton_le_iff_mem] + fin_cases c + · exact Submodule.mem_sup_left (mem_iSup_span₃ _ μ ν (0 : Fin 2)) + · exact Submodule.mem_sup_left (mem_iSup_span₃ _ μ ν (1 : Fin 2)) + · exact Submodule.mem_sup_right (mem_iSup_span₃ _ μ ν (0 : Fin 2)) + · exact Submodule.mem_sup_right (mem_iSup_span₃ _ μ ν (1 : Fin 2)) + +/-- A product of two colour Cartan directions is a component of a gluon pair family. -/ +lemma colourCartanSpan_mul_colourCartanSpan_le : + h.colourCartanSpan * h.colourCartanSpan ≤ h.gluonPairSpan := + iSup_span_mul_iSup_span_le _ _ fun μ ν c μ' ν' c' => + Submodule.mem_iSup_of_mem ![μ, ν, μ', ν'] (h.adjVec_mul_adjVec_mem_gluonPair_span + ![μ, ν, μ', ν'] (Sum.inr (Sum.inr c)) (Sum.inr (Sum.inr c'))) + +/-- A colour Cartan direction against a neutral direction is a component of a colour + family. -/ +lemma colourCartanSpan_mul_neutralSpan_le : + h.colourCartanSpan * h.neutralSpan ≤ h.unpairedColourSpan := + iSup_span_mul_iSup_span_le _ _ fun μ ν c μ' ν' j => by + rw [h.adjVec_colourCartan] + exact h.colourFamily_mem (Sum.inr (Sum.inl (μ, ν, μ', ν', j))) (GaugeAlgebra.su3CartanId c) + +/-- A neutral direction against a colour Cartan direction is a component of a colour + family. -/ +lemma neutralSpan_mul_colourCartanSpan_le : + h.neutralSpan * h.colourCartanSpan ≤ h.unpairedColourSpan := + iSup_span_mul_iSup_span_le _ _ fun μ ν j μ' ν' c => by + rw [h.adjVec_colourCartan] + exact h.colourFamily_mem (Sum.inr (Sum.inr (μ', ν', μ, ν, j))) (GaugeAlgebra.su3CartanId c) + +/-- A product of two neutral directions: isospin against isospin is a component of a + `W`-boson pair family, hypercharge against hypercharge is a hypercharge trace + contraction, and the two mixed products are components of isospin families. -/ +lemma neutralSpan_mul_neutralSpan_le : + h.neutralSpan * h.neutralSpan + ≤ h.unpairedIsospinSpan ⊔ (h.wPairSpan ⊔ h.hyperchargeTraceSpan) := + iSup_span_mul_iSup_span_le _ _ fun μ ν j μ' ν' j' => by + fin_cases j <;> fin_cases j' + · exact Submodule.mem_sup_right (Submodule.mem_sup_left (Submodule.mem_iSup_of_mem + ![μ, ν, μ', ν'] (h.adjVec_mul_adjVec_mem_wPair_span ![μ, ν, μ', ν'] + (Sum.inr (Sum.inr 0)) (Sum.inr (Sum.inr 0))))) + · exact Submodule.mem_sup_left + (h.isospinFamily_mem (Sum.inr (Sum.inl ![μ, ν, μ', ν'])) GaugeAlgebra.su2CartanId) + · exact Submodule.mem_sup_left + (h.isospinFamily_mem (Sum.inr (Sum.inr ![μ', ν', μ, ν])) GaugeAlgebra.su2CartanId) + · exact Submodule.mem_sup_right (Submodule.mem_sup_right (Submodule.mem_iSup_of_mem + ![μ, ν, μ', ν'] (Submodule.mem_span_singleton.2 + ⟨1, by rw [one_smul, hyperchargeTrace_eq]; rfl⟩))) + +/-- The neutral part of the zero-weight piece: the products pairing a factor with itself + are components of the pair families or hypercharge trace contractions, and the mixed + products carry an unpaired non-abelian index. -/ +lemma neutralCartanPart_le : + h.neutralCartanPart ≤ (h.unpairedColourSpan ⊔ h.unpairedIsospinSpan) + ⊔ (h.gluonPairSpan ⊔ (h.wPairSpan ⊔ h.hyperchargeTraceSpan)) := by + refine (Submodule.mul_le.2 fun x hx y hy => Submodule.mul_mem_mul (h.cartanSpan_le hx) + (h.cartanSpan_le hy)).trans ?_ + rw [Submodule.mul_sup, Submodule.sup_mul, Submodule.sup_mul] + refine sup_le (sup_le ?_ ?_) (sup_le ?_ ?_) + · exact h.colourCartanSpan_mul_colourCartanSpan_le.trans (le_sup_of_le_right le_sup_left) + · exact h.neutralSpan_mul_colourCartanSpan_le.trans (le_sup_of_le_left le_sup_left) + · exact h.colourCartanSpan_mul_neutralSpan_le.trans (le_sup_of_le_left le_sup_left) + · exact h.neutralSpan_mul_neutralSpan_le.trans + (sup_le (le_sup_of_le_left le_sup_right) (le_sup_of_le_right le_sup_right)) + +/-- 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 symbols on the weight-zero directions: on a colour or isospin Cartan + direction a component of an adjoint family, on hypercharge a twice-derived hypercharge + field strength. -/ +lemma derivCartanSpan_le : + (⨆ (l : Fin 2 → Fin 1 ⊕ Fin 3) (μ : Fin 1 ⊕ Fin 3) (ν : Fin 1 ⊕ Fin 3) (c : Fin 4), + ℂ ∙ F l μ ν (GaugeAlgebra.stdBasis.coord (GaugeAlgebra.cartanIdx c))) + ≤ (h.unpairedColourSpan ⊔ h.unpairedIsospinSpan) ⊔ h.hyperchargeDerivSpan := by + refine iSup_le fun l => iSup_le fun μ => iSup_le fun ν => iSup_le fun c => + (Submodule.span_singleton_le_iff_mem _ _).2 ?_ + fin_cases c + · exact Submodule.mem_sup_left (Submodule.mem_sup_left + (h.colourFamily_mem (Sum.inl (l, μ, ν)) (GaugeAlgebra.su3CartanId 0))) + · exact Submodule.mem_sup_left (Submodule.mem_sup_left + (h.colourFamily_mem (Sum.inl (l, μ, ν)) (GaugeAlgebra.su3CartanId 1))) + · exact Submodule.mem_sup_left (Submodule.mem_sup_right + (h.isospinFamily_mem (Sum.inl (l, μ, ν)) GaugeAlgebra.su2CartanId)) + · rw [← etaExpand_two l] + exact Submodule.mem_sup_right (Submodule.mem_iSup_of_mem ![l 0, l 1, μ, ν] + (Submodule.mem_span_singleton_self _)) + +/-- The zero-weight piece of mass weight eight is bounded by the joins of the unpaired + families together with the pair spans, the hypercharge trace contractions and the + twice-derived hypercharge field strengths. -/ +lemma massWeightSubmoduleGaugeWeightEight_piece_zero_le : + (h.massWeightSubmoduleGaugeWeightEight).piece 0 + ≤ (h.unpairedColourSpan ⊔ h.unpairedIsospinSpan) + ⊔ (h.gluonPairSpan + ⊔ (h.wPairSpan ⊔ (h.hyperchargeTraceSpan ⊔ h.hyperchargeDerivSpan))) := by + rw [h.massWeightSubmoduleGaugeWeightEight_piece_zero] + refine sup_le (h.derivCartanSpan_le.trans (sup_le le_sup_left (le_sup_of_le_right + (le_sup_of_le_right (le_sup_of_le_right le_sup_right))))) (sup_le ?_ (sup_le ?_ ?_)) + · exact h.gluonRootPart_le_gluonPairSpan.trans (le_sup_of_le_right le_sup_left) + · exact h.isospinRootPart_le_wPairSpan.trans + (le_sup_of_le_right (le_sup_of_le_right le_sup_left)) + · exact h.neutralCartanPart_le.trans (sup_le le_sup_left (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.3. The invariants of mass weight eight +## F. The unpaired non-abelian adjoint indices + +A family carrying one unpaired adjoint index of a non-abelian factor has no gauge invariant +in its span at all, the adjoint representations of `su(3)` and `su(2)` having no invariant +vector: `IsSU3Adjoint.mem_of_mem_span_sup_su3_invariant` and its `su(2)` twin push a colour, +or isospin, invariant of such a span joined with a stable submodule into the submodule. +Peeling the joins of section E off with `mem_of_invariant_iSup_sup` therefore costs +nothing. The colour families are killed first, with the isospin join held in the +colour-stable tail, since the colour factor fixes every isospin family; the isospin +families are killed after that. + +-/ + +/-- A gauge invariant of the join of the unpaired families together with a gauge-stable + submodule lies in the submodule. -/ +lemma mem_of_invariant_unpaired_sup (S : Submodule ℂ B) + (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, repGauge g y ∈ S) {x : B} + (hx : x ∈ (h.unpairedColourSpan ⊔ h.unpairedIsospinSpan) ⊔ S) + (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : x ∈ S := by + rw [sup_assoc] at hx + have hx' := mem_of_invariant_iSup_sup + (fun U : specialUnitaryGroup (Fin 3) ℂ => repGauge (U, 1, 1)) + (fun i => (h.isSU3Adjoint_colourFamily i).span) + (fun i U => span_stable_of_map_eq_sum _ _ ((h.isSU3Adjoint_colourFamily i).repGauge_T U)) + (fun i S hS x hx hinv => + (h.isSU3Adjoint_colourFamily i).mem_of_mem_span_sup_su3_invariant x S hS hx hinv) + _ (fun U => sup_stable (stable_of_fixed (h.repGauge_su3_of_mem_unpairedIsospinSpan U)) + (hS (U, 1, 1))) hx fun U => hinv (U, 1, 1) + exact mem_of_invariant_iSup_sup (fun U : specialUnitaryGroup (Fin 2) ℂ => repGauge (1, U, 1)) + (fun i => (h.isSU2Adjoint_isospinFamily i).span) + (fun i U => span_stable_of_map_eq_sum _ _ ((h.isSU2Adjoint_isospinFamily i).repGauge_T U)) + (fun i S hS x hx hinv => + (h.isSU2Adjoint_isospinFamily i).mem_of_mem_span_sup_su2_invariant x S hS hx hinv) + S (fun U => hS (1, U, 1)) hx' fun U => hinv (1, U, 1) + +/-! + +## 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, which section E bounds by the unpaired joins, the two non-abelian pair spans +and the two hypercharge spans. Section F kills the unpaired joins. The two pair spans are +peeled off one at a time by `IsSU3BiAdjoint.mem_span_sup_invariant_iff` and its `su(2)` +twin, each time with the spans not yet peeled off adjoined to the stable submodule `S`, +which is why no independence of the parts is needed; each pair span is gauge stable, so +the enlarged submodule stays stable. The two hypercharge spans are fixed pointwise by the +gauge group and are split off last. + +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, +and `GaugeWeightDecomposition.mem_piece_zero_sup_of_invariant` supplies that step for any +gauge-stable `S`, giving `exists_mem_of_invariant_massWeightSubmodule_eight_sup`. The +section closes with the converse: the gauge span is made of gauge invariants of mass +weight eight already. -/ -/-- 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. -/ +/-- The span of the gluon trace contractions. -/ +noncomputable def gluonTraceSpan : Submodule ℂ B := ⨆ p, ℂ ∙ h.gluonTrace p + +/-- The span of the `W`-boson trace contractions. -/ +noncomputable def wTraceSpan : Submodule ℂ B := ⨆ p, ℂ ∙ h.wTrace p + +/-- The span of the three underived trace contractions, over all 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 + h.gluonTraceSpan ⊔ (h.wTraceSpan ⊔ h.hyperchargeTraceSpan) + +/-- The gluon pair spans are stable under the gauge group. -/ +lemma gluonPairSpan_stable (g : GaugeGroupI) : + ∀ y ∈ h.gluonPairSpan, repGauge g y ∈ h.gluonPairSpan := + iSup_stable fun p => + span_stable_of_map_eq_sum (h.gluonPair p) _ (h.isSU3BiAdjointMat_gluonPair p g) + +/-- The `W`-boson pair spans are stable under the gauge group. -/ +lemma wPairSpan_stable (g : GaugeGroupI) : ∀ y ∈ h.wPairSpan, repGauge g y ∈ h.wPairSpan := + iSup_stable fun p => span_stable_of_map_eq_sum (h.wPair p) _ (h.isSU2BiAdjointMat_wPair p g) + +/-- The hypercharge trace contractions are fixed pointwise by the gauge group. -/ +lemma repGauge_of_mem_hyperchargeTraceSpan (g : GaugeGroupI) : + ∀ y ∈ h.hyperchargeTraceSpan, repGauge g y = y := + map_eq_self_of_mem_iSup_span _ _ (h.repGauge_hyperchargeTrace g) + +/-- The twice-derived hypercharge field strengths are fixed pointwise by the gauge + group. -/ +lemma repGauge_of_mem_hyperchargeDerivSpan (g : GaugeGroupI) : + ∀ y ∈ h.hyperchargeDerivSpan, repGauge g y = y := + map_eq_self_of_mem_iSup_span _ _ (h.repGauge_hyperchargeDeriv g) + +/-- Peeling the gluon pair spans off a gauge-stable submodule: a gauge invariant of the + join together with `S` is a combination of the gluon trace contractions plus a + gauge-invariant remainder in `S`. -/ +lemma exists_mem_of_invariant_gluonPairSpan_sup (S : Submodule ℂ B) + (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, repGauge g y ∈ S) {x : B} (hx : x ∈ h.gluonPairSpan ⊔ S) + (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : + ∃ y ∈ S, (∀ g : GaugeGroupI, repGauge g y = y) ∧ x - y ∈ h.gluonTraceSpan := + exists_mem_of_invariant_iSup_sup repGauge (fun p => (h.isSU3BiAdjoint_gluonPair p).span) + (fun p => ℂ ∙ h.gluonTrace p) + (fun p g => span_stable_of_map_eq_sum (h.gluonPair p) _ (h.isSU3BiAdjointMat_gluonPair p g)) + (fun p S hS x hx hinv => exists_sub_mem_span_singleton + ((h.isSU3BiAdjoint_gluonPair p).mem_span_sup_invariant_iff hrepGauge_mul x S hS + (h.repGauge_gluonTrace · p) hx hinv)) + S hS hx hinv + +/-- Peeling the `W`-boson pair spans off a gauge-stable submodule. -/ +lemma exists_mem_of_invariant_wPairSpan_sup (S : Submodule ℂ B) + (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, repGauge g y ∈ S) {x : B} (hx : x ∈ h.wPairSpan ⊔ S) + (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : + ∃ y ∈ S, (∀ g : GaugeGroupI, repGauge g y = y) ∧ x - y ∈ h.wTraceSpan := + exists_mem_of_invariant_iSup_sup repGauge (fun p => (h.isSU2BiAdjoint_wPair p).span) + (fun p => ℂ ∙ h.wTrace p) + (fun p g => span_stable_of_map_eq_sum (h.wPair p) _ (h.isSU2BiAdjointMat_wPair p g)) + (fun p S hS x hx hinv => exists_sub_mem_span_singleton + ((h.isSU2BiAdjoint_wPair p).mem_span_sup_invariant_iff hrepGauge_mul x S hS + (h.repGauge_wTrace · p) hx hinv)) + S hS hx hinv /-- 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. -/ + twice-derived hypercharge field strengths, plus a gauge-invariant remainder in `S`. -/ 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₄))) + have hH : ∀ g : GaugeGroupI, ∀ y ∈ h.hyperchargeTraceSpan ⊔ h.hyperchargeDerivSpan, + repGauge g y = y := fun g => + fixed_sup (h.repGauge_of_mem_hyperchargeTraceSpan g) (h.repGauge_of_mem_hyperchargeDerivSpan g) + have hS₂ : ∀ g : GaugeGroupI, ∀ y ∈ (h.hyperchargeTraceSpan ⊔ h.hyperchargeDerivSpan) ⊔ S, + repGauge g y ∈ (h.hyperchargeTraceSpan ⊔ h.hyperchargeDerivSpan) ⊔ S := + fun g => sup_stable (stable_of_fixed (hH g)) (hS g) + have hS₁ := fun g => sup_stable (h.wPairSpan_stable g) (hS₂ g) + have hS₀ := fun g => sup_stable (h.gluonPairSpan_stable g) (hS₁ g) + have hx₀ : x ∈ (h.unpairedColourSpan ⊔ h.unpairedIsospinSpan) ⊔ (h.gluonPairSpan + ⊔ (h.wPairSpan ⊔ ((h.hyperchargeTraceSpan ⊔ h.hyperchargeDerivSpan) ⊔ S))) := + sup_le (h.massWeightSubmoduleGaugeWeightEight_piece_zero_le.trans (sup_le_sup_left + (sup_le_sup_left (sup_le_sup_left le_sup_left _) _) _)) + (le_sup_of_le_right (le_sup_of_le_right (le_sup_of_le_right le_sup_right))) hx + obtain ⟨y₁, hy₁, hy₁inv, hxy₁⟩ := h.exists_mem_of_invariant_gluonPairSpan_sup _ hS₁ + (h.mem_of_invariant_unpaired_sup _ hS₀ hx₀ hinv) hinv + obtain ⟨y₂, hy₂, hy₂inv, hy₁y₂⟩ := h.exists_mem_of_invariant_wPairSpan_sup _ hS₂ hy₁ hy₁inv + obtain ⟨y₃, hy₃, hy₃inv, hy₂y₃⟩ := exists_mem_of_invariant_sup_fixed repGauge _ S hH hy₂ hy₂inv + refine ⟨y₃, hy₃, hy₃inv, ?_⟩ + rw [show x - y₃ = (x - y₁) + ((y₁ - y₂) + (y₂ - y₃)) from by abel, traceContractionEightSpan, + sup_assoc, sup_assoc] + exact Submodule.add_mem _ (Submodule.mem_sup_left hxy₁) (Submodule.add_mem _ + (Submodule.mem_sup_right (Submodule.mem_sup_left hy₁y₂)) + (Submodule.mem_sup_right (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. -/ + `massWeightSubmodule 8 ⊔ S`, for `S` gauge stable, 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) @@ -1753,61 +1033,27 @@ theorem exists_mem_of_invariant_massWeightSubmodule_eight_sup (S : Submodule ℂ ∧ x - y ∈ h.traceContractionEightSpan ⊔ h.hyperchargeDerivSpan := h.exists_mem_of_invariant_piece_zero_sup S hS (GaugeWeightDecomposition.mem_piece_zero_sup_of_invariant - h.massWeightSubmoduleGaugeWeightEight (fun i y hy => hS _ y hy) hx hinv) + h.massWeightSubmoduleGaugeWeightEight (fun _ y hy => hS _ y hy) 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 +/-- The gauge span is a space of gauge invariants of mass weight eight: each generator is + fixed by the gauge group and has mass weight eight by section C. This is the converse of + the classification. -/ +lemma traceContractionEightSpan_sup_hyperchargeDerivSpan_le : + h.traceContractionEightSpan ⊔ h.hyperchargeDerivSpan + ≤ h.massWeightSubmodule 8 ⊓ repGauge.invariants := + sup_le (sup_le (iSup_span_singleton_le _ fun p => Submodule.mem_inf.2 + ⟨h.gluonTrace_mem_massWeightSubmodule p, + (Representation.mem_invariants _ _).2 (h.repGauge_gluonTrace · p)⟩) + (sup_le (iSup_span_singleton_le _ fun p => Submodule.mem_inf.2 + ⟨h.wTrace_mem_massWeightSubmodule p, + (Representation.mem_invariants _ _).2 (h.repGauge_wTrace · p)⟩) + (iSup_span_singleton_le _ fun p => Submodule.mem_inf.2 + ⟨h.hyperchargeTrace_mem_massWeightSubmodule p, + (Representation.mem_invariants _ _).2 (h.repGauge_hyperchargeTrace · p)⟩))) + (iSup_span_singleton_le _ fun d => Submodule.mem_inf.2 + ⟨h.hyperchargeDeriv_mem_massWeightSubmodule d, + (Representation.mem_invariants _ _).2 (h.repGauge_hyperchargeDeriv · d)⟩) /-! @@ -1815,20 +1061,15 @@ theorem exists_sum_smul_traceContraction_of_invariant (S : Submodule ℂ B) 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. +sense of `IsQuadLorentz`: `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 are sums of such products over a gauge +index, and a finite sum of quadruple Lorentz tensors is one again. So is the twice-derived +hypercharge field strength, whose two derivative slots and two covector indices are four +four-vector indices as well. The four spans of section G are exactly the spans of these +four families, so 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, as the bi-adjoint sup lemmas did for the gauge group. 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 @@ -1858,6 +1099,18 @@ lemma repLorentz_F_underived (Λ : SL(2,ℂ)) (μ ν : Fin 1 ⊕ Fin 3) rw [Finset.smul_sum] exact Finset.sum_congr rfl fun b _ => by rw [smul_smul] +/-- A product of two double combinations is a combination indexed by quadruples. -/ +lemma sum_mul_sum_eq_sum_pi_four (c c' : (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → ℂ) + (X Y : (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → B) : + (∑ a, ∑ b, c a b • X a b) * (∑ x, ∑ y, c' x y • Y x y) + = ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, + (c (d 0) (d 1) * c' (d 2) (d 3)) • (X (d 0) (d 1) * Y (d 2) (d 3)) := by + rw [IsQuadLorentz.sum_pi_four, Fintype.sum_mul_sum] + refine Finset.sum_congr rfl fun a _ => ?_ + simp only [Fintype.sum_mul_sum, smul_mul_smul_comm, Matrix.cons_val_zero, Matrix.cons_val_one, + Matrix.head_cons, Matrix.cons_val_two, Matrix.tail_cons, Matrix.cons_val_three] + exact Finset.sum_comm + 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. -/ @@ -1866,26 +1119,9 @@ lemma isQuadLorentz_F_mul (φ ψ : Module.Dual ℝ GaugeAlgebra) : (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] + h.repLorentz_F_underived g (l 2) (l 3) ψ, sum_mul_sum_eq_sum_pi_four] 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 + simp only [Fin.prod_univ_four, mul_assoc] /-- A finite sum of quadruple Lorentz tensors is a quadruple Lorentz tensor: the transformation law is linear in the family. -/ @@ -1893,73 +1129,37 @@ lemma isQuadLorentz_sum {ι : Type} [Fintype ι] {T : ι → (Fin 4 → Fin 1 (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 + simp only [map_sum, fun i => (hT i).repLorentz_T g l, Finset.smul_sum] + exact Finset.sum_comm -/-- 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)] +include h in +/-- A family of four four-vector indices whose members are sums of products of two + underived field-strength symbols is a quadruple Lorentz tensor. -/ +lemma isQuadLorentz_of_eq_sum {ι : Type} [Fintype ι] {T : EightIdx → B} + (φ : ι → Module.Dual ℝ GaugeAlgebra) + (hT : ∀ d, T d = ∑ i, F ![] (d 0) (d 1) (φ i) * F ![] (d 2) (d 3) (φ i)) : + IsQuadLorentz B repLorentz T := by + rw [show T = fun d => ∑ i, F ![] (d 0) (d 1) (φ i) * F ![] (d 2) (d 3) (φ i) from funext hT] + exact isQuadLorentz_sum fun _ => h.isQuadLorentz_F_mul _ _ + +/-- The gluon trace contractions, read as a family of four four-vector indices, form a + quadruple Lorentz tensor: a sum over the colour index of products of two underived + field-strength symbols. -/ +lemma isQuadLorentz_gluonTrace : IsQuadLorentz B repLorentz h.gluonTrace := + h.isQuadLorentz_of_eq_sum (fun a : Fin 8 => GaugeAlgebra.stdBasis.coord (Sum.inl a)) + h.gluonTrace_eq + +/-- The `W`-boson trace contractions form a quadruple Lorentz tensor. -/ +lemma isQuadLorentz_wTrace : IsQuadLorentz B repLorentz h.wTrace := + h.isQuadLorentz_of_eq_sum (fun i : Fin 3 => GaugeAlgebra.stdBasis.coord (Sum.inr (Sum.inl i))) + h.wTrace_eq + +/-- The hypercharge trace contractions form a quadruple Lorentz tensor. -/ +lemma isQuadLorentz_hyperchargeTrace : IsQuadLorentz B repLorentz h.hyperchargeTrace := by + rw [show h.hyperchargeTrace = fun d => + 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 h.hyperchargeTrace_eq] exact h.isQuadLorentz_F_mul _ _ /-- A sum over families of two covector indices is a double sum. -/ @@ -1969,130 +1169,97 @@ lemma sum_pi_two_cov {M : Type*} [AddCommMonoid M] (f : (Fin 2 → Fin 1 ⊕ Fin 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, + rw [piFinTwoEquiv_apply, etaExpand_two], 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 +/-- The twice-derived hypercharge field strengths, read as a family of four four-vector + indices, form a quadruple Lorentz tensor: the two derivative slots and the two covector + indices all rotate. This is the second shape of mass weight eight. -/ +lemma isQuadLorentz_hyperchargeDeriv : IsQuadLorentz B repLorentz h.hyperchargeDeriv 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] + simp only [hyperchargeDeriv, hyperchargeField] + rw [h.repLorentz_F g 2 ![l 0, l 1] (l 2) (l 3), sum_pi_two_cov, IsQuadLorentz.sum_pi_four] + simp only [Finset.smul_sum, smul_smul, Fin.prod_univ_two, Fin.prod_univ_four, mul_assoc, + 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 components of a quadruple Lorentz tensor is stable under the Lorentz + group. -/ +lemma isQuadLorentz_span_stable {T : (Fin 4 → Fin 1 ⊕ Fin 3) → B} + (hT : IsQuadLorentz B repLorentz T) (g : SL(2,ℂ)) : + ∀ y ∈ hT.span, repLorentz g y ∈ hT.span := + span_stable_of_map_eq_sum T _ (hT.repLorentz_T g) /-- 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. -/ + ⨆ i : Fin 4, ℂ ∙ IsQuadLorentz.contraction T i + +/-- 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 := + iSup_span_singleton_le _ fun i => by + rw [IsQuadLorentz.contraction_eq] + exact hT.sum_smul_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 `IsQuadLorentz`. -/ +lemma quadContractionSpan_le_lorentzInvariants {T : (Fin 4 → Fin 1 ⊕ Fin 3) → B} + (hT : IsQuadLorentz B repLorentz T) : quadContractionSpan T ≤ repLorentz.invariants := + iSup_span_singleton_le _ fun i => + (Representation.mem_invariants _ _).2 (hT.repLorentz_contraction i) + +/-- Peeling the span of a quadruple Lorentz tensor off a Lorentz-stable submodule, in the + form `exists_mem_of_invariant_iSup_sup` takes: the remainder is Lorentz invariant by the + sup lemma of `IsQuadLorentz`, and the difference is a combination of the four + contractions. -/ 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 : IsQuadLorentz B repLorentz T) (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) : + ∃ y ∈ S, (∀ g : SL(2,ℂ), repLorentz g y = y) ∧ x - y ∈ quadContractionSpan T := by + obtain ⟨a₁, a₂, a₃, a₄, y, hyS, rfl, 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 + have hmem := sum_smul_mem_iSup_span (IsQuadLorentz.contraction T) ![a₁, a₂, a₃, a₄] + rw [IsQuadLorentz.sum_smul_contraction] at hmem + exact ⟨y, hyS, hyinv, by rwa [add_sub_cancel_right]⟩ /-- 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. -/ + trace-contraction families and of the twice-derived hypercharge family: 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)))) + quadContractionSpan h.gluonTrace + ⊔ (quadContractionSpan h.wTrace + ⊔ (quadContractionSpan h.hyperchargeTrace ⊔ quadContractionSpan h.hyperchargeDeriv)) + +/-- The Lorentz contraction span sits inside the gauge span: 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 := + sup_le ((quadContractionSpan_le_span h.isQuadLorentz_gluonTrace).trans + (le_sup_of_le_left le_sup_left)) + (sup_le ((quadContractionSpan_le_span h.isQuadLorentz_wTrace).trans + (le_sup_of_le_left (le_sup_of_le_right le_sup_left))) + (sup_le ((quadContractionSpan_le_span h.isQuadLorentz_hyperchargeTrace).trans + (le_sup_of_le_left (le_sup_of_le_right le_sup_right))) + ((quadContractionSpan_le_span h.isQuadLorentz_hyperchargeDeriv).trans 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 + (h.traceContractionEightSpan_sup_hyperchargeDerivSpan_le.trans inf_le_right) /-- 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. -/ + under both groups. The gauge classification of section G puts such an invariant in the + join of the four spans together with `S`; each 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 remainder is gauge invariant because the + difference is, the Lorentz contraction span sitting inside the gauge span. -/ 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} @@ -2102,351 +1269,63 @@ theorem exists_mem_of_gauge_and_lorentz_invariant (S : Submodule ℂ B) ∃ 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₀⟩ := + obtain ⟨y₀, hy₀S, -, 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 hS₃ := fun g => sup_stable (isQuadLorentz_span_stable h.isQuadLorentz_hyperchargeDeriv g) + (hSL g) + have hS₂ := fun g => sup_stable (isQuadLorentz_span_stable h.isQuadLorentz_hyperchargeTrace g) + (hS₃ g) + have hS₁ := fun g => sup_stable (isQuadLorentz_span_stable h.isQuadLorentz_wTrace g) (hS₂ g) 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₄))))) - -/-- 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, - ((minkowskiMatrixZ x y * minkowskiMatrixZ 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, - ((minkowskiMatrixZ y x * minkowskiMatrixZ z w : ℤ) : ℂ) • T ![y, x, z, w] - = -(((minkowskiMatrixZ x y * minkowskiMatrixZ z w : ℤ) : ℂ) • - T ![x, y, z, w]) := by - intro x y z w - rw [hswap x y z w, smul_neg, minkowskiMatrixZ.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 => - ((minkowskiMatrixZ x y * minkowskiMatrixZ 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, - ((minkowskiMatrixZ x w * minkowskiMatrixZ 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, - ((minkowskiMatrixZ x z * minkowskiMatrixZ 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, - ((minkowskiMatrixZ y w * minkowskiMatrixZ x z : ℤ) : ℂ) • T ![y, x, z, w] - = -(((minkowskiMatrixZ x z * minkowskiMatrixZ y w : ℤ) : ℂ) • - T ![x, y, z, w]) := by - intro x y z w - rw [hswap x y z w, smul_neg, mul_comm (minkowskiMatrixZ y w)] - conv_lhs => rw [h1, sum_quad fun x y z w => - ((minkowskiMatrixZ x w * minkowskiMatrixZ 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 - + have hmem := Submodule.mem_sup.2 ⟨x - y₀, hxy₀, y₀, hy₀S, sub_add_cancel x y₀⟩ + rwa [traceContractionEightSpan, sup_assoc, sup_assoc, sup_assoc] at hmem + obtain ⟨y₁, hy₁, hy₁L, hxy₁⟩ := + exists_mem_of_invariant_isQuadLorentz_span_sup h.isQuadLorentz_gluonTrace _ hS₁ hx₁ hLinv + obtain ⟨y₂, hy₂, hy₂L, hxy₂⟩ := + exists_mem_of_invariant_isQuadLorentz_span_sup h.isQuadLorentz_wTrace _ hS₂ hy₁ hy₁L + obtain ⟨y₃, hy₃, hy₃L, hxy₃⟩ := exists_mem_of_invariant_isQuadLorentz_span_sup + h.isQuadLorentz_hyperchargeTrace _ hS₃ hy₂ hy₂L + obtain ⟨y₄, hy₄, hy₄L, hxy₄⟩ := exists_mem_of_invariant_isQuadLorentz_span_sup + h.isQuadLorentz_hyperchargeDeriv S hSL hy₃ hy₃L + have hxy : x - y₄ ∈ h.lorentzContractionEightSpan := by + 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₄))))) + refine ⟨y₄, hy₄, fun g => ?_, hy₄L, hxy⟩ + have hg := hGinv g + rwa [← sub_add_cancel x y₄, map_add, + (Representation.mem_invariants _ _).1 (h.lorentzContractionEightSpan_le_invariants hxy) g, + add_right_inj] at hg /-! -## 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. +## I. The Lorentz contraction span as invariants of mass weight eight -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 `minkowskiMatrixZ` 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 converse of the Lorentz classification: the Lorentz contraction span is made of gauge +and Lorentz invariants of mass weight eight. Its gauge invariance was already needed in +section H, and its mass weight passes to it from the gauge span in the same way; Lorentz +invariance comes from `IsQuadLorentz` directly, each block being spanned by the four +contractions of a quadruple Lorentz family. -/ -/-- 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. -/ +/-- The Lorentz contraction span lies in the mass-weight eight submodule. -/ 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) + (h.traceContractionEightSpan_sup_hyperchargeDerivSpan_le.trans inf_le_left) -/-- 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. -/ +/-- The Lorentz contraction span is a space of Lorentz invariants. -/ lemma lorentzContractionEightSpan_le_lorentzInvariants : - h.lorentzContractionEightSpan ≤ repLorentz.invariants := by - rw [lorentzContractionEightSpan] - exact sup_le (quadContractionSpan_le_lorentzInvariants h.isQuadLorentz_gluonTrace) + h.lorentzContractionEightSpan ≤ repLorentz.invariants := + 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))) @@ -2465,9 +1344,7 @@ invariants, so the remainder plus the span element is one again. Splitting `x` a /-- 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`. -/ + to a gauge-invariant remainder 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) @@ -2478,20 +1355,14 @@ theorem mem_massWeightSubmodule_eight_sup_and_invariant_iff (S : Submodule ℂ B 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 + rw [← sub_add_cancel x y] + exact ⟨Submodule.add_mem _ (Submodule.mem_sup_left hmem) (Submodule.mem_sup_right hyS), + fun g => by rw [map_add, (Representation.mem_invariants _ _).1 hinv g, hyinv g]⟩ /-- 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. -/ + remainder in `S` fixed by both groups. -/ 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) : @@ -2503,19 +1374,15 @@ theorem mem_massWeightSubmodule_eight_sup_and_gauge_lorentz_invariant_iff 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 + rw [← sub_add_cancel x y] + exact ⟨Submodule.add_mem _ + (Submodule.mem_sup_left (h.lorentzContractionEightSpan_le_massWeightSubmodule hxy)) + (Submodule.mem_sup_right hyS), + fun g => by rw [map_add, hG g, hyG g], fun g => by rw [map_add, hL g, hyL g]⟩ end IsGaugeSector From 90d83d1c1cd785b679854332bf759a4a404b256f Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 8 Sep 2026 20:25:34 +0100 Subject: [PATCH 303/367] refactor: shorten AlgebraRealization/CovariantDeriv Co-Authored-By: Claude Fable 5.1 --- .../AlgebraRealization/CovariantDeriv.lean | 1215 +++++++---------- 1 file changed, 467 insertions(+), 748 deletions(-) diff --git a/Physlib/Particles/StandardModel/AlgebraRealization/CovariantDeriv.lean b/Physlib/Particles/StandardModel/AlgebraRealization/CovariantDeriv.lean index d3d21dc2c..c64ae2435 100644 --- a/Physlib/Particles/StandardModel/AlgebraRealization/CovariantDeriv.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/CovariantDeriv.lean @@ -18,29 +18,27 @@ transformation together with all of its derivatives at the base point — and th transformation of a matter symbol carries an inhomogeneous term built from the gauge field. This file replaces them by the covariant towers `∇_l H`, `∇_l ψ` and `∇_l F_{μν}`, on which a gauge jet acts through its base point alone, and shows that nothing is lost in the -exchange: the two sets of generators generate the same algebra, and a jet-gauge invariant of -it is a polynomial in the covariant towers. - -Sections A to F are the Lorentz machinery the towers need, stated for an arbitrary -`IsGaugeField` rather than for a Standard Model. A Lorentz transformation mixes each -derivative slot of a symbol through a column of the Lorentz matrix; the bare symbols are -indexed by multisets of directions, where no ordering is available, so that mixing is -written as an operator `lorentzMix` on multiset-indexed families. It is a morphism for the -Leibniz convolution out of which the correction terms of a covariant derivative are built. -The Lorentz law of a covariant tower is then a single induction, `repLorentz_tower`, run -once for an abstract tower and instantiated twice: for the matter towers, where the value -index carries the contragredient action and the gauge action has to commute with the Lorentz -action, and for the field-strength tower, where the adjoint index carries no Lorentz weight. - -Sections G onwards work inside a Standard Model. The field algebra is the algebra generated -by every symbol of the theory; the covariant towers are the iterated covariant derivatives -of the twelve matter families and of the field strength; and `fieldAlgebra_eq_covDeriv` says +exchange: the two sets of generators generate the same algebra. + +Sections A to E are the Lorentz machinery the towers need, stated for an arbitrary +`IsGaugeField`. A Lorentz transformation mixes each derivative slot of a symbol through a +column of the Lorentz matrix; the bare symbols are indexed by multisets of directions, so +that mixing is written as an operator `lorentzMix` on multiset-indexed families, a morphism +for the Leibniz convolution out of which the correction terms of a covariant derivative are +built. The Lorentz law of a covariant tower is then a single induction, `repLorentz_tower`, +instantiated for the matter towers, where the value index carries the contragredient action +and the gauge action has to commute with the Lorentz action, and for the field-strength +tower, where the adjoint index carries no Lorentz weight. + +Sections F onwards work inside a Standard Model: the field algebra is the algebra generated +by every symbol of the theory, the covariant towers are the iterated covariant derivatives +of the twelve matter families and of the field strength, and `fieldAlgebra_eq_covDeriv` says that swapping the bare matter symbols for their towers, the gauge-field symbols being kept -in both, does not change the algebra generated. The towers are gauge covariant, transform -through the base point of a gauge jet alone, and are fixed by a pure gauge jet — the three -facts `AlgebraRealization.CovFieldAlgebra.Basic` combines into the classification of -jet-gauge invariants. The last two sections record the Lorentz laws of the covariant matter -towers, which the covariant form of the theory consumes. +in both, does not change the algebra generated. The towers transform through the base point +of a gauge jet alone and are fixed by a pure gauge jet — the facts +`AlgebraRealization.CovFieldAlgebra.Basic` combines into the classification of jet-gauge +invariants — and the last section records their Lorentz laws, which the covariant form of +the theory consumes. ## ii. Key results @@ -65,13 +63,11 @@ towers, which the covariant form of the theory consumes. - C. The Lorentz law of a covariant tower - D. The covariant tower of a matter family - E. The covariant tower of the field strength -- F. The antisymmetry of the field strength -- G. What a covariant tower inherits from its family -- H. The field algebra and the covariant towers -- I. The covariant towers generate the field algebra -- J. Gauge covariance of the covariant towers -- K. The gauge action commutes with the Lorentz action -- L. The Lorentz laws of the covariant matter towers +- F. What a covariant tower inherits from its family +- G. The field algebra and the covariant towers +- H. The covariant towers generate the field algebra +- I. Gauge covariance of the covariant towers +- J. The Lorentz laws of the covariant matter towers -/ @@ -96,12 +92,11 @@ local notation:max "L[" Λ "]" b:max a:max => (((SL2C.toLorentzGroup Λ).1 b a : A Lorentz transformation mixes every derivative slot of a symbol through a column `L[Λ] · a` of the Lorentz matrix. For symbols indexed by an ordered tuple the mixing is a -sum over tuples, but the covariant derivative symbols carry multisets of directions, where -no ordering is available. The mixing is therefore an operator on multiset-indexed families: -peel one direction `a`, replace it by every direction `b` weighted by `L[Λ] b a`, and mix -what is left. Peeling two directions commutes, so the recursion descends to multisets; -`lorentzMix_ofFn` identifies the operator with the tuple form, and the remaining lemmas -record how it interacts with translation of the index and that it is linear in the family. +sum over tuples; the covariant derivative symbols carry multisets of directions, so the +mixing is an operator on multiset-indexed families: peel one direction `a`, replace it by +every direction `b` weighted by `L[Λ] b a`, and mix what is left. Peeling two directions +commutes, so the recursion descends to multisets; `lorentzMix_ofFn` identifies the operator +with the tuple form, and the remaining lemmas record that it is linear in the family. -/ @@ -137,21 +132,9 @@ variable (Λ : SL(2,ℂ)) (G : Multiset (Fin 1 ⊕ Fin 3) → M) 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, L[Λ] 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] + lorentzMix Λ G (a ::ₘ s) t = ∑ b, L[Λ] b a • lorentzMix Λ G s (b ::ₘ t) := + congrFun (Multiset.foldr_cons _ _ _ _) t /-- Evaluating a mixed family away from the empty multiset is mixing the translated family at the empty multiset. -/ @@ -162,28 +145,20 @@ lemma lorentzMix_apply_add (s : Multiset (Fin 1 ⊕ Fin 3)) : | 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, ih (fun r => G (r + t))] - simp only [Multiset.add_cons, Multiset.cons_add, add_zero] + simp only [lorentzMix_cons_apply, ih G, ih (fun r => G (r + t)), Multiset.add_cons, + Multiset.cons_add, add_zero] /-- Peeling at the empty multiset: the peeled direction is pushed into the family. -/ lemma lorentzMix_cons_zero (a : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : - lorentzMix Λ G (a ::ₘ s) 0 = - ∑ b, L[Λ] b a • lorentzMix Λ (fun t => G (b ::ₘ t)) s 0 := by - rw [lorentzMix_cons_apply] - refine Finset.sum_congr rfl fun b _ => ?_ - rw [lorentzMix_apply_add Λ s G (b ::ₘ 0)] - simp only [Multiset.add_cons, add_zero] + lorentzMix Λ G (a ::ₘ s) 0 = ∑ b, L[Λ] b a • lorentzMix Λ (fun t => G (b ::ₘ t)) s 0 := by + simp only [lorentzMix_cons_apply, lorentzMix_apply_add Λ s G, Multiset.add_cons, add_zero] /-- The mixing operator commutes with any linear map applied to the values. -/ lemma lorentzMix_map (Φ : M →ₗ[ℂ] N) (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] + | cons a s ih => simp only [lorentzMix_cons_apply, map_sum, map_smul, ih] /-- The mixing operator is homogeneous in the family. -/ lemma lorentzMix_smul_fam (c : ℂ) (s t : Multiset (Fin 1 ⊕ Fin 3)) : @@ -191,10 +166,8 @@ lemma lorentzMix_smul_fam (c : ℂ) (s t : Multiset (Fin 1 ⊕ Fin 3)) : (lorentzMix_map Λ G (c • LinearMap.id) s t).symm /-- The mixing operator is additive in the family. -/ -lemma lorentzMix_add_fam (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 +lemma lorentzMix_add_fam (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 => @@ -253,10 +226,8 @@ lemma lorentzMix_neg_fam (G : Multiset (Fin 1 ⊕ Fin 3) → M) (s t : Multiset simpa only [neg_one_smul] using lorentzMix_smul_fam Λ G (-1) s t /-- The mixing operator is additive in the family, in subtracted form. -/ -lemma lorentzMix_sub_fam (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 +lemma lorentzMix_sub_fam (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, lorentzMix_add_fam Λ G₁ (fun r => -G₂ r), lorentzMix_neg_fam] end LorentzMixGroup @@ -267,11 +238,10 @@ end LorentzMixGroup 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 correction terms of this file 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. +carrying `y`, summed over all splittings `s = x + y`. Expanded in bases, both correction +terms of this file 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. -/ @@ -285,8 +255,7 @@ lemma multiset_sum_map_sum {α ι : Type*} [Fintype ι] (m : Multiset α) (F : (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 => - simp only [Multiset.map_cons, Multiset.sum_cons, ih, Finset.sum_add_distrib] + | cons x m ih => simp only [Multiset.map_cons, Multiset.sum_cons, ih, Finset.sum_add_distrib] /-- The Leibniz convolution of two families of derivative symbols: the sum over the splittings of the multiset of the products of the two symbols. -/ @@ -306,16 +275,14 @@ lemma derivConv_cons (f g : Multiset (Fin 1 ⊕ Fin 3) → B) (a : Fin 1 ⊕ Fin /-- 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)) : + (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 simp only [derivConv, Finset.mul_sum, mul_smul_comm, multiset_sum_map_sum, Multiset.smul_sum, Multiset.map_map, Function.comp_def] /-- 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)) : + (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 simp only [derivConv, Finset.sum_mul, smul_mul_assoc, multiset_sum_map_sum, Multiset.smul_sum, Multiset.map_map, Function.comp_def] @@ -342,13 +309,12 @@ end DerivConv A covariant tower is built one slot at a time: the tower along `l 0 :: l'` is the tower along `l'` with one more plain derivative, plus a correction term `C (l 0)` applied to the -tower along `l'`. Both towers of this file have that shape — the matter towers with the -derived action of the gauge field as correction, the field-strength tower with the derived -bracket — and both corrections are Lorentz covariant, linear in the family they correct, -and compatible with a twist of the value index. That is all the induction uses, so it is -run once, for an abstract tower `T` transforming into a possibly different tower `T'`: the -ordered covariant slots mix by their own columns of the Lorentz matrix, the multiset of -plain derivative slots by `lorentzMix`, and the value index by the twist `τ`. +tower along `l'`. Both towers of this file have that shape, with the derived action of the +gauge field or the derived bracket as correction, and both corrections are Lorentz +covariant, linear in the family they correct, and compatible with a twist of the value +index. That is all the induction uses, so it is run once, for an abstract tower `T` +transforming into a possibly different tower `T'`: the covariant slots mix by their own +columns of the Lorentz matrix, the plain slots by `lorentzMix`, and the value index by `τ`. -/ @@ -359,8 +325,7 @@ variable {B : Type} [Ring B] [Algebra ℂ B] {repLorentz : Representation ℂ SL /-- 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₂) + (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)) : @@ -377,16 +342,14 @@ lemma repLorentz_derivConv `lorentzMix`, and the value index by `τ`. -/ theorem repLorentz_tower {K : Type} [Field K] {W : Type} [AddCommGroup W] [Module K W] [Module K B] [SMulCommClass K ℂ B] (Λ : SL(2,ℂ)) - (T T' : (n : ℕ) → (Fin n → (Fin 1 ⊕ Fin 3)) → Multiset (Fin 1 ⊕ Fin 3) → - W →ₗ[K] B) + (T T' : (n : ℕ) → (Fin n → (Fin 1 ⊕ Fin 3)) → Multiset (Fin 1 ⊕ Fin 3) → W →ₗ[K] B) (C : (Fin 1 ⊕ Fin 3) → (Multiset (Fin 1 ⊕ Fin 3) → W →ₗ[K] B) → Multiset (Fin 1 ⊕ Fin 3) → W →ₗ[K] B) (τ : W →ₗ[K] W) (hstep : ∀ (n : ℕ) (l : Fin (n + 1) → (Fin 1 ⊕ Fin 3)) (s : Multiset (Fin 1 ⊕ Fin 3)), T (n + 1) l s = T n (fun i => l i.succ) (l 0 ::ₘ s) + C (l 0) (T n fun i => l i.succ) s) - (hstep' : ∀ (n : ℕ) (l : Fin (n + 1) → (Fin 1 ⊕ Fin 3)) - (s : Multiset (Fin 1 ⊕ Fin 3)), T' (n + 1) l s = - T' n (fun i => l i.succ) (l 0 ::ₘ s) + C (l 0) (T' n fun i => l i.succ) s) + (hstep' : ∀ (n : ℕ) (l : Fin (n + 1) → (Fin 1 ⊕ Fin 3)) (s : Multiset (Fin 1 ⊕ Fin 3)), + T' (n + 1) l s = T' n (fun i => l i.succ) (l 0 ::ₘ s) + C (l 0) (T' n fun i => l i.succ) s) (hzero : ∀ (l : Fin 0 → (Fin 1 ⊕ Fin 3)) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : W), repLorentz Λ (T 0 l s φ) = lorentzMix Λ (fun t => T' 0 l t (τ φ)) s 0) (hC : ∀ (ρ : Fin 1 ⊕ Fin 3) (G G' : Multiset (Fin 1 ⊕ Fin 3) → W →ₗ[K] B), @@ -438,13 +401,13 @@ end Tower The covariant derivative of a matter family adds one ordered derivative slot and a Leibniz correction `A_ρ · F`, the derived action of the gauge field on the value index through the -infinitesimal action `act`. Expanded in bases of the gauge algebra and of the value space, -the correction is a scalar combination of Leibniz convolutions of gauge-field symbols -against matter symbols, which gives its Lorentz law and its linearity in the matter family. -The twist of the value index is the contragredient action `rep.dual Λ`, and it passes -through the correction because the gauge action commutes with the Lorentz action on the -value space: that is the one hypothesis about the species that the Lorentz law of its -covariant tower needs. +infinitesimal action `act`. Expanded in bases, the correction is a scalar combination of +Leibniz convolutions of gauge-field symbols against matter symbols, which gives its Lorentz +law and its linearity in the matter family. The twist of the value index is the +contragredient action `rep.dual Λ`, and it passes through the correction because the gauge +action commutes with the Lorentz action on the value space: that is the one hypothesis +about the species that the Lorentz law needs, and conjugation transports it to the +conjugate families. -/ @@ -475,19 +438,23 @@ lemma sum_derivConv_sum_fam {ι κ ι' : Type} [Fintype ι] [Fintype κ] [Fintyp simp only [derivConv_sum_right, Finset.smul_sum, smul_smul, mul_comm] exact sum_comm₃ _ -/-- 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]⟩ +/-- A Lorentz law in the tuple form, read on the underlying multisets: the transformed + family mixes by `lorentzMix`. -/ +lemma repLorentz_eq_lorentzMix (Λ : SL(2,ℂ)) (f g : Multiset (Fin 1 ⊕ Fin 3) → B) + (hfg : ∀ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)), repLorentz Λ (f (List.ofFn l)) = + ∑ p : Fin n → (Fin 1 ⊕ Fin 3), (∏ i, L[Λ] (p i) (l i)) • g (List.ofFn p)) + (x : Multiset (Fin 1 ⊕ Fin 3)) : repLorentz Λ (f x) = lorentzMix Λ g x 0 := by + obtain ⟨n, l, rfl⟩ : ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)), x = List.ofFn l := + ⟨_, x.toList.get, by rw [List.ofFn_get, Multiset.coe_toList]⟩ + rw [hfg n l, lorentzMix_ofFn] + exact Finset.sum_congr rfl fun p _ => by rw [add_zero] /-- The Lorentz law of the gauge-field symbols, in the multiset form. -/ lemma repLorentz_apply_mix (hA : IsGaugeField localGaugeData 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, L[Λ] 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] + repLorentz Λ (A x μ χ) = lorentzMix Λ (fun t => ∑ a, L[Λ] a μ • A t a χ) x 0 := + repLorentz_eq_lorentzMix Λ (fun x => A x μ χ) (fun t => ∑ a, L[Λ] a μ • A t a χ) + (fun n l => hA.lorentz_apply Λ n l μ χ) x omit [FiniteDimensional ℂ V] in /-- The Lorentz law of a family of derivative symbols, in the multiset form. -/ @@ -495,10 +462,9 @@ lemma isLorentzDerivTransforms_mix {rep : Representation ℂ SL(2,ℂ) V} {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] + repLorentz Λ (F x χ) = lorentzMix Λ (fun t => F t (rep.dual Λ χ)) x 0 := + repLorentz_eq_lorentzMix Λ (fun x => F x χ) (fun t => F t (rep.dual Λ χ)) + (fun n l => hF Λ n l χ) x /-- The Lorentz law of a scalar combination of convolutions against the gauge field: the direction of the gauge field mixes by its own column, the derivative slots by @@ -517,10 +483,8 @@ lemma repLorentz_sum_derivConv intro j k rw [repLorentz_derivConv hmul Λ _ (fun t => ∑ a, L[Λ] a ρ • A t a (bg.coord j)) _ (g' k) (fun x => repLorentz_apply_mix hA Λ x ρ _) (hg k)] - rw [show derivConv (fun t => ∑ a, L[Λ] a ρ • A t a (bg.coord j)) (g' k) = - fun r => ∑ a, L[Λ] a ρ • derivConv (fun x => A x a (bg.coord j)) (g' k) r from - funext fun r => derivConv_sum_left _ _ _ _, lorentzMix_sum_fam] - exact Finset.sum_congr rfl fun a _ => lorentzMix_smul_fam _ _ _ _ _ + simp only [← lorentzMix_smul_fam, ← lorentzMix_sum_fam] + exact congrArg (fun G => lorentzMix Λ G s 0) (funext fun r => derivConv_sum_left _ _ _ r) simp only [map_sum, map_smul, h1, lorentzMix_sum_fam, lorentzMix_smul_fam, Finset.smul_sum, smul_smul, mul_comm] exact sum_comm₃ _ @@ -541,9 +505,8 @@ 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 + 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 simp only [actionFamConv, Multiset.sum_linearMap_apply, Multiset.map_map, Function.comp_def, actionFam_apply_eq_sum bg bv, multiset_sum_map_sum, derivConv, Multiset.smul_sum] @@ -581,16 +544,15 @@ omit [FiniteDimensional ℂ V] in 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 - rw [show ∑ k, φ (act c (bv k)) • T.dualMap (bv.coord k) = - T.dualMap (∑ k, φ (act c (bv k)) • bv.coord k) by simp only [map_sum, map_smul], - show (∑ k, φ (act c (bv k)) • bv.coord k) = φ ∘ₗ act c from + (ψ : Module.Dual ℂ V →ₗ[ℂ] B) (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 + simp only [← map_smul, ← map_sum] + rw [show (∑ k, φ (act c (bv k)) • bv.coord k) = φ ∘ₗ act c from bv.sum_dual_apply_smul_coord (φ ∘ₗ act c), show (∑ k, (T.dualMap φ) (act c (bv k)) • bv.coord k) = (T.dualMap φ) ∘ₗ act c from bv.sum_dual_apply_smul_coord ((T.dualMap φ) ∘ₗ act c)] - exact LinearMap.ext fun v => congrArg φ (hT c v) + exact congrArg ψ (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. -/ @@ -600,14 +562,8 @@ lemma actionFam_comp_dual (T : V →ₗ[ℂ] V) (φ : Module.Dual ℂ V) : actionFam act f (g ∘ₗ T.dualMap) φ = actionFam act f g (T.dualMap φ) := by classical - set bg := Module.finBasis ℝ GaugeAlgebra - set bv := Module.finBasis ℂ V - have key : ∀ (α : Fin (Module.finrank ℂ V) → ℂ) (v : Fin (Module.finrank ℂ V) → Module.Dual ℂ V) - (j : Fin (Module.finrank ℝ GaugeAlgebra)), - ∑ k, α k • (f (bg.coord j) * g (v k)) = f (bg.coord j) * g (∑ k, α k • v k) := by - intro α v j - simp only [map_sum, map_smul, Finset.mul_sum, mul_smul_comm] - simp only [actionFam_apply_eq_sum bg bv, LinearMap.comp_apply, key, dual_twist bv T hT] + simp only [actionFam_apply_eq_sum (Module.finBasis ℝ GaugeAlgebra) (Module.finBasis ℂ V), + LinearMap.comp_apply, ← mul_smul_comm, ← Finset.mul_sum, dual_twist _ T hT g] /-- The contragredient action may be pulled out of a derived action family. -/ lemma actionFamConv_comp_dual (T : V →ₗ[ℂ] V) @@ -629,10 +585,9 @@ lemma repLorentz_covDerivIter {rep : Representation ℂ SL(2,ℂ) 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, L[Λ] (p i) (l i)) • - lorentzMix Λ (fun t => covDerivIter A act F n p t (rep.dual Λ φ)) s 0 := + repLorentz Λ (covDerivIter A act F n l s φ) = ∑ p : Fin n → (Fin 1 ⊕ Fin 3), + (∏ i, L[Λ] (p i) (l i)) • + lorentzMix Λ (fun t => covDerivIter A act F n p t (rep.dual Λ φ)) s 0 := repLorentz_tower Λ (covDerivIter A act F) (covDerivIter A act F) (actionFamConv A act) (rep.dual Λ) (fun _ _ _ => rfl) (fun _ _ _ => rfl) (fun _ s φ => isLorentzDerivTransforms_mix hF Λ s φ) @@ -656,17 +611,39 @@ theorem isLorentzCovDerivTransforms_covDerivIter {rep : Representation ℂ SL(2, rw [repLorentz_covDerivIter hmul hA hcomm F hF Λ n l 0 φ] simp only [lorentzMix_zero] +omit [FiniteDimensional ℂ V] in +/-- 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 (rep : Representation ℂ SL(2,ℂ) V) + (hcomm : ∀ (c : GaugeAlgebra) (Λ : SL(2,ℂ)) (v : V), act c (rep Λ v) = rep Λ (act c v)) + (c : GaugeAlgebra) (Λ : SL(2,ℂ)) (v : ConjModule V) : + LocalGaugeData.actionConj act c (rep.conj Λ v) = + rep.conj Λ (LocalGaugeData.actionConj act c v) := + congrArg (conjEquiv (k := ℂ) (M := V)) (hcomm c Λ _) + +/-- The Lorentz law of the covariant tower of a conjugate family, from the commutation of + the gauge action with the Lorentz action of the unconjugated species. -/ +theorem isLorentzCovDerivTransforms_covDerivIter_conj {rep : Representation ℂ SL(2,ℂ) V} + (hmul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂) + (hA : IsGaugeField localGaugeData 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 ℂ (ConjModule V) →ₗ[ℂ] B) + (hF : IsLorentzDerivTransforms repLorentz rep.conj F) : + IsLorentzCovDerivTransforms repLorentz rep.conj + (fun {n} l => covDerivIter A (LocalGaugeData.actionConj act) F n l 0) := + isLorentzCovDerivTransforms_covDerivIter hmul hA (actionConj_comm_repConj rep hcomm) F hF + /-! ## E. The covariant tower of the field strength -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 the twist is the identity, and the induction -of section C applies 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. +The covariant derivative of an adjoint family has the shape of that of a matter family, +with the bracket `⁅A_ρ, ·⁆` in place of the action on the value index; the gauge index +carries no Lorentz weight, so the twist is the identity, and the induction of section C +applies with `bracketFamConv` in place of `actionFamConv`. What is new is the seed: the +field strength carries two covector indices, and its Lorentz law +(`repLorentz_fieldStrength_mix`) mixes both. The tower is linear in its seed, so it +inherits the antisymmetry of the field strength. -/ @@ -715,10 +692,9 @@ lemma repLorentz_iteratedCovDerivAdjoint (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, L[Λ] (p i) (l i)) • - lorentzMix Λ (fun t => iteratedCovDerivAdjoint A (List.ofFn p) F' t φ) x 0 := by + repLorentz Λ (iteratedCovDerivAdjoint A (List.ofFn l) F x φ) = ∑ p : Fin n → (Fin 1 ⊕ Fin 3), + (∏ i, L[Λ] (p i) (l i)) • + lorentzMix Λ (fun t => iteratedCovDerivAdjoint A (List.ofFn p) F' t φ) x 0 := by have := repLorentz_tower Λ (fun n l => iteratedCovDerivAdjoint A (List.ofFn l) F) (fun n l => iteratedCovDerivAdjoint A (List.ofFn l) F') (bracketFamConv A) LinearMap.id (fun _ l _ => by rw [List.ofFn_succ]; rfl) (fun _ l _ => by rw [List.ofFn_succ]; rfl) @@ -743,6 +719,15 @@ lemma iteratedCovDerivAdjoint_sum_fam {ι : Type} [Fintype ι] (c : ι → ℂ) simp only [iteratedCovDerivAdjoint, covDerivAdjoint_apply, hfam, bracketFamConv_sum_fam, LinearMap.sum_apply, LinearMap.smul_apply, smul_add, Finset.sum_add_distrib] +/-- 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 + simpa using iteratedCovDerivAdjoint_sum_fam (A := A) (fun _ : Fin 1 => (-1 : ℂ)) (fun _ => F) l x + φ + /-- 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 @@ -755,8 +740,8 @@ lemma repLorentz_fieldStrength_mix have hder : ∀ κ σ, repLorentz Λ (A (κ ::ₘ x) σ φ) = lorentzMix Λ (fun t => ∑ a, L[Λ] a κ • ∑ b, L[Λ] b σ • A (a ::ₘ t) b φ) x 0 := by intro κ σ - rw [repLorentz_apply_mix hA Λ (κ ::ₘ x) σ φ, lorentzMix_cons_zero, lorentzMix_sum_fam] - exact Finset.sum_congr rfl fun a _ => (lorentzMix_smul_fam _ _ _ _ _).symm + simp only [repLorentz_apply_mix hA Λ (κ ::ₘ x) σ φ, lorentzMix_cons_zero, lorentzMix_sum_fam, + lorentzMix_smul_fam] -- the commutator term have hcomm : repLorentz Λ (commutatorFam A μ ν x φ) = lorentzMix Λ (fun t => ∑ a, L[Λ] a μ • ∑ b, L[Λ] b ν • commutatorFam A a b t φ) x 0 := by @@ -764,11 +749,9 @@ lemma repLorentz_fieldStrength_mix lorentzMix Λ (fun t => (∑ b, L[Λ] b ν • A t b) χ) y 0 := fun y χ => by simpa only [LinearMap.sum_apply, LinearMap.smul_apply] using repLorentz_apply_mix hA Λ y ν χ rw [show commutatorFam A μ ν x = bracketFamConv A μ (fun r => A r ν) x from rfl, - repLorentz_bracketFamConv hmul hA Λ μ _ _ hG x φ, lorentzMix_sum_fam] - refine Finset.sum_congr rfl fun a _ => ?_ - rw [lorentzMix_smul_fam] - exact congrArg (fun G => L[Λ] a μ • lorentzMix Λ G x 0) - (funext fun t => bracketFamConv_sum_fam (A := A) a _ (fun b r => A r b) t φ) + repLorentz_bracketFamConv hmul hA Λ μ _ _ hG x φ] + simp only [lorentzMix_sum_fam, lorentzMix_smul_fam, bracketFamConv_sum_fam] + rfl -- the second derivative term, with its two sums exchanged have hswap : (fun t => ∑ a, L[Λ] a ν • ∑ b, L[Λ] b μ • A (a ::ₘ t) b φ) = fun t => ∑ a, L[Λ] a μ • ∑ b, L[Λ] b ν • A (b ::ₘ t) a φ := by @@ -786,102 +769,32 @@ lemma repLorentz_fieldStrength_mix 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₂) + (hmul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂) (hA : IsGaugeField localGaugeData 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 + ∑ p : Fin n → (Fin 1 ⊕ Fin 3), (∏ i, L[Λ] (p i) (l i)) • ∑ a, L[Λ] a μ • ∑ b, L[Λ] b ν • + iteratedCovDerivAdjoint A (List.ofFn p) (fieldStrength A a b) 0 φ := by have hF' : ∀ y χ, repLorentz Λ (fieldStrength A μ ν y χ) = lorentzMix Λ (fun t => (∑ a, L[Λ] a μ • ∑ b, L[Λ] b ν • fieldStrength A a b t) χ) y 0 := - fun y χ => by - simpa only [LinearMap.sum_apply, LinearMap.smul_apply] using - repLorentz_fieldStrength_mix hmul hA Λ μ ν y χ + fun y χ => by simpa only [LinearMap.sum_apply, LinearMap.smul_apply] using + repLorentz_fieldStrength_mix hmul hA Λ μ ν y χ rw [repLorentz_iteratedCovDerivAdjoint hmul hA Λ (fieldStrength A μ ν) _ hF' n l 0 φ] simp only [lorentzMix_zero, iteratedCovDerivAdjoint_sum_fam] -/-! - -## F. 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, - ← Finset.sum_neg_distrib, Finset.sum_comm] - refine Finset.sum_congr rfl fun j _ => ?_ - rw [← Finset.sum_neg_distrib] - refine Finset.sum_congr rfl fun k _ => ?_ - rw [(hfg _ _).eq, ← lie_skew, map_neg, neg_smul] - -/-- 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 /-! -## G. What a covariant tower inherits from its family +## F. What a covariant tower inherits from its family -Three facts about the covariant tower of a single matter family, in the form the field -algebra consumes. The span lemma `IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter` says -that the bare symbols and the tower generate the same algebra over the gauge-field symbols, -so each is a polynomial in the other: `symbol_mem_adjoin` and `covDerivIter_mem_adjoin`. -The tower commutes with the gauge-field symbols as soon as the bare symbols do, the tower -being a polynomial in symbols that commute with them. And a gauge tensor transforms at the -base point through the dual coefficient of the base-point value alone, the Leibniz -convolution over the empty multiset having a single term. +Facts about the covariant tower of a single matter family, in the form the field algebra +consumes. The span lemma `IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter` says that the +bare symbols and the tower generate the same algebra over the gauge-field symbols, so each +is a polynomial in the other; the tower commutes with the gauge-field symbols as soon as +the bare symbols do; and a pure gauge jet acts trivially through the dual base-point +coefficient of a representation whose zeroth Taylor coefficient it fixes. -/ @@ -889,7 +802,7 @@ namespace IsGaugeField open _root_.IsGaugeField -variable {B : Type} [Ring B] [Algebra ℂ B] {repGauge : Representation ℂ JetGaugeGroupI B} +variable {B : Type} [Ring B] [Algebra ℂ B] variable {A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} variable {V : Type} [AddCommGroup V] [Module ℂ V] [FiniteDimensional ℂ V] (act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℂ] V) (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B) @@ -927,24 +840,39 @@ lemma commute_covDerivIter rintro y (⟨s, μ', ψ', rfl⟩ | ⟨s, φ', rfl⟩) exacts [hAA s p μ' μ ψ' ψ, (hAF p μ ψ s φ').symm] +omit [FiniteDimensional ℂ V] in +/-- A pure gauge jet acts trivially through the dual base-point coefficient of a + representation whose zeroth Taylor coefficient is the identity on pure jets. -/ +lemma repDualCoeff_zero_of_mem_truncationKer_zero + {rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)} + (hrep : ∀ {W : JetGaugeGroupI}, localGaugeData.eval W = 1 → repCoeff rep W 0 = LinearMap.id) + (U : localGaugeData.truncationKer 0) (φ : Module.Dual ℂ V) : + repDualCoeff rep U.1⁻¹ 0 φ = φ := by + have hU : localGaugeData.eval U.1⁻¹ = 1 := by + rw [map_inv, localGaugeData.mem_truncationKer_zero_iff.mp U.2, inv_one] + rw [show repDualCoeff rep U.1⁻¹ 0 = (repCoeff rep U.1⁻¹ 0).dualMap from rfl, hrep hU] + rfl + end IsGaugeField /-! -## H. The field algebra and the covariant towers +## G. The field algebra and the covariant towers The field algebra is the algebra generated by every derivative symbol of the theory. The covariant towers are the iterated covariant derivatives of the twelve matter families along ordered tuples of directions, evaluated at the empty multiset, each built with the -infinitesimal action of its species (`LocalGaugeData.actionConj` of it for a conjugate -family), together with the iterated covariant derivative of the field strength along a list -of directions. The set `matterTowers` collects the twelve matter towers, and -`matterTowers_induction` is the case split over them that the rest of the file runs. +infinitesimal action of its species (`actionConj` of it for a conjugate family), together +with the iterated covariant derivative of the field strength along a list of directions. +The set `matterTowers` collects the matter towers, and `matterTowers_induction` is the case +split over them that the rest of the file runs. -/ namespace AlgebraRealization +open _root_.IsGaugeField _root_.StandardModel.IsGaugeField LocalGaugeData JetComponentSpace + variable {B : Type} [Ring B] [Algebra ℂ B] {repJet : Representation ℂ JetGaugeGroupI B} {repLorentz : Representation ℂ SL(2,ℂ) B} @@ -972,73 +900,68 @@ def fieldAlgebra : Subalgebra ℂ B := Algebra.adjoin ℂ h.symbols /-- The iterated covariant derivative of the Higgs field. -/ noncomputable def covDerivH {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : Module.Dual ℂ HiggsVec →ₗ[ℂ] B := - IsGaugeField.covDerivIter h.A HiggsVec.gaugeAlgebraAction h.H n l 0 + covDerivIter h.A HiggsVec.gaugeAlgebraAction h.H n l 0 /-- The iterated covariant derivative of the conjugate Higgs field. -/ noncomputable def covDerivBarH {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : Module.Dual ℂ (ConjModule HiggsVec) →ₗ[ℂ] B := - IsGaugeField.covDerivIter h.A (LocalGaugeData.actionConj HiggsVec.gaugeAlgebraAction) h.barH n l 0 + covDerivIter h.A (actionConj HiggsVec.gaugeAlgebraAction) h.barH n l 0 /-- The iterated covariant derivative of the down-type quarks. -/ noncomputable def covDerivD (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : Module.Dual ℂ DownSinglet →ₗ[ℂ] B := - IsGaugeField.covDerivIter h.A DownSinglet.gaugeAlgebraAction (h.d i) n l 0 + covDerivIter h.A DownSinglet.gaugeAlgebraAction (h.d i) n l 0 /-- The iterated covariant derivative of the conjugate down-type quarks. -/ noncomputable def covDerivBarD (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : Module.Dual ℂ (ConjModule DownSinglet) →ₗ[ℂ] B := - IsGaugeField.covDerivIter h.A (LocalGaugeData.actionConj DownSinglet.gaugeAlgebraAction) - (h.bard i) n l 0 + covDerivIter h.A (actionConj DownSinglet.gaugeAlgebraAction) (h.bard i) n l 0 /-- The iterated covariant derivative of the up-type quarks. -/ noncomputable def covDerivU (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : Module.Dual ℂ UpSinglet →ₗ[ℂ] B := - IsGaugeField.covDerivIter h.A UpSinglet.gaugeAlgebraAction (h.u i) n l 0 + covDerivIter h.A UpSinglet.gaugeAlgebraAction (h.u i) n l 0 /-- The iterated covariant derivative of the conjugate up-type quarks. -/ noncomputable def covDerivBarU (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : Module.Dual ℂ (ConjModule UpSinglet) →ₗ[ℂ] B := - IsGaugeField.covDerivIter h.A (LocalGaugeData.actionConj UpSinglet.gaugeAlgebraAction) - (h.baru i) n l 0 + covDerivIter h.A (actionConj UpSinglet.gaugeAlgebraAction) (h.baru i) n l 0 /-- The iterated covariant derivative of the quark doublets. -/ noncomputable def covDerivQ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : Module.Dual ℂ QuarkDoublet →ₗ[ℂ] B := - IsGaugeField.covDerivIter h.A QuarkDoublet.gaugeAlgebraAction (h.Q i) n l 0 + covDerivIter h.A QuarkDoublet.gaugeAlgebraAction (h.Q i) n l 0 /-- The iterated covariant derivative of the conjugate quark doublets. -/ noncomputable def covDerivBarQ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : Module.Dual ℂ (ConjModule QuarkDoublet) →ₗ[ℂ] B := - IsGaugeField.covDerivIter h.A (LocalGaugeData.actionConj QuarkDoublet.gaugeAlgebraAction) - (h.barQ i) n l 0 + covDerivIter h.A (actionConj QuarkDoublet.gaugeAlgebraAction) (h.barQ i) n l 0 /-- The iterated covariant derivative of the lepton doublets. -/ noncomputable def covDerivL (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : Module.Dual ℂ LeptonDoublet →ₗ[ℂ] B := - IsGaugeField.covDerivIter h.A LeptonDoublet.gaugeAlgebraAction (h.L i) n l 0 + covDerivIter h.A LeptonDoublet.gaugeAlgebraAction (h.L i) n l 0 /-- The iterated covariant derivative of the conjugate lepton doublets. -/ noncomputable def covDerivBarL (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : Module.Dual ℂ (ConjModule LeptonDoublet) →ₗ[ℂ] B := - IsGaugeField.covDerivIter h.A (LocalGaugeData.actionConj LeptonDoublet.gaugeAlgebraAction) - (h.barL i) n l 0 + covDerivIter h.A (actionConj LeptonDoublet.gaugeAlgebraAction) (h.barL i) n l 0 /-- The iterated covariant derivative of the lepton singlets. -/ noncomputable def covDerivE (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : Module.Dual ℂ LeptonSinglet →ₗ[ℂ] B := - IsGaugeField.covDerivIter h.A LeptonSinglet.gaugeAlgebraAction (h.e i) n l 0 + covDerivIter h.A LeptonSinglet.gaugeAlgebraAction (h.e i) n l 0 /-- The iterated covariant derivative of the conjugate lepton singlets. -/ noncomputable def covDerivBarE (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : Module.Dual ℂ (ConjModule LeptonSinglet) →ₗ[ℂ] B := - IsGaugeField.covDerivIter h.A (LocalGaugeData.actionConj LeptonSinglet.gaugeAlgebraAction) - (h.bare i) n l 0 + covDerivIter h.A (actionConj LeptonSinglet.gaugeAlgebraAction) (h.bare i) n l 0 /-- The iterated covariant derivative `∇_{l₁} ⋯ ∇_{lₙ} F_{μν}` of the field strength of the gauge field, along an ordered list of directions. -/ noncomputable def covDerivFieldStrength (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B := - IsGaugeField.iteratedCovDerivAdjoint h.A l (IsGaugeField.fieldStrength h.A μ ν) 0 + iteratedCovDerivAdjoint h.A l (fieldStrength h.A μ ν) 0 /-- The covariant towers of the twelve matter families: every symbol of every tower. -/ def matterTowers : Set B := @@ -1079,17 +1002,67 @@ lemma matterTowers_induction (P : B → Prop) {b : B} (hb : b ∈ h.matterTowers /-! -## I. The covariant towers generate the field algebra +## H. The covariant towers generate the field algebra -For a single matter family the span lemma -`IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter` says that its bare symbols and its -covariant tower generate the same algebra together with the gauge-field symbols. The field -algebra is that statement for the twelve families at once: each bare symbol is a polynomial -in the gauge-field symbols and its own tower, and each tower symbol is a polynomial in the -gauge-field symbols and its own bare symbols. +The span lemma of section F, for the twelve families at once: each bare symbol is a +polynomial in the gauge-field symbols and its own tower, and each tower symbol is a +polynomial in the gauge-field symbols and its own bare symbols. -/ +/-- Every bare symbol is a polynomial in the gauge-field symbols and the matter towers. -/ +lemma symbols_subset_adjoin_matterTowers : + h.symbols ⊆ Algebra.adjoin ℂ + ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.A s μ)) ∪ + h.matterTowers) := by + have hA : ∀ s μ ψ, h.A s μ ψ ∈ + (⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.A s μ)) ∪ + h.matterTowers := + fun s μ ψ => Or.inl (Set.mem_iUnion_of_mem s (Set.mem_iUnion_of_mem μ ⟨ψ, rfl⟩)) + have hH : ∀ {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (b : B), + b ∈ Set.range (h.covDerivH l) ∪ Set.range (h.covDerivBarH l) → b ∈ h.matterTowers := + fun l b hb => Or.inl (Set.mem_iUnion_of_mem _ (Set.mem_iUnion_of_mem l hb)) + have hf : ∀ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (b : B), + b ∈ 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) → b ∈ h.matterTowers := + fun i {_} l b hb => Or.inr (Set.mem_iUnion_of_mem i (Set.mem_iUnion_of_mem _ + (Set.mem_iUnion_of_mem l hb))) + rintro b ((hb | hb) | hb) + · exact Algebra.subset_adjoin (Or.inl hb) + · simp only [Set.mem_iUnion] at hb + obtain ⟨s, ⟨φ, rfl⟩ | ⟨φ, rfl⟩⟩ := hb + · exact symbol_mem_adjoin HiggsVec.gaugeAlgebraAction h.H hA + (fun n l φ => Or.inr (hH l _ (by simp [covDerivH]))) s φ + · exact symbol_mem_adjoin (actionConj HiggsVec.gaugeAlgebraAction) h.barH hA + (fun n l φ => Or.inr (hH l _ (by simp [covDerivBarH]))) s φ + · simp only [Set.mem_iUnion] at hb + obtain ⟨i, s, hb⟩ := hb + rcases hb with (((((((((⟨φ, rfl⟩ | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | + ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) + · exact symbol_mem_adjoin DownSinglet.gaugeAlgebraAction (h.d i) hA + (fun n l φ => Or.inr (hf i l _ (by simp [covDerivD]))) s φ + · exact symbol_mem_adjoin (actionConj DownSinglet.gaugeAlgebraAction) (h.bard i) hA + (fun n l φ => Or.inr (hf i l _ (by simp [covDerivBarD]))) s φ + · exact symbol_mem_adjoin UpSinglet.gaugeAlgebraAction (h.u i) hA + (fun n l φ => Or.inr (hf i l _ (by simp [covDerivU]))) s φ + · exact symbol_mem_adjoin (actionConj UpSinglet.gaugeAlgebraAction) (h.baru i) hA + (fun n l φ => Or.inr (hf i l _ (by simp [covDerivBarU]))) s φ + · exact symbol_mem_adjoin QuarkDoublet.gaugeAlgebraAction (h.Q i) hA + (fun n l φ => Or.inr (hf i l _ (by simp [covDerivQ]))) s φ + · exact symbol_mem_adjoin (actionConj QuarkDoublet.gaugeAlgebraAction) (h.barQ i) hA + (fun n l φ => Or.inr (hf i l _ (by simp [covDerivBarQ]))) s φ + · exact symbol_mem_adjoin LeptonDoublet.gaugeAlgebraAction (h.L i) hA + (fun n l φ => Or.inr (hf i l _ (by simp [covDerivL]))) s φ + · exact symbol_mem_adjoin (actionConj LeptonDoublet.gaugeAlgebraAction) (h.barL i) hA + (fun n l φ => Or.inr (hf i l _ (by simp [covDerivBarL]))) s φ + · exact symbol_mem_adjoin LeptonSinglet.gaugeAlgebraAction (h.e i) hA + (fun n l φ => Or.inr (hf i l _ (by simp [covDerivE]))) s φ + · exact symbol_mem_adjoin (actionConj LeptonSinglet.gaugeAlgebraAction) (h.bare i) hA + (fun n l φ => Or.inr (hf i l _ (by simp [covDerivBarE]))) s φ + /-- The covariant towers generate the field algebra: replacing the plain derivative symbols of every matter field by their covariant derivative towers does not change the generated algebra; only the gauge-field symbols remain plain. -/ @@ -1105,392 +1078,207 @@ lemma fieldAlgebra_eq_covDeriv : 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 rw [Set.union_assoc] - show Algebra.adjoin ℂ h.symbols = Algebra.adjoin ℂ - ((⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.A s μ)) ∪ - h.matterTowers) - have hA : ∀ s μ ψ, h.A s μ ψ ∈ - (⋃ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), Set.range (h.A s μ)) ∪ - h.matterTowers := - fun s μ ψ => Or.inl (Set.mem_iUnion_of_mem s (Set.mem_iUnion_of_mem μ ⟨ψ, rfl⟩)) - have hA' : ∀ s μ ψ, h.A s μ ψ ∈ h.symbols := + refine le_antisymm (Algebra.adjoin_le h.symbols_subset_adjoin_matterTowers) + (Algebra.adjoin_le ?_) + have hA : ∀ s μ ψ, h.A s μ ψ ∈ h.symbols := fun s μ ψ => Or.inl (Or.inl (Set.mem_iUnion_of_mem s (Set.mem_iUnion_of_mem μ ⟨ψ, rfl⟩))) - refine le_antisymm (Algebra.adjoin_le ?_) (Algebra.adjoin_le ?_) - -- every bare symbol is a polynomial in the gauge-field symbols and its tower - · rintro b ((hb | hb) | hb) - · exact Algebra.subset_adjoin (Or.inl hb) - · simp only [Set.mem_iUnion] at hb - obtain ⟨s, ⟨φ, rfl⟩ | ⟨φ, rfl⟩⟩ := hb - · exact IsGaugeField.symbol_mem_adjoin HiggsVec.gaugeAlgebraAction h.H hA - (fun n l φ => Or.inr (Or.inl (Set.mem_iUnion_of_mem n - (Set.mem_iUnion_of_mem l (by simp [covDerivH]))))) s φ - · exact IsGaugeField.symbol_mem_adjoin (LocalGaugeData.actionConj HiggsVec.gaugeAlgebraAction) - h.barH hA (fun n l φ => Or.inr (Or.inl (Set.mem_iUnion_of_mem n - (Set.mem_iUnion_of_mem l (by simp [covDerivBarH]))))) s φ - · simp only [Set.mem_iUnion] at hb - obtain ⟨i, s, hb⟩ := hb - rcases hb with (((((((((⟨φ, rfl⟩ | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | - ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) - · exact IsGaugeField.symbol_mem_adjoin DownSinglet.gaugeAlgebraAction (h.d i) hA - (fun n l φ => Or.inr (Or.inr (Set.mem_iUnion_of_mem i (Set.mem_iUnion_of_mem n - (Set.mem_iUnion_of_mem l (by simp [covDerivD])))))) s φ - · exact IsGaugeField.symbol_mem_adjoin - (LocalGaugeData.actionConj DownSinglet.gaugeAlgebraAction) (h.bard i) hA - (fun n l φ => Or.inr (Or.inr (Set.mem_iUnion_of_mem i (Set.mem_iUnion_of_mem n - (Set.mem_iUnion_of_mem l (by simp [covDerivBarD])))))) s φ - · exact IsGaugeField.symbol_mem_adjoin UpSinglet.gaugeAlgebraAction (h.u i) hA - (fun n l φ => Or.inr (Or.inr (Set.mem_iUnion_of_mem i (Set.mem_iUnion_of_mem n - (Set.mem_iUnion_of_mem l (by simp [covDerivU])))))) s φ - · exact IsGaugeField.symbol_mem_adjoin - (LocalGaugeData.actionConj UpSinglet.gaugeAlgebraAction) (h.baru i) hA - (fun n l φ => Or.inr (Or.inr (Set.mem_iUnion_of_mem i (Set.mem_iUnion_of_mem n - (Set.mem_iUnion_of_mem l (by simp [covDerivBarU])))))) s φ - · exact IsGaugeField.symbol_mem_adjoin QuarkDoublet.gaugeAlgebraAction (h.Q i) hA - (fun n l φ => Or.inr (Or.inr (Set.mem_iUnion_of_mem i (Set.mem_iUnion_of_mem n - (Set.mem_iUnion_of_mem l (by simp [covDerivQ])))))) s φ - · exact IsGaugeField.symbol_mem_adjoin - (LocalGaugeData.actionConj QuarkDoublet.gaugeAlgebraAction) (h.barQ i) hA - (fun n l φ => Or.inr (Or.inr (Set.mem_iUnion_of_mem i (Set.mem_iUnion_of_mem n - (Set.mem_iUnion_of_mem l (by simp [covDerivBarQ])))))) s φ - · exact IsGaugeField.symbol_mem_adjoin LeptonDoublet.gaugeAlgebraAction (h.L i) hA - (fun n l φ => Or.inr (Or.inr (Set.mem_iUnion_of_mem i (Set.mem_iUnion_of_mem n - (Set.mem_iUnion_of_mem l (by simp [covDerivL])))))) s φ - · exact IsGaugeField.symbol_mem_adjoin - (LocalGaugeData.actionConj LeptonDoublet.gaugeAlgebraAction) (h.barL i) hA - (fun n l φ => Or.inr (Or.inr (Set.mem_iUnion_of_mem i (Set.mem_iUnion_of_mem n - (Set.mem_iUnion_of_mem l (by simp [covDerivBarL])))))) s φ - · exact IsGaugeField.symbol_mem_adjoin LeptonSinglet.gaugeAlgebraAction (h.e i) hA - (fun n l φ => Or.inr (Or.inr (Set.mem_iUnion_of_mem i (Set.mem_iUnion_of_mem n - (Set.mem_iUnion_of_mem l (by simp [covDerivE])))))) s φ - · exact IsGaugeField.symbol_mem_adjoin - (LocalGaugeData.actionConj LeptonSinglet.gaugeAlgebraAction) (h.bare i) hA - (fun n l φ => Or.inr (Or.inr (Set.mem_iUnion_of_mem i (Set.mem_iUnion_of_mem n - (Set.mem_iUnion_of_mem l (by simp [covDerivBarE])))))) s φ -- every symbol of a tower is a polynomial in the gauge-field symbols and its bare symbols - · rintro b (hb | hb) - · exact Algebra.subset_adjoin (Or.inl (Or.inl hb)) - · refine h.matterTowers_induction (fun b => b ∈ Algebra.adjoin ℂ h.symbols) hb - ?_ ?_ ?_ ?_ ?_ ?_ ?_ ?_ ?_ ?_ ?_ ?_ - · exact fun n l φ => IsGaugeField.covDerivIter_mem_adjoin _ _ hA' (fun s φ => - Or.inl (Or.inr (Set.mem_iUnion_of_mem s (by simp)))) n l φ - · exact fun n l φ => IsGaugeField.covDerivIter_mem_adjoin _ _ hA' (fun s φ => - Or.inl (Or.inr (Set.mem_iUnion_of_mem s (by simp)))) n l φ - all_goals exact fun i n l φ => IsGaugeField.covDerivIter_mem_adjoin _ _ hA' (fun s φ => - Or.inr (Set.mem_iUnion_of_mem i (Set.mem_iUnion_of_mem s (by simp)))) n l φ + rintro b (hb | hb) + · exact Algebra.subset_adjoin (Or.inl (Or.inl hb)) + · refine h.matterTowers_induction (· ∈ Algebra.adjoin ℂ h.symbols) hb + ?_ ?_ ?_ ?_ ?_ ?_ ?_ ?_ ?_ ?_ ?_ ?_ + · exact fun n l φ => covDerivIter_mem_adjoin _ _ hA (fun s φ => + Or.inl (Or.inr (Set.mem_iUnion_of_mem s (by simp)))) n l φ + · exact fun n l φ => covDerivIter_mem_adjoin _ _ hA (fun s φ => + Or.inl (Or.inr (Set.mem_iUnion_of_mem s (by simp)))) n l φ + all_goals exact fun i n l φ => covDerivIter_mem_adjoin _ _ hA (fun s φ => + Or.inr (Set.mem_iUnion_of_mem i (Set.mem_iUnion_of_mem s (by simp)))) n l φ /-! -## J. Gauge covariance of the covariant towers +## I. Gauge covariance of the covariant towers Each matter tower transforms in the representation of its species, by -`LocalGaugeData.TransformsIn.covDerivIter`; the field-strength tower transforms in the adjoint. -At the -base point that is the action of the base-point value of the gauge jet alone, and a pure -gauge jet — one with trivial base-point value — fixes every tower. +`TransformsIn.covDerivIter`, and the field-strength tower in the adjoint. At the base point +that is the action of the base-point value of the gauge jet alone (`repJet_covDerivIter`), +and a pure gauge jet — one with trivial base-point value — fixes every tower. The section +instantiates this species by species, the conjugate families through the conjugate action +and representation. -/ -/-- The covariant tower of the Higgs transforms in the Higgs representation. -/ -lemma transformsIn_covDerivH (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : - LocalGaugeData.TransformsIn repJet HiggsVec.repJetGaugeGroupI - (IsGaugeField.covDerivIter h.A HiggsVec.gaugeAlgebraAction h.H n l) := - LocalGaugeData.TransformsIn.covDerivIter h.repJet_A h.repJet_H - HiggsVec.isInfinitesimalActionOf n l - -/-- The covariant tower of the conjugate Higgs transforms in the conjugate Higgs - representation. -/ -lemma transformsIn_covDerivBarH (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : - LocalGaugeData.TransformsIn repJet (JetComponentSpace.repConj HiggsVec.repJetGaugeGroupI) - (IsGaugeField.covDerivIter h.A (LocalGaugeData.actionConj HiggsVec.gaugeAlgebraAction) - h.barH n l) := - LocalGaugeData.TransformsIn.covDerivIter h.repJet_A h.repJet_barH - HiggsVec.isInfinitesimalActionOf.conj n l - -/-- The covariant tower of the down-type quarks transforms in their representation. -/ -lemma transformsIn_covDerivD (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : - LocalGaugeData.TransformsIn repJet DownSinglet.repJetGaugeGroupI - (IsGaugeField.covDerivIter h.A DownSinglet.gaugeAlgebraAction (h.d i) n l) := - LocalGaugeData.TransformsIn.covDerivIter h.repJet_A (h.repJet_d i) - DownSinglet.isInfinitesimalActionOf n l - -/-- The covariant tower of the conjugate down-type quarks transforms in their conjugate - representation. -/ -lemma transformsIn_covDerivBarD (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : - LocalGaugeData.TransformsIn repJet (JetComponentSpace.repConj DownSinglet.repJetGaugeGroupI) - (IsGaugeField.covDerivIter h.A (LocalGaugeData.actionConj DownSinglet.gaugeAlgebraAction) - (h.bard i) n l) := - LocalGaugeData.TransformsIn.covDerivIter h.repJet_A (h.repJet_bard i) - DownSinglet.isInfinitesimalActionOf.conj n l - -/-- The covariant tower of the up-type quarks transforms in their representation. -/ -lemma transformsIn_covDerivU (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : - LocalGaugeData.TransformsIn repJet UpSinglet.repJetGaugeGroupI - (IsGaugeField.covDerivIter h.A UpSinglet.gaugeAlgebraAction (h.u i) n l) := - LocalGaugeData.TransformsIn.covDerivIter h.repJet_A (h.repJet_u i) - UpSinglet.isInfinitesimalActionOf n l - -/-- The covariant tower of the conjugate up-type quarks transforms in their conjugate - representation. -/ -lemma transformsIn_covDerivBarU (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : - LocalGaugeData.TransformsIn repJet (JetComponentSpace.repConj UpSinglet.repJetGaugeGroupI) - (IsGaugeField.covDerivIter h.A (LocalGaugeData.actionConj UpSinglet.gaugeAlgebraAction) - (h.baru i) n l) := - LocalGaugeData.TransformsIn.covDerivIter h.repJet_A (h.repJet_baru i) - UpSinglet.isInfinitesimalActionOf.conj n l - -/-- The covariant tower of the quark doublets transforms in their representation. -/ -lemma transformsIn_covDerivQ (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : - LocalGaugeData.TransformsIn repJet QuarkDoublet.repJetGaugeGroupI - (IsGaugeField.covDerivIter h.A QuarkDoublet.gaugeAlgebraAction (h.Q i) n l) := - LocalGaugeData.TransformsIn.covDerivIter h.repJet_A (h.repJet_Q i) - QuarkDoublet.isInfinitesimalActionOf n l - -/-- The covariant tower of the conjugate quark doublets transforms in their conjugate - representation. -/ -lemma transformsIn_covDerivBarQ (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : - LocalGaugeData.TransformsIn repJet (JetComponentSpace.repConj QuarkDoublet.repJetGaugeGroupI) - (IsGaugeField.covDerivIter h.A (LocalGaugeData.actionConj QuarkDoublet.gaugeAlgebraAction) - (h.barQ i) n l) := - LocalGaugeData.TransformsIn.covDerivIter h.repJet_A (h.repJet_barQ i) - QuarkDoublet.isInfinitesimalActionOf.conj n l - -/-- The covariant tower of the lepton doublets transforms in their representation. -/ -lemma transformsIn_covDerivL (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : - LocalGaugeData.TransformsIn repJet LeptonDoublet.repJetGaugeGroupI - (IsGaugeField.covDerivIter h.A LeptonDoublet.gaugeAlgebraAction (h.L i) n l) := - LocalGaugeData.TransformsIn.covDerivIter h.repJet_A (h.repJet_L i) - LeptonDoublet.isInfinitesimalActionOf n l - -/-- The covariant tower of the conjugate lepton doublets transforms in their conjugate - representation. -/ -lemma transformsIn_covDerivBarL (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : - LocalGaugeData.TransformsIn repJet (JetComponentSpace.repConj LeptonDoublet.repJetGaugeGroupI) - (IsGaugeField.covDerivIter h.A (LocalGaugeData.actionConj LeptonDoublet.gaugeAlgebraAction) - (h.barL i) n l) := - LocalGaugeData.TransformsIn.covDerivIter h.repJet_A (h.repJet_barL i) - LeptonDoublet.isInfinitesimalActionOf.conj n l - -/-- The covariant tower of the lepton singlets transforms in their representation. -/ -lemma transformsIn_covDerivE (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : - LocalGaugeData.TransformsIn repJet LeptonSinglet.repJetGaugeGroupI - (IsGaugeField.covDerivIter h.A LeptonSinglet.gaugeAlgebraAction (h.e i) n l) := - LocalGaugeData.TransformsIn.covDerivIter h.repJet_A (h.repJet_e i) - LeptonSinglet.isInfinitesimalActionOf n l - -/-- The covariant tower of the conjugate lepton singlets transforms in their conjugate - representation. -/ -lemma transformsIn_covDerivBarE (i : Fin 3) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : - LocalGaugeData.TransformsIn repJet (JetComponentSpace.repConj LeptonSinglet.repJetGaugeGroupI) - (IsGaugeField.covDerivIter h.A (LocalGaugeData.actionConj LeptonSinglet.gaugeAlgebraAction) - (h.bare i) n l) := - LocalGaugeData.TransformsIn.covDerivIter h.repJet_A (h.repJet_bare i) - LeptonSinglet.isInfinitesimalActionOf.conj n l - -/-- The covariant tower of the Higgs transforms through the base point of a gauge jet. -/ +/-- The covariant tower of a matter family transforms through the base point of a gauge + jet alone, given the gauge law of the family and the infinitesimal action of its + species. -/ +lemma repJet_covDerivIter {V : Type} [AddCommGroup V] [Module ℂ V] [FiniteDimensional ℂ V] + {rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)} {act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℂ] V} + {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B} (hF : TransformsIn repJet rep F) + (hact : localGaugeData.IsInfinitesimalActionOf act rep) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI) (φ : Module.Dual ℂ V) : + repJet U (covDerivIter h.A act F n l 0 φ) = + covDerivIter h.A act F n l 0 (repDualCoeff rep U⁻¹ 0 φ) := + (TransformsIn.covDerivIter h.repJet_A hF hact n l).repGauge_zero U φ + +/-- The Higgs tower transforms through the base point of a gauge jet. -/ lemma repJet_covDerivH {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI) - (φ : Module.Dual ℂ HiggsVec) : - repJet U (h.covDerivH l φ) = - h.covDerivH l (IsGaugeField.repDualCoeff HiggsVec.repJetGaugeGroupI U⁻¹ 0 φ) := - (h.transformsIn_covDerivH n l).repGauge_zero U φ + (φ : Module.Dual ℂ HiggsVec) : repJet U (h.covDerivH l φ) = + h.covDerivH l (repDualCoeff HiggsVec.repJetGaugeGroupI U⁻¹ 0 φ) := + h.repJet_covDerivIter h.repJet_H HiggsVec.isInfinitesimalActionOf l U φ -/-- The covariant tower of the conjugate Higgs transforms through the base point of a gauge - jet. -/ +/-- The conjugate Higgs tower transforms through the base point of a gauge jet. -/ lemma repJet_covDerivBarH {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI) - (φ : Module.Dual ℂ (ConjModule HiggsVec)) : - repJet U (h.covDerivBarH l φ) = - h.covDerivBarH l - (IsGaugeField.repDualCoeff (JetComponentSpace.repConj HiggsVec.repJetGaugeGroupI) - U⁻¹ 0 φ) := - (h.transformsIn_covDerivBarH n l).repGauge_zero U φ - -/-- The covariant tower of the down-type quarks transforms through the base point of a - gauge jet. -/ + (φ : Module.Dual ℂ (ConjModule HiggsVec)) : repJet U (h.covDerivBarH l φ) = + h.covDerivBarH l (repDualCoeff (repConj HiggsVec.repJetGaugeGroupI) U⁻¹ 0 φ) := + h.repJet_covDerivIter h.repJet_barH HiggsVec.isInfinitesimalActionOf.conj l U φ + +/-- The down-type quark tower transforms through the base point of a gauge jet. -/ lemma repJet_covDerivD (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI) - (φ : Module.Dual ℂ DownSinglet) : - repJet U (h.covDerivD i l φ) = - h.covDerivD i l (IsGaugeField.repDualCoeff DownSinglet.repJetGaugeGroupI U⁻¹ 0 φ) := - (h.transformsIn_covDerivD i n l).repGauge_zero U φ + (φ : Module.Dual ℂ DownSinglet) : repJet U (h.covDerivD i l φ) = + h.covDerivD i l (repDualCoeff DownSinglet.repJetGaugeGroupI U⁻¹ 0 φ) := + h.repJet_covDerivIter (h.repJet_d i) DownSinglet.isInfinitesimalActionOf l U φ -/-- The covariant tower of the conjugate down-type quarks transforms through the base point - of a gauge jet. -/ +/-- The conjugate down-type quark tower transforms through the base point of a gauge jet. -/ lemma repJet_covDerivBarD (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI) - (φ : Module.Dual ℂ (ConjModule DownSinglet)) : - repJet U (h.covDerivBarD i l φ) = - h.covDerivBarD i l - (IsGaugeField.repDualCoeff (JetComponentSpace.repConj DownSinglet.repJetGaugeGroupI) - U⁻¹ 0 φ) := - (h.transformsIn_covDerivBarD i n l).repGauge_zero U φ - -/-- The covariant tower of the up-type quarks transforms through the base point of a gauge - jet. -/ + (φ : Module.Dual ℂ (ConjModule DownSinglet)) : repJet U (h.covDerivBarD i l φ) = + h.covDerivBarD i l (repDualCoeff (repConj DownSinglet.repJetGaugeGroupI) U⁻¹ 0 φ) := + h.repJet_covDerivIter (h.repJet_bard i) DownSinglet.isInfinitesimalActionOf.conj l U φ + +/-- The up-type quark tower transforms through the base point of a gauge jet. -/ lemma repJet_covDerivU (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI) - (φ : Module.Dual ℂ UpSinglet) : - repJet U (h.covDerivU i l φ) = - h.covDerivU i l (IsGaugeField.repDualCoeff UpSinglet.repJetGaugeGroupI U⁻¹ 0 φ) := - (h.transformsIn_covDerivU i n l).repGauge_zero U φ + (φ : Module.Dual ℂ UpSinglet) : repJet U (h.covDerivU i l φ) = + h.covDerivU i l (repDualCoeff UpSinglet.repJetGaugeGroupI U⁻¹ 0 φ) := + h.repJet_covDerivIter (h.repJet_u i) UpSinglet.isInfinitesimalActionOf l U φ -/-- The covariant tower of the conjugate up-type quarks transforms through the base point - of a gauge jet. -/ +/-- The conjugate up-type quark tower transforms through the base point of a gauge jet. -/ lemma repJet_covDerivBarU (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI) - (φ : Module.Dual ℂ (ConjModule UpSinglet)) : - repJet U (h.covDerivBarU i l φ) = - h.covDerivBarU i l - (IsGaugeField.repDualCoeff (JetComponentSpace.repConj UpSinglet.repJetGaugeGroupI) - U⁻¹ 0 φ) := - (h.transformsIn_covDerivBarU i n l).repGauge_zero U φ - -/-- The covariant tower of the quark doublets transforms through the base point of a gauge - jet. -/ + (φ : Module.Dual ℂ (ConjModule UpSinglet)) : repJet U (h.covDerivBarU i l φ) = + h.covDerivBarU i l (repDualCoeff (repConj UpSinglet.repJetGaugeGroupI) U⁻¹ 0 φ) := + h.repJet_covDerivIter (h.repJet_baru i) UpSinglet.isInfinitesimalActionOf.conj l U φ + +/-- The quark doublet tower transforms through the base point of a gauge jet. -/ lemma repJet_covDerivQ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI) - (φ : Module.Dual ℂ QuarkDoublet) : - repJet U (h.covDerivQ i l φ) = - h.covDerivQ i l (IsGaugeField.repDualCoeff QuarkDoublet.repJetGaugeGroupI U⁻¹ 0 φ) := - (h.transformsIn_covDerivQ i n l).repGauge_zero U φ + (φ : Module.Dual ℂ QuarkDoublet) : repJet U (h.covDerivQ i l φ) = + h.covDerivQ i l (repDualCoeff QuarkDoublet.repJetGaugeGroupI U⁻¹ 0 φ) := + h.repJet_covDerivIter (h.repJet_Q i) QuarkDoublet.isInfinitesimalActionOf l U φ -/-- The covariant tower of the conjugate quark doublets transforms through the base point - of a gauge jet. -/ +/-- The conjugate quark doublet tower transforms through the base point of a gauge jet. -/ lemma repJet_covDerivBarQ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI) - (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) : - repJet U (h.covDerivBarQ i l φ) = - h.covDerivBarQ i l - (IsGaugeField.repDualCoeff (JetComponentSpace.repConj QuarkDoublet.repJetGaugeGroupI) - U⁻¹ 0 φ) := - (h.transformsIn_covDerivBarQ i n l).repGauge_zero U φ - -/-- The covariant tower of the lepton doublets transforms through the base point of a gauge - jet. -/ + (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) : repJet U (h.covDerivBarQ i l φ) = + h.covDerivBarQ i l (repDualCoeff (repConj QuarkDoublet.repJetGaugeGroupI) U⁻¹ 0 φ) := + h.repJet_covDerivIter (h.repJet_barQ i) QuarkDoublet.isInfinitesimalActionOf.conj l U φ + +/-- The lepton doublet tower transforms through the base point of a gauge jet. -/ lemma repJet_covDerivL (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI) - (φ : Module.Dual ℂ LeptonDoublet) : - repJet U (h.covDerivL i l φ) = - h.covDerivL i l (IsGaugeField.repDualCoeff LeptonDoublet.repJetGaugeGroupI U⁻¹ 0 φ) := - (h.transformsIn_covDerivL i n l).repGauge_zero U φ + (φ : Module.Dual ℂ LeptonDoublet) : repJet U (h.covDerivL i l φ) = + h.covDerivL i l (repDualCoeff LeptonDoublet.repJetGaugeGroupI U⁻¹ 0 φ) := + h.repJet_covDerivIter (h.repJet_L i) LeptonDoublet.isInfinitesimalActionOf l U φ -/-- The covariant tower of the conjugate lepton doublets transforms through the base point - of a gauge jet. -/ +/-- The conjugate lepton doublet tower transforms through the base point of a gauge jet. -/ lemma repJet_covDerivBarL (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI) - (φ : Module.Dual ℂ (ConjModule LeptonDoublet)) : - repJet U (h.covDerivBarL i l φ) = - h.covDerivBarL i l - (IsGaugeField.repDualCoeff (JetComponentSpace.repConj LeptonDoublet.repJetGaugeGroupI) - U⁻¹ 0 φ) := - (h.transformsIn_covDerivBarL i n l).repGauge_zero U φ - -/-- The covariant tower of the lepton singlets transforms through the base point of a gauge - jet. -/ + (φ : Module.Dual ℂ (ConjModule LeptonDoublet)) : repJet U (h.covDerivBarL i l φ) = + h.covDerivBarL i l (repDualCoeff (repConj LeptonDoublet.repJetGaugeGroupI) U⁻¹ 0 φ) := + h.repJet_covDerivIter (h.repJet_barL i) LeptonDoublet.isInfinitesimalActionOf.conj l U φ + +/-- The lepton singlet tower transforms through the base point of a gauge jet. -/ lemma repJet_covDerivE (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI) - (φ : Module.Dual ℂ LeptonSinglet) : - repJet U (h.covDerivE i l φ) = - h.covDerivE i l (IsGaugeField.repDualCoeff LeptonSinglet.repJetGaugeGroupI U⁻¹ 0 φ) := - (h.transformsIn_covDerivE i n l).repGauge_zero U φ + (φ : Module.Dual ℂ LeptonSinglet) : repJet U (h.covDerivE i l φ) = + h.covDerivE i l (repDualCoeff LeptonSinglet.repJetGaugeGroupI U⁻¹ 0 φ) := + h.repJet_covDerivIter (h.repJet_e i) LeptonSinglet.isInfinitesimalActionOf l U φ -/-- The covariant tower of the conjugate lepton singlets transforms through the base point - of a gauge jet. -/ +/-- The conjugate lepton singlet tower transforms through the base point of a gauge jet. -/ lemma repJet_covDerivBarE (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI) - (φ : Module.Dual ℂ (ConjModule LeptonSinglet)) : - repJet U (h.covDerivBarE i l φ) = - h.covDerivBarE i l - (IsGaugeField.repDualCoeff (JetComponentSpace.repConj LeptonSinglet.repJetGaugeGroupI) - U⁻¹ 0 φ) := - (h.transformsIn_covDerivBarE i n l).repGauge_zero U φ + (φ : Module.Dual ℂ (ConjModule LeptonSinglet)) : repJet U (h.covDerivBarE i l φ) = + h.covDerivBarE i l (repDualCoeff (repConj LeptonSinglet.repJetGaugeGroupI) U⁻¹ 0 φ) := + h.repJet_covDerivIter (h.repJet_bare i) LeptonSinglet.isInfinitesimalActionOf.conj l U φ -/-- A pure gauge jet fixes the covariant tower of the Higgs. -/ +/-- A pure gauge jet fixes the Higgs tower. -/ lemma repJet_covDerivH_of_mem_truncationKer_zero {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : localGaugeData.truncationKer 0) (φ : Module.Dual ℂ HiggsVec) : - 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 φ + repJet U.1 (h.covDerivH l φ) = h.covDerivH l φ := by + rw [h.repJet_covDerivH, repDualCoeff_zero_of_mem_truncationKer_zero + HiggsVec.repCoeff_zero_of_eval_eq_one] -/-- A pure gauge jet fixes the covariant tower of the conjugate Higgs. -/ +/-- A pure gauge jet fixes the conjugate Higgs tower. -/ lemma repJet_covDerivBarH_of_mem_truncationKer_zero {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : localGaugeData.truncationKer 0) (φ : Module.Dual ℂ (ConjModule HiggsVec)) : - repJet U.1 (h.covDerivBarH l φ) = h.covDerivBarH l φ := - (h.transformsIn_covDerivBarH n l).repGauge_eq_of_mem_truncationKer_zero - (fun hW => LocalGaugeData.repCoeff_repConj_zero_eq_id - (HiggsVec.repCoeff_zero_of_eval_eq_one hW)) U φ - -/-- A pure gauge jet fixes the covariant tower of the down-type quarks. -/ -lemma repJet_covDerivD_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} - (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : localGaugeData.truncationKer 0) - (φ : Module.Dual ℂ DownSinglet) : - 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 φ - -/-- A pure gauge jet fixes the covariant tower of the conjugate down-type quarks. -/ + repJet U.1 (h.covDerivBarH l φ) = h.covDerivBarH l φ := by + rw [h.repJet_covDerivBarH, repDualCoeff_zero_of_mem_truncationKer_zero fun hW => + repCoeff_repConj_zero_eq_id (HiggsVec.repCoeff_zero_of_eval_eq_one hW)] + +/-- A pure gauge jet fixes the down-type quark tower. -/ +lemma repJet_covDerivD_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (U : localGaugeData.truncationKer 0) (φ : Module.Dual ℂ DownSinglet) : + repJet U.1 (h.covDerivD i l φ) = h.covDerivD i l φ := by + rw [h.repJet_covDerivD, repDualCoeff_zero_of_mem_truncationKer_zero + DownSinglet.repCoeff_zero_of_eval_eq_one] + +/-- A pure gauge jet fixes the conjugate down-type quark tower. -/ lemma repJet_covDerivBarD_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : localGaugeData.truncationKer 0) (φ : Module.Dual ℂ (ConjModule DownSinglet)) : - 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 => LocalGaugeData.repCoeff_repConj_zero_eq_id - (DownSinglet.repCoeff_zero_of_eval_eq_one hW)) U φ - -/-- A pure gauge jet fixes the covariant tower of the up-type quarks. -/ -lemma repJet_covDerivU_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} - (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : localGaugeData.truncationKer 0) - (φ : Module.Dual ℂ UpSinglet) : - 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 φ - -/-- A pure gauge jet fixes the covariant tower of the conjugate up-type quarks. -/ + repJet U.1 (h.covDerivBarD i l φ) = h.covDerivBarD i l φ := by + rw [h.repJet_covDerivBarD, repDualCoeff_zero_of_mem_truncationKer_zero fun hW => + repCoeff_repConj_zero_eq_id (DownSinglet.repCoeff_zero_of_eval_eq_one hW)] + +/-- A pure gauge jet fixes the up-type quark tower. -/ +lemma repJet_covDerivU_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (U : localGaugeData.truncationKer 0) (φ : Module.Dual ℂ UpSinglet) : + repJet U.1 (h.covDerivU i l φ) = h.covDerivU i l φ := by + rw [h.repJet_covDerivU, repDualCoeff_zero_of_mem_truncationKer_zero + UpSinglet.repCoeff_zero_of_eval_eq_one] + +/-- A pure gauge jet fixes the conjugate up-type quark tower. -/ lemma repJet_covDerivBarU_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : localGaugeData.truncationKer 0) (φ : Module.Dual ℂ (ConjModule UpSinglet)) : - 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 => LocalGaugeData.repCoeff_repConj_zero_eq_id - (UpSinglet.repCoeff_zero_of_eval_eq_one hW)) U φ - -/-- A pure gauge jet fixes the covariant tower of the quark doublets. -/ -lemma repJet_covDerivQ_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} - (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : localGaugeData.truncationKer 0) - (φ : Module.Dual ℂ QuarkDoublet) : - 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 φ - -/-- A pure gauge jet fixes the covariant tower of the conjugate quark doublets. -/ + repJet U.1 (h.covDerivBarU i l φ) = h.covDerivBarU i l φ := by + rw [h.repJet_covDerivBarU, repDualCoeff_zero_of_mem_truncationKer_zero fun hW => + repCoeff_repConj_zero_eq_id (UpSinglet.repCoeff_zero_of_eval_eq_one hW)] + +/-- A pure gauge jet fixes the quark doublet tower. -/ +lemma repJet_covDerivQ_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (U : localGaugeData.truncationKer 0) (φ : Module.Dual ℂ QuarkDoublet) : + repJet U.1 (h.covDerivQ i l φ) = h.covDerivQ i l φ := by + rw [h.repJet_covDerivQ, repDualCoeff_zero_of_mem_truncationKer_zero + QuarkDoublet.repCoeff_zero_of_eval_eq_one] + +/-- A pure gauge jet fixes the conjugate quark doublet tower. -/ lemma repJet_covDerivBarQ_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : localGaugeData.truncationKer 0) (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) : - 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 => LocalGaugeData.repCoeff_repConj_zero_eq_id - (QuarkDoublet.repCoeff_zero_of_eval_eq_one hW)) U φ - -/-- A pure gauge jet fixes the covariant tower of the lepton doublets. -/ -lemma repJet_covDerivL_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} - (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : localGaugeData.truncationKer 0) - (φ : Module.Dual ℂ LeptonDoublet) : - 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 φ - -/-- A pure gauge jet fixes the covariant tower of the conjugate lepton doublets. -/ + repJet U.1 (h.covDerivBarQ i l φ) = h.covDerivBarQ i l φ := by + rw [h.repJet_covDerivBarQ, repDualCoeff_zero_of_mem_truncationKer_zero fun hW => + repCoeff_repConj_zero_eq_id (QuarkDoublet.repCoeff_zero_of_eval_eq_one hW)] + +/-- A pure gauge jet fixes the lepton doublet tower. -/ +lemma repJet_covDerivL_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (U : localGaugeData.truncationKer 0) (φ : Module.Dual ℂ LeptonDoublet) : + repJet U.1 (h.covDerivL i l φ) = h.covDerivL i l φ := by + rw [h.repJet_covDerivL, repDualCoeff_zero_of_mem_truncationKer_zero + LeptonDoublet.repCoeff_zero_of_eval_eq_one] + +/-- A pure gauge jet fixes the conjugate lepton doublet tower. -/ lemma repJet_covDerivBarL_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : localGaugeData.truncationKer 0) (φ : Module.Dual ℂ (ConjModule LeptonDoublet)) : - 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 => LocalGaugeData.repCoeff_repConj_zero_eq_id - (LeptonDoublet.repCoeff_zero_of_eval_eq_one hW)) U φ - -/-- A pure gauge jet fixes the covariant tower of the lepton singlets. -/ -lemma repJet_covDerivE_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} - (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : localGaugeData.truncationKer 0) - (φ : Module.Dual ℂ LeptonSinglet) : - 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 φ - -/-- A pure gauge jet fixes the covariant tower of the conjugate lepton singlets. -/ + repJet U.1 (h.covDerivBarL i l φ) = h.covDerivBarL i l φ := by + rw [h.repJet_covDerivBarL, repDualCoeff_zero_of_mem_truncationKer_zero fun hW => + repCoeff_repConj_zero_eq_id (LeptonDoublet.repCoeff_zero_of_eval_eq_one hW)] + +/-- A pure gauge jet fixes the lepton singlet tower. -/ +lemma repJet_covDerivE_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (U : localGaugeData.truncationKer 0) (φ : Module.Dual ℂ LeptonSinglet) : + repJet U.1 (h.covDerivE i l φ) = h.covDerivE i l φ := by + rw [h.repJet_covDerivE, repDualCoeff_zero_of_mem_truncationKer_zero + LeptonSinglet.repCoeff_zero_of_eval_eq_one] + +/-- A pure gauge jet fixes the conjugate lepton singlet tower. -/ lemma repJet_covDerivBarE_of_mem_truncationKer_zero (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : localGaugeData.truncationKer 0) (φ : Module.Dual ℂ (ConjModule LeptonSinglet)) : - 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 => LocalGaugeData.repCoeff_repConj_zero_eq_id - (LeptonSinglet.repCoeff_zero_of_eval_eq_one hW)) U φ + repJet U.1 (h.covDerivBarE i l φ) = h.covDerivBarE i l φ := by + rw [h.repJet_covDerivBarE, repDualCoeff_zero_of_mem_truncationKer_zero fun hW => + repCoeff_repConj_zero_eq_id (LeptonSinglet.repCoeff_zero_of_eval_eq_one hW)] /-- The covariant tower of the field strength is antisymmetric in its two covector indices: the field strength itself is, the gauge-field symbols commuting, and the @@ -1499,16 +1287,9 @@ lemma covDerivFieldStrength_swap (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ (φ : Module.Dual ℝ GaugeAlgebra) : h.covDerivFieldStrength l ν μ φ = - h.covDerivFieldStrength l μ ν φ := by rw [covDerivFieldStrength, covDerivFieldStrength, - show IsGaugeField.fieldStrength h.A ν μ = fun t => - IsGaugeField.fieldStrength h.A μ ν t from - funext fun t => IsGaugeField.fieldStrength_swap h.A_comm_A μ ν t, - IsGaugeField.iteratedCovDerivAdjoint_neg_fam] - -/-- The covariant tower of the field strength transforms in the adjoint. -/ -lemma transformsInAdjoint_covDerivFieldStrength (l : List (Fin 1 ⊕ Fin 3)) - (μ ν : Fin 1 ⊕ Fin 3) : - IsGaugeField.TransformsInAdjoint localGaugeData repJet - (IsGaugeField.iteratedCovDerivAdjoint h.A l (IsGaugeField.fieldStrength h.A μ ν)) := - IsGaugeField.transformsInAdjoint_iteratedCovDerivAdjoint h.repJet_A l μ ν + show fieldStrength h.A ν μ = fun t => - fieldStrength h.A μ ν t from + funext fun t => fieldStrength_swap h.A h.A_comm_A μ ν t, + iteratedCovDerivAdjoint_neg_fam] /-- The covariant tower of the field strength transforms through the base point of a gauge jet: no derivative of the gauge transformation enters. -/ @@ -1516,161 +1297,99 @@ lemma repJet_covDerivFieldStrength (U : JetGaugeGroupI) (l : List (Fin 1 ⊕ Fin (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : repJet U (h.covDerivFieldStrength l μ ν φ) = h.covDerivFieldStrength l μ ν (localGaugeData.adjointDualCoeff U⁻¹ 0 φ) := - (h.transformsInAdjoint_covDerivFieldStrength l μ ν).repGauge_zero U φ + (transformsInAdjoint_iteratedCovDerivAdjoint h.repJet_A l μ ν).repGauge_zero U φ /-- A pure gauge jet fixes the covariant tower of the field strength. -/ lemma repJet_covDerivFieldStrength_of_mem_truncationKer_zero (U : localGaugeData.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 μ ν φ - -end AlgebraRealization + repGauge_iteratedCovDerivAdjoint_fieldStrength_of_mem_truncationKer_zero h.repJet_A U l μ ν φ /-! -## K. The gauge action commutes with the Lorentz action +## J. The Lorentz laws of the covariant matter towers -The Lorentz law of a covariant matter tower needs the infinitesimal gauge action of its -species to commute with the Lorentz action on the value space. Each species proves this -commutation for itself, next to its `gaugeAlgebraAction` -(`HiggsVec.gaugeAlgebraAction_comm_repLorentz` and, for the ten fermion species, +`isLorentzCovDerivTransforms_covDerivIter` and its `_conj` form turn the bare Lorentz law +of each family, recorded by `AlgebraRealization`, into that of its covariant tower, given +the commutation of the infinitesimal gauge action of the species with its Lorentz action. +Each species proves that commutation next to its `gaugeAlgebraAction` +(`HiggsVec.gaugeAlgebraAction_comm_repLorentz` and, for the fermions, `gaugeAlgebraAction_comm_repLorentzGroup` in its own `GaugeAlgebraAction.lean`). -Conjugation transports the commutation to the conjugate families. - --/ - -section GaugeLorentzComm - -/-- 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) : - LocalGaugeData.actionConj act c (rep.conj Λ v) = - rep.conj Λ (LocalGaugeData.actionConj act c v) := - congrArg (conjEquiv (k := ℂ) (M := V)) (h c Λ _) - -end GaugeLorentzComm - -/-! - -## L. 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 `AlgebraRealization` into the covariant one, given the commutation of the -gauge action with the Lorentz action of section K; for the conjugate towers that -commutation is transported by `actionConj_comm_repConj`. -/ -namespace AlgebraRealization - -variable {B : Type} [Ring B] [Algebra ℂ B] - {repJet : Representation ℂ JetGaugeGroupI B} - {repLorentz : Representation ℂ SL(2,ℂ) B} - {massWeightPoly : B →ₐ[ℂ] Polynomial B} - (h : AlgebraRealization B repJet repLorentz massWeightPoly) - -/-- 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 +/-- The Higgs tower transforms as a Lorentz scalar. -/ +lemma repLorentz_covDerivH : IsLorentzCovDerivTransforms repLorentz + (Representation.trivial ℂ SL(2,ℂ) HiggsVec) (fun {_n} l => h.covDerivH l) := + isLorentzCovDerivTransforms_covDerivIter h.repLorentz_mul h.repJet_A HiggsVec.gaugeAlgebraAction_comm_repLorentz h.H h.repLorentz_H -/-- 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) h.barH h.repLorentz_barH - -/-- 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 +/-- The conjugate Higgs tower transforms as a Lorentz scalar. -/ +lemma repLorentz_covDerivBarH : IsLorentzCovDerivTransforms repLorentz + (Representation.trivial ℂ SL(2,ℂ) HiggsVec).conj (fun {_n} l => h.covDerivBarH l) := + isLorentzCovDerivTransforms_covDerivIter_conj h.repLorentz_mul h.repJet_A + HiggsVec.gaugeAlgebraAction_comm_repLorentz h.barH h.repLorentz_barH + +/-- The down-type quark tower transforms as a right-handed Weyl spinor. -/ +lemma repLorentz_covDerivD (i : Fin 3) : IsLorentzCovDerivTransforms repLorentz + DownSinglet.repLorentzGroup (fun {_n} l => h.covDerivD i l) := + isLorentzCovDerivTransforms_covDerivIter h.repLorentz_mul h.repJet_A DownSinglet.gaugeAlgebraAction_comm_repLorentzGroup (h.d i) (h.repLorentz_d i) -/-- 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) (h.bard i) (h.repLorentz_bard i) - -/-- 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 +/-- The conjugate down-type quark tower transforms in the conjugate Weyl representation. -/ +lemma repLorentz_covDerivBarD (i : Fin 3) : IsLorentzCovDerivTransforms repLorentz + DownSinglet.repLorentzGroup.conj (fun {_n} l => h.covDerivBarD i l) := + isLorentzCovDerivTransforms_covDerivIter_conj h.repLorentz_mul h.repJet_A + DownSinglet.gaugeAlgebraAction_comm_repLorentzGroup (h.bard i) (h.repLorentz_bard i) + +/-- The up-type quark tower transforms as a right-handed Weyl spinor. -/ +lemma repLorentz_covDerivU (i : Fin 3) : IsLorentzCovDerivTransforms repLorentz + UpSinglet.repLorentzGroup (fun {_n} l => h.covDerivU i l) := + isLorentzCovDerivTransforms_covDerivIter h.repLorentz_mul h.repJet_A UpSinglet.gaugeAlgebraAction_comm_repLorentzGroup (h.u i) (h.repLorentz_u i) -/-- 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) (h.baru i) (h.repLorentz_baru i) - -/-- 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 +/-- The conjugate up-type quark tower transforms in the conjugate Weyl representation. -/ +lemma repLorentz_covDerivBarU (i : Fin 3) : IsLorentzCovDerivTransforms repLorentz + UpSinglet.repLorentzGroup.conj (fun {_n} l => h.covDerivBarU i l) := + isLorentzCovDerivTransforms_covDerivIter_conj h.repLorentz_mul h.repJet_A + UpSinglet.gaugeAlgebraAction_comm_repLorentzGroup (h.baru i) (h.repLorentz_baru i) + +/-- The quark doublet tower transforms as a left-handed Weyl spinor. -/ +lemma repLorentz_covDerivQ (i : Fin 3) : IsLorentzCovDerivTransforms repLorentz + QuarkDoublet.repLorentzGroup (fun {_n} l => h.covDerivQ i l) := + isLorentzCovDerivTransforms_covDerivIter h.repLorentz_mul h.repJet_A QuarkDoublet.gaugeAlgebraAction_comm_repLorentzGroup (h.Q i) (h.repLorentz_Q i) -/-- 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) (h.barQ i) (h.repLorentz_barQ i) - -/-- 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 +/-- The conjugate quark doublet tower transforms in the conjugate Weyl representation. -/ +lemma repLorentz_covDerivBarQ (i : Fin 3) : IsLorentzCovDerivTransforms repLorentz + QuarkDoublet.repLorentzGroup.conj (fun {_n} l => h.covDerivBarQ i l) := + isLorentzCovDerivTransforms_covDerivIter_conj h.repLorentz_mul h.repJet_A + QuarkDoublet.gaugeAlgebraAction_comm_repLorentzGroup (h.barQ i) (h.repLorentz_barQ i) + +/-- The lepton doublet tower transforms as a left-handed Weyl spinor. -/ +lemma repLorentz_covDerivL (i : Fin 3) : IsLorentzCovDerivTransforms repLorentz + LeptonDoublet.repLorentzGroup (fun {_n} l => h.covDerivL i l) := + isLorentzCovDerivTransforms_covDerivIter h.repLorentz_mul h.repJet_A LeptonDoublet.gaugeAlgebraAction_comm_repLorentzGroup (h.L i) (h.repLorentz_L i) -/-- 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) (h.barL i) (h.repLorentz_barL i) - -/-- 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 +/-- The conjugate lepton doublet tower transforms in the conjugate Weyl representation. -/ +lemma repLorentz_covDerivBarL (i : Fin 3) : IsLorentzCovDerivTransforms repLorentz + LeptonDoublet.repLorentzGroup.conj (fun {_n} l => h.covDerivBarL i l) := + isLorentzCovDerivTransforms_covDerivIter_conj h.repLorentz_mul h.repJet_A + LeptonDoublet.gaugeAlgebraAction_comm_repLorentzGroup (h.barL i) (h.repLorentz_barL i) + +/-- The lepton singlet tower transforms as a right-handed Weyl spinor. -/ +lemma repLorentz_covDerivE (i : Fin 3) : IsLorentzCovDerivTransforms repLorentz + LeptonSinglet.repLorentzGroup (fun {_n} l => h.covDerivE i l) := + isLorentzCovDerivTransforms_covDerivIter h.repLorentz_mul h.repJet_A LeptonSinglet.gaugeAlgebraAction_comm_repLorentzGroup (h.e i) (h.repLorentz_e i) -/-- 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) (h.bare i) (h.repLorentz_bare i) +/-- The conjugate lepton singlet tower transforms in the conjugate Weyl representation. -/ +lemma repLorentz_covDerivBarE (i : Fin 3) : IsLorentzCovDerivTransforms repLorentz + LeptonSinglet.repLorentzGroup.conj (fun {_n} l => h.covDerivBarE i l) := + isLorentzCovDerivTransforms_covDerivIter_conj h.repLorentz_mul h.repJet_A + LeptonSinglet.gaugeAlgebraAction_comm_repLorentzGroup (h.bare i) (h.repLorentz_bare i) end AlgebraRealization From d995d36b87657b25dc1fef9fc2e0749059bc21c7 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 8 Sep 2026 20:35:43 +0100 Subject: [PATCH 304/367] refactor: shorten QED/Basic under the file-length cap and drop its style exception The two antidiagonal arguments now use Multiset.sum_antidiagonal_eq_of_fst_ne_zero and Multiset.sum_antidiagonal_assoc from Physlib.Mathematics.MultisetAntidiagonal. Co-Authored-By: Claude Fable 5.1 --- Physlib/Particles/QED/Basic.lean | 40 +++++--------------------------- scripts/style-exceptions.txt | 1 - 2 files changed, 6 insertions(+), 35 deletions(-) diff --git a/Physlib/Particles/QED/Basic.lean b/Physlib/Particles/QED/Basic.lean index 0a599bd49..d9d6994e4 100644 --- a/Physlib/Particles/QED/Basic.lean +++ b/Physlib/Particles/QED/Basic.lean @@ -8,6 +8,7 @@ module public import Physlib.Electromagnetism.Kinematics.GaugeTransformation public import Physlib.Electromagnetism.Dynamics.KineticTerm public import Physlib.Relativity.SL2C.Basic +public import Physlib.Mathematics.MultisetAntidiagonal public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basic public import Mathlib.LinearAlgebra.Finsupp.LSum public import Mathlib.Data.Multiset.Antidiagonal @@ -477,22 +478,8 @@ exactly the multinomial weight of the Leibniz rule. 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) + rw [Multiset.sum_antidiagonal_eq_of_fst_ne_zero t _ fun p _ hp => if_neg hp] + exact if_pos rfl /-- The Leibniz convolution of a phase family against a module-valued family of jets, over the antidiagonal of the derivative multiset: the formal @@ -565,24 +552,9 @@ lemma phaseAct_smul_right (c : ℂ) (s : Multiset (Fin 1 ⊕ Fin 3)) : 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 + simp only [phaseAct, Multiset.smul_sum, Multiset.sum_smul, Multiset.map_map, + Function.comp_def, smul_smul, smul_eq_mul] + exact (Multiset.sum_antidiagonal_assoc s fun a b c => (u a * v b) • f c).symm /-- Commutativity of the scalar convolution. -/ lemma phaseAct_comm (s : Multiset (Fin 1 ⊕ Fin 3)) : diff --git a/scripts/style-exceptions.txt b/scripts/style-exceptions.txt index 80c49ab83..e69de29bb 100644 --- a/scripts/style-exceptions.txt +++ b/scripts/style-exceptions.txt @@ -1 +0,0 @@ -Physlib/Particles/QED/Basic.lean : line 1 : ERR_NUM_LIN : 1700 file contains 1519 lines, try to split it up From 73f060c5478c3f36b1b9485779412ef944d429be Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 9 Sep 2026 05:39:37 +0100 Subject: [PATCH 305/367] feat: generalize MaurerCartan reuslts --- .../GaugeTheory/LocalGaugeData/Basic.lean | 33 ++ .../LocalGaugeData/Truncation.lean | 89 +++- .../GaugeAlgebra/JetGaugeAlgebra.lean | 96 ++++ .../GaugeGroup/LocalGaugeData.lean | 12 +- .../GaugeGroup/MaurerCartan/Freeness.lean | 442 ++++++++---------- 5 files changed, 413 insertions(+), 259 deletions(-) diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Basic.lean index 8b204f110..c9017c12c 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Basic.lean @@ -62,6 +62,7 @@ depends on that choice. - `LocalGaugeData.iteratedDeriv` : the iterated derivative `∂_s` on `𝔤J` along a multiset of directions, with `iteratedDeriv_cons`, `iteratedDeriv_add` and the iterated Leibniz rule `iteratedDeriv_bracket`. +- `LocalGaugeData.evalLie_iteratedDeriv_coord` : the Euler identity for the coordinates. - `LocalGaugeData.Faithful` : the jets are determined by their base-point Taylor data. ## iii. Table of contents @@ -108,6 +109,15 @@ structure LocalGaugeData (G : Type) [Group G] (𝔤 : Type) [LieRing 𝔤] [LieA 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 + /-- Multiplication of a jet by the spacetime coordinate `x_μ`. -/ + coord : (Fin 1 ⊕ Fin 3) → 𝔤J →ₗ[ℝ] 𝔤J + /-- The Leibniz rule for a coordinate: `∂_μ (x_ν a) = x_ν ∂_μ a + δ_{μν} a`. -/ + deriv_coord : ∀ (μ ν : Fin 1 ⊕ Fin 3) (a : 𝔤J), + deriv μ (coord ν a) = coord ν (deriv μ a) + if μ = ν then a else 0 + /-- A coordinate vanishes at the base point. -/ + evalLie_coord : ∀ (μ : Fin 1 ⊕ Fin 3) (a : 𝔤J), evalLie (coord μ a) = 0 + /-- The coordinates are central for the bracket. -/ + coord_lie : ∀ (μ : Fin 1 ⊕ Fin 3) (a b : 𝔤J), ⁅coord μ a, b⁆ = coord μ ⁅a, b⁆ /-- 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⁆ @@ -312,6 +322,29 @@ lemma iteratedDeriv_ofConstantLie_of_ne_zero {p : Multiset (Fin 1 ⊕ Fin 3)} (h TODO "Add product of LocalGaugeData." +/-- The Euler identity: at the base point, `x_μ` acts on the `s`-th derivative by + removing one `μ` and counting how many there were. With `∂_s` the derivatives in `s`, + `(∂_s (x_μ a))|₀ = s(μ) · (∂_{s − μ} a)|₀`. -/ +lemma evalLie_iteratedDeriv_coord (μ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (a : 𝔤J) : + jets.evalLie (jets.iteratedDeriv s (jets.coord μ a)) = + s.count μ • jets.evalLie (jets.iteratedDeriv (s.erase μ) a) := by + induction s using Multiset.induction_on generalizing a with + | empty => simp [jets.evalLie_coord] + | cons ν s ih => + rw [iteratedDeriv_cons_eq_comp_deriv, LinearMap.comp_apply, jets.deriv_coord, map_add, + map_add, ih] + by_cases hνμ : ν = μ + · subst hνμ + rw [if_pos rfl, Multiset.count_cons_self, Multiset.erase_cons_head, add_smul, one_smul, + ← LinearMap.comp_apply (jets.iteratedDeriv (s.erase ν)), + ← iteratedDeriv_cons_eq_comp_deriv] + by_cases hμ : ν ∈ s + · rw [Multiset.cons_erase hμ] + · rw [Multiset.count_eq_zero.mpr hμ, zero_smul, zero_smul] + · rw [if_neg hνμ, map_zero, map_zero, add_zero, Multiset.count_cons_of_ne (Ne.symm hνμ), + Multiset.erase_cons_tail s hνμ, ← LinearMap.comp_apply (jets.iteratedDeriv (s.erase μ)), + ← iteratedDeriv_cons_eq_comp_deriv] + /-! ## D. Faithful packages diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Truncation.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Truncation.lean index f9e957737..9beb9c001 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Truncation.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Truncation.lean @@ -46,7 +46,11 @@ most `n` derivatives by a pure translation. Maurer–Cartan data. - `LocalGaugeData.mem_truncationKer_iff_symmetrizedMaurerCartanCoeff_eq_zero` : the filtration through the symmetrized data. -- `LocalGaugeData.Free` : the symmetrized data are free coordinates on the pure jets. +- `LocalGaugeData.radial` : the radial component `∑_μ x_μ ω_μ` of the Maurer–Cartan form, + whose Taylor data are the symmetrized data. +- `LocalGaugeData.Free` : Taylor completeness and radial integrability, which make the + symmetrized data free coordinates on the pure jets, + `LocalGaugeData.symmetrizedMaurerCartanCoeff_surjective`. ## iii. Table of contents @@ -55,7 +59,8 @@ most `n` derivatives by a pure translation. - C. Normality - D. The projection onto the pure jets - E. Pure jets and their Maurer–Cartan data -- F. Free packages +- F. The radial component of the Maurer–Cartan form +- G. Free packages -/ @@ -366,26 +371,84 @@ end Faithful /-! -## F. Free packages +## F. The radial component of the Maurer–Cartan form + +The symmetrized Maurer–Cartan data of a pure jet are, up to the normalization by the +order, the base-point Taylor data of a single element of `𝔤J`: the radial component +`ρ(U) = ∑_μ x_μ ω_μ(U)` of the Maurer–Cartan form. This is the Euler identity applied +to each summand. + +-/ + +/-- The radial component `∑_μ x_μ ω_μ(U)` of the Maurer–Cartan form of a jet. -/ +noncomputable def radial (U : G) : 𝔤J := + ∑ μ, jets.coord μ (jets.maurerCartan U μ) + +/-- The symmetrized Maurer–Cartan data are the Taylor data of the radial component: + `sym(ω(U))_r|₀ = (1/|r|) (∂_r ρ(U))|₀`. -/ +lemma symmetrizedMaurerCartanCoeff_eq_evalLie_iteratedDeriv_radial (U : jets.truncationKer 0) + (r : {r : Multiset (Fin 1 ⊕ Fin 3) // r ≠ 0}) : + jets.symmetrizedMaurerCartanCoeff U r = + (1 / (r.1.card : ℝ)) • jets.evalLie (jets.iteratedDeriv r.1 (jets.radial U.1)) := by + classical + rw [symmetrizedMaurerCartanCoeff_apply, symmetrizedMaurerCartanForm, map_smul, + map_multiset_sum, Multiset.map_map, radial, map_sum, map_sum, + Finset.sum_congr rfl fun μ _ => jets.evalLie_iteratedDeriv_coord μ r.1 _, + Finset.sum_multiset_map_count, + Finset.sum_subset (Finset.subset_univ r.1.toFinset) fun μ _ hμ => by + rw [Multiset.count_eq_zero.mpr fun h => hμ (Multiset.mem_toFinset.mpr h), zero_smul]] + exact congrArg _ (Finset.sum_congr rfl fun μ _ => by + rw [Function.comp_apply, Multiset.sub_singleton]) + +/-! + +## G. Free packages -/ -/-- A package is free when it is faithful and, moreover, every family of gauge-algebra - elements indexed by nonempty multisets of directions is the symmetrized Maurer–Cartan - data of some pure jet. The symmetrized data are then free coordinates on the pure jets. - This holds for the full jet group of any matrix group, by integrating the radial - equation; like `Faithful` it is recorded separately from the structure because the - covariance theory does not need it, only the classification of invariants does. -/ +/-- A package is free when it is faithful and its jets are honest formal power series in + the coordinates: every family of base-point Taylor data is realized by an element of + `𝔤J` (Taylor completeness), and every element vanishing at the base point is the radial + component of the Maurer–Cartan form of a pure jet (radial integrability, the solution of + the Euler equation `∑_μ x_μ ∂_μ U = −i ρ U` with `U(0) = 1`). Both hold for the full jet + group of any matrix group. Freeness makes the symmetrized Maurer–Cartan data free + coordinates on the pure jets, `symmetrizedMaurerCartanCoeff_bijective`; like `Faithful` + it is recorded separately from the structure because the covariance theory does not + need it, only the classification of invariants does. -/ class Free (jets : LocalGaugeData G 𝔤 G₀ 𝔤J) : Prop extends Faithful jets where - symmetrizedMaurerCartanCoeff_surjective : Function.Surjective jets.symmetrizedMaurerCartanCoeff + exists_evalLie_iteratedDeriv_eq : ∀ c : Multiset (Fin 1 ⊕ Fin 3) → 𝔤, + ∃ Y : 𝔤J, ∀ s, jets.evalLie (jets.iteratedDeriv s Y) = c s + exists_radial_eq : ∀ ρ : 𝔤J, jets.evalLie ρ = 0 → ∃ U : jets.truncationKer 0, jets.radial U.1 = ρ section Free variable [jets.Free] -lemma symmetrizedMaurerCartanCoeff_surjective : - Function.Surjective jets.symmetrizedMaurerCartanCoeff := - Free.symmetrizedMaurerCartanCoeff_surjective +/-- Taylor completeness of a free package. -/ +lemma exists_evalLie_iteratedDeriv_eq (c : Multiset (Fin 1 ⊕ Fin 3) → 𝔤) : + ∃ Y : 𝔤J, ∀ s, jets.evalLie (jets.iteratedDeriv s Y) = c s := + Free.exists_evalLie_iteratedDeriv_eq c + +/-- Radial integrability of a free package. -/ +lemma exists_radial_eq {ρ : 𝔤J} (hρ : jets.evalLie ρ = 0) : + ∃ U : jets.truncationKer 0, jets.radial U.1 = ρ := + Free.exists_radial_eq ρ hρ + +/-- Every family of symmetrized Maurer–Cartan data is realized by a pure jet: realize the + data, rescaled by the order, as the Taylor data of an element `ρ` vanishing at the base + point, and integrate `ρ` to a pure jet. -/ +theorem symmetrizedMaurerCartanCoeff_surjective : + Function.Surjective jets.symmetrizedMaurerCartanCoeff := by + intro c + obtain ⟨ρ, hρ⟩ := jets.exists_evalLie_iteratedDeriv_eq fun s => + if hs : s = 0 then 0 else (s.card : ℝ) • c ⟨s, hs⟩ + obtain ⟨U, hU⟩ := jets.exists_radial_eq (ρ := ρ) (by + simpa [iteratedDeriv_zero] using hρ 0) + refine ⟨U, funext fun r => ?_⟩ + have hcard : (r.1.card : ℝ) ≠ 0 := + Nat.cast_ne_zero.mpr fun h => r.2 (Multiset.card_eq_zero.mp h) + rw [symmetrizedMaurerCartanCoeff_eq_evalLie_iteratedDeriv_radial, hU, hρ, dif_neg r.2, + smul_smul, one_div, inv_mul_cancel₀ hcard, one_smul] /-- The symmetrized Maurer–Cartan data are free coordinates on the pure jets of a free package. -/ diff --git a/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean b/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean index 7c4eef26f..b15779090 100644 --- a/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean +++ b/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean @@ -161,6 +161,18 @@ lemma add_toSU2Matrix (a b : JetGaugeAlgebra) : lemma add_toU1Value (a b : JetGaugeAlgebra) : (a + b).toU1Value = a.toU1Value + b.toU1Value := by rfl +lemma toSU3Matrix_sum {ι : Type*} (t : Finset ι) (f : ι → JetGaugeAlgebra) : + (∑ i ∈ t, f i).toSU3Matrix = ∑ i ∈ t, (f i).toSU3Matrix := + map_sum (AddMonoidHom.mk' toSU3Matrix add_toSU3Matrix) f t + +lemma toSU2Matrix_sum {ι : Type*} (t : Finset ι) (f : ι → JetGaugeAlgebra) : + (∑ i ∈ t, f i).toSU2Matrix = ∑ i ∈ t, (f i).toSU2Matrix := + map_sum (AddMonoidHom.mk' toSU2Matrix add_toSU2Matrix) f t + +lemma toU1Value_sum {ι : Type*} (t : Finset ι) (f : ι → JetGaugeAlgebra) : + (∑ i ∈ t, f i).toU1Value = ∑ i ∈ t, (f i).toU1Value := + map_sum (AddMonoidHom.mk' toU1Value add_toU1Value) f t + @[simp] lemma zero_toSU3Matrix : (0 : JetGaugeAlgebra).toSU3Matrix = 0 := by rfl @@ -301,6 +313,81 @@ lemma deriv_toSU2Matrix (μ : Fin 1 ⊕ Fin 3) (a : JetGaugeAlgebra) : lemma deriv_toU1Value (μ : Fin 1 ⊕ Fin 3) (a : JetGaugeAlgebra) : (deriv μ a).toU1Value = pderiv ℂ μ a.toU1Value := rfl +/-! + +## Multiplication by the coordinates + +-/ + +/-- Multiplication by the spacetime coordinate `x_μ`, entrywise on each factor. It + preserves hermiticity since the coordinates are self-adjoint, and tracelessness since + it is a scalar. -/ +noncomputable def coord (μ : Fin 1 ⊕ Fin 3) : JetGaugeAlgebra →ₗ[ℝ] JetGaugeAlgebra where + toFun a := ofMatrixProd + ((X μ : JetRing) • a.toSU3Matrix, (X μ : JetRing) • a.toSU2Matrix, + (X μ : JetRing) * a.toU1Value) + ⟨by rw [star_smul, JetRing.star_X, show star a.toSU3Matrix = a.toSU3Matrix from a.1.2.1], + by rw [Matrix.trace_smul, show a.toSU3Matrix.trace = 0 from a.1.2.2, smul_zero]⟩ + ⟨by rw [star_smul, JetRing.star_X, show star a.toSU2Matrix = a.toSU2Matrix from a.2.1.2.1], + by rw [Matrix.trace_smul, show a.toSU2Matrix.trace = 0 from a.2.1.2.2, smul_zero]⟩ + (by rw [star_mul', JetRing.star_X, show star a.toU1Value = a.toU1Value from a.2.2.2]) + map_add' a b := by + ext <;> simp [smul_add, mul_add] + 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, smul_comm r, + mul_smul_comm] + +@[simp] +lemma coord_toSU3Matrix (μ : Fin 1 ⊕ Fin 3) (a : JetGaugeAlgebra) : + (coord μ a).toSU3Matrix = (X μ : JetRing) • a.toSU3Matrix := rfl + +@[simp] +lemma coord_toSU2Matrix (μ : Fin 1 ⊕ Fin 3) (a : JetGaugeAlgebra) : + (coord μ a).toSU2Matrix = (X μ : JetRing) • a.toSU2Matrix := rfl + +@[simp] +lemma coord_toU1Value (μ : Fin 1 ⊕ Fin 3) (a : JetGaugeAlgebra) : + (coord μ a).toU1Value = (X μ : JetRing) * a.toU1Value := rfl + +/-- The Leibniz rule for a coordinate: `∂_μ (x_ν a) = x_ν ∂_μ a + δ_{μν} a`. -/ +lemma deriv_coord (μ ν : Fin 1 ⊕ Fin 3) (a : JetGaugeAlgebra) : + deriv μ (coord ν a) = coord ν (deriv μ a) + if μ = ν then a else 0 := by + by_cases h : μ = ν + · subst h + rw [if_pos rfl] + refine ext_of_matrix ?_ ?_ ?_ + · ext i j + simp only [deriv_toSU3Matrix, coord_toSU3Matrix, add_toSU3Matrix, Matrix.map_apply, + Matrix.smul_apply, Matrix.add_apply, smul_eq_mul, Derivation.leibniz, pderiv_X_self] + ring + · ext i j + simp only [deriv_toSU2Matrix, coord_toSU2Matrix, add_toSU2Matrix, Matrix.map_apply, + Matrix.smul_apply, Matrix.add_apply, smul_eq_mul, Derivation.leibniz, pderiv_X_self] + ring + · simp only [deriv_toU1Value, coord_toU1Value, add_toU1Value, smul_eq_mul, + Derivation.leibniz, pderiv_X_self] + ring + · rw [if_neg h, add_zero] + refine ext_of_matrix ?_ ?_ ?_ + · ext i j + simp only [deriv_toSU3Matrix, coord_toSU3Matrix, Matrix.map_apply, Matrix.smul_apply, + smul_eq_mul, Derivation.leibniz, pderiv_X_of_ne (Ne.symm h), mul_zero, add_zero] + · ext i j + simp only [deriv_toSU2Matrix, coord_toSU2Matrix, Matrix.map_apply, Matrix.smul_apply, + smul_eq_mul, Derivation.leibniz, pderiv_X_of_ne (Ne.symm h), mul_zero, add_zero] + · simp only [deriv_toU1Value, coord_toU1Value, smul_eq_mul, Derivation.leibniz, + pderiv_X_of_ne (Ne.symm h), mul_zero, add_zero] + +/-- The coordinates are central for the bracket. -/ +lemma coord_lie (μ : Fin 1 ⊕ Fin 3) (a b : JetGaugeAlgebra) : + ⁅coord μ a, b⁆ = coord μ ⁅a, b⁆ := by + refine ext_of_matrix ?_ ?_ ?_ <;> + simp only [bracket_toSU3Matrix, bracket_toSU2Matrix, bracket_toU1Value, coord_toSU3Matrix, + coord_toSU2Matrix, coord_toU1Value, Matrix.smul_mul, Matrix.mul_smul, smul_sub, + smul_comm (X μ : JetRing) Complex.I, mul_zero] + /-- Formal derivatives on the jet gauge algebra commute. -/ lemma deriv_comm (μ ν : Fin 1 ⊕ Fin 3) (a : JetGaugeAlgebra) : deriv μ (deriv ν a) = deriv ν (deriv μ a) := by @@ -583,6 +670,15 @@ lemma eval_toU1Value_eq (a : JetGaugeAlgebra) : show Multiset.toFinsupp (0 : Multiset (Fin 1 ⊕ Fin 3)) = 0 from map_zero _, coeff_zero_eq_constantCoeff] +/-- A coordinate multiple vanishes at the base point. -/ +lemma eval_coord (μ : Fin 1 ⊕ Fin 3) (a : JetGaugeAlgebra) : eval (coord μ a) = 0 := by + refine GaugeAlgebra.ext_of_matrix ?_ ?_ ?_ + · ext i j + simp [eval_toSU3Matrix_apply] + · ext i j + simp [eval_toSU2Matrix_apply] + · simp [eval_toU1Value_eq] + /-- 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 diff --git a/Physlib/Particles/StandardModel/GaugeGroup/LocalGaugeData.lean b/Physlib/Particles/StandardModel/GaugeGroup/LocalGaugeData.lean index 226de972c..eec5b6fc9 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/LocalGaugeData.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/LocalGaugeData.lean @@ -29,7 +29,9 @@ package rather than a choice, so it is an instance. Everything the generic theory derives from a package is thereby available for the Standard Model: the Taylor–Leibniz theorem for the adjoint action, the truncation filtration of the jet gauge group by the Maurer–Cartan form, the covariance of the covariant derivative, and -the determination of a pure jet by its symmetrized Maurer–Cartan data. +the determination of a pure jet by its symmetrized Maurer–Cartan data. Its freeness, the +remaining power-series input to the classification of invariants, is +`instFreeLocalGaugeData` in `GaugeGroup/MaurerCartan/Freeness.lean`. ## ii. Key results @@ -82,6 +84,10 @@ noncomputable def localGaugeData : deriv_comm := JetGaugeAlgebra.deriv_comm deriv_bracket := JetGaugeAlgebra.deriv_bracket deriv_ofConstantLie := JetGaugeAlgebra.deriv_ofConstant + coord := JetGaugeAlgebra.coord + deriv_coord := JetGaugeAlgebra.deriv_coord + evalLie_coord := JetGaugeAlgebra.eval_coord + coord_lie := JetGaugeAlgebra.coord_lie adjoint := JetGaugeAlgebra.adjoint adjoint_lie := JetGaugeAlgebra.adjointMap_lie adjointValue := GaugeAlgebra.adjoint @@ -127,6 +133,10 @@ lemma localGaugeData_deriv (μ : Fin 1 ⊕ Fin 3) : lemma localGaugeData_iteratedDeriv (s : Multiset (Fin 1 ⊕ Fin 3)) : localGaugeData.iteratedDeriv s = JetGaugeAlgebra.iteratedDeriv s := rfl +@[simp] +lemma localGaugeData_coord (μ : Fin 1 ⊕ Fin 3) : + localGaugeData.coord μ = JetGaugeAlgebra.coord μ := rfl + @[simp] lemma localGaugeData_adjoint : localGaugeData.adjoint = JetGaugeAlgebra.adjoint := rfl diff --git a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Freeness.lean b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Freeness.lean index 4f2d0a410..7aa507d92 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Freeness.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Freeness.lean @@ -8,40 +8,41 @@ module public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData public import Physlib.Relativity.JetRing.Matrix /-! -# Freeness of the Maurer–Cartan data of the Standard Model jets +# Freeness of the Standard Model jets ## i. Overview -For any faithful local-gauge-data package, a pure jet (one with identity value) is -determined by its symmetrized Maurer–Cartan data, the base-point values of the symmetrized -Maurer–Cartan form indexed by nonempty multisets of directions: -`LocalGaugeData.symmetrizedMaurerCartanCoeff` is injective. For the Standard Model jets it -is also *surjective*: every family of gauge-algebra elements indexed by nonempty multisets -is the symmetrized Maurer–Cartan data of some pure jet. Together, the symmetrized data are -free coordinates on the pure jets. - -Surjectivity is a statement about power series, proved here from the matrix definitions. -The radial component `ρ = ∑_μ x_μ ω_μ` of the Maurer–Cartan form carries exactly the -symmetrized data, so it suffices to solve the Euler system `E U = −i ρ U`, `U(0) = 1` for -a prescribed `ρ`; this is done factor by factor by `JetRing.exists_matrix_eulerTransport`, -with unitarity and unit determinant from the Euler vanishing principle. The same -integration technique, applied to the full structural equation, shows that every flat jet -1-form is the Maurer–Cartan form of a pure jet, `exists_maurerCartanForm_eq_of_structure`. +A local-gauge-data package is `Free` when its jets are honest formal power series in the +spacetime coordinates: every family of base-point Taylor data is realized by an element of +the jet Lie algebra (Taylor completeness), and every element vanishing at the base point +is the radial component `∑_μ x_μ ω_μ(U)` of the Maurer–Cartan form of some pure jet +(radial integrability). The general theory then makes the symmetrized Maurer–Cartan data +free coordinates on the pure jets, `LocalGaugeData.symmetrizedMaurerCartanCoeff_bijective`, +which is what the classification of gauge invariants uses. + +Both properties are statements about power series, proved here from the matrix +definitions. Taylor completeness is the construction of a power series from its Taylor +coefficients, entry by entry. Radial integrability is the solution of the Euler system +`E U = −i ρ U`, `U(0) = 1` for a prescribed `ρ`, factor by factor by +`JetRing.exists_matrix_eulerTransport`, with unitarity and unit determinant from the Euler +vanishing principle; then `∑_μ x_μ · i (∂_μ U) U† = ρ`. The same integration technique, +applied to the full structural equation, shows that every flat jet 1-form is the +Maurer–Cartan form of a pure jet, `exists_maurerCartanForm_eq_of_structure`. ## ii. Key results - `StandardModel.exists_maurerCartanForm_eq_of_structure` : every flat jet 1-form is the Maurer–Cartan form of a pure jet. -- `StandardModel.symmetrizedMaurerCartanCoeff_surjective` : every family of symmetrized - data is realized by a pure jet. -- `StandardModel.instFreeLocalGaugeData` : the package is free, so the symmetrized data are - free coordinates on the pure jets. +- `StandardModel.taylorJet`, `StandardModel.eval_iteratedDeriv_taylorJet` : Taylor + completeness of the jet gauge algebra. +- `StandardModel.exists_radial_eq` : radial integrability of the jet gauge group. +- `StandardModel.instFreeLocalGaugeData` : the package is free. ## iii. Table of contents - A. Integrating the structural equation -- B. The symmetrized Maurer–Cartan data in components -- C. Surjectivity of the symmetrized Maurer–Cartan data +- B. Taylor completeness +- C. Radial integrability -/ @@ -93,152 +94,144 @@ lemma exists_maurerCartanForm_eq_of_structure /-! -## B. The symmetrized Maurer–Cartan data in components - -The gauge algebra is a product of three matrix factors. Rather than argue factor by -factor, the passage from the symmetrized Maurer–Cartan data to the radial component -`∑_μ x_μ ω_μ` of the Maurer–Cartan form is proved once for an arbitrary real-linear scalar -`ψ` of the gauge algebra that computes evaluated iterated derivatives as base-point values -of power-series derivatives of a scalar entry `f`; the three factors are instances. +## B. Taylor completeness -/ -/-- A scalar component of the evaluated symmetrized Maurer–Cartan form: the average over - `μ ∈ r` of the base-point values of the `r − μ` derivatives of the entry `f (ω_μ)`. -/ -lemma eval_symmetrizedMaurerCartanForm_comp (ψ : GaugeAlgebra →+ ℂ) - (hψ : ∀ (c : ℝ) (a : GaugeAlgebra), ψ (c • a) = c • ψ a) (f : JetGaugeAlgebra → JetRing) - (hf : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (a : JetGaugeAlgebra), - ψ (eval (iteratedDeriv s a)) = constantCoeff (s.foldl (fun h ρ => pderiv ℂ ρ h) (f a))) - (U : JetGaugeGroupI) (r : Multiset (Fin 1 ⊕ Fin 3)) : - ψ (eval (localGaugeData.symmetrizedMaurerCartanForm U r)) = - (1/(r.card : ℝ)) • (r.map fun μ => constantCoeff ((r.erase μ).foldl - (fun h ρ => pderiv ℂ ρ h) (f (maurerCartanForm U μ)))).sum := by - rw [LocalGaugeData.symmetrizedMaurerCartanForm] - simp only [localGaugeData_iteratedDeriv, localGaugeData_maurerCartan] - rw [map_smul, hψ, map_multiset_sum, map_multiset_sum, Multiset.map_map, Multiset.map_map] - congr 1 - refine congrArg Multiset.sum (Multiset.map_congr rfl fun μ _ => ?_) - rw [Function.comp_apply, Function.comp_apply, hf, Multiset.sub_singleton] - -/-- A scalar component of the symmetrized Maurer–Cartan data, through the radial component - `p = ∑_μ x_μ f(ω_μ)` of the Maurer–Cartan form: a coefficient of that component, - normalized by the factorials of the multiset. -/ -lemma symmetrizedMaurerCartanCoeff_comp (ψ : GaugeAlgebra →+ ℂ) - (hψ : ∀ (c : ℝ) (a : GaugeAlgebra), ψ (c • a) = c • ψ a) (f : JetGaugeAlgebra → JetRing) - (hf : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (a : JetGaugeAlgebra), - ψ (eval (iteratedDeriv s a)) = constantCoeff (s.foldl (fun h ρ => pderiv ℂ ρ h) (f a))) - (U : localGaugeData.truncationKer 0) (p : JetRing) - (hrad : ∑ μ, (X μ : JetRing) • f (maurerCartanForm U.1 μ) = p) - (r : Multiset (Fin 1 ⊕ Fin 3)) (hr : r ≠ 0) : - ψ (localGaugeData.symmetrizedMaurerCartanCoeff U ⟨r, hr⟩) = - (1/(Multiset.card r : ℝ)) • (((∏ ν, Nat.factorial (r.count ν) : ℕ) : ℂ) * - coeff (Multiset.toFinsupp r) p) := by - rw [LocalGaugeData.symmetrizedMaurerCartanCoeff_apply, localGaugeData_evalLie, - eval_symmetrizedMaurerCartanForm_comp ψ hψ f hf, sum_constantCoeff_foldl_erase, hrad] - -/-- The `su(3)` entries of the symmetrized Maurer–Cartan data through the radial - component. -/ -lemma symmetrizedMaurerCartanCoeff_toSU3_eq (U : localGaugeData.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) : - (localGaugeData.symmetrizedMaurerCartanCoeff U ⟨r, hr⟩).toSU3Matrix i j = - (1/(Multiset.card r : ℝ)) • (((∏ ν, Nat.factorial (r.count ν) : ℕ) : ℂ) * - coeff (Multiset.toFinsupp r) (P i j)) := by - refine symmetrizedMaurerCartanCoeff_comp - (AddMonoidHom.mk' (fun a => a.toSU3Matrix i j) fun a b => by - simp [GaugeAlgebra.add_toSU3Matrix]) - (fun c a => by simp [GaugeAlgebra.smul_toSU3Matrix]) (fun a => a.toSU3Matrix i j) - (fun s a => by - rw [AddMonoidHom.mk'_apply, eval_toSU3Matrix_apply, iteratedDeriv_toSU3Matrix, - Matrix.map_apply]) - U (P i j) ?_ r hr - rw [← hrad, Matrix.sum_apply] - exact Finset.sum_congr rfl fun μ _ => rfl - -/-- The `su(2)` entries of the symmetrized Maurer–Cartan data through the radial - component. -/ -lemma symmetrizedMaurerCartanCoeff_toSU2_eq (U : localGaugeData.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) : - (localGaugeData.symmetrizedMaurerCartanCoeff U ⟨r, hr⟩).toSU2Matrix i j = - (1/(Multiset.card r : ℝ)) • (((∏ ν, Nat.factorial (r.count ν) : ℕ) : ℂ) * - coeff (Multiset.toFinsupp r) (P i j)) := by - refine symmetrizedMaurerCartanCoeff_comp - (AddMonoidHom.mk' (fun a => a.toSU2Matrix i j) fun a b => by - simp [GaugeAlgebra.add_toSU2Matrix]) - (fun c a => by simp [GaugeAlgebra.smul_toSU2Matrix]) (fun a => a.toSU2Matrix i j) - (fun s a => by - rw [AddMonoidHom.mk'_apply, eval_toSU2Matrix_apply, iteratedDeriv_toSU2Matrix, - Matrix.map_apply]) - U (P i j) ?_ r hr - rw [← hrad, Matrix.sum_apply] - exact Finset.sum_congr rfl fun μ _ => rfl - -/-- The `u(1)` value of the symmetrized Maurer–Cartan data through the radial - component. -/ -lemma symmetrizedMaurerCartanCoeff_toU1_eq (U : localGaugeData.truncationKer 0) - (p : JetRing) - (hrad : ∑ μ, (X μ : JetRing) • (maurerCartanForm U.1 μ).toU1Value = p) - (r : Multiset (Fin 1 ⊕ Fin 3)) (hr : r ≠ 0) : - (localGaugeData.symmetrizedMaurerCartanCoeff U ⟨r, hr⟩).toU1Value = - (1/(Multiset.card r : ℝ)) • (((∏ ν, Nat.factorial (r.count ν) : ℕ) : ℂ) * - coeff (Multiset.toFinsupp r) p) := - symmetrizedMaurerCartanCoeff_comp - (AddMonoidHom.mk' (fun a => a.toU1Value) fun a b => by simp [GaugeAlgebra.add_toU1Value]) - (fun c a => by simp [GaugeAlgebra.smul_toU1Value]) (fun a => a.toU1Value) - (fun s a => by rw [AddMonoidHom.mk'_apply, eval_toU1Value_eq, iteratedDeriv_toU1Value]) - U p hrad r hr +/-- The power series with prescribed base-point Taylor data `f`: the coefficient at the + monomial `m` is `f` at the multiset of `m`, divided by the factorials of `m`. -/ +noncomputable def taylorSeries (f : Multiset (Fin 1 ⊕ Fin 3) → ℂ) : JetRing := + fun m => ((∏ ν, Nat.factorial (m ν) : ℕ) : ℂ)⁻¹ * f (Finsupp.toMultiset m) + +lemma coeff_taylorSeries (f : Multiset (Fin 1 ⊕ Fin 3) → ℂ) (m : (Fin 1 ⊕ Fin 3) →₀ ℕ) : + coeff m (taylorSeries f) = ((∏ ν, Nat.factorial (m ν) : ℕ) : ℂ)⁻¹ * f (Finsupp.toMultiset m) := + rfl + +lemma star_taylorSeries (f : Multiset (Fin 1 ⊕ Fin 3) → ℂ) : + star (taylorSeries f) = taylorSeries fun s => star (f s) := by + ext m + rw [JetRing.coeff_star, coeff_taylorSeries, coeff_taylorSeries, star_mul', star_inv₀, + star_natCast] + +lemma taylorSeries_sum {ι : Type} (t : Finset ι) (f : ι → Multiset (Fin 1 ⊕ Fin 3) → ℂ) : + taylorSeries (fun s => ∑ i ∈ t, f i s) = ∑ i ∈ t, taylorSeries (f i) := by + ext m + simp only [coeff_taylorSeries, map_sum, Finset.mul_sum] + +/-- The base-point Taylor data of `taylorSeries f` are `f`. -/ +lemma constantCoeff_foldl_pderiv_taylorSeries (f : Multiset (Fin 1 ⊕ Fin 3) → ℂ) + (s : Multiset (Fin 1 ⊕ Fin 3)) : + constantCoeff (s.foldl (fun h ρ => pderiv ℂ ρ h) (taylorSeries f)) = f s := by + have hfac : ((∏ ν, Nat.factorial (s.count ν) : ℕ) : ℂ) ≠ 0 := + Nat.cast_ne_zero.mpr (Finset.prod_ne_zero_iff.mpr fun ν _ => Nat.factorial_ne_zero _) + rw [constantCoeff_foldl_pderiv, coeff_taylorSeries, Multiset.toFinsupp_toMultiset, + show (∏ ν, Nat.factorial (s.toFinsupp ν)) = ∏ ν, Nat.factorial (s.count ν) from + Finset.prod_congr rfl fun ν _ => by rw [Multiset.toFinsupp_apply], + ← mul_assoc, mul_inv_cancel₀ hfac, one_mul] + +/-- The matrix of jets with prescribed base-point Taylor data `M`, entrywise. -/ +noncomputable def taylorMatrix {κ : Type} (M : Multiset (Fin 1 ⊕ Fin 3) → Matrix κ κ ℂ) : + Matrix κ κ JetRing := + Matrix.of fun i j => taylorSeries fun s => M s i j + +lemma taylorMatrix_apply {κ : Type} (M : Multiset (Fin 1 ⊕ Fin 3) → Matrix κ κ ℂ) (i j : κ) : + taylorMatrix M i j = taylorSeries fun s => M s i j := + rfl + +lemma star_taylorMatrix {κ : Type} {M : Multiset (Fin 1 ⊕ Fin 3) → Matrix κ κ ℂ} + (hM : ∀ s, star (M s) = M s) : star (taylorMatrix M) = taylorMatrix M := by + ext i j : 1 + rw [Matrix.star_apply, taylorMatrix_apply, taylorMatrix_apply, star_taylorSeries] + exact congrArg taylorSeries (funext fun s => by rw [← Matrix.star_apply, hM s]) + +lemma trace_taylorMatrix {κ : Type} [Fintype κ] {M : Multiset (Fin 1 ⊕ Fin 3) → Matrix κ κ ℂ} + (hM : ∀ s, (M s).trace = 0) : (taylorMatrix M).trace = 0 := by + have h : ∀ s, ∑ i, M s i i = 0 := fun s => hM s + simp only [Matrix.trace, Matrix.diag_apply, taylorMatrix_apply, ← taylorSeries_sum, h] + ext m + simp [coeff_taylorSeries] + +/-- The jet gauge algebra element with prescribed base-point Taylor data `c`, built + entrywise from `taylorSeries`. Hermiticity and tracelessness are inherited from the + values of `c`. -/ +noncomputable def taylorJet (c : Multiset (Fin 1 ⊕ Fin 3) → GaugeAlgebra) : JetGaugeAlgebra := + ofMatrixProd + (taylorMatrix fun s => (c s).toSU3Matrix, taylorMatrix fun s => (c s).toSU2Matrix, + taylorSeries fun s => (c s).toU1Value) + ⟨star_taylorMatrix fun s => (c s).1.2.1, trace_taylorMatrix fun s => (c s).1.2.2⟩ + ⟨star_taylorMatrix fun s => (c s).2.1.2.1, trace_taylorMatrix fun s => (c s).2.1.2.2⟩ + (by rw [star_taylorSeries]; exact congrArg taylorSeries (funext fun s => (c s).2.2.2)) + +@[simp] +lemma taylorJet_toSU3Matrix (c : Multiset (Fin 1 ⊕ Fin 3) → GaugeAlgebra) : + (taylorJet c).toSU3Matrix = taylorMatrix fun s => (c s).toSU3Matrix := + rfl + +@[simp] +lemma taylorJet_toSU2Matrix (c : Multiset (Fin 1 ⊕ Fin 3) → GaugeAlgebra) : + (taylorJet c).toSU2Matrix = taylorMatrix fun s => (c s).toSU2Matrix := + rfl + +@[simp] +lemma taylorJet_toU1Value (c : Multiset (Fin 1 ⊕ Fin 3) → GaugeAlgebra) : + (taylorJet c).toU1Value = taylorSeries fun s => (c s).toU1Value := + rfl + +/-- Taylor completeness: the base-point Taylor data of `taylorJet c` are `c`. -/ +theorem eval_iteratedDeriv_taylorJet (c : Multiset (Fin 1 ⊕ Fin 3) → GaugeAlgebra) + (s : Multiset (Fin 1 ⊕ Fin 3)) : eval (iteratedDeriv s (taylorJet c)) = c s := by + refine GaugeAlgebra.ext_of_matrix ?_ ?_ ?_ + · ext i j + rw [eval_iteratedDeriv_toSU3Matrix, Matrix.map_apply, taylorJet_toSU3Matrix, + taylorMatrix_apply, constantCoeff_foldl_pderiv_taylorSeries] + · ext i j + rw [eval_iteratedDeriv_toSU2Matrix, Matrix.map_apply, taylorJet_toSU2Matrix, + taylorMatrix_apply, constantCoeff_foldl_pderiv_taylorSeries] + · rw [eval_iteratedDeriv_toU1Value, taylorJet_toU1Value, constantCoeff_foldl_pderiv_taylorSeries] /-! -## C. Surjectivity of the symmetrized Maurer–Cartan data +## C. Radial integrability -/ -/-- The factorwise construction behind surjectivity: for every hermitian family `E` of - matrices indexed by nonempty multisets there is a unitary Euler transport `V` based at - `1` whose radial Maurer–Cartan component `P = ∑_μ x_μ · i (∂_μ V) V†` has, at the - monomial `r`, the coefficient `|r| / ∏ (r.count ν)!` times `E r`; and `V` has unit - determinant when the `E r` are traceless. -/ -lemma exists_eulerTransport_of_symmetrized {κ : Type} [Fintype κ] [DecidableEq κ] - (E : {r : Multiset (Fin 1 ⊕ Fin 3) // r ≠ 0} → Matrix κ κ ℂ) - (hEstar : ∀ x, star (E x) = E x) : - ∃ V P : Matrix κ κ JetRing, +/-- The `su(3)` component of the radial Maurer–Cartan component `∑_μ x_μ ω_μ(U)`. -/ +lemma radial_toSU3Matrix (U : JetGaugeGroupI) : + (localGaugeData.radial U).toSU3Matrix = + ∑ μ, (X μ : JetRing) • (Complex.I • (U.1.1.map (pderiv ℂ μ) * star U.1.1)) := by + rw [LocalGaugeData.radial, toSU3Matrix_sum] + simp only [localGaugeData_coord, localGaugeData_maurerCartan, + coord_toSU3Matrix, maurerCartanForm_toSU3Matrix] + +/-- The `su(2)` component of the radial Maurer–Cartan component. -/ +lemma radial_toSU2Matrix (U : JetGaugeGroupI) : + (localGaugeData.radial U).toSU2Matrix = + ∑ μ, (X μ : JetRing) • (Complex.I • (U.2.1.1.map (pderiv ℂ μ) * star U.2.1.1)) := by + rw [LocalGaugeData.radial, toSU2Matrix_sum] + simp only [localGaugeData_coord, localGaugeData_maurerCartan, + coord_toSU2Matrix, maurerCartanForm_toSU2Matrix] + +/-- The `u(1)` component of the radial Maurer–Cartan component. -/ +lemma radial_toU1Value (U : JetGaugeGroupI) : + (localGaugeData.radial U).toU1Value = + ∑ μ, (X μ : JetRing) • (Complex.I • (pderiv ℂ μ U.2.2.1 * star U.2.2.1)) := by + rw [LocalGaugeData.radial, toU1Value_sum] + simp only [localGaugeData_coord, localGaugeData_maurerCartan, + coord_toU1Value, maurerCartanForm_toU1Value, smul_eq_mul] + +/-- The factorwise construction behind radial integrability: for every hermitian matrix + `P` of jets vanishing at the base point there is a unitary Euler transport `V` based at + `1` whose radial Maurer–Cartan component `∑_μ x_μ · i (∂_μ V) V†` is `P`; and `V` has + unit determinant when `P` is traceless. -/ +lemma exists_eulerTransport_of_radial {κ : Type} [Fintype κ] [DecidableEq κ] + (P : Matrix κ κ JetRing) (hP0 : ∀ i j, constantCoeff (P i j) = 0) (hPstar : star P = P) : + ∃ V : 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) → + (P.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 - classical - 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] + ∑ μ, (X μ : JetRing) • (Complex.I • (V.map (pderiv ℂ μ) * star V)) = P := by 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] @@ -247,70 +240,47 @@ lemma exists_eulerTransport_of_symmetrized {κ : Type} [Fintype κ] [DecidableEq 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) - -/-- Freeness, surjectivity half: every prescribed family of symmetrized Maurer–Cartan - data is realized by a pure jet, assembled factor by factor from - `exists_eulerTransport_of_symmetrized`. -/ -theorem symmetrizedMaurerCartanCoeff_surjective : - Function.Surjective localGaugeData.symmetrizedMaurerCartanCoeff := by + refine ⟨V, hV0, hVu, fun hPtr hjac => + eulerTransport_det hjac (by rw [Matrix.trace_smul, hPtr, smul_zero]) hV0 hEV, ?_⟩ + 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 + +/-- Radial integrability: every element of the jet gauge algebra vanishing at the base + point is the radial Maurer–Cartan component of a pure jet, assembled factor by factor + from `exists_eulerTransport_of_radial`. -/ +theorem exists_radial_eq (ρ : JetGaugeAlgebra) (hρ : eval ρ = 0) : + ∃ U : localGaugeData.truncationKer 0, localGaugeData.radial U.1 = ρ := by classical - intro c - obtain ⟨V₃, P₃, hV₃0, hV₃u, hrad₃, hdet₃, hcoeff₃⟩ := - exists_eulerTransport_of_symmetrized (κ := 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₂⟩ := - exists_eulerTransport_of_symmetrized (κ := 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₁⟩ := - exists_eulerTransport_of_symmetrized (κ := 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 h₃ : ∀ i j, constantCoeff (ρ.toSU3Matrix i j) = 0 := fun i j => by + rw [← eval_toSU3Matrix_apply, hρ] + simp + have h₂ : ∀ i j, constantCoeff (ρ.toSU2Matrix i j) = 0 := fun i j => by + rw [← eval_toSU2Matrix_apply, hρ] + simp + have h₁ : constantCoeff ρ.toU1Value = 0 := by + rw [← eval_toU1Value_eq, hρ] + simp + obtain ⟨V₃, hV₃0, hV₃u, hdet₃, hrad₃⟩ := + exists_eulerTransport_of_radial ρ.toSU3Matrix h₃ ρ.1.2.1 + obtain ⟨V₂, hV₂0, hV₂u, hdet₂, hrad₂⟩ := + exists_eulerTransport_of_radial ρ.toSU2Matrix h₂ ρ.2.1.2.1 + obtain ⟨V₁, hV₁0, hV₁u, _, hrad₁⟩ := + exists_eulerTransport_of_radial (κ := Fin 1) (Matrix.of fun _ _ => ρ.toU1Value) + (fun _ _ => h₁) (Matrix.ext fun _ _ => ρ.2.2.2) + have hd₃ : V₃.det = 1 := hdet₃ (show ρ.toSU3Matrix.trace = 0 from ρ.1.2.2) jacobi_fin3 + have hd₂ : V₂.det = 1 := hdet₂ (show ρ.toSU2Matrix.trace = 0 from ρ.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 + (Complex.I • (pderiv ℂ μ (V₁ 0 0) * star (V₁ 0 0))) = ρ.toU1Value := 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 @@ -320,39 +290,21 @@ theorem symmetrizedMaurerCartanCoeff_surjective : ⟨V₁ 0 0, Unitary.mem_iff.mpr ⟨by rw [mul_comm]; exact hu1, hu1⟩⟩), localGaugeData.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 - -/-- The Standard Model package is free: the symmetrized Maurer–Cartan data are free - coordinates on its pure jets. Injectivity is the general - `LocalGaugeData.symmetrizedMaurerCartanCoeff_injective` of a faithful package, and - surjectivity is `symmetrizedMaurerCartanCoeff_surjective`. -/ + refine ext_of_matrix ?_ ?_ ?_ + · rw [radial_toSU3Matrix] + exact hrad₃ + · rw [radial_toSU2Matrix] + exact hrad₂ + · rw [radial_toU1Value] + exact hrad₁' + +/-- The Standard Model package is free: Taylor completeness is `eval_iteratedDeriv_taylorJet` + and radial integrability is `exists_radial_eq`. The symmetrized Maurer–Cartan data are + therefore free coordinates on its pure jets, by the general + `LocalGaugeData.symmetrizedMaurerCartanCoeff_bijective`. -/ instance instFreeLocalGaugeData : localGaugeData.Free where toFaithful := inferInstance - symmetrizedMaurerCartanCoeff_surjective := symmetrizedMaurerCartanCoeff_surjective + exists_evalLie_iteratedDeriv_eq c := ⟨taylorJet c, eval_iteratedDeriv_taylorJet c⟩ + exists_radial_eq ρ hρ := exists_radial_eq ρ hρ end StandardModel From 3958f76a212cba4e3b3e98fc19b8d71b63a97acd Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 9 Sep 2026 06:00:26 +0100 Subject: [PATCH 306/367] feat: coordinates in LocalGaugeData make freeness a general theorem MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit LocalGaugeData gains coord μ (multiplication by x_μ) with the Leibniz rule, vanishing at the base point and centrality for the bracket; the Euler identity evalLie_iteratedDeriv_coord follows. The radial component ∑ coord μ (ω_μ U) of the Maurer–Cartan form carries the symmetrized data, so Free now asks for Taylor completeness and radial integrability and surjectivity of the symmetrized data is the general symmetrizedMaurerCartanCoeff_surjective. The Standard Model supplies JetGaugeAlgebra.coord, taylorJet and the radial Euler transport; its Freeness file keeps only the power-series content. Also: the Euler vanishing principle by degree moves from the Standard Model truncation file to the JetRing files, that file's three component lemmas become one, and JetRing.constantCoeffₗ moves to the JetRing file. Co-Authored-By: Claude Fable 5.1 --- .../ClassicalFieldTheory/JetAlgebra/Jet.lean | 10 - .../GaugeGroup/JetGaugeGroup/Truncation.lean | 181 ++++-------------- Physlib/Relativity/JetRing/Basic.lean | 79 ++++++++ Physlib/Relativity/JetRing/Matrix.lean | 44 +++++ 4 files changed, 163 insertions(+), 151 deletions(-) diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/Jet.lean b/Physlib/ClassicalFieldTheory/JetAlgebra/Jet.lean index 4491397b8..df974116c 100644 --- a/Physlib/ClassicalFieldTheory/JetAlgebra/Jet.lean +++ b/Physlib/ClassicalFieldTheory/JetAlgebra/Jet.lean @@ -36,16 +36,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/Particles/StandardModel/GaugeGroup/JetGaugeGroup/Truncation.lean b/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeGroup/Truncation.lean index fb78b840f..d1b79ccbc 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeGroup/Truncation.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeGroup/Truncation.lean @@ -6,6 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData +public import Physlib.Relativity.JetRing.Matrix /-! # Truncation of the jet gauge group @@ -22,8 +23,9 @@ local-gauge-data package, `localGaugeData.truncationKer n`, defined in `Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Truncation` through the value and the Maurer–Cartan form of the jet alone. This file compares the two notions: a jet trivial to order `n` in that sense truncates to the identity, `truncation_eq_one_of_mem_truncationKer`. -The argument is the Euler identity `∑_ρ x_ρ ∂_ρ f = (degree) f` on power series, applied to -the radial relation `∂_ρ U = −i ω_ρ(U) U` between a jet and its Maurer–Cartan form. +The argument is the Euler vanishing principle by degree on power series, +`JetRing.coeff_eq_zero_of_pderiv_eq_mul`, applied to the radial relation +`∂_ρ U = −i ω_ρ(U) U` between a jet and its Maurer–Cartan form. ## ii. Key results @@ -34,8 +36,7 @@ the radial relation `∂_ρ U = −i ω_ρ(U) U` between a jet and its Maurer– ## iii. Table of contents - A. The truncation -- B. Aside: vanishing of coefficients from the Euler identity -- C. The comparison with the Maurer–Cartan filtration +- B. The comparison with the Maurer–Cartan filtration -/ @@ -71,160 +72,58 @@ lemma truncation_one (n : ℕ) : truncation n (1 : JetGaugeGroupI) = 1 := /-! -## B. Aside: vanishing of coefficients from the Euler identity - --/ - -/-- A product with a factor whose coefficients vanish below degree `n` has coefficients - vanishing below degree `n`. -/ -lemma coeff_mul_eq_zero_of_lt {n : ℕ} {w : JetRing} - (hw : ∀ q : (Fin 1 ⊕ Fin 3) →₀ ℕ, Finsupp.degree q < n → coeff q w = 0) (v : JetRing) - {q : (Fin 1 ⊕ Fin 3) →₀ ℕ} (hq : Finsupp.degree q < n) : coeff q (w * v) = 0 := by - 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] - -/-- The Euler vanishing principle: a power series all of whose first derivatives have - coefficients vanishing below degree `n` has vanishing coefficients in every nonzero degree - up to `n`, since `∑_ρ x_ρ ∂_ρ f` has the coefficient of `f` at `p` scaled by the degree - of `p`. -/ -lemma coeff_eq_zero_of_coeff_pderiv_eq_zero {n : ℕ} {f : JetRing} - (hf : ∀ (ρ : Fin 1 ⊕ Fin 3) (q : (Fin 1 ⊕ Fin 3) →₀ ℕ), Finsupp.degree q < n → - coeff q (pderiv ℂ ρ f) = 0) - {p : (Fin 1 ⊕ Fin 3) →₀ ℕ} (hp : p ≠ 0) (hpn : Finsupp.degree p ≤ n) : coeff p f = 0 := by - 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 - -/-- A power series satisfying a radial relation `∂_ρ f = x_ρ f`, with the `x_ρ` vanishing - below degree `n`, has no coefficients in nonzero degree up to `n`. -/ -lemma coeff_eq_zero_of_pderiv_eq_mul {n : ℕ} {f : JetRing} {x : (Fin 1 ⊕ Fin 3) → JetRing} - (hd : ∀ ρ, pderiv ℂ ρ f = x ρ * f) - (hx : ∀ (ρ : Fin 1 ⊕ Fin 3) (q : (Fin 1 ⊕ Fin 3) →₀ ℕ), Finsupp.degree q < n → - coeff q (x ρ) = 0) - {p : (Fin 1 ⊕ Fin 3) →₀ ℕ} (hp : p ≠ 0) (hpn : Finsupp.degree p ≤ n) : coeff p f = 0 := - coeff_eq_zero_of_coeff_pderiv_eq_zero - (fun ρ q hq => by rw [hd ρ]; exact coeff_mul_eq_zero_of_lt (hx ρ) f hq) hp hpn - -/-- The matrix form of `coeff_eq_zero_of_pderiv_eq_mul`: the entries of a matrix of power - series satisfying `∂_ρ A = X_ρ A`, with the `X_ρ` vanishing below degree `n`, have no - coefficients in nonzero degree up to `n`. -/ -lemma coeff_entry_eq_zero_of_map_pderiv_eq_mul {κ : Type} [Fintype κ] [DecidableEq κ] {n : ℕ} - {A : Matrix κ κ JetRing} {X : (Fin 1 ⊕ Fin 3) → Matrix κ κ JetRing} - (hd : ∀ ρ, A.map (pderiv ℂ ρ) = X ρ * A) - (hX : ∀ (ρ : Fin 1 ⊕ Fin 3) (q : (Fin 1 ⊕ Fin 3) →₀ ℕ), Finsupp.degree q < n → - ∀ i j, coeff q (X ρ i j) = 0) - (i j : κ) {p : (Fin 1 ⊕ Fin 3) →₀ ℕ} (hp : p ≠ 0) (hpn : Finsupp.degree p ≤ n) : - coeff p (A i j) = 0 := by - refine coeff_eq_zero_of_coeff_pderiv_eq_zero (fun ρ q hq => ?_) hp hpn - have h1 : pderiv ℂ ρ (A i j) = (X ρ * A) i j := by rw [← hd ρ, Matrix.map_apply] - rw [h1, Matrix.mul_apply, map_sum] - exact Finset.sum_eq_zero fun k _ => coeff_mul_eq_zero_of_lt (fun q' hq' => hX ρ q' hq' i k) _ hq - -/-- A matrix of power series with identity value and no coefficients in nonzero degree up - to `n` truncates to the identity. -/ -lemma matrix_map_truncation_eq_one {κ : Type} [Fintype κ] [DecidableEq κ] {n : ℕ} - {A : Matrix κ κ JetRing} (h0 : (constantCoeff : JetRing →+* ℂ).mapMatrix A = 1) - (hA : ∀ (i j : κ) (p : (Fin 1 ⊕ Fin 3) →₀ ℕ), p ≠ 0 → Finsupp.degree p ≤ n → - coeff p (A i j) = 0) : - A.map (JetRing.truncation n) = (1 : Matrix κ κ JetRing).map (JetRing.truncation n) := by - 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 N => N i j) h0 - simpa [RingHom.mapMatrix_apply, Matrix.map_apply, Matrix.one_apply, - apply_ite constantCoeff, coeff_zero_eq_constantCoeff] using h3 - · rw [hA 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)] - -/-- A power series with value `1` and no coefficients in nonzero degree up to `n` - truncates to `1`. -/ -lemma truncation_eq_one_of_coeff {n : ℕ} {f : JetRing} (h0 : constantCoeff f = 1) - (hf : ∀ p : (Fin 1 ⊕ Fin 3) →₀ ℕ, p ≠ 0 → Finsupp.degree p ≤ n → coeff p f = 0) : - JetRing.truncation n f = JetRing.truncation n (1 : JetRing) := by - 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 - · simpa [coeff_zero_eq_constantCoeff] using h0 - · rw [hf 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)] - -/-! - -## C. The comparison with the Maurer–Cartan filtration +## B. The comparison with the Maurer–Cartan filtration -/ /-- The base-point Taylor data of the Maurer–Cartan form of a jet trivial to order `n`, - read as power-series coefficients of its `su(3)` entries: they vanish below degree `n`. -/ -lemma coeff_maurerCartanForm_toSU3Matrix_eq_zero_of_mem_truncationKer {U : JetGaugeGroupI} - {n : ℕ} (hU : U ∈ localGaugeData.truncationKer n) (ρ : Fin 1 ⊕ Fin 3) - {m : (Fin 1 ⊕ Fin 3) →₀ ℕ} (hm : Finsupp.degree m < n) (i j : Fin 3) : - coeff m ((maurerCartanForm U ρ).toSU3Matrix i j) = 0 := by + read as power-series coefficients of a scalar component `f` of the jet gauge algebra + through a scalar `ψ` of the gauge algebra computing evaluated iterated derivatives: they + vanish below degree `n`. -/ +lemma coeff_maurerCartanForm_eq_zero_of_mem_truncationKer (ψ : GaugeAlgebra → ℂ) + (hψ : ψ 0 = 0) (f : JetGaugeAlgebra → JetRing) + (hf : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (a : JetGaugeAlgebra), + ψ (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv s a)) = + constantCoeff (s.foldl (fun h ρ => pderiv ℂ ρ h) (f a))) + {U : JetGaugeGroupI} {n : ℕ} (hU : U ∈ localGaugeData.truncationKer n) (ρ : Fin 1 ⊕ Fin 3) + {m : (Fin 1 ⊕ Fin 3) →₀ ℕ} (hm : Finsupp.degree m < n) : + coeff m (f (maurerCartanForm U ρ)) = 0 := by have h0 := hU.2 (Finsupp.toMultiset m) ρ (by rw [← degree_toFinsupp_eq_card, Finsupp.toMultiset_toFinsupp]; exact hm) - have h1 := congrArg (fun a => GaugeAlgebra.toSU3Matrix a i j) h0 + have h1 := congrArg ψ h0 simp only [localGaugeData_evalLie, localGaugeData_iteratedDeriv, localGaugeData_maurerCartan, - GaugeAlgebra.zero_toSU3Matrix, Matrix.zero_apply] at h1 - rw [eval_toSU3Matrix_apply, iteratedDeriv_toSU3Matrix, Matrix.map_apply, - constantCoeff_foldl_pderiv, Finsupp.toMultiset_toFinsupp] at h1 + hψ] at h1 + rw [hf, constantCoeff_foldl_pderiv, Finsupp.toMultiset_toFinsupp] at h1 exact (mul_eq_zero.mp h1).resolve_left (Nat.cast_ne_zero.mpr (Finset.prod_ne_zero_iff.mpr fun ν _ => Nat.factorial_ne_zero _)) -/-- The `su(2)` entries of `coeff_maurerCartanForm_toSU3Matrix_eq_zero_of_mem_truncationKer`. -/ +/-- The `su(3)` entries of `coeff_maurerCartanForm_eq_zero_of_mem_truncationKer`. -/ +lemma coeff_maurerCartanForm_toSU3Matrix_eq_zero_of_mem_truncationKer {U : JetGaugeGroupI} + {n : ℕ} (hU : U ∈ localGaugeData.truncationKer n) (ρ : Fin 1 ⊕ Fin 3) + {m : (Fin 1 ⊕ Fin 3) →₀ ℕ} (hm : Finsupp.degree m < n) (i j : Fin 3) : + coeff m ((maurerCartanForm U ρ).toSU3Matrix i j) = 0 := + coeff_maurerCartanForm_eq_zero_of_mem_truncationKer (fun a => a.toSU3Matrix i j) (by simp) + (fun a => a.toSU3Matrix i j) + (fun s a => by rw [eval_toSU3Matrix_apply, iteratedDeriv_toSU3Matrix, Matrix.map_apply]) + hU ρ hm + +/-- The `su(2)` entries of `coeff_maurerCartanForm_eq_zero_of_mem_truncationKer`. -/ lemma coeff_maurerCartanForm_toSU2Matrix_eq_zero_of_mem_truncationKer {U : JetGaugeGroupI} {n : ℕ} (hU : U ∈ localGaugeData.truncationKer n) (ρ : Fin 1 ⊕ Fin 3) {m : (Fin 1 ⊕ Fin 3) →₀ ℕ} (hm : Finsupp.degree m < n) (i j : Fin 2) : - coeff m ((maurerCartanForm U ρ).toSU2Matrix i j) = 0 := by - have h0 := hU.2 (Finsupp.toMultiset m) ρ (by - rw [← degree_toFinsupp_eq_card, Finsupp.toMultiset_toFinsupp]; exact hm) - have h1 := congrArg (fun a => GaugeAlgebra.toSU2Matrix a i j) h0 - simp only [localGaugeData_evalLie, localGaugeData_iteratedDeriv, localGaugeData_maurerCartan, - GaugeAlgebra.zero_toSU2Matrix, Matrix.zero_apply] at h1 - rw [eval_toSU2Matrix_apply, iteratedDeriv_toSU2Matrix, Matrix.map_apply, - constantCoeff_foldl_pderiv, Finsupp.toMultiset_toFinsupp] at h1 - exact (mul_eq_zero.mp h1).resolve_left (Nat.cast_ne_zero.mpr - (Finset.prod_ne_zero_iff.mpr fun ν _ => Nat.factorial_ne_zero _)) + coeff m ((maurerCartanForm U ρ).toSU2Matrix i j) = 0 := + coeff_maurerCartanForm_eq_zero_of_mem_truncationKer (fun a => a.toSU2Matrix i j) (by simp) + (fun a => a.toSU2Matrix i j) + (fun s a => by rw [eval_toSU2Matrix_apply, iteratedDeriv_toSU2Matrix, Matrix.map_apply]) + hU ρ hm -/-- The `u(1)` value of `coeff_maurerCartanForm_toSU3Matrix_eq_zero_of_mem_truncationKer`. -/ +/-- The `u(1)` value of `coeff_maurerCartanForm_eq_zero_of_mem_truncationKer`. -/ lemma coeff_maurerCartanForm_toU1Value_eq_zero_of_mem_truncationKer {U : JetGaugeGroupI} {n : ℕ} (hU : U ∈ localGaugeData.truncationKer n) (ρ : Fin 1 ⊕ Fin 3) {m : (Fin 1 ⊕ Fin 3) →₀ ℕ} (hm : Finsupp.degree m < n) : - coeff m (maurerCartanForm U ρ).toU1Value = 0 := by - have h0 := hU.2 (Finsupp.toMultiset m) ρ (by - rw [← degree_toFinsupp_eq_card, Finsupp.toMultiset_toFinsupp]; exact hm) - have h1 := congrArg GaugeAlgebra.toU1Value h0 - simp only [localGaugeData_evalLie, localGaugeData_iteratedDeriv, localGaugeData_maurerCartan, - GaugeAlgebra.zero_toU1Value] at h1 - rw [eval_toU1Value_eq, iteratedDeriv_toU1Value, constantCoeff_foldl_pderiv, - Finsupp.toMultiset_toFinsupp] at h1 - exact (mul_eq_zero.mp h1).resolve_left (Nat.cast_ne_zero.mpr - (Finset.prod_ne_zero_iff.mpr fun ν _ => Nat.factorial_ne_zero _)) + coeff m (maurerCartanForm U ρ).toU1Value = 0 := + coeff_maurerCartanForm_eq_zero_of_mem_truncationKer (fun a => a.toU1Value) (by simp) + (fun a => a.toU1Value) (fun s a => by rw [eval_toU1Value_eq, iteratedDeriv_toU1Value]) hU ρ hm /-- Maurer–Cartan triangularity for the Standard Model: a jet trivial to order `n` in the sense of the Maurer–Cartan filtration truncates to the identity at order `n`. On each diff --git a/Physlib/Relativity/JetRing/Basic.lean b/Physlib/Relativity/JetRing/Basic.lean index 4958ea272..1d0ebb6a6 100644 --- a/Physlib/Relativity/JetRing/Basic.lean +++ b/Physlib/Relativity/JetRing/Basic.lean @@ -145,6 +145,15 @@ lemma coeff_single_one_pow (μ : Fin 1 ⊕ Fin 3) (f : JetRing) (n : ℕ) : push_cast linear_combination ((n : ℂ) * coeff (Finsupp.single μ 1) f) * hpow +/-- The constant-coefficient evaluation of a jet, as a `ℂ`-linear map. -/ +noncomputable def constantCoeffₗ : JetRing →ₗ[ℂ] ℂ where + toFun := constantCoeff + map_add' f g := by simp + map_smul' c f := by simp [smul_eq_C_mul] + +@[simp] +lemma constantCoeffₗ_apply (f : JetRing) : constantCoeffₗ f = constantCoeff f := rfl + /-! ### A.2. The formal partial derivative on the jet ring @@ -359,6 +368,20 @@ lemma truncation_one (n : ℕ) : truncation n (1 : JetRing) = 1 := by · rw [coeff_truncation_of_gt (not_le.mp hm), coeff_one, if_neg (by rintro rfl; simp at hm)] +/-- A power series with value `1` and no coefficients in nonzero degree up to `n` + truncates to `1`. -/ +lemma truncation_eq_one_of_coeff {n : ℕ} {f : JetRing} (h0 : constantCoeff f = 1) + (hf : ∀ p : (Fin 1 ⊕ Fin 3) →₀ ℕ, p ≠ 0 → Finsupp.degree p ≤ n → coeff p f = 0) : + JetRing.truncation n f = JetRing.truncation n (1 : JetRing) := by + 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 + · simpa [coeff_zero_eq_constantCoeff] using h0 + · rw [hf 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)] + /-- 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} : @@ -436,6 +459,62 @@ lemma eq_zero_of_sum_X_smul_pderiv_eq_zero {f : JetRing} (h0 : constantCoeff f = /-! +### The Euler vanishing principle by degree + +The graded form of `eq_zero_of_sum_X_smul_pderiv_eq_zero`: control of the first +derivatives below degree `n` controls the coefficients up to degree `n`. + +-/ + +/-- A product with a factor whose coefficients vanish below degree `n` has coefficients + vanishing below degree `n`. -/ +lemma coeff_mul_eq_zero_of_lt {n : ℕ} {w : JetRing} + (hw : ∀ q : (Fin 1 ⊕ Fin 3) →₀ ℕ, Finsupp.degree q < n → coeff q w = 0) (v : JetRing) + {q : (Fin 1 ⊕ Fin 3) →₀ ℕ} (hq : Finsupp.degree q < n) : coeff q (w * v) = 0 := by + 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] + +/-- The Euler vanishing principle: a power series all of whose first derivatives have + coefficients vanishing below degree `n` has vanishing coefficients in every nonzero degree + up to `n`, since `∑_ρ x_ρ ∂_ρ f` has the coefficient of `f` at `p` scaled by the degree + of `p`. -/ +lemma coeff_eq_zero_of_coeff_pderiv_eq_zero {n : ℕ} {f : JetRing} + (hf : ∀ (ρ : Fin 1 ⊕ Fin 3) (q : (Fin 1 ⊕ Fin 3) →₀ ℕ), Finsupp.degree q < n → + coeff q (pderiv ℂ ρ f) = 0) + {p : (Fin 1 ⊕ Fin 3) →₀ ℕ} (hp : p ≠ 0) (hpn : Finsupp.degree p ≤ n) : coeff p f = 0 := by + 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 + +/-- A power series satisfying a radial relation `∂_ρ f = x_ρ f`, with the `x_ρ` vanishing + below degree `n`, has no coefficients in nonzero degree up to `n`. -/ +lemma coeff_eq_zero_of_pderiv_eq_mul {n : ℕ} {f : JetRing} {x : (Fin 1 ⊕ Fin 3) → JetRing} + (hd : ∀ ρ, pderiv ℂ ρ f = x ρ * f) + (hx : ∀ (ρ : Fin 1 ⊕ Fin 3) (q : (Fin 1 ⊕ Fin 3) →₀ ℕ), Finsupp.degree q < n → + coeff q (x ρ) = 0) + {p : (Fin 1 ⊕ Fin 3) →₀ ℕ} (hp : p ≠ 0) (hpn : Finsupp.degree p ≤ n) : coeff p f = 0 := + coeff_eq_zero_of_coeff_pderiv_eq_zero + (fun ρ q hq => by rw [hd ρ]; exact coeff_mul_eq_zero_of_lt (hx ρ) f hq) hp hpn + +/-! + ## Multiset derivative bookkeeping -/ diff --git a/Physlib/Relativity/JetRing/Matrix.lean b/Physlib/Relativity/JetRing/Matrix.lean index 9c80c430f..75ce0a380 100644 --- a/Physlib/Relativity/JetRing/Matrix.lean +++ b/Physlib/Relativity/JetRing/Matrix.lean @@ -350,6 +350,50 @@ lemma exists_matrix_eulerTransport {κ : Type} [Fintype κ] [DecidableEq κ] /-! +## The Euler vanishing principle by degree on matrices + +-/ + +/-- The matrix form of `coeff_eq_zero_of_pderiv_eq_mul`: the entries of a matrix of power + series satisfying `∂_ρ A = X_ρ A`, with the `X_ρ` vanishing below degree `n`, have no + coefficients in nonzero degree up to `n`. -/ +lemma coeff_entry_eq_zero_of_map_pderiv_eq_mul {κ : Type} [Fintype κ] [DecidableEq κ] {n : ℕ} + {A : Matrix κ κ JetRing} {X : (Fin 1 ⊕ Fin 3) → Matrix κ κ JetRing} + (hd : ∀ ρ, A.map (pderiv ℂ ρ) = X ρ * A) + (hX : ∀ (ρ : Fin 1 ⊕ Fin 3) (q : (Fin 1 ⊕ Fin 3) →₀ ℕ), Finsupp.degree q < n → + ∀ i j, coeff q (X ρ i j) = 0) + (i j : κ) {p : (Fin 1 ⊕ Fin 3) →₀ ℕ} (hp : p ≠ 0) (hpn : Finsupp.degree p ≤ n) : + coeff p (A i j) = 0 := by + refine coeff_eq_zero_of_coeff_pderiv_eq_zero (fun ρ q hq => ?_) hp hpn + have h1 : pderiv ℂ ρ (A i j) = (X ρ * A) i j := by rw [← hd ρ, Matrix.map_apply] + rw [h1, Matrix.mul_apply, map_sum] + exact Finset.sum_eq_zero fun k _ => coeff_mul_eq_zero_of_lt (fun q' hq' => hX ρ q' hq' i k) _ hq + +/-- A matrix of power series with identity value and no coefficients in nonzero degree up + to `n` truncates to the identity. -/ +lemma matrix_map_truncation_eq_one {κ : Type} [Fintype κ] [DecidableEq κ] {n : ℕ} + {A : Matrix κ κ JetRing} (h0 : (constantCoeff : JetRing →+* ℂ).mapMatrix A = 1) + (hA : ∀ (i j : κ) (p : (Fin 1 ⊕ Fin 3) →₀ ℕ), p ≠ 0 → Finsupp.degree p ≤ n → + coeff p (A i j) = 0) : + A.map (JetRing.truncation n) = (1 : Matrix κ κ JetRing).map (JetRing.truncation n) := by + 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 N => N i j) h0 + simpa [RingHom.mapMatrix_apply, Matrix.map_apply, Matrix.one_apply, + apply_ite constantCoeff, coeff_zero_eq_constantCoeff] using h3 + · rw [hA 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)] + +/-! + ## Unitarity and determinant of the Euler transport -/ From 682fb30fc28a2b1d44092660ff2b8dbbfeb51979 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 9 Sep 2026 06:19:18 +0100 Subject: [PATCH 307/367] refactor: GaugeBoson/GaugeJetAlgebra and GaugeBoson/Realization MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The free gauge-boson jet algebra moves to GaugeBoson/GaugeJetAlgebra/. The theory of the gauge-field laws (formerly GaugeTheory/GaugeField/) moves to GaugeBoson/Realization/, headed by the new structure GaugeAlgebraRealization: an algebra map out of ℂ ⊗ GaugeJetAlgebra 𝔤 equivariant for the jet gauge group and the Lorentz group, with both groups multiplicative on the target, exactly as the Standard Model's AlgebraRealization. Its gauge field h.A and the laws h.isGaugeField are the jet algebra's own, pushed along the map; the predicate IsGaugeField remains the form of the laws the theorems consume. Invariants.lean holds the classification for a realization, with the commutation of the gauge symbols automatic. The Standard Model gains JetAlgebra.gaugeRealization and AlgebraRealization.gaugeRealization, whose fields are the SM gauge field by rfl, so JetAlgebra.isGaugeField and AlgebraRealization.repJet_A are one-liners. Co-Authored-By: Claude Fable 5.1 --- Physlib.lean | 21 +- .../{ => GaugeJetAlgebra}/Basic.lean | 4 +- .../{ => GaugeJetAlgebra}/GaugeAction.lean | 2 +- .../{ => GaugeJetAlgebra}/JetDeriv.lean | 2 +- .../{ => GaugeJetAlgebra}/LorentzAction.lean | 2 +- .../{ => GaugeJetAlgebra}/MassDim.lean | 2 +- .../GaugeTheory/GaugeBoson/IsGaugeField.lean | 124 ---------- .../GaugeBoson/Realization/Basic.lean | 212 ++++++++++++++++++ .../Realization}/FieldStrength.lean | 4 +- .../GaugeBoson/Realization/Invariants.lean | 106 +++++++++ .../Realization/IsGaugeField.lean} | 0 .../Realization}/Symmetrized.lean | 2 +- .../Realization}/TransformsInAdjoint.lean | 2 +- .../GaugeTheory/Matter/CovariantDeriv.lean | 4 +- .../JetAlgebra/GaugeFieldData.lean | 2 +- .../AlgebraRealization/Basic.lean | 43 ++-- .../Fermions/DownSinglet/Basic.lean | 2 +- .../DownSinglet/GaugeAlgebraAction.lean | 2 +- .../LeptonDoublet/GaugeAlgebraAction.lean | 2 +- .../LeptonSinglet/GaugeAlgebraAction.lean | 2 +- .../QuarkDoublet/GaugeAlgebraAction.lean | 2 +- .../UpSinglet/GaugeAlgebraAction.lean | 2 +- .../GaugeJetAlgebra/MassWeightPoly.lean | 2 +- .../HiggsBoson/GaugeAlgebraAction.lean | 2 +- .../StandardModel/JetAlgebra/Basic.lean | 2 +- .../StandardModel/JetAlgebra/GaugeAction.lean | 2 +- .../StandardModel/JetAlgebra/Invariants.lean | 53 ++--- .../StandardModel/JetAlgebra/JetDeriv.lean | 2 +- .../JetAlgebra/LorentzAction.lean | 2 +- 29 files changed, 399 insertions(+), 210 deletions(-) rename Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/{ => GaugeJetAlgebra}/Basic.lean (98%) rename Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/{ => GaugeJetAlgebra}/GaugeAction.lean (99%) rename Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/{ => GaugeJetAlgebra}/JetDeriv.lean (99%) rename Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/{ => GaugeJetAlgebra}/LorentzAction.lean (99%) rename Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/{ => GaugeJetAlgebra}/MassDim.lean (99%) delete mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/IsGaugeField.lean create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Basic.lean rename Physlib/ClassicalFieldTheory/GaugeTheory/{GaugeField => GaugeBoson/Realization}/FieldStrength.lean (98%) create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Invariants.lean rename Physlib/ClassicalFieldTheory/GaugeTheory/{GaugeField/Basic.lean => GaugeBoson/Realization/IsGaugeField.lean} (100%) rename Physlib/ClassicalFieldTheory/GaugeTheory/{GaugeField => GaugeBoson/Realization}/Symmetrized.lean (99%) rename Physlib/ClassicalFieldTheory/GaugeTheory/{GaugeField => GaugeBoson/Realization}/TransformsInAdjoint.lean (99%) diff --git a/Physlib.lean b/Physlib.lean index 3490037c5..c7aa13f8d 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -1,15 +1,16 @@ 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.Symmetrized -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeField.TransformsInAdjoint +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.FieldStrength +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.Invariants +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.IsGaugeField +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.Symmetrized +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.TransformsInAdjoint +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.GaugeAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.JetDeriv +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.LorentzAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.MassDim public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.AdjointCoeff public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/Basic.lean similarity index 98% rename from Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Basic.lean rename to Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/Basic.lean index 5b0ddbf2d..2172779c6 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/Basic.lean @@ -22,8 +22,8 @@ lives — is the free commutative algebra on the component functions `∂_s A_μ 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 -`StandardModel.GaugeAlgebra`. +`Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization`. For the Standard Model, +`𝔤` is `StandardModel.GaugeAlgebra`. 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 diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeAction.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/GaugeAction.lean similarity index 99% rename from Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeAction.lean rename to Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/GaugeAction.lean index 5be7aac7f..79a21b3c3 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeAction.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/GaugeAction.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.JetDeriv +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.JetDeriv public import Physlib.ClassicalFieldTheory.GaugeTheory.Matter.CovariantDeriv public import Physlib.Mathematics.MultisetAntidiagonal diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/JetDeriv.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/JetDeriv.lean similarity index 99% rename from Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/JetDeriv.lean rename to Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/JetDeriv.lean index bdd3c6f76..0ba407fdf 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/JetDeriv.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/JetDeriv.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.Basic /-! # The formal total derivative on the gauge-boson jet algebra diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LorentzAction.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/LorentzAction.lean similarity index 99% rename from Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LorentzAction.lean rename to Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/LorentzAction.lean index 18fcc2a34..ed0194ae3 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LorentzAction.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/LorentzAction.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.JetDeriv +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.JetDeriv public import Physlib.Relativity.IsLorentzDeriv /-! diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/MassDim.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/MassDim.lean similarity index 99% rename from Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/MassDim.lean rename to Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/MassDim.lean index 285329f4f..051e8f9b7 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/MassDim.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/MassDim.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.JetDeriv +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.JetDeriv /-! # Mass dimension on the gauge-boson jet algebra diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/IsGaugeField.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/IsGaugeField.lean deleted file mode 100644 index 881408d72..000000000 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/IsGaugeField.lean +++ /dev/null @@ -1,124 +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.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LorentzAction -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeAction -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeField.Symmetrized -/-! -# 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 local-gauge-data package `jets`. For a free package the classification of invariants -of `Physlib.ClassicalFieldTheory.GaugeTheory.GaugeField.Symmetrized` then applies: a gauge -invariant of the gauge-boson jet algebra is a polynomial in the covariant derivatives of the -field strength, `GaugeJetAlgebra.invariant_mem_adjoin_fieldStrength`. --/ - -@[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 {jets : LocalGaugeData 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 - --/ - -variable (jets) in -/-- 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 jets (complexRepLorentzGroup 𝔤) (complexRepJet jets) (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₂ - -/-! - -## B. The classification of gauge invariants - --/ - -variable (jets) in -/-- The classification of gauge invariants of the gauge-boson jet algebra: for a free - package, 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 [jets.Free] (S : Set (ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤)) - (hS : ∀ y ∈ S, ∀ U : jets.truncationKer 0, complexRepJet jets U.1 y = y) - {x : ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤} - (hx : x ∈ Algebra.adjoin ℂ ({b : ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤 | - ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), - b = gaugeField 𝔤 p μ φ} ∪ S)) - (hinv : ∀ U : G, complexRepJet jets U x = x) : - x ∈ Algebra.adjoin ℂ ({b : ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤 | - ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), - b = IsGaugeField.iteratedCovDerivAdjoint (gaugeField 𝔤) l - (IsGaugeField.fieldStrength (gaugeField 𝔤) ν lam) 0 φ} ∪ S) := - IsGaugeField.invariant_mem_adjoin_fieldStrength (isGaugeField jets) - (fun _ _ _ _ _ _ => Commute.all _ _) - S (fun _ _ _ _ _ => Commute.all _ _) hS hx hinv - -end GaugeJetAlgebra diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Basic.lean new file mode 100644 index 000000000..b27e17928 --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Basic.lean @@ -0,0 +1,212 @@ +/- +Copyright (c) 2026 Joseph Tooby-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.GaugeJetAlgebra.LorentzAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.GaugeAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.Symmetrized +/-! +# Realizations of the gauge-boson jet algebra + +## i. Overview + +An algebra `B` carries the gauge bosons of a gauge theory when the gauge-boson jet algebra, +the universal algebra on the symbols `∂_s A_μ^φ`, maps into it compatibly with the actions +of the jet gauge group and of the Lorentz group. That is the structure +`GaugeAlgebraRealization`: an algebra map `ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤 →ₐ[ℂ] B` equivariant for +the two groups, together with the demands that both groups act on the whole of `B` by +algebra endomorphisms. It is the gauge-boson part of the Standard Model's +`AlgebraRealization`, for any local-gauge-data package `jets`. + +The gauge-field symbols of a realization are the jet algebra's own symbols pushed along +the map, `GaugeAlgebraRealization.A`, and their transformation laws are the jet algebra's +own laws pushed along it, `GaugeAlgebraRealization.isGaugeField`. The base case is the jet +algebra realized in itself: its symbols satisfy the laws `IsGaugeField` because the Lorentz +law is that of a Lorentz derivative and the gauge law is the substitution action of the jet +gauge group constructed in `GaugeJetAlgebra.GaugeAction`. + +Everything the theory of the laws derives, the covariant derivative, the field strength and +the classification of invariants, then applies to every realization through its predicate +`IsGaugeField`, which is the form of the laws the theorems consume; the classification for +a realization is in `Invariants.lean`. + +## ii. Key results + +- `GaugeJetAlgebra.gaugeField` : the gauge-field symbols of the jet algebra. +- `GaugeJetAlgebra.isGaugeField` : the jet algebra is a gauge field. +- `GaugeAlgebraRealization` : an algebra carrying the gauge bosons, as an equivariant + algebra map out of the jet algebra. +- `GaugeAlgebraRealization.id` : the jet algebra realized in itself. +- `GaugeAlgebraRealization.A`, `GaugeAlgebraRealization.isGaugeField` : the gauge-field + symbols of a realization and their laws. + +## iii. Table of contents + +- A. The gauge-field structure of the jet algebra +- B. Realizations + +-/ + +@[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 {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} + +set_option maxHeartbeats 1000000 + + +namespace GaugeJetAlgebra + +open TensorProduct Matrix MatrixGroups + +/-! + +## A. The gauge-field structure of the jet algebra + +-/ + +/-! + +### 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 laws + +-/ + +variable (jets) in +/-- 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 jets (complexRepLorentzGroup 𝔤) (complexRepJet jets) (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 + +/-! + +## B. Realizations + +-/ + +open TensorProduct Matrix MatrixGroups + +/-- An algebra `B` carrying the gauge bosons of the package `jets`: an algebra map out of + the complexified gauge-boson jet algebra, equivariant for the jet gauge group and the + Lorentz group, with both groups acting on the whole of `B` by algebra endomorphisms. + The gauge-field symbols of `B` are the images of the jet algebra's symbols, + `GaugeAlgebraRealization.A`, and they satisfy the laws `IsGaugeField` by transport. -/ +structure GaugeAlgebraRealization (jets : LocalGaugeData G 𝔤 G₀ 𝔤J) (B : Type) [Ring B] + [Algebra ℂ B] (repJet : Representation ℂ G B) (repLorentz : Representation ℂ SL(2,ℂ) B) + where + /-- The algebra map out of the gauge-boson jet algebra: it places the gauge-boson + symbols, and every polynomial expression in them, inside `B`. -/ + toAlgHom : ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤 →ₐ[ℂ] B + /-- The map is equivariant for the jet gauge group. -/ + map_repJet : ∀ (U : G) (x : ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤), + toAlgHom (GaugeJetAlgebra.complexRepJet jets U x) = repJet U (toAlgHom x) + /-- The map is equivariant for the Lorentz group. -/ + map_repLorentz : ∀ (Λ : SL(2,ℂ)) (x : ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤), + toAlgHom (GaugeJetAlgebra.complexRepLorentzGroup 𝔤 Λ x) = repLorentz Λ (toAlgHom x) + /-- The jet gauge group acts on the whole of `B` by algebra endomorphisms. -/ + repJet_mul : ∀ (U : G) (b₁ b₂ : B), repJet U (b₁ * b₂) = repJet U b₁ * repJet U b₂ + /-- The Lorentz group acts on the whole of `B` by algebra endomorphisms. -/ + repLorentz_mul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂ + +namespace GaugeAlgebraRealization + +open GaugeJetAlgebra + +variable {B : Type} [Ring B] [Algebra ℂ B] {repJet : Representation ℂ G B} + {repLorentz : Representation ℂ SL(2,ℂ) B} + +variable (jets) in +/-- The gauge-boson jet algebra realized in itself, by the identity. -/ +noncomputable def id : GaugeAlgebraRealization jets (ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤) + (complexRepJet jets) (complexRepLorentzGroup 𝔤) where + toAlgHom := AlgHom.id ℂ _ + map_repJet _ _ := rfl + map_repLorentz _ _ := rfl + repJet_mul := complexRepJet_apply_mul + repLorentz_mul := complexRepLorentzGroup_apply_mul + +variable (h : GaugeAlgebraRealization jets B repJet repLorentz) + +/-- The gauge-field symbols `∂_s A_μ^φ` of a realization: the jet algebra's symbols pushed + along the map. -/ +noncomputable def A (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : + Module.Dual ℝ 𝔤 →ₗ[ℝ] B := + h.toAlgHom.toLinearMap.restrictScalars ℝ ∘ₗ gaugeField 𝔤 s μ + +@[simp] +lemma A_apply (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + h.A s μ φ = h.toAlgHom (gaugeField 𝔤 s μ φ) := rfl + +/-- The gauge-field symbols of a realization commute, being images of a commutative + algebra. -/ +lemma commute_A (p q : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (φ ψ : Module.Dual ℝ 𝔤) : Commute (h.A p μ φ) (h.A q ν ψ) := + (Commute.all _ _).map h.toAlgHom + +/-- The gauge-field laws of a realization, obtained from the laws of the jet algebra by + pushing them along the defining algebra map. -/ +theorem isGaugeField : IsGaugeField jets repLorentz repJet h.A where + lorentz_apply Λ n l μ φ := by + have key := congrArg h.toAlgHom ((GaugeJetAlgebra.isGaugeField jets).lorentz_apply Λ n l μ φ) + rw [h.map_repLorentz] at key + refine key.trans ?_ + rw [map_sum] + refine Finset.sum_congr rfl fun p _ => ?_ + rw [map_smul, map_sum] + exact congrArg _ (Finset.sum_congr rfl fun a _ => map_smul h.toAlgHom _ _) + gauge_apply_deriv U s μ φ := by + have key := congrArg h.toAlgHom ((GaugeJetAlgebra.isGaugeField jets).gauge_apply_deriv U s μ φ) + rw [h.map_repJet] at key + refine key.trans ?_ + rw [map_add, map_multiset_sum, Multiset.map_map, AlgHom.commutes] + rfl + gauge_mul := h.repJet_mul + +end GaugeAlgebraRealization diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/FieldStrength.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/FieldStrength.lean similarity index 98% rename from Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/FieldStrength.lean rename to Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/FieldStrength.lean index bc990b7b4..968e5a6a8 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/FieldStrength.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/FieldStrength.lean @@ -5,8 +5,8 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeField.Basic -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeField.TransformsInAdjoint +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.IsGaugeField +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.TransformsInAdjoint public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.MaurerCartan /-! diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Invariants.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Invariants.lean new file mode 100644 index 000000000..c79892ef5 --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Invariants.lean @@ -0,0 +1,106 @@ +/- +Copyright (c) 2026 Joseph Tooby-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.Realization.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.Symmetrized +/-! +# The gauge invariants of a realization + +## i. Overview + +For a free package, the classification of invariants of +`Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.Symmetrized` +applies to every realization of the gauge-boson jet algebra: a gauge invariant of the +subalgebra generated by the gauge-field symbols and a 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`. The commutation hypotheses on the gauge-field symbols are automatic for a realization, +since the symbols are images of a commutative algebra; only the commutation of `S` with the +symbols remains to be supplied. The jet algebra itself is the case of the identity +realization. + +## ii. Key results + +- `GaugeAlgebraRealization.invariant_mem_adjoin_fieldStrength` : the classification of + invariants for a realization. +- `GaugeJetAlgebra.invariant_mem_adjoin_fieldStrength` : the classification for the jet + algebra itself. + +## iii. Table of contents + +- A. The classification for a realization +- B. The classification for the jet algebra + +-/ + +@[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 {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} + +open TensorProduct Matrix MatrixGroups + +/-! + +## A. The classification for a realization + +-/ + +namespace GaugeAlgebraRealization + +variable {B : Type} [Ring B] [Algebra ℂ B] {repJet : Representation ℂ G B} + {repLorentz : Representation ℂ SL(2,ℂ) B} (h : GaugeAlgebraRealization jets B repJet repLorentz) + +/-- The classification of gauge invariants of a realization: for a free package, a + gauge-invariant element of the subalgebra generated by the gauge-field symbols and a set + `S` of elements fixed by the pure jets and commuting with the symbols is a polynomial in + the covariant derivatives of the field strength and the elements of `S`. -/ +theorem invariant_mem_adjoin_fieldStrength [jets.Free] (S : Set B) + (hcS : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), + ∀ y ∈ S, Commute y (h.A p μ φ)) + (hS : ∀ y ∈ S, ∀ U : jets.truncationKer 0, repJet U.1 y = y) + {x : B} (hx : x ∈ Algebra.adjoin ℂ (IsGaugeField.symbols h.A ∪ S)) + (hinv : ∀ U : G, repJet U x = x) : + x ∈ Algebra.adjoin ℂ (IsGaugeField.tower h.A ∪ S) := + IsGaugeField.invariant_mem_adjoin_fieldStrength h.isGaugeField h.commute_A S hcS hS hx hinv + +end GaugeAlgebraRealization + +/-! + +## B. The classification for the jet algebra + +-/ + +namespace GaugeJetAlgebra + +variable (jets) in +/-- The classification of gauge invariants of the gauge-boson jet algebra: for a free + package, 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 [jets.Free] (S : Set (ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤)) + (hS : ∀ y ∈ S, ∀ U : jets.truncationKer 0, complexRepJet jets U.1 y = y) + {x : ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤} + (hx : x ∈ Algebra.adjoin ℂ ({b : ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤 | + ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), + b = gaugeField 𝔤 p μ φ} ∪ S)) + (hinv : ∀ U : G, complexRepJet jets U x = x) : + x ∈ Algebra.adjoin ℂ ({b : ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤 | + ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), + b = IsGaugeField.iteratedCovDerivAdjoint (gaugeField 𝔤) l + (IsGaugeField.fieldStrength (gaugeField 𝔤) ν lam) 0 φ} ∪ S) := + IsGaugeField.invariant_mem_adjoin_fieldStrength (isGaugeField jets) + (fun _ _ _ _ _ _ => Commute.all _ _) + S (fun _ _ _ _ _ => Commute.all _ _) hS hx hinv + +end GaugeJetAlgebra diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/IsGaugeField.lean similarity index 100% rename from Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/Basic.lean rename to Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/IsGaugeField.lean diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/Symmetrized.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Symmetrized.lean similarity index 99% rename from Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/Symmetrized.lean rename to Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Symmetrized.lean index 21e0ba56e..bfe4f4dcc 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/Symmetrized.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Symmetrized.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeField.FieldStrength +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.FieldStrength public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Truncation public import Mathlib.LinearAlgebra.Basis.Defs public import Mathlib.LinearAlgebra.Dimension.Free diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/TransformsInAdjoint.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/TransformsInAdjoint.lean similarity index 99% rename from Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/TransformsInAdjoint.lean rename to Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/TransformsInAdjoint.lean index e93dcef18..c2c73117c 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeField/TransformsInAdjoint.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/TransformsInAdjoint.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeField.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.IsGaugeField /-! # Adjoint gauge tensors and the covariant derivative diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/Matter/CovariantDeriv.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/Matter/CovariantDeriv.lean index 8aacfe62d..f96b5eabb 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/Matter/CovariantDeriv.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/Matter/CovariantDeriv.lean @@ -5,9 +5,9 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeField.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.IsGaugeField public import Physlib.ClassicalFieldTheory.JetAlgebra.Jet -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeField.TransformsInAdjoint +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.TransformsInAdjoint public import Mathlib.LinearAlgebra.Basis.Defs public import Mathlib.LinearAlgebra.Dimension.Free /-! diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/GaugeFieldData.lean b/Physlib/ClassicalFieldTheory/JetAlgebra/GaugeFieldData.lean index b3107cf0c..883d31ea8 100644 --- a/Physlib/ClassicalFieldTheory/JetAlgebra/GaugeFieldData.lean +++ b/Physlib/ClassicalFieldTheory/JetAlgebra/GaugeFieldData.lean @@ -5,7 +5,7 @@ Authors: Nathaneal Sajan -/ module -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.Basic public import Physlib.ClassicalFieldTheory.JetAlgebra.SpeciesGenerators /-! diff --git a/Physlib/Particles/StandardModel/AlgebraRealization/Basic.lean b/Physlib/Particles/StandardModel/AlgebraRealization/Basic.lean index b1f9ac9b3..b1ab1ecd0 100644 --- a/Physlib/Particles/StandardModel/AlgebraRealization/Basic.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/Basic.lean @@ -9,7 +9,7 @@ public import Physlib.Particles.StandardModel.Fermions.LeptonDoublet.GaugeAlgebr 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.ClassicalFieldTheory.GaugeTheory.GaugeField.Symmetrized +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.Symmetrized public import Physlib.Particles.StandardModel.GaugeGroup.MaurerCartan.Freeness public import Physlib.Particles.StandardModel.HiggsBoson.GaugeAlgebraAction public import Physlib.Particles.StandardModel.JetAlgebra.TransformsIn @@ -246,27 +246,26 @@ barred families in the conjugate of it. -/ -/-- The law `repJet_A` of a Standard Model, obtained from the corresponding law of the - jet algebra by pushing it along the defining algebra map. -/ -lemma repJet_A : IsGaugeField localGaugeData repLorentz repJet h.A where - lorentz_apply := by - intro Λ n l μ φ - have key := congrArg h.toAlgHom (JetAlgebra.isGaugeField.lorentz_apply Λ n l μ φ) - rw [h.map_repLorentz] at key - refine key.trans ?_ - rw [map_sum] - refine Finset.sum_congr rfl fun p _ => ?_ - rw [map_smul, map_sum] - congr 1 - exact Finset.sum_congr rfl fun a _ => map_smul h.toAlgHom _ _ - gauge_apply_deriv := by - intro U s μ φ - have key := congrArg h.toAlgHom (JetAlgebra.isGaugeField.gauge_apply_deriv U s μ φ) - rw [h.map_repJet] at key - refine key.trans ?_ - rw [map_add, map_multiset_sum, Multiset.map_map, AlgHom.commutes] - rfl - gauge_mul := h.repJet_mul +/-- The gauge-boson part of a Standard Model: the realization of the gauge-boson jet + algebra in `B` through the gauge sector of the jet algebra. -/ +noncomputable def gaugeRealization : + GaugeAlgebraRealization localGaugeData B repJet repLorentz where + toAlgHom := h.toAlgHom.comp JetAlgebra.includeGauge + map_repJet U y := by + rw [AlgHom.comp_apply, AlgHom.comp_apply, ← JetAlgebra.repJetGaugeGroupI_includeGauge, + h.map_repJet] + map_repLorentz Λ y := by + rw [AlgHom.comp_apply, AlgHom.comp_apply, ← JetAlgebra.repLorentzGroup_includeGauge, + h.map_repLorentz] + repJet_mul := h.repJet_mul + repLorentz_mul := h.repLorentz_mul + +lemma gaugeRealization_A : h.gaugeRealization.A = h.A := rfl + +/-- The law `repJet_A` of a Standard Model: the gauge-field laws of the realization + `gaugeRealization`. -/ +lemma repJet_A : IsGaugeField localGaugeData repLorentz repJet h.A := + h.gaugeRealization_A ▸ h.gaugeRealization.isGaugeField /-- The law `repJet_H` of a Standard Model, obtained from the corresponding law of the jet algebra by pushing it along the defining algebra map. -/ diff --git a/Physlib/Particles/StandardModel/Fermions/DownSinglet/Basic.lean b/Physlib/Particles/StandardModel/Fermions/DownSinglet/Basic.lean index f12951f64..d09d39cbe 100644 --- a/Physlib/Particles/StandardModel/Fermions/DownSinglet/Basic.lean +++ b/Physlib/Particles/StandardModel/Fermions/DownSinglet/Basic.lean @@ -12,7 +12,7 @@ public import Physlib.Particles.StandardModel.GaugeGroup.JetGaugeGroup.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData public import Physlib.ClassicalFieldTheory.JetAlgebra.JetComponentSpace.GaugeAction -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.GaugeAction 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/DownSinglet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/DownSinglet/GaugeAlgebraAction.lean index 405d6bca5..cabff27a4 100644 --- a/Physlib/Particles/StandardModel/Fermions/DownSinglet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/DownSinglet/GaugeAlgebraAction.lean @@ -8,7 +8,7 @@ module public import Physlib.Particles.StandardModel.Fermions.DownSinglet.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.GaugeAction public import Mathlib.LinearAlgebra.TensorProduct.Pi public import Mathlib.Analysis.Normed.Lp.Matrix public import Mathlib.RingTheory.TensorProduct.Maps diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean index 4acf714ba..113eb1ca8 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean @@ -8,7 +8,7 @@ module public import Physlib.Particles.StandardModel.Fermions.LeptonDoublet.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.GaugeAction public import Mathlib.LinearAlgebra.TensorProduct.Pi public import Mathlib.Analysis.Normed.Lp.Matrix public import Mathlib.RingTheory.TensorProduct.Maps diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/GaugeAlgebraAction.lean index 5e7987a89..df2e0d42d 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/GaugeAlgebraAction.lean @@ -8,7 +8,7 @@ module public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.GaugeAction /-! # The gauge-algebra action on the charged-lepton singlet diff --git a/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/GaugeAlgebraAction.lean index 23a4057d1..10c4e0f26 100644 --- a/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/GaugeAlgebraAction.lean @@ -8,7 +8,7 @@ module public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.GaugeAction public import Mathlib.LinearAlgebra.TensorProduct.Pi public import Mathlib.LinearAlgebra.Matrix.Kronecker public import Mathlib.Analysis.Normed.Lp.Matrix diff --git a/Physlib/Particles/StandardModel/Fermions/UpSinglet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/UpSinglet/GaugeAlgebraAction.lean index 6388beb4d..3025fc764 100644 --- a/Physlib/Particles/StandardModel/Fermions/UpSinglet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/UpSinglet/GaugeAlgebraAction.lean @@ -8,7 +8,7 @@ module public import Physlib.Particles.StandardModel.Fermions.UpSinglet.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.GaugeAction public import Mathlib.LinearAlgebra.TensorProduct.Pi public import Mathlib.Analysis.Normed.Lp.Matrix public import Mathlib.RingTheory.TensorProduct.Maps diff --git a/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/MassWeightPoly.lean b/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/MassWeightPoly.lean index b5dbb37b8..db433513a 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/MassWeightPoly.lean +++ b/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/MassWeightPoly.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.JetDeriv +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.JetDeriv public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData /-! # The mass-weight polynomial on the gauge-boson jet algebra diff --git a/Physlib/Particles/StandardModel/HiggsBoson/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/HiggsBoson/GaugeAlgebraAction.lean index 64fc85979..7b1a270a7 100644 --- a/Physlib/Particles/StandardModel/HiggsBoson/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/HiggsBoson/GaugeAlgebraAction.lean @@ -8,7 +8,7 @@ module public import Physlib.Particles.StandardModel.HiggsBoson.JetAlgebra.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.GaugeAction public import Mathlib.LinearAlgebra.TensorProduct.Pi public import Mathlib.Analysis.Normed.Lp.Matrix public import Mathlib.RingTheory.TensorProduct.Maps diff --git a/Physlib/Particles/StandardModel/JetAlgebra/Basic.lean b/Physlib/Particles/StandardModel/JetAlgebra/Basic.lean index 9eeb3540a..caebcc1a8 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/Basic.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/Basic.lean @@ -7,7 +7,7 @@ module public import Physlib.Particles.StandardModel.Fermions.JetAlgebra.Basic public import Physlib.Particles.StandardModel.HiggsBoson.JetAlgebra.Basic -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.Basic public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData /-! # The jet algebra of the Standard Model diff --git a/Physlib/Particles/StandardModel/JetAlgebra/GaugeAction.lean b/Physlib/Particles/StandardModel/JetAlgebra/GaugeAction.lean index 5b8a0d120..819837f50 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/GaugeAction.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/GaugeAction.lean @@ -8,7 +8,7 @@ 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.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.GaugeAction public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData /-! # The jet gauge action on the jet algebra of the Standard Model diff --git a/Physlib/Particles/StandardModel/JetAlgebra/Invariants.lean b/Physlib/Particles/StandardModel/JetAlgebra/Invariants.lean index 7b81b5aab..9c6b744f2 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/Invariants.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/Invariants.lean @@ -7,7 +7,7 @@ module public import Physlib.Particles.StandardModel.JetAlgebra.LorentzAction public import Physlib.Particles.StandardModel.JetAlgebra.GaugeAction -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.IsGaugeField +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.Invariants public import Physlib.Particles.StandardModel.GaugeGroup.MaurerCartan.Freeness /-! # Gauge invariants of the jet algebra of the Standard Model @@ -17,7 +17,7 @@ public import Physlib.Particles.StandardModel.GaugeGroup.MaurerCartan.Freeness 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.ClassicalFieldTheory.GaugeTheory.GaugeField`. This file establishes that +`Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization`. 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 @@ -121,36 +121,31 @@ lemma includeGauge_mem_center (y : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) /-! -## B. The `IsGaugeField` instance +## B. The gauge realization -/ -/-- **The jet algebra of the Standard Model is a gauge field**: its gauge-field - 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. -/ +/-- The jet algebra of the Standard Model realizes the gauge-boson jet algebra through the + central inclusion of the gauge sector, equivariantly for the jet gauge group and the + Lorentz group. -/ +noncomputable def gaugeRealization : + GaugeAlgebraRealization localGaugeData JetAlgebra repJetGaugeGroupI repLorentzGroup where + toAlgHom := includeGauge + map_repJet U y := (repJetGaugeGroupI_includeGauge U y).symm + map_repLorentz Λ y := (repLorentzGroup_includeGauge Λ y).symm + repJet_mul := repJetGaugeGroupI_apply_mul + repLorentz_mul := repLorentzGroup_apply_mul + +lemma gaugeRealization_A : gaugeRealization.A = gaugeField := rfl + +/-- The jet algebra of the Standard Model is a gauge field: its gauge-field 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 realization `gaugeRealization`. -/ theorem isGaugeField : - IsGaugeField localGaugeData (B := JetAlgebra) repLorentzGroup repJetGaugeGroupI gaugeField where - lorentz_apply Λ n l μ φ := - (repLorentzGroup_includeGauge Λ - ((GaugeJetAlgebra.gaugeField GaugeAlgebra) (List.ofFn l) μ φ)).trans <| - (congrArg includeGauge - ((GaugeJetAlgebra.isGaugeField localGaugeData).lorentz_apply Λ n l μ φ)).trans <| - (map_sum includeGauge _ Finset.univ).trans <| - 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 μ φ := - (repJetGaugeGroupI_includeGauge U _).trans <| - (congrArg includeGauge - ((GaugeJetAlgebra.isGaugeField localGaugeData).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 => rfl)) rfl - gauge_mul U b₁ b₂ := repJetGaugeGroupI_apply_mul U b₁ b₂ + IsGaugeField localGaugeData (B := JetAlgebra) repLorentzGroup repJetGaugeGroupI gaugeField := + gaugeRealization_A ▸ gaugeRealization.isGaugeField /-! @@ -181,7 +176,7 @@ 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 q μ ν φ ψ => + (fun _ q _ ν _ ψ => Subring.mem_center_iff.mp (includeGauge_mem_center ((GaugeJetAlgebra.gaugeField GaugeAlgebra) q ν ψ)) _) S diff --git a/Physlib/Particles/StandardModel/JetAlgebra/JetDeriv.lean b/Physlib/Particles/StandardModel/JetAlgebra/JetDeriv.lean index 65a78bb0c..90eb04fba 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/JetDeriv.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/JetDeriv.lean @@ -8,7 +8,7 @@ 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.ClassicalFieldTheory.GaugeTheory.GaugeBoson.JetDeriv +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.JetDeriv public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData /-! # The total derivative on the jet algebra of the Standard Model diff --git a/Physlib/Particles/StandardModel/JetAlgebra/LorentzAction.lean b/Physlib/Particles/StandardModel/JetAlgebra/LorentzAction.lean index a09d407bf..4b1407c18 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/LorentzAction.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/LorentzAction.lean @@ -8,7 +8,7 @@ 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.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LorentzAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.LorentzAction /-! # The Lorentz action on the jet algebra of the Standard Model From 3f6e8dceeb688855da47e6c8297687b0dfcb19f5 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 9 Sep 2026 07:21:21 +0100 Subject: [PATCH 308/367] feat: Define GaugeAlgebra realization --- Physlib.lean | 5 +- .../GaugeJetAlgebra/GaugeAction.lean | 10 +- .../GaugeJetAlgebra/GaugeField.lean | 94 +++++++ .../GaugeBoson/Realization/Basic.lean | 220 ++++++++--------- .../GaugeBoson/Realization/FieldStrength.lean | 59 ++--- .../{IsGaugeField.lean => GaugeLaw.lean} | 231 +++++++----------- .../GaugeBoson/Realization/Invariants.lean | 106 -------- .../GaugeBoson/Realization/Symmetrized.lean | 228 +++++++++-------- .../Realization/TransformsInAdjoint.lean | 45 ++-- .../LocalGaugeData/InfinitesimalAction.lean | 50 ++-- .../LocalGaugeData/TransformsIn.lean | 2 +- .../GaugeTheory/Matter/CovariantDeriv.lean | 12 +- .../JetComponentSpace/TransformsIn.lean | 16 +- .../AlgebraRealization/Basic.lean | 9 +- .../CovFieldAlgebra/Basic.lean | 32 +-- .../AlgebraRealization/CovStandardModel.lean | 93 +++---- .../AlgebraRealization/CovariantDeriv.lean | 187 +++++++------- .../CovAlgebraRealization/Basic.lean | 50 ++-- .../DownSinglet/GaugeAlgebraAction.lean | 8 +- .../Fermions/JetAlgebra/Species.lean | 37 +-- .../LeptonDoublet/GaugeAlgebraAction.lean | 8 +- .../LeptonSinglet/GaugeAlgebraAction.lean | 8 +- .../QuarkDoublet/GaugeAlgebraAction.lean | 8 +- .../UpSinglet/GaugeAlgebraAction.lean | 8 +- .../HiggsBoson/GaugeAlgebraAction.lean | 8 +- .../JetAlgebra/CovJetAlgebra/Basic.lean | 2 +- .../StandardModel/JetAlgebra/Invariants.lean | 28 +-- .../StandardModel/JetAlgebra/Realization.lean | 2 +- .../JetAlgebra/TransformsIn.lean | 12 +- .../Matter/BosonicAlgebra/TransformsIn.lean | 13 +- .../Matter/FermionicAlgebra/TransformsIn.lean | 13 +- Physlib/Relativity/IsLorentzDeriv.lean | 2 +- 32 files changed, 767 insertions(+), 839 deletions(-) create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/GaugeField.lean rename Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/{IsGaugeField.lean => GaugeLaw.lean} (80%) delete mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Invariants.lean diff --git a/Physlib.lean b/Physlib.lean index c7aa13f8d..0ea97e642 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -2,12 +2,13 @@ module public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.FieldStrength -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.Invariants -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.IsGaugeField +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.GaugeLaw +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.Symmetrized public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.Symmetrized public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.TransformsInAdjoint public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.GaugeAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.GaugeField public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.JetDeriv public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.LorentzAction public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.MassDim diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/GaugeAction.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/GaugeAction.lean index 79a21b3c3..009fdc273 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/GaugeAction.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/GaugeAction.lean @@ -6,7 +6,9 @@ Authors: Joseph Tooby-Smith module public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.JetDeriv -public import Physlib.ClassicalFieldTheory.GaugeTheory.Matter.CovariantDeriv +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.AdjointCoeff +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.MaurerCartan +public import Physlib.Relativity.IsLorentzDeriv public import Physlib.Mathematics.MultisetAntidiagonal /-! @@ -34,7 +36,7 @@ gives the cocycle identity for the Maurer–Cartan shift. - `GaugeJetAlgebra.mcShift` : the Maurer–Cartan shift. - `GaugeJetAlgebra.repJet` : the action of the jet gauge group on the jet algebra. - `GaugeJetAlgebra.repJet_iteratedJetDeriv_ofA` : the transformation law of the derivative - generators, in the form used by `IsGaugeField`. + generators, in the form used by `GaugeAlgebraRealization`. - `GaugeJetAlgebra.complexRepJet` : the action on the complexified jet algebra. ## iii. Table of contents @@ -490,7 +492,7 @@ lemma componentDual_dualBasis_mcBosonCoeff (W : G) (jets.maurerCartan 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 + `GaugeAlgebraRealization`: 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) @@ -569,7 +571,7 @@ lemma one_tmul_algebraMap (r : ℝ) : (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. -/ + form consumed by the laws of a `GaugeAlgebraRealization`. -/ theorem complexRepJet_iteratedD_one_tmul_ofA (U : G) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : complexRepJet jets U (Lorentz.iteratedD (complexJetDeriv 𝔤) complexJetDeriv_comm s diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/GaugeField.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/GaugeField.lean new file mode 100644 index 000000000..1a21ba63a --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/GaugeField.lean @@ -0,0 +1,94 @@ +/- +Copyright (c) 2026 Joseph Tooby-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.GaugeJetAlgebra.LorentzAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.GaugeAction +public import Physlib.Relativity.SL2C.Basic +/-! +# The gauge-field symbols of the jet algebra and their laws + +## i. Overview + +The derivative symbols `∂_s A_μ^φ` of the complexified gauge-boson jet algebra, packaged as +a family over the derivative multiset, the spacetime index and the dual of the gauge +algebra, `GaugeJetAlgebra.gaugeField`, and the two transformation laws they satisfy: the +Lorentz law, in which the symbol carries one covector index and each derivative slot +transforms as a covector, and the gauge law, in which a jet acts by the Leibniz convolution +of its adjoint Taylor coefficients plus the Maurer–Cartan shift. These are the laws that a +realization of the jet algebra in another algebra inherits. + +## ii. Key results + +- `GaugeJetAlgebra.gaugeField` : the gauge-field symbols of the jet algebra. +- `GaugeJetAlgebra.repLorentz_gaugeField` : the Lorentz law. +- `GaugeJetAlgebra.repJet_gaugeField` : the gauge law. + +-/ + +@[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 {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} + +open TensorProduct Matrix MatrixGroups Lorentz + +namespace GaugeJetAlgebra + +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 + +/-- The Lorentz law of the jet algebra: the symbol `∂_s A_μ^φ` carries one covector index, + and each derivative slot transforms as a covector, by `IsLorentzDeriv`. -/ +lemma repLorentz_gaugeField (Λ : SL(2,ℂ)) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + (complexRepLorentzGroup 𝔤) Λ (gaugeField 𝔤 (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 μ : ℝ) : ℂ) • + gaugeField 𝔤 (List.ofFn p) a φ := 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 + +variable (jets) in +/-- The gauge law of the jet algebra: a jet `U` acts on `∂_s A_μ^φ` by the Leibniz + convolution of the dual adjoint Taylor coefficients of `U⁻¹` against lower symbols, plus + the base-point value of the `s`-th derivative of the Maurer–Cartan form of `U⁻¹`. -/ +lemma repJet_gaugeField (U : G) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ 𝔤) : + complexRepJet jets U (gaugeField 𝔤 s μ φ) = + (s.antidiagonal.map fun p => gaugeField 𝔤 p.2 μ (jets.adjointDualCoeff U⁻¹ p.1 φ)).sum + + algebraMap ℂ (ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤) + (φ (jets.evalLie (jets.iteratedDeriv s (jets.maurerCartan U⁻¹ μ)))) := + complexRepJet_iteratedD_one_tmul_ofA U s μ φ + +end GaugeJetAlgebra diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Basic.lean index b27e17928..64043c42a 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Basic.lean @@ -5,9 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.LorentzAction -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.GaugeAction -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.Symmetrized +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.GaugeField /-! # Realizations of the gauge-boson jet algebra @@ -19,34 +17,52 @@ of the jet gauge group and of the Lorentz group. That is the structure `GaugeAlgebraRealization`: an algebra map `ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤 →ₐ[ℂ] B` equivariant for the two groups, together with the demands that both groups act on the whole of `B` by algebra endomorphisms. It is the gauge-boson part of the Standard Model's -`AlgebraRealization`, for any local-gauge-data package `jets`. +`AlgebraRealization`, for any local-gauge-data package `jets`, and every result about a +gauge field in an algebra of local expressions is stated for a realization `h`. The gauge-field symbols of a realization are the jet algebra's own symbols pushed along the map, `GaugeAlgebraRealization.A`, and their transformation laws are the jet algebra's -own laws pushed along it, `GaugeAlgebraRealization.isGaugeField`. The base case is the jet -algebra realized in itself: its symbols satisfy the laws `IsGaugeField` because the Lorentz -law is that of a Lorentz derivative and the gauge law is the substitution action of the jet -gauge group constructed in `GaugeJetAlgebra.GaugeAction`. +own laws pushed along it. The base case is the jet algebra realized in itself, +`GaugeAlgebraRealization.id`: its Lorentz law is that of a Lorentz derivative, and its gauge +law is the substitution action of the jet gauge group constructed in +`GaugeJetAlgebra.GaugeAction`. -Everything the theory of the laws derives, the covariant derivative, the field strength and -the classification of invariants, then applies to every realization through its predicate -`IsGaugeField`, which is the form of the laws the theorems consume; the classification for -a realization is in `Invariants.lean`. +## ii. The physics -## ii. Key results +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_μ + maurerCartan(g)_μ`, + +where `maurerCartan(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 maurerCartan(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 is a representation of the +jet group `G` and not merely of its value group `G₀`. + +In the formalization, `h.A s μ φ` is the symbol `∂_s A_μ^a` contracted with a dual adjoint +vector `φ`; `∂_x (Ad_{g⁻¹})^a_b|` acting on the dual index is `jets.adjointDualCoeff g⁻¹ x φ`; +the sum `∑_{x+y=s} C(x,y)` is the sum over `s.antidiagonal`, in which a splitting `(x, y)` +occurs with multiplicity exactly `C(x,y)`; and `(∂_s maurerCartan(g⁻¹)_μ)|` is +`jets.evalLie (jets.iteratedDeriv s (jets.maurerCartan g⁻¹ μ))`, paired with `φ` and +embedded in `B` as a scalar. This is the law `GaugeAlgebraRealization.gauge_apply_deriv`; +the Lorentz law `GaugeAlgebraRealization.lorentz_apply` says that the symbol carries one +covector index and that each derivative slot transforms as a covector. + +## iii. Key results -- `GaugeJetAlgebra.gaugeField` : the gauge-field symbols of the jet algebra. -- `GaugeJetAlgebra.isGaugeField` : the jet algebra is a gauge field. - `GaugeAlgebraRealization` : an algebra carrying the gauge bosons, as an equivariant algebra map out of the jet algebra. - `GaugeAlgebraRealization.id` : the jet algebra realized in itself. -- `GaugeAlgebraRealization.A`, `GaugeAlgebraRealization.isGaugeField` : the gauge-field - symbols of a realization and their laws. - -## iii. Table of contents - -- A. The gauge-field structure of the jet algebra -- B. Realizations +- `GaugeAlgebraRealization.A` : the gauge-field symbols of a realization, images of the jet + algebra's symbols, with the laws `lorentz_apply`, `gauge_apply_deriv` and `gauge_mul`. -/ @@ -58,91 +74,27 @@ variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] variable {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] variable {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} -set_option maxHeartbeats 1000000 - - -namespace GaugeJetAlgebra - -open TensorProduct Matrix MatrixGroups - -/-! - -## A. The gauge-field structure of the jet algebra - --/ - -/-! - -### 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 laws - --/ - -variable (jets) in -/-- 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 jets (complexRepLorentzGroup 𝔤) (complexRepJet jets) (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 - -/-! - -## B. Realizations - --/ - -open TensorProduct Matrix MatrixGroups +open TensorProduct Matrix MatrixGroups Lorentz /-- An algebra `B` carrying the gauge bosons of the package `jets`: an algebra map out of the complexified gauge-boson jet algebra, equivariant for the jet gauge group and the Lorentz group, with both groups acting on the whole of `B` by algebra endomorphisms. The gauge-field symbols of `B` are the images of the jet algebra's symbols, - `GaugeAlgebraRealization.A`, and they satisfy the laws `IsGaugeField` by transport. -/ + `GaugeAlgebraRealization.A`, and they satisfy the jet algebra's laws by transport. -/ structure GaugeAlgebraRealization (jets : LocalGaugeData G 𝔤 G₀ 𝔤J) (B : Type) [Ring B] [Algebra ℂ B] (repJet : Representation ℂ G B) (repLorentz : Representation ℂ SL(2,ℂ) B) where /-- The algebra map out of the gauge-boson jet algebra: it places the gauge-boson symbols, and every polynomial expression in them, inside `B`. -/ toAlgHom : ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤 →ₐ[ℂ] B + /-- The gauge-field symbols `∂_s A_μ^φ` of `B`. They are determined by the map, as the + images of the jet algebra's symbols (`A_eq`), and are recorded as data so that the + theory can treat them as opaque symbols and a concrete realization can present the + symbols it already has. -/ + A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B + /-- The symbols are the images of the jet algebra's symbols. -/ + A_eq : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), + A s μ φ = toAlgHom (GaugeJetAlgebra.gaugeField 𝔤 s μ φ) /-- The map is equivariant for the jet gauge group. -/ map_repJet : ∀ (U : G) (x : ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤), toAlgHom (GaugeJetAlgebra.complexRepJet jets U x) = repJet U (toAlgHom x) @@ -167,6 +119,8 @@ variable (jets) in noncomputable def id : GaugeAlgebraRealization jets (ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤) (complexRepJet jets) (complexRepLorentzGroup 𝔤) where toAlgHom := AlgHom.id ℂ _ + A := gaugeField 𝔤 + A_eq _ _ _ := rfl map_repJet _ _ := rfl map_repLorentz _ _ := rfl repJet_mul := complexRepJet_apply_mul @@ -174,39 +128,57 @@ noncomputable def id : GaugeAlgebraRealization jets (ℂ ⊗[ℝ] GaugeJetAlgebr variable (h : GaugeAlgebraRealization jets B repJet repLorentz) -/-- The gauge-field symbols `∂_s A_μ^φ` of a realization: the jet algebra's symbols pushed - along the map. -/ -noncomputable def A (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : - Module.Dual ℝ 𝔤 →ₗ[ℝ] B := - h.toAlgHom.toLinearMap.restrictScalars ℝ ∘ₗ gaugeField 𝔤 s μ +lemma A_apply (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + h.A s μ φ = h.toAlgHom (gaugeField 𝔤 s μ φ) := + h.A_eq s μ φ @[simp] -lemma A_apply (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : - h.A s μ φ = h.toAlgHom (gaugeField 𝔤 s μ φ) := rfl +lemma id_A : (GaugeAlgebraRealization.id jets).A = gaugeField 𝔤 := rfl /-- The gauge-field symbols of a realization commute, being images of a commutative algebra. -/ lemma commute_A (p q : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) - (φ ψ : Module.Dual ℝ 𝔤) : Commute (h.A p μ φ) (h.A q ν ψ) := - (Commute.all _ _).map h.toAlgHom - -/-- The gauge-field laws of a realization, obtained from the laws of the jet algebra by - pushing them along the defining algebra map. -/ -theorem isGaugeField : IsGaugeField jets repLorentz repJet h.A where - lorentz_apply Λ n l μ φ := by - have key := congrArg h.toAlgHom ((GaugeJetAlgebra.isGaugeField jets).lorentz_apply Λ n l μ φ) - rw [h.map_repLorentz] at key - refine key.trans ?_ - rw [map_sum] - refine Finset.sum_congr rfl fun p _ => ?_ - rw [map_smul, map_sum] - exact congrArg _ (Finset.sum_congr rfl fun a _ => map_smul h.toAlgHom _ _) - gauge_apply_deriv U s μ φ := by - have key := congrArg h.toAlgHom ((GaugeJetAlgebra.isGaugeField jets).gauge_apply_deriv U s μ φ) - rw [h.map_repJet] at key - refine key.trans ?_ - rw [map_add, map_multiset_sum, Multiset.map_map, AlgHom.commutes] - rfl - gauge_mul := h.repJet_mul + (φ ψ : Module.Dual ℝ 𝔤) : Commute (h.A p μ φ) (h.A q ν ψ) := by + rw [A_apply, A_apply] + exact (Commute.all _ _).map h.toAlgHom + +/-- The Lorentz law: the gauge-field symbol carries one covector index, and each derivative + slot transforms as a covector. -/ +lemma lorentz_apply (Λ : SL(2,ℂ)) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ 𝔤) : + repLorentz Λ (h.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 μ : ℝ) : ℂ) • h.A (List.ofFn p) a φ := by + have key := congrArg h.toAlgHom (repLorentz_gaugeField (𝔤 := 𝔤) Λ l μ φ) + rw [h.map_repLorentz] at key + simp only [A_apply] + refine key.trans ?_ + rw [map_sum] + refine Finset.sum_congr rfl fun p _ => ?_ + rw [map_smul, map_sum] + exact congrArg _ (Finset.sum_congr rfl fun a _ => map_smul h.toAlgHom _ _) + +/-- The gauge law: a jet `U` acts on the derivative symbol `∂_s A_μ^φ` by the Leibniz + convolution of the dual adjoint Taylor coefficients of `U⁻¹` against lower symbols (the + multiset antidiagonal carrying the multinomial coefficients), plus the base-point value of + the `s`-th derivative of the Maurer–Cartan form of `U⁻¹`. -/ +lemma gauge_apply_deriv (U : G) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ 𝔤) : + repJet U (h.A s μ φ) = + (s.antidiagonal.map fun p => h.A p.2 μ (jets.adjointDualCoeff U⁻¹ p.1 φ)).sum + + algebraMap ℂ B (φ (jets.evalLie (jets.iteratedDeriv s (jets.maurerCartan U⁻¹ μ)))) := by + have key := congrArg h.toAlgHom (repJet_gaugeField jets U s μ φ) + rw [h.map_repJet] at key + simp only [A_apply] + refine key.trans ?_ + rw [map_add, map_multiset_sum, Multiset.map_map, AlgHom.commutes] + rfl + +include h in +/-- The gauge action preserves products: gauge transformations act on the algebra of local + expressions as algebra homomorphisms. -/ +lemma gauge_mul (U : G) (b₁ b₂ : B) : repJet U (b₁ * b₂) = repJet U b₁ * repJet U b₂ := + h.repJet_mul U b₁ b₂ end GaugeAlgebraRealization diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/FieldStrength.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/FieldStrength.lean index 968e5a6a8..a5608424e 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/FieldStrength.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/FieldStrength.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.IsGaugeField +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.GaugeLaw public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.TransformsInAdjoint public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.MaurerCartan /-! @@ -40,11 +40,12 @@ variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] variable {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] variable {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} -namespace IsGaugeField +namespace GaugeAlgebraRealization 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} +variable (h : GaugeAlgebraRealization jets B repGauge repLorentz) /-- 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 @@ -150,58 +151,58 @@ lemma fieldStrength_swap 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 jets repLorentz repGauge A) +theorem repGauge_fieldStrength (U : G) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : - repGauge U (fieldStrength A μ ν s φ) = + repGauge U (fieldStrength h.A μ ν s φ) = (s.antidiagonal.map fun p => - fieldStrength A μ ν p.2 (jets.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 + fieldStrength h.A μ ν p.2 (jets.adjointDualCoeff U⁻¹ p.1 φ)).sum := by + have hL : repGauge U (fieldStrength h.A μ ν s φ) = + repGauge U (h.A (μ ::ₘ s) ν φ) - repGauge U (h.A (ν ::ₘ s) μ φ) + + repGauge U (commutatorFam h.A μ ν s φ) := by rw [fieldStrength_apply, map_add, map_sub] have hR : (s.antidiagonal.map fun p => - fieldStrength A μ ν p.2 (jets.adjointDualCoeff U⁻¹ p.1 φ)).sum = + fieldStrength h.A μ ν p.2 (jets.adjointDualCoeff U⁻¹ p.1 φ)).sum = (s.antidiagonal.map fun p => - A (μ ::ₘ p.2) ν (jets.adjointDualCoeff U⁻¹ p.1 φ)).sum + h.A (μ ::ₘ p.2) ν (jets.adjointDualCoeff U⁻¹ p.1 φ)).sum - (s.antidiagonal.map fun p => - A (ν ::ₘ p.2) μ (jets.adjointDualCoeff U⁻¹ p.1 φ)).sum + h.A (ν ::ₘ p.2) μ (jets.adjointDualCoeff U⁻¹ p.1 φ)).sum + (s.antidiagonal.map fun p => - commutatorFam A μ ν p.2 (jets.adjointDualCoeff U⁻¹ p.1 φ)).sum := by + commutatorFam h.A μ ν p.2 (jets.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 ν (jets.adjointDualCoeff U⁻¹ q.2 + h.A p.2 ν (jets.adjointDualCoeff U⁻¹ q.2 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie (jets.iteratedDeriv q.1 (jets.maurerCartan U⁻¹ μ)))))).sum).sum = (s.antidiagonal.map fun p => (p.2.antidiagonal.map fun r => - A r.2 ν (jets.adjointDualCoeff U⁻¹ r.1 + h.A r.2 ν (jets.adjointDualCoeff U⁻¹ r.1 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie (jets.iteratedDeriv p.1 (jets.maurerCartan U⁻¹ μ)))))).sum).sum := Multiset.sum_antidiagonal_assoc s (fun a b c => - A c ν (jets.adjointDualCoeff U⁻¹ b + h.A c ν (jets.adjointDualCoeff U⁻¹ b (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie (jets.iteratedDeriv a (jets.maurerCartan U⁻¹ μ)))))) have hcancel₂ : (s.antidiagonal.map fun p => (p.1.antidiagonal.map fun q => - A p.2 μ (jets.adjointDualCoeff U⁻¹ q.2 + h.A p.2 μ (jets.adjointDualCoeff U⁻¹ q.2 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie (jets.iteratedDeriv q.1 (jets.maurerCartan U⁻¹ ν)))))).sum).sum = (s.antidiagonal.map fun p => (p.1.antidiagonal.map fun q => - A q.2 μ (jets.adjointDualCoeff U⁻¹ q.1 + h.A q.2 μ (jets.adjointDualCoeff U⁻¹ q.1 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie (jets.iteratedDeriv p.2 (jets.maurerCartan U⁻¹ ν)))))).sum).sum := by refine (Multiset.sum_antidiagonal_assoc s (fun a b c => - A c μ (jets.adjointDualCoeff U⁻¹ b + h.A c μ (jets.adjointDualCoeff U⁻¹ b (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie (jets.iteratedDeriv a (jets.maurerCartan U⁻¹ ν))))))).trans ?_ exact Multiset.sum_antidiagonal_swap s (fun a b => (b.antidiagonal.map fun q => - A q.2 μ (jets.adjointDualCoeff U⁻¹ q.1 + h.A q.2 μ (jets.adjointDualCoeff U⁻¹ q.1 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie (jets.iteratedDeriv a (jets.maurerCartan U⁻¹ ν)))))).sum) set Θ : 𝔤 →+ B := ((algebraMap ℂ B).toAddMonoidHom.comp @@ -219,8 +220,8 @@ theorem repGauge_fieldStrength (hA : IsGaugeField jets repLorentz repGauge A) rw [jets.evalLie_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] + rw [hL, repGauge_cons_apply h U μ s ν φ, repGauge_cons_apply h U ν s μ φ, + h.repGauge_commutatorFam U s μ ν φ, hR] simp only [hΘ] rw [hconst, hcancel₁, hcancel₂] abel @@ -228,19 +229,19 @@ theorem repGauge_fieldStrength (hA : IsGaugeField jets repLorentz repGauge A) /-- **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 jets repLorentz repGauge A) - (μ ν : Fin 1 ⊕ Fin 3) : TransformsInAdjoint jets repGauge (fieldStrength A μ ν) := - fun U φ s => hA.repGauge_fieldStrength U s μ ν φ +theorem transformsInAdjoint_fieldStrength + (μ ν : Fin 1 ⊕ Fin 3) : TransformsInAdjoint jets repGauge (fieldStrength h.A μ ν) := + fun U φ s => h.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 jets repLorentz repGauge A) +lemma repGauge_fieldStrength_zero (U : G) (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : - repGauge U (fieldStrength A μ ν 0 φ) = - fieldStrength A μ ν 0 (jets.adjointDualCoeff U⁻¹ 0 φ) := by - rw [hA.repGauge_fieldStrength U 0 μ ν φ, Multiset.antidiagonal_zero, + repGauge U (fieldStrength h.A μ ν 0 φ) = + fieldStrength h.A μ ν 0 (jets.adjointDualCoeff U⁻¹ 0 φ) := by + rw [h.repGauge_fieldStrength U 0 μ ν φ, Multiset.antidiagonal_zero, Multiset.map_singleton, Multiset.sum_singleton] -end IsGaugeField +end GaugeAlgebraRealization diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/IsGaugeField.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/GaugeLaw.lean similarity index 80% rename from Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/IsGaugeField.lean rename to Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/GaugeLaw.lean index e94e036f5..438304b4b 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/IsGaugeField.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/GaugeLaw.lean @@ -5,59 +5,38 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.AdjointCoeff -public import Physlib.Mathematics.MultisetAntidiagonal -public import Physlib.Relativity.IsLorentzDeriv +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.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 /-! -# Algebra valued gauge bosons +# The gauge law on brackets and iterated derivatives -This file is stated for a supplied local-gauge-data package `jets : LocalGaugeData G 𝔤 G₀ 𝔤J` -(jets of a gauge group `G₀` with Lie algebra `𝔤`), which every declaration below takes -as an argument; the Standard Model package is `StandardModel.localGaugeData` in -`Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData`. +## i. Overview -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 gauge law of a realization, `GaugeAlgebraRealization.gauge_apply_deriv`, gives the +action of a jet `U` on a single derivative symbol `∂_s A_μ^φ`. This file works out what it +does to the expressions built from the symbols: their brackets, the commutator families +`[A_μ, A_ν]` and the derivatives of those. The tools are the tensor-level bookkeeping +`dualPairEquiv` and `tensorBracket`, which let the adjoint index be contracted with a +bracket of the gauge algebra, and the bracket of component families `bracketFam`, whose +gauge transformation `repGauge_bracketFam` is the convolution of the transformations of the +factors against the adjoint Taylor coefficients. -## The physics +Everything here is stated for a realization `h`; the definitions on families of symbols +(`bracketFam`, `commutatorFam`) take an arbitrary family, so that they also apply to the +covariant families built later. -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 +## ii. Key results - `A_μ ↦ Ad_g A_μ + maurerCartan(g)_μ`, - -where `maurerCartan(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 maurerCartan(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 `jets.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 maurerCartan(g⁻¹)_μ)|` is `JetGaugeAlgebra.eval (iteratedDeriv s (maurerCartanForm g⁻¹ μ))`, - a constant algebra element, paired with `φ` and embedded in `B` as a scalar. +- `GaugeAlgebraRealization.dualPairEquiv`, `GaugeAlgebraRealization.tensorBracket` : the + tensor bookkeeping of the adjoint index. +- `GaugeAlgebraRealization.bracketFam`, `GaugeAlgebraRealization.commutatorFam` : the + bracket of two component families, and the derived commutators `∂_s [A_μ, A_ν]`. +- `GaugeAlgebraRealization.repGauge_bracketFam` : the gauge transformation of a bracket. +- `GaugeAlgebraRealization.repGauge_commutatorFam` : the gauge transformation of the derived + commutators. -/ @@ -74,51 +53,12 @@ variable {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} open Lorentz -variable (jets) in -/-- 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_μ + maurerCartan(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 μ (jets.adjointDualCoeff U⁻¹ p.1 φ))).sum - + algebraMap ℂ B - (φ (jets.evalLie (jets.iteratedDeriv s - (jets.maurerCartan 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 +namespace GaugeAlgebraRealization 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} +variable (h : GaugeAlgebraRealization jets B repGauge repLorentz) /-- The canonical equivalence, through finite-dimensional duality, between algebra-valued fields `B ⊗ 𝔤` and their component families `φ ↦ A^φ`: the element @@ -153,21 +93,21 @@ noncomputable def commutator /-- 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 jets repLorentz repGauge A) (U : G) +lemma repGauge_apply (U : G) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : - repGauge U (A 0 μ φ) = A 0 μ (jets.adjointDualCoeff U⁻¹ ∅ φ) + + repGauge U (h.A 0 μ φ) = h.A 0 μ (jets.adjointDualCoeff U⁻¹ ∅ φ) + algebraMap ℂ B (φ (jets.evalLie (jets.maurerCartan U⁻¹ μ))) := by simpa [show (∅ : Multiset (Fin 1 ⊕ Fin 3)) = 0 from rfl] using - hA.gauge_apply_deriv U 0 μ φ + h.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 jets repLorentz repGauge A) +lemma repGauge_deriv_apply (U : G) (ρ σ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : - repGauge U (A {ρ} σ φ) = - A {ρ} σ (jets.adjointDualCoeff U⁻¹ 0 φ) + A 0 σ (jets.adjointDualCoeff U⁻¹ {ρ} φ) + + repGauge U (h.A {ρ} σ φ) = + h.A {ρ} σ (jets.adjointDualCoeff U⁻¹ 0 φ) + h.A 0 σ (jets.adjointDualCoeff U⁻¹ {ρ} φ) + algebraMap ℂ B (φ (jets.evalLie (jets.deriv ρ (jets.maurerCartan U⁻¹ σ)))) := by have hanti : ({ρ} : Multiset (Fin 1 ⊕ Fin 3)).antidiagonal = @@ -176,7 +116,7 @@ lemma repGauge_deriv_apply (hA : IsGaugeField jets repLorentz repGauge A) rw [show ({ρ} : Multiset (Fin 1 ⊕ Fin 3)) = ρ ::ₘ 0 from rfl, Multiset.antidiagonal_cons, Multiset.antidiagonal_zero] simp - have h := hA.gauge_apply_deriv U {ρ} σ φ + have h := h.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, @@ -313,13 +253,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 jets repLorentz repGauge A) +lemma repGauge_commutator (U : G) (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : - repGauge U (commutator A μ ν φ) = - commutator A μ ν (jets.adjointDualCoeff U⁻¹ 0 φ) - - A 0 μ (jets.adjointDualCoeff U⁻¹ 0 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 + repGauge U (commutator h.A μ ν φ) = + commutator h.A μ ν (jets.adjointDualCoeff U⁻¹ 0 φ) + - h.A 0 μ (jets.adjointDualCoeff U⁻¹ 0 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie (jets.maurerCartan U⁻¹ ν)))) - + A 0 ν (jets.adjointDualCoeff U⁻¹ 0 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 + + h.A 0 ν (jets.adjointDualCoeff U⁻¹ 0 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie (jets.maurerCartan U⁻¹ μ)))) + algebraMap ℂ B (φ ⁅jets.evalLie (jets.maurerCartan U⁻¹ μ), jets.evalLie (jets.maurerCartan U⁻¹ ν)⁆) := by @@ -330,8 +270,8 @@ lemma repGauge_commutator (hA : IsGaugeField jets repLorentz repGauge A) jets.adjoint U⁻¹ ∘ₗ jets.ofConstantLie with hT₀def set cμ : 𝔤 := jets.evalLie (jets.maurerCartan U⁻¹ μ) with hcμ set cν : 𝔤 := jets.evalLie (jets.maurerCartan U⁻¹ ν) with hcν - set s : B ⊗[ℝ] 𝔤 := dualPairEquiv.symm (A 0 μ) with hs - set t : B ⊗[ℝ] 𝔤 := dualPairEquiv.symm (A 0 ν) with ht + set s : B ⊗[ℝ] 𝔤 := dualPairEquiv.symm (h.A 0 μ) with hs + set t : B ⊗[ℝ] 𝔤 := dualPairEquiv.symm (h.A 0 ν) with ht have hcoeff : jets.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 @@ -341,14 +281,14 @@ lemma repGauge_commutator (hA : IsGaugeField jets repLorentz repGauge A) LieHom.map_lie] -- the transformed component families in tensor form have hfam : ∀ (ρ : Fin 1 ⊕ Fin 3), - Φ ∘ₗ A 0 ρ = A 0 ρ ∘ₗ T₀.dualMap + + Φ ∘ₗ h.A 0 ρ = h.A 0 ρ ∘ₗ T₀.dualMap + dualPairEquiv ((1 : B) ⊗ₜ[ℝ] jets.evalLie (jets.maurerCartan 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] + rw [h.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 @@ -359,14 +299,14 @@ lemma repGauge_commutator (hA : IsGaugeField jets repLorentz repGauge A) 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 + have hcomm_pair : dualPairEquiv (tensorBracket s t) = commutator h.A μ ν := by rw [hs, ht]; rfl - have hπs : dualPairEquiv s = A 0 μ := by + have hπs : dualPairEquiv s = h.A 0 μ := by rw [hs]; exact dualPairEquiv.apply_symm_apply _ - have hπt : dualPairEquiv t = A 0 ν := by + have hπt : dualPairEquiv t = h.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₂ + h.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) = @@ -387,7 +327,7 @@ lemma repGauge_commutator (hA : IsGaugeField jets repLorentz repGauge A) 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 [show repGauge U (commutator h.A μ ν φ) = Φ (dualPairEquiv (tensorBracket s t) φ) from by rw [← hcomm_pair, hΦdef]; rfl, hread, hcoeff, hcomm_pair, hπs, hπt] rfl @@ -401,13 +341,13 @@ lemma repGauge_commutator (hA : IsGaugeField jets repLorentz repGauge A) /-- 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 jets repLorentz repGauge A) +lemma repGauge_deriv_deriv_apply (U : G) (ρ σ τ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : - repGauge U (A (ρ ::ₘ {σ}) τ φ) = - A (ρ ::ₘ {σ}) τ (jets.adjointDualCoeff U⁻¹ 0 φ) - + A {ρ} τ (jets.adjointDualCoeff U⁻¹ {σ} φ) - + A {σ} τ (jets.adjointDualCoeff U⁻¹ {ρ} φ) - + A 0 τ (jets.adjointDualCoeff U⁻¹ (ρ ::ₘ {σ}) φ) + repGauge U (h.A (ρ ::ₘ {σ}) τ φ) = + h.A (ρ ::ₘ {σ}) τ (jets.adjointDualCoeff U⁻¹ 0 φ) + + h.A {ρ} τ (jets.adjointDualCoeff U⁻¹ {σ} φ) + + h.A {σ} τ (jets.adjointDualCoeff U⁻¹ {ρ} φ) + + h.A 0 τ (jets.adjointDualCoeff U⁻¹ (ρ ::ₘ {σ}) φ) + algebraMap ℂ B (φ (jets.evalLie (jets.deriv ρ (jets.deriv σ (jets.maurerCartan U⁻¹ τ))))) := by have hanti₁ : ({σ} : Multiset (Fin 1 ⊕ Fin 3)).antidiagonal = @@ -423,7 +363,7 @@ lemma repGauge_deriv_deriv_apply (hA : IsGaugeField jets repLorentz repGauge A) (ρ ::ₘ ({σ} : 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 (ρ ::ₘ {σ}) τ φ + have h := h.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, LocalGaugeData.iteratedDeriv_cons, @@ -583,13 +523,14 @@ lemma bracketFam_dualMap_derivation (T₀ T₁ : 𝔤 →ₗ[ℝ] 𝔤) dualPairEquiv_map_right] rfl +include h in 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 jets repLorentz repGauge A) +lemma repGauge_bracketFam (U : G) {f g f' g' : Module.Dual ℝ 𝔤 →ₗ[ℝ] B} {cf cg : 𝔤} (hf : ∀ ψ : Module.Dual ℝ 𝔤, @@ -604,7 +545,7 @@ lemma repGauge_bracketFam (hA : IsGaugeField jets repLorentz repGauge A) + 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₂ + h.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' @@ -790,28 +731,28 @@ lemma bracketFam_adjointDualCoeff (U : G) (x : Multiset (Fin 1 ⊕ Fin 3)) the Leibniz splittings where `κ` stays a derivative, minus (by `LocalGaugeData.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 jets repLorentz repGauge A) +lemma repGauge_cons_apply (U : G) (κ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (τ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : - repGauge U (A (κ ::ₘ s) τ φ) = + repGauge U (h.A (κ ::ₘ s) τ φ) = (s.antidiagonal.map fun p => - A (κ ::ₘ p.2) τ (jets.adjointDualCoeff U⁻¹ p.1 φ)).sum + h.A (κ ::ₘ p.2) τ (jets.adjointDualCoeff U⁻¹ p.1 φ)).sum - (s.antidiagonal.map fun p => (p.1.antidiagonal.map fun q => - A p.2 τ (jets.adjointDualCoeff U⁻¹ q.2 + h.A p.2 τ (jets.adjointDualCoeff U⁻¹ q.2 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie (jets.iteratedDeriv q.1 (jets.maurerCartan U⁻¹ κ)))))).sum).sum + algebraMap ℂ B (φ (jets.evalLie (jets.iteratedDeriv (κ ::ₘ s) (jets.maurerCartan U⁻¹ τ)))) := by - rw [hA.gauge_apply_deriv U (κ ::ₘ s) τ φ] + rw [h.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 τ (jets.adjointDualCoeff U⁻¹ (κ ::ₘ p.1) φ)) s.antidiagonal).sum = + h.A p.2 τ (jets.adjointDualCoeff U⁻¹ (κ ::ₘ p.1) φ)) s.antidiagonal).sum = -(s.antidiagonal.map fun p => (p.1.antidiagonal.map fun q => - A p.2 τ (jets.adjointDualCoeff U⁻¹ q.2 + h.A p.2 τ (jets.adjointDualCoeff U⁻¹ q.2 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie (jets.iteratedDeriv q.1 (jets.maurerCartan U⁻¹ κ)))))).sum).sum := by rw [← Multiset.sum_map_neg''] @@ -826,20 +767,20 @@ 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_commutatorFam (hA : IsGaugeField jets repLorentz repGauge A) +lemma repGauge_commutatorFam (U : G) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : - repGauge U (commutatorFam A μ ν s φ) = + repGauge U (commutatorFam h.A μ ν s φ) = (s.antidiagonal.map fun p => - commutatorFam A μ ν p.2 (jets.adjointDualCoeff U⁻¹ p.1 φ)).sum + commutatorFam h.A μ ν p.2 (jets.adjointDualCoeff U⁻¹ p.1 φ)).sum + (s.antidiagonal.map fun p => (p.2.antidiagonal.map fun r => - A r.2 ν (jets.adjointDualCoeff U⁻¹ r.1 + h.A r.2 ν (jets.adjointDualCoeff U⁻¹ r.1 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie (jets.iteratedDeriv p.1 (jets.maurerCartan U⁻¹ μ)))))).sum).sum - (s.antidiagonal.map fun p => (p.1.antidiagonal.map fun q => - A q.2 μ (jets.adjointDualCoeff U⁻¹ q.1 + h.A q.2 μ (jets.adjointDualCoeff U⁻¹ q.1 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie (jets.iteratedDeriv p.2 (jets.maurerCartan U⁻¹ ν)))))).sum).sum + (s.antidiagonal.map fun p => @@ -850,22 +791,22 @@ lemma repGauge_commutatorFam (hA : IsGaugeField jets repLorentz repGauge A) -- 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 τ ∘ₗ jets.adjointDualCoeff U⁻¹ q.1).sum) ψ + repGauge U (h.A u τ ψ) = + ((u.antidiagonal.map fun q => h.A q.2 τ ∘ₗ jets.adjointDualCoeff U⁻¹ q.1).sum) ψ + algebraMap ℂ B (ψ (jets.evalLie (jets.iteratedDeriv u (jets.maurerCartan U⁻¹ τ)))) := by intro τ u ψ - rw [hA.gauge_apply_deriv U u τ ψ, Multiset.sum_linearMap_apply, Multiset.map_map] + rw [h.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 μ ∘ₗ jets.adjointDualCoeff U⁻¹ q.1).sum) - ((p.2.antidiagonal.map fun r => A r.2 ν ∘ₗ jets.adjointDualCoeff U⁻¹ r.1).sum) φ).sum = + bracketFam ((p.1.antidiagonal.map fun q => h.A q.2 μ ∘ₗ jets.adjointDualCoeff U⁻¹ q.1).sum) + ((p.2.antidiagonal.map fun r => h.A r.2 ν ∘ₗ jets.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 μ ∘ₗ jets.adjointDualCoeff U⁻¹ q.1) - (A r.2 ν ∘ₗ jets.adjointDualCoeff U⁻¹ r.1) φ).sum).sum).sum := by + bracketFam (h.A q.2 μ ∘ₗ jets.adjointDualCoeff U⁻¹ q.1) + (h.A r.2 ν ∘ₗ jets.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] @@ -876,28 +817,28 @@ lemma repGauge_commutatorFam (hA : IsGaugeField jets repLorentz repGauge A) 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 (jets.adjointDualCoeff U⁻¹ p.1 φ)).sum = + commutatorFam h.A μ ν p.2 (jets.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 μ ∘ₗ jets.adjointDualCoeff U⁻¹ q.1) - (A r.2 ν ∘ₗ jets.adjointDualCoeff U⁻¹ q.2) φ).sum).sum).sum := by + bracketFam (h.A r.1 μ ∘ₗ jets.adjointDualCoeff U⁻¹ q.1) + (h.A r.2 ν ∘ₗ jets.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 ν) φ]), + bracketFam_adjointDualCoeff U⁻¹ p.1 (h.A r.1 μ) (h.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 μ ∘ₗ jets.adjointDualCoeff U⁻¹ a) - (A d ν ∘ₗ jets.adjointDualCoeff U⁻¹ c) φ).trans hMc.symm) + bracketFam (h.A b μ ∘ₗ jets.adjointDualCoeff U⁻¹ a) + (h.A d ν ∘ₗ jets.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 ν ∘ₗ jets.adjointDualCoeff U⁻¹ r.1).sum) + ((p.2.antidiagonal.map fun r => h.A r.2 ν ∘ₗ jets.adjointDualCoeff U⁻¹ r.1).sum) (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie (jets.iteratedDeriv p.1 (jets.maurerCartan U⁻¹ μ)))) = (p.2.antidiagonal.map fun r => - A r.2 ν (jets.adjointDualCoeff U⁻¹ r.1 + h.A r.2 ν (jets.adjointDualCoeff U⁻¹ r.1 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie (jets.iteratedDeriv p.1 (jets.maurerCartan U⁻¹ μ)))))).sum := by intro p @@ -905,11 +846,11 @@ lemma repGauge_commutatorFam (hA : IsGaugeField jets repLorentz repGauge A) 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 μ ∘ₗ jets.adjointDualCoeff U⁻¹ q.1).sum) + ((p.1.antidiagonal.map fun q => h.A q.2 μ ∘ₗ jets.adjointDualCoeff U⁻¹ q.1).sum) (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie (jets.iteratedDeriv p.2 (jets.maurerCartan U⁻¹ ν)))) = (p.1.antidiagonal.map fun q => - A q.2 μ (jets.adjointDualCoeff U⁻¹ q.1 + h.A q.2 μ (jets.adjointDualCoeff U⁻¹ q.1 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie (jets.iteratedDeriv p.2 (jets.maurerCartan U⁻¹ ν)))))).sum := by intro p @@ -921,8 +862,8 @@ lemma repGauge_commutatorFam (hA : IsGaugeField jets repLorentz repGauge A) 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]), + h.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 +end GaugeAlgebraRealization diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Invariants.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Invariants.lean deleted file mode 100644 index c79892ef5..000000000 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Invariants.lean +++ /dev/null @@ -1,106 +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.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.Basic -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.Symmetrized -/-! -# The gauge invariants of a realization - -## i. Overview - -For a free package, the classification of invariants of -`Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.Symmetrized` -applies to every realization of the gauge-boson jet algebra: a gauge invariant of the -subalgebra generated by the gauge-field symbols and a 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`. The commutation hypotheses on the gauge-field symbols are automatic for a realization, -since the symbols are images of a commutative algebra; only the commutation of `S` with the -symbols remains to be supplied. The jet algebra itself is the case of the identity -realization. - -## ii. Key results - -- `GaugeAlgebraRealization.invariant_mem_adjoin_fieldStrength` : the classification of - invariants for a realization. -- `GaugeJetAlgebra.invariant_mem_adjoin_fieldStrength` : the classification for the jet - algebra itself. - -## iii. Table of contents - -- A. The classification for a realization -- B. The classification for the jet algebra - --/ - -@[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 {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} - -open TensorProduct Matrix MatrixGroups - -/-! - -## A. The classification for a realization - --/ - -namespace GaugeAlgebraRealization - -variable {B : Type} [Ring B] [Algebra ℂ B] {repJet : Representation ℂ G B} - {repLorentz : Representation ℂ SL(2,ℂ) B} (h : GaugeAlgebraRealization jets B repJet repLorentz) - -/-- The classification of gauge invariants of a realization: for a free package, a - gauge-invariant element of the subalgebra generated by the gauge-field symbols and a set - `S` of elements fixed by the pure jets and commuting with the symbols is a polynomial in - the covariant derivatives of the field strength and the elements of `S`. -/ -theorem invariant_mem_adjoin_fieldStrength [jets.Free] (S : Set B) - (hcS : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), - ∀ y ∈ S, Commute y (h.A p μ φ)) - (hS : ∀ y ∈ S, ∀ U : jets.truncationKer 0, repJet U.1 y = y) - {x : B} (hx : x ∈ Algebra.adjoin ℂ (IsGaugeField.symbols h.A ∪ S)) - (hinv : ∀ U : G, repJet U x = x) : - x ∈ Algebra.adjoin ℂ (IsGaugeField.tower h.A ∪ S) := - IsGaugeField.invariant_mem_adjoin_fieldStrength h.isGaugeField h.commute_A S hcS hS hx hinv - -end GaugeAlgebraRealization - -/-! - -## B. The classification for the jet algebra - --/ - -namespace GaugeJetAlgebra - -variable (jets) in -/-- The classification of gauge invariants of the gauge-boson jet algebra: for a free - package, 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 [jets.Free] (S : Set (ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤)) - (hS : ∀ y ∈ S, ∀ U : jets.truncationKer 0, complexRepJet jets U.1 y = y) - {x : ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤} - (hx : x ∈ Algebra.adjoin ℂ ({b : ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤 | - ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), - b = gaugeField 𝔤 p μ φ} ∪ S)) - (hinv : ∀ U : G, complexRepJet jets U x = x) : - x ∈ Algebra.adjoin ℂ ({b : ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤 | - ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), - b = IsGaugeField.iteratedCovDerivAdjoint (gaugeField 𝔤) l - (IsGaugeField.fieldStrength (gaugeField 𝔤) ν lam) 0 φ} ∪ S) := - IsGaugeField.invariant_mem_adjoin_fieldStrength (isGaugeField jets) - (fun _ _ _ _ _ _ => Commute.all _ _) - S (fun _ _ _ _ _ => Commute.all _ _) hS hx hinv - -end GaugeJetAlgebra diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Symmetrized.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Symmetrized.lean index bfe4f4dcc..78b2eb06e 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Symmetrized.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Symmetrized.lean @@ -43,16 +43,18 @@ symbols commute with each other and with the further generators. ## ii. Key results -- `IsGaugeField.symmetrizedDeriv` : the symmetrized derivative symbols. -- `IsGaugeField.iteratedCovDerivAdjoint` : the iterated covariant derivative of an adjoint - family along a list of directions. -- `IsGaugeField.symbolsLE`, `IsGaugeField.symSymbolsLE`, `IsGaugeField.towerLT` : the - generating sets of the three towers, filtered by order. -- `IsGaugeField.symbolAdjoin_eq_symFieldAdjoin` : the generation theorem. -- `IsGaugeField.repGauge_symmetrizedDeriv` : the gauge action on the symmetrized symbols. -- `IsGaugeField.repGauge_symmetrizedDeriv_translation` : deep jets act by pure translations. -- `IsGaugeField.mem_of_translationInvariant` : the ring-theoretic extraction principle. -- `IsGaugeField.invariant_mem_adjoin_fieldStrength` : the classification of invariants. +- `GaugeAlgebraRealization.symmetrizedDeriv` : the symmetrized derivative symbols. +- `GaugeAlgebraRealization.iteratedCovDerivAdjoint` : the iterated covariant derivative of + an adjoint family along a list of directions. +- `GaugeAlgebraRealization.symbolsLE`, `GaugeAlgebraRealization.symSymbolsLE`, + `GaugeAlgebraRealization.towerLT` : the generating sets of the three towers, filtered by + order. +- `GaugeAlgebraRealization.symbolAdjoin_eq_symFieldAdjoin` : the generation theorem. +- `GaugeAlgebraRealization.repGauge_symmetrizedDeriv` : the gauge action on the symmetrized symbols. +- `GaugeAlgebraRealization.repGauge_symmetrizedDeriv_translation` : deep jets act by pure + translations. +- `GaugeAlgebraRealization.mem_of_translationInvariant` : the ring-theoretic extraction principle. +- `GaugeAlgebraRealization.invariant_mem_adjoin_fieldStrength` : the classification of invariants. ## iii. Table of contents @@ -63,6 +65,7 @@ symbols commute with each other and with the further generators. - E. Centrality, and invariance under the pure jets - F. Translation invariance in a ring - G. The classification of invariants +- H. The classification for the jet algebra itself -/ @@ -77,11 +80,12 @@ variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] variable {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] variable {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} -namespace IsGaugeField +namespace GaugeAlgebraRealization 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} +variable (h : GaugeAlgebraRealization jets B repGauge repLorentz) /-! @@ -481,21 +485,21 @@ lemma exists_le_of_mem_adjoin_symbols_union (S : Set B) {x : B} Maurer–Cartan shifts average to exactly the base-point value of the symmetrized Maurer–Cartan form of `U⁻¹`: - `U • sym(∂_s A)^φ = (1/|s|) ∑_{μ ∈ s} ∑_{x+y=s−μ} ∂_y A_μ^{∂_x Ad*(U⁻¹) φ}` + `U • sym(∂_s h.A)^φ = (1/|s|) ∑_{μ ∈ s} ∑_{x+y=s−μ} ∂_y A_μ^{∂_x Ad*(U⁻¹) φ}` ` + φ( sym(ω(U⁻¹))_s |₀ )`. -/ -lemma repGauge_symmetrizedDeriv (hA : IsGaugeField jets repLorentz repGauge A) +lemma repGauge_symmetrizedDeriv (U : G) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤) : - repGauge U (symmetrizedDeriv s A φ) = + repGauge U (symmetrizedDeriv s h.A φ) = (1/(s.card : ℝ)) • (s.map fun μ => ((s - {μ}).antidiagonal.map fun p => - A p.2 μ (jets.adjointDualCoeff U⁻¹ p.1 φ)).sum).sum + h.A p.2 μ (jets.adjointDualCoeff U⁻¹ p.1 φ)).sum).sum + algebraMap ℂ B (φ (jets.evalLie (jets.symmetrizedMaurerCartanForm U⁻¹ s))) := by set L : 𝔤J →ₗ[ℝ] B := (Algebra.linearMap ℂ B).restrictScalars ℝ ∘ₗ Algebra.linearMap ℝ ℂ ∘ₗ φ ∘ₗ jets.evalLie.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 - {μ}) μ φ), + rw [Multiset.map_congr rfl (fun μ _ => h.gauge_apply_deriv U (s - {μ}) μ φ), Multiset.sum_map_add, smul_add] congr 1 calc (1/(s.card : ℝ)) • (s.map fun μ => algebraMap ℂ B (φ (jets.evalLie @@ -512,17 +516,17 @@ lemma repGauge_symmetrizedDeriv (hA : IsGaugeField jets repLorentz repGauge A) /-- The action of a pure jet on the symmetrized derivatives is through the symmetrized Maurer–Cartan data: for a gauge jet `U` with identity value, the inhomogeneous shift of - `sym(∂_s A)^φ` is the pairing of `φ` with the symmetrized Maurer–Cartan coefficient of + `sym(∂_s h.A)^φ` is the pairing of `φ` with the symmetrized Maurer–Cartan coefficient of `U⁻¹` at `s`, the very data that classifies pure jets. -/ -lemma repGauge_symmetrizedDeriv_truncationKer (hA : IsGaugeField jets repLorentz repGauge A) +lemma repGauge_symmetrizedDeriv_truncationKer (U : jets.truncationKer 0) (s : Multiset (Fin 1 ⊕ Fin 3)) (hs : s ≠ 0) (φ : Module.Dual ℝ 𝔤) : - repGauge U.1 (symmetrizedDeriv s A φ) = + repGauge U.1 (symmetrizedDeriv s h.A φ) = (1/(s.card : ℝ)) • (s.map fun μ => ((s - {μ}).antidiagonal.map fun p => - A p.2 μ (jets.adjointDualCoeff (U.1)⁻¹ p.1 φ)).sum).sum + h.A p.2 μ (jets.adjointDualCoeff (U.1)⁻¹ p.1 φ)).sum).sum + algebraMap ℂ B (φ (jets.symmetrizedMaurerCartanCoeff U⁻¹ ⟨s, hs⟩)) := by - rw [repGauge_symmetrizedDeriv hA U.1 s φ] + rw [repGauge_symmetrizedDeriv h U.1 s φ] rfl /-- The pure jets realize arbitrary translations of the symmetrized derivative @@ -530,32 +534,31 @@ lemma repGauge_symmetrizedDeriv_truncationKer (hA : IsGaugeField jets repLorentz `U` whose action shifts every symmetrized symbol by exactly `φ (c s)`, by the freeness of the symmetrized Maurer–Cartan data. -/ lemma exists_repGauge_symmetrizedDeriv_shift [jets.Free] - (hA : IsGaugeField jets repLorentz repGauge A) (c : {r : Multiset (Fin 1 ⊕ Fin 3) // r ≠ 0} → 𝔤) : ∃ U : jets.truncationKer 0, ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (hs : s ≠ 0) (φ : Module.Dual ℝ 𝔤), - repGauge U.1 (symmetrizedDeriv s A φ) = + repGauge U.1 (symmetrizedDeriv s h.A φ) = (1/(s.card : ℝ)) • (s.map fun μ => ((s - {μ}).antidiagonal.map fun p => - A p.2 μ (jets.adjointDualCoeff (U.1)⁻¹ p.1 φ)).sum).sum + h.A p.2 μ (jets.adjointDualCoeff (U.1)⁻¹ p.1 φ)).sum).sum + algebraMap ℂ B (φ (c ⟨s, hs⟩)) := by obtain ⟨V, hV⟩ := jets.symmetrizedMaurerCartanCoeff_surjective c refine ⟨V⁻¹, fun s hs φ => ?_⟩ - rw [repGauge_symmetrizedDeriv_truncationKer hA V⁻¹ s hs φ, inv_inv, hV] + rw [repGauge_symmetrizedDeriv_truncationKer h V⁻¹ s hs φ, inv_inv, hV] /-- 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 jets repLorentz repGauge A) +theorem repGauge_symmetrizedDeriv_translation (U : jets.truncationKer 0) (s : Multiset (Fin 1 ⊕ Fin 3)) (hs : s ≠ 0) (hU : ∀ x : Multiset (Fin 1 ⊕ Fin 3), x ≠ 0 → x.card < s.card → jets.adjointDualCoeff (U.1)⁻¹ x = 0) (φ : Module.Dual ℝ 𝔤) : - repGauge U.1 (symmetrizedDeriv s A φ) = - symmetrizedDeriv s A φ + + repGauge U.1 (symmetrizedDeriv s h.A φ) = + symmetrizedDeriv s h.A φ + algebraMap ℂ B (φ (jets.symmetrizedMaurerCartanCoeff U⁻¹ ⟨s, hs⟩)) := by - rw [repGauge_symmetrizedDeriv_truncationKer hA U s hs φ] + rw [repGauge_symmetrizedDeriv_truncationKer h U s hs φ] congr 1 have hid : jets.adjointDualCoeff (U.1)⁻¹ 0 = LinearMap.id := jets.adjointDualCoeff_zero_of_eval_eq_one @@ -672,47 +675,48 @@ lemma TransformsInAdjoint.repGauge_eq_of_mem_truncationKer_zero /-- 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 jets repLorentz repGauge A) (l : List (Fin 1 ⊕ Fin 3)) +theorem transformsInAdjoint_iteratedCovDerivAdjoint (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) : - TransformsInAdjoint jets repGauge (iteratedCovDerivAdjoint A l (fieldStrength A ν lam)) := by + TransformsInAdjoint jets repGauge + (iteratedCovDerivAdjoint h.A l (fieldStrength h.A ν lam)) := by induction l with - | nil => exact transformsInAdjoint_fieldStrength hA ν lam - | cons ρ l ih => exact TransformsInAdjoint.covDerivAdjoint hA ih ρ + | nil => exact transformsInAdjoint_fieldStrength h ν lam + | cons ρ l ih => exact TransformsInAdjoint.covDerivAdjoint h ih ρ /-- The covariant derivatives of the field strength are invariant under the pure jets. -/ lemma repGauge_iteratedCovDerivAdjoint_fieldStrength_of_mem_truncationKer_zero - (hA : IsGaugeField jets repLorentz repGauge A) (U : jets.truncationKer 0) + (U : jets.truncationKer 0) (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : - repGauge U.1 (iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ) = - iteratedCovDerivAdjoint A l (fieldStrength A ν lam) 0 φ := - (transformsInAdjoint_iteratedCovDerivAdjoint hA l ν lam).repGauge_eq_of_mem_truncationKer_zero + repGauge U.1 (iteratedCovDerivAdjoint h.A l (fieldStrength h.A ν lam) 0 φ) = + iteratedCovDerivAdjoint h.A l (fieldStrength h.A ν lam) 0 φ := + (transformsInAdjoint_iteratedCovDerivAdjoint h l ν lam).repGauge_eq_of_mem_truncationKer_zero U φ +include h in /-- The gauge action fixes the unit, being multiplicative and invertible. -/ -lemma repGauge_one (hA : IsGaugeField jets repLorentz repGauge A) (U : G) : +lemma repGauge_one (U : G) : repGauge U (1 : B) = 1 := by 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 + have h1 := h.gauge_mul U (repGauge U⁻¹ (1 : B)) 1 rw [mul_one, h2, one_mul] at h1 exact h1.symm /-- The gauge action of a jet as a ring endomorphism of the algebra of local expressions. -/ -def repGaugeRingHom (hA : IsGaugeField jets repLorentz repGauge A) (U : G) : B →+* B where +def repGaugeRingHom (U : G) : B →+* B where toFun := repGauge U - map_one' := repGauge_one hA U - map_mul' := hA.gauge_mul U + map_one' := repGauge_one h U + map_mul' := h.gauge_mul U map_zero' := map_zero _ map_add' := map_add _ @[simp] -lemma repGaugeRingHom_apply (hA : IsGaugeField jets repLorentz repGauge A) (U : G) (x : B) : - repGaugeRingHom hA U x = repGauge U x := rfl +lemma repGaugeRingHom_apply (U : G) (x : B) : + repGaugeRingHom h U x = repGauge U x := rfl /-! @@ -984,12 +988,10 @@ The strategy, by downward induction on the top symmetrized order `m + 1` present section Descent -variable (hA : IsGaugeField jets repLorentz repGauge A) - (hcomm : ∀ (p q : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) - (φ ψ : Module.Dual ℝ 𝔤), Commute (A p μ φ) (A q ν ψ)) +variable (S : Set B) (hcS : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), - ∀ y ∈ S, Commute y (A p μ φ)) + ∀ y ∈ S, Commute y (h.A p μ φ)) (hS : ∀ y ∈ S, ∀ U : jets.truncationKer 0, repGauge U.1 y = y) (m : ℕ) @@ -1003,42 +1005,42 @@ with every symmetrized symbol. -/ -include hA hS in -/-- A pure jet trivial to order `m` fixes every generator of order at most `m`: the +include hS in +/-- h.A pure jet trivial to order `m` fixes every generator of order at most `m`: the symmetrized symbols with at most `m` derivatives, the covariant tower and `S`. -/ lemma repGauge_eq_of_mem_adjoin_symSymbolsLE {U : jets.truncationKer 0} (hU : ∀ x : Multiset (Fin 1 ⊕ Fin 3), x ≠ 0 → x.card ≤ m → jets.adjointDualCoeff (U.1)⁻¹ x = 0) (hUsym : ∀ (r : Multiset (Fin 1 ⊕ Fin 3)) (hr : r ≠ 0), r.card ≤ m → jets.symmetrizedMaurerCartanCoeff U⁻¹ ⟨r, hr⟩ = 0) - {z : B} (hz : z ∈ Algebra.adjoin ℂ (symSymbolsLE A m ∪ (tower A ∪ S))) : + {z : B} (hz : z ∈ Algebra.adjoin ℂ (symSymbolsLE h.A m ∪ (tower h.A ∪ S))) : repGauge U.1 z = z := by induction hz using Algebra.adjoin_induction with | mem b hb => rcases hb with ⟨r, φ, hr0, hrm, rfl⟩ | ⟨l, ν, lam, φ, rfl⟩ | hb' - · rw [repGauge_symmetrizedDeriv_translation hA U r hr0 + · rw [repGauge_symmetrizedDeriv_translation h U r hr0 (fun x hx hxc => hU x hx (by omega)) φ, hUsym r hr0 hrm, map_zero, Complex.ofReal_zero, map_zero, add_zero] · exact repGauge_iteratedCovDerivAdjoint_fieldStrength_of_mem_truncationKer_zero - hA U l ν lam φ + h U l ν lam φ · exact hS b hb' U - | algebraMap c => rw [Algebra.algebraMap_eq_smul_one, map_smul, repGauge_one hA] + | algebraMap c => rw [Algebra.algebraMap_eq_smul_one, map_smul, repGauge_one h] | add a b _ _ iha ihb => rw [map_add, iha, ihb] - | mul a b _ _ iha ihb => rw [hA.gauge_mul, iha, ihb] + | mul a b _ _ iha ihb => rw [h.gauge_mul, iha, ihb] -include hcomm hcS in +include hcS in /-- Every element of the order-`m` subalgebra commutes with every symmetrized symbol. -/ lemma commute_symmetrizedDeriv_of_mem_adjoin_symSymbolsLE - {z : B} (hz : z ∈ Algebra.adjoin ℂ (symSymbolsLE A m ∪ (tower A ∪ S))) + {z : B} (hz : z ∈ Algebra.adjoin ℂ (symSymbolsLE h.A m ∪ (tower h.A ∪ S))) (r : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤) : - Commute z (symmetrizedDeriv r A φ) := by + Commute z (symmetrizedDeriv r h.A φ) := by refine commute_of_mem_adjoin ?_ hz rintro b (⟨r', φ', _, _, rfl⟩ | ⟨l, ν, lam, φ', rfl⟩ | hbS) - · exact commute_symmetrizedDeriv hcomm r' r φ' φ + · exact commute_symmetrizedDeriv h.commute_A r' r φ' φ · refine commute_of_mem_adjoin (fun x hx => ?_) (iteratedCovDerivAdjoint_fieldStrength_mem_adjoin_symbols l ν lam φ') obtain ⟨a, b2, c, rfl⟩ := hx - exact commute_symmetrizedDeriv_right (fun p' μ' φ'' => hcomm a p' b2 μ' c φ'') r φ + exact commute_symmetrizedDeriv_right (fun p' μ' φ'' => h.commute_A a p' b2 μ' c φ'') r φ · exact commute_symmetrizedDeriv_right (fun p' μ' φ' => hcS p' μ' φ' b hbS) r φ /-! @@ -1046,7 +1048,7 @@ lemma commute_symmetrizedDeriv_of_mem_adjoin_symSymbolsLE ### G.2. The top-order coordinates and their translations The symmetrized symbols of order exactly `m + 1` are indexed, in a basis `bv` of the gauge -algebra, by a multiset of `m + 1` directions and a basis index. A real function `t` on that +algebra, by a multiset of `m + 1` directions and a basis index. h.A real function `t` on that index set prescribes a shift family supported at order `m + 1`, hence a pure jet translating each coordinate by the corresponding value of `t`. @@ -1079,19 +1081,19 @@ lemma coord_shiftFamily (t : Sym (Fin 1 ⊕ Fin 3) (m + 1) × ι → ℝ) smul_eq_mul, mul_ite, mul_one, mul_zero, Finset.sum_ite_eq', Finset.mem_univ, if_true] rfl -include hcomm S hcS in +include S hcS in /-- The top-order coordinates commute with the order-`m` subalgebra. -/ lemma commute_topCoord_of_mem_adjoin_symSymbolsLE (p : Sym (Fin 1 ⊕ Fin 3) (m + 1) × ι) - {z : B} (hz : z ∈ Algebra.adjoin ℂ (symSymbolsLE A m ∪ (tower A ∪ S))) : - Commute z (topCoord A m bv p) := - commute_symmetrizedDeriv_of_mem_adjoin_symSymbolsLE hcomm S hcS m hz _ _ + {z : B} (hz : z ∈ Algebra.adjoin ℂ (symSymbolsLE h.A m ∪ (tower h.A ∪ S))) : + Commute z (topCoord h.A m bv p) := + commute_symmetrizedDeriv_of_mem_adjoin_symSymbolsLE h S hcS m hz _ _ /-- An element of the order-`m + 1` subalgebra lies in the sup of the order-`m` subalgebra and the subalgebra generated by the top-order coordinates. -/ lemma mem_sup_adjoin_range_topCoord {z : B} - (hz : z ∈ Algebra.adjoin ℂ (symSymbolsLE A (m + 1) ∪ (tower A ∪ S))) : - z ∈ Algebra.adjoin ℂ (symSymbolsLE A m ∪ (tower A ∪ S)) ⊔ - Algebra.adjoin ℂ (Set.range (topCoord A m bv)) := by + (hz : z ∈ Algebra.adjoin ℂ (symSymbolsLE h.A (m + 1) ∪ (tower h.A ∪ S))) : + z ∈ Algebra.adjoin ℂ (symSymbolsLE h.A m ∪ (tower h.A ∪ S)) ⊔ + Algebra.adjoin ℂ (Set.range (topCoord h.A m bv)) := by refine Algebra.adjoin_le ?_ hz rintro b (⟨r, φ, hr0, hrm1, rfl⟩ | hb) · by_cases hcm : r.card ≤ m @@ -1100,10 +1102,9 @@ lemma mem_sup_adjoin_range_topCoord {z : B} refine Subalgebra.sum_mem _ fun j _ => ?_ rw [← algebraMap_smul ℂ (φ (bv j))] exact Subalgebra.smul_mem _ (SetLike.le_def.mp le_sup_right (Algebra.subset_adjoin - (Set.mem_range_self (f := topCoord A m bv) (⟨r, by omega⟩, j)))) _ + (Set.mem_range_self (f := topCoord h.A m bv) (⟨r, by omega⟩, j)))) _ · exact SetLike.le_def.mp le_sup_left (Algebra.subset_adjoin (Or.inr hb)) -include hA in /-- The pure jet realizing the shift family `t` translates each top-order coordinate by the corresponding value of `t`. -/ lemma repGauge_topCoord {U : jets.truncationKer 0} @@ -1112,12 +1113,12 @@ lemma repGauge_topCoord {U : jets.truncationKer 0} (hU2 : ∀ x : Multiset (Fin 1 ⊕ Fin 3), x ≠ 0 → x.card < m + 1 → jets.adjointDualCoeff (U.1)⁻¹ x = 0) (p : Sym (Fin 1 ⊕ Fin 3) (m + 1) × ι) : - repGauge U.1 (topCoord A m bv p) = topCoord A m bv p + algebraMap ℂ B ((t p : ℝ) : ℂ) := by + repGauge U.1 (topCoord h.A m bv p) = topCoord h.A m bv p + algebraMap ℂ B ((t p : ℝ) : ℂ) := by obtain ⟨ps, j⟩ := p 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 := fun h => by simp [h] at hps - show repGauge U.1 (symmetrizedDeriv (ps : Multiset (Fin 1 ⊕ Fin 3)) A (bv.coord j)) = _ - rw [repGauge_symmetrizedDeriv_translation hA U _ hp0 + show repGauge U.1 (symmetrizedDeriv (ps : Multiset (Fin 1 ⊕ Fin 3)) h.A (bv.coord j)) = _ + rw [repGauge_symmetrizedDeriv_translation h U _ hp0 (fun x hx hxc => hU2 x hx (by omega)) (bv.coord j), hU1, coord_shiftFamily] rfl @@ -1127,28 +1128,28 @@ lemma repGauge_topCoord {U : jets.truncationKer 0} -/ -include hA hcomm hcS hS in +include hcS hS in /-- The descent: an element of the order-`m + 1` subalgebra fixed by all pure jets lies in the order-`m` subalgebra. The pure jets realizing the shift families at order `m + 1` fix the order-`m` subalgebra and translate the top-order coordinates by arbitrary real scalars, so `mem_of_translationInvariant` applies. -/ lemma mem_adjoin_symSymbolsLE_of_repGauge_eq [jets.Free] {z : B} - (hz : z ∈ Algebra.adjoin ℂ (symSymbolsLE A (m + 1) ∪ (tower A ∪ S))) + (hz : z ∈ Algebra.adjoin ℂ (symSymbolsLE h.A (m + 1) ∪ (tower h.A ∪ S))) (hzinv : ∀ U : jets.truncationKer 0, repGauge U.1 z = z) : - z ∈ Algebra.adjoin ℂ (symSymbolsLE A m ∪ (tower A ∪ S)) := by + z ∈ Algebra.adjoin ℂ (symSymbolsLE h.A m ∪ (tower h.A ∪ S)) := by classical set bv := Module.Free.chooseBasis ℝ 𝔤 with hbv choose Ut hUt1 hUt2 using fun t : Sym (Fin 1 ⊕ Fin 3) (m + 1) × Module.Free.ChooseBasisIndex ℝ 𝔤 → ℝ => exists_translation_of_support (jets := jets) (m + 1) (shiftFamily m bv t) (shiftFamily_eq_zero_of_card_ne m bv t) - refine mem_of_translationInvariant _ (topCoord A m bv) - (fun p r hr => commute_topCoord_of_mem_adjoin_symSymbolsLE hcomm S hcS m bv p hr) - (fun p q => commute_symmetrizedDeriv hcomm _ _ _ _) - (fun t => repGaugeRingHom hA (Ut t).1) (fun t w hw => ?_) - (fun t p => repGauge_topCoord hA m bv t (hUt1 t) (hUt2 t) p) - (mem_sup_adjoin_range_topCoord S m bv hz) (fun t => hzinv (Ut t)) - refine repGauge_eq_of_mem_adjoin_symSymbolsLE hA S hS m + refine mem_of_translationInvariant _ (topCoord h.A m bv) + (fun p r hr => commute_topCoord_of_mem_adjoin_symSymbolsLE h S hcS m bv p hr) + (fun p q => commute_symmetrizedDeriv h.commute_A _ _ _ _) + (fun t => repGaugeRingHom h (Ut t).1) (fun t w hw => ?_) + (fun t p => repGauge_topCoord h m bv t (hUt1 t) (hUt2 t) p) + (mem_sup_adjoin_range_topCoord h S m bv hz) (fun t => hzinv (Ut t)) + refine repGauge_eq_of_mem_adjoin_symSymbolsLE h S hS m (fun x hx hxm => hUt2 t x hx (by omega)) (fun r hr hrm => ?_) hw rw [hUt1 t] exact shiftFamily_eq_zero_of_card_ne m bv t ⟨r, hr⟩ (by simp only; omega) @@ -1167,29 +1168,25 @@ end Descent 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`, and no independence hypothesis. -/ -theorem invariant_mem_adjoin_fieldStrength [jets.Free] - (hA : IsGaugeField jets repLorentz repGauge A) - (hcomm : ∀ (p q : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) - (φ ψ : Module.Dual ℝ 𝔤), Commute (A p μ φ) (A q ν ψ)) - (S : Set B) +theorem invariant_mem_adjoin_fieldStrength [jets.Free] (S : Set B) (hcS : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) - (φ : Module.Dual ℝ 𝔤), ∀ y ∈ S, Commute y (A p μ φ)) + (φ : Module.Dual ℝ 𝔤), ∀ y ∈ S, Commute y (h.A p μ φ)) (hS : ∀ y ∈ S, ∀ U : jets.truncationKer 0, repGauge U.1 y = y) - {x : B} (hx : x ∈ Algebra.adjoin ℂ (symbols A ∪ S)) + {x : B} (hx : x ∈ Algebra.adjoin ℂ (symbols h.A ∪ S)) (hinv : ∀ U : G, repGauge U x = x) : - x ∈ Algebra.adjoin ℂ (tower A ∪ S) := by + x ∈ Algebra.adjoin ℂ (tower h.A ∪ S) := by -- bound the symbol order of the invariant, working relative to the full tower - obtain ⟨n, hxn⟩ := exists_le_of_mem_adjoin_symbols_union (tower A ∪ S) + obtain ⟨n, hxn⟩ := exists_le_of_mem_adjoin_symbols_union (tower h.A ∪ S) (Algebra.adjoin_mono (Set.union_subset_union_right _ Set.subset_union_right) hx) -- convert the bounded symbols to symmetrized symbols, absorbing the tower - have hconv : x ∈ Algebra.adjoin ℂ (symSymbolsLE A (n + 1) ∪ (tower A ∪ S)) := by - rw [symbolAdjoin_union_eq_symFieldAdjoin_union n (tower A ∪ S)] at hxn + have hconv : x ∈ Algebra.adjoin ℂ (symSymbolsLE h.A (n + 1) ∪ (tower h.A ∪ S)) := by + rw [symbolAdjoin_union_eq_symFieldAdjoin_union n (tower h.A ∪ S)] at hxn refine Algebra.adjoin_mono ?_ hxn rintro b ((hb | hb) | hb) exacts [Or.inl hb, Or.inr (Or.inl (towerLT_subset_tower n hb)), Or.inr hb] -- iterate the descent from the top order down to zero - suffices h : ∀ k, x ∈ Algebra.adjoin ℂ (symSymbolsLE A k ∪ (tower A ∪ S)) → - x ∈ Algebra.adjoin ℂ (tower A ∪ S) from h (n + 1) hconv + suffices h : ∀ k, x ∈ Algebra.adjoin ℂ (symSymbolsLE h.A k ∪ (tower h.A ∪ S)) → + x ∈ Algebra.adjoin ℂ (tower h.A ∪ S) from h (n + 1) hconv intro k induction k with | zero => @@ -1200,6 +1197,39 @@ theorem invariant_mem_adjoin_fieldStrength [jets.Free] · exact hb | succ k ih => intro hk - exact ih (mem_adjoin_symSymbolsLE_of_repGauge_eq hA hcomm S hcS hS k hk fun U => hinv U.1) + exact ih (mem_adjoin_symSymbolsLE_of_repGauge_eq h S hcS hS k hk fun U => hinv U.1) + +end GaugeAlgebraRealization + +/-! + +## H. The classification for the jet algebra itself + +-/ -end IsGaugeField +namespace GaugeJetAlgebra + +variable (jets) in +/-- The classification of gauge invariants of the gauge-boson jet algebra: for a free + package, 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 is a polynomial in the + covariant derivatives of the field strength and the elements of `S`. This is the case of + the identity realization; the commutation of `S` with the symbols is automatic in the + commutative jet algebra. -/ +theorem invariant_mem_adjoin_fieldStrength [jets.Free] (S : Set (ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤)) + (hS : ∀ y ∈ S, ∀ U : jets.truncationKer 0, complexRepJet jets U.1 y = y) + {x : ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤} + (hx : x ∈ Algebra.adjoin ℂ ({b : ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤 | + ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), + b = gaugeField 𝔤 p μ φ} ∪ S)) + (hinv : ∀ U : G, complexRepJet jets U x = x) : + x ∈ Algebra.adjoin ℂ ({b : ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤 | + ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), + b = GaugeAlgebraRealization.iteratedCovDerivAdjoint (gaugeField 𝔤) l + (GaugeAlgebraRealization.fieldStrength (gaugeField 𝔤) ν lam) 0 φ} ∪ S) := by + have key := (GaugeAlgebraRealization.id jets).invariant_mem_adjoin_fieldStrength S + (fun _ _ _ _ _ => Commute.all _ _) hS (by rw [GaugeAlgebraRealization.id_A]; exact hx) hinv + rw [GaugeAlgebraRealization.id_A] at key + exact key + +end GaugeJetAlgebra diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/TransformsInAdjoint.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/TransformsInAdjoint.lean index c2c73117c..3547d11e6 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/TransformsInAdjoint.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/TransformsInAdjoint.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.IsGaugeField +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.GaugeLaw /-! # Adjoint gauge tensors and the covariant derivative @@ -35,11 +35,12 @@ variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] variable {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] variable {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} -namespace IsGaugeField +namespace GaugeAlgebraRealization 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} +variable (h : GaugeAlgebraRealization jets B repGauge repLorentz) variable (jets) in /-- A family of derivative symbols `F` *transforms in the adjoint* (is an adjoint gauge @@ -140,14 +141,13 @@ set_option maxHeartbeats 2000000 in cross-term convolution survives — the analogue of `repGauge_commutatorFam` with a gauge tensor in the second slot. -/ lemma TransformsInAdjoint.repGauge_bracketFamConv - (hA : IsGaugeField jets repLorentz repGauge A) {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B} (hF : TransformsInAdjoint jets repGauge F) (U : G) (s : Multiset (Fin 1 ⊕ Fin 3)) (ρ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : - repGauge U (bracketFamConv A ρ F s φ) = + repGauge U (bracketFamConv h.A ρ F s φ) = (s.antidiagonal.map fun p => - bracketFamConv A ρ F p.2 (jets.adjointDualCoeff U⁻¹ p.1 φ)).sum + bracketFamConv h.A ρ F p.2 (jets.adjointDualCoeff U⁻¹ p.1 φ)).sum + (s.antidiagonal.map fun p => (p.2.antidiagonal.map fun r => F r.2 (jets.adjointDualCoeff U⁻¹ r.1 @@ -155,12 +155,12 @@ lemma TransformsInAdjoint.repGauge_bracketFamConv (jets.iteratedDeriv p.1 (jets.maurerCartan 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 ρ ∘ₗ jets.adjointDualCoeff U⁻¹ q.1).sum) ψ + repGauge U (h.A u ρ ψ) = + ((u.antidiagonal.map fun q => h.A q.2 ρ ∘ₗ jets.adjointDualCoeff U⁻¹ q.1).sum) ψ + algebraMap ℂ B (ψ (jets.evalLie (jets.iteratedDeriv u (jets.maurerCartan U⁻¹ ρ)))) := by intro u ψ - rw [hA.gauge_apply_deriv U u ρ ψ, Multiset.sum_linearMap_apply, Multiset.map_map] + rw [h.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 ψ) = @@ -171,12 +171,12 @@ lemma TransformsInAdjoint.repGauge_bracketFamConv 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 ρ ∘ₗ jets.adjointDualCoeff U⁻¹ q.1).sum) + bracketFam ((p.1.antidiagonal.map fun q => h.A q.2 ρ ∘ₗ jets.adjointDualCoeff U⁻¹ q.1).sum) ((p.2.antidiagonal.map fun r => F r.2 ∘ₗ jets.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 ρ ∘ₗ jets.adjointDualCoeff U⁻¹ q.1) + bracketFam (h.A q.2 ρ ∘ₗ jets.adjointDualCoeff U⁻¹ q.1) (F r.2 ∘ₗ jets.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, @@ -188,20 +188,20 @@ lemma TransformsInAdjoint.repGauge_bracketFamConv 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 (jets.adjointDualCoeff U⁻¹ p.1 φ)).sum = + bracketFamConv h.A ρ F p.2 (jets.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 ρ ∘ₗ jets.adjointDualCoeff U⁻¹ q.1) + bracketFam (h.A r.1 ρ ∘ₗ jets.adjointDualCoeff U⁻¹ q.1) (F r.2 ∘ₗ jets.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) φ]), + bracketFam_adjointDualCoeff U⁻¹ p.1 (h.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 ρ ∘ₗ jets.adjointDualCoeff U⁻¹ a) + bracketFam (h.A b ρ ∘ₗ jets.adjointDualCoeff U⁻¹ a) (F d ∘ₗ jets.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 ∘ₗ jets.adjointDualCoeff U⁻¹ r.1).sum) @@ -219,7 +219,7 @@ lemma TransformsInAdjoint.repGauge_bracketFamConv 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, + h.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] @@ -234,20 +234,19 @@ set_option maxHeartbeats 2000000 in 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 jets repLorentz repGauge A) {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B} (hF : TransformsInAdjoint jets repGauge F) (ρ : Fin 1 ⊕ Fin 3) : - TransformsInAdjoint jets repGauge (IsGaugeField.covDerivAdjoint A F ρ) := by + TransformsInAdjoint jets repGauge (GaugeAlgebraRealization.covDerivAdjoint h.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 + have hL : repGauge U (GaugeAlgebraRealization.covDerivAdjoint h.A F ρ s φ) = + repGauge U (F (ρ ::ₘ s) φ) + repGauge U (bracketFamConv h.A ρ F s φ) := by rw [covDerivAdjoint_apply, map_add] have hR : (s.antidiagonal.map fun p => - IsGaugeField.covDerivAdjoint A F ρ p.2 (jets.adjointDualCoeff U⁻¹ p.1 φ)).sum = + GaugeAlgebraRealization.covDerivAdjoint h.A F ρ p.2 (jets.adjointDualCoeff U⁻¹ p.1 φ)).sum = (s.antidiagonal.map fun p => F (ρ ::ₘ p.2) (jets.adjointDualCoeff U⁻¹ p.1 φ)).sum + (s.antidiagonal.map fun p => - bracketFamConv A ρ F p.2 (jets.adjointDualCoeff U⁻¹ p.1 φ)).sum := by + bracketFamConv h.A ρ F p.2 (jets.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] @@ -267,9 +266,9 @@ theorem TransformsInAdjoint.covDerivAdjoint F c (jets.adjointDualCoeff U⁻¹ b (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie (jets.iteratedDeriv a (jets.maurerCartan U⁻¹ ρ)))))) - rw [hL, hF.repGauge_cons U ρ s φ, hF.repGauge_bracketFamConv hA U s ρ φ, + rw [hL, hF.repGauge_cons U ρ s φ, hF.repGauge_bracketFamConv h U s ρ φ, hR, hcancel] abel -end IsGaugeField +end GaugeAlgebraRealization diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/InfinitesimalAction.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/InfinitesimalAction.lean index f4b0276b3..e018175be 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/InfinitesimalAction.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/InfinitesimalAction.lean @@ -57,11 +57,12 @@ variable {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} namespace LocalGaugeData -open IsGaugeField +open GaugeAlgebraRealization 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} +variable (h : GaugeAlgebraRealization jets B repGauge repLorentz) /-! @@ -206,27 +207,26 @@ set_option maxHeartbeats 2000000 in `TransformsInAdjoint.repGauge_bracketFamConv` with a matter field in the second slot. -/ lemma TransformsIn.repGauge_actionFamConv - (hA : IsGaugeField jets repLorentz repGauge A) {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B} (hF : TransformsIn repGauge rep F) (hact : IsInfinitesimalActionOf jets act rep) (U : G) (s : Multiset (Fin 1 ⊕ Fin 3)) (ρ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ V) : - repGauge U (actionFamConv A act ρ F s φ) = + repGauge U (actionFamConv h.A act ρ F s φ) = (s.antidiagonal.map fun p => - actionFamConv A act ρ F p.2 (repDualCoeff rep U⁻¹ p.1 φ)).sum + actionFamConv h.A act ρ F p.2 (repDualCoeff rep U⁻¹ p.1 φ)).sum + (s.antidiagonal.map fun p => (p.2.antidiagonal.map fun r => F r.2 (repDualCoeff rep U⁻¹ r.1 (φ ∘ₗ act (jets.evalLie (jets.iteratedDeriv p.1 (jets.maurerCartan 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 ρ ∘ₗ jets.adjointDualCoeff U⁻¹ q.1).sum) ψ + repGauge U (h.A u ρ ψ) = + ((u.antidiagonal.map fun q => h.A q.2 ρ ∘ₗ jets.adjointDualCoeff U⁻¹ q.1).sum) ψ + algebraMap ℂ B (ψ (jets.evalLie (jets.iteratedDeriv u (jets.maurerCartan U⁻¹ ρ)))) := by intro u ψ - rw [hA.gauge_apply_deriv U u ρ ψ, Multiset.sum_linearMap_apply, Multiset.map_map] + rw [h.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 (F u ψ) = @@ -236,13 +236,13 @@ lemma TransformsIn.repGauge_actionFamConv congr 1 have hMa : (s.antidiagonal.map fun p => actionFam act ((p.1.antidiagonal.map fun q => - A q.2 ρ ∘ₗ jets.adjointDualCoeff U⁻¹ q.1).sum) + h.A q.2 ρ ∘ₗ jets.adjointDualCoeff U⁻¹ q.1).sum) ((p.2.antidiagonal.map fun r => 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 (A q.2 ρ ∘ₗ jets.adjointDualCoeff U⁻¹ q.1) + actionFam act (h.A q.2 ρ ∘ₗ jets.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, @@ -254,20 +254,20 @@ lemma TransformsIn.repGauge_actionFamConv refine congrArg Multiset.sum (Multiset.map_congr rfl fun r hr => ?_) simp only [Function.comp_apply] have hMc : (s.antidiagonal.map fun p => - actionFamConv A act ρ F p.2 (repDualCoeff rep U⁻¹ p.1 φ)).sum = + actionFamConv h.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 (A r.1 ρ ∘ₗ jets.adjointDualCoeff U⁻¹ q.1) + actionFam act (h.A r.1 ρ ∘ₗ jets.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 [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) φ]), + hact.actionFam_repDualCoeff U⁻¹ p.1 (h.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 (A b ρ ∘ₗ jets.adjointDualCoeff U⁻¹ a) + actionFam act (h.A b ρ ∘ₗ jets.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 => F r.2 ∘ₗ repDualCoeff rep U⁻¹ r.1).sum) @@ -285,7 +285,7 @@ lemma TransformsIn.repGauge_actionFamConv Multiset.map_map, Multiset.map_congr rfl (fun p hp => by rw [Function.comp_apply, Function.comp_apply, - repGauge_actionFam hA U (hAlaw p.1) (hFlaw p.2) φ, hCg p]), + repGauge_actionFam h U (hAlaw p.1) (hFlaw p.2) φ, hCg p]), Multiset.sum_map_add, hM] set_option maxHeartbeats 2000000 in @@ -296,24 +296,23 @@ set_option maxHeartbeats 2000000 in `A_ρ · F` through the coassociativity of the antidiagonal — the matter-field analogue of `TransformsInAdjoint.covDerivAdjoint`. -/ theorem TransformsIn.covDerivAction - (hA : IsGaugeField jets repLorentz repGauge A) {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B} (hF : TransformsIn repGauge rep F) (hact : IsInfinitesimalActionOf jets act rep) (ρ : Fin 1 ⊕ Fin 3) : - TransformsIn repGauge rep (IsGaugeField.covDerivAction A act F ρ) := by + TransformsIn repGauge rep (GaugeAlgebraRealization.covDerivAction h.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 - rw [IsGaugeField.covDerivAction_apply, map_add] + have hL : repGauge U (GaugeAlgebraRealization.covDerivAction h.A act F ρ s φ) = + repGauge U (F (ρ ::ₘ s) φ) + repGauge U (actionFamConv h.A act ρ F s φ) := by + rw [GaugeAlgebraRealization.covDerivAction_apply, map_add] have hR : (s.antidiagonal.map fun p => - IsGaugeField.covDerivAction A act F ρ p.2 (repDualCoeff rep U⁻¹ p.1 φ)).sum = + GaugeAlgebraRealization.covDerivAction h.A act F ρ p.2 (repDualCoeff rep U⁻¹ p.1 φ)).sum = (s.antidiagonal.map fun p => F (ρ ::ₘ p.2) (repDualCoeff rep U⁻¹ p.1 φ)).sum + (s.antidiagonal.map fun p => - actionFamConv A act ρ F p.2 (repDualCoeff rep U⁻¹ p.1 φ)).sum := by + actionFamConv h.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 [IsGaugeField.covDerivAction_apply] + rw [GaugeAlgebraRealization.covDerivAction_apply] have hcancel : (s.antidiagonal.map fun p => (p.1.antidiagonal.map fun q => F p.2 (repDualCoeff rep U⁻¹ q.2 @@ -328,7 +327,7 @@ theorem TransformsIn.covDerivAction F c (repDualCoeff rep U⁻¹ b (φ ∘ₗ act (jets.evalLie (jets.iteratedDeriv a (jets.maurerCartan U⁻¹ ρ)))))) - rw [hL, hF.repGauge_cons hact U ρ s φ, hF.repGauge_actionFamConv hA hact U s ρ φ, + rw [hL, hF.repGauge_cons hact U ρ s φ, hF.repGauge_actionFamConv h hact U s ρ φ, hR, hcancel] abel @@ -337,16 +336,15 @@ theorem TransformsIn.covDerivAction `∇_{l 0} ⋯ ∇_{l (n-1)} F` transforms in `rep` — the recursion of `TransformsIn.covDerivAction` over the tuple of directions. -/ theorem TransformsIn.covDerivIter - (hA : IsGaugeField jets repLorentz repGauge A) {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B} (hF : TransformsIn repGauge rep F) (hact : IsInfinitesimalActionOf jets act rep) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : - TransformsIn repGauge rep (IsGaugeField.covDerivIter A act F n l) := by + TransformsIn repGauge rep (GaugeAlgebraRealization.covDerivIter h.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) + exact TransformsIn.covDerivAction h (ih fun i => l i.succ) hact (l 0) end MatterCovariance diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/TransformsIn.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/TransformsIn.lean index ff71ddecc..190142499 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/TransformsIn.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/TransformsIn.lean @@ -47,7 +47,7 @@ variable {G : Type} [Group G] namespace LocalGaugeData -open IsGaugeField +open GaugeAlgebraRealization /-- 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 diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/Matter/CovariantDeriv.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/Matter/CovariantDeriv.lean index f96b5eabb..ed60cbe3e 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/Matter/CovariantDeriv.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/Matter/CovariantDeriv.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.IsGaugeField +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.GaugeLaw public import Physlib.ClassicalFieldTheory.JetAlgebra.Jet public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.TransformsInAdjoint public import Mathlib.LinearAlgebra.Basis.Defs @@ -65,13 +65,14 @@ variable {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra variable {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} variable {V : Type} [AddCommGroup V] [Module ℂ V] -namespace IsGaugeField +namespace GaugeAlgebraRealization 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} +variable (h : GaugeAlgebraRealization jets B repGauge repLorentz) /-! @@ -288,11 +289,12 @@ lemma actionFam_sum_right (f : Module.Dual ℝ 𝔤 →ₗ[ℝ] B) | cons g S ih => simp [actionFam_add_right, ih] set_option maxHeartbeats 1000000 in +include h 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 jets repLorentz repGauge A) +lemma repGauge_actionFam (U : G) {f f' : Module.Dual ℝ 𝔤 →ₗ[ℝ] B} {g g' : Module.Dual ℂ V →ₗ[ℂ] B} {cf : 𝔤} (hf : ∀ ψ : Module.Dual ℝ 𝔤, @@ -303,7 +305,7 @@ lemma repGauge_actionFam (hA : IsGaugeField jets repLorentz repGauge A) 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₂ + h.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' @@ -634,6 +636,6 @@ theorem adjoin_symbols_eq_adjoin_covDerivIter (act : 𝔤 →ₗ[ℝ] V →ₗ[ end Action -end IsGaugeField +end GaugeAlgebraRealization diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/JetComponentSpace/TransformsIn.lean b/Physlib/ClassicalFieldTheory/JetAlgebra/JetComponentSpace/TransformsIn.lean index f0335117e..8052d88b9 100644 --- a/Physlib/ClassicalFieldTheory/JetAlgebra/JetComponentSpace/TransformsIn.lean +++ b/Physlib/ClassicalFieldTheory/JetAlgebra/JetComponentSpace/TransformsIn.lean @@ -14,8 +14,8 @@ public import Physlib.ClassicalFieldTheory.GaugeTheory.Matter.CovariantDeriv `LocalGaugeData.TransformsIn` demands of a family of component functions that each derivative symbol transform by the all-orders Leibniz convolution of the base-point Taylor -coefficients `IsGaugeField.repDualCoeff` of the gauge jet. What the gauge action on the jet -component space is *built* from is `symbolAction`, the action of the coefficient +coefficients `GaugeAlgebraRealization.repDualCoeff` of the gauge jet. What the gauge action +on the jet component space is *built* from is `symbolAction`, the action of the coefficient `jetCoeff rep U⁻¹ : JetRing ⊗ End V` through `DerivAlgebraComplex.jetRingAction` on the derivative label. This file identifies the two, for any group `G` acting fibrewise on the jets of the field. @@ -23,7 +23,7 @@ jets of the field. The bridge is `DerivAlgebraComplex.jetRingAction_basis_multiset`, which puts the action of a jet on a derivative monomial into the convolution form that `TransformsIn` wants. What remains is to recognise the scalars it produces — the base-point Taylor coefficients of the -jet-ring factor of the gauge coefficient — as `IsGaugeField.repCoeff`. That is done by +jet-ring factor of the gauge coefficient — as `GaugeAlgebraRealization.repCoeff`. That is done by `jetCoeffAt`, the base-point Taylor coefficient of a jet of endomorphisms, which on the gauge coefficient reproduces `repCoeff` because `jetCoeff` reproduces `rep U` on constant jets. @@ -37,7 +37,7 @@ is an instance of the same lemma rather than a second proof. - `JetComponentSpace.jetCoeffAt` : the base-point Taylor coefficient of a jet of endomorphisms. - `JetComponentSpace.jetCoeffAt_jetCoeff` : on the gauge coefficient it is - `IsGaugeField.repCoeff`. + `GaugeAlgebraRealization.repCoeff`. - `JetComponentSpace.symbolAction_basis_tmul` : a coefficient acts on a derivative monomial by the Leibniz convolution of its base-point Taylor coefficients. - `JetComponentSpace.repDual_basis_tmul` : the transformation law of the derivative symbol @@ -132,7 +132,7 @@ lemma jetCoeffAt_apply (x : Multiset (Fin 1 ⊕ Fin 3)) lemma jetCoeffAt_jetCoeff [Module.Free ℂ V] [Module.Finite ℂ V] (rep : Representation ℂ G (JetRing ⊗[ℂ] V)) (U : G) (x : Multiset (Fin 1 ⊕ Fin 3)) : - jetCoeffAt x (jetCoeff rep U) = IsGaugeField.repCoeff rep U x := by + jetCoeffAt x (jetCoeff rep U) = GaugeAlgebraRealization.repCoeff rep U x := by refine LinearMap.ext fun v => ?_ rw [jetCoeffAt_apply, jetCoeff_spec] rfl @@ -214,7 +214,7 @@ lemma symbolAction_basis_tmul (c : JetRing ⊗[ℂ] Module.End ℂ V) /-- The transformation law of the derivative symbol `∂_s ψ_φ` under the jet gauge group: the all-orders Leibniz convolution of the dual representation coefficients - `IsGaugeField.repDualCoeff` against lower symbols, with no inhomogeneous term. This is + `GaugeAlgebraRealization.repDualCoeff` against lower symbols, with no inhomogeneous term. This is the identity the `LocalGaugeData.TransformsIn` obligations of a matter field rest on. Nothing here is special to the unconjugated half of the component space: the conjugate @@ -227,10 +227,10 @@ lemma repDual_basis_tmul [Module.Free ℂ V] [Module.Finite ℂ V] repDual rep hlin U (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) = (s.antidiagonal.map fun p => DerivAlgebraComplex.basis p.2 ⊗ₜ[ℂ] - IsGaugeField.repDualCoeff rep U⁻¹ p.1 φ).sum := by + GaugeAlgebraRealization.repDualCoeff rep U⁻¹ p.1 φ).sum := by rw [show repDual rep hlin U = symbolAction (jetCoeff rep U⁻¹) from rfl, symbolAction_basis_tmul] exact congrArg Multiset.sum (Multiset.map_congr rfl fun p _ => by - rw [jetCoeffAt_jetCoeff, IsGaugeField.repDualCoeff]) + rw [jetCoeffAt_jetCoeff, GaugeAlgebraRealization.repDualCoeff]) end JetComponentSpace diff --git a/Physlib/Particles/StandardModel/AlgebraRealization/Basic.lean b/Physlib/Particles/StandardModel/AlgebraRealization/Basic.lean index b1ab1ecd0..56bfb3b76 100644 --- a/Physlib/Particles/StandardModel/AlgebraRealization/Basic.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/Basic.lean @@ -48,7 +48,7 @@ their gauge covariance and the classification of jet-gauge invariants. equivariant algebra map from the jet algebra. - `AlgebraRealization.A`, `AlgebraRealization.H` and their companions : the thirteen families of derivative symbols of a Standard Model. -- `AlgebraRealization.repJet_A`, `AlgebraRealization.repLorentz_H`, +- `AlgebraRealization.gaugeRealization`, `AlgebraRealization.repLorentz_H`, `AlgebraRealization.massWeight_d` and their companions : the transformation laws and mass weights of those families. @@ -251,6 +251,8 @@ barred families in the conjugate of it. noncomputable def gaugeRealization : GaugeAlgebraRealization localGaugeData B repJet repLorentz where toAlgHom := h.toAlgHom.comp JetAlgebra.includeGauge + A := h.A + A_eq _ _ _ := rfl map_repJet U y := by rw [AlgHom.comp_apply, AlgHom.comp_apply, ← JetAlgebra.repJetGaugeGroupI_includeGauge, h.map_repJet] @@ -262,11 +264,6 @@ noncomputable def gaugeRealization : lemma gaugeRealization_A : h.gaugeRealization.A = h.A := rfl -/-- The law `repJet_A` of a Standard Model: the gauge-field laws of the realization - `gaugeRealization`. -/ -lemma repJet_A : IsGaugeField localGaugeData repLorentz repJet h.A := - h.gaugeRealization_A ▸ h.gaugeRealization.isGaugeField - /-- The law `repJet_H` of a Standard Model, obtained from the corresponding law of the jet algebra by pushing it along the defining algebra map. -/ lemma repJet_H : LocalGaugeData.TransformsIn repJet HiggsVec.repJetGaugeGroupI h.H := diff --git a/Physlib/Particles/StandardModel/AlgebraRealization/CovFieldAlgebra/Basic.lean b/Physlib/Particles/StandardModel/AlgebraRealization/CovFieldAlgebra/Basic.lean index 1b91712ee..0be4e4a51 100644 --- a/Physlib/Particles/StandardModel/AlgebraRealization/CovFieldAlgebra/Basic.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/CovFieldAlgebra/Basic.lean @@ -12,7 +12,7 @@ public import Physlib.Particles.StandardModel.AlgebraRealization.CovariantDeriv The matter towers of `AlgebraRealization.CovariantDeriv` commute with the gauge-field symbols and are fixed by pure gauge jets, so the abstract classification -`IsGaugeField.invariant_mem_adjoin_fieldStrength` applies to the field algebra written in +`GaugeAlgebraRealization.invariant_mem_adjoin_fieldStrength` applies to the field algebra written in terms of the covariant towers: a jet-gauge invariant is a polynomial in the covariant towers of the field strength and of the matter fields, gauge invariance having eliminated the bare gauge-field symbols. `covAlgebra` names the algebra those covariant towers @@ -163,28 +163,29 @@ theorem invariant_mem_adjoin_covDeriv {x : B} intro p μ ψ y hy refine h.matterTowers_induction (fun y => Commute y (h.A p μ ψ)) hy ?_ ?_ ?_ ?_ ?_ ?_ ?_ ?_ ?_ ?_ ?_ ?_ - · exact fun n l φ => IsGaugeField.commute_covDerivIter _ _ h.A_comm_A h.A_comm_H n l φ p μ ψ · exact fun n l φ => - IsGaugeField.commute_covDerivIter _ _ h.A_comm_A h.A_comm_barH n l φ p μ ψ - · exact fun i n l φ => IsGaugeField.commute_covDerivIter _ _ h.A_comm_A + GaugeAlgebraRealization.commute_covDerivIter _ _ h.A_comm_A h.A_comm_H n l φ p μ ψ + · exact fun n l φ => + GaugeAlgebraRealization.commute_covDerivIter _ _ h.A_comm_A h.A_comm_barH n l φ p μ ψ + · exact fun i n l φ => GaugeAlgebraRealization.commute_covDerivIter _ _ h.A_comm_A (fun s μ ψ s' φ => h.A_comm_d s μ ψ i s' φ) n l φ p μ ψ - · exact fun i n l φ => IsGaugeField.commute_covDerivIter _ _ h.A_comm_A + · exact fun i n l φ => GaugeAlgebraRealization.commute_covDerivIter _ _ h.A_comm_A (fun s μ ψ s' φ => h.A_comm_bard s μ ψ i s' φ) n l φ p μ ψ - · exact fun i n l φ => IsGaugeField.commute_covDerivIter _ _ h.A_comm_A + · exact fun i n l φ => GaugeAlgebraRealization.commute_covDerivIter _ _ h.A_comm_A (fun s μ ψ s' φ => h.A_comm_u s μ ψ i s' φ) n l φ p μ ψ - · exact fun i n l φ => IsGaugeField.commute_covDerivIter _ _ h.A_comm_A + · exact fun i n l φ => GaugeAlgebraRealization.commute_covDerivIter _ _ h.A_comm_A (fun s μ ψ s' φ => h.A_comm_baru s μ ψ i s' φ) n l φ p μ ψ - · exact fun i n l φ => IsGaugeField.commute_covDerivIter _ _ h.A_comm_A + · exact fun i n l φ => GaugeAlgebraRealization.commute_covDerivIter _ _ h.A_comm_A (fun s μ ψ s' φ => h.A_comm_Q s μ ψ i s' φ) n l φ p μ ψ - · exact fun i n l φ => IsGaugeField.commute_covDerivIter _ _ h.A_comm_A + · exact fun i n l φ => GaugeAlgebraRealization.commute_covDerivIter _ _ h.A_comm_A (fun s μ ψ s' φ => h.A_comm_barQ s μ ψ i s' φ) n l φ p μ ψ - · exact fun i n l φ => IsGaugeField.commute_covDerivIter _ _ h.A_comm_A + · exact fun i n l φ => GaugeAlgebraRealization.commute_covDerivIter _ _ h.A_comm_A (fun s μ ψ s' φ => h.A_comm_L s μ ψ i s' φ) n l φ p μ ψ - · exact fun i n l φ => IsGaugeField.commute_covDerivIter _ _ h.A_comm_A + · exact fun i n l φ => GaugeAlgebraRealization.commute_covDerivIter _ _ h.A_comm_A (fun s μ ψ s' φ => h.A_comm_barL s μ ψ i s' φ) n l φ p μ ψ - · exact fun i n l φ => IsGaugeField.commute_covDerivIter _ _ h.A_comm_A + · exact fun i n l φ => GaugeAlgebraRealization.commute_covDerivIter _ _ h.A_comm_A (fun s μ ψ s' φ => h.A_comm_e s μ ψ i s' φ) n l φ p μ ψ - · exact fun i n l φ => IsGaugeField.commute_covDerivIter _ _ h.A_comm_A + · exact fun i n l φ => GaugeAlgebraRealization.commute_covDerivIter _ _ h.A_comm_A (fun s μ ψ s' φ => h.A_comm_bare s μ ψ i s' φ) n l φ p μ ψ -- the matter towers are fixed by pure gauge jets have hS : ∀ y ∈ h.matterTowers, ∀ U : localGaugeData.truncationKer 0, repJet U.1 y = y := by @@ -214,8 +215,9 @@ theorem invariant_mem_adjoin_covDeriv {x : B} · exact Or.inr hb -- the abstract classification rw [Set.union_assoc] - refine Algebra.adjoin_mono ?_ (IsGaugeField.invariant_mem_adjoin_fieldStrength h.repJet_A - h.A_comm_A h.matterTowers hcS hS hx' hinv) + refine Algebra.adjoin_mono ?_ + (GaugeAlgebraRealization.invariant_mem_adjoin_fieldStrength h.gaugeRealization + h.matterTowers hcS hS hx' hinv) rintro b (⟨l, ν, lam, φ, rfl⟩ | hb) · exact Or.inl (Set.mem_iUnion_of_mem l (Set.mem_iUnion_of_mem ν (Set.mem_iUnion_of_mem lam ⟨φ, rfl⟩))) diff --git a/Physlib/Particles/StandardModel/AlgebraRealization/CovStandardModel.lean b/Physlib/Particles/StandardModel/AlgebraRealization/CovStandardModel.lean index 18818a85b..d38d6732b 100644 --- a/Physlib/Particles/StandardModel/AlgebraRealization/CovStandardModel.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/CovStandardModel.lean @@ -122,13 +122,13 @@ include h in 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.gaugeRealization.gauge_mul _ b₁ b₂ /-! ## B. The twelve matter species -Every matter tower is `IsGaugeField.covDerivIter h.A act F n l 0` for the gauge-algebra +Every matter tower is `GaugeAlgebraRealization.covDerivIter h.A act F n l 0` for the gauge-algebra action `act` of its species and its bare family `F`, and every law proved below for a matter tower uses only two facts about that family: its symbols commute with the gauge-field symbols, and they are mass-weight eigenvectors of weight `c + 2 * |t|` at the @@ -165,13 +165,13 @@ variable {h} {V : Type} [AddCommGroup V] [Module ℂ V] [FiniteDimensional ℂ V /-- The covariant tower of the species, in the ordered-tuple indexing of the covariant form of the theory. -/ noncomputable def tower {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : Module.Dual ℂ V →ₗ[ℂ] B := - IsGaugeField.covDerivIter h.A S.act S.F n l 0 + GaugeAlgebraRealization.covDerivIter h.A S.act S.F n l 0 /-- The tower commutes with the gauge-field symbols: it is a polynomial in symbols that do. -/ lemma comm_A {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V) (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (ψ : Module.Dual ℝ GaugeAlgebra) : Commute (S.tower l φ) (h.A p μ ψ) := - IsGaugeField.commute_covDerivIter S.act S.F h.A_comm_A S.A_comm n l φ p μ ψ + GaugeAlgebraRealization.commute_covDerivIter S.act S.F h.A_comm_A S.A_comm n l φ p μ ψ end Species @@ -268,7 +268,7 @@ include h in complex-linear. -/ lemma repJet_algebraMap (U : JetGaugeGroupI) (c : ℂ) : repJet U (algebraMap ℂ B c) = algebraMap ℂ B c := by - have hone := h.repJet_A.gauge_mul U (repJet U⁻¹ 1) 1 + have hone := h.gaugeRealization.gauge_mul U (repJet U⁻¹ 1) 1 rw [mul_one, ← Module.End.mul_apply, ← map_mul, mul_inv_cancel, map_one repJet, Module.End.one_apply, one_mul] at hone rw [Algebra.algebraMap_eq_smul_one, map_smul, ← hone] @@ -303,7 +303,7 @@ lemma repJet_eq_of_mem_covAlgebra_of_mem_truncationKer_zero | 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] + | mul a b _ _ iha ihb => rw [h.gaugeRealization.gauge_mul, iha, ihb] /-! @@ -360,9 +360,9 @@ 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 + GaugeAlgebraRealization.repCoeff rep (JetGaugeGroupI.ofConstant g) 0 = repG g := by refine LinearMap.ext fun v => ?_ - simp only [IsGaugeField.repCoeff, LinearMap.coe_comp, Function.comp_apply, + simp only [GaugeAlgebraRealization.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] @@ -373,12 +373,13 @@ lemma repGlobal_of_repJet {V : Type} [AddCommGroup V] [Module ℂ V] {rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)} {repG : Representation ℂ GaugeGroupI V} {T : Module.Dual ℂ V →ₗ[ℂ] B} (hT : ∀ (U : JetGaugeGroupI) (φ : Module.Dual ℂ V), - repJet U (T φ) = T (IsGaugeField.repDualCoeff rep U⁻¹ 0 φ)) + repJet U (T φ) = T (GaugeAlgebraRealization.repDualCoeff rep U⁻¹ 0 φ)) (hg : ∀ g : GaugeGroupI, rep (JetGaugeGroupI.ofConstant g) = TensorProduct.map LinearMap.id (repG g)) (g : GaugeGroupI) (φ : Module.Dual ℂ V) : repGlobal repJet g (T φ) = T (repG.dual g φ) := by - rw [repGlobal_apply, hT, ← map_inv JetGaugeGroupI.ofConstant, IsGaugeField.repDualCoeff, + rw [repGlobal_apply, hT, ← map_inv JetGaugeGroupI.ofConstant, + GaugeAlgebraRealization.repDualCoeff, repCoeff_zero_ofConstant (hg g⁻¹)] rfl @@ -388,12 +389,13 @@ lemma repGlobal_of_repJet_conj {V : Type} [AddCommGroup V] [Module ℂ V] {rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)} {repG : Representation ℂ GaugeGroupI V} {T : Module.Dual ℂ (ConjModule V) →ₗ[ℂ] B} (hT : ∀ (U : JetGaugeGroupI) (φ : Module.Dual ℂ (ConjModule V)), repJet U (T φ) = - T (IsGaugeField.repDualCoeff (JetComponentSpace.repConj rep) U⁻¹ 0 φ)) + T (GaugeAlgebraRealization.repDualCoeff (JetComponentSpace.repConj rep) U⁻¹ 0 φ)) (hg : ∀ g : GaugeGroupI, rep (JetGaugeGroupI.ofConstant g) = TensorProduct.map LinearMap.id (repG g)) (g : GaugeGroupI) (φ : Module.Dual ℂ (ConjModule V)) : repGlobal repJet g (T φ) = T (repG.conj.dual g φ) := by - rw [repGlobal_apply, hT, ← map_inv JetGaugeGroupI.ofConstant, IsGaugeField.repDualCoeff, + rw [repGlobal_apply, hT, ← map_inv JetGaugeGroupI.ofConstant, + GaugeAlgebraRealization.repDualCoeff, LocalGaugeData.repCoeff_repConj, repCoeff_zero_ofConstant (hg g⁻¹)] rfl @@ -499,7 +501,7 @@ lemma covF_mem_adjoin_gaugeSymbols {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 = h.A s ρ ψ} := - IsGaugeField.iteratedCovDerivAdjoint_fieldStrength_mem_adjoin_symbols + GaugeAlgebraRealization.iteratedCovDerivAdjoint_fieldStrength_mem_adjoin_symbols (List.ofFn l) μ ν φ /-- The field-strength tower commutes with anything the gauge-field symbols commute @@ -508,7 +510,7 @@ lemma covF_comm_of_comm_A {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (μ ν : F (ψ : Module.Dual ℝ GaugeAlgebra) {y : B} (hy : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (ρ : Fin 1 ⊕ Fin 3) (ψ' : Module.Dual ℝ GaugeAlgebra), Commute (h.A p ρ ψ') y) : Commute (h.covF l μ ν ψ) y := by - refine IsGaugeField.commute_of_mem_adjoin ?_ (h.covF_mem_adjoin_gaugeSymbols l μ ν ψ) + refine GaugeAlgebraRealization.commute_of_mem_adjoin ?_ (h.covF_mem_adjoin_gaugeSymbols l μ ν ψ) rintro x ⟨p, ρ, ψ', rfl⟩ exact hy p ρ ψ' @@ -527,7 +529,8 @@ lemma commute_gaugeSymbol_of_mem_covGenerators (p : Multiset (Fin 1 ⊕ Fin 3)) 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_comm_of_comm_A l μ ν ψ fun p ρ ψ' => + (GaugeAlgebraRealization.commute_of_mem_adjoin (fun _ hb => + (h.covF_comm_of_comm_A l μ ν ψ fun p ρ ψ' => (h.commute_gaugeSymbol_of_mem_covGenerators p ρ ψ' hb).symm).symm) hx).symm /-! @@ -547,12 +550,12 @@ 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] + GaugeAlgebraRealization.actionFam act f g φ ∈ M := by + rw [GaugeAlgebraRealization.actionFam, + GaugeAlgebraRealization.dualPairEquiv_symm_eq_sum (Module.finBasis ℝ GaugeAlgebra) f, + GaugeAlgebraRealization.dualPairEquivC_symm_eq_sum (Module.finBasis ℂ V) g] + simp only [map_sum, LinearMap.sum_apply, GaugeAlgebraRealization.tensorAction_tmul, + GaugeAlgebraRealization.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 @@ -560,8 +563,8 @@ lemma actionFam_apply_mem_submodule {V : Type} [AddCommGroup V] [Module ℂ V] 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] + GaugeAlgebraRealization.bracketFam f g φ ∈ M := by + rw [GaugeAlgebraRealization.bracketFam_apply_eq_sum] refine sum_mem fun j _ => sum_mem fun k _ => ?_ rw [← algebraMap_smul ℂ] exact M.smul_mem _ (hfg _ _) @@ -619,19 +622,19 @@ variable {h} {V : Type} [AddCommGroup V] [Module ℂ V] [FiniteDimensional ℂ V gauge-field factor. -/ lemma covDerivIter_mem_massWeightEigenspace {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V) : - IsGaugeField.covDerivIter h.A S.act S.F n l s φ ∈ + GaugeAlgebraRealization.covDerivIter h.A S.act S.F n l s φ ∈ massWeightEigenspace massWeightPoly (S.c + 2 * n + 2 * Multiset.card s) := by induction n generalizing s φ with | zero => - rw [IsGaugeField.covDerivIter_zero] + rw [GaugeAlgebraRealization.covDerivIter_zero] simpa using mem_massWeightEigenspace_iff.mpr (S.massWeight s φ) | succ n ih => - rw [IsGaugeField.covDerivIter_succ, IsGaugeField.covDerivAction_apply] + rw [GaugeAlgebraRealization.covDerivIter_succ, GaugeAlgebraRealization.covDerivAction_apply] refine add_mem ?_ ?_ · have hstep := ih (fun i => l i.succ) (l 0 ::ₘ s) φ rwa [Multiset.card_cons, show S.c + 2 * n + 2 * (Multiset.card s + 1) = S.c + 2 * (n + 1) + 2 * Multiset.card s by ring] at hstep - · rw [IsGaugeField.actionFamConv, Multiset.sum_linearMap_apply, Multiset.map_map] + · rw [GaugeAlgebraRealization.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 @@ -656,9 +659,9 @@ end Species extra derivative, in either case weight `4 + 2 * |s|`. -/ lemma fieldStrength_mem_massWeightEigenspace (μ ν : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra) : - IsGaugeField.fieldStrength h.A μ ν s φ ∈ + GaugeAlgebraRealization.fieldStrength h.A μ ν s φ ∈ massWeightEigenspace massWeightPoly (4 + 2 * Multiset.card s) := by - rw [IsGaugeField.fieldStrength_apply] + rw [GaugeAlgebraRealization.fieldStrength_apply] refine add_mem (sub_mem ?_ ?_) ?_ · have hstep := h.A_mem_massWeightEigenspace (μ ::ₘ s) ν φ rwa [Multiset.card_cons, @@ -666,7 +669,7 @@ lemma fieldStrength_mem_massWeightEigenspace (μ ν : Fin 1 ⊕ Fin 3) · have hstep := h.A_mem_massWeightEigenspace (ν ::ₘ s) μ φ rwa [Multiset.card_cons, show 2 * (1 + (Multiset.card s + 1)) = 4 + 2 * Multiset.card s by ring] at hstep - · rw [IsGaugeField.commutatorFam, Multiset.sum_linearMap_apply, Multiset.map_map] + · rw [GaugeAlgebraRealization.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 @@ -687,22 +690,23 @@ lemma iteratedCovDerivAdjoint_mem_massWeightEigenspace (c : ℕ) 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 h.A l G s φ ∈ + GaugeAlgebraRealization.iteratedCovDerivAdjoint h.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 h.A ([] : List (Fin 1 ⊕ Fin 3)) G = G + rw [show GaugeAlgebraRealization.iteratedCovDerivAdjoint h.A ([] : List (Fin 1 ⊕ Fin 3)) G = G from rfl] simpa using hG s φ | cons ρ l ih => - rw [show IsGaugeField.iteratedCovDerivAdjoint h.A (ρ :: l) G - = IsGaugeField.covDerivAdjoint h.A (IsGaugeField.iteratedCovDerivAdjoint h.A l G) ρ - from rfl, IsGaugeField.covDerivAdjoint_apply, List.length_cons] + rw [show GaugeAlgebraRealization.iteratedCovDerivAdjoint h.A (ρ :: l) G + = GaugeAlgebraRealization.covDerivAdjoint h.A + (GaugeAlgebraRealization.iteratedCovDerivAdjoint h.A l G) ρ + from rfl, GaugeAlgebraRealization.covDerivAdjoint_apply, List.length_cons] 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 + 1) + 2 * Multiset.card s by ring] at hstep - · rw [IsGaugeField.bracketFamConv, Multiset.sum_linearMap_apply, Multiset.map_map] + · rw [GaugeAlgebraRealization.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 @@ -849,8 +853,8 @@ lemma commute_tower {y : B} Commute (h.A p μ ψ) y) (hyF : ∀ (t : Multiset (Fin 1 ⊕ Fin 3)) (χ : Module.Dual ℂ V), Commute (S.F t χ) y) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V) : Commute (S.tower l φ) y := by - refine IsGaugeField.commute_of_mem_adjoin ?_ - (IsGaugeField.covDerivIter_mem_adjoin_symbols S.act S.F n l 0 φ) + refine GaugeAlgebraRealization.commute_of_mem_adjoin ?_ + (GaugeAlgebraRealization.covDerivIter_mem_adjoin_symbols S.act S.F n l 0 φ) rintro x (⟨p, μ, ψ, rfl⟩ | ⟨t, χ, rfl⟩) exacts [hyA p μ ψ, hyF t χ] @@ -877,15 +881,16 @@ lemma anticomm_tower {x : B} x * S.tower l φ = -(S.tower l φ * x) := by suffices key : ∀ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V), - IsGaugeField.covDerivIter h.A S.act S.F n l s φ ∈ anticommuteSubmodule x from key n l 0 φ + GaugeAlgebraRealization.covDerivIter h.A S.act S.F n l s φ ∈ anticommuteSubmodule x + from key n l 0 φ 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] + rw [GaugeAlgebraRealization.covDerivIter_succ, GaugeAlgebraRealization.covDerivAction_apply] refine add_mem (ih _ _ _) ?_ - rw [IsGaugeField.actionFamConv, Multiset.sum_linearMap_apply, Multiset.map_map] + rw [GaugeAlgebraRealization.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] @@ -1377,7 +1382,7 @@ end The Lorentz laws of the matter towers are section L of [`CovariantDeriv.lean`](CovariantDeriv.lean); the one for the field-strength tower is `repLorentz_covF` just below, which is -`IsGaugeField.repLorentz_iteratedCovDerivAdjoint_fieldStrength` read in the +`GaugeAlgebraRealization.repLorentz_iteratedCovDerivAdjoint_fieldStrength` read in the ordered-tuple indexing. -/ @@ -1392,8 +1397,8 @@ lemma repLorentz_covF (Λ : SL(2,ℂ)) (n : ℕ) (l : 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 μ ν φ + GaugeAlgebraRealization.repLorentz_iteratedCovDerivAdjoint_fieldStrength h.gaugeRealization + Λ n l μ ν φ end AlgebraRealization diff --git a/Physlib/Particles/StandardModel/AlgebraRealization/CovariantDeriv.lean b/Physlib/Particles/StandardModel/AlgebraRealization/CovariantDeriv.lean index c64ae2435..636c57e71 100644 --- a/Physlib/Particles/StandardModel/AlgebraRealization/CovariantDeriv.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/CovariantDeriv.lean @@ -21,7 +21,7 @@ a gauge jet acts through its base point alone, and shows that nothing is lost in exchange: the two sets of generators generate the same algebra. Sections A to E are the Lorentz machinery the towers need, stated for an arbitrary -`IsGaugeField`. A Lorentz transformation mixes each derivative slot of a symbol through a +`GaugeAlgebraRealization`. A Lorentz transformation mixes each derivative slot of a symbol through a column of the Lorentz matrix; the bare symbols are indexed by multisets of directions, so that mixing is written as an operator `lorentzMix` on multiset-indexed families, a morphism for the Leibniz convolution out of which the correction terms of a covariant derivative are @@ -45,9 +45,9 @@ the theory consumes. - `StandardModel.lorentzMix` : the Lorentz mixing operator on multiset-indexed families of derivative symbols, a morphism for the Leibniz convolution (`lorentzMix_derivConv`). - `StandardModel.repLorentz_tower` : the Lorentz law of an abstract covariant tower. -- `IsGaugeField.isLorentzCovDerivTransforms_covDerivIter` and - `IsGaugeField.repLorentz_iteratedCovDerivAdjoint_fieldStrength` : the Lorentz laws of the - covariant matter towers and of the covariant field-strength tower. +- `GaugeAlgebraRealization.isLorentzCovDerivTransforms_covDerivIter` and + `GaugeAlgebraRealization.repLorentz_iteratedCovDerivAdjoint_fieldStrength` : the Lorentz + laws of the covariant matter towers and of the covariant field-strength tower. - `AlgebraRealization.fieldAlgebra` : the algebra the fields generate. - `AlgebraRealization.covDerivH`, `AlgebraRealization.covDerivFieldStrength` and their companions : the covariant derivative towers. @@ -411,9 +411,9 @@ conjugate families. -/ -namespace IsGaugeField +namespace GaugeAlgebraRealization -open _root_.IsGaugeField +open _root_.GaugeAlgebraRealization variable {B : Type} [Ring B] [Algebra ℂ B] variable {V : Type} [AddCommGroup V] [Module ℂ V] [FiniteDimensional ℂ V] @@ -422,6 +422,7 @@ variable {A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → variable {act : GaugeAlgebra →ₗ[ℝ] V →ₗ[ℂ] V} variable {repLorentz : Representation ℂ SL(2,ℂ) B} variable {repGauge : Representation ℂ JetGaugeGroupI B} +variable (h : GaugeAlgebraRealization localGaugeData B repGauge repLorentz) /-- Rotating a triple sum so that the innermost index comes first. -/ lemma sum_comm₃ {α β γ M : Type*} [Fintype α] [Fintype β] [Fintype γ] [AddCommMonoid M] @@ -450,11 +451,11 @@ lemma repLorentz_eq_lorentzMix (Λ : SL(2,ℂ)) (f g : Multiset (Fin 1 ⊕ Fin 3 exact Finset.sum_congr rfl fun p _ => by rw [add_zero] /-- The Lorentz law of the gauge-field symbols, in the multiset form. -/ -lemma repLorentz_apply_mix (hA : IsGaugeField localGaugeData repLorentz repGauge A) (Λ : SL(2,ℂ)) +lemma repLorentz_apply_mix (Λ : SL(2,ℂ)) (x : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (χ : Module.Dual ℝ GaugeAlgebra) : - repLorentz Λ (A x μ χ) = lorentzMix Λ (fun t => ∑ a, L[Λ] a μ • A t a χ) x 0 := - repLorentz_eq_lorentzMix Λ (fun x => A x μ χ) (fun t => ∑ a, L[Λ] a μ • A t a χ) - (fun n l => hA.lorentz_apply Λ n l μ χ) x + repLorentz Λ (h.A x μ χ) = lorentzMix Λ (fun t => ∑ a, L[Λ] a μ • h.A t a χ) x 0 := + repLorentz_eq_lorentzMix Λ (fun x => h.A x μ χ) (fun t => ∑ a, L[Λ] a μ • h.A t a χ) + (fun n l => h.lorentz_apply Λ n l μ χ) x omit [FiniteDimensional ℂ V] in /-- The Lorentz law of a family of derivative symbols, in the multiset form. -/ @@ -469,20 +470,19 @@ lemma isLorentzDerivTransforms_mix {rep : Representation ℂ SL(2,ℂ) V} /-- The Lorentz law of a scalar combination of convolutions against the gauge field: the direction of the gauge field mixes by its own column, the derivative slots by `lorentzMix`, and the right-hand families are replaced by their transforms. -/ -lemma repLorentz_sum_derivConv - (hmul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂) - (hA : IsGaugeField localGaugeData repLorentz repGauge A) (Λ : SL(2,ℂ)) (ρ : Fin 1 ⊕ Fin 3) +lemma repLorentz_sum_derivConv (Λ : SL(2,ℂ)) (ρ : Fin 1 ⊕ Fin 3) {ι κ : Type} [Fintype ι] [Fintype κ] (bg : Module.Basis ι ℝ GaugeAlgebra) (coef : ι → κ → ℂ) (g g' : κ → Multiset (Fin 1 ⊕ Fin 3) → B) (hg : ∀ k y, repLorentz Λ (g k y) = lorentzMix Λ (g' k) y 0) (s : Multiset (Fin 1 ⊕ Fin 3)) : - repLorentz Λ (∑ j, ∑ k, coef j k • derivConv (fun x => A x ρ (bg.coord j)) (g k) s) = + repLorentz Λ (∑ j, ∑ k, coef j k • derivConv (fun x => h.A x ρ (bg.coord j)) (g k) s) = ∑ a, L[Λ] a ρ • lorentzMix Λ - (fun t => ∑ j, ∑ k, coef j k • derivConv (fun x => A x a (bg.coord j)) (g' k) t) s 0 := by - have h1 : ∀ j k, repLorentz Λ (derivConv (fun x => A x ρ (bg.coord j)) (g k) s) = - ∑ a, L[Λ] a ρ • lorentzMix Λ (derivConv (fun x => A x a (bg.coord j)) (g' k)) s 0 := by + (fun t => ∑ j, ∑ k, coef j k • derivConv (fun x => h.A x a (bg.coord j)) (g' k) t) s 0 := by + have h1 : ∀ j k, repLorentz Λ (derivConv (fun x => h.A x ρ (bg.coord j)) (g k) s) = + ∑ a, L[Λ] a ρ • lorentzMix Λ (derivConv (fun x => h.A x a (bg.coord j)) (g' k)) s 0 := by intro j k - rw [repLorentz_derivConv hmul Λ _ (fun t => ∑ a, L[Λ] a ρ • A t a (bg.coord j)) _ (g' k) - (fun x => repLorentz_apply_mix hA Λ x ρ _) (hg k)] + rw [repLorentz_derivConv h.repLorentz_mul Λ _ + (fun t => ∑ a, L[Λ] a ρ • h.A t a (bg.coord j)) _ (g' k) + (fun x => repLorentz_apply_mix h Λ x ρ _) (hg k)] simp only [← lorentzMix_smul_fam, ← lorentzMix_sum_fam] exact congrArg (fun G => lorentzMix Λ G s 0) (funext fun r => derivConv_sum_left _ _ _ r) simp only [map_sum, map_smul, h1, lorentzMix_sum_fam, lorentzMix_smul_fam, Finset.smul_sum, @@ -524,19 +524,17 @@ lemma actionFamConv_sum_fam {ι : Type} [Fintype ι] (ρ : Fin 1 ⊕ Fin 3) (c : /-- 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 localGaugeData repLorentz repGauge A) (Λ : SL(2,ℂ)) (ρ : Fin 1 ⊕ Fin 3) +lemma repLorentz_actionFamConv (Λ : 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, L[Λ] a ρ • lorentzMix Λ (fun t => actionFamConv A act a G' t φ) s 0 := by + repLorentz Λ (actionFamConv h.A act ρ G s φ) = + ∑ a, L[Λ] a ρ • lorentzMix Λ (fun t => actionFamConv h.A act a G' t φ) s 0 := by classical set bg := Module.finBasis ℝ GaugeAlgebra set bv := Module.finBasis ℂ V simp only [actionFamConv_eq_sum bg bv] - exact repLorentz_sum_derivConv hmul hA Λ ρ bg (fun j k => φ (act (bg j) (bv k))) + exact repLorentz_sum_derivConv h Λ ρ bg (fun j k => φ (act (bg j) (bv k))) (fun k y => G y (bv.coord k)) (fun k t => G' t (bv.coord k)) (fun k y => hG y _) s omit [FiniteDimensional ℂ V] in @@ -579,19 +577,17 @@ lemma actionFamConv_comp_dual (T : V →ₗ[ℂ] V) covariant slots mix by their own columns and the multiset of plain derivative slots mixes by `lorentzMix`, while the value index transforms contragrediently. -/ lemma repLorentz_covDerivIter {rep : Representation ℂ SL(2,ℂ) V} - (hmul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂) - (hA : IsGaugeField localGaugeData 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), + repLorentz Λ (covDerivIter h.A act F n l s φ) = ∑ p : Fin n → (Fin 1 ⊕ Fin 3), (∏ i, L[Λ] (p i) (l i)) • - lorentzMix Λ (fun t => covDerivIter A act F n p t (rep.dual Λ φ)) s 0 := - repLorentz_tower Λ (covDerivIter A act F) (covDerivIter A act F) (actionFamConv A act) + lorentzMix Λ (fun t => covDerivIter h.A act F n p t (rep.dual Λ φ)) s 0 := + repLorentz_tower Λ (covDerivIter h.A act F) (covDerivIter h.A act F) (actionFamConv h.A act) (rep.dual Λ) (fun _ _ _ => rfl) (fun _ _ _ => rfl) (fun _ s φ => isLorentzDerivTransforms_mix hF Λ s φ) - (fun ρ G G' hG s φ => repLorentz_actionFamConv hmul hA Λ ρ G G' hG s φ) + (fun ρ G G' hG s φ => repLorentz_actionFamConv h Λ ρ G G' hG s φ) (fun ρ _ _ c G s φ => actionFamConv_sum_fam ρ c G s φ) (fun ρ G s φ => actionFamConv_comp_dual (rep Λ⁻¹) (fun c v => hcomm c Λ⁻¹ v) ρ G s φ) n l s φ @@ -601,14 +597,12 @@ lemma repLorentz_covDerivIter {rep : Representation ℂ SL(2,ℂ) V} 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 {rep : Representation ℂ SL(2,ℂ) V} - (hmul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂) - (hA : IsGaugeField localGaugeData 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 + IsLorentzCovDerivTransforms repLorentz rep (fun {n} l => covDerivIter h.A act F n l 0) := by intro Λ n l φ - rw [repLorentz_covDerivIter hmul hA hcomm F hF Λ n l 0 φ] + rw [repLorentz_covDerivIter h hcomm F hF Λ n l 0 φ] simp only [lorentzMix_zero] omit [FiniteDimensional ℂ V] in @@ -624,14 +618,12 @@ lemma actionConj_comm_repConj (rep : Representation ℂ SL(2,ℂ) V) /-- The Lorentz law of the covariant tower of a conjugate family, from the commutation of the gauge action with the Lorentz action of the unconjugated species. -/ theorem isLorentzCovDerivTransforms_covDerivIter_conj {rep : Representation ℂ SL(2,ℂ) V} - (hmul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂) - (hA : IsGaugeField localGaugeData 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 ℂ (ConjModule V) →ₗ[ℂ] B) (hF : IsLorentzDerivTransforms repLorentz rep.conj F) : IsLorentzCovDerivTransforms repLorentz rep.conj - (fun {n} l => covDerivIter A (LocalGaugeData.actionConj act) F n l 0) := - isLorentzCovDerivTransforms_covDerivIter hmul hA (actionConj_comm_repConj rep hcomm) F hF + (fun {n} l => covDerivIter h.A (LocalGaugeData.actionConj act) F n l 0) := + isLorentzCovDerivTransforms_covDerivIter h (actionConj_comm_repConj rep hcomm) F hF /-! @@ -670,35 +662,31 @@ lemma bracketFamConv_sum_fam {ι : Type} [Fintype ι] (ρ : Fin 1 ⊕ Fin 3) (c exact sum_derivConv_sum_fam _ _ _ _ s /-- 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 localGaugeData repLorentz repGauge A) (Λ : SL(2,ℂ)) (ρ : Fin 1 ⊕ Fin 3) +lemma repLorentz_bracketFamConv (Λ : 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, L[Λ] a ρ • lorentzMix Λ (fun t => bracketFamConv A a G' t φ) s 0 := by + repLorentz Λ (bracketFamConv h.A ρ G s φ) = + ∑ a, L[Λ] a ρ • lorentzMix Λ (fun t => bracketFamConv h.A a G' t φ) s 0 := by set bg := Module.Free.chooseBasis ℝ GaugeAlgebra simp only [bracketFamConv_eq_sum] - exact repLorentz_sum_derivConv hmul hA Λ ρ bg (fun j k => ((φ ⁅bg j, bg k⁆ : ℝ) : ℂ)) + exact repLorentz_sum_derivConv h Λ ρ bg (fun j k => ((φ ⁅bg j, bg k⁆ : ℝ) : ℂ)) (fun k y => G y (bg.coord k)) (fun k t => G' t (bg.coord k)) (fun k y => hG y _) s /-- 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 localGaugeData repLorentz repGauge A) (Λ : SL(2,ℂ)) +lemma repLorentz_iteratedCovDerivAdjoint (Λ : 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), + repLorentz Λ (iteratedCovDerivAdjoint h.A (List.ofFn l) F x φ) = ∑ p : Fin n → (Fin 1 ⊕ Fin 3), (∏ i, L[Λ] (p i) (l i)) • - lorentzMix Λ (fun t => iteratedCovDerivAdjoint A (List.ofFn p) F' t φ) x 0 := by - have := repLorentz_tower Λ (fun n l => iteratedCovDerivAdjoint A (List.ofFn l) F) - (fun n l => iteratedCovDerivAdjoint A (List.ofFn l) F') (bracketFamConv A) LinearMap.id + lorentzMix Λ (fun t => iteratedCovDerivAdjoint h.A (List.ofFn p) F' t φ) x 0 := by + have := repLorentz_tower Λ (fun n l => iteratedCovDerivAdjoint h.A (List.ofFn l) F) + (fun n l => iteratedCovDerivAdjoint h.A (List.ofFn l) F') (bracketFamConv h.A) LinearMap.id (fun _ l _ => by rw [List.ofFn_succ]; rfl) (fun _ l _ => by rw [List.ofFn_succ]; rfl) - (fun _ x φ => hF x φ) (fun ρ G G' hG s φ => repLorentz_bracketFamConv hmul hA Λ ρ G G' hG s φ) + (fun _ x φ => hF x φ) (fun ρ G G' hG s φ => repLorentz_bracketFamConv h Λ ρ G G' hG s φ) (fun ρ _ _ c G s φ => bracketFamConv_sum_fam ρ c G s φ) (fun _ _ _ _ => by simp only [LinearMap.comp_id, LinearMap.id_apply]) n l x φ simpa only [LinearMap.id_apply] using this @@ -730,31 +718,29 @@ lemma iteratedCovDerivAdjoint_neg_fam /-- 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 localGaugeData repLorentz repGauge A) (Λ : SL(2,ℂ)) (μ ν : Fin 1 ⊕ Fin 3) +lemma repLorentz_fieldStrength_mix (Λ : SL(2,ℂ)) (μ ν : Fin 1 ⊕ Fin 3) (x : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ GaugeAlgebra) : - repLorentz Λ (fieldStrength A μ ν x φ) = - lorentzMix Λ (fun t => ∑ a, L[Λ] a μ • ∑ b, L[Λ] b ν • fieldStrength A a b t φ) x 0 := by + repLorentz Λ (fieldStrength h.A μ ν x φ) = + lorentzMix Λ (fun t => ∑ a, L[Λ] a μ • ∑ b, L[Λ] b ν • fieldStrength h.A a b t φ) x 0 := by -- the derivative terms - have hder : ∀ κ σ, repLorentz Λ (A (κ ::ₘ x) σ φ) = - lorentzMix Λ (fun t => ∑ a, L[Λ] a κ • ∑ b, L[Λ] b σ • A (a ::ₘ t) b φ) x 0 := by + have hder : ∀ κ σ, repLorentz Λ (h.A (κ ::ₘ x) σ φ) = + lorentzMix Λ (fun t => ∑ a, L[Λ] a κ • ∑ b, L[Λ] b σ • h.A (a ::ₘ t) b φ) x 0 := by intro κ σ - simp only [repLorentz_apply_mix hA Λ (κ ::ₘ x) σ φ, lorentzMix_cons_zero, lorentzMix_sum_fam, + simp only [repLorentz_apply_mix h Λ (κ ::ₘ x) σ φ, lorentzMix_cons_zero, lorentzMix_sum_fam, lorentzMix_smul_fam] -- the commutator term - have hcomm : repLorentz Λ (commutatorFam A μ ν x φ) = - lorentzMix Λ (fun t => ∑ a, L[Λ] a μ • ∑ b, L[Λ] b ν • commutatorFam A a b t φ) x 0 := by - have hG : ∀ y χ, repLorentz Λ (A y ν χ) = - lorentzMix Λ (fun t => (∑ b, L[Λ] b ν • A t b) χ) y 0 := fun y χ => by - simpa only [LinearMap.sum_apply, LinearMap.smul_apply] using repLorentz_apply_mix hA Λ y ν χ - rw [show commutatorFam A μ ν x = bracketFamConv A μ (fun r => A r ν) x from rfl, - repLorentz_bracketFamConv hmul hA Λ μ _ _ hG x φ] + have hcomm : repLorentz Λ (commutatorFam h.A μ ν x φ) = + lorentzMix Λ (fun t => ∑ a, L[Λ] a μ • ∑ b, L[Λ] b ν • commutatorFam h.A a b t φ) x 0 := by + have hG : ∀ y χ, repLorentz Λ (h.A y ν χ) = + lorentzMix Λ (fun t => (∑ b, L[Λ] b ν • h.A t b) χ) y 0 := fun y χ => by + simpa only [LinearMap.sum_apply, LinearMap.smul_apply] using repLorentz_apply_mix h Λ y ν χ + rw [show commutatorFam h.A μ ν x = bracketFamConv h.A μ (fun r => h.A r ν) x from rfl, + repLorentz_bracketFamConv h Λ μ _ _ hG x φ] simp only [lorentzMix_sum_fam, lorentzMix_smul_fam, bracketFamConv_sum_fam] rfl -- the second derivative term, with its two sums exchanged - have hswap : (fun t => ∑ a, L[Λ] a ν • ∑ b, L[Λ] b μ • A (a ::ₘ t) b φ) = - fun t => ∑ a, L[Λ] a μ • ∑ b, L[Λ] b ν • A (b ::ₘ t) a φ := by + have hswap : (fun t => ∑ a, L[Λ] a ν • ∑ b, L[Λ] b μ • h.A (a ::ₘ t) b φ) = + fun t => ∑ a, L[Λ] a μ • ∑ b, L[Λ] b ν • h.A (b ::ₘ t) a φ := by funext t simp only [Finset.smul_sum, smul_smul] rw [Finset.sum_comm] @@ -768,29 +754,28 @@ lemma repLorentz_fieldStrength_mix /-- 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 localGaugeData repLorentz repGauge A) (Λ : SL(2,ℂ)) (n : ℕ) +lemma repLorentz_iteratedCovDerivAdjoint_fieldStrength (Λ : 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 φ) = + repLorentz Λ (iteratedCovDerivAdjoint h.A (List.ofFn l) (fieldStrength h.A μ ν) 0 φ) = ∑ p : Fin n → (Fin 1 ⊕ Fin 3), (∏ i, L[Λ] (p i) (l i)) • ∑ a, L[Λ] a μ • ∑ b, L[Λ] b ν • - iteratedCovDerivAdjoint A (List.ofFn p) (fieldStrength A a b) 0 φ := by - have hF' : ∀ y χ, repLorentz Λ (fieldStrength A μ ν y χ) = - lorentzMix Λ (fun t => (∑ a, L[Λ] a μ • ∑ b, L[Λ] b ν • fieldStrength A a b t) χ) y 0 := + iteratedCovDerivAdjoint h.A (List.ofFn p) (fieldStrength h.A a b) 0 φ := by + have hF' : ∀ y χ, repLorentz Λ (fieldStrength h.A μ ν y χ) = + lorentzMix Λ (fun t => (∑ a, L[Λ] a μ • ∑ b, L[Λ] b ν • fieldStrength h.A a b t) χ) y 0 := fun y χ => by simpa only [LinearMap.sum_apply, LinearMap.smul_apply] using - repLorentz_fieldStrength_mix hmul hA Λ μ ν y χ - rw [repLorentz_iteratedCovDerivAdjoint hmul hA Λ (fieldStrength A μ ν) _ hF' n l 0 φ] + repLorentz_fieldStrength_mix h Λ μ ν y χ + rw [repLorentz_iteratedCovDerivAdjoint h Λ (fieldStrength h.A μ ν) _ hF' n l 0 φ] simp only [lorentzMix_zero, iteratedCovDerivAdjoint_sum_fam] -end IsGaugeField +end GaugeAlgebraRealization /-! ## F. What a covariant tower inherits from its family Facts about the covariant tower of a single matter family, in the form the field algebra -consumes. The span lemma `IsGaugeField.adjoin_symbols_eq_adjoin_covDerivIter` says that the +consumes. The span lemma +`GaugeAlgebraRealization.adjoin_symbols_eq_adjoin_covDerivIter` says that the bare symbols and the tower generate the same algebra over the gauge-field symbols, so each is a polynomial in the other; the tower commutes with the gauge-field symbols as soon as the bare symbols do; and a pure gauge jet acts trivially through the dual base-point @@ -798,9 +783,9 @@ coefficient of a representation whose zeroth Taylor coefficient it fixes. -/ -namespace IsGaugeField +namespace GaugeAlgebraRealization -open _root_.IsGaugeField +open _root_.GaugeAlgebraRealization variable {B : Type} [Ring B] [Algebra ℂ B] variable {A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] B} @@ -853,7 +838,7 @@ lemma repDualCoeff_zero_of_mem_truncationKer_zero rw [show repDualCoeff rep U.1⁻¹ 0 = (repCoeff rep U.1⁻¹ 0).dualMap from rfl, hrep hU] rfl -end IsGaugeField +end GaugeAlgebraRealization /-! @@ -871,7 +856,8 @@ split over them that the rest of the file runs. namespace AlgebraRealization -open _root_.IsGaugeField _root_.StandardModel.IsGaugeField LocalGaugeData JetComponentSpace +open _root_.GaugeAlgebraRealization _root_.StandardModel.GaugeAlgebraRealization +open LocalGaugeData JetComponentSpace variable {B : Type} [Ring B] [Algebra ℂ B] {repJet : Representation ℂ JetGaugeGroupI B} @@ -1117,7 +1103,7 @@ lemma repJet_covDerivIter {V : Type} [AddCommGroup V] [Module ℂ V] [FiniteDime (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI) (φ : Module.Dual ℂ V) : repJet U (covDerivIter h.A act F n l 0 φ) = covDerivIter h.A act F n l 0 (repDualCoeff rep U⁻¹ 0 φ) := - (TransformsIn.covDerivIter h.repJet_A hF hact n l).repGauge_zero U φ + (TransformsIn.covDerivIter h.gaugeRealization hF hact n l).repGauge_zero U φ /-- The Higgs tower transforms through the base point of a gauge jet. -/ lemma repJet_covDerivH {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (U : JetGaugeGroupI) @@ -1297,14 +1283,15 @@ lemma repJet_covDerivFieldStrength (U : JetGaugeGroupI) (l : List (Fin 1 ⊕ Fin (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : repJet U (h.covDerivFieldStrength l μ ν φ) = h.covDerivFieldStrength l μ ν (localGaugeData.adjointDualCoeff U⁻¹ 0 φ) := - (transformsInAdjoint_iteratedCovDerivAdjoint h.repJet_A l μ ν).repGauge_zero U φ + (transformsInAdjoint_iteratedCovDerivAdjoint h.gaugeRealization l μ ν).repGauge_zero U φ /-- A pure gauge jet fixes the covariant tower of the field strength. -/ lemma repJet_covDerivFieldStrength_of_mem_truncationKer_zero (U : localGaugeData.truncationKer 0) (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : repJet U.1 (h.covDerivFieldStrength l μ ν φ) = h.covDerivFieldStrength l μ ν φ := - repGauge_iteratedCovDerivAdjoint_fieldStrength_of_mem_truncationKer_zero h.repJet_A U l μ ν φ + repGauge_iteratedCovDerivAdjoint_fieldStrength_of_mem_truncationKer_zero h.gaugeRealization + U l μ ν φ /-! @@ -1322,73 +1309,73 @@ Each species proves that commutation next to its `gaugeAlgebraAction` /-- The Higgs tower transforms as a Lorentz scalar. -/ lemma repLorentz_covDerivH : IsLorentzCovDerivTransforms repLorentz (Representation.trivial ℂ SL(2,ℂ) HiggsVec) (fun {_n} l => h.covDerivH l) := - isLorentzCovDerivTransforms_covDerivIter h.repLorentz_mul h.repJet_A + isLorentzCovDerivTransforms_covDerivIter h.gaugeRealization HiggsVec.gaugeAlgebraAction_comm_repLorentz h.H h.repLorentz_H /-- The conjugate Higgs tower transforms as a Lorentz scalar. -/ lemma repLorentz_covDerivBarH : IsLorentzCovDerivTransforms repLorentz (Representation.trivial ℂ SL(2,ℂ) HiggsVec).conj (fun {_n} l => h.covDerivBarH l) := - isLorentzCovDerivTransforms_covDerivIter_conj h.repLorentz_mul h.repJet_A + isLorentzCovDerivTransforms_covDerivIter_conj h.gaugeRealization HiggsVec.gaugeAlgebraAction_comm_repLorentz h.barH h.repLorentz_barH /-- The down-type quark tower transforms as a right-handed Weyl spinor. -/ lemma repLorentz_covDerivD (i : Fin 3) : IsLorentzCovDerivTransforms repLorentz DownSinglet.repLorentzGroup (fun {_n} l => h.covDerivD i l) := - isLorentzCovDerivTransforms_covDerivIter h.repLorentz_mul h.repJet_A + isLorentzCovDerivTransforms_covDerivIter h.gaugeRealization DownSinglet.gaugeAlgebraAction_comm_repLorentzGroup (h.d i) (h.repLorentz_d i) /-- The conjugate down-type quark tower transforms in the conjugate Weyl representation. -/ lemma repLorentz_covDerivBarD (i : Fin 3) : IsLorentzCovDerivTransforms repLorentz DownSinglet.repLorentzGroup.conj (fun {_n} l => h.covDerivBarD i l) := - isLorentzCovDerivTransforms_covDerivIter_conj h.repLorentz_mul h.repJet_A + isLorentzCovDerivTransforms_covDerivIter_conj h.gaugeRealization DownSinglet.gaugeAlgebraAction_comm_repLorentzGroup (h.bard i) (h.repLorentz_bard i) /-- The up-type quark tower transforms as a right-handed Weyl spinor. -/ lemma repLorentz_covDerivU (i : Fin 3) : IsLorentzCovDerivTransforms repLorentz UpSinglet.repLorentzGroup (fun {_n} l => h.covDerivU i l) := - isLorentzCovDerivTransforms_covDerivIter h.repLorentz_mul h.repJet_A + isLorentzCovDerivTransforms_covDerivIter h.gaugeRealization UpSinglet.gaugeAlgebraAction_comm_repLorentzGroup (h.u i) (h.repLorentz_u i) /-- The conjugate up-type quark tower transforms in the conjugate Weyl representation. -/ lemma repLorentz_covDerivBarU (i : Fin 3) : IsLorentzCovDerivTransforms repLorentz UpSinglet.repLorentzGroup.conj (fun {_n} l => h.covDerivBarU i l) := - isLorentzCovDerivTransforms_covDerivIter_conj h.repLorentz_mul h.repJet_A + isLorentzCovDerivTransforms_covDerivIter_conj h.gaugeRealization UpSinglet.gaugeAlgebraAction_comm_repLorentzGroup (h.baru i) (h.repLorentz_baru i) /-- The quark doublet tower transforms as a left-handed Weyl spinor. -/ lemma repLorentz_covDerivQ (i : Fin 3) : IsLorentzCovDerivTransforms repLorentz QuarkDoublet.repLorentzGroup (fun {_n} l => h.covDerivQ i l) := - isLorentzCovDerivTransforms_covDerivIter h.repLorentz_mul h.repJet_A + isLorentzCovDerivTransforms_covDerivIter h.gaugeRealization QuarkDoublet.gaugeAlgebraAction_comm_repLorentzGroup (h.Q i) (h.repLorentz_Q i) /-- The conjugate quark doublet tower transforms in the conjugate Weyl representation. -/ lemma repLorentz_covDerivBarQ (i : Fin 3) : IsLorentzCovDerivTransforms repLorentz QuarkDoublet.repLorentzGroup.conj (fun {_n} l => h.covDerivBarQ i l) := - isLorentzCovDerivTransforms_covDerivIter_conj h.repLorentz_mul h.repJet_A + isLorentzCovDerivTransforms_covDerivIter_conj h.gaugeRealization QuarkDoublet.gaugeAlgebraAction_comm_repLorentzGroup (h.barQ i) (h.repLorentz_barQ i) /-- The lepton doublet tower transforms as a left-handed Weyl spinor. -/ lemma repLorentz_covDerivL (i : Fin 3) : IsLorentzCovDerivTransforms repLorentz LeptonDoublet.repLorentzGroup (fun {_n} l => h.covDerivL i l) := - isLorentzCovDerivTransforms_covDerivIter h.repLorentz_mul h.repJet_A + isLorentzCovDerivTransforms_covDerivIter h.gaugeRealization LeptonDoublet.gaugeAlgebraAction_comm_repLorentzGroup (h.L i) (h.repLorentz_L i) /-- The conjugate lepton doublet tower transforms in the conjugate Weyl representation. -/ lemma repLorentz_covDerivBarL (i : Fin 3) : IsLorentzCovDerivTransforms repLorentz LeptonDoublet.repLorentzGroup.conj (fun {_n} l => h.covDerivBarL i l) := - isLorentzCovDerivTransforms_covDerivIter_conj h.repLorentz_mul h.repJet_A + isLorentzCovDerivTransforms_covDerivIter_conj h.gaugeRealization LeptonDoublet.gaugeAlgebraAction_comm_repLorentzGroup (h.barL i) (h.repLorentz_barL i) /-- The lepton singlet tower transforms as a right-handed Weyl spinor. -/ lemma repLorentz_covDerivE (i : Fin 3) : IsLorentzCovDerivTransforms repLorentz LeptonSinglet.repLorentzGroup (fun {_n} l => h.covDerivE i l) := - isLorentzCovDerivTransforms_covDerivIter h.repLorentz_mul h.repJet_A + isLorentzCovDerivTransforms_covDerivIter h.gaugeRealization LeptonSinglet.gaugeAlgebraAction_comm_repLorentzGroup (h.e i) (h.repLorentz_e i) /-- The conjugate lepton singlet tower transforms in the conjugate Weyl representation. -/ lemma repLorentz_covDerivBarE (i : Fin 3) : IsLorentzCovDerivTransforms repLorentz LeptonSinglet.repLorentzGroup.conj (fun {_n} l => h.covDerivBarE i l) := - isLorentzCovDerivTransforms_covDerivIter_conj h.repLorentz_mul h.repJet_A + isLorentzCovDerivTransforms_covDerivIter_conj h.gaugeRealization LeptonSinglet.gaugeAlgebraAction_comm_repLorentzGroup (h.bare i) (h.repLorentz_bare i) end AlgebraRealization diff --git a/Physlib/Particles/StandardModel/CovAlgebraRealization/Basic.lean b/Physlib/Particles/StandardModel/CovAlgebraRealization/Basic.lean index cbb0d6ec3..c170f4a0b 100644 --- a/Physlib/Particles/StandardModel/CovAlgebraRealization/Basic.lean +++ b/Physlib/Particles/StandardModel/CovAlgebraRealization/Basic.lean @@ -793,7 +793,7 @@ lemma F_commute_mem_fieldAlgebra {n : ℕ} {l : Fin n → Fin 1 ⊕ Fin 3} {μ (φ : Module.Dual ℝ GaugeAlgebra) (x : B) (hx : x ∈ k.fieldAlgebra) : k.covF l μ ν φ * x = x * k.covF l μ ν φ := by rw [fieldAlgebra] at hx - refine (IsGaugeField.commute_of_mem_adjoin (y := k.covF l μ ν φ) ?_ hx).symm + refine (GaugeAlgebraRealization.commute_of_mem_adjoin (y := k.covF 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 @@ -817,7 +817,7 @@ lemma H_commute_mem_fieldAlgebra {n : ℕ} {l : Fin n → Fin 1 ⊕ Fin 3} (φ : Module.Dual ℂ HiggsVec) (x : B) (hx : x ∈ k.fieldAlgebra) : k.covH l φ * x = x * k.covH l φ := by rw [fieldAlgebra] at hx - refine (IsGaugeField.commute_of_mem_adjoin (y := k.covH l φ) ?_ hx).symm + refine (GaugeAlgebraRealization.commute_of_mem_adjoin (y := k.covH 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 @@ -841,7 +841,7 @@ lemma barH_commute_mem_fieldAlgebra {n : ℕ} {l : Fin n → Fin 1 ⊕ Fin 3} (φ : Module.Dual ℂ (ConjModule HiggsVec)) (x : B) (hx : x ∈ k.fieldAlgebra) : k.covBarH l φ * x = x * k.covBarH l φ := by rw [fieldAlgebra] at hx - refine (IsGaugeField.commute_of_mem_adjoin (y := k.covBarH l φ) ?_ hx).symm + refine (GaugeAlgebraRealization.commute_of_mem_adjoin (y := k.covBarH 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 @@ -868,8 +868,8 @@ end CovAlgebraRealization ## E. Naturality of the covariant derivative A covariant tower is built from the bare families by two operations only: the pairing of an -adjoint family against a matter one (`IsGaugeField.actionFam`), and the bracket of two -adjoint families (`IsGaugeField.bracketFam`). Each expands, in bases of the gauge algebra +adjoint family against a matter one (`GaugeAlgebraRealization.actionFam`), and the bracket of two +adjoint families (`GaugeAlgebraRealization.bracketFam`). Each expands, in bases of the gauge algebra and of the value space, as a finite double sum of scalar multiples of products of components, so each commutes with an algebra map. The whole recursion therefore does, and that is the content of this section: the covariant towers of a Standard Model are the jet @@ -877,9 +877,9 @@ algebra's own covariant towers pushed along the defining map. -/ -namespace IsGaugeField +namespace GaugeAlgebraRealization -open _root_.IsGaugeField +open _root_.GaugeAlgebraRealization variable {B B' : Type} [Ring B] [Algebra ℂ B] [Ring B'] [Algebra ℂ B'] {V : Type} [AddCommGroup V] [Module ℂ V] [Module.Finite ℂ V] @@ -1032,7 +1032,7 @@ lemma iteratedCovDerivAdjoint_map' (Φ : B →ₐ[ℂ] B') (hA : ∀ p ρ ψ, Φ covDerivAdjoint_map' Φ hA (fun s' χ => iteratedCovDerivAdjoint_map' Φ hA hF l s' χ) ρ s φ -end IsGaugeField +end GaugeAlgebraRealization /-! @@ -1092,11 +1092,11 @@ lemma toCovAlgebraRealization_covF {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) have hb : h.toCovAlgebraRealization.covF l μ ν φ = h.toAlgHom (AlgebraRealization.id.covF l μ ν φ) := rfl rw [hb] - exact IsGaugeField.iteratedCovDerivAdjoint_map' h.toAlgHom h.toAlgHom_id_A - (F := IsGaugeField.fieldStrength AlgebraRealization.id.A μ ν) - (F' := IsGaugeField.fieldStrength h.A μ ν) - (fun s χ => IsGaugeField.fieldStrength_map' (A := AlgebraRealization.id.A) (A' := h.A) - h.toAlgHom h.toAlgHom_id_A μ ν s χ) + exact GaugeAlgebraRealization.iteratedCovDerivAdjoint_map' h.toAlgHom h.toAlgHom_id_A + (F := GaugeAlgebraRealization.fieldStrength AlgebraRealization.id.A μ ν) + (F' := GaugeAlgebraRealization.fieldStrength h.A μ ν) + (fun s χ => GaugeAlgebraRealization.fieldStrength_map' (A := AlgebraRealization.id.A) + (A' := h.A) h.toAlgHom h.toAlgHom_id_A μ ν s χ) (List.ofFn l) 0 φ /-- The higgs tower of the covariant Standard Model carried by a Standard Model is its own. -/ @@ -1107,7 +1107,7 @@ lemma toCovAlgebraRealization_covH {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : have hb : h.toCovAlgebraRealization.covH l φ = h.toAlgHom (AlgebraRealization.id.covDerivH l φ) := rfl rw [hb] - exact IsGaugeField.covDerivIter_map' h.toAlgHom h.toAlgHom_id_A + exact GaugeAlgebraRealization.covDerivIter_map' h.toAlgHom h.toAlgHom_id_A (F := AlgebraRealization.id.H ) (F' := h.H ) (fun s χ => rfl) n l 0 φ /-- The conjugate higgs tower of the covariant Standard Model carried by a Standard Model is @@ -1119,7 +1119,7 @@ lemma toCovAlgebraRealization_covBarH {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3) have hb : h.toCovAlgebraRealization.covBarH l φ = h.toAlgHom (AlgebraRealization.id.covDerivBarH l φ) := rfl rw [hb] - exact IsGaugeField.covDerivIter_map' h.toAlgHom h.toAlgHom_id_A + exact GaugeAlgebraRealization.covDerivIter_map' h.toAlgHom h.toAlgHom_id_A (F := AlgebraRealization.id.barH ) (F' := h.barH ) (fun s χ => rfl) n l 0 φ /-- The down-type quark tower of the covariant Standard Model carried by a Standard Model is @@ -1131,7 +1131,7 @@ lemma toCovAlgebraRealization_covD (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 have hb : h.toCovAlgebraRealization.covD i l φ = h.toAlgHom (AlgebraRealization.id.covDerivD i l φ) := rfl rw [hb] - exact IsGaugeField.covDerivIter_map' h.toAlgHom h.toAlgHom_id_A + exact GaugeAlgebraRealization.covDerivIter_map' h.toAlgHom h.toAlgHom_id_A (F := AlgebraRealization.id.d i ) (F' := h.d i ) (fun s χ => rfl) n l 0 φ /-- The conjugate down-type quark tower of the covariant Standard Model carried by a Standard @@ -1143,7 +1143,7 @@ lemma toCovAlgebraRealization_covBarD (i : Fin 3) {n : ℕ} (l : Fin n → (Fin have hb : h.toCovAlgebraRealization.covBarD i l φ = h.toAlgHom (AlgebraRealization.id.covDerivBarD i l φ) := rfl rw [hb] - exact IsGaugeField.covDerivIter_map' h.toAlgHom h.toAlgHom_id_A + exact GaugeAlgebraRealization.covDerivIter_map' h.toAlgHom h.toAlgHom_id_A (F := AlgebraRealization.id.bard i ) (F' := h.bard i ) (fun s χ => rfl) n l 0 φ /-- The up-type quark tower of the covariant Standard Model carried by a Standard Model is its @@ -1155,7 +1155,7 @@ lemma toCovAlgebraRealization_covU (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 have hb : h.toCovAlgebraRealization.covU i l φ = h.toAlgHom (AlgebraRealization.id.covDerivU i l φ) := rfl rw [hb] - exact IsGaugeField.covDerivIter_map' h.toAlgHom h.toAlgHom_id_A + exact GaugeAlgebraRealization.covDerivIter_map' h.toAlgHom h.toAlgHom_id_A (F := AlgebraRealization.id.u i ) (F' := h.u i ) (fun s χ => rfl) n l 0 φ /-- The conjugate up-type quark tower of the covariant Standard Model carried by a Standard @@ -1167,7 +1167,7 @@ lemma toCovAlgebraRealization_covBarU (i : Fin 3) {n : ℕ} (l : Fin n → (Fin have hb : h.toCovAlgebraRealization.covBarU i l φ = h.toAlgHom (AlgebraRealization.id.covDerivBarU i l φ) := rfl rw [hb] - exact IsGaugeField.covDerivIter_map' h.toAlgHom h.toAlgHom_id_A + exact GaugeAlgebraRealization.covDerivIter_map' h.toAlgHom h.toAlgHom_id_A (F := AlgebraRealization.id.baru i ) (F' := h.baru i ) (fun s χ => rfl) n l 0 φ /-- The quark doublet tower of the covariant Standard Model carried by a Standard Model is its @@ -1179,7 +1179,7 @@ lemma toCovAlgebraRealization_covQ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 have hb : h.toCovAlgebraRealization.covQ i l φ = h.toAlgHom (AlgebraRealization.id.covDerivQ i l φ) := rfl rw [hb] - exact IsGaugeField.covDerivIter_map' h.toAlgHom h.toAlgHom_id_A + exact GaugeAlgebraRealization.covDerivIter_map' h.toAlgHom h.toAlgHom_id_A (F := AlgebraRealization.id.Q i ) (F' := h.Q i ) (fun s χ => rfl) n l 0 φ /-- The conjugate quark doublet tower of the covariant Standard Model carried by a Standard @@ -1191,7 +1191,7 @@ lemma toCovAlgebraRealization_covBarQ (i : Fin 3) {n : ℕ} (l : Fin n → (Fin have hb : h.toCovAlgebraRealization.covBarQ i l φ = h.toAlgHom (AlgebraRealization.id.covDerivBarQ i l φ) := rfl rw [hb] - exact IsGaugeField.covDerivIter_map' h.toAlgHom h.toAlgHom_id_A + exact GaugeAlgebraRealization.covDerivIter_map' h.toAlgHom h.toAlgHom_id_A (F := AlgebraRealization.id.barQ i ) (F' := h.barQ i ) (fun s χ => rfl) n l 0 φ /-- The lepton doublet tower of the covariant Standard Model carried by a Standard Model is @@ -1203,7 +1203,7 @@ lemma toCovAlgebraRealization_covL (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 have hb : h.toCovAlgebraRealization.covL i l φ = h.toAlgHom (AlgebraRealization.id.covDerivL i l φ) := rfl rw [hb] - exact IsGaugeField.covDerivIter_map' h.toAlgHom h.toAlgHom_id_A + exact GaugeAlgebraRealization.covDerivIter_map' h.toAlgHom h.toAlgHom_id_A (F := AlgebraRealization.id.L i ) (F' := h.L i ) (fun s χ => rfl) n l 0 φ /-- The conjugate lepton doublet tower of the covariant Standard Model carried by a Standard @@ -1215,7 +1215,7 @@ lemma toCovAlgebraRealization_covBarL (i : Fin 3) {n : ℕ} (l : Fin n → (Fin have hb : h.toCovAlgebraRealization.covBarL i l φ = h.toAlgHom (AlgebraRealization.id.covDerivBarL i l φ) := rfl rw [hb] - exact IsGaugeField.covDerivIter_map' h.toAlgHom h.toAlgHom_id_A + exact GaugeAlgebraRealization.covDerivIter_map' h.toAlgHom h.toAlgHom_id_A (F := AlgebraRealization.id.barL i ) (F' := h.barL i ) (fun s χ => rfl) n l 0 φ /-- The charged-lepton singlet tower of the covariant Standard Model carried by a Standard @@ -1227,7 +1227,7 @@ lemma toCovAlgebraRealization_covE (i : Fin 3) {n : ℕ} (l : Fin n → (Fin 1 have hb : h.toCovAlgebraRealization.covE i l φ = h.toAlgHom (AlgebraRealization.id.covDerivE i l φ) := rfl rw [hb] - exact IsGaugeField.covDerivIter_map' h.toAlgHom h.toAlgHom_id_A + exact GaugeAlgebraRealization.covDerivIter_map' h.toAlgHom h.toAlgHom_id_A (F := AlgebraRealization.id.e i ) (F' := h.e i ) (fun s χ => rfl) n l 0 φ /-- The conjugate charged-lepton singlet tower of the covariant Standard Model carried by a @@ -1239,7 +1239,7 @@ lemma toCovAlgebraRealization_covBarE (i : Fin 3) {n : ℕ} (l : Fin n → (Fin have hb : h.toCovAlgebraRealization.covBarE i l φ = h.toAlgHom (AlgebraRealization.id.covDerivBarE i l φ) := rfl rw [hb] - exact IsGaugeField.covDerivIter_map' h.toAlgHom h.toAlgHom_id_A + exact GaugeAlgebraRealization.covDerivIter_map' h.toAlgHom h.toAlgHom_id_A (F := AlgebraRealization.id.bare i ) (F' := h.bare i ) (fun s χ => rfl) n l 0 φ end AlgebraRealization diff --git a/Physlib/Particles/StandardModel/Fermions/DownSinglet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/DownSinglet/GaugeAlgebraAction.lean index cabff27a4..64831cefb 100644 --- a/Physlib/Particles/StandardModel/Fermions/DownSinglet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/DownSinglet/GaugeAlgebraAction.lean @@ -106,7 +106,7 @@ noncomputable def actionMatrix (c : GaugeAlgebra) : Matrix (Fin 3) (Fin 3) ℂ : /-- **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 + covariant derivative `GaugeAlgebraRealization.covDerivIter` and by `LocalGaugeData.IsInfinitesimalActionOf`. -/ noncomputable def gaugeAlgebraAction : GaugeAlgebra →ₗ[ℝ] DownSinglet →ₗ[ℂ] DownSinglet where @@ -437,12 +437,12 @@ set_option maxHeartbeats 1000000 in 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 + GaugeAlgebraRealization.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 + rw [show GaugeAlgebraRealization.repCoeff repJetGaugeGroupI U x d = jetEval (jetIteratedDeriv x (repJetGaugeGroupI U (jetOfConstant d))) from rfl, valLinEquiv_jetEval, jetValLinEquiv_jetIteratedDeriv, @@ -508,7 +508,7 @@ lemma colourEnd_one : colourEnd 1 = LinearMap.id := by /-- 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 + GaugeAlgebraRealization.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) diff --git a/Physlib/Particles/StandardModel/Fermions/JetAlgebra/Species.lean b/Physlib/Particles/StandardModel/Fermions/JetAlgebra/Species.lean index ee46a8c0e..5e1517925 100644 --- a/Physlib/Particles/StandardModel/Fermions/JetAlgebra/Species.lean +++ b/Physlib/Particles/StandardModel/Fermions/JetAlgebra/Species.lean @@ -22,7 +22,7 @@ Everything rests on one fact: both actions on `FermionSpace` are species-diagona jet gauge action through `FermionSpace.jetActionMap`, the Lorentz action through `Representation.pi` and `Representation.prod`. So each projection `FermionSpace →ₗ[ℂ] Species` intertwines the total action with the species' own, and hence -also the base-point Taylor coefficients `IsGaugeField.repCoeff` of the two. +also the base-point Taylor coefficients `GaugeAlgebraRealization.repCoeff` of the two. The third bridge runs the other way. Component functions are covectors, and a covector on the species pulls back along the projection to a covector on `FermionSpace`; since @@ -127,8 +127,8 @@ lemma repCoeff_comp {repV : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] (hp : ∀ U : JetGaugeGroupI, (LinearMap.lTensor JetRing p).comp (repV U) = (repW U).comp (LinearMap.lTensor JetRing p)) (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) : - p.comp (IsGaugeField.repCoeff repV U s) - = (IsGaugeField.repCoeff repW U s).comp p := by + p.comp (GaugeAlgebraRealization.repCoeff repV U s) + = (GaugeAlgebraRealization.repCoeff repW U s).comp p := by refine LinearMap.ext fun v => ?_ have h1 := LinearMap.congr_fun (lTensor_comp_jetOfConstant p) v have h2 := LinearMap.congr_fun (hp U) (jetOfConstant v) @@ -137,7 +137,7 @@ lemma repCoeff_comp {repV : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] have h4 := LinearMap.congr_fun (jetEval_comp_lTensor p) (jetIteratedDeriv s (repV U (jetOfConstant v))) simp only [LinearMap.comp_apply] at h1 h2 h3 h4 ⊢ - simp only [IsGaugeField.repCoeff, LinearMap.comp_apply] + simp only [GaugeAlgebraRealization.repCoeff, LinearMap.comp_apply] rw [← h4, h3, h2, h1] /-- The transposed form of `repCoeff_comp`: the dual coefficients, which act on the @@ -147,8 +147,8 @@ lemma repDualCoeff_comp {repV : Representation ℂ JetGaugeGroupI (JetRing ⊗[ (hp : ∀ U : JetGaugeGroupI, (LinearMap.lTensor JetRing p).comp (repV U) = (repW U).comp (LinearMap.lTensor JetRing p)) (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) : - (IsGaugeField.repDualCoeff repV U s).comp (Module.Dual.transpose p) - = (Module.Dual.transpose p).comp (IsGaugeField.repDualCoeff repW U s) := + (GaugeAlgebraRealization.repDualCoeff repV U s).comp (Module.Dual.transpose p) + = (Module.Dual.transpose p).comp (GaugeAlgebraRealization.repDualCoeff repW U s) := LinearMap.ext fun φ => LinearMap.ext fun v => congrArg φ (LinearMap.congr_fun (repCoeff_comp p hp U s) v) @@ -319,40 +319,45 @@ lemma lTensor_downSingletProj_repJetGaugeGroupI (i : Fin 3) (U : JetGaugeGroupI) the total jet gauge action with those of the lepton doublet's own. -/ lemma leptonDoubletProj_comp_repCoeff (i : Fin 3) (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) : - (leptonDoubletProj i).comp (IsGaugeField.repCoeff repJetGaugeGroupI U s) - = (IsGaugeField.repCoeff LeptonDoublet.repJetGaugeGroupI U s).comp (leptonDoubletProj i) := + (leptonDoubletProj i).comp (GaugeAlgebraRealization.repCoeff repJetGaugeGroupI U s) + = (GaugeAlgebraRealization.repCoeff LeptonDoublet.repJetGaugeGroupI U s).comp + (leptonDoubletProj i) := repCoeff_comp _ (lTensor_leptonDoubletProj_repJetGaugeGroupI i) U s /-- The charged-lepton-singlet projection intertwines the base-point Taylor coefficients of the total jet gauge action with those of the charged-lepton singlet's own. -/ lemma leptonSingletProj_comp_repCoeff (i : Fin 3) (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) : - (leptonSingletProj i).comp (IsGaugeField.repCoeff repJetGaugeGroupI U s) - = (IsGaugeField.repCoeff LeptonSinglet.repJetGaugeGroupI U s).comp (leptonSingletProj i) := + (leptonSingletProj i).comp (GaugeAlgebraRealization.repCoeff repJetGaugeGroupI U s) + = (GaugeAlgebraRealization.repCoeff LeptonSinglet.repJetGaugeGroupI U s).comp + (leptonSingletProj i) := repCoeff_comp _ (lTensor_leptonSingletProj_repJetGaugeGroupI i) U s /-- The quark-doublet projection intertwines the base-point Taylor coefficients of the total jet gauge action with those of the quark doublet's own. -/ lemma quarkDoubletProj_comp_repCoeff (i : Fin 3) (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) : - (quarkDoubletProj i).comp (IsGaugeField.repCoeff repJetGaugeGroupI U s) - = (IsGaugeField.repCoeff QuarkDoublet.repJetGaugeGroupI U s).comp (quarkDoubletProj i) := + (quarkDoubletProj i).comp (GaugeAlgebraRealization.repCoeff repJetGaugeGroupI U s) + = (GaugeAlgebraRealization.repCoeff QuarkDoublet.repJetGaugeGroupI U s).comp + (quarkDoubletProj i) := repCoeff_comp _ (lTensor_quarkDoubletProj_repJetGaugeGroupI i) U s /-- The up-type-quark-singlet projection intertwines the base-point Taylor coefficients of the total jet gauge action with those of the up-type quark singlet's own. -/ lemma upSingletProj_comp_repCoeff (i : Fin 3) (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) : - (upSingletProj i).comp (IsGaugeField.repCoeff repJetGaugeGroupI U s) - = (IsGaugeField.repCoeff UpSinglet.repJetGaugeGroupI U s).comp (upSingletProj i) := + (upSingletProj i).comp (GaugeAlgebraRealization.repCoeff repJetGaugeGroupI U s) + = (GaugeAlgebraRealization.repCoeff UpSinglet.repJetGaugeGroupI U s).comp + (upSingletProj i) := repCoeff_comp _ (lTensor_upSingletProj_repJetGaugeGroupI i) U s /-- The down-type-quark-singlet projection intertwines the base-point Taylor coefficients of the total jet gauge action with those of the down-type quark singlet's own. -/ lemma downSingletProj_comp_repCoeff (i : Fin 3) (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) : - (downSingletProj i).comp (IsGaugeField.repCoeff repJetGaugeGroupI U s) - = (IsGaugeField.repCoeff DownSinglet.repJetGaugeGroupI U s).comp (downSingletProj i) := + (downSingletProj i).comp (GaugeAlgebraRealization.repCoeff repJetGaugeGroupI U s) + = (GaugeAlgebraRealization.repCoeff DownSinglet.repJetGaugeGroupI U s).comp + (downSingletProj i) := repCoeff_comp _ (lTensor_downSingletProj_repJetGaugeGroupI i) U s /-! diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean index 113eb1ca8..2b40db79b 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean @@ -113,7 +113,7 @@ noncomputable def actionMatrix (c : GaugeAlgebra) : Matrix (Fin 2) (Fin 2) ℂ : /-- **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 + covariant derivative `GaugeAlgebraRealization.covDerivIter` and by `LocalGaugeData.IsInfinitesimalActionOf`. -/ noncomputable def gaugeAlgebraAction : GaugeAlgebra →ₗ[ℝ] LeptonDoublet →ₗ[ℂ] LeptonDoublet where @@ -450,12 +450,12 @@ set_option maxHeartbeats 1000000 in 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 + GaugeAlgebraRealization.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 + rw [show GaugeAlgebraRealization.repCoeff repJetGaugeGroupI U x d = jetEval (jetIteratedDeriv x (repJetGaugeGroupI U (jetOfConstant d))) from rfl, valLinEquiv_jetEval, jetValLinEquiv_jetIteratedDeriv, @@ -522,7 +522,7 @@ lemma weakEnd_one : weakEnd 1 = LinearMap.id := by /-- 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 + GaugeAlgebraRealization.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) diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/GaugeAlgebraAction.lean index df2e0d42d..aa6d1e76f 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/GaugeAlgebraAction.lean @@ -176,11 +176,11 @@ private lemma sum_map_smul_id {α : Type*} (m : Multiset α) (z : α → ℂ) : 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 + GaugeAlgebraRealization.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 + rw [show GaugeAlgebraRealization.repCoeff repJetGaugeGroupI U x l = jetEval (jetIteratedDeriv x (repJetGaugeGroupI U (jetOfConstant l))) from rfl, jetOfConstant_apply, repJetGaugeGroupI_tmul, mul_one, @@ -190,7 +190,7 @@ lemma repCoeff_eq (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : /-- 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 + GaugeAlgebraRealization.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, @@ -285,7 +285,7 @@ theorem isInfinitesimalActionOf : simp only [localGaugeData_adjointCoeff_apply] have hterm : ∀ p : Multiset (Fin 1 ⊕ Fin 3) × Multiset (Fin 1 ⊕ Fin 3), gaugeAlgebraAction (localGaugeData.adjointCoeff U p.1 c) - ∘ₗ IsGaugeField.repCoeff repJetGaugeGroupI U p.2 + ∘ₗ GaugeAlgebraRealization.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))) diff --git a/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/GaugeAlgebraAction.lean index 10c4e0f26..b79b89a4f 100644 --- a/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/GaugeAlgebraAction.lean @@ -133,7 +133,7 @@ noncomputable def actionMatrix (c : GaugeAlgebra) : /-- **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 + covariant derivative `GaugeAlgebraRealization.covDerivIter` and by `LocalGaugeData.IsInfinitesimalActionOf`. -/ noncomputable def gaugeAlgebraAction : GaugeAlgebra →ₗ[ℝ] QuarkDoublet →ₗ[ℂ] QuarkDoublet where @@ -524,12 +524,12 @@ set_option maxHeartbeats 1000000 in 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 + GaugeAlgebraRealization.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 + rw [show GaugeAlgebraRealization.repCoeff repJetGaugeGroupI U x d = jetEval (jetIteratedDeriv x (repJetGaugeGroupI U (jetOfConstant d))) from rfl, colourWeakValLinEquiv_jetEval, jetValLinEquiv_jetIteratedDeriv, @@ -625,7 +625,7 @@ lemma colourWeakEnd_one : colourWeakEnd 1 = LinearMap.id := by /-- 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 + GaugeAlgebraRealization.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) diff --git a/Physlib/Particles/StandardModel/Fermions/UpSinglet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/UpSinglet/GaugeAlgebraAction.lean index 3025fc764..985227703 100644 --- a/Physlib/Particles/StandardModel/Fermions/UpSinglet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/UpSinglet/GaugeAlgebraAction.lean @@ -114,7 +114,7 @@ noncomputable def actionMatrix (c : GaugeAlgebra) : Matrix (Fin 3) (Fin 3) ℂ : /-- **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 + covariant derivative `GaugeAlgebraRealization.covDerivIter` and by `LocalGaugeData.IsInfinitesimalActionOf`. -/ noncomputable def gaugeAlgebraAction : GaugeAlgebra →ₗ[ℝ] UpSinglet →ₗ[ℂ] UpSinglet where @@ -430,12 +430,12 @@ set_option maxHeartbeats 1000000 in 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 + GaugeAlgebraRealization.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 + rw [show GaugeAlgebraRealization.repCoeff repJetGaugeGroupI U x d = jetEval (jetIteratedDeriv x (repJetGaugeGroupI U (jetOfConstant d))) from rfl, valLinEquiv_jetEval, jetValLinEquiv_jetIteratedDeriv, @@ -504,7 +504,7 @@ lemma colourEnd_one : colourEnd 1 = LinearMap.id := by /-- 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 + GaugeAlgebraRealization.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) diff --git a/Physlib/Particles/StandardModel/HiggsBoson/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/HiggsBoson/GaugeAlgebraAction.lean index 7b1a270a7..2de6272c6 100644 --- a/Physlib/Particles/StandardModel/HiggsBoson/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/HiggsBoson/GaugeAlgebraAction.lean @@ -104,7 +104,7 @@ noncomputable def actionMatrix (c : GaugeAlgebra) : Matrix (Fin 2) (Fin 2) ℂ : /-- **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 + covariant derivative `GaugeAlgebraRealization.covDerivIter` and by `LocalGaugeData.IsInfinitesimalActionOf`. -/ noncomputable def gaugeAlgebraAction : GaugeAlgebra →ₗ[ℝ] HiggsVec →ₗ[ℂ] HiggsVec where @@ -378,11 +378,11 @@ set_option maxHeartbeats 1000000 in 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 + GaugeAlgebraRealization.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 + rw [show GaugeAlgebraRealization.repCoeff repJetGaugeGroupI U x v = jetEval (jetIteratedDeriv x (repJetGaugeGroupI U (jetOfConstant v))) from rfl, jetEval_eq, jetValLinEquiv_jetIteratedDeriv, repJetGaugeGroupI_apply, @@ -417,7 +417,7 @@ lemma weakEnd_one : weakEnd 1 = LinearMap.id := by /-- 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 + GaugeAlgebraRealization.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) diff --git a/Physlib/Particles/StandardModel/JetAlgebra/CovJetAlgebra/Basic.lean b/Physlib/Particles/StandardModel/JetAlgebra/CovJetAlgebra/Basic.lean index 1653d04e7..5266b1e0e 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/CovJetAlgebra/Basic.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/CovJetAlgebra/Basic.lean @@ -277,7 +277,7 @@ include h in tower to a tower of the same shape at a rotated value index, and it is multiplicative. -/ lemma repGlobal_mem_covAlgebra (g : GaugeGroupI) {x : B} (hx : x ∈ h.covAlgebra) : repGlobal repJet g x ∈ h.covAlgebra := - h.mapsTo_covAlgebra (h.repGlobal_one g) (h.repJet_A.gauge_mul _) + h.mapsTo_covAlgebra (h.repGlobal_one g) (h.gaugeRealization.gauge_mul _) (h.covGenerators_induction (fun l μ ν φ => by rw [h.repGlobal_covF]; exact h.covF_mem_covAlgebra _ _ _ _) diff --git a/Physlib/Particles/StandardModel/JetAlgebra/Invariants.lean b/Physlib/Particles/StandardModel/JetAlgebra/Invariants.lean index 9c6b744f2..20053d4e9 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/Invariants.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/Invariants.lean @@ -7,7 +7,7 @@ module public import Physlib.Particles.StandardModel.JetAlgebra.LorentzAction public import Physlib.Particles.StandardModel.JetAlgebra.GaugeAction -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.Invariants +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.Symmetrized public import Physlib.Particles.StandardModel.GaugeGroup.MaurerCartan.Freeness /-! # Gauge invariants of the jet algebra of the Standard Model @@ -32,7 +32,8 @@ 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.gaugeRealization` : the jet algebra of the Standard Model realizes the + gauge-boson jet algebra. - `JetAlgebra.invariant_mem_adjoin_fieldStrength` : the classification of gauge invariants. @@ -42,7 +43,7 @@ derivatives. - A.1. The gauge-field generators - A.2. Iterated derivatives through the gauge inclusion - A.3. Centrality -- B. The `IsGaugeField` instance +- B. The gauge realization - C. The classification of gauge invariants -/ @@ -131,6 +132,8 @@ lemma includeGauge_mem_center (y : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) noncomputable def gaugeRealization : GaugeAlgebraRealization localGaugeData JetAlgebra repJetGaugeGroupI repLorentzGroup where toAlgHom := includeGauge + A := gaugeField + A_eq _ _ _ := rfl map_repJet U y := (repJetGaugeGroupI_includeGauge U y).symm map_repLorentz Λ y := (repLorentzGroup_includeGauge Λ y).symm repJet_mul := repJetGaugeGroupI_apply_mul @@ -138,15 +141,6 @@ noncomputable def gaugeRealization : lemma gaugeRealization_A : gaugeRealization.A = gaugeField := rfl -/-- The jet algebra of the Standard Model is a gauge field: its gauge-field 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 realization `gaugeRealization`. -/ -theorem isGaugeField : - IsGaugeField localGaugeData (B := JetAlgebra) repLorentzGroup repJetGaugeGroupI gaugeField := - gaugeRealization_A ▸ gaugeRealization.isGaugeField - /-! ## C. The classification of gauge invariants @@ -173,13 +167,9 @@ theorem invariant_mem_adjoin_fieldStrength (S : Set JetAlgebra) x ∈ Algebra.adjoin ℂ ({b : JetAlgebra | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), - b = IsGaugeField.iteratedCovDerivAdjoint gaugeField l - (IsGaugeField.fieldStrength gaugeField ν lam) 0 φ} ∪ S) := - IsGaugeField.invariant_mem_adjoin_fieldStrength isGaugeField - (fun _ q _ ν _ ψ => - Subring.mem_center_iff.mp - (includeGauge_mem_center ((GaugeJetAlgebra.gaugeField GaugeAlgebra) q ν ψ)) _) - S + b = GaugeAlgebraRealization.iteratedCovDerivAdjoint gaugeField l + (GaugeAlgebraRealization.fieldStrength gaugeField ν lam) 0 φ} ∪ S) := + GaugeAlgebraRealization.invariant_mem_adjoin_fieldStrength gaugeRealization S (fun p μ φ y _ => Subring.mem_center_iff.mp (includeGauge_mem_center ((GaugeJetAlgebra.gaugeField GaugeAlgebra) p μ φ)) y) diff --git a/Physlib/Particles/StandardModel/JetAlgebra/Realization.lean b/Physlib/Particles/StandardModel/JetAlgebra/Realization.lean index 3b142e2ea..e9679f173 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/Realization.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/Realization.lean @@ -58,7 +58,7 @@ noncomputable def id : AlgebraRealization JetAlgebra JetAlgebra.repJetGaugeGroup map_repLorentz _ _ := rfl map_massWeight x := by simp [Polynomial.mapAlgHom] - repJet_mul := JetAlgebra.isGaugeField.gauge_mul + repJet_mul := JetAlgebra.repJetGaugeGroupI_apply_mul repLorentz_mul := JetAlgebra.repLorentzGroup_apply_mul end AlgebraRealization diff --git a/Physlib/Particles/StandardModel/JetAlgebra/TransformsIn.lean b/Physlib/Particles/StandardModel/JetAlgebra/TransformsIn.lean index 52566b2a6..404672d0c 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/TransformsIn.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/TransformsIn.lean @@ -268,16 +268,18 @@ private lemma repDualCoeff_repConj_transpose {V W : Type} [AddCommGroup V] [Modu {repV : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)} {repW : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] W)} (p : V →ₗ[ℂ] W) (hp : ∀ (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)), - p.comp (IsGaugeField.repCoeff repV U s) = (IsGaugeField.repCoeff repW U s).comp p) + p.comp (GaugeAlgebraRealization.repCoeff repV U s) + = (GaugeAlgebraRealization.repCoeff repW U s).comp p) (U : JetGaugeGroupI) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule W)) : - IsGaugeField.repDualCoeff (JetComponentSpace.repConj repV) U s + GaugeAlgebraRealization.repDualCoeff (JetComponentSpace.repConj repV) U s (Module.Dual.transpose (ConjModule.map p) φ) = Module.Dual.transpose (ConjModule.map p) - (IsGaugeField.repDualCoeff (JetComponentSpace.repConj repW) U s φ) := by + (GaugeAlgebraRealization.repDualCoeff (JetComponentSpace.repConj repW) U s φ) := by refine LinearMap.ext fun v => ?_ - show φ (ConjModule.map p (IsGaugeField.repCoeff (JetComponentSpace.repConj repV) U s v)) - = φ (IsGaugeField.repCoeff (JetComponentSpace.repConj repW) U s (ConjModule.map p v)) + show φ (ConjModule.map p + (GaugeAlgebraRealization.repCoeff (JetComponentSpace.repConj repV) U s v)) + = φ (GaugeAlgebraRealization.repCoeff (JetComponentSpace.repConj repW) U s (ConjModule.map p v)) rw [LocalGaugeData.repCoeff_repConj, LocalGaugeData.repCoeff_repConj] exact congrArg φ (LinearMap.congr_fun (hp U s) v) diff --git a/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/TransformsIn.lean b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/TransformsIn.lean index 7c8f46d20..1780cff43 100644 --- a/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/TransformsIn.lean +++ b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/TransformsIn.lean @@ -16,9 +16,10 @@ public import Physlib.ClassicalFieldTheory.JetAlgebra.JetComponentSpace.Transfor `BosonicAlgebra.repJetGaugeGroupI_ofField` records that the undifferentiated generator `ψ_φ` transforms by the value of the gauge transformation at the base point. Its derivatives do not: a jet of gauge transformations mixes `∂_s ψ_φ` with the lower generators -`∂_{s₂} ψ_φ`, weighted by the base-point Taylor coefficients `IsGaugeField.repDualCoeff` of -the gauge jet at the complementary multiset `s₁`. This file proves that all-orders Leibniz -law, in the form `LocalGaugeData.TransformsIn` demands. +`∂_{s₂} ψ_φ`, weighted by the base-point Taylor coefficients +`GaugeAlgebraRealization.repDualCoeff` of the gauge jet at the complementary multiset `s₁`. +This file proves that all-orders Leibniz law, in the form `LocalGaugeData.TransformsIn` +demands. All the work is in `StandardModel.repDual_basis_tmul`, the corresponding statement on the jet component space. The symmetric algebra contributes only linearity: the generators are @@ -117,7 +118,8 @@ lemma repJetGaugeGroupI_iteratedJetDeriv_ofField (U : JetGaugeGroupI) (φ : Module.Dual ℂ V) (s : Multiset (Fin 1 ⊕ Fin 3)) : repJetGaugeGroupI rep hlin U (iteratedJetDeriv s (ofField φ)) = (s.antidiagonal.map fun p => - iteratedJetDeriv p.2 (ofField (IsGaugeField.repDualCoeff rep U⁻¹ p.1 φ))).sum := by + iteratedJetDeriv p.2 + (ofField (GaugeAlgebraRealization.repDualCoeff rep U⁻¹ p.1 φ))).sum := by rw [iteratedJetDeriv_ofField, repJetGaugeGroupI_ι, show JetComponentSpace.repJet rep hlin U ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace V) @@ -159,7 +161,8 @@ lemma repJetGaugeGroupI_iteratedJetDeriv_ofConjField (s.antidiagonal.map fun p => iteratedJetDeriv p.2 (ofConjField - (IsGaugeField.repDualCoeff (JetComponentSpace.repConj rep) U⁻¹ p.1 φ))).sum := by + (GaugeAlgebraRealization.repDualCoeff (JetComponentSpace.repConj rep) U⁻¹ p.1 + φ))).sum := by rw [iteratedJetDeriv_ofConjField, repJetGaugeGroupI_ι, show JetComponentSpace.repJet rep hlin U ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace V) diff --git a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/TransformsIn.lean b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/TransformsIn.lean index 73a913f9a..5f3d3a758 100644 --- a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/TransformsIn.lean +++ b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/TransformsIn.lean @@ -16,9 +16,10 @@ public import Physlib.ClassicalFieldTheory.JetAlgebra.JetComponentSpace.Transfor `FermionicAlgebra.repJetGaugeGroupI_ofField` records that the undifferentiated generator `ψ_φ` transforms by the value of the gauge transformation at the base point. Its derivatives do not: a jet of gauge transformations mixes `∂_s ψ_φ` with the lower generators -`∂_{s₂} ψ_φ`, weighted by the base-point Taylor coefficients `IsGaugeField.repDualCoeff` of -the gauge jet at the complementary multiset `s₁`. This file proves that all-orders Leibniz -law, in the form `LocalGaugeData.TransformsIn` demands. +`∂_{s₂} ψ_φ`, weighted by the base-point Taylor coefficients +`GaugeAlgebraRealization.repDualCoeff` of the gauge jet at the complementary multiset `s₁`. +This file proves that all-orders Leibniz law, in the form `LocalGaugeData.TransformsIn` +demands. All the work is in `StandardModel.repDual_basis_tmul`, the corresponding statement on the jet component space. The exterior algebra contributes only linearity: the generators are @@ -115,7 +116,8 @@ lemma repJetGaugeGroupI_iteratedJetDeriv_ofField (U : JetGaugeGroupI) (φ : Module.Dual ℂ V) (s : Multiset (Fin 1 ⊕ Fin 3)) : repJetGaugeGroupI rep hlin U (iteratedJetDeriv s (ofField φ)) = (s.antidiagonal.map fun p => - iteratedJetDeriv p.2 (ofField (IsGaugeField.repDualCoeff rep U⁻¹ p.1 φ))).sum := by + iteratedJetDeriv p.2 + (ofField (GaugeAlgebraRealization.repDualCoeff rep U⁻¹ p.1 φ))).sum := by rw [iteratedJetDeriv_ofField, repJetGaugeGroupI_ι, show JetComponentSpace.repJet rep hlin U ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace V) @@ -157,7 +159,8 @@ lemma repJetGaugeGroupI_iteratedJetDeriv_ofConjField (s.antidiagonal.map fun p => iteratedJetDeriv p.2 (ofConjField - (IsGaugeField.repDualCoeff (JetComponentSpace.repConj rep) U⁻¹ p.1 φ))).sum := by + (GaugeAlgebraRealization.repDualCoeff (JetComponentSpace.repConj rep) U⁻¹ p.1 + φ))).sum := by rw [iteratedJetDeriv_ofConjField, repJetGaugeGroupI_ι, show JetComponentSpace.repJet rep hlin U ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace V) diff --git a/Physlib/Relativity/IsLorentzDeriv.lean b/Physlib/Relativity/IsLorentzDeriv.lean index fcdd2207e..3186c1477 100644 --- a/Physlib/Relativity/IsLorentzDeriv.lean +++ b/Physlib/Relativity/IsLorentzDeriv.lean @@ -129,7 +129,7 @@ class IsLorentzDeriv {M : Type} [AddCommMonoid M] [Module ℂ M] 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 + general form of the Lorentz law `GaugeAlgebraRealization.lorentz_apply`, 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₀^{Λ^{-⊤} φ}`. -/ From dfb659dfcfa47c8d6bac3edf9f109fc1c550daba Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 9 Sep 2026 09:37:43 +0100 Subject: [PATCH 309/367] refactor: Fix build, move around results. --- Physlib.lean | 13 +- .../GaugeTheory/GaugeBoson/Basic.lean | 206 ++++++++++++++++++ .../GaugeBoson/GaugeJetAlgebra/Basic.lean | 191 ++-------------- .../GaugeTheory/Matter/Charge.lean | 23 +- .../GaugeTheory/MatterField/Basic.lean | 1 + .../GaugeTheory/MatterField/Prod.lean | 186 ++++++++++++++++ .../ClassicalFieldTheory/JetAlgebra/Jet.lean | 72 ++++++ .../Particles/StandardModel/FieldData.lean | 5 +- 8 files changed, 506 insertions(+), 191 deletions(-) create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Basic.lean create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Prod.lean diff --git a/Physlib.lean b/Physlib.lean index 0ea97e642..97dca6c6d 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -1,17 +1,17 @@ module -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.Basic -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.FieldStrength -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.GaugeLaw -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.Symmetrized -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.Symmetrized -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.TransformsInAdjoint +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.GaugeAction public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.GaugeField public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.JetDeriv public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.LorentzAction public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.MassDim +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.FieldStrength +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.GaugeLaw +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.Symmetrized +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.TransformsInAdjoint public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.AdjointCoeff public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction @@ -21,6 +21,7 @@ public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Truncation public import Physlib.ClassicalFieldTheory.GaugeTheory.Matter.Charge public import Physlib.ClassicalFieldTheory.GaugeTheory.Matter.CovariantDeriv public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.Prod public import Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.Basic public import Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.ConstantGaugeAction public import Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.GaugeAction diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Basic.lean new file mode 100644 index 000000000..61193da41 --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Basic.lean @@ -0,0 +1,206 @@ +/- +Copyright (c) 2026 Joseph Tooby-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.DerivAlgebra +public import Mathlib.LinearAlgebra.Dual.Lemmas +/-! +# The gauge-boson field 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 ⊗[ℝ] 𝔤`: a spacetime covector with values in the gauge +algebra. Its components are the fields `A_μ^a`, but **no basis of the gauge algebra is +chosen**: the adjoint index is carried by an abstract covector `φ : Module.Dual ℝ 𝔤` +throughout. + +This file is the target space alone — its linear structure, the Lorentz action, the +global gauge action, and the jet component space spanned by the component functions +`∂_s A_μ^φ`. The jet algebra built on it, and the actions and gradings it carries, are in +`Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra`. For the Standard +Model, `𝔤` is `StandardModel.GaugeAlgebra`. + +## ii. Key results + +- `GaugeBoson` : the target space of the gauge-boson field. +- `GaugeBoson.repLorentzGroup` : the Lorentz action on the target space. +- `GaugeBoson.repValue` : the global gauge action on the target space, from a + representation of the value group. +- `GaugeBoson.JetComponentSpace` : the span of the component functions `∂_s A_μ^φ`. +- `GaugeBoson.componentDual` : the covector picking out a spacetime and an adjoint index. + +## 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 + +-/ + +@[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 + 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] + +end GaugeBoson diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/Basic.lean index 2172779c6..99f67f4f0 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/Basic.lean @@ -5,6 +5,7 @@ Authors: Joseph Tooby-Smith -/ module +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Basic public import Physlib.Relativity.DerivAlgebra public import Physlib.Mathematics.SymmetricAlgebra @@ -15,19 +16,20 @@ public import Mathlib.LinearAlgebra.Dual.Lemmas ## 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 +The gauge bosons of a gauge theory with Lie algebra `𝔤` are jointly one bosonic field +valued in `Lorentz.CoVector ⊗[ℝ] 𝔤`, the target space `GaugeBoson 𝔤` of +`Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Basic`. 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_μ^φ`, 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 ℝ 𝔤` throughout, +following the dual-family formulation of `Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization`. For the Standard Model, `𝔤` is `StandardModel.GaugeAlgebra`. 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; +1. this file — the jet algebra with its generators, over the target space and jet + component space of `GaugeBoson.Basic`; 2. `LorentzAction` — the action of the Lorentz group; 3. `GaugeAction` — the action of the jet gauge group; 4. `JetDeriv` — the formal total derivative; @@ -35,24 +37,13 @@ Following the split promised for this directory, the structure is: ## ii. Key results -- `GaugeBoson` : the target space of the gauge-boson field. -- `GaugeBoson.repLorentzGroup` : the Lorentz action on the target space. -- `GaugeBoson.repValue` : the global gauge action on the target space, from a - representation of the value group. -- `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 +- A. The jet algebra + - A.1. The generators -/ @@ -65,162 +56,10 @@ 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 +## A. The jet algebra -/ @@ -235,7 +74,7 @@ namespace GaugeJetAlgebra /-! -### C.1. The generators +### A.1. The generators -/ diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/Matter/Charge.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/Matter/Charge.lean index 9fbf0587c..df829b5b2 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/Matter/Charge.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/Matter/Charge.lean @@ -21,7 +21,8 @@ a mass weight into a matter field for the jet gauge group `unitary JetRing` of ` - `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`. +- `MatterField.charged` : the matter field of charge `n`, over a supplied + infinitesimal action of the gauge algebra. ## iii. Table of contents @@ -100,24 +101,34 @@ lemma chargeRep_smul (n : ℤ) (U : unitary JetRing) (χ : JetRing) (z : JetRing /-- **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)`, in any gauge context `jets` whose jet group is `unitary JetRing`. None of the - data below depends on `jets` beyond that, so it is supplied polymorphically. -/ + `U(1)`, in any gauge context `jets` whose jet group is `unitary JetRing`. + + The infinitesimal action `act` of the gauge algebra is supplied, not constructed. For a + charge-`n` field it is `c ↦ (i n φ(c)) • id` for the functional `φ` reading off the + `u(1)` component of `c`, and no such functional is available: `jets` relates the gauge + algebra `𝔤` to the jets only through `evalLie` and `maurerCartan`, neither of which + identifies a `u(1)` direction in an arbitrary `𝔤`. The rest of the data does not depend + on `jets` beyond its jet group, so it is supplied polymorphically. -/ noncomputable def charged {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] (jets : LocalGaugeData (unitary JetRing) 𝔤 G₀ 𝔤J) [Module.Free ℂ V] [Module.Finite ℂ V] - (repLorentz : Representation ℂ SL(2,ℂ) V) (n : ℤ) (w : ℕ) : + (repLorentz : Representation ℂ SL(2,ℂ) V) (n : ℤ) (act : 𝔤 →ₗ[ℝ] V →ₗ[ℂ] V) + (hact : jets.IsInfinitesimalActionOf act (chargeRep n V)) (w : ℕ) : MatterField jets where V := V repLorentz := repLorentz repJet := chargeRep n V + repAlgebra := act repJet_smul := chargeRep_smul n + repAlgebra_isInfinitesimalAction := hact massWeight := w @[simp] lemma charged_V {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] (jets : LocalGaugeData (unitary JetRing) 𝔤 G₀ 𝔤J) [Module.Free ℂ V] [Module.Finite ℂ V] - (repLorentz : Representation ℂ SL(2,ℂ) V) (n : ℤ) (w : ℕ) : - (charged jets repLorentz n w).V = V := rfl + (repLorentz : Representation ℂ SL(2,ℂ) V) (n : ℤ) (act : 𝔤 →ₗ[ℝ] V →ₗ[ℂ] V) + (hact : jets.IsInfinitesimalActionOf act (chargeRep n V)) (w : ℕ) : + (charged jets repLorentz n act hact w).V = V := rfl end MatterField diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Basic.lean index ba8bf17d9..040836525 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Basic.lean @@ -152,4 +152,5 @@ lemma massWeightScale_ι (c : ℂ) (x : JetComponentSpace M.V) : FieldAlgebra.ι A (JetComponentSpace.massWeightScale M.massWeight c x) := FieldAlgebra.massWeightScale_ι _ c x + end MatterField diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Prod.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Prod.lean new file mode 100644 index 000000000..d72c40c6a --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Prod.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.ClassicalFieldTheory.GaugeTheory.MatterField.Basic +/-! +# The direct sum of two matter fields + +## i. Overview + +Two matter fields of a gauge theory with the same mass weight combine into one, valued in +the product of their value spaces. This is the operation that lets a multiplet be +described either as one field or as its summands: three generations of a fermion type, or +the two chiralities of a Dirac field, are the direct sum of their pieces. + +Every piece of data acts componentwise. The Lorentz representation and the infinitesimal +gauge action are `LinearMap.prodMap` of the two; the jet gauge action is the pair of the +two, read through the identification `jetProdEquiv` of the jets of a product with the +product of the jets. The mass weight has to be shared: a `MatterField` carries a single +weight, so the direct sum takes the equality of the two as a hypothesis. + +What has to be proved is the last field of the structure — that the componentwise +infinitesimal action still generates the componentwise jet action. + +## ii. Key results + +- `MatterField.repJetProd` : the jet gauge action of a direct sum. +- `MatterField.repAlgebraProd` : the infinitesimal gauge action of a direct sum. +- `MatterField.repCoeff_repJetProd` : its base-point Taylor coefficients are the pair of + those of the summands. +- `MatterField.prod` : the direct sum of two matter fields of the same mass weight. + +## iii. Table of contents + +- A. The direct sum of two matter fields + +-/ + +@[expose] public section + +open Matrix MatrixGroups TensorProduct + +namespace MatterField + +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} + +/-! + +## A. The direct sum of two matter fields + +Two matter fields of the same mass weight combine into one, valued in the product of their +value spaces. Every piece of data acts componentwise: the Lorentz and gauge algebra +actions by `LinearMap.prodMap`, and the jet gauge action through the identification +`jetProdEquiv` of the jets of a product with the product of the jets. What has to be +checked is the last field — that the componentwise algebra action still generates the +componentwise jet action. + +-/ + +section Prod + +variable (M N : MatterField jets) + +private lemma prodMap_add_prodMap {V₁ V₂ : Type} [AddCommGroup V₁] [Module ℂ V₁] + [AddCommGroup V₂] [Module ℂ V₂] (f₁ f₂ : V₁ →ₗ[ℂ] V₁) (g₁ g₂ : V₂ →ₗ[ℂ] V₂) : + (f₁ + f₂).prodMap (g₁ + g₂) = f₁.prodMap g₁ + f₂.prodMap g₂ := + LinearMap.ext fun _ => rfl + +private lemma prodMap_multiset_sum {ι V₁ V₂ : Type} [AddCommGroup V₁] [Module ℂ V₁] + [AddCommGroup V₂] [Module ℂ V₂] (S : Multiset ι) (f : ι → V₁ →ₗ[ℂ] V₁) + (g : ι → V₂ →ₗ[ℂ] V₂) : + ((S.map f).sum).prodMap ((S.map g).sum) = (S.map fun i => (f i).prodMap (g i)).sum := by + induction S using Multiset.induction_on with + | empty => exact LinearMap.ext fun _ => rfl + | cons i S ih => + rw [Multiset.map_cons, Multiset.map_cons, Multiset.map_cons, Multiset.sum_cons, + Multiset.sum_cons, Multiset.sum_cons, prodMap_add_prodMap, ih] + +/-- **The jet gauge action of a direct sum**: the two actions, read through the + identification of the jets of `M.V × N.V` with the pair of jets. -/ +noncomputable def repJetProd : + Representation ℂ G (JetRing ⊗[ℂ] (M.V × N.V)) where + toFun U := LinearEquiv.conjRingEquiv jetProdEquiv.symm ((M.repJet.prod N.repJet) U) + map_one' := by rw [map_one, map_one] + map_mul' U W := by rw [map_mul, map_mul] + +lemma repJetProd_apply (U : G) (z : JetRing ⊗[ℂ] (M.V × N.V)) : + repJetProd M N U z = + jetProdEquiv.symm (M.repJet U (jetProdEquiv z).1, N.repJet U (jetProdEquiv z).2) := rfl + +/-- **The infinitesimal action of a direct sum**: the two actions on the two summands. -/ +noncomputable def repAlgebraProd : 𝔤 →ₗ[ℝ] (M.V × N.V) →ₗ[ℂ] (M.V × N.V) where + toFun c := (M.repAlgebra c).prodMap (N.repAlgebra c) + map_add' c₁ c₂ := by rw [map_add, map_add, prodMap_add_prodMap] + map_smul' r c := by + rw [map_smul, map_smul, RingHom.id_apply] + exact LinearMap.ext fun _ => rfl + +@[simp] +lemma repAlgebraProd_apply (c : 𝔤) : + repAlgebraProd M N c = (M.repAlgebra c).prodMap (N.repAlgebra c) := rfl + +/-- The base-point Taylor coefficients of the summed jet action are the pair of the + coefficients of the summands: `jetOfConstant`, `jetIteratedDeriv` and `jetEval` all act + componentwise through `jetProdEquiv`. -/ +lemma repCoeff_repJetProd (U : G) (x : Multiset (Fin 1 ⊕ Fin 3)) : + GaugeAlgebraRealization.repCoeff (repJetProd M N) U x = + (GaugeAlgebraRealization.repCoeff M.repJet U x).prodMap + (GaugeAlgebraRealization.repCoeff N.repJet U x) := by + refine LinearMap.ext fun p => ?_ + show jetEval (jetIteratedDeriv x (repJetProd M N U (jetOfConstant p))) = _ + rw [jetEval_prod, jetProdEquiv_jetIteratedDeriv, + show jetProdEquiv (repJetProd M N U (jetOfConstant p)) + = (M.repJet U (jetOfConstant p.1), N.repJet U (jetOfConstant p.2)) from by + rw [repJetProd_apply, LinearEquiv.apply_symm_apply] + rfl] + rfl + +/-- **The componentwise algebra action generates the componentwise jet action**: both laws + of `IsInfinitesimalActionOf` are the corresponding laws of the summands, read through + `repCoeff_repJetProd`, since `prodMap` is additive in both slots at once and composes + componentwise. -/ +lemma isInfinitesimalActionOf_repAlgebraProd : + jets.IsInfinitesimalActionOf (repAlgebraProd M N) (repJetProd M N) where + repCoeff_cons U μ x := by + rw [repCoeff_repJetProd, M.repAlgebra_isInfinitesimalAction.repCoeff_cons U μ x, + N.repAlgebra_isInfinitesimalAction.repCoeff_cons U μ x, + show ∀ (f : M.V →ₗ[ℂ] M.V) (g : N.V →ₗ[ℂ] N.V), + (-f).prodMap (-g) = -(f.prodMap g) from fun _ _ => LinearMap.ext fun _ => rfl, + prodMap_multiset_sum] + refine congrArg Neg.neg (congrArg Multiset.sum (Multiset.map_congr rfl fun p _ => ?_)) + rw [repCoeff_repJetProd, repAlgebraProd_apply, LinearMap.prodMap_comp] + repCoeff_act U x c := by + rw [repCoeff_repJetProd, repAlgebraProd_apply, LinearMap.prodMap_comp, + M.repAlgebra_isInfinitesimalAction.repCoeff_act U x c, + N.repAlgebra_isInfinitesimalAction.repCoeff_act U x c, prodMap_multiset_sum] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p _ => ?_) + rw [repCoeff_repJetProd, repAlgebraProd_apply, LinearMap.prodMap_comp] + +/-- **The direct sum of two matter fields** of the same mass weight: one field valued in + `M.V × N.V`, with every action acting componentwise. Fields of different mass weight do + not sum — a `MatterField` carries one weight, which is what makes the mass-weight + grading of its field algebra well defined. -/ +noncomputable def prod (_h : M.massWeight = N.massWeight) : MatterField jets where + V := M.V × N.V + repLorentz := M.repLorentz.prod N.repLorentz + repJet := repJetProd M N + repAlgebra := repAlgebraProd M N + repJet_smul U χ z := by + rw [repJetProd_apply, repJetProd_apply, jetProdEquiv_smul, M.repJet_smul, N.repJet_smul, + jetProdEquiv_symm_smul] + repAlgebra_isInfinitesimalAction := isInfinitesimalActionOf_repAlgebraProd M N + massWeight := M.massWeight + +@[simp] +lemma prod_V (h : M.massWeight = N.massWeight) : (prod M N h).V = (M.V × N.V) := rfl + +@[simp] +lemma prod_repJet (h : M.massWeight = N.massWeight) : + (prod M N h).repJet = repJetProd M N := rfl + +@[simp] +lemma prod_repAlgebra (h : M.massWeight = N.massWeight) : + (prod M N h).repAlgebra = repAlgebraProd M N := rfl + +@[simp] +lemma prod_repLorentz (h : M.massWeight = N.massWeight) : + (prod M N h).repLorentz = M.repLorentz.prod N.repLorentz := rfl + +@[simp] +lemma prod_massWeight (h : M.massWeight = N.massWeight) : + (prod M N h).massWeight = M.massWeight := rfl + +/-- The shared weight, read off the second summand: this is what the hypothesis of `prod` + buys — the direct sum has one weight, and it is the weight of either summand. -/ +lemma prod_massWeight_right (h : M.massWeight = N.massWeight) : + (prod M N h).massWeight = N.massWeight := h + +end Prod + +end MatterField diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/Jet.lean b/Physlib/ClassicalFieldTheory/JetAlgebra/Jet.lean index df974116c..a7659d78d 100644 --- a/Physlib/ClassicalFieldTheory/JetAlgebra/Jet.lean +++ b/Physlib/ClassicalFieldTheory/JetAlgebra/Jet.lean @@ -9,6 +9,7 @@ module public import Physlib.Relativity.JetRing.Basic public import Physlib.Relativity.DerivAlgebra public import Mathlib.RingTheory.TensorProduct.Basic +public import Mathlib.LinearAlgebra.TensorProduct.Prod public import Mathlib.LinearAlgebra.Basis.Defs public import Mathlib.LinearAlgebra.Dimension.Free /-! @@ -125,3 +126,74 @@ lemma jetEval_tmul (f : JetRing) (v : V) : @[simp] lemma jetEval_jetOfConstant (v : V) : jetEval (jetOfConstant v) = v := by simp + +/-! + +## The jets of a product of value spaces + +A field valued in `V × W` is a pair of fields, one valued in `V` and one in `W`, and the +identification `jetProdEquiv` of its jets with the pair of their jets intertwines every +piece of the jet toolkit: the inclusion of constants, the formal derivative and the +base-point evaluation all act componentwise. + +-/ + +section Prod + +variable {W : Type} [AddCommGroup W] [Module ℂ W] + +/-- **The jets of a product are the product of the jets**: `JetRing ⊗ (V × W)` splits as + `(JetRing ⊗ V) × (JetRing ⊗ W)`, the jet-ring factor being shared. -/ +noncomputable abbrev jetProdEquiv : + JetRing ⊗[ℂ] (V × W) ≃ₗ[ℂ] (JetRing ⊗[ℂ] V) × (JetRing ⊗[ℂ] W) := + TensorProduct.prodRight ℂ ℂ JetRing V W + +@[simp] +lemma jetProdEquiv_jetOfConstant (v : V) (w : W) : + jetProdEquiv (jetOfConstant (v, w)) = (jetOfConstant v, jetOfConstant w) := rfl + +lemma jetProdEquiv_jetDeriv (μ : Fin 1 ⊕ Fin 3) (z : JetRing ⊗[ℂ] (V × W)) : + jetProdEquiv (jetDeriv μ z) = + (jetDeriv μ (jetProdEquiv z).1, jetDeriv μ (jetProdEquiv z).2) := by + induction z using TensorProduct.induction_on with + | zero => simp [Prod.ext_iff] + | tmul f p => rw [jetDeriv_tmul]; rfl + | add a b ha hb => + simp only [map_add, ha, hb, Prod.fst_add, Prod.snd_add, Prod.mk_add_mk] + +lemma jetProdEquiv_jetIteratedDeriv (s : Multiset (Fin 1 ⊕ Fin 3)) + (z : JetRing ⊗[ℂ] (V × W)) : + jetProdEquiv (jetIteratedDeriv s z) = + (jetIteratedDeriv s (jetProdEquiv z).1, jetIteratedDeriv s (jetProdEquiv z).2) := by + induction s using Multiset.induction_on generalizing z with + | empty => rw [jetIteratedDeriv_zero, jetIteratedDeriv_zero, jetIteratedDeriv_zero]; rfl + | cons μ t ih => + rw [jetIteratedDeriv_cons, LinearMap.comp_apply, jetProdEquiv_jetDeriv, ih, + jetIteratedDeriv_cons, jetIteratedDeriv_cons, LinearMap.comp_apply, + LinearMap.comp_apply] + +/-- The identification is `JetRing`-linear: multiplication by a scalar jet acts on both + components. -/ +lemma jetProdEquiv_smul (χ : JetRing) (z : JetRing ⊗[ℂ] (V × W)) : + jetProdEquiv (χ • z) = (χ • (jetProdEquiv z).1, χ • (jetProdEquiv z).2) := by + induction z using TensorProduct.induction_on with + | zero => simp [Prod.ext_iff] + | tmul f p => rw [TensorProduct.smul_tmul', smul_eq_mul]; rfl + | add a b ha hb => + simp only [smul_add, map_add, ha, hb, Prod.fst_add, Prod.snd_add, Prod.mk_add_mk] + +lemma jetProdEquiv_symm_smul (χ : JetRing) (a : JetRing ⊗[ℂ] V) (b : JetRing ⊗[ℂ] W) : + (jetProdEquiv (V := V) (W := W)).symm (χ • a, χ • b) + = χ • (jetProdEquiv (V := V) (W := W)).symm (a, b) := by + refine (jetProdEquiv (V := V) (W := W)).injective ?_ + rw [LinearEquiv.apply_symm_apply, jetProdEquiv_smul, LinearEquiv.apply_symm_apply] + +lemma jetEval_prod (z : JetRing ⊗[ℂ] (V × W)) : + jetEval z = (jetEval (jetProdEquiv z).1, jetEval (jetProdEquiv z).2) := by + induction z using TensorProduct.induction_on with + | zero => simp [Prod.ext_iff] + | tmul f p => rw [jetEval_tmul]; rfl + | add a b ha hb => + simp only [map_add, ha, hb, Prod.fst_add, Prod.snd_add, Prod.mk_add_mk] + +end Prod diff --git a/Physlib/Particles/StandardModel/FieldData.lean b/Physlib/Particles/StandardModel/FieldData.lean index be1843ad9..db14cee59 100644 --- a/Physlib/Particles/StandardModel/FieldData.lean +++ b/Physlib/Particles/StandardModel/FieldData.lean @@ -67,7 +67,7 @@ namespace StandardModel /-- The fifteen fermion species of the Standard Model: each of the five fermion types in each of the three generations, the generation `i : Fin 3` carried by the constructor. Two generations of one type share a representation package but are distinct species. -/ -inductive FermionType (Extention : Type) where +inductive FermionType where /-- The lepton doublet of generation `i`, `(1, 2)_{-3}`. -/ | leptonDoublet (i : Fin 3) : FermionType /-- The charged-lepton singlet of generation `i`, `(1, 1)_{-6}`. -/ @@ -78,8 +78,7 @@ inductive FermionType (Extention : Type) where | upSinglet (i : Fin 3) : FermionType /-- The down-type quark singlet of generation `i`, `(3, 1)_{-2}`. -/ | downSinglet (i : Fin 3) : FermionType - /-- Fermionic extensions of the standard model. -/ - | extention (e : Extention) : FermionType + deriving DecidableEq, Fintype namespace FermionType From 848d64b81da68814c80b64d6bdafb239eda30ae7 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 9 Sep 2026 10:10:19 +0100 Subject: [PATCH 310/367] feat: Move JetComponentSpace --- Physlib.lean | 10 +- .../LocalGaugeData/InfinitesimalAction.lean | 2 +- .../GaugeTheory/MatterField/Basic.lean | 75 +------ .../GaugeTheory/MatterField/FieldAlgebra.lean | 108 ++++++++++ .../MatterField}/JetComponentSpace/Basic.lean | 2 +- .../JetComponentSpace/GaugeAction.lean | 197 ++++++++++++++++++ .../JetComponentSpace/TransformsIn.lean | 2 +- .../JetAlgebra/FieldAlgebra/Basic.lean | 2 +- .../JetAlgebra/FieldAlgebra/GaugeAction.lean | 2 +- .../JetAlgebra/FieldAlgebra/Prod.lean | 2 +- .../GaugeAction.lean => JetRep.lean} | 185 ++-------------- .../JetAlgebra/SpeciesGenerators.lean | 5 +- .../Fermions/DownSinglet/Basic.lean | 2 +- .../Matter/BosonicAlgebra/Basic.lean | 2 +- .../Matter/BosonicAlgebra/TransformsIn.lean | 2 +- .../Matter/FermionicAlgebra/Basic.lean | 2 +- .../Matter/FermionicAlgebra/Prod.lean | 2 +- .../Matter/FermionicAlgebra/TransformsIn.lean | 2 +- 18 files changed, 354 insertions(+), 250 deletions(-) create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/FieldAlgebra.lean rename Physlib/ClassicalFieldTheory/{JetAlgebra => GaugeTheory/MatterField}/JetComponentSpace/Basic.lean (99%) create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/GaugeAction.lean rename Physlib/ClassicalFieldTheory/{JetAlgebra => GaugeTheory/MatterField}/JetComponentSpace/TransformsIn.lean (99%) rename Physlib/ClassicalFieldTheory/JetAlgebra/{JetComponentSpace/GaugeAction.lean => JetRep.lean} (67%) diff --git a/Physlib.lean b/Physlib.lean index 97dca6c6d..dfa8737f2 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -21,6 +21,10 @@ public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Truncation public import Physlib.ClassicalFieldTheory.GaugeTheory.Matter.Charge public import Physlib.ClassicalFieldTheory.GaugeTheory.Matter.CovariantDeriv public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.FieldAlgebra +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.GaugeAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.TransformsIn public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.Prod public import Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.Basic public import Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.ConstantGaugeAction @@ -34,9 +38,7 @@ public import Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.Prod public import Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.Statistics public import Physlib.ClassicalFieldTheory.JetAlgebra.GaugeFieldData public import Physlib.ClassicalFieldTheory.JetAlgebra.Jet -public import Physlib.ClassicalFieldTheory.JetAlgebra.JetComponentSpace.Basic -public import Physlib.ClassicalFieldTheory.JetAlgebra.JetComponentSpace.GaugeAction -public import Physlib.ClassicalFieldTheory.JetAlgebra.JetComponentSpace.TransformsIn +public import Physlib.ClassicalFieldTheory.JetAlgebra.JetRep public import Physlib.ClassicalFieldTheory.JetAlgebra.LocalFieldAlgebra public import Physlib.ClassicalFieldTheory.JetAlgebra.SpeciesGenerators public import Physlib.ClassicalFieldTheory.Local.Variation @@ -763,4 +765,4 @@ public import Physlib.Units.WithDim.Mass public import Physlib.Units.WithDim.Momentum public import Physlib.Units.WithDim.Pressure public import Physlib.Units.WithDim.Speed -public import Physlib.Units.WithDim.Velocity \ No newline at end of file +public import Physlib.Units.WithDim.Velocity diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/InfinitesimalAction.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/InfinitesimalAction.lean index e018175be..9ed4964db 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/InfinitesimalAction.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/InfinitesimalAction.lean @@ -6,7 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.TransformsIn -public import Physlib.ClassicalFieldTheory.JetAlgebra.JetComponentSpace.GaugeAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.GaugeAction /-! # The infinitesimal action underlying a matter representation diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Basic.lean index 040836525..ca3f850ed 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Basic.lean @@ -6,10 +6,6 @@ Authors: Joseph Tooby-Smith module public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction -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 @@ -28,23 +24,20 @@ unrelated group. Fixing `jets` rather than `G` alone is what lets the global gau an arbitrary homomorphism supplied by hand. `MatterField jets` 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. +algebra `A` of the field (bosonic or fermionic), the jet gauge action, the global gauge +action, the Lorentz action and the mass-weight scaling — all in +`Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.FieldAlgebra`, downstream of the +component space this file's data indexes. 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 `jets.ofConstant`. -- `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 + -/ @@ -97,60 +90,4 @@ variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} (M : MatterField jets) -/-! - -## 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 canonical - inclusion `jets.ofConstant : G₀ →* G` of the constant jets. -/ -noncomputable def repConstant : Representation ℂ G₀ A := - FieldAlgebra.repConstant jets.ofConstant 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 : G₀) : - M.repConstant A g = M.repJetAlgebra A (jets.ofConstant 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/GaugeTheory/MatterField/FieldAlgebra.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/FieldAlgebra.lean new file mode 100644 index 000000000..b0dba2dd5 --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/FieldAlgebra.lean @@ -0,0 +1,108 @@ +/- +Copyright (c) 2026 Joseph Tooby-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.MatterField.Basic +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 +/-! +# The field algebras of a matter field + +## i. Overview + +A field algebra of a matter field `M` is any algebra generated by the component functions +`∂_s ψ_α` of `M` — the bosonic and fermionic jet algebras are the two canonical choices. +This file transports the data of `M` onto such an algebra: the jet gauge action, the +global gauge action along the canonical inclusion `jets.ofConstant` of the constant jets, +the Lorentz action and the mass-weight scaling. + +It sits downstream of the component space that `M` indexes, which is why it is separate +from the file carrying the structure itself. + +## ii. Key results + +- `MatterField.BosonicJetAlgebra`, `MatterField.FermionicJetAlgebra` : the two canonical + field algebras of a matter field. +- `MatterField.repJetAlgebra` : the jet gauge action on a field algebra of the field. +- `MatterField.repConstant` : the global gauge action, along `jets.ofConstant`. +- `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 bosonic and fermionic jet algebras +- B. The actions on a field algebra of the matter field + +-/ + +@[expose] public section + +open Matrix MatrixGroups TensorProduct + +namespace MatterField + +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} (M : MatterField jets) + +/-! + +## A. 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 + +/-! + +## B. 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 canonical + inclusion `jets.ofConstant : G₀ →* G` of the constant jets. -/ +noncomputable def repConstant : Representation ℂ G₀ A := + FieldAlgebra.repConstant jets.ofConstant 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 : G₀) : + M.repConstant A g = M.repJetAlgebra A (jets.ofConstant 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/JetComponentSpace/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/Basic.lean similarity index 99% rename from Physlib/ClassicalFieldTheory/JetAlgebra/JetComponentSpace/Basic.lean rename to Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/Basic.lean index 7b5bf4542..d4c07a793 100644 --- a/Physlib/ClassicalFieldTheory/JetAlgebra/JetComponentSpace/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/Basic.lean @@ -23,7 +23,7 @@ span of the derivative symbols `∂_s ψ_α` and their conjugates `∂_s ψ̄_α 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`. +is in `Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.GaugeAction`. ## ii. Key results diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/GaugeAction.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/GaugeAction.lean new file mode 100644 index 000000000..04412b53d --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/GaugeAction.lean @@ -0,0 +1,197 @@ +/- +Copyright (c) 2026 Joseph Tooby-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.MatterField.JetComponentSpace.Basic +public import Physlib.ClassicalFieldTheory.JetAlgebra.JetRep +/-! +# 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] + +/-- **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/ClassicalFieldTheory/JetAlgebra/JetComponentSpace/TransformsIn.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/TransformsIn.lean similarity index 99% rename from Physlib/ClassicalFieldTheory/JetAlgebra/JetComponentSpace/TransformsIn.lean rename to Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/TransformsIn.lean index 8052d88b9..fcff501d1 100644 --- a/Physlib/ClassicalFieldTheory/JetAlgebra/JetComponentSpace/TransformsIn.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/TransformsIn.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.ClassicalFieldTheory.JetAlgebra.JetComponentSpace.GaugeAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.GaugeAction public import Physlib.ClassicalFieldTheory.GaugeTheory.Matter.CovariantDeriv /-! # The transformation law of a derivative symbol diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/Basic.lean b/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/Basic.lean index dbf05da16..929531f86 100644 --- a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/Basic.lean +++ b/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/Basic.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.ClassicalFieldTheory.JetAlgebra.JetComponentSpace.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.Basic /-! # The field algebra of a matter field diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/GaugeAction.lean b/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/GaugeAction.lean index cb78a5f7d..bc0787a9f 100644 --- a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/GaugeAction.lean +++ b/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/GaugeAction.lean @@ -6,7 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.Basic -public import Physlib.ClassicalFieldTheory.JetAlgebra.JetComponentSpace.GaugeAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.GaugeAction /-! # The gauge action on the field algebra diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/Prod.lean b/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/Prod.lean index 86a065eca..ffd3126c2 100644 --- a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/Prod.lean +++ b/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/Prod.lean @@ -74,7 +74,7 @@ variable {V W : Type} [AddCommGroup V] [Module ℂ V] [AddCommGroup W] [Module The splitting `JetComponentSpace.prodEquiv` of the component space of a direct sum lives with the component space itself, in - `Physlib.ClassicalFieldTheory.JetAlgebra.JetComponentSpace.Basic`. + `Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.Basic`. -/ diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/JetComponentSpace/GaugeAction.lean b/Physlib/ClassicalFieldTheory/JetAlgebra/JetRep.lean similarity index 67% rename from Physlib/ClassicalFieldTheory/JetAlgebra/JetComponentSpace/GaugeAction.lean rename to Physlib/ClassicalFieldTheory/JetAlgebra/JetRep.lean index 634ae62cd..c14ab5d90 100644 --- a/Physlib/ClassicalFieldTheory/JetAlgebra/JetComponentSpace/GaugeAction.lean +++ b/Physlib/ClassicalFieldTheory/JetAlgebra/JetRep.lean @@ -5,42 +5,46 @@ Authors: Joseph Tooby-Smith -/ module - -public import Physlib.ClassicalFieldTheory.JetAlgebra.JetComponentSpace.Basic +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 gauge action on the jet component space +# Fibrewise actions on `V`-valued jets ## 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. +A gauge transformation acts on the jets `JetRing ⊗[ℂ] V` of a `V`-valued field. What makes +that action local is that it is *fibrewise*: it commutes with multiplication by scalar +jets, so it acts on the values of the field over the identity on spacetime. This file +collects what follows from fibrewise-linearity alone, before any component space is built: -The construction needs two hypotheses on the jet action `rep`: +* a fibrewise action is determined by its values on constant jets, and for + finite-dimensional `V` that restriction is a matrix of power series, its *coefficient* + `jetCoeff` in `JetRing ⊗ End V`, which is multiplicative; +* the conjugate action `repConj` on the jets of the conjugate field, again fibrewise. -* `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`. +These are the ingredients from which the action on the jet component space is assembled in +`Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.GaugeAction`; they +live here, upstream of `MatterField`, because the infinitesimal-action theory that +`MatterField` is stated over already needs `repConj`. ## 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 +open Matrix MatrixGroups TensorProduct + namespace JetComponentSpace open Matrix MatrixGroups TensorProduct @@ -339,149 +343,4 @@ lemma jetCoeff_spec [Module.Free ℂ V] [Module.Finite ℂ V] (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/ClassicalFieldTheory/JetAlgebra/SpeciesGenerators.lean b/Physlib/ClassicalFieldTheory/JetAlgebra/SpeciesGenerators.lean index ec5721f4d..eee173f89 100644 --- a/Physlib/ClassicalFieldTheory/JetAlgebra/SpeciesGenerators.lean +++ b/Physlib/ClassicalFieldTheory/JetAlgebra/SpeciesGenerators.lean @@ -5,7 +5,7 @@ Authors: Nathaneal Sajan -/ module -public import Physlib.ClassicalFieldTheory.JetAlgebra.JetComponentSpace.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.Basic public import Mathlib.Algebra.DirectSum.Module /-! # The generator spaces of a family of species @@ -281,7 +281,8 @@ end ComponentSpace summand. The statement is about a single `JetComponentSpace` and would sit more naturally with the - rest of that API in `Physlib.ClassicalFieldTheory.JetAlgebra.JetComponentSpace.Basic`; it + rest of that API in + `Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.Basic`; it is here because it justifies the choice this file makes. -/ lemma JetComponentSpace.comap_comp_massWeightScale {V W : Type*} [AddCommGroup V] [Module ℂ V] [AddCommGroup W] [Module ℂ W] (f : V →ₗ[ℂ] W) (w : ℕ) (c : ℂ) : diff --git a/Physlib/Particles/StandardModel/Fermions/DownSinglet/Basic.lean b/Physlib/Particles/StandardModel/Fermions/DownSinglet/Basic.lean index d09d39cbe..a31ef6645 100644 --- a/Physlib/Particles/StandardModel/Fermions/DownSinglet/Basic.lean +++ b/Physlib/Particles/StandardModel/Fermions/DownSinglet/Basic.lean @@ -11,7 +11,7 @@ public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecompositio public import Physlib.Particles.StandardModel.GaugeGroup.JetGaugeGroup.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData -public import Physlib.ClassicalFieldTheory.JetAlgebra.JetComponentSpace.GaugeAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.GaugeAction public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.GaugeAction public import Physlib.Relativity.Tensors.ComplexTensor.Basic public import Mathlib.LinearAlgebra.TensorProduct.Pi diff --git a/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/Basic.lean b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/Basic.lean index 5043b4dcd..3c6f79f0a 100644 --- a/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/Basic.lean +++ b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/Basic.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.ClassicalFieldTheory.JetAlgebra.JetComponentSpace.GaugeAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.GaugeAction public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData public import Physlib.Mathematics.SymmetricAlgebra /-! diff --git a/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/TransformsIn.lean b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/TransformsIn.lean index 1780cff43..79b46aa97 100644 --- a/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/TransformsIn.lean +++ b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/TransformsIn.lean @@ -7,7 +7,7 @@ module public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.GaugeAction public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.JetDeriv -public import Physlib.ClassicalFieldTheory.JetAlgebra.JetComponentSpace.TransformsIn +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.TransformsIn /-! # The transformation law of the bosonic generators diff --git a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Basic.lean b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Basic.lean index fe4fb8aa0..55a3d3c1f 100644 --- a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Basic.lean +++ b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Basic.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.ClassicalFieldTheory.JetAlgebra.JetComponentSpace.GaugeAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.GaugeAction public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basic /-! diff --git a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Prod.lean b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Prod.lean index 9453f1539..431165af7 100644 --- a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Prod.lean +++ b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Prod.lean @@ -57,7 +57,7 @@ variable {V W : Type} [AddCommGroup V] [Module ℂ V] [AddCommGroup W] [Module The splitting `JetComponentSpace.prodEquiv` of the component space of a direct sum lives with the component space itself, in -`Physlib.ClassicalFieldTheory.JetAlgebra.JetComponentSpace.Basic`. +`Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.Basic`. -/ diff --git a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/TransformsIn.lean b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/TransformsIn.lean index 5f3d3a758..c8f9bad5e 100644 --- a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/TransformsIn.lean +++ b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/TransformsIn.lean @@ -7,7 +7,7 @@ module public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.GaugeAction public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.JetDeriv -public import Physlib.ClassicalFieldTheory.JetAlgebra.JetComponentSpace.TransformsIn +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.TransformsIn /-! # The transformation law of the fermionic generators From cd201c91a815f5df056df218fd3cf14955b75a95 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 9 Sep 2026 12:22:31 +0100 Subject: [PATCH 311/367] feat: Update FermionGenerators --- Physlib.lean | 9 +- .../GaugeFieldData/Basic.lean} | 23 +- .../GaugeFieldData/BosonGenerators.lean | 178 +++++++++++ .../GaugeFieldData/BosonMatterField.lean | 188 ++++++++++++ .../GaugeFieldData/BosonModule.lean | 140 +++++++++ .../GaugeFieldData/FermionGenerators.lean | 176 +++++++++++ .../GaugeFieldData/FermionMatterField.lean | 184 ++++++++++++ .../GaugeFieldData/FermionModule.lean | 140 +++++++++ .../MatterField/JetComponentSpace/Basic.lean | 193 ++++++++++++ .../GaugeTheory/MatterField/Pi.lean | 280 ++++++++++++++++++ .../ClassicalFieldTheory/JetAlgebra/Jet.lean | 68 +++++ .../JetAlgebra/LocalFieldAlgebra.lean | 2 +- .../JetAlgebra/SpeciesGenerators.lean | 6 + Physlib/Mathematics/ConjModule.lean | 28 ++ .../Particles/StandardModel/FieldData.lean | 2 +- 15 files changed, 1609 insertions(+), 8 deletions(-) rename Physlib/ClassicalFieldTheory/{JetAlgebra/GaugeFieldData.lean => GaugeTheory/GaugeFieldData/Basic.lean} (92%) create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/BosonGenerators.lean create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/BosonMatterField.lean create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/BosonModule.lean create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/FermionGenerators.lean create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/FermionMatterField.lean create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/FermionModule.lean create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Pi.lean diff --git a/Physlib.lean b/Physlib.lean index dfa8737f2..ab559b83f 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -12,6 +12,13 @@ public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.Fi public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.GaugeLaw public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.Symmetrized public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.TransformsInAdjoint +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeFieldData.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeFieldData.BosonGenerators +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeFieldData.BosonMatterField +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeFieldData.BosonModule +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeFieldData.FermionGenerators +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeFieldData.FermionMatterField +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeFieldData.FermionModule public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.AdjointCoeff public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction @@ -25,6 +32,7 @@ public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.FieldAlgebra public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.GaugeAction public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.TransformsIn +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.Pi public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.Prod public import Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.Basic public import Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.ConstantGaugeAction @@ -36,7 +44,6 @@ 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.GaugeFieldData public import Physlib.ClassicalFieldTheory.JetAlgebra.Jet public import Physlib.ClassicalFieldTheory.JetAlgebra.JetRep public import Physlib.ClassicalFieldTheory.JetAlgebra.LocalFieldAlgebra diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/GaugeFieldData.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/Basic.lean similarity index 92% rename from Physlib/ClassicalFieldTheory/JetAlgebra/GaugeFieldData.lean rename to Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/Basic.lean index 883d31ea8..d04034d08 100644 --- a/Physlib/ClassicalFieldTheory/JetAlgebra/GaugeFieldData.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/Basic.lean @@ -30,6 +30,16 @@ derives, with no further data, * the Lorentz and jet gauge actions and the mass-weight scaling on those spaces, assembled species by species. +The value spaces of the species assemble in a second, independent way: not into a direct +sum of component spaces but into a single finite-dimensional module, the `FermionModule` +and `BosonModule` of the sibling files, each carrying the structure of one `MatterField` +in `FermionMatterField` and `BosonMatterField`. That assembly needs the species to share +a mass weight, which is exactly what the generator spaces built here do not need, and the +two are used for different purposes: one field for writing the theory, one graded +generator space per species for grading its algebra. When the weights do agree the two +presentations of the generators are the same, by +`GaugeFieldData.fermionGeneratorsEquiv`. + The algebra built on the three generator spaces, `GaugeFieldData.LocalFieldAlgebra`, and its mapping-out universal property are in `Physlib.ClassicalFieldTheory.JetAlgebra.LocalFieldAlgebra`, which imports this file. The @@ -89,7 +99,10 @@ different context. `GaugeFieldData` adds only the matter content on top of it. with global group `G₀`, a finite-dimensional real gauge algebra `𝔤` with jet algebra `𝔤J` and a local-gauge-data package `jets` over them, it records a finite family of fermionic species and a finite family of bosonic species, each given by an existing - `MatterField jets`. + `MatterField jets`. The species types are `Fintype` rather than merely `Finite`, so + that a theory may be summed over its species: this is what lets the several fermionic + multiplets be assembled into the single fermionic matter field of + `GaugeFieldData.fermionMatterField`. Nothing is repeated from `MatterField`, whose fields already carry the value space, the Lorentz representation, the local-gauge-data action and the mass weight of a species. Nothing is @@ -106,19 +119,19 @@ structure GaugeFieldData {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieA /-- The index type of the fermionic species. -/ FermionSpecies : Type [decidableEqFermionSpecies : DecidableEq FermionSpecies] - [finiteFermionSpecies : Finite FermionSpecies] + [fintypeFermionSpecies : Fintype FermionSpecies] /-- The matter field of each fermionic species. -/ fermion : FermionSpecies → MatterField jets /-- The index type of the bosonic species. -/ BosonSpecies : Type [decidableEqBosonSpecies : DecidableEq BosonSpecies] - [finiteBosonSpecies : Finite BosonSpecies] + [fintypeBosonSpecies : Fintype BosonSpecies] /-- The matter field of each bosonic species. -/ boson : BosonSpecies → MatterField jets attribute [instance] GaugeFieldData.decidableEqFermionSpecies - GaugeFieldData.finiteFermionSpecies GaugeFieldData.decidableEqBosonSpecies - GaugeFieldData.finiteBosonSpecies + GaugeFieldData.fintypeFermionSpecies GaugeFieldData.decidableEqBosonSpecies + GaugeFieldData.fintypeBosonSpecies namespace GaugeFieldData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/BosonGenerators.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/BosonGenerators.lean new file mode 100644 index 000000000..f012884d5 --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/BosonGenerators.lean @@ -0,0 +1,178 @@ +/- +Copyright (c) 2026 Joseph Tooby-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.GaugeFieldData.BosonMatterField +/-! +# The bosonic generators as the components of one scalar field + +## i. Overview + +`GaugeFieldData.BosonGenerators` is built species by species, as the direct sum +`⨁ i, JetComponentSpace (T.boson i).V` of the component spaces of the several scalar +multiplets. A physicist writing a theory down does not do this. They write one scalar +field `φ`, valued in the whole bosonic module, and take its component functions +`∂_s φ_α` — a single `JetComponentSpace`, indexed by a target index `α` that runs over all +the multiplets at once. For the Standard Model, with its one Higgs doublet, the two +descriptions are trivially the same; for a two-Higgs-doublet model or any theory with +several scalars they are not, and the content below is what identifies them. + +This file shows that the two agree. When the bosonic species share a mass weight — the +condition under which `GaugeFieldData.bosonMatterField` exists, and the condition a theory +whose scalars all have the same mass dimension satisfies — there is an isomorphism + +`T.BosonGenerators ≃ₗ[ℂ] JetComponentSpace T.BosonModule`, + +and under it the summand of a species is the pullback along the projection onto that +species, `bosonGeneratorsEquiv_inclBoson`. So the generators of one multiplet sit +inside the generators of the whole scalar field exactly as its target components sit +inside the bosonic module, which is what a physicist means by writing `φ_α` with `α` +ranging over everything. + +The isomorphism is not merely one of vector spaces: it intertwines the Lorentz action and +the mass-weight scaling with those of the single matter field +`T.bosonMatterField w h`. The mass weight is where the shared weight `w` is needed and +where the species-by-species construction earns its keep — a family of *unequal* weights +has no single `JetComponentSpace.massWeightScale` to be compared with, which is precisely +the reason `SpeciesComponentSpace` was built as a direct sum in the first place. With one +weight that obstruction is gone and the two descriptions coincide. + +The underlying identification is `JetComponentSpace.piEquiv`, composed with the +identification of a direct sum over a finite index with the product. + +## ii. Key results + +- `GaugeFieldData.bosonGeneratorsEquiv` : the bosonic generator space is the component + space of the bosonic matter field. +- `GaugeFieldData.bosonGeneratorsEquiv_inclBoson` : a species sits inside it as the + pullback along the projection onto that species. +- `GaugeFieldData.bosonGeneratorsEquiv_repLorentzBoson` : the identification is + Lorentz-equivariant. +- `GaugeFieldData.bosonGeneratorsEquiv_massWeightScaleBoson` : it carries the + species-wise mass-weight scaling to the single scaling of weight `w`. + +## iii. Table of contents + +- A. The bosonic generators as one component space + - A.1. The species as pullbacks + - A.2. The transformation data + +-/ + +@[expose] public section + +open Matrix MatrixGroups TensorProduct + +namespace GaugeFieldData + +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} (T : GaugeFieldData jets) + +/-! + +## A. The bosonic generators as one component space + +-/ + +/-- **The bosonic generator space is the component space of the bosonic module.** The + direct sum over the species of their component spaces is, the species type being finite, + the same thing as the space of component functions `∂_s φ_α` of a single field valued in + the whole bosonic module — the presentation of the boson content used in writing a + theory down. -/ +noncomputable def bosonGeneratorsEquiv : + T.BosonGenerators ≃ₗ[ℂ] JetComponentSpace T.BosonModule := + (DirectSum.linearEquivFunOnFintype ℂ T.BosonSpecies + fun i => JetComponentSpace (T.BosonValue i)).trans + (JetComponentSpace.piEquiv T.BosonValue).symm + +/-! + +### A.1. The species as pullbacks + +-/ + +variable {T} + +/-- **A species sits inside the bosonic generators as the pullback along the projection + onto it.** A component function `∂_s φ_α` of the multiplet `i` becomes the component + function of the whole scalar field whose target covector is supported on that + multiplet. -/ +@[simp] +lemma bosonGeneratorsEquiv_inclBoson (i : T.BosonSpecies) + (x : JetComponentSpace (T.BosonValue i)) : + T.bosonGeneratorsEquiv (T.inclBoson i x) + = JetComponentSpace.comap (T.projBosonValue i) x := by + rw [bosonGeneratorsEquiv, LinearEquiv.trans_apply, + show (DirectSum.linearEquivFunOnFintype ℂ T.BosonSpecies + fun i => JetComponentSpace (T.BosonValue i)) (T.inclBoson i x) + = Pi.single i x from DirectSum.linearEquivFunOnFintype_lof + (M := fun i => JetComponentSpace (T.BosonValue i)) ℂ i x, + JetComponentSpace.piEquiv_symm_single] + +/-- Two linear maps out of the component space of the bosonic module agree as soon as + they agree on every species, the species pullbacks spanning it. -/ +lemma bosonGenerators_hom_ext {N : Type} [AddCommGroup N] [Module ℂ N] + {F F' : JetComponentSpace T.BosonModule →ₗ[ℂ] N} + (h : ∀ i x, F (JetComponentSpace.comap (T.projBosonValue i) x) + = F' (JetComponentSpace.comap (T.projBosonValue i) x)) : F = F' := by + have key : F.comp T.bosonGeneratorsEquiv.toLinearMap + = F'.comp T.bosonGeneratorsEquiv.toLinearMap := + SpeciesComponentSpace.hom_ext fun i x => by + simp only [LinearMap.comp_apply, LinearEquiv.coe_coe, + bosonGeneratorsEquiv_inclBoson] + exact h i x + refine LinearMap.ext fun z => ?_ + simpa using LinearMap.congr_fun key (T.bosonGeneratorsEquiv.symm z) + +/-! + +### A.2. The transformation data + +-/ + +/-- **The identification is Lorentz-equivariant.** The species-diagonal Lorentz action on + the generator space is the Lorentz action on the component functions of the single + scalar field: each species is a subrepresentation of the bosonic module, so pulling + back along the projection onto it commutes with the two actions. No common mass weight + is needed here — the Lorentz action does not see it. -/ +lemma bosonGeneratorsEquiv_repLorentzBoson (Λ : SL(2,ℂ)) (y : T.BosonGenerators) : + T.bosonGeneratorsEquiv (T.repLorentzBoson Λ y) + = JetComponentSpace.repLorentzGroup T.repLorentzBosonModule Λ + (T.bosonGeneratorsEquiv y) := by + have key : T.bosonGeneratorsEquiv.toLinearMap.comp (T.repLorentzBoson Λ) + = (JetComponentSpace.repLorentzGroup T.repLorentzBosonModule Λ).comp + T.bosonGeneratorsEquiv.toLinearMap := by + refine SpeciesComponentSpace.hom_ext fun i x => ?_ + rw [LinearMap.comp_apply, LinearMap.comp_apply, LinearEquiv.coe_coe, + repLorentzBoson_inclBoson, bosonGeneratorsEquiv_inclBoson, + bosonGeneratorsEquiv_inclBoson] + exact LinearMap.congr_fun (JetComponentSpace.comap_comp_repLorentzGroup + T.repLorentzBosonModule (T.boson i).repLorentz + (T.projBosonValue i) (fun _ => LinearMap.ext fun _ => rfl) Λ) x + exact LinearMap.congr_fun key y + +/-- **The identification carries the species-wise mass-weight scaling to a single + scaling.** With one weight `w` shared by every bosonic species, the scaling that acts + on each species through its own weight is the scaling of weight `w` on the component + functions of the one scalar field: `comap` is natural in the value space, so it does + not see which species a generator came from. -/ +lemma bosonGeneratorsEquiv_massWeightScaleBoson (w : ℕ) + (h : ∀ i, (T.boson i).massWeight = w) (c : ℂ) (y : T.BosonGenerators) : + T.bosonGeneratorsEquiv (T.massWeightScaleBoson c y) + = JetComponentSpace.massWeightScale w c (T.bosonGeneratorsEquiv y) := by + have key : T.bosonGeneratorsEquiv.toLinearMap.comp (T.massWeightScaleBoson c) + = (JetComponentSpace.massWeightScale w c).comp + T.bosonGeneratorsEquiv.toLinearMap := by + refine SpeciesComponentSpace.hom_ext fun i x => ?_ + rw [LinearMap.comp_apply, LinearMap.comp_apply, LinearEquiv.coe_coe, + massWeightScaleBoson_inclBoson, bosonGeneratorsEquiv_inclBoson, + bosonGeneratorsEquiv_inclBoson, h i] + exact LinearMap.congr_fun (JetComponentSpace.comap_comp_massWeightScale + (T.projBosonValue i) w c) x + exact LinearMap.congr_fun key y + +end GaugeFieldData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/BosonMatterField.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/BosonMatterField.lean new file mode 100644 index 000000000..346a049ba --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/BosonMatterField.lean @@ -0,0 +1,188 @@ +/- +Copyright (c) 2026 Joseph Tooby-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.GaugeFieldData.BosonModule +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.Pi +/-! +# The bosonic matter field of a gauge theory + +## i. Overview + +`GaugeFieldData.BosonModule` is the value space of all the bosons of a theory at +once. This file puts on it the structure of a single `MatterField`: the Lorentz +representation, the action of the jets of gauge transformations, the infinitesimal action +of the gauge algebra and the mass weight, all acting species by species. It is the direct +sum `MatterField.pi` of the family `T.boson`, and it is the object a physicist means by +"the scalar field" of a theory: for the Standard Model the Higgs doublet, for a +two-Higgs-doublet model the pair of doublets read as one field. + +The bosons here are the matter bosons — the scalars. The gauge bosons are not a species of +`GaugeFieldData` at all, their generator space being fixed by the gauge algebra alone, so +they are not part of this assembly. + +The one thing the assembly needs beyond the datum is a shared mass weight. A `MatterField` +carries a single weight — that is what makes the mass-weight grading of its field algebra +well defined — so the family must be degenerate in mass dimension, and the common weight +`w` is taken as an argument together with the proof that every species has it. For a +theory whose scalars are all of the same mass dimension, the Standard Model included, this +is no restriction: every bosonic species has weight two. + +Assembling the species loses nothing, and this is the content of the lemmas below: each +species includes into the bosonic matter field as a subrepresentation, of the Lorentz +group and of the gauge algebra alike, so the several multiplets can be read off the single +field again. What it does lose is the ability to record *different* mass weights, which is +exactly why `GaugeFieldData.BosonGenerators` is a direct sum of component spaces rather +than the component space of this one field. + +## ii. Key results + +- `GaugeFieldData.bosonMatterField` : the matter field of all the bosons of the + theory. +- `GaugeFieldData.bosonMatterField_repLorentz_inclBosonValue`, + `GaugeFieldData.bosonMatterField_repAlgebra_inclBosonValue` : each species is a + subrepresentation of it. +- `GaugeFieldData.finrank_bosonMatterField` : its dimension is the sum of the + dimensions of the species. + +## iii. Table of contents + +- A. The bosonic matter field + - A.1. The transformation data species by species + - A.2. The species as subrepresentations + +-/ + +@[expose] public section + +open Matrix MatrixGroups TensorProduct + +namespace GaugeFieldData + +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} (T : GaugeFieldData jets) + +/-! + +## A. The bosonic matter field + +-/ + +/-- **The bosonic matter field of a gauge theory**: the direct sum of the bosonic + species, valued in `T.BosonModule`, with the Lorentz group, the jets of gauge + transformations and the gauge algebra all acting species by species. It exists only for + a family degenerate in mass dimension: `w` is the common mass weight of the species and + `h` the proof that they all have it, which for the Standard Model, whose only scalar is + the Higgs doublet, is weight two. -/ +noncomputable def bosonMatterField (w : ℕ) (h : ∀ i, (T.boson i).massWeight = w) : + MatterField jets := + MatterField.pi T.boson w h + +variable {T} + +lemma bosonMatterField_V (w : ℕ) (h : ∀ i, (T.boson i).massWeight = w) : + (T.bosonMatterField w h).V = T.BosonModule := rfl + +/-- The bosonic matter field carries the common mass weight of the species. -/ +@[simp] +lemma bosonMatterField_massWeight (w : ℕ) (h : ∀ i, (T.boson i).massWeight = w) : + (T.bosonMatterField w h).massWeight = w := rfl + +/-! + +### A.1. The transformation data species by species + +-/ + +variable (T) + +/-- **The Lorentz action on the bosonic module**, acting species by species. This is the + Lorentz representation of the bosonic matter field, typed on `T.BosonModule` itself so + that it can be spoken of without fixing a common mass weight. -/ +noncomputable def repLorentzBosonModule : Representation ℂ SL(2,ℂ) T.BosonModule := + MatterField.repPi fun i => (T.boson i).repLorentz + +variable {T} + +@[simp] +lemma repLorentzBosonModule_apply (Λ : SL(2,ℂ)) (v : T.BosonModule) (i : T.BosonSpecies) : + T.repLorentzBosonModule Λ v i = (T.boson i).repLorentz Λ (v i) := rfl + +/-- The Lorentz action of the bosonic matter field is that of the bosonic module. -/ +lemma bosonMatterField_repLorentz (w : ℕ) (h : ∀ i, (T.boson i).massWeight = w) : + (T.bosonMatterField w h).repLorentz = T.repLorentzBosonModule := rfl + +/-- The Lorentz group acts on a bosonic configuration species by species. -/ +@[simp] +lemma bosonMatterField_repLorentz_apply (w : ℕ) + (h : ∀ i, (T.boson i).massWeight = w) (Λ : SL(2,ℂ)) (v : T.BosonModule) + (i : T.BosonSpecies) : + (T.bosonMatterField w h).repLorentz Λ v i = (T.boson i).repLorentz Λ (v i) := rfl + +/-- The gauge algebra acts on a bosonic configuration species by species. -/ +@[simp] +lemma bosonMatterField_repAlgebra_apply (w : ℕ) + (h : ∀ i, (T.boson i).massWeight = w) (c : 𝔤) (v : T.BosonModule) + (i : T.BosonSpecies) : + (T.bosonMatterField w h).repAlgebra c v i = (T.boson i).repAlgebra c (v i) := rfl + +/-- The jets of gauge transformations act on the jets of the bosonic field species by + species, through the identification `jetPiEquiv` of the jets of the bosonic module + with the family of the jets of the species. -/ +lemma bosonMatterField_repJet_apply (w : ℕ) + (h : ∀ i, (T.boson i).massWeight = w) (U : G) + (z : JetRing ⊗[ℂ] T.BosonModule) : + (T.bosonMatterField w h).repJet U z = + (jetPiEquiv T.BosonValue).symm + (fun i => (T.boson i).repJet U (jetPiEquiv T.BosonValue z i)) := rfl + +/-- The base-point Taylor coefficients of the bosonic jet action are those of the + species, index by index. -/ +lemma repCoeff_bosonMatterField (w : ℕ) (h : ∀ i, (T.boson i).massWeight = w) (U : G) + (x : Multiset (Fin 1 ⊕ Fin 3)) : + GaugeAlgebraRealization.repCoeff (T.bosonMatterField w h).repJet U x = + LinearMap.piMap fun i => + GaugeAlgebraRealization.repCoeff (T.boson i).repJet U x := + MatterField.repCoeff_repJetPi T.boson U x + +/-! + +### A.2. The species as subrepresentations + +-/ + +/-- **A bosonic species is a Lorentz subrepresentation of the bosonic matter field**: + including a value of one species and then transforming is transforming and then + including. Assembling the species into one field therefore loses no Lorentz + information. -/ +lemma bosonMatterField_repLorentz_inclBosonValue (w : ℕ) + (h : ∀ i, (T.boson i).massWeight = w) (Λ : SL(2,ℂ)) (i : T.BosonSpecies) + (x : T.BosonValue i) : + (T.bosonMatterField w h).repLorentz Λ (T.inclBosonValue i x) + = T.inclBosonValue i ((T.boson i).repLorentz Λ x) := + funext fun j => + Pi.apply_single (fun k => (T.boson k).repLorentz Λ) (fun _ => map_zero _) i x j + +/-- **A bosonic species is a subrepresentation of the gauge algebra action** on the + bosonic matter field, for the same reason: the gauge algebra does not mix the + species. -/ +lemma bosonMatterField_repAlgebra_inclBosonValue (w : ℕ) + (h : ∀ i, (T.boson i).massWeight = w) (c : 𝔤) (i : T.BosonSpecies) + (x : T.BosonValue i) : + (T.bosonMatterField w h).repAlgebra c (T.inclBosonValue i x) + = T.inclBosonValue i ((T.boson i).repAlgebra c x) := + funext fun j => + Pi.apply_single (fun k => (T.boson k).repAlgebra c) (fun _ => map_zero _) i x j + +/-- The dimension of the bosonic matter field is the sum of the dimensions of the + species. -/ +lemma finrank_bosonMatterField (w : ℕ) (h : ∀ i, (T.boson i).massWeight = w) : + Module.finrank ℂ (T.bosonMatterField w h).V + = ∑ i, Module.finrank ℂ (T.BosonValue i) := + T.finrank_bosonModule + +end GaugeFieldData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/BosonModule.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/BosonModule.lean new file mode 100644 index 000000000..517d46b9c --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/BosonModule.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.ClassicalFieldTheory.GaugeTheory.GaugeFieldData.Basic +/-! +# The bosonic module of a gauge theory + +## i. Overview + +A `GaugeFieldData jets` records its bosons species by species, each with its own value +space `(T.boson i).V`. This file assembles those into a single complex vector space, the +**bosonic module** + +`T.BosonModule = ∀ i, (T.boson i).V`, + +in which one value of the whole bosonic content of the theory lives at once. For the +Standard Model, whose only bosonic species is the Higgs doublet, this is that doublet +again; a theory with a larger scalar sector — a second Higgs doublet, a singlet — has the +column of all of them. + +It is the *value* space, not a space of component functions, and so it is not the +`BosonGenerators` of `GaugeFieldData.Basic`: the latter is a direct sum of component +spaces `JetComponentSpace`, one per species, and is infinite-dimensional because it +carries a derivative label of every order. The bosonic module is finite-dimensional, +with dimension the sum of the dimensions of the species, and it is the space on which +`GaugeFieldData.bosonMatterField` puts the Lorentz, gauge and mass-weight structure of a +single matter field. + +The species type is finite, so the product is also a direct sum: a bosonic +configuration is the sum of its species components, `sum_inclBosonValue_proj` below, and +the two descriptions of the module agree. + +## ii. Key results + +- `GaugeFieldData.BosonModule` : the value space of all the bosons of the theory. +- `GaugeFieldData.projBosonValue`, `GaugeFieldData.inclBosonValue` : the projection + onto and the inclusion of one species. +- `GaugeFieldData.sum_inclBosonValue_proj` : a configuration is the sum of its species + components. +- `GaugeFieldData.finrank_bosonModule` : its dimension is the sum of the dimensions of + the species. + +## iii. Table of contents + +- A. The bosonic module + - A.1. The species projections and inclusions + - A.2. The dimension of the bosonic module + +-/ + +@[expose] public section + +open Matrix MatrixGroups TensorProduct + +namespace GaugeFieldData + +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} (T : GaugeFieldData jets) + +/-! + +## A. The bosonic module + +-/ + +/-- **The bosonic module of a gauge theory**: the product, over the bosonic species, + of their value spaces. One element of it is a value of the entire bosonic content of + the theory — the column of all the boson fields — as opposed to + `GaugeFieldData.BosonGenerators`, which is a space of component *functions* and is + infinite-dimensional. Since the species type is finite the product is also their direct + sum. -/ +abbrev BosonModule : Type := ∀ i, T.BosonValue i + +/-! + +### A.1. The species projections and inclusions + +-/ + +/-- The component of a bosonic configuration in one species. -/ +abbrev projBosonValue (i : T.BosonSpecies) : + T.BosonModule →ₗ[ℂ] T.BosonValue i := + LinearMap.proj i + +/-- The inclusion of one bosonic species into the bosonic module, extending a value + of that species by zero in every other. -/ +abbrev inclBosonValue (i : T.BosonSpecies) : + T.BosonValue i →ₗ[ℂ] T.BosonModule := + LinearMap.single ℂ T.BosonValue i + +variable {T} + +@[simp] +lemma projBosonValue_apply (i : T.BosonSpecies) (v : T.BosonModule) : + T.projBosonValue i v = v i := rfl + +lemma projBosonValue_inclBosonValue_self (i : T.BosonSpecies) + (v : T.BosonValue i) : T.projBosonValue i (T.inclBosonValue i v) = v := + Pi.single_eq_same i v + +/-- A value of one species has no component in any other species: the inclusions of + distinct species have disjoint supports. -/ +lemma projBosonValue_inclBosonValue_of_ne {i j : T.BosonSpecies} (h : i ≠ j) + (v : T.BosonValue j) : T.projBosonValue i (T.inclBosonValue j v) = 0 := + Pi.single_eq_of_ne h v + +/-- **A bosonic configuration is the sum of its species components**. The product over + the species is their direct sum, the species type being finite, so nothing is lost in + describing the bosonic content of the theory by one module. -/ +lemma sum_inclBosonValue_proj (v : T.BosonModule) : + ∑ i, T.inclBosonValue i (v i) = v := + LinearMap.sum_single_apply T.BosonValue v + +/-- Two linear maps out of the bosonic module agreeing on every species are equal. -/ +lemma bosonModule_hom_ext {N : Type} [AddCommGroup N] [Module ℂ N] + {F F' : T.BosonModule →ₗ[ℂ] N} + (h : ∀ i, F.comp (T.inclBosonValue i) = F'.comp (T.inclBosonValue i)) : F = F' := + LinearMap.pi_ext' fun i => h i + +/-! + +### A.2. The dimension of the bosonic module + +-/ + +variable (T) + +/-- **The dimension of the bosonic module is the sum of the dimensions of the + species**, each species contributing the number of complex components of its + multiplet. -/ +lemma finrank_bosonModule : + Module.finrank ℂ T.BosonModule = ∑ i, Module.finrank ℂ (T.BosonValue i) := + Module.finrank_pi_fintype ℂ + +end GaugeFieldData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/FermionGenerators.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/FermionGenerators.lean new file mode 100644 index 000000000..3df37ec75 --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/FermionGenerators.lean @@ -0,0 +1,176 @@ +/- +Copyright (c) 2026 Joseph Tooby-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.GaugeFieldData.FermionMatterField +/-! +# The fermionic generators as the components of one fermion field + +## i. Overview + +`GaugeFieldData.FermionGenerators` is built species by species, as the direct sum +`⨁ i, JetComponentSpace (T.fermion i).V` of the component spaces of the several fermionic +multiplets. A physicist writing the Standard Model does not do this. They write one fermion +field `ψ`, valued in the whole fermionic module, and take its component functions +`∂_s ψ_α` — a single `JetComponentSpace`, indexed by a target index `α` that runs over all +the multiplets at once. + +This file shows that the two agree. When the fermionic species share a mass weight — the +condition under which `GaugeFieldData.fermionMatterField` exists, and the condition every +theory of Weyl fermions satisfies — there is an isomorphism + +`T.FermionGenerators ≃ₗ[ℂ] JetComponentSpace T.FermionModule`, + +and under it the summand of a species is the pullback along the projection onto that +species, `fermionGeneratorsEquiv_inclFermion`. So the generators of one multiplet sit +inside the generators of the whole fermion field exactly as its target components sit +inside the fermionic module, which is what a physicist means by writing `ψ_α` with `α` +ranging over everything. + +The isomorphism is not merely one of vector spaces: it intertwines the Lorentz action and +the mass-weight scaling with those of the single matter field +`T.fermionMatterField w h`. The mass weight is where the shared weight `w` is needed and +where the species-by-species construction earns its keep — a family of *unequal* weights +has no single `JetComponentSpace.massWeightScale` to be compared with, which is precisely +the reason `SpeciesComponentSpace` was built as a direct sum in the first place. With one +weight that obstruction is gone and the two descriptions coincide. + +The underlying identification is `JetComponentSpace.piEquiv`, composed with the +identification of a direct sum over a finite index with the product. + +## ii. Key results + +- `GaugeFieldData.fermionGeneratorsEquiv` : the fermionic generator space is the component + space of the fermionic matter field. +- `GaugeFieldData.fermionGeneratorsEquiv_inclFermion` : a species sits inside it as the + pullback along the projection onto that species. +- `GaugeFieldData.fermionGeneratorsEquiv_repLorentzFermion` : the identification is + Lorentz-equivariant. +- `GaugeFieldData.fermionGeneratorsEquiv_massWeightScaleFermion` : it carries the + species-wise mass-weight scaling to the single scaling of weight `w`. + +## iii. Table of contents + +- A. The fermionic generators as one component space + - A.1. The species as pullbacks + - A.2. The transformation data + +-/ + +@[expose] public section + +open Matrix MatrixGroups TensorProduct + +namespace GaugeFieldData + +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} (T : GaugeFieldData jets) + +/-! + +## A. The fermionic generators as one component space + +-/ + +/-- **The fermionic generator space is the component space of the fermionic module.** The + direct sum over the species of their component spaces is, the species type being finite, + the same thing as the space of component functions `∂_s ψ_α` of a single field valued in + the whole fermionic module — the presentation of the fermion content used in writing a + theory down. -/ +noncomputable def fermionGeneratorsEquiv : + T.FermionGenerators ≃ₗ[ℂ] JetComponentSpace T.FermionModule := + (DirectSum.linearEquivFunOnFintype ℂ T.FermionSpecies + fun i => JetComponentSpace (T.FermionValue i)).trans + (JetComponentSpace.piEquiv T.FermionValue).symm + +/-! + +### A.1. The species as pullbacks + +-/ + +variable {T} + +/-- **A species sits inside the fermionic generators as the pullback along the projection + onto it.** A component function `∂_s ψ_α` of the multiplet `i` becomes the component + function of the whole fermion field whose target covector is supported on that + multiplet. -/ +@[simp] +lemma fermionGeneratorsEquiv_inclFermion (i : T.FermionSpecies) + (x : JetComponentSpace (T.FermionValue i)) : + T.fermionGeneratorsEquiv (T.inclFermion i x) + = JetComponentSpace.comap (T.projFermionValue i) x := by + rw [fermionGeneratorsEquiv, LinearEquiv.trans_apply, + show (DirectSum.linearEquivFunOnFintype ℂ T.FermionSpecies + fun i => JetComponentSpace (T.FermionValue i)) (T.inclFermion i x) + = Pi.single i x from DirectSum.linearEquivFunOnFintype_lof + (M := fun i => JetComponentSpace (T.FermionValue i)) ℂ i x, + JetComponentSpace.piEquiv_symm_single] + +/-- Two linear maps out of the component space of the fermionic module agree as soon as + they agree on every species, the species pullbacks spanning it. -/ +lemma fermionGenerators_hom_ext {N : Type} [AddCommGroup N] [Module ℂ N] + {F F' : JetComponentSpace T.FermionModule →ₗ[ℂ] N} + (h : ∀ i x, F (JetComponentSpace.comap (T.projFermionValue i) x) + = F' (JetComponentSpace.comap (T.projFermionValue i) x)) : F = F' := by + have key : F.comp T.fermionGeneratorsEquiv.toLinearMap + = F'.comp T.fermionGeneratorsEquiv.toLinearMap := + SpeciesComponentSpace.hom_ext fun i x => by + simp only [LinearMap.comp_apply, LinearEquiv.coe_coe, + fermionGeneratorsEquiv_inclFermion] + exact h i x + refine LinearMap.ext fun z => ?_ + simpa using LinearMap.congr_fun key (T.fermionGeneratorsEquiv.symm z) + +/-! + +### A.2. The transformation data + +-/ + +/-- **The identification is Lorentz-equivariant.** The species-diagonal Lorentz action on + the generator space is the Lorentz action on the component functions of the single + fermion field: each species is a subrepresentation of the fermionic module, so pulling + back along the projection onto it commutes with the two actions. No common mass weight + is needed here — the Lorentz action does not see it. -/ +lemma fermionGeneratorsEquiv_repLorentzFermion (Λ : SL(2,ℂ)) (y : T.FermionGenerators) : + T.fermionGeneratorsEquiv (T.repLorentzFermion Λ y) + = JetComponentSpace.repLorentzGroup T.repLorentzFermionModule Λ + (T.fermionGeneratorsEquiv y) := by + have key : T.fermionGeneratorsEquiv.toLinearMap.comp (T.repLorentzFermion Λ) + = (JetComponentSpace.repLorentzGroup T.repLorentzFermionModule Λ).comp + T.fermionGeneratorsEquiv.toLinearMap := by + refine SpeciesComponentSpace.hom_ext fun i x => ?_ + rw [LinearMap.comp_apply, LinearMap.comp_apply, LinearEquiv.coe_coe, + repLorentzFermion_inclFermion, fermionGeneratorsEquiv_inclFermion, + fermionGeneratorsEquiv_inclFermion] + exact LinearMap.congr_fun (JetComponentSpace.comap_comp_repLorentzGroup + T.repLorentzFermionModule (T.fermion i).repLorentz + (T.projFermionValue i) (fun _ => LinearMap.ext fun _ => rfl) Λ) x + exact LinearMap.congr_fun key y + +/-- **The identification carries the species-wise mass-weight scaling to a single + scaling.** With one weight `w` shared by every fermionic species, the scaling that acts + on each species through its own weight is the scaling of weight `w` on the component + functions of the one fermion field: `comap` is natural in the value space, so it does + not see which species a generator came from. -/ +lemma fermionGeneratorsEquiv_massWeightScaleFermion (w : ℕ) + (h : ∀ i, (T.fermion i).massWeight = w) (c : ℂ) (y : T.FermionGenerators) : + T.fermionGeneratorsEquiv (T.massWeightScaleFermion c y) + = JetComponentSpace.massWeightScale w c (T.fermionGeneratorsEquiv y) := by + have key : T.fermionGeneratorsEquiv.toLinearMap.comp (T.massWeightScaleFermion c) + = (JetComponentSpace.massWeightScale w c).comp + T.fermionGeneratorsEquiv.toLinearMap := by + refine SpeciesComponentSpace.hom_ext fun i x => ?_ + rw [LinearMap.comp_apply, LinearMap.comp_apply, LinearEquiv.coe_coe, + massWeightScaleFermion_inclFermion, fermionGeneratorsEquiv_inclFermion, + fermionGeneratorsEquiv_inclFermion, h i] + exact LinearMap.congr_fun (JetComponentSpace.comap_comp_massWeightScale + (T.projFermionValue i) w c) x + exact LinearMap.congr_fun key y + +end GaugeFieldData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/FermionMatterField.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/FermionMatterField.lean new file mode 100644 index 000000000..073d150c6 --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/FermionMatterField.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.GaugeTheory.GaugeFieldData.FermionModule +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.Pi +/-! +# The fermionic matter field of a gauge theory + +## i. Overview + +`GaugeFieldData.FermionModule` is the value space of all the fermions of a theory at +once. This file puts on it the structure of a single `MatterField`: the Lorentz +representation, the action of the jets of gauge transformations, the infinitesimal action +of the gauge algebra and the mass weight, all acting species by species. It is the direct +sum `MatterField.pi` of the family `T.fermion`, and it is the object a physicist means by +"the fermion field" of a theory, as against the fifteen separate multiplets the Standard +Model is usually presented by. + +The one thing the assembly needs beyond the datum is a shared mass weight. A `MatterField` +carries a single weight — that is what makes the mass-weight grading of its field algebra +well defined — so the family must be degenerate in mass dimension, and the common weight +`w` is taken as an argument together with the proof that every species has it. For the +Standard Model, and for any theory whose fermions are Weyl spinors, this is no restriction: +every fermionic species has weight three. + +Assembling the species loses nothing, and this is the content of the lemmas below: each +species includes into the fermionic matter field as a subrepresentation, of the Lorentz +group and of the gauge algebra alike, so the several multiplets can be read off the single +field again. What it does lose is the ability to record *different* mass weights, which is +exactly why `GaugeFieldData.FermionGenerators` is a direct sum of component spaces rather +than the component space of this one field. + +## ii. Key results + +- `GaugeFieldData.fermionMatterField` : the matter field of all the fermions of the + theory. +- `GaugeFieldData.fermionMatterField_repLorentz_inclFermionValue`, + `GaugeFieldData.fermionMatterField_repAlgebra_inclFermionValue` : each species is a + subrepresentation of it. +- `GaugeFieldData.finrank_fermionMatterField` : its dimension is the sum of the + dimensions of the species. + +## iii. Table of contents + +- A. The fermionic matter field + - A.1. The transformation data species by species + - A.2. The species as subrepresentations + +-/ + +@[expose] public section + +open Matrix MatrixGroups TensorProduct + +namespace GaugeFieldData + +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} (T : GaugeFieldData jets) + +/-! + +## A. The fermionic matter field + +-/ + +/-- **The fermionic matter field of a gauge theory**: the direct sum of the fermionic + species, valued in `T.FermionModule`, with the Lorentz group, the jets of gauge + transformations and the gauge algebra all acting species by species. It exists only for + a family degenerate in mass dimension: `w` is the common mass weight of the species and + `h` the proof that they all have it, which for the Standard Model, and for any theory + whose fermions are Weyl spinors, is weight three. -/ +noncomputable def fermionMatterField (w : ℕ) (h : ∀ i, (T.fermion i).massWeight = w) : + MatterField jets := + MatterField.pi T.fermion w h + +variable {T} + +lemma fermionMatterField_V (w : ℕ) (h : ∀ i, (T.fermion i).massWeight = w) : + (T.fermionMatterField w h).V = T.FermionModule := rfl + +/-- The fermionic matter field carries the common mass weight of the species. -/ +@[simp] +lemma fermionMatterField_massWeight (w : ℕ) (h : ∀ i, (T.fermion i).massWeight = w) : + (T.fermionMatterField w h).massWeight = w := rfl + +/-! + +### A.1. The transformation data species by species + +-/ + +variable (T) + +/-- **The Lorentz action on the fermionic module**, acting species by species. This is the + Lorentz representation of the fermionic matter field, typed on `T.FermionModule` itself so + that it can be spoken of without fixing a common mass weight. -/ +noncomputable def repLorentzFermionModule : Representation ℂ SL(2,ℂ) T.FermionModule := + MatterField.repPi fun i => (T.fermion i).repLorentz + +variable {T} + +@[simp] +lemma repLorentzFermionModule_apply (Λ : SL(2,ℂ)) (v : T.FermionModule) (i : T.FermionSpecies) : + T.repLorentzFermionModule Λ v i = (T.fermion i).repLorentz Λ (v i) := rfl + +/-- The Lorentz action of the fermionic matter field is that of the fermionic module. -/ +lemma fermionMatterField_repLorentz (w : ℕ) (h : ∀ i, (T.fermion i).massWeight = w) : + (T.fermionMatterField w h).repLorentz = T.repLorentzFermionModule := rfl + +/-- The Lorentz group acts on a fermionic configuration species by species. -/ +@[simp] +lemma fermionMatterField_repLorentz_apply (w : ℕ) + (h : ∀ i, (T.fermion i).massWeight = w) (Λ : SL(2,ℂ)) (v : T.FermionModule) + (i : T.FermionSpecies) : + (T.fermionMatterField w h).repLorentz Λ v i = (T.fermion i).repLorentz Λ (v i) := rfl + +/-- The gauge algebra acts on a fermionic configuration species by species. -/ +@[simp] +lemma fermionMatterField_repAlgebra_apply (w : ℕ) + (h : ∀ i, (T.fermion i).massWeight = w) (c : 𝔤) (v : T.FermionModule) + (i : T.FermionSpecies) : + (T.fermionMatterField w h).repAlgebra c v i = (T.fermion i).repAlgebra c (v i) := rfl + +/-- The jets of gauge transformations act on the jets of the fermionic field species by + species, through the identification `jetPiEquiv` of the jets of the fermionic module + with the family of the jets of the species. -/ +lemma fermionMatterField_repJet_apply (w : ℕ) + (h : ∀ i, (T.fermion i).massWeight = w) (U : G) + (z : JetRing ⊗[ℂ] T.FermionModule) : + (T.fermionMatterField w h).repJet U z = + (jetPiEquiv T.FermionValue).symm + (fun i => (T.fermion i).repJet U (jetPiEquiv T.FermionValue z i)) := rfl + +/-- The base-point Taylor coefficients of the fermionic jet action are those of the + species, index by index. -/ +lemma repCoeff_fermionMatterField (w : ℕ) (h : ∀ i, (T.fermion i).massWeight = w) (U : G) + (x : Multiset (Fin 1 ⊕ Fin 3)) : + GaugeAlgebraRealization.repCoeff (T.fermionMatterField w h).repJet U x = + LinearMap.piMap fun i => + GaugeAlgebraRealization.repCoeff (T.fermion i).repJet U x := + MatterField.repCoeff_repJetPi T.fermion U x + +/-! + +### A.2. The species as subrepresentations + +-/ + +/-- **A fermionic species is a Lorentz subrepresentation of the fermionic matter field**: + including a value of one species and then transforming is transforming and then + including. Assembling the species into one field therefore loses no Lorentz + information. -/ +lemma fermionMatterField_repLorentz_inclFermionValue (w : ℕ) + (h : ∀ i, (T.fermion i).massWeight = w) (Λ : SL(2,ℂ)) (i : T.FermionSpecies) + (x : T.FermionValue i) : + (T.fermionMatterField w h).repLorentz Λ (T.inclFermionValue i x) + = T.inclFermionValue i ((T.fermion i).repLorentz Λ x) := + funext fun j => + Pi.apply_single (fun k => (T.fermion k).repLorentz Λ) (fun _ => map_zero _) i x j + +/-- **A fermionic species is a subrepresentation of the gauge algebra action** on the + fermionic matter field, for the same reason: the gauge algebra does not mix the + species. -/ +lemma fermionMatterField_repAlgebra_inclFermionValue (w : ℕ) + (h : ∀ i, (T.fermion i).massWeight = w) (c : 𝔤) (i : T.FermionSpecies) + (x : T.FermionValue i) : + (T.fermionMatterField w h).repAlgebra c (T.inclFermionValue i x) + = T.inclFermionValue i ((T.fermion i).repAlgebra c x) := + funext fun j => + Pi.apply_single (fun k => (T.fermion k).repAlgebra c) (fun _ => map_zero _) i x j + +/-- The dimension of the fermionic matter field is the sum of the dimensions of the + species. -/ +lemma finrank_fermionMatterField (w : ℕ) (h : ∀ i, (T.fermion i).massWeight = w) : + Module.finrank ℂ (T.fermionMatterField w h).V + = ∑ i, Module.finrank ℂ (T.FermionValue i) := + T.finrank_fermionModule + +end GaugeFieldData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/FermionModule.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/FermionModule.lean new file mode 100644 index 000000000..7174bc403 --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/FermionModule.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.ClassicalFieldTheory.GaugeTheory.GaugeFieldData.Basic +/-! +# The fermionic module of a gauge theory + +## i. Overview + +A `GaugeFieldData jets` records its fermions species by species, each with its own value +space `(T.fermion i).V`. This file assembles those into a single complex vector space, the +**fermionic module** + +`T.FermionModule = ∀ i, (T.fermion i).V`, + +in which one value of the whole fermionic content of the theory lives at once. For the +Standard Model this is the sixteen-complex-dimensional space (fifteen Weyl components in +each of three generations, with the doublets counted with their gauge multiplicity) that a +physicist writes as the column of all the fermion fields. + +It is the *value* space, not a space of component functions, and so it is not the +`FermionGenerators` of `GaugeFieldData.Basic`: the latter is a direct sum of component +spaces `JetComponentSpace`, one per species, and is infinite-dimensional because it +carries a derivative label of every order. The fermionic module is finite-dimensional, +with dimension the sum of the dimensions of the species, and it is the space on which +`GaugeFieldData.fermionMatterField` puts the Lorentz, gauge and mass-weight structure of a +single matter field. + +The species type is finite, so the product is also a direct sum: a fermionic +configuration is the sum of its species components, `sum_inclFermionValue_proj` below, and +the two descriptions of the module agree. + +## ii. Key results + +- `GaugeFieldData.FermionModule` : the value space of all the fermions of the theory. +- `GaugeFieldData.projFermionValue`, `GaugeFieldData.inclFermionValue` : the projection + onto and the inclusion of one species. +- `GaugeFieldData.sum_inclFermionValue_proj` : a configuration is the sum of its species + components. +- `GaugeFieldData.finrank_fermionModule` : its dimension is the sum of the dimensions of + the species. + +## iii. Table of contents + +- A. The fermionic module + - A.1. The species projections and inclusions + - A.2. The dimension of the fermionic module + +-/ + +@[expose] public section + +open Matrix MatrixGroups TensorProduct + +namespace GaugeFieldData + +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} (T : GaugeFieldData jets) + +/-! + +## A. The fermionic module + +-/ + +/-- **The fermionic module of a gauge theory**: the product, over the fermionic species, + of their value spaces. One element of it is a value of the entire fermionic content of + the theory — the column of all the fermion fields — as opposed to + `GaugeFieldData.FermionGenerators`, which is a space of component *functions* and is + infinite-dimensional. Since the species type is finite the product is also their direct + sum. -/ +abbrev FermionModule : Type := ∀ i, T.FermionValue i + +/-! + +### A.1. The species projections and inclusions + +-/ + +/-- The component of a fermionic configuration in one species. -/ +abbrev projFermionValue (i : T.FermionSpecies) : + T.FermionModule →ₗ[ℂ] T.FermionValue i := + LinearMap.proj i + +/-- The inclusion of one fermionic species into the fermionic module, extending a value + of that species by zero in every other. -/ +abbrev inclFermionValue (i : T.FermionSpecies) : + T.FermionValue i →ₗ[ℂ] T.FermionModule := + LinearMap.single ℂ T.FermionValue i + +variable {T} + +@[simp] +lemma projFermionValue_apply (i : T.FermionSpecies) (v : T.FermionModule) : + T.projFermionValue i v = v i := rfl + +lemma projFermionValue_inclFermionValue_self (i : T.FermionSpecies) + (v : T.FermionValue i) : T.projFermionValue i (T.inclFermionValue i v) = v := + Pi.single_eq_same i v + +/-- A value of one species has no component in any other species: the inclusions of + distinct species have disjoint supports. -/ +lemma projFermionValue_inclFermionValue_of_ne {i j : T.FermionSpecies} (h : i ≠ j) + (v : T.FermionValue j) : T.projFermionValue i (T.inclFermionValue j v) = 0 := + Pi.single_eq_of_ne h v + +/-- **A fermionic configuration is the sum of its species components**. The product over + the species is their direct sum, the species type being finite, so nothing is lost in + describing the fermionic content of the theory by one module. -/ +lemma sum_inclFermionValue_proj (v : T.FermionModule) : + ∑ i, T.inclFermionValue i (v i) = v := + LinearMap.sum_single_apply T.FermionValue v + +/-- Two linear maps out of the fermionic module agreeing on every species are equal. -/ +lemma fermionModule_hom_ext {N : Type} [AddCommGroup N] [Module ℂ N] + {F F' : T.FermionModule →ₗ[ℂ] N} + (h : ∀ i, F.comp (T.inclFermionValue i) = F'.comp (T.inclFermionValue i)) : F = F' := + LinearMap.pi_ext' fun i => h i + +/-! + +### A.2. The dimension of the fermionic module + +-/ + +variable (T) + +/-- **The dimension of the fermionic module is the sum of the dimensions of the + species**, each species contributing the number of complex components of its + multiplet. -/ +lemma finrank_fermionModule : + Module.finrank ℂ T.FermionModule = ∑ i, Module.finrank ℂ (T.FermionValue i) := + Module.finrank_pi_fintype ℂ + +end GaugeFieldData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/Basic.lean index d4c07a793..f63f8fdf2 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/Basic.lean @@ -12,6 +12,7 @@ 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.TensorProduct.Pi public import Mathlib.LinearAlgebra.Matrix.SpecialLinearGroup /-! # The jet component space of a matter field @@ -35,6 +36,7 @@ is in `Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.Ga - `JetComponentSpace.comap` : functoriality, contravariant in the target space. - `JetComponentSpace.massWeightScale` : the mass-weight scaling. - `JetComponentSpace.prodEquiv` : the component space of a direct sum. +- `JetComponentSpace.piEquiv` : the component space of a finite direct sum. -/ @@ -286,6 +288,43 @@ lemma JetComponentSpace.comap_comp {U : Type _} [AddCommGroup U] [Module ℂ U] LinearMap.id_comp] rfl +/-- **An equivariant map of target spaces gives an equivariant pullback.** If `f : V →ₗ W` + intertwines two Lorentz representations then `comap f` intertwines the induced actions on + the component spaces, in the opposite direction. Component functions are covectors, so + the unconjugated half transposes `f` against the contragredient action and the conjugate + half against its conjugate; both reduce to equivariance of `f` at `Λ⁻¹`. -/ +lemma JetComponentSpace.comap_comp_repLorentzGroup (repV : Representation ℂ SL(2,ℂ) V) + (repW : Representation ℂ SL(2,ℂ) W) (f : V →ₗ[ℂ] W) + (hf : ∀ Λ : SL(2,ℂ), f.comp (repV Λ) = (repW Λ).comp f) (Λ : SL(2,ℂ)) : + (JetComponentSpace.comap f).comp (JetComponentSpace.repLorentzGroup repW Λ) + = (JetComponentSpace.repLorentzGroup repV Λ).comp (JetComponentSpace.comap f) := by + have hdual : (Module.Dual.transpose (R := ℂ) f).comp (repW.dual Λ) + = (repV.dual Λ).comp (Module.Dual.transpose f) := + LinearMap.ext fun ψ => + LinearMap.ext fun v => (congrArg ψ (LinearMap.congr_fun (hf Λ⁻¹) v)).symm + have hconj : (Module.Dual.transpose (R := ℂ) (ConjModule.map (k := ℂ) f)).comp + (repW.conj.dual Λ) + = (repV.conj.dual Λ).comp + (Module.Dual.transpose (ConjModule.map (k := ℂ) f)) := + LinearMap.ext fun ψ => LinearMap.ext fun v => + (congrArg ψ (LinearMap.congr_fun (hf Λ⁻¹) + ((conjEquiv (k := ℂ) (M := V)).symm v))).symm + show (LinearMap.prodMap (TensorProduct.map LinearMap.id (Module.Dual.transpose f)) + (TensorProduct.map LinearMap.id + (Module.Dual.transpose (ConjModule.map (k := ℂ) f)))).comp + (LinearMap.prodMap + (TensorProduct.map (DerivAlgebraComplex.repLorentzGroup Λ) (repW.dual Λ)) + (TensorProduct.map (DerivAlgebraComplex.repLorentzGroup Λ) (repW.conj.dual Λ))) + = (LinearMap.prodMap + (TensorProduct.map (DerivAlgebraComplex.repLorentzGroup Λ) (repV.dual Λ)) + (TensorProduct.map (DerivAlgebraComplex.repLorentzGroup Λ) (repV.conj.dual Λ))).comp + (LinearMap.prodMap (TensorProduct.map LinearMap.id (Module.Dual.transpose f)) + (TensorProduct.map LinearMap.id + (Module.Dual.transpose (ConjModule.map (k := ℂ) f)))) + rw [LinearMap.prodMap_comp, LinearMap.prodMap_comp, ← TensorProduct.map_comp, + ← TensorProduct.map_comp, ← TensorProduct.map_comp, ← TensorProduct.map_comp, + LinearMap.id_comp, LinearMap.comp_id, hdual, hconj] + /-- **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. -/ @@ -404,3 +443,157 @@ noncomputable def JetComponentSpace.prodEquiv (V W : Type) [AddCommGroup V] [Mod (LinearEquiv.prodCongr (TensorProduct.prodRight ℂ ℂ _ _ _) (TensorProduct.prodRight ℂ ℂ _ _ _)).trans (LinearEquiv.prodProdProdComm ℂ _ _ _ _) + +/-! + +## The component space of a finite direct sum + +The binary splitting above extends to a finite family. Both halves of the component space +split for the same two reasons as before — the dual of a finite product is the product of +the duals, and conjugation commutes with products — and the derivative label, carried by +the `DerivAlgebraComplex` factor, is untouched by either. The index type must be finite: +the dual of an infinite product is strictly larger than the product of the duals, and +`TensorProduct.piRight` is an equivalence only in the finite case. + +This is the component-space counterpart of `MatterField.pi`: the component functions of +the direct sum of a finite family of matter fields are the families of component +functions of the summands, so nothing is lost or gained by assembling the species into +one field before taking components. + +-/ + +section Pi + +variable {ι : Type} [Fintype ι] [DecidableEq ι] (E : ι → Type) + [∀ i, AddCommGroup (E i)] [∀ i, Module ℂ (E i)] + +/-- **The unconjugated half of the component space of a finite direct sum splits.** The + symbols `∂_s ψ_α` of a `(∀ i, E i)`-valued field are the families, over the index, of + the symbols of the summands: the dual distributes over the finite product and the + derivative label is untouched. -/ +noncomputable def JetComponentSpace.fstPiEquiv : + (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (∀ i, E i)) + ≃ₗ[ℂ] ∀ i, DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (E i) := + (TensorProduct.congr (LinearEquiv.refl ℂ DerivAlgebraComplex) + (LinearMap.lsum ℂ E ℂ).symm).trans + (TensorProduct.piRight ℂ ℂ DerivAlgebraComplex fun i => Module.Dual ℂ (E i)) + +/-- On a pure symbol the splitting restricts the target index to one summand: the + component `∂_s ψ_α` of the direct sum in the summand `i` is `∂_s` of the covector `φ` + precomposed with the inclusion of that summand. -/ +@[simp] +lemma JetComponentSpace.fstPiEquiv_tmul (a : DerivAlgebraComplex) + (φ : Module.Dual ℂ (∀ i, E i)) (i : ι) : + fstPiEquiv E (a ⊗ₜ[ℂ] φ) i = a ⊗ₜ[ℂ] (φ ∘ₗ LinearMap.single ℂ E i) := rfl + +/-- **The conjugate half of the component space of a finite direct sum splits**, by the + same argument applied to the conjugate modules, using that conjugation commutes with + products. -/ +noncomputable def JetComponentSpace.sndPiEquiv : + (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule (∀ i, E i))) + ≃ₗ[ℂ] ∀ i, DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule (E i)) := + (TensorProduct.congr (LinearEquiv.refl ℂ DerivAlgebraComplex) + (((ConjModule.piEquiv (k := ℂ) E).symm.dualMap).trans + (LinearMap.lsum ℂ (fun i => ConjModule (E i)) ℂ).symm)).trans + (TensorProduct.piRight ℂ ℂ DerivAlgebraComplex fun i => Module.Dual ℂ (ConjModule (E i))) + +/-- On a pure conjugate symbol the splitting again restricts the target index to one + summand, the inclusion being read through the conjugation. -/ +@[simp] +lemma JetComponentSpace.sndPiEquiv_tmul (a : DerivAlgebraComplex) + (ψ : Module.Dual ℂ (ConjModule (∀ i, E i))) (i : ι) : + sndPiEquiv E (a ⊗ₜ[ℂ] ψ) i + = a ⊗ₜ[ℂ] (ψ ∘ₗ ConjModule.map (k := ℂ) (LinearMap.single ℂ E i)) := rfl + +/-- The splitting sends the family supported on one summand back to the pullback along + the projection onto that summand: a component function of the summand `i`, read as a + component function of the whole, is `φ ∘ proj i`. -/ +lemma JetComponentSpace.fstPiEquiv_symm_single (i : ι) + (z : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (E i)) : + (fstPiEquiv E).symm (Pi.single i z) + = TensorProduct.map LinearMap.id (Module.Dual.transpose (LinearMap.proj i)) z := by + refine (fstPiEquiv E).injective (funext fun j => ?_) + rw [LinearEquiv.apply_symm_apply] + induction z using TensorProduct.induction_on with + | zero => simp + | tmul a φ => + rw [TensorProduct.map_tmul, fstPiEquiv_tmul, LinearMap.id_apply] + by_cases hij : i = j + · subst hij + rw [Pi.single_eq_same] + exact congrArg (fun ψ => a ⊗ₜ[ℂ] ψ) + (LinearMap.ext fun v => (congrArg φ (Pi.single_eq_same i v)).symm) + · have h0 : (Module.Dual.transpose (LinearMap.proj i) φ).comp + (LinearMap.single ℂ E j) = 0 := + LinearMap.ext fun v => (congrArg φ (Pi.single_eq_of_ne hij v)).trans (map_zero φ) + rw [Pi.single_eq_of_ne (Ne.symm hij), h0, TensorProduct.tmul_zero] + | add x y hx hy => + simp only [Pi.single_add, Pi.add_apply, map_add, hx, hy] + +/-- The conjugate half of the splitting behaves in the same way, the projection read + through the conjugation. -/ +lemma JetComponentSpace.sndPiEquiv_symm_single (i : ι) + (z : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule (E i))) : + (sndPiEquiv E).symm (Pi.single i z) + = TensorProduct.map LinearMap.id + (Module.Dual.transpose (ConjModule.map (k := ℂ) (LinearMap.proj i))) z := by + refine (sndPiEquiv E).injective (funext fun j => ?_) + rw [LinearEquiv.apply_symm_apply] + induction z using TensorProduct.induction_on with + | zero => simp + | tmul a φ => + rw [TensorProduct.map_tmul, sndPiEquiv_tmul, LinearMap.id_apply] + by_cases hij : i = j + · subst hij + rw [Pi.single_eq_same] + exact congrArg (fun ψ => a ⊗ₜ[ℂ] ψ) + (LinearMap.ext fun v => (congrArg φ (Pi.single_eq_same i v)).symm) + · have h0 : (Module.Dual.transpose + (ConjModule.map (k := ℂ) (LinearMap.proj i)) φ).comp + (ConjModule.map (k := ℂ) (LinearMap.single ℂ E j)) = 0 := + LinearMap.ext fun v => (congrArg φ (Pi.single_eq_of_ne hij v)).trans (map_zero φ) + rw [Pi.single_eq_of_ne (Ne.symm hij), h0, TensorProduct.tmul_zero] + | add x y hx hy => + simp only [Pi.single_add, Pi.add_apply, map_add, hx, hy] + +/-- **The component space of a finite direct sum splits.** The component functions of a + `(∀ i, E i)`-valued field are exactly the families, over the index, of the component + functions of the summands. Both halves split by `fstPiEquiv` and `sndPiEquiv`, and the + pair of families is reassembled into a family of pairs index by index. -/ +noncomputable def JetComponentSpace.piEquiv : + JetComponentSpace (∀ i, E i) ≃ₗ[ℂ] ∀ i, JetComponentSpace (E i) where + toFun x i := (fstPiEquiv E x.1 i, sndPiEquiv E x.2 i) + map_add' x y := funext fun i => Prod.ext (by simp) (by simp) + map_smul' c x := funext fun i => Prod.ext (by simp) (by simp) + invFun y := ((fstPiEquiv E).symm (fun i => (y i).1), (sndPiEquiv E).symm (fun i => (y i).2)) + left_inv x := Prod.ext (by simp) (by simp) + right_inv y := funext fun i => Prod.ext (by simp) (by simp) + +@[simp] +lemma JetComponentSpace.piEquiv_apply (x : JetComponentSpace (∀ i, E i)) (i : ι) : + piEquiv E x i = (fstPiEquiv E x.1 i, sndPiEquiv E x.2 i) := rfl + +@[simp] +lemma JetComponentSpace.piEquiv_symm_apply (y : ∀ i, JetComponentSpace (E i)) : + (piEquiv E).symm y = + ((fstPiEquiv E).symm (fun i => (y i).1), (sndPiEquiv E).symm (fun i => (y i).2)) := rfl + +/-- **The summand of one species is the pullback along the projection onto it.** A + component function of the summand `i`, placed in the family and read back as a component + function of the whole `(∀ i, E i)`-valued field, is that function precomposed with the + projection `∀ i, E i → E i`. This is what identifies the splitting with the species + inclusions of a direct sum of component spaces. -/ +lemma JetComponentSpace.piEquiv_symm_single (i : ι) (x : JetComponentSpace (E i)) : + (piEquiv E).symm (Pi.single i x) = comap (LinearMap.proj i) x := by + have hfst : (fun j => ((Pi.single i x : ∀ j, JetComponentSpace (E j)) j).1) + = Pi.single i x.1 := + funext fun j => + Pi.apply_single (fun j (p : JetComponentSpace (E j)) => p.1) (fun _ => rfl) i x j + have hsnd : (fun j => ((Pi.single i x : ∀ j, JetComponentSpace (E j)) j).2) + = Pi.single i x.2 := + funext fun j => + Pi.apply_single (fun j (p : JetComponentSpace (E j)) => p.2) (fun _ => rfl) i x j + rw [piEquiv_symm_apply, hfst, hsnd, fstPiEquiv_symm_single, sndPiEquiv_symm_single] + rfl + +end Pi diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Pi.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Pi.lean new file mode 100644 index 000000000..00c14b3ba --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Pi.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.GaugeTheory.MatterField.Prod +/-! +# The direct sum of a finite family of matter fields + +## i. Overview + +`MatterField.prod` sums two matter fields of the same mass weight. This file does the same +for a finite family `M : ι → MatterField jets`, producing a single matter field valued in +`∀ i, (M i).V`. It is the operation that turns the several species of a theory into one +field: the fifteen fermionic multiplets of the Standard Model become one fermion field, +carried by `GaugeFieldData.fermionMatterField`. + +The binary and indexed versions are the same construction with `LinearMap.prodMap` +replaced by `LinearMap.piMap` and `jetProdEquiv` by `jetPiEquiv`, so the proofs run in +parallel; only the diagonal-map algebra used along the way differs. As in the binary case +the mass weight has to be shared, and is taken as a hypothesis: a `MatterField` carries +one weight, which is what makes the mass-weight grading of its field algebra well defined. + +Finiteness of `ι` is essential and not merely convenient. `jetPiEquiv` — the +identification of the jets of the product with the product of the jets, through which the +jet gauge action is defined — exists only for a finite index type, and finiteness of the +value space, a field of `MatterField`, would fail for an infinite family in any case. + +## ii. Key results + +- `MatterField.repJetPi` : the jet gauge action of an indexed direct sum. +- `MatterField.repAlgebraPi` : the infinitesimal gauge action of an indexed direct sum. +- `MatterField.repCoeff_repJetPi` : its base-point Taylor coefficients are the family of + those of the summands. +- `MatterField.pi` : the direct sum of a finite family of matter fields of one mass + weight. +- `MatterField.jetComponentSpacePiEquiv` : the component space of the direct sum is the + family of the component spaces of the summands. + +## iii. Table of contents + +- A. Diagonal maps of an indexed product +- B. The direct sum of a finite family of matter fields +- C. The component space of the direct sum + +-/ + +@[expose] public section + +open Matrix MatrixGroups TensorProduct + +namespace MatterField + +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} + +/-! + +## A. Diagonal maps of an indexed product + +Every piece of data of the direct sum acts index by index, that is through +`LinearMap.piMap`. The four facts about that construction used below — that it is +additive, negative-preserving and multiset-sum-preserving in the family, and that it +composes index by index — all hold because `piMap` is evaluated pointwise, so each is a +single `LinearMap.ext`. + +-/ + +section Diagonal + +variable {ι : Type} {W : ι → Type} [∀ i, AddCommGroup (W i)] [∀ i, Module ℂ (W i)] + +private lemma piMap_add_piMap (f g : ∀ i, W i →ₗ[ℂ] W i) : + LinearMap.piMap (fun i => f i + g i) = LinearMap.piMap f + LinearMap.piMap g := + LinearMap.ext fun _ => rfl + +private lemma piMap_neg (f : ∀ i, W i →ₗ[ℂ] W i) : + LinearMap.piMap (fun i => -f i) = -LinearMap.piMap f := + LinearMap.ext fun _ => rfl + +private lemma piMap_comp (f g : ∀ i, W i →ₗ[ℂ] W i) : + (LinearMap.piMap f).comp (LinearMap.piMap g) + = LinearMap.piMap fun i => (f i).comp (g i) := + LinearMap.ext fun _ => rfl + +private lemma piMap_multiset_sum {κ : Type} (S : Multiset κ) + (f : κ → ∀ i, W i →ₗ[ℂ] W i) : + LinearMap.piMap (fun i => (S.map fun k => f k i).sum) + = (S.map fun k => LinearMap.piMap (f k)).sum := by + induction S using Multiset.induction_on with + | empty => exact LinearMap.ext fun _ => rfl + | cons k S ih => + rw [show (fun i => ((k ::ₘ S).map fun k => f k i).sum) + = fun i => f k i + (S.map fun k => f k i).sum from + funext fun i => by rw [Multiset.map_cons, Multiset.sum_cons], + piMap_add_piMap, ih, Multiset.map_cons, Multiset.sum_cons] + +end Diagonal + +/-! + +## B. The direct sum of a finite family of matter fields + +-/ + +section Pi + +variable {ι : Type} [Fintype ι] [DecidableEq ι] (M : ι → MatterField jets) + +/-- The product of a family of representations, acting index by index. This is the + indexed analogue of `Representation.prod`, which Mathlib provides only in the binary + case. -/ +noncomputable def repPi {W : ι → Type} [∀ i, AddCommGroup (W i)] + [∀ i, Module ℂ (W i)] (ρ : ∀ i, Representation ℂ G (W i)) : + Representation ℂ G (∀ i, W i) where + toFun U := LinearMap.piMap fun i => ρ i U + map_one' := by + refine LinearMap.ext fun x => funext fun i => ?_ + rw [show LinearMap.piMap (fun i => ρ i 1) x i = ρ i 1 (x i) from rfl, map_one] + rfl + map_mul' U W := by + refine LinearMap.ext fun x => funext fun i => ?_ + rw [show LinearMap.piMap (fun i => ρ i (U * W)) x i = ρ i (U * W) (x i) from rfl, + map_mul] + rfl + +/-- **The jet gauge action of an indexed direct sum**: the family of actions, read + through the identification of the jets of `∀ i, (M i).V` with the family of jets. -/ +noncomputable def repJetPi : Representation ℂ G (JetRing ⊗[ℂ] (∀ i, (M i).V)) where + toFun U := LinearEquiv.conjRingEquiv (jetPiEquiv fun i => (M i).V).symm + (repPi (fun i => (M i).repJet) U) + map_one' := by rw [map_one, map_one] + map_mul' U W := by rw [map_mul, map_mul] + +lemma repJetPi_apply (U : G) (z : JetRing ⊗[ℂ] (∀ i, (M i).V)) : + repJetPi M U z = (jetPiEquiv fun i => (M i).V).symm + (fun i => (M i).repJet U (jetPiEquiv (fun i => (M i).V) z i)) := rfl + +/-- **The infinitesimal action of an indexed direct sum**: the family of actions, one on + each summand. -/ +noncomputable def repAlgebraPi : 𝔤 →ₗ[ℝ] (∀ i, (M i).V) →ₗ[ℂ] (∀ i, (M i).V) where + toFun c := LinearMap.piMap fun i => (M i).repAlgebra c + map_add' c₁ c₂ := by + rw [show (fun i => (M i).repAlgebra (c₁ + c₂)) + = fun i => (M i).repAlgebra c₁ + (M i).repAlgebra c₂ from + funext fun i => map_add _ _ _, piMap_add_piMap] + map_smul' r c := by + rw [show (fun i => (M i).repAlgebra (r • c)) = fun i => r • (M i).repAlgebra c from + funext fun i => map_smul _ _ _, RingHom.id_apply] + exact LinearMap.ext fun _ => rfl + +omit [Fintype ι] [DecidableEq ι] in +@[simp] +lemma repAlgebraPi_apply (c : 𝔤) : + repAlgebraPi M c = LinearMap.piMap fun i => (M i).repAlgebra c := rfl + +/-- The base-point Taylor coefficients of the summed jet action are the family of the + coefficients of the summands: `jetOfConstant`, `jetIteratedDeriv` and `jetEval` all act + index by index through `jetPiEquiv`. -/ +lemma repCoeff_repJetPi (U : G) (x : Multiset (Fin 1 ⊕ Fin 3)) : + GaugeAlgebraRealization.repCoeff (repJetPi M) U x = + LinearMap.piMap fun i => GaugeAlgebraRealization.repCoeff (M i).repJet U x := by + refine LinearMap.ext fun p => funext fun i => ?_ + show jetEval (jetIteratedDeriv x (repJetPi M U (jetOfConstant p))) i = _ + rw [jetEval_pi, jetPiEquiv_jetIteratedDeriv, + show jetPiEquiv (fun i => (M i).V) (repJetPi M U (jetOfConstant p)) i + = (M i).repJet U (jetOfConstant (p i)) from by + rw [repJetPi_apply, LinearEquiv.apply_symm_apply] + rfl] + rfl + +/-- **The index-by-index algebra action generates the index-by-index jet action**: both + laws of `IsInfinitesimalActionOf` are the corresponding laws of the summands, read + through `repCoeff_repJetPi`, since `piMap` is additive in the family and composes index + by index. -/ +lemma isInfinitesimalActionOf_repAlgebraPi : + jets.IsInfinitesimalActionOf (repAlgebraPi M) (repJetPi M) where + repCoeff_cons U μ x := by + rw [repCoeff_repJetPi, + show (fun i => GaugeAlgebraRealization.repCoeff (M i).repJet U (μ ::ₘ x)) + = fun i => -((x.antidiagonal.map fun p => + (M i).repAlgebra (jets.evalLie (jets.iteratedDeriv p.1 + (jets.maurerCartan U μ))) ∘ₗ + GaugeAlgebraRealization.repCoeff (M i).repJet U p.2).sum) from + funext fun i => (M i).repAlgebra_isInfinitesimalAction.repCoeff_cons U μ x, + piMap_neg, piMap_multiset_sum] + refine congrArg Neg.neg (congrArg Multiset.sum (Multiset.map_congr rfl fun p _ => ?_)) + rw [repCoeff_repJetPi, repAlgebraPi_apply, piMap_comp] + repCoeff_act U x c := by + rw [repCoeff_repJetPi, repAlgebraPi_apply, piMap_comp, + show (fun i => (GaugeAlgebraRealization.repCoeff (M i).repJet U x).comp + ((M i).repAlgebra c)) + = fun i => ((x.antidiagonal.map fun p => + (M i).repAlgebra (jets.adjointCoeff U p.1 c) ∘ₗ + GaugeAlgebraRealization.repCoeff (M i).repJet U p.2).sum) from + funext fun i => (M i).repAlgebra_isInfinitesimalAction.repCoeff_act U x c, + piMap_multiset_sum] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p _ => ?_) + rw [repCoeff_repJetPi, repAlgebraPi_apply, piMap_comp] + +/-- **The direct sum of a finite family of matter fields** sharing one mass weight `w`: + one field valued in `∀ i, (M i).V`, with every action acting index by index. The shared + weight is a hypothesis for the same reason as in the binary case — a `MatterField` + carries a single weight — and here it says that the whole family is degenerate in mass + dimension, as the fermions of a gauge theory are. -/ +noncomputable def pi (w : ℕ) (_h : ∀ i, (M i).massWeight = w) : MatterField jets where + V := ∀ i, (M i).V + repLorentz := repPi fun i => (M i).repLorentz + repJet := repJetPi M + repAlgebra := repAlgebraPi M + repJet_smul U χ z := by + rw [repJetPi_apply, repJetPi_apply, + show (fun i => (M i).repJet U (jetPiEquiv (fun i => (M i).V) (χ • z) i)) + = fun i => χ • (M i).repJet U (jetPiEquiv (fun i => (M i).V) z i) from + funext fun i => by rw [jetPiEquiv_smul, (M i).repJet_smul], + jetPiEquiv_symm_smul] + repAlgebra_isInfinitesimalAction := isInfinitesimalActionOf_repAlgebraPi M + massWeight := w + +lemma pi_V (w : ℕ) (h : ∀ i, (M i).massWeight = w) : (pi M w h).V = ∀ i, (M i).V := rfl + +@[simp] +lemma pi_repJet (w : ℕ) (h : ∀ i, (M i).massWeight = w) : + (pi M w h).repJet = repJetPi M := rfl + +@[simp] +lemma pi_repAlgebra (w : ℕ) (h : ∀ i, (M i).massWeight = w) : + (pi M w h).repAlgebra = repAlgebraPi M := rfl + +@[simp] +lemma pi_massWeight (w : ℕ) (h : ∀ i, (M i).massWeight = w) : + (pi M w h).massWeight = w := rfl + +/-- The Lorentz action of the direct sum is the family of Lorentz actions, acting index by + index. -/ +lemma pi_repLorentz_apply (w : ℕ) (h : ∀ i, (M i).massWeight = w) (Λ : SL(2,ℂ)) + (v : ∀ i, (M i).V) (i : ι) : + (pi M w h).repLorentz Λ v i = (M i).repLorentz Λ (v i) := rfl + +/-! + +## C. The component space of the direct sum + +The direct sum was built so that the several species of a theory can be treated as one +field. Nothing is lost in doing so at the level of component functions either: the +symbols `∂_s ψ_α` and `∂_s ψ̄_α` of the summed field are exactly the families, over the +index, of the symbols of the summands. This is the component-space image of the +identification `jetPiEquiv` that defines the summed jet action, and it is the finite +direct sum case of `JetComponentSpace.piEquiv`. + +-/ + +/-- **The component space of a direct sum of matter fields splits**: a component function + of `MatterField.pi M w h` is a family, one component function per summand. The value + space of the direct sum is by construction the product of the value spaces, so this is + `JetComponentSpace.piEquiv` read on the matter field. -/ +noncomputable def jetComponentSpacePiEquiv (w : ℕ) (h : ∀ i, (M i).massWeight = w) : + JetComponentSpace (pi M w h).V ≃ₗ[ℂ] ∀ i, JetComponentSpace (M i).V := + JetComponentSpace.piEquiv fun i => (M i).V + +@[simp] +lemma jetComponentSpacePiEquiv_apply (w : ℕ) (h : ∀ i, (M i).massWeight = w) + (x : JetComponentSpace (pi M w h).V) (i : ι) : + jetComponentSpacePiEquiv M w h x i = + (JetComponentSpace.fstPiEquiv (fun i => (M i).V) x.1 i, + JetComponentSpace.sndPiEquiv (fun i => (M i).V) x.2 i) := rfl + +@[simp] +lemma jetComponentSpacePiEquiv_symm_apply (w : ℕ) (h : ∀ i, (M i).massWeight = w) + (y : ∀ i, JetComponentSpace (M i).V) : + (jetComponentSpacePiEquiv M w h).symm y = + ((JetComponentSpace.fstPiEquiv (fun i => (M i).V)).symm (fun i => (y i).1), + (JetComponentSpace.sndPiEquiv (fun i => (M i).V)).symm (fun i => (y i).2)) := rfl + +end Pi + +end MatterField diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/Jet.lean b/Physlib/ClassicalFieldTheory/JetAlgebra/Jet.lean index a7659d78d..79e133c28 100644 --- a/Physlib/ClassicalFieldTheory/JetAlgebra/Jet.lean +++ b/Physlib/ClassicalFieldTheory/JetAlgebra/Jet.lean @@ -10,6 +10,7 @@ public import Physlib.Relativity.JetRing.Basic public import Physlib.Relativity.DerivAlgebra public import Mathlib.RingTheory.TensorProduct.Basic public import Mathlib.LinearAlgebra.TensorProduct.Prod +public import Mathlib.LinearAlgebra.TensorProduct.Pi public import Mathlib.LinearAlgebra.Basis.Defs public import Mathlib.LinearAlgebra.Dimension.Free /-! @@ -197,3 +198,70 @@ lemma jetEval_prod (z : JetRing ⊗[ℂ] (V × W)) : simp only [map_add, ha, hb, Prod.fst_add, Prod.snd_add, Prod.mk_add_mk] end Prod + +/-! + +## The jets of an indexed product of value spaces + +A field valued in a finite product `∀ i, E i` is a family of fields, one for each index, +and `jetPiEquiv` identifies its jets with the family of their jets. It intertwines the +whole jet toolkit index by index, exactly as `jetProdEquiv` does in the binary case. The +index type has to be finite for the identification to exist at all: a jet of a field +valued in an infinite product need not have all but finitely many of its components +constant, so `TensorProduct.piRightHom` is only an equivalence in the finite case. + +-/ + +section Pi + +variable {ι : Type} [Fintype ι] [DecidableEq ι] (E : ι → Type) + [∀ i, AddCommGroup (E i)] [∀ i, Module ℂ (E i)] + +/-- **The jets of a finite product are the product of the jets**: + `JetRing ⊗ (∀ i, E i)` splits as `∀ i, JetRing ⊗ E i`, the jet-ring factor being + shared. -/ +noncomputable abbrev jetPiEquiv : + JetRing ⊗[ℂ] (∀ i, E i) ≃ₗ[ℂ] ∀ i, JetRing ⊗[ℂ] E i := + TensorProduct.piRight ℂ ℂ JetRing E + +lemma jetPiEquiv_jetOfConstant (v : ∀ i, E i) : + jetPiEquiv E (jetOfConstant v) = fun i => jetOfConstant (v i) := rfl + +lemma jetPiEquiv_jetDeriv (μ : Fin 1 ⊕ Fin 3) (z : JetRing ⊗[ℂ] (∀ i, E i)) (i : ι) : + jetPiEquiv E (jetDeriv μ z) i = jetDeriv μ (jetPiEquiv E z i) := by + induction z using TensorProduct.induction_on with + | zero => simp + | tmul f p => rfl + | add a b ha hb => simp only [map_add, Pi.add_apply, ha, hb] + +lemma jetPiEquiv_jetIteratedDeriv (s : Multiset (Fin 1 ⊕ Fin 3)) + (z : JetRing ⊗[ℂ] (∀ i, E i)) (i : ι) : + jetPiEquiv E (jetIteratedDeriv s z) i = jetIteratedDeriv s (jetPiEquiv E z i) := by + induction s using Multiset.induction_on generalizing z with + | empty => rw [jetIteratedDeriv_zero, jetIteratedDeriv_zero]; rfl + | cons μ t ih => + rw [jetIteratedDeriv_cons, LinearMap.comp_apply, jetPiEquiv_jetDeriv, ih, + jetIteratedDeriv_cons, LinearMap.comp_apply] + +/-- The identification is `JetRing`-linear: multiplication by a scalar jet acts on every + component. -/ +lemma jetPiEquiv_smul (χ : JetRing) (z : JetRing ⊗[ℂ] (∀ i, E i)) (i : ι) : + jetPiEquiv E (χ • z) i = χ • (jetPiEquiv E z i) := by + induction z using TensorProduct.induction_on with + | zero => simp + | tmul f p => rw [TensorProduct.smul_tmul', smul_eq_mul]; rfl + | add a b ha hb => simp only [smul_add, map_add, Pi.add_apply, ha, hb] + +lemma jetPiEquiv_symm_smul (χ : JetRing) (a : ∀ i, JetRing ⊗[ℂ] E i) : + (jetPiEquiv E).symm (fun i => χ • a i) = χ • (jetPiEquiv E).symm a := by + refine (jetPiEquiv E).injective (funext fun i => ?_) + rw [LinearEquiv.apply_symm_apply, jetPiEquiv_smul, LinearEquiv.apply_symm_apply] + +lemma jetEval_pi (z : JetRing ⊗[ℂ] (∀ i, E i)) (i : ι) : + jetEval z i = jetEval (jetPiEquiv E z i) := by + induction z using TensorProduct.induction_on with + | zero => simp + | tmul f p => rfl + | add a b ha hb => simp only [map_add, Pi.add_apply, ha, hb] + +end Pi diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/LocalFieldAlgebra.lean b/Physlib/ClassicalFieldTheory/JetAlgebra/LocalFieldAlgebra.lean index b77708a62..9ff72663f 100644 --- a/Physlib/ClassicalFieldTheory/JetAlgebra/LocalFieldAlgebra.lean +++ b/Physlib/ClassicalFieldTheory/JetAlgebra/LocalFieldAlgebra.lean @@ -5,7 +5,7 @@ Authors: Nathaneal Sajan -/ module -public import Physlib.ClassicalFieldTheory.JetAlgebra.GaugeFieldData +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeFieldData.Basic public import Physlib.Mathematics.AlgebraGeneration public import Physlib.Mathematics.SymmetricAlgebra public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basic diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/SpeciesGenerators.lean b/Physlib/ClassicalFieldTheory/JetAlgebra/SpeciesGenerators.lean index eee173f89..edc009b0c 100644 --- a/Physlib/ClassicalFieldTheory/JetAlgebra/SpeciesGenerators.lean +++ b/Physlib/ClassicalFieldTheory/JetAlgebra/SpeciesGenerators.lean @@ -29,6 +29,12 @@ single `JetComponentSpace (∀ i, V i)` on the product of the value spaces, is a carries only one mass weight, since its scaling commutes with `JetComponentSpace.comap` and so cannot distinguish the species. The direct sum records one weight per species. +That is the only difference between the two. When the species do share a weight — as the +fermions of a gauge theory do — the direct sum *is* the component space of the product, +compatibly with the Lorentz action and the scaling; this is +`GaugeFieldData.fermionGeneratorsEquiv`, which recovers the presentation of the fermion +content as one field that a physicist writes down. + Nothing here is finite. Neither the index type `ι` nor any of the value spaces `V i` is assumed finite, and the component spaces are infinite-dimensional in any case, since a derivative label ranges over all multisets of directions. Only `DecidableEq ι` is used, diff --git a/Physlib/Mathematics/ConjModule.lean b/Physlib/Mathematics/ConjModule.lean index d3897a29f..e8b9ff20b 100644 --- a/Physlib/Mathematics/ConjModule.lean +++ b/Physlib/Mathematics/ConjModule.lean @@ -32,6 +32,7 @@ conjugate-linear identity `conjEquiv : M ≃ₛₗ[starRingEnd k] ConjModule M`, - `conjEquiv` : the canonical conjugate-linear equivalence `M ≃ₛₗ[starRingEnd k] ConjModule M`. - `ConjModule.involution` : the involution `ConjModule (ConjModule M) ≃ₗ[k] M`. - `Basis.conj` : a basis of `M` transported to a basis of `ConjModule M` (coordinates by `star`). +- `ConjModule.prodEquiv`, `ConjModule.piEquiv` : conjugation commutes with products. -/ @@ -220,6 +221,33 @@ def prodEquiv : ConjModule (M × N) ≃ₗ[k] ConjModule M × ConjModule N where 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 +section Pi + +variable {ι : Type*} (P : ι → Type*) [∀ i, AddCommGroup (P i)] [∀ i, Module k (P i)] + +/-- **Conjugation commutes with arbitrary products.** The conjugate of a product of a +family of modules is the product of their conjugates, by the identity underlying +function: the twisted scalar action is applied componentwise, so no finiteness of the +index type is needed. -/ +def piEquiv : ConjModule (∀ i, P i) ≃ₗ[k] ∀ i, ConjModule (P i) where + toFun x i := x i + map_add' _ _ := rfl + map_smul' _ _ := rfl + invFun x i := x i + left_inv _ := rfl + right_inv _ := rfl + +@[simp] +lemma piEquiv_apply (x : ConjModule (∀ i, P i)) (i : ι) : + (piEquiv P : ConjModule (∀ i, P i) ≃ₗ[k] ∀ i, ConjModule (P i)) x i + = map (k := k) (LinearMap.proj i) x := rfl + +lemma piEquiv_symm_apply (x : ∀ i, ConjModule (P i)) (i : ι) : + map (k := k) (LinearMap.proj i) + ((piEquiv P : ConjModule (∀ i, P i) ≃ₗ[k] ∀ i, ConjModule (P i)).symm x) = x i := rfl + +end Pi + /-- 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/FieldData.lean b/Physlib/Particles/StandardModel/FieldData.lean index db14cee59..86b2266af 100644 --- a/Physlib/Particles/StandardModel/FieldData.lean +++ b/Physlib/Particles/StandardModel/FieldData.lean @@ -5,7 +5,7 @@ Authors: Nathaneal Sajan -/ module -public import Physlib.ClassicalFieldTheory.JetAlgebra.GaugeFieldData +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeFieldData.Basic public import Physlib.ClassicalFieldTheory.JetAlgebra.LocalFieldAlgebra public import Physlib.Particles.StandardModel.Fermions.MatterField public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData From 77086f8054069f76a6affef4198604e4bed0922f Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 9 Sep 2026 12:42:28 +0100 Subject: [PATCH 312/367] feat: Move Fermion Generators around --- .../GaugeTheory/GaugeFieldData/Basic.lean | 256 +++--------------- .../GaugeFieldData/BosonGenerators.lean | 205 +++++++++++--- .../GaugeFieldData/FermionGenerators.lean | 200 +++++++++++--- .../JetAlgebra/LocalFieldAlgebra.lean | 6 +- .../Particles/StandardModel/FieldData.lean | 1 - 5 files changed, 373 insertions(+), 295 deletions(-) diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/Basic.lean index d04034d08..fded17892 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/Basic.lean @@ -5,11 +5,10 @@ Authors: Nathaneal Sajan -/ module -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.Basic public import Physlib.ClassicalFieldTheory.JetAlgebra.SpeciesGenerators /-! -# The field data of a gauge theory and its generator spaces +# The field data of a gauge theory ## i. Overview @@ -21,61 +20,42 @@ matter content is a finite family of fermionic species and a finite family of bosonic species, each given by an existing `MatterField jets`. -`GaugeFieldData jets` bundles the matter content over such a context. From it this file -derives, with no further data, - -* the fermionic and bosonic generator spaces, as `SpeciesComponentSpace` of the families - of value spaces; -* the connection generator space, as the existing `GaugeBoson.JetComponentSpace 𝔤`; -* the Lorentz and jet gauge actions and the mass-weight scaling on those spaces, - assembled species by species. - -The value spaces of the species assemble in a second, independent way: not into a direct -sum of component spaces but into a single finite-dimensional module, the `FermionModule` -and `BosonModule` of the sibling files, each carrying the structure of one `MatterField` -in `FermionMatterField` and `BosonMatterField`. That assembly needs the species to share -a mass weight, which is exactly what the generator spaces built here do not need, and the -two are used for different purposes: one field for writing the theory, one graded -generator space per species for grading its algebra. When the weights do agree the two -presentations of the generators are the same, by -`GaugeFieldData.fermionGeneratorsEquiv`. +`GaugeFieldData jets` bundles the matter content over such a context. This file is the +datum itself and the value spaces it names; everything derived from it lives in the sibling +files of this directory: + +* `GaugeFieldData.FermionGenerators` and `GaugeFieldData.BosonGenerators` — the generator + spaces, as `SpeciesComponentSpace` of the families of value spaces, together with the + Lorentz and jet gauge actions and the mass-weight scaling assembled species by species, + and the identification of each with the component space of a single matter field; +* `GaugeFieldData.FermionModule` and `GaugeFieldData.BosonModule` — the value spaces of all + the species at once; +* `GaugeFieldData.FermionMatterField` and `GaugeFieldData.BosonMatterField` — those modules + carrying the structure of one matter field, when the species share a mass weight. + +The connection generator space is not among them: it is the existing +`GaugeBoson.JetComponentSpace 𝔤`, fixed by the gauge context alone. The algebra built on the three generator spaces, `GaugeFieldData.LocalFieldAlgebra`, and its mapping-out universal property are in -`Physlib.ClassicalFieldTheory.JetAlgebra.LocalFieldAlgebra`, which imports this file. The -split is one of subject matter: here the datum and the spaces it determines, there the -algebra of local expressions on them. +`Physlib.ClassicalFieldTheory.JetAlgebra.LocalFieldAlgebra`. The split is one of subject +matter: here the datum and the spaces it determines, there the algebra of local expressions +on them. It is field and transformation data before a Lagrangian, so packaging the species' representations separately certifies no physical compatibility between them, and no invariance is claimed here. -The generator spaces carry derivative symbols of every order and are infinite-dimensional -however few species there are. Finiteness of the species types and of the value spaces is -not inherited by them. - ## ii. Key results - `GaugeFieldData` : the matter content of a gauge theory over a gauge context. -- `GaugeFieldData.FermionGenerators`, `GaugeFieldData.BosonGenerators` : the species - generator spaces. -- `GaugeFieldData.inclFermion`, `GaugeFieldData.inclBoson` : the inclusion of the - component space of one species. -- `GaugeFieldData.repLorentzFermion`, `GaugeFieldData.repJetFermion` : the Lorentz and jet - gauge actions assembled on the generator spaces. -- `GaugeFieldData.massWeightScaleFermion` : the mass-weight scaling carrying the weight of - each species. +- `GaugeFieldData.FermionValue`, `GaugeFieldData.BosonValue` : the value space of a + species. ## iii. Table of contents - A. The gauge context and the field datum -- B. The generator spaces - - B.1. The species generator spaces - - B.2. The connection generator space -- C. The transformation data on the generator spaces - - C.1. The Lorentz action - - C.2. The jet gauge action - - C.3. The mass weights +- B. The value spaces of the species -/ @@ -141,9 +121,23 @@ variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] /-! -## B. The generator spaces +## B. The value spaces of the species -### B.1. The species generator spaces +The datum records one matter field per species, so the value space of a species is simply +the value space of that matter field. Everything built on those value spaces is in the +sibling files: the fermionic and bosonic generator spaces, with the Lorentz action, the jet +gauge action and the mass-weight scaling on them, are in +`Physlib.ClassicalFieldTheory.GaugeTheory.GaugeFieldData.FermionGenerators` and +`...BosonGenerators`, which also identify each with the component space of a single matter +field; the value spaces themselves assemble into the `FermionModule` and `BosonModule` of +the remaining siblings. + +The connection is not a species. It is fixed by the gauge context alone, and its component +functions `∂_s A_μ^φ` are the existing `GaugeBoson.JetComponentSpace 𝔤`, used without a new +name. They are real, a connection being a real object, which is why the third generator +family of the local field algebra is a real vector space, complexified once inside the +algebra. Finite dimensionality of `𝔤` is what makes `Module.Dual ℝ 𝔤` the span of the +adjoint components, so that these generators really are the `A_μ^a`. -/ @@ -153,178 +147,4 @@ abbrev FermionValue (i : T.FermionSpecies) : Type := (T.fermion i).V /-- The value space of a bosonic species. -/ abbrev BosonValue (j : T.BosonSpecies) : Type := (T.boson j).V -/-- The fermionic generator space of the datum, holding the component functions `∂_s ψ_α` - and their conjugates of every fermionic species at once, as a direct sum over the - species. The direct sum, rather than a single component space on the product of the - value spaces, is what lets the species carry different mass weights. -/ -abbrev FermionGenerators : Type := SpeciesComponentSpace T.FermionValue - -/-- The bosonic generator space of the datum, assembled from the bosonic species in - the same way. -/ -abbrev BosonGenerators : Type := SpeciesComponentSpace T.BosonValue - -/-- The inclusion of the component space of one fermionic species into the fermionic - generator space. -/ -abbrev inclFermion (i : T.FermionSpecies) : - JetComponentSpace (T.FermionValue i) →ₗ[ℂ] T.FermionGenerators := - SpeciesComponentSpace.incl T.FermionValue i - -/-- The inclusion of the component space of one bosonic species into the bosonic generator - space. -/ -abbrev inclBoson (j : T.BosonSpecies) : - JetComponentSpace (T.BosonValue j) →ₗ[ℂ] T.BosonGenerators := - SpeciesComponentSpace.incl T.BosonValue j - -/-! - -### B.2. The connection generator space - -The connection is not a species. It is fixed by the gauge context alone, and its component -functions `∂_s A_μ^φ` are the existing `GaugeBoson.JetComponentSpace 𝔤`, used below -without a new name. They are real, a connection being a real object, which is why the -third generator family of the local field algebra is a real vector space, complexified -once inside the algebra. Finite dimensionality of `𝔤` is what makes `Module.Dual ℝ 𝔤` the -span of the adjoint components, so that these generators really are the `A_μ^a`. - -## C. The transformation data on the generator spaces - -The datum supplies, per species, a Lorentz representation and a fibrewise action of the -gauge jets. Both land on the generator spaces species by species, so both are assembled by -`SpeciesComponentSpace.rep`. Nothing here asserts that the two actions commute, since -Lorentz transformations act on nonconstant gauge jets, and nothing extends them to the -algebra `J(T)`. - -### C.1. The Lorentz action - --/ - -/-- The Lorentz action on the fermionic generator space, acting on each species through - the Lorentz representation of its matter field. -/ -noncomputable def repLorentzFermion : Representation ℂ SL(2,ℂ) T.FermionGenerators := - SpeciesComponentSpace.rep T.FermionValue fun i => - JetComponentSpace.repLorentzGroup (T.fermion i).repLorentz - -/-- The Lorentz action on the bosonic generator space. -/ -noncomputable def repLorentzBoson : Representation ℂ SL(2,ℂ) T.BosonGenerators := - SpeciesComponentSpace.rep T.BosonValue fun j => - JetComponentSpace.repLorentzGroup (T.boson j).repLorentz - -variable {T} - -@[simp] -lemma repLorentzFermion_inclFermion (Λ : SL(2,ℂ)) (i : T.FermionSpecies) - (x : JetComponentSpace (T.FermionValue i)) : - T.repLorentzFermion Λ (T.inclFermion i x) - = T.inclFermion i (JetComponentSpace.repLorentzGroup (T.fermion i).repLorentz Λ x) := - SpeciesComponentSpace.rep_incl _ Λ i x - -@[simp] -lemma repLorentzBoson_inclBoson (Λ : SL(2,ℂ)) (j : T.BosonSpecies) - (y : JetComponentSpace (T.BosonValue j)) : - T.repLorentzBoson Λ (T.inclBoson j y) - = T.inclBoson j (JetComponentSpace.repLorentzGroup (T.boson j).repLorentz Λ y) := - SpeciesComponentSpace.rep_incl _ Λ j y - -variable (T) - -/-! - -### C.2. The jet gauge action - --/ - -/-- The action of the jet gauge group on the fermionic generator space, acting on each - species through the fibrewise jet action of its matter field. Both the fibrewise - hypothesis and the finite dimensionality of the value space that - `JetComponentSpace.repJet` needs are already fields of `MatterField`. -/ -noncomputable def repJetFermion : Representation ℂ G T.FermionGenerators := - SpeciesComponentSpace.rep T.FermionValue fun i => - JetComponentSpace.repJet (T.fermion i).repJet (T.fermion i).repJet_smul - -/-- The action of the jet gauge group on the bosonic generator space. -/ -noncomputable def repJetBoson : Representation ℂ G T.BosonGenerators := - SpeciesComponentSpace.rep T.BosonValue fun j => - JetComponentSpace.repJet (T.boson j).repJet (T.boson j).repJet_smul - -variable {T} - -@[simp] -lemma repJetFermion_inclFermion (U : G) (i : T.FermionSpecies) - (x : JetComponentSpace (T.FermionValue i)) : - T.repJetFermion U (T.inclFermion i x) - = T.inclFermion i - (JetComponentSpace.repJet (T.fermion i).repJet (T.fermion i).repJet_smul U x) := - SpeciesComponentSpace.rep_incl _ U i x - -@[simp] -lemma repJetBoson_inclBoson (U : G) (j : T.BosonSpecies) - (y : JetComponentSpace (T.BosonValue j)) : - T.repJetBoson U (T.inclBoson j y) - = T.inclBoson j - (JetComponentSpace.repJet (T.boson j).repJet (T.boson j).repJet_smul U y) := - SpeciesComponentSpace.rep_incl _ U j y - -variable (T) - -/-! - -### C.3. The mass weights - --/ - -/-- The mass-weight scaling on the fermionic generator space, with the weight of each - species taken from its matter field. Species of different weight scale differently, - which is the property the direct-sum generator space was chosen to have. -/ -noncomputable def massWeightScaleFermion (c : ℂ) : - T.FermionGenerators →ₗ[ℂ] T.FermionGenerators := - SpeciesComponentSpace.massWeightScale T.FermionValue - (fun i => (T.fermion i).massWeight) c - -/-- The mass-weight scaling on the bosonic generator space. -/ -noncomputable def massWeightScaleBoson (c : ℂ) : - T.BosonGenerators →ₗ[ℂ] T.BosonGenerators := - SpeciesComponentSpace.massWeightScale T.BosonValue (fun j => (T.boson j).massWeight) c - -variable {T} - -/-- On the summand of a fermionic species the scaling is that species' own mass-weight - scaling, with the weight recorded in its matter field. -/ -@[simp] -lemma massWeightScaleFermion_inclFermion (c : ℂ) (i : T.FermionSpecies) - (x : JetComponentSpace (T.FermionValue i)) : - T.massWeightScaleFermion c (T.inclFermion i x) - = T.inclFermion i - (JetComponentSpace.massWeightScale (T.fermion i).massWeight c x) := - SpeciesComponentSpace.massWeightScale_incl _ c i x - -/-- On the summand of a bosonic species the scaling is that species' own mass-weight - scaling. -/ -@[simp] -lemma massWeightScaleBoson_inclBoson (c : ℂ) (j : T.BosonSpecies) - (y : JetComponentSpace (T.BosonValue j)) : - T.massWeightScaleBoson c (T.inclBoson j y) - = T.inclBoson j (JetComponentSpace.massWeightScale (T.boson j).massWeight c y) := - SpeciesComponentSpace.massWeightScale_incl _ c j y - -/-- A component function `∂_s ψ_α` of a fermionic species scales by `c ^ (w + 2 |s|)`, - where `w` is the mass weight of that species. There is one factor of `c` per unit of - mass dimension of the field and two per derivative. -/ -lemma massWeightScaleFermion_inclFermion_basis_tmul (c : ℂ) (i : T.FermionSpecies) - (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (T.FermionValue i)) : - T.massWeightScaleFermion c (T.inclFermion i - ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace (T.FermionValue i))) - = c ^ ((T.fermion i).massWeight + 2 * Multiset.card s) • T.inclFermion i - ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace (T.FermionValue i)) := - SpeciesComponentSpace.massWeightScale_incl_basis_tmul _ c i s φ - -/-- A component function `∂_s φ_α` of a bosonic species scales by `c ^ (w + 2 |s|)` - with that species' own weight `w`. -/ -lemma massWeightScaleBoson_inclBoson_basis_tmul (c : ℂ) (j : T.BosonSpecies) - (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (T.BosonValue j)) : - T.massWeightScaleBoson c (T.inclBoson j - ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace (T.BosonValue j))) - = c ^ ((T.boson j).massWeight + 2 * Multiset.card s) • T.inclBoson j - ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace (T.BosonValue j)) := - SpeciesComponentSpace.massWeightScale_incl_basis_tmul _ c j s φ - end GaugeFieldData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/BosonGenerators.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/BosonGenerators.lean index f012884d5..3d5457d1a 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/BosonGenerators.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/BosonGenerators.lean @@ -7,58 +7,74 @@ module public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeFieldData.BosonMatterField /-! -# The bosonic generators as the components of one scalar field +# The bosonic generators of a gauge theory ## i. Overview -`GaugeFieldData.BosonGenerators` is built species by species, as the direct sum -`⨁ i, JetComponentSpace (T.boson i).V` of the component spaces of the several scalar -multiplets. A physicist writing a theory down does not do this. They write one scalar -field `φ`, valued in the whole bosonic module, and take its component functions -`∂_s φ_α` — a single `JetComponentSpace`, indexed by a target index `α` that runs over all -the multiplets at once. For the Standard Model, with its one Higgs doublet, the two -descriptions are trivially the same; for a two-Higgs-doublet model or any theory with -several scalars they are not, and the content below is what identifies them. +The bosonic species of a `GaugeFieldData` — its scalars — each carry a component space, the +span of the symbols `∂_s φ_α` and their conjugates for that multiplet. This file assembles them into +the **bosonic generator space** of the theory, -This file shows that the two agree. When the bosonic species share a mass weight — the -condition under which `GaugeFieldData.bosonMatterField` exists, and the condition a theory -whose scalars all have the same mass dimension satisfies — there is an isomorphism +`T.BosonGenerators = ⨁ i, JetComponentSpace (T.boson i).V`, -`T.BosonGenerators ≃ₗ[ℂ] JetComponentSpace T.BosonModule`, +together with the transformation data the species supply: the Lorentz action, the action of +the jets of gauge transformations, and the mass-weight scaling, each assembled species by +species. These are the bosonic generators on which +`GaugeFieldData.LocalFieldAlgebra` builds its symmetric algebra. The gauge bosons are not +among them: their generator space is fixed by the gauge algebra alone. + +The direct sum, rather than a single component space on the product of the value spaces, is +what lets the species carry different mass weights: the scaling of one component space is +natural in the value space and so cannot tell the species apart. -and under it the summand of a species is the pullback along the projection onto that -species, `bosonGeneratorsEquiv_inclBoson`. So the generators of one multiplet sit -inside the generators of the whole scalar field exactly as its target components sit -inside the bosonic module, which is what a physicist means by writing `φ_α` with `α` -ranging over everything. +Section C shows what happens when the species *do* share a weight, which is the case in any +theory whose scalars all have the same mass dimension. A physicist does not write each +multiplet with its own component space; they write one scalar field `φ` valued in the whole +bosonic module and take its component functions `∂_s φ_α`, a single `JetComponentSpace` +whose target index `α` runs over everything. For the Standard Model, with its one Higgs +doublet, the two are trivially the same; for a larger scalar sector they are not. -The isomorphism is not merely one of vector spaces: it intertwines the Lorentz action and -the mass-weight scaling with those of the single matter field -`T.bosonMatterField w h`. The mass weight is where the shared weight `w` is needed and -where the species-by-species construction earns its keep — a family of *unequal* weights -has no single `JetComponentSpace.massWeightScale` to be compared with, which is precisely -the reason `SpeciesComponentSpace` was built as a direct sum in the first place. With one -weight that obstruction is gone and the two descriptions coincide. +The two descriptions agree: there is an isomorphism + +`T.BosonGenerators ≃ₗ[ℂ] JetComponentSpace T.BosonModule`, + +under which the summand of a species is the pullback along the projection onto that +species, `bosonGeneratorsEquiv_inclBoson`. So the generators of one multiplet sit inside +the generators of the whole scalar field exactly as its target components sit inside the +bosonic module. The isomorphism is not merely one of vector spaces: it intertwines the +Lorentz action and the mass-weight scaling with those of the single matter field +`T.bosonMatterField w h`, the shared weight `w` being needed for the second of these and +for nothing else. The underlying identification is `JetComponentSpace.piEquiv`, composed with the identification of a direct sum over a finite index with the product. ## ii. Key results -- `GaugeFieldData.bosonGeneratorsEquiv` : the bosonic generator space is the component - space of the bosonic matter field. +- `GaugeFieldData.BosonGenerators` : the bosonic generator space. +- `GaugeFieldData.inclBoson` : the inclusion of the component space of one species. +- `GaugeFieldData.repLorentzBoson`, `GaugeFieldData.repJetBoson` : the Lorentz and jet + gauge actions assembled on it. +- `GaugeFieldData.massWeightScaleBoson` : the mass-weight scaling carrying the weight of + each species. +- `GaugeFieldData.bosonGeneratorsEquiv` : with one shared weight, the generator space is + the component space of the bosonic matter field. - `GaugeFieldData.bosonGeneratorsEquiv_inclBoson` : a species sits inside it as the pullback along the projection onto that species. -- `GaugeFieldData.bosonGeneratorsEquiv_repLorentzBoson` : the identification is - Lorentz-equivariant. -- `GaugeFieldData.bosonGeneratorsEquiv_massWeightScaleBoson` : it carries the - species-wise mass-weight scaling to the single scaling of weight `w`. +- `GaugeFieldData.bosonGeneratorsEquiv_repLorentzBoson`, + `GaugeFieldData.bosonGeneratorsEquiv_massWeightScaleBoson` : the identification + carries the Lorentz action and the mass-weight scaling across. ## iii. Table of contents -- A. The bosonic generators as one component space - - A.1. The species as pullbacks - - A.2. The transformation data +- A. The bosonic generator space +- B. The transformation data on the generator space + - B.1. The Lorentz action + - B.2. The jet gauge action + - B.3. The mass weights +- C. The bosonic generators as one component space + - C.1. The species as pullbacks + - C.2. The identification of the transformation data -/ @@ -74,7 +90,122 @@ variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] /-! -## A. The bosonic generators as one component space +## A. The bosonic generator space + +-/ + +/-- The bosonic generator space of the datum, holding the component functions `∂_s φ_α` + and their conjugates of every bosonic species at once, as a direct sum over the species. + The direct sum, rather than a single component space on the product of the value spaces, + is what lets the species carry different mass weights; when they do not, section C below + identifies the two. -/ +abbrev BosonGenerators : Type := SpeciesComponentSpace T.BosonValue + +/-- The inclusion of the component space of one bosonic species into the bosonic generator + space. -/ +abbrev inclBoson (i : T.BosonSpecies) : + JetComponentSpace (T.BosonValue i) →ₗ[ℂ] T.BosonGenerators := + SpeciesComponentSpace.incl T.BosonValue i + +/-! + +## B. The transformation data on the generator space + +The datum supplies, per species, a Lorentz representation and a fibrewise action of the +gauge jets. Both land on the generator space species by species, so both are assembled by +`SpeciesComponentSpace.rep`. Nothing here asserts that the two actions commute, since +Lorentz transformations act on nonconstant gauge jets, and nothing extends them to the +algebra `J(T)`. + +### B.1. The Lorentz action + +-/ + +/-- The Lorentz action on the bosonic generator space, acting on each species through the + Lorentz representation of its matter field. -/ +noncomputable def repLorentzBoson : Representation ℂ SL(2,ℂ) T.BosonGenerators := + SpeciesComponentSpace.rep T.BosonValue fun i => + JetComponentSpace.repLorentzGroup (T.boson i).repLorentz + +variable {T} + +@[simp] +lemma repLorentzBoson_inclBoson (Λ : SL(2,ℂ)) (i : T.BosonSpecies) + (x : JetComponentSpace (T.BosonValue i)) : + T.repLorentzBoson Λ (T.inclBoson i x) + = T.inclBoson i (JetComponentSpace.repLorentzGroup (T.boson i).repLorentz Λ x) := + SpeciesComponentSpace.rep_incl _ Λ i x + +variable (T) + +/-! + +### B.2. The jet gauge action + +-/ + +/-- The action of the jet gauge group on the bosonic generator space, acting on each + species through the fibrewise jet action of its matter field. Both the fibrewise + hypothesis and the finite dimensionality of the value space that + `JetComponentSpace.repJet` needs are already fields of `MatterField`. -/ +noncomputable def repJetBoson : Representation ℂ G T.BosonGenerators := + SpeciesComponentSpace.rep T.BosonValue fun i => + JetComponentSpace.repJet (T.boson i).repJet (T.boson i).repJet_smul + +variable {T} + +@[simp] +lemma repJetBoson_inclBoson (U : G) (i : T.BosonSpecies) + (x : JetComponentSpace (T.BosonValue i)) : + T.repJetBoson U (T.inclBoson i x) + = T.inclBoson i + (JetComponentSpace.repJet (T.boson i).repJet (T.boson i).repJet_smul U x) := + SpeciesComponentSpace.rep_incl _ U i x + +variable (T) + +/-! + +### B.3. The mass weights + +-/ + +/-- The mass-weight scaling on the bosonic generator space, with the weight of each species + taken from its matter field. Species of different weight scale differently, which is the + property the direct-sum generator space was chosen to have. -/ +noncomputable def massWeightScaleBoson (c : ℂ) : + T.BosonGenerators →ₗ[ℂ] T.BosonGenerators := + SpeciesComponentSpace.massWeightScale T.BosonValue + (fun i => (T.boson i).massWeight) c + +variable {T} + +/-- On the summand of a species the scaling is that species' own mass-weight scaling, with + the weight recorded in its matter field. -/ +@[simp] +lemma massWeightScaleBoson_inclBoson (c : ℂ) (i : T.BosonSpecies) + (x : JetComponentSpace (T.BosonValue i)) : + T.massWeightScaleBoson c (T.inclBoson i x) + = T.inclBoson i + (JetComponentSpace.massWeightScale (T.boson i).massWeight c x) := + SpeciesComponentSpace.massWeightScale_incl _ c i x + +/-- A component function `∂_s φ_α` of a species scales by `c ^ (w + 2 |s|)`, where `w` is + the mass weight of that species. There is one factor of `c` per unit of mass dimension of + the field and two per derivative. -/ +lemma massWeightScaleBoson_inclBoson_basis_tmul (c : ℂ) (i : T.BosonSpecies) + (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (T.BosonValue i)) : + T.massWeightScaleBoson c (T.inclBoson i + ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace (T.BosonValue i))) + = c ^ ((T.boson i).massWeight + 2 * Multiset.card s) • T.inclBoson i + ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace (T.BosonValue i)) := + SpeciesComponentSpace.massWeightScale_incl_basis_tmul _ c i s φ + +variable (T) + +/-! + +## C. The bosonic generators as one component space -/ @@ -91,7 +222,7 @@ noncomputable def bosonGeneratorsEquiv : /-! -### A.1. The species as pullbacks +### C.1. The species as pullbacks -/ @@ -130,7 +261,7 @@ lemma bosonGenerators_hom_ext {N : Type} [AddCommGroup N] [Module ℂ N] /-! -### A.2. The transformation data +### C.2. The identification of the transformation data -/ diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/FermionGenerators.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/FermionGenerators.lean index 3df37ec75..89451f3dd 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/FermionGenerators.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/FermionGenerators.lean @@ -7,56 +7,71 @@ module public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeFieldData.FermionMatterField /-! -# The fermionic generators as the components of one fermion field +# The fermionic generators of a gauge theory ## i. Overview -`GaugeFieldData.FermionGenerators` is built species by species, as the direct sum -`⨁ i, JetComponentSpace (T.fermion i).V` of the component spaces of the several fermionic -multiplets. A physicist writing the Standard Model does not do this. They write one fermion -field `ψ`, valued in the whole fermionic module, and take its component functions -`∂_s ψ_α` — a single `JetComponentSpace`, indexed by a target index `α` that runs over all -the multiplets at once. +The fermionic species of a `GaugeFieldData` each carry a component space, the span of the +symbols `∂_s ψ_α` and their conjugates for that multiplet. This file assembles them into +the **fermionic generator space** of the theory, -This file shows that the two agree. When the fermionic species share a mass weight — the -condition under which `GaugeFieldData.fermionMatterField` exists, and the condition every -theory of Weyl fermions satisfies — there is an isomorphism +`T.FermionGenerators = ⨁ i, JetComponentSpace (T.fermion i).V`, -`T.FermionGenerators ≃ₗ[ℂ] JetComponentSpace T.FermionModule`, +together with the transformation data the species supply: the Lorentz action, the action of +the jets of gauge transformations, and the mass-weight scaling, each assembled species by +species. These are the fermionic generators on which +`GaugeFieldData.LocalFieldAlgebra` builds its exterior algebra. + +The direct sum, rather than a single component space on the product of the value spaces, is +what lets the species carry different mass weights: the scaling of one component space is +natural in the value space and so cannot tell the species apart. + +Section C shows what happens when the species *do* share a weight, which is the case in +every theory of Weyl fermions and in particular in the Standard Model. A physicist does not +write fifteen multiplets with their own component spaces; they write one fermion field `ψ` +valued in the whole fermionic module and take its component functions `∂_s ψ_α`, a single +`JetComponentSpace` whose target index `α` runs over everything. The two agree: there is an +isomorphism -and under it the summand of a species is the pullback along the projection onto that -species, `fermionGeneratorsEquiv_inclFermion`. So the generators of one multiplet sit -inside the generators of the whole fermion field exactly as its target components sit -inside the fermionic module, which is what a physicist means by writing `ψ_α` with `α` -ranging over everything. +`T.FermionGenerators ≃ₗ[ℂ] JetComponentSpace T.FermionModule`, -The isomorphism is not merely one of vector spaces: it intertwines the Lorentz action and -the mass-weight scaling with those of the single matter field -`T.fermionMatterField w h`. The mass weight is where the shared weight `w` is needed and -where the species-by-species construction earns its keep — a family of *unequal* weights -has no single `JetComponentSpace.massWeightScale` to be compared with, which is precisely -the reason `SpeciesComponentSpace` was built as a direct sum in the first place. With one -weight that obstruction is gone and the two descriptions coincide. +under which the summand of a species is the pullback along the projection onto that +species, `fermionGeneratorsEquiv_inclFermion`. So the generators of one multiplet sit inside +the generators of the whole fermion field exactly as its target components sit inside the +fermionic module. The isomorphism is not merely one of vector spaces: it intertwines the +Lorentz action and the mass-weight scaling with those of the single matter field +`T.fermionMatterField w h`, the shared weight `w` being needed for the second of these and +for nothing else. The underlying identification is `JetComponentSpace.piEquiv`, composed with the identification of a direct sum over a finite index with the product. ## ii. Key results -- `GaugeFieldData.fermionGeneratorsEquiv` : the fermionic generator space is the component - space of the fermionic matter field. +- `GaugeFieldData.FermionGenerators` : the fermionic generator space. +- `GaugeFieldData.inclFermion` : the inclusion of the component space of one species. +- `GaugeFieldData.repLorentzFermion`, `GaugeFieldData.repJetFermion` : the Lorentz and jet + gauge actions assembled on it. +- `GaugeFieldData.massWeightScaleFermion` : the mass-weight scaling carrying the weight of + each species. +- `GaugeFieldData.fermionGeneratorsEquiv` : with one shared weight, the generator space is + the component space of the fermionic matter field. - `GaugeFieldData.fermionGeneratorsEquiv_inclFermion` : a species sits inside it as the pullback along the projection onto that species. -- `GaugeFieldData.fermionGeneratorsEquiv_repLorentzFermion` : the identification is - Lorentz-equivariant. -- `GaugeFieldData.fermionGeneratorsEquiv_massWeightScaleFermion` : it carries the - species-wise mass-weight scaling to the single scaling of weight `w`. +- `GaugeFieldData.fermionGeneratorsEquiv_repLorentzFermion`, + `GaugeFieldData.fermionGeneratorsEquiv_massWeightScaleFermion` : the identification + carries the Lorentz action and the mass-weight scaling across. ## iii. Table of contents -- A. The fermionic generators as one component space - - A.1. The species as pullbacks - - A.2. The transformation data +- A. The fermionic generator space +- B. The transformation data on the generator space + - B.1. The Lorentz action + - B.2. The jet gauge action + - B.3. The mass weights +- C. The fermionic generators as one component space + - C.1. The species as pullbacks + - C.2. The identification of the transformation data -/ @@ -72,7 +87,122 @@ variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] /-! -## A. The fermionic generators as one component space +## A. The fermionic generator space + +-/ + +/-- The fermionic generator space of the datum, holding the component functions `∂_s ψ_α` + and their conjugates of every fermionic species at once, as a direct sum over the species. + The direct sum, rather than a single component space on the product of the value spaces, + is what lets the species carry different mass weights; when they do not, section C below + identifies the two. -/ +abbrev FermionGenerators : Type := SpeciesComponentSpace T.FermionValue + +/-- The inclusion of the component space of one fermionic species into the fermionic generator + space. -/ +abbrev inclFermion (i : T.FermionSpecies) : + JetComponentSpace (T.FermionValue i) →ₗ[ℂ] T.FermionGenerators := + SpeciesComponentSpace.incl T.FermionValue i + +/-! + +## B. The transformation data on the generator space + +The datum supplies, per species, a Lorentz representation and a fibrewise action of the +gauge jets. Both land on the generator space species by species, so both are assembled by +`SpeciesComponentSpace.rep`. Nothing here asserts that the two actions commute, since +Lorentz transformations act on nonconstant gauge jets, and nothing extends them to the +algebra `J(T)`. + +### B.1. The Lorentz action + +-/ + +/-- The Lorentz action on the fermionic generator space, acting on each species through the + Lorentz representation of its matter field. -/ +noncomputable def repLorentzFermion : Representation ℂ SL(2,ℂ) T.FermionGenerators := + SpeciesComponentSpace.rep T.FermionValue fun i => + JetComponentSpace.repLorentzGroup (T.fermion i).repLorentz + +variable {T} + +@[simp] +lemma repLorentzFermion_inclFermion (Λ : SL(2,ℂ)) (i : T.FermionSpecies) + (x : JetComponentSpace (T.FermionValue i)) : + T.repLorentzFermion Λ (T.inclFermion i x) + = T.inclFermion i (JetComponentSpace.repLorentzGroup (T.fermion i).repLorentz Λ x) := + SpeciesComponentSpace.rep_incl _ Λ i x + +variable (T) + +/-! + +### B.2. The jet gauge action + +-/ + +/-- The action of the jet gauge group on the fermionic generator space, acting on each + species through the fibrewise jet action of its matter field. Both the fibrewise + hypothesis and the finite dimensionality of the value space that + `JetComponentSpace.repJet` needs are already fields of `MatterField`. -/ +noncomputable def repJetFermion : Representation ℂ G T.FermionGenerators := + SpeciesComponentSpace.rep T.FermionValue fun i => + JetComponentSpace.repJet (T.fermion i).repJet (T.fermion i).repJet_smul + +variable {T} + +@[simp] +lemma repJetFermion_inclFermion (U : G) (i : T.FermionSpecies) + (x : JetComponentSpace (T.FermionValue i)) : + T.repJetFermion U (T.inclFermion i x) + = T.inclFermion i + (JetComponentSpace.repJet (T.fermion i).repJet (T.fermion i).repJet_smul U x) := + SpeciesComponentSpace.rep_incl _ U i x + +variable (T) + +/-! + +### B.3. The mass weights + +-/ + +/-- The mass-weight scaling on the fermionic generator space, with the weight of each species + taken from its matter field. Species of different weight scale differently, which is the + property the direct-sum generator space was chosen to have. -/ +noncomputable def massWeightScaleFermion (c : ℂ) : + T.FermionGenerators →ₗ[ℂ] T.FermionGenerators := + SpeciesComponentSpace.massWeightScale T.FermionValue + (fun i => (T.fermion i).massWeight) c + +variable {T} + +/-- On the summand of a species the scaling is that species' own mass-weight scaling, with + the weight recorded in its matter field. -/ +@[simp] +lemma massWeightScaleFermion_inclFermion (c : ℂ) (i : T.FermionSpecies) + (x : JetComponentSpace (T.FermionValue i)) : + T.massWeightScaleFermion c (T.inclFermion i x) + = T.inclFermion i + (JetComponentSpace.massWeightScale (T.fermion i).massWeight c x) := + SpeciesComponentSpace.massWeightScale_incl _ c i x + +/-- A component function `∂_s ψ_α` of a species scales by `c ^ (w + 2 |s|)`, where `w` is + the mass weight of that species. There is one factor of `c` per unit of mass dimension of + the field and two per derivative. -/ +lemma massWeightScaleFermion_inclFermion_basis_tmul (c : ℂ) (i : T.FermionSpecies) + (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (T.FermionValue i)) : + T.massWeightScaleFermion c (T.inclFermion i + ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace (T.FermionValue i))) + = c ^ ((T.fermion i).massWeight + 2 * Multiset.card s) • T.inclFermion i + ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace (T.FermionValue i)) := + SpeciesComponentSpace.massWeightScale_incl_basis_tmul _ c i s φ + +variable (T) + +/-! + +## C. The fermionic generators as one component space -/ @@ -89,7 +219,7 @@ noncomputable def fermionGeneratorsEquiv : /-! -### A.1. The species as pullbacks +### C.1. The species as pullbacks -/ @@ -128,7 +258,7 @@ lemma fermionGenerators_hom_ext {N : Type} [AddCommGroup N] [Module ℂ N] /-! -### A.2. The transformation data +### C.2. The identification of the transformation data -/ diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/LocalFieldAlgebra.lean b/Physlib/ClassicalFieldTheory/JetAlgebra/LocalFieldAlgebra.lean index 9ff72663f..b74ffece1 100644 --- a/Physlib/ClassicalFieldTheory/JetAlgebra/LocalFieldAlgebra.lean +++ b/Physlib/ClassicalFieldTheory/JetAlgebra/LocalFieldAlgebra.lean @@ -5,11 +5,9 @@ Authors: Nathaneal Sajan -/ module -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeFieldData.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeFieldData.BosonGenerators +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeFieldData.FermionGenerators public import Physlib.Mathematics.AlgebraGeneration -public import Physlib.Mathematics.SymmetricAlgebra -public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basic -public import Mathlib.LinearAlgebra.Complex.Module /-! # The local field algebra of a gauge theory and its universal property diff --git a/Physlib/Particles/StandardModel/FieldData.lean b/Physlib/Particles/StandardModel/FieldData.lean index 86b2266af..22df0d496 100644 --- a/Physlib/Particles/StandardModel/FieldData.lean +++ b/Physlib/Particles/StandardModel/FieldData.lean @@ -5,7 +5,6 @@ Authors: Nathaneal Sajan -/ module -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeFieldData.Basic public import Physlib.ClassicalFieldTheory.JetAlgebra.LocalFieldAlgebra public import Physlib.Particles.StandardModel.Fermions.MatterField public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData From 31fba9cc13998d4f9673317abf8b3fc5a580ffdc Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 9 Sep 2026 14:24:16 +0100 Subject: [PATCH 313/367] feat: Remove SpeiciesGenerators --- Physlib.lean | 1 - .../GaugeTheory/GaugeFieldData/Basic.lean | 1 - .../GaugeFieldData/BosonGenerators.lean | 124 ++++++-- .../GaugeFieldData/FermionGenerators.lean | 124 ++++++-- .../MatterField/JetComponentSpace/Basic.lean | 17 + .../JetAlgebra/LocalFieldAlgebra.lean | 19 +- .../JetAlgebra/SpeciesGenerators.lean | 299 ------------------ 7 files changed, 214 insertions(+), 371 deletions(-) delete mode 100644 Physlib/ClassicalFieldTheory/JetAlgebra/SpeciesGenerators.lean diff --git a/Physlib.lean b/Physlib.lean index ab559b83f..bc7a78733 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -47,7 +47,6 @@ public import Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.Statistics public import Physlib.ClassicalFieldTheory.JetAlgebra.Jet public import Physlib.ClassicalFieldTheory.JetAlgebra.JetRep public import Physlib.ClassicalFieldTheory.JetAlgebra.LocalFieldAlgebra -public import Physlib.ClassicalFieldTheory.JetAlgebra.SpeciesGenerators public import Physlib.ClassicalFieldTheory.Local.Variation public import Physlib.ClassicalMechanics.Basic public import Physlib.ClassicalMechanics.DampedHarmonicOscillator.Basic diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/Basic.lean index fded17892..a963a88f9 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/Basic.lean @@ -6,7 +6,6 @@ Authors: Nathaneal Sajan module public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.Basic -public import Physlib.ClassicalFieldTheory.JetAlgebra.SpeciesGenerators /-! # The field data of a gauge theory diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/BosonGenerators.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/BosonGenerators.lean index 3d5457d1a..81be54275 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/BosonGenerators.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/BosonGenerators.lean @@ -53,6 +53,8 @@ identification of a direct sum over a finite index with the product. - `GaugeFieldData.BosonGenerators` : the bosonic generator space. - `GaugeFieldData.inclBoson` : the inclusion of the component space of one species. +- `GaugeFieldData.assembleBoson`, `GaugeFieldData.bosonGenerators_hom_ext` : the assembly of + a species-wise family of linear maps, and the fact that it is the only such map. - `GaugeFieldData.repLorentzBoson`, `GaugeFieldData.repJetBoson` : the Lorentz and jet gauge actions assembled on it. - `GaugeFieldData.massWeightScaleBoson` : the mass-weight scaling carrying the weight of @@ -67,7 +69,7 @@ identification of a direct sum over a finite index with the product. ## iii. Table of contents -- A. The bosonic generator space +- A. The bosonic generator space and its species assembly - B. The transformation data on the generator space - B.1. The Lorentz action - B.2. The jet gauge action @@ -80,7 +82,7 @@ identification of a direct sum over a finite index with the product. @[expose] public section -open Matrix MatrixGroups TensorProduct +open Matrix MatrixGroups TensorProduct DirectSum namespace GaugeFieldData @@ -90,32 +92,65 @@ variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] /-! -## A. The bosonic generator space +## A. The bosonic generator space and its species assembly -/ /-- The bosonic generator space of the datum, holding the component functions `∂_s φ_α` and their conjugates of every bosonic species at once, as a direct sum over the species. + A component function of the theory is a finitely supported family of component functions + of the species. + The direct sum, rather than a single component space on the product of the value spaces, - is what lets the species carry different mass weights; when they do not, section C below - identifies the two. -/ -abbrev BosonGenerators : Type := SpeciesComponentSpace T.BosonValue + is what lets the species carry different mass weights: the scaling of one component space + is natural in the value space — `JetComponentSpace.comap_comp_massWeightScale` — and so + cannot tell the species apart. When the weights do agree the two descriptions coincide, + which is section C below. -/ +abbrev BosonGenerators : Type := ⨁ i, JetComponentSpace (T.BosonValue i) /-- The inclusion of the component space of one bosonic species into the bosonic generator space. -/ abbrev inclBoson (i : T.BosonSpecies) : JetComponentSpace (T.BosonValue i) →ₗ[ℂ] T.BosonGenerators := - SpeciesComponentSpace.incl T.BosonValue i + DirectSum.lof ℂ T.BosonSpecies (fun i => JetComponentSpace (T.BosonValue i)) i + +section Assemble + +variable {N : Type*} [AddCommMonoid N] [Module ℂ N] + +/-- The assembly of a species-wise family of linear maps out of the bosonic generator space + into a common target. -/ +abbrev assembleBoson (f : ∀ i, JetComponentSpace (T.BosonValue i) →ₗ[ℂ] N) : + T.BosonGenerators →ₗ[ℂ] N := + DirectSum.toModule ℂ T.BosonSpecies N f + +variable {T} + +lemma assembleBoson_inclBoson (f : ∀ i, JetComponentSpace (T.BosonValue i) →ₗ[ℂ] N) + (i : T.BosonSpecies) (x : JetComponentSpace (T.BosonValue i)) : + T.assembleBoson f (T.inclBoson i x) = f i x := + DirectSum.toModule_lof (M := fun i => JetComponentSpace (T.BosonValue i)) ℂ i x + +/-- Two linear maps out of the bosonic generator space agreeing on every species are + equal. -/ +lemma bosonGenerators_hom_ext {F F' : T.BosonGenerators →ₗ[ℂ] N} + (h : ∀ i x, F (T.inclBoson i x) = F' (T.inclBoson i x)) : F = F' := + DirectSum.linearMap_ext ℂ fun i => LinearMap.ext (h i) + +variable (T) + +end Assemble /-! ## B. The transformation data on the generator space The datum supplies, per species, a Lorentz representation and a fibrewise action of the -gauge jets. Both land on the generator space species by species, so both are assembled by -`SpeciesComponentSpace.rep`. Nothing here asserts that the two actions commute, since -Lorentz transformations act on nonconstant gauge jets, and nothing extends them to the -algebra `J(T)`. +gauge jets. Both act on the generator space one summand at a time, so both are assembled +from the species-wise actions and the representation laws follow from +`bosonGenerators_hom_ext` alone, with no relation between the species used. Nothing here +asserts that the two actions commute, since Lorentz transformations act on nonconstant +gauge jets, and nothing extends them to the algebra `J(T)`. ### B.1. The Lorentz action @@ -123,9 +158,11 @@ algebra `J(T)`. /-- The Lorentz action on the bosonic generator space, acting on each species through the Lorentz representation of its matter field. -/ -noncomputable def repLorentzBoson : Representation ℂ SL(2,ℂ) T.BosonGenerators := - SpeciesComponentSpace.rep T.BosonValue fun i => - JetComponentSpace.repLorentzGroup (T.boson i).repLorentz +noncomputable def repLorentzBoson : Representation ℂ SL(2,ℂ) T.BosonGenerators where + toFun Λ := T.assembleBoson fun i => + (T.inclBoson i).comp (JetComponentSpace.repLorentzGroup (T.boson i).repLorentz Λ) + map_one' := bosonGenerators_hom_ext fun i x => by simp + map_mul' Λ Λ' := bosonGenerators_hom_ext fun i x => by simp variable {T} @@ -134,7 +171,7 @@ lemma repLorentzBoson_inclBoson (Λ : SL(2,ℂ)) (i : T.BosonSpecies) (x : JetComponentSpace (T.BosonValue i)) : T.repLorentzBoson Λ (T.inclBoson i x) = T.inclBoson i (JetComponentSpace.repLorentzGroup (T.boson i).repLorentz Λ x) := - SpeciesComponentSpace.rep_incl _ Λ i x + assembleBoson_inclBoson _ i x variable (T) @@ -148,9 +185,11 @@ variable (T) species through the fibrewise jet action of its matter field. Both the fibrewise hypothesis and the finite dimensionality of the value space that `JetComponentSpace.repJet` needs are already fields of `MatterField`. -/ -noncomputable def repJetBoson : Representation ℂ G T.BosonGenerators := - SpeciesComponentSpace.rep T.BosonValue fun i => - JetComponentSpace.repJet (T.boson i).repJet (T.boson i).repJet_smul +noncomputable def repJetBoson : Representation ℂ G T.BosonGenerators where + toFun U := T.assembleBoson fun i => (T.inclBoson i).comp + (JetComponentSpace.repJet (T.boson i).repJet (T.boson i).repJet_smul U) + map_one' := bosonGenerators_hom_ext fun i x => by simp + map_mul' U W := bosonGenerators_hom_ext fun i x => by simp variable {T} @@ -160,7 +199,7 @@ lemma repJetBoson_inclBoson (U : G) (i : T.BosonSpecies) T.repJetBoson U (T.inclBoson i x) = T.inclBoson i (JetComponentSpace.repJet (T.boson i).repJet (T.boson i).repJet_smul U x) := - SpeciesComponentSpace.rep_incl _ U i x + assembleBoson_inclBoson _ i x variable (T) @@ -168,6 +207,10 @@ variable (T) ### B.3. The mass weights +The mass weight is a property of a species, not of the theory, a fermion carrying weight +`3` and a scalar weight `2`. The generator space records one weight per species, and the +scaling acts on the summand of a species through that species' weight alone. + -/ /-- The mass-weight scaling on the bosonic generator space, with the weight of each species @@ -175,8 +218,8 @@ variable (T) property the direct-sum generator space was chosen to have. -/ noncomputable def massWeightScaleBoson (c : ℂ) : T.BosonGenerators →ₗ[ℂ] T.BosonGenerators := - SpeciesComponentSpace.massWeightScale T.BosonValue - (fun i => (T.boson i).massWeight) c + T.assembleBoson fun i => + (T.inclBoson i).comp (JetComponentSpace.massWeightScale (T.boson i).massWeight c) variable {T} @@ -188,7 +231,7 @@ lemma massWeightScaleBoson_inclBoson (c : ℂ) (i : T.BosonSpecies) T.massWeightScaleBoson c (T.inclBoson i x) = T.inclBoson i (JetComponentSpace.massWeightScale (T.boson i).massWeight c x) := - SpeciesComponentSpace.massWeightScale_incl _ c i x + assembleBoson_inclBoson _ i x /-- A component function `∂_s φ_α` of a species scales by `c ^ (w + 2 |s|)`, where `w` is the mass weight of that species. There is one factor of `c` per unit of mass dimension of @@ -198,8 +241,28 @@ lemma massWeightScaleBoson_inclBoson_basis_tmul (c : ℂ) (i : T.BosonSpecies) T.massWeightScaleBoson c (T.inclBoson i ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace (T.BosonValue i))) = c ^ ((T.boson i).massWeight + 2 * Multiset.card s) • T.inclBoson i - ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace (T.BosonValue i)) := - SpeciesComponentSpace.massWeightScale_incl_basis_tmul _ c i s φ + ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace (T.BosonValue i)) := by + rw [massWeightScaleBoson_inclBoson, ← LinearMap.map_smul] + refine congrArg _ (Prod.ext ?_ ?_) + · exact JetComponentSpace.massWeightScale_fst_basis_tmul (T.boson i).massWeight c s φ 0 + · simp + +/-- The conjugate component functions of a species scale with the same weight as its + unconjugated ones. -/ +lemma massWeightScaleBoson_inclBoson_basis_tmul_conj (c : ℂ) (i : T.BosonSpecies) + (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule (T.BosonValue i))) : + T.massWeightScaleBoson c (T.inclBoson i + ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace (T.BosonValue i))) + = c ^ ((T.boson i).massWeight + 2 * Multiset.card s) • T.inclBoson i + ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace (T.BosonValue i)) := by + rw [massWeightScaleBoson_inclBoson, ← LinearMap.map_smul] + refine congrArg _ (Prod.ext ?_ ?_) + · simp + · simp only [JetComponentSpace.massWeightScale_snd, Prod.smul_snd, + TensorProduct.map_tmul, AlgHom.toLinearMap_apply, + DerivAlgebraComplex.gradeScale_basis, LinearMap.id_apply, TensorProduct.smul_tmul', + ← pow_mul, ← smul_assoc, smul_eq_mul, ← pow_add, mul_comm 2 (Multiset.card s)] variable (T) @@ -244,15 +307,16 @@ lemma bosonGeneratorsEquiv_inclBoson (i : T.BosonSpecies) (M := fun i => JetComponentSpace (T.BosonValue i)) ℂ i x, JetComponentSpace.piEquiv_symm_single] -/-- Two linear maps out of the component space of the bosonic module agree as soon as - they agree on every species, the species pullbacks spanning it. -/ -lemma bosonGenerators_hom_ext {N : Type} [AddCommGroup N] [Module ℂ N] +/-- Two linear maps out of the component space of the bosonic module agree as soon as they + agree on every species, the species pullbacks spanning it. This is the counterpart, on + the single-field side of the identification, of `bosonGenerators_hom_ext`. -/ +lemma bosonModuleComponents_hom_ext {N : Type} [AddCommGroup N] [Module ℂ N] {F F' : JetComponentSpace T.BosonModule →ₗ[ℂ] N} (h : ∀ i x, F (JetComponentSpace.comap (T.projBosonValue i) x) = F' (JetComponentSpace.comap (T.projBosonValue i) x)) : F = F' := by have key : F.comp T.bosonGeneratorsEquiv.toLinearMap = F'.comp T.bosonGeneratorsEquiv.toLinearMap := - SpeciesComponentSpace.hom_ext fun i x => by + bosonGenerators_hom_ext fun i x => by simp only [LinearMap.comp_apply, LinearEquiv.coe_coe, bosonGeneratorsEquiv_inclBoson] exact h i x @@ -277,7 +341,7 @@ lemma bosonGeneratorsEquiv_repLorentzBoson (Λ : SL(2,ℂ)) (y : T.BosonGenerato have key : T.bosonGeneratorsEquiv.toLinearMap.comp (T.repLorentzBoson Λ) = (JetComponentSpace.repLorentzGroup T.repLorentzBosonModule Λ).comp T.bosonGeneratorsEquiv.toLinearMap := by - refine SpeciesComponentSpace.hom_ext fun i x => ?_ + refine bosonGenerators_hom_ext fun i x => ?_ rw [LinearMap.comp_apply, LinearMap.comp_apply, LinearEquiv.coe_coe, repLorentzBoson_inclBoson, bosonGeneratorsEquiv_inclBoson, bosonGeneratorsEquiv_inclBoson] @@ -298,7 +362,7 @@ lemma bosonGeneratorsEquiv_massWeightScaleBoson (w : ℕ) have key : T.bosonGeneratorsEquiv.toLinearMap.comp (T.massWeightScaleBoson c) = (JetComponentSpace.massWeightScale w c).comp T.bosonGeneratorsEquiv.toLinearMap := by - refine SpeciesComponentSpace.hom_ext fun i x => ?_ + refine bosonGenerators_hom_ext fun i x => ?_ rw [LinearMap.comp_apply, LinearMap.comp_apply, LinearEquiv.coe_coe, massWeightScaleBoson_inclBoson, bosonGeneratorsEquiv_inclBoson, bosonGeneratorsEquiv_inclBoson, h i] diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/FermionGenerators.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/FermionGenerators.lean index 89451f3dd..05502ec82 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/FermionGenerators.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/FermionGenerators.lean @@ -50,6 +50,8 @@ identification of a direct sum over a finite index with the product. - `GaugeFieldData.FermionGenerators` : the fermionic generator space. - `GaugeFieldData.inclFermion` : the inclusion of the component space of one species. +- `GaugeFieldData.assembleFermion`, `GaugeFieldData.fermionGenerators_hom_ext` : the assembly of + a species-wise family of linear maps, and the fact that it is the only such map. - `GaugeFieldData.repLorentzFermion`, `GaugeFieldData.repJetFermion` : the Lorentz and jet gauge actions assembled on it. - `GaugeFieldData.massWeightScaleFermion` : the mass-weight scaling carrying the weight of @@ -64,7 +66,7 @@ identification of a direct sum over a finite index with the product. ## iii. Table of contents -- A. The fermionic generator space +- A. The fermionic generator space and its species assembly - B. The transformation data on the generator space - B.1. The Lorentz action - B.2. The jet gauge action @@ -77,7 +79,7 @@ identification of a direct sum over a finite index with the product. @[expose] public section -open Matrix MatrixGroups TensorProduct +open Matrix MatrixGroups TensorProduct DirectSum namespace GaugeFieldData @@ -87,32 +89,65 @@ variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] /-! -## A. The fermionic generator space +## A. The fermionic generator space and its species assembly -/ /-- The fermionic generator space of the datum, holding the component functions `∂_s ψ_α` and their conjugates of every fermionic species at once, as a direct sum over the species. + A component function of the theory is a finitely supported family of component functions + of the species. + The direct sum, rather than a single component space on the product of the value spaces, - is what lets the species carry different mass weights; when they do not, section C below - identifies the two. -/ -abbrev FermionGenerators : Type := SpeciesComponentSpace T.FermionValue + is what lets the species carry different mass weights: the scaling of one component space + is natural in the value space — `JetComponentSpace.comap_comp_massWeightScale` — and so + cannot tell the species apart. When the weights do agree the two descriptions coincide, + which is section C below. -/ +abbrev FermionGenerators : Type := ⨁ i, JetComponentSpace (T.FermionValue i) /-- The inclusion of the component space of one fermionic species into the fermionic generator space. -/ abbrev inclFermion (i : T.FermionSpecies) : JetComponentSpace (T.FermionValue i) →ₗ[ℂ] T.FermionGenerators := - SpeciesComponentSpace.incl T.FermionValue i + DirectSum.lof ℂ T.FermionSpecies (fun i => JetComponentSpace (T.FermionValue i)) i + +section Assemble + +variable {N : Type*} [AddCommMonoid N] [Module ℂ N] + +/-- The assembly of a species-wise family of linear maps out of the fermionic generator space + into a common target. -/ +abbrev assembleFermion (f : ∀ i, JetComponentSpace (T.FermionValue i) →ₗ[ℂ] N) : + T.FermionGenerators →ₗ[ℂ] N := + DirectSum.toModule ℂ T.FermionSpecies N f + +variable {T} + +lemma assembleFermion_inclFermion (f : ∀ i, JetComponentSpace (T.FermionValue i) →ₗ[ℂ] N) + (i : T.FermionSpecies) (x : JetComponentSpace (T.FermionValue i)) : + T.assembleFermion f (T.inclFermion i x) = f i x := + DirectSum.toModule_lof (M := fun i => JetComponentSpace (T.FermionValue i)) ℂ i x + +/-- Two linear maps out of the fermionic generator space agreeing on every species are + equal. -/ +lemma fermionGenerators_hom_ext {F F' : T.FermionGenerators →ₗ[ℂ] N} + (h : ∀ i x, F (T.inclFermion i x) = F' (T.inclFermion i x)) : F = F' := + DirectSum.linearMap_ext ℂ fun i => LinearMap.ext (h i) + +variable (T) + +end Assemble /-! ## B. The transformation data on the generator space The datum supplies, per species, a Lorentz representation and a fibrewise action of the -gauge jets. Both land on the generator space species by species, so both are assembled by -`SpeciesComponentSpace.rep`. Nothing here asserts that the two actions commute, since -Lorentz transformations act on nonconstant gauge jets, and nothing extends them to the -algebra `J(T)`. +gauge jets. Both act on the generator space one summand at a time, so both are assembled +from the species-wise actions and the representation laws follow from +`fermionGenerators_hom_ext` alone, with no relation between the species used. Nothing here +asserts that the two actions commute, since Lorentz transformations act on nonconstant +gauge jets, and nothing extends them to the algebra `J(T)`. ### B.1. The Lorentz action @@ -120,9 +155,11 @@ algebra `J(T)`. /-- The Lorentz action on the fermionic generator space, acting on each species through the Lorentz representation of its matter field. -/ -noncomputable def repLorentzFermion : Representation ℂ SL(2,ℂ) T.FermionGenerators := - SpeciesComponentSpace.rep T.FermionValue fun i => - JetComponentSpace.repLorentzGroup (T.fermion i).repLorentz +noncomputable def repLorentzFermion : Representation ℂ SL(2,ℂ) T.FermionGenerators where + toFun Λ := T.assembleFermion fun i => + (T.inclFermion i).comp (JetComponentSpace.repLorentzGroup (T.fermion i).repLorentz Λ) + map_one' := fermionGenerators_hom_ext fun i x => by simp + map_mul' Λ Λ' := fermionGenerators_hom_ext fun i x => by simp variable {T} @@ -131,7 +168,7 @@ lemma repLorentzFermion_inclFermion (Λ : SL(2,ℂ)) (i : T.FermionSpecies) (x : JetComponentSpace (T.FermionValue i)) : T.repLorentzFermion Λ (T.inclFermion i x) = T.inclFermion i (JetComponentSpace.repLorentzGroup (T.fermion i).repLorentz Λ x) := - SpeciesComponentSpace.rep_incl _ Λ i x + assembleFermion_inclFermion _ i x variable (T) @@ -145,9 +182,11 @@ variable (T) species through the fibrewise jet action of its matter field. Both the fibrewise hypothesis and the finite dimensionality of the value space that `JetComponentSpace.repJet` needs are already fields of `MatterField`. -/ -noncomputable def repJetFermion : Representation ℂ G T.FermionGenerators := - SpeciesComponentSpace.rep T.FermionValue fun i => - JetComponentSpace.repJet (T.fermion i).repJet (T.fermion i).repJet_smul +noncomputable def repJetFermion : Representation ℂ G T.FermionGenerators where + toFun U := T.assembleFermion fun i => (T.inclFermion i).comp + (JetComponentSpace.repJet (T.fermion i).repJet (T.fermion i).repJet_smul U) + map_one' := fermionGenerators_hom_ext fun i x => by simp + map_mul' U W := fermionGenerators_hom_ext fun i x => by simp variable {T} @@ -157,7 +196,7 @@ lemma repJetFermion_inclFermion (U : G) (i : T.FermionSpecies) T.repJetFermion U (T.inclFermion i x) = T.inclFermion i (JetComponentSpace.repJet (T.fermion i).repJet (T.fermion i).repJet_smul U x) := - SpeciesComponentSpace.rep_incl _ U i x + assembleFermion_inclFermion _ i x variable (T) @@ -165,6 +204,10 @@ variable (T) ### B.3. The mass weights +The mass weight is a property of a species, not of the theory, a fermion carrying weight +`3` and a scalar weight `2`. The generator space records one weight per species, and the +scaling acts on the summand of a species through that species' weight alone. + -/ /-- The mass-weight scaling on the fermionic generator space, with the weight of each species @@ -172,8 +215,8 @@ variable (T) property the direct-sum generator space was chosen to have. -/ noncomputable def massWeightScaleFermion (c : ℂ) : T.FermionGenerators →ₗ[ℂ] T.FermionGenerators := - SpeciesComponentSpace.massWeightScale T.FermionValue - (fun i => (T.fermion i).massWeight) c + T.assembleFermion fun i => + (T.inclFermion i).comp (JetComponentSpace.massWeightScale (T.fermion i).massWeight c) variable {T} @@ -185,7 +228,7 @@ lemma massWeightScaleFermion_inclFermion (c : ℂ) (i : T.FermionSpecies) T.massWeightScaleFermion c (T.inclFermion i x) = T.inclFermion i (JetComponentSpace.massWeightScale (T.fermion i).massWeight c x) := - SpeciesComponentSpace.massWeightScale_incl _ c i x + assembleFermion_inclFermion _ i x /-- A component function `∂_s ψ_α` of a species scales by `c ^ (w + 2 |s|)`, where `w` is the mass weight of that species. There is one factor of `c` per unit of mass dimension of @@ -195,8 +238,28 @@ lemma massWeightScaleFermion_inclFermion_basis_tmul (c : ℂ) (i : T.FermionSpec T.massWeightScaleFermion c (T.inclFermion i ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace (T.FermionValue i))) = c ^ ((T.fermion i).massWeight + 2 * Multiset.card s) • T.inclFermion i - ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace (T.FermionValue i)) := - SpeciesComponentSpace.massWeightScale_incl_basis_tmul _ c i s φ + ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace (T.FermionValue i)) := by + rw [massWeightScaleFermion_inclFermion, ← LinearMap.map_smul] + refine congrArg _ (Prod.ext ?_ ?_) + · exact JetComponentSpace.massWeightScale_fst_basis_tmul (T.fermion i).massWeight c s φ 0 + · simp + +/-- The conjugate component functions of a species scale with the same weight as its + unconjugated ones. -/ +lemma massWeightScaleFermion_inclFermion_basis_tmul_conj (c : ℂ) (i : T.FermionSpecies) + (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule (T.FermionValue i))) : + T.massWeightScaleFermion c (T.inclFermion i + ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace (T.FermionValue i))) + = c ^ ((T.fermion i).massWeight + 2 * Multiset.card s) • T.inclFermion i + ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace (T.FermionValue i)) := by + rw [massWeightScaleFermion_inclFermion, ← LinearMap.map_smul] + refine congrArg _ (Prod.ext ?_ ?_) + · simp + · simp only [JetComponentSpace.massWeightScale_snd, Prod.smul_snd, + TensorProduct.map_tmul, AlgHom.toLinearMap_apply, + DerivAlgebraComplex.gradeScale_basis, LinearMap.id_apply, TensorProduct.smul_tmul', + ← pow_mul, ← smul_assoc, smul_eq_mul, ← pow_add, mul_comm 2 (Multiset.card s)] variable (T) @@ -241,15 +304,16 @@ lemma fermionGeneratorsEquiv_inclFermion (i : T.FermionSpecies) (M := fun i => JetComponentSpace (T.FermionValue i)) ℂ i x, JetComponentSpace.piEquiv_symm_single] -/-- Two linear maps out of the component space of the fermionic module agree as soon as - they agree on every species, the species pullbacks spanning it. -/ -lemma fermionGenerators_hom_ext {N : Type} [AddCommGroup N] [Module ℂ N] +/-- Two linear maps out of the component space of the fermionic module agree as soon as they + agree on every species, the species pullbacks spanning it. This is the counterpart, on + the single-field side of the identification, of `fermionGenerators_hom_ext`. -/ +lemma fermionModuleComponents_hom_ext {N : Type} [AddCommGroup N] [Module ℂ N] {F F' : JetComponentSpace T.FermionModule →ₗ[ℂ] N} (h : ∀ i x, F (JetComponentSpace.comap (T.projFermionValue i) x) = F' (JetComponentSpace.comap (T.projFermionValue i) x)) : F = F' := by have key : F.comp T.fermionGeneratorsEquiv.toLinearMap = F'.comp T.fermionGeneratorsEquiv.toLinearMap := - SpeciesComponentSpace.hom_ext fun i x => by + fermionGenerators_hom_ext fun i x => by simp only [LinearMap.comp_apply, LinearEquiv.coe_coe, fermionGeneratorsEquiv_inclFermion] exact h i x @@ -274,7 +338,7 @@ lemma fermionGeneratorsEquiv_repLorentzFermion (Λ : SL(2,ℂ)) (y : T.FermionGe have key : T.fermionGeneratorsEquiv.toLinearMap.comp (T.repLorentzFermion Λ) = (JetComponentSpace.repLorentzGroup T.repLorentzFermionModule Λ).comp T.fermionGeneratorsEquiv.toLinearMap := by - refine SpeciesComponentSpace.hom_ext fun i x => ?_ + refine fermionGenerators_hom_ext fun i x => ?_ rw [LinearMap.comp_apply, LinearMap.comp_apply, LinearEquiv.coe_coe, repLorentzFermion_inclFermion, fermionGeneratorsEquiv_inclFermion, fermionGeneratorsEquiv_inclFermion] @@ -295,7 +359,7 @@ lemma fermionGeneratorsEquiv_massWeightScaleFermion (w : ℕ) have key : T.fermionGeneratorsEquiv.toLinearMap.comp (T.massWeightScaleFermion c) = (JetComponentSpace.massWeightScale w c).comp T.fermionGeneratorsEquiv.toLinearMap := by - refine SpeciesComponentSpace.hom_ext fun i x => ?_ + refine fermionGenerators_hom_ext fun i x => ?_ rw [LinearMap.comp_apply, LinearMap.comp_apply, LinearEquiv.coe_coe, massWeightScaleFermion_inclFermion, fermionGeneratorsEquiv_inclFermion, fermionGeneratorsEquiv_inclFermion, h i] diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/Basic.lean index f63f8fdf2..10ca2c595 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/Basic.lean @@ -35,6 +35,8 @@ is in `Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.Ga - `JetComponentSpace.repLorentzGroup_jetDeriv` : the shift is a Lorentz vector. - `JetComponentSpace.comap` : functoriality, contravariant in the target space. - `JetComponentSpace.massWeightScale` : the mass-weight scaling. +- `JetComponentSpace.comap_comp_massWeightScale` : the scaling is natural in the target + space, hence blind to which part of it a component function came from. - `JetComponentSpace.prodEquiv` : the component space of a direct sum. - `JetComponentSpace.piEquiv` : the component space of a finite direct sum. @@ -421,6 +423,21 @@ lemma JetComponentSpace.massWeightScale_jetDeriv (w : ℕ) (c : ℂ) (μ : Fin 1 exact (congrArg (fun z : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule V) => c ^ w • z) (key v.2)).trans (smul_comm _ _ _) +/-- **The mass-weight scaling is natural in the target space.** It commutes with every + pullback, acting as it does on the derivative label and not on the target index. So the + scaling cannot see which part of a target space a component function came from: in + `JetComponentSpace (∀ i, V i)`, where a species enters through + `comap (LinearMap.proj i)`, every species is scaled by the same weight. This is why the + generator space of a multi-species theory, `GaugeFieldData.FermionGenerators`, records + the weights on a direct sum, one per species, rather than on a single component space of + the product. -/ +lemma JetComponentSpace.comap_comp_massWeightScale (f : V →ₗ[ℂ] W) (w : ℕ) (c : ℂ) : + (JetComponentSpace.comap f).comp (JetComponentSpace.massWeightScale w c) + = (JetComponentSpace.massWeightScale w c).comp (JetComponentSpace.comap f) := by + simp only [JetComponentSpace.comap, JetComponentSpace.massWeightScale, + LinearMap.comp_smul, LinearMap.smul_comp, LinearMap.prodMap_comp, + ← TensorProduct.map_comp, LinearMap.comp_id, LinearMap.id_comp] + /-! ## The component space of a direct sum diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/LocalFieldAlgebra.lean b/Physlib/ClassicalFieldTheory/JetAlgebra/LocalFieldAlgebra.lean index b74ffece1..d82819135 100644 --- a/Physlib/ClassicalFieldTheory/JetAlgebra/LocalFieldAlgebra.lean +++ b/Physlib/ClassicalFieldTheory/JetAlgebra/LocalFieldAlgebra.lean @@ -377,12 +377,12 @@ lemma algHom_ext {B : Type*} [Ring B] [Algebra ℂ B] {Φ Ψ : T.LocalFieldAlgeb (hb : ∀ j y, Φ (T.ιBoson j y) = Ψ (T.ιBoson j y)) (ha : ∀ v, Φ (T.ιConnection v) = Ψ (T.ιConnection v)) : Φ = Ψ := algHom_ext_generators T - (fun v => LinearMap.congr_fun (SpeciesComponentSpace.hom_ext + (fun v => LinearMap.congr_fun (fermionGenerators_hom_ext (F := Φ.toLinearMap ∘ₗ T.ιFermionTotal) - (G := Ψ.toLinearMap ∘ₗ T.ιFermionTotal) hf) v) - (fun v => LinearMap.congr_fun (SpeciesComponentSpace.hom_ext + (F' := Ψ.toLinearMap ∘ₗ T.ιFermionTotal) hf) v) + (fun v => LinearMap.congr_fun (bosonGenerators_hom_ext (F := Φ.toLinearMap ∘ₗ T.ιBosonTotal) - (G := Ψ.toLinearMap ∘ₗ T.ιBosonTotal) hb) v) + (F' := Ψ.toLinearMap ∘ₗ T.ιBosonTotal) hb) v) ha variable (T) @@ -437,8 +437,7 @@ variable {T} vacuous only for a family with at most one species. -/ lemma assemble_mul_self_iff {B : Type*} [Ring B] [Algebra ℂ B] (f : ∀ i, JetComponentSpace (T.FermionValue i) →ₗ[ℂ] B) : - (∀ v, SpeciesComponentSpace.assemble T.FermionValue f v * - SpeciesComponentSpace.assemble T.FermionValue f v = 0) + (∀ v, T.assembleFermion f v * T.assembleFermion f v = 0) ↔ ((∀ i x, f i x * f i x = 0) ∧ ∀ i j x y, f i x * f j y = -(f j y * f i x)) := by rw [DirectSum.mul_self_iff_lof] @@ -461,22 +460,22 @@ the role of the generators. /-- The images of all the fermionic generators at once, assembled from the species. -/ def fermionTotal : T.FermionGenerators →ₗ[ℂ] B := - SpeciesComponentSpace.assemble T.FermionValue d.fermion + T.assembleFermion d.fermion /-- The images of all the bosonic generators at once. -/ def bosonTotal : T.BosonGenerators →ₗ[ℂ] B := - SpeciesComponentSpace.assemble T.BosonValue d.boson + T.assembleBoson d.boson @[simp] lemma fermionTotal_inclFermion (i : T.FermionSpecies) (x : JetComponentSpace (T.FermionValue i)) : d.fermionTotal (T.inclFermion i x) = d.fermion i x := - SpeciesComponentSpace.assemble_incl d.fermion i x + assembleFermion_inclFermion d.fermion i x @[simp] lemma bosonTotal_inclBoson (j : T.BosonSpecies) (y : JetComponentSpace (T.BosonValue j)) : d.bosonTotal (T.inclBoson j y) = d.boson j y := - SpeciesComponentSpace.assemble_incl d.boson j y + assembleBoson_inclBoson d.boson j y /-- The assembled fermionic images square to zero, which is more than the species-wise condition and needs the cross-species anticommutation as well. -/ diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/SpeciesGenerators.lean b/Physlib/ClassicalFieldTheory/JetAlgebra/SpeciesGenerators.lean deleted file mode 100644 index edc009b0c..000000000 --- a/Physlib/ClassicalFieldTheory/JetAlgebra/SpeciesGenerators.lean +++ /dev/null @@ -1,299 +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.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.Basic -public import Mathlib.Algebra.DirectSum.Module -/-! -# The generator spaces of a family of species - -## i. Overview - -A field theory carries several species of field, each with its own value space, its own -Lorentz representation and its own mass weight. The local field algebra built in -`Physlib.ClassicalFieldTheory.JetAlgebra.LocalFieldAlgebra` is an exterior algebra on one -complex space of fermionic generators tensored with a symmetric algebra on one complex -space of bosonic generators, so a multi-species theory has to present its species as a -single generator space. - -This file does that with a direct sum of component spaces. For a family `V : ι → Type` of -value spaces the total generator space is - -`SpeciesComponentSpace V = ⨁ i, JetComponentSpace (V i)`, - -one `JetComponentSpace` per species, each with its conjugate summand. The alternative, a -single `JetComponentSpace (∀ i, V i)` on the product of the value spaces, is available but -carries only one mass weight, since its scaling commutes with `JetComponentSpace.comap` -and so cannot distinguish the species. The direct sum records one weight per species. - -That is the only difference between the two. When the species do share a weight — as the -fermions of a gauge theory do — the direct sum *is* the component space of the product, -compatibly with the Lorentz action and the scaling; this is -`GaugeFieldData.fermionGeneratorsEquiv`, which recovers the presentation of the fermion -content as one field that a physicist writes down. - -Nothing here is finite. Neither the index type `ι` nor any of the value spaces `V i` is -assumed finite, and the component spaces are infinite-dimensional in any case, since a -derivative label ranges over all multisets of directions. Only `DecidableEq ι` is used, -and only to have the summand inclusions. - -The subtle point, settled in `Physlib.Mathematics.AlgebraGeneration` rather than here, is -Fermi statistics. A square-zero condition on the total space is strictly stronger than the -same condition on each species: by `DirectSum.mul_self_iff_lof` it is equivalent to -square-zero on each species together with anticommutation between the images of any two -species. The generator space assembled here is what makes that distinction expressible. - -## ii. Key results - -- `SpeciesComponentSpace` : the total component space of a family of species. -- `SpeciesComponentSpace.incl`, `SpeciesComponentSpace.assemble`, - `SpeciesComponentSpace.hom_ext`, `SpeciesComponentSpace.existsUnique_linearMap` : the - species inclusions and the mapping-out property of the total component space. -- `SpeciesComponentSpace.comap` : functoriality, contravariant in the family of value - spaces. -- `SpeciesComponentSpace.rep` : the species-diagonal assembly of a family of - representations on the individual component spaces. -- `SpeciesComponentSpace.massWeightScale` : the mass-weight scaling of a family with one - weight per species. -- `JetComponentSpace.comap_comp_massWeightScale` : the scaling of a single component - space is natural in the value space, hence species-blind, which is the reason for the - direct sum. - -## iii. Table of contents - -- A. The component space of a family of species - - A.1. The species inclusions and the assembly of linear maps - - A.2. Functoriality in the family of value spaces - - A.3. The species-diagonal representation - - A.4. Unequal mass weights - - A.5. Why the weights are recorded per species - --/ - -@[expose] public section - -open TensorProduct DirectSum - -/-! - -## A. The component space of a family of species - --/ - -section ComponentSpace - -variable {ι : Type*} [DecidableEq ι] (V : ι → Type*) - [∀ i, AddCommGroup (V i)] [∀ i, Module ℂ (V i)] - -/-- The component space of a family of species, with one `JetComponentSpace` per species, - each carrying its own conjugate summand, combined by a direct sum. A component function - of the theory is a finitely supported family of component functions of the species. -/ -abbrev SpeciesComponentSpace : Type _ := ⨁ i, JetComponentSpace (V i) - -namespace SpeciesComponentSpace - -/-! - -### A.1. The species inclusions and the assembly of linear maps - --/ - -/-- The inclusion of a species into the total component space. -/ -abbrev incl (i : ι) : JetComponentSpace (V i) →ₗ[ℂ] SpeciesComponentSpace V := - DirectSum.lof ℂ ι (fun i => JetComponentSpace (V i)) i - -variable {N : Type*} [AddCommMonoid N] [Module ℂ N] - -/-- The assembly of a species-wise family of linear maps into a common target. -/ -abbrev assemble (f : ∀ i, JetComponentSpace (V i) →ₗ[ℂ] N) : - SpeciesComponentSpace V →ₗ[ℂ] N := - DirectSum.toModule ℂ ι N f - -variable {V} - -@[simp] -lemma assemble_incl (f : ∀ i, JetComponentSpace (V i) →ₗ[ℂ] N) (i : ι) - (x : JetComponentSpace (V i)) : assemble V f (incl V i x) = f i x := - DirectSum.toModule_lof (M := fun i => JetComponentSpace (V i)) ℂ i x - -/-- Two linear maps out of the total component space agreeing on every species are - equal. -/ -lemma hom_ext {F G : SpeciesComponentSpace V →ₗ[ℂ] N} - (h : ∀ i x, F (incl V i x) = G (incl V i x)) : F = G := - DirectSum.linearMap_ext ℂ fun i => LinearMap.ext (h i) - -variable (V) - -/-- The mapping-out property of the total component space. A species-wise family of linear - maps into a common target extends to one and only one linear map out of the total - component space. -/ -lemma existsUnique_linearMap (f : ∀ i, JetComponentSpace (V i) →ₗ[ℂ] N) : - ∃! F : SpeciesComponentSpace V →ₗ[ℂ] N, ∀ i x, F (incl V i x) = f i x := - ⟨assemble V f, assemble_incl f, fun _ hF => - hom_ext fun i x => (hF i x).trans (assemble_incl f i x).symm⟩ - -/-! - -### A.2. Functoriality in the family of value spaces - -Component functions are covectors on the value space, so the total component space is -contravariant in the family of value spaces, exactly as a single one is. The species-wise -pullbacks are the existing `JetComponentSpace.comap`; only the assembly is new. - --/ - -variable (W : ι → Type*) [∀ i, AddCommGroup (W i)] [∀ i, Module ℂ (W i)] - -/-- The total component space is contravariant in the family of value spaces. Applied - to the projections out of a larger family, this is the inclusion of a subfamily of - species. -/ -noncomputable def comap (f : ∀ i, V i →ₗ[ℂ] W i) : - SpeciesComponentSpace W →ₗ[ℂ] SpeciesComponentSpace V := - assemble W fun i => (incl V i).comp (JetComponentSpace.comap (f i)) - -variable {V W} - -@[simp] -lemma comap_incl (f : ∀ i, V i →ₗ[ℂ] W i) (i : ι) (x : JetComponentSpace (W i)) : - comap V W f (incl W i x) = incl V i (JetComponentSpace.comap (f i) x) := - assemble_incl _ i x - -@[simp] -lemma comap_id : comap V V (fun _ => LinearMap.id) = LinearMap.id := - hom_ext fun i x => by - rw [comap_incl, JetComponentSpace.comap_id, LinearMap.id_apply, LinearMap.id_apply] - -/-- Functoriality, with the order reversing as a contravariant construction demands. -/ -lemma comap_comp (U : ι → Type*) [∀ i, AddCommGroup (U i)] [∀ i, Module ℂ (U i)] - (f : ∀ i, V i →ₗ[ℂ] W i) (g : ∀ i, W i →ₗ[ℂ] U i) : - comap V U (fun i => (g i).comp (f i)) = (comap V W f).comp (comap W U g) := - hom_ext fun i x => by - rw [comap_incl, JetComponentSpace.comap_comp, LinearMap.comp_apply, - LinearMap.comp_apply, comap_incl, comap_incl] - -/-! - -### A.3. The species-diagonal representation - -A symmetry of a field theory acts on each species separately, a Lorentz transformation -through that species' Lorentz representation and a gauge jet through that species' jet -action. On the total component space the action is therefore the direct sum of the -species-wise actions, and the representation laws follow from the mapping-out property of -the direct sum alone, with no relation between the species used. - --/ - -variable (V) - -/-- The species-diagonal representation on the total component space assembled from a - representation on each species' component space. The summands are preserved, so `map_one` - and `map_mul` reduce by `hom_ext` to the corresponding laws of the species-wise - representations. - - Both transformation laws a matter species carries are of this form, namely the Lorentz - action `JetComponentSpace.repLorentzGroup` and the jet gauge action - `JetComponentSpace.repJet`. Nothing here asks the two to commute, and nothing asks the - monoid `H` to be related to the species. -/ -noncomputable def rep {H : Type*} [Monoid H] - (ρ : ∀ i, Representation ℂ H (JetComponentSpace (V i))) : - Representation ℂ H (SpeciesComponentSpace V) where - toFun g := assemble V fun i => (incl V i).comp (ρ i g) - map_one' := hom_ext fun i x => by simp - map_mul' g h := hom_ext fun i x => by simp - -variable {V} - -/-- The species-diagonal representation acts on the summand of a species through that - species' representation. -/ -@[simp] -lemma rep_incl {H : Type*} [Monoid H] (ρ : ∀ i, Representation ℂ H (JetComponentSpace (V i))) - (g : H) (i : ι) (x : JetComponentSpace (V i)) : - rep V ρ g (incl V i x) = incl V i (ρ i g x) := - assemble_incl _ i x - -/-! - -### A.4. Unequal mass weights - -The mass weight is a property of a species, not of the theory, a fermion carrying weight -`3` and a scalar weight `2`. The total component space records one weight per species, -and the scaling acts on the summand of a species through that species' weight alone. - --/ - -variable (V) - -/-- The mass-weight scaling of a family of species, with the weight `w i` of each - species acting on that species' component functions. -/ -noncomputable def massWeightScale (w : ι → ℕ) (c : ℂ) : - SpeciesComponentSpace V →ₗ[ℂ] SpeciesComponentSpace V := - assemble V fun i => (incl V i).comp (JetComponentSpace.massWeightScale (w i) c) - -variable {V} - -@[simp] -lemma massWeightScale_incl (w : ι → ℕ) (c : ℂ) (i : ι) (x : JetComponentSpace (V i)) : - massWeightScale V w c (incl V i x) - = incl V i (JetComponentSpace.massWeightScale (w i) c x) := - assemble_incl _ i x - -/-- On a homogeneous component function `∂_s φ_α` of the species `i` the scaling is - multiplication by `c ^ (w i + 2 |s|)`, the weight being the weight of that species. -/ -lemma massWeightScale_incl_basis_tmul (w : ι → ℕ) (c : ℂ) (i : ι) - (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (V i)) : - massWeightScale V w c - (incl V i ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace (V i))) - = c ^ (w i + 2 * Multiset.card s) • - incl V i ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace (V i)) := by - rw [massWeightScale_incl, ← LinearMap.map_smul] - refine congrArg _ (Prod.ext ?_ ?_) - · exact JetComponentSpace.massWeightScale_fst_basis_tmul (w i) c s φ 0 - · simp - -/-- The conjugate component functions of a species scale with the same weight as its - unconjugated ones. -/ -lemma massWeightScale_incl_basis_tmul_conj (w : ι → ℕ) (c : ℂ) (i : ι) - (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule (V i))) : - massWeightScale V w c - (incl V i ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace (V i))) - = c ^ (w i + 2 * Multiset.card s) • - incl V i ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace (V i)) := by - rw [massWeightScale_incl, ← LinearMap.map_smul] - refine congrArg _ (Prod.ext ?_ ?_) - · simp - · simp only [JetComponentSpace.massWeightScale_snd, Prod.smul_snd, - TensorProduct.map_tmul, AlgHom.toLinearMap_apply, - DerivAlgebraComplex.gradeScale_basis, LinearMap.id_apply, TensorProduct.smul_tmul', - ← pow_mul, ← smul_assoc, smul_eq_mul, ← pow_add, mul_comm 2 (Multiset.card s)] - -end SpeciesComponentSpace - -end ComponentSpace - -/-! - -### A.5. Why the weights are recorded per species - --/ - -/-- The mass-weight scaling of a single component space is natural in the value space. It - therefore cannot see which species a component function came from, so in the alternative - encoding `JetComponentSpace (∀ i, V i)`, where a species enters through - `JetComponentSpace.comap (LinearMap.proj i)`, every species is scaled by the same weight. - That is why the total generator space of this file is a direct sum, with one weight per - summand. - - The statement is about a single `JetComponentSpace` and would sit more naturally with the - rest of that API in - `Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.Basic`; it - is here because it justifies the choice this file makes. -/ -lemma JetComponentSpace.comap_comp_massWeightScale {V W : Type*} [AddCommGroup V] - [Module ℂ V] [AddCommGroup W] [Module ℂ W] (f : V →ₗ[ℂ] W) (w : ℕ) (c : ℂ) : - (JetComponentSpace.comap f).comp (JetComponentSpace.massWeightScale w c) - = (JetComponentSpace.massWeightScale w c).comp (JetComponentSpace.comap f) := by - simp only [JetComponentSpace.comap, JetComponentSpace.massWeightScale, - LinearMap.comp_smul, LinearMap.smul_comp, LinearMap.prodMap_comp, - ← TensorProduct.map_comp, LinearMap.comp_id, LinearMap.id_comp] From 892490828bd5ded9782009b3d45bd55d9431d7f7 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 10 Sep 2026 05:56:35 +0100 Subject: [PATCH 314/367] refacotr: Move MassWeightPoly results --- Physlib.lean | 2 +- .../GaugeJetAlgebra/MassWeightPoly.lean | 117 +++++++++--------- .../JetAlgebra/MassWeightPoly.lean | 2 +- 3 files changed, 60 insertions(+), 61 deletions(-) rename Physlib/{Particles/StandardModel/GaugeBosons => ClassicalFieldTheory/GaugeTheory/GaugeBoson}/GaugeJetAlgebra/MassWeightPoly.lean (72%) diff --git a/Physlib.lean b/Physlib.lean index bc7a78733..c8d6248c7 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -7,6 +7,7 @@ public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebr public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.JetDeriv public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.LorentzAction public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.MassDim +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.MassWeightPoly public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.FieldStrength public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.GaugeLaw @@ -332,7 +333,6 @@ public import Physlib.Particles.StandardModel.GaugeAlgebra.Basic public import Physlib.Particles.StandardModel.GaugeAlgebra.Basis public import Physlib.Particles.StandardModel.GaugeAlgebra.JetGaugeAlgebra public import Physlib.Particles.StandardModel.GaugeAlgebra.RootDecomposition -public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.MassWeightPoly public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.Basic public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU2Adjoint diff --git a/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/MassWeightPoly.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/MassWeightPoly.lean similarity index 72% rename from Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/MassWeightPoly.lean rename to Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/MassWeightPoly.lean index db433513a..79080b412 100644 --- a/Physlib/Particles/StandardModel/GaugeBosons/GaugeJetAlgebra/MassWeightPoly.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/MassWeightPoly.lean @@ -6,7 +6,6 @@ Authors: Joseph Tooby-Smith module public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.JetDeriv -public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData /-! # The mass-weight polynomial on the gauge-boson jet algebra @@ -17,9 +16,9 @@ grading: the generator `∂_s A_μ^φ` is sent to `X ^ (2 + 2 |s|)` times itself carrying mass weight two and each derivative two more. The gauge-boson jet algebra is real, but the jet algebra of the Standard Model uses its -complexification `ℂ ⊗[ℝ] GaugeJetAlgebra GaugeAlgebra`. So the grading is built in two steps: +complexification `ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤`. So the grading is built in two steps: the universal property of the symmetric algebra gives a real algebra map landing in -`Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra GaugeAlgebra)` — a commutative target, so there is no +`Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤)` — a commutative target, so there is no side condition — and the universal property of the tensor product extends it along the scalars to `complexMassWeightPoly`, which is what the ambient theory sees. @@ -45,7 +44,9 @@ to `complexMassWeightPoly`, which is what the ambient theory sees. @[expose] public section -namespace StandardModel +set_option linter.unusedSectionVars false + +variable {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] namespace GaugeJetAlgebra @@ -60,42 +61,42 @@ open TensorProduct /-- The monomial map into polynomials over the complexified jet algebra, as a map of `ℝ`-modules rather than of modules over the complexified jet algebra. -/ noncomputable def monomialₗ (n : ℕ) : - (ℂ ⊗[ℝ] GaugeJetAlgebra GaugeAlgebra) →ₗ[ℝ] - Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra GaugeAlgebra) := + (ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤) →ₗ[ℝ] + Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤) := (Polynomial.monomial n).restrictScalars ℝ @[simp] -lemma monomialₗ_apply (n : ℕ) (x : ℂ ⊗[ℝ] GaugeJetAlgebra GaugeAlgebra) : - monomialₗ n x = Polynomial.monomial n x := rfl +lemma monomialₗ_apply (n : ℕ) (x : ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤) : + (monomialₗ (𝔤 := 𝔤)) n x = Polynomial.monomial n x := rfl /-- A component function, viewed inside the complexified jet algebra: the generator `∂_s A_μ^φ` tensored with the scalar one. -/ noncomputable def ιComplex : - (GaugeBoson.JetComponentSpace GaugeAlgebra) →ₗ[ℝ] ℂ ⊗[ℝ] GaugeJetAlgebra GaugeAlgebra := + (GaugeBoson.JetComponentSpace 𝔤) →ₗ[ℝ] ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤 := Algebra.TensorProduct.includeRight.toLinearMap.comp - (SymmetricAlgebra.ι ℝ (GaugeBoson.JetComponentSpace GaugeAlgebra)) + (SymmetricAlgebra.ι ℝ (GaugeBoson.JetComponentSpace 𝔤)) @[simp] -lemma ιComplex_apply (x : (GaugeBoson.JetComponentSpace GaugeAlgebra)) : - ιComplex x = - (1 : ℂ) ⊗ₜ[ℝ] SymmetricAlgebra.ι ℝ (GaugeBoson.JetComponentSpace GaugeAlgebra) x := rfl +lemma ιComplex_apply (x : (GaugeBoson.JetComponentSpace 𝔤)) : + (ιComplex (𝔤 := 𝔤)) x = + (1 : ℂ) ⊗ₜ[ℝ] SymmetricAlgebra.ι ℝ (GaugeBoson.JetComponentSpace 𝔤) x := rfl /-- The mass-weight polynomial of a component function: the linear map sending the symbol `∂_s A^φ` to `X ^ (2 + 2 |s|)` times itself, read off from the multiset basis of the real derivative symbols. -/ noncomputable def jetComponentPoly : - (GaugeBoson.JetComponentSpace GaugeAlgebra) →ₗ[ℝ] - Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra GaugeAlgebra) := + (GaugeBoson.JetComponentSpace 𝔤) →ₗ[ℝ] + Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤) := TensorProduct.lift (DerivAlgebraReal.basisMultiset.constr ℝ fun s => (monomialₗ (2 + 2 * Multiset.card s)).comp (ιComplex.comp (TensorProduct.mk ℝ DerivAlgebraReal - (Module.Dual ℝ (GaugeBoson GaugeAlgebra)) (DerivAlgebraReal.basisMultiset s)))) + (Module.Dual ℝ (GaugeBoson 𝔤)) (DerivAlgebraReal.basisMultiset s)))) /-- On the symbol `∂_s A^φ` the component map is the monomial of degree `2 + 2 |s|`: the gauge field contributes two and each derivative two more. -/ lemma jetComponentPoly_basisMultiset_tmul (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℝ (GaugeBoson GaugeAlgebra)) : - jetComponentPoly (DerivAlgebraReal.basisMultiset s ⊗ₜ[ℝ] φ) = + (φ : Module.Dual ℝ (GaugeBoson 𝔤)) : + (jetComponentPoly (𝔤 := 𝔤)) (DerivAlgebraReal.basisMultiset s ⊗ₜ[ℝ] φ) = Polynomial.monomial (2 + 2 * Multiset.card s) (ιComplex (DerivAlgebraReal.basisMultiset s ⊗ₜ[ℝ] φ)) := by rw [jetComponentPoly, TensorProduct.lift.tmul, Module.Basis.constr_basis] @@ -111,35 +112,35 @@ lemma jetComponentPoly_basisMultiset_tmul (s : Multiset (Fin 1 ⊕ Fin 3)) a generator of mass weight `n` to `X ^ n` times its image in the complexification. It needs no side condition because the target is commutative. -/ noncomputable def massWeightPoly : - GaugeJetAlgebra GaugeAlgebra →ₐ[ℝ] - Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra GaugeAlgebra) := by - exact SymmetricAlgebra.lift (R := ℝ) (M := (GaugeBoson.JetComponentSpace GaugeAlgebra)) - (A := Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra GaugeAlgebra)) jetComponentPoly + GaugeJetAlgebra 𝔤 →ₐ[ℝ] + Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤) := by + exact SymmetricAlgebra.lift (R := ℝ) (M := (GaugeBoson.JetComponentSpace 𝔤)) + (A := Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤)) jetComponentPoly /-- On a component function the mass-weight polynomial is the component-function map. -/ @[simp] -lemma massWeightPoly_ι (x : (GaugeBoson.JetComponentSpace GaugeAlgebra)) : - massWeightPoly (SymmetricAlgebra.ι ℝ (GaugeBoson.JetComponentSpace GaugeAlgebra) x) = +lemma massWeightPoly_ι (x : (GaugeBoson.JetComponentSpace 𝔤)) : + (massWeightPoly (𝔤 := 𝔤)) (SymmetricAlgebra.ι ℝ (GaugeBoson.JetComponentSpace 𝔤) x) = jetComponentPoly x := by rw [massWeightPoly, SymmetricAlgebra.lift_ι_apply] /-- The generator `∂_s A_μ^φ` is a monomial eigenvector of mass weight `2 + 2 |s|`. -/ @[simp] lemma massWeightPoly_iteratedJetDeriv_ofA (s : Multiset (Fin 1 ⊕ Fin 3)) - (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : - massWeightPoly (GaugeJetAlgebra.iteratedJetDeriv GaugeAlgebra s - (GaugeJetAlgebra.ofA GaugeAlgebra μ φ)) = + (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + (massWeightPoly (𝔤 := 𝔤)) (GaugeJetAlgebra.iteratedJetDeriv 𝔤 s + (GaugeJetAlgebra.ofA 𝔤 μ φ)) = Polynomial.monomial (2 + 2 * Multiset.card s) ((1 : ℂ) ⊗ₜ[ℝ] - GaugeJetAlgebra.iteratedJetDeriv GaugeAlgebra s - (GaugeJetAlgebra.ofA GaugeAlgebra μ φ)) := by + GaugeJetAlgebra.iteratedJetDeriv 𝔤 s + (GaugeJetAlgebra.ofA 𝔤 μ φ)) := by rw [GaugeJetAlgebra.iteratedJetDeriv_ofA, massWeightPoly_ι, jetComponentPoly_basisMultiset_tmul, ιComplex_apply] /-- The undifferentiated gauge field has mass weight two — mass dimension one. -/ -lemma massWeightPoly_ofA (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : - massWeightPoly (GaugeJetAlgebra.ofA GaugeAlgebra μ φ) = - Polynomial.monomial 2 ((1 : ℂ) ⊗ₜ[ℝ] GaugeJetAlgebra.ofA GaugeAlgebra μ φ) := by - have h := massWeightPoly_iteratedJetDeriv_ofA (0 : Multiset (Fin 1 ⊕ Fin 3)) μ φ +lemma massWeightPoly_ofA (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + (massWeightPoly (𝔤 := 𝔤)) (GaugeJetAlgebra.ofA 𝔤 μ φ) = + Polynomial.monomial 2 ((1 : ℂ) ⊗ₜ[ℝ] GaugeJetAlgebra.ofA 𝔤 μ φ) := by + have h := massWeightPoly_iteratedJetDeriv_ofA (𝔤 := 𝔤) (0 : Multiset (Fin 1 ⊕ Fin 3)) μ φ rwa [GaugeJetAlgebra.iteratedJetDeriv_zero, LinearMap.id_apply, Multiset.card_zero, Nat.mul_zero, Nat.add_zero] at h @@ -154,19 +155,19 @@ lemma massWeightPoly_ofA (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgeb map obtained from the real one by extending the scalars, the grading the jet algebra of the Standard Model sees on its gauge sector. -/ noncomputable def complexMassWeightPoly : - (ℂ ⊗[ℝ] GaugeJetAlgebra GaugeAlgebra) →ₐ[ℂ] - Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra GaugeAlgebra) := by + (ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤) →ₐ[ℂ] + Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤) := by refine Algebra.TensorProduct.lift (R := ℝ) (S := ℂ) (A := ℂ) - (B := GaugeJetAlgebra GaugeAlgebra) - (C := Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra GaugeAlgebra)) - (Algebra.ofId ℂ (Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra GaugeAlgebra))) massWeightPoly ?_ + (B := GaugeJetAlgebra 𝔤) + (C := Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤)) + (Algebra.ofId ℂ (Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤))) massWeightPoly ?_ intro x y - exact Commute.all (S := Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra GaugeAlgebra)) _ _ + exact Commute.all (S := Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤)) _ _ /-- On a pure tensor the complexified grading is the scalar times the real grading. -/ -lemma complexMassWeightPoly_tmul (z : ℂ) (x : GaugeJetAlgebra GaugeAlgebra) : - complexMassWeightPoly (z ⊗ₜ[ℝ] x) = - Polynomial.C (z ⊗ₜ[ℝ] (1 : GaugeJetAlgebra GaugeAlgebra)) * massWeightPoly x := by +lemma complexMassWeightPoly_tmul (z : ℂ) (x : GaugeJetAlgebra 𝔤) : + (complexMassWeightPoly (𝔤 := 𝔤)) (z ⊗ₜ[ℝ] x) = + Polynomial.C (z ⊗ₜ[ℝ] (1 : GaugeJetAlgebra 𝔤)) * massWeightPoly x := by rw [complexMassWeightPoly, Algebra.TensorProduct.lift_tmul] congr 1 @@ -175,12 +176,12 @@ set_option maxHeartbeats 400000 in is a monomial eigenvector of mass weight `2 + 2 |s|`. -/ @[simp] lemma complexMassWeightPoly_tmul_iteratedJetDeriv_ofA (z : ℂ) - (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : - complexMassWeightPoly (z ⊗ₜ[ℝ] GaugeJetAlgebra.iteratedJetDeriv GaugeAlgebra s - (GaugeJetAlgebra.ofA GaugeAlgebra μ φ)) = + (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + (complexMassWeightPoly (𝔤 := 𝔤)) (z ⊗ₜ[ℝ] GaugeJetAlgebra.iteratedJetDeriv 𝔤 s + (GaugeJetAlgebra.ofA 𝔤 μ φ)) = Polynomial.monomial (2 + 2 * Multiset.card s) (z ⊗ₜ[ℝ] - GaugeJetAlgebra.iteratedJetDeriv GaugeAlgebra s - (GaugeJetAlgebra.ofA GaugeAlgebra μ φ)) := by + GaugeJetAlgebra.iteratedJetDeriv 𝔤 s + (GaugeJetAlgebra.ofA 𝔤 μ φ)) := by rw [complexMassWeightPoly_tmul, massWeightPoly_iteratedJetDeriv_ofA, ← Polynomial.monomial_zero_left, Polynomial.monomial_mul_monomial, Nat.zero_add, Algebra.TensorProduct.tmul_mul_tmul, mul_one, one_mul] @@ -194,8 +195,8 @@ lemma complexMassWeightPoly_tmul_iteratedJetDeriv_ofA (z : ℂ) /-- Setting the formal variable to one collapses the component map back to the component function it graded. The derivative monomials span, so it is enough to check this on the multiset basis. -/ -lemma jetComponentPoly_eval_one (x : (GaugeBoson.JetComponentSpace GaugeAlgebra)) : - (jetComponentPoly x).eval 1 = ιComplex x := by +lemma jetComponentPoly_eval_one (x : (GaugeBoson.JetComponentSpace 𝔤)) : + ((jetComponentPoly (𝔤 := 𝔤)) x).eval 1 = ιComplex x := by induction x using TensorProduct.induction_on with | zero => rw [map_zero, Polynomial.eval_zero, map_zero] | add a b ha hb => rw [map_add, Polynomial.eval_add, ha, hb, map_add] @@ -216,14 +217,14 @@ lemma jetComponentPoly_eval_one (x : (GaugeBoson.JetComponentSpace GaugeAlgebra) set_option maxHeartbeats 400000 in /-- Setting the formal variable to one recovers the original element, viewed in the complexification. -/ -lemma massWeightPoly_eval_one (x : GaugeJetAlgebra GaugeAlgebra) : - (massWeightPoly x).eval 1 = +lemma massWeightPoly_eval_one (x : GaugeJetAlgebra 𝔤) : + ((massWeightPoly (𝔤 := 𝔤)) x).eval 1 = Algebra.TensorProduct.includeRight (R := ℝ) (A := ℂ) - (B := GaugeJetAlgebra GaugeAlgebra) x := by - have h : (Polynomial.eval₂AlgHom (AlgHom.id ℝ (ℂ ⊗[ℝ] GaugeJetAlgebra GaugeAlgebra)) 1 + (B := GaugeJetAlgebra 𝔤) x := by + have h : (Polynomial.eval₂AlgHom (AlgHom.id ℝ (ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤)) 1 fun b => Commute.one_right b).comp massWeightPoly = (Algebra.TensorProduct.includeRight : - GaugeJetAlgebra GaugeAlgebra →ₐ[ℝ] ℂ ⊗[ℝ] GaugeJetAlgebra GaugeAlgebra) := by + GaugeJetAlgebra 𝔤 →ₐ[ℝ] ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤) := by refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun y => ?_) simp change Polynomial.eval₂ (RingHom.id _) 1 (jetComponentPoly y) = _ @@ -233,8 +234,8 @@ lemma massWeightPoly_eval_one (x : GaugeJetAlgebra GaugeAlgebra) : /-- Setting the formal variable to one recovers the original element of the complexified jet algebra: the mass-weight pieces sum back to it. -/ -lemma complexMassWeightPoly_eval_one (y : ℂ ⊗[ℝ] GaugeJetAlgebra GaugeAlgebra) : - (complexMassWeightPoly y).eval 1 = y := by +lemma complexMassWeightPoly_eval_one (y : ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤) : + ((complexMassWeightPoly (𝔤 := 𝔤)) y).eval 1 = y := by induction y using TensorProduct.induction_on with | zero => rw [map_zero, Polynomial.eval_zero] | add a b ha hb => rw [map_add, Polynomial.eval_add, ha, hb] @@ -245,10 +246,8 @@ lemma complexMassWeightPoly_eval_one (y : ℂ ⊗[ℝ] GaugeJetAlgebra GaugeAlge /-- The mass-weight polynomial on the complexification is injective: an element is recovered from its graded pieces. -/ -lemma complexMassWeightPoly_injective : Function.Injective complexMassWeightPoly := by +lemma complexMassWeightPoly_injective : Function.Injective (complexMassWeightPoly (𝔤 := 𝔤)) := by intro x y h rw [← complexMassWeightPoly_eval_one x, ← complexMassWeightPoly_eval_one y, h] end GaugeJetAlgebra - -end StandardModel diff --git a/Physlib/Particles/StandardModel/JetAlgebra/MassWeightPoly.lean b/Physlib/Particles/StandardModel/JetAlgebra/MassWeightPoly.lean index c130533d4..07933db5e 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/MassWeightPoly.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/MassWeightPoly.lean @@ -8,7 +8,7 @@ module public import Physlib.Particles.StandardModel.JetAlgebra.Generators public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.MassWeightPoly public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.MassWeightPoly -public import Physlib.Particles.StandardModel.GaugeBosons.GaugeJetAlgebra.MassWeightPoly +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.MassWeightPoly /-! # The mass-weight polynomial on the jet algebra of the Standard Model From a74d51681f916693ed62ff78983789e525bdbdf6 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 10 Sep 2026 06:40:37 +0100 Subject: [PATCH 315/367] refactor: Move files --- Physlib.lean | 32 +++++++++---------- .../GaugeBoson/GaugeJetAlgebra/MassDim.lean | 4 +-- .../GaugeBoson/Realization/Basic.lean | 2 ++ .../GaugeTheory/GaugeFieldData/Basic.lean | 2 +- .../LocalFieldAlgebra/Basic.lean} | 0 .../FieldAlgebra/Basic.lean | 0 .../FieldAlgebra/ConstantAction.lean} | 2 +- .../FieldAlgebra/GaugeAction.lean | 2 +- .../FieldAlgebra/JetDeriv.lean | 2 +- .../FieldAlgebra/JetDerivClass.lean | 5 +-- .../FieldAlgebra/JetDerivConstruction.lean | 6 ++-- .../FieldAlgebra/LorentzAction.lean | 2 +- .../FieldAlgebra/MassDim.lean | 2 +- .../LocalFieldAlgebra}/FieldAlgebra/Prod.lean | 2 +- .../FieldAlgebra/Statistics.lean | 7 ++-- .../LocalFieldAlgebra}/Jet.lean | 0 .../LocalFieldAlgebra}/JetRep.lean | 2 +- .../GaugeTheory/LocalGaugeData/Basic.lean | 8 ----- .../LocalGaugeData/MaurerCartan.lean | 17 ++++++++++ .../LocalGaugeData/TransformsIn.lean | 2 +- .../{Matter => MatterField}/Charge.lean | 0 .../CovariantDeriv.lean | 2 +- .../GaugeTheory/MatterField/FieldAlgebra.lean | 30 +++++++++-------- .../MatterField/JetComponentSpace/Basic.lean | 2 +- .../JetComponentSpace/GaugeAction.lean | 2 +- .../JetComponentSpace/TransformsIn.lean | 2 +- .../GeorgiGlashow/Basic.lean | 2 +- .../PatiSalam/Basic.lean | 2 +- .../Fermions/DownSinglet/Basic.lean | 2 +- .../Fermions/LeptonDoublet/Basic.lean | 2 +- .../Fermions/LeptonSinglet/Basic.lean | 2 +- .../Fermions/QuarkDoublet/Basic.lean | 2 +- .../Fermions/UpSinglet/Basic.lean | 2 +- .../Particles/StandardModel/FieldData.lean | 2 +- .../StandardModel/GaugeAlgebra/Basic.lean | 2 +- .../GaugeAlgebra/JetGaugeAlgebra.lean | 2 +- .../StandardModel/{ => GaugeGroup}/Basic.lean | 0 .../GaugeGroup/GaugeWeightDecomposition.lean | 2 +- .../GaugeGroup/Invariants/IsU1BiAdjoint.lean | 2 +- .../GaugeGroup/JetGaugeGroup/Basic.lean | 2 +- .../GaugeGroup/MaurerCartan/Basic.lean | 2 +- .../GaugeGroup/SU2PermDecomposition.lean | 2 +- .../GaugeGroup/SU3PermDecomposition.lean | 2 +- .../StandardModel/HiggsBoson/Basic.lean | 2 +- .../Matter/FermionicAlgebra/Prod.lean | 2 +- 45 files changed, 95 insertions(+), 78 deletions(-) rename Physlib/ClassicalFieldTheory/{JetAlgebra/LocalFieldAlgebra.lean => GaugeTheory/LocalFieldAlgebra/Basic.lean} (100%) rename Physlib/ClassicalFieldTheory/{JetAlgebra => GaugeTheory/LocalFieldAlgebra}/FieldAlgebra/Basic.lean (100%) rename Physlib/ClassicalFieldTheory/{JetAlgebra/FieldAlgebra/ConstantGaugeAction.lean => GaugeTheory/LocalFieldAlgebra/FieldAlgebra/ConstantAction.lean} (97%) rename Physlib/ClassicalFieldTheory/{JetAlgebra => GaugeTheory/LocalFieldAlgebra}/FieldAlgebra/GaugeAction.lean (98%) rename Physlib/ClassicalFieldTheory/{JetAlgebra => GaugeTheory/LocalFieldAlgebra}/FieldAlgebra/JetDeriv.lean (99%) rename Physlib/ClassicalFieldTheory/{JetAlgebra => GaugeTheory/LocalFieldAlgebra}/FieldAlgebra/JetDerivClass.lean (93%) rename Physlib/ClassicalFieldTheory/{JetAlgebra => GaugeTheory/LocalFieldAlgebra}/FieldAlgebra/JetDerivConstruction.lean (97%) rename Physlib/ClassicalFieldTheory/{JetAlgebra => GaugeTheory/LocalFieldAlgebra}/FieldAlgebra/LorentzAction.lean (98%) rename Physlib/ClassicalFieldTheory/{JetAlgebra => GaugeTheory/LocalFieldAlgebra}/FieldAlgebra/MassDim.lean (98%) rename Physlib/ClassicalFieldTheory/{JetAlgebra => GaugeTheory/LocalFieldAlgebra}/FieldAlgebra/Prod.lean (97%) rename Physlib/ClassicalFieldTheory/{JetAlgebra => GaugeTheory/LocalFieldAlgebra}/FieldAlgebra/Statistics.lean (97%) rename Physlib/ClassicalFieldTheory/{JetAlgebra => GaugeTheory/LocalFieldAlgebra}/Jet.lean (100%) rename Physlib/ClassicalFieldTheory/{JetAlgebra => GaugeTheory/LocalFieldAlgebra}/JetRep.lean (99%) rename Physlib/ClassicalFieldTheory/GaugeTheory/{Matter => MatterField}/Charge.lean (100%) rename Physlib/ClassicalFieldTheory/GaugeTheory/{Matter => MatterField}/CovariantDeriv.lean (99%) rename Physlib/Particles/StandardModel/{ => GaugeGroup}/Basic.lean (100%) diff --git a/Physlib.lean b/Physlib.lean index c8d6248c7..0564930ed 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -20,34 +20,34 @@ public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeFieldData.BosonModul public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeFieldData.FermionGenerators public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeFieldData.FermionMatterField public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeFieldData.FermionModule +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.ConstantAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.GaugeAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.JetDeriv +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.JetDerivClass +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.JetDerivConstruction +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.LorentzAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.MassDim +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.Prod +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.Statistics +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.Jet +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.JetRep public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.AdjointCoeff public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.MaurerCartan public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.TransformsIn public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Truncation -public import Physlib.ClassicalFieldTheory.GaugeTheory.Matter.Charge -public import Physlib.ClassicalFieldTheory.GaugeTheory.Matter.CovariantDeriv public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.Charge +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.CovariantDeriv public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.FieldAlgebra public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.GaugeAction public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.TransformsIn public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.Pi public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.Prod -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.JetRep -public import Physlib.ClassicalFieldTheory.JetAlgebra.LocalFieldAlgebra public import Physlib.ClassicalFieldTheory.Local.Variation public import Physlib.ClassicalMechanics.Basic public import Physlib.ClassicalMechanics.DampedHarmonicOscillator.Basic @@ -296,7 +296,6 @@ public import Physlib.Particles.StandardModel.AnomalyCancellation.NoGrav.Basic public import Physlib.Particles.StandardModel.AnomalyCancellation.NoGrav.One.Lemmas public import Physlib.Particles.StandardModel.AnomalyCancellation.NoGrav.One.LinearParameterization public import Physlib.Particles.StandardModel.AnomalyCancellation.Permutations -public import Physlib.Particles.StandardModel.Basic public import Physlib.Particles.StandardModel.CovAlgebraRealization.Basic public import Physlib.Particles.StandardModel.CovAlgebraRealization.FermionGaugeSector.Basic public import Physlib.Particles.StandardModel.CovAlgebraRealization.FermionGaugeSector.MassWeight @@ -333,6 +332,7 @@ public import Physlib.Particles.StandardModel.GaugeAlgebra.Basic public import Physlib.Particles.StandardModel.GaugeAlgebra.Basis public import Physlib.Particles.StandardModel.GaugeAlgebra.JetGaugeAlgebra public import Physlib.Particles.StandardModel.GaugeAlgebra.RootDecomposition +public import Physlib.Particles.StandardModel.GaugeGroup.Basic public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.Basic public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU2Adjoint diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/MassDim.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/MassDim.lean index 051e8f9b7..5f494b911 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/MassDim.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/MassDim.lean @@ -17,8 +17,8 @@ The mass dimension of the gauge bosons is tracked multiplicatively through the `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. +`Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.MassDim`, on the +real, single-half component space of the gauge bosons. ## ii. Key results diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Basic.lean index 64043c42a..636a273e9 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Basic.lean @@ -181,4 +181,6 @@ include h in lemma gauge_mul (U : G) (b₁ b₂ : B) : repJet U (b₁ * b₂) = repJet U b₁ * repJet U b₂ := h.repJet_mul U b₁ b₂ +TODO (lines := 177-182) (date := 2026-09-10) "This lemma can be removed." + end GaugeAlgebraRealization diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/Basic.lean index a963a88f9..1b0434db3 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/Basic.lean @@ -37,7 +37,7 @@ The connection generator space is not among them: it is the existing The algebra built on the three generator spaces, `GaugeFieldData.LocalFieldAlgebra`, and its mapping-out universal property are in -`Physlib.ClassicalFieldTheory.JetAlgebra.LocalFieldAlgebra`. The split is one of subject +`Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.Basic`. The split is one of subject matter: here the datum and the spaces it determines, there the algebra of local expressions on them. diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/LocalFieldAlgebra.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Basic.lean similarity index 100% rename from Physlib/ClassicalFieldTheory/JetAlgebra/LocalFieldAlgebra.lean rename to Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Basic.lean diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/Basic.lean similarity index 100% rename from Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/Basic.lean rename to Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/Basic.lean diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/ConstantGaugeAction.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/ConstantAction.lean similarity index 97% rename from Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/ConstantGaugeAction.lean rename to Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/ConstantAction.lean index 8b9c47aa9..39b9114da 100644 --- a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/ConstantGaugeAction.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/ConstantAction.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.GaugeAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.GaugeAction /-! # Constant gauge transformations on a field algebra diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/GaugeAction.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/GaugeAction.lean similarity index 98% rename from Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/GaugeAction.lean rename to Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/GaugeAction.lean index bc0787a9f..98aa578d2 100644 --- a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/GaugeAction.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/GaugeAction.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.GaugeAction /-! # The gauge action on the field algebra diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/JetDeriv.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/JetDeriv.lean similarity index 99% rename from Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/JetDeriv.lean rename to Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/JetDeriv.lean index b5a7074db..a4c0a28a3 100644 --- a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/JetDeriv.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/JetDeriv.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.JetDerivClass +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.JetDerivClass public import Physlib.Relativity.IsLorentzDeriv /-! # The formal total derivative on a field algebra diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/JetDerivClass.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/JetDerivClass.lean similarity index 93% rename from Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/JetDerivClass.lean rename to Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/JetDerivClass.lean index 5e34c145f..a6b69041d 100644 --- a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/JetDerivClass.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/JetDerivClass.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.Basic /-! # The total derivative on a field algebra: the interface @@ -15,7 +15,8 @@ the statistics — a derivation of the symmetric algebra for bosons, an even der 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`. +built on them is in +`Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.JetDeriv`. -/ @[expose] public section diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/JetDerivConstruction.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/JetDerivConstruction.lean similarity index 97% rename from Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/JetDerivConstruction.lean rename to Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/JetDerivConstruction.lean index e0dd8b718..d8a3e8f86 100644 --- a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/JetDerivConstruction.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/JetDerivConstruction.lean @@ -5,10 +5,10 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.JetDerivClass +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.JetDerivClass public import Physlib.Relativity.IsLorentzDeriv public import Mathlib.Algebra.TrivSqZeroExt.Basic -public import Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.Statistics +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.Statistics /-! # The total derivative on the bosonic and fermionic algebras: constructions @@ -16,7 +16,7 @@ public import Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.Statistics 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. +`Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.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. diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/LorentzAction.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/LorentzAction.lean similarity index 98% rename from Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/LorentzAction.lean rename to Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/LorentzAction.lean index dfa3414bc..05ac3a15a 100644 --- a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/LorentzAction.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/LorentzAction.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.JetDeriv +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.JetDeriv /-! # The Lorentz action on the field algebra diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/MassDim.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/MassDim.lean similarity index 98% rename from Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/MassDim.lean rename to Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/MassDim.lean index dca625555..d01762396 100644 --- a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/MassDim.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/MassDim.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.JetDeriv +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.JetDeriv /-! # Mass dimension on the field algebra diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/Prod.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/Prod.lean similarity index 97% rename from Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/Prod.lean rename to Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/Prod.lean index ffd3126c2..10c6b4ccd 100644 --- a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/Prod.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/Prod.lean @@ -7,7 +7,7 @@ module public import Mathlib.LinearAlgebra.CliffordAlgebra.Prod public import Mathlib.LinearAlgebra.TensorProduct.Prod -public import Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.Statistics +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.Statistics /-! # The field algebras of a direct sum diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/Statistics.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/Statistics.lean similarity index 97% rename from Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/Statistics.lean rename to Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/Statistics.lean index 5b738e579..93adac502 100644 --- a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/Statistics.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/Statistics.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.Basic public import Physlib.Mathematics.SymmetricAlgebra public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basic /-! @@ -22,8 +22,9 @@ field: 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 +derivative and the mass-weight scaling of +`Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.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). diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/Jet.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Jet.lean similarity index 100% rename from Physlib/ClassicalFieldTheory/JetAlgebra/Jet.lean rename to Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Jet.lean diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/JetRep.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/JetRep.lean similarity index 99% rename from Physlib/ClassicalFieldTheory/JetAlgebra/JetRep.lean rename to Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/JetRep.lean index c14ab5d90..cecb523b8 100644 --- a/Physlib/ClassicalFieldTheory/JetAlgebra/JetRep.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/JetRep.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.ClassicalFieldTheory.JetAlgebra.Jet +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.Jet public import Physlib.Relativity.Tensors.ComplexTensor.Vector.Pre.Basic public import Physlib.Relativity.IsLorentzDeriv public import Mathlib.RepresentationTheory.Basic diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Basic.lean index c9017c12c..90dae70b5 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Basic.lean @@ -375,12 +375,4 @@ lemma ext_of_evalLie_iteratedDeriv [jets.Faithful] {x y : 𝔤J} x = y := Faithful.ext_of_evalLie_iteratedDeriv h -/-- In a faithful package, the Maurer–Cartan form vanishes exactly on the constant jets. -/ -lemma maurerCartan_eq_zero_iff [jets.Faithful] (U : G) : - jets.maurerCartan U = 0 ↔ U = jets.ofConstant (jets.eval U) := by - refine ⟨Faithful.eq_ofConstant_of_maurerCartan_eq_zero, fun h => ?_⟩ - funext μ - rw [h, jets.maurerCartan_ofConstant] - rfl - end LocalGaugeData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/MaurerCartan.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/MaurerCartan.lean index 80d12b8bb..e3d42a58d 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/MaurerCartan.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/MaurerCartan.lean @@ -44,12 +44,15 @@ jet, and the truncation filtration it defines, is the subject of symmetrized data determines the base-point Taylor data of `ω`. - `LocalGaugeData.evalLie_iteratedDeriv_maurerCartan_eq_zero_of_symmetrized_eq_zero` : the base-point half of Maurer–Cartan triangularity. +- `LocalGaugeData.maurerCartan_eq_zero_iff` : in a faithful package, the Maurer–Cartan form + vanishes exactly on the constant jets. ## iii. Table of contents - A. The structural equation at the base point - B. The symmetrized Maurer–Cartan form - C. Determination of the Maurer–Cartan form by its symmetrized coefficients +- D. Faithful packages and the Maurer–Cartan form -/ @@ -276,4 +279,18 @@ lemma evalLie_iteratedDeriv_maurerCartan_eq_of_symmetrized_eq (U V : G) (n : ℕ exact jets.evalLie_iteratedDeriv_bracket_congr (s.erase ν) _ _ _ _ (fun p hp => ih p μ (hlt p hp)) (fun p hp => ih p ν (hlt p hp)) +/-! + +## D. Faithful packages and the Maurer–Cartan form + +-/ + +/-- In a faithful package, the Maurer–Cartan form vanishes exactly on the constant jets. -/ +lemma maurerCartan_eq_zero_iff [jets.Faithful] (U : G) : + jets.maurerCartan U = 0 ↔ U = jets.ofConstant (jets.eval U) := by + refine ⟨Faithful.eq_ofConstant_of_maurerCartan_eq_zero, fun h => ?_⟩ + funext μ + rw [h, jets.maurerCartan_ofConstant] + rfl + end LocalGaugeData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/TransformsIn.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/TransformsIn.lean index 190142499..442ef734c 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/TransformsIn.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/TransformsIn.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.ClassicalFieldTheory.GaugeTheory.Matter.CovariantDeriv +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.CovariantDeriv public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Truncation /-! # Gauge tensors in a representation diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/Matter/Charge.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Charge.lean similarity index 100% rename from Physlib/ClassicalFieldTheory/GaugeTheory/Matter/Charge.lean rename to Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Charge.lean diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/Matter/CovariantDeriv.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/CovariantDeriv.lean similarity index 99% rename from Physlib/ClassicalFieldTheory/GaugeTheory/Matter/CovariantDeriv.lean rename to Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/CovariantDeriv.lean index ed60cbe3e..0d8a42eec 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/Matter/CovariantDeriv.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/CovariantDeriv.lean @@ -6,7 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.GaugeLaw -public import Physlib.ClassicalFieldTheory.JetAlgebra.Jet +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.Jet public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.TransformsInAdjoint public import Mathlib.LinearAlgebra.Basis.Defs public import Mathlib.LinearAlgebra.Dimension.Free diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/FieldAlgebra.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/FieldAlgebra.lean index b0dba2dd5..14952af22 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/FieldAlgebra.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/FieldAlgebra.lean @@ -6,10 +6,11 @@ Authors: Joseph Tooby-Smith module public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.Basic -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 +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.ConstantAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.LorentzAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.MassDim +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.Statistics +public import Physlib.QFT.PerturbationTheory.FieldStatistics.Basic /-! # The field algebras of a matter field @@ -26,8 +27,9 @@ from the file carrying the structure itself. ## ii. Key results -- `MatterField.BosonicJetAlgebra`, `MatterField.FermionicJetAlgebra` : the two canonical - field algebras of a matter field. +- `MatterField.FieldAlgebra` : the field algebra of a matter field of a given statistics — + the bosonic algebra for `FieldStatistic.bosonic`, the fermionic algebra for + `FieldStatistic.fermionic`. - `MatterField.repJetAlgebra` : the jet gauge action on a field algebra of the field. - `MatterField.repConstant` : the global gauge action, along `jets.ofConstant`. - `MatterField.repLorentzGroup` : the Lorentz action on a field algebra of the field. @@ -35,7 +37,7 @@ from the file carrying the structure itself. ## iii. Table of contents -- A. The bosonic and fermionic jet algebras +- A. The field algebra - B. The actions on a field algebra of the matter field -/ @@ -52,15 +54,17 @@ variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] /-! -## A. The bosonic and fermionic jet algebras +## A. The field algebra -/ -/-- 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 +open FieldStatistic in +/-- The field algebra of a matter field of a given statistics: the bosonic algebra + `BosonicAlgebra M.V` for `bosonic`, the exterior algebra `FermionicAlgebra M.V` for + `fermionic`. -/ +abbrev FieldAlgebra : FieldStatistic → Type + | bosonic => BosonicAlgebra M.V + | fermionic => FermionicAlgebra M.V /-! diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/Basic.lean index 10ca2c595..367cbc958 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/Basic.lean @@ -6,7 +6,7 @@ Authors: Joseph Tooby-Smith module -public import Physlib.ClassicalFieldTheory.JetAlgebra.Jet +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.Jet public import Physlib.Relativity.Tensors.ComplexTensor.Vector.Pre.Basic public import Physlib.Relativity.IsLorentzDeriv public import Mathlib.RepresentationTheory.Basic diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/GaugeAction.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/GaugeAction.lean index 04412b53d..3ba7df26e 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/GaugeAction.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/GaugeAction.lean @@ -7,7 +7,7 @@ module public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.Basic -public import Physlib.ClassicalFieldTheory.JetAlgebra.JetRep +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.JetRep /-! # The gauge action on the jet component space diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/TransformsIn.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/TransformsIn.lean index fcff501d1..dc51469bf 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/TransformsIn.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/TransformsIn.lean @@ -6,7 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.GaugeAction -public import Physlib.ClassicalFieldTheory.GaugeTheory.Matter.CovariantDeriv +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.CovariantDeriv /-! # The transformation law of a derivative symbol diff --git a/Physlib/Particles/BeyondTheStandardModel/GeorgiGlashow/Basic.lean b/Physlib/Particles/BeyondTheStandardModel/GeorgiGlashow/Basic.lean index fabbdaba8..66bcaf936 100644 --- a/Physlib/Particles/BeyondTheStandardModel/GeorgiGlashow/Basic.lean +++ b/Physlib/Particles/BeyondTheStandardModel/GeorgiGlashow/Basic.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.Basic /-! # The Georgi-Glashow Model diff --git a/Physlib/Particles/BeyondTheStandardModel/PatiSalam/Basic.lean b/Physlib/Particles/BeyondTheStandardModel/PatiSalam/Basic.lean index 1ccc37b16..e1f23067f 100644 --- a/Physlib/Particles/BeyondTheStandardModel/PatiSalam/Basic.lean +++ b/Physlib/Particles/BeyondTheStandardModel/PatiSalam/Basic.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.Basic /-! # The Pati-Salam Model diff --git a/Physlib/Particles/StandardModel/Fermions/DownSinglet/Basic.lean b/Physlib/Particles/StandardModel/Fermions/DownSinglet/Basic.lean index a31ef6645..4c7e0a776 100644 --- a/Physlib/Particles/StandardModel/Fermions/DownSinglet/Basic.lean +++ b/Physlib/Particles/StandardModel/Fermions/DownSinglet/Basic.lean @@ -5,7 +5,7 @@ Authors: Nathaneal Sajan -/ module -public import Physlib.Particles.StandardModel.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.Basic public import Physlib.Relativity.Fermions.Weyl.BoostWeight public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.JetGaugeGroup.Basic diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/Basic.lean b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/Basic.lean index 7671b44aa..68ed61aab 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/Basic.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/Basic.lean @@ -5,7 +5,7 @@ Authors: Nathaneal Sajan -/ module -public import Physlib.Particles.StandardModel.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.Basic public import Physlib.Relativity.Fermions.Weyl.BoostWeight public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.JetGaugeGroup.Basic diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/Basic.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/Basic.lean index af06e6d57..4c41e6ffe 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/Basic.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/Basic.lean @@ -5,7 +5,7 @@ Authors: Nathaneal Sajan -/ module -public import Physlib.Particles.StandardModel.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.Basic public import Physlib.Relativity.Fermions.Weyl.BoostWeight public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.JetGaugeGroup.Basic diff --git a/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/Basic.lean b/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/Basic.lean index 56baa5f0f..c398d8ff6 100644 --- a/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/Basic.lean +++ b/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/Basic.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.Basic public import Physlib.Relativity.Fermions.Weyl.BoostWeight public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.JetGaugeGroup.Basic diff --git a/Physlib/Particles/StandardModel/Fermions/UpSinglet/Basic.lean b/Physlib/Particles/StandardModel/Fermions/UpSinglet/Basic.lean index d4d1647eb..ced960357 100644 --- a/Physlib/Particles/StandardModel/Fermions/UpSinglet/Basic.lean +++ b/Physlib/Particles/StandardModel/Fermions/UpSinglet/Basic.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.Basic public import Physlib.Relativity.Fermions.Weyl.BoostWeight public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.JetGaugeGroup.Basic diff --git a/Physlib/Particles/StandardModel/FieldData.lean b/Physlib/Particles/StandardModel/FieldData.lean index 22df0d496..12243b395 100644 --- a/Physlib/Particles/StandardModel/FieldData.lean +++ b/Physlib/Particles/StandardModel/FieldData.lean @@ -5,7 +5,7 @@ Authors: Nathaneal Sajan -/ module -public import Physlib.ClassicalFieldTheory.JetAlgebra.LocalFieldAlgebra +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.Basic public import Physlib.Particles.StandardModel.Fermions.MatterField public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData public import Physlib.Particles.StandardModel.HiggsBoson.MatterField diff --git a/Physlib/Particles/StandardModel/GaugeAlgebra/Basic.lean b/Physlib/Particles/StandardModel/GaugeAlgebra/Basic.lean index 6854c0ca6..35f560e9b 100644 --- a/Physlib/Particles/StandardModel/GaugeAlgebra/Basic.lean +++ b/Physlib/Particles/StandardModel/GaugeAlgebra/Basic.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.Basic public import Physlib.Particles.StandardModel.GaugeGroup.JetGaugeGroup.Basic public import Physlib.Relativity.Tensors.ComplexTensor.Basic public import Physlib.Relativity.Tensors.RealTensor.Vector.Basic diff --git a/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean b/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean index b15779090..508b31553 100644 --- a/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean +++ b/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.Basic public import Physlib.Particles.StandardModel.GaugeAlgebra.Basic public import Physlib.Particles.StandardModel.GaugeGroup.JetGaugeGroup.Basic public import Physlib.Relativity.Tensors.ComplexTensor.Basic diff --git a/Physlib/Particles/StandardModel/Basic.lean b/Physlib/Particles/StandardModel/GaugeGroup/Basic.lean similarity index 100% rename from Physlib/Particles/StandardModel/Basic.lean rename to Physlib/Particles/StandardModel/GaugeGroup/Basic.lean diff --git a/Physlib/Particles/StandardModel/GaugeGroup/GaugeWeightDecomposition.lean b/Physlib/Particles/StandardModel/GaugeGroup/GaugeWeightDecomposition.lean index 89ad8de97..08f8d0f45 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/GaugeWeightDecomposition.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/GaugeWeightDecomposition.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.Basic public import Physlib.Mathematics.ConjModule public import Mathlib.LinearAlgebra.Eigenspace.Basic public import Mathlib.Analysis.Real.Pi.Irrational diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsU1BiAdjoint.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsU1BiAdjoint.lean index 8194bb4f4..60d1fa760 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsU1BiAdjoint.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsU1BiAdjoint.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.Basic public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.Basic public import Mathlib.RepresentationTheory.Invariants /-! diff --git a/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeGroup/Basic.lean b/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeGroup/Basic.lean index 3766c0fe3..837d00c44 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeGroup/Basic.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeGroup/Basic.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.Basic public import Physlib.Relativity.DerivAlgebra public import Mathlib.RingTheory.MvPowerSeries.Basic public import Mathlib.LinearAlgebra.Matrix.Determinant.Basic diff --git a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean index 72fe95b06..2fb22664b 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.Basic public import Physlib.Particles.StandardModel.GaugeGroup.JetGaugeGroup.Basic public import Physlib.Particles.StandardModel.GaugeAlgebra.JetGaugeAlgebra public import Physlib.Relativity.Tensors.ComplexTensor.Basic diff --git a/Physlib/Particles/StandardModel/GaugeGroup/SU2PermDecomposition.lean b/Physlib/Particles/StandardModel/GaugeGroup/SU2PermDecomposition.lean index f8a3353ce..b5757c319 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/SU2PermDecomposition.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/SU2PermDecomposition.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.Basic public import Mathlib.LinearAlgebra.Eigenspace.Basic /-! # The `SU(2)` Weyl element diff --git a/Physlib/Particles/StandardModel/GaugeGroup/SU3PermDecomposition.lean b/Physlib/Particles/StandardModel/GaugeGroup/SU3PermDecomposition.lean index 93c710864..6205f3a2a 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/SU3PermDecomposition.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/SU3PermDecomposition.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.Basic public import Mathlib.LinearAlgebra.Eigenspace.Basic public import Mathlib.LinearAlgebra.Matrix.Permutation /-! diff --git a/Physlib/Particles/StandardModel/HiggsBoson/Basic.lean b/Physlib/Particles/StandardModel/HiggsBoson/Basic.lean index 11791b1b2..f9f9b4e82 100644 --- a/Physlib/Particles/StandardModel/HiggsBoson/Basic.lean +++ b/Physlib/Particles/StandardModel/HiggsBoson/Basic.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Particles.StandardModel.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.Basic public import Mathlib.Geometry.Manifold.VectorBundle.ContMDiffSection /-! diff --git a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Prod.lean b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Prod.lean index 431165af7..b958ae62f 100644 --- a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Prod.lean +++ b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Prod.lean @@ -6,7 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.Basic -public import Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.Prod +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.Prod public import Mathlib.LinearAlgebra.CliffordAlgebra.Prod public import Mathlib.LinearAlgebra.TensorProduct.Prod /-! From 9c032efec0b6cc839c15771f78d65d925153d8d3 Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Thu, 10 Sep 2026 14:59:48 +0400 Subject: [PATCH 316/367] refactor: Replace old JetAlgebra with direct fieldData generator lemmas --- Physlib.lean | 4 + .../GaugeFieldData/BosonGenerators.lean | 122 ++++- .../GaugeFieldData/BosonMatterField.lean | 30 ++ .../GaugeFieldData/FermionGenerators.lean | 127 ++++- .../GaugeFieldData/FermionMatterField.lean | 32 ++ .../GaugeTheory/LocalFieldAlgebra/Basic.lean | 40 ++ .../GaugeTheory/LocalFieldAlgebra/Jet.lean | 23 + .../GaugeTheory/LocalFieldAlgebra/JetRep.lean | 207 ++++++-- .../MatterField/JetComponentSpace/Basic.lean | 22 + .../JetComponentSpace/GaugeAction.lean | 123 ++++- .../GaugeTheory/MatterField/Pi.lean | 33 +- .../Mathematics/AlgebraRepresentation.lean | 128 +++++ Physlib/Mathematics/ExteriorAlgebra.lean | 326 ++++++++++++ Physlib/Mathematics/SymmetricAlgebra.lean | 173 ++++++- .../AlgebraRealization/Basic.lean | 28 +- .../AlgebraRealization/Commutations.lean | 7 +- .../HiggsAlgebraCovRealization/Basic.lean | 16 +- .../AlgebraRealization/MassWeight/Basic.lean | 6 +- .../CovAlgebraRealization/Basic.lean | 55 +- .../JetAlgebra/AlgebraRealization.lean | 44 +- .../StandardModel/JetAlgebra/Basic.lean | 131 +++-- .../JetAlgebra/CovJetAlgebra/Basic.lean | 37 +- .../JetAlgebra/CovJetAlgebra/Higgs.lean | 101 ++-- .../JetAlgebra/FieldAlgebra.lean | 224 +++++--- .../StandardModel/JetAlgebra/GaugeAction.lean | 171 +++++-- .../StandardModel/JetAlgebra/Generators.lean | 218 +++++++- .../StandardModel/JetAlgebra/Invariants.lean | 63 +-- .../StandardModel/JetAlgebra/JetDeriv.lean | 431 +++++++++++----- .../JetAlgebra/LorentzAction.lean | 224 ++++++-- .../JetAlgebra/MassWeightPoly.lean | 320 ++++++++---- .../JetAlgebra/SectorEquiv/Basic.lean | 477 ++++++++++++++++++ .../JetAlgebra/SectorEquiv/Structure.lean | 451 +++++++++++++++++ .../JetAlgebra/TransformsIn.lean | 305 +++++------ 33 files changed, 3784 insertions(+), 915 deletions(-) create mode 100644 Physlib/Mathematics/AlgebraRepresentation.lean create mode 100644 Physlib/Mathematics/ExteriorAlgebra.lean create mode 100644 Physlib/Particles/StandardModel/JetAlgebra/SectorEquiv/Basic.lean create mode 100644 Physlib/Particles/StandardModel/JetAlgebra/SectorEquiv/Structure.lean diff --git a/Physlib.lean b/Physlib.lean index 0564930ed..cd4370352 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -157,6 +157,7 @@ public import Physlib.FluidDynamics.ThermodynamicCauchyFlow.Bernoulli public import Physlib.FluidDynamics.ThermodynamicCauchyFlow.Isentropic public import Physlib.LatticeQFT.Basic public import Physlib.Mathematics.AlgebraGeneration +public import Physlib.Mathematics.AlgebraRepresentation public import Physlib.Mathematics.Calculus.AdjFDeriv public import Physlib.Mathematics.Calculus.Divergence public import Physlib.Mathematics.Calculus.Gradient @@ -171,6 +172,7 @@ public import Physlib.Mathematics.DataStructures.FourTree.UniqueMap public import Physlib.Mathematics.DataStructures.Matrix.LieTrace public import Physlib.Mathematics.Distribution.Basic public import Physlib.Mathematics.Distribution.PowMul +public import Physlib.Mathematics.ExteriorAlgebra public import Physlib.Mathematics.FDerivCurry public import Physlib.Mathematics.Fin public import Physlib.Mathematics.Fin.Involutions @@ -388,6 +390,8 @@ public import Physlib.Particles.StandardModel.JetAlgebra.JetDeriv public import Physlib.Particles.StandardModel.JetAlgebra.LorentzAction public import Physlib.Particles.StandardModel.JetAlgebra.MassWeightPoly public import Physlib.Particles.StandardModel.JetAlgebra.Realization +public import Physlib.Particles.StandardModel.JetAlgebra.SectorEquiv.Basic +public import Physlib.Particles.StandardModel.JetAlgebra.SectorEquiv.Structure public import Physlib.Particles.StandardModel.JetAlgebra.TransformsIn public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.Basic public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.GaugeAction diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/BosonGenerators.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/BosonGenerators.lean index 81be54275..1823b5bdd 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/BosonGenerators.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/BosonGenerators.lean @@ -59,13 +59,17 @@ identification of a direct sum over a finite index with the product. gauge actions assembled on it. - `GaugeFieldData.massWeightScaleBoson` : the mass-weight scaling carrying the weight of each species. +- `GaugeFieldData.jetDerivBoson` : the ordinary derivative shift on the generator space. - `GaugeFieldData.bosonGeneratorsEquiv` : with one shared weight, the generator space is the component space of the bosonic matter field. - `GaugeFieldData.bosonGeneratorsEquiv_inclBoson` : a species sits inside it as the pullback along the projection onto that species. - `GaugeFieldData.bosonGeneratorsEquiv_repLorentzBoson`, - `GaugeFieldData.bosonGeneratorsEquiv_massWeightScaleBoson` : the identification - carries the Lorentz action and the mass-weight scaling across. + `GaugeFieldData.bosonGeneratorsEquiv_repJetBoson`, + `GaugeFieldData.bosonGeneratorsEquiv_massWeightScaleBoson`, + `GaugeFieldData.bosonGeneratorsEquiv_jetDerivBoson` : the identification carries the + Lorentz action, the jet gauge action, the mass-weight scaling and the derivative shift + across. ## iii. Table of contents @@ -74,6 +78,7 @@ identification of a direct sum over a finite index with the product. - B.1. The Lorentz action - B.2. The jet gauge action - B.3. The mass weights + - B.4. The ordinary derivative - C. The bosonic generators as one component space - C.1. The species as pullbacks - C.2. The identification of the transformation data @@ -268,6 +273,78 @@ variable (T) /-! +### B.4. The ordinary derivative + +The formal total derivative shifts the derivative label of a component function, +`∂_s φ_α ↦ ∂_{s + {μ}} φ_α`. Unlike the two actions it takes no data from the species at +all, the label being blind to the value space, so on the generator space it too is +species-diagonal and the same assembly serves. It is recorded here so that the generator +space carries every operation the local field algebra is built from. + +-/ + +/-- The ordinary derivative shift on the bosonic generator space, acting on each species' + component functions by appending `∂_μ` to the derivative label. -/ +noncomputable def jetDerivBoson (μ : Fin 1 ⊕ Fin 3) : + T.BosonGenerators →ₗ[ℂ] T.BosonGenerators := + T.assembleBoson fun i => (T.inclBoson i).comp (JetComponentSpace.jetDeriv μ) + +variable {T} + +@[simp] +lemma jetDerivBoson_inclBoson (μ : Fin 1 ⊕ Fin 3) (i : T.BosonSpecies) + (x : JetComponentSpace (T.BosonValue i)) : + T.jetDerivBoson μ (T.inclBoson i x) + = T.inclBoson i (JetComponentSpace.jetDeriv μ x) := + assembleBoson_inclBoson _ i x + +/-- Mixed partials agree on the bosonic generator space, because they do on each + species. -/ +lemma jetDerivBoson_comm (μ ν : Fin 1 ⊕ Fin 3) : + (T.jetDerivBoson μ).comp (T.jetDerivBoson ν) + = (T.jetDerivBoson ν).comp (T.jetDerivBoson μ) := + bosonGenerators_hom_ext fun i x => by + rw [LinearMap.comp_apply, LinearMap.comp_apply, jetDerivBoson_inclBoson, + jetDerivBoson_inclBoson, jetDerivBoson_inclBoson, jetDerivBoson_inclBoson] + exact congrArg (T.inclBoson i) + (LinearMap.congr_fun (JetComponentSpace.jetDeriv_comm (V := T.BosonValue i) μ ν) x) + +/-- The derivative shift is a Lorentz vector on the bosonic generator space: it is one + on each species, and both operations are species-diagonal. -/ +lemma repLorentzBoson_jetDerivBoson (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) + (x : T.BosonGenerators) : + T.repLorentzBoson Λ (T.jetDerivBoson μ x) + = ∑ a, (((Lorentz.SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • + T.jetDerivBoson a (T.repLorentzBoson Λ x) := by + have key : (T.repLorentzBoson Λ).comp (T.jetDerivBoson μ) + = ∑ a, (((Lorentz.SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • + (T.jetDerivBoson a).comp (T.repLorentzBoson Λ) := + bosonGenerators_hom_ext fun i y => by + rw [LinearMap.comp_apply, jetDerivBoson_inclBoson, repLorentzBoson_inclBoson, + JetComponentSpace.repLorentzGroup_jetDeriv, map_sum, LinearMap.sum_apply] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [map_smul, LinearMap.smul_apply, LinearMap.comp_apply, + repLorentzBoson_inclBoson, jetDerivBoson_inclBoson] + rw [← LinearMap.comp_apply, key, LinearMap.sum_apply] + exact Finset.sum_congr rfl fun a _ => by rw [LinearMap.smul_apply, LinearMap.comp_apply] + +/-- The derivative carries mass weight two on the bosonic generator space, whatever the + weights of the species: the shift adds two units of mass dimension to every component + function alike. -/ +lemma massWeightScaleBoson_jetDerivBoson (c : ℂ) (μ : Fin 1 ⊕ Fin 3) : + (T.massWeightScaleBoson c).comp (T.jetDerivBoson μ) + = c ^ 2 • (T.jetDerivBoson μ).comp (T.massWeightScaleBoson c) := + bosonGenerators_hom_ext fun i x => by + rw [LinearMap.comp_apply, jetDerivBoson_inclBoson, massWeightScaleBoson_inclBoson, + LinearMap.smul_apply, LinearMap.comp_apply, massWeightScaleBoson_inclBoson, + jetDerivBoson_inclBoson, ← map_smul] + exact congrArg (T.inclBoson i) (LinearMap.congr_fun + (JetComponentSpace.massWeightScale_jetDeriv (T.boson i).massWeight c μ) x) + +variable (T) + +/-! + ## C. The bosonic generators as one component space -/ @@ -350,6 +427,29 @@ lemma bosonGeneratorsEquiv_repLorentzBoson (Λ : SL(2,ℂ)) (y : T.BosonGenerato (T.projBosonValue i) (fun _ => LinearMap.ext fun _ => rfl) Λ) x exact LinearMap.congr_fun key y +/-- The identification is equivariant for the jet gauge action. The species-diagonal + action of the jets of gauge transformations on the generator space is the action on the + component functions of the single boson field, for the same reason as in the fermionic + case: each species is a subrepresentation of the bosonic module. No common mass weight is + needed, and both halves of the component space, with every derivative label, are + covered. -/ +lemma bosonGeneratorsEquiv_repJetBoson (U : G) (y : T.BosonGenerators) : + T.bosonGeneratorsEquiv (T.repJetBoson U y) + = JetComponentSpace.repJet T.repJetBosonModule repJetBosonModule_smul U + (T.bosonGeneratorsEquiv y) := by + have key : T.bosonGeneratorsEquiv.toLinearMap.comp (T.repJetBoson U) + = (JetComponentSpace.repJet T.repJetBosonModule repJetBosonModule_smul U).comp + T.bosonGeneratorsEquiv.toLinearMap := by + refine bosonGenerators_hom_ext fun j x => ?_ + rw [LinearMap.comp_apply, LinearMap.comp_apply, LinearEquiv.coe_coe, + repJetBoson_inclBoson, bosonGeneratorsEquiv_inclBoson, + bosonGeneratorsEquiv_inclBoson] + exact LinearMap.congr_fun (JetComponentSpace.comap_comp_repJet + T.repJetBosonModule repJetBosonModule_smul (T.boson j).repJet + (T.boson j).repJet_smul (T.projBosonValue j) + (fun U' => lTensor_projBosonValue_repJetBosonModule j U') U) x + exact LinearMap.congr_fun key y + /-- **The identification carries the species-wise mass-weight scaling to a single scaling.** With one weight `w` shared by every bosonic species, the scaling that acts on each species through its own weight is the scaling of weight `w` on the component @@ -370,4 +470,22 @@ lemma bosonGeneratorsEquiv_massWeightScaleBoson (w : ℕ) (T.projBosonValue i) w c) x exact LinearMap.congr_fun key y +/-- The identification carries the derivative shift across. The species-diagonal shift + of the derivative label on the generator space is the shift on the component functions of + the single boson field: `comap` is natural in the value space, and the shift touches only + the derivative label, so neither operation sees which species a generator came from. No + common mass weight is needed. -/ +lemma bosonGeneratorsEquiv_jetDerivBoson (μ : Fin 1 ⊕ Fin 3) (y : T.BosonGenerators) : + T.bosonGeneratorsEquiv (T.jetDerivBoson μ y) + = JetComponentSpace.jetDeriv μ (T.bosonGeneratorsEquiv y) := by + have key : T.bosonGeneratorsEquiv.toLinearMap.comp (T.jetDerivBoson μ) + = (JetComponentSpace.jetDeriv μ).comp T.bosonGeneratorsEquiv.toLinearMap := by + refine bosonGenerators_hom_ext fun i x => ?_ + rw [LinearMap.comp_apply, LinearMap.comp_apply, LinearEquiv.coe_coe, + jetDerivBoson_inclBoson, bosonGeneratorsEquiv_inclBoson, + bosonGeneratorsEquiv_inclBoson] + exact LinearMap.congr_fun + (JetComponentSpace.comap_jetDeriv (T.projBosonValue i) μ) x + exact LinearMap.congr_fun key y + end GaugeFieldData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/BosonMatterField.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/BosonMatterField.lean index 346a049ba..cc9537b33 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/BosonMatterField.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/BosonMatterField.lean @@ -42,6 +42,8 @@ than the component space of this one field. - `GaugeFieldData.bosonMatterField` : the matter field of all the bosons of the theory. +- `GaugeFieldData.repJetBosonModule` : the action of the jets of gauge transformations on + the jets of the bosonic module, needing no common mass weight. - `GaugeFieldData.bosonMatterField_repLorentz_inclBosonValue`, `GaugeFieldData.bosonMatterField_repAlgebra_inclBosonValue` : each species is a subrepresentation of it. @@ -112,6 +114,34 @@ variable {T} lemma repLorentzBosonModule_apply (Λ : SL(2,ℂ)) (v : T.BosonModule) (i : T.BosonSpecies) : T.repLorentzBosonModule Λ v i = (T.boson i).repLorentz Λ (v i) := rfl +variable (T) + +/-- The action of the jets of gauge transformations on the jets of the bosonic + module, acting species by species, and typed on `T.BosonModule` itself so that it can + be spoken of without fixing a common mass weight. -/ +noncomputable def repJetBosonModule : + Representation ℂ G (JetRing ⊗[ℂ] T.BosonModule) := + MatterField.repJetPi T.boson + +variable {T} + +/-- The jet gauge action on the bosonic module is fibrewise, as each species is. -/ +lemma repJetBosonModule_smul (U : G) (χ : JetRing) (z : JetRing ⊗[ℂ] T.BosonModule) : + T.repJetBosonModule U (χ • z) = χ • T.repJetBosonModule U z := + MatterField.repJetPi_smul T.boson U χ z + +/-- A bosonic species is a subrepresentation of the jet gauge action on the bosonic + module: the projection onto its value space intertwines the two actions on the jets. -/ +lemma lTensor_projBosonValue_repJetBosonModule (j : T.BosonSpecies) (U : G) : + (LinearMap.lTensor JetRing (T.projBosonValue j)).comp (T.repJetBosonModule U) + = ((T.boson j).repJet U).comp + (LinearMap.lTensor JetRing (T.projBosonValue j)) := + MatterField.lTensor_proj_repJetPi T.boson j U + +/-- The jet gauge action of the bosonic matter field is that of the bosonic module. -/ +lemma bosonMatterField_repJet (w : ℕ) (h : ∀ i, (T.boson i).massWeight = w) : + (T.bosonMatterField w h).repJet = T.repJetBosonModule := rfl + /-- The Lorentz action of the bosonic matter field is that of the bosonic module. -/ lemma bosonMatterField_repLorentz (w : ℕ) (h : ∀ i, (T.boson i).massWeight = w) : (T.bosonMatterField w h).repLorentz = T.repLorentzBosonModule := rfl diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/FermionGenerators.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/FermionGenerators.lean index 05502ec82..ee014e6af 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/FermionGenerators.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/FermionGenerators.lean @@ -56,13 +56,17 @@ identification of a direct sum over a finite index with the product. gauge actions assembled on it. - `GaugeFieldData.massWeightScaleFermion` : the mass-weight scaling carrying the weight of each species. +- `GaugeFieldData.jetDerivFermion` : the ordinary derivative shift on the generator space. - `GaugeFieldData.fermionGeneratorsEquiv` : with one shared weight, the generator space is the component space of the fermionic matter field. - `GaugeFieldData.fermionGeneratorsEquiv_inclFermion` : a species sits inside it as the pullback along the projection onto that species. - `GaugeFieldData.fermionGeneratorsEquiv_repLorentzFermion`, - `GaugeFieldData.fermionGeneratorsEquiv_massWeightScaleFermion` : the identification - carries the Lorentz action and the mass-weight scaling across. + `GaugeFieldData.fermionGeneratorsEquiv_repJetFermion`, + `GaugeFieldData.fermionGeneratorsEquiv_massWeightScaleFermion`, + `GaugeFieldData.fermionGeneratorsEquiv_jetDerivFermion` : the identification carries the + Lorentz action, the jet gauge action, the mass-weight scaling and the derivative shift + across. ## iii. Table of contents @@ -71,6 +75,7 @@ identification of a direct sum over a finite index with the product. - B.1. The Lorentz action - B.2. The jet gauge action - B.3. The mass weights + - B.4. The ordinary derivative - C. The fermionic generators as one component space - C.1. The species as pullbacks - C.2. The identification of the transformation data @@ -265,6 +270,78 @@ variable (T) /-! +### B.4. The ordinary derivative + +The formal total derivative shifts the derivative label of a component function, +`∂_s ψ_α ↦ ∂_{s + {μ}} ψ_α`. Unlike the two actions it takes no data from the species at +all, the label being blind to the value space, so on the generator space it too is +species-diagonal and the same assembly serves. It is recorded here so that the generator +space carries every operation the local field algebra is built from. + +-/ + +/-- The ordinary derivative shift on the fermionic generator space, acting on each species' + component functions by appending `∂_μ` to the derivative label. -/ +noncomputable def jetDerivFermion (μ : Fin 1 ⊕ Fin 3) : + T.FermionGenerators →ₗ[ℂ] T.FermionGenerators := + T.assembleFermion fun i => (T.inclFermion i).comp (JetComponentSpace.jetDeriv μ) + +variable {T} + +@[simp] +lemma jetDerivFermion_inclFermion (μ : Fin 1 ⊕ Fin 3) (i : T.FermionSpecies) + (x : JetComponentSpace (T.FermionValue i)) : + T.jetDerivFermion μ (T.inclFermion i x) + = T.inclFermion i (JetComponentSpace.jetDeriv μ x) := + assembleFermion_inclFermion _ i x + +/-- Mixed partials agree on the fermionic generator space, because they do on each + species. -/ +lemma jetDerivFermion_comm (μ ν : Fin 1 ⊕ Fin 3) : + (T.jetDerivFermion μ).comp (T.jetDerivFermion ν) + = (T.jetDerivFermion ν).comp (T.jetDerivFermion μ) := + fermionGenerators_hom_ext fun i x => by + rw [LinearMap.comp_apply, LinearMap.comp_apply, jetDerivFermion_inclFermion, + jetDerivFermion_inclFermion, jetDerivFermion_inclFermion, jetDerivFermion_inclFermion] + exact congrArg (T.inclFermion i) + (LinearMap.congr_fun (JetComponentSpace.jetDeriv_comm (V := T.FermionValue i) μ ν) x) + +/-- The derivative shift is a Lorentz vector on the fermionic generator space: it is + one on each species, and both operations are species-diagonal. -/ +lemma repLorentzFermion_jetDerivFermion (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) + (x : T.FermionGenerators) : + T.repLorentzFermion Λ (T.jetDerivFermion μ x) + = ∑ a, (((Lorentz.SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • + T.jetDerivFermion a (T.repLorentzFermion Λ x) := by + have key : (T.repLorentzFermion Λ).comp (T.jetDerivFermion μ) + = ∑ a, (((Lorentz.SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • + (T.jetDerivFermion a).comp (T.repLorentzFermion Λ) := + fermionGenerators_hom_ext fun i y => by + rw [LinearMap.comp_apply, jetDerivFermion_inclFermion, repLorentzFermion_inclFermion, + JetComponentSpace.repLorentzGroup_jetDeriv, map_sum, LinearMap.sum_apply] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [map_smul, LinearMap.smul_apply, LinearMap.comp_apply, + repLorentzFermion_inclFermion, jetDerivFermion_inclFermion] + rw [← LinearMap.comp_apply, key, LinearMap.sum_apply] + exact Finset.sum_congr rfl fun a _ => by rw [LinearMap.smul_apply, LinearMap.comp_apply] + +/-- The derivative carries mass weight two on the fermionic generator space, whatever + the weights of the species: the shift adds two units of mass dimension to every + component function alike. -/ +lemma massWeightScaleFermion_jetDerivFermion (c : ℂ) (μ : Fin 1 ⊕ Fin 3) : + (T.massWeightScaleFermion c).comp (T.jetDerivFermion μ) + = c ^ 2 • (T.jetDerivFermion μ).comp (T.massWeightScaleFermion c) := + fermionGenerators_hom_ext fun i x => by + rw [LinearMap.comp_apply, jetDerivFermion_inclFermion, + massWeightScaleFermion_inclFermion, LinearMap.smul_apply, LinearMap.comp_apply, + massWeightScaleFermion_inclFermion, jetDerivFermion_inclFermion, ← map_smul] + exact congrArg (T.inclFermion i) (LinearMap.congr_fun + (JetComponentSpace.massWeightScale_jetDeriv (T.fermion i).massWeight c μ) x) + +variable (T) + +/-! + ## C. The fermionic generators as one component space -/ @@ -347,6 +424,34 @@ lemma fermionGeneratorsEquiv_repLorentzFermion (Λ : SL(2,ℂ)) (y : T.FermionGe (T.projFermionValue i) (fun _ => LinearMap.ext fun _ => rfl) Λ) x exact LinearMap.congr_fun key y +/-- The identification is equivariant for the jet gauge action. The species-diagonal + action of the jets of gauge transformations on the generator space is the action on the + component functions of the single fermion field: each species is a subrepresentation of + the fermionic module, so pulling back along the projection onto it commutes with the two + actions. + + No common mass weight is needed. The gauge action of the assembled field is + `repJetFermionModule`, which exists whatever the weights are; only its packaging as one + `MatterField` would require them to agree. Both halves of the component space are + covered, the conjugate one included, and every derivative label with them: this is + `JetComponentSpace.comap_comp_repJet` at the species projection. -/ +lemma fermionGeneratorsEquiv_repJetFermion (U : G) (y : T.FermionGenerators) : + T.fermionGeneratorsEquiv (T.repJetFermion U y) + = JetComponentSpace.repJet T.repJetFermionModule repJetFermionModule_smul U + (T.fermionGeneratorsEquiv y) := by + have key : T.fermionGeneratorsEquiv.toLinearMap.comp (T.repJetFermion U) + = (JetComponentSpace.repJet T.repJetFermionModule repJetFermionModule_smul U).comp + T.fermionGeneratorsEquiv.toLinearMap := by + refine fermionGenerators_hom_ext fun i x => ?_ + rw [LinearMap.comp_apply, LinearMap.comp_apply, LinearEquiv.coe_coe, + repJetFermion_inclFermion, fermionGeneratorsEquiv_inclFermion, + fermionGeneratorsEquiv_inclFermion] + exact LinearMap.congr_fun (JetComponentSpace.comap_comp_repJet + T.repJetFermionModule repJetFermionModule_smul (T.fermion i).repJet + (T.fermion i).repJet_smul (T.projFermionValue i) + (fun U' => lTensor_projFermionValue_repJetFermionModule i U') U) x + exact LinearMap.congr_fun key y + /-- **The identification carries the species-wise mass-weight scaling to a single scaling.** With one weight `w` shared by every fermionic species, the scaling that acts on each species through its own weight is the scaling of weight `w` on the component @@ -367,4 +472,22 @@ lemma fermionGeneratorsEquiv_massWeightScaleFermion (w : ℕ) (T.projFermionValue i) w c) x exact LinearMap.congr_fun key y +/-- The identification carries the derivative shift across. The species-diagonal shift + of the derivative label on the generator space is the shift on the component functions of + the single fermion field: `comap` is natural in the value space, and the shift touches + only the derivative label, so neither operation sees which species a generator came from. + No common mass weight is needed. -/ +lemma fermionGeneratorsEquiv_jetDerivFermion (μ : Fin 1 ⊕ Fin 3) (y : T.FermionGenerators) : + T.fermionGeneratorsEquiv (T.jetDerivFermion μ y) + = JetComponentSpace.jetDeriv μ (T.fermionGeneratorsEquiv y) := by + have key : T.fermionGeneratorsEquiv.toLinearMap.comp (T.jetDerivFermion μ) + = (JetComponentSpace.jetDeriv μ).comp T.fermionGeneratorsEquiv.toLinearMap := by + refine fermionGenerators_hom_ext fun i x => ?_ + rw [LinearMap.comp_apply, LinearMap.comp_apply, LinearEquiv.coe_coe, + jetDerivFermion_inclFermion, fermionGeneratorsEquiv_inclFermion, + fermionGeneratorsEquiv_inclFermion] + exact LinearMap.congr_fun + (JetComponentSpace.comap_jetDeriv (T.projFermionValue i) μ) x + exact LinearMap.congr_fun key y + end GaugeFieldData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/FermionMatterField.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/FermionMatterField.lean index 073d150c6..632bbcda4 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/FermionMatterField.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/FermionMatterField.lean @@ -38,6 +38,8 @@ than the component space of this one field. - `GaugeFieldData.fermionMatterField` : the matter field of all the fermions of the theory. +- `GaugeFieldData.repJetFermionModule` : the action of the jets of gauge transformations + on the jets of the fermionic module, needing no common mass weight. - `GaugeFieldData.fermionMatterField_repLorentz_inclFermionValue`, `GaugeFieldData.fermionMatterField_repAlgebra_inclFermionValue` : each species is a subrepresentation of it. @@ -108,6 +110,36 @@ variable {T} lemma repLorentzFermionModule_apply (Λ : SL(2,ℂ)) (v : T.FermionModule) (i : T.FermionSpecies) : T.repLorentzFermionModule Λ v i = (T.fermion i).repLorentz Λ (v i) := rfl +variable (T) + +/-- The action of the jets of gauge transformations on the jets of the fermionic + module, acting species by species. Like `repLorentzFermionModule` it is typed on + `T.FermionModule` itself, so that it can be spoken of without fixing a common mass + weight; the gauge action of a theory whose fermions carry different mass dimensions is + perfectly well defined, only its packaging as one `MatterField` is not. -/ +noncomputable def repJetFermionModule : + Representation ℂ G (JetRing ⊗[ℂ] T.FermionModule) := + MatterField.repJetPi T.fermion + +variable {T} + +/-- The jet gauge action on the fermionic module is fibrewise, as each species is. -/ +lemma repJetFermionModule_smul (U : G) (χ : JetRing) (z : JetRing ⊗[ℂ] T.FermionModule) : + T.repJetFermionModule U (χ • z) = χ • T.repJetFermionModule U z := + MatterField.repJetPi_smul T.fermion U χ z + +/-- A fermionic species is a subrepresentation of the jet gauge action on the fermionic + module: the projection onto its value space intertwines the two actions on the jets. -/ +lemma lTensor_projFermionValue_repJetFermionModule (i : T.FermionSpecies) (U : G) : + (LinearMap.lTensor JetRing (T.projFermionValue i)).comp (T.repJetFermionModule U) + = ((T.fermion i).repJet U).comp + (LinearMap.lTensor JetRing (T.projFermionValue i)) := + MatterField.lTensor_proj_repJetPi T.fermion i U + +/-- The jet gauge action of the fermionic matter field is that of the fermionic module. -/ +lemma fermionMatterField_repJet (w : ℕ) (h : ∀ i, (T.fermion i).massWeight = w) : + (T.fermionMatterField w h).repJet = T.repJetFermionModule := rfl + /-- The Lorentz action of the fermionic matter field is that of the fermionic module. -/ lemma fermionMatterField_repLorentz (w : ℕ) (h : ∀ i, (T.fermion i).massWeight = w) : (T.fermionMatterField w h).repLorentz = T.repLorentzFermionModule := rfl diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Basic.lean index d82819135..29f86f0b9 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Basic.lean @@ -148,6 +148,46 @@ noncomputable def includeConnection : T.LocalFieldAlgebra := Algebra.TensorProduct.includeRight +/-- The matter factor of the local field algebra, on which the two matter inclusions + land. -/ +abbrev MatterAlgebra : Type := + ExteriorAlgebra ℂ T.FermionGenerators ⊗[ℂ] SymmetricAlgebra ℂ T.BosonGenerators + +variable {T} + +/-- The unit of the matter factor is the tensor of the two units. It is recorded here, at + an abstract datum, because unfolding it at a concrete one has to see through the + symmetric algebra's ring congruence, which is not exposed, and is prohibitively slow. -/ +lemma one_matterAlgebra : + (1 : T.MatterAlgebra) + = (1 : ExteriorAlgebra ℂ T.FermionGenerators) ⊗ₜ[ℂ] + (1 : SymmetricAlgebra ℂ T.BosonGenerators) := + Algebra.TensorProduct.one_def + +/-- The fermionic inclusion, written out as a pure tensor with units in the other two + factors. Recorded at an abstract datum for the same reason. -/ +lemma includeFermion_apply (a : ExteriorAlgebra ℂ T.FermionGenerators) : + T.includeFermion a + = ((a ⊗ₜ[ℂ] (1 : SymmetricAlgebra ℂ T.BosonGenerators)) + ⊗ₜ[ℂ] (1 : ℂ ⊗[ℝ] SymmetricAlgebra ℝ (GaugeBoson.JetComponentSpace 𝔤)) + : T.LocalFieldAlgebra) := rfl + +/-- The bosonic inclusion, written out as a pure tensor. -/ +lemma includeBoson_apply (b : SymmetricAlgebra ℂ T.BosonGenerators) : + T.includeBoson b + = (((1 : ExteriorAlgebra ℂ T.FermionGenerators) ⊗ₜ[ℂ] b) + ⊗ₜ[ℂ] (1 : ℂ ⊗[ℝ] SymmetricAlgebra ℝ (GaugeBoson.JetComponentSpace 𝔤)) + : T.LocalFieldAlgebra) := rfl + +/-- The connection inclusion, written out as a pure tensor. -/ +lemma includeConnection_apply + (c : ℂ ⊗[ℝ] SymmetricAlgebra ℝ (GaugeBoson.JetComponentSpace 𝔤)) : + T.includeConnection c + = ((1 : T.MatterAlgebra) ⊗ₜ[ℂ] c : T.LocalFieldAlgebra) := + Algebra.TensorProduct.includeRight_apply c + +variable (T) + /-- All the fermionic generators of the datum at once, the whole fermionic generator space inside the algebra. Fermi statistics is a condition on this map, not on the species maps separately. -/ diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Jet.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Jet.lean index 79e133c28..ef35fd6d9 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Jet.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Jet.lean @@ -264,4 +264,27 @@ lemma jetEval_pi (z : JetRing ⊗[ℂ] (∀ i, E i)) (i : ι) : | tmul f p => rfl | add a b ha hb => simp only [map_add, Pi.add_apply, ha, hb] +/-- The component of the splitting is the projection on the value factor. Reading off + the summand `i` of a jet of a `(∀ i, E i)`-valued field is applying the projection onto + that summand to the value factor, the jet-ring factor being untouched. This is the form + in which the splitting meets the naturality statements, which are all phrased in terms of + linear maps of value spaces. -/ +lemma jetPiEquiv_eq_lTensor_proj (z : JetRing ⊗[ℂ] (∀ i, E i)) (i : ι) : + jetPiEquiv E z i = LinearMap.lTensor JetRing (LinearMap.proj i) z := by + induction z using TensorProduct.induction_on with + | zero => simp + | tmul f p => rfl + | add a b ha hb => simp only [map_add, Pi.add_apply, ha, hb] + +/-- Two maps into the jets of a product agree as soon as their species components do. + The splitting is an equivalence, so a jet of a `(∀ i, E i)`-valued field is determined by + its summands. -/ +lemma jetPi_hom_ext {N : Type} [AddCommGroup N] [Module ℂ N] + {A B : N →ₗ[ℂ] JetRing ⊗[ℂ] (∀ i, E i)} + (h : ∀ i, (LinearMap.lTensor JetRing (LinearMap.proj i)).comp A + = (LinearMap.lTensor JetRing (LinearMap.proj i)).comp B) : A = B := by + refine LinearMap.ext fun n => (jetPiEquiv E).injective (funext fun i => ?_) + rw [jetPiEquiv_eq_lTensor_proj, jetPiEquiv_eq_lTensor_proj] + exact LinearMap.congr_fun (h i) n + end Pi diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/JetRep.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/JetRep.lean index cecb523b8..5df40d611 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/JetRep.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/JetRep.lean @@ -25,7 +25,9 @@ collects what follows from fibrewise-linearity alone, before any component space * a fibrewise action is determined by its values on constant jets, and for finite-dimensional `V` that restriction is a matrix of power series, its *coefficient* `jetCoeff` in `JetRing ⊗ End V`, which is multiplicative; -* the conjugate action `repConj` on the jets of the conjugate field, again fibrewise. +* the conjugate action `repConj` on the jets of the conjugate field, again fibrewise; +* the naturality of both in the value space: a linear map of value spaces intertwining two + fibrewise actions intertwines their coefficients, and their conjugate actions. These are the ingredients from which the action on the jet component space is assembled in `Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.GaugeAction`; they @@ -38,6 +40,8 @@ live here, upstream of `MatterField`, because the infinitesimal-action theory th - `JetComponentSpace.coeff_mul_of_smul_comm` : the coefficient is multiplicative. - `JetComponentSpace.repConj`, `repConj_smul_comm` : the action on the jets of the conjugate field. +- `JetComponentSpace.jetCoeff_naturality` : the coefficient is natural in the value space. +- `JetComponentSpace.lTensor_comp_repConj` : so is the conjugate action. -/ @@ -50,6 +54,7 @@ namespace JetComponentSpace open Matrix MatrixGroups TensorProduct variable {V : Type _} [AddCommGroup V] [Module ℂ V] +variable {W : Type _} [AddCommGroup W] [Module ℂ W] variable {G : Type*} [Group G] /-- **A fibrewise action is determined by its values on constant jets.** If the gauge @@ -179,16 +184,18 @@ lemma symbolAction_mul 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. -/ +canonical `JetRing ⊗ (V →ₗ W) → (V →ₗ JetRing ⊗ W)` is inverted by reassociating the +contraction `Dual V ⊗ (JetRing ⊗ W) ≃ JetRing ⊗ (Dual V ⊗ W) ≃ JetRing ⊗ (V →ₗ W)`. This +is the finite-rank input, obtained from `dualTensorHomEquiv` rather than from a basis. Only +the source `V` has to be finite-dimensional; the target is arbitrary, which is what lets +the naturality statements below compare two different value spaces. -/ 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 + (G : Module.Dual ℂ V ⊗[ℂ] (JetRing ⊗[ℂ] W)) (v : V) : + TensorProduct.lift ((LinearMap.llcomp ℂ V W (JetRing ⊗[ℂ] W)).comp + (TensorProduct.mk ℂ JetRing W)) + ((TensorProduct.congr (LinearEquiv.refl ℂ JetRing) (dualTensorHomEquiv ℂ V W)) + (TensorProduct.leftComm ℂ (Module.Dual ℂ V) JetRing W G)) v + = dualTensorHom ℂ V (JetRing ⊗[ℂ] W) G v := by induction G using TensorProduct.induction_on with | zero => simp | tmul phi z => @@ -197,9 +204,9 @@ lemma lift_congr_leftComm [Module.Free ℂ V] [Module.Finite ℂ V] | 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, + show g ⊗ₜ[ℂ] (dualTensorHomEquiv ℂ V W (phi ⊗ₜ[ℂ] w)) v = _ + rw [show dualTensorHomEquiv ℂ V W (phi ⊗ₜ[ℂ] w) + = dualTensorHom ℂ V W (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, @@ -263,6 +270,28 @@ lemma tensorEquiv_congr_conjEquiv_smul (χ : JetRing) (y : JetRing ⊗[ℂ] V) : | 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 the original one, read through the identification. On +a jet carried over to the conjugate side, `repConj rep U` is `rep U` applied on the +original side and carried over again. Everything about `repConj` beyond its definition +follows from this. -/ +lemma repConj_apply_conjEquiv (rep : Representation ℂ G (JetRing ⊗[ℂ] V)) (U : G) + (y : 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) y)) + = ((ConjModule.tensorEquiv (k := ℂ) (M := JetRing) (N := V)).symm.trans + (TensorProduct.congr JetRing.starConjEquiv (LinearEquiv.refl ℂ (ConjModule V)))) + (conjEquiv (k := ℂ) (M := JetRing ⊗[ℂ] V) (rep U y)) := by + 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) y)))) = _ + rw [LinearEquiv.symm_apply_apply, Representation.conj_apply, + LinearEquiv.symm_apply_apply] + /-- **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. -/ @@ -272,23 +301,49 @@ lemma repConj_smul_comm 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 + 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) w)))) = _ - rw [LinearEquiv.symm_apply_apply, Representation.conj_apply, - LinearEquiv.symm_apply_apply] + (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, repConj_apply_conjEquiv, + repConj_apply_conjEquiv, hlin, tensorEquiv_congr_conjEquiv_smul] + +/-- The identification of the conjugate of the jets with the jets of the conjugate is +natural in the value space. A linear map of value spaces acts on either side by the same +underlying map, so carrying a jet over to the conjugate side commutes with it. -/ +lemma lTensor_conjEquiv_naturality (f : V →ₗ[ℂ] W) (y : JetRing ⊗[ℂ] V) : + (LinearMap.lTensor JetRing (ConjModule.map (k := ℂ) f)) + (((ConjModule.tensorEquiv (k := ℂ) (M := JetRing) (N := V)).symm.trans + (TensorProduct.congr JetRing.starConjEquiv (LinearEquiv.refl ℂ (ConjModule V)))) + (conjEquiv (k := ℂ) (M := JetRing ⊗[ℂ] V) y)) + = ((ConjModule.tensorEquiv (k := ℂ) (M := JetRing) (N := W)).symm.trans + (TensorProduct.congr JetRing.starConjEquiv (LinearEquiv.refl ℂ (ConjModule W)))) + (conjEquiv (k := ℂ) (M := JetRing ⊗[ℂ] W) ((LinearMap.lTensor JetRing f) y)) := by + induction y using TensorProduct.induction_on with + | zero => simp + | tmul g v => + simp only [LinearEquiv.trans_apply, ConjModule.tensorEquiv_symm_conjEquiv_tmul, + TensorProduct.congr_tmul, LinearEquiv.refl_apply, JetRing.starConjEquiv_apply, + LinearEquiv.symm_apply_apply, LinearMap.lTensor_tmul] + rfl + | add a b ha hb => simp only [map_add, ha, hb] + +/-- The conjugate jet action is natural in the value space. A linear map of value +spaces intertwining two fibrewise jet actions intertwines the actions on the jets of the +conjugate fields, through the induced map of conjugate modules. This is what supplies the +conjugate half of the naturality of the gauge action on the jet component space, which +does not follow from the unconjugated half. -/ +lemma lTensor_comp_repConj (repV : Representation ℂ G (JetRing ⊗[ℂ] V)) + (repW : Representation ℂ G (JetRing ⊗[ℂ] W)) (f : V →ₗ[ℂ] W) + (hf : ∀ U : G, (LinearMap.lTensor JetRing f).comp (repV U) + = (repW U).comp (LinearMap.lTensor JetRing f)) (U : G) : + (LinearMap.lTensor JetRing (ConjModule.map (k := ℂ) f)).comp (repConj repV U) + = (repConj repW U).comp (LinearMap.lTensor JetRing (ConjModule.map (k := ℂ) f)) := by + refine LinearMap.ext fun z => ?_ obtain ⟨y, rfl⟩ : ∃ y : JetRing ⊗[ℂ] V, z = ((ConjModule.tensorEquiv (k := ℂ) (M := JetRing) (N := V)).symm.trans (TensorProduct.congr JetRing.starConjEquiv (LinearEquiv.refl ℂ (ConjModule V)))) @@ -297,27 +352,30 @@ lemma repConj_smul_comm (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] + rw [LinearMap.comp_apply, LinearMap.comp_apply, repConj_apply_conjEquiv, + lTensor_conjEquiv_naturality, lTensor_conjEquiv_naturality, repConj_apply_conjEquiv, + ← LinearMap.comp_apply, hf U, LinearMap.comp_apply] /-- **The coefficient is determined by its action on constants.** For finite-dimensional -`V` the canonical evaluation `JetRing ⊗ End V → (V →ₗ JetRing ⊗ V)` is injective. -/ +`V` the canonical evaluation `JetRing ⊗ (V →ₗ W) → (V →ₗ JetRing ⊗ W)` 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 + {x y : JetRing ⊗[ℂ] (V →ₗ[ℂ] W)} + (h : ∀ v : V, TensorProduct.lift ((LinearMap.llcomp ℂ V W (JetRing ⊗[ℂ] W)).comp + (TensorProduct.mk ℂ JetRing W)) x v = TensorProduct.lift ((LinearMap.llcomp ℂ V W + (JetRing ⊗[ℂ] W)).comp + (TensorProduct.mk ℂ JetRing W)) y v) : x = y := by + obtain ⟨G, rfl⟩ := ((TensorProduct.leftComm ℂ (Module.Dual ℂ V) JetRing W).trans + (TensorProduct.congr (LinearEquiv.refl ℂ JetRing) + (dualTensorHomEquiv ℂ V W))).surjective x + obtain ⟨G', rfl⟩ := ((TensorProduct.leftComm ℂ (Module.Dual ℂ V) JetRing W).trans + (TensorProduct.congr (LinearEquiv.refl ℂ JetRing) + (dualTensorHomEquiv ℂ V W))).surjective y + refine congrArg _ ((dualTensorHomEquiv ℂ V (JetRing ⊗[ℂ] W)).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, + rw [show (dualTensorHomEquiv ℂ V (JetRing ⊗[ℂ] W)) G + = dualTensorHom ℂ V (JetRing ⊗[ℂ] W) G from rfl, + show (dualTensorHomEquiv ℂ V (JetRing ⊗[ℂ] W)) G' + = dualTensorHom ℂ V (JetRing ⊗[ℂ] W) G' from rfl, ← lift_congr_leftComm, ← lift_congr_leftComm] exact h v @@ -343,4 +401,61 @@ lemma jetCoeff_spec [Module.Free ℂ V] [Module.Finite ℂ V] (dualTensorHomEquiv ℂ V (JetRing ⊗[ℂ] V)).apply_symm_apply _] rfl +/-! + +## Naturality of the coefficient in the value space + +A linear map `f : V →ₗ W` of value spaces intertwining two fibrewise jet actions relates +their coefficients, but not as an equation between elements of two different modules: the +comparison takes place in `JetRing ⊗ (V →ₗ W)`, into which `JetRing ⊗ End V` maps by +postcomposition with `f` and `JetRing ⊗ End W` by precomposition. The two images agree, +and that single identity is what carries the gauge action across a map of value spaces. + +-/ + +/-- Postcomposing a coefficient with `f` evaluates as applying `f` to the value. -/ +lemma lift_lTensor_llcomp (f : V →ₗ[ℂ] W) (x : JetRing ⊗[ℂ] Module.End ℂ V) (v : V) : + TensorProduct.lift ((LinearMap.llcomp ℂ V W (JetRing ⊗[ℂ] W)).comp + (TensorProduct.mk ℂ JetRing W)) + (LinearMap.lTensor JetRing (LinearMap.llcomp ℂ V V W f) x) v + = LinearMap.lTensor JetRing f + (TensorProduct.lift ((LinearMap.llcomp ℂ V V (JetRing ⊗[ℂ] V)).comp + (TensorProduct.mk ℂ JetRing V)) x v) := by + induction x using TensorProduct.induction_on with + | zero => simp + | tmul g S => rfl + | add a b ha hb => simp only [map_add, LinearMap.add_apply, ha, hb] + +/-- Precomposing a coefficient with `f` evaluates as evaluating at the image of the + argument. -/ +lemma lift_lTensor_lcomp (f : V →ₗ[ℂ] W) (y : JetRing ⊗[ℂ] Module.End ℂ W) (v : V) : + TensorProduct.lift ((LinearMap.llcomp ℂ V W (JetRing ⊗[ℂ] W)).comp + (TensorProduct.mk ℂ JetRing W)) + (LinearMap.lTensor JetRing (LinearMap.lcomp ℂ W f) y) v + = TensorProduct.lift ((LinearMap.llcomp ℂ W W (JetRing ⊗[ℂ] W)).comp + (TensorProduct.mk ℂ JetRing W)) y (f v) := by + induction y using TensorProduct.induction_on with + | zero => simp + | tmul g T => rfl + | add a b ha hb => simp only [map_add, LinearMap.add_apply, ha, hb] + +/-- The coefficient of a fibrewise action is natural in the value space. If `f` maps +the values of one field to the values of another and intertwines their jet actions, then +the coefficient of the first followed by `f` is `f` followed by the coefficient of the +second, as elements of `JetRing ⊗ (V →ₗ W)`. Both value spaces have to be +finite-dimensional, since both coefficients have to exist; no fibrewise-linearity is used +here, the coefficient being defined for any action. -/ +lemma jetCoeff_naturality [Module.Free ℂ V] [Module.Finite ℂ V] + [Module.Free ℂ W] [Module.Finite ℂ W] + (repV : Representation ℂ G (JetRing ⊗[ℂ] V)) + (repW : Representation ℂ G (JetRing ⊗[ℂ] W)) (f : V →ₗ[ℂ] W) + (hf : ∀ U : G, (LinearMap.lTensor JetRing f).comp (repV U) + = (repW U).comp (LinearMap.lTensor JetRing f)) (U : G) : + LinearMap.lTensor JetRing (LinearMap.llcomp ℂ V V W f) (jetCoeff repV U) + = LinearMap.lTensor JetRing (LinearMap.lcomp ℂ W f) (jetCoeff repW U) := by + refine lift_injective fun v => ?_ + rw [lift_lTensor_llcomp, lift_lTensor_lcomp, jetCoeff_spec, jetCoeff_spec, + ← LinearMap.comp_apply, hf U] + rfl + end JetComponentSpace diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/Basic.lean index 367cbc958..58714bb40 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/Basic.lean @@ -34,6 +34,8 @@ is in `Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.Ga - `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.comapEquiv` : a relabelling of the target space relabels the + component functions. - `JetComponentSpace.massWeightScale` : the mass-weight scaling. - `JetComponentSpace.comap_comp_massWeightScale` : the scaling is natural in the target space, hence blind to which part of it a component function came from. @@ -290,6 +292,26 @@ lemma JetComponentSpace.comap_comp {U : Type _} [AddCommGroup U] [Module ℂ U] LinearMap.id_comp] rfl +/-- A relabelling of the target space relabels the component functions. An isomorphism + `e : V ≃ₗ W` of target spaces identifies the two component spaces, contravariantly: the + component functions of a `W`-valued field become those of a `V`-valued field. This is + `comap` upgraded to an equivalence, the two directions being mutually inverse by + functoriality. -/ +noncomputable def JetComponentSpace.comapEquiv (e : V ≃ₗ[ℂ] W) : + JetComponentSpace W ≃ₗ[ℂ] JetComponentSpace V := + LinearEquiv.ofLinearMap (JetComponentSpace.comap e.toLinearMap) + (JetComponentSpace.comap e.symm.toLinearMap) + (by rw [← JetComponentSpace.comap_comp, show e.symm.toLinearMap.comp e.toLinearMap + = LinearMap.id from LinearMap.ext fun v => e.symm_apply_apply v, + JetComponentSpace.comap_id]) + (by rw [← JetComponentSpace.comap_comp, show e.toLinearMap.comp e.symm.toLinearMap + = LinearMap.id from LinearMap.ext fun w => e.apply_symm_apply w, + JetComponentSpace.comap_id]) + +@[simp] +lemma JetComponentSpace.comapEquiv_apply (e : V ≃ₗ[ℂ] W) (x : JetComponentSpace W) : + JetComponentSpace.comapEquiv e x = JetComponentSpace.comap e.toLinearMap x := rfl + /-- **An equivariant map of target spaces gives an equivariant pullback.** If `f : V →ₗ W` intertwines two Lorentz representations then `comap f` intertwines the induced actions on the component spaces, in the opposite direction. Component functions are covectors, so diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/GaugeAction.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/GaugeAction.lean index 3ba7df26e..564ee7d09 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/GaugeAction.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/GaugeAction.lean @@ -37,6 +37,8 @@ The construction needs two hypotheses on the jet action `rep`: - `JetComponentSpace.repConj`, `repConj_smul_comm` : the action on the jets of the conjugate field. - `JetComponentSpace.repJet` : the action on the full component space. +- `JetComponentSpace.comap_comp_repDual`, `JetComponentSpace.comap_comp_repJet` : both are + natural in the value space. -/ @@ -47,15 +49,22 @@ namespace JetComponentSpace open Matrix MatrixGroups TensorProduct variable {V : Type _} [AddCommGroup V] [Module ℂ V] +variable {W : Type _} [AddCommGroup W] [Module ℂ W] variable {G : Type*} [Group G] /-- **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. -/ +the target index. + +A coefficient is allowed to change the value space, so that the symbol action of an +endomorphism and the pullback along a map of value spaces are the same construction; at +`W = V` this is the action on `Module.End ℂ (DerivAlgebraComplex ⊗ Module.Dual ℂ V)` that +`repDual` uses. -/ noncomputable def symbolAction : - (JetRing ⊗[ℂ] Module.End ℂ V) →ₗ[ℂ] - Module.End ℂ (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ V) := + (JetRing ⊗[ℂ] (V →ₗ[ℂ] W)) →ₗ[ℂ] + ((DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ W) →ₗ[ℂ] + (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ V)) := TensorProduct.lift { toFun := fun g => { toFun := fun T => TensorProduct.map (DerivAlgebraComplex.jetRingAction g) @@ -80,7 +89,7 @@ noncomputable def symbolAction : rfl } @[simp] -lemma symbolAction_tmul (g : JetRing) (T : Module.End ℂ V) : +lemma symbolAction_tmul (g : JetRing) (T : V →ₗ[ℂ] W) : symbolAction (g ⊗ₜ[ℂ] T) = TensorProduct.map (DerivAlgebraComplex.jetRingAction g) (Module.Dual.transpose T) := rfl @@ -194,4 +203,110 @@ lemma repJet_snd [Module.Free ℂ V] [Module.Finite ℂ V] (repJet rep hlin U x).2 = repDual (repConj rep) (repConj_smul_comm hlin) U x.2 := rfl +/-! + +## Naturality in the value space + +A component function is a covector on the value space, so a linear map `f : V →ₗ W` of +value spaces pulls the symbols of a `W`-valued field back to those of a `V`-valued field. +If `f` intertwines two fibrewise jet actions then that pullback is equivariant, in the +opposite direction: this is the gauge counterpart of +`JetComponentSpace.comap_comp_repLorentzGroup`, and unlike it, it needs the value spaces to +be finite-dimensional, because the gauge action is defined through the coefficient. + +Both halves have to be proved. The unconjugated half is the naturality of `repDual` at +`f`; the conjugate half is the naturality of `repDual` at `ConjModule.map f`, for the +conjugate actions, and is supplied by `JetComponentSpace.lTensor_comp_repConj`. A conjugate +symbol carries `star` of the gauge matrix, so nothing about it follows from the +unconjugated half. + +-/ + +/-- Pulling back and then acting is acting and then pulling back, on the symbols of a +coefficient. Precomposing the symbol action of a coefficient of `W` with the pullback +along `f` is the symbol action of the coefficient precomposed with `f`. -/ +lemma map_transpose_comp_symbolAction (f : V →ₗ[ℂ] W) (y : JetRing ⊗[ℂ] Module.End ℂ W) : + (TensorProduct.map LinearMap.id (Module.Dual.transpose f)).comp (symbolAction y) + = symbolAction (LinearMap.lTensor JetRing (LinearMap.lcomp ℂ W f) y) := by + induction y using TensorProduct.induction_on with + | zero => rw [map_zero, map_zero, map_zero, LinearMap.comp_zero] + | add a b ha hb => rw [map_add, LinearMap.comp_add, ha, hb, map_add, map_add] + | tmul g T => + rw [symbolAction_tmul, ← TensorProduct.map_comp, LinearMap.id_comp, + ← Module.Dual.transpose_comp, LinearMap.lTensor_tmul, symbolAction_tmul] + rfl + +/-- The companion of `map_transpose_comp_symbolAction` on the other side: postcomposing + the symbol action of a coefficient of `V` with the pullback along `f` is the symbol + action of the coefficient postcomposed with `f`. -/ +lemma symbolAction_comp_map_transpose (f : V →ₗ[ℂ] W) (x : JetRing ⊗[ℂ] Module.End ℂ V) : + (symbolAction x).comp (TensorProduct.map LinearMap.id (Module.Dual.transpose f)) + = symbolAction (LinearMap.lTensor JetRing (LinearMap.llcomp ℂ V V W f) x) := by + induction x using TensorProduct.induction_on with + | zero => rw [map_zero, map_zero, map_zero, LinearMap.zero_comp] + | add a b ha hb => rw [map_add, LinearMap.add_comp, ha, hb, map_add, map_add] + | tmul g S => + rw [symbolAction_tmul, ← TensorProduct.map_comp, LinearMap.comp_id, + ← Module.Dual.transpose_comp, LinearMap.lTensor_tmul, symbolAction_tmul] + rfl + +/-- The gauge action on the unconjugated symbols is natural in the value space. A +linear map of value spaces intertwining two fibrewise jet actions makes the pullback of +symbols equivariant for the two contragredient actions. The whole content is the naturality +of the coefficient, `JetComponentSpace.jetCoeff_naturality`, read through the symbol +action; the group element is inverted on both sides alike, so no convention is disturbed +by it. -/ +lemma comap_comp_repDual [Module.Free ℂ V] [Module.Finite ℂ V] + [Module.Free ℂ W] [Module.Finite ℂ W] + (repV : Representation ℂ G (JetRing ⊗[ℂ] V)) + (hV : ∀ (U : G) (χ : JetRing) (z : JetRing ⊗[ℂ] V), repV U (χ • z) = χ • repV U z) + (repW : Representation ℂ G (JetRing ⊗[ℂ] W)) + (hW : ∀ (U : G) (χ : JetRing) (z : JetRing ⊗[ℂ] W), repW U (χ • z) = χ • repW U z) + (f : V →ₗ[ℂ] W) + (hf : ∀ U : G, (LinearMap.lTensor JetRing f).comp (repV U) + = (repW U).comp (LinearMap.lTensor JetRing f)) (U : G) : + (TensorProduct.map LinearMap.id (Module.Dual.transpose f)).comp (repDual repW hW U) + = (repDual repV hV U).comp + (TensorProduct.map LinearMap.id (Module.Dual.transpose f)) := by + rw [show repDual repW hW U = symbolAction (jetCoeff repW U⁻¹) from rfl, + show repDual repV hV U = symbolAction (jetCoeff repV U⁻¹) from rfl, + map_transpose_comp_symbolAction, symbolAction_comp_map_transpose, + jetCoeff_naturality repV repW f hf U⁻¹] + +/-- The gauge action on the jet component space is natural in the value space. If +`f : V →ₗ W` intertwines two fibrewise actions on the jets, then the pullback of component +functions along `f` intertwines the induced actions on the component spaces, in the +opposite direction — the pullback of a component function of a `W`-valued field being a +component function of a `V`-valued field. + +Both halves are covered and every derivative label is carried: the statement is an equality +of linear maps on the whole component space, not a statement about undifferentiated +symbols. The conjugate half is the unconjugated argument applied to `repConj repV` and +`repConj repW`, whose intertwining is `JetComponentSpace.lTensor_comp_repConj`. -/ +lemma comap_comp_repJet [Module.Free ℂ V] [Module.Finite ℂ V] + [Module.Free ℂ W] [Module.Finite ℂ W] + (repV : Representation ℂ G (JetRing ⊗[ℂ] V)) + (hV : ∀ (U : G) (χ : JetRing) (z : JetRing ⊗[ℂ] V), repV U (χ • z) = χ • repV U z) + (repW : Representation ℂ G (JetRing ⊗[ℂ] W)) + (hW : ∀ (U : G) (χ : JetRing) (z : JetRing ⊗[ℂ] W), repW U (χ • z) = χ • repW U z) + (f : V →ₗ[ℂ] W) + (hf : ∀ U : G, (LinearMap.lTensor JetRing f).comp (repV U) + = (repW U).comp (LinearMap.lTensor JetRing f)) (U : G) : + (comap f).comp (repJet repW hW U) = (repJet repV hV U).comp (comap f) := by + show (LinearMap.prodMap (TensorProduct.map LinearMap.id (Module.Dual.transpose f)) + (TensorProduct.map LinearMap.id + (Module.Dual.transpose (ConjModule.map (k := ℂ) f)))).comp + (LinearMap.prodMap (repDual repW hW U) + (repDual (repConj repW) (repConj_smul_comm hW) U)) + = (LinearMap.prodMap (repDual repV hV U) + (repDual (repConj repV) (repConj_smul_comm hV) U)).comp + (LinearMap.prodMap (TensorProduct.map LinearMap.id (Module.Dual.transpose f)) + (TensorProduct.map LinearMap.id + (Module.Dual.transpose (ConjModule.map (k := ℂ) f)))) + rw [LinearMap.prodMap_comp, LinearMap.prodMap_comp, + comap_comp_repDual repV hV repW hW f hf U, + comap_comp_repDual (repConj repV) (repConj_smul_comm hV) (repConj repW) + (repConj_smul_comm hW) (ConjModule.map (k := ℂ) f) + (lTensor_comp_repConj repV repW f hf) U] + end JetComponentSpace diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Pi.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Pi.lean index 00c14b3ba..20ef01c3a 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Pi.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Pi.lean @@ -31,6 +31,9 @@ value space, a field of `MatterField`, would fail for an infinite family in any ## ii. Key results - `MatterField.repJetPi` : the jet gauge action of an indexed direct sum. +- `MatterField.repJetPi_smul` : it is fibrewise, as each summand is. +- `MatterField.lTensor_proj_repJetPi` : the projection onto a summand intertwines it with + that summand's own action. - `MatterField.repAlgebraPi` : the infinitesimal gauge action of an indexed direct sum. - `MatterField.repCoeff_repJetPi` : its base-point Taylor coefficients are the family of those of the summands. @@ -139,6 +142,29 @@ lemma repJetPi_apply (U : G) (z : JetRing ⊗[ℂ] (∀ i, (M i).V)) : repJetPi M U z = (jetPiEquiv fun i => (M i).V).symm (fun i => (M i).repJet U (jetPiEquiv (fun i => (M i).V) z i)) := rfl +/-- The jet gauge action of an indexed direct sum is fibrewise. It acts index by + index, and each summand is fibrewise, so multiplication by a scalar jet passes through + the splitting untouched. This is the field `repJet_smul` of `MatterField.pi`, stated + separately so that it can be used without fixing a common mass weight. -/ +lemma repJetPi_smul (U : G) (χ : JetRing) (z : JetRing ⊗[ℂ] (∀ i, (M i).V)) : + repJetPi M U (χ • z) = χ • repJetPi M U z := by + rw [repJetPi_apply, repJetPi_apply, + show (fun i => (M i).repJet U (jetPiEquiv (fun i => (M i).V) (χ • z) i)) + = fun i => χ • (M i).repJet U (jetPiEquiv (fun i => (M i).V) z i) from + funext fun i => by rw [jetPiEquiv_smul, (M i).repJet_smul], + jetPiEquiv_symm_smul] + +/-- A summand is a subrepresentation of the jet gauge action of the direct sum. The + projection onto the value space of one summand, applied to the jets, intertwines the + summed action with that summand's own: the summed action is the family of the actions, + and reading off a summand of the jets is the projection on the value factor. -/ +lemma lTensor_proj_repJetPi (i : ι) (U : G) : + (LinearMap.lTensor JetRing (LinearMap.proj i)).comp (repJetPi M U) + = ((M i).repJet U).comp (LinearMap.lTensor JetRing (LinearMap.proj i)) := by + refine LinearMap.ext fun z => ?_ + rw [LinearMap.comp_apply, LinearMap.comp_apply, ← jetPiEquiv_eq_lTensor_proj, + ← jetPiEquiv_eq_lTensor_proj, repJetPi_apply, LinearEquiv.apply_symm_apply] + /-- **The infinitesimal action of an indexed direct sum**: the family of actions, one on each summand. -/ noncomputable def repAlgebraPi : 𝔤 →ₗ[ℝ] (∀ i, (M i).V) →ₗ[ℂ] (∀ i, (M i).V) where @@ -211,12 +237,7 @@ noncomputable def pi (w : ℕ) (_h : ∀ i, (M i).massWeight = w) : MatterField repLorentz := repPi fun i => (M i).repLorentz repJet := repJetPi M repAlgebra := repAlgebraPi M - repJet_smul U χ z := by - rw [repJetPi_apply, repJetPi_apply, - show (fun i => (M i).repJet U (jetPiEquiv (fun i => (M i).V) (χ • z) i)) - = fun i => χ • (M i).repJet U (jetPiEquiv (fun i => (M i).V) z i) from - funext fun i => by rw [jetPiEquiv_smul, (M i).repJet_smul], - jetPiEquiv_symm_smul] + repJet_smul := repJetPi_smul M repAlgebra_isInfinitesimalAction := isInfinitesimalActionOf_repAlgebraPi M massWeight := w diff --git a/Physlib/Mathematics/AlgebraRepresentation.lean b/Physlib/Mathematics/AlgebraRepresentation.lean new file mode 100644 index 000000000..95a8de478 --- /dev/null +++ b/Physlib/Mathematics/AlgebraRepresentation.lean @@ -0,0 +1,128 @@ +/- +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 Mathlib.RepresentationTheory.Basic +public import Mathlib.RingTheory.TensorProduct.Basic +/-! +# Representations acting by algebra maps + +## i. Overview + +A representation of a monoid on an algebra need not respect the multiplication; the ones +that do are the ones a field theory uses, and this file collects the two constructions on +them that are otherwise missing. + +Section A is about `Representation.tprod` on a tensor product of two algebras. The unit and +the product of `A ⊗[k] B` are given by those of the factors, so a pair of unit-preserving +or multiplicative representations gives one on the tensor product. The lemmas are stated at +abstract types with the factor laws as hypotheses, which is what lets them be applied at a +large concrete algebra without unfolding it: neither the unit nor the product of a free +algebra presented as a quotient can be reduced cheaply. + +Section B restricts a representation to a subalgebra it preserves. The invariance +hypothesis is stated pointwise, in the form the ambient invariance lemmas produce. + +## ii. Key results + +- `Representation.tprod_apply_one`, `Representation.tprod_apply_one_tmul`, + `Representation.tprod_apply_tmul_one` : the unit laws on a tensor product. +- `Representation.tprod_apply_mul` : multiplicativity on a tensor product. +- `Representation.restrictSubalgebra` : the restriction to an invariant subalgebra. + +## iii. Table of contents + +- A. Tensor products of multiplicative representations +- B. Restriction to an invariant subalgebra + +-/ + +@[expose] public section + +open TensorProduct + +namespace Representation + +/-! + +## A. Tensor products of multiplicative representations + +-/ + +/-- The tensor product of two unit-preserving representations preserves the unit. -/ +lemma tprod_apply_one {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) (g : G) + (hρ : ρ g 1 = 1) (hσ : σ g 1 = 1) : (ρ.tprod σ) g 1 = 1 := by + rw [Algebra.TensorProduct.one_def, Representation.tprod_apply, TensorProduct.map_tmul, + hρ, hσ, ← Algebra.TensorProduct.one_def] + +/-- On a pure tensor whose left entry is the unit only the right factor moves. -/ +lemma tprod_apply_one_tmul {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) (g : G) + (hρ : ρ g 1 = 1) (y : B) : + (ρ.tprod σ) g ((1 : A) ⊗ₜ[k] y) = (1 : A) ⊗ₜ[k] σ g y := by + rw [Representation.tprod_apply, TensorProduct.map_tmul, hρ] + +/-- On a pure tensor whose right entry is the unit only the left factor moves. -/ +lemma tprod_apply_tmul_one {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) (g : G) (x : A) + (hσ : σ g 1 = 1) : + (ρ.tprod σ) g (x ⊗ₜ[k] (1 : B)) = ρ g x ⊗ₜ[k] (1 : B) := by + rw [Representation.tprod_apply, TensorProduct.map_tmul, hσ] + +/-- The tensor product of two multiplicative representations on algebras is + multiplicative. -/ +lemma 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] + +/-! + +## B. Restriction to an invariant subalgebra + +-/ + +/-- The restriction of a representation to a subalgebra each group element preserves. -/ +noncomputable def restrictSubalgebra {k A G : Type*} [CommSemiring k] + [Monoid G] [Semiring A] [Algebra k A] (ρ : Representation k G A) (S : Subalgebra k A) + (hS : ∀ (g : G) {x : A}, x ∈ S → ρ g x ∈ S) : Representation k G S where + toFun g := + { toFun := fun x => ⟨ρ g (x : A), hS g x.2⟩ + map_add' := fun _ _ => Subtype.ext (map_add _ _ _) + map_smul' := fun _ _ => Subtype.ext (map_smul _ _ _) } + map_one' := LinearMap.ext fun x => Subtype.ext + (LinearMap.congr_fun (map_one ρ) (x : A)) + map_mul' g₁ g₂ := LinearMap.ext fun x => Subtype.ext + (LinearMap.congr_fun (map_mul ρ g₁ g₂) (x : A)) + +@[simp] +lemma coe_restrictSubalgebra {k A G : Type*} [CommSemiring k] + [Monoid G] [Semiring A] [Algebra k A] (ρ : Representation k G A) (S : Subalgebra k A) + (hS : ∀ (g : G) {x : A}, x ∈ S → ρ g x ∈ S) (g : G) (x : S) : + (ρ.restrictSubalgebra S hS g x : A) = ρ g (x : A) := rfl + +end Representation diff --git a/Physlib/Mathematics/ExteriorAlgebra.lean b/Physlib/Mathematics/ExteriorAlgebra.lean new file mode 100644 index 000000000..0e7874571 --- /dev/null +++ b/Physlib/Mathematics/ExteriorAlgebra.lean @@ -0,0 +1,326 @@ +/- +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 Mathlib.LinearAlgebra.ExteriorAlgebra.Basic +public import Mathlib.Algebra.TrivSqZeroExt.Basic +public import Mathlib.RepresentationTheory.Basic +/-! +# Derivations and representations on the exterior algebra + +## i. Overview + +Mathlib's `ExteriorAlgebra` carries the universal property `ExteriorAlgebra.lift` and the +functorial map `ExteriorAlgebra.map`, but neither the derivation extending a linear +endomorphism of the generators nor the representation extending a representation on them. +This file provides both, as the exterior counterparts of the symmetric-algebra +constructions in `Physlib.Mathematics.SymmetricAlgebra`. + +A linear endomorphism `d` of `M` extends uniquely to an *even* derivation of the exterior +algebra — the Leibniz rule with no Koszul signs — because the generator map +`ι x ↦ (ι x, ι (d x))` into the trivial square-zero extension squares to zero: degree-one +elements of an exterior algebra anticommute. A representation of a monoid `G` on `M` +extends to one on the exterior algebra by functoriality of `ExteriorAlgebra.map`, and every +element of `G` then acts by an algebra homomorphism. + +## ii. Key results + +- `ExteriorAlgebra.derivationOfLinear` : the even derivation extending a linear + endomorphism of the generators. +- `ExteriorAlgebra.derivationOfLinear_mul` : the Leibniz rule. +- `ExteriorAlgebra.derivationOfLinear_comm_apply` : derivations extending commuting + endomorphisms commute. +- `ExteriorAlgebra.algHom_derivationOfLinear` : an algebra map determined by an + intertwining linear map carries one derivation to the other. +- `Representation.exteriorAlgebra` : the representation extending one on the generators. +- `Representation.exteriorAlgebra_apply_mul` : each element acts multiplicatively. +- `ExteriorAlgebra.exteriorAlgebra_derivationOfLinear` : covariance of the derivation + under the representation. +- `ExteriorAlgebra.mapEquiv` : transport of the algebra along a linear equivalence of the + generators. +- `ExteriorAlgebra.algHom_exteriorAlgebra` : an algebra map determined by an intertwining + linear map carries one representation to the other. + +## iii. Table of contents + +- A. The derivation extending a linear endomorphism +- B. The representation extending a representation on the generators +- C. Transport along a linear equivalence + +-/ + +@[expose] public section + +namespace ExteriorAlgebra + +variable {R M : Type*} [CommRing R] [AddCommGroup M] [Module R M] + +/-! + +## A. The derivation extending a linear endomorphism + +-/ + +section Derivation + +variable (d : M →ₗ[R] M) + +/-- The generator map of the derivation extending `d`, into the trivial square-zero + extension of the exterior algebra: `ι x ↦ (ι x, ι (d x))`. -/ +noncomputable def derivationGen : + M →ₗ[R] TrivSqZeroExt (ExteriorAlgebra R M) (ExteriorAlgebra R M) where + toFun x := (ι R x, ι R (d 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 derivationGen_fst (x : M) : (derivationGen d x).fst = ι R x := rfl + +@[simp] +lemma derivationGen_snd (x : M) : (derivationGen d x).snd = ι R (d x) := rfl + +/-- The generator map squares to zero: degree-one elements of the exterior algebra + anticommute, which is exactly the square-zero condition on the pair. -/ +lemma derivationGen_mul_self (x : M) : derivationGen d x * derivationGen d x = 0 := by + refine TrivSqZeroExt.ext ?_ ?_ + · rw [TrivSqZeroExt.fst_mul, derivationGen_fst, ι_sq_zero, TrivSqZeroExt.fst_zero] + · rw [TrivSqZeroExt.snd_mul, derivationGen_fst, derivationGen_snd, + TrivSqZeroExt.snd_zero, smul_eq_mul, op_smul_eq_mul] + exact ι_add_mul_swap x (d x) + +/-- The lift of the derivation extending `d` to the trivial square-zero extension of the + exterior algebra: the algebra homomorphism `x ↦ (x, derivationOfLinear d x)`. -/ +noncomputable def derivationHom : + ExteriorAlgebra R M →ₐ[R] + TrivSqZeroExt (ExteriorAlgebra R M) (ExteriorAlgebra R M) := + ExteriorAlgebra.lift R ⟨derivationGen d, derivationGen_mul_self d⟩ + +@[simp] +lemma derivationHom_ι (x : M) : derivationHom d (ι R x) = derivationGen d x := by + rw [derivationHom, ExteriorAlgebra.lift_ι_apply] + +/-- The first component of the square-zero lift is the identity. -/ +@[simp] +lemma derivationHom_fst (x : ExteriorAlgebra R M) : (derivationHom d x).fst = x := by + have h : (TrivSqZeroExt.fstHom R (ExteriorAlgebra R M) (ExteriorAlgebra R M)).comp + (derivationHom d) = AlgHom.id R (ExteriorAlgebra R M) := + ExteriorAlgebra.hom_ext (LinearMap.ext fun x => by + rw [LinearMap.comp_apply, LinearMap.comp_apply, AlgHom.toLinearMap_apply, + AlgHom.toLinearMap_apply, AlgHom.comp_apply, derivationHom_ι] + rfl) + exact DFunLike.congr_fun h x + +/-- The even derivation of the exterior algebra extending a linear endomorphism `d` of + `M`: the map obeying the Leibniz rule, with no Koszul signs, whose value on a generator + `ι x` is `ι (d x)`. -/ +noncomputable def derivationOfLinear : ExteriorAlgebra R M →ₗ[R] ExteriorAlgebra 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 x) = ι R (d x) := by + rw [show derivationOfLinear d (ι R x) = (derivationHom d (ι R x)).snd from rfl, + derivationHom_ι, derivationGen_snd] + +@[simp] +lemma derivationOfLinear_one : derivationOfLinear d (1 : ExteriorAlgebra R M) = 0 := + congrArg TrivSqZeroExt.snd (map_one (derivationHom d)) + +@[simp] +lemma derivationOfLinear_algebraMap (r : R) : + derivationOfLinear d (algebraMap R (ExteriorAlgebra 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`, with no Koszul signs: the derivation + is even even though the generators are odd. -/ +lemma derivationOfLinear_mul (x y : ExteriorAlgebra 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 : ExteriorAlgebra R M) : + derivationOfLinear d₁ (derivationOfLinear d₂ x) + = derivationOfLinear d₂ (derivationOfLinear d₁ x) := by + induction x using ExteriorAlgebra.induction with + | algebraMap r => simp + | ι v => + simp only [derivationOfLinear_ι] + exact congrArg (ι R) (DFunLike.congr_fun h v) + | mul x y hx hy => + simp only [derivationOfLinear_mul, map_add, hx, hy] + abel + | add x y hx hy => simp only [map_add, hx, hy] + +/-- An algebra map carries one derivation to the other when the linear map it is + determined by on the generators intertwines the two endomorphisms. The hypotheses are + stated pointwise so that the lemma can be applied without rewriting inside a large + algebra. -/ +lemma algHom_derivationOfLinear {N : Type*} [AddCommGroup N] [Module R N] + (F : ExteriorAlgebra R M →ₐ[R] ExteriorAlgebra R N) {f : M →ₗ[R] N} + (hF : ∀ x, F (ι R x) = ι R (f x)) {d : M →ₗ[R] M} {d' : N →ₗ[R] N} + (h : ∀ x, f (d x) = d' (f x)) (y : ExteriorAlgebra R M) : + F (derivationOfLinear d y) = derivationOfLinear d' (F y) := by + induction y using ExteriorAlgebra.induction with + | algebraMap r => + rw [derivationOfLinear_algebraMap, map_zero, AlgHom.commutes, + derivationOfLinear_algebraMap] + | ι v => rw [derivationOfLinear_ι, hF, hF, derivationOfLinear_ι, h] + | mul a b ha hb => + simp only [derivationOfLinear_mul, map_add, map_mul, ha, hb] + | add a b ha hb => simp only [map_add, ha, hb] + +end Derivation + +end ExteriorAlgebra + +/-! + +## B. The representation extending a representation on the generators + +-/ + +namespace Representation + +variable {R G M : Type*} [CommRing R] [Monoid G] [AddCommGroup M] [Module R M] + +/-- The representation on the exterior algebra extending a representation on the + generators, by functoriality of `ExteriorAlgebra.map`. -/ +noncomputable def exteriorAlgebra (ρ : Representation R G M) : + Representation R G (ExteriorAlgebra R M) where + toFun g := (ExteriorAlgebra.map (ρ g)).toLinearMap + map_one' := by + simp only [map_one, Module.End.one_eq_id, ExteriorAlgebra.map_id, + AlgHom.toLinearMap_id] + map_mul' g h := by + have hmap : ExteriorAlgebra.map (R := R) (ρ (g * h)) + = (ExteriorAlgebra.map (ρ g)).comp (ExteriorAlgebra.map (ρ h)) := by + rw [map_mul, Module.End.mul_eq_comp, ExteriorAlgebra.map_comp_map] + rw [hmap] + rfl + +lemma exteriorAlgebra_apply (ρ : Representation R G M) (g : G) + (x : ExteriorAlgebra R M) : + ρ.exteriorAlgebra g x = ExteriorAlgebra.map (ρ g) x := rfl + +@[simp] +lemma exteriorAlgebra_ι (ρ : Representation R G M) (g : G) (x : M) : + ρ.exteriorAlgebra g (ExteriorAlgebra.ι R x) = ExteriorAlgebra.ι R (ρ g x) := + ExteriorAlgebra.map_apply_ι _ x + +@[simp] +lemma exteriorAlgebra_apply_one (ρ : Representation R G M) (g : G) : + ρ.exteriorAlgebra g (1 : ExteriorAlgebra R M) = 1 := + map_one (ExteriorAlgebra.map (ρ g)) + +lemma exteriorAlgebra_apply_mul (ρ : Representation R G M) (g : G) + (x y : ExteriorAlgebra R M) : + ρ.exteriorAlgebra g (x * y) = ρ.exteriorAlgebra g x * ρ.exteriorAlgebra g y := + map_mul (ExteriorAlgebra.map (ρ g)) x y + +lemma exteriorAlgebra_algebraMap (ρ : Representation R G M) (g : G) (r : R) : + ρ.exteriorAlgebra g (algebraMap R (ExteriorAlgebra R M) r) + = algebraMap R (ExteriorAlgebra R M) r := + AlgHom.commutes (ExteriorAlgebra.map (ρ g)) r + +end Representation + +namespace ExteriorAlgebra + +variable {R M : Type*} [CommRing R] [AddCommGroup M] [Module R M] + +/-- Covariance of the derivation under the representation. If the representation + carries each endomorphism of a family into a combination of the others on the generators, + then it carries the derivation extending one into the same combination of the derivations + extending the others on the whole exterior algebra. This is the shape the statement that + the total derivative is a Lorentz vector takes; it is proved by induction rather than by + algebra-map extensionality, a derivation not being an algebra map. -/ +lemma exteriorAlgebra_derivationOfLinear {G κ : Type*} [Monoid G] [Fintype κ] + (ρ : Representation R G M) (g : G) (d : κ → M →ₗ[R] M) (μ : κ) (c : κ → R) + (h : ∀ x, ρ g (d μ x) = ∑ a, c a • d a (ρ g x)) (y : ExteriorAlgebra R M) : + ρ.exteriorAlgebra g (derivationOfLinear (d μ) y) + = ∑ a, c a • derivationOfLinear (d a) (ρ.exteriorAlgebra g y) := by + induction y using ExteriorAlgebra.induction with + | algebraMap r => + rw [derivationOfLinear_algebraMap, map_zero, Representation.exteriorAlgebra_algebraMap] + exact ((Finset.sum_congr rfl fun a _ => by + rw [derivationOfLinear_algebraMap, smul_zero]).trans Finset.sum_const_zero).symm + | ι v => + rw [derivationOfLinear_ι, Representation.exteriorAlgebra_ι, + Representation.exteriorAlgebra_ι, h, map_sum] + exact Finset.sum_congr rfl fun a _ => by + rw [map_smul, derivationOfLinear_ι] + | mul a b ha hb => + rw [derivationOfLinear_mul, map_add] + simp only [Representation.exteriorAlgebra_apply_mul] + rw [ha, hb, Finset.sum_mul, Finset.mul_sum, ← Finset.sum_add_distrib] + exact Finset.sum_congr rfl fun k _ => by + rw [derivationOfLinear_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 k _ => by rw [map_add, smul_add] + +/-- An algebra map carries one representation to the other when the linear map it is + determined by on the generators intertwines the two representations on them. Unlike the + derivation statement this is pure extensionality of algebra maps, each group element + acting by one; the hypotheses are stated pointwise so that the lemma can be applied + without rewriting inside a large algebra. -/ +lemma algHom_exteriorAlgebra {N G : Type*} [AddCommGroup N] [Module R N] [Monoid G] + (F : ExteriorAlgebra R M →ₐ[R] ExteriorAlgebra R N) {f : M →ₗ[R] N} + (hF : ∀ x, F (ι R x) = ι R (f x)) + {ρ : Representation R G M} {σ : Representation R G N} (g : G) + (h : ∀ x, f (ρ g x) = σ g (f x)) (y : ExteriorAlgebra R M) : + F (ρ.exteriorAlgebra g y) = σ.exteriorAlgebra g (F y) := by + have key : F.comp (ExteriorAlgebra.map (ρ g)) = (ExteriorAlgebra.map (σ g)).comp F := + ExteriorAlgebra.hom_ext (LinearMap.ext fun x => by + rw [LinearMap.comp_apply, LinearMap.comp_apply, AlgHom.toLinearMap_apply, + AlgHom.toLinearMap_apply, AlgHom.comp_apply, AlgHom.comp_apply, + ExteriorAlgebra.map_apply_ι, hF, hF, ExteriorAlgebra.map_apply_ι, h]) + exact DFunLike.congr_fun key y + +end ExteriorAlgebra + + +/-! + +## C. Transport along a linear equivalence + +Mathlib's `ExteriorAlgebra.congr` goes through `CliffordAlgebra.equivOfIsometry`, whose +quadratic-form layer the elaborator cannot see through cheaply once the underlying module is +a large direct sum. The version below is built from `ExteriorAlgebra.map` instead. + +-/ + +namespace ExteriorAlgebra + +/-- Transport of an exterior algebra along a linear equivalence, built from + `ExteriorAlgebra.map` so that no `CliffordAlgebra` isometry has to be unfolded. -/ +noncomputable def mapEquiv {R M N : Type*} [CommRing R] [AddCommGroup M] + [Module R M] [AddCommGroup N] [Module R N] (e : M ≃ₗ[R] N) : + ExteriorAlgebra R M ≃ₐ[R] ExteriorAlgebra R N := + AlgEquiv.ofAlgHom (ExteriorAlgebra.map e.toLinearMap) + (ExteriorAlgebra.map e.symm.toLinearMap) + ((ExteriorAlgebra.map_comp_map e.symm.toLinearMap e.toLinearMap).trans + ((congrArg (fun f : N →ₗ[R] N => ExteriorAlgebra.map f) + (LinearMap.ext fun x => e.apply_symm_apply x)).trans ExteriorAlgebra.map_id)) + ((ExteriorAlgebra.map_comp_map e.toLinearMap e.symm.toLinearMap).trans + ((congrArg (fun f : M →ₗ[R] M => ExteriorAlgebra.map f) + (LinearMap.ext fun x => e.symm_apply_apply x)).trans ExteriorAlgebra.map_id)) + +@[simp] +lemma mapEquiv_apply_ι {R M N : Type*} [CommRing R] [AddCommGroup M] + [Module R M] [AddCommGroup N] [Module R N] (e : M ≃ₗ[R] N) (x : M) : + mapEquiv e (ExteriorAlgebra.ι R x) = ExteriorAlgebra.ι R (e x) := + ExteriorAlgebra.map_apply_ι _ x + +end ExteriorAlgebra diff --git a/Physlib/Mathematics/SymmetricAlgebra.lean b/Physlib/Mathematics/SymmetricAlgebra.lean index 1953e6871..a403d0f9a 100644 --- a/Physlib/Mathematics/SymmetricAlgebra.lean +++ b/Physlib/Mathematics/SymmetricAlgebra.lean @@ -8,6 +8,7 @@ module public import Mathlib.LinearAlgebra.SymmetricAlgebra.Basic public import Mathlib.RingTheory.TensorProduct.Maps public import Mathlib.Algebra.TrivSqZeroExt.Basic +public import Mathlib.RepresentationTheory.Basic /-! # Functoriality of the symmetric algebra @@ -27,6 +28,14 @@ tensor product because everything commutes. - `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. +- `SymmetricAlgebra.derivationOfLinear` : the derivation extending a linear endomorphism. +- `SymmetricAlgebra.algHom_derivationOfLinear` : an algebra map determined by an + intertwining linear map carries one derivation to the other. +- `Representation.symmetricAlgebra` : the representation extending one on the generators. +- `SymmetricAlgebra.symmetricAlgebra_derivationOfLinear` : covariance of the derivation + under the representation. +- `SymmetricAlgebra.algHom_symmetricAlgebra` : an algebra map determined by an intertwining + linear map carries one representation to the other. ## iii. Table of contents @@ -34,6 +43,7 @@ tensor product because everything commutes. - B. Generation by the degree-one elements - C. The symmetric algebra of a direct sum - D. The derivation extending a linear endomorphism +- E. The representation extending a representation on the generators -/ @@ -41,13 +51,20 @@ tensor product because everything commutes. 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] +section Functoriality + +variable {R M N P : Type*} [CommSemiring R] [AddCommMonoid M] [Module R M] + [AddCommMonoid N] [Module R N] [AddCommMonoid P] [Module R P] /-! ## A. Functoriality of the symmetric algebra +Stated over a commutative semiring and additive commutative monoids: the local field +algebra of a gauge field datum carries its bosonic factor on that instance path, and +identifying it with the one a `CommRing`/`AddCommGroup` statement produces is blocked by +the unexposed `TensorAlgebra.symRingCon`. + -/ /-- The algebra homomorphism between symmetric algebras induced by a linear map of the @@ -78,6 +95,11 @@ def congr (e : M ≃ₗ[R] N) : SymmetricAlgebra R M ≃ₐ[R] SymmetricAlgebra lemma congr_apply_ι (e : M ≃ₗ[R] N) (x : M) : congr e (ι R M x) = ι R N (e x) := map_apply_ι _ x +end Functoriality + +variable {R M N P : Type*} [CommRing R] [AddCommGroup M] [Module R M] + [AddCommGroup N] [Module R N] [AddCommGroup P] [Module R P] + /-! ## B. Generation by the degree-one elements @@ -188,7 +210,8 @@ trivial square-zero extension and taking the second component. section Derivation -variable (d : M →ₗ[R] M) +variable {R M N : Type*} [CommSemiring R] [AddCommMonoid M] [Module R M] + [AddCommMonoid N] [Module R N] (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)`. -/ @@ -262,6 +285,150 @@ lemma derivationOfLinear_comm_apply {d₁ d₂ : M →ₗ[R] M} (h : d₁ ∘ₗ exact add_add_add_comm _ _ _ _ | add x y hx hy => simp only [map_add, hx, hy] +/-- An algebra map carries one derivation to the other when the linear map it is + determined by on the generators intertwines the two endomorphisms. The hypotheses are + stated pointwise so that the lemma can be applied without rewriting inside a large + algebra. -/ +lemma algHom_derivationOfLinear + (F : SymmetricAlgebra R M →ₐ[R] SymmetricAlgebra R N) {f : M →ₗ[R] N} + (hF : ∀ x, F (ι R M x) = ι R N (f x)) {d : M →ₗ[R] M} {d' : N →ₗ[R] N} + (h : ∀ x, f (d x) = d' (f x)) (y : SymmetricAlgebra R M) : + F (derivationOfLinear d y) = derivationOfLinear d' (F y) := by + induction y using SymmetricAlgebra.induction with + | algebraMap r => + rw [derivationOfLinear_algebraMap, map_zero, AlgHom.commutes, + derivationOfLinear_algebraMap] + | ι v => rw [derivationOfLinear_ι, hF, hF, derivationOfLinear_ι, h] + | mul a b ha hb => + simp only [derivationOfLinear_mul, map_add, map_mul, ha, hb] + | add a b ha hb => simp only [map_add, ha, hb] + end Derivation end SymmetricAlgebra + +/-! + +## E. The representation extending a representation on the generators + +-/ + +namespace Representation + +variable {R G M : Type*} [CommSemiring R] [Monoid G] [AddCommMonoid M] [Module R M] + +/-- The representation on the symmetric algebra extending a representation on the + generators: the substitution homomorphism determined by the action on the generators. + It is built from `SymmetricAlgebra.lift` rather than from `SymmetricAlgebra.map`, so that + it is available over a commutative semiring and an additive commutative monoid — the + generality the generator spaces of a multi-species field theory, which are direct sums, + are elaborated at. -/ +noncomputable def symmetricAlgebra (ρ : Representation R G M) : + Representation R G (SymmetricAlgebra R M) where + toFun g := (SymmetricAlgebra.lift (SymmetricAlgebra.ι R M ∘ₗ ρ g)).toLinearMap + map_one' := by + have h : SymmetricAlgebra.lift (SymmetricAlgebra.ι R M ∘ₗ ρ 1) + = AlgHom.id R (SymmetricAlgebra R M) := + SymmetricAlgebra.algHom_ext (LinearMap.ext fun x => by simp) + rw [h] + rfl + map_mul' g h := by + have hlift : SymmetricAlgebra.lift (SymmetricAlgebra.ι R M ∘ₗ ρ (g * h)) + = (SymmetricAlgebra.lift (SymmetricAlgebra.ι R M ∘ₗ ρ g)).comp + (SymmetricAlgebra.lift (SymmetricAlgebra.ι R M ∘ₗ ρ h)) := + SymmetricAlgebra.algHom_ext (LinearMap.ext fun x => by + simp [SymmetricAlgebra.lift_ι_apply, Module.End.mul_apply]) + rw [hlift] + rfl + +/-- The action of a group element, as an algebra homomorphism. -/ +noncomputable def symmetricAlgebraAlgHom (ρ : Representation R G M) (g : G) : + SymmetricAlgebra R M →ₐ[R] SymmetricAlgebra R M := + SymmetricAlgebra.lift (SymmetricAlgebra.ι R M ∘ₗ ρ g) + +lemma symmetricAlgebra_apply (ρ : Representation R G M) (g : G) + (x : SymmetricAlgebra R M) : + ρ.symmetricAlgebra g x = ρ.symmetricAlgebraAlgHom g x := rfl + +@[simp] +lemma symmetricAlgebra_ι (ρ : Representation R G M) (g : G) (x : M) : + ρ.symmetricAlgebra g (SymmetricAlgebra.ι R M x) + = SymmetricAlgebra.ι R M (ρ g x) := + (SymmetricAlgebra.lift_ι_apply _ x).trans rfl + +@[simp] +lemma symmetricAlgebra_apply_one (ρ : Representation R G M) (g : G) : + ρ.symmetricAlgebra g (1 : SymmetricAlgebra R M) = 1 := + map_one (ρ.symmetricAlgebraAlgHom g) + +lemma symmetricAlgebra_apply_mul (ρ : Representation R G M) (g : G) + (x y : SymmetricAlgebra R M) : + ρ.symmetricAlgebra g (x * y) + = ρ.symmetricAlgebra g x * ρ.symmetricAlgebra g y := + map_mul (ρ.symmetricAlgebraAlgHom g) x y + +lemma symmetricAlgebra_algebraMap (ρ : Representation R G M) (g : G) (r : R) : + ρ.symmetricAlgebra g (algebraMap R (SymmetricAlgebra R M) r) + = algebraMap R (SymmetricAlgebra R M) r := + AlgHom.commutes (ρ.symmetricAlgebraAlgHom g) r + +end Representation + +namespace SymmetricAlgebra + +variable {R M : Type*} [CommSemiring R] [AddCommMonoid M] [Module R M] + +/-- Covariance of the derivation under the representation. If the representation + carries each endomorphism of a family into a combination of the others on the generators, + then it carries the derivation extending one into the same combination of the derivations + extending the others on the whole exterior algebra. This is the shape the statement that + the total derivative is a Lorentz vector takes; it is proved by induction rather than by + algebra-map extensionality, a derivation not being an algebra map. -/ +lemma symmetricAlgebra_derivationOfLinear {G κ : Type*} [Monoid G] [Fintype κ] + (ρ : Representation R G M) (g : G) (d : κ → M →ₗ[R] M) (μ : κ) (c : κ → R) + (h : ∀ x, ρ g (d μ x) = ∑ a, c a • d a (ρ g x)) (y : SymmetricAlgebra R M) : + ρ.symmetricAlgebra g (derivationOfLinear (d μ) y) + = ∑ a, c a • derivationOfLinear (d a) (ρ.symmetricAlgebra g y) := by + induction y using SymmetricAlgebra.induction with + | algebraMap r => + rw [derivationOfLinear_algebraMap, map_zero, Representation.symmetricAlgebra_algebraMap] + exact ((Finset.sum_congr rfl fun a _ => by + rw [derivationOfLinear_algebraMap, smul_zero]).trans Finset.sum_const_zero).symm + | ι v => + rw [derivationOfLinear_ι, Representation.symmetricAlgebra_ι, + Representation.symmetricAlgebra_ι, h, map_sum] + exact Finset.sum_congr rfl fun a _ => by + rw [map_smul, derivationOfLinear_ι] + | mul a b ha hb => + rw [derivationOfLinear_mul, map_add] + simp only [Representation.symmetricAlgebra_apply_mul] + rw [ha, hb, Finset.sum_mul, Finset.mul_sum, ← Finset.sum_add_distrib] + exact Finset.sum_congr rfl fun k _ => by + rw [derivationOfLinear_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 k _ => by rw [map_add, smul_add] + +/-- An algebra map carries one representation to the other when the linear map it is + determined by on the generators intertwines the two representations on them. Unlike the + derivation statement this is pure extensionality of algebra maps, each group element + acting by one; the hypotheses are stated pointwise so that the lemma can be applied + without rewriting inside a large algebra. -/ +lemma algHom_symmetricAlgebra {N G : Type*} [AddCommMonoid N] [Module R N] [Monoid G] + (F : SymmetricAlgebra R M →ₐ[R] SymmetricAlgebra R N) {f : M →ₗ[R] N} + (hF : ∀ x, F (ι R M x) = ι R N (f x)) + {ρ : Representation R G M} {σ : Representation R G N} (g : G) + (h : ∀ x, f (ρ g x) = σ g (f x)) (y : SymmetricAlgebra R M) : + F (ρ.symmetricAlgebra g y) = σ.symmetricAlgebra g (F y) := by + have key : F.comp (ρ.symmetricAlgebraAlgHom g) + = (σ.symmetricAlgebraAlgHom g).comp F := + SymmetricAlgebra.algHom_ext (LinearMap.ext fun x => by + show F (ρ.symmetricAlgebraAlgHom g (ι R M x)) + = σ.symmetricAlgebraAlgHom g (F (ι R M x)) + rw [show ρ.symmetricAlgebraAlgHom g (ι R M x) = ι R M (ρ g x) from + Representation.symmetricAlgebra_ι ρ g x, hF, hF, + show σ.symmetricAlgebraAlgHom g (ι R N (f x)) = ι R N (σ g (f x)) from + Representation.symmetricAlgebra_ι σ g (f x), h]) + exact DFunLike.congr_fun key y + +end SymmetricAlgebra diff --git a/Physlib/Particles/StandardModel/AlgebraRealization/Basic.lean b/Physlib/Particles/StandardModel/AlgebraRealization/Basic.lean index 56bfb3b76..415f0bcd1 100644 --- a/Physlib/Particles/StandardModel/AlgebraRealization/Basic.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/Basic.lean @@ -219,9 +219,11 @@ private lemma map_family_repJet {V : Type} [AddCommGroup V] [Module ℂ V] (hG : LocalGaugeData.TransformsIn (B := JetAlgebra) JetAlgebra.repJetGaugeGroupI rep G) : LocalGaugeData.TransformsIn repJet rep fun s => h.toAlgHom.toLinearMap ∘ₗ G s := by intro U φ s - show repJet U (h.toAlgHom _) = _ - rw [← h.map_repJet, hG U φ s, map_multiset_sum, Multiset.map_map] - rfl + show repJet U (h.toAlgHom (G s φ)) = _ + exact (h.map_repJet U (G s φ)).symm.trans + ((congrArg h.toAlgHom (hG U φ s)).trans + ((map_multiset_sum h.toAlgHom _).trans + (congrArg Multiset.sum (Multiset.map_map _ _ _)))) /-- A Lorentz transformation law transports along the defining map: the slot mixing is a finite sum of scalar multiples, and the map is linear and equivariant. -/ @@ -231,9 +233,11 @@ private lemma map_family_repLorentz {V : Type} [AddCommGroup V] [Module ℂ V] (hG : IsLorentzDerivTransforms (A := JetAlgebra) JetAlgebra.repLorentzGroup rep G) : IsLorentzDerivTransforms repLorentz rep fun s => h.toAlgHom.toLinearMap ∘ₗ G s := by intro Λ n l φ - show repLorentz Λ (h.toAlgHom _) = _ - rw [← h.map_repLorentz, hG Λ n l φ, map_sum] - exact Finset.sum_congr rfl fun p _ => map_smul h.toAlgHom _ _ + show repLorentz Λ (h.toAlgHom (G (List.ofFn l) φ)) = _ + exact (h.map_repLorentz Λ (G (List.ofFn l) φ)).symm.trans + ((congrArg h.toAlgHom (hG Λ n l φ)).trans + ((map_sum h.toAlgHom _ _).trans + (Finset.sum_congr rfl fun p _ => map_smul h.toAlgHom _ _))) /-! @@ -253,12 +257,12 @@ noncomputable def gaugeRealization : toAlgHom := h.toAlgHom.comp JetAlgebra.includeGauge A := h.A A_eq _ _ _ := rfl - map_repJet U y := by - rw [AlgHom.comp_apply, AlgHom.comp_apply, ← JetAlgebra.repJetGaugeGroupI_includeGauge, - h.map_repJet] - map_repLorentz Λ y := by - rw [AlgHom.comp_apply, AlgHom.comp_apply, ← JetAlgebra.repLorentzGroup_includeGauge, - h.map_repLorentz] + map_repJet U y := + (congrArg h.toAlgHom (JetAlgebra.repJetGaugeGroupI_includeGauge U y)).symm.trans + (h.map_repJet U (JetAlgebra.includeGauge y)) + map_repLorentz Λ y := + (congrArg h.toAlgHom (JetAlgebra.repLorentzGroup_includeGauge Λ y)).symm.trans + (h.map_repLorentz Λ (JetAlgebra.includeGauge y)) repJet_mul := h.repJet_mul repLorentz_mul := h.repLorentz_mul diff --git a/Physlib/Particles/StandardModel/AlgebraRealization/Commutations.lean b/Physlib/Particles/StandardModel/AlgebraRealization/Commutations.lean index eccca2de6..1d2e12e5b 100644 --- a/Physlib/Particles/StandardModel/AlgebraRealization/Commutations.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/Commutations.lean @@ -78,8 +78,11 @@ preserves products and negation, so an anticommutation in the jet algebra is one /-- An anticommutation transports along the defining map: the map preserves products and negation. -/ private lemma map_anticomm {x y : JetAlgebra} (hxy : x * y = -(y * x)) : - h.toAlgHom x * h.toAlgHom y = -(h.toAlgHom y * h.toAlgHom x) := by - rw [← map_mul h.toAlgHom, hxy, map_neg h.toAlgHom, map_mul h.toAlgHom] + h.toAlgHom x * h.toAlgHom y = -(h.toAlgHom y * h.toAlgHom x) := + (map_mul h.toAlgHom x y).symm.trans + ((congrArg h.toAlgHom hxy).trans + ((map_neg h.toAlgHom _).trans + (congrArg Neg.neg (map_mul h.toAlgHom y x)))) /-- The law `A_comm_A` of a Standard Model, obtained from the corresponding law of the jet algebra by pushing it along the defining algebra map. -/ diff --git a/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/Basic.lean b/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/Basic.lean index a93c45050..f342fb708 100644 --- a/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/Basic.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/Basic.lean @@ -168,8 +168,8 @@ noncomputable def covBarH (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : defining map. -/ lemma map_rep_eq {g : GaugeGroupI} {x y : CovHiggsJetAlgebra} (hxy : CovHiggsJetAlgebra.repGaugeGroupI g x = y) : - rep g (h.toAlgHom x) = h.toAlgHom y := by - rw [← h.map_rep, hxy] + rep g (h.toAlgHom x) = h.toAlgHom y := + (h.map_rep g x).symm.trans (congrArg h.toAlgHom hxy) /-- The Higgs symbol carries the dual of the gauge representation on `HiggsVec`: the `SU(2)` index transforms contragrediently, and the hypercharge character by `u⁻³`. -/ @@ -212,8 +212,10 @@ lemma barH_comm_barH (φ ψ : Module.Dual ℂ (ConjModule HiggsVec)) (n1 n2 : /-- A mass-weight eigenvalue equation transports along the defining map. -/ lemma map_massWeight_monomial {n : ℕ} {x : CovHiggsJetAlgebra} (hx : CovHiggsJetAlgebra.massWeightPoly x = Polynomial.monomial n x) : - massWeightPoly (h.toAlgHom x) = Polynomial.monomial n (h.toAlgHom x) := by - rw [h.map_massWeight, hx, Polynomial.mapAlgHom_monomial] + massWeightPoly (h.toAlgHom x) = Polynomial.monomial n (h.toAlgHom x) := + (h.map_massWeight x).trans + ((congrArg (Polynomial.mapAlgHom h.toAlgHom) hx).trans + (Polynomial.mapAlgHom_monomial h.toAlgHom n x)) /-- The mass weight of the Higgs tower is `2 * (1 + n)`. -/ lemma H_massWeight (φ : Module.Dual ℂ HiggsVec) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : @@ -243,8 +245,10 @@ lemma map_lorentz {V : Type} [AddCommGroup V] [Module ℂ V] (fun {_n} l => h.toAlgHom.toLinearMap ∘ₗ G l) := by intro Λ n l φ show repLorentz Λ (h.toAlgHom (G l φ)) = _ - rw [← h.map_repLorentz, hG Λ n l φ, map_sum] - exact Finset.sum_congr rfl fun p _ => map_smul h.toAlgHom _ _ + exact (h.map_repLorentz Λ (G l φ)).symm.trans + ((congrArg h.toAlgHom (hG Λ n l φ)).trans + ((map_sum h.toAlgHom _ _).trans + (Finset.sum_congr rfl fun p _ => map_smul h.toAlgHom _ _))) /-- 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 diff --git a/Physlib/Particles/StandardModel/AlgebraRealization/MassWeight/Basic.lean b/Physlib/Particles/StandardModel/AlgebraRealization/MassWeight/Basic.lean index fec4804e5..41c2e9640 100644 --- a/Physlib/Particles/StandardModel/AlgebraRealization/MassWeight/Basic.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/MassWeight/Basic.lean @@ -50,8 +50,10 @@ its mass dimension. The bosons have mass dimension `1 + |s|`, the fermions `3/2 the mass-weight polynomial to the mass-weight polynomial, and a monomial to a monomial. -/ private lemma map_massWeight_monomial {x : JetAlgebra} {n : ℕ} (hx : JetAlgebra.massWeightPoly x = Polynomial.monomial n x) : - massWeightPoly (h.toAlgHom x) = Polynomial.monomial n (h.toAlgHom x) := by - rw [h.map_massWeight, hx, Polynomial.mapAlgHom_monomial] + massWeightPoly (h.toAlgHom x) = Polynomial.monomial n (h.toAlgHom x) := + (h.map_massWeight x).trans + ((congrArg (Polynomial.mapAlgHom h.toAlgHom) hx).trans + (Polynomial.mapAlgHom_monomial h.toAlgHom n x)) /-- The law `massWeight_H` of a Standard Model, obtained from the corresponding law of the jet algebra by pushing it along the defining algebra map. -/ diff --git a/Physlib/Particles/StandardModel/CovAlgebraRealization/Basic.lean b/Physlib/Particles/StandardModel/CovAlgebraRealization/Basic.lean index c170f4a0b..192754fd6 100644 --- a/Physlib/Particles/StandardModel/CovAlgebraRealization/Basic.lean +++ b/Physlib/Particles/StandardModel/CovAlgebraRealization/Basic.lean @@ -244,26 +244,31 @@ of its own — it is `Commute.map`. the global gauge group. -/ lemma map_repGauge_eq {g : GaugeGroupI} {x y : CovJetAlgebra} (hxy : CovJetAlgebra.repGaugeGroupI g x = y) : - repGauge g (k.toAlgHom x) = k.toAlgHom y := by - rw [← k.map_repGauge, hxy] + repGauge g (k.toAlgHom x) = k.toAlgHom y := + (k.map_repGauge g x).symm.trans (congrArg k.toAlgHom hxy) /-- An anticommutation law transports along the defining map: the map preserves products and negation. -/ lemma map_anticomm {x y : CovJetAlgebra} (hxy : x * y = -(y * x)) : - k.toAlgHom x * k.toAlgHom y = -(k.toAlgHom y * k.toAlgHom x) := by - rw [← map_mul, ← map_mul, hxy, map_neg] + k.toAlgHom x * k.toAlgHom y = -(k.toAlgHom y * k.toAlgHom x) := + (map_mul k.toAlgHom x y).symm.trans + ((congrArg k.toAlgHom hxy).trans + ((map_neg k.toAlgHom _).trans + (congrArg Neg.neg (map_mul k.toAlgHom y x)))) /-- An antisymmetry transports along the defining map: the map preserves negation. -/ lemma map_neg_eq {x y : CovJetAlgebra} (hxy : x = -y) : - k.toAlgHom x = -k.toAlgHom y := by - rw [hxy, map_neg] + k.toAlgHom x = -k.toAlgHom y := + (congrArg k.toAlgHom hxy).trans (map_neg k.toAlgHom y) /-- A mass-weight eigenvalue equation transports along the defining map: the map carries the grading of the covariant jet algebra to that of `B`. -/ lemma map_massWeight_monomial {n : ℕ} {x : CovJetAlgebra} (hx : CovJetAlgebra.massWeightPoly x = Polynomial.monomial n x) : - massWeightPoly (k.toAlgHom x) = Polynomial.monomial n (k.toAlgHom x) := by - rw [k.map_massWeight, hx, Polynomial.mapAlgHom_monomial] + massWeightPoly (k.toAlgHom x) = Polynomial.monomial n (k.toAlgHom x) := + (k.map_massWeight x).trans + ((congrArg (Polynomial.mapAlgHom k.toAlgHom) hx).trans + (Polynomial.mapAlgHom_monomial k.toAlgHom n x)) /-- A Lorentz transformation law of a covariant tower transports along the defining map: the slot mixing is a finite sum of scalar multiples, and the map is linear and equivariant. -/ @@ -275,8 +280,10 @@ lemma map_lorentz {V : Type} [AddCommGroup V] [Module ℂ V] (fun {_n} l => k.toAlgHom.toLinearMap ∘ₗ G l) := by intro Λ n l φ show repLorentz Λ (k.toAlgHom (G l φ)) = _ - rw [← k.map_repLorentz, hG Λ n l φ, map_sum] - exact Finset.sum_congr rfl fun p _ => map_smul k.toAlgHom _ _ + exact (k.map_repLorentz Λ (G l φ)).symm.trans + ((congrArg k.toAlgHom (hG Λ n l φ)).trans + ((map_sum k.toAlgHom _ _).trans + (Finset.sum_congr rfl fun p _ => map_smul k.toAlgHom _ _))) /-! @@ -301,8 +308,10 @@ noncomputable def isHiggsSector : map_repLorentz Λ x := k.map_repLorentz Λ (x : CovJetAlgebra) map_massWeight x := by show massWeightPoly (k.toAlgHom (x : CovJetAlgebra)) = _ - rw [k.map_massWeight, ← Subalgebra.mapAlgHom_polyRestrict - CovJetAlgebra.massWeightPoly_mem_polyRange x] + refine (k.map_massWeight (x : CovJetAlgebra)).trans ?_ + refine (congrArg (Polynomial.mapAlgHom k.toAlgHom) + (Subalgebra.mapAlgHom_polyRestrict + CovJetAlgebra.massWeightPoly_mem_polyRange x).symm).trans ?_ exact AlgHom.congr_fun (Polynomial.mapAlgHom_comp _ k.toAlgHom CovJetAlgebra.higgsSubalgebra.val) _ rep_mul := k.repGauge_mul @@ -326,15 +335,15 @@ theorem isGaugeSector : IsGaugeSector B repGauge k.repGauge_mul repLorentz k.rep k.map_repGauge_eq (CovJetAlgebra.isGaugeSector.repGauge_F g l μ ν φ) repLorentz_F := fun Λ n l μ ν φ => by show repLorentz Λ (k.toAlgHom (CovJetAlgebra.fieldStrength l μ ν φ)) = _ - rw [← k.map_repLorentz, - CovJetAlgebra.isGaugeSector.repLorentz_F Λ n l μ ν φ, map_sum] - refine Finset.sum_congr rfl fun p _ => ?_ - rw [map_smul, map_sum] - congr 1 - refine Finset.sum_congr rfl fun a _ => ?_ - rw [map_smul, map_sum] - congr 1 - exact Finset.sum_congr rfl fun b _ => map_smul k.toAlgHom _ _ + refine (k.map_repLorentz Λ _).symm.trans ?_ + refine (congrArg k.toAlgHom + (CovJetAlgebra.isGaugeSector.repLorentz_F Λ n l μ ν φ)).trans ?_ + refine (map_sum k.toAlgHom _ _).trans (Finset.sum_congr rfl fun p _ => ?_) + refine (map_smul k.toAlgHom _ _).trans (congrArg _ ?_) + refine (map_sum k.toAlgHom _ _).trans (Finset.sum_congr rfl fun a _ => ?_) + refine (map_smul k.toAlgHom _ _).trans (congrArg _ ?_) + exact (map_sum k.toAlgHom _ _).trans + (Finset.sum_congr rfl fun b _ => map_smul k.toAlgHom _ _) massWeight_F := fun {_n} l μ ν φ => k.map_massWeight_monomial (CovJetAlgebra.isGaugeSector.massWeight_F l μ ν φ) F_comm_F := fun {_n _m} l μ ν ψ l' μ' ν' ψ' => @@ -1064,7 +1073,9 @@ noncomputable def toCovAlgebraRealization : map_repLorentz Λ x := h.map_repLorentz Λ (x : JetAlgebra) map_massWeight x := by show massWeightPoly (h.toAlgHom (x : JetAlgebra)) = _ - rw [h.map_massWeight, ← AlgebraRealization.id.mapAlgHom_covMassWeightPoly x] + refine (h.map_massWeight (x : JetAlgebra)).trans ?_ + refine (congrArg (Polynomial.mapAlgHom h.toAlgHom) + (AlgebraRealization.id.mapAlgHom_covMassWeightPoly x).symm).trans ?_ exact AlgHom.congr_fun (Polynomial.mapAlgHom_comp _ h.toAlgHom AlgebraRealization.id.covAlgebra.val) _ repGauge_mul := h.repGlobal_mul diff --git a/Physlib/Particles/StandardModel/JetAlgebra/AlgebraRealization.lean b/Physlib/Particles/StandardModel/JetAlgebra/AlgebraRealization.lean index 4eef41f60..3b1ceb078 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/AlgebraRealization.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/AlgebraRealization.lean @@ -169,13 +169,16 @@ open TensorProduct Matrix MatrixGroups Lorentz `algebraRealization_massWeightSubmodule`. -/ noncomputable def massWeightSubmodule (n : ℕ) : Submodule ℂ JetAlgebra where carrier := {x | massWeightPoly x = Polynomial.monomial n x} - zero_mem' := by simp - add_mem' hx hy := by - simp only [Set.mem_setOf_eq] at hx hy ⊢ - rw [map_add, hx, hy, map_add] - smul_mem' c x hx := by - simp only [Set.mem_setOf_eq] at hx ⊢ - rw [map_smul, hx, ← Polynomial.smul_monomial] + zero_mem' := + (map_zero massWeightPoly).trans (Polynomial.monomial_zero_right n).symm + add_mem' {x y} hx hy := + (map_add massWeightPoly x y).trans + ((congrArg₂ (fun p q : Polynomial JetAlgebra => p + q) hx hy).trans + ((Polynomial.monomial n).map_add x y).symm) + smul_mem' c x hx := + (map_smul massWeightPoly c x).trans + ((congrArg (fun p : Polynomial JetAlgebra => c • p) hx).trans + (Polynomial.smul_monomial c n x)) /-- Membership of the weight-`n` piece is the eigenvalue equation. -/ @[simp] @@ -192,10 +195,15 @@ noncomputable def massWeightSubmoduleLE (w : ℕ) : Submodule ℂ JetAlgebra := two differ only by the intersection with the field algebra, which is everything. -/ lemma algebraRealization_massWeightSubmodule (n : ℕ) : AlgebraRealization.id.massWeightSubmodule n = massWeightSubmodule n := by - rw [AlgebraRealization.id.massWeightSubmodule_eq_ker algebraRealization_fieldAlgebra_eq_top] - ext x - rw [LinearMap.mem_ker, mem_massWeightSubmodule] - simp [sub_eq_zero] + refine (AlgebraRealization.id.massWeightSubmodule_eq_ker + algebraRealization_fieldAlgebra_eq_top n).trans (SetLike.ext fun x => ?_) + exact LinearMap.mem_ker.trans sub_eq_zero + +/-- Membership of two equal submodules of the jet algebra agree. It is stated at variable + endpoints so that the substitution never abstracts a pattern out of a goal mentioning the + jet algebra. -/ +private lemma mem_submodule_congr {S T : Submodule ℂ JetAlgebra} (h : S = T) + (x : JetAlgebra) : x ∈ S ↔ x ∈ T := h ▸ Iff.rfl /-- The filtration defined on the jet algebra is the filtration of the instance. -/ lemma algebraRealization_massWeightSubmoduleLE (w : ℕ) : @@ -258,8 +266,9 @@ theorem mem_massWeightSubmoduleLE_eight_and_invariant_iff_lagrangian (x : JetAlg ⊔ AlgebraRealization.id.toCovAlgebraRealization.isHiggsSector.lorentzContractionEightSpan ⊔ (AlgebraRealization.id.toCovAlgebraRealization.isFermionSector.kineticSpan ⊔ AlgebraRealization.id.toCovAlgebraRealization.yukawaSpan))) := by - rw [← algebraRealization_massWeightSubmoduleLE] - exact AlgebraRealization.id.mem_massWeightSubmoduleLE_eight_and_invariant_iff_lagrangian x + exact (and_congr_left' + (mem_submodule_congr (algebraRealization_massWeightSubmoduleLE 8).symm x)).trans + (AlgebraRealization.id.mem_massWeightSubmoduleLE_eight_and_invariant_iff_lagrangian x) set_option maxHeartbeats 40000000 in /-- The same classification as @@ -291,9 +300,12 @@ theorem mem_massWeightSubmoduleLE_eight_sup_and_invariant_iff_lagrangian ⊔ AlgebraRealization.id.toCovAlgebraRealization.isHiggsSector.lorentzContractionEightSpan ⊔ (AlgebraRealization.id.toCovAlgebraRealization.isFermionSector.kineticSpan ⊔ AlgebraRealization.id.toCovAlgebraRealization.yukawaSpan))) := by - rw [← algebraRealization_massWeightSubmoduleLE] - exact AlgebraRealization.id.mem_massWeightSubmoduleLE_eight_sup_and_invariant_iff_lagrangian - S hS hSL hScov x + exact (and_congr_left' + (mem_submodule_congr + (congrArg (fun T : Submodule ℂ JetAlgebra => T ⊔ S) + (algebraRealization_massWeightSubmoduleLE 8).symm) x)).trans + (AlgebraRealization.id.mem_massWeightSubmoduleLE_eight_sup_and_invariant_iff_lagrangian + S hS hSL hScov x) end JetAlgebra diff --git a/Physlib/Particles/StandardModel/JetAlgebra/Basic.lean b/Physlib/Particles/StandardModel/JetAlgebra/Basic.lean index caebcc1a8..d059f1fda 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/Basic.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/Basic.lean @@ -9,18 +9,28 @@ public import Physlib.Particles.StandardModel.Fermions.JetAlgebra.Basic public import Physlib.Particles.StandardModel.HiggsBoson.JetAlgebra.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.Basic public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData +public import Physlib.Mathematics.AlgebraRepresentation +public import Physlib.Particles.StandardModel.JetAlgebra.SectorEquiv.Basic /-! # The jet algebra of the Standard Model ## i. Overview 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 GaugeAlgebra`. The bosonic factors -commute with -everything, so the ordinary tensor product is correct; the anticommutativity of the -fermions lives entirely inside the fermionic factor. +Lagrangian lives — is the local field algebra of its field datum, +`StandardModel.fieldData.LocalFieldAlgebra`: the exterior algebra on the fermionic +generators of the datum, tensored with the symmetric algebra on its bosonic generators, +tensored with the complexified symmetric algebra on the connection generators. The bosonic +factors commute with everything, so the ordinary tensor product is correct; the +anticommutativity of the fermions lives entirely inside the fermionic factor, where all +fifteen species share one exterior algebra. + +The three sector inclusions keep their old names and their old sources — the sector +algebras `FermionJetAlgebra`, `HiggsJetAlgebra` and `GaugeJetAlgebra GaugeAlgebra` — so +that every downstream family of field symbols is unchanged. The two matter inclusions +factor through the sector equivalences of +`Physlib.Particles.StandardModel.JetAlgebra.SectorEquiv.Basic`; the connection sector needs +no equivalence, the two presentations of it being the same type. 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 @@ -31,15 +41,15 @@ and the mass-dimension scaling are assembled factorwise in the sibling files. - `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. +- `JetAlgebra.includeFermion_ι`, `JetAlgebra.includeHiggs_ι`, + `JetAlgebra.includeGauge_one_tmul_ι` : the included degree-one elements of the three + sectors are the generic generators of the field datum. ## iii. Table of contents - 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 -/ @@ -60,11 +70,9 @@ open TensorProduct Matrix MatrixGroups -/ -/-- **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 GaugeAlgebra)) +/-- The jet algebra of the Standard Model: the local field algebra of the Standard + Model field datum. A Standard Model Lagrangian is an element of this algebra. -/ +abbrev JetAlgebra : Type := fieldData.LocalFieldAlgebra namespace JetAlgebra @@ -76,23 +84,66 @@ namespace JetAlgebra /-- The inclusion of the fermionic sector. -/ noncomputable def includeFermion : FermionJetAlgebra →ₐ[ℂ] JetAlgebra := - (Algebra.TensorProduct.includeLeft - (R := ℂ) (S := ℂ) (B := ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra))).comp - Algebra.TensorProduct.includeLeft + fieldData.includeFermion.comp fermionAlgebraEquiv.toAlgHom /-- The inclusion of the Higgs sector. -/ noncomputable def includeHiggs : HiggsJetAlgebra →ₐ[ℂ] JetAlgebra := - (Algebra.TensorProduct.includeLeft - (R := ℂ) (S := ℂ) (B := ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra))).comp - Algebra.TensorProduct.includeRight + fieldData.includeBoson.comp higgsAlgebraEquiv.toAlgHom -/-- The inclusion of the gauge sector. -/ -noncomputable def includeGauge : (ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) →ₐ[ℂ] JetAlgebra := - Algebra.TensorProduct.includeRight +/-- The inclusion of the gauge sector. The Standard Model gauge bosons are the generic + ones at `GaugeAlgebra`, so this is the connection inclusion of the datum itself. -/ +noncomputable def includeGauge : + (ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) →ₐ[ℂ] JetAlgebra := + fieldData.includeConnection lemma includeGauge_apply (y : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) : - includeGauge y - = ((1 : FermionJetAlgebra) ⊗ₜ[ℂ] (1 : HiggsJetAlgebra)) ⊗ₜ[ℂ] y := rfl + includeGauge y = ((1 : fieldData.MatterAlgebra) ⊗ₜ[ℂ] y : JetAlgebra) := + GaugeFieldData.includeConnection_apply y + +/-- The fermionic sector inclusion factors through the sector equivalence and the generic + fermionic factor inclusion. -/ +lemma includeFermion_apply_equiv (a : FermionJetAlgebra) : + includeFermion a = fieldData.includeFermion (fermionAlgebraEquiv a) := rfl + +/-- The Higgs sector inclusion factors through the sector equivalence and the generic + bosonic factor inclusion. -/ +lemma includeHiggs_apply_equiv (h : HiggsJetAlgebra) : + includeHiggs h = fieldData.includeBoson (higgsAlgebraEquiv h) := rfl + +/-- The gauge sector inclusion is the generic connection factor inclusion. -/ +lemma includeGauge_eq_includeConnection : + includeGauge = fieldData.includeConnection := rfl + +/-- A degree-one element of the fermionic sector, included, is a total fermionic generator + of the field datum, read through the fermionic generator identification. -/ +lemma includeFermion_ι (v : JetComponentSpace FermionSpace) : + includeFermion (ExteriorAlgebra.ι ℂ v) + = fieldData.ιFermionTotal (fermionGeneratorsEquiv.symm v) := + (includeFermion_apply_equiv (ExteriorAlgebra.ι ℂ v)).trans + ((congrArg (fun a : ExteriorAlgebra ℂ fieldData.FermionGenerators => + fieldData.includeFermion a) (fermionAlgebraEquiv_ι v)).trans + (StandardModel.includeFermion_ι (fermionGeneratorsEquiv.symm v))) + +/-- A degree-one element of the Higgs sector, included, is the generator of the one bosonic + species of the field datum. -/ +lemma includeHiggs_ι (v : JetComponentSpace HiggsVec) : + includeHiggs (SymmetricAlgebra.ι ℂ (JetComponentSpace HiggsVec) v) + = fieldData.ιBoson () v := + (((includeHiggs_apply_equiv (SymmetricAlgebra.ι ℂ (JetComponentSpace HiggsVec) v)).trans + (congrArg (fun b : SymmetricAlgebra ℂ fieldData.BosonGenerators => + fieldData.includeBoson b) (higgsAlgebraEquiv_ι v))).trans + (StandardModel.includeBoson_ι (bosonGeneratorsEquiv.symm v))).trans + ((congrArg (fun w : fieldData.BosonGenerators => fieldData.ιBosonTotal w) + (bosonGeneratorsEquiv_symm_apply v)).trans (ιBosonTotal_inclBoson () v)) + +/-- A real degree-one element of the gauge sector, included, is a connection generator of + the field datum: the connection factors of the two presentations are the same type, and + the complexification is the scalar one. -/ +lemma includeGauge_one_tmul_ι (v : GaugeBoson.JetComponentSpace GaugeAlgebra) : + includeGauge ((1 : ℂ) ⊗ₜ[ℝ] + SymmetricAlgebra.ι ℝ (GaugeBoson.JetComponentSpace GaugeAlgebra) v) + = fieldData.ιConnection v := + StandardModel.includeConnection_one_tmul_ι v /-! @@ -122,36 +173,6 @@ lemma includeGauge_commute (y : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) (x x * includeGauge y = includeGauge y * x := tensor_includeRight_comm y x -/-! - -## B. Tensor products of multiplicative representations - --/ - -/-- 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/CovJetAlgebra/Basic.lean b/Physlib/Particles/StandardModel/JetAlgebra/CovJetAlgebra/Basic.lean index 5266b1e0e..3be5bd563 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/CovJetAlgebra/Basic.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/CovJetAlgebra/Basic.lean @@ -4,6 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE. Authors: Joseph Tooby-Smith -/ module +public import Physlib.Mathematics.AlgebraRepresentation public import Physlib.Particles.StandardModel.AlgebraRealization.CovStandardModel public import Physlib.Particles.StandardModel.JetAlgebra.Realization /-! @@ -454,21 +455,9 @@ subalgebra itself; the identification is through the injection /-- The global gauge action on the covariant subalgebra: the ambient global gauge action, which section B shows preserves it. -/ -noncomputable def covRepGauge : Representation ℂ GaugeGroupI ↥h.covAlgebra where - toFun g := - { toFun := fun x => ⟨repGlobal repJet g (x : B), h.repGlobal_mem_covAlgebra g x.2⟩ - map_add' := fun x y => Subtype.ext (map_add _ _ _) - map_smul' := fun c x => Subtype.ext (map_smul _ _ _) } - map_one' := by - refine LinearMap.ext fun x => Subtype.ext ?_ - show repGlobal repJet 1 (x : B) = (x : B) - rw [map_one] - rfl - map_mul' g₁ g₂ := by - refine LinearMap.ext fun x => Subtype.ext ?_ - show repGlobal repJet (g₁ * g₂) (x : B) = repGlobal repJet g₁ (repGlobal repJet g₂ (x : B)) - rw [map_mul] - rfl +noncomputable def covRepGauge : Representation ℂ GaugeGroupI ↥h.covAlgebra := + (repGlobal repJet).restrictSubalgebra h.covAlgebra + fun g _ hx => h.repGlobal_mem_covAlgebra g hx @[simp] lemma coe_covRepGauge (g : GaugeGroupI) (x : ↥h.covAlgebra) : @@ -476,21 +465,9 @@ lemma coe_covRepGauge (g : GaugeGroupI) (x : ↥h.covAlgebra) : /-- The Lorentz action on the covariant subalgebra: the ambient Lorentz action, which section B shows preserves it. -/ -noncomputable def covRepLorentz : Representation ℂ SL(2,ℂ) ↥h.covAlgebra where - toFun Λ := - { toFun := fun x => ⟨repLorentz Λ (x : B), h.repLorentz_mem_covAlgebra Λ x.2⟩ - map_add' := fun x y => Subtype.ext (map_add _ _ _) - map_smul' := fun c x => Subtype.ext (map_smul _ _ _) } - map_one' := by - refine LinearMap.ext fun x => Subtype.ext ?_ - show repLorentz 1 (x : B) = (x : B) - rw [map_one] - rfl - map_mul' Λ₁ Λ₂ := by - refine LinearMap.ext fun x => Subtype.ext ?_ - show repLorentz (Λ₁ * Λ₂) (x : B) = repLorentz Λ₁ (repLorentz Λ₂ (x : B)) - rw [map_mul] - rfl +noncomputable def covRepLorentz : Representation ℂ SL(2,ℂ) ↥h.covAlgebra := + repLorentz.restrictSubalgebra h.covAlgebra + fun Λ _ hx => h.repLorentz_mem_covAlgebra Λ hx @[simp] lemma coe_covRepLorentz (Λ : SL(2,ℂ)) (x : ↥h.covAlgebra) : diff --git a/Physlib/Particles/StandardModel/JetAlgebra/CovJetAlgebra/Higgs.lean b/Physlib/Particles/StandardModel/JetAlgebra/CovJetAlgebra/Higgs.lean index 8d62e134f..bce22ca78 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/CovJetAlgebra/Higgs.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/CovJetAlgebra/Higgs.lean @@ -86,6 +86,16 @@ lemma conjHiggsField_mem_higgsSubalgebra {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin Algebra.subset_adjoin <| Set.mem_iUnion_of_mem n <| Set.mem_iUnion_of_mem l <| Or.inr ⟨φ, rfl⟩ +/-- Membership of the Higgs subalgebra transported along an equation, stated at variable + endpoints so that the substitution never abstracts a pattern out of a goal mentioning the + covariant jet algebra. -/ +private lemma mem_higgsSubalgebra_of_eq {x y : CovJetAlgebra} (h : x = y) + (hx : x ∈ higgsSubalgebra) : y ∈ higgsSubalgebra := h ▸ hx + +/-- The same, for the polynomials over the Higgs subalgebra. -/ +private lemma mem_polyRange_of_eq {p q : Polynomial CovJetAlgebra} (h : p = q) + (hp : p ∈ higgsSubalgebra.polyRange) : q ∈ higgsSubalgebra.polyRange := h ▸ hp + /-- A property that holds of both Higgs towers holds of every Higgs generator. -/ lemma higgsGenerators_induction {P : CovJetAlgebra → Prop} (hH : ∀ {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ HiggsVec), @@ -116,10 +126,14 @@ lemma mapsTo_higgsSubalgebra {f : CovJetAlgebra →ₗ[ℂ] CovJetAlgebra} (hone induction hx using Algebra.adjoin_induction with | mem b hb => exact hgen b hb | algebraMap c => - rw [Algebra.algebraMap_eq_smul_one, map_smul, hone] - exact Subalgebra.smul_mem _ (one_mem _) c - | add a b _ _ iha ihb => rw [map_add]; exact add_mem iha ihb - | mul a b _ _ iha ihb => rw [hmul]; exact mul_mem iha ihb + exact mem_higgsSubalgebra_of_eq + ((congrArg f (Algebra.algebraMap_eq_smul_one c)).trans + ((map_smul f c 1).trans (congrArg (fun z : CovJetAlgebra => c • z) hone))).symm + (Subalgebra.smul_mem _ (one_mem _) c) + | add a b _ _ iha ihb => + exact mem_higgsSubalgebra_of_eq (map_add f a b).symm (add_mem iha ihb) + | mul a b _ _ iha ihb => + exact mem_higgsSubalgebra_of_eq (hmul a b).symm (mul_mem iha ihb) /-- A Lorentz slot-mixing sum of Higgs towers lies in the Higgs subalgebra. -/ lemma sum_smul_mem_higgsSubalgebra {n : ℕ} {c : (Fin n → (Fin 1 ⊕ Fin 3)) → ℂ} @@ -133,12 +147,12 @@ lemma repGaugeGroupI_mem_higgsSubalgebra (g : GaugeGroupI) {x : CovJetAlgebra} refine mapsTo_higgsSubalgebra ?_ (repGaugeGroupI_mul g) ?_ hx · exact Subtype.ext (AlgebraRealization.id.repGlobal_one g) · refine higgsGenerators_induction (fun l φ => ?_) (fun l φ => ?_) - · rw [show repGaugeGroupI g (higgsField l φ) = higgsField l _ from - Subtype.ext (AlgebraRealization.id.repGlobal_covDerivH g l φ)] - exact higgsField_mem_higgsSubalgebra _ _ - · rw [show repGaugeGroupI g (conjHiggsField l φ) = conjHiggsField l _ from - Subtype.ext (AlgebraRealization.id.repGlobal_covDerivBarH g l φ)] - exact conjHiggsField_mem_higgsSubalgebra _ _ + · exact mem_higgsSubalgebra_of_eq + (Subtype.ext (AlgebraRealization.id.repGlobal_covDerivH g l φ)).symm + (higgsField_mem_higgsSubalgebra _ _) + · exact mem_higgsSubalgebra_of_eq + (Subtype.ext (AlgebraRealization.id.repGlobal_covDerivBarH g l φ)).symm + (conjHiggsField_mem_higgsSubalgebra _ _) /-- The Lorentz action preserves the Higgs subalgebra. -/ lemma repLorentzGroup_mem_higgsSubalgebra (Λ : SL(2,ℂ)) {x : CovJetAlgebra} @@ -146,12 +160,13 @@ lemma repLorentzGroup_mem_higgsSubalgebra (Λ : SL(2,ℂ)) {x : CovJetAlgebra} refine mapsTo_higgsSubalgebra ?_ (repLorentzGroup_mul Λ) ?_ hx · exact Subtype.ext (AlgebraRealization.id.repLorentz_one Λ) · refine higgsGenerators_induction (fun l φ => ?_) (fun l φ => ?_) - · rw [isLorentzCovDerivTransforms_of - (fun Λ n l φ => AlgebraRealization.id.repLorentz_covDerivH Λ n l φ) Λ _ l φ] - exact sum_smul_mem_higgsSubalgebra fun p => higgsField_mem_higgsSubalgebra _ _ - · rw [isLorentzCovDerivTransforms_of - (fun Λ n l φ => AlgebraRealization.id.repLorentz_covDerivBarH Λ n l φ) Λ _ l φ] - exact sum_smul_mem_higgsSubalgebra fun p => conjHiggsField_mem_higgsSubalgebra _ _ + · exact mem_higgsSubalgebra_of_eq (isLorentzCovDerivTransforms_of + (fun Λ n l φ => AlgebraRealization.id.repLorentz_covDerivH Λ n l φ) Λ _ l φ).symm + (sum_smul_mem_higgsSubalgebra fun _ => higgsField_mem_higgsSubalgebra _ _) + · exact mem_higgsSubalgebra_of_eq (isLorentzCovDerivTransforms_of + (fun Λ n l φ => AlgebraRealization.id.repLorentz_covDerivBarH Λ n l φ) + Λ _ l φ).symm + (sum_smul_mem_higgsSubalgebra fun _ => conjHiggsField_mem_higgsSubalgebra _ _) /-! @@ -166,12 +181,14 @@ lemma massWeightPoly_mem_polyRange (x : higgsSubalgebra) : massWeightPoly (x : CovJetAlgebra) ∈ higgsSubalgebra.polyRange := higgsSubalgebra.mem_range_mapAlgHom_of_adjoin (higgsGenerators_induction - (fun l φ => by - rw [massWeightPoly_eq_monomial (AlgebraRealization.id.massWeight_covDerivH l φ)] - exact Subalgebra.monomial_mem_polyRange (higgsField_mem_higgsSubalgebra l φ)) - (fun l φ => by - rw [massWeightPoly_eq_monomial (AlgebraRealization.id.massWeight_covDerivBarH l φ)] - exact Subalgebra.monomial_mem_polyRange (conjHiggsField_mem_higgsSubalgebra l φ))) + (fun l φ => mem_polyRange_of_eq + (massWeightPoly_eq_monomial + (AlgebraRealization.id.massWeight_covDerivH l φ)).symm + (Subalgebra.monomial_mem_polyRange (higgsField_mem_higgsSubalgebra l φ))) + (fun l φ => mem_polyRange_of_eq + (massWeightPoly_eq_monomial + (AlgebraRealization.id.massWeight_covDerivBarH l φ)).symm + (Subalgebra.monomial_mem_polyRange (conjHiggsField_mem_higgsSubalgebra l φ)))) x.2 /-! @@ -205,23 +222,9 @@ open CovJetAlgebra /-- The action of the global gauge group on the covariant jet algebra of the Higgs field. -/ -noncomputable def repGaugeGroupI : Representation ℂ GaugeGroupI CovHiggsJetAlgebra where - toFun g := - { toFun := fun x => ⟨CovJetAlgebra.repGaugeGroupI g (x : CovJetAlgebra), - repGaugeGroupI_mem_higgsSubalgebra g x.2⟩ - map_add' := fun x y => Subtype.ext (map_add _ _ _) - map_smul' := fun c x => Subtype.ext (map_smul _ _ _) } - map_one' := by - refine LinearMap.ext fun x => Subtype.ext ?_ - show CovJetAlgebra.repGaugeGroupI 1 (x : CovJetAlgebra) = (x : CovJetAlgebra) - rw [map_one] - rfl - map_mul' g₁ g₂ := by - refine LinearMap.ext fun x => Subtype.ext ?_ - show CovJetAlgebra.repGaugeGroupI (g₁ * g₂) (x : CovJetAlgebra) - = CovJetAlgebra.repGaugeGroupI g₁ (CovJetAlgebra.repGaugeGroupI g₂ (x : CovJetAlgebra)) - rw [map_mul] - rfl +noncomputable def repGaugeGroupI : Representation ℂ GaugeGroupI CovHiggsJetAlgebra := + CovJetAlgebra.repGaugeGroupI.restrictSubalgebra CovJetAlgebra.higgsSubalgebra + fun g _ hx => CovJetAlgebra.repGaugeGroupI_mem_higgsSubalgebra g hx @[simp] lemma coe_repGaugeGroupI (g : GaugeGroupI) (x : CovHiggsJetAlgebra) : @@ -229,23 +232,9 @@ lemma coe_repGaugeGroupI (g : GaugeGroupI) (x : CovHiggsJetAlgebra) : rfl /-- The action of the Lorentz group on the covariant jet algebra of the Higgs field. -/ -noncomputable def repLorentzGroup : Representation ℂ SL(2,ℂ) CovHiggsJetAlgebra where - toFun Λ := - { toFun := fun x => ⟨CovJetAlgebra.repLorentzGroup Λ (x : CovJetAlgebra), - repLorentzGroup_mem_higgsSubalgebra Λ x.2⟩ - map_add' := fun x y => Subtype.ext (map_add _ _ _) - map_smul' := fun c x => Subtype.ext (map_smul _ _ _) } - map_one' := by - refine LinearMap.ext fun x => Subtype.ext ?_ - show CovJetAlgebra.repLorentzGroup 1 (x : CovJetAlgebra) = (x : CovJetAlgebra) - rw [map_one] - rfl - map_mul' Λ₁ Λ₂ := by - refine LinearMap.ext fun x => Subtype.ext ?_ - show CovJetAlgebra.repLorentzGroup (Λ₁ * Λ₂) (x : CovJetAlgebra) - = CovJetAlgebra.repLorentzGroup Λ₁ (CovJetAlgebra.repLorentzGroup Λ₂ (x : CovJetAlgebra)) - rw [map_mul] - rfl +noncomputable def repLorentzGroup : Representation ℂ SL(2,ℂ) CovHiggsJetAlgebra := + CovJetAlgebra.repLorentzGroup.restrictSubalgebra CovJetAlgebra.higgsSubalgebra + fun Λ _ hx => CovJetAlgebra.repLorentzGroup_mem_higgsSubalgebra Λ hx @[simp] lemma coe_repLorentzGroup (Λ : SL(2,ℂ)) (x : CovHiggsJetAlgebra) : diff --git a/Physlib/Particles/StandardModel/JetAlgebra/FieldAlgebra.lean b/Physlib/Particles/StandardModel/JetAlgebra/FieldAlgebra.lean index 93e9f76ef..145f09214 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/FieldAlgebra.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/FieldAlgebra.lean @@ -54,6 +54,7 @@ factor is the image of `z` under `algebraMap`. - B.2. The Higgs sector - B.3. The fermionic sector - B.4. The gauge sector + - B.5. The two matter factors of the carrier - C. The generation theorem -/ @@ -210,6 +211,12 @@ private lemma mem_of_adjoin_eq_top {R A B : Type*} [CommSemiring R] [Semiring A] rw [hT] exact Algebra.mem_top +/-- Membership in the generated algebra transported along an equation. It is stated at + variable endpoints so that the substitution never has to abstract a pattern out of a goal + mentioning the jet algebra. -/ +private lemma mem_adjoin_generators_of_eq {x y : JetAlgebra} (h : x = y) + (hx : x ∈ Algebra.adjoin ℂ generators) : y ∈ Algebra.adjoin ℂ generators := h ▸ hx + /-! ### B.2. The Higgs sector @@ -220,8 +227,9 @@ private lemma mem_of_adjoin_eq_top {R A B : Type*} [CommSemiring R] [Semiring A] lemma higgsField_eq_includeHiggs (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ HiggsVec) : higgsField s φ - = includeHiggs (BosonicAlgebra.iteratedJetDeriv s (BosonicAlgebra.ofField φ)) := by - rw [higgsField_apply, BosonicAlgebra.iteratedJetDeriv_ofField] + = includeHiggs (BosonicAlgebra.iteratedJetDeriv s (BosonicAlgebra.ofField φ)) := + (higgsField_apply s φ).trans + (congrArg includeHiggs (BosonicAlgebra.iteratedJetDeriv_ofField s φ).symm) /-- A conjugate Higgs symbol is the Higgs sector's own conjugate derivative symbol, included. -/ @@ -229,8 +237,9 @@ lemma conjHiggsField_eq_includeHiggs (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule HiggsVec)) : conjHiggsField s φ = includeHiggs (BosonicAlgebra.iteratedJetDeriv s - (BosonicAlgebra.ofConjField φ)) := by - rw [conjHiggsField_apply, BosonicAlgebra.iteratedJetDeriv_ofConjField] + (BosonicAlgebra.ofConjField φ)) := + (conjHiggsField_apply s φ).trans + (congrArg includeHiggs (BosonicAlgebra.iteratedJetDeriv_ofConjField s φ).symm) /-- Every element of the Higgs sector lies in the algebra generated by the symbols: the Higgs jet algebra is generated by the Higgs field, its conjugate and their derivatives, @@ -243,10 +252,10 @@ lemma includeHiggs_mem_adjoin_generators (h : HiggsJetAlgebra) : rw [Set.mem_iUnion] at hy obtain ⟨s, hs⟩ := hy rcases hs with ⟨φ, rfl⟩ | ⟨φ, rfl⟩ - · rw [← higgsField_eq_includeHiggs] - exact Algebra.subset_adjoin (higgsField_mem_generators s φ) - · rw [← conjHiggsField_eq_includeHiggs] - exact Algebra.subset_adjoin (conjHiggsField_mem_generators s φ) + · exact mem_adjoin_generators_of_eq (higgsField_eq_includeHiggs s φ) + (Algebra.subset_adjoin (higgsField_mem_generators s φ)) + · exact mem_adjoin_generators_of_eq (conjHiggsField_eq_includeHiggs s φ) + (Algebra.subset_adjoin (conjHiggsField_mem_generators s φ)) /-! @@ -264,8 +273,9 @@ lemma fermionSymbol_eq_includeFermion (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ FermionSpace) : fermionSymbol s φ = includeFermion (FermionicAlgebra.iteratedJetDeriv s - (FermionicAlgebra.ofField φ)) := by - rw [fermionSymbol_apply, FermionicAlgebra.iteratedJetDeriv_ofField] + (FermionicAlgebra.ofField φ)) := + (fermionSymbol_apply s φ).trans + (congrArg includeFermion (FermionicAlgebra.iteratedJetDeriv_ofField s φ).symm) /-- A conjugate fermionic symbol is the fermionic sector's own conjugate derivative symbol, included. -/ @@ -273,8 +283,9 @@ lemma conjFermionSymbol_eq_includeFermion (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule FermionSpace)) : conjFermionSymbol s φ = includeFermion (FermionicAlgebra.iteratedJetDeriv s - (FermionicAlgebra.ofConjField φ)) := by - rw [conjFermionSymbol_apply, FermionicAlgebra.iteratedJetDeriv_ofConjField] + (FermionicAlgebra.ofConjField φ)) := + (conjFermionSymbol_apply s φ).trans + (congrArg includeFermion (FermionicAlgebra.iteratedJetDeriv_ofConjField s φ).symm) /-- Every fermionic symbol lies in the generated algebra. The families give the symbols of the covectors pulled back from a single species and generation; those span every covector @@ -288,19 +299,23 @@ lemma fermionSymbol_mem_adjoin_generators (s : Multiset (Fin 1 ⊕ Fin 3)) induction hφ using Submodule.span_induction with | mem ψ hψ => rcases hψ with ⟨i, χ, rfl⟩ | ⟨i, χ, rfl⟩ | ⟨i, χ, rfl⟩ | ⟨i, χ, rfl⟩ | ⟨i, χ, rfl⟩ - · rw [← leptonDoubletField_eq_fermionSymbol] - exact Algebra.subset_adjoin (leptonDoubletField_mem_generators i s χ) - · rw [← leptonSingletField_eq_fermionSymbol] - exact Algebra.subset_adjoin (leptonSingletField_mem_generators i s χ) - · rw [← quarkDoubletField_eq_fermionSymbol] - exact Algebra.subset_adjoin (quarkDoubletField_mem_generators i s χ) - · rw [← upSingletField_eq_fermionSymbol] - exact Algebra.subset_adjoin (upSingletField_mem_generators i s χ) - · rw [← downSingletField_eq_fermionSymbol] - exact Algebra.subset_adjoin (downSingletField_mem_generators i s χ) - | zero => rw [map_zero]; exact zero_mem _ - | add x y _ _ hx hy => rw [map_add]; exact add_mem hx hy - | smul c x _ hx => rw [map_smul]; exact Subalgebra.smul_mem _ hx c + · exact mem_adjoin_generators_of_eq (leptonDoubletField_eq_fermionSymbol i s χ) + (Algebra.subset_adjoin (leptonDoubletField_mem_generators i s χ)) + · exact mem_adjoin_generators_of_eq (leptonSingletField_eq_fermionSymbol i s χ) + (Algebra.subset_adjoin (leptonSingletField_mem_generators i s χ)) + · exact mem_adjoin_generators_of_eq (quarkDoubletField_eq_fermionSymbol i s χ) + (Algebra.subset_adjoin (quarkDoubletField_mem_generators i s χ)) + · exact mem_adjoin_generators_of_eq (upSingletField_eq_fermionSymbol i s χ) + (Algebra.subset_adjoin (upSingletField_mem_generators i s χ)) + · exact mem_adjoin_generators_of_eq (downSingletField_eq_fermionSymbol i s χ) + (Algebra.subset_adjoin (downSingletField_mem_generators i s χ)) + | zero => + exact mem_adjoin_generators_of_eq (map_zero (fermionSymbol s)).symm (zero_mem _) + | add x y _ _ hx hy => + exact mem_adjoin_generators_of_eq (map_add (fermionSymbol s) x y).symm (add_mem hx hy) + | smul c x _ hx => + exact mem_adjoin_generators_of_eq (map_smul (fermionSymbol s) c x).symm + (Subalgebra.smul_mem _ hx c) /-- Every conjugate fermionic symbol lies in the generated algebra, by the conjugate form of the spanning argument. -/ @@ -313,19 +328,27 @@ lemma conjFermionSymbol_mem_adjoin_generators (s : Multiset (Fin 1 ⊕ Fin 3)) induction hφ using Submodule.span_induction with | mem ψ hψ => rcases hψ with ⟨i, χ, rfl⟩ | ⟨i, χ, rfl⟩ | ⟨i, χ, rfl⟩ | ⟨i, χ, rfl⟩ | ⟨i, χ, rfl⟩ - · rw [← conjLeptonDoubletField_eq_conjFermionSymbol] - exact Algebra.subset_adjoin (conjLeptonDoubletField_mem_generators i s χ) - · rw [← conjLeptonSingletField_eq_conjFermionSymbol] - exact Algebra.subset_adjoin (conjLeptonSingletField_mem_generators i s χ) - · rw [← conjQuarkDoubletField_eq_conjFermionSymbol] - exact Algebra.subset_adjoin (conjQuarkDoubletField_mem_generators i s χ) - · rw [← conjUpSingletField_eq_conjFermionSymbol] - exact Algebra.subset_adjoin (conjUpSingletField_mem_generators i s χ) - · rw [← conjDownSingletField_eq_conjFermionSymbol] - exact Algebra.subset_adjoin (conjDownSingletField_mem_generators i s χ) - | zero => rw [map_zero]; exact zero_mem _ - | add x y _ _ hx hy => rw [map_add]; exact add_mem hx hy - | smul c x _ hx => rw [map_smul]; exact Subalgebra.smul_mem _ hx c + · exact mem_adjoin_generators_of_eq + (conjLeptonDoubletField_eq_conjFermionSymbol i s χ) + (Algebra.subset_adjoin (conjLeptonDoubletField_mem_generators i s χ)) + · exact mem_adjoin_generators_of_eq + (conjLeptonSingletField_eq_conjFermionSymbol i s χ) + (Algebra.subset_adjoin (conjLeptonSingletField_mem_generators i s χ)) + · exact mem_adjoin_generators_of_eq + (conjQuarkDoubletField_eq_conjFermionSymbol i s χ) + (Algebra.subset_adjoin (conjQuarkDoubletField_mem_generators i s χ)) + · exact mem_adjoin_generators_of_eq (conjUpSingletField_eq_conjFermionSymbol i s χ) + (Algebra.subset_adjoin (conjUpSingletField_mem_generators i s χ)) + · exact mem_adjoin_generators_of_eq (conjDownSingletField_eq_conjFermionSymbol i s χ) + (Algebra.subset_adjoin (conjDownSingletField_mem_generators i s χ)) + | zero => + exact mem_adjoin_generators_of_eq (map_zero (conjFermionSymbol s)).symm (zero_mem _) + | add x y _ _ hx hy => + exact mem_adjoin_generators_of_eq (map_add (conjFermionSymbol s) x y).symm + (add_mem hx hy) + | smul c x _ hx => + exact mem_adjoin_generators_of_eq (map_smul (conjFermionSymbol s) c x).symm + (Subalgebra.smul_mem _ hx c) /-- Every element of the fermionic sector lies in the algebra generated by the symbols. -/ lemma includeFermion_mem_adjoin_generators (f : FermionJetAlgebra) : @@ -336,23 +359,21 @@ lemma includeFermion_mem_adjoin_generators (f : FermionJetAlgebra) : rw [Set.mem_iUnion] at hy obtain ⟨s, hs⟩ := hy rcases hs with ⟨φ, rfl⟩ | ⟨φ, rfl⟩ - · rw [← fermionSymbol_eq_includeFermion] - exact fermionSymbol_mem_adjoin_generators s φ - · rw [← conjFermionSymbol_eq_includeFermion] - exact conjFermionSymbol_mem_adjoin_generators s φ - + · exact mem_adjoin_generators_of_eq (fermionSymbol_eq_includeFermion s φ) + (fermionSymbol_mem_adjoin_generators s φ) + · exact mem_adjoin_generators_of_eq (conjFermionSymbol_eq_includeFermion s φ) + (conjFermionSymbol_mem_adjoin_generators s φ) /-! ### B.4. The gauge sector -The gauge tensor factor is the complexification `ℂ ⊗[ℝ] GaugeJetAlgebra GaugeAlgebra`, while the -gauge -sector's generation theorem is a statement over `ℝ` about `GaugeJetAlgebra GaugeAlgebra` itself. -The -real part of the factor is handled by that theorem transported along the real algebra map -`x ↦ 1 ⊗ₜ x`; the complex scalar is then supplied by `z ⊗ₜ x = (z ⊗ₜ 1) * (1 ⊗ₜ x)`, whose -first factor is the image of `z` under `algebraMap` and so lies in every subalgebra. +The gauge tensor factor is the complexification `ℂ ⊗[ℝ] GaugeJetAlgebra GaugeAlgebra`, +while the gauge sector's generation theorem is a statement over `ℝ` about +`GaugeJetAlgebra GaugeAlgebra` itself. The real part of the factor is handled by that +theorem transported along the real algebra map `x ↦ 1 ⊗ₜ x`; the complex scalar is then +supplied by `z ⊗ₜ x = (z ⊗ₜ 1) * (1 ⊗ₜ x)`, whose first factor is the image of `z` under +`algebraMap` and so lies in every subalgebra. -/ @@ -378,7 +399,8 @@ lemma iteratedD_complexJetDeriv_tmul (s : Multiset (Fin 1 ⊕ Fin 3)) (z : ℂ) sector's generation theorem is stated. -/ noncomputable def includeGaugeReal : (GaugeJetAlgebra GaugeAlgebra) →ₐ[ℝ] JetAlgebra := (AlgHom.restrictScalars ℝ includeGauge).comp - (Algebra.TensorProduct.includeRight (R := ℝ) (A := ℂ) (B := (GaugeJetAlgebra GaugeAlgebra))) + (Algebra.TensorProduct.includeRight (R := ℝ) (A := ℂ) + (B := (GaugeJetAlgebra GaugeAlgebra))) /-- The real gauge inclusion is the gauge inclusion of the pure tensor with complex part one. -/ @@ -392,9 +414,11 @@ lemma gaugeField_eq_includeGaugeReal (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin (φ : Module.Dual ℝ GaugeAlgebra) : gaugeField s μ φ = includeGaugeReal ((GaugeJetAlgebra.iteratedJetDeriv GaugeAlgebra) s - ((GaugeJetAlgebra.ofA GaugeAlgebra) μ φ)) := by - rw [gaugeField_apply, includeGaugeReal_apply, GaugeJetAlgebra.gaugeField_apply, - iteratedD_complexJetDeriv_tmul] + ((GaugeJetAlgebra.ofA GaugeAlgebra) μ φ)) := + (gaugeField_apply s μ φ).trans + ((congrArg includeGauge + (iteratedD_complexJetDeriv_tmul s 1 (GaugeJetAlgebra.ofA GaugeAlgebra μ φ))).trans + (includeGaugeReal_apply _).symm) /-- Every element of the real gauge sector lies in the algebra generated by the symbols: the gauge-boson jet algebra is generated over `ℝ` by the derivative symbols of the gauge @@ -407,8 +431,8 @@ lemma includeGaugeReal_mem_adjoin_generators (x : (GaugeJetAlgebra GaugeAlgebra) rintro _ ⟨y, hy, rfl⟩ simp only [Set.mem_iUnion, Set.mem_range] at hy obtain ⟨s, μ, φ, rfl⟩ := hy - rw [← gaugeField_eq_includeGaugeReal] - exact Algebra.subset_adjoin (gaugeField_mem_generators s μ φ) + exact mem_adjoin_generators_of_eq (gaugeField_eq_includeGaugeReal s μ φ) + (Algebra.subset_adjoin (gaugeField_mem_generators s μ φ)) exact h /-- Every element of the complexified gauge sector lies in the algebra generated by the @@ -416,17 +440,48 @@ lemma includeGaugeReal_mem_adjoin_generators (x : (GaugeJetAlgebra GaugeAlgebra) lemma includeGauge_mem_adjoin_generators (y : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) : includeGauge y ∈ Algebra.adjoin ℂ generators := by induction y using TensorProduct.induction_on with - | zero => rw [map_zero]; exact zero_mem _ - | add a b ha hb => rw [map_add]; exact add_mem ha hb + | zero => exact mem_adjoin_generators_of_eq (map_zero includeGauge).symm (zero_mem _) + | add a b ha hb => + exact mem_adjoin_generators_of_eq (map_add includeGauge a b).symm (add_mem ha hb) | tmul z x => have hsplit : (z ⊗ₜ[ℝ] x : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) = algebraMap ℂ (ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) z * ((1 : ℂ) ⊗ₜ[ℝ] x) := by rw [show algebraMap ℂ (ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) z = z ⊗ₜ[ℝ] (1 : (GaugeJetAlgebra GaugeAlgebra)) from rfl, Algebra.TensorProduct.tmul_mul_tmul, mul_one, one_mul] - rw [hsplit, map_mul, AlgHom.commutes] - exact mul_mem (Subalgebra.algebraMap_mem _ z) - (includeGaugeReal_mem_adjoin_generators x) + refine mem_adjoin_generators_of_eq (congrArg includeGauge hsplit).symm ?_ + exact mem_adjoin_generators_of_eq (map_mul includeGauge _ _).symm + (mul_mem + (mem_adjoin_generators_of_eq (AlgHom.commutes includeGauge z).symm + (Subalgebra.algebraMap_mem _ z)) + (includeGaugeReal_mem_adjoin_generators x)) + +/-! + +### B.5. The two matter factors of the carrier + +The two matter sector inclusions factor through the sector equivalences, so a factor of +the carrier is a sector element read through one of them. + +-/ + +/-- Every element of the fermionic factor of the carrier lies in the generated algebra. -/ +lemma includeFermionFactor_mem_adjoin_generators + (a : ExteriorAlgebra ℂ fieldData.FermionGenerators) : + fieldData.includeFermion a ∈ Algebra.adjoin ℂ generators := + mem_adjoin_generators_of_eq + ((includeFermion_apply_equiv (fermionAlgebraEquiv.symm a)).trans + (congrArg fieldData.includeFermion (fermionAlgebraEquiv.apply_symm_apply a))) + (includeFermion_mem_adjoin_generators (fermionAlgebraEquiv.symm a)) + +/-- Every element of the bosonic factor of the carrier lies in the generated algebra. -/ +lemma includeBosonFactor_mem_adjoin_generators + (b : SymmetricAlgebra ℂ fieldData.BosonGenerators) : + fieldData.includeBoson b ∈ Algebra.adjoin ℂ generators := + mem_adjoin_generators_of_eq + ((includeHiggs_apply_equiv (higgsAlgebraEquiv.symm b)).trans + (congrArg fieldData.includeBoson (higgsAlgebraEquiv.apply_symm_apply b))) + (includeHiggs_mem_adjoin_generators (higgsAlgebraEquiv.symm b)) /-! @@ -444,26 +499,40 @@ private lemma tensor_tmul_tmul {A B C : Type*} [Ring A] [Algebra ℂ A] [Ring B] = (a ⊗ₜ[ℂ] b) ⊗ₜ[ℂ] c := by simp only [Algebra.TensorProduct.tmul_mul_tmul, mul_one, one_mul] -/-- A pure tensor of the jet algebra is the product of the three sector inclusions applied - to its factors. -/ -lemma includeFermion_mul_includeHiggs_mul_includeGauge (a : FermionJetAlgebra) - (b : HiggsJetAlgebra) (c : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) : - includeFermion a * includeHiggs b * includeGauge c = (a ⊗ₜ[ℂ] b) ⊗ₜ[ℂ] c := - tensor_tmul_tmul a b c +/-- A pure tensor of the jet algebra is the product of the three factor inclusions applied + to its factors. The three inclusions are unfolded through the abstract `GaugeFieldData` + rules, which is what keeps the computation out of the carrier's own instances. -/ +lemma includeFermionFactor_mul_includeBosonFactor_mul_includeConnection + (a : ExteriorAlgebra ℂ fieldData.FermionGenerators) + (b : SymmetricAlgebra ℂ fieldData.BosonGenerators) + (c : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) : + fieldData.includeFermion a * fieldData.includeBoson b * fieldData.includeConnection c + = ((a ⊗ₜ[ℂ] b) ⊗ₜ[ℂ] c : JetAlgebra) := + (congrArg₂ (fun x y : JetAlgebra => x * y) + (congrArg₂ (fun x y : JetAlgebra => x * y) + (GaugeFieldData.includeFermion_apply a) (GaugeFieldData.includeBoson_apply b)) + ((GaugeFieldData.includeConnection_apply c).trans + (congrArg (fun w : fieldData.MatterAlgebra => (w ⊗ₜ[ℂ] c : JetAlgebra)) + GaugeFieldData.one_matterAlgebra))).trans + (tensor_tmul_tmul a b c) /-- Every pure tensor of the jet algebra lies in the algebra generated by the symbols. -/ -lemma tmul_mem_adjoin_generators (w : FermionJetAlgebra ⊗[ℂ] HiggsJetAlgebra) +lemma tmul_mem_adjoin_generators (w : fieldData.MatterAlgebra) (y : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) : (w ⊗ₜ[ℂ] y : JetAlgebra) ∈ Algebra.adjoin ℂ generators := by induction w using TensorProduct.induction_on with - | zero => rw [TensorProduct.zero_tmul]; exact zero_mem _ - | add a b ha hb => rw [TensorProduct.add_tmul]; exact add_mem ha hb + | zero => + exact mem_adjoin_generators_of_eq + (TensorProduct.zero_tmul fieldData.MatterAlgebra y).symm (zero_mem _) + | add a b ha hb => + exact mem_adjoin_generators_of_eq (TensorProduct.add_tmul a b y).symm (add_mem ha hb) | tmul a b => - rw [← includeFermion_mul_includeHiggs_mul_includeGauge] - exact mul_mem - (mul_mem (includeFermion_mem_adjoin_generators a) - (includeHiggs_mem_adjoin_generators b)) - (includeGauge_mem_adjoin_generators y) + exact mem_adjoin_generators_of_eq + (includeFermionFactor_mul_includeBosonFactor_mul_includeConnection a b y) + (mul_mem + (mul_mem (includeFermionFactor_mem_adjoin_generators a) + (includeBosonFactor_mem_adjoin_generators b)) + (includeGauge_mem_adjoin_generators y)) /-- The fields of the Standard Model generate its jet algebra. As a `ℂ`-algebra, `JetAlgebra` is adjoined by the derivative symbols of the gauge field, the Higgs and its @@ -477,13 +546,12 @@ lemma tmul_mem_adjoin_generators (w : FermionJetAlgebra ⊗[ℂ] HiggsJetAlgebra theorem adjoin_generators_eq_top : Algebra.adjoin ℂ generators = (⊤ : Subalgebra ℂ JetAlgebra) := by refine top_le_iff.mp ?_ - rw [← Algebra.TensorProduct.adjoin_tmul_eq_top ℂ - (FermionJetAlgebra ⊗[ℂ] HiggsJetAlgebra) (ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra))] + rw [← Algebra.TensorProduct.adjoin_tmul_eq_top ℂ fieldData.MatterAlgebra + (ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra))] refine Algebra.adjoin_le ?_ rintro _ ⟨w, y, rfl⟩ exact tmul_mem_adjoin_generators w y - end JetAlgebra end StandardModel diff --git a/Physlib/Particles/StandardModel/JetAlgebra/GaugeAction.lean b/Physlib/Particles/StandardModel/JetAlgebra/GaugeAction.lean index 819837f50..d7a54e8bd 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/GaugeAction.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/GaugeAction.lean @@ -10,28 +10,40 @@ public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.GaugeActio public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.GaugeAction public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.GaugeAction public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData +public import Physlib.Particles.StandardModel.JetAlgebra.SectorEquiv.Structure /-! # 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. +The jet gauge group acts on the jet algebra of the Standard Model factor by factor. On the +two matter factors it is the free-algebra functor applied to the species-wise action +`fieldData.repJetFermion`, `fieldData.repJetBoson` on the generator spaces; on the +connection factor it is the generic affine action `GaugeJetAlgebra.complexRepJet` of the +Standard Model's local gauge data, whose linear part is the all-orders Leibniz convolution +of the adjoint Taylor coefficients and whose constant part is the Maurer–Cartan shift. The +action is multiplicative — a jet of gauge transformations acts on a Lagrangian term factor +by factor — and restricts to each sector's own 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. +- `JetAlgebra.repJetGaugeGroupI_includeConnection`, + `JetAlgebra.repJetGaugeGroupI_includeFermionFactor`, + `JetAlgebra.repJetGaugeGroupI_includeBosonFactor` : the restriction to each of the three + factors of the carrier. +- `JetAlgebra.repJetGaugeGroupI_includeGauge`, + `JetAlgebra.repJetGaugeGroupI_includeFermion`, + `JetAlgebra.repJetGaugeGroupI_includeHiggs` : the restriction to each of the three + sectors, in the Standard Model presentation of them. ## iii. Table of contents - A. The action of the jet gauge group - A.1. Multiplicativity - - A.2. The action on the gauge sector + - A.2. The action on the three factors + - A.3. The action on the three sectors -/ @@ -54,19 +66,33 @@ namespace JetAlgebra -/ -/-- The jet gauge action on the jet algebra of the Standard Model: the three sectors - transform independently. -/ +/-- The jet gauge action on the fermionic factor: the exterior-algebra functor applied to + the species-wise action on the fermionic generator space. -/ +noncomputable abbrev repJetGaugeGroupIFermion : + Representation ℂ JetGaugeGroupI (ExteriorAlgebra ℂ fieldData.FermionGenerators) := + fieldData.repJetFermion.exteriorAlgebra + +/-- The jet gauge action on the bosonic factor: the symmetric-algebra functor applied to + the species-wise action on the bosonic generator space. -/ +noncomputable abbrev repJetGaugeGroupIBoson : + Representation ℂ JetGaugeGroupI (SymmetricAlgebra ℂ fieldData.BosonGenerators) := + fieldData.repJetBoson.symmetricAlgebra + +/-- The jet gauge action on the jet algebra of the Standard Model. Matter is acted on + species by species from `fieldData`; the connection factor carries the generic affine + `GaugeJetAlgebra.complexRepJet` action of the Standard Model local gauge data. -/ noncomputable def repJetGaugeGroupI : Representation ℂ JetGaugeGroupI JetAlgebra := - (FermionJetAlgebra.repJetGaugeGroupI.tprod HiggsJetAlgebra.repJetGaugeGroupI).tprod - (GaugeJetAlgebra.complexRepJet localGaugeData) + (repJetGaugeGroupIFermion.tprod repJetGaugeGroupIBoson).tprod + (_root_.GaugeJetAlgebra.complexRepJet localGaugeData) @[simp] lemma repJetGaugeGroupI_tmul (U : JetGaugeGroupI) - (w : FermionJetAlgebra ⊗[ℂ] HiggsJetAlgebra) (g : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) : + (w : ExteriorAlgebra ℂ fieldData.FermionGenerators ⊗[ℂ] + SymmetricAlgebra ℂ fieldData.BosonGenerators) + (g : ℂ ⊗[ℝ] _root_.GaugeJetAlgebra GaugeAlgebra) : repJetGaugeGroupI U (w ⊗ₜ[ℂ] g) - = ((FermionJetAlgebra.repJetGaugeGroupI.tprod - HiggsJetAlgebra.repJetGaugeGroupI) U w) - ⊗ₜ[ℂ] ((GaugeJetAlgebra.complexRepJet localGaugeData) U g) := rfl + = ((repJetGaugeGroupIFermion.tprod repJetGaugeGroupIBoson) U w) + ⊗ₜ[ℂ] (_root_.GaugeJetAlgebra.complexRepJet localGaugeData U g) := rfl /-! @@ -80,32 +106,113 @@ 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.complexRepJet_apply_mul U x y + (fun V a b => Representation.exteriorAlgebra_apply_mul _ V a b) + (fun V a b => Representation.symmetricAlgebra_apply_mul _ V a b)) + (fun V a b => _root_.GaugeJetAlgebra.complexRepJet_apply_mul (jets := localGaugeData) + V a b) U x y /-! -### A.2. The action on the gauge sector +### A.2. The action on the three factors -/ -/-- The jet gauge action restricts to the gauge sector's own action. -/ +/-- The jet gauge action on the complexified gauge sector fixes the unit. -/ +lemma complexRepJetGaugeGroupI_apply_one (U : JetGaugeGroupI) : + (_root_.GaugeJetAlgebra.complexRepJet localGaugeData) U + (1 : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) = 1 := by + rw [Algebra.TensorProduct.one_def, _root_.GaugeJetAlgebra.complexRepJet_tmul, + _root_.GaugeJetAlgebra.repJet_apply_one] + +/-- The matter factor of the jet gauge action fixes the unit. The proof instantiates the + abstract `Representation.tprod_apply_one`, so that the unit of the matter factor is never + unfolded: its two free algebras are quotients by congruences. -/ +lemma repJetGaugeGroupI_matter_one (U : JetGaugeGroupI) : + (repJetGaugeGroupIFermion.tprod repJetGaugeGroupIBoson) U + (1 : fieldData.MatterAlgebra) = 1 := + Representation.tprod_apply_one _ _ U + (Representation.exteriorAlgebra_apply_one _ U) + (Representation.symmetricAlgebra_apply_one _ U) + +/-- The jet gauge action restricts to the generic connection factor, where it is the + generic affine action of the Standard Model local gauge data. -/ +lemma repJetGaugeGroupI_includeConnection (U : JetGaugeGroupI) + (y : ℂ ⊗[ℝ] _root_.GaugeJetAlgebra GaugeAlgebra) : + repJetGaugeGroupI U (fieldData.includeConnection y) + = fieldData.includeConnection + (_root_.GaugeJetAlgebra.complexRepJet localGaugeData U y) := + (congrArg (repJetGaugeGroupI U) (GaugeFieldData.includeConnection_apply y)).trans + ((Representation.tprod_apply_one_tmul _ _ U (repJetGaugeGroupI_matter_one U) y).trans + (GaugeFieldData.includeConnection_apply + (_root_.GaugeJetAlgebra.complexRepJet localGaugeData U y)).symm) + +/-- The jet gauge action restricts to the fermionic factor, where it is the + exterior-algebra functor applied to the species-wise action of the datum. The factor + inclusions are unfolded through the generic `GaugeFieldData` rules rather than by `rfl`: + at the Standard Model datum the definitional unfolding of the units has to see through + the unexposed ring congruence of the symmetric algebra. -/ +lemma repJetGaugeGroupI_includeFermionFactor (U : JetGaugeGroupI) + (a : ExteriorAlgebra ℂ fieldData.FermionGenerators) : + repJetGaugeGroupI U (fieldData.includeFermion a) + = fieldData.includeFermion (repJetGaugeGroupIFermion U a) := + (congrArg (repJetGaugeGroupI U) (GaugeFieldData.includeFermion_apply a)).trans + ((Representation.tprod_apply_tmul_one _ _ U _ + (complexRepJetGaugeGroupI_apply_one U)).trans + ((congrArg (fun w : fieldData.MatterAlgebra => + ((w ⊗ₜ[ℂ] (1 : ℂ ⊗[ℝ] _root_.GaugeJetAlgebra GaugeAlgebra)) : JetAlgebra)) + (Representation.tprod_apply_tmul_one _ _ U a + (Representation.symmetricAlgebra_apply_one _ U))).trans + (GaugeFieldData.includeFermion_apply (repJetGaugeGroupIFermion U a)).symm)) + +/-- The jet gauge action restricts to the bosonic factor, where it is the + symmetric-algebra functor applied to the species-wise action of the datum. -/ +lemma repJetGaugeGroupI_includeBosonFactor (U : JetGaugeGroupI) + (b : SymmetricAlgebra ℂ fieldData.BosonGenerators) : + repJetGaugeGroupI U (fieldData.includeBoson b) + = fieldData.includeBoson (repJetGaugeGroupIBoson U b) := + (congrArg (repJetGaugeGroupI U) (GaugeFieldData.includeBoson_apply b)).trans + ((Representation.tprod_apply_tmul_one _ _ U _ + (complexRepJetGaugeGroupI_apply_one U)).trans + ((congrArg (fun w : fieldData.MatterAlgebra => + ((w ⊗ₜ[ℂ] (1 : ℂ ⊗[ℝ] _root_.GaugeJetAlgebra GaugeAlgebra)) : JetAlgebra)) + (Representation.tprod_apply_one_tmul _ _ U + (Representation.exteriorAlgebra_apply_one _ U) b)).trans + (GaugeFieldData.includeBoson_apply (repJetGaugeGroupIBoson U b)).symm)) + +/-! + +### A.3. The action on the three sectors + +The two matter sector inclusions factor through the sector equivalences, which intertwine +the two presentations of the jet gauge action by section C of +`Physlib.Particles.StandardModel.JetAlgebra.SectorEquiv.Structure`; so the action restricts +to each sector's own action under its existing name. + +-/ + +/-- The jet gauge action restricts to the gauge sector's own action. The gauge sector + inclusion is the connection inclusion of the datum, the Standard Model gauge bosons being + the generic ones at `GaugeAlgebra`. -/ lemma repJetGaugeGroupI_includeGauge (U : JetGaugeGroupI) (y : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) : repJetGaugeGroupI U (includeGauge y) - = includeGauge ((GaugeJetAlgebra.complexRepJet localGaugeData) 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] + = includeGauge (_root_.GaugeJetAlgebra.complexRepJet localGaugeData U y) := + repJetGaugeGroupI_includeConnection U y + +/-- The jet gauge action restricts to the fermionic sector's own action. -/ +lemma repJetGaugeGroupI_includeFermion (U : JetGaugeGroupI) (f : FermionJetAlgebra) : + repJetGaugeGroupI U (includeFermion f) + = includeFermion (FermionJetAlgebra.repJetGaugeGroupI U f) := + (repJetGaugeGroupI_includeFermionFactor U (fermionAlgebraEquiv f)).trans + (congrArg fieldData.includeFermion + (fermionAlgebraEquiv_repJetGaugeGroupI U f).symm) + +/-- The jet gauge action restricts to the Higgs sector's own action. -/ +lemma repJetGaugeGroupI_includeHiggs (U : JetGaugeGroupI) (h : HiggsJetAlgebra) : + repJetGaugeGroupI U (includeHiggs h) + = includeHiggs (HiggsJetAlgebra.repJetGaugeGroupI U h) := + (repJetGaugeGroupI_includeBosonFactor U (higgsAlgebraEquiv h)).trans + (congrArg fieldData.includeBoson (higgsAlgebraEquiv_repJetGaugeGroupI U h).symm) end JetAlgebra diff --git a/Physlib/Particles/StandardModel/JetAlgebra/Generators.lean b/Physlib/Particles/StandardModel/JetAlgebra/Generators.lean index fa0579a9f..1019b04ad 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/Generators.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/Generators.lean @@ -45,6 +45,8 @@ because they are degree-one elements of an exterior algebra. - `JetAlgebra.MemHiggsSector.commute`, `MemHiggsSector.commute_of_memFermionSector` : the Higgs symbols commute with the Higgs and with the fermions. - `JetAlgebra.IsFermionGenerator.anticomm` : two fermion symbols anticommute. +- `JetAlgebra.leptonDoubletField_eq_ιFermion`, … : each named matter family is a generic + generator of the field datum. ## iii. Table of contents @@ -57,6 +59,7 @@ because they are degree-one elements of an exterior algebra. - C.1. The gauge symbols are central - C.2. The Higgs sector - C.3. The fermionic sector +- D. The generators of the field datum -/ @@ -104,11 +107,9 @@ noncomputable def conjHiggsField (s : Multiset (Fin 1 ⊕ Fin 3)) : space. -/ lemma higgsField_apply (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ HiggsVec) : higgsField s φ = includeHiggs (SymmetricAlgebra.ι ℂ _ - ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace HiggsVec)) := by - rw [higgsField, LinearMap.comp_apply, LinearMap.comp_apply, - show includeHiggs.toLinearMap (HiggsJetAlgebra.ofHiggs φ) - = includeHiggs (BosonicAlgebra.ofField φ) from rfl, - iteratedD_includeHiggs, BosonicAlgebra.iteratedJetDeriv_ofField] + ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace HiggsVec)) := + (iteratedD_includeHiggs s (HiggsJetAlgebra.ofHiggs φ)).trans + (congrArg includeHiggs (BosonicAlgebra.iteratedJetDeriv_ofField s φ)) /-- A conjugate Higgs symbol is a single generator of the Higgs sector, included: the derivative label `s` sits in the derivative factor of the conjugate half of the component @@ -116,11 +117,9 @@ lemma higgsField_apply (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ Hi lemma conjHiggsField_apply (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule HiggsVec)) : conjHiggsField s φ = includeHiggs (SymmetricAlgebra.ι ℂ _ - ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace HiggsVec)) := by - rw [conjHiggsField, LinearMap.comp_apply, LinearMap.comp_apply, - show includeHiggs.toLinearMap (HiggsJetAlgebra.ofConjHiggs φ) - = includeHiggs (BosonicAlgebra.ofConjField φ) from rfl, - iteratedD_includeHiggs, BosonicAlgebra.iteratedJetDeriv_ofConjField] + ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace HiggsVec)) := + (iteratedD_includeHiggs s (HiggsJetAlgebra.ofConjHiggs φ)).trans + (congrArg includeHiggs (BosonicAlgebra.iteratedJetDeriv_ofConjField s φ)) /-! @@ -159,11 +158,9 @@ noncomputable def conjFermionSymbol (s : Multiset (Fin 1 ⊕ Fin 3)) : lemma fermionSymbol_apply (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ FermionSpace) : fermionSymbol s φ = includeFermion (ExteriorAlgebra.ι ℂ - ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace FermionSpace)) := by - rw [fermionSymbol, LinearMap.comp_apply, LinearMap.comp_apply, - show includeFermion.toLinearMap (FermionicAlgebra.ofField φ) - = includeFermion (FermionicAlgebra.ofField φ) from rfl, - iteratedD_includeFermion, FermionicAlgebra.iteratedJetDeriv_ofField] + ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace FermionSpace)) := + (iteratedD_includeFermion s (FermionicAlgebra.ofField φ)).trans + (congrArg includeFermion (FermionicAlgebra.iteratedJetDeriv_ofField s φ)) /-- A conjugate fermionic symbol is a single generator of the fermionic sector, included: the derivative label `s` sits in the derivative factor of the conjugate half of the @@ -171,11 +168,9 @@ lemma fermionSymbol_apply (s : Multiset (Fin 1 ⊕ Fin 3)) lemma conjFermionSymbol_apply (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule FermionSpace)) : conjFermionSymbol s φ = includeFermion (ExteriorAlgebra.ι ℂ - ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace FermionSpace)) := by - rw [conjFermionSymbol, LinearMap.comp_apply, LinearMap.comp_apply, - show includeFermion.toLinearMap (FermionicAlgebra.ofConjField φ) - = includeFermion (FermionicAlgebra.ofConjField φ) from rfl, - iteratedD_includeFermion, FermionicAlgebra.iteratedJetDeriv_ofConjField] + ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace FermionSpace)) := + (iteratedD_includeFermion s (FermionicAlgebra.ofConjField φ)).trans + (congrArg includeFermion (FermionicAlgebra.iteratedJetDeriv_ofConjField s φ)) /-! @@ -482,8 +477,8 @@ lemma MemHiggsSector.commute {x y : JetAlgebra} (hx : MemHiggsSector x) (hy : MemHiggsSector y) : Commute x y := by obtain ⟨h, rfl⟩ := hx obtain ⟨h', rfl⟩ := hy - show includeHiggs h * includeHiggs h' = includeHiggs h' * includeHiggs h - rw [← map_mul, ← map_mul, mul_comm] + exact (map_mul includeHiggs h h').symm.trans + ((congrArg includeHiggs (mul_comm h h')).trans (map_mul includeHiggs h' h)) /-- The right factor of a tensor product commutes with the left: the abstract statement, proved at abstract types so that it can be instantiated on the jet algebra without @@ -504,7 +499,14 @@ lemma MemHiggsSector.commute_of_memFermionSector {x y : JetAlgebra} (hx : MemHiggsSector x) (hy : MemFermionSector y) : Commute x y := by obtain ⟨h, rfl⟩ := hx obtain ⟨f, rfl⟩ := hy - exact tensor_left_comm_right (C := ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) f h + exact (congrArg₂ (fun a b : JetAlgebra => a * b) + (GaugeFieldData.includeBoson_apply (higgsAlgebraEquiv h)) + (GaugeFieldData.includeFermion_apply (fermionAlgebraEquiv f))).trans + ((tensor_left_comm_right (C := ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) + (fermionAlgebraEquiv f) (higgsAlgebraEquiv h)).trans + (congrArg₂ (fun a b : JetAlgebra => a * b) + (GaugeFieldData.includeFermion_apply (fermionAlgebraEquiv f)).symm + (GaugeFieldData.includeBoson_apply (higgsAlgebraEquiv h)).symm)) /-! @@ -531,7 +533,11 @@ lemma IsFermionGenerator.anticomm {x y : JetAlgebra} (hx : IsFermionGenerator x) (hy : IsFermionGenerator y) : x * y = -(y * x) := by obtain ⟨v, rfl⟩ := hx obtain ⟨w, rfl⟩ := hy - rw [← map_mul, FermionicAlgebra.ι_mul_ι_swap, map_neg, map_mul] + exact (map_mul includeFermion (ExteriorAlgebra.ι ℂ v) (ExteriorAlgebra.ι ℂ w)).symm.trans + ((congrArg includeFermion (FermionicAlgebra.ι_mul_ι_swap v w)).trans + ((map_neg includeFermion _).trans + (congrArg Neg.neg (map_mul includeFermion (ExteriorAlgebra.ι ℂ w) + (ExteriorAlgebra.ι ℂ v))))) /-- The symbols of the `i`-th generation lepton doublet are fermionic generators. -/ lemma isFermionGenerator_leptonDoubletField (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) @@ -593,6 +599,170 @@ lemma isFermionGenerator_conjDownSingletField (i : Fin 3) IsFermionGenerator (conjDownSingletField i s φ) := ⟨_, conjDownSingletField_apply i s φ⟩ +/-! + +## D. The generators of the field datum + +Every named family is a single included generator, by the reductions of sections A and B, +and each included generator is a generic generator of the field datum, by the sector +lemmas of `Physlib.Particles.StandardModel.JetAlgebra.Basic`. Composing the two computes +each family directly on `fieldData`: the species, the generation, the derivative label and +the conjugate half are all read off, with no comparison carrier in between. + +-/ +/-- The symbols `∂_s ψ_φ` of the `i`-th generation lepton doublet are the generators of that + species in the field datum. -/ +@[simp] +lemma leptonDoubletField_eq_ιFermion (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ LeptonDoublet) : + leptonDoubletField i s φ + = fieldData.ιFermion (.leptonDoublet i) + ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : + JetComponentSpace (fieldData.FermionValue (.leptonDoublet i))) := + ((leptonDoubletField_apply i s φ).trans (includeFermion_ι _)).trans + ((congrArg (fun w : fieldData.FermionGenerators => fieldData.ιFermionTotal w) + (fermionGeneratorsEquiv_symm_basis_tmul (.leptonDoublet i) s φ)).trans + (ιFermionTotal_inclFermion _ _)) + +/-- The conjugate symbols `∂_s ψ̄_φ` of the `i`-th generation lepton doublet are the conjugate + generators of that species in the field datum. -/ +@[simp] +lemma conjLeptonDoubletField_eq_ιFermion (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule LeptonDoublet)) : + conjLeptonDoubletField i s φ + = fieldData.ιFermion (.leptonDoublet i) + ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : + JetComponentSpace (fieldData.FermionValue (.leptonDoublet i))) := + ((conjLeptonDoubletField_apply i s φ).trans (includeFermion_ι _)).trans + ((congrArg (fun w : fieldData.FermionGenerators => fieldData.ιFermionTotal w) + (fermionGeneratorsEquiv_symm_basis_tmul_conj (.leptonDoublet i) s φ)).trans + (ιFermionTotal_inclFermion _ _)) +/-- The symbols `∂_s ψ_φ` of the `i`-th generation charged-lepton singlet are the generators of that + species in the field datum. -/ +@[simp] +lemma leptonSingletField_eq_ιFermion (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ LeptonSinglet) : + leptonSingletField i s φ + = fieldData.ιFermion (.leptonSinglet i) + ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : + JetComponentSpace (fieldData.FermionValue (.leptonSinglet i))) := + ((leptonSingletField_apply i s φ).trans (includeFermion_ι _)).trans + ((congrArg (fun w : fieldData.FermionGenerators => fieldData.ιFermionTotal w) + (fermionGeneratorsEquiv_symm_basis_tmul (.leptonSinglet i) s φ)).trans + (ιFermionTotal_inclFermion _ _)) + +/-- The conjugate symbols `∂_s ψ̄_φ` of the `i`-th generation charged-lepton singlet are + the conjugate generators of that species in the field datum. -/ +@[simp] +lemma conjLeptonSingletField_eq_ιFermion (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule LeptonSinglet)) : + conjLeptonSingletField i s φ + = fieldData.ιFermion (.leptonSinglet i) + ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : + JetComponentSpace (fieldData.FermionValue (.leptonSinglet i))) := + ((conjLeptonSingletField_apply i s φ).trans (includeFermion_ι _)).trans + ((congrArg (fun w : fieldData.FermionGenerators => fieldData.ιFermionTotal w) + (fermionGeneratorsEquiv_symm_basis_tmul_conj (.leptonSinglet i) s φ)).trans + (ιFermionTotal_inclFermion _ _)) +/-- The symbols `∂_s ψ_φ` of the `i`-th generation quark doublet are the generators of that + species in the field datum. -/ +@[simp] +lemma quarkDoubletField_eq_ιFermion (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ QuarkDoublet) : + quarkDoubletField i s φ + = fieldData.ιFermion (.quarkDoublet i) + ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : + JetComponentSpace (fieldData.FermionValue (.quarkDoublet i))) := + ((quarkDoubletField_apply i s φ).trans (includeFermion_ι _)).trans + ((congrArg (fun w : fieldData.FermionGenerators => fieldData.ιFermionTotal w) + (fermionGeneratorsEquiv_symm_basis_tmul (.quarkDoublet i) s φ)).trans + (ιFermionTotal_inclFermion _ _)) + +/-- The conjugate symbols `∂_s ψ̄_φ` of the `i`-th generation quark doublet are the conjugate + generators of that species in the field datum. -/ +@[simp] +lemma conjQuarkDoubletField_eq_ιFermion (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) : + conjQuarkDoubletField i s φ + = fieldData.ιFermion (.quarkDoublet i) + ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : + JetComponentSpace (fieldData.FermionValue (.quarkDoublet i))) := + ((conjQuarkDoubletField_apply i s φ).trans (includeFermion_ι _)).trans + ((congrArg (fun w : fieldData.FermionGenerators => fieldData.ιFermionTotal w) + (fermionGeneratorsEquiv_symm_basis_tmul_conj (.quarkDoublet i) s φ)).trans + (ιFermionTotal_inclFermion _ _)) +/-- The symbols `∂_s ψ_φ` of the `i`-th generation up-type quark singlet are the generators of that + species in the field datum. -/ +@[simp] +lemma upSingletField_eq_ιFermion (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ UpSinglet) : + upSingletField i s φ + = fieldData.ιFermion (.upSinglet i) + ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : + JetComponentSpace (fieldData.FermionValue (.upSinglet i))) := + ((upSingletField_apply i s φ).trans (includeFermion_ι _)).trans + ((congrArg (fun w : fieldData.FermionGenerators => fieldData.ιFermionTotal w) + (fermionGeneratorsEquiv_symm_basis_tmul (.upSinglet i) s φ)).trans + (ιFermionTotal_inclFermion _ _)) + +/-- The conjugate symbols `∂_s ψ̄_φ` of the `i`-th generation up-type quark singlet are + the conjugate generators of that species in the field datum. -/ +@[simp] +lemma conjUpSingletField_eq_ιFermion (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule UpSinglet)) : + conjUpSingletField i s φ + = fieldData.ιFermion (.upSinglet i) + ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : + JetComponentSpace (fieldData.FermionValue (.upSinglet i))) := + ((conjUpSingletField_apply i s φ).trans (includeFermion_ι _)).trans + ((congrArg (fun w : fieldData.FermionGenerators => fieldData.ιFermionTotal w) + (fermionGeneratorsEquiv_symm_basis_tmul_conj (.upSinglet i) s φ)).trans + (ιFermionTotal_inclFermion _ _)) +/-- The symbols `∂_s ψ_φ` of the `i`-th generation down-type quark singlet are the + generators of that species in the field datum. -/ +@[simp] +lemma downSingletField_eq_ιFermion (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ DownSinglet) : + downSingletField i s φ + = fieldData.ιFermion (.downSinglet i) + ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : + JetComponentSpace (fieldData.FermionValue (.downSinglet i))) := + ((downSingletField_apply i s φ).trans (includeFermion_ι _)).trans + ((congrArg (fun w : fieldData.FermionGenerators => fieldData.ιFermionTotal w) + (fermionGeneratorsEquiv_symm_basis_tmul (.downSinglet i) s φ)).trans + (ιFermionTotal_inclFermion _ _)) + +/-- The conjugate symbols `∂_s ψ̄_φ` of the `i`-th generation down-type quark singlet are + the conjugate generators of that species in the field datum. -/ +@[simp] +lemma conjDownSingletField_eq_ιFermion (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule DownSinglet)) : + conjDownSingletField i s φ + = fieldData.ιFermion (.downSinglet i) + ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : + JetComponentSpace (fieldData.FermionValue (.downSinglet i))) := + ((conjDownSingletField_apply i s φ).trans (includeFermion_ι _)).trans + ((congrArg (fun w : fieldData.FermionGenerators => fieldData.ιFermionTotal w) + (fermionGeneratorsEquiv_symm_basis_tmul_conj (.downSinglet i) s φ)).trans + (ιFermionTotal_inclFermion _ _)) +/-- The Higgs symbols `∂_s H_φ` are the generators of the one bosonic species. -/ +@[simp] +lemma higgsField_eq_ιBoson (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ HiggsVec) : + higgsField s φ + = fieldData.ιBoson () + ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace HiggsVec) := + (higgsField_apply s φ).trans (includeHiggs_ι _) + +/-- The conjugate Higgs symbols `∂_s H̄_φ` are the conjugate generators of the one bosonic + species. -/ +@[simp] +lemma conjHiggsField_eq_ιBoson (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule HiggsVec)) : + conjHiggsField s φ + = fieldData.ιBoson () + ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace HiggsVec) := + (conjHiggsField_apply s φ).trans (includeHiggs_ι _) + end JetAlgebra end StandardModel diff --git a/Physlib/Particles/StandardModel/JetAlgebra/Invariants.lean b/Physlib/Particles/StandardModel/JetAlgebra/Invariants.lean index 20053d4e9..2c1f3a2d2 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/Invariants.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/Invariants.lean @@ -32,6 +32,8 @@ derivatives. ## ii. Key results - `JetAlgebra.gaugeField` : the gauge-field generators inside the full jet algebra. +- `JetAlgebra.gaugeField_eq_ιConnection` : they are the connection generators of the field + datum. - `JetAlgebra.gaugeRealization` : the jet algebra of the Standard Model realizes the gauge-boson jet algebra. - `JetAlgebra.invariant_mem_adjoin_fieldStrength` : the classification of gauge @@ -41,8 +43,7 @@ derivatives. - 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 + - A.2. Centrality - B. The gauge realization - C. The classification of gauge invariants @@ -74,44 +75,46 @@ open TensorProduct Matrix MatrixGroups -/ /-- The gauge-field derivative symbols of the jet algebra of the Standard Model: the - gauge sector's symbols, included into the full algebra. -/ + gauge sector's symbols, included into the full algebra. It is written as a composite of + two existing linear maps rather than as an anonymous constructor, so that its real + linearity is inherited rather than proved by rewriting inside the jet algebra. -/ noncomputable def gaugeField (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : - Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] JetAlgebra where - toFun φ := includeGauge ((GaugeJetAlgebra.gaugeField GaugeAlgebra) s μ φ) - map_add' φ ψ := by rw [map_add, map_add] - map_smul' r φ := by - rw [map_smul, ← algebraMap_smul ℂ r ((GaugeJetAlgebra.gaugeField GaugeAlgebra) s μ φ), map_smul, - algebraMap_smul, RingHom.id_apply] + Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] JetAlgebra := + (includeGauge.toLinearMap.restrictScalars ℝ).comp + ((GaugeJetAlgebra.gaugeField GaugeAlgebra) s μ) @[simp] lemma gaugeField_apply (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : gaugeField s μ φ = includeGauge ((GaugeJetAlgebra.gaugeField GaugeAlgebra) s μ φ) := 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 GaugeAlgebra)) : - Lorentz.iteratedD jetDeriv jetDeriv_comm s (includeGauge y) - = includeGauge (Lorentz.iteratedD (GaugeJetAlgebra.complexJetDeriv GaugeAlgebra) - 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] +/-- The gauge-field symbols `∂_s A_μ^φ` are the connection generators of the field datum: + the derivative label, the spacetime index and the adjoint covector are unchanged, and the + real generator enters the complexification with the scalar one. -/ +@[simp] +lemma gaugeField_eq_ιConnection (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra) : + gaugeField s μ φ + = fieldData.ιConnection (DerivAlgebraReal.basisMultiset s ⊗ₜ[ℝ] + GaugeBoson.componentDual GaugeAlgebra + (Lorentz.CoVector.basis.dualBasis μ) φ) := by + have hsector : (GaugeJetAlgebra.gaugeField GaugeAlgebra) s μ φ + = (1 : ℂ) ⊗ₜ[ℝ] SymmetricAlgebra.ι ℝ (GaugeBoson.JetComponentSpace GaugeAlgebra) + (DerivAlgebraReal.basisMultiset s ⊗ₜ[ℝ] + GaugeBoson.componentDual GaugeAlgebra + (Lorentz.CoVector.basis.dualBasis μ) φ) := + (GaugeJetAlgebra.gaugeField_apply s μ φ).trans + ((GaugeJetAlgebra.iteratedD_complexJetDeriv_one_tmul s + ((GaugeJetAlgebra.ofA GaugeAlgebra) μ φ)).trans + (congrArg (fun g : GaugeJetAlgebra GaugeAlgebra => (1 : ℂ) ⊗ₜ[ℝ] g) + (GaugeJetAlgebra.iteratedJetDeriv_ofA s μ φ))) + exact ((gaugeField_apply s μ φ).trans + (congrArg (fun y : ℂ ⊗[ℝ] GaugeJetAlgebra GaugeAlgebra => includeGauge y) hsector)).trans + (includeGauge_one_tmul_ι _) /-! -### A.3. Centrality +### A.2. Centrality -/ diff --git a/Physlib/Particles/StandardModel/JetAlgebra/JetDeriv.lean b/Physlib/Particles/StandardModel/JetAlgebra/JetDeriv.lean index 90eb04fba..6a68306cd 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/JetDeriv.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/JetDeriv.lean @@ -9,21 +9,24 @@ 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.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.JetDeriv -public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData /-! # 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 through each sector inclusion it -restricts to that sector's own derivative — for a single direction and for an iterated -multiset of directions alike. - -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. +total derivatives of its three factors, each acting on its own tensor factor. On the two +matter factors it is the free-algebra derivation extending the derivative shift +`∂_s ψ_α ↦ ∂_{s + {μ}} ψ_α` of the generator space of the field datum — an even derivation +of the exterior algebra on the fermionic side, an ordinary derivation of the symmetric +algebra on the bosonic side — and on the connection factor it is the generic gauge-boson +derivative. It obeys the Leibniz rule, its components commute, and through each sector +inclusion it restricts to that sector's own derivative, for a single direction and for an +iterated multiset of directions alike. + +The Leibniz rule and the commutation are assembled from the factor facts through abstract +lemmas proved at small types and instantiated, which keeps the proofs outside the full +tensor product. ## ii. Key results @@ -32,14 +35,16 @@ product is prohibitively slow. - `JetAlgebra.jetDeriv_comm` : the total derivatives commute. - `JetAlgebra.jetDeriv_includeGauge`, `jetDeriv_includeFermion`, `jetDeriv_includeHiggs` : the restrictions to the three sectors. -- `JetAlgebra.iteratedD_includeFermion`, `iteratedD_includeHiggs` : the same for the +- `JetAlgebra.iteratedD_includeFermion`, `iteratedD_includeHiggs`, + `iteratedD_includeGauge` : the same for the iterated derivative. ## iii. Table of contents - A. The formal total derivative - A.1. The action on pure tensors - - A.2. The action on the three sectors + - A.2. The action on the three factors + - A.3. The action on the three sectors - B. Derivations on tensor products - C. The Leibniz rule - D. Commutativity @@ -66,14 +71,29 @@ namespace JetAlgebra -/ +/-- The total derivative on the fermionic factor: the even derivation of the exterior + algebra extending the derivative shift on the fermionic generator space of the datum. -/ +noncomputable abbrev jetDerivFermionFactor (μ : Fin 1 ⊕ Fin 3) : + ExteriorAlgebra ℂ fieldData.FermionGenerators →ₗ[ℂ] + ExteriorAlgebra ℂ fieldData.FermionGenerators := + ExteriorAlgebra.derivationOfLinear (fieldData.jetDerivFermion μ) + +/-- The total derivative on the bosonic factor: the derivation of the symmetric algebra + extending the derivative shift on the bosonic generator space of the datum. -/ +noncomputable abbrev jetDerivBosonFactor (μ : Fin 1 ⊕ Fin 3) : + SymmetricAlgebra ℂ fieldData.BosonGenerators →ₗ[ℂ] + SymmetricAlgebra ℂ fieldData.BosonGenerators := + SymmetricAlgebra.derivationOfLinear (fieldData.jetDerivBoson μ) + /-- **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. -/ + the total derivatives of the three factors, each acting on its own factor. -/ noncomputable def jetDeriv (μ : Fin 1 ⊕ Fin 3) : JetAlgebra →ₗ[ℂ] JetAlgebra := - TensorProduct.map (TensorProduct.map (FermionicAlgebra.jetDeriv μ) LinearMap.id) + TensorProduct.map (TensorProduct.map (jetDerivFermionFactor μ) LinearMap.id) LinearMap.id - + TensorProduct.map (TensorProduct.map LinearMap.id (BosonicAlgebra.jetDeriv μ)) + + TensorProduct.map (TensorProduct.map LinearMap.id (jetDerivBosonFactor μ)) LinearMap.id - + TensorProduct.map LinearMap.id ((GaugeJetAlgebra.complexJetDeriv GaugeAlgebra) μ) + + TensorProduct.map LinearMap.id + (_root_.GaugeJetAlgebra.complexJetDeriv GaugeAlgebra μ) /-! @@ -81,71 +101,202 @@ noncomputable def jetDeriv (μ : Fin 1 ⊕ Fin 3) : JetAlgebra →ₗ[ℂ] JetAl -/ -lemma jetDeriv_tmul (μ : Fin 1 ⊕ Fin 3) (f : FermionJetAlgebra) (h : HiggsJetAlgebra) - (g : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) : +lemma jetDeriv_tmul (μ : Fin 1 ⊕ Fin 3) (f : ExteriorAlgebra ℂ fieldData.FermionGenerators) + (h : SymmetricAlgebra ℂ fieldData.BosonGenerators) + (g : ℂ ⊗[ℝ] _root_.GaugeJetAlgebra GaugeAlgebra) : jetDeriv μ ((f ⊗ₜ[ℂ] h) ⊗ₜ[ℂ] g) - = ((FermionicAlgebra.jetDeriv μ f) ⊗ₜ[ℂ] h) ⊗ₜ[ℂ] g - + (f ⊗ₜ[ℂ] (BosonicAlgebra.jetDeriv μ h)) ⊗ₜ[ℂ] g - + (f ⊗ₜ[ℂ] h) ⊗ₜ[ℂ] ((GaugeJetAlgebra.complexJetDeriv GaugeAlgebra) μ g) := rfl + = ((jetDerivFermionFactor μ f) ⊗ₜ[ℂ] h) ⊗ₜ[ℂ] g + + (f ⊗ₜ[ℂ] (jetDerivBosonFactor μ h)) ⊗ₜ[ℂ] g + + (f ⊗ₜ[ℂ] h) ⊗ₜ[ℂ] (_root_.GaugeJetAlgebra.complexJetDeriv GaugeAlgebra μ g) := + rfl /-! -### A.2. The action on the three sectors +### A.2. The action on the three factors -Each sector inclusion sends a sector element to a pure tensor whose other two factors are -`1`, and the total derivative annihilates `1` in every factor; so only the sector's own -derivative survives, and each inclusion intertwines the two derivatives. +Each factor inclusion sends a factor element to a pure tensor whose other two factors are +`1`, and the total derivative annihilates `1` in every factor; so only that factor's own +derivative survives. -/ -/-- The gauge sector's derivative annihilates the unit of the complexified gauge jet - algebra. -/ +/-- The three-factor derivation on a pure tensor, with the second and third derivatives + annihilating their entries. Like the assemblies of sections B–D it is proved at abstract + types and instantiated, so that the unit of a factor is never unfolded: the free algebras + are quotients by congruences. -/ +private lemma deriv₃_tmul_left {A B C : Type*} [AddCommGroup A] [Module ℂ A] + [AddCommGroup B] [Module ℂ B] [AddCommGroup C] [Module ℂ C] + (D : A →ₗ[ℂ] A) (E : B →ₗ[ℂ] B) (F : C →ₗ[ℂ] C) {b : B} {c : C} + (hE : E b = 0) (hF : F c = 0) (a : A) : + (TensorProduct.map (TensorProduct.map D (LinearMap.id (M := B))) + (LinearMap.id (M := C)) + + TensorProduct.map (TensorProduct.map (LinearMap.id (M := A)) E) + (LinearMap.id (M := C)) + + TensorProduct.map (LinearMap.id (M := A ⊗[ℂ] B)) F) ((a ⊗ₜ[ℂ] b) ⊗ₜ[ℂ] c) + = (D a ⊗ₜ[ℂ] b) ⊗ₜ[ℂ] c := by + simp [hE, hF] + +/-- The same with only the middle derivative surviving. -/ +private lemma deriv₃_tmul_mid {A B C : Type*} [AddCommGroup A] [Module ℂ A] + [AddCommGroup B] [Module ℂ B] [AddCommGroup C] [Module ℂ C] + (D : A →ₗ[ℂ] A) (E : B →ₗ[ℂ] B) (F : C →ₗ[ℂ] C) {a : A} {c : C} + (hD : D a = 0) (hF : F c = 0) (b : B) : + (TensorProduct.map (TensorProduct.map D (LinearMap.id (M := B))) + (LinearMap.id (M := C)) + + TensorProduct.map (TensorProduct.map (LinearMap.id (M := A)) E) + (LinearMap.id (M := C)) + + TensorProduct.map (LinearMap.id (M := A ⊗[ℂ] B)) F) ((a ⊗ₜ[ℂ] b) ⊗ₜ[ℂ] c) + = (a ⊗ₜ[ℂ] E b) ⊗ₜ[ℂ] c := by + simp [hD, hF] + +/-- The same with only the third derivative surviving. -/ +private lemma deriv₃_tmul_right {A B C : Type*} [AddCommGroup A] [Module ℂ A] + [AddCommGroup B] [Module ℂ B] [AddCommGroup C] [Module ℂ C] + (D : A →ₗ[ℂ] A) (E : B →ₗ[ℂ] B) (F : C →ₗ[ℂ] C) {a : A} {b : B} + (hD : D a = 0) (hE : E b = 0) (c : C) : + (TensorProduct.map (TensorProduct.map D (LinearMap.id (M := B))) + (LinearMap.id (M := C)) + + TensorProduct.map (TensorProduct.map (LinearMap.id (M := A)) E) + (LinearMap.id (M := C)) + + TensorProduct.map (LinearMap.id (M := A ⊗[ℂ] B)) F) ((a ⊗ₜ[ℂ] b) ⊗ₜ[ℂ] c) + = (a ⊗ₜ[ℂ] b) ⊗ₜ[ℂ] F c := by + simp [hD, hE] + +/-- Composition of two factorwise maps on the left factor, at abstract types. -/ +private lemma map_comp_map_left {A B : Type*} [AddCommGroup A] [Module ℂ A] + [AddCommGroup B] [Module ℂ B] (D D' : A →ₗ[ℂ] A) : + (TensorProduct.map D (LinearMap.id (M := B))).comp + (TensorProduct.map D' (LinearMap.id (M := B))) + = TensorProduct.map (D.comp D') (LinearMap.id (M := B)) := by + rw [← TensorProduct.map_comp, LinearMap.id_comp] + +/-- Composition of two factorwise maps on the right factor, at abstract types. -/ +private lemma map_comp_map_right {A B : Type*} [AddCommGroup A] [Module ℂ A] + [AddCommGroup B] [Module ℂ B] (D D' : B →ₗ[ℂ] B) : + (TensorProduct.map (LinearMap.id (M := A)) D).comp + (TensorProduct.map (LinearMap.id (M := A)) D') + = TensorProduct.map (LinearMap.id (M := A)) (D.comp D') := by + rw [← TensorProduct.map_comp, LinearMap.id_comp] + +/-- Maps on opposite factors commute, at abstract types. -/ +private lemma map_left_comm_map_right {A B : Type*} [AddCommGroup A] [Module ℂ A] + [AddCommGroup B] [Module ℂ B] (D : A →ₗ[ℂ] A) (D' : B →ₗ[ℂ] B) : + (TensorProduct.map D (LinearMap.id (M := B))).comp + (TensorProduct.map (LinearMap.id (M := A)) D') + = (TensorProduct.map (LinearMap.id (M := A)) D').comp + (TensorProduct.map D (LinearMap.id (M := B))) := by + rw [← TensorProduct.map_comp, ← TensorProduct.map_comp, LinearMap.id_comp, + LinearMap.id_comp, LinearMap.comp_id, LinearMap.comp_id] + +/-- A linear map intertwining two commuting families intertwines their iterates. + Proved at abstract types and instantiated in term mode, so that the induction never runs + inside the jet algebra. -/ +private lemma iteratedD_map {A B : Type} [Ring A] [Algebra ℂ A] [Ring B] [Algebra ℂ B] + (D : (Fin 1 ⊕ Fin 3) → A →ₗ[ℂ] A) + (hD : ∀ μ ν, (D μ).comp (D ν) = (D ν).comp (D μ)) + (E : (Fin 1 ⊕ Fin 3) → B →ₗ[ℂ] B) + (hE : ∀ μ ν, (E μ).comp (E ν) = (E ν).comp (E μ)) + (φ : A →ₗ[ℂ] B) (hφ : ∀ μ x, φ (D μ x) = E μ (φ x)) + (s : Multiset (Fin 1 ⊕ Fin 3)) (x : A) : + φ (Lorentz.iteratedD D hD s x) = Lorentz.iteratedD E hE s (φ x) := 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, hφ, ih] + +/-- The connection factor's derivative annihilates the unit of the complexified + gauge-boson jet algebra. -/ private lemma complexJetDeriv_one (μ : Fin 1 ⊕ Fin 3) : - (GaugeJetAlgebra.complexJetDeriv GaugeAlgebra) μ - (1 : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) = 0 := by - rw [show (1 : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) - = (1 : ℂ) ⊗ₜ[ℝ] (1 : (GaugeJetAlgebra GaugeAlgebra)) from rfl, - GaugeJetAlgebra.complexJetDeriv_tmul, GaugeJetAlgebra.jetDeriv_one, - TensorProduct.tmul_zero] + _root_.GaugeJetAlgebra.complexJetDeriv GaugeAlgebra μ + (1 : ℂ ⊗[ℝ] _root_.GaugeJetAlgebra GaugeAlgebra) = 0 := + (congrArg (_root_.GaugeJetAlgebra.complexJetDeriv GaugeAlgebra μ) + Algebra.TensorProduct.one_def).trans + ((_root_.GaugeJetAlgebra.complexJetDeriv_tmul μ 1 1).trans + ((congrArg (fun z : _root_.GaugeJetAlgebra GaugeAlgebra => (1 : ℂ) ⊗ₜ[ℝ] z) + (_root_.GaugeJetAlgebra.jetDeriv_one μ)).trans + (TensorProduct.tmul_zero _ _))) + +/-- The derivative acts on the fermionic factor through that factor's own derivation. The + factor inclusions are unfolded through the generic `GaugeFieldData` rules rather than by + `rfl`: at the Standard Model datum the definitional unfolding of the units has to see + through the unexposed ring congruence of the symmetric algebra. -/ +lemma jetDeriv_includeFermionFactor (μ : Fin 1 ⊕ Fin 3) + (f : ExteriorAlgebra ℂ fieldData.FermionGenerators) : + jetDeriv μ (fieldData.includeFermion f) + = fieldData.includeFermion (jetDerivFermionFactor μ f) := + (congrArg (jetDeriv μ) (GaugeFieldData.includeFermion_apply f)).trans + ((deriv₃_tmul_left _ _ _ (SymmetricAlgebra.derivationOfLinear_one _) + (complexJetDeriv_one μ) f).trans + (GaugeFieldData.includeFermion_apply (jetDerivFermionFactor μ f)).symm) + +/-- The derivative acts on the bosonic factor through that factor's own derivation. -/ +lemma jetDeriv_includeBosonFactor (μ : Fin 1 ⊕ Fin 3) + (h : SymmetricAlgebra ℂ fieldData.BosonGenerators) : + jetDeriv μ (fieldData.includeBoson h) + = fieldData.includeBoson (jetDerivBosonFactor μ h) := + (congrArg (jetDeriv μ) (GaugeFieldData.includeBoson_apply h)).trans + ((deriv₃_tmul_mid _ _ _ (ExteriorAlgebra.derivationOfLinear_one _) + (complexJetDeriv_one μ) h).trans + (GaugeFieldData.includeBoson_apply (jetDerivBosonFactor μ h)).symm) + +/-- The derivative acts on the connection factor through the generic gauge-boson + derivative. -/ +lemma jetDeriv_includeConnection (μ : Fin 1 ⊕ Fin 3) + (y : ℂ ⊗[ℝ] _root_.GaugeJetAlgebra GaugeAlgebra) : + jetDeriv μ (fieldData.includeConnection y) + = fieldData.includeConnection + (_root_.GaugeJetAlgebra.complexJetDeriv GaugeAlgebra μ y) := + (congrArg (jetDeriv μ) + ((GaugeFieldData.includeConnection_apply y).trans + (congrArg (fun w : fieldData.MatterAlgebra => w ⊗ₜ[ℂ] y) + GaugeFieldData.one_matterAlgebra))).trans + ((deriv₃_tmul_right _ _ _ (ExteriorAlgebra.derivationOfLinear_one _) + (SymmetricAlgebra.derivationOfLinear_one _) y).trans + ((congrArg + (fun w : fieldData.MatterAlgebra => + (w ⊗ₜ[ℂ] _root_.GaugeJetAlgebra.complexJetDeriv GaugeAlgebra μ y + : JetAlgebra)) + GaugeFieldData.one_matterAlgebra.symm).trans + (GaugeFieldData.includeConnection_apply + (_root_.GaugeJetAlgebra.complexJetDeriv GaugeAlgebra μ y)).symm)) + +/-! + +### A.3. The action on the three sectors + +The three sector inclusions factor through the sector equivalences, which are maps of differential algebras; so the derivative restricts to each +sector's own derivative under its existing name. + +-/ /-- The derivative acts on the fermionic sector through the fermionic sector's own derivative. -/ lemma jetDeriv_includeFermion (μ : Fin 1 ⊕ Fin 3) (f : FermionJetAlgebra) : - jetDeriv μ (includeFermion f) = includeFermion (FermionicAlgebra.jetDeriv μ f) := by - have hincl : ∀ x : FermionJetAlgebra, includeFermion x - = (x ⊗ₜ[ℂ] (1 : HiggsJetAlgebra)) ⊗ₜ[ℂ] (1 : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) := - fun _ => rfl - rw [hincl f, jetDeriv_tmul, - show BosonicAlgebra.jetDeriv (V := HiggsVec) μ (1 : HiggsJetAlgebra) = 0 from - BosonicAlgebra.jetDeriv_one μ, - complexJetDeriv_one, TensorProduct.tmul_zero, TensorProduct.zero_tmul, - TensorProduct.tmul_zero, add_zero, add_zero] - exact (hincl (FermionicAlgebra.jetDeriv μ f)).symm + jetDeriv μ (includeFermion f) = includeFermion (FermionicAlgebra.jetDeriv μ f) := + (congrArg (jetDeriv μ) (includeFermion_apply_equiv f)).trans + ((jetDeriv_includeFermionFactor μ (fermionAlgebraEquiv f)).trans + ((congrArg fieldData.includeFermion (fermionAlgebraEquiv_jetDeriv μ f).symm).trans + (includeFermion_apply_equiv (FermionicAlgebra.jetDeriv μ f)).symm)) /-- The derivative acts on the Higgs sector through the Higgs sector's own derivative. -/ lemma jetDeriv_includeHiggs (μ : Fin 1 ⊕ Fin 3) (h : HiggsJetAlgebra) : - jetDeriv μ (includeHiggs h) = includeHiggs (BosonicAlgebra.jetDeriv μ h) := by - have hincl : ∀ x : HiggsJetAlgebra, includeHiggs x - = ((1 : FermionJetAlgebra) ⊗ₜ[ℂ] x) ⊗ₜ[ℂ] (1 : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) := - fun _ => rfl - rw [hincl h, jetDeriv_tmul, - show FermionicAlgebra.jetDeriv (V := FermionSpace) μ (1 : FermionJetAlgebra) = 0 from - FermionicAlgebra.jetDeriv_one μ, - complexJetDeriv_one, TensorProduct.zero_tmul, TensorProduct.zero_tmul, - TensorProduct.tmul_zero, zero_add, add_zero] - exact (hincl (BosonicAlgebra.jetDeriv μ h)).symm - -/-- The derivative acts on the gauge sector through the gauge sector's own derivative. -/ -lemma jetDeriv_includeGauge (μ : Fin 1 ⊕ Fin 3) (y : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) : + jetDeriv μ (includeHiggs h) = includeHiggs (BosonicAlgebra.jetDeriv μ h) := + (congrArg (jetDeriv μ) (includeHiggs_apply_equiv h)).trans + ((jetDeriv_includeBosonFactor μ (higgsAlgebraEquiv h)).trans + ((congrArg fieldData.includeBoson (higgsAlgebraEquiv_jetDeriv μ h).symm).trans + (includeHiggs_apply_equiv (BosonicAlgebra.jetDeriv μ h)).symm)) + +/-- The derivative acts on the gauge sector through the gauge sector's own derivative. The + gauge sector inclusion is the connection inclusion of the datum, the Standard Model gauge + bosons being the generic ones at `GaugeAlgebra`. -/ +lemma jetDeriv_includeGauge (μ : Fin 1 ⊕ Fin 3) + (y : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) : jetDeriv μ (includeGauge y) - = includeGauge ((GaugeJetAlgebra.complexJetDeriv GaugeAlgebra) μ 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] + = includeGauge (_root_.GaugeJetAlgebra.complexJetDeriv GaugeAlgebra μ y) := + jetDeriv_includeConnection μ y /-! @@ -223,19 +374,20 @@ private lemma add₃_derivation {R : Type*} [NonUnitalNonAssocRing R] 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 GaugeAlgebra)) - (TensorProduct.map (FermionicAlgebra.jetDeriv μ) LinearMap.id) - (TensorProduct.map_derivation_left (FermionicAlgebra.jetDeriv μ) - (FermionicAlgebra.jetDeriv_mul μ)) x y + (B := ℂ ⊗[ℝ] _root_.GaugeJetAlgebra GaugeAlgebra) + (TensorProduct.map (jetDerivFermionFactor μ) LinearMap.id) + (TensorProduct.map_derivation_left (jetDerivFermionFactor μ) + (ExteriorAlgebra.derivationOfLinear_mul _)) x y have h₂ := TensorProduct.map_derivation_left - (B := ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) - (TensorProduct.map LinearMap.id (BosonicAlgebra.jetDeriv μ)) - (TensorProduct.map_derivation_right (BosonicAlgebra.jetDeriv μ) - (BosonicAlgebra.jetDeriv_mul μ)) x y + (B := ℂ ⊗[ℝ] _root_.GaugeJetAlgebra GaugeAlgebra) + (TensorProduct.map LinearMap.id (jetDerivBosonFactor μ)) + (TensorProduct.map_derivation_right (jetDerivBosonFactor μ) + (SymmetricAlgebra.derivationOfLinear_mul _)) x y have h₃ := TensorProduct.map_derivation_right - (A := FermionJetAlgebra ⊗[ℂ] HiggsJetAlgebra) - ((GaugeJetAlgebra.complexJetDeriv GaugeAlgebra) μ) - (GaugeJetAlgebra.complexJetDeriv_mul μ) x y + (A := ExteriorAlgebra ℂ fieldData.FermionGenerators ⊗[ℂ] + SymmetricAlgebra ℂ fieldData.BosonGenerators) + (_root_.GaugeJetAlgebra.complexJetDeriv GaugeAlgebra μ) + (_root_.GaugeJetAlgebra.complexJetDeriv_mul μ) x y exact add₃_derivation h₁ h₂ h₃ /-! @@ -262,70 +414,64 @@ private lemma add₃_comp_comm {M : Type*} [AddCommMonoid M] [Module ℂ M] /-- 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 GaugeAlgebra)))).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 GaugeAlgebra)) →ₗ[ℂ] - (ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)), - (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 GaugeAlgebra)) →ₗ[ℂ] (ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra))), - (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 hW := fun (D D' : fieldData.MatterAlgebra →ₗ[ℂ] fieldData.MatterAlgebra) => + map_comp_map_left (B := ℂ ⊗[ℝ] _root_.GaugeJetAlgebra GaugeAlgebra) D D' + have hG := fun (D D' : (ℂ ⊗[ℝ] _root_.GaugeJetAlgebra GaugeAlgebra) →ₗ[ℂ] + (ℂ ⊗[ℝ] _root_.GaugeJetAlgebra GaugeAlgebra)) => + map_comp_map_right (A := fieldData.MatterAlgebra) D D' + have hWG := fun (D : fieldData.MatterAlgebra →ₗ[ℂ] fieldData.MatterAlgebra) + (D' : (ℂ ⊗[ℝ] _root_.GaugeJetAlgebra GaugeAlgebra) →ₗ[ℂ] + (ℂ ⊗[ℝ] _root_.GaugeJetAlgebra GaugeAlgebra)) => + map_left_comm_map_right D D' + have hFH := fun (D : ExteriorAlgebra ℂ fieldData.FermionGenerators →ₗ[ℂ] + ExteriorAlgebra ℂ fieldData.FermionGenerators) + (D' : SymmetricAlgebra ℂ fieldData.BosonGenerators →ₗ[ℂ] + SymmetricAlgebra ℂ fieldData.BosonGenerators) => + map_left_comm_map_right D D' + have hFF := fun (D D' : ExteriorAlgebra ℂ fieldData.FermionGenerators →ₗ[ℂ] + ExteriorAlgebra ℂ fieldData.FermionGenerators) => + map_comp_map_left (B := SymmetricAlgebra ℂ fieldData.BosonGenerators) D D' + have hHH := fun (D D' : SymmetricAlgebra ℂ fieldData.BosonGenerators →ₗ[ℂ] + SymmetricAlgebra ℂ fieldData.BosonGenerators) => + map_comp_map_right (A := ExteriorAlgebra ℂ fieldData.FermionGenerators) D D' + have hfermion : (jetDerivFermionFactor μ).comp (jetDerivFermionFactor ν) + = (jetDerivFermionFactor ν).comp (jetDerivFermionFactor μ) := + LinearMap.ext fun z => ExteriorAlgebra.derivationOfLinear_comm_apply + (fieldData.jetDerivFermion_comm μ ν) z + have hboson : (jetDerivBosonFactor μ).comp (jetDerivBosonFactor ν) + = (jetDerivBosonFactor ν).comp (jetDerivBosonFactor μ) := + LinearMap.ext fun z => SymmetricAlgebra.derivationOfLinear_comm_apply + (fieldData.jetDerivBoson_comm μ ν) z have h11 := (hW _ _).trans ((congrArg (fun m => TensorProduct.map m - (LinearMap.id (M := ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)))) + (LinearMap.id (M := ℂ ⊗[ℝ] _root_.GaugeJetAlgebra GaugeAlgebra))) ((hFF _ _).trans - ((congrArg (fun d => TensorProduct.map d (LinearMap.id (M := HiggsJetAlgebra))) - (FermionicAlgebra.jetDeriv_comm μ ν)).trans (hFF _ _).symm))).trans + ((congrArg (fun d => TensorProduct.map d + (LinearMap.id (M := SymmetricAlgebra ℂ fieldData.BosonGenerators))) + hfermion).trans (hFF _ _).symm))).trans (hW _ _).symm) have h22 := (hW _ _).trans ((congrArg (fun m => TensorProduct.map m - (LinearMap.id (M := ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)))) + (LinearMap.id (M := ℂ ⊗[ℝ] _root_.GaugeJetAlgebra GaugeAlgebra))) ((hHH _ _).trans - ((congrArg (fun d => TensorProduct.map (LinearMap.id (M := FermionJetAlgebra)) d) - (BosonicAlgebra.jetDeriv_comm μ ν)).trans (hHH _ _).symm))).trans + ((congrArg (fun d => TensorProduct.map + (LinearMap.id (M := ExteriorAlgebra ℂ fieldData.FermionGenerators)) d) + hboson).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) + (LinearMap.id (M := ExteriorAlgebra ℂ fieldData.FermionGenerators ⊗[ℂ] + SymmetricAlgebra ℂ fieldData.BosonGenerators)) d) + (_root_.GaugeJetAlgebra.complexJetDeriv_comm μ ν)).trans (hG _ _).symm) have h12 := (hW _ _).trans ((congrArg (fun m => TensorProduct.map m - (LinearMap.id (M := ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)))) - (hFH (FermionicAlgebra.jetDeriv μ) (BosonicAlgebra.jetDeriv ν))).trans + (LinearMap.id (M := ℂ ⊗[ℝ] _root_.GaugeJetAlgebra GaugeAlgebra))) + (hFH (jetDerivFermionFactor μ) (jetDerivBosonFactor ν))).trans (hW _ _).symm) have h21 := (hW _ _).trans ((congrArg (fun m => TensorProduct.map m - (LinearMap.id (M := ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)))) - (hFH (FermionicAlgebra.jetDeriv ν) (BosonicAlgebra.jetDeriv μ)).symm).trans + (LinearMap.id (M := ℂ ⊗[ℝ] _root_.GaugeJetAlgebra GaugeAlgebra))) + (hFH (jetDerivFermionFactor ν) (jetDerivBosonFactor μ)).symm).trans (hW _ _).symm) exact add₃_comp_comm h11 h12 (hWG _ _) h21 h22 (hWG _ _) (hWG _ _).symm (hWG _ _).symm h33 @@ -334,7 +480,7 @@ lemma jetDeriv_comm (μ ν : Fin 1 ⊕ Fin 3) : ## E. The iterated derivative -Iterating the sector restrictions of section A.2 along a multiset of directions: the +Iterating the sector restrictions of section A.3 along a multiset of directions: the iterated total derivative restricts to the sector's own iterated derivative. These are the forms the generator families of each sector consume. @@ -345,26 +491,35 @@ forms the generator families of each sector consume. lemma iteratedD_includeFermion (s : Multiset (Fin 1 ⊕ Fin 3)) (f : FermionJetAlgebra) : Lorentz.iteratedD jetDeriv jetDeriv_comm s (includeFermion f) = includeFermion (FermionicAlgebra.iteratedJetDeriv s f) := by - induction s using Multiset.induction_on with - | empty => - rw [Lorentz.iteratedD_zero, FermionicAlgebra.iteratedJetDeriv_zero, - LinearMap.id_apply, LinearMap.id_apply] - | cons κ s ih => - rw [Lorentz.iteratedD_cons, FermionicAlgebra.iteratedJetDeriv_cons, - LinearMap.comp_apply, LinearMap.comp_apply, ih, jetDeriv_includeFermion] + have h := iteratedD_map (A := FermionJetAlgebra) (B := JetAlgebra) + FermionicAlgebra.jetDeriv FermionicAlgebra.jetDeriv_comm jetDeriv jetDeriv_comm + includeFermion.toLinearMap (fun μ x => (jetDeriv_includeFermion μ x).symm) s f + exact h.symm /-- The iterated total derivative acts on the Higgs sector through the Higgs sector's own iterated derivative. -/ lemma iteratedD_includeHiggs (s : Multiset (Fin 1 ⊕ Fin 3)) (h : HiggsJetAlgebra) : Lorentz.iteratedD jetDeriv jetDeriv_comm s (includeHiggs h) = includeHiggs (BosonicAlgebra.iteratedJetDeriv s h) := by - induction s using Multiset.induction_on with - | empty => - rw [Lorentz.iteratedD_zero, BosonicAlgebra.iteratedJetDeriv_zero, - LinearMap.id_apply, LinearMap.id_apply] - | cons κ s ih => - rw [Lorentz.iteratedD_cons, BosonicAlgebra.iteratedJetDeriv_cons, - LinearMap.comp_apply, LinearMap.comp_apply, ih, jetDeriv_includeHiggs] + have hmap := iteratedD_map (A := HiggsJetAlgebra) (B := JetAlgebra) + BosonicAlgebra.jetDeriv BosonicAlgebra.jetDeriv_comm jetDeriv jetDeriv_comm + includeHiggs.toLinearMap (fun μ x => (jetDeriv_includeHiggs μ x).symm) s h + exact hmap.symm + +/-- The iterated total derivative acts on the gauge sector through the gauge sector's own + iterated derivative. Like its two siblings this instantiates the abstract + `iteratedD_map` rather than running the induction inside the jet algebra. -/ +lemma iteratedD_includeGauge (s : Multiset (Fin 1 ⊕ Fin 3)) + (y : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) : + Lorentz.iteratedD jetDeriv jetDeriv_comm s (includeGauge y) + = includeGauge (Lorentz.iteratedD + (_root_.GaugeJetAlgebra.complexJetDeriv GaugeAlgebra) + _root_.GaugeJetAlgebra.complexJetDeriv_comm s y) := by + have hmap := iteratedD_map (A := ℂ ⊗[ℝ] _root_.GaugeJetAlgebra GaugeAlgebra) + (B := JetAlgebra) (_root_.GaugeJetAlgebra.complexJetDeriv GaugeAlgebra) + _root_.GaugeJetAlgebra.complexJetDeriv_comm jetDeriv jetDeriv_comm + includeGauge.toLinearMap (fun μ x => (jetDeriv_includeGauge μ x).symm) s y + exact hmap.symm end JetAlgebra diff --git a/Physlib/Particles/StandardModel/JetAlgebra/LorentzAction.lean b/Physlib/Particles/StandardModel/JetAlgebra/LorentzAction.lean index 4b1407c18..5dcc0727b 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/LorentzAction.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/LorentzAction.lean @@ -9,26 +9,34 @@ 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.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.LorentzAction +public import Physlib.Particles.StandardModel.JetAlgebra.SectorEquiv.Structure /-! # 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. +The Lorentz group acts on the jet algebra of the Standard Model factor by factor: on the +two matter factors by the free-algebra functor applied to the species-wise Lorentz action +on the generator spaces of the field datum, and on the connection factor by the generic +complexified gauge-boson action. 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 factor facts through an abstract +two-factor lemma proved at small types and instantiated, which keeps the proof outside the +full tensor product. On each free-algebra factor it comes from the +general covariance of the derivation extending a linear endomorphism, which is proved by +induction on the algebra: a derivation is not an algebra map, so extensionality of algebra +maps would not settle it. ## 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_includeGauge`, + `JetAlgebra.repLorentzGroup_includeFermion`, `JetAlgebra.repLorentzGroup_includeHiggs` : + the restriction to each of the three sectors. - `JetAlgebra.repLorentzGroup_jetDeriv`, `JetAlgebra.instIsLorentzDeriv` : the total derivative is a Lorentz vector. @@ -36,7 +44,8 @@ full tensor product is prohibitively slow. - A. The action of the Lorentz group - A.1. Multiplicativity - - A.2. The action on the gauge sector + - A.2. The action on the three factors + - A.3. The action on the three sectors - B. The total derivative is a Lorentz vector -/ @@ -60,18 +69,31 @@ namespace JetAlgebra -/ -/-- The Lorentz action on the jet algebra of the Standard Model: the three sectors +/-- The Lorentz action on the fermionic factor: the exterior-algebra functor applied to + the species-wise Lorentz action on the fermionic generator space. -/ +noncomputable abbrev repLorentzGroupFermion : + Representation ℂ SL(2,ℂ) (ExteriorAlgebra ℂ fieldData.FermionGenerators) := + fieldData.repLorentzFermion.exteriorAlgebra + +/-- The Lorentz action on the bosonic factor. -/ +noncomputable abbrev repLorentzGroupBoson : + Representation ℂ SL(2,ℂ) (SymmetricAlgebra ℂ fieldData.BosonGenerators) := + fieldData.repLorentzBoson.symmetricAlgebra + +/-- The Lorentz action on the jet algebra of the Standard Model: the three factors transform independently. -/ noncomputable def repLorentzGroup : Representation ℂ SL(2,ℂ) JetAlgebra := - (FermionJetAlgebra.repLorentzGroup.tprod HiggsJetAlgebra.repLorentzGroup).tprod - (GaugeJetAlgebra.complexRepLorentzGroup GaugeAlgebra) + (repLorentzGroupFermion.tprod repLorentzGroupBoson).tprod + (_root_.GaugeJetAlgebra.complexRepLorentzGroup GaugeAlgebra) @[simp] -lemma repLorentzGroup_tmul (Λ : SL(2,ℂ)) (w : FermionJetAlgebra ⊗[ℂ] HiggsJetAlgebra) - (g : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) : +lemma repLorentzGroup_tmul (Λ : SL(2,ℂ)) + (w : ExteriorAlgebra ℂ fieldData.FermionGenerators ⊗[ℂ] + SymmetricAlgebra ℂ fieldData.BosonGenerators) + (g : ℂ ⊗[ℝ] _root_.GaugeJetAlgebra GaugeAlgebra) : repLorentzGroup Λ (w ⊗ₜ[ℂ] g) - = ((FermionJetAlgebra.repLorentzGroup.tprod HiggsJetAlgebra.repLorentzGroup) Λ w) - ⊗ₜ[ℂ] ((GaugeJetAlgebra.complexRepLorentzGroup GaugeAlgebra) Λ g) := rfl + = ((repLorentzGroupFermion.tprod repLorentzGroupBoson) Λ w) + ⊗ₜ[ℂ] (_root_.GaugeJetAlgebra.complexRepLorentzGroup GaugeAlgebra Λ g) := rfl /-! @@ -84,30 +106,103 @@ 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 + (fun Λ' a b => Representation.exteriorAlgebra_apply_mul _ Λ' a b) + (fun Λ' a b => Representation.symmetricAlgebra_apply_mul _ Λ' a b)) + (fun Λ' a b => + _root_.GaugeJetAlgebra.complexRepLorentzGroup_apply_mul Λ' a b) Λ x y + +/-! + +### A.2. The action on the three factors + +-/ + +/-- The Lorentz action on the complexified gauge sector fixes the unit. -/ +lemma complexRepLorentzGroup_apply_one (Λ : SL(2,ℂ)) : + (_root_.GaugeJetAlgebra.complexRepLorentzGroup GaugeAlgebra) Λ + (1 : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) = 1 := by + rw [Algebra.TensorProduct.one_def, + _root_.GaugeJetAlgebra.complexRepLorentzGroup_tmul, + _root_.GaugeJetAlgebra.repLorentzGroup_apply_one] + +/-- The matter factor of the Lorentz action fixes the unit, by the same abstract + instantiation as in the gauge action. -/ +lemma repLorentzGroup_matter_one (Λ : SL(2,ℂ)) : + (repLorentzGroupFermion.tprod repLorentzGroupBoson) Λ + (1 : fieldData.MatterAlgebra) = 1 := + Representation.tprod_apply_one _ _ Λ + (Representation.exteriorAlgebra_apply_one _ Λ) + (Representation.symmetricAlgebra_apply_one _ Λ) + +/-- The Lorentz action restricts to the generic connection factor. -/ +lemma repLorentzGroup_includeConnection (Λ : SL(2,ℂ)) + (y : ℂ ⊗[ℝ] _root_.GaugeJetAlgebra GaugeAlgebra) : + repLorentzGroup Λ (fieldData.includeConnection y) + = fieldData.includeConnection + (_root_.GaugeJetAlgebra.complexRepLorentzGroup GaugeAlgebra Λ y) := + (congrArg (repLorentzGroup Λ) (GaugeFieldData.includeConnection_apply y)).trans + ((Representation.tprod_apply_one_tmul _ _ Λ (repLorentzGroup_matter_one Λ) y).trans + (GaugeFieldData.includeConnection_apply + (_root_.GaugeJetAlgebra.complexRepLorentzGroup GaugeAlgebra Λ y)).symm) + +/-- The Lorentz action restricts to the fermionic factor, where it is the + exterior-algebra functor applied to the species-wise action of the datum. -/ +lemma repLorentzGroup_includeFermionFactor (Λ : SL(2,ℂ)) + (a : ExteriorAlgebra ℂ fieldData.FermionGenerators) : + repLorentzGroup Λ (fieldData.includeFermion a) + = fieldData.includeFermion (repLorentzGroupFermion Λ a) := + (congrArg (repLorentzGroup Λ) (GaugeFieldData.includeFermion_apply a)).trans + ((Representation.tprod_apply_tmul_one _ _ Λ _ + (complexRepLorentzGroup_apply_one Λ)).trans + ((congrArg (fun w : fieldData.MatterAlgebra => + ((w ⊗ₜ[ℂ] (1 : ℂ ⊗[ℝ] _root_.GaugeJetAlgebra GaugeAlgebra)) : JetAlgebra)) + (Representation.tprod_apply_tmul_one _ _ Λ a + (Representation.symmetricAlgebra_apply_one _ Λ))).trans + (GaugeFieldData.includeFermion_apply (repLorentzGroupFermion Λ a)).symm)) + +/-- The Lorentz action restricts to the bosonic factor, where it is the + symmetric-algebra functor applied to the species-wise action of the datum. -/ +lemma repLorentzGroup_includeBosonFactor (Λ : SL(2,ℂ)) + (b : SymmetricAlgebra ℂ fieldData.BosonGenerators) : + repLorentzGroup Λ (fieldData.includeBoson b) + = fieldData.includeBoson (repLorentzGroupBoson Λ b) := + (congrArg (repLorentzGroup Λ) (GaugeFieldData.includeBoson_apply b)).trans + ((Representation.tprod_apply_tmul_one _ _ Λ _ + (complexRepLorentzGroup_apply_one Λ)).trans + ((congrArg (fun w : fieldData.MatterAlgebra => + ((w ⊗ₜ[ℂ] (1 : ℂ ⊗[ℝ] _root_.GaugeJetAlgebra GaugeAlgebra)) : JetAlgebra)) + (Representation.tprod_apply_one_tmul _ _ Λ + (Representation.exteriorAlgebra_apply_one _ Λ) b)).trans + (GaugeFieldData.includeBoson_apply (repLorentzGroupBoson Λ b)).symm)) /-! -### A.2. The action on the gauge sector +### A.3. The action on the three sectors -/ -/-- The Lorentz action restricts to the gauge sector's own action. -/ -lemma repLorentzGroup_includeGauge (Λ : SL(2,ℂ)) (y : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) : +/-- The Lorentz action restricts to the gauge sector's own action. The gauge sector + inclusion is the connection inclusion of the datum, the Standard Model gauge bosons being + the generic ones at `GaugeAlgebra`. -/ +lemma repLorentzGroup_includeGauge (Λ : SL(2,ℂ)) + (y : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) : repLorentzGroup Λ (includeGauge y) - = includeGauge ((GaugeJetAlgebra.complexRepLorentzGroup GaugeAlgebra) Λ 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] + = includeGauge (_root_.GaugeJetAlgebra.complexRepLorentzGroup GaugeAlgebra Λ y) := + repLorentzGroup_includeConnection Λ y + +/-- The Lorentz action restricts to the fermionic sector's own action. -/ +lemma repLorentzGroup_includeFermion (Λ : SL(2,ℂ)) (f : FermionJetAlgebra) : + repLorentzGroup Λ (includeFermion f) + = includeFermion (FermionJetAlgebra.repLorentzGroup Λ f) := + (repLorentzGroup_includeFermionFactor Λ (fermionAlgebraEquiv f)).trans + (congrArg fieldData.includeFermion (fermionAlgebraEquiv_repLorentzGroup Λ f).symm) + +/-- The Lorentz action restricts to the Higgs sector's own action. -/ +lemma repLorentzGroup_includeHiggs (Λ : SL(2,ℂ)) (h : HiggsJetAlgebra) : + repLorentzGroup Λ (includeHiggs h) + = includeHiggs (HiggsJetAlgebra.repLorentzGroup Λ h) := + (repLorentzGroup_includeBosonFactor Λ (higgsAlgebraEquiv h)).trans + (congrArg fieldData.includeBoson (higgsAlgebraEquiv_repLorentzGroup Λ h).symm) /-! @@ -156,32 +251,49 @@ lemma repLorentzGroup_jetDeriv (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) (x : JetA ∑ 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 GaugeAlgebra))) - + TensorProduct.map LinearMap.id ((GaugeJetAlgebra.complexJetDeriv GaugeAlgebra) ν) + (TensorProduct.map (jetDerivFermionFactor ν) LinearMap.id + + TensorProduct.map LinearMap.id (jetDerivBosonFactor ν)) + (LinearMap.id (M := ℂ ⊗[ℝ] _root_.GaugeJetAlgebra GaugeAlgebra)) + + TensorProduct.map LinearMap.id + (_root_.GaugeJetAlgebra.complexJetDeriv GaugeAlgebra ν) = jetDeriv ν := fun ν => congrArg (fun m => m + TensorProduct.map LinearMap.id - ((GaugeJetAlgebra.complexJetDeriv GaugeAlgebra) ν)) (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) + (_root_.GaugeJetAlgebra.complexJetDeriv GaugeAlgebra ν)) + (TensorProduct.map_add_left _ _ _) + -- The two factor covariances are stated without a type ascription: instantiating the + -- abstract lemma against an expected type leaves the family and the coefficients as + -- metavariables, and solving them at this carrier does not terminate. + have hFermion := fun (ν : Fin 1 ⊕ Fin 3) + (z : ExteriorAlgebra ℂ fieldData.FermionGenerators) => + ExteriorAlgebra.exteriorAlgebra_derivationOfLinear fieldData.repLorentzFermion Λ + (fun a => fieldData.jetDerivFermion a) ν + (fun a => (((Lorentz.SL2C.toLorentzGroup Λ).1 a ν : ℝ) : ℂ)) + (fun w => GaugeFieldData.repLorentzFermion_jetDerivFermion Λ ν w) z + have hBoson := fun (ν : Fin 1 ⊕ Fin 3) + (z : SymmetricAlgebra ℂ fieldData.BosonGenerators) => + SymmetricAlgebra.symmetricAlgebra_derivationOfLinear fieldData.repLorentzBoson Λ + (fun a => fieldData.jetDerivBoson a) ν + (fun a => (((Lorentz.SL2C.toLorentzGroup Λ).1 a ν : ℝ) : ℂ)) + (fun w => GaugeFieldData.repLorentzBoson_jetDerivBoson Λ ν w) z + have hFH : ∀ (ν : Fin 1 ⊕ Fin 3) (w : ExteriorAlgebra ℂ fieldData.FermionGenerators ⊗[ℂ] + SymmetricAlgebra ℂ fieldData.BosonGenerators), + (repLorentzGroupFermion.tprod repLorentzGroupBoson) Λ + ((TensorProduct.map (jetDerivFermionFactor ν) + (LinearMap.id (M := SymmetricAlgebra ℂ fieldData.BosonGenerators)) + + TensorProduct.map + (LinearMap.id (M := ExteriorAlgebra ℂ fieldData.FermionGenerators)) + (jetDerivBosonFactor ν)) 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 + (TensorProduct.map (jetDerivFermionFactor a) + (LinearMap.id (M := SymmetricAlgebra ℂ fieldData.BosonGenerators)) + + TensorProduct.map + (LinearMap.id (M := ExteriorAlgebra ℂ fieldData.FermionGenerators)) + (jetDerivBosonFactor a)) + ((repLorentzGroupFermion.tprod repLorentzGroupBoson) Λ w) := fun ν w => + tprod_deriv_sum _ _ _ _ _ Λ ν (fun κ z => hFermion κ z) (fun κ z => hBoson κ 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 + (fun κ z => _root_.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)) diff --git a/Physlib/Particles/StandardModel/JetAlgebra/MassWeightPoly.lean b/Physlib/Particles/StandardModel/JetAlgebra/MassWeightPoly.lean index 07933db5e..a3cceae9a 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/MassWeightPoly.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/MassWeightPoly.lean @@ -26,12 +26,15 @@ and computes it on every generating family. The assembly is two applications of the universal property of the tensor product of algebras. Each sector grading is first transported into `Polynomial JetAlgebra` along -`Polynomial.mapAlgHom` of that sector's inclusion; the two matter gradings are then lifted -over `FermionJetAlgebra ⊗[ℂ] HiggsJetAlgebra`, and that lift over the whole algebra. Both -lifts need a commutation side condition, and both reduce to the statistics already proved -in `Physlib.Particles.StandardModel.JetAlgebra.Generators`: two polynomials commute as soon -as their coefficients do, the Higgs sector commutes with the fermionic sector, and the -gauge sector is central. +`Polynomial.mapAlgHom` of that sector's inclusion; the two matter gradings are then read on +the two matter factors of the carrier through the sector equivalences of +`Physlib.Particles.StandardModel.JetAlgebra.SectorEquiv.Basic`, lifted over the matter +factor `GaugeFieldData.MatterAlgebra`, and that lift over the whole algebra. The connection +factor needs no equivalence, being the gauge sector itself. Both lifts need a commutation +side condition, and both reduce to the statistics already proved in +`Physlib.Particles.StandardModel.JetAlgebra.Generators`: two polynomials commute as soon as +their coefficients do, the Higgs sector commutes with the fermionic sector, and the gauge +sector is central. Because each sector's generator lemma has the shape `massWeightPoly g = monomial n g` — the generator *itself* as the coefficient — transporting it along `Polynomial.mapAlgHom` is a @@ -43,6 +46,8 @@ algebra is again a monomial eigenvector, of exactly the weight `AlgebraRealizati - `JetAlgebra.massWeightPoly` : the mass-weight grading on the jet algebra of the Standard Model. +- `JetAlgebra.fermionFactorMassWeightPoly`, `bosonFactorMassWeightPoly` : the two matter + sector gradings read on the two matter factors of the carrier. - `JetAlgebra.massWeightPoly_includeFermion`, `massWeightPoly_includeHiggs`, `massWeightPoly_includeGauge` : the grading restricted to each sector. - `JetAlgebra.massWeightPoly_higgsField`, `massWeightPoly_gaugeField`, @@ -154,17 +159,42 @@ noncomputable def gaugeMassWeightPoly : (ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) →ₐ[ℂ] Polynomial JetAlgebra := (Polynomial.mapAlgHom includeGauge).comp GaugeJetAlgebra.complexMassWeightPoly +/-- The fermionic grading read on the fermionic factor of the carrier: the fermionic sector + grading, precomposed with the sector equivalence. The sector helper above keeps its own + domain, the fermionic sector algebra; this is the map the carrier's factor needs. -/ +noncomputable def fermionFactorMassWeightPoly : + ExteriorAlgebra ℂ fieldData.FermionGenerators →ₐ[ℂ] Polynomial JetAlgebra := + fermionMassWeightPoly.comp fermionAlgebraEquiv.symm.toAlgHom + +/-- The Higgs grading read on the bosonic factor of the carrier. -/ +noncomputable def bosonFactorMassWeightPoly : + SymmetricAlgebra ℂ fieldData.BosonGenerators →ₐ[ℂ] Polynomial JetAlgebra := + higgsMassWeightPoly.comp higgsAlgebraEquiv.symm.toAlgHom + +lemma fermionFactorMassWeightPoly_apply (a : ExteriorAlgebra ℂ fieldData.FermionGenerators) : + fermionFactorMassWeightPoly a + = Polynomial.mapAlgHom includeFermion + (FermionicAlgebra.massWeightPoly 3 (fermionAlgebraEquiv.symm a)) := rfl + +lemma bosonFactorMassWeightPoly_apply (b : SymmetricAlgebra ℂ fieldData.BosonGenerators) : + bosonFactorMassWeightPoly b + = Polynomial.mapAlgHom includeHiggs + (BosonicAlgebra.massWeightPoly 2 (higgsAlgebraEquiv.symm b)) := rfl + /-- The mass-weight grading on the matter factor of the jet algebra: the fermionic and - Higgs gradings, lifted over their tensor product. The side condition is that the two - images commute, which they do because the Higgs sector commutes with the fermionic - sector. -/ + Higgs gradings, lifted over the tensor product of the two matter factors of the carrier. + The side condition is that the two images commute, which they do because the Higgs sector + commutes with the fermionic sector. -/ noncomputable def matterMassWeightPoly : - (FermionJetAlgebra ⊗[ℂ] HiggsJetAlgebra) →ₐ[ℂ] Polynomial JetAlgebra := - Algebra.TensorProduct.lift (R := ℂ) (S := ℂ) (A := FermionJetAlgebra) - (B := HiggsJetAlgebra) (C := Polynomial JetAlgebra) - fermionMassWeightPoly higgsMassWeightPoly fun _ _ => - commute_mapAlgHom _ _ (fun a b => - (MemHiggsSector.commute_of_memFermionSector ⟨b, rfl⟩ ⟨a, rfl⟩).symm) _ _ + fieldData.MatterAlgebra →ₐ[ℂ] Polynomial JetAlgebra := + Algebra.TensorProduct.lift (R := ℂ) (S := ℂ) + (A := ExteriorAlgebra ℂ fieldData.FermionGenerators) + (B := SymmetricAlgebra ℂ fieldData.BosonGenerators) (C := Polynomial JetAlgebra) + fermionFactorMassWeightPoly bosonFactorMassWeightPoly fun a b => + commute_mapAlgHom includeFermion includeHiggs + (fun x y => (MemHiggsSector.commute_of_memFermionSector ⟨y, rfl⟩ ⟨x, rfl⟩).symm) + (FermionicAlgebra.massWeightPoly 3 (fermionAlgebraEquiv.symm a)) + (BosonicAlgebra.massWeightPoly 2 (higgsAlgebraEquiv.symm b)) /-- The mass-weight polynomial on the jet algebra of the Standard Model: the `ℂ`-algebra map sending a generator of mass weight `n` to `X ^ n` times itself, so that the @@ -173,7 +203,7 @@ noncomputable def matterMassWeightPoly : outer lift being the centrality of the gauge sector. -/ noncomputable def massWeightPoly : JetAlgebra →ₐ[ℂ] Polynomial JetAlgebra := Algebra.TensorProduct.lift (R := ℂ) (S := ℂ) - (A := FermionJetAlgebra ⊗[ℂ] HiggsJetAlgebra) (B := ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) + (A := fieldData.MatterAlgebra) (B := ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) (C := Polynomial JetAlgebra) matterMassWeightPoly gaugeMassWeightPoly fun _ _ => commute_mapAlgHom_includeGauge _ _ @@ -189,46 +219,89 @@ generator computation below is one of them followed by a sector generator lemma. -/ /-- On a pure tensor the grading is the product of the matter and gauge gradings. -/ -lemma massWeightPoly_tmul (x : FermionJetAlgebra ⊗[ℂ] HiggsJetAlgebra) +lemma massWeightPoly_tmul (x : fieldData.MatterAlgebra) (y : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) : massWeightPoly (x ⊗ₜ[ℂ] y) = matterMassWeightPoly x * gaugeMassWeightPoly y := rfl -/-- On a pure tensor the matter grading is the product of the fermionic and Higgs +/-- On a pure tensor the matter grading is the product of the fermionic and bosonic factor gradings. -/ -lemma matterMassWeightPoly_tmul (a : FermionJetAlgebra) (h : HiggsJetAlgebra) : - matterMassWeightPoly (a ⊗ₜ[ℂ] h) = fermionMassWeightPoly a * higgsMassWeightPoly h := - rfl +lemma matterMassWeightPoly_tmul (a : ExteriorAlgebra ℂ fieldData.FermionGenerators) + (b : SymmetricAlgebra ℂ fieldData.BosonGenerators) : + matterMassWeightPoly (a ⊗ₜ[ℂ] b) + = fermionFactorMassWeightPoly a * bosonFactorMassWeightPoly b := rfl + +/-- On the fermionic factor the grading is that factor's own grading. Like every step + below it is written as an equation chain, which never abstracts a pattern out of a goal + mentioning the jet algebra. -/ +lemma massWeightPoly_includeFermionFactor + (a : ExteriorAlgebra ℂ fieldData.FermionGenerators) : + massWeightPoly (fieldData.includeFermion a) = fermionFactorMassWeightPoly a := + (congrArg massWeightPoly (GaugeFieldData.includeFermion_apply a)).trans + ((massWeightPoly_tmul _ _).trans + ((congrArg₂ (fun p q : Polynomial JetAlgebra => p * q) + ((matterMassWeightPoly_tmul a 1).trans + (congrArg (fun q : Polynomial JetAlgebra => + fermionFactorMassWeightPoly a * q) + (map_one bosonFactorMassWeightPoly))) + (map_one gaugeMassWeightPoly)).trans + ((mul_one _).trans (mul_one _)))) + +/-- On the bosonic factor the grading is that factor's own grading. -/ +lemma massWeightPoly_includeBosonFactor + (b : SymmetricAlgebra ℂ fieldData.BosonGenerators) : + massWeightPoly (fieldData.includeBoson b) = bosonFactorMassWeightPoly b := + (congrArg massWeightPoly (GaugeFieldData.includeBoson_apply b)).trans + ((massWeightPoly_tmul _ _).trans + ((congrArg₂ (fun p q : Polynomial JetAlgebra => p * q) + ((matterMassWeightPoly_tmul 1 b).trans + (congrArg (fun q : Polynomial JetAlgebra => + q * bosonFactorMassWeightPoly b) + (map_one fermionFactorMassWeightPoly))) + (map_one gaugeMassWeightPoly)).trans + ((mul_one _).trans (one_mul _)))) + +/-- On the connection factor the grading is the generic gauge-boson grading. -/ +lemma massWeightPoly_includeConnection (y : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) : + massWeightPoly (fieldData.includeConnection y) = gaugeMassWeightPoly y := + (congrArg massWeightPoly (GaugeFieldData.includeConnection_apply y)).trans + ((massWeightPoly_tmul _ _).trans + ((congrArg (fun p : Polynomial JetAlgebra => p * gaugeMassWeightPoly y) + (map_one matterMassWeightPoly)).trans (one_mul _))) /-- On the fermionic sector the grading is the fermionic sector's own grading, pushed forward along the fermionic inclusion. -/ lemma massWeightPoly_includeFermion (a : FermionJetAlgebra) : massWeightPoly (includeFermion a) - = Polynomial.mapAlgHom includeFermion (FermionicAlgebra.massWeightPoly 3 a) := by - rw [show includeFermion a = (a ⊗ₜ[ℂ] (1 : HiggsJetAlgebra)) ⊗ₜ[ℂ] - (1 : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) from rfl, massWeightPoly_tmul, - matterMassWeightPoly_tmul, map_one, map_one, mul_one, mul_one] - rfl + = Polynomial.mapAlgHom includeFermion (FermionicAlgebra.massWeightPoly 3 a) := + (massWeightPoly_includeFermionFactor (fermionAlgebraEquiv a)).trans + (congrArg (fun x : FermionJetAlgebra => + Polynomial.mapAlgHom includeFermion (FermionicAlgebra.massWeightPoly 3 x)) + (fermionAlgebraEquiv.symm_apply_apply a)) /-- On the Higgs sector the grading is the Higgs sector's own grading, pushed forward along the Higgs inclusion. -/ lemma massWeightPoly_includeHiggs (h : HiggsJetAlgebra) : massWeightPoly (includeHiggs h) - = Polynomial.mapAlgHom includeHiggs (BosonicAlgebra.massWeightPoly 2 h) := by - rw [show includeHiggs h = ((1 : FermionJetAlgebra) ⊗ₜ[ℂ] h) ⊗ₜ[ℂ] - (1 : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) from rfl, massWeightPoly_tmul, - matterMassWeightPoly_tmul, map_one, map_one, mul_one, one_mul] - rfl + = Polynomial.mapAlgHom includeHiggs (BosonicAlgebra.massWeightPoly 2 h) := + (massWeightPoly_includeBosonFactor (higgsAlgebraEquiv h)).trans + (congrArg (fun x : HiggsJetAlgebra => + Polynomial.mapAlgHom includeHiggs (BosonicAlgebra.massWeightPoly 2 x)) + (higgsAlgebraEquiv.symm_apply_apply h)) /-- On the gauge sector the grading is the gauge sector's own grading, pushed forward along - the gauge inclusion. -/ + the gauge inclusion. The gauge sector inclusion is the connection inclusion of the datum, + so there is nothing to transport here. -/ lemma massWeightPoly_includeGauge (y : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) : massWeightPoly (includeGauge y) - = Polynomial.mapAlgHom includeGauge (GaugeJetAlgebra.complexMassWeightPoly y) := by - rw [show includeGauge y = ((1 : FermionJetAlgebra) ⊗ₜ[ℂ] (1 : HiggsJetAlgebra)) - ⊗ₜ[ℂ] y from rfl, massWeightPoly_tmul, - show ((1 : FermionJetAlgebra) ⊗ₜ[ℂ] (1 : HiggsJetAlgebra)) - = (1 : FermionJetAlgebra ⊗[ℂ] HiggsJetAlgebra) from rfl, map_one, one_mul] - rfl + = Polynomial.mapAlgHom includeGauge (GaugeJetAlgebra.complexMassWeightPoly y) := + massWeightPoly_includeConnection y + +/-- The mass-weight exponent of a symbol of mass dimension one, in the two forms the + statements below use: `AlgebraRealization` asks for `2 * (1 + |s|)`, and each sector + grading produces `2 + 2 * |s|`. -/ +private lemma monomial_two_mul_one_add (n : ℕ) (x : JetAlgebra) : + Polynomial.monomial (2 + 2 * n) x = Polynomial.monomial (2 * (1 + n)) x := + congrArg (fun m => (Polynomial.monomial m) x) (by ring) /-! @@ -245,20 +318,32 @@ The Higgs field has mass dimension one, so the symbol `∂_s H_φ` has mass dime lemma massWeightPoly_higgsField (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ HiggsVec) : massWeightPoly (higgsField s φ) - = Polynomial.monomial (2 * (1 + Multiset.card s)) (higgsField s φ) := by - rw [show 2 * (1 + Multiset.card s) = 2 + 2 * Multiset.card s from by ring, - higgsField_apply, massWeightPoly_includeHiggs, BosonicAlgebra.massWeightPoly_ι, - BosonicAlgebra.jetComponentPoly_inl, Polynomial.mapAlgHom_monomial] + = Polynomial.monomial (2 * (1 + Multiset.card s)) (higgsField s φ) := + (congrArg massWeightPoly (higgsField_apply s φ)).trans + ((massWeightPoly_includeHiggs _).trans + ((congrArg (Polynomial.mapAlgHom includeHiggs) + ((BosonicAlgebra.massWeightPoly_ι 2 _).trans + (BosonicAlgebra.jetComponentPoly_inl 2 s φ))).trans + ((Polynomial.mapAlgHom_monomial includeHiggs _ _).trans + ((monomial_two_mul_one_add _ _).trans + (congrArg (Polynomial.monomial (2 * (1 + Multiset.card s))) + (higgsField_apply s φ).symm))))) /-- The conjugate Higgs symbol `∂_s H̄_φ` is a monomial eigenvector of the same mass weight `2 * (1 + |s|)` as the symbol it conjugates. -/ lemma massWeightPoly_conjHiggsField (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule HiggsVec)) : massWeightPoly (conjHiggsField s φ) - = Polynomial.monomial (2 * (1 + Multiset.card s)) (conjHiggsField s φ) := by - rw [show 2 * (1 + Multiset.card s) = 2 + 2 * Multiset.card s from by ring, - conjHiggsField_apply, massWeightPoly_includeHiggs, BosonicAlgebra.massWeightPoly_ι, - BosonicAlgebra.jetComponentPoly_inr, Polynomial.mapAlgHom_monomial] + = Polynomial.monomial (2 * (1 + Multiset.card s)) (conjHiggsField s φ) := + (congrArg massWeightPoly (conjHiggsField_apply s φ)).trans + ((massWeightPoly_includeHiggs _).trans + ((congrArg (Polynomial.mapAlgHom includeHiggs) + ((BosonicAlgebra.massWeightPoly_ι 2 _).trans + (BosonicAlgebra.jetComponentPoly_inr 2 s φ))).trans + ((Polynomial.mapAlgHom_monomial includeHiggs _ _).trans + ((monomial_two_mul_one_add _ _).trans + (congrArg (Polynomial.monomial (2 * (1 + Multiset.card s))) + (conjHiggsField_apply s φ).symm))))) /-! @@ -276,12 +361,22 @@ computation passes through the complexified grading of that sector. lemma massWeightPoly_gaugeField (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : massWeightPoly (gaugeField s μ φ) - = Polynomial.monomial (2 * (1 + Multiset.card s)) (gaugeField s μ φ) := by - rw [show 2 * (1 + Multiset.card s) = 2 + 2 * Multiset.card s from by ring, - gaugeField_apply, GaugeJetAlgebra.gaugeField_apply, - GaugeJetAlgebra.iteratedD_complexJetDeriv_one_tmul, massWeightPoly_includeGauge, - GaugeJetAlgebra.complexMassWeightPoly_tmul_iteratedJetDeriv_ofA, - Polynomial.mapAlgHom_monomial] + = Polynomial.monomial (2 * (1 + Multiset.card s)) (gaugeField s μ φ) := + have hg : gaugeField s μ φ + = includeGauge ((1 : ℂ) ⊗ₜ[ℝ] GaugeJetAlgebra.iteratedJetDeriv GaugeAlgebra s + (GaugeJetAlgebra.ofA GaugeAlgebra μ φ)) := + (gaugeField_apply s μ φ).trans + (congrArg includeGauge + (_root_.GaugeJetAlgebra.iteratedD_complexJetDeriv_one_tmul s + (_root_.GaugeJetAlgebra.ofA GaugeAlgebra μ φ))) + (congrArg massWeightPoly hg).trans + ((massWeightPoly_includeGauge _).trans + ((congrArg (Polynomial.mapAlgHom includeGauge) + (GaugeJetAlgebra.complexMassWeightPoly_tmul_iteratedJetDeriv_ofA + 1 s μ φ)).trans + ((Polynomial.mapAlgHom_monomial includeGauge _ _).trans + ((monomial_two_mul_one_add _ _).trans + (congrArg (Polynomial.monomial (2 * (1 + Multiset.card s))) hg.symm))))) /-! @@ -291,8 +386,8 @@ Every fermion of the Standard Model has mass dimension `3/2`, so a fermionic sym `∂_s ψ_φ` has mass dimension `3/2 + |s|` and mass weight `3 + 2 |s|` — the exponent form `AlgebraRealization` asks for. The computation is the same for all ten species families, because each of them reduces, by the lemmas of -`Physlib.Particles.StandardModel.JetAlgebra.Generators`, to a single included generator of -the fermionic sector. +`Physlib.Particles.StandardModel.JetAlgebra.Generators`, to a fermionic symbol on the total +target space; so section F.2 is ten instantiations of section F.1 and nothing more. -/ @@ -308,20 +403,30 @@ the fermionic sector. lemma massWeightPoly_fermionSymbol (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ FermionSpace) : massWeightPoly (fermionSymbol s φ) - = Polynomial.monomial (3 + 2 * Multiset.card s) (fermionSymbol s φ) := by - rw [fermionSymbol_apply, massWeightPoly_includeFermion, - FermionicAlgebra.massWeightPoly_ι, FermionicAlgebra.jetComponentPoly_inl, - Polynomial.mapAlgHom_monomial] + = Polynomial.monomial (3 + 2 * Multiset.card s) (fermionSymbol s φ) := + (congrArg massWeightPoly (fermionSymbol_apply s φ)).trans + ((massWeightPoly_includeFermion _).trans + ((congrArg (Polynomial.mapAlgHom includeFermion) + ((FermionicAlgebra.massWeightPoly_ι 3 _).trans + (FermionicAlgebra.jetComponentPoly_inl 3 s φ))).trans + ((Polynomial.mapAlgHom_monomial includeFermion _ _).trans + (congrArg (Polynomial.monomial (3 + 2 * Multiset.card s)) + (fermionSymbol_apply s φ).symm)))) /-- A conjugate fermionic symbol `∂_s ψ̄_φ` on the total fermionic target space is a monomial eigenvector of the same mass weight `3 + 2 |s|` as the symbol it conjugates. -/ lemma massWeightPoly_conjFermionSymbol (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule FermionSpace)) : massWeightPoly (conjFermionSymbol s φ) - = Polynomial.monomial (3 + 2 * Multiset.card s) (conjFermionSymbol s φ) := by - rw [conjFermionSymbol_apply, massWeightPoly_includeFermion, - FermionicAlgebra.massWeightPoly_ι, FermionicAlgebra.jetComponentPoly_inr, - Polynomial.mapAlgHom_monomial] + = Polynomial.monomial (3 + 2 * Multiset.card s) (conjFermionSymbol s φ) := + (congrArg massWeightPoly (conjFermionSymbol_apply s φ)).trans + ((massWeightPoly_includeFermion _).trans + ((congrArg (Polynomial.mapAlgHom includeFermion) + ((FermionicAlgebra.massWeightPoly_ι 3 _).trans + (FermionicAlgebra.jetComponentPoly_inr 3 s φ))).trans + ((Polynomial.mapAlgHom_monomial includeFermion _ _).trans + (congrArg (Polynomial.monomial (3 + 2 * Multiset.card s)) + (conjFermionSymbol_apply s φ).symm)))) /-! @@ -334,101 +439,110 @@ lemma massWeightPoly_conjFermionSymbol (s : Multiset (Fin 1 ⊕ Fin 3)) lemma massWeightPoly_leptonDoubletField (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ LeptonDoublet) : massWeightPoly (leptonDoubletField i s φ) - = Polynomial.monomial (3 + 2 * Multiset.card s) (leptonDoubletField i s φ) := by - rw [leptonDoubletField_apply, massWeightPoly_includeFermion, - FermionicAlgebra.massWeightPoly_ι, FermionicAlgebra.jetComponentPoly_inl, - Polynomial.mapAlgHom_monomial] + = Polynomial.monomial (3 + 2 * Multiset.card s) (leptonDoubletField i s φ) := + (congrArg massWeightPoly (leptonDoubletField_eq_fermionSymbol i s φ)).trans + ((massWeightPoly_fermionSymbol s _).trans + (congrArg (Polynomial.monomial (3 + 2 * Multiset.card s)) + (leptonDoubletField_eq_fermionSymbol i s φ).symm)) /-- The conjugate symbol `∂_s ψ̄_φ` of the `i`-th generation lepton doublet is a monomial eigenvector of mass weight `3 + 2 |s|`. -/ lemma massWeightPoly_conjLeptonDoubletField (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule LeptonDoublet)) : massWeightPoly (conjLeptonDoubletField i s φ) - = Polynomial.monomial (3 + 2 * Multiset.card s) (conjLeptonDoubletField i s φ) := by - rw [conjLeptonDoubletField_apply, massWeightPoly_includeFermion, - FermionicAlgebra.massWeightPoly_ι, FermionicAlgebra.jetComponentPoly_inr, - Polynomial.mapAlgHom_monomial] + = Polynomial.monomial (3 + 2 * Multiset.card s) (conjLeptonDoubletField i s φ) := + (congrArg massWeightPoly (conjLeptonDoubletField_eq_conjFermionSymbol i s φ)).trans + ((massWeightPoly_conjFermionSymbol s _).trans + (congrArg (Polynomial.monomial (3 + 2 * Multiset.card s)) + (conjLeptonDoubletField_eq_conjFermionSymbol i s φ).symm)) /-- The symbol `∂_s ψ_φ` of the `i`-th generation charged-lepton singlet is a monomial eigenvector of mass weight `3 + 2 |s|`. -/ lemma massWeightPoly_leptonSingletField (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ LeptonSinglet) : massWeightPoly (leptonSingletField i s φ) - = Polynomial.monomial (3 + 2 * Multiset.card s) (leptonSingletField i s φ) := by - rw [leptonSingletField_apply, massWeightPoly_includeFermion, - FermionicAlgebra.massWeightPoly_ι, FermionicAlgebra.jetComponentPoly_inl, - Polynomial.mapAlgHom_monomial] + = Polynomial.monomial (3 + 2 * Multiset.card s) (leptonSingletField i s φ) := + (congrArg massWeightPoly (leptonSingletField_eq_fermionSymbol i s φ)).trans + ((massWeightPoly_fermionSymbol s _).trans + (congrArg (Polynomial.monomial (3 + 2 * Multiset.card s)) + (leptonSingletField_eq_fermionSymbol i s φ).symm)) /-- The conjugate symbol `∂_s ψ̄_φ` of the `i`-th generation charged-lepton singlet is a monomial eigenvector of mass weight `3 + 2 |s|`. -/ lemma massWeightPoly_conjLeptonSingletField (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule LeptonSinglet)) : massWeightPoly (conjLeptonSingletField i s φ) - = Polynomial.monomial (3 + 2 * Multiset.card s) (conjLeptonSingletField i s φ) := by - rw [conjLeptonSingletField_apply, massWeightPoly_includeFermion, - FermionicAlgebra.massWeightPoly_ι, FermionicAlgebra.jetComponentPoly_inr, - Polynomial.mapAlgHom_monomial] + = Polynomial.monomial (3 + 2 * Multiset.card s) (conjLeptonSingletField i s φ) := + (congrArg massWeightPoly (conjLeptonSingletField_eq_conjFermionSymbol i s φ)).trans + ((massWeightPoly_conjFermionSymbol s _).trans + (congrArg (Polynomial.monomial (3 + 2 * Multiset.card s)) + (conjLeptonSingletField_eq_conjFermionSymbol i s φ).symm)) /-- The symbol `∂_s ψ_φ` of the `i`-th generation quark doublet is a monomial eigenvector of mass weight `3 + 2 |s|`. -/ lemma massWeightPoly_quarkDoubletField (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ QuarkDoublet) : massWeightPoly (quarkDoubletField i s φ) - = Polynomial.monomial (3 + 2 * Multiset.card s) (quarkDoubletField i s φ) := by - rw [quarkDoubletField_apply, massWeightPoly_includeFermion, - FermionicAlgebra.massWeightPoly_ι, FermionicAlgebra.jetComponentPoly_inl, - Polynomial.mapAlgHom_monomial] + = Polynomial.monomial (3 + 2 * Multiset.card s) (quarkDoubletField i s φ) := + (congrArg massWeightPoly (quarkDoubletField_eq_fermionSymbol i s φ)).trans + ((massWeightPoly_fermionSymbol s _).trans + (congrArg (Polynomial.monomial (3 + 2 * Multiset.card s)) + (quarkDoubletField_eq_fermionSymbol i s φ).symm)) /-- The conjugate symbol `∂_s ψ̄_φ` of the `i`-th generation quark doublet is a monomial eigenvector of mass weight `3 + 2 |s|`. -/ lemma massWeightPoly_conjQuarkDoubletField (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule QuarkDoublet)) : massWeightPoly (conjQuarkDoubletField i s φ) - = Polynomial.monomial (3 + 2 * Multiset.card s) (conjQuarkDoubletField i s φ) := by - rw [conjQuarkDoubletField_apply, massWeightPoly_includeFermion, - FermionicAlgebra.massWeightPoly_ι, FermionicAlgebra.jetComponentPoly_inr, - Polynomial.mapAlgHom_monomial] + = Polynomial.monomial (3 + 2 * Multiset.card s) (conjQuarkDoubletField i s φ) := + (congrArg massWeightPoly (conjQuarkDoubletField_eq_conjFermionSymbol i s φ)).trans + ((massWeightPoly_conjFermionSymbol s _).trans + (congrArg (Polynomial.monomial (3 + 2 * Multiset.card s)) + (conjQuarkDoubletField_eq_conjFermionSymbol i s φ).symm)) /-- The symbol `∂_s ψ_φ` of the `i`-th generation up-type quark singlet is a monomial eigenvector of mass weight `3 + 2 |s|`. -/ lemma massWeightPoly_upSingletField (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ UpSinglet) : massWeightPoly (upSingletField i s φ) - = Polynomial.monomial (3 + 2 * Multiset.card s) (upSingletField i s φ) := by - rw [upSingletField_apply, massWeightPoly_includeFermion, - FermionicAlgebra.massWeightPoly_ι, FermionicAlgebra.jetComponentPoly_inl, - Polynomial.mapAlgHom_monomial] + = Polynomial.monomial (3 + 2 * Multiset.card s) (upSingletField i s φ) := + (congrArg massWeightPoly (upSingletField_eq_fermionSymbol i s φ)).trans + ((massWeightPoly_fermionSymbol s _).trans + (congrArg (Polynomial.monomial (3 + 2 * Multiset.card s)) + (upSingletField_eq_fermionSymbol i s φ).symm)) /-- The conjugate symbol `∂_s ψ̄_φ` of the `i`-th generation up-type quark singlet is a monomial eigenvector of mass weight `3 + 2 |s|`. -/ lemma massWeightPoly_conjUpSingletField (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule UpSinglet)) : massWeightPoly (conjUpSingletField i s φ) - = Polynomial.monomial (3 + 2 * Multiset.card s) (conjUpSingletField i s φ) := by - rw [conjUpSingletField_apply, massWeightPoly_includeFermion, - FermionicAlgebra.massWeightPoly_ι, FermionicAlgebra.jetComponentPoly_inr, - Polynomial.mapAlgHom_monomial] + = Polynomial.monomial (3 + 2 * Multiset.card s) (conjUpSingletField i s φ) := + (congrArg massWeightPoly (conjUpSingletField_eq_conjFermionSymbol i s φ)).trans + ((massWeightPoly_conjFermionSymbol s _).trans + (congrArg (Polynomial.monomial (3 + 2 * Multiset.card s)) + (conjUpSingletField_eq_conjFermionSymbol i s φ).symm)) /-- The symbol `∂_s ψ_φ` of the `i`-th generation down-type quark singlet is a monomial eigenvector of mass weight `3 + 2 |s|`. -/ lemma massWeightPoly_downSingletField (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ DownSinglet) : massWeightPoly (downSingletField i s φ) - = Polynomial.monomial (3 + 2 * Multiset.card s) (downSingletField i s φ) := by - rw [downSingletField_apply, massWeightPoly_includeFermion, - FermionicAlgebra.massWeightPoly_ι, FermionicAlgebra.jetComponentPoly_inl, - Polynomial.mapAlgHom_monomial] + = Polynomial.monomial (3 + 2 * Multiset.card s) (downSingletField i s φ) := + (congrArg massWeightPoly (downSingletField_eq_fermionSymbol i s φ)).trans + ((massWeightPoly_fermionSymbol s _).trans + (congrArg (Polynomial.monomial (3 + 2 * Multiset.card s)) + (downSingletField_eq_fermionSymbol i s φ).symm)) /-- The conjugate symbol `∂_s ψ̄_φ` of the `i`-th generation down-type quark singlet is a monomial eigenvector of mass weight `3 + 2 |s|`. -/ lemma massWeightPoly_conjDownSingletField (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule DownSinglet)) : massWeightPoly (conjDownSingletField i s φ) - = Polynomial.monomial (3 + 2 * Multiset.card s) (conjDownSingletField i s φ) := by - rw [conjDownSingletField_apply, massWeightPoly_includeFermion, - FermionicAlgebra.massWeightPoly_ι, FermionicAlgebra.jetComponentPoly_inr, - Polynomial.mapAlgHom_monomial] - + = Polynomial.monomial (3 + 2 * Multiset.card s) (conjDownSingletField i s φ) := + (congrArg massWeightPoly (conjDownSingletField_eq_conjFermionSymbol i s φ)).trans + ((massWeightPoly_conjFermionSymbol s _).trans + (congrArg (Polynomial.monomial (3 + 2 * Multiset.card s)) + (conjDownSingletField_eq_conjFermionSymbol i s φ).symm)) end JetAlgebra end StandardModel diff --git a/Physlib/Particles/StandardModel/JetAlgebra/SectorEquiv/Basic.lean b/Physlib/Particles/StandardModel/JetAlgebra/SectorEquiv/Basic.lean new file mode 100644 index 000000000..a986eaab7 --- /dev/null +++ b/Physlib/Particles/StandardModel/JetAlgebra/SectorEquiv/Basic.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.FieldData +public import Physlib.Particles.StandardModel.Fermions.JetAlgebra.Basic +public import Physlib.Particles.StandardModel.HiggsBoson.JetAlgebra.Basic +public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.JetDeriv +public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.JetDeriv +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.GaugeField +public import Physlib.Mathematics.ExteriorAlgebra +public import Physlib.Mathematics.SymmetricAlgebra +/-! +# The sector algebras of the Standard Model inside its local field algebra + +## i. Overview + +The Standard Model jet algebra is `fieldData.LocalFieldAlgebra`, the local field algebra +the generic theory builds from the Standard Model field datum: one exterior algebra on the +direct sum of the fifteen fermionic species component spaces, a symmetric algebra on the +one bosonic species, and the complexified real symmetric algebra on the connection +generators. + +Its two matter factors are not the sector algebras the Standard Model files are written +with. `FermionJetAlgebra` is an exterior algebra on the component space of a fifteen-fold +product of value spaces, and the fermionic factor of the carrier an exterior algebra on a +fifteen-fold direct sum of component spaces; `HiggsJetAlgebra` is a symmetric algebra on +the component space of `HiggsVec`, and the bosonic factor one on the generators of the +one-species direct sum. This file identifies the two presentations and lifts the +identification to the sector algebras, which is what the sector inclusions +`JetAlgebra.includeFermion` and `JetAlgebra.includeHiggs` are built from. The connection +factors need no comparison: the Standard Model gauge bosons are the generic +`GaugeBoson GaugeAlgebra`. + +The identification of the generators is Joseph Tooby-Smith's generic +`GaugeFieldData.fermionGeneratorsEquiv`, which presents the direct sum over the species as +the component space of a single field valued in `fieldData.FermionModule`. What is left for +the Standard Model is one relabelling: `FermionSpace` is a nested product of five +three-generation blocks and `fieldData.FermionModule` is a dependent function on the fifteen +constructors of `FermionType`. `StandardModel.fermionSpaceEquiv` is that relabelling, and +`JetComponentSpace.comapEquiv` carries it to the component spaces — contravariantly, a +component function being a covector on the target. + +## ii. Key results + +- `StandardModel.fermionSpaceEquiv` : the total fermionic target space as the family of + species value spaces. +- `StandardModel.fermionProj` : the projection onto a species, computing to the existing + Standard Model projections. +- `StandardModel.higgsModuleEquiv` : the Higgs as the one-species bosonic module. +- `StandardModel.fermionGeneratorsEquiv`, `StandardModel.bosonGeneratorsEquiv` : the two + matter generator identifications. +- `StandardModel.fermionAlgebraEquiv`, `StandardModel.higgsAlgebraEquiv` : the two sector + algebra equivalences. +- `StandardModel.fermionAlgebraEquiv_jetDeriv`, + `StandardModel.higgsAlgebraEquiv_jetDeriv` : the sector equivalences are maps of + differential algebras. + +## iii. Table of contents + +- A. The two matter generator identifications + - A.1. The fermionic species as a family over the total target space + - A.2. The Higgs as the one bosonic species + - A.3. The generator identifications +- B. The sector algebra equivalences +- C. The generic generators of the field datum +- D. The sector equivalences and the ordinary derivative + +-/ + +@[expose] public section + +open TensorProduct Matrix MatrixGroups + +set_option maxHeartbeats 1000000 +set_option synthInstance.maxHeartbeats 1000000 +set_option synthInstance.maxSize 2048 +set_option maxRecDepth 8000 + +namespace StandardModel + +/-! + +## A. The two matter generator identifications + +### A.1. The fermionic species as a family over the total target space + +The generic theory presents the fermionic generators as the component space of a field +valued in `fieldData.FermionModule`, a dependent function on the fifteen species. The +Standard Model writes the same target space as a nested product of five three-generation +blocks. The only Standard Model input the comparison needs is the relabelling between the +two. + +-/ + +/-- The total fermionic target space is the fermionic module of the datum. The nested + product of five three-generation blocks that `FermionSpace` is, rearranged into a + dependent function on the fifteen species. It is a relabelling: every component of a + value on one side is a component of the corresponding value on the other. -/ +noncomputable def fermionSpaceEquiv : FermionSpace ≃ₗ[ℂ] fieldData.FermionModule where + toFun v t := + match t with + | .leptonDoublet i => v.1 i + | .leptonSinglet i => v.2.1 i + | .quarkDoublet i => v.2.2.1 i + | .upSinglet i => v.2.2.2.1 i + | .downSinglet i => v.2.2.2.2 i + map_add' v w := funext fun t => by + cases t with + | leptonDoublet i => rfl + | leptonSinglet i => rfl + | quarkDoublet i => rfl + | upSinglet i => rfl + | downSinglet i => rfl + map_smul' c v := funext fun t => by + cases t with + | leptonDoublet i => rfl + | leptonSinglet i => rfl + | quarkDoublet i => rfl + | upSinglet i => rfl + | downSinglet i => rfl + invFun f := + (fun i => f (.leptonDoublet i), fun i => f (.leptonSinglet i), + fun i => f (.quarkDoublet i), fun i => f (.upSinglet i), fun i => f (.downSinglet i)) + left_inv v := rfl + right_inv f := funext fun t => by + cases t with + | leptonDoublet i => rfl + | leptonSinglet i => rfl + | quarkDoublet i => rfl + | upSinglet i => rfl + | downSinglet i => rfl + +/-- The projection of the total fermionic target space onto the value space of a species + of the datum: the relabelling followed by the projection of the module. -/ +noncomputable def fermionProj (t : fieldData.FermionSpecies) : + FermionSpace →ₗ[ℂ] fieldData.FermionValue t := + (fieldData.projFermionValue t).comp fermionSpaceEquiv.toLinearMap + +lemma fermionProj_eq (t : fieldData.FermionSpecies) : + fermionProj t = (fieldData.projFermionValue t).comp fermionSpaceEquiv.toLinearMap := rfl + +@[simp] +lemma fermionProj_leptonDoublet (i : Fin 3) : + fermionProj (.leptonDoublet i) = FermionSpace.leptonDoubletProj i := rfl + +@[simp] +lemma fermionProj_leptonSinglet (i : Fin 3) : + fermionProj (.leptonSinglet i) = FermionSpace.leptonSingletProj i := rfl + +@[simp] +lemma fermionProj_quarkDoublet (i : Fin 3) : + fermionProj (.quarkDoublet i) = FermionSpace.quarkDoubletProj i := rfl + +@[simp] +lemma fermionProj_upSinglet (i : Fin 3) : + fermionProj (.upSinglet i) = FermionSpace.upSingletProj i := rfl + +@[simp] +lemma fermionProj_downSinglet (i : Fin 3) : + fermionProj (.downSinglet i) = FermionSpace.downSingletProj i := rfl + +/-! + +### A.2. The Higgs as the one bosonic species + +-/ + +/-- The Higgs multiplet is the bosonic module of the datum. There is one bosonic + species, so the module of bosonic values is the constant family on it. -/ +noncomputable def higgsModuleEquiv : HiggsVec ≃ₗ[ℂ] fieldData.BosonModule where + toFun v := fun _ => v + map_add' _ _ := rfl + map_smul' _ _ := rfl + invFun f := f () + left_inv _ := rfl + right_inv _ := funext fun j => match j with | () => rfl + +/-- Reading off the one species undoes the relabelling. -/ +lemma projBosonValue_comp_higgsModuleEquiv (j : fieldData.BosonSpecies) : + (fieldData.projBosonValue j).comp higgsModuleEquiv.toLinearMap = LinearMap.id := + LinearMap.ext fun _ => rfl + +/-- The pullback along the relabelling undoes the pullback along the one projection. -/ +lemma comap_projBosonValue_comp_comap_higgsModuleEquiv (j : fieldData.BosonSpecies) : + (JetComponentSpace.comap higgsModuleEquiv.toLinearMap).comp + (JetComponentSpace.comap (fieldData.projBosonValue j)) + = LinearMap.id := + ((JetComponentSpace.comap_comp higgsModuleEquiv.toLinearMap + (fieldData.projBosonValue j)).symm.trans + (congrArg (fun f : HiggsVec →ₗ[ℂ] fieldData.BosonValue j => + JetComponentSpace.comap f) (projBosonValue_comp_higgsModuleEquiv j))).trans + JetComponentSpace.comap_id + +/-! + +### A.3. The generator identifications + +The generic identification of a generator space with the component space of the whole +matter field, composed with the relabelling of the target space. `JetComponentSpace.comap` +is contravariant, so the relabelling `FermionSpace ≃ₗ fieldData.FermionModule` is carried +by `comapEquiv` to a map *from* the component space of the module *to* that of +`FermionSpace`, which is the direction the composite needs. + +-/ + +/-- The fermionic generator space of the datum is the component space of the total + fermionic target space. The generic presentation of the direct sum as the component + space of the fermionic module, followed by the relabelling of the target space. -/ +noncomputable def fermionGeneratorsEquiv : + fieldData.FermionGenerators ≃ₗ[ℂ] JetComponentSpace FermionSpace := + fieldData.fermionGeneratorsEquiv.trans (JetComponentSpace.comapEquiv fermionSpaceEquiv) + +/-- A species sits inside the fermionic generators as the pullback along the projection + onto that species. -/ +@[simp] +lemma fermionGeneratorsEquiv_inclFermion (t : fieldData.FermionSpecies) + (x : JetComponentSpace (fieldData.FermionValue t)) : + fermionGeneratorsEquiv (fieldData.inclFermion t x) + = JetComponentSpace.comap (fermionProj t) x := by + rw [fermionProj_eq, + JetComponentSpace.comap_comp fermionSpaceEquiv.toLinearMap + (fieldData.projFermionValue t), + fermionGeneratorsEquiv, LinearEquiv.trans_apply, + GaugeFieldData.fermionGeneratorsEquiv_inclFermion, + JetComponentSpace.comapEquiv_apply, LinearMap.comp_apply] + +@[simp] +lemma fermionGeneratorsEquiv_symm_comap (t : fieldData.FermionSpecies) + (x : JetComponentSpace (fieldData.FermionValue t)) : + fermionGeneratorsEquiv.symm (JetComponentSpace.comap (fermionProj t) x) + = fieldData.inclFermion t x := by + rw [← fermionGeneratorsEquiv_inclFermion, LinearEquiv.symm_apply_apply] + +/-- The second half of a pullback of an unconjugated symbol vanishes. -/ +lemma _root_.JetComponentSpace.comap_snd_of_zero {V W : Type} [AddCommGroup V] [Module ℂ V] + [AddCommGroup W] [Module ℂ W] (f : V →ₗ[ℂ] W) + (x : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ W) : + (JetComponentSpace.comap f ((x, 0) : JetComponentSpace W)).2 = 0 := by + rw [show (JetComponentSpace.comap f ((x, 0) : JetComponentSpace W)).2 + = (TensorProduct.map LinearMap.id (Module.Dual.transpose (ConjModule.map f))) + (0 : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule W)) from rfl, map_zero] + +/-- The first half of a pullback of a conjugate symbol vanishes. -/ +lemma _root_.JetComponentSpace.comap_fst_of_zero {V W : Type} [AddCommGroup V] [Module ℂ V] + [AddCommGroup W] [Module ℂ W] (f : V →ₗ[ℂ] W) + (y : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule W)) : + (JetComponentSpace.comap f ((0, y) : JetComponentSpace W)).1 = 0 := by + rw [show (JetComponentSpace.comap f ((0, y) : JetComponentSpace W)).1 + = (TensorProduct.map LinearMap.id (Module.Dual.transpose f)) + (0 : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ W) from rfl, map_zero] + +/-- The unconjugated symbol `∂_s ψ_φ` of a species, read on the total target space. -/ +lemma fermionGeneratorsEquiv_symm_basis_tmul (t : fieldData.FermionSpecies) + (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (fieldData.FermionValue t)) : + fermionGeneratorsEquiv.symm ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] + Module.Dual.transpose (fermionProj t) φ, 0) : JetComponentSpace FermionSpace) + = fieldData.inclFermion t ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : + JetComponentSpace (fieldData.FermionValue t)) := by + rw [← fermionGeneratorsEquiv_symm_comap t + ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : + JetComponentSpace (fieldData.FermionValue t))] + refine congrArg _ (Prod.ext ?_ ?_) + · exact (JetComponentSpace.comap_fst_tmul (fermionProj t) _ φ 0).symm + · exact (JetComponentSpace.comap_snd_of_zero (fermionProj t) _).symm + +/-- The conjugate symbol `∂_s ψ̄_φ` of a species, read on the total target space. -/ +lemma fermionGeneratorsEquiv_symm_basis_tmul_conj (t : fieldData.FermionSpecies) + (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule (fieldData.FermionValue t))) : + fermionGeneratorsEquiv.symm ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] + Module.Dual.transpose (ConjModule.map (fermionProj t)) φ) : + JetComponentSpace FermionSpace) + = fieldData.inclFermion t ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : + JetComponentSpace (fieldData.FermionValue t)) := by + rw [← fermionGeneratorsEquiv_symm_comap t + ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : + JetComponentSpace (fieldData.FermionValue t))] + refine congrArg _ (Prod.ext ?_ ?_) + · exact (JetComponentSpace.comap_fst_of_zero (fermionProj t) _).symm + · exact (JetComponentSpace.comap_snd_tmul (fermionProj t) 0 _ φ).symm + +/-- The bosonic generator space of the datum is the component space of the Higgs. + There is one bosonic species, so the direct sum has one summand and the relabelling of + the target space is the identification of a one-element function space with its + value. -/ +noncomputable def bosonGeneratorsEquiv : + fieldData.BosonGenerators ≃ₗ[ℂ] JetComponentSpace HiggsVec := + fieldData.bosonGeneratorsEquiv.trans (JetComponentSpace.comapEquiv higgsModuleEquiv) + +@[simp] +lemma bosonGeneratorsEquiv_inclBoson (j : fieldData.BosonSpecies) + (y : JetComponentSpace (fieldData.BosonValue j)) : + bosonGeneratorsEquiv (fieldData.inclBoson j y) = y := by + rw [bosonGeneratorsEquiv, LinearEquiv.trans_apply, + GaugeFieldData.bosonGeneratorsEquiv_inclBoson, JetComponentSpace.comapEquiv_apply] + exact LinearMap.congr_fun (comap_projBosonValue_comp_comap_higgsModuleEquiv j) y + +@[simp] +lemma bosonGeneratorsEquiv_symm_apply (y : JetComponentSpace HiggsVec) : + bosonGeneratorsEquiv.symm y = fieldData.inclBoson () y := + bosonGeneratorsEquiv.injective + ((bosonGeneratorsEquiv.apply_symm_apply y).trans + (bosonGeneratorsEquiv_inclBoson () y).symm) + +/-! + +## B. The sector algebra equivalences + +Each sector algebra is a free algebra over one presentation of its generator space and the +corresponding factor of the carrier a free algebra over the other, so the generator +identifications of section A lift to algebra equivalences by functoriality. + +-/ + +/-- The fermionic factor: one exterior algebra, over the two presentations of the same + generator space. -/ +noncomputable def fermionAlgebraEquiv : + FermionJetAlgebra ≃ₐ[ℂ] ExteriorAlgebra ℂ fieldData.FermionGenerators := + ExteriorAlgebra.mapEquiv fermionGeneratorsEquiv.symm + +/-- The Higgs factor: one symmetric algebra, over the two presentations of the same + generator space. -/ +noncomputable def higgsAlgebraEquiv : + HiggsJetAlgebra ≃ₐ[ℂ] SymmetricAlgebra ℂ fieldData.BosonGenerators := + SymmetricAlgebra.congr (R := ℂ) (M := JetComponentSpace HiggsVec) + (N := fieldData.BosonGenerators) bosonGeneratorsEquiv.symm + +@[simp] +lemma fermionAlgebraEquiv_ι (v : JetComponentSpace FermionSpace) : + fermionAlgebraEquiv (ExteriorAlgebra.ι ℂ v) + = ExteriorAlgebra.ι ℂ (fermionGeneratorsEquiv.symm v) := + ExteriorAlgebra.map_apply_ι _ v + +@[simp] +lemma higgsAlgebraEquiv_ι (v : JetComponentSpace HiggsVec) : + higgsAlgebraEquiv (SymmetricAlgebra.ι ℂ (JetComponentSpace HiggsVec) v) + = SymmetricAlgebra.ι ℂ fieldData.BosonGenerators (bosonGeneratorsEquiv.symm v) := + SymmetricAlgebra.congr_apply_ι bosonGeneratorsEquiv.symm v + +/-! + +## C. The generic generators of the field datum + +The degree-one elements of the three factors, included, are the generic generators +`ιFermion`, `ιBoson` and `ιConnection` of the field datum. These are the reductions the +named Standard Model field symbols are computed by. + +-/ + +/-- A degree-one element of the fermionic factor, included, is a total fermionic + generator. -/ +lemma includeFermion_ι (w : fieldData.FermionGenerators) : + fieldData.includeFermion (ExteriorAlgebra.ι ℂ w) = fieldData.ιFermionTotal w := rfl + +/-- A degree-one element of the bosonic factor, included, is a total bosonic generator. -/ +lemma includeBoson_ι (w : fieldData.BosonGenerators) : + fieldData.includeBoson (SymmetricAlgebra.ι ℂ fieldData.BosonGenerators w) + = fieldData.ιBosonTotal w := rfl + +/-- A real degree-one element of the connection factor, included, is a connection + generator. -/ +lemma includeConnection_one_tmul_ι (v : GaugeBoson.JetComponentSpace GaugeAlgebra) : + fieldData.includeConnection ((1 : ℂ) ⊗ₜ[ℝ] + SymmetricAlgebra.ι ℝ (GaugeBoson.JetComponentSpace GaugeAlgebra) v) + = fieldData.ιConnection v := rfl + +/-- The total fermionic generator of a species summand is that species' generator. -/ +lemma ιFermionTotal_inclFermion (t : fieldData.FermionSpecies) + (x : JetComponentSpace (fieldData.FermionValue t)) : + fieldData.ιFermionTotal (fieldData.inclFermion t x) = fieldData.ιFermion t x := rfl + +/-- The total bosonic generator of a species summand is that species' generator. -/ +lemma ιBosonTotal_inclBoson (j : fieldData.BosonSpecies) + (y : JetComponentSpace (fieldData.BosonValue j)) : + fieldData.ιBosonTotal (fieldData.inclBoson j y) = fieldData.ιBoson j y := rfl + +/-! + +## D. The sector equivalences and the ordinary derivative + +The derivative shift is blind to the value space, so it commutes with the pullback along +any map of target spaces; the two generator identifications therefore carry the derivative +shift of the datum to the derivative shift of the total component space, and the +free-algebra derivations extending them agree. + +These are the bridges the migrated total derivative uses to restrict to the sector +derivatives under their existing names. The species-diagonal half of each is Joseph +Tooby-Smith's generic `GaugeFieldData.fermionGeneratorsEquiv_jetDerivFermion`; what is +added here is the relabelling of the target space, which `JetComponentSpace.comap_jetDeriv` +lets through. + +-/ + +/-- The fermionic generator identification intertwines the derivative shift of the datum + with the derivative shift on the component space of the total target space. -/ +lemma fermionGeneratorsEquiv_jetDerivFermion (μ : Fin 1 ⊕ Fin 3) + (w : fieldData.FermionGenerators) : + fermionGeneratorsEquiv (fieldData.jetDerivFermion μ w) + = JetComponentSpace.jetDeriv μ (fermionGeneratorsEquiv w) := by + rw [fermionGeneratorsEquiv, LinearEquiv.trans_apply, LinearEquiv.trans_apply, + JetComponentSpace.comapEquiv_apply, JetComponentSpace.comapEquiv_apply, + GaugeFieldData.fermionGeneratorsEquiv_jetDerivFermion] + exact LinearMap.congr_fun + (JetComponentSpace.comap_jetDeriv fermionSpaceEquiv.toLinearMap μ) _ + +/-- The inverse form of `fermionGeneratorsEquiv_jetDerivFermion`. -/ +lemma fermionGeneratorsEquiv_symm_jetDeriv (μ : Fin 1 ⊕ Fin 3) + (v : JetComponentSpace FermionSpace) : + fermionGeneratorsEquiv.symm (JetComponentSpace.jetDeriv μ v) + = fieldData.jetDerivFermion μ (fermionGeneratorsEquiv.symm v) := + fermionGeneratorsEquiv.injective <| + (fermionGeneratorsEquiv.apply_symm_apply _).trans <| + ((congrArg (JetComponentSpace.jetDeriv μ) + (fermionGeneratorsEquiv.apply_symm_apply v)).symm.trans + (fermionGeneratorsEquiv_jetDerivFermion μ _).symm) + +/-- The bosonic generator identification intertwines the two derivative shifts. -/ +lemma bosonGeneratorsEquiv_jetDerivBoson (μ : Fin 1 ⊕ Fin 3) + (w : fieldData.BosonGenerators) : + bosonGeneratorsEquiv (fieldData.jetDerivBoson μ w) + = JetComponentSpace.jetDeriv μ (bosonGeneratorsEquiv w) := by + rw [bosonGeneratorsEquiv, LinearEquiv.trans_apply, LinearEquiv.trans_apply, + JetComponentSpace.comapEquiv_apply, JetComponentSpace.comapEquiv_apply, + GaugeFieldData.bosonGeneratorsEquiv_jetDerivBoson] + exact LinearMap.congr_fun + (JetComponentSpace.comap_jetDeriv higgsModuleEquiv.toLinearMap μ) _ + +/-- The inverse form of `bosonGeneratorsEquiv_jetDerivBoson`. -/ +lemma bosonGeneratorsEquiv_symm_jetDeriv (μ : Fin 1 ⊕ Fin 3) + (v : JetComponentSpace HiggsVec) : + bosonGeneratorsEquiv.symm (JetComponentSpace.jetDeriv μ v) + = fieldData.jetDerivBoson μ (bosonGeneratorsEquiv.symm v) := + bosonGeneratorsEquiv.injective <| + (bosonGeneratorsEquiv.apply_symm_apply _).trans <| + ((congrArg (JetComponentSpace.jetDeriv μ) + (bosonGeneratorsEquiv.apply_symm_apply v)).symm.trans + (bosonGeneratorsEquiv_jetDerivBoson μ _).symm) + +/-- The total derivative on the fermionic algebra of a species is the general even + derivation of its exterior algebra extending the derivative shift. The two constructions + are the same lift into the trivial square-zero extension, written once in the matter + sector and once in general; the identification lets the general theory apply to the + fermionic factor of the migrated carrier, whose generator space is a direct sum of + component spaces rather than a single one. -/ +private lemma fermionicAlgebra_jetDeriv_eq {V : Type} [AddCommGroup V] [Module ℂ V] + (μ : Fin 1 ⊕ Fin 3) : + FermionicAlgebra.jetDeriv (V := V) μ + = ExteriorAlgebra.derivationOfLinear (JetComponentSpace.jetDeriv μ) := rfl + +/-- The fermionic sector equivalence is a map of differential algebras: the exterior + derivation extending the derivative shift on the total target space goes to the exterior + derivation extending the derivative shift of the datum. -/ +lemma fermionAlgebraEquiv_jetDeriv (μ : Fin 1 ⊕ Fin 3) (f : FermionJetAlgebra) : + fermionAlgebraEquiv (FermionicAlgebra.jetDeriv μ f) + = ExteriorAlgebra.derivationOfLinear (fieldData.jetDerivFermion μ) + (fermionAlgebraEquiv f) := by + rw [fermionicAlgebra_jetDeriv_eq] + exact ExteriorAlgebra.algHom_derivationOfLinear fermionAlgebraEquiv.toAlgHom + (fun x => fermionAlgebraEquiv_ι x) (fun x => fermionGeneratorsEquiv_symm_jetDeriv μ x) f + +/-- The Higgs sector equivalence is a map of differential algebras. -/ +lemma higgsAlgebraEquiv_jetDeriv (μ : Fin 1 ⊕ Fin 3) (h : HiggsJetAlgebra) : + higgsAlgebraEquiv (BosonicAlgebra.jetDeriv μ h) + = SymmetricAlgebra.derivationOfLinear (fieldData.jetDerivBoson μ) + (higgsAlgebraEquiv h) := by + show higgsAlgebraEquiv + (SymmetricAlgebra.derivationOfLinear (JetComponentSpace.jetDeriv μ) h) + = SymmetricAlgebra.derivationOfLinear (fieldData.jetDerivBoson μ) + (higgsAlgebraEquiv h) + exact SymmetricAlgebra.algHom_derivationOfLinear higgsAlgebraEquiv.toAlgHom + (fun x => higgsAlgebraEquiv_ι x) (fun x => bosonGeneratorsEquiv_symm_jetDeriv μ x) h + +end StandardModel diff --git a/Physlib/Particles/StandardModel/JetAlgebra/SectorEquiv/Structure.lean b/Physlib/Particles/StandardModel/JetAlgebra/SectorEquiv/Structure.lean new file mode 100644 index 000000000..108289f22 --- /dev/null +++ b/Physlib/Particles/StandardModel/JetAlgebra/SectorEquiv/Structure.lean @@ -0,0 +1,451 @@ +/- +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.JetAlgebra.SectorEquiv.Basic +public import Physlib.Particles.StandardModel.Fermions.JetAlgebra.Species +/-! +# The generator identifications respect the transformation data + +## i. Overview + +`Physlib.Particles.StandardModel.JetAlgebra.SectorEquiv.Basic` identifies the two matter +generator spaces of `StandardModel.fieldData` with the two the Standard Model sector +algebras are built on. This file proves that those identifications respect the +transformation data: the Lorentz action, the jet gauge action and the mass weights. + +The generic half of each statement is already proved once and for all in +`Physlib.ClassicalFieldTheory.GaugeTheory.GaugeFieldData.FermionGenerators`: +`GaugeFieldData.fermionGeneratorsEquiv` intertwines the species-diagonal Lorentz and jet +gauge actions on the direct sum with the actions on the component functions of a single +field valued in `T.FermionModule`, and likewise for the mass-weight scaling under a common +weight. What is added here is the Standard Model half: the relabelling `fermionSpaceEquiv` +of the target space is itself equivariant for both actions, which is the two families of +five species lemmas of +`Physlib.Particles.StandardModel.Fermions.JetAlgebra.Species` read at the fifteen species +of the datum. Naturality of `JetComponentSpace.comap` in the value space then carries the +generic statements across the relabelling; for the mass-weight scaling no equivariance is +needed at all, the scaling being blind to the value space. + +Gauge equivariance is the one statement of the three that is not formal. The gauge action +on a component function is the all-orders Leibniz convolution of the Taylor coefficients of +the gauge jet, so it sees the derivative label as well as the target index, and its +conjugate half carries `star` of the gauge matrix rather than the matrix. Neither half +follows from the other, and neither follows from linearity: both are proved, for every +derivative label, from `JetComponentSpace.comap_comp_repJet`. No common mass weight enters +any of it — the fifteen fermionic species do share weight three, but the gauge statement +does not use that, and is stated over `GaugeFieldData.repJetFermionModule`, which is +defined whatever the weights are. + +Section C lifts the four resulting generator statements to the sector algebras, which are +the two matter factors of the carrier. The ordinary derivative is treated in section D of +`Physlib.Particles.StandardModel.JetAlgebra.SectorEquiv.Basic`. The connection sector needs +no identification at all: the Standard Model gauge bosons are the generic ones at +`GaugeAlgebra`. + +## ii. Key results + +- `StandardModel.fermionSpaceEquiv_comp_repLorentzGroup`, + `StandardModel.lTensor_fermionSpaceEquiv_repJetGaugeGroupI` : the relabelling of the + fermionic target space is equivariant for the Lorentz and the jet gauge action. +- `StandardModel.fermionGeneratorsEquiv_repLorentzFermion`, + `StandardModel.bosonGeneratorsEquiv_repLorentzBoson` : the generator identifications + intertwine the Lorentz actions. +- `StandardModel.fermionGeneratorsEquiv_repJetFermion`, + `StandardModel.bosonGeneratorsEquiv_repJetBoson` : and the jet gauge actions. +- `StandardModel.fermionGeneratorsEquiv_massWeightScaleFermion`, + `StandardModel.bosonGeneratorsEquiv_massWeightScaleBoson` : and the mass-weight + scalings. +- `StandardModel.fermionAlgebraEquiv_repJetGaugeGroupI`, + `StandardModel.higgsAlgebraEquiv_repJetGaugeGroupI`, + `StandardModel.fermionAlgebraEquiv_repLorentzGroup`, + `StandardModel.higgsAlgebraEquiv_repLorentzGroup` : the sector algebra equivalences + intertwine both actions. + +## iii. Table of contents + +- A. The relabellings intertwine the Standard Model structure + - A.1. The Lorentz action + - A.2. The jet gauge action +- B. The generator identifications intertwine the transformation data + - B.1. The Lorentz action + - B.2. The jet gauge action + - B.3. The mass weights +- C. The sector algebra equivalences intertwine the two actions + +-/ + +@[expose] public section + +open TensorProduct Matrix MatrixGroups + +set_option maxHeartbeats 1000000 +set_option synthInstance.maxHeartbeats 1000000 +set_option synthInstance.maxSize 2048 +set_option maxRecDepth 8000 + +namespace StandardModel + +/-! + +## A. The relabellings intertwine the Standard Model structure + +Both actions on the total fermionic target space are species-diagonal, which is already +recorded species by species in +`Physlib.Particles.StandardModel.Fermions.JetAlgebra.Species`. Reading those two families +of five lemmas at the fifteen species of the datum is the only Standard Model input the +comparison of the transformation data needs. + +### A.1. The Lorentz action + +-/ + +/-- The projection onto a species intertwines the total Lorentz action on the fermionic + target space with that species' own. -/ +lemma fermionProj_comp_repLorentzGroup (t : fieldData.FermionSpecies) (Λ : SL(2,ℂ)) : + (fermionProj t).comp (FermionSpace.repLorentzGroup Λ) + = ((fieldData.fermion t).repLorentz Λ).comp (fermionProj t) := by + cases t with + | leptonDoublet i => exact FermionSpace.leptonDoubletProj_comp_repLorentzGroup i Λ + | leptonSinglet i => exact FermionSpace.leptonSingletProj_comp_repLorentzGroup i Λ + | quarkDoublet i => exact FermionSpace.quarkDoubletProj_comp_repLorentzGroup i Λ + | upSinglet i => exact FermionSpace.upSingletProj_comp_repLorentzGroup i Λ + | downSinglet i => exact FermionSpace.downSingletProj_comp_repLorentzGroup i Λ + +/-- The relabelling of the fermionic target space is Lorentz-equivariant. Both actions + are species-diagonal, so this is the previous lemma read one species at a time. -/ +lemma fermionSpaceEquiv_comp_repLorentzGroup (Λ : SL(2,ℂ)) : + fermionSpaceEquiv.toLinearMap.comp (FermionSpace.repLorentzGroup Λ) + = (fieldData.repLorentzFermionModule Λ).comp fermionSpaceEquiv.toLinearMap := + LinearMap.ext fun v => funext fun t => + LinearMap.congr_fun (fermionProj_comp_repLorentzGroup t Λ) v + +/-- The relabelling of the Higgs is Lorentz-equivariant. The Higgs is a Lorentz scalar, + so both sides are the identity; the content is that the one bosonic species of the datum + carries exactly the trivial Higgs representation. -/ +lemma higgsModuleEquiv_comp_repLorentzGroup (Λ : SL(2,ℂ)) : + higgsModuleEquiv.toLinearMap.comp (Representation.trivial ℂ SL(2,ℂ) HiggsVec Λ) + = (fieldData.repLorentzBosonModule Λ).comp higgsModuleEquiv.toLinearMap := + LinearMap.ext fun _ => funext fun _ => rfl + +/-! + +### A.2. The jet gauge action + +The jet gauge action on the total fermionic target space is species-diagonal through +`FermionSpace.jetActionMap`, so each projection intertwines it with that species' own. +The relabelling is the assembly of the fifteen projections, and a jet of the fermionic +module is determined by its species components, so the relabelling too is equivariant. + +-/ + +/-- The projection onto a species intertwines the total jet gauge action on the jets of + the fermionic target space with that species' own. -/ +lemma lTensor_fermionProj_repJetGaugeGroupI (t : fieldData.FermionSpecies) + (U : JetGaugeGroupI) : + (LinearMap.lTensor JetRing (fermionProj t)).comp (FermionSpace.repJetGaugeGroupI U) + = ((fieldData.fermion t).repJet U).comp + (LinearMap.lTensor JetRing (fermionProj t)) := by + cases t with + | leptonDoublet i => exact FermionSpace.lTensor_leptonDoubletProj_repJetGaugeGroupI i U + | leptonSinglet i => exact FermionSpace.lTensor_leptonSingletProj_repJetGaugeGroupI i U + | quarkDoublet i => exact FermionSpace.lTensor_quarkDoubletProj_repJetGaugeGroupI i U + | upSinglet i => exact FermionSpace.lTensor_upSingletProj_repJetGaugeGroupI i U + | downSinglet i => exact FermionSpace.lTensor_downSingletProj_repJetGaugeGroupI i U + +/-- The relabelling of the fermionic target space is equivariant for the jet gauge + action. Both actions are species-diagonal, so this is the previous lemma read one + species at a time, the two being compared through the splitting of the jets of a + product. -/ +lemma lTensor_fermionSpaceEquiv_repJetGaugeGroupI (U : JetGaugeGroupI) : + (LinearMap.lTensor JetRing fermionSpaceEquiv.toLinearMap).comp + (FermionSpace.repJetGaugeGroupI U) + = (fieldData.repJetFermionModule U).comp + (LinearMap.lTensor JetRing fermionSpaceEquiv.toLinearMap) := by + refine jetPi_hom_ext fieldData.FermionValue fun i => ?_ + have h1 : (LinearMap.lTensor JetRing (fieldData.projFermionValue i)).comp + (LinearMap.lTensor JetRing fermionSpaceEquiv.toLinearMap) + = LinearMap.lTensor JetRing (fermionProj i) := by + rw [← LinearMap.lTensor_comp] + rfl + rw [← LinearMap.comp_assoc, h1, lTensor_fermionProj_repJetGaugeGroupI i U, + ← LinearMap.comp_assoc, + GaugeFieldData.lTensor_projFermionValue_repJetFermionModule i U, + LinearMap.comp_assoc, h1] + +/-- The relabelling of the Higgs is equivariant for the jet gauge action. There is one + bosonic species, and reading it off undoes the relabelling, so both sides are the Higgs + action itself; the content is that the single bosonic species of the datum carries + exactly the Higgs representation. -/ +lemma lTensor_higgsModuleEquiv_repJetGaugeGroupI (U : JetGaugeGroupI) : + (LinearMap.lTensor JetRing higgsModuleEquiv.toLinearMap).comp + (HiggsVec.repJetGaugeGroupI U) + = (fieldData.repJetBosonModule U).comp + (LinearMap.lTensor JetRing higgsModuleEquiv.toLinearMap) := by + refine jetPi_hom_ext fieldData.BosonValue fun j => LinearMap.ext fun z => ?_ + have h1 : ∀ w : JetRing ⊗[ℂ] HiggsVec, + LinearMap.lTensor JetRing (fieldData.projBosonValue j) + (LinearMap.lTensor JetRing higgsModuleEquiv.toLinearMap w) = w := fun w => by + induction w using TensorProduct.induction_on with + | zero => rw [map_zero, map_zero]; rfl + | tmul f v => rfl + | add a b ha hb => rw [map_add, map_add, ha, hb]; rfl + simp only [LinearMap.comp_apply, h1] + rw [← LinearMap.comp_apply, + GaugeFieldData.lTensor_projBosonValue_repJetBosonModule j U, LinearMap.comp_apply, h1] + rfl + +/-! + +## B. The generator identifications intertwine the transformation data + +Nothing in this section is a consequence of transport: the two sides are the generic +species-diagonal structure on the direct sum and the existing Standard Model structure on +the component space of the total target space, and the comparison of the two is what has +content. + +### B.1. The Lorentz action + +-/ + +/-- The fermionic generator identification intertwines the Lorentz actions: the + species-diagonal action of the datum with the Standard Model action on the component + space of the total fermionic target space. -/ +lemma fermionGeneratorsEquiv_repLorentzFermion (Λ : SL(2,ℂ)) + (v : fieldData.FermionGenerators) : + fermionGeneratorsEquiv (fieldData.repLorentzFermion Λ v) + = JetComponentSpace.repLorentzGroup FermionSpace.repLorentzGroup Λ + (fermionGeneratorsEquiv v) := by + rw [fermionGeneratorsEquiv, LinearEquiv.trans_apply, LinearEquiv.trans_apply, + JetComponentSpace.comapEquiv_apply, JetComponentSpace.comapEquiv_apply, + GaugeFieldData.fermionGeneratorsEquiv_repLorentzFermion] + exact LinearMap.congr_fun + (JetComponentSpace.comap_comp_repLorentzGroup FermionSpace.repLorentzGroup + fieldData.repLorentzFermionModule fermionSpaceEquiv.toLinearMap + fermionSpaceEquiv_comp_repLorentzGroup Λ) _ + +/-- The composed form of `fermionGeneratorsEquiv_repLorentzFermion`. -/ +lemma fermionGeneratorsEquiv_comp_repLorentzFermion (Λ : SL(2,ℂ)) : + fermionGeneratorsEquiv.toLinearMap.comp (fieldData.repLorentzFermion Λ) + = (JetComponentSpace.repLorentzGroup FermionSpace.repLorentzGroup Λ).comp + fermionGeneratorsEquiv.toLinearMap := + LinearMap.ext fun v => fermionGeneratorsEquiv_repLorentzFermion Λ v + +/-- The bosonic generator identification intertwines the Lorentz actions. The Higgs is + a Lorentz scalar, so both sides act only on the derivative labels; the content is that + the single bosonic species of the datum carries exactly the trivial Higgs representation + of the Standard Model. -/ +lemma bosonGeneratorsEquiv_repLorentzBoson (Λ : SL(2,ℂ)) + (w : fieldData.BosonGenerators) : + bosonGeneratorsEquiv (fieldData.repLorentzBoson Λ w) + = JetComponentSpace.repLorentzGroup (Representation.trivial ℂ SL(2,ℂ) HiggsVec) Λ + (bosonGeneratorsEquiv w) := by + rw [bosonGeneratorsEquiv, LinearEquiv.trans_apply, LinearEquiv.trans_apply, + JetComponentSpace.comapEquiv_apply, JetComponentSpace.comapEquiv_apply, + GaugeFieldData.bosonGeneratorsEquiv_repLorentzBoson] + exact LinearMap.congr_fun + (JetComponentSpace.comap_comp_repLorentzGroup + (Representation.trivial ℂ SL(2,ℂ) HiggsVec) fieldData.repLorentzBosonModule + higgsModuleEquiv.toLinearMap higgsModuleEquiv_comp_repLorentzGroup Λ) _ + +/-- The composed form of `bosonGeneratorsEquiv_repLorentzBoson`. -/ +lemma bosonGeneratorsEquiv_comp_repLorentzBoson (Λ : SL(2,ℂ)) : + bosonGeneratorsEquiv.toLinearMap.comp (fieldData.repLorentzBoson Λ) + = (JetComponentSpace.repLorentzGroup (Representation.trivial ℂ SL(2,ℂ) HiggsVec) + Λ).comp bosonGeneratorsEquiv.toLinearMap := + LinearMap.ext fun w => bosonGeneratorsEquiv_repLorentzBoson Λ w + +/-- The inverse form of `fermionGeneratorsEquiv_repLorentzFermion`. -/ +lemma fermionGeneratorsEquiv_symm_repLorentzGroup (Λ : SL(2,ℂ)) + (w : JetComponentSpace FermionSpace) : + fermionGeneratorsEquiv.symm + (JetComponentSpace.repLorentzGroup FermionSpace.repLorentzGroup Λ w) + = fieldData.repLorentzFermion Λ (fermionGeneratorsEquiv.symm w) := + fermionGeneratorsEquiv.injective <| + (fermionGeneratorsEquiv.apply_symm_apply _).trans <| + ((congrArg (JetComponentSpace.repLorentzGroup FermionSpace.repLorentzGroup Λ) + (fermionGeneratorsEquiv.apply_symm_apply w)).symm.trans + (fermionGeneratorsEquiv_repLorentzFermion Λ _).symm) + +/-- The inverse form of `bosonGeneratorsEquiv_repLorentzBoson`. -/ +lemma bosonGeneratorsEquiv_symm_repLorentzGroup (Λ : SL(2,ℂ)) + (w : JetComponentSpace HiggsVec) : + bosonGeneratorsEquiv.symm (JetComponentSpace.repLorentzGroup + (Representation.trivial ℂ SL(2,ℂ) HiggsVec) Λ w) + = fieldData.repLorentzBoson Λ (bosonGeneratorsEquiv.symm w) := + bosonGeneratorsEquiv.injective <| + (bosonGeneratorsEquiv.apply_symm_apply _).trans <| + ((congrArg (JetComponentSpace.repLorentzGroup + (Representation.trivial ℂ SL(2,ℂ) HiggsVec) Λ) + (bosonGeneratorsEquiv.apply_symm_apply w)).symm.trans + (bosonGeneratorsEquiv_repLorentzBoson Λ _).symm) + +/-! + +### B.2. The jet gauge action + +Neither half of this is formal. The gauge action mixes a component function with the lower +ones through the Taylor coefficients of the gauge jet, so it sees the derivative label; and +its conjugate half carries `star` of the gauge matrix. Both are covered, at every +derivative label, by `JetComponentSpace.comap_comp_repJet`, whose two halves are proved +separately. The inverse forms below are what the sector algebra equivalences of section C +consume. + +-/ + +/-- The fermionic generator identification intertwines the jet gauge actions: the + species-diagonal action of the datum with the Standard Model action on the component + space of the total fermionic target space. No common mass weight is used. -/ +lemma fermionGeneratorsEquiv_repJetFermion (U : JetGaugeGroupI) + (v : fieldData.FermionGenerators) : + fermionGeneratorsEquiv (fieldData.repJetFermion U v) + = JetComponentSpace.repJet FermionSpace.repJetGaugeGroupI + FermionSpace.repJetGaugeGroupI_smul U (fermionGeneratorsEquiv v) := by + rw [fermionGeneratorsEquiv, LinearEquiv.trans_apply, LinearEquiv.trans_apply, + JetComponentSpace.comapEquiv_apply, JetComponentSpace.comapEquiv_apply, + GaugeFieldData.fermionGeneratorsEquiv_repJetFermion U v] + exact LinearMap.congr_fun (JetComponentSpace.comap_comp_repJet + FermionSpace.repJetGaugeGroupI FermionSpace.repJetGaugeGroupI_smul + fieldData.repJetFermionModule GaugeFieldData.repJetFermionModule_smul + fermionSpaceEquiv.toLinearMap lTensor_fermionSpaceEquiv_repJetGaugeGroupI U) _ + +/-- The inverse form of `fermionGeneratorsEquiv_repJetFermion`. -/ +lemma fermionGeneratorsEquiv_symm_repJet (U : JetGaugeGroupI) + (w : JetComponentSpace FermionSpace) : + fermionGeneratorsEquiv.symm (JetComponentSpace.repJet FermionSpace.repJetGaugeGroupI + FermionSpace.repJetGaugeGroupI_smul U w) + = fieldData.repJetFermion U (fermionGeneratorsEquiv.symm w) := + fermionGeneratorsEquiv.injective <| + (fermionGeneratorsEquiv.apply_symm_apply _).trans <| + ((congrArg (JetComponentSpace.repJet FermionSpace.repJetGaugeGroupI + FermionSpace.repJetGaugeGroupI_smul U) + (fermionGeneratorsEquiv.apply_symm_apply w)).symm.trans + (fermionGeneratorsEquiv_repJetFermion U _).symm) + +/-- The bosonic generator identification intertwines the jet gauge actions, at the one + Higgs species. -/ +lemma bosonGeneratorsEquiv_repJetBoson (U : JetGaugeGroupI) + (v : fieldData.BosonGenerators) : + bosonGeneratorsEquiv (fieldData.repJetBoson U v) + = JetComponentSpace.repJet HiggsVec.repJetGaugeGroupI + HiggsVec.repJetGaugeGroupI_smul U (bosonGeneratorsEquiv v) := by + rw [bosonGeneratorsEquiv, LinearEquiv.trans_apply, LinearEquiv.trans_apply, + JetComponentSpace.comapEquiv_apply, JetComponentSpace.comapEquiv_apply, + GaugeFieldData.bosonGeneratorsEquiv_repJetBoson U v] + exact LinearMap.congr_fun (JetComponentSpace.comap_comp_repJet + HiggsVec.repJetGaugeGroupI HiggsVec.repJetGaugeGroupI_smul + fieldData.repJetBosonModule GaugeFieldData.repJetBosonModule_smul + higgsModuleEquiv.toLinearMap lTensor_higgsModuleEquiv_repJetGaugeGroupI U) _ + +/-- The inverse form of `bosonGeneratorsEquiv_repJetBoson`. -/ +lemma bosonGeneratorsEquiv_symm_repJet (U : JetGaugeGroupI) + (w : JetComponentSpace HiggsVec) : + bosonGeneratorsEquiv.symm (JetComponentSpace.repJet HiggsVec.repJetGaugeGroupI + HiggsVec.repJetGaugeGroupI_smul U w) + = fieldData.repJetBoson U (bosonGeneratorsEquiv.symm w) := + bosonGeneratorsEquiv.injective <| + (bosonGeneratorsEquiv.apply_symm_apply _).trans <| + ((congrArg (JetComponentSpace.repJet HiggsVec.repJetGaugeGroupI + HiggsVec.repJetGaugeGroupI_smul U) + (bosonGeneratorsEquiv.apply_symm_apply w)).symm.trans + (bosonGeneratorsEquiv_repJetBoson U _).symm) + +/-! + +### B.3. The mass weights + +-/ + +/-- The fermionic generator identification intertwines the mass-weight scalings: the + per-species scaling of the datum, which carries the weight three of every Standard Model + fermion, with the single weight-three scaling of the component space of the total target + space. That the two agree is exactly the statement that all fifteen species have the same + weight; the relabelling of the target space costs nothing, the scaling being natural in + the value space. -/ +lemma fermionGeneratorsEquiv_massWeightScaleFermion (c : ℂ) + (v : fieldData.FermionGenerators) : + fermionGeneratorsEquiv (fieldData.massWeightScaleFermion c v) + = JetComponentSpace.massWeightScale 3 c (fermionGeneratorsEquiv v) := by + rw [fermionGeneratorsEquiv, LinearEquiv.trans_apply, LinearEquiv.trans_apply, + JetComponentSpace.comapEquiv_apply, JetComponentSpace.comapEquiv_apply, + GaugeFieldData.fermionGeneratorsEquiv_massWeightScaleFermion 3 + fieldData_fermion_massWeight c] + exact LinearMap.congr_fun + (JetComponentSpace.comap_comp_massWeightScale fermionSpaceEquiv.toLinearMap 3 c) _ + +/-- The composed form of `fermionGeneratorsEquiv_massWeightScaleFermion`. -/ +lemma fermionGeneratorsEquiv_comp_massWeightScaleFermion (c : ℂ) : + fermionGeneratorsEquiv.toLinearMap.comp (fieldData.massWeightScaleFermion c) + = (JetComponentSpace.massWeightScale 3 c).comp + fermionGeneratorsEquiv.toLinearMap := + LinearMap.ext fun v => fermionGeneratorsEquiv_massWeightScaleFermion c v + +/-- The bosonic generator identification intertwines the mass-weight scalings, at the + Higgs weight two. -/ +lemma bosonGeneratorsEquiv_massWeightScaleBoson (c : ℂ) + (w : fieldData.BosonGenerators) : + bosonGeneratorsEquiv (fieldData.massWeightScaleBoson c w) + = JetComponentSpace.massWeightScale 2 c (bosonGeneratorsEquiv w) := by + rw [bosonGeneratorsEquiv, LinearEquiv.trans_apply, LinearEquiv.trans_apply, + JetComponentSpace.comapEquiv_apply, JetComponentSpace.comapEquiv_apply, + GaugeFieldData.bosonGeneratorsEquiv_massWeightScaleBoson 2 + fieldData_boson_massWeight c] + exact LinearMap.congr_fun + (JetComponentSpace.comap_comp_massWeightScale higgsModuleEquiv.toLinearMap 2 c) _ + +/-- The composed form of `bosonGeneratorsEquiv_massWeightScaleBoson`. -/ +lemma bosonGeneratorsEquiv_comp_massWeightScaleBoson (c : ℂ) : + bosonGeneratorsEquiv.toLinearMap.comp (fieldData.massWeightScaleBoson c) + = (JetComponentSpace.massWeightScale 2 c).comp bosonGeneratorsEquiv.toLinearMap := + LinearMap.ext fun w => bosonGeneratorsEquiv_massWeightScaleBoson c w + +/-! + +## C. The sector algebra equivalences intertwine the two actions + +Each of the two sector algebra equivalences of +`Physlib.Particles.StandardModel.JetAlgebra.SectorEquiv.Basic` is the free-algebra functor +applied to a generator identification, and each of the four actions is the free-algebra +functor applied to an action on the generators. So each statement below is the +corresponding generator statement pushed along an algebra map, by extensionality of algebra +maps on the free algebra — not by induction, unlike the derivative, since a group element +here acts by an algebra homomorphism. + +-/ + +/-- The fermionic sector equivalence intertwines the jet gauge actions. -/ +lemma fermionAlgebraEquiv_repJetGaugeGroupI (U : JetGaugeGroupI) (f : FermionJetAlgebra) : + fermionAlgebraEquiv (FermionJetAlgebra.repJetGaugeGroupI U f) + = fieldData.repJetFermion.exteriorAlgebra U (fermionAlgebraEquiv f) := + ExteriorAlgebra.algHom_exteriorAlgebra fermionAlgebraEquiv.toAlgHom + (fun x => fermionAlgebraEquiv_ι x) U + (fun x => fermionGeneratorsEquiv_symm_repJet U x) f + +/-- The Higgs sector equivalence intertwines the jet gauge actions. -/ +lemma higgsAlgebraEquiv_repJetGaugeGroupI (U : JetGaugeGroupI) (h : HiggsJetAlgebra) : + higgsAlgebraEquiv (HiggsJetAlgebra.repJetGaugeGroupI U h) + = fieldData.repJetBoson.symmetricAlgebra U (higgsAlgebraEquiv h) := + SymmetricAlgebra.algHom_symmetricAlgebra higgsAlgebraEquiv.toAlgHom + (fun x => higgsAlgebraEquiv_ι x) U + (fun x => bosonGeneratorsEquiv_symm_repJet U x) h + +/-- The fermionic sector equivalence intertwines the Lorentz actions. -/ +lemma fermionAlgebraEquiv_repLorentzGroup (Λ : SL(2,ℂ)) (f : FermionJetAlgebra) : + fermionAlgebraEquiv (FermionJetAlgebra.repLorentzGroup Λ f) + = fieldData.repLorentzFermion.exteriorAlgebra Λ (fermionAlgebraEquiv f) := + ExteriorAlgebra.algHom_exteriorAlgebra fermionAlgebraEquiv.toAlgHom + (fun x => fermionAlgebraEquiv_ι x) Λ + (fun x => fermionGeneratorsEquiv_symm_repLorentzGroup Λ x) f + +/-- The Higgs sector equivalence intertwines the Lorentz actions. -/ +lemma higgsAlgebraEquiv_repLorentzGroup (Λ : SL(2,ℂ)) (h : HiggsJetAlgebra) : + higgsAlgebraEquiv (HiggsJetAlgebra.repLorentzGroup Λ h) + = fieldData.repLorentzBoson.symmetricAlgebra Λ (higgsAlgebraEquiv h) := + SymmetricAlgebra.algHom_symmetricAlgebra higgsAlgebraEquiv.toAlgHom + (fun x => higgsAlgebraEquiv_ι x) Λ + (fun x => bosonGeneratorsEquiv_symm_repLorentzGroup Λ x) h + +end StandardModel diff --git a/Physlib/Particles/StandardModel/JetAlgebra/TransformsIn.lean b/Physlib/Particles/StandardModel/JetAlgebra/TransformsIn.lean index 404672d0c..17ca04534 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/TransformsIn.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/TransformsIn.lean @@ -19,21 +19,17 @@ carry two group actions: the jet gauge action `JetAlgebra.repJetGaugeGroupI` and Lorentz action `JetAlgebra.repLorentzGroup`. This file establishes how each family transforms under each of them. -The work is mechanical but for one point, which is the content of section A. The three -sector inclusions `includeFermion`, `includeHiggs`, `includeGauge` are equivariant for the -jet gauge action and for the Lorentz action, because both actions are tensor products of -the sector actions and each sector action fixes the unit. `includeGauge` was treated when -the gauge sector was shown to be a gauge field; the other two are proved here, and with -them every transformation law of a matter symbol is its sector's own law, pushed through an -algebra map. +The work is mechanical. The six sector restriction lemmas it rests on — the three sector +inclusions being equivariant for each of the two actions — are proved where the two actions +are defined, in `Physlib.Particles.StandardModel.JetAlgebra.GaugeAction` and +`Physlib.Particles.StandardModel.JetAlgebra.LorentzAction`; with them every transformation +law of a matter symbol is its sector's own law, pushed through an algebra map. These are the facts from which the transformation laws of an arbitrary Standard Model are obtained, by pushing them along the defining algebra map out of the jet algebra. ## ii. Key results -- `JetAlgebra.repJetGaugeGroupI_includeHiggs`, `JetAlgebra.repLorentzGroup_includeFermion` - and their companions : the sector inclusions are equivariant. - `JetAlgebra.transformsIn_higgsField` and its companions : the jet gauge transformation of the thirteen families. - `JetAlgebra.isLorentzDerivTransforms_higgsField` and its companions : the Lorentz @@ -41,11 +37,6 @@ are obtained, by pushing them along the defining algebra map out of the jet alge ## iii. Table of contents -- A. The sector inclusions are equivariant - - A.1. The sector inclusions on pure tensors - - A.2. The unit of the gauge sector - - A.3. Equivariance for the jet gauge action - - A.4. Equivariance for the Lorentz action - B. The jet gauge transformation of the field symbols - B.1. The Higgs families - B.2. The fermion families @@ -70,117 +61,6 @@ open TensorProduct Matrix MatrixGroups Lorentz /-! -## A. The sector inclusions are equivariant - -Both the jet gauge action and the Lorentz action on the jet algebra are tensor products of -the three sector actions. A sector inclusion puts the unit in the other two factors, so -equivariance is exactly the statement that the other two actions fix their units, which -they do — they are actions by algebra maps. - --/ - -/-! - -### A.1. The sector inclusions on pure tensors - --/ - -/-- The fermionic inclusion puts the unit in the Higgs and gauge factors. -/ -lemma includeFermion_apply (f : FermionJetAlgebra) : - includeFermion f = ((f ⊗ₜ[ℂ] (1 : HiggsJetAlgebra)) ⊗ₜ[ℂ] - (1 : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra))) := rfl - -/-- The Higgs inclusion puts the unit in the fermionic and gauge factors. -/ -lemma includeHiggs_apply (h : HiggsJetAlgebra) : - includeHiggs h = (((1 : FermionJetAlgebra) ⊗ₜ[ℂ] h) ⊗ₜ[ℂ] - (1 : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra))) := rfl - -/-! - -### A.2. The unit of the gauge sector - --/ - -/-- The jet gauge action on the complexified gauge sector fixes the unit. -/ -lemma complexRepJetGaugeGroupI_apply_one (U : JetGaugeGroupI) : - (GaugeJetAlgebra.complexRepJet localGaugeData) U - (1 : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) = 1 := by - rw [Algebra.TensorProduct.one_def, GaugeJetAlgebra.complexRepJet_tmul, - GaugeJetAlgebra.repJet_apply_one] - -/-- The Lorentz action on the complexified gauge sector fixes the unit. -/ -lemma complexRepLorentzGroup_apply_one (Λ : SL(2,ℂ)) : - (GaugeJetAlgebra.complexRepLorentzGroup GaugeAlgebra) Λ - (1 : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) = 1 := by - rw [Algebra.TensorProduct.one_def, GaugeJetAlgebra.complexRepLorentzGroup_tmul, - GaugeJetAlgebra.repLorentzGroup_apply_one] - -/-! - -### A.3. Equivariance for the jet gauge action - --/ - -/-- The jet gauge action restricts to the fermionic sector's own action. -/ -lemma repJetGaugeGroupI_includeFermion (U : JetGaugeGroupI) (f : FermionJetAlgebra) : - repJetGaugeGroupI U (includeFermion f) - = includeFermion (FermionJetAlgebra.repJetGaugeGroupI U f) := by - rw [includeFermion_apply, repJetGaugeGroupI_tmul, - show (FermionJetAlgebra.repJetGaugeGroupI.tprod HiggsJetAlgebra.repJetGaugeGroupI) U - (f ⊗ₜ[ℂ] (1 : HiggsJetAlgebra)) - = (FermionJetAlgebra.repJetGaugeGroupI U f) ⊗ₜ[ℂ] - (HiggsJetAlgebra.repJetGaugeGroupI U (1 : HiggsJetAlgebra)) from rfl, - show HiggsJetAlgebra.repJetGaugeGroupI U (1 : HiggsJetAlgebra) = 1 from - BosonicAlgebra.repJetGaugeGroupI_apply_one _ _ U, - complexRepJetGaugeGroupI_apply_one, includeFermion_apply] - -/-- The jet gauge action restricts to the Higgs sector's own action. -/ -lemma repJetGaugeGroupI_includeHiggs (U : JetGaugeGroupI) (h : HiggsJetAlgebra) : - repJetGaugeGroupI U (includeHiggs h) - = includeHiggs (HiggsJetAlgebra.repJetGaugeGroupI U h) := by - rw [includeHiggs_apply, repJetGaugeGroupI_tmul, - show (FermionJetAlgebra.repJetGaugeGroupI.tprod HiggsJetAlgebra.repJetGaugeGroupI) U - ((1 : FermionJetAlgebra) ⊗ₜ[ℂ] h) - = (FermionJetAlgebra.repJetGaugeGroupI U (1 : FermionJetAlgebra)) ⊗ₜ[ℂ] - (HiggsJetAlgebra.repJetGaugeGroupI U h) from rfl, - show FermionJetAlgebra.repJetGaugeGroupI U (1 : FermionJetAlgebra) = 1 from - FermionicAlgebra.repJetGaugeGroupI_apply_one _ _ U, - complexRepJetGaugeGroupI_apply_one, includeHiggs_apply] - -/-! - -### A.4. Equivariance for the Lorentz action - --/ - -/-- The Lorentz action restricts to the fermionic sector's own action. -/ -lemma repLorentzGroup_includeFermion (Λ : SL(2,ℂ)) (f : FermionJetAlgebra) : - repLorentzGroup Λ (includeFermion f) - = includeFermion (FermionJetAlgebra.repLorentzGroup Λ f) := by - rw [includeFermion_apply, repLorentzGroup_tmul, - show (FermionJetAlgebra.repLorentzGroup.tprod HiggsJetAlgebra.repLorentzGroup) Λ - (f ⊗ₜ[ℂ] (1 : HiggsJetAlgebra)) - = (FermionJetAlgebra.repLorentzGroup Λ f) ⊗ₜ[ℂ] - (HiggsJetAlgebra.repLorentzGroup Λ (1 : HiggsJetAlgebra)) from rfl, - show HiggsJetAlgebra.repLorentzGroup Λ (1 : HiggsJetAlgebra) = 1 from - BosonicAlgebra.repLorentzGroup_apply_one _ Λ, - complexRepLorentzGroup_apply_one, includeFermion_apply] - -/-- The Lorentz action restricts to the Higgs sector's own action. -/ -lemma repLorentzGroup_includeHiggs (Λ : SL(2,ℂ)) (h : HiggsJetAlgebra) : - repLorentzGroup Λ (includeHiggs h) - = includeHiggs (HiggsJetAlgebra.repLorentzGroup Λ h) := by - rw [includeHiggs_apply, repLorentzGroup_tmul, - show (FermionJetAlgebra.repLorentzGroup.tprod HiggsJetAlgebra.repLorentzGroup) Λ - ((1 : FermionJetAlgebra) ⊗ₜ[ℂ] h) - = (FermionJetAlgebra.repLorentzGroup Λ (1 : FermionJetAlgebra)) ⊗ₜ[ℂ] - (HiggsJetAlgebra.repLorentzGroup Λ h) from rfl, - show FermionJetAlgebra.repLorentzGroup Λ (1 : FermionJetAlgebra) = 1 from - FermionicAlgebra.repLorentzGroup_apply_one _ Λ, - complexRepLorentzGroup_apply_one, includeHiggs_apply] - -/-! - ## B. The jet gauge transformation of the field symbols `TransformsIn` asks that a jet of gauge transformations mix a derivative symbol with the @@ -204,14 +84,15 @@ theorem transformsIn_higgsField : LocalGaugeData.TransformsIn (B := JetAlgebra) repJetGaugeGroupI HiggsVec.repJetGaugeGroupI higgsField := by intro U φ s - rw [higgsField_eq_includeHiggs, repJetGaugeGroupI_includeHiggs, - show HiggsJetAlgebra.repJetGaugeGroupI U - (BosonicAlgebra.iteratedJetDeriv s (BosonicAlgebra.ofField φ)) - = _ from BosonicAlgebra.repJetGaugeGroupI_iteratedJetDeriv_ofField - HiggsVec.repJetGaugeGroupI HiggsVec.repJetGaugeGroupI_smul U φ s, - map_multiset_sum, Multiset.map_map] - refine congrArg Multiset.sum (Multiset.map_congr rfl fun p _ => ?_) - rw [Function.comp_apply, ← higgsField_eq_includeHiggs] + refine (congrArg (repJetGaugeGroupI U) (higgsField_eq_includeHiggs s φ)).trans ?_ + refine (repJetGaugeGroupI_includeHiggs U _).trans ?_ + refine (congrArg includeHiggs + (BosonicAlgebra.repJetGaugeGroupI_iteratedJetDeriv_ofField + HiggsVec.repJetGaugeGroupI HiggsVec.repJetGaugeGroupI_smul U φ s)).trans ?_ + refine (map_multiset_sum includeHiggs _).trans ?_ + refine (congrArg Multiset.sum (Multiset.map_map _ _ _)).trans ?_ + exact congrArg Multiset.sum + (Multiset.map_congr rfl fun q _ => (higgsField_eq_includeHiggs q.2 _).symm) /-- The conjugate Higgs symbols transform in the conjugate of the jet gauge representation carried by the jets of the Higgs field. -/ @@ -220,14 +101,15 @@ theorem transformsIn_conjHiggsField : (JetComponentSpace.repConj HiggsVec.repJetGaugeGroupI) conjHiggsField := by intro U φ s - rw [conjHiggsField_eq_includeHiggs, repJetGaugeGroupI_includeHiggs, - show HiggsJetAlgebra.repJetGaugeGroupI U - (BosonicAlgebra.iteratedJetDeriv s (BosonicAlgebra.ofConjField φ)) - = _ from BosonicAlgebra.repJetGaugeGroupI_iteratedJetDeriv_ofConjField - HiggsVec.repJetGaugeGroupI HiggsVec.repJetGaugeGroupI_smul U φ s, - map_multiset_sum, Multiset.map_map] - refine congrArg Multiset.sum (Multiset.map_congr rfl fun p _ => ?_) - rw [Function.comp_apply, ← conjHiggsField_eq_includeHiggs] + refine (congrArg (repJetGaugeGroupI U) (conjHiggsField_eq_includeHiggs s φ)).trans ?_ + refine (repJetGaugeGroupI_includeHiggs U _).trans ?_ + refine (congrArg includeHiggs + (BosonicAlgebra.repJetGaugeGroupI_iteratedJetDeriv_ofConjField + HiggsVec.repJetGaugeGroupI HiggsVec.repJetGaugeGroupI_smul U φ s)).trans ?_ + refine (map_multiset_sum includeHiggs _).trans ?_ + refine (congrArg Multiset.sum (Multiset.map_map _ _ _)).trans ?_ + exact congrArg Multiset.sum + (Multiset.map_congr rfl fun q _ => (conjHiggsField_eq_includeHiggs q.2 _).symm) /-! @@ -247,17 +129,21 @@ private lemma transformsIn_species {W : Type} [AddCommGroup W] [Module ℂ W] (hF : ∀ s φ, F s φ = fermionSymbol s (Module.Dual.transpose p φ)) : LocalGaugeData.TransformsIn (B := JetAlgebra) repJetGaugeGroupI repW F := by intro U φ s - rw [hF, fermionSymbol_eq_includeFermion, repJetGaugeGroupI_includeFermion, - show FermionJetAlgebra.repJetGaugeGroupI U - (FermionicAlgebra.iteratedJetDeriv s - (FermionicAlgebra.ofField (Module.Dual.transpose p φ))) - = _ from FermionicAlgebra.repJetGaugeGroupI_iteratedJetDeriv_ofField - FermionSpace.repJetGaugeGroupI FermionSpace.repJetGaugeGroupI_smul U _ s, - map_multiset_sum, Multiset.map_map] + refine (congrArg (repJetGaugeGroupI U) + ((hF s φ).trans (fermionSymbol_eq_includeFermion s _))).trans ?_ + refine (repJetGaugeGroupI_includeFermion U _).trans ?_ + refine (congrArg includeFermion + (FermionicAlgebra.repJetGaugeGroupI_iteratedJetDeriv_ofField + FermionSpace.repJetGaugeGroupI FermionSpace.repJetGaugeGroupI_smul U _ s)).trans ?_ + refine (map_multiset_sum includeFermion _).trans ?_ + refine (congrArg Multiset.sum (Multiset.map_map _ _ _)).trans ?_ refine congrArg Multiset.sum (Multiset.map_congr rfl fun q _ => ?_) - rw [Function.comp_apply, ← fermionSymbol_eq_includeFermion, hF] - exact congrArg (fermionSymbol q.2) - (LinearMap.congr_fun (repDualCoeff_comp p hp U⁻¹ q.1) φ) + exact (congrArg (fun χ : Module.Dual ℂ FermionSpace => + includeFermion (FermionicAlgebra.iteratedJetDeriv q.2 + (FermionicAlgebra.ofField χ))) + (LinearMap.congr_fun (repDualCoeff_comp p hp U⁻¹ q.1) φ)).trans + ((fermionSymbol_eq_includeFermion q.2 _).symm.trans + (hF q.2 (GaugeAlgebraRealization.repDualCoeff repW U⁻¹ q.1 φ)).symm) /-- The base-point Taylor coefficients of two conjugate jet gauge actions are intertwined, on the component-function index, by the conjugate of any map of value spaces intertwining @@ -296,17 +182,23 @@ private lemma transformsIn_conjSpecies {W : Type} [AddCommGroup W] [Module ℂ W LocalGaugeData.TransformsIn (B := JetAlgebra) repJetGaugeGroupI (JetComponentSpace.repConj repW) F := by intro U φ s - rw [hF, conjFermionSymbol_eq_includeFermion, repJetGaugeGroupI_includeFermion, - show FermionJetAlgebra.repJetGaugeGroupI U - (FermionicAlgebra.iteratedJetDeriv s - (FermionicAlgebra.ofConjField (Module.Dual.transpose (ConjModule.map p) φ))) - = _ from FermionicAlgebra.repJetGaugeGroupI_iteratedJetDeriv_ofConjField - FermionSpace.repJetGaugeGroupI FermionSpace.repJetGaugeGroupI_smul U _ s, - map_multiset_sum, Multiset.map_map] + refine (congrArg (repJetGaugeGroupI U) + ((hF s φ).trans (conjFermionSymbol_eq_includeFermion s _))).trans ?_ + refine (repJetGaugeGroupI_includeFermion U _).trans ?_ + refine (congrArg includeFermion + (FermionicAlgebra.repJetGaugeGroupI_iteratedJetDeriv_ofConjField + FermionSpace.repJetGaugeGroupI FermionSpace.repJetGaugeGroupI_smul U _ s)).trans ?_ + refine (map_multiset_sum includeFermion _).trans ?_ + refine (congrArg Multiset.sum (Multiset.map_map _ _ _)).trans ?_ refine congrArg Multiset.sum (Multiset.map_congr rfl fun q _ => ?_) - rw [Function.comp_apply, ← conjFermionSymbol_eq_includeFermion, hF] - exact congrArg (conjFermionSymbol q.2) - (repDualCoeff_repConj_transpose p (fun U' s' => repCoeff_comp p hp U' s') U⁻¹ q.1 φ) + exact (congrArg (fun χ : Module.Dual ℂ (ConjModule FermionSpace) => + includeFermion (FermionicAlgebra.iteratedJetDeriv q.2 + (FermionicAlgebra.ofConjField χ))) + (repDualCoeff_repConj_transpose p (fun U' s' => repCoeff_comp p hp U' s') + U⁻¹ q.1 φ)).trans + ((conjFermionSymbol_eq_includeFermion q.2 _).symm.trans + (hF q.2 (GaugeAlgebraRealization.repDualCoeff (JetComponentSpace.repConj repW) + U⁻¹ q.1 φ)).symm) /-- The symbols of the `i`-th generation down-type quark singlet transform in the jet gauge @@ -419,14 +311,23 @@ theorem isLorentzDerivTransforms_higgsField : IsLorentzDerivTransforms (A := JetAlgebra) repLorentzGroup (Representation.trivial ℂ SL(2,ℂ) HiggsVec) higgsField := by intro Λ n l φ + have hstart : ∀ (m : Multiset (Fin 1 ⊕ Fin 3)) (χ : Module.Dual ℂ HiggsVec), + Lorentz.iteratedD jetDeriv jetDeriv_comm m + (includeHiggs (BosonicAlgebra.ofField χ)) = higgsField m χ := + fun m χ => (iteratedD_includeHiggs m (BosonicAlgebra.ofField χ)).trans + (higgsField_eq_includeHiggs m χ).symm + refine (congrArg (repLorentzGroup Λ) (hstart (List.ofFn l) φ).symm).trans ?_ refine (Lorentz.IsLorentzDeriv.rep_iteratedD_ofFn jetDeriv_comm Λ l (includeHiggs (BosonicAlgebra.ofField φ))).trans ?_ refine Finset.sum_congr rfl fun p _ => ?_ - rw [repLorentzGroup_includeHiggs, - show HiggsJetAlgebra.repLorentzGroup Λ (BosonicAlgebra.ofField φ) - = BosonicAlgebra.ofField ((Representation.trivial ℂ SL(2,ℂ) HiggsVec).dual Λ φ) from - BosonicAlgebra.repLorentzGroup_ofField _ Λ φ] - rfl + refine congrArg (fun z : JetAlgebra => + (∏ i, (((Lorentz.SL2C.toLorentzGroup Λ).1 (p i) (l i) : ℝ) : ℂ)) • z) ?_ + exact (congrArg (fun z : JetAlgebra => + Lorentz.iteratedD jetDeriv jetDeriv_comm (List.ofFn p) z) + ((repLorentzGroup_includeHiggs Λ (BosonicAlgebra.ofField φ)).trans + (congrArg includeHiggs + (BosonicAlgebra.repLorentzGroup_ofField _ Λ φ)))).trans + (hstart (List.ofFn p) _) /-- The conjugate Higgs symbols transform as the derivative symbols of the conjugate of a Lorentz scalar. -/ @@ -434,15 +335,24 @@ theorem isLorentzDerivTransforms_conjHiggsField : IsLorentzDerivTransforms (A := JetAlgebra) repLorentzGroup (Representation.trivial ℂ SL(2,ℂ) HiggsVec).conj conjHiggsField := by intro Λ n l φ + have hstart : ∀ (m : Multiset (Fin 1 ⊕ Fin 3)) + (χ : Module.Dual ℂ (ConjModule HiggsVec)), + Lorentz.iteratedD jetDeriv jetDeriv_comm m + (includeHiggs (BosonicAlgebra.ofConjField χ)) = conjHiggsField m χ := + fun m χ => (iteratedD_includeHiggs m (BosonicAlgebra.ofConjField χ)).trans + (conjHiggsField_eq_includeHiggs m χ).symm + refine (congrArg (repLorentzGroup Λ) (hstart (List.ofFn l) φ).symm).trans ?_ refine (Lorentz.IsLorentzDeriv.rep_iteratedD_ofFn jetDeriv_comm Λ l (includeHiggs (BosonicAlgebra.ofConjField φ))).trans ?_ refine Finset.sum_congr rfl fun p _ => ?_ - rw [repLorentzGroup_includeHiggs, - show HiggsJetAlgebra.repLorentzGroup Λ (BosonicAlgebra.ofConjField φ) - = BosonicAlgebra.ofConjField - ((Representation.trivial ℂ SL(2,ℂ) HiggsVec).conj.dual Λ φ) from - BosonicAlgebra.repLorentzGroup_ofConjField _ Λ φ] - rfl + refine congrArg (fun z : JetAlgebra => + (∏ i, (((Lorentz.SL2C.toLorentzGroup Λ).1 (p i) (l i) : ℝ) : ℂ)) • z) ?_ + exact (congrArg (fun z : JetAlgebra => + Lorentz.iteratedD jetDeriv jetDeriv_comm (List.ofFn p) z) + ((repLorentzGroup_includeHiggs Λ (BosonicAlgebra.ofConjField φ)).trans + (congrArg includeHiggs + (BosonicAlgebra.repLorentzGroup_ofConjField _ Λ φ)))).trans + (hstart (List.ofFn p) _) /-! @@ -467,18 +377,25 @@ private lemma isLorentzDerivTransforms_species {W : Type} [AddCommGroup W] [Modu (hF : ∀ s φ, F s φ = fermionSymbol s (Module.Dual.transpose p φ)) : IsLorentzDerivTransforms (A := JetAlgebra) repLorentzGroup repW F := by intro Λ n l φ - rw [hF] + have hstart : ∀ (m : Multiset (Fin 1 ⊕ Fin 3)) (χ : Module.Dual ℂ FermionSpace), + Lorentz.iteratedD jetDeriv jetDeriv_comm m + (includeFermion (FermionicAlgebra.ofField χ)) = fermionSymbol m χ := + fun m χ => (iteratedD_includeFermion m (FermionicAlgebra.ofField χ)).trans + (fermionSymbol_eq_includeFermion m χ).symm + refine (congrArg (repLorentzGroup Λ) + ((hF (List.ofFn l) φ).trans (hstart (List.ofFn l) _).symm)).trans ?_ refine (Lorentz.IsLorentzDeriv.rep_iteratedD_ofFn jetDeriv_comm Λ l (includeFermion (FermionicAlgebra.ofField (Module.Dual.transpose p φ)))).trans ?_ refine Finset.sum_congr rfl fun q _ => ?_ - rw [repLorentzGroup_includeFermion, - show FermionJetAlgebra.repLorentzGroup Λ - (FermionicAlgebra.ofField (Module.Dual.transpose p φ)) - = FermionicAlgebra.ofField - (FermionSpace.repLorentzGroup.dual Λ (Module.Dual.transpose p φ)) from - FermionicAlgebra.repLorentzGroup_ofField _ Λ _, - hdual, hF] - rfl + refine congrArg (fun z : JetAlgebra => + (∏ i, (((Lorentz.SL2C.toLorentzGroup Λ).1 (q i) (l i) : ℝ) : ℂ)) • z) ?_ + exact (congrArg (fun z : JetAlgebra => + Lorentz.iteratedD jetDeriv jetDeriv_comm (List.ofFn q) z) + ((repLorentzGroup_includeFermion Λ _).trans + (congrArg includeFermion + ((FermionicAlgebra.repLorentzGroup_ofField _ Λ _).trans + (congrArg FermionicAlgebra.ofField (hdual Λ φ)))))).trans + ((hstart (List.ofFn q) _).trans (hF (List.ofFn q) (repW.dual Λ φ)).symm) /-- The Lorentz transformation law of the conjugate symbols of a fermion species: the law of the species itself, read on the conjugate representations. -/ @@ -493,19 +410,27 @@ private lemma isLorentzDerivTransforms_conjSpecies {W : Type} [AddCommGroup W] (Module.Dual.transpose (ConjModule.map p) φ)) : IsLorentzDerivTransforms (A := JetAlgebra) repLorentzGroup repW.conj F := by intro Λ n l φ - rw [hF] + have hstart : ∀ (m : Multiset (Fin 1 ⊕ Fin 3)) + (χ : Module.Dual ℂ (ConjModule FermionSpace)), + Lorentz.iteratedD jetDeriv jetDeriv_comm m + (includeFermion (FermionicAlgebra.ofConjField χ)) = conjFermionSymbol m χ := + fun m χ => (iteratedD_includeFermion m (FermionicAlgebra.ofConjField χ)).trans + (conjFermionSymbol_eq_includeFermion m χ).symm + refine (congrArg (repLorentzGroup Λ) + ((hF (List.ofFn l) φ).trans (hstart (List.ofFn l) _).symm)).trans ?_ refine (Lorentz.IsLorentzDeriv.rep_iteratedD_ofFn jetDeriv_comm Λ l (includeFermion (FermionicAlgebra.ofConjField (Module.Dual.transpose (ConjModule.map p) φ)))).trans ?_ refine Finset.sum_congr rfl fun q _ => ?_ - rw [repLorentzGroup_includeFermion, - show FermionJetAlgebra.repLorentzGroup Λ - (FermionicAlgebra.ofConjField (Module.Dual.transpose (ConjModule.map p) φ)) - = FermionicAlgebra.ofConjField (FermionSpace.repLorentzGroup.conj.dual Λ - (Module.Dual.transpose (ConjModule.map p) φ)) from - FermionicAlgebra.repLorentzGroup_ofConjField _ Λ _, - hdual, hF] - rfl + refine congrArg (fun z : JetAlgebra => + (∏ i, (((Lorentz.SL2C.toLorentzGroup Λ).1 (q i) (l i) : ℝ) : ℂ)) • z) ?_ + exact (congrArg (fun z : JetAlgebra => + Lorentz.iteratedD jetDeriv jetDeriv_comm (List.ofFn q) z) + ((repLorentzGroup_includeFermion Λ _).trans + (congrArg includeFermion + ((FermionicAlgebra.repLorentzGroup_ofConjField _ Λ _).trans + (congrArg FermionicAlgebra.ofConjField (hdual Λ φ)))))).trans + ((hstart (List.ofFn q) _).trans (hF (List.ofFn q) (repW.conj.dual Λ φ)).symm) /-- The symbols of the `i`-th generation down-type quark singlet transform as the derivative From c10697bd6b3995c8e19067e376fec1948f167264 Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Thu, 10 Sep 2026 14:05:16 +0100 Subject: [PATCH 317/367] wip: local changes before merging origin/AddPotentialAlgebra Co-Authored-By: Claude Opus 5 (1M context) --- .notes.json | 121 +------- Physlib.lean | 1 + .../GaugeFieldData/BosonGenerators.lean | 155 +++++----- .../GaugeFieldData/BosonMatterField.lean | 8 + .../GaugeFieldData/FermionGenerators.lean | 155 +++++----- .../GaugeFieldData/FermionMatterField.lean | 8 + .../LocalGaugeData/InfinitesimalAction.lean | 2 +- .../GaugeTheory/MatterField/FieldAlgebra.lean | 26 +- .../MatterField/JetComponentSpace/Basic.lean | 279 ++++++++---------- .../JetComponentSpace/GaugeAction.lean | 53 ++-- .../GaugeTheory/MatterField/Pi.lean | 49 ++- .../GaugeTheory/MatterField/Prod.lean | 27 +- .../JetAlgebra/FieldAlgebra/Basic.lean | 96 +++--- .../FieldAlgebra/ConstantGaugeAction.lean | 56 ++-- .../JetAlgebra/FieldAlgebra/GaugeAction.lean | 99 +++---- .../JetAlgebra/FieldAlgebra/JetDeriv.lean | 42 +-- .../FieldAlgebra/JetDerivClass.lean | 27 +- .../FieldAlgebra/JetDerivConstruction.lean | 68 +++-- .../FieldAlgebra/LorentzAction.lean | 78 ++--- .../JetAlgebra/FieldAlgebra/MassDim.lean | 14 +- .../JetAlgebra/FieldAlgebra/Prod.lean | 49 +-- .../JetAlgebra/FieldAlgebra/Statistics.lean | 106 +++---- .../JetAlgebra/LocalFieldAlgebra.lean | 38 +-- .../Fermions/JetAlgebra/Basic.lean | 70 +++-- .../Particles/StandardModel/FieldData.lean | 8 +- .../HiggsBoson/JetAlgebra/Algebra.lean | 134 +++++++++ .../HiggsBoson/JetAlgebra/Basic.lean | 85 ------ .../StandardModel/JetAlgebra/Basic.lean | 2 +- .../StandardModel/JetAlgebra/GaugeAction.lean | 21 +- .../Matter/BosonicAlgebra/Basic.lean | 62 ++-- .../Matter/BosonicAlgebra/GaugeAction.lean | 154 ++++------ .../Matter/BosonicAlgebra/JetDeriv.lean | 80 ++--- .../Matter/BosonicAlgebra/LorentzAction.lean | 82 ++--- .../Matter/BosonicAlgebra/MassDim.lean | 16 +- .../Matter/BosonicAlgebra/MassWeightPoly.lean | 76 ++--- .../Matter/BosonicAlgebra/Prod.lean | 15 +- .../Matter/BosonicAlgebra/TransformsIn.lean | 93 +++--- .../Matter/FermionicAlgebra/Basic.lean | 66 +++-- .../Matter/FermionicAlgebra/GaugeAction.lean | 154 ++++------ .../Matter/FermionicAlgebra/JetDeriv.lean | 106 +++---- .../FermionicAlgebra/LorentzAction.lean | 82 ++--- .../Matter/FermionicAlgebra/MassDim.lean | 16 +- .../FermionicAlgebra/MassWeightPoly.lean | 108 +++---- .../Matter/FermionicAlgebra/Prod.lean | 29 +- .../Matter/FermionicAlgebra/TransformsIn.lean | 89 +++--- 45 files changed, 1504 insertions(+), 1601 deletions(-) create mode 100644 Physlib/Particles/StandardModel/HiggsBoson/JetAlgebra/Algebra.lean diff --git a/.notes.json b/.notes.json index d40c5b0e9..9e26dfeeb 100644 --- a/.notes.json +++ b/.notes.json @@ -1,120 +1 @@ -{ - "./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 +{} \ No newline at end of file diff --git a/Physlib.lean b/Physlib.lean index bc7a78733..3737ff653 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -355,6 +355,7 @@ 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.Algebra public import Physlib.Particles.StandardModel.HiggsBoson.JetAlgebra.Basic public import Physlib.Particles.StandardModel.HiggsBoson.MatterField public import Physlib.Particles.StandardModel.HiggsBoson.Potential diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/BosonGenerators.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/BosonGenerators.lean index 81be54275..ee9c4b467 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/BosonGenerators.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/BosonGenerators.lean @@ -6,6 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeFieldData.BosonMatterField +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.GaugeAction /-! # The bosonic generators of a gauge theory @@ -106,13 +107,13 @@ variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] is natural in the value space — `JetComponentSpace.comap_comp_massWeightScale` — and so cannot tell the species apart. When the weights do agree the two descriptions coincide, which is section C below. -/ -abbrev BosonGenerators : Type := ⨁ i, JetComponentSpace (T.BosonValue i) +abbrev BosonGenerators : Type := ⨁ i, JetComponentSpace (T.boson i) /-- The inclusion of the component space of one bosonic species into the bosonic generator space. -/ abbrev inclBoson (i : T.BosonSpecies) : - JetComponentSpace (T.BosonValue i) →ₗ[ℂ] T.BosonGenerators := - DirectSum.lof ℂ T.BosonSpecies (fun i => JetComponentSpace (T.BosonValue i)) i + JetComponentSpace (T.boson i) →ₗ[ℂ] T.BosonGenerators := + DirectSum.lof ℂ T.BosonSpecies (fun i => JetComponentSpace (T.boson i)) i section Assemble @@ -120,16 +121,16 @@ variable {N : Type*} [AddCommMonoid N] [Module ℂ N] /-- The assembly of a species-wise family of linear maps out of the bosonic generator space into a common target. -/ -abbrev assembleBoson (f : ∀ i, JetComponentSpace (T.BosonValue i) →ₗ[ℂ] N) : +abbrev assembleBoson (f : ∀ i, JetComponentSpace (T.boson i) →ₗ[ℂ] N) : T.BosonGenerators →ₗ[ℂ] N := DirectSum.toModule ℂ T.BosonSpecies N f variable {T} -lemma assembleBoson_inclBoson (f : ∀ i, JetComponentSpace (T.BosonValue i) →ₗ[ℂ] N) - (i : T.BosonSpecies) (x : JetComponentSpace (T.BosonValue i)) : +lemma assembleBoson_inclBoson (f : ∀ i, JetComponentSpace (T.boson i) →ₗ[ℂ] N) + (i : T.BosonSpecies) (x : JetComponentSpace (T.boson i)) : T.assembleBoson f (T.inclBoson i x) = f i x := - DirectSum.toModule_lof (M := fun i => JetComponentSpace (T.BosonValue i)) ℂ i x + DirectSum.toModule_lof (M := fun i => JetComponentSpace (T.boson i)) ℂ i x /-- Two linear maps out of the bosonic generator space agreeing on every species are equal. -/ @@ -160,7 +161,7 @@ gauge jets, and nothing extends them to the algebra `J(T)`. Lorentz representation of its matter field. -/ noncomputable def repLorentzBoson : Representation ℂ SL(2,ℂ) T.BosonGenerators where toFun Λ := T.assembleBoson fun i => - (T.inclBoson i).comp (JetComponentSpace.repLorentzGroup (T.boson i).repLorentz Λ) + (T.inclBoson i).comp (JetComponentSpace.repLorentzGroup (T.boson i) Λ) map_one' := bosonGenerators_hom_ext fun i x => by simp map_mul' Λ Λ' := bosonGenerators_hom_ext fun i x => by simp @@ -168,9 +169,9 @@ variable {T} @[simp] lemma repLorentzBoson_inclBoson (Λ : SL(2,ℂ)) (i : T.BosonSpecies) - (x : JetComponentSpace (T.BosonValue i)) : + (x : JetComponentSpace (T.boson i)) : T.repLorentzBoson Λ (T.inclBoson i x) - = T.inclBoson i (JetComponentSpace.repLorentzGroup (T.boson i).repLorentz Λ x) := + = T.inclBoson i (JetComponentSpace.repLorentzGroup (T.boson i) Λ x) := assembleBoson_inclBoson _ i x variable (T) @@ -187,7 +188,7 @@ variable (T) `JetComponentSpace.repJet` needs are already fields of `MatterField`. -/ noncomputable def repJetBoson : Representation ℂ G T.BosonGenerators where toFun U := T.assembleBoson fun i => (T.inclBoson i).comp - (JetComponentSpace.repJet (T.boson i).repJet (T.boson i).repJet_smul U) + (JetComponentSpace.repJet (T.boson i) U) map_one' := bosonGenerators_hom_ext fun i x => by simp map_mul' U W := bosonGenerators_hom_ext fun i x => by simp @@ -195,10 +196,10 @@ variable {T} @[simp] lemma repJetBoson_inclBoson (U : G) (i : T.BosonSpecies) - (x : JetComponentSpace (T.BosonValue i)) : + (x : JetComponentSpace (T.boson i)) : T.repJetBoson U (T.inclBoson i x) = T.inclBoson i - (JetComponentSpace.repJet (T.boson i).repJet (T.boson i).repJet_smul U x) := + (JetComponentSpace.repJet (T.boson i) U x) := assembleBoson_inclBoson _ i x variable (T) @@ -227,7 +228,7 @@ variable {T} the weight recorded in its matter field. -/ @[simp] lemma massWeightScaleBoson_inclBoson (c : ℂ) (i : T.BosonSpecies) - (x : JetComponentSpace (T.BosonValue i)) : + (x : JetComponentSpace (T.boson i)) : T.massWeightScaleBoson c (T.inclBoson i x) = T.inclBoson i (JetComponentSpace.massWeightScale (T.boson i).massWeight c x) := @@ -239,9 +240,9 @@ lemma massWeightScaleBoson_inclBoson (c : ℂ) (i : T.BosonSpecies) lemma massWeightScaleBoson_inclBoson_basis_tmul (c : ℂ) (i : T.BosonSpecies) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (T.BosonValue i)) : T.massWeightScaleBoson c (T.inclBoson i - ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace (T.BosonValue i))) + ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace (T.boson i))) = c ^ ((T.boson i).massWeight + 2 * Multiset.card s) • T.inclBoson i - ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace (T.BosonValue i)) := by + ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace (T.boson i)) := by rw [massWeightScaleBoson_inclBoson, ← LinearMap.map_smul] refine congrArg _ (Prod.ext ?_ ?_) · exact JetComponentSpace.massWeightScale_fst_basis_tmul (T.boson i).massWeight c s φ 0 @@ -253,9 +254,9 @@ lemma massWeightScaleBoson_inclBoson_basis_tmul_conj (c : ℂ) (i : T.BosonSpeci (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule (T.BosonValue i))) : T.massWeightScaleBoson c (T.inclBoson i - ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace (T.BosonValue i))) + ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace (T.boson i))) = c ^ ((T.boson i).massWeight + 2 * Multiset.card s) • T.inclBoson i - ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace (T.BosonValue i)) := by + ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace (T.boson i)) := by rw [massWeightScaleBoson_inclBoson, ← LinearMap.map_smul] refine congrArg _ (Prod.ext ?_ ?_) · simp @@ -272,16 +273,18 @@ variable (T) -/ -/-- **The bosonic generator space is the component space of the bosonic module.** The +/-- **The bosonic generator space is the component space of the bosonic matter field.** The direct sum over the species of their component spaces is, the species type being finite, - the same thing as the space of component functions `∂_s φ_α` of a single field valued in - the whole bosonic module — the presentation of the boson content used in writing a - theory down. -/ -noncomputable def bosonGeneratorsEquiv : - T.BosonGenerators ≃ₗ[ℂ] JetComponentSpace T.BosonModule := + the same thing as the space of component functions of the single field + `T.bosonMatterField w h` — the presentation of the boson content used in writing a theory + down. The shared weight `w` enters only because a component space is now taken of a + matter field, and the only matter field on `T.BosonModule` is that one; the underlying + identification does not use it. -/ +noncomputable def bosonGeneratorsEquiv (w : ℕ) (h : ∀ i, (T.boson i).massWeight = w) : + T.BosonGenerators ≃ₗ[ℂ] JetComponentSpace (T.bosonMatterField w h) := (DirectSum.linearEquivFunOnFintype ℂ T.BosonSpecies - fun i => JetComponentSpace (T.BosonValue i)).trans - (JetComponentSpace.piEquiv T.BosonValue).symm + fun i => JetComponentSpace (T.boson i)).trans + (MatterField.jetComponentSpacePiEquiv T.boson w h).symm /-! @@ -292,36 +295,42 @@ noncomputable def bosonGeneratorsEquiv : variable {T} /-- **A species sits inside the bosonic generators as the pullback along the projection - onto it.** A component function `∂_s φ_α` of the multiplet `i` becomes the component - function of the whole scalar field whose target covector is supported on that - multiplet. -/ + onto it.** A component function of the multiplet `i` becomes the component function of + the whole field whose target covector is supported on that multiplet. -/ @[simp] -lemma bosonGeneratorsEquiv_inclBoson (i : T.BosonSpecies) - (x : JetComponentSpace (T.BosonValue i)) : - T.bosonGeneratorsEquiv (T.inclBoson i x) - = JetComponentSpace.comap (T.projBosonValue i) x := by - rw [bosonGeneratorsEquiv, LinearEquiv.trans_apply, - show (DirectSum.linearEquivFunOnFintype ℂ T.BosonSpecies - fun i => JetComponentSpace (T.BosonValue i)) (T.inclBoson i x) - = Pi.single i x from DirectSum.linearEquivFunOnFintype_lof - (M := fun i => JetComponentSpace (T.BosonValue i)) ℂ i x, - JetComponentSpace.piEquiv_symm_single] - -/-- Two linear maps out of the component space of the bosonic module agree as soon as they - agree on every species, the species pullbacks spanning it. This is the counterpart, on - the single-field side of the identification, of `bosonGenerators_hom_ext`. -/ -lemma bosonModuleComponents_hom_ext {N : Type} [AddCommGroup N] [Module ℂ N] - {F F' : JetComponentSpace T.BosonModule →ₗ[ℂ] N} - (h : ∀ i x, F (JetComponentSpace.comap (T.projBosonValue i) x) - = F' (JetComponentSpace.comap (T.projBosonValue i) x)) : F = F' := by - have key : F.comp T.bosonGeneratorsEquiv.toLinearMap - = F'.comp T.bosonGeneratorsEquiv.toLinearMap := +lemma bosonGeneratorsEquiv_inclBoson (w : ℕ) (h : ∀ i, (T.boson i).massWeight = w) + (i : T.BosonSpecies) (x : JetComponentSpace (T.boson i)) : + T.bosonGeneratorsEquiv w h (T.inclBoson i x) + = JetComponentSpace.comap + (T.projBosonField w h i) x := by + have hlof : (DirectSum.linearEquivFunOnFintype ℂ T.BosonSpecies + fun i => JetComponentSpace (T.boson i)) (T.inclBoson i x) = Pi.single i x := + DirectSum.linearEquivFunOnFintype_lof + (M := fun i => JetComponentSpace (T.boson i)) ℂ i x + show (MatterField.jetComponentSpacePiEquiv T.boson w h).symm + ((DirectSum.linearEquivFunOnFintype ℂ T.BosonSpecies + fun i => JetComponentSpace (T.boson i)) (T.inclBoson i x)) = _ + rw [hlof, MatterField.jetComponentSpacePiEquiv_symm_single] + rfl + +/-- Two linear maps out of the component space of the bosonic matter field agree as soon as + they agree on every species, the species pullbacks spanning it. This is the counterpart, + on the single-field side of the identification, of `bosonGenerators_hom_ext`. -/ +lemma bosonFieldComponents_hom_ext {N : Type} [AddCommGroup N] [Module ℂ N] + (w : ℕ) (h : ∀ i, (T.boson i).massWeight = w) + {F F' : JetComponentSpace (T.bosonMatterField w h) →ₗ[ℂ] N} + (hs : ∀ i x, F (JetComponentSpace.comap + (T.projBosonField w h i) x) + = F' (JetComponentSpace.comap + (T.projBosonField w h i) x)) : F = F' := by + have key : F.comp (T.bosonGeneratorsEquiv w h).toLinearMap + = F'.comp (T.bosonGeneratorsEquiv w h).toLinearMap := bosonGenerators_hom_ext fun i x => by simp only [LinearMap.comp_apply, LinearEquiv.coe_coe, bosonGeneratorsEquiv_inclBoson] - exact h i x + exact hs i x refine LinearMap.ext fun z => ?_ - simpa using LinearMap.congr_fun key (T.bosonGeneratorsEquiv.symm z) + simpa using LinearMap.congr_fun key ((T.bosonGeneratorsEquiv w h).symm z) /-! @@ -330,44 +339,44 @@ lemma bosonModuleComponents_hom_ext {N : Type} [AddCommGroup N] [Module ℂ N] -/ /-- **The identification is Lorentz-equivariant.** The species-diagonal Lorentz action on - the generator space is the Lorentz action on the component functions of the single - scalar field: each species is a subrepresentation of the bosonic module, so pulling - back along the projection onto it commutes with the two actions. No common mass weight - is needed here — the Lorentz action does not see it. -/ -lemma bosonGeneratorsEquiv_repLorentzBoson (Λ : SL(2,ℂ)) (y : T.BosonGenerators) : - T.bosonGeneratorsEquiv (T.repLorentzBoson Λ y) - = JetComponentSpace.repLorentzGroup T.repLorentzBosonModule Λ - (T.bosonGeneratorsEquiv y) := by - have key : T.bosonGeneratorsEquiv.toLinearMap.comp (T.repLorentzBoson Λ) - = (JetComponentSpace.repLorentzGroup T.repLorentzBosonModule Λ).comp - T.bosonGeneratorsEquiv.toLinearMap := by + the generator space is the Lorentz action on the component functions of the single field: + each species is a subrepresentation of the bosonic matter field, so pulling back along the + projection onto it commutes with the two actions. -/ +lemma bosonGeneratorsEquiv_repLorentzBoson (w : ℕ) (h : ∀ i, (T.boson i).massWeight = w) + (Λ : SL(2,ℂ)) (y : T.BosonGenerators) : + T.bosonGeneratorsEquiv w h (T.repLorentzBoson Λ y) + = JetComponentSpace.repLorentzGroup (T.bosonMatterField w h) Λ + (T.bosonGeneratorsEquiv w h y) := by + have key : (T.bosonGeneratorsEquiv w h).toLinearMap.comp (T.repLorentzBoson Λ) + = (JetComponentSpace.repLorentzGroup (T.bosonMatterField w h) Λ).comp + (T.bosonGeneratorsEquiv w h).toLinearMap := by refine bosonGenerators_hom_ext fun i x => ?_ rw [LinearMap.comp_apply, LinearMap.comp_apply, LinearEquiv.coe_coe, repLorentzBoson_inclBoson, bosonGeneratorsEquiv_inclBoson, bosonGeneratorsEquiv_inclBoson] exact LinearMap.congr_fun (JetComponentSpace.comap_comp_repLorentzGroup - T.repLorentzBosonModule (T.boson i).repLorentz - (T.projBosonValue i) (fun _ => LinearMap.ext fun _ => rfl) Λ) x + (T.projBosonField w h i) + (fun _ => LinearMap.ext fun _ => rfl) Λ) x exact LinearMap.congr_fun key y /-- **The identification carries the species-wise mass-weight scaling to a single - scaling.** With one weight `w` shared by every bosonic species, the scaling that acts - on each species through its own weight is the scaling of weight `w` on the component - functions of the one scalar field: `comap` is natural in the value space, so it does - not see which species a generator came from. -/ + scaling.** With one weight `w` shared by every species, the scaling that acts on each + species through its own weight is the scaling of weight `w` on the component functions of + the one field: `comap` is natural in the value space, so it does not see which species a + generator came from. -/ lemma bosonGeneratorsEquiv_massWeightScaleBoson (w : ℕ) (h : ∀ i, (T.boson i).massWeight = w) (c : ℂ) (y : T.BosonGenerators) : - T.bosonGeneratorsEquiv (T.massWeightScaleBoson c y) - = JetComponentSpace.massWeightScale w c (T.bosonGeneratorsEquiv y) := by - have key : T.bosonGeneratorsEquiv.toLinearMap.comp (T.massWeightScaleBoson c) + T.bosonGeneratorsEquiv w h (T.massWeightScaleBoson c y) + = JetComponentSpace.massWeightScale w c (T.bosonGeneratorsEquiv w h y) := by + have key : (T.bosonGeneratorsEquiv w h).toLinearMap.comp (T.massWeightScaleBoson c) = (JetComponentSpace.massWeightScale w c).comp - T.bosonGeneratorsEquiv.toLinearMap := by + (T.bosonGeneratorsEquiv w h).toLinearMap := by refine bosonGenerators_hom_ext fun i x => ?_ rw [LinearMap.comp_apply, LinearMap.comp_apply, LinearEquiv.coe_coe, massWeightScaleBoson_inclBoson, bosonGeneratorsEquiv_inclBoson, bosonGeneratorsEquiv_inclBoson, h i] exact LinearMap.congr_fun (JetComponentSpace.comap_comp_massWeightScale - (T.projBosonValue i) w c) x + (T.projBosonField w h i) w c) x exact LinearMap.congr_fun key y end GaugeFieldData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/BosonMatterField.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/BosonMatterField.lean index 346a049ba..d2c590471 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/BosonMatterField.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/BosonMatterField.lean @@ -185,4 +185,12 @@ lemma finrank_bosonMatterField (w : ℕ) (h : ∀ i, (T.boson i).massWeight = w) = ∑ i, Module.finrank ℂ (T.BosonValue i) := T.finrank_bosonModule +/-- The projection of the bosonic matter field onto one species, typed as a map out of + `(T.bosonMatterField w h).V` rather than out of `T.BosonModule`. The two are the same + type by definition, but naming the first keeps unification from having to unfold the + direct sum every time the projection meets the matter field. -/ +noncomputable abbrev projBosonField (w : ℕ) (h : ∀ i, (T.boson i).massWeight = w) + (i : T.BosonSpecies) : (T.bosonMatterField w h).V →ₗ[ℂ] (T.boson i).V := + LinearMap.proj i + end GaugeFieldData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/FermionGenerators.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/FermionGenerators.lean index 05502ec82..b65839c1d 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/FermionGenerators.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/FermionGenerators.lean @@ -6,6 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeFieldData.FermionMatterField +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.GaugeAction /-! # The fermionic generators of a gauge theory @@ -103,13 +104,13 @@ variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] is natural in the value space — `JetComponentSpace.comap_comp_massWeightScale` — and so cannot tell the species apart. When the weights do agree the two descriptions coincide, which is section C below. -/ -abbrev FermionGenerators : Type := ⨁ i, JetComponentSpace (T.FermionValue i) +abbrev FermionGenerators : Type := ⨁ i, JetComponentSpace (T.fermion i) /-- The inclusion of the component space of one fermionic species into the fermionic generator space. -/ abbrev inclFermion (i : T.FermionSpecies) : - JetComponentSpace (T.FermionValue i) →ₗ[ℂ] T.FermionGenerators := - DirectSum.lof ℂ T.FermionSpecies (fun i => JetComponentSpace (T.FermionValue i)) i + JetComponentSpace (T.fermion i) →ₗ[ℂ] T.FermionGenerators := + DirectSum.lof ℂ T.FermionSpecies (fun i => JetComponentSpace (T.fermion i)) i section Assemble @@ -117,16 +118,16 @@ variable {N : Type*} [AddCommMonoid N] [Module ℂ N] /-- The assembly of a species-wise family of linear maps out of the fermionic generator space into a common target. -/ -abbrev assembleFermion (f : ∀ i, JetComponentSpace (T.FermionValue i) →ₗ[ℂ] N) : +abbrev assembleFermion (f : ∀ i, JetComponentSpace (T.fermion i) →ₗ[ℂ] N) : T.FermionGenerators →ₗ[ℂ] N := DirectSum.toModule ℂ T.FermionSpecies N f variable {T} -lemma assembleFermion_inclFermion (f : ∀ i, JetComponentSpace (T.FermionValue i) →ₗ[ℂ] N) - (i : T.FermionSpecies) (x : JetComponentSpace (T.FermionValue i)) : +lemma assembleFermion_inclFermion (f : ∀ i, JetComponentSpace (T.fermion i) →ₗ[ℂ] N) + (i : T.FermionSpecies) (x : JetComponentSpace (T.fermion i)) : T.assembleFermion f (T.inclFermion i x) = f i x := - DirectSum.toModule_lof (M := fun i => JetComponentSpace (T.FermionValue i)) ℂ i x + DirectSum.toModule_lof (M := fun i => JetComponentSpace (T.fermion i)) ℂ i x /-- Two linear maps out of the fermionic generator space agreeing on every species are equal. -/ @@ -157,7 +158,7 @@ gauge jets, and nothing extends them to the algebra `J(T)`. Lorentz representation of its matter field. -/ noncomputable def repLorentzFermion : Representation ℂ SL(2,ℂ) T.FermionGenerators where toFun Λ := T.assembleFermion fun i => - (T.inclFermion i).comp (JetComponentSpace.repLorentzGroup (T.fermion i).repLorentz Λ) + (T.inclFermion i).comp (JetComponentSpace.repLorentzGroup (T.fermion i) Λ) map_one' := fermionGenerators_hom_ext fun i x => by simp map_mul' Λ Λ' := fermionGenerators_hom_ext fun i x => by simp @@ -165,9 +166,9 @@ variable {T} @[simp] lemma repLorentzFermion_inclFermion (Λ : SL(2,ℂ)) (i : T.FermionSpecies) - (x : JetComponentSpace (T.FermionValue i)) : + (x : JetComponentSpace (T.fermion i)) : T.repLorentzFermion Λ (T.inclFermion i x) - = T.inclFermion i (JetComponentSpace.repLorentzGroup (T.fermion i).repLorentz Λ x) := + = T.inclFermion i (JetComponentSpace.repLorentzGroup (T.fermion i) Λ x) := assembleFermion_inclFermion _ i x variable (T) @@ -184,7 +185,7 @@ variable (T) `JetComponentSpace.repJet` needs are already fields of `MatterField`. -/ noncomputable def repJetFermion : Representation ℂ G T.FermionGenerators where toFun U := T.assembleFermion fun i => (T.inclFermion i).comp - (JetComponentSpace.repJet (T.fermion i).repJet (T.fermion i).repJet_smul U) + (JetComponentSpace.repJet (T.fermion i) U) map_one' := fermionGenerators_hom_ext fun i x => by simp map_mul' U W := fermionGenerators_hom_ext fun i x => by simp @@ -192,10 +193,10 @@ variable {T} @[simp] lemma repJetFermion_inclFermion (U : G) (i : T.FermionSpecies) - (x : JetComponentSpace (T.FermionValue i)) : + (x : JetComponentSpace (T.fermion i)) : T.repJetFermion U (T.inclFermion i x) = T.inclFermion i - (JetComponentSpace.repJet (T.fermion i).repJet (T.fermion i).repJet_smul U x) := + (JetComponentSpace.repJet (T.fermion i) U x) := assembleFermion_inclFermion _ i x variable (T) @@ -224,7 +225,7 @@ variable {T} the weight recorded in its matter field. -/ @[simp] lemma massWeightScaleFermion_inclFermion (c : ℂ) (i : T.FermionSpecies) - (x : JetComponentSpace (T.FermionValue i)) : + (x : JetComponentSpace (T.fermion i)) : T.massWeightScaleFermion c (T.inclFermion i x) = T.inclFermion i (JetComponentSpace.massWeightScale (T.fermion i).massWeight c x) := @@ -236,9 +237,9 @@ lemma massWeightScaleFermion_inclFermion (c : ℂ) (i : T.FermionSpecies) lemma massWeightScaleFermion_inclFermion_basis_tmul (c : ℂ) (i : T.FermionSpecies) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (T.FermionValue i)) : T.massWeightScaleFermion c (T.inclFermion i - ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace (T.FermionValue i))) + ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace (T.fermion i))) = c ^ ((T.fermion i).massWeight + 2 * Multiset.card s) • T.inclFermion i - ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace (T.FermionValue i)) := by + ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace (T.fermion i)) := by rw [massWeightScaleFermion_inclFermion, ← LinearMap.map_smul] refine congrArg _ (Prod.ext ?_ ?_) · exact JetComponentSpace.massWeightScale_fst_basis_tmul (T.fermion i).massWeight c s φ 0 @@ -250,9 +251,9 @@ lemma massWeightScaleFermion_inclFermion_basis_tmul_conj (c : ℂ) (i : T.Fermio (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule (T.FermionValue i))) : T.massWeightScaleFermion c (T.inclFermion i - ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace (T.FermionValue i))) + ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace (T.fermion i))) = c ^ ((T.fermion i).massWeight + 2 * Multiset.card s) • T.inclFermion i - ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace (T.FermionValue i)) := by + ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace (T.fermion i)) := by rw [massWeightScaleFermion_inclFermion, ← LinearMap.map_smul] refine congrArg _ (Prod.ext ?_ ?_) · simp @@ -269,16 +270,18 @@ variable (T) -/ -/-- **The fermionic generator space is the component space of the fermionic module.** The +/-- **The fermionic generator space is the component space of the fermionic matter field.** The direct sum over the species of their component spaces is, the species type being finite, - the same thing as the space of component functions `∂_s ψ_α` of a single field valued in - the whole fermionic module — the presentation of the fermion content used in writing a - theory down. -/ -noncomputable def fermionGeneratorsEquiv : - T.FermionGenerators ≃ₗ[ℂ] JetComponentSpace T.FermionModule := + the same thing as the space of component functions of the single field + `T.fermionMatterField w h` — the presentation of the fermion content used in writing a theory + down. The shared weight `w` enters only because a component space is now taken of a + matter field, and the only matter field on `T.FermionModule` is that one; the underlying + identification does not use it. -/ +noncomputable def fermionGeneratorsEquiv (w : ℕ) (h : ∀ i, (T.fermion i).massWeight = w) : + T.FermionGenerators ≃ₗ[ℂ] JetComponentSpace (T.fermionMatterField w h) := (DirectSum.linearEquivFunOnFintype ℂ T.FermionSpecies - fun i => JetComponentSpace (T.FermionValue i)).trans - (JetComponentSpace.piEquiv T.FermionValue).symm + fun i => JetComponentSpace (T.fermion i)).trans + (MatterField.jetComponentSpacePiEquiv T.fermion w h).symm /-! @@ -289,36 +292,42 @@ noncomputable def fermionGeneratorsEquiv : variable {T} /-- **A species sits inside the fermionic generators as the pullback along the projection - onto it.** A component function `∂_s ψ_α` of the multiplet `i` becomes the component - function of the whole fermion field whose target covector is supported on that - multiplet. -/ + onto it.** A component function of the multiplet `i` becomes the component function of + the whole field whose target covector is supported on that multiplet. -/ @[simp] -lemma fermionGeneratorsEquiv_inclFermion (i : T.FermionSpecies) - (x : JetComponentSpace (T.FermionValue i)) : - T.fermionGeneratorsEquiv (T.inclFermion i x) - = JetComponentSpace.comap (T.projFermionValue i) x := by - rw [fermionGeneratorsEquiv, LinearEquiv.trans_apply, - show (DirectSum.linearEquivFunOnFintype ℂ T.FermionSpecies - fun i => JetComponentSpace (T.FermionValue i)) (T.inclFermion i x) - = Pi.single i x from DirectSum.linearEquivFunOnFintype_lof - (M := fun i => JetComponentSpace (T.FermionValue i)) ℂ i x, - JetComponentSpace.piEquiv_symm_single] - -/-- Two linear maps out of the component space of the fermionic module agree as soon as they - agree on every species, the species pullbacks spanning it. This is the counterpart, on - the single-field side of the identification, of `fermionGenerators_hom_ext`. -/ -lemma fermionModuleComponents_hom_ext {N : Type} [AddCommGroup N] [Module ℂ N] - {F F' : JetComponentSpace T.FermionModule →ₗ[ℂ] N} - (h : ∀ i x, F (JetComponentSpace.comap (T.projFermionValue i) x) - = F' (JetComponentSpace.comap (T.projFermionValue i) x)) : F = F' := by - have key : F.comp T.fermionGeneratorsEquiv.toLinearMap - = F'.comp T.fermionGeneratorsEquiv.toLinearMap := +lemma fermionGeneratorsEquiv_inclFermion (w : ℕ) (h : ∀ i, (T.fermion i).massWeight = w) + (i : T.FermionSpecies) (x : JetComponentSpace (T.fermion i)) : + T.fermionGeneratorsEquiv w h (T.inclFermion i x) + = JetComponentSpace.comap + (T.projFermionField w h i) x := by + have hlof : (DirectSum.linearEquivFunOnFintype ℂ T.FermionSpecies + fun i => JetComponentSpace (T.fermion i)) (T.inclFermion i x) = Pi.single i x := + DirectSum.linearEquivFunOnFintype_lof + (M := fun i => JetComponentSpace (T.fermion i)) ℂ i x + show (MatterField.jetComponentSpacePiEquiv T.fermion w h).symm + ((DirectSum.linearEquivFunOnFintype ℂ T.FermionSpecies + fun i => JetComponentSpace (T.fermion i)) (T.inclFermion i x)) = _ + rw [hlof, MatterField.jetComponentSpacePiEquiv_symm_single] + rfl + +/-- Two linear maps out of the component space of the fermionic matter field agree as soon as + they agree on every species, the species pullbacks spanning it. This is the counterpart, + on the single-field side of the identification, of `fermionGenerators_hom_ext`. -/ +lemma fermionFieldComponents_hom_ext {N : Type} [AddCommGroup N] [Module ℂ N] + (w : ℕ) (h : ∀ i, (T.fermion i).massWeight = w) + {F F' : JetComponentSpace (T.fermionMatterField w h) →ₗ[ℂ] N} + (hs : ∀ i x, F (JetComponentSpace.comap + (T.projFermionField w h i) x) + = F' (JetComponentSpace.comap + (T.projFermionField w h i) x)) : F = F' := by + have key : F.comp (T.fermionGeneratorsEquiv w h).toLinearMap + = F'.comp (T.fermionGeneratorsEquiv w h).toLinearMap := fermionGenerators_hom_ext fun i x => by simp only [LinearMap.comp_apply, LinearEquiv.coe_coe, fermionGeneratorsEquiv_inclFermion] - exact h i x + exact hs i x refine LinearMap.ext fun z => ?_ - simpa using LinearMap.congr_fun key (T.fermionGeneratorsEquiv.symm z) + simpa using LinearMap.congr_fun key ((T.fermionGeneratorsEquiv w h).symm z) /-! @@ -327,44 +336,44 @@ lemma fermionModuleComponents_hom_ext {N : Type} [AddCommGroup N] [Module ℂ N] -/ /-- **The identification is Lorentz-equivariant.** The species-diagonal Lorentz action on - the generator space is the Lorentz action on the component functions of the single - fermion field: each species is a subrepresentation of the fermionic module, so pulling - back along the projection onto it commutes with the two actions. No common mass weight - is needed here — the Lorentz action does not see it. -/ -lemma fermionGeneratorsEquiv_repLorentzFermion (Λ : SL(2,ℂ)) (y : T.FermionGenerators) : - T.fermionGeneratorsEquiv (T.repLorentzFermion Λ y) - = JetComponentSpace.repLorentzGroup T.repLorentzFermionModule Λ - (T.fermionGeneratorsEquiv y) := by - have key : T.fermionGeneratorsEquiv.toLinearMap.comp (T.repLorentzFermion Λ) - = (JetComponentSpace.repLorentzGroup T.repLorentzFermionModule Λ).comp - T.fermionGeneratorsEquiv.toLinearMap := by + the generator space is the Lorentz action on the component functions of the single field: + each species is a subrepresentation of the fermionic matter field, so pulling back along the + projection onto it commutes with the two actions. -/ +lemma fermionGeneratorsEquiv_repLorentzFermion (w : ℕ) (h : ∀ i, (T.fermion i).massWeight = w) + (Λ : SL(2,ℂ)) (y : T.FermionGenerators) : + T.fermionGeneratorsEquiv w h (T.repLorentzFermion Λ y) + = JetComponentSpace.repLorentzGroup (T.fermionMatterField w h) Λ + (T.fermionGeneratorsEquiv w h y) := by + have key : (T.fermionGeneratorsEquiv w h).toLinearMap.comp (T.repLorentzFermion Λ) + = (JetComponentSpace.repLorentzGroup (T.fermionMatterField w h) Λ).comp + (T.fermionGeneratorsEquiv w h).toLinearMap := by refine fermionGenerators_hom_ext fun i x => ?_ rw [LinearMap.comp_apply, LinearMap.comp_apply, LinearEquiv.coe_coe, repLorentzFermion_inclFermion, fermionGeneratorsEquiv_inclFermion, fermionGeneratorsEquiv_inclFermion] exact LinearMap.congr_fun (JetComponentSpace.comap_comp_repLorentzGroup - T.repLorentzFermionModule (T.fermion i).repLorentz - (T.projFermionValue i) (fun _ => LinearMap.ext fun _ => rfl) Λ) x + (T.projFermionField w h i) + (fun _ => LinearMap.ext fun _ => rfl) Λ) x exact LinearMap.congr_fun key y /-- **The identification carries the species-wise mass-weight scaling to a single - scaling.** With one weight `w` shared by every fermionic species, the scaling that acts - on each species through its own weight is the scaling of weight `w` on the component - functions of the one fermion field: `comap` is natural in the value space, so it does - not see which species a generator came from. -/ + scaling.** With one weight `w` shared by every species, the scaling that acts on each + species through its own weight is the scaling of weight `w` on the component functions of + the one field: `comap` is natural in the value space, so it does not see which species a + generator came from. -/ lemma fermionGeneratorsEquiv_massWeightScaleFermion (w : ℕ) (h : ∀ i, (T.fermion i).massWeight = w) (c : ℂ) (y : T.FermionGenerators) : - T.fermionGeneratorsEquiv (T.massWeightScaleFermion c y) - = JetComponentSpace.massWeightScale w c (T.fermionGeneratorsEquiv y) := by - have key : T.fermionGeneratorsEquiv.toLinearMap.comp (T.massWeightScaleFermion c) + T.fermionGeneratorsEquiv w h (T.massWeightScaleFermion c y) + = JetComponentSpace.massWeightScale w c (T.fermionGeneratorsEquiv w h y) := by + have key : (T.fermionGeneratorsEquiv w h).toLinearMap.comp (T.massWeightScaleFermion c) = (JetComponentSpace.massWeightScale w c).comp - T.fermionGeneratorsEquiv.toLinearMap := by + (T.fermionGeneratorsEquiv w h).toLinearMap := by refine fermionGenerators_hom_ext fun i x => ?_ rw [LinearMap.comp_apply, LinearMap.comp_apply, LinearEquiv.coe_coe, massWeightScaleFermion_inclFermion, fermionGeneratorsEquiv_inclFermion, fermionGeneratorsEquiv_inclFermion, h i] exact LinearMap.congr_fun (JetComponentSpace.comap_comp_massWeightScale - (T.projFermionValue i) w c) x + (T.projFermionField w h i) w c) x exact LinearMap.congr_fun key y end GaugeFieldData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/FermionMatterField.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/FermionMatterField.lean index 073d150c6..a0165988f 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/FermionMatterField.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/FermionMatterField.lean @@ -181,4 +181,12 @@ lemma finrank_fermionMatterField (w : ℕ) (h : ∀ i, (T.fermion i).massWeight = ∑ i, Module.finrank ℂ (T.FermionValue i) := T.finrank_fermionModule +/-- The projection of the fermionic matter field onto one species, typed as a map out of + `(T.fermionMatterField w h).V` rather than out of `T.FermionModule`. The two are the same + type by definition, but naming the first keeps unification from having to unfold the + direct sum every time the projection meets the matter field. -/ +noncomputable abbrev projFermionField (w : ℕ) (h : ∀ i, (T.fermion i).massWeight = w) + (i : T.FermionSpecies) : (T.fermionMatterField w h).V →ₗ[ℂ] (T.fermion i).V := + LinearMap.proj i + end GaugeFieldData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/InfinitesimalAction.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/InfinitesimalAction.lean index 9ed4964db..d3594b037 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/InfinitesimalAction.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/InfinitesimalAction.lean @@ -6,7 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.TransformsIn -public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.GaugeAction +public import Physlib.ClassicalFieldTheory.JetAlgebra.JetRep /-! # The infinitesimal action underlying a matter representation diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/FieldAlgebra.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/FieldAlgebra.lean index b0dba2dd5..e8946e528 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/FieldAlgebra.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/FieldAlgebra.lean @@ -57,10 +57,10 @@ variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] -/ /-- The bosonic jet algebra of a matter field. -/ -abbrev BosonicJetAlgebra : Type := BosonicAlgebra M.V +abbrev BosonicJetAlgebra : Type := BosonicAlgebra M /-- The fermionic jet algebra of a matter field. -/ -abbrev FermionicJetAlgebra : Type := FermionicAlgebra M.V +abbrev FermionicJetAlgebra : Type := FermionicAlgebra M /-! @@ -68,39 +68,39 @@ abbrev FermionicJetAlgebra : Type := FermionicAlgebra M.V -/ -variable (A : Type) [Ring A] [Algebra ℂ A] [IsFieldAlgebra M.V A] +variable (A : Type) [Ring A] [Algebra ℂ A] [IsFieldAlgebra (JetComponentSpace M) 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 + FieldAlgebra.repJet M /-- The global gauge action on a field algebra of the matter field, along the canonical inclusion `jets.ofConstant : G₀ →* G` of the constant jets. -/ noncomputable def repConstant : Representation ℂ G₀ A := - FieldAlgebra.repConstant jets.ofConstant M.repJet M.repJet_smul + FieldAlgebra.repConstant M jets.ofConstant /-- The Lorentz action on a field algebra of the matter field. -/ noncomputable def repLorentzGroup : Representation ℂ SL(2,ℂ) A := - FieldAlgebra.repLorentzGroup M.repLorentz + FieldAlgebra.repLorentzGroup M /-- 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) : +lemma repJetAlgebra_ι (U : G) (x : JetComponentSpace M) : M.repJetAlgebra A U (FieldAlgebra.ι A x) = - FieldAlgebra.ι A (JetComponentSpace.repJet M.repJet M.repJet_smul U x) := - FieldAlgebra.repJet_ι _ _ U x + FieldAlgebra.ι A (JetComponentSpace.repJet M U x) := + FieldAlgebra.repJet_ι M U x lemma repConstant_apply (g : G₀) : M.repConstant A g = M.repJetAlgebra A (jets.ofConstant g) := rfl -lemma repLorentzGroup_ι (Λ : SL(2,ℂ)) (x : JetComponentSpace M.V) : +lemma repLorentzGroup_ι (Λ : SL(2,ℂ)) (x : JetComponentSpace M) : M.repLorentzGroup A Λ (FieldAlgebra.ι A x) = - FieldAlgebra.ι A (JetComponentSpace.repLorentzGroup M.repLorentz Λ x) := - FieldAlgebra.repLorentzGroup_ι _ Λ x + FieldAlgebra.ι A (JetComponentSpace.repLorentzGroup M Λ x) := + FieldAlgebra.repLorentzGroup_ι M Λ x -lemma massWeightScale_ι (c : ℂ) (x : JetComponentSpace M.V) : +lemma massWeightScale_ι (c : ℂ) (x : JetComponentSpace M) : M.massWeightScale A c (FieldAlgebra.ι A x) = FieldAlgebra.ι A (JetComponentSpace.massWeightScale M.massWeight c x) := FieldAlgebra.massWeightScale_ι _ c x diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/Basic.lean index 10ca2c595..6d939bed2 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/Basic.lean @@ -6,7 +6,7 @@ Authors: Joseph Tooby-Smith module -public import Physlib.ClassicalFieldTheory.JetAlgebra.Jet +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.Basic public import Physlib.Relativity.Tensors.ComplexTensor.Vector.Pre.Basic public import Physlib.Relativity.IsLorentzDeriv public import Mathlib.RepresentationTheory.Basic @@ -37,8 +37,8 @@ is in `Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.Ga - `JetComponentSpace.massWeightScale` : the mass-weight scaling. - `JetComponentSpace.comap_comp_massWeightScale` : the scaling is natural in the target space, hence blind to which part of it a component function came from. -- `JetComponentSpace.prodEquiv` : the component space of a direct sum. -- `JetComponentSpace.piEquiv` : the component space of a finite direct sum. +- `JetComponentSpace.fstPiEquiv`, `JetComponentSpace.sndPiEquiv` : the two halves of the + component space of a finite product of target spaces split. -/ @@ -46,16 +46,24 @@ is in `Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.Ga open Matrix MatrixGroups TensorProduct -variable {V : Type _} [AddCommGroup V] [Module ℂ V] +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} {M : MatterField jets} -/-- 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 space of component functions of the matter field `M`: the span of the symbols +`∂_s ψ_α` and their conjugates `∂_s ψ̄_α`, where `α` runs over the target space `M.V`. 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 `α`. + +Only `M.V` enters the space itself; the field's Lorentz and gauge representations and its +mass weight enter the structure carried on it below. Taking the whole matter field rather +than its value space is what lets that structure be read off `M` instead of being supplied +by hand at each use. -/ +abbrev JetComponentSpace (M : MatterField jets) : Type := + (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ M.V) × + (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule M.V)) /-! @@ -73,32 +81,29 @@ Unlike the gauge action, this needs no fibrewise-linearity or finite-dimensional 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) +noncomputable def JetComponentSpace.repLorentzGroup (M : MatterField jets) : + Representation ℂ SL(2,ℂ) (JetComponentSpace M) := + (DerivAlgebraComplex.repLorentzGroup.tprod M.repLorentz.dual).prod + (DerivAlgebraComplex.repLorentzGroup.tprod M.repLorentz.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 +lemma JetComponentSpace.repLorentzGroup_fst (Λ : SL(2,ℂ)) (x : JetComponentSpace M) : + (JetComponentSpace.repLorentzGroup M Λ x).1 + = (DerivAlgebraComplex.repLorentzGroup.tprod M.repLorentz.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 +lemma JetComponentSpace.repLorentzGroup_snd (Λ : SL(2,ℂ)) (x : JetComponentSpace M) : + (JetComponentSpace.repLorentzGroup M Λ x).2 + = (DerivAlgebraComplex.repLorentzGroup.tprod M.repLorentz.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 +lemma JetComponentSpace.repLorentzGroup_fst_tmul (Λ : SL(2,ℂ)) (a : DerivAlgebraComplex) + (φ : Module.Dual ℂ M.V) + (y : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule M.V)) : + (JetComponentSpace.repLorentzGroup M Λ (a ⊗ₜ[ℂ] φ, y)).1 + = DerivAlgebraComplex.repLorentzGroup Λ a ⊗ₜ[ℂ] (φ ∘ₗ M.repLorentz Λ⁻¹) := rfl /-! @@ -114,7 +119,7 @@ lemma JetComponentSpace.repLorentzGroup_fst_tmul (repV : Representation ℂ SL(2 `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 := + JetComponentSpace M →ₗ[ℂ] JetComponentSpace M := LinearMap.prodMap (TensorProduct.map (LinearMap.mulRight ℂ (DerivAlgebraComplex.basis ({μ} : Multiset (Fin 1 ⊕ Fin 3)))) @@ -125,23 +130,23 @@ noncomputable def JetComponentSpace.jetDeriv (μ : Fin 1 ⊕ Fin 3) : @[simp] lemma JetComponentSpace.jetDeriv_fst_tmul (μ : Fin 1 ⊕ Fin 3) - (a : DerivAlgebraComplex) (φ : Module.Dual ℂ V) - (y : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule V)) : + (a : DerivAlgebraComplex) (φ : Module.Dual ℂ M.V) + (y : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule M.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)) : + (x : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ M.V) + (a : DerivAlgebraComplex) (φ : Module.Dual ℂ (ConjModule M.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 + (JetComponentSpace.jetDeriv (M := M) μ).comp (JetComponentSpace.jetDeriv ν) + = (JetComponentSpace.jetDeriv (M := M) ν).comp (JetComponentSpace.jetDeriv μ) := by have hmul : ∀ b c : DerivAlgebraComplex, (LinearMap.mulRight ℂ b).comp (LinearMap.mulRight ℂ c) = LinearMap.mulRight ℂ (c * b) := @@ -154,7 +159,7 @@ lemma JetComponentSpace.jetDeriv_comm (μ ν : Fin 1 ⊕ Fin 3) : /-- 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) μ + JetComponentSpace.jetDeriv (M := M) μ = LinearMap.prodMap (TensorProduct.map (LinearMap.mulRight ℂ (SymmetricAlgebra.ι ℂ (Module.Dual ℂ Lorentz.CoℂModule) @@ -165,14 +170,14 @@ lemma JetComponentSpace.jetDeriv_eq_ι (μ : Fin 1 ⊕ Fin 3) : rw [JetComponentSpace.jetDeriv, DerivAlgebraComplex.basis_singleton] @[simp] -lemma JetComponentSpace.jetDeriv_fst (μ : Fin 1 ⊕ Fin 3) (v : JetComponentSpace V) : +lemma JetComponentSpace.jetDeriv_fst (μ : Fin 1 ⊕ Fin 3) (v : JetComponentSpace M) : (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) : +lemma JetComponentSpace.jetDeriv_snd (μ : Fin 1 ⊕ Fin 3) (v : JetComponentSpace M) : (JetComponentSpace.jetDeriv μ v).2 = TensorProduct.map (LinearMap.mulRight ℂ (DerivAlgebraComplex.basis ({μ} : Multiset (Fin 1 ⊕ Fin 3)))) @@ -225,12 +230,12 @@ private lemma repLorentzGroup_tprod_mulRight_jetSymbol {W : Type*} [AddCommGroup 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) = + `M.repLorentz.dual` or `M.repLorentz.conj.dual` — plays no role. -/ +lemma JetComponentSpace.repLorentzGroup_jetDeriv (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) + (v : JetComponentSpace M) : + JetComponentSpace.repLorentzGroup M Λ (JetComponentSpace.jetDeriv μ v) = ∑ a, (((Lorentz.SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • - JetComponentSpace.jetDeriv a (JetComponentSpace.repLorentzGroup repV Λ v) := by + JetComponentSpace.jetDeriv a (JetComponentSpace.repLorentzGroup M Λ v) := by refine Prod.ext ?_ ?_ · simp only [Prod.fst_sum, Prod.smul_fst, JetComponentSpace.repLorentzGroup_fst, JetComponentSpace.jetDeriv_fst] @@ -245,44 +250,44 @@ lemma JetComponentSpace.repLorentzGroup_jetDeriv (repV : Representation ℂ SL(2 -/ -variable {W : Type _} [AddCommGroup W] [Module ℂ W] +variable {N : MatterField jets} -/-- **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 +/-- **The component space is contravariant in the target space.** A linear map `f : M.V →ₗ N.V` + of target spaces pulls the component functions of the field `N` back to component + functions of the field `M`: 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 := +noncomputable def JetComponentSpace.comap (f : M.V →ₗ[ℂ] N.V) : + JetComponentSpace N →ₗ[ℂ] JetComponentSpace M := 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)) : +lemma JetComponentSpace.comap_fst_tmul (f : M.V →ₗ[ℂ] N.V) (a : DerivAlgebraComplex) + (φ : Module.Dual ℂ N.V) (y : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule N.V)) : (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)) : +lemma JetComponentSpace.comap_snd_tmul (f : M.V →ₗ[ℂ] N.V) + (x : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ N.V) (a : DerivAlgebraComplex) + (φ : Module.Dual ℂ (ConjModule N.V)) : (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 + JetComponentSpace.comap (LinearMap.id : M.V →ₗ[ℂ] M.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) + show Module.Dual.transpose (LinearMap.id : M.V →ₗ[ℂ] M.V) = LinearMap.id from rfl, + show ConjModule.map (LinearMap.id : M.V →ₗ[ℂ] M.V) = LinearMap.id from rfl, + show Module.Dual.transpose (LinearMap.id : ConjModule M.V →ₗ[ℂ] ConjModule M.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) : +lemma JetComponentSpace.comap_comp {P : MatterField jets} + (f : M.V →ₗ[ℂ] N.V) (g : N.V →ₗ[ℂ] P.V) : JetComponentSpace.comap (g.comp f) = (JetComponentSpace.comap f).comp (JetComponentSpace.comap g) := by rw [JetComponentSpace.comap, JetComponentSpace.comap, JetComponentSpace.comap, @@ -290,36 +295,36 @@ lemma JetComponentSpace.comap_comp {U : Type _} [AddCommGroup U] [Module ℂ U] LinearMap.id_comp] rfl -/-- **An equivariant map of target spaces gives an equivariant pullback.** If `f : V →ₗ W` - intertwines two Lorentz representations then `comap f` intertwines the induced actions on +/-- **An equivariant map of target spaces gives an equivariant pullback.** If `f : M.V →ₗ N.V` + intertwines the two Lorentz representations then `comap f` intertwines the induced actions on the component spaces, in the opposite direction. Component functions are covectors, so the unconjugated half transposes `f` against the contragredient action and the conjugate half against its conjugate; both reduce to equivariance of `f` at `Λ⁻¹`. -/ -lemma JetComponentSpace.comap_comp_repLorentzGroup (repV : Representation ℂ SL(2,ℂ) V) - (repW : Representation ℂ SL(2,ℂ) W) (f : V →ₗ[ℂ] W) - (hf : ∀ Λ : SL(2,ℂ), f.comp (repV Λ) = (repW Λ).comp f) (Λ : SL(2,ℂ)) : - (JetComponentSpace.comap f).comp (JetComponentSpace.repLorentzGroup repW Λ) - = (JetComponentSpace.repLorentzGroup repV Λ).comp (JetComponentSpace.comap f) := by - have hdual : (Module.Dual.transpose (R := ℂ) f).comp (repW.dual Λ) - = (repV.dual Λ).comp (Module.Dual.transpose f) := +lemma JetComponentSpace.comap_comp_repLorentzGroup (f : M.V →ₗ[ℂ] N.V) + (hf : ∀ Λ : SL(2,ℂ), f.comp (M.repLorentz Λ) = (N.repLorentz Λ).comp f) + (Λ : SL(2,ℂ)) : + (JetComponentSpace.comap f).comp (JetComponentSpace.repLorentzGroup N Λ) + = (JetComponentSpace.repLorentzGroup M Λ).comp (JetComponentSpace.comap f) := by + have hdual : (Module.Dual.transpose (R := ℂ) f).comp (N.repLorentz.dual Λ) + = (M.repLorentz.dual Λ).comp (Module.Dual.transpose f) := LinearMap.ext fun ψ => LinearMap.ext fun v => (congrArg ψ (LinearMap.congr_fun (hf Λ⁻¹) v)).symm have hconj : (Module.Dual.transpose (R := ℂ) (ConjModule.map (k := ℂ) f)).comp - (repW.conj.dual Λ) - = (repV.conj.dual Λ).comp + (N.repLorentz.conj.dual Λ) + = (M.repLorentz.conj.dual Λ).comp (Module.Dual.transpose (ConjModule.map (k := ℂ) f)) := LinearMap.ext fun ψ => LinearMap.ext fun v => (congrArg ψ (LinearMap.congr_fun (hf Λ⁻¹) - ((conjEquiv (k := ℂ) (M := V)).symm v))).symm + ((conjEquiv (k := ℂ) (M := M.V)).symm v))).symm show (LinearMap.prodMap (TensorProduct.map LinearMap.id (Module.Dual.transpose f)) (TensorProduct.map LinearMap.id (Module.Dual.transpose (ConjModule.map (k := ℂ) f)))).comp (LinearMap.prodMap - (TensorProduct.map (DerivAlgebraComplex.repLorentzGroup Λ) (repW.dual Λ)) - (TensorProduct.map (DerivAlgebraComplex.repLorentzGroup Λ) (repW.conj.dual Λ))) + (TensorProduct.map (DerivAlgebraComplex.repLorentzGroup Λ) (N.repLorentz.dual Λ)) + (TensorProduct.map (DerivAlgebraComplex.repLorentzGroup Λ) (N.repLorentz.conj.dual Λ))) = (LinearMap.prodMap - (TensorProduct.map (DerivAlgebraComplex.repLorentzGroup Λ) (repV.dual Λ)) - (TensorProduct.map (DerivAlgebraComplex.repLorentzGroup Λ) (repV.conj.dual Λ))).comp + (TensorProduct.map (DerivAlgebraComplex.repLorentzGroup Λ) (M.repLorentz.dual Λ)) + (TensorProduct.map (DerivAlgebraComplex.repLorentzGroup Λ) (M.repLorentz.conj.dual Λ))).comp (LinearMap.prodMap (TensorProduct.map LinearMap.id (Module.Dual.transpose f)) (TensorProduct.map LinearMap.id (Module.Dual.transpose (ConjModule.map (k := ℂ) f)))) @@ -330,7 +335,7 @@ lemma JetComponentSpace.comap_comp_repLorentzGroup (repV : Representation ℂ SL /-- **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) : +lemma JetComponentSpace.comap_jetDeriv (f : M.V →ₗ[ℂ] N.V) (μ : Fin 1 ⊕ Fin 3) : (JetComponentSpace.comap f).comp (JetComponentSpace.jetDeriv μ) = (JetComponentSpace.jetDeriv μ).comp (JetComponentSpace.comap f) := by rw [JetComponentSpace.comap, JetComponentSpace.jetDeriv, JetComponentSpace.jetDeriv, @@ -355,7 +360,7 @@ the bosonic and fermionic algebras, where it defines their mass-dimension gradin `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 := + JetComponentSpace M →ₗ[ℂ] JetComponentSpace M := c ^ w • LinearMap.prodMap (TensorProduct.map (DerivAlgebraComplex.gradeScale (c ^ 2)).toLinearMap LinearMap.id) (TensorProduct.map (DerivAlgebraComplex.gradeScale (c ^ 2)).toLinearMap LinearMap.id) @@ -363,10 +368,10 @@ noncomputable def JetComponentSpace.massWeightScale (w : ℕ) (c : ℂ) : /-- 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)) : + (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ M.V) + (y : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule M.V)) : (JetComponentSpace.massWeightScale w c - ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, y) : JetComponentSpace V)).1 + ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, y) : JetComponentSpace M)).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, @@ -374,13 +379,13 @@ lemma JetComponentSpace.massWeightScale_fst_basis_tmul (w : ℕ) (c : ℂ) mul_comm 2 (Multiset.card s)] @[simp] -lemma JetComponentSpace.massWeightScale_fst (w : ℕ) (c : ℂ) (v : JetComponentSpace V) : +lemma JetComponentSpace.massWeightScale_fst (w : ℕ) (c : ℂ) (v : JetComponentSpace M) : (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) : +lemma JetComponentSpace.massWeightScale_snd (w : ℕ) (c : ℂ) (v : JetComponentSpace M) : (JetComponentSpace.massWeightScale w c v).2 = c ^ w • TensorProduct.map (DerivAlgebraComplex.gradeScale (c ^ 2)).toLinearMap LinearMap.id v.2 := rfl @@ -408,7 +413,7 @@ private lemma gradeScale_map_mulRight_basis {W : Type*} [AddCommGroup W] [Module /-- **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 μ) + (JetComponentSpace.massWeightScale (M := M) w c).comp (JetComponentSpace.jetDeriv μ) = c ^ 2 • (JetComponentSpace.jetDeriv μ).comp (JetComponentSpace.massWeightScale w c) := by have key := fun {W : Type _} [AddCommGroup W] [Module ℂ W] @@ -416,11 +421,11 @@ lemma JetComponentSpace.massWeightScale_jetDeriv (w : ℕ) (c : ℂ) (μ : Fin 1 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) + exact (congrArg (fun z : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ M.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) => + exact (congrArg (fun z : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule M.V) => c ^ w • z) (key v.2)).trans (smul_comm _ _ _) /-- **The mass-weight scaling is natural in the target space.** It commutes with every @@ -431,7 +436,7 @@ lemma JetComponentSpace.massWeightScale_jetDeriv (w : ℕ) (c : ℂ) (μ : Fin 1 generator space of a multi-species theory, `GaugeFieldData.FermionGenerators`, records the weights on a direct sum, one per species, rather than on a single component space of the product. -/ -lemma JetComponentSpace.comap_comp_massWeightScale (f : V →ₗ[ℂ] W) (w : ℕ) (c : ℂ) : +lemma JetComponentSpace.comap_comp_massWeightScale (f : M.V →ₗ[ℂ] N.V) (w : ℕ) (c : ℂ) : (JetComponentSpace.comap f).comp (JetComponentSpace.massWeightScale w c) = (JetComponentSpace.massWeightScale w c).comp (JetComponentSpace.comap f) := by simp only [JetComponentSpace.comap, JetComponentSpace.massWeightScale, @@ -440,42 +445,15 @@ lemma JetComponentSpace.comap_comp_massWeightScale (f : V →ₗ[ℂ] W) (w : /-! -## 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 ℂ _ _ _ _) - -/-! - -## The component space of a finite direct sum - -The binary splitting above extends to a finite family. Both halves of the component space -split for the same two reasons as before — the dual of a finite product is the product of -the duals, and conjugation commutes with products — and the derivative label, carried by -the `DerivAlgebraComplex` factor, is untouched by either. The index type must be finite: -the dual of an infinite product is strictly larger than the product of the duals, and -`TensorProduct.piRight` is an equivalence only in the finite case. +## The dual and the conjugate of a finite product -This is the component-space counterpart of `MatterField.pi`: the component functions of -the direct sum of a finite family of matter fields are the families of component -functions of the summands, so nothing is lost or gained by assembling the species into -one field before taking components. +The component space of a direct sum of matter fields splits, and both halves split for the +same two reasons: the dual of a finite product is the product of the duals, and conjugation +commutes with products. Neither statement mentions a matter field, so both are recorded +here, on a bare family of modules; the splitting they add up to is +`MatterField.jetComponentSpacePiEquiv`, downstream where `MatterField.pi` is available. The +index type must be finite — the dual of an infinite product is strictly larger than the +product of the duals, and `TensorProduct.piRight` is an equivalence only in the finite case. -/ @@ -484,6 +462,20 @@ section Pi variable {ι : Type} [Fintype ι] [DecidableEq ι] (E : ι → Type) [∀ i, AddCommGroup (E i)] [∀ i, Module ℂ (E i)] +/-- A pair of families is the same thing as a family of pairs. This is the last step of + the splitting of a component space over a product of target spaces: the two halves split + separately into families, and this puts the two families back together index by index. + Everything is the identity on underlying data, so every law is `rfl`. -/ +def prodPiEquiv {A B : ι → Type*} [∀ i, AddCommGroup (A i)] [∀ i, Module ℂ (A i)] + [∀ i, AddCommGroup (B i)] [∀ i, Module ℂ (B i)] : + ((∀ i, A i) × (∀ i, B i)) ≃ₗ[ℂ] ∀ i, (A i × B i) where + toFun p i := (p.1 i, p.2 i) + map_add' _ _ := rfl + map_smul' _ _ := rfl + invFun f := (fun i => (f i).1, fun i => (f i).2) + left_inv _ := rfl + right_inv _ := rfl + /-- **The unconjugated half of the component space of a finite direct sum splits.** The symbols `∂_s ψ_α` of a `(∀ i, E i)`-valued field are the families, over the index, of the symbols of the summands: the dual distributes over the finite product and the @@ -572,45 +564,4 @@ lemma JetComponentSpace.sndPiEquiv_symm_single (i : ι) rw [Pi.single_eq_of_ne (Ne.symm hij), h0, TensorProduct.tmul_zero] | add x y hx hy => simp only [Pi.single_add, Pi.add_apply, map_add, hx, hy] - -/-- **The component space of a finite direct sum splits.** The component functions of a - `(∀ i, E i)`-valued field are exactly the families, over the index, of the component - functions of the summands. Both halves split by `fstPiEquiv` and `sndPiEquiv`, and the - pair of families is reassembled into a family of pairs index by index. -/ -noncomputable def JetComponentSpace.piEquiv : - JetComponentSpace (∀ i, E i) ≃ₗ[ℂ] ∀ i, JetComponentSpace (E i) where - toFun x i := (fstPiEquiv E x.1 i, sndPiEquiv E x.2 i) - map_add' x y := funext fun i => Prod.ext (by simp) (by simp) - map_smul' c x := funext fun i => Prod.ext (by simp) (by simp) - invFun y := ((fstPiEquiv E).symm (fun i => (y i).1), (sndPiEquiv E).symm (fun i => (y i).2)) - left_inv x := Prod.ext (by simp) (by simp) - right_inv y := funext fun i => Prod.ext (by simp) (by simp) - -@[simp] -lemma JetComponentSpace.piEquiv_apply (x : JetComponentSpace (∀ i, E i)) (i : ι) : - piEquiv E x i = (fstPiEquiv E x.1 i, sndPiEquiv E x.2 i) := rfl - -@[simp] -lemma JetComponentSpace.piEquiv_symm_apply (y : ∀ i, JetComponentSpace (E i)) : - (piEquiv E).symm y = - ((fstPiEquiv E).symm (fun i => (y i).1), (sndPiEquiv E).symm (fun i => (y i).2)) := rfl - -/-- **The summand of one species is the pullback along the projection onto it.** A - component function of the summand `i`, placed in the family and read back as a component - function of the whole `(∀ i, E i)`-valued field, is that function precomposed with the - projection `∀ i, E i → E i`. This is what identifies the splitting with the species - inclusions of a direct sum of component spaces. -/ -lemma JetComponentSpace.piEquiv_symm_single (i : ι) (x : JetComponentSpace (E i)) : - (piEquiv E).symm (Pi.single i x) = comap (LinearMap.proj i) x := by - have hfst : (fun j => ((Pi.single i x : ∀ j, JetComponentSpace (E j)) j).1) - = Pi.single i x.1 := - funext fun j => - Pi.apply_single (fun j (p : JetComponentSpace (E j)) => p.1) (fun _ => rfl) i x j - have hsnd : (fun j => ((Pi.single i x : ∀ j, JetComponentSpace (E j)) j).2) - = Pi.single i x.2 := - funext fun j => - Pi.apply_single (fun j (p : JetComponentSpace (E j)) => p.2) (fun _ => rfl) i x j - rw [piEquiv_symm_apply, hfst, hsnd, fstPiEquiv_symm_single, sndPiEquiv_symm_single] - rfl - end Pi diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/GaugeAction.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/GaugeAction.lean index 04412b53d..d838a2fb5 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/GaugeAction.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/GaugeAction.lean @@ -47,7 +47,9 @@ namespace JetComponentSpace open Matrix MatrixGroups TensorProduct variable {V : Type _} [AddCommGroup V] [Module ℂ V] -variable {G : Type*} [Group G] +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} /-- **The action of a coefficient on the symbols.** A coefficient `g ⊗ T` acts by `jetRingAction g` on the derivative label — the Leibniz convolution redistributing @@ -161,37 +163,32 @@ lemma repDual_one_tmul [Module.Free ℂ V] [Module.Finite ℂ V] 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 gauge action on the jet component space.** The induced action of the jets of +gauge transformations on the full space of component functions of the matter field `M` — +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)) +The unconjugated half is `repDual M.repJet`, the contragredient action on the symbols. The +conjugate half is the *same* construction applied to `repConj M.repJet`, 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†`. + +Everything the construction needs is a field of `MatterField`: the jet action `M.repJet`, +its fibrewise linearity `M.repJet_smul`, and the freeness and finiteness of `M.V`. Taking +the matter field rather than a bare value space is what removes all three from the +argument list. -/ +noncomputable def repJet (M : MatterField jets) : + Representation ℂ G (JetComponentSpace M) := + (repDual M.repJet M.repJet_smul).prod + (repDual (repConj M.repJet) (repConj_smul_comm M.repJet_smul)) @[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 +lemma repJet_fst (M : MatterField jets) (U : G) (x : JetComponentSpace M) : + (repJet M U x).1 = repDual M.repJet M.repJet_smul 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 +lemma repJet_snd (M : MatterField jets) (U : G) (x : JetComponentSpace M) : + (repJet M U x).2 + = repDual (repConj M.repJet) (repConj_smul_comm M.repJet_smul) U x.2 := rfl end JetComponentSpace diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Pi.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Pi.lean index 00c14b3ba..bfed513d0 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Pi.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Pi.lean @@ -38,6 +38,8 @@ value space, a field of `MatterField`, would fail for an infinite family in any weight. - `MatterField.jetComponentSpacePiEquiv` : the component space of the direct sum is the family of the component spaces of the summands. +- `MatterField.jetComponentSpacePiEquiv_symm_single` : a summand sits inside it as the + pullback along the projection onto that summand. ## iii. Table of contents @@ -253,27 +255,46 @@ direct sum case of `JetComponentSpace.piEquiv`. -/ -/-- **The component space of a direct sum of matter fields splits**: a component function - of `MatterField.pi M w h` is a family, one component function per summand. The value - space of the direct sum is by construction the product of the value spaces, so this is - `JetComponentSpace.piEquiv` read on the matter field. -/ +/-- **The component space of a direct sum of matter fields splits.** A component function + of `MatterField.pi M w h` is exactly a family, one component function per summand. Both + halves split by `JetComponentSpace.fstPiEquiv` and `JetComponentSpace.sndPiEquiv`, and + the pair of families is reassembled into a family of pairs index by index. -/ noncomputable def jetComponentSpacePiEquiv (w : ℕ) (h : ∀ i, (M i).massWeight = w) : - JetComponentSpace (pi M w h).V ≃ₗ[ℂ] ∀ i, JetComponentSpace (M i).V := - JetComponentSpace.piEquiv fun i => (M i).V + JetComponentSpace (pi M w h) ≃ₗ[ℂ] ∀ i, JetComponentSpace (M i) := + (LinearEquiv.prodCongr (JetComponentSpace.fstPiEquiv fun i => (M i).V) + (JetComponentSpace.sndPiEquiv fun i => (M i).V)).trans prodPiEquiv -@[simp] lemma jetComponentSpacePiEquiv_apply (w : ℕ) (h : ∀ i, (M i).massWeight = w) - (x : JetComponentSpace (pi M w h).V) (i : ι) : + (x : JetComponentSpace (pi M w h)) (i : ι) : jetComponentSpacePiEquiv M w h x i = (JetComponentSpace.fstPiEquiv (fun i => (M i).V) x.1 i, JetComponentSpace.sndPiEquiv (fun i => (M i).V) x.2 i) := rfl -@[simp] -lemma jetComponentSpacePiEquiv_symm_apply (w : ℕ) (h : ∀ i, (M i).massWeight = w) - (y : ∀ i, JetComponentSpace (M i).V) : - (jetComponentSpacePiEquiv M w h).symm y = - ((JetComponentSpace.fstPiEquiv (fun i => (M i).V)).symm (fun i => (y i).1), - (JetComponentSpace.sndPiEquiv (fun i => (M i).V)).symm (fun i => (y i).2)) := rfl +/-- **The summand of one species is the pullback along the projection onto it.** A + component function of the summand `i`, placed in the family and read back as a component + function of the direct sum, is that function precomposed with the projection onto the + summand. This is what identifies the splitting with the species inclusions of a direct + sum of component spaces. -/ +lemma jetComponentSpacePiEquiv_symm_single (w : ℕ) (h : ∀ i, (M i).massWeight = w) + (i : ι) (x : JetComponentSpace (M i)) : + (jetComponentSpacePiEquiv M w h).symm (Pi.single i x) + = JetComponentSpace.comap + (LinearMap.proj (φ := fun i => (M i).V) i : (pi M w h).V →ₗ[ℂ] (M i).V) x := by + have hfst : (fun j => ((Pi.single i x : ∀ j, JetComponentSpace (M j)) j).1) + = Pi.single i x.1 := + funext fun j => + Pi.apply_single (fun j (p : JetComponentSpace (M j)) => p.1) (fun _ => rfl) i x j + have hsnd : (fun j => ((Pi.single i x : ∀ j, JetComponentSpace (M j)) j).2) + = Pi.single i x.2 := + funext fun j => + Pi.apply_single (fun j (p : JetComponentSpace (M j)) => p.2) (fun _ => rfl) i x j + show ((JetComponentSpace.fstPiEquiv (fun i => (M i).V)).symm + (fun j => ((Pi.single i x : ∀ j, JetComponentSpace (M j)) j).1), + (JetComponentSpace.sndPiEquiv (fun i => (M i).V)).symm + (fun j => ((Pi.single i x : ∀ j, JetComponentSpace (M j)) j).2)) = _ + rw [hfst, hsnd, JetComponentSpace.fstPiEquiv_symm_single, + JetComponentSpace.sndPiEquiv_symm_single] + rfl end Pi diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Prod.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Prod.lean index d72c40c6a..7deb04709 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Prod.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Prod.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.Basic /-! # The direct sum of two matter fields @@ -32,10 +32,12 @@ infinitesimal action still generates the componentwise jet action. - `MatterField.repCoeff_repJetProd` : its base-point Taylor coefficients are the pair of those of the summands. - `MatterField.prod` : the direct sum of two matter fields of the same mass weight. +- `JetComponentSpace.prodEquiv` : the component space of a direct sum splits. ## iii. Table of contents - A. The direct sum of two matter fields +- B. The component space of a direct sum -/ @@ -183,4 +185,27 @@ lemma prod_massWeight_right (h : M.massWeight = N.massWeight) : end Prod +/-! + +## B. The component space of a direct sum + +-/ + +/-- **The component space of a direct sum splits.** The component functions of the direct + sum `M.prod N h` are those of `M` together with those of `N`: the dual and the conjugate + both distribute over the finite product, and the derivative label is untouched. Only the + value spaces enter, so the shared mass weight `h` is carried along and not used. -/ +noncomputable def _root_.JetComponentSpace.prodEquiv (M N : MatterField jets) + (h : M.massWeight = N.massWeight) : + JetComponentSpace (M.prod N h) ≃ₗ[ℂ] JetComponentSpace M × JetComponentSpace N := + (LinearEquiv.prodCongr + (TensorProduct.congr (LinearEquiv.refl ℂ DerivAlgebraComplex) + (Module.dualProdDualEquivDual ℂ M.V N.V).symm) + (TensorProduct.congr (LinearEquiv.refl ℂ DerivAlgebraComplex) + (((ConjModule.prodEquiv (k := ℂ) (M := M.V) (N := N.V)).symm.dualMap).trans + (Module.dualProdDualEquivDual ℂ (ConjModule M.V) (ConjModule N.V)).symm))).trans <| + (LinearEquiv.prodCongr (TensorProduct.prodRight ℂ ℂ _ _ _) + (TensorProduct.prodRight ℂ ℂ _ _ _)).trans + (LinearEquiv.prodProdProdComm ℂ _ _ _ _) + end MatterField diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/Basic.lean b/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/Basic.lean index 929531f86..75b032f48 100644 --- a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/Basic.lean +++ b/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/Basic.lean @@ -13,7 +13,7 @@ public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentS 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 +component space `JetComponentSpace M` — 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`). @@ -23,7 +23,7 @@ both. This file isolates that universal property as the class `IsFieldAlgebra V 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]`. +`LorentzAction`, `JetDeriv` and `MassDim` are stated once for any field algebra. 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 @@ -48,7 +48,9 @@ concrete algebras. open TensorProduct -variable {V : Type} [AddCommGroup V] [Module ℂ V] +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} {M : MatterField jets} /-! @@ -56,22 +58,27 @@ variable {V : Type} [AddCommGroup V] [Module ℂ V] -/ -/-- **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 field algebra** on a space of component functions `C`: a `ℂ`-algebra `A` generated + by `C`, functorially in endomorphisms of `C`. For a matter field `M` the space `C` is its + `JetComponentSpace M`, and the two instances are the symmetric algebra (bosons) and the + exterior algebra (fermions). + + The class is stated on the component space rather than on the matter field so that `C` + can be an `outParam`, recovered from `A` by unification: a matter field is not recoverable + from its field algebra, since only its value space appears there. The operations that do + need the field itself — the gauge and Lorentz actions and the mass-weight scaling — take + it as an argument, in the files that build them. -/ +class IsFieldAlgebra (C : outParam Type) [AddCommGroup C] [Module ℂ C] (A : Type) [Ring A] [Algebra ℂ A] where /-- The inclusion of the component functions as generators. -/ - ι : JetComponentSpace V →ₗ[ℂ] A + ι : C →ₗ[ℂ] 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 : (C →ₗ[ℂ] C) → (A →ₐ[ℂ] A) + map_ι : ∀ (f : C →ₗ[ℂ] C) (x : C), map f (ι x) = ι (f x) map_id : map LinearMap.id = AlgHom.id ℂ A - map_comp_map : ∀ (f g : JetComponentSpace V →ₗ[ℂ] JetComponentSpace V), + map_comp_map : ∀ (f g : C →ₗ[ℂ] C), (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. -/ @@ -83,27 +90,28 @@ class IsFieldAlgebra (V : outParam Type) [AddCommGroup V] [Module ℂ V] namespace FieldAlgebra -variable (A : Type) [Ring A] [Algebra ℂ A] [IsFieldAlgebra V A] +variable {C : Type} [AddCommGroup C] [Module ℂ C] +variable (A : Type) [Ring A] [Algebra ℂ A] [IsFieldAlgebra C A] /-- The inclusion of the component functions as the generators of the field algebra. -/ -abbrev ι : JetComponentSpace V →ₗ[ℂ] A := IsFieldAlgebra.ι +abbrev ι : C →ₗ[ℂ] 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 := +abbrev map (f : C →ₗ[ℂ] C) : A →ₐ[ℂ] A := IsFieldAlgebra.map f @[simp] -lemma map_ι (f : JetComponentSpace V →ₗ[ℂ] JetComponentSpace V) (x : JetComponentSpace V) : +lemma map_ι (f : C →ₗ[ℂ] C) (x : C) : map A f (ι A x) = ι A (f x) := IsFieldAlgebra.map_ι f x @[simp] -lemma map_id : map A (LinearMap.id : JetComponentSpace V →ₗ[ℂ] JetComponentSpace V) +lemma map_id : map A (LinearMap.id : C →ₗ[ℂ] C) = AlgHom.id ℂ A := IsFieldAlgebra.map_id -lemma map_comp_map (f g : JetComponentSpace V →ₗ[ℂ] JetComponentSpace V) : +lemma map_comp_map (f g : C →ₗ[ℂ] C) : (map A g).comp (map A f) = map A (g ∘ₗ f) := IsFieldAlgebra.map_comp_map f g @@ -112,7 +120,7 @@ lemma map_comp_map (f g : JetComponentSpace V →ₗ[ℂ] JetComponentSpace V) : 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)) = ⊤ := +lemma adjoin_ι_eq_top : Algebra.adjoin ℂ (Set.range (ι (C := C) A)) = ⊤ := IsFieldAlgebra.adjoin_ι_eq_top variable {A} @@ -122,7 +130,7 @@ variable {A} @[elab_as_elim] theorem induction {motive : A → Prop} (algebraMap : ∀ r, motive (algebraMap ℂ A r)) - (ι : ∀ x, motive (FieldAlgebra.ι A x)) + (ι : ∀ x : C, 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 := @@ -135,7 +143,7 @@ theorem induction {motive : A → Prop} 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 +coordinate. The conjugate field is a covector on `ConjModule M.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 `ψ`. @@ -146,30 +154,36 @@ the content of `FieldAlgebra.adjoin_iteratedJetDeriv_eq_top`. variable (A) +section OfField + +variable {M : MatterField jets} [IsFieldAlgebra (JetComponentSpace M) 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)) +noncomputable def ofField : Module.Dual ℂ M.V →ₗ[ℂ] A := + (ι (C := JetComponentSpace M) A).comp + ((LinearMap.inl ℂ (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ M.V) + (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule M.V))).comp + (TensorProduct.mk ℂ DerivAlgebraComplex (Module.Dual ℂ M.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 + on `ConjModule M.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 +noncomputable def ofConjField : Module.Dual ℂ (ConjModule M.V) →ₗ[ℂ] A := + (ι (C := JetComponentSpace M) A).comp + ((LinearMap.inr ℂ (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ M.V) + (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule M.V))).comp + (TensorProduct.mk ℂ DerivAlgebraComplex (Module.Dual ℂ (ConjModule M.V)) 1)) + +lemma ofField_apply (φ : Module.Dual ℂ M.V) : + ofField A φ = ι (C := JetComponentSpace M) A + (((1 : DerivAlgebraComplex) ⊗ₜ[ℂ] φ, 0) : JetComponentSpace M) := rfl + +lemma ofConjField_apply (φ : Module.Dual ℂ (ConjModule M.V)) : + ofConjField A φ = ι (C := JetComponentSpace M) A + ((0, (1 : DerivAlgebraComplex) ⊗ₜ[ℂ] φ) : JetComponentSpace M) := rfl + +end OfField end FieldAlgebra diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/ConstantGaugeAction.lean b/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/ConstantGaugeAction.lean index 8b9c47aa9..74a3cddd6 100644 --- a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/ConstantGaugeAction.lean +++ b/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/ConstantGaugeAction.lean @@ -32,56 +32,43 @@ 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) +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} (M : MatterField jets) +variable {A : Type} [Ring A] [Algebra ℂ A] [IsFieldAlgebra (JetComponentSpace M) A] +variable (ι : 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) : +noncomputable def repConstant : Representation ℂ G₀ A := - (repJet rep hlin).comp ι + (repJet M).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 + repConstant M ι g x = + repJet M (ι 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 _ + repConstant M ι g (1 : A) = 1 := + repJet_apply_one M _ 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 + repConstant M ι g (x * y) = + repConstant M ι g x * repConstant M ι g y := + repJet_apply_mul M _ 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 φ) = + (g : G₀) (φ : Module.Dual ℂ M.V) : + repConstant M ι g (ofField A φ) = ofField A (Module.Dual.transpose - (jetEval ∘ₗ (rep (ι g⁻¹)).comp jetOfConstant) φ) := by + (jetEval ∘ₗ (M.repJet (ι g⁻¹)).comp jetOfConstant) φ) := by have h : (ι g)⁻¹ = ι g⁻¹ := (map_inv ι g).symm rw [repConstant_apply, repJet_ofField, h] @@ -89,13 +76,10 @@ lemma repConstant_ofField /-- 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 φ) = + (g : G₀) (φ : Module.Dual ℂ (ConjModule M.V)) : + repConstant M ι g (ofConjField A φ) = ofConjField A (Module.Dual.transpose - (jetEval ∘ₗ (JetComponentSpace.repConj rep (ι g⁻¹)).comp + (jetEval ∘ₗ (JetComponentSpace.repConj M.repJet (ι g⁻¹)).comp jetOfConstant) φ) := by have h : (ι g)⁻¹ = ι g⁻¹ := (map_inv ι g).symm diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/GaugeAction.lean b/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/GaugeAction.lean index bc0787a9f..64b454134 100644 --- a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/GaugeAction.lean +++ b/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/GaugeAction.lean @@ -43,9 +43,10 @@ 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] +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} (M : MatterField jets) +variable {A : Type} [Ring A] [Algebra ℂ A] [IsFieldAlgebra (JetComponentSpace M) A] /-! @@ -53,73 +54,49 @@ variable {G : Type*} [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) : +/-- **The jet gauge action on the field algebra** of the matter field `M`: the algebra + functor applied to the gauge action on its jet component space. The fibrewise action on + the jets and its fibrewise-linearity are fields of `M`, so neither has to be supplied + here. -/ +noncomputable def repJet : Representation ℂ G (A) where toFun U := - (map A (JetComponentSpace.repJet rep hlin U)).toLinearMap + (map A (JetComponentSpace.repJet M 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 +lemma repJet_apply (U : G) (x : A) : + repJet M U x = + map A (JetComponentSpace.repJet M 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 +lemma repJet_apply_one (U : G) : + repJet M 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 +lemma repJet_apply_mul (U : G) (x y : A) : + repJet M U (x * y) = + repJet M U x * repJet M 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 +lemma repJet_ι (U : G) (v : JetComponentSpace M) : + repJet M U (ι A v) = + ι A (JetComponentSpace.repJet M 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 +noncomputable def repJetAlgHom (U : G) : A →ₐ[ℂ] A where + toFun := repJet M 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 + map_one' := repJet_apply_one M U + map_mul' := repJet_apply_mul M U commutes' r := by simp [repJet_apply] /-! @@ -137,35 +114,29 @@ the *value* of the gauge transformation at the base point alone. So `ofField` an 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 + (U : G) (φ : Module.Dual ℂ M.V) : + repJet M U (ofField A φ) = + ofField A (Module.Dual.transpose (jetEval ∘ₗ (M.repJet U⁻¹).comp jetOfConstant) φ) := by rw [ofField_apply, repJet_ι, ofField_apply] congr 1 refine Prod.ext ?_ ?_ - · exact JetComponentSpace.repDual_one_tmul rep hlin U φ + · exact JetComponentSpace.repDual_one_tmul M.repJet M.repJet_smul U φ · rw [JetComponentSpace.repJet_snd] exact map_zero _ -/-- **`ofConjField` is gauge equivariant**, for the conjugate action `repConj rep` on the +/-- **`ofConjField` is gauge equivariant**, for the conjugate action `repConj M.repJet` 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 φ) = + (U : G) (φ : Module.Dual ℂ (ConjModule M.V)) : + repJet M U (ofConjField A φ) = ofConjField A (Module.Dual.transpose - (jetEval ∘ₗ (JetComponentSpace.repConj rep U⁻¹).comp jetOfConstant) φ) := by + (jetEval ∘ₗ (JetComponentSpace.repConj M.repJet 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 φ + · exact JetComponentSpace.repDual_one_tmul (JetComponentSpace.repConj M.repJet) + (JetComponentSpace.repConj_smul_comm M.repJet_smul) U φ end FieldAlgebra diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/JetDeriv.lean b/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/JetDeriv.lean index b5a7074db..fca802aab 100644 --- a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/JetDeriv.lean +++ b/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/JetDeriv.lean @@ -44,8 +44,11 @@ namespace FieldAlgebra open TensorProduct -variable {V : Type} [AddCommGroup V] [Module ℂ V] -variable {A : Type} [Ring A] [Algebra ℂ A] [IsFieldAlgebra V A] [HasJetDeriv V A] +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} {M : MatterField jets} +variable {A : Type} [Ring A] [Algebra ℂ A] [IsFieldAlgebra (JetComponentSpace M) A] + [HasJetDeriv (JetComponentSpace M) (JetComponentSpace.jetDeriv (M := M)) A] /-! @@ -62,7 +65,7 @@ lemma jetDeriv_comm_apply (μ ν : Fin 1 ⊕ Fin 3) (x : A) : | ι v => rw [jetDeriv_ι, jetDeriv_ι, jetDeriv_ι, jetDeriv_ι] exact congrArg (ι A) - (DFunLike.congr_fun (JetComponentSpace.jetDeriv_comm (V := V) μ ν) v) + (DFunLike.congr_fun (JetComponentSpace.jetDeriv_comm (M := M) μ ν) v) | mul x y hx hy => simp only [jetDeriv_mul, map_add, hx, hy] abel @@ -132,7 +135,7 @@ lemma iteratedJetDeriv_one_of_ne_zero {s : Multiset (Fin 1 ⊕ Fin 3)} (hs : 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) : +lemma iteratedJetDeriv_ι (s : Multiset (Fin 1 ⊕ Fin 3)) (x : JetComponentSpace M) : iteratedJetDeriv s (ι A x) = ι A (TensorProduct.map (LinearMap.mulRight ℂ (DerivAlgebraComplex.basis s)) @@ -174,10 +177,10 @@ lemma iteratedJetDeriv_ι (s : Multiset (Fin 1 ⊕ Fin 3)) (x : JetComponentSpac /-- 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) : +lemma iteratedJetDeriv_ofField (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ M.V) : iteratedJetDeriv s (ofField A φ) = ι A - ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace V) := by + ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace M) := by rw [ofField_apply, iteratedJetDeriv_ι] congr 1 refine Prod.ext ?_ ?_ @@ -188,10 +191,10 @@ lemma iteratedJetDeriv_ofField (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dua derivative symbol `∂_s`. -/ @[simp] lemma iteratedJetDeriv_ofConjField (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule V)) : + (φ : Module.Dual ℂ (ConjModule M.V)) : iteratedJetDeriv s (ofConjField A φ) = ι A - ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace V) := by + ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace M) := by rw [ofConjField_apply, iteratedJetDeriv_ι] congr 1 refine Prod.ext ?_ ?_ @@ -207,30 +210,30 @@ lemma iteratedJetDeriv_ofConjField (s : Multiset (Fin 1 ⊕ Fin 3)) 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) => + Set.range (fun φ : Module.Dual ℂ M.V => iteratedJetDeriv s (ofField A φ)) ∪ + Set.range (fun φ : Module.Dual ℂ (ConjModule M.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) => + Set.range (fun φ : Module.Dual ℂ M.V => iteratedJetDeriv s (ofField A φ)) ∪ + Set.range (fun φ : Module.Dual ℂ (ConjModule M.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 := + let gField : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ M.V →ₗ[ℂ] A := (ι A).comp (LinearMap.inl ℂ _ _) - let gConj : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule V) →ₗ[ℂ] + let gConj : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule M.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), + have hbasisField : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ M.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)), + have hbasisConj : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule M.V)), gConj (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) ∈ Algebra.adjoin ℂ S := by intro s φ have h : gConj (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) @@ -259,7 +262,7 @@ theorem adjoin_iteratedJetDeriv_eq_top : 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)] + rw [← adjoin_ι_eq_top (C := JetComponentSpace M)] refine Algebra.adjoin_le ?_ rintro _ ⟨x, rfl⟩ have hx : x = LinearMap.inl ℂ _ _ x.1 + LinearMap.inr ℂ _ _ x.2 := by @@ -274,8 +277,9 @@ theorem adjoin_iteratedJetDeriv_eq_top : -/ -variable {W : Type} [AddCommGroup W] [Module ℂ W] -variable {B : Type} [Ring B] [Algebra ℂ B] [IsFieldAlgebra W B] [HasJetDeriv W B] +variable {N : MatterField jets} +variable {B : Type} [Ring B] [Algebra ℂ B] [IsFieldAlgebra (JetComponentSpace N) B] + [HasJetDeriv (JetComponentSpace N) (JetComponentSpace.jetDeriv (M := N)) B] /-- **An algebra homomorphism commuting with the total derivatives commutes with the iterated total derivatives.** This is what makes the inclusion of a species diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/JetDerivClass.lean b/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/JetDerivClass.lean index 5e34c145f..615f98bed 100644 --- a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/JetDerivClass.lean +++ b/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/JetDerivClass.lean @@ -20,30 +20,41 @@ built on them is in `Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.JetDer @[expose] public section -variable {V : Type} [AddCommGroup V] [Module ℂ V] +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} {M : MatterField jets} /-- **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 + an (even) derivation and acts on the generators by `shift μ`, the shift of the derivative + label on the component space. + + The shift is carried as a second `outParam` rather than being read off a matter field, + for the same reason `IsFieldAlgebra` is stated on the component space: a matter field is + not recoverable from `A`, while both `C` and the shift on it are, so instance resolution + keeps working. For the component space of a matter field the shift is + `JetComponentSpace.jetDeriv`. -/ +class HasJetDeriv (C : outParam Type) [AddCommGroup C] [Module ℂ C] + (shift : outParam ((Fin 1 ⊕ Fin 3) → C →ₗ[ℂ] C)) + (A : Type) [Ring A] [Algebra ℂ A] [IsFieldAlgebra C 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_ι : ∀ (μ : Fin 1 ⊕ Fin 3) (x : C), + jetDeriv μ (FieldAlgebra.ι A x) = FieldAlgebra.ι A (shift μ 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] +variable {A : Type} [Ring A] [Algebra ℂ A] [IsFieldAlgebra (JetComponentSpace M) A] + [HasJetDeriv (JetComponentSpace M) (JetComponentSpace.jetDeriv (M := M)) 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) : +lemma jetDeriv_ι (μ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace M) : jetDeriv μ (ι A x) = ι A (JetComponentSpace.jetDeriv μ x) := HasJetDeriv.jetDeriv_ι μ x diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/JetDerivConstruction.lean b/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/JetDerivConstruction.lean index e0dd8b718..651167421 100644 --- a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/JetDerivConstruction.lean +++ b/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/JetDerivConstruction.lean @@ -43,7 +43,9 @@ namespace BosonicAlgebra open TensorProduct -variable {V : Type} [AddCommGroup V] [Module ℂ V] +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} {M : MatterField jets} /-! @@ -55,41 +57,42 @@ variable {V : Type} [AddCommGroup V] [Module ℂ V] 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 := + BosonicAlgebra M →ₗ[ℂ] BosonicAlgebra M := 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) : +lemma jetDeriv_ι (μ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace M) : 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 := +lemma jetDeriv_one (μ : Fin 1 ⊕ Fin 3) : jetDeriv (M := M) μ (1 : BosonicAlgebra M) = 0 := SymmetricAlgebra.derivationOfLinear_one _ @[simp] lemma jetDeriv_algebraMap (μ : Fin 1 ⊕ Fin 3) (r : ℂ) : - jetDeriv (V := V) μ (algebraMap ℂ (BosonicAlgebra V) r) = 0 := + jetDeriv (M := M) μ (algebraMap ℂ (BosonicAlgebra M) 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) : +lemma jetDeriv_mul (μ : Fin 1 ⊕ Fin 3) (x y : BosonicAlgebra M) : 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 +noncomputable instance instHasJetDeriv : HasJetDeriv (JetComponentSpace M) (JetComponentSpace.jetDeriv (M := M)) + (BosonicAlgebra M) 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 + FieldAlgebra.jetDeriv (A := BosonicAlgebra M) μ = jetDeriv μ := rfl /-! @@ -97,12 +100,12 @@ lemma jetDeriv_eq (μ : Fin 1 ⊕ Fin 3) : -/ -variable {W : Type} [AddCommGroup W] [Module ℂ W] +variable {N : MatterField jets} /-- **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) : +lemma comap_jetDeriv (f : M.V →ₗ[ℂ] N.V) (μ : Fin 1 ⊕ Fin 3) (x : BosonicAlgebra N) : comap f (FieldAlgebra.jetDeriv μ x) = FieldAlgebra.jetDeriv μ (comap f x) := by induction x using FieldAlgebra.induction with | algebraMap r => @@ -125,7 +128,9 @@ namespace FermionicAlgebra open TensorProduct -variable {V : Type} [AddCommGroup V] [Module ℂ V] +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} {M : MatterField jets} /-! @@ -140,7 +145,7 @@ 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 + JetComponentSpace M →ₗ[ℂ] TrivSqZeroExt (FermionicAlgebra M) (FermionicAlgebra M) where toFun x := (ExteriorAlgebra.ι ℂ x, ExteriorAlgebra.ι ℂ (JetComponentSpace.jetDeriv μ x)) map_add' x y := by @@ -151,16 +156,16 @@ noncomputable def jetDerivGen (μ : Fin 1 ⊕ Fin 3) : rfl @[simp] -lemma jetDerivGen_fst (μ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace V) : +lemma jetDerivGen_fst (μ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace M) : (jetDerivGen μ x).fst = ExteriorAlgebra.ι ℂ x := rfl @[simp] -lemma jetDerivGen_snd (μ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace V) : +lemma jetDerivGen_snd (μ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace M) : (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) : +lemma jetDerivGen_mul_self (μ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace M) : jetDerivGen μ x * jetDerivGen μ x = 0 := by refine TrivSqZeroExt.ext ?_ ?_ · rw [TrivSqZeroExt.fst_mul, jetDerivGen_fst, ExteriorAlgebra.ι_sq_zero, @@ -172,20 +177,20 @@ lemma jetDerivGen_mul_self (μ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace V) : /-- 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) := + FermionicAlgebra M →ₐ[ℂ] TrivSqZeroExt (FermionicAlgebra M) (FermionicAlgebra M) := ExteriorAlgebra.lift ℂ ⟨jetDerivGen μ, jetDerivGen_mul_self μ⟩ @[simp] -lemma jetDerivHom_ι (μ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace V) : +lemma jetDerivHom_ι (μ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace M) : 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) : +lemma jetDerivHom_fst (μ : Fin 1 ⊕ Fin 3) (x : FermionicAlgebra M) : (jetDerivHom μ x).fst = x := by - have h : (TrivSqZeroExt.fstHom ℂ (FermionicAlgebra V) (FermionicAlgebra V)).comp - (jetDerivHom μ) = AlgHom.id ℂ (FermionicAlgebra V) := by + have h : (TrivSqZeroExt.fstHom ℂ (FermionicAlgebra M) (FermionicAlgebra M)).comp + (jetDerivHom μ) = AlgHom.id ℂ (FermionicAlgebra M) := by refine ExteriorAlgebra.hom_ext (LinearMap.ext fun v => ?_) simp exact DFunLike.congr_fun h x @@ -194,33 +199,33 @@ lemma jetDerivHom_fst (μ : Fin 1 ⊕ Fin 3) (x : FermionicAlgebra V) : 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 + FermionicAlgebra M →ₗ[ℂ] FermionicAlgebra M 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) : +lemma jetDeriv_apply (μ : Fin 1 ⊕ Fin 3) (x : FermionicAlgebra M) : 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) : +lemma jetDeriv_ι (μ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace M) : 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) μ)) +lemma jetDeriv_one (μ : Fin 1 ⊕ Fin 3) : jetDeriv (M := M) μ (1 : FermionicAlgebra M) = 0 := + congrArg TrivSqZeroExt.snd (map_one (jetDerivHom (M := M) μ)) @[simp] lemma jetDeriv_algebraMap (μ : Fin 1 ⊕ Fin 3) (r : ℂ) : - jetDeriv (V := V) μ (algebraMap ℂ (FermionicAlgebra V) r) = 0 := by + jetDeriv (M := M) μ (algebraMap ℂ (FermionicAlgebra M) 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) : +lemma jetDeriv_mul (μ : Fin 1 ⊕ Fin 3) (x y : FermionicAlgebra M) : 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 := @@ -230,14 +235,15 @@ lemma jetDeriv_mul (μ : Fin 1 ⊕ Fin 3) (x y : FermionicAlgebra V) : /-- 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 +noncomputable instance instHasJetDeriv : HasJetDeriv (JetComponentSpace M) (JetComponentSpace.jetDeriv (M := M)) + (FermionicAlgebra M) 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 + FieldAlgebra.jetDeriv (A := FermionicAlgebra M) μ = jetDeriv μ := rfl /-! @@ -245,12 +251,12 @@ lemma jetDeriv_eq (μ : Fin 1 ⊕ Fin 3) : -/ -variable {W : Type} [AddCommGroup W] [Module ℂ W] +variable {N : MatterField jets} /-- **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) : +lemma comap_jetDeriv (f : M.V →ₗ[ℂ] N.V) (μ : Fin 1 ⊕ Fin 3) (x : FermionicAlgebra N) : comap f (FieldAlgebra.jetDeriv μ x) = FieldAlgebra.jetDeriv μ (comap f x) := by induction x using FieldAlgebra.induction with | algebraMap r => diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/LorentzAction.lean b/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/LorentzAction.lean index dfa3414bc..e15404a35 100644 --- a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/LorentzAction.lean +++ b/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/LorentzAction.lean @@ -44,8 +44,10 @@ namespace FieldAlgebra open Matrix MatrixGroups TensorProduct -variable {V : Type} [AddCommGroup V] [Module ℂ V] -variable {A : Type} [Ring A] [Algebra ℂ A] [IsFieldAlgebra V A] +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} (M : MatterField jets) +variable {A : Type} [Ring A] [Algebra ℂ A] [IsFieldAlgebra (JetComponentSpace M) A] /-! @@ -53,51 +55,51 @@ variable {A : Type} [Ring A] [Algebra ℂ A] [IsFieldAlgebra V A] -/ -/-- **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) : +/-- **The Lorentz action on the field algebra** of the matter field `M`: the algebra + functor applied to the Lorentz action on its jet component space. The representation of + `SL(2,ℂ)` on the target space is a field of `M`, so it need not be supplied here. -/ +noncomputable def repLorentzGroup : Representation ℂ SL(2,ℂ) (A) where - toFun Λ := (map A (JetComponentSpace.repLorentzGroup repV Λ)).toLinearMap + toFun Λ := (map A (JetComponentSpace.repLorentzGroup M Λ)).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,ℂ)) +lemma repLorentzGroup_apply (Λ : SL(2,ℂ)) (x : A) : - repLorentzGroup repV Λ x = - map A (JetComponentSpace.repLorentzGroup repV Λ) x := rfl + repLorentzGroup M Λ x = + map A (JetComponentSpace.repLorentzGroup M Λ) x := rfl @[simp] -lemma repLorentzGroup_apply_one (repV : Representation ℂ SL(2,ℂ) V) (Λ : SL(2,ℂ)) : - repLorentzGroup repV Λ (1 : A) = 1 := by +lemma repLorentzGroup_apply_one (Λ : SL(2,ℂ)) : + repLorentzGroup M Λ (1 : A) = 1 := by simp [repLorentzGroup_apply] -lemma repLorentzGroup_apply_mul (repV : Representation ℂ SL(2,ℂ) V) (Λ : SL(2,ℂ)) +lemma repLorentzGroup_apply_mul (Λ : SL(2,ℂ)) (x y : A) : - repLorentzGroup repV Λ (x * y) - = repLorentzGroup repV Λ x * repLorentzGroup repV Λ y := by + repLorentzGroup M Λ (x * y) + = repLorentzGroup M Λ x * repLorentzGroup M Λ 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 +lemma repLorentzGroup_ι (Λ : SL(2,ℂ)) + (v : JetComponentSpace M) : + repLorentzGroup M Λ (ι A v) = + ι A (JetComponentSpace.repLorentzGroup M Λ 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,ℂ)) : +noncomputable def repLorentzGroupAlgHom (Λ : SL(2,ℂ)) : A →ₐ[ℂ] A where - toFun := repLorentzGroup repV Λ + toFun := repLorentzGroup M Λ map_add' := LinearMap.map_add _ map_zero' := LinearMap.map_zero _ - map_one' := repLorentzGroup_apply_one repV Λ - map_mul' := repLorentzGroup_apply_mul repV Λ + map_one' := repLorentzGroup_apply_one M Λ + map_mul' := repLorentzGroup_apply_mul M Λ commutes' r := by simp [repLorentzGroup_apply] /-! @@ -108,12 +110,12 @@ noncomputable def repLorentzGroupAlgHom (repV : Representation ℂ SL(2,ℂ) V) /-- **`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 + are generated: `ofField` intertwines `M.repLorentz.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 +lemma repLorentzGroup_ofField (Λ : SL(2,ℂ)) + (φ : Module.Dual ℂ M.V) : + repLorentzGroup M Λ (ofField A φ) = ofField A (M.repLorentz.dual Λ φ) := by rw [ofField_apply, repLorentzGroup_ι, ofField_apply] congr 1 refine Prod.ext ?_ ?_ @@ -127,16 +129,16 @@ lemma repLorentzGroup_ofField (repV : Representation ℂ SL(2,ℂ) V) (Λ : SL(2 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 +lemma repLorentzGroup_ofConjField (Λ : SL(2,ℂ)) + (φ : Module.Dual ℂ (ConjModule M.V)) : + repLorentzGroup M Λ (ofConjField A φ) = ofConjField A (M.repLorentz.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 Λ φ) = _ + show (DerivAlgebraComplex.repLorentzGroup Λ 1) ⊗ₜ[ℂ] (M.repLorentz.conj.dual Λ φ) = _ rw [DerivAlgebraComplex.repLorentzGroup_apply_one] /-! @@ -145,17 +147,17 @@ lemma repLorentzGroup_ofConjField (repV : Representation ℂ SL(2,ℂ) V) (Λ : -/ -variable [HasJetDeriv V A] +variable [HasJetDeriv (JetComponentSpace M) (JetComponentSpace.jetDeriv (M := M)) 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,ℂ)) +lemma repLorentzGroup_jetDeriv (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) (x : A) : - repLorentzGroup repV Λ (jetDeriv μ x) = + repLorentzGroup M Λ (jetDeriv μ x) = ∑ a, (((Lorentz.SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • - jetDeriv a (repLorentzGroup repV Λ x) := by + jetDeriv a (repLorentzGroup M Λ x) := by induction x using FieldAlgebra.induction with | algebraMap r => rw [jetDeriv_algebraMap, map_zero] @@ -177,8 +179,8 @@ lemma repLorentzGroup_jetDeriv (repV : Representation ℂ SL(2,ℂ) V) (Λ : SL( /-- 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 _ _ _ +instance instIsLorentzDeriv : + Lorentz.IsLorentzDeriv (repLorentzGroup M) (jetDeriv (A := A)) where + rep_deriv := repLorentzGroup_jetDeriv M _ _ _ end FieldAlgebra diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/MassDim.lean b/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/MassDim.lean index dca625555..1b663d0ff 100644 --- a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/MassDim.lean +++ b/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/MassDim.lean @@ -40,8 +40,10 @@ namespace FieldAlgebra open TensorProduct -variable {V : Type} [AddCommGroup V] [Module ℂ V] -variable {A : Type} [Ring A] [Algebra ℂ A] [IsFieldAlgebra V A] +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} {M : MatterField jets} +variable {A : Type} [Ring A] [Algebra ℂ A] [IsFieldAlgebra (JetComponentSpace M) A] /-! @@ -56,7 +58,7 @@ noncomputable def massWeightScale (w : ℕ) (c : ℂ) : A →ₐ[ℂ] A := map A (JetComponentSpace.massWeightScale w c) @[simp] -lemma massWeightScale_ι (w : ℕ) (c : ℂ) (x : JetComponentSpace V) : +lemma massWeightScale_ι (w : ℕ) (c : ℂ) (x : JetComponentSpace M) : massWeightScale w c (ι A x) = ι A (JetComponentSpace.massWeightScale w c x) := map_ι A _ x @@ -69,7 +71,7 @@ lemma massWeightScale_ι (w : ℕ) (c : ℂ) (x : JetComponentSpace V) : /-- The undifferentiated field carries its own mass weight. -/ @[simp] -lemma massWeightScale_ofField (w : ℕ) (c : ℂ) (φ : Module.Dual ℂ V) : +lemma massWeightScale_ofField (w : ℕ) (c : ℂ) (φ : Module.Dual ℂ M.V) : massWeightScale w c (ofField A φ) = c ^ w • ofField A φ := by rw [ofField_apply, massWeightScale_ι, ← map_smul] congr 1 @@ -82,7 +84,7 @@ lemma massWeightScale_ofField (w : ℕ) (c : ℂ) (φ : Module.Dual ℂ V) : /-- The undifferentiated conjugate field carries the same mass weight as the field. -/ @[simp] -lemma massWeightScale_ofConjField (w : ℕ) (c : ℂ) (φ : Module.Dual ℂ (ConjModule V)) : +lemma massWeightScale_ofConjField (w : ℕ) (c : ℂ) (φ : Module.Dual ℂ (ConjModule M.V)) : massWeightScale w c (ofConjField A φ) = c ^ w • ofConjField A φ := by rw [ofConjField_apply, massWeightScale_ι, ← map_smul] congr 1 @@ -93,7 +95,7 @@ lemma massWeightScale_ofConjField (w : ℕ) (c : ℂ) (φ : Module.Dual ℂ (Con simp only [TensorProduct.map_tmul, AlgHom.toLinearMap_apply, map_one, LinearMap.id_apply, Prod.smul_snd, TensorProduct.smul_tmul'] -variable [HasJetDeriv V A] +variable [HasJetDeriv (JetComponentSpace M) (JetComponentSpace.jetDeriv (M := M)) A] /-- **A total derivative adds mass weight two**: the scaling intertwines the total derivative up to a factor `c ^ 2`. -/ diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/Prod.lean b/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/Prod.lean index ffd3126c2..15f1347a5 100644 --- a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/Prod.lean +++ b/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/Prod.lean @@ -8,6 +8,7 @@ module public import Mathlib.LinearAlgebra.CliffordAlgebra.Prod public import Mathlib.LinearAlgebra.TensorProduct.Prod public import Physlib.ClassicalFieldTheory.JetAlgebra.FieldAlgebra.Statistics +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.Prod /-! # The field algebras of a direct sum @@ -23,7 +24,7 @@ anticommute. ## ii. Key results - `BosonicAlgebra.prodEquiv` : - `BosonicAlgebra (V × W) ≃ₐ[ℂ] BosonicAlgebra V ⊗[ℂ] BosonicAlgebra W`. + `BosonicAlgebra (V × W) ≃ₐ[ℂ] BosonicAlgebra M ⊗[ℂ] BosonicAlgebra N`. - `FermionicAlgebra.evenOdd` : the Fermi-parity grading. - `FermionicAlgebra.prodEquiv` : the graded tensor product decomposition. @@ -31,6 +32,10 @@ anticommute. @[expose] public section +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} + section Bosonic open scoped TensorProduct @@ -43,14 +48,16 @@ open scoped TensorProduct -/ /-- **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 — + Two bosonic matter fields of the same mass weight 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 shared weight is what `MatterField.prod` needs to exist; the equivalence + itself does not use it. 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 +noncomputable def BosonicAlgebra.prodEquiv (M N : MatterField jets) + (h : M.massWeight = N.massWeight) : + BosonicAlgebra (M.prod N h) ≃ₐ[ℂ] BosonicAlgebra M ⊗[ℂ] BosonicAlgebra N := + (SymmetricAlgebra.congr (JetComponentSpace.prodEquiv M N h)).trans SymmetricAlgebra.prodEquiv end Bosonic @@ -66,7 +73,6 @@ noncomputable def ExteriorAlgebra.congr {R A B : Type*} [CommRing R] [AddCommGro CliffordAlgebra.equivOfIsometry ⟨e, fun _ => rfl⟩ -variable {V W : Type} [AddCommGroup V] [Module ℂ V] [AddCommGroup W] [Module ℂ W] /-! @@ -87,9 +93,9 @@ with the component space itself, in /-- **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)) +abbrev FermionicAlgebra.evenOdd (M : MatterField jets) : + ZMod 2 → Submodule ℂ (FermionicAlgebra M) := + CliffordAlgebra.evenOdd (0 : QuadraticForm ℂ (JetComponentSpace M)) /-! @@ -98,21 +104,22 @@ abbrev FermionicAlgebra.evenOdd (V : Type) [AddCommGroup V] [Module ℂ V] : -/ /-- **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. + algebras.** Two matter fields of the same mass weight 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 <| +noncomputable def FermionicAlgebra.prodEquiv (M N : MatterField jets) + (h : M.massWeight = N.massWeight) : + FermionicAlgebra (M.prod N h) ≃ₐ[ℂ] + (FermionicAlgebra.evenOdd M ᵍ⊗[ℂ] FermionicAlgebra.evenOdd N) := + (ExteriorAlgebra.congr (JetComponentSpace.prodEquiv M N h)).trans <| (CliffordAlgebra.equivOfIsometry - (Q₁ := (0 : QuadraticForm ℂ (JetComponentSpace V × JetComponentSpace W))) - (Q₂ := (0 : QuadraticForm ℂ (JetComponentSpace V)).prod - (0 : QuadraticForm ℂ (JetComponentSpace W))) + (Q₁ := (0 : QuadraticForm ℂ (JetComponentSpace M × JetComponentSpace N))) + (Q₂ := (0 : QuadraticForm ℂ (JetComponentSpace M)).prod + (0 : QuadraticForm ℂ (JetComponentSpace N))) ⟨LinearEquiv.refl ℂ _, fun _ => by simp⟩).trans (CliffordAlgebra.prodEquiv _ _) diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/Statistics.lean b/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/Statistics.lean index 5b738e579..ccbaf2529 100644 --- a/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/Statistics.lean +++ b/Physlib/ClassicalFieldTheory/JetAlgebra/FieldAlgebra/Statistics.lean @@ -13,12 +13,12 @@ public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basic ## i. Overview -The two field algebras of a `V`-valued matter field, distinguished by the statistics of the +The two field algebras of the matter field `M`, distinguished by the statistics of the field: -* the **bosonic algebra** `BosonicAlgebra V`, the symmetric algebra on the jet component +* the **bosonic algebra** `BosonicAlgebra M`, the symmetric algebra on the jet component space — the component functions commute; -* the **fermionic algebra** `FermionicAlgebra V`, the exterior algebra on the jet component +* the **fermionic algebra** `FermionicAlgebra M`, 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 @@ -44,7 +44,9 @@ section Bosonic open TensorProduct -variable {V : Type} [AddCommGroup V] [Module ℂ V] +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} {M : MatterField jets} /-! @@ -52,11 +54,11 @@ variable {V : Type} [AddCommGroup V] [Module ℂ V] -/ -/-- The bosonic algebra of a `V`-valued matter field: the symmetric algebra on the space +/-- The bosonic algebra of the matter field `M`: 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) +abbrev BosonicAlgebra (M : MatterField jets) : Type := + SymmetricAlgebra ℂ (JetComponentSpace M) namespace BosonicAlgebra @@ -72,18 +74,18 @@ namespace BosonicAlgebra functions". -/ @[simp] lemma adjoin_ι_eq_top : - Algebra.adjoin ℂ (Set.range (SymmetricAlgebra.ι ℂ (JetComponentSpace V))) = ⊤ := + Algebra.adjoin ℂ (Set.range (SymmetricAlgebra.ι ℂ (JetComponentSpace M))) = ⊤ := SymmetricAlgebra.adjoin_range_ι /-- Two component functions commute: Bose statistics. -/ -lemma ι_mul_ι_comm (x y : JetComponentSpace V) : - (SymmetricAlgebra.ι ℂ _ x * SymmetricAlgebra.ι ℂ _ y : BosonicAlgebra V) +lemma ι_mul_ι_comm (x y : JetComponentSpace M) : + (SymmetricAlgebra.ι ℂ _ x * SymmetricAlgebra.ι ℂ _ y : BosonicAlgebra M) = 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 +noncomputable instance instIsFieldAlgebra : IsFieldAlgebra (JetComponentSpace M) (BosonicAlgebra M) where ι := SymmetricAlgebra.ι ℂ _ map := SymmetricAlgebra.map map_ι f x := SymmetricAlgebra.map_apply_ι f x @@ -97,7 +99,7 @@ noncomputable instance instIsFieldAlgebra : IsFieldAlgebra V (BosonicAlgebra V) | 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 +lemma ι_eq : FieldAlgebra.ι (BosonicAlgebra M) = SymmetricAlgebra.ι ℂ (JetComponentSpace M) := rfl /-! @@ -111,45 +113,45 @@ functorial and compatible with everything the algebra carries. -/ -variable {W : Type} [AddCommGroup W] [Module ℂ W] +variable {N : MatterField jets} /-- **The bosonic algebra is contravariant in the target space.** A linear map - `f : V →ₗ[ℂ] W` induces an algebra homomorphism `BosonicAlgebra W →ₐ[ℂ] BosonicAlgebra V` + `f : V →ₗ[ℂ] W` induces an algebra homomorphism `BosonicAlgebra N →ₐ[ℂ] BosonicAlgebra M` 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 := +noncomputable def comap (f : M.V →ₗ[ℂ] N.V) : BosonicAlgebra N →ₐ[ℂ] BosonicAlgebra M := 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) := +lemma comap_ι (f : M.V →ₗ[ℂ] N.V) (x : JetComponentSpace N) : + comap f (FieldAlgebra.ι (BosonicAlgebra N) x) + = FieldAlgebra.ι (BosonicAlgebra M) (JetComponentSpace.comap f x) := SymmetricAlgebra.map_apply_ι _ x @[simp] -lemma comap_id : comap (LinearMap.id : V →ₗ[ℂ] V) = AlgHom.id ℂ (BosonicAlgebra V) := by +lemma comap_id : comap (LinearMap.id : M.V →ₗ[ℂ] M.V) = AlgHom.id ℂ (BosonicAlgebra M) := 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) : +lemma comap_comp {P : MatterField jets} (f : M.V →ₗ[ℂ] N.V) (g : N.V →ₗ[ℂ] P.V) : 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 +lemma comap_ofField (f : M.V →ₗ[ℂ] N.V) (φ : Module.Dual ℂ N.V) : + comap f (FieldAlgebra.ofField (BosonicAlgebra N) φ) + = FieldAlgebra.ofField (BosonicAlgebra M) (φ ∘ₗ 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 +lemma comap_ofConjField (f : M.V →ₗ[ℂ] N.V) (φ : Module.Dual ℂ (ConjModule N.V)) : + comap f (FieldAlgebra.ofConjField (BosonicAlgebra N) φ) + = FieldAlgebra.ofConjField (BosonicAlgebra M) (φ ∘ₗ ConjModule.map f) := by rw [FieldAlgebra.ofConjField_apply, comap_ι, FieldAlgebra.ofConjField_apply] congr 1 @@ -161,7 +163,9 @@ section Fermionic open TensorProduct -variable {V : Type} [AddCommGroup V] [Module ℂ V] +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} {M : MatterField jets} /-! @@ -169,11 +173,11 @@ variable {V : Type} [AddCommGroup V] [Module ℂ V] -/ -/-- The fermionic algebra of a `V`-valued matter field: the exterior algebra on the space +/-- The fermionic algebra of the matter field `M`: 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) +abbrev FermionicAlgebra (M : MatterField jets) : Type := + ExteriorAlgebra ℂ (JetComponentSpace M) namespace FermionicAlgebra @@ -189,23 +193,23 @@ namespace FermionicAlgebra functions". -/ @[simp] lemma adjoin_ι_eq_top : - Algebra.adjoin ℂ (Set.range (ExteriorAlgebra.ι ℂ (M := JetComponentSpace V))) = ⊤ := + Algebra.adjoin ℂ (Set.range (ExteriorAlgebra.ι ℂ (M := JetComponentSpace M))) = ⊤ := 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) := +lemma ι_sq_zero (x : JetComponentSpace M) : + ExteriorAlgebra.ι ℂ x * ExteriorAlgebra.ι ℂ x = (0 : FermionicAlgebra M) := ExteriorAlgebra.ι_sq_zero x /-- Two component functions anticommute. -/ -lemma ι_mul_ι_swap (x y : JetComponentSpace V) : - (ExteriorAlgebra.ι ℂ x * ExteriorAlgebra.ι ℂ y : FermionicAlgebra V) +lemma ι_mul_ι_swap (x y : JetComponentSpace M) : + (ExteriorAlgebra.ι ℂ x * ExteriorAlgebra.ι ℂ y : FermionicAlgebra M) = - (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 +noncomputable instance instIsFieldAlgebra : IsFieldAlgebra (JetComponentSpace M) (FermionicAlgebra M) where ι := ExteriorAlgebra.ι ℂ map := ExteriorAlgebra.map map_ι f x := ExteriorAlgebra.map_apply_ι f x @@ -219,7 +223,7 @@ noncomputable instance instIsFieldAlgebra : IsFieldAlgebra V (FermionicAlgebra V | add a b ha hb => exact h4 a b ha hb adjoin_ι_eq_top := CliffordAlgebra.adjoin_range_ι -lemma ι_eq : FieldAlgebra.ι (FermionicAlgebra V) = ExteriorAlgebra.ι ℂ := rfl +lemma ι_eq : FieldAlgebra.ι (FermionicAlgebra M) = ExteriorAlgebra.ι ℂ := rfl /-! @@ -233,45 +237,45 @@ functorial and compatible with everything the algebra carries. -/ -variable {W : Type} [AddCommGroup W] [Module ℂ W] +variable {N : MatterField jets} /-- **The fermionic algebra is contravariant in the target space.** A linear map - `f : V →ₗ[ℂ] W` induces an algebra homomorphism `FermionicAlgebra W →ₐ[ℂ] FermionicAlgebra V` + `f : V →ₗ[ℂ] W` induces an algebra homomorphism `FermionicAlgebra N →ₐ[ℂ] FermionicAlgebra M` 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 := +noncomputable def comap (f : M.V →ₗ[ℂ] N.V) : FermionicAlgebra N →ₐ[ℂ] FermionicAlgebra M := 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) := +lemma comap_ι (f : M.V →ₗ[ℂ] N.V) (x : JetComponentSpace N) : + comap f (FieldAlgebra.ι (FermionicAlgebra N) x) + = FieldAlgebra.ι (FermionicAlgebra M) (JetComponentSpace.comap f x) := ExteriorAlgebra.map_apply_ι _ x @[simp] -lemma comap_id : comap (LinearMap.id : V →ₗ[ℂ] V) = AlgHom.id ℂ (FermionicAlgebra V) := by +lemma comap_id : comap (LinearMap.id : M.V →ₗ[ℂ] M.V) = AlgHom.id ℂ (FermionicAlgebra M) := 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) : +lemma comap_comp {P : MatterField jets} (f : M.V →ₗ[ℂ] N.V) (g : N.V →ₗ[ℂ] P.V) : 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 +lemma comap_ofField (f : M.V →ₗ[ℂ] N.V) (φ : Module.Dual ℂ N.V) : + comap f (FieldAlgebra.ofField (FermionicAlgebra N) φ) + = FieldAlgebra.ofField (FermionicAlgebra M) (φ ∘ₗ 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 +lemma comap_ofConjField (f : M.V →ₗ[ℂ] N.V) (φ : Module.Dual ℂ (ConjModule N.V)) : + comap f (FieldAlgebra.ofConjField (FermionicAlgebra N) φ) + = FieldAlgebra.ofConjField (FermionicAlgebra M) (φ ∘ₗ ConjModule.map f) := by rw [FieldAlgebra.ofConjField_apply, comap_ι, FieldAlgebra.ofConjField_apply] congr 1 diff --git a/Physlib/ClassicalFieldTheory/JetAlgebra/LocalFieldAlgebra.lean b/Physlib/ClassicalFieldTheory/JetAlgebra/LocalFieldAlgebra.lean index d82819135..ebe61db54 100644 --- a/Physlib/ClassicalFieldTheory/JetAlgebra/LocalFieldAlgebra.lean +++ b/Physlib/ClassicalFieldTheory/JetAlgebra/LocalFieldAlgebra.lean @@ -170,12 +170,12 @@ noncomputable def ιConnection : /-- The generators of one fermionic species inside the local field algebra. -/ noncomputable def ιFermion (i : T.FermionSpecies) : - JetComponentSpace (T.FermionValue i) →ₗ[ℂ] T.LocalFieldAlgebra := + JetComponentSpace (T.fermion i) →ₗ[ℂ] T.LocalFieldAlgebra := T.ιFermionTotal ∘ₗ T.inclFermion i /-- The generators of one bosonic species inside the local field algebra. -/ noncomputable def ιBoson (j : T.BosonSpecies) : - JetComponentSpace (T.BosonValue j) →ₗ[ℂ] T.LocalFieldAlgebra := + JetComponentSpace (T.boson j) →ₗ[ℂ] T.LocalFieldAlgebra := T.ιBosonTotal ∘ₗ T.inclBoson j variable {T} @@ -197,10 +197,10 @@ lemma ιConnection_apply (v : GaugeBoson.JetComponentSpace 𝔤) : ⊗ₜ[ℂ] ((1 : ℂ) ⊗ₜ[ℝ] SymmetricAlgebra.ι ℝ (GaugeBoson.JetComponentSpace 𝔤) v) := rfl -lemma ιFermion_apply (i : T.FermionSpecies) (x : JetComponentSpace (T.FermionValue i)) : +lemma ιFermion_apply (i : T.FermionSpecies) (x : JetComponentSpace (T.fermion i)) : T.ιFermion i x = T.ιFermionTotal (T.inclFermion i x) := rfl -lemma ιBoson_apply (j : T.BosonSpecies) (y : JetComponentSpace (T.BosonValue j)) : +lemma ιBoson_apply (j : T.BosonSpecies) (y : JetComponentSpace (T.boson j)) : T.ιBoson j y = T.ιBosonTotal (T.inclBoson j y) := rfl /-! @@ -264,7 +264,7 @@ lemma ιConnection_commute_ιFermionTotal (v : GaugeBoson.JetComponentSpace 𝔤 /-- A fermionic generator of a species squares to zero. -/ @[simp] -lemma ιFermion_mul_self (i : T.FermionSpecies) (x : JetComponentSpace (T.FermionValue i)) : +lemma ιFermion_mul_self (i : T.FermionSpecies) (x : JetComponentSpace (T.fermion i)) : T.ιFermion i x * T.ιFermion i x = 0 := ιFermionTotal_mul_self (T.inclFermion i x) @@ -272,32 +272,32 @@ lemma ιFermion_mul_self (i : T.FermionSpecies) (x : JetComponentSpace (T.Fermio one exterior algebra through different summands of the fermionic generator space, so this is ordinary exterior anticommutation and not an extra relation; it is what separate exterior algebras joined by an ordinary tensor product would lose. -/ -lemma ιFermion_mul_swap (i j : T.FermionSpecies) (x : JetComponentSpace (T.FermionValue i)) - (y : JetComponentSpace (T.FermionValue j)) : +lemma ιFermion_mul_swap (i j : T.FermionSpecies) (x : JetComponentSpace (T.fermion i)) + (y : JetComponentSpace (T.fermion j)) : T.ιFermion i x * T.ιFermion j y = -(T.ιFermion j y * T.ιFermion i x) := ιFermionTotal_mul_swap (T.inclFermion i x) (T.inclFermion j y) /-- Bosonic generators commute, across species as well as within one. -/ -lemma ιBoson_commute (i j : T.BosonSpecies) (x : JetComponentSpace (T.BosonValue i)) - (y : JetComponentSpace (T.BosonValue j)) : +lemma ιBoson_commute (i j : T.BosonSpecies) (x : JetComponentSpace (T.boson i)) + (y : JetComponentSpace (T.boson j)) : Commute (T.ιBoson i x) (T.ιBoson j y) := ιBosonTotal_commute (T.inclBoson i x) (T.inclBoson j y) /-- A bosonic generator commutes with a fermionic one, bosons being even. -/ lemma ιBoson_commute_ιFermion (j : T.BosonSpecies) (i : T.FermionSpecies) - (y : JetComponentSpace (T.BosonValue j)) (x : JetComponentSpace (T.FermionValue i)) : + (y : JetComponentSpace (T.boson j)) (x : JetComponentSpace (T.fermion i)) : Commute (T.ιBoson j y) (T.ιFermion i x) := ιBosonTotal_commute_ιFermionTotal (T.inclBoson j y) (T.inclFermion i x) /-- A bosonic generator commutes with a connection generator. -/ lemma ιBoson_commute_ιConnection (j : T.BosonSpecies) - (y : JetComponentSpace (T.BosonValue j)) (v : GaugeBoson.JetComponentSpace 𝔤) : + (y : JetComponentSpace (T.boson j)) (v : GaugeBoson.JetComponentSpace 𝔤) : Commute (T.ιBoson j y) (T.ιConnection v) := ιBosonTotal_commute_ιConnection (T.inclBoson j y) v /-- A connection generator commutes with a fermionic one, the connection being even. -/ lemma ιConnection_commute_ιFermion (v : GaugeBoson.JetComponentSpace 𝔤) - (i : T.FermionSpecies) (x : JetComponentSpace (T.FermionValue i)) : + (i : T.FermionSpecies) (x : JetComponentSpace (T.fermion i)) : Commute (T.ιConnection v) (T.ιFermion i x) := ιConnection_commute_ιFermionTotal v (T.inclFermion i x) @@ -408,9 +408,9 @@ variable (T) @[ext] structure Assignment (B : Type*) [Ring B] [Algebra ℂ B] where /-- The images of the generators of each fermionic species. -/ - fermion : ∀ i, JetComponentSpace (T.FermionValue i) →ₗ[ℂ] B + fermion : ∀ i, JetComponentSpace (T.fermion i) →ₗ[ℂ] B /-- The images of the generators of each bosonic species. -/ - boson : ∀ j, JetComponentSpace (T.BosonValue j) →ₗ[ℂ] B + boson : ∀ j, JetComponentSpace (T.boson j) →ₗ[ℂ] B /-- The images of the connection generators; only real-linear, as the connection generator space is real. -/ connection : GaugeBoson.JetComponentSpace 𝔤 →ₗ[ℝ] B @@ -436,7 +436,7 @@ variable {T} `Assignment.fermion_mul_self` and `Assignment.fermion_mul_swap` together; the second is vacuous only for a family with at most one species. -/ lemma assemble_mul_self_iff {B : Type*} [Ring B] [Algebra ℂ B] - (f : ∀ i, JetComponentSpace (T.FermionValue i) →ₗ[ℂ] B) : + (f : ∀ i, JetComponentSpace (T.fermion i) →ₗ[ℂ] B) : (∀ v, T.assembleFermion f v * T.assembleFermion f v = 0) ↔ ((∀ i x, f i x * f i x = 0) ∧ ∀ i j x y, f i x * f j y = -(f j y * f i x)) := by @@ -468,12 +468,12 @@ def bosonTotal : T.BosonGenerators →ₗ[ℂ] B := @[simp] lemma fermionTotal_inclFermion (i : T.FermionSpecies) - (x : JetComponentSpace (T.FermionValue i)) : + (x : JetComponentSpace (T.fermion i)) : d.fermionTotal (T.inclFermion i x) = d.fermion i x := assembleFermion_inclFermion d.fermion i x @[simp] -lemma bosonTotal_inclBoson (j : T.BosonSpecies) (y : JetComponentSpace (T.BosonValue j)) : +lemma bosonTotal_inclBoson (j : T.BosonSpecies) (y : JetComponentSpace (T.boson j)) : d.bosonTotal (T.inclBoson j y) = d.boson j y := assembleBoson_inclBoson d.boson j y @@ -705,12 +705,12 @@ lemma lift_ιConnection (v : GaugeBoson.JetComponentSpace 𝔤) : simp [lift, ιConnection_apply, matterHom] @[simp] -lemma lift_ιFermion (i : T.FermionSpecies) (x : JetComponentSpace (T.FermionValue i)) : +lemma lift_ιFermion (i : T.FermionSpecies) (x : JetComponentSpace (T.fermion i)) : d.lift (T.ιFermion i x) = d.fermion i x := by rw [ιFermion_apply, d.lift_ιFermionTotal, d.fermionTotal_inclFermion] @[simp] -lemma lift_ιBoson (j : T.BosonSpecies) (y : JetComponentSpace (T.BosonValue j)) : +lemma lift_ιBoson (j : T.BosonSpecies) (y : JetComponentSpace (T.boson j)) : d.lift (T.ιBoson j y) = d.boson j y := by rw [ιBoson_apply, d.lift_ιBosonTotal, d.bosonTotal_inclBoson] diff --git a/Physlib/Particles/StandardModel/Fermions/JetAlgebra/Basic.lean b/Physlib/Particles/StandardModel/Fermions/JetAlgebra/Basic.lean index 8b626e596..899f7c54c 100644 --- a/Physlib/Particles/StandardModel/Fermions/JetAlgebra/Basic.lean +++ b/Physlib/Particles/StandardModel/Fermions/JetAlgebra/Basic.lean @@ -14,6 +14,8 @@ public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.Basic public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet.Basic public import Physlib.Particles.StandardModel.Fermions.UpSinglet.Basic public import Physlib.Particles.StandardModel.Fermions.DownSinglet.Basic +public import Physlib.Particles.StandardModel.Fermions.MatterField +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.Pi /-! # The fermionic jet algebra of the Standard Model @@ -94,6 +96,24 @@ abbrev FermionSpace : Type := (Fin 3 → LeptonDoublet) × (Fin 3 → LeptonSinglet) × (Fin 3 → QuarkDoublet) × (Fin 3 → UpSinglet) × (Fin 3 → DownSinglet) +/-- The matter field of three generations of one fermion species: the direct sum of three + copies of it, which all carry the same mass weight. -/ +noncomputable def generations (M : MatterField localGaugeData) : MatterField localGaugeData := + MatterField.pi (fun _ : Fin 3 => M) M.massWeight fun _ => rfl + +/-- **The fermionic matter field of the Standard Model**: the direct sum of three + generations of each of the five species, in the order in which `FermionSpace` lists them. + Its value space is `FermionSpace` by definition, and every summand carries mass weight + three, which is what lets the direct sums be formed. -/ +noncomputable def fermionMatterField : MatterField localGaugeData := + (generations LeptonDoublet.matterField).prod + ((generations LeptonSinglet.matterField).prod + ((generations QuarkDoublet.matterField).prod + ((generations UpSinglet.matterField).prod + (generations DownSinglet.matterField) rfl) rfl) rfl) rfl + +lemma fermionMatterField_V : fermionMatterField.V = FermionSpace := rfl + namespace FermionSpace /-! @@ -387,7 +407,7 @@ end FermionSpace 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 +abbrev FermionJetAlgebra : Type := FermionicAlgebra fermionMatterField namespace FermionJetAlgebra @@ -476,34 +496,34 @@ 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 _ _ + FermionJetAlgebra ≃ₐ[ℂ] (FermionicAlgebra.evenOdd (generations LeptonDoublet.matterField) ᵍ⊗[ℂ] + FermionicAlgebra.evenOdd ((generations LeptonSinglet.matterField).prod ((generations QuarkDoublet.matterField).prod ((generations UpSinglet.matterField).prod (generations DownSinglet.matterField) rfl) rfl) rfl)) := + FermionicAlgebra.prodEquiv (generations LeptonDoublet.matterField) + ((generations LeptonSinglet.matterField).prod ((generations QuarkDoublet.matterField).prod ((generations UpSinglet.matterField).prod (generations DownSinglet.matterField) rfl) rfl) rfl) rfl /-- 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 _ _ + FermionicAlgebra ((generations LeptonSinglet.matterField).prod ((generations QuarkDoublet.matterField).prod ((generations UpSinglet.matterField).prod (generations DownSinglet.matterField) rfl) rfl) rfl) ≃ₐ[ℂ] + (FermionicAlgebra.evenOdd (generations LeptonSinglet.matterField) ᵍ⊗[ℂ] + FermionicAlgebra.evenOdd ((generations QuarkDoublet.matterField).prod ((generations UpSinglet.matterField).prod (generations DownSinglet.matterField) rfl) rfl)) := + FermionicAlgebra.prodEquiv (generations LeptonSinglet.matterField) + ((generations QuarkDoublet.matterField).prod ((generations UpSinglet.matterField).prod (generations DownSinglet.matterField) rfl) rfl) rfl /-- 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 _ _ + FermionicAlgebra ((generations QuarkDoublet.matterField).prod ((generations UpSinglet.matterField).prod (generations DownSinglet.matterField) rfl) rfl) ≃ₐ[ℂ] + (FermionicAlgebra.evenOdd (generations QuarkDoublet.matterField) ᵍ⊗[ℂ] + FermionicAlgebra.evenOdd ((generations UpSinglet.matterField).prod (generations DownSinglet.matterField) rfl)) := + FermionicAlgebra.prodEquiv (generations QuarkDoublet.matterField) + ((generations UpSinglet.matterField).prod (generations DownSinglet.matterField) rfl) rfl /-- 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 _ _ + FermionicAlgebra ((generations UpSinglet.matterField).prod (generations DownSinglet.matterField) rfl) ≃ₐ[ℂ] + (FermionicAlgebra.evenOdd (generations UpSinglet.matterField) ᵍ⊗[ℂ] + FermionicAlgebra.evenOdd (generations DownSinglet.matterField)) := + FermionicAlgebra.prodEquiv (generations UpSinglet.matterField) + (generations DownSinglet.matterField) rfl /-! @@ -514,17 +534,15 @@ noncomputable def exteriorProductUpSinglet : 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 + FermionicAlgebra.repLorentzGroup fermionMatterField /-- 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 + FermionicAlgebra.repJetGaugeGroupI fermionMatterField /-- 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 + FermionicAlgebra.repGaugeGroupI fermionMatterField /-! @@ -536,7 +554,7 @@ noncomputable def repGaugeGroupI : Representation ℂ GaugeGroupI FermionJetAlge 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 + FermionicAlgebra.massWeightScale (M := fermionMatterField) 3 c end FermionJetAlgebra diff --git a/Physlib/Particles/StandardModel/FieldData.lean b/Physlib/Particles/StandardModel/FieldData.lean index 22df0d496..e9ddbf8e6 100644 --- a/Physlib/Particles/StandardModel/FieldData.lean +++ b/Physlib/Particles/StandardModel/FieldData.lean @@ -187,10 +187,10 @@ lemma fieldData_massWeightScaleFermion_inclFermion_basis_tmul (c : ℂ) (φ : Module.Dual ℂ (fieldData.FermionValue j)) : fieldData.massWeightScaleFermion c (fieldData.inclFermion j ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : - JetComponentSpace (fieldData.FermionValue j))) + JetComponentSpace (fieldData.fermion j))) = c ^ (3 + 2 * Multiset.card s) • fieldData.inclFermion j ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : - JetComponentSpace (fieldData.FermionValue j)) := by + JetComponentSpace (fieldData.fermion j)) := by have h := GaugeFieldData.massWeightScaleFermion_inclFermion_basis_tmul (T := fieldData) c j s φ rwa [fieldData_fermion_massWeight] at h @@ -201,10 +201,10 @@ lemma fieldData_massWeightScaleBoson_inclBoson_basis_tmul (c : ℂ) (φ : Module.Dual ℂ (fieldData.BosonValue j)) : fieldData.massWeightScaleBoson c (fieldData.inclBoson j ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : - JetComponentSpace (fieldData.BosonValue j))) + JetComponentSpace (fieldData.boson j))) = c ^ (2 + 2 * Multiset.card s) • fieldData.inclBoson j ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : - JetComponentSpace (fieldData.BosonValue j)) := by + JetComponentSpace (fieldData.boson j)) := by have h := GaugeFieldData.massWeightScaleBoson_inclBoson_basis_tmul (T := fieldData) c j s φ rwa [fieldData_boson_massWeight] at h diff --git a/Physlib/Particles/StandardModel/HiggsBoson/JetAlgebra/Algebra.lean b/Physlib/Particles/StandardModel/HiggsBoson/JetAlgebra/Algebra.lean new file mode 100644 index 000000000..2dfe73a62 --- /dev/null +++ b/Physlib/Particles/StandardModel/HiggsBoson/JetAlgebra/Algebra.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.HiggsBoson.MatterField +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 +/-! +# The jet algebra of the Higgs field + +## i. Overview + +The jet algebra of the Higgs field is the bosonic algebra of the Higgs matter field: the +symmetric algebra on its component functions `∂_s H_α` and `∂_s H̄_α`, which commute +because the Higgs is a boson. This file carries the algebra and the actions on it — the +Lorentz action, the jet and global gauge actions, and the mass-dimension scaling — each +obtained by applying the generic bosonic-algebra construction to `HiggsVec.matterField`. + +The file is separate from +`Physlib.Particles.StandardModel.HiggsBoson.JetAlgebra.Basic`, which builds the gauge +action on the *jets* of the field, because the matter field is assembled from that action +and the algebra is then built on the matter field: the three steps are a chain, not a +single file. + +## ii. Key results + +- `StandardModel.HiggsJetAlgebra` : the bosonic algebra of the Higgs matter field. +- `StandardModel.HiggsJetAlgebra.repLorentzGroup`, + `StandardModel.HiggsJetAlgebra.repJetGaugeGroupI`, + `StandardModel.HiggsJetAlgebra.repGaugeGroupI` : the actions on it. +- `StandardModel.HiggsJetAlgebra.massWeightScale` : the mass-dimension scaling. + +## iii. Table of contents + +- 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 + +/-! + +## 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.matterField + +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 (M := HiggsVec.matterField) + +/-- The conjugate component functions of the Higgs field inside its jet algebra. -/ +noncomputable def ofConjHiggs : + Module.Dual ℂ (ConjModule HiggsVec) →ₗ[ℂ] HiggsJetAlgebra := + BosonicAlgebra.ofConjField (M := HiggsVec.matterField) + +/-! + +### 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 HiggsVec.matterField + +/-! + +### 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.matterField + +/-- 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.matterField + +/-! + +### 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 (M := HiggsVec.matterField) 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 (M := HiggsVec.matterField) 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/HiggsBoson/JetAlgebra/Basic.lean b/Physlib/Particles/StandardModel/HiggsBoson/JetAlgebra/Basic.lean index bc210ae73..38a1996e7 100644 --- a/Physlib/Particles/StandardModel/HiggsBoson/JetAlgebra/Basic.lean +++ b/Physlib/Particles/StandardModel/HiggsBoson/JetAlgebra/Basic.lean @@ -233,89 +233,4 @@ lemma repJetGaugeGroupI_ofConstant (g : GaugeGroupI) : 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 caebcc1a8..fa9450dc4 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/Basic.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/Basic.lean @@ -6,7 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.Fermions.JetAlgebra.Basic -public import Physlib.Particles.StandardModel.HiggsBoson.JetAlgebra.Basic +public import Physlib.Particles.StandardModel.HiggsBoson.JetAlgebra.Algebra public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.Basic public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData /-! diff --git a/Physlib/Particles/StandardModel/JetAlgebra/GaugeAction.lean b/Physlib/Particles/StandardModel/JetAlgebra/GaugeAction.lean index 819837f50..ec954fdcf 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/GaugeAction.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/GaugeAction.lean @@ -80,8 +80,8 @@ 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 _ _)) + (FermionicAlgebra.repJetGaugeGroupI_apply_mul fermionMatterField) + (BosonicAlgebra.repJetGaugeGroupI_apply_mul HiggsVec.matterField)) GaugeJetAlgebra.complexRepJet_apply_mul U x y /-! @@ -95,17 +95,16 @@ lemma repJetGaugeGroupI_includeGauge (U : JetGaugeGroupI) (y : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) : repJetGaugeGroupI U (includeGauge y) = includeGauge ((GaugeJetAlgebra.complexRepJet localGaugeData) U y) := by - rw [includeGauge_apply, repJetGaugeGroupI_tmul, - show (FermionJetAlgebra.repJetGaugeGroupI.tprod + have hF : FermionJetAlgebra.repJetGaugeGroupI U 1 = 1 := + FermionicAlgebra.repJetGaugeGroupI_apply_one fermionMatterField U + have hH : HiggsJetAlgebra.repJetGaugeGroupI U 1 = 1 := + BosonicAlgebra.repJetGaugeGroupI_apply_one HiggsVec.matterField U + have htp : (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] + = (FermionJetAlgebra.repJetGaugeGroupI U 1) ⊗ₜ[ℂ] + (HiggsJetAlgebra.repJetGaugeGroupI U 1) := rfl + rw [includeGauge_apply, repJetGaugeGroupI_tmul, htp, hF, hH] end JetAlgebra diff --git a/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/Basic.lean b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/Basic.lean index 3c6f79f0a..2ec540f5b 100644 --- a/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/Basic.lean +++ b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/Basic.lean @@ -14,7 +14,7 @@ public import Physlib.Mathematics.SymmetricAlgebra ## 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 +the symmetric algebra on the jet component space `JetComponentSpace M`. 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 @@ -48,7 +48,9 @@ namespace StandardModel open TensorProduct -variable {V : Type} [AddCommGroup V] [Module ℂ V] +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} {M : MatterField jets} /-! @@ -56,11 +58,11 @@ variable {V : Type} [AddCommGroup V] [Module ℂ V] -/ -/-- The bosonic algebra of a `V`-valued matter field: the symmetric algebra on the space +/-- The bosonic algebra of the matter field `M`: 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) +abbrev BosonicAlgebra (M : MatterField jets) : Type := + SymmetricAlgebra ℂ (JetComponentSpace M) namespace BosonicAlgebra @@ -76,12 +78,12 @@ namespace BosonicAlgebra functions". -/ @[simp] lemma adjoin_ι_eq_top : - Algebra.adjoin ℂ (Set.range (SymmetricAlgebra.ι ℂ (JetComponentSpace V))) = ⊤ := + Algebra.adjoin ℂ (Set.range (SymmetricAlgebra.ι ℂ (JetComponentSpace M))) = ⊤ := SymmetricAlgebra.adjoin_range_ι /-- Two component functions commute: Bose statistics. -/ -lemma ι_mul_ι_comm (x y : JetComponentSpace V) : - (SymmetricAlgebra.ι ℂ _ x * SymmetricAlgebra.ι ℂ _ y : BosonicAlgebra V) +lemma ι_mul_ι_comm (x y : JetComponentSpace M) : + (SymmetricAlgebra.ι ℂ _ x * SymmetricAlgebra.ι ℂ _ y : BosonicAlgebra M) = SymmetricAlgebra.ι ℂ _ y * SymmetricAlgebra.ι ℂ _ x := mul_comm _ _ @@ -92,7 +94,7 @@ lemma ι_mul_ι_comm (x y : JetComponentSpace V) : 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 +coordinate. The conjugate field is a covector on `ConjModule M.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 `ψ`. @@ -104,28 +106,28 @@ 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 := +noncomputable def ofField : Module.Dual ℂ M.V →ₗ[ℂ] BosonicAlgebra M := (SymmetricAlgebra.ι ℂ _).comp - ((LinearMap.inl ℂ (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ V) - (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule V))).comp - (TensorProduct.mk ℂ DerivAlgebraComplex (Module.Dual ℂ V) 1)) + ((LinearMap.inl ℂ (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ M.V) + (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule M.V))).comp + (TensorProduct.mk ℂ DerivAlgebraComplex (Module.Dual ℂ M.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 + on `ConjModule M.V`: the undifferentiated generator in the conjugate half of the component space. -/ -noncomputable def ofConjField : Module.Dual ℂ (ConjModule V) →ₗ[ℂ] BosonicAlgebra V := +noncomputable def ofConjField : Module.Dual ℂ (ConjModule M.V) →ₗ[ℂ] BosonicAlgebra M := (SymmetricAlgebra.ι ℂ _).comp - ((LinearMap.inr ℂ (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ V) - (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule V))).comp - (TensorProduct.mk ℂ DerivAlgebraComplex (Module.Dual ℂ (ConjModule V)) 1)) + ((LinearMap.inr ℂ (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ M.V) + (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule M.V))).comp + (TensorProduct.mk ℂ DerivAlgebraComplex (Module.Dual ℂ (ConjModule M.V)) 1)) -lemma ofField_apply (φ : Module.Dual ℂ V) : +lemma ofField_apply (φ : Module.Dual ℂ M.V) : ofField φ = SymmetricAlgebra.ι ℂ _ - (((1 : DerivAlgebraComplex) ⊗ₜ[ℂ] φ, 0) : JetComponentSpace V) := rfl + (((1 : DerivAlgebraComplex) ⊗ₜ[ℂ] φ, 0) : JetComponentSpace M) := rfl -lemma ofConjField_apply (φ : Module.Dual ℂ (ConjModule V)) : +lemma ofConjField_apply (φ : Module.Dual ℂ (ConjModule M.V)) : ofConjField φ = SymmetricAlgebra.ι ℂ _ - ((0, (1 : DerivAlgebraComplex) ⊗ₜ[ℂ] φ) : JetComponentSpace V) := rfl + ((0, (1 : DerivAlgebraComplex) ⊗ₜ[ℂ] φ) : JetComponentSpace M) := rfl /-! @@ -139,34 +141,34 @@ functorial and compatible with everything the algebra carries. -/ -variable {W : Type} [AddCommGroup W] [Module ℂ W] +variable {N : MatterField jets} /-- **The bosonic algebra is contravariant in the target space.** A linear map - `f : V →ₗ[ℂ] W` induces an algebra homomorphism `BosonicAlgebra W →ₐ[ℂ] BosonicAlgebra V` + `f : V →ₗ[ℂ] W` induces an algebra homomorphism `BosonicAlgebra N →ₐ[ℂ] BosonicAlgebra M` 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 := +noncomputable def comap (f : M.V →ₗ[ℂ] N.V) : BosonicAlgebra N →ₐ[ℂ] BosonicAlgebra M := SymmetricAlgebra.map (JetComponentSpace.comap f) @[simp] -lemma comap_ι (f : V →ₗ[ℂ] W) (x : JetComponentSpace W) : +lemma comap_ι (f : M.V →ₗ[ℂ] N.V) (x : JetComponentSpace N) : 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 +lemma comap_id : comap (LinearMap.id : M.V →ₗ[ℂ] M.V) = AlgHom.id ℂ (BosonicAlgebra M) := 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) : +lemma comap_comp {P : MatterField jets} (f : M.V →ₗ[ℂ] N.V) (g : N.V →ₗ[ℂ] P.V) : 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) : +lemma comap_ofField (f : M.V →ₗ[ℂ] N.V) (φ : Module.Dual ℂ N.V) : comap f (ofField φ) = ofField (φ ∘ₗ f) := by rw [ofField_apply, comap_ι, ofField_apply] congr 1 @@ -174,7 +176,7 @@ lemma comap_ofField (f : V →ₗ[ℂ] W) (φ : Module.Dual ℂ W) : /-- 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)) : +lemma comap_ofConjField (f : M.V →ₗ[ℂ] N.V) (φ : Module.Dual ℂ (ConjModule N.V)) : comap f (ofConjField φ) = ofConjField (φ ∘ₗ ConjModule.map f) := by rw [ofConjField_apply, comap_ι, ofConjField_apply] congr 1 diff --git a/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/GaugeAction.lean b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/GaugeAction.lean index 550de5ed2..7a971a505 100644 --- a/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/GaugeAction.lean +++ b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/GaugeAction.lean @@ -45,7 +45,9 @@ namespace BosonicAlgebra open Matrix MatrixGroups TensorProduct -variable {V : Type} [AddCommGroup V] [Module ℂ V] [Module.Free ℂ V] [Module.Finite ℂ V] +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} (M : MatterField jets) /-! @@ -53,18 +55,13 @@ variable {V : Type} [AddCommGroup V] [Module ℂ V] [Module.Free ℂ V] [Module. -/ -/-- **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 +/-- **The jet gauge action on the bosonic algebra** of the matter field `M`: the symmetric-algebra functor + applied to the gauge action on the jet component space. The fibrewise action on the jets and its + fibrewise-linearity are fields of `M`. -/ +noncomputable def repJetGaugeGroupI : + Representation ℂ G (BosonicAlgebra M) where toFun U := - (SymmetricAlgebra.map (JetComponentSpace.repJet rep hlin U)).toLinearMap + (SymmetricAlgebra.map (JetComponentSpace.repJet M 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 @@ -72,54 +69,39 @@ noncomputable def repJetGaugeGroupI 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.repJet rep hlin U) x := rfl + (U : G) (x : BosonicAlgebra M) : + repJetGaugeGroupI M U x = + SymmetricAlgebra.map (JetComponentSpace.repJet M 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 + (U : G) : + repJetGaugeGroupI M U (1 : BosonicAlgebra M) = 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 + (U : G) (x y : BosonicAlgebra M) : + repJetGaugeGroupI M U (x * y) = + repJetGaugeGroupI M U x * repJetGaugeGroupI M 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.repJet rep hlin U v) := by + (U : G) (v : JetComponentSpace M) : + repJetGaugeGroupI M U (SymmetricAlgebra.ι ℂ _ v) = + SymmetricAlgebra.ι ℂ _ (JetComponentSpace.repJet M 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 + (U : G) : BosonicAlgebra M →ₐ[ℂ] BosonicAlgebra M where + toFun := repJetGaugeGroupI M 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 + map_one' := repJetGaugeGroupI_apply_one M U + map_mul' := repJetGaugeGroupI_apply_mul M U commutes' r := by simp [repJetGaugeGroupI_apply] /-! @@ -137,16 +119,13 @@ the *value* of the gauge transformation at the base point alone. So `ofField` an 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 + (U : G) (φ : Module.Dual ℂ M.V) : + repJetGaugeGroupI M U (ofField φ) = + ofField (Module.Dual.transpose (jetEval ∘ₗ (M.repJet U⁻¹).comp jetOfConstant) φ) := by rw [ofField_apply, repJetGaugeGroupI_ι, ofField_apply] congr 1 refine Prod.ext ?_ ?_ - · exact JetComponentSpace.repDual_one_tmul rep hlin U φ + · exact JetComponentSpace.repDual_one_tmul M.repJet M.repJet_smul U φ · rw [JetComponentSpace.repJet_snd] exact map_zero _ @@ -154,20 +133,17 @@ lemma repJetGaugeGroupI_ofField `JetComponentSpace.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 φ) = + (U : G) (φ : Module.Dual ℂ (ConjModule M.V)) : + repJetGaugeGroupI M U (ofConjField φ) = ofConjField (Module.Dual.transpose - (jetEval ∘ₗ (JetComponentSpace.repConj rep U⁻¹).comp jetOfConstant) φ) := by + (jetEval ∘ₗ (JetComponentSpace.repConj M.repJet U⁻¹).comp jetOfConstant) φ) := by rw [ofConjField_apply, repJetGaugeGroupI_ι, 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 φ + · exact JetComponentSpace.repDual_one_tmul (JetComponentSpace.repConj M.repJet) + (JetComponentSpace.repConj_smul_comm M.repJet_smul) U φ /-! @@ -177,66 +153,48 @@ lemma repJetGaugeGroupI_ofConjField /-- 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 +noncomputable def repGaugeGroupI : + Representation ℂ G₀ (BosonicAlgebra M) := + (repJetGaugeGroupI M).comp jets.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 + (g : G₀) (x : BosonicAlgebra M) : + repGaugeGroupI M g x = + repJetGaugeGroupI M (jets.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 _ + (g : G₀) : + repGaugeGroupI M g (1 : BosonicAlgebra M) = 1 := + repJetGaugeGroupI_apply_one M _ 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 + (g : G₀) (x y : BosonicAlgebra M) : + repGaugeGroupI M g (x * y) = + repGaugeGroupI M g x * repGaugeGroupI M g y := + repJetGaugeGroupI_apply_mul M _ 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 φ) = + (g : G₀) (φ : Module.Dual ℂ M.V) : + repGaugeGroupI M 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 + (jetEval ∘ₗ (M.repJet (jets.ofConstant g⁻¹)).comp jetOfConstant) φ) := by + have h : (jets.ofConstant g)⁻¹ = jets.ofConstant g⁻¹ := + (map_inv jets.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 φ) = + (g : G₀) (φ : Module.Dual ℂ (ConjModule M.V)) : + repGaugeGroupI M g (ofConjField φ) = ofConjField (Module.Dual.transpose - (jetEval ∘ₗ (JetComponentSpace.repConj rep (JetGaugeGroupI.ofConstant g⁻¹)).comp + (jetEval ∘ₗ (JetComponentSpace.repConj M.repJet (jets.ofConstant g⁻¹)).comp jetOfConstant) φ) := by - have h : (JetGaugeGroupI.ofConstant g)⁻¹ = JetGaugeGroupI.ofConstant g⁻¹ := - (map_inv JetGaugeGroupI.ofConstant g).symm + have h : (jets.ofConstant g)⁻¹ = jets.ofConstant g⁻¹ := + (map_inv jets.ofConstant g).symm rw [repGaugeGroupI_apply, repJetGaugeGroupI_ofConjField, h] end BosonicAlgebra diff --git a/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/JetDeriv.lean b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/JetDeriv.lean index eb8cf600a..65de432ea 100644 --- a/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/JetDeriv.lean +++ b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/JetDeriv.lean @@ -50,7 +50,9 @@ namespace BosonicAlgebra open TensorProduct -variable {V : Type} [AddCommGroup V] [Module ℂ V] +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} {M : MatterField jets} /-! @@ -62,40 +64,40 @@ variable {V : Type} [AddCommGroup V] [Module ℂ V] 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 := + BosonicAlgebra M →ₗ[ℂ] BosonicAlgebra M := 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) : +lemma jetDeriv_ι (μ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace M) : 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 := +lemma jetDeriv_one (μ : Fin 1 ⊕ Fin 3) : jetDeriv (M := M) μ (1 : BosonicAlgebra M) = 0 := SymmetricAlgebra.derivationOfLinear_one _ @[simp] lemma jetDeriv_algebraMap (μ : Fin 1 ⊕ Fin 3) (r : ℂ) : - jetDeriv (V := V) μ (algebraMap ℂ (BosonicAlgebra V) r) = 0 := + jetDeriv (M := M) μ (algebraMap ℂ (BosonicAlgebra M) 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) : +lemma jetDeriv_mul (μ : Fin 1 ⊕ Fin 3) (x y : BosonicAlgebra M) : 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) : +lemma jetDeriv_comm_apply (μ ν : Fin 1 ⊕ Fin 3) (x : BosonicAlgebra M) : 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 μ) := + (jetDeriv (M := M) μ).comp (jetDeriv ν) = (jetDeriv (M := M) ν).comp (jetDeriv μ) := LinearMap.ext fun x => jetDeriv_comm_apply μ ν x /-! @@ -108,40 +110,40 @@ lemma jetDeriv_comm (μ ν : Fin 1 ⊕ Fin 3) : 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 := + BosonicAlgebra M →ₗ[ℂ] BosonicAlgebra M := Lorentz.iteratedD jetDeriv jetDeriv_comm s @[simp] lemma iteratedJetDeriv_zero : iteratedJetDeriv (0 : Multiset (Fin 1 ⊕ Fin 3)) - = LinearMap.id (R := ℂ) (M := BosonicAlgebra V) := + = LinearMap.id (R := ℂ) (M := BosonicAlgebra M) := 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) := + iteratedJetDeriv (M := M) (μ ::ₘ 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 μ) := + iteratedJetDeriv (M := M) (μ ::ₘ s) = (iteratedJetDeriv s).comp (jetDeriv μ) := Lorentz.iteratedD_cons' jetDeriv jetDeriv_comm μ s @[simp] lemma iteratedJetDeriv_singleton (μ : Fin 1 ⊕ Fin 3) : - iteratedJetDeriv (V := V) {μ} = jetDeriv μ := + iteratedJetDeriv (M := M) {μ} = 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 (M := M) (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) : +lemma iteratedJetDeriv_mul (s : Multiset (Fin 1 ⊕ Fin 3)) (x y : BosonicAlgebra M) : iteratedJetDeriv s (x * y) = (s.antidiagonal.map fun p => iteratedJetDeriv p.1 x * iteratedJetDeriv p.2 y).sum := @@ -149,7 +151,7 @@ lemma iteratedJetDeriv_mul (s : Multiset (Fin 1 ⊕ Fin 3)) (x y : BosonicAlgebr /-- 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 + iteratedJetDeriv (M := M) s (1 : BosonicAlgebra M) = 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] @@ -158,7 +160,7 @@ lemma iteratedJetDeriv_one_of_ne_zero {s : Multiset (Fin 1 ⊕ Fin 3)} (hs : 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) : +lemma iteratedJetDeriv_ι (s : Multiset (Fin 1 ⊕ Fin 3)) (x : JetComponentSpace M) : iteratedJetDeriv s (SymmetricAlgebra.ι ℂ _ x) = SymmetricAlgebra.ι ℂ _ (TensorProduct.map (LinearMap.mulRight ℂ (DerivAlgebraComplex.basis s)) @@ -200,10 +202,10 @@ lemma iteratedJetDeriv_ι (s : Multiset (Fin 1 ⊕ Fin 3)) (x : JetComponentSpac /-- 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) : +lemma iteratedJetDeriv_ofField (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ M.V) : iteratedJetDeriv s (ofField φ) = SymmetricAlgebra.ι ℂ _ - ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace V) := by + ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace M) := by rw [ofField_apply, iteratedJetDeriv_ι] congr 1 refine Prod.ext ?_ ?_ @@ -214,10 +216,10 @@ lemma iteratedJetDeriv_ofField (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dua derivative symbol `∂_s`. -/ @[simp] lemma iteratedJetDeriv_ofConjField (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule V)) : + (φ : Module.Dual ℂ (ConjModule M.V)) : iteratedJetDeriv s (ofConjField φ) = SymmetricAlgebra.ι ℂ _ - ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace V) := by + ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace M) := by rw [ofConjField_apply, iteratedJetDeriv_ι] congr 1 refine Prod.ext ?_ ?_ @@ -225,7 +227,7 @@ lemma iteratedJetDeriv_ofConjField (s : Multiset (Fin 1 ⊕ Fin 3)) · 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 + derivatives.** As a `ℂ`-algebra, `BosonicAlgebra M` 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 @@ -233,30 +235,30 @@ lemma iteratedJetDeriv_ofConjField (s : Multiset (Fin 1 ⊕ Fin 3)) 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) => + Set.range (fun φ : Module.Dual ℂ M.V => iteratedJetDeriv s (ofField φ)) ∪ + Set.range (fun φ : Module.Dual ℂ (ConjModule M.V) => iteratedJetDeriv s (ofConjField φ))) - = (⊤ : Subalgebra ℂ (BosonicAlgebra V)) := by - set S : Set (BosonicAlgebra V) := + = (⊤ : Subalgebra ℂ (BosonicAlgebra M)) := by + set S : Set (BosonicAlgebra M) := ⋃ s : Multiset (Fin 1 ⊕ Fin 3), - Set.range (fun φ : Module.Dual ℂ V => iteratedJetDeriv s (ofField φ)) ∪ - Set.range (fun φ : Module.Dual ℂ (ConjModule V) => + Set.range (fun φ : Module.Dual ℂ M.V => iteratedJetDeriv s (ofField φ)) ∪ + Set.range (fun φ : Module.Dual ℂ (ConjModule M.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 := + let gField : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ M.V →ₗ[ℂ] BosonicAlgebra M := (SymmetricAlgebra.ι ℂ _).comp (LinearMap.inl ℂ _ _) - let gConj : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule V) →ₗ[ℂ] - BosonicAlgebra V := + let gConj : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule M.V) →ₗ[ℂ] + BosonicAlgebra M := (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), + have hbasisField : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ M.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)), + have hbasisConj : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule M.V)), gConj (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) ∈ Algebra.adjoin ℂ S := by intro s φ have h : gConj (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) @@ -265,7 +267,7 @@ theorem adjoin_iteratedJetDeriv_eq_top : 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), + (g : DerivAlgebraComplex ⊗[ℂ] W →ₗ[ℂ] BosonicAlgebra M), (∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (w : W), g (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] w) ∈ Algebra.adjoin ℂ S) → ∀ y, g y ∈ Algebra.adjoin ℂ S := by @@ -285,7 +287,7 @@ theorem adjoin_iteratedJetDeriv_eq_top : 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)] + rw [← adjoin_ι_eq_top (M := M)] refine Algebra.adjoin_le ?_ rintro _ ⟨x, rfl⟩ have hx : x = LinearMap.inl ℂ _ _ x.1 + LinearMap.inr ℂ _ _ x.2 := by @@ -299,12 +301,12 @@ theorem adjoin_iteratedJetDeriv_eq_top : -/ -variable {W : Type} [AddCommGroup W] [Module ℂ W] +variable {N : MatterField jets} /-- **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) : +lemma comap_jetDeriv (f : M.V →ₗ[ℂ] N.V) (μ : Fin 1 ⊕ Fin 3) (x : BosonicAlgebra N) : comap f (jetDeriv μ x) = jetDeriv μ (comap f x) := by induction x using SymmetricAlgebra.induction with | algebraMap r => @@ -317,8 +319,8 @@ lemma comap_jetDeriv (f : V →ₗ[ℂ] W) (μ : Fin 1 ⊕ Fin 3) (x : BosonicAl | 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) : +lemma comap_iteratedJetDeriv (f : M.V →ₗ[ℂ] N.V) (s : Multiset (Fin 1 ⊕ Fin 3)) + (x : BosonicAlgebra N) : 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, diff --git a/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/LorentzAction.lean b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/LorentzAction.lean index bf3bfc44e..8c1096403 100644 --- a/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/LorentzAction.lean +++ b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/LorentzAction.lean @@ -45,7 +45,9 @@ namespace BosonicAlgebra open Matrix MatrixGroups TensorProduct -variable {V : Type} [AddCommGroup V] [Module ℂ V] +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} (M : MatterField jets) /-! @@ -53,51 +55,51 @@ variable {V : Type} [AddCommGroup V] [Module ℂ V] -/ -/-- **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 +/-- **The Lorentz action on the bosonic algebra** of the matter field `M`, induced + from a representation `M.repLorentz` 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 +noncomputable def repLorentzGroup : + Representation ℂ SL(2,ℂ) (BosonicAlgebra M) where + toFun Λ := (SymmetricAlgebra.map (JetComponentSpace.repLorentzGroup M Λ)).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 +lemma repLorentzGroup_apply (Λ : SL(2,ℂ)) + (x : BosonicAlgebra M) : + repLorentzGroup M Λ x = + SymmetricAlgebra.map (JetComponentSpace.repLorentzGroup M Λ) x := rfl @[simp] -lemma repLorentzGroup_apply_one (repV : Representation ℂ SL(2,ℂ) V) (Λ : SL(2,ℂ)) : - repLorentzGroup repV Λ (1 : BosonicAlgebra V) = 1 := by +lemma repLorentzGroup_apply_one (Λ : SL(2,ℂ)) : + repLorentzGroup M Λ (1 : BosonicAlgebra M) = 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 +lemma repLorentzGroup_apply_mul (Λ : SL(2,ℂ)) + (x y : BosonicAlgebra M) : + repLorentzGroup M Λ (x * y) + = repLorentzGroup M Λ x * repLorentzGroup M Λ 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 +lemma repLorentzGroup_ι (Λ : SL(2,ℂ)) + (v : JetComponentSpace M) : + repLorentzGroup M Λ (SymmetricAlgebra.ι ℂ _ v) = + SymmetricAlgebra.ι ℂ _ (JetComponentSpace.repLorentzGroup M Λ 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 Λ +noncomputable def repLorentzGroupAlgHom (Λ : SL(2,ℂ)) : + BosonicAlgebra M →ₐ[ℂ] BosonicAlgebra M where + toFun := repLorentzGroup M Λ map_add' := LinearMap.map_add _ map_zero' := LinearMap.map_zero _ - map_one' := repLorentzGroup_apply_one repV Λ - map_mul' := repLorentzGroup_apply_mul repV Λ + map_one' := repLorentzGroup_apply_one M Λ + map_mul' := repLorentzGroup_apply_mul M Λ commutes' r := by simp [repLorentzGroup_apply] /-! @@ -108,12 +110,12 @@ noncomputable def repLorentzGroupAlgHom (repV : Representation ℂ SL(2,ℂ) V) /-- **`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 + are generated: `ofField` intertwines `M.repLorentz.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 +lemma repLorentzGroup_ofField (Λ : SL(2,ℂ)) + (φ : Module.Dual ℂ M.V) : + repLorentzGroup M Λ (ofField φ) = ofField (M.repLorentz.dual Λ φ) := by rw [ofField_apply, repLorentzGroup_ι, ofField_apply] congr 1 refine Prod.ext ?_ ?_ @@ -127,16 +129,16 @@ lemma repLorentzGroup_ofField (repV : Representation ℂ SL(2,ℂ) V) (Λ : SL(2 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 +lemma repLorentzGroup_ofConjField (Λ : SL(2,ℂ)) + (φ : Module.Dual ℂ (ConjModule M.V)) : + repLorentzGroup M Λ (ofConjField φ) = ofConjField (M.repLorentz.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 Λ φ) = _ + show (DerivAlgebraComplex.repLorentzGroup Λ 1) ⊗ₜ[ℂ] (M.repLorentz.conj.dual Λ φ) = _ rw [DerivAlgebraComplex.repLorentzGroup_apply_one] /-! @@ -149,11 +151,11 @@ 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) = +lemma repLorentzGroup_jetDeriv (Λ : SL(2,ℂ)) + (μ : Fin 1 ⊕ Fin 3) (x : BosonicAlgebra M) : + repLorentzGroup M Λ (jetDeriv μ x) = ∑ a, (((Lorentz.SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • - jetDeriv a (repLorentzGroup repV Λ x) := by + jetDeriv a (repLorentzGroup M Λ x) := by induction x using SymmetricAlgebra.induction with | algebraMap r => rw [jetDeriv_algebraMap, map_zero] @@ -175,9 +177,9 @@ lemma repLorentzGroup_jetDeriv (repV : Representation ℂ SL(2,ℂ) V) (Λ : SL( /-- 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 _ _ _ +instance instIsLorentzDeriv : + Lorentz.IsLorentzDeriv (repLorentzGroup M) (jetDeriv (M := M)) where + rep_deriv := repLorentzGroup_jetDeriv M _ _ _ end BosonicAlgebra diff --git a/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/MassDim.lean b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/MassDim.lean index ac5c26bf2..ead1cc083 100644 --- a/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/MassDim.lean +++ b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/MassDim.lean @@ -41,7 +41,9 @@ namespace BosonicAlgebra open TensorProduct -variable {V : Type} [AddCommGroup V] [Module ℂ V] +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} {M : MatterField jets} /-! @@ -52,11 +54,11 @@ variable {V : Type} [AddCommGroup V] [Module ℂ V] /-- **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 := +noncomputable def massWeightScale (w : ℕ) (c : ℂ) : BosonicAlgebra M →ₐ[ℂ] BosonicAlgebra M := SymmetricAlgebra.map (JetComponentSpace.massWeightScale w c) @[simp] -lemma massWeightScale_ι (w : ℕ) (c : ℂ) (x : JetComponentSpace V) : +lemma massWeightScale_ι (w : ℕ) (c : ℂ) (x : JetComponentSpace M) : massWeightScale w c (SymmetricAlgebra.ι ℂ _ x) = SymmetricAlgebra.ι ℂ _ (JetComponentSpace.massWeightScale w c x) := SymmetricAlgebra.map_apply_ι _ x @@ -69,7 +71,7 @@ lemma massWeightScale_ι (w : ℕ) (c : ℂ) (x : JetComponentSpace V) : /-- The undifferentiated field carries its own mass weight. -/ @[simp] -lemma massWeightScale_ofField (w : ℕ) (c : ℂ) (φ : Module.Dual ℂ V) : +lemma massWeightScale_ofField (w : ℕ) (c : ℂ) (φ : Module.Dual ℂ M.V) : massWeightScale w c (ofField φ) = c ^ w • ofField φ := by rw [ofField_apply, massWeightScale_ι, ← map_smul] congr 1 @@ -82,7 +84,7 @@ lemma massWeightScale_ofField (w : ℕ) (c : ℂ) (φ : Module.Dual ℂ V) : /-- The undifferentiated conjugate field carries the same mass weight as the field. -/ @[simp] -lemma massWeightScale_ofConjField (w : ℕ) (c : ℂ) (φ : Module.Dual ℂ (ConjModule V)) : +lemma massWeightScale_ofConjField (w : ℕ) (c : ℂ) (φ : Module.Dual ℂ (ConjModule M.V)) : massWeightScale w c (ofConjField φ) = c ^ w • ofConjField φ := by rw [ofConjField_apply, massWeightScale_ι, ← map_smul] congr 1 @@ -95,7 +97,7 @@ lemma massWeightScale_ofConjField (w : ℕ) (c : ℂ) (φ : Module.Dual ℂ (Con /-- **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) : +lemma massWeightScale_jetDeriv (w : ℕ) (c : ℂ) (μ : Fin 1 ⊕ Fin 3) (x : BosonicAlgebra M) : 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, @@ -111,7 +113,7 @@ lemma massWeightScale_jetDeriv (w : ℕ) (c : ℂ) (μ : Fin 1 ⊕ Fin 3) (x : B /-- **The iterated derivative `∂_s` adds mass weight `2 |s|`.** -/ lemma massWeightScale_iteratedJetDeriv (w : ℕ) (c : ℂ) (s : Multiset (Fin 1 ⊕ Fin 3)) - (x : BosonicAlgebra V) : + (x : BosonicAlgebra M) : 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 diff --git a/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/MassWeightPoly.lean b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/MassWeightPoly.lean index 6ac282a35..74b91ffa8 100644 --- a/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/MassWeightPoly.lean +++ b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/MassWeightPoly.lean @@ -18,7 +18,7 @@ sending a generator `∂_s ψ_φ` of a field of mass weight `w` to `X ^ (w + 2 | itself, so the coefficient of `X ^ n` in `massWeightPoly w a` is the part of `a` of mass weight `n`. -The target `Polynomial (BosonicAlgebra V)` is commutative, so the universal property of the +The target `Polynomial (BosonicAlgebra M)` is commutative, so the universal property of the symmetric algebra applies with no side condition: the grading is the lift of a single linear map on the jet component space. That map is assembled from the two halves of the component space, and on each half from the multiset basis of the derivative symbols, which is where @@ -51,7 +51,9 @@ namespace BosonicAlgebra open TensorProduct -variable {V : Type} [AddCommGroup V] [Module ℂ V] +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} {M : MatterField jets} /-! @@ -60,13 +62,13 @@ variable {V : Type} [AddCommGroup V] [Module ℂ V] -/ /-- The monomial map into polynomials over the bosonic algebra, as a map of `ℂ`-modules - rather than of `BosonicAlgebra V`-modules. -/ + rather than of `BosonicAlgebra M`-modules. -/ noncomputable def monomialₗ (n : ℕ) : - BosonicAlgebra V →ₗ[ℂ] Polynomial (BosonicAlgebra V) := + BosonicAlgebra M →ₗ[ℂ] Polynomial (BosonicAlgebra M) := (Polynomial.monomial n).restrictScalars ℂ @[simp] -lemma monomialₗ_apply (n : ℕ) (x : BosonicAlgebra V) : +lemma monomialₗ_apply (n : ℕ) (x : BosonicAlgebra M) : monomialₗ n x = Polynomial.monomial n x := rfl /-- One half of the mass-weight polynomial on the jet component space, for a field of mass @@ -74,8 +76,8 @@ lemma monomialₗ_apply (n : ℕ) (x : BosonicAlgebra V) : image under `k`. The two halves of the component space differ only in the inclusion `k` of the symbols into the bosonic algebra, so both are instances of this map. -/ noncomputable def halfPoly {W : Type} [AddCommGroup W] [Module ℂ W] (w : ℕ) - (k : DerivAlgebraComplex ⊗[ℂ] W →ₗ[ℂ] BosonicAlgebra V) : - DerivAlgebraComplex ⊗[ℂ] W →ₗ[ℂ] Polynomial (BosonicAlgebra V) := + (k : DerivAlgebraComplex ⊗[ℂ] W →ₗ[ℂ] BosonicAlgebra M) : + DerivAlgebraComplex ⊗[ℂ] W →ₗ[ℂ] Polynomial (BosonicAlgebra M) := TensorProduct.lift (DerivAlgebraComplex.basis.constr ℂ fun s => (monomialₗ (w + 2 * Multiset.card s)).comp (k.comp (TensorProduct.mk ℂ DerivAlgebraComplex W (DerivAlgebraComplex.basis s)))) @@ -83,7 +85,7 @@ noncomputable def halfPoly {W : Type} [AddCommGroup W] [Module ℂ W] (w : ℕ) /-- On the symbol `∂_s φ` the half mass-weight polynomial is the monomial of degree `w + 2 |s|`: the field contributes `w` and each derivative two. -/ lemma halfPoly_basis_tmul {W : Type} [AddCommGroup W] [Module ℂ W] (w : ℕ) - (k : DerivAlgebraComplex ⊗[ℂ] W →ₗ[ℂ] BosonicAlgebra V) + (k : DerivAlgebraComplex ⊗[ℂ] W →ₗ[ℂ] BosonicAlgebra M) (s : Multiset (Fin 1 ⊕ Fin 3)) (x : W) : halfPoly w k (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] x) = Polynomial.monomial (w + 2 * Multiset.card s) @@ -92,42 +94,42 @@ lemma halfPoly_basis_tmul {W : Type} [AddCommGroup W] [Module ℂ W] (w : ℕ) rfl /-- The inclusion of the unconjugated symbols into the bosonic algebra. -/ -noncomputable def ιFst : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ V →ₗ[ℂ] BosonicAlgebra V := - (SymmetricAlgebra.ι ℂ (JetComponentSpace V)).comp (LinearMap.inl ℂ _ _) +noncomputable def ιFst : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ M.V →ₗ[ℂ] BosonicAlgebra M := + (SymmetricAlgebra.ι ℂ (JetComponentSpace M)).comp (LinearMap.inl ℂ _ _) /-- The inclusion of the conjugate symbols into the bosonic algebra. -/ noncomputable def ιSnd : - DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule V) →ₗ[ℂ] BosonicAlgebra V := - (SymmetricAlgebra.ι ℂ (JetComponentSpace V)).comp (LinearMap.inr ℂ _ _) + DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule M.V) →ₗ[ℂ] BosonicAlgebra M := + (SymmetricAlgebra.ι ℂ (JetComponentSpace M)).comp (LinearMap.inr ℂ _ _) /-- The mass-weight polynomial of a component function of a field of mass weight `w`: the sum of the two half maps, one for the field and one for its conjugate. -/ noncomputable def jetComponentPoly (w : ℕ) : - JetComponentSpace V →ₗ[ℂ] Polynomial (BosonicAlgebra V) := + JetComponentSpace M →ₗ[ℂ] Polynomial (BosonicAlgebra M) := (halfPoly w ιFst).comp (LinearMap.fst ℂ _ _) + (halfPoly w ιSnd).comp (LinearMap.snd ℂ _ _) -lemma jetComponentPoly_apply (w : ℕ) (x : JetComponentSpace V) : +lemma jetComponentPoly_apply (w : ℕ) (x : JetComponentSpace M) : jetComponentPoly w x = halfPoly w ιFst x.1 + halfPoly w ιSnd x.2 := rfl /-- On an unconjugated derivative monomial the component map is a monomial eigenvector. -/ @[simp] -lemma jetComponentPoly_inl (w : ℕ) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V) : - jetComponentPoly w ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace V) = +lemma jetComponentPoly_inl (w : ℕ) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ M.V) : + jetComponentPoly w ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace M) = Polynomial.monomial (w + 2 * Multiset.card s) - (SymmetricAlgebra.ι ℂ (JetComponentSpace V) - ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace V)) := by + (SymmetricAlgebra.ι ℂ (JetComponentSpace M) + ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace M)) := by rw [jetComponentPoly_apply, halfPoly_basis_tmul, map_zero, add_zero] rfl /-- On a conjugate derivative monomial the component map is a monomial eigenvector. -/ @[simp] lemma jetComponentPoly_inr (w : ℕ) (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule V)) : - jetComponentPoly w ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace V) = + (φ : Module.Dual ℂ (ConjModule M.V)) : + jetComponentPoly w ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace M) = Polynomial.monomial (w + 2 * Multiset.card s) - (SymmetricAlgebra.ι ℂ (JetComponentSpace V) - ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace V)) := by + (SymmetricAlgebra.ι ℂ (JetComponentSpace M) + ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace M)) := by rw [jetComponentPoly_apply, halfPoly_basis_tmul, map_zero, zero_add] rfl @@ -140,15 +142,15 @@ lemma jetComponentPoly_inr (w : ℕ) (s : Multiset (Fin 1 ⊕ Fin 3)) /-- The mass-weight polynomial on the bosonic algebra of a field of mass weight `w`: the `ℂ`-algebra map sending a generator of mass weight `n` to `X ^ n` times itself. It is `BosonicAlgebra.massWeightScale` with the scalar replaced by the formal variable `X`, and - needs no side condition because `Polynomial (BosonicAlgebra V)` is commutative. -/ + needs no side condition because `Polynomial (BosonicAlgebra M)` is commutative. -/ noncomputable def massWeightPoly (w : ℕ) : - BosonicAlgebra V →ₐ[ℂ] Polynomial (BosonicAlgebra V) := + BosonicAlgebra M →ₐ[ℂ] Polynomial (BosonicAlgebra M) := SymmetricAlgebra.lift (jetComponentPoly w) /-- On a component function the mass-weight polynomial is the component-function map. -/ @[simp] -lemma massWeightPoly_ι (w : ℕ) (x : JetComponentSpace V) : - massWeightPoly w (SymmetricAlgebra.ι ℂ (JetComponentSpace V) x) = +lemma massWeightPoly_ι (w : ℕ) (x : JetComponentSpace M) : + massWeightPoly w (SymmetricAlgebra.ι ℂ (JetComponentSpace M) x) = jetComponentPoly w x := SymmetricAlgebra.lift_ι_apply _ x @@ -161,7 +163,7 @@ lemma massWeightPoly_ι (w : ℕ) (x : JetComponentSpace V) : /-- The generator `∂_s ψ_φ` is a monomial eigenvector of mass weight `w + 2 |s|`: the field carries its own mass weight and each derivative adds two. -/ lemma massWeightPoly_iteratedJetDeriv_ofField (w : ℕ) (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ V) : + (φ : Module.Dual ℂ M.V) : massWeightPoly w (iteratedJetDeriv s (ofField φ)) = Polynomial.monomial (w + 2 * Multiset.card s) (iteratedJetDeriv s (ofField φ)) := by rw [iteratedJetDeriv_ofField, massWeightPoly_ι, jetComponentPoly_inl] @@ -169,21 +171,21 @@ lemma massWeightPoly_iteratedJetDeriv_ofField (w : ℕ) (s : Multiset (Fin 1 ⊕ /-- The conjugate generator `∂_s ψ̄_φ` is a monomial eigenvector of the same mass weight `w + 2 |s|` as the generator it conjugates. -/ lemma massWeightPoly_iteratedJetDeriv_ofConjField (w : ℕ) (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule V)) : + (φ : Module.Dual ℂ (ConjModule M.V)) : massWeightPoly w (iteratedJetDeriv s (ofConjField φ)) = Polynomial.monomial (w + 2 * Multiset.card s) (iteratedJetDeriv s (ofConjField φ)) := by rw [iteratedJetDeriv_ofConjField, massWeightPoly_ι, jetComponentPoly_inr] /-- The undifferentiated field has mass weight `w`. -/ -lemma massWeightPoly_ofField (w : ℕ) (φ : Module.Dual ℂ V) : +lemma massWeightPoly_ofField (w : ℕ) (φ : Module.Dual ℂ M.V) : massWeightPoly w (ofField φ) = Polynomial.monomial w (ofField φ) := by have h := massWeightPoly_iteratedJetDeriv_ofField w (0 : Multiset (Fin 1 ⊕ Fin 3)) φ rwa [iteratedJetDeriv_zero, LinearMap.id_apply, Multiset.card_zero, Nat.mul_zero, Nat.add_zero] at h /-- The undifferentiated conjugate field has mass weight `w`. -/ -lemma massWeightPoly_ofConjField (w : ℕ) (φ : Module.Dual ℂ (ConjModule V)) : +lemma massWeightPoly_ofConjField (w : ℕ) (φ : Module.Dual ℂ (ConjModule M.V)) : massWeightPoly w (ofConjField φ) = Polynomial.monomial w (ofConjField φ) := by have h := massWeightPoly_iteratedJetDeriv_ofConjField w (0 : Multiset (Fin 1 ⊕ Fin 3)) φ rwa [iteratedJetDeriv_zero, LinearMap.id_apply, Multiset.card_zero, Nat.mul_zero, @@ -199,7 +201,7 @@ lemma massWeightPoly_ofConjField (w : ℕ) (φ : Module.Dual ℂ (ConjModule V)) symbol it graded. The derivative monomials span, so it is enough to check this on the multiset basis. -/ lemma halfPoly_eval_one {W : Type} [AddCommGroup W] [Module ℂ W] (w : ℕ) - (k : DerivAlgebraComplex ⊗[ℂ] W →ₗ[ℂ] BosonicAlgebra V) + (k : DerivAlgebraComplex ⊗[ℂ] W →ₗ[ℂ] BosonicAlgebra M) (y : DerivAlgebraComplex ⊗[ℂ] W) : (halfPoly w k y).eval 1 = k y := by induction y using TensorProduct.induction_on with | zero => rw [map_zero, Polynomial.eval_zero, map_zero] @@ -219,8 +221,8 @@ lemma halfPoly_eval_one {W : Type} [AddCommGroup W] [Module ℂ W] (w : ℕ) rw [← TensorProduct.smul_tmul', map_smul, Polynomial.eval_smul, hb, map_smul] /-- Setting the formal variable to one recovers the component function. -/ -lemma jetComponentPoly_eval_one (w : ℕ) (x : JetComponentSpace V) : - (jetComponentPoly w x).eval 1 = SymmetricAlgebra.ι ℂ (JetComponentSpace V) x := by +lemma jetComponentPoly_eval_one (w : ℕ) (x : JetComponentSpace M) : + (jetComponentPoly w x).eval 1 = SymmetricAlgebra.ι ℂ (JetComponentSpace M) x := by rw [jetComponentPoly_apply, Polynomial.eval_add, halfPoly_eval_one, halfPoly_eval_one, ιFst, ιSnd, LinearMap.comp_apply, LinearMap.comp_apply, ← map_add] congr 1 @@ -228,11 +230,11 @@ lemma jetComponentPoly_eval_one (w : ℕ) (x : JetComponentSpace V) : /-- Setting the formal variable to one recovers the original element: the mass-weight pieces of an element sum back to it. -/ -lemma massWeightPoly_eval_one (w : ℕ) (a : BosonicAlgebra V) : +lemma massWeightPoly_eval_one (w : ℕ) (a : BosonicAlgebra M) : (massWeightPoly w a).eval 1 = a := by - have h : (Polynomial.eval₂AlgHom (AlgHom.id ℂ (BosonicAlgebra V)) 1 + have h : (Polynomial.eval₂AlgHom (AlgHom.id ℂ (BosonicAlgebra M)) 1 fun b => Commute.one_right b).comp (massWeightPoly w) = - AlgHom.id ℂ (BosonicAlgebra V) := by + AlgHom.id ℂ (BosonicAlgebra M) := by refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun x => ?_) simp change Polynomial.eval₂ (RingHom.id _) 1 (jetComponentPoly w x) = _ @@ -244,7 +246,7 @@ lemma massWeightPoly_eval_one (w : ℕ) (a : BosonicAlgebra V) : pieces. It is not surjective, since a monomial of the wrong degree is not the grading of anything. -/ lemma massWeightPoly_injective (w : ℕ) : - Function.Injective (massWeightPoly (V := V) w) := by + Function.Injective (massWeightPoly (M := M) w) := by intro x y h rw [← massWeightPoly_eval_one w x, ← massWeightPoly_eval_one w y, h] diff --git a/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/Prod.lean b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/Prod.lean index 659faa4ac..1c0d6129f 100644 --- a/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/Prod.lean +++ b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/Prod.lean @@ -6,6 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.Prod /-! # The bosonic algebra of a direct sum @@ -15,7 +16,7 @@ Two bosonic matter fields, valued in `V` and `W`, are jointly a single matter fi 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`. +`BosonicAlgebra (M.prod N h) ≃ₐ[ℂ] BosonicAlgebra M ⊗[ℂ] BosonicAlgebra N`. Unlike the fermionic analogue `FermionicAlgebra.prodEquiv`, the *ordinary* tensor product suffices: bosonic generators of different species commute, so no grading is needed. @@ -38,6 +39,10 @@ sum is the tensor product of the symmetric algebras, which is @[expose] public section +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} + open scoped TensorProduct namespace StandardModel @@ -53,10 +58,10 @@ namespace StandardModel 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 +noncomputable def BosonicAlgebra.prodEquiv (M N : MatterField jets) + (h : M.massWeight = N.massWeight) : + BosonicAlgebra (M.prod N h) ≃ₐ[ℂ] BosonicAlgebra M ⊗[ℂ] BosonicAlgebra N := + (SymmetricAlgebra.congr (JetComponentSpace.prodEquiv M N h)).trans SymmetricAlgebra.prodEquiv end StandardModel diff --git a/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/TransformsIn.lean b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/TransformsIn.lean index 79b46aa97..47ab11906 100644 --- a/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/TransformsIn.lean +++ b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/TransformsIn.lean @@ -27,7 +27,7 @@ the image of the component space under `SymmetricAlgebra.ι`, and a multiset sum through a linear map. The conjugate generators are the same statement for the conjugate action -`JetComponentSpace.repConj rep` on +`JetComponentSpace.repConj M.repJet` on the jets of the conjugate field, which is what the conjugate half of the component space carries; so they are an instance of the same lemma, not a second proof. @@ -58,7 +58,9 @@ namespace BosonicAlgebra open Matrix MatrixGroups TensorProduct -variable {V : Type} [AddCommGroup V] [Module ℂ V] +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} {M : MatterField jets} /-! @@ -68,27 +70,27 @@ variable {V : Type} [AddCommGroup V] [Module ℂ V] /-- A multiset sum in the unconjugated half of the component space passes through the inclusion of the generators. -/ -private lemma sum_inl (m : Multiset (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ V)) : - SymmetricAlgebra.ι ℂ _ ((m.sum, 0) : JetComponentSpace V) +private lemma sum_inl (m : Multiset (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ M.V)) : + SymmetricAlgebra.ι ℂ _ ((m.sum, 0) : JetComponentSpace M) = (m.map fun a => - SymmetricAlgebra.ι ℂ _ ((a, 0) : JetComponentSpace V)).sum := by - rw [show SymmetricAlgebra.ι ℂ (JetComponentSpace V) ((m.sum, 0) : JetComponentSpace V) - = ((SymmetricAlgebra.ι ℂ (JetComponentSpace V)).comp - (LinearMap.inl ℂ (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ V) - (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule V)))) m.sum from rfl, + SymmetricAlgebra.ι ℂ _ ((a, 0) : JetComponentSpace M)).sum := by + rw [show SymmetricAlgebra.ι ℂ (JetComponentSpace M) ((m.sum, 0) : JetComponentSpace M) + = ((SymmetricAlgebra.ι ℂ (JetComponentSpace M)).comp + (LinearMap.inl ℂ (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ M.V) + (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule M.V)))) m.sum from rfl, map_multiset_sum] rfl /-- A multiset sum in the conjugate half of the component space passes through the inclusion of the generators. -/ -private lemma sum_inr (m : Multiset (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule V))) : - SymmetricAlgebra.ι ℂ _ ((0, m.sum) : JetComponentSpace V) +private lemma sum_inr (m : Multiset (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule M.V))) : + SymmetricAlgebra.ι ℂ _ ((0, m.sum) : JetComponentSpace M) = (m.map fun a => - SymmetricAlgebra.ι ℂ _ ((0, a) : JetComponentSpace V)).sum := by - rw [show SymmetricAlgebra.ι ℂ (JetComponentSpace V) ((0, m.sum) : JetComponentSpace V) - = ((SymmetricAlgebra.ι ℂ (JetComponentSpace V)).comp - (LinearMap.inr ℂ (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ V) - (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule V)))) m.sum from rfl, + SymmetricAlgebra.ι ℂ _ ((0, a) : JetComponentSpace M)).sum := by + rw [show SymmetricAlgebra.ι ℂ (JetComponentSpace M) ((0, m.sum) : JetComponentSpace M) + = ((SymmetricAlgebra.ι ℂ (JetComponentSpace M)).comp + (LinearMap.inr ℂ (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ M.V) + (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule M.V)))) m.sum from rfl, map_multiset_sum] rfl @@ -98,7 +100,6 @@ private lemma sum_inr (m : Multiset (DerivAlgebraComplex ⊗[ℂ] Module.Dual -/ -variable [Module.Free ℂ V] [Module.Finite ℂ V] /-! @@ -112,18 +113,15 @@ variable [Module.Free ℂ V] [Module.Finite ℂ V] `s₁` acting on the target index of `∂_{s₂} ψ_φ`. There is no inhomogeneous term: unlike a gauge field, a matter field transforms linearly. -/ lemma repJetGaugeGroupI_iteratedJetDeriv_ofField - (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) - (hlin : ∀ (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] V), - rep U (χ • z) = χ • rep U z) - (U : JetGaugeGroupI) (φ : Module.Dual ℂ V) (s : Multiset (Fin 1 ⊕ Fin 3)) : - repJetGaugeGroupI rep hlin U (iteratedJetDeriv s (ofField φ)) = + (U : G) (φ : Module.Dual ℂ M.V) (s : Multiset (Fin 1 ⊕ Fin 3)) : + repJetGaugeGroupI M U (iteratedJetDeriv s (ofField φ)) = (s.antidiagonal.map fun p => iteratedJetDeriv p.2 - (ofField (GaugeAlgebraRealization.repDualCoeff rep U⁻¹ p.1 φ))).sum := by + (ofField (GaugeAlgebraRealization.repDualCoeff M.repJet U⁻¹ p.1 φ))).sum := by rw [iteratedJetDeriv_ofField, repJetGaugeGroupI_ι, - show JetComponentSpace.repJet rep hlin U - ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace V) - = (JetComponentSpace.repDual rep hlin U (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ), 0) from by + show JetComponentSpace.repJet M U + ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace M) + = (JetComponentSpace.repDual M.repJet M.repJet_smul U (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ), 0) from by refine Prod.ext rfl ?_ rw [JetComponentSpace.repJet_snd] exact map_zero _, @@ -133,13 +131,10 @@ lemma repJetGaugeGroupI_iteratedJetDeriv_ofField /-- The derivative generators of a matter field transform in the representation `rep` carried by its jets, in the sense demanded by `LocalGaugeData.TransformsIn`. -/ -theorem transformsIn_iteratedJetDeriv_ofField - (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) - (hlin : ∀ (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] V), - rep U (χ • z) = χ • rep U z) : - LocalGaugeData.TransformsIn (repJetGaugeGroupI rep hlin) rep - fun s => (iteratedJetDeriv s).comp (ofField (V := V)) := - fun U φ s => repJetGaugeGroupI_iteratedJetDeriv_ofField rep hlin U φ s +theorem transformsIn_iteratedJetDeriv_ofField : + LocalGaugeData.TransformsIn (repJetGaugeGroupI M) M.repJet + fun s => (iteratedJetDeriv s).comp (ofField (M := M)) := + fun U φ s => repJetGaugeGroupI_iteratedJetDeriv_ofField (M := M) U φ s /-! @@ -148,26 +143,23 @@ theorem transformsIn_iteratedJetDeriv_ofField -/ /-- The transformation law of the derivative generators of the conjugate matter field. It - is the law of the field itself for the conjugate action `JetComponentSpace.repConj rep` on + is the law of the field itself for the conjugate action `JetComponentSpace.repConj M.repJet` on the jets of the conjugate field — the physicists' `ψ̄ ↦ ψ̄ U†` and its derivatives. -/ lemma repJetGaugeGroupI_iteratedJetDeriv_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)) + (U : G) (φ : Module.Dual ℂ (ConjModule M.V)) (s : Multiset (Fin 1 ⊕ Fin 3)) : - repJetGaugeGroupI rep hlin U (iteratedJetDeriv s (ofConjField φ)) = + repJetGaugeGroupI M U (iteratedJetDeriv s (ofConjField φ)) = (s.antidiagonal.map fun p => iteratedJetDeriv p.2 (ofConjField - (GaugeAlgebraRealization.repDualCoeff (JetComponentSpace.repConj rep) U⁻¹ p.1 + (GaugeAlgebraRealization.repDualCoeff (JetComponentSpace.repConj M.repJet) U⁻¹ p.1 φ))).sum := by rw [iteratedJetDeriv_ofConjField, repJetGaugeGroupI_ι, - show JetComponentSpace.repJet rep hlin U - ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace V) - = (0, JetComponentSpace.repDual (JetComponentSpace.repConj rep) - (JetComponentSpace.repConj_smul_comm hlin) U + show JetComponentSpace.repJet M U + ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace M) + = (0, JetComponentSpace.repDual (JetComponentSpace.repConj M.repJet) + (JetComponentSpace.repConj_smul_comm M.repJet_smul) U (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ)) from by refine Prod.ext ?_ rfl rw [JetComponentSpace.repJet_fst] @@ -177,15 +169,12 @@ lemma repJetGaugeGroupI_iteratedJetDeriv_ofConjField rw [Function.comp_apply, iteratedJetDeriv_ofConjField] /-- The derivative generators of the conjugate matter field transform in the conjugate - representation `JetComponentSpace.repConj rep`, in the sense demanded by + representation `JetComponentSpace.repConj M.repJet`, in the sense demanded by `LocalGaugeData.TransformsIn`. -/ -theorem transformsIn_iteratedJetDeriv_ofConjField - (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) - (hlin : ∀ (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] V), - rep U (χ • z) = χ • rep U z) : - LocalGaugeData.TransformsIn (repJetGaugeGroupI rep hlin) (JetComponentSpace.repConj rep) - fun s => (iteratedJetDeriv s).comp (ofConjField (V := V)) := - fun U φ s => repJetGaugeGroupI_iteratedJetDeriv_ofConjField rep hlin U φ s +theorem transformsIn_iteratedJetDeriv_ofConjField : + LocalGaugeData.TransformsIn (repJetGaugeGroupI M) (JetComponentSpace.repConj M.repJet) + fun s => (iteratedJetDeriv s).comp (ofConjField (M := M)) := + fun U φ s => repJetGaugeGroupI_iteratedJetDeriv_ofConjField (M := M) U φ s end BosonicAlgebra diff --git a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Basic.lean b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Basic.lean index 55a3d3c1f..5f5aec754 100644 --- a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Basic.lean +++ b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Basic.lean @@ -14,7 +14,7 @@ public import Mathlib.LinearAlgebra.ExteriorAlgebra.Basic ## 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 +exterior algebra on the jet component space `JetComponentSpace M`. 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. @@ -48,7 +48,9 @@ namespace StandardModel open TensorProduct -variable {V : Type} [AddCommGroup V] [Module ℂ V] +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} {M : MatterField jets} /-! @@ -56,11 +58,11 @@ variable {V : Type} [AddCommGroup V] [Module ℂ V] -/ -/-- The fermionic algebra of a `V`-valued matter field: the exterior algebra on the space +/-- The fermionic algebra of the matter field `M`: 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) +abbrev FermionicAlgebra (M : MatterField jets) : Type := + ExteriorAlgebra ℂ (JetComponentSpace M) namespace FermionicAlgebra @@ -76,17 +78,17 @@ namespace FermionicAlgebra functions". -/ @[simp] lemma adjoin_ι_eq_top : - Algebra.adjoin ℂ (Set.range (ExteriorAlgebra.ι ℂ (M := JetComponentSpace V))) = ⊤ := + Algebra.adjoin ℂ (Set.range (ExteriorAlgebra.ι ℂ (M := JetComponentSpace M))) = ⊤ := 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) := +lemma ι_sq_zero (x : JetComponentSpace M) : + ExteriorAlgebra.ι ℂ x * ExteriorAlgebra.ι ℂ x = (0 : FermionicAlgebra M) := ExteriorAlgebra.ι_sq_zero x /-- Two component functions anticommute. -/ -lemma ι_mul_ι_swap (x y : JetComponentSpace V) : - (ExteriorAlgebra.ι ℂ x * ExteriorAlgebra.ι ℂ y : FermionicAlgebra V) +lemma ι_mul_ι_swap (x y : JetComponentSpace M) : + (ExteriorAlgebra.ι ℂ x * ExteriorAlgebra.ι ℂ y : FermionicAlgebra M) = - (ExteriorAlgebra.ι ℂ y * ExteriorAlgebra.ι ℂ x) := eq_neg_of_add_eq_zero_left (ExteriorAlgebra.ι_add_mul_swap (R := ℂ) x y) @@ -97,7 +99,7 @@ lemma ι_mul_ι_swap (x y : JetComponentSpace V) : 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 +coordinate. The conjugate field is a covector on `ConjModule M.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 `ψ`. @@ -109,28 +111,28 @@ 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 := +noncomputable def ofField : Module.Dual ℂ M.V →ₗ[ℂ] FermionicAlgebra M := (ExteriorAlgebra.ι ℂ).comp - ((LinearMap.inl ℂ (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ V) - (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule V))).comp - (TensorProduct.mk ℂ DerivAlgebraComplex (Module.Dual ℂ V) 1)) + ((LinearMap.inl ℂ (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ M.V) + (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule M.V))).comp + (TensorProduct.mk ℂ DerivAlgebraComplex (Module.Dual ℂ M.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 + `ConjModule M.V`: the undifferentiated generator in the conjugate half of the component space. -/ -noncomputable def ofConjField : Module.Dual ℂ (ConjModule V) →ₗ[ℂ] FermionicAlgebra V := +noncomputable def ofConjField : Module.Dual ℂ (ConjModule M.V) →ₗ[ℂ] FermionicAlgebra M := (ExteriorAlgebra.ι ℂ).comp - ((LinearMap.inr ℂ (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ V) - (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule V))).comp - (TensorProduct.mk ℂ DerivAlgebraComplex (Module.Dual ℂ (ConjModule V)) 1)) + ((LinearMap.inr ℂ (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ M.V) + (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule M.V))).comp + (TensorProduct.mk ℂ DerivAlgebraComplex (Module.Dual ℂ (ConjModule M.V)) 1)) -lemma ofField_apply (φ : Module.Dual ℂ V) : +lemma ofField_apply (φ : Module.Dual ℂ M.V) : ofField φ = ExteriorAlgebra.ι ℂ - (((1 : DerivAlgebraComplex) ⊗ₜ[ℂ] φ, 0) : JetComponentSpace V) := rfl + (((1 : DerivAlgebraComplex) ⊗ₜ[ℂ] φ, 0) : JetComponentSpace M) := rfl -lemma ofConjField_apply (φ : Module.Dual ℂ (ConjModule V)) : +lemma ofConjField_apply (φ : Module.Dual ℂ (ConjModule M.V)) : ofConjField φ = ExteriorAlgebra.ι ℂ - ((0, (1 : DerivAlgebraComplex) ⊗ₜ[ℂ] φ) : JetComponentSpace V) := rfl + ((0, (1 : DerivAlgebraComplex) ⊗ₜ[ℂ] φ) : JetComponentSpace M) := rfl /-! @@ -144,34 +146,34 @@ functorial and compatible with everything the algebra carries. -/ -variable {W : Type} [AddCommGroup W] [Module ℂ W] +variable {N : MatterField jets} /-- **The fermionic algebra is contravariant in the target space.** A linear map - `f : V →ₗ[ℂ] W` induces an algebra homomorphism `FermionicAlgebra W →ₐ[ℂ] FermionicAlgebra V` + `f : V →ₗ[ℂ] W` induces an algebra homomorphism `FermionicAlgebra N →ₐ[ℂ] FermionicAlgebra M` 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 := +noncomputable def comap (f : M.V →ₗ[ℂ] N.V) : FermionicAlgebra N →ₐ[ℂ] FermionicAlgebra M := ExteriorAlgebra.map (JetComponentSpace.comap f) @[simp] -lemma comap_ι (f : V →ₗ[ℂ] W) (x : JetComponentSpace W) : +lemma comap_ι (f : M.V →ₗ[ℂ] N.V) (x : JetComponentSpace N) : 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 +lemma comap_id : comap (LinearMap.id : M.V →ₗ[ℂ] M.V) = AlgHom.id ℂ (FermionicAlgebra M) := 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) : +lemma comap_comp {P : MatterField jets} (f : M.V →ₗ[ℂ] N.V) (g : N.V →ₗ[ℂ] P.V) : 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) : +lemma comap_ofField (f : M.V →ₗ[ℂ] N.V) (φ : Module.Dual ℂ N.V) : comap f (ofField φ) = ofField (φ ∘ₗ f) := by rw [ofField_apply, comap_ι, ofField_apply] congr 1 @@ -179,7 +181,7 @@ lemma comap_ofField (f : V →ₗ[ℂ] W) (φ : Module.Dual ℂ W) : /-- 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)) : +lemma comap_ofConjField (f : M.V →ₗ[ℂ] N.V) (φ : Module.Dual ℂ (ConjModule N.V)) : comap f (ofConjField φ) = ofConjField (φ ∘ₗ ConjModule.map f) := by rw [ofConjField_apply, comap_ι, ofConjField_apply] congr 1 diff --git a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/GaugeAction.lean b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/GaugeAction.lean index 082e3c6f8..9604296b1 100644 --- a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/GaugeAction.lean +++ b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/GaugeAction.lean @@ -44,7 +44,9 @@ namespace FermionicAlgebra open Matrix MatrixGroups TensorProduct -variable {V : Type} [AddCommGroup V] [Module ℂ V] [Module.Free ℂ V] [Module.Finite ℂ V] +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} (M : MatterField jets) /-! @@ -52,18 +54,13 @@ variable {V : Type} [AddCommGroup V] [Module ℂ V] [Module.Free ℂ V] [Module. -/ -/-- **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 +/-- **The jet gauge action on the fermionic algebra** of the matter field `M`: the exterior-algebra functor + applied to the gauge action on the jet component space. The fibrewise action on the jets and its + fibrewise-linearity are fields of `M`. -/ +noncomputable def repJetGaugeGroupI : + Representation ℂ G (FermionicAlgebra M) where toFun U := - (ExteriorAlgebra.map (JetComponentSpace.repJet rep hlin U)).toLinearMap + (ExteriorAlgebra.map (JetComponentSpace.repJet M U)).toLinearMap map_one' := by simp only [map_one, Module.End.one_eq_id, ExteriorAlgebra.map_id, AlgHom.toLinearMap_id] @@ -72,54 +69,39 @@ noncomputable def repJetGaugeGroupI 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.repJet rep hlin U) x := rfl + (U : G) (x : FermionicAlgebra M) : + repJetGaugeGroupI M U x = + ExteriorAlgebra.map (JetComponentSpace.repJet M 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 + (U : G) : + repJetGaugeGroupI M U (1 : FermionicAlgebra M) = 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 + (U : G) (x y : FermionicAlgebra M) : + repJetGaugeGroupI M U (x * y) = + repJetGaugeGroupI M U x * repJetGaugeGroupI M 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.repJet rep hlin U v) := by + (U : G) (v : JetComponentSpace M) : + repJetGaugeGroupI M U (ExteriorAlgebra.ι ℂ v) = + ExteriorAlgebra.ι ℂ (JetComponentSpace.repJet M 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 + (U : G) : FermionicAlgebra M →ₐ[ℂ] FermionicAlgebra M where + toFun := repJetGaugeGroupI M 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 + map_one' := repJetGaugeGroupI_apply_one M U + map_mul' := repJetGaugeGroupI_apply_mul M U commutes' r := by simp [repJetGaugeGroupI_apply] /-! @@ -137,16 +119,13 @@ the *value* of the gauge transformation at the base point alone. So `ofField` an 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 + (U : G) (φ : Module.Dual ℂ M.V) : + repJetGaugeGroupI M U (ofField φ) = + ofField (Module.Dual.transpose (jetEval ∘ₗ (M.repJet U⁻¹).comp jetOfConstant) φ) := by rw [ofField_apply, repJetGaugeGroupI_ι, ofField_apply] congr 1 refine Prod.ext ?_ ?_ - · exact JetComponentSpace.repDual_one_tmul rep hlin U φ + · exact JetComponentSpace.repDual_one_tmul M.repJet M.repJet_smul U φ · rw [JetComponentSpace.repJet_snd] exact map_zero _ @@ -154,20 +133,17 @@ lemma repJetGaugeGroupI_ofField `JetComponentSpace.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 φ) = + (U : G) (φ : Module.Dual ℂ (ConjModule M.V)) : + repJetGaugeGroupI M U (ofConjField φ) = ofConjField (Module.Dual.transpose - (jetEval ∘ₗ (JetComponentSpace.repConj rep U⁻¹).comp jetOfConstant) φ) := by + (jetEval ∘ₗ (JetComponentSpace.repConj M.repJet U⁻¹).comp jetOfConstant) φ) := by rw [ofConjField_apply, repJetGaugeGroupI_ι, 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 φ + · exact JetComponentSpace.repDual_one_tmul (JetComponentSpace.repConj M.repJet) + (JetComponentSpace.repConj_smul_comm M.repJet_smul) U φ /-! @@ -177,66 +153,48 @@ lemma repJetGaugeGroupI_ofConjField /-- 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 +noncomputable def repGaugeGroupI : + Representation ℂ G₀ (FermionicAlgebra M) := + (repJetGaugeGroupI M).comp jets.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 + (g : G₀) (x : FermionicAlgebra M) : + repGaugeGroupI M g x = + repJetGaugeGroupI M (jets.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 _ + (g : G₀) : + repGaugeGroupI M g (1 : FermionicAlgebra M) = 1 := + repJetGaugeGroupI_apply_one M _ 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 + (g : G₀) (x y : FermionicAlgebra M) : + repGaugeGroupI M g (x * y) = + repGaugeGroupI M g x * repGaugeGroupI M g y := + repJetGaugeGroupI_apply_mul M _ 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 φ) = + (g : G₀) (φ : Module.Dual ℂ M.V) : + repGaugeGroupI M 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 + (jetEval ∘ₗ (M.repJet (jets.ofConstant g⁻¹)).comp jetOfConstant) φ) := by + have h : (jets.ofConstant g)⁻¹ = jets.ofConstant g⁻¹ := + (map_inv jets.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 φ) = + (g : G₀) (φ : Module.Dual ℂ (ConjModule M.V)) : + repGaugeGroupI M g (ofConjField φ) = ofConjField (Module.Dual.transpose - (jetEval ∘ₗ (JetComponentSpace.repConj rep (JetGaugeGroupI.ofConstant g⁻¹)).comp + (jetEval ∘ₗ (JetComponentSpace.repConj M.repJet (jets.ofConstant g⁻¹)).comp jetOfConstant) φ) := by - have h : (JetGaugeGroupI.ofConstant g)⁻¹ = JetGaugeGroupI.ofConstant g⁻¹ := - (map_inv JetGaugeGroupI.ofConstant g).symm + have h : (jets.ofConstant g)⁻¹ = jets.ofConstant g⁻¹ := + (map_inv jets.ofConstant g).symm rw [repGaugeGroupI_apply, repJetGaugeGroupI_ofConjField, h] end FermionicAlgebra diff --git a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/JetDeriv.lean b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/JetDeriv.lean index b93f93377..e410748db 100644 --- a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/JetDeriv.lean +++ b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/JetDeriv.lean @@ -53,7 +53,9 @@ namespace FermionicAlgebra open TensorProduct -variable {V : Type} [AddCommGroup V] [Module ℂ V] +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} {M : MatterField jets} /-! @@ -68,7 +70,7 @@ 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 + JetComponentSpace M →ₗ[ℂ] TrivSqZeroExt (FermionicAlgebra M) (FermionicAlgebra M) where toFun x := (ExteriorAlgebra.ι ℂ x, ExteriorAlgebra.ι ℂ (JetComponentSpace.jetDeriv μ x)) map_add' x y := by @@ -79,16 +81,16 @@ noncomputable def jetDerivGen (μ : Fin 1 ⊕ Fin 3) : rfl @[simp] -lemma jetDerivGen_fst (μ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace V) : +lemma jetDerivGen_fst (μ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace M) : (jetDerivGen μ x).fst = ExteriorAlgebra.ι ℂ x := rfl @[simp] -lemma jetDerivGen_snd (μ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace V) : +lemma jetDerivGen_snd (μ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace M) : (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) : +lemma jetDerivGen_mul_self (μ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace M) : jetDerivGen μ x * jetDerivGen μ x = 0 := by refine TrivSqZeroExt.ext ?_ ?_ · rw [TrivSqZeroExt.fst_mul, jetDerivGen_fst, ExteriorAlgebra.ι_sq_zero, @@ -100,20 +102,20 @@ lemma jetDerivGen_mul_self (μ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace V) : /-- 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) := + FermionicAlgebra M →ₐ[ℂ] TrivSqZeroExt (FermionicAlgebra M) (FermionicAlgebra M) := ExteriorAlgebra.lift ℂ ⟨jetDerivGen μ, jetDerivGen_mul_self μ⟩ @[simp] -lemma jetDerivHom_ι (μ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace V) : +lemma jetDerivHom_ι (μ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace M) : 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) : +lemma jetDerivHom_fst (μ : Fin 1 ⊕ Fin 3) (x : FermionicAlgebra M) : (jetDerivHom μ x).fst = x := by - have h : (TrivSqZeroExt.fstHom ℂ (FermionicAlgebra V) (FermionicAlgebra V)).comp - (jetDerivHom μ) = AlgHom.id ℂ (FermionicAlgebra V) := by + have h : (TrivSqZeroExt.fstHom ℂ (FermionicAlgebra M) (FermionicAlgebra M)).comp + (jetDerivHom μ) = AlgHom.id ℂ (FermionicAlgebra M) := by refine ExteriorAlgebra.hom_ext (LinearMap.ext fun v => ?_) simp exact DFunLike.congr_fun h x @@ -122,33 +124,33 @@ lemma jetDerivHom_fst (μ : Fin 1 ⊕ Fin 3) (x : FermionicAlgebra V) : 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 + FermionicAlgebra M →ₗ[ℂ] FermionicAlgebra M 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) : +lemma jetDeriv_apply (μ : Fin 1 ⊕ Fin 3) (x : FermionicAlgebra M) : 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) : +lemma jetDeriv_ι (μ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace M) : 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) μ)) +lemma jetDeriv_one (μ : Fin 1 ⊕ Fin 3) : jetDeriv (M := M) μ (1 : FermionicAlgebra M) = 0 := + congrArg TrivSqZeroExt.snd (map_one (jetDerivHom (M := M) μ)) @[simp] lemma jetDeriv_algebraMap (μ : Fin 1 ⊕ Fin 3) (r : ℂ) : - jetDeriv (V := V) μ (algebraMap ℂ (FermionicAlgebra V) r) = 0 := by + jetDeriv (M := M) μ (algebraMap ℂ (FermionicAlgebra M) 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) : +lemma jetDeriv_mul (μ : Fin 1 ⊕ Fin 3) (x y : FermionicAlgebra M) : 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 := @@ -158,21 +160,21 @@ lemma jetDeriv_mul (μ : Fin 1 ⊕ Fin 3) (x y : FermionicAlgebra V) : /-- **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) : +lemma jetDeriv_comm_apply (μ ν : Fin 1 ⊕ Fin 3) (x : FermionicAlgebra M) : 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) + (DFunLike.congr_fun (JetComponentSpace.jetDeriv_comm (M := M) μ ν) 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 μ) := + (jetDeriv (M := M) μ).comp (jetDeriv ν) = (jetDeriv (M := M) ν).comp (jetDeriv μ) := LinearMap.ext fun x => jetDeriv_comm_apply μ ν x /-! @@ -185,40 +187,40 @@ lemma jetDeriv_comm (μ ν : Fin 1 ⊕ Fin 3) : 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 := + FermionicAlgebra M →ₗ[ℂ] FermionicAlgebra M := Lorentz.iteratedD jetDeriv jetDeriv_comm s @[simp] lemma iteratedJetDeriv_zero : iteratedJetDeriv (0 : Multiset (Fin 1 ⊕ Fin 3)) - = LinearMap.id (R := ℂ) (M := FermionicAlgebra V) := + = LinearMap.id (R := ℂ) (M := FermionicAlgebra M) := 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) := + iteratedJetDeriv (M := M) (μ ::ₘ 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 μ) := + iteratedJetDeriv (M := M) (μ ::ₘ s) = (iteratedJetDeriv s).comp (jetDeriv μ) := Lorentz.iteratedD_cons' jetDeriv jetDeriv_comm μ s @[simp] lemma iteratedJetDeriv_singleton (μ : Fin 1 ⊕ Fin 3) : - iteratedJetDeriv (V := V) {μ} = jetDeriv μ := + iteratedJetDeriv (M := M) {μ} = 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 (M := M) (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) : +lemma iteratedJetDeriv_mul (s : Multiset (Fin 1 ⊕ Fin 3)) (x y : FermionicAlgebra M) : iteratedJetDeriv s (x * y) = (s.antidiagonal.map fun p => iteratedJetDeriv p.1 x * iteratedJetDeriv p.2 y).sum := @@ -226,7 +228,7 @@ lemma iteratedJetDeriv_mul (s : Multiset (Fin 1 ⊕ Fin 3)) (x y : FermionicAlge /-- 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 + iteratedJetDeriv (M := M) s (1 : FermionicAlgebra M) = 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] @@ -235,7 +237,7 @@ lemma iteratedJetDeriv_one_of_ne_zero {s : Multiset (Fin 1 ⊕ Fin 3)} (hs : 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) : +lemma iteratedJetDeriv_ι (s : Multiset (Fin 1 ⊕ Fin 3)) (x : JetComponentSpace M) : iteratedJetDeriv s (ExteriorAlgebra.ι ℂ x) = ExteriorAlgebra.ι ℂ (TensorProduct.map (LinearMap.mulRight ℂ (DerivAlgebraComplex.basis s)) @@ -277,9 +279,9 @@ lemma iteratedJetDeriv_ι (s : Multiset (Fin 1 ⊕ Fin 3)) (x : JetComponentSpac /-- 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) : +lemma iteratedJetDeriv_ofField (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ M.V) : iteratedJetDeriv s (ofField φ) = - ExteriorAlgebra.ι ℂ ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace V) := by + ExteriorAlgebra.ι ℂ ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace M) := by rw [ofField_apply, iteratedJetDeriv_ι] congr 1 refine Prod.ext ?_ ?_ @@ -290,9 +292,9 @@ lemma iteratedJetDeriv_ofField (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dua derivative symbol `∂_s`. -/ @[simp] lemma iteratedJetDeriv_ofConjField (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule V)) : + (φ : Module.Dual ℂ (ConjModule M.V)) : iteratedJetDeriv s (ofConjField φ) = - ExteriorAlgebra.ι ℂ ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace V) := by + ExteriorAlgebra.ι ℂ ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace M) := by rw [ofConjField_apply, iteratedJetDeriv_ι] congr 1 refine Prod.ext ?_ ?_ @@ -300,9 +302,9 @@ lemma iteratedJetDeriv_ofConjField (s : Multiset (Fin 1 ⊕ Fin 3)) · 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 + derivatives.** As a `ℂ`-algebra, `FermionicAlgebra M` 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 + functions. Physically: every Lagrangian term for the matter field `M` is a polynomial in the field, its conjugate, and their spacetime derivatives — nothing else is available to write down. @@ -312,30 +314,30 @@ lemma iteratedJetDeriv_ofConjField (s : Multiset (Fin 1 ⊕ Fin 3)) 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) => + Set.range (fun φ : Module.Dual ℂ M.V => iteratedJetDeriv s (ofField φ)) ∪ + Set.range (fun φ : Module.Dual ℂ (ConjModule M.V) => iteratedJetDeriv s (ofConjField φ))) - = (⊤ : Subalgebra ℂ (FermionicAlgebra V)) := by - set S : Set (FermionicAlgebra V) := + = (⊤ : Subalgebra ℂ (FermionicAlgebra M)) := by + set S : Set (FermionicAlgebra M) := ⋃ s : Multiset (Fin 1 ⊕ Fin 3), - Set.range (fun φ : Module.Dual ℂ V => iteratedJetDeriv s (ofField φ)) ∪ - Set.range (fun φ : Module.Dual ℂ (ConjModule V) => + Set.range (fun φ : Module.Dual ℂ M.V => iteratedJetDeriv s (ofField φ)) ∪ + Set.range (fun φ : Module.Dual ℂ (ConjModule M.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 := + let gField : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ M.V →ₗ[ℂ] FermionicAlgebra M := (ExteriorAlgebra.ι ℂ).comp (LinearMap.inl ℂ _ _) - let gConj : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule V) →ₗ[ℂ] - FermionicAlgebra V := + let gConj : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule M.V) →ₗ[ℂ] + FermionicAlgebra M := (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), + have hbasisField : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ M.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)), + have hbasisConj : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule M.V)), gConj (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) ∈ Algebra.adjoin ℂ S := by intro s φ have h : gConj (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) @@ -344,7 +346,7 @@ theorem adjoin_iteratedJetDeriv_eq_top : 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), + (g : DerivAlgebraComplex ⊗[ℂ] W →ₗ[ℂ] FermionicAlgebra M), (∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (w : W), g (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] w) ∈ Algebra.adjoin ℂ S) → ∀ y, g y ∈ Algebra.adjoin ℂ S := by @@ -364,7 +366,7 @@ theorem adjoin_iteratedJetDeriv_eq_top : 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)] + rw [← adjoin_ι_eq_top (M := M)] refine Algebra.adjoin_le ?_ rintro _ ⟨x, rfl⟩ have hx : x = LinearMap.inl ℂ _ _ x.1 + LinearMap.inr ℂ _ _ x.2 := by @@ -378,12 +380,12 @@ theorem adjoin_iteratedJetDeriv_eq_top : -/ -variable {W : Type} [AddCommGroup W] [Module ℂ W] +variable {N : MatterField jets} /-- **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) : +lemma comap_jetDeriv (f : M.V →ₗ[ℂ] N.V) (μ : Fin 1 ⊕ Fin 3) (x : FermionicAlgebra N) : comap f (jetDeriv μ x) = jetDeriv μ (comap f x) := by induction x using ExteriorAlgebra.induction with | algebraMap r => @@ -396,8 +398,8 @@ lemma comap_jetDeriv (f : V →ₗ[ℂ] W) (μ : Fin 1 ⊕ Fin 3) (x : Fermionic | 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) : +lemma comap_iteratedJetDeriv (f : M.V →ₗ[ℂ] N.V) (s : Multiset (Fin 1 ⊕ Fin 3)) + (x : FermionicAlgebra N) : 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, diff --git a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/LorentzAction.lean b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/LorentzAction.lean index de334ec09..9b81b7dc0 100644 --- a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/LorentzAction.lean +++ b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/LorentzAction.lean @@ -45,7 +45,9 @@ namespace FermionicAlgebra open Matrix MatrixGroups TensorProduct -variable {V : Type} [AddCommGroup V] [Module ℂ V] +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} (M : MatterField jets) /-! @@ -53,12 +55,12 @@ variable {V : Type} [AddCommGroup V] [Module ℂ V] -/ -/-- **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 fermionic algebra** of the matter field `M`, induced + from a representation `M.repLorentz` 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 +noncomputable def repLorentzGroup : + Representation ℂ SL(2,ℂ) (FermionicAlgebra M) where + toFun Λ := (ExteriorAlgebra.map (JetComponentSpace.repLorentzGroup M Λ)).toLinearMap map_one' := by simp only [map_one, Module.End.one_eq_id, ExteriorAlgebra.map_id, AlgHom.toLinearMap_id] @@ -66,39 +68,39 @@ noncomputable def repLorentzGroup (repV : Representation ℂ SL(2,ℂ) V) : 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 +lemma repLorentzGroup_apply (Λ : SL(2,ℂ)) + (x : FermionicAlgebra M) : + repLorentzGroup M Λ x = + ExteriorAlgebra.map (JetComponentSpace.repLorentzGroup M Λ) x := rfl @[simp] -lemma repLorentzGroup_apply_one (repV : Representation ℂ SL(2,ℂ) V) (Λ : SL(2,ℂ)) : - repLorentzGroup repV Λ (1 : FermionicAlgebra V) = 1 := by +lemma repLorentzGroup_apply_one (Λ : SL(2,ℂ)) : + repLorentzGroup M Λ (1 : FermionicAlgebra M) = 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 +lemma repLorentzGroup_apply_mul (Λ : SL(2,ℂ)) + (x y : FermionicAlgebra M) : + repLorentzGroup M Λ (x * y) + = repLorentzGroup M Λ x * repLorentzGroup M Λ 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 +lemma repLorentzGroup_ι (Λ : SL(2,ℂ)) + (v : JetComponentSpace M) : + repLorentzGroup M Λ (ExteriorAlgebra.ι ℂ v) = + ExteriorAlgebra.ι ℂ (JetComponentSpace.repLorentzGroup M Λ 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 Λ +noncomputable def repLorentzGroupAlgHom (Λ : SL(2,ℂ)) : + FermionicAlgebra M →ₐ[ℂ] FermionicAlgebra M where + toFun := repLorentzGroup M Λ map_add' := LinearMap.map_add _ map_zero' := LinearMap.map_zero _ - map_one' := repLorentzGroup_apply_one repV Λ - map_mul' := repLorentzGroup_apply_mul repV Λ + map_one' := repLorentzGroup_apply_one M Λ + map_mul' := repLorentzGroup_apply_mul M Λ commutes' r := by simp [repLorentzGroup_apply] /-! @@ -109,12 +111,12 @@ noncomputable def repLorentzGroupAlgHom (repV : Representation ℂ SL(2,ℂ) V) /-- **`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 + are generated: `ofField` intertwines `M.repLorentz.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 +lemma repLorentzGroup_ofField (Λ : SL(2,ℂ)) + (φ : Module.Dual ℂ M.V) : + repLorentzGroup M Λ (ofField φ) = ofField (M.repLorentz.dual Λ φ) := by rw [ofField_apply, repLorentzGroup_ι, ofField_apply] congr 1 refine Prod.ext ?_ ?_ @@ -128,16 +130,16 @@ lemma repLorentzGroup_ofField (repV : Representation ℂ SL(2,ℂ) V) (Λ : SL(2 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 +lemma repLorentzGroup_ofConjField (Λ : SL(2,ℂ)) + (φ : Module.Dual ℂ (ConjModule M.V)) : + repLorentzGroup M Λ (ofConjField φ) = ofConjField (M.repLorentz.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 Λ φ) = _ + show (DerivAlgebraComplex.repLorentzGroup Λ 1) ⊗ₜ[ℂ] (M.repLorentz.conj.dual Λ φ) = _ rw [DerivAlgebraComplex.repLorentzGroup_apply_one] /-! @@ -150,11 +152,11 @@ 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) = +lemma repLorentzGroup_jetDeriv (Λ : SL(2,ℂ)) + (μ : Fin 1 ⊕ Fin 3) (x : FermionicAlgebra M) : + repLorentzGroup M Λ (jetDeriv μ x) = ∑ a, (((Lorentz.SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • - jetDeriv a (repLorentzGroup repV Λ x) := by + jetDeriv a (repLorentzGroup M Λ x) := by induction x using ExteriorAlgebra.induction with | algebraMap r => rw [jetDeriv_algebraMap, map_zero] @@ -176,9 +178,9 @@ lemma repLorentzGroup_jetDeriv (repV : Representation ℂ SL(2,ℂ) V) (Λ : SL( /-- 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 _ _ _ +instance instIsLorentzDeriv : + Lorentz.IsLorentzDeriv (repLorentzGroup M) (jetDeriv (M := M)) where + rep_deriv := repLorentzGroup_jetDeriv M _ _ _ end FermionicAlgebra diff --git a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/MassDim.lean b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/MassDim.lean index 640e37d73..c1597c490 100644 --- a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/MassDim.lean +++ b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/MassDim.lean @@ -42,7 +42,9 @@ namespace FermionicAlgebra open TensorProduct -variable {V : Type} [AddCommGroup V] [Module ℂ V] +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} {M : MatterField jets} /-! @@ -54,11 +56,11 @@ variable {V : Type} [AddCommGroup V] [Module ℂ V] 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 := + FermionicAlgebra M →ₐ[ℂ] FermionicAlgebra M := ExteriorAlgebra.map (JetComponentSpace.massWeightScale w c) @[simp] -lemma massWeightScale_ι (w : ℕ) (c : ℂ) (x : JetComponentSpace V) : +lemma massWeightScale_ι (w : ℕ) (c : ℂ) (x : JetComponentSpace M) : massWeightScale w c (ExteriorAlgebra.ι ℂ x) = ExteriorAlgebra.ι ℂ (JetComponentSpace.massWeightScale w c x) := by rw [massWeightScale, ExteriorAlgebra.map_apply_ι] @@ -71,7 +73,7 @@ lemma massWeightScale_ι (w : ℕ) (c : ℂ) (x : JetComponentSpace V) : /-- The undifferentiated field carries its own mass weight. -/ @[simp] -lemma massWeightScale_ofField (w : ℕ) (c : ℂ) (φ : Module.Dual ℂ V) : +lemma massWeightScale_ofField (w : ℕ) (c : ℂ) (φ : Module.Dual ℂ M.V) : massWeightScale w c (ofField φ) = c ^ w • ofField φ := by rw [ofField_apply, massWeightScale_ι, ← map_smul] congr 1 @@ -84,7 +86,7 @@ lemma massWeightScale_ofField (w : ℕ) (c : ℂ) (φ : Module.Dual ℂ V) : /-- The undifferentiated conjugate field carries the same mass weight as the field. -/ @[simp] -lemma massWeightScale_ofConjField (w : ℕ) (c : ℂ) (φ : Module.Dual ℂ (ConjModule V)) : +lemma massWeightScale_ofConjField (w : ℕ) (c : ℂ) (φ : Module.Dual ℂ (ConjModule M.V)) : massWeightScale w c (ofConjField φ) = c ^ w • ofConjField φ := by rw [ofConjField_apply, massWeightScale_ι, ← map_smul] congr 1 @@ -98,7 +100,7 @@ lemma massWeightScale_ofConjField (w : ℕ) (c : ℂ) (φ : Module.Dual ℂ (Con /-- **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) : + (x : FermionicAlgebra M) : 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, @@ -114,7 +116,7 @@ lemma massWeightScale_jetDeriv (w : ℕ) (c : ℂ) (μ : Fin 1 ⊕ Fin 3) /-- **The iterated derivative `∂_s` adds mass weight `2 |s|`.** -/ lemma massWeightScale_iteratedJetDeriv (w : ℕ) (c : ℂ) (s : Multiset (Fin 1 ⊕ Fin 3)) - (x : FermionicAlgebra V) : + (x : FermionicAlgebra M) : 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 diff --git a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/MassWeightPoly.lean b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/MassWeightPoly.lean index 91abe9877..63656c17f 100644 --- a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/MassWeightPoly.lean +++ b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/MassWeightPoly.lean @@ -18,7 +18,7 @@ turns the scaling into a grading: `massWeightPoly w` is the algebra map sending `∂_s ψ_φ` of a field of mass weight `w` to `X ^ (w + 2 |s|)` times itself, so the coefficient of `X ^ n` in `massWeightPoly w a` is the part of `a` of mass weight `n`. -Unlike the bosonic case the target `Polynomial (FermionicAlgebra V)` is not commutative, so +Unlike the bosonic case the target `Polynomial (FermionicAlgebra M)` is not commutative, so the universal property of the exterior algebra comes with a side condition: the linear map on the jet component space must square to zero. That is proved by the standard bilinear-form argument — the symmetrised square vanishes, and two is invertible in `ℂ` — with the @@ -52,7 +52,9 @@ namespace FermionicAlgebra open TensorProduct -variable {V : Type} [AddCommGroup V] [Module ℂ V] +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} {M : MatterField jets} /-! @@ -61,13 +63,13 @@ variable {V : Type} [AddCommGroup V] [Module ℂ V] -/ /-- The monomial map into polynomials over the fermionic algebra, as a map of `ℂ`-modules - rather than of `FermionicAlgebra V`-modules. -/ + rather than of `FermionicAlgebra M`-modules. -/ noncomputable def monomialₗ (n : ℕ) : - FermionicAlgebra V →ₗ[ℂ] Polynomial (FermionicAlgebra V) := + FermionicAlgebra M →ₗ[ℂ] Polynomial (FermionicAlgebra M) := (Polynomial.monomial n).restrictScalars ℂ @[simp] -lemma monomialₗ_apply (n : ℕ) (x : FermionicAlgebra V) : +lemma monomialₗ_apply (n : ℕ) (x : FermionicAlgebra M) : monomialₗ n x = Polynomial.monomial n x := rfl /-- One half of the mass-weight polynomial on the jet component space, for a field of mass @@ -75,8 +77,8 @@ lemma monomialₗ_apply (n : ℕ) (x : FermionicAlgebra V) : under `k`. The two halves of the component space differ only in the inclusion `k` of the symbols into the fermionic algebra, so both are instances of this map. -/ noncomputable def halfPoly {W : Type} [AddCommGroup W] [Module ℂ W] (w : ℕ) - (k : DerivAlgebraComplex ⊗[ℂ] W →ₗ[ℂ] FermionicAlgebra V) : - DerivAlgebraComplex ⊗[ℂ] W →ₗ[ℂ] Polynomial (FermionicAlgebra V) := + (k : DerivAlgebraComplex ⊗[ℂ] W →ₗ[ℂ] FermionicAlgebra M) : + DerivAlgebraComplex ⊗[ℂ] W →ₗ[ℂ] Polynomial (FermionicAlgebra M) := TensorProduct.lift (DerivAlgebraComplex.basis.constr ℂ fun s => (monomialₗ (w + 2 * Multiset.card s)).comp (k.comp (TensorProduct.mk ℂ DerivAlgebraComplex W (DerivAlgebraComplex.basis s)))) @@ -84,7 +86,7 @@ noncomputable def halfPoly {W : Type} [AddCommGroup W] [Module ℂ W] (w : ℕ) /-- On the symbol `∂_s ψ` the half mass-weight polynomial is the monomial of degree `w + 2 |s|`: the field contributes `w` and each derivative two. -/ lemma halfPoly_basis_tmul {W : Type} [AddCommGroup W] [Module ℂ W] (w : ℕ) - (k : DerivAlgebraComplex ⊗[ℂ] W →ₗ[ℂ] FermionicAlgebra V) + (k : DerivAlgebraComplex ⊗[ℂ] W →ₗ[ℂ] FermionicAlgebra M) (s : Multiset (Fin 1 ⊕ Fin 3)) (x : W) : halfPoly w k (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] x) = Polynomial.monomial (w + 2 * Multiset.card s) @@ -93,42 +95,42 @@ lemma halfPoly_basis_tmul {W : Type} [AddCommGroup W] [Module ℂ W] (w : ℕ) rfl /-- The inclusion of the unconjugated symbols into the fermionic algebra. -/ -noncomputable def ιFst : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ V →ₗ[ℂ] FermionicAlgebra V := +noncomputable def ιFst : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ M.V →ₗ[ℂ] FermionicAlgebra M := (ExteriorAlgebra.ι ℂ).comp (LinearMap.inl ℂ _ _) /-- The inclusion of the conjugate symbols into the fermionic algebra. -/ noncomputable def ιSnd : - DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule V) →ₗ[ℂ] FermionicAlgebra V := + DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule M.V) →ₗ[ℂ] FermionicAlgebra M := (ExteriorAlgebra.ι ℂ).comp (LinearMap.inr ℂ _ _) /-- The mass-weight polynomial of a component function of a field of mass weight `w`: the sum of the two half maps, one for the field and one for its conjugate. -/ noncomputable def jetComponentPoly (w : ℕ) : - JetComponentSpace V →ₗ[ℂ] Polynomial (FermionicAlgebra V) := + JetComponentSpace M →ₗ[ℂ] Polynomial (FermionicAlgebra M) := (halfPoly w ιFst).comp (LinearMap.fst ℂ _ _) + (halfPoly w ιSnd).comp (LinearMap.snd ℂ _ _) -lemma jetComponentPoly_apply (w : ℕ) (x : JetComponentSpace V) : +lemma jetComponentPoly_apply (w : ℕ) (x : JetComponentSpace M) : jetComponentPoly w x = halfPoly w ιFst x.1 + halfPoly w ιSnd x.2 := rfl /-- On an unconjugated derivative monomial the component map is a monomial eigenvector. -/ @[simp] -lemma jetComponentPoly_inl (w : ℕ) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V) : - jetComponentPoly w ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace V) = +lemma jetComponentPoly_inl (w : ℕ) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ M.V) : + jetComponentPoly w ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace M) = Polynomial.monomial (w + 2 * Multiset.card s) (ExteriorAlgebra.ι ℂ - ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace V)) := by + ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace M)) := by rw [jetComponentPoly_apply, halfPoly_basis_tmul, map_zero, add_zero] rfl /-- On a conjugate derivative monomial the component map is a monomial eigenvector. -/ @[simp] lemma jetComponentPoly_inr (w : ℕ) (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule V)) : - jetComponentPoly w ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace V) = + (φ : Module.Dual ℂ (ConjModule M.V)) : + jetComponentPoly w ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace M) = Polynomial.monomial (w + 2 * Multiset.card s) (ExteriorAlgebra.ι ℂ - ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace V)) := by + ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace M)) := by rw [jetComponentPoly_apply, halfPoly_basis_tmul, map_zero, zero_add] rfl @@ -162,15 +164,15 @@ private lemma basisTmul_span_top {W : Type} [AddCommGroup W] [Module ℂ W] : /-- The set of derivative monomials in the jet component space: the unconjugated symbols `∂_s ψ_φ` together with the conjugate symbols `∂_s ψ̄_φ`. -/ -def generators (V : Type) [AddCommGroup V] [Module ℂ V] : Set (JetComponentSpace V) := - (Set.range fun p : Multiset (Fin 1 ⊕ Fin 3) × Module.Dual ℂ V => - ((DerivAlgebraComplex.basis p.1 ⊗ₜ[ℂ] p.2, 0) : JetComponentSpace V)) ∪ - Set.range fun p : Multiset (Fin 1 ⊕ Fin 3) × Module.Dual ℂ (ConjModule V) => - ((0, DerivAlgebraComplex.basis p.1 ⊗ₜ[ℂ] p.2) : JetComponentSpace V) +def generators (M : MatterField jets) : Set (JetComponentSpace M) := + (Set.range fun p : Multiset (Fin 1 ⊕ Fin 3) × Module.Dual ℂ M.V => + ((DerivAlgebraComplex.basis p.1 ⊗ₜ[ℂ] p.2, 0) : JetComponentSpace M)) ∪ + Set.range fun p : Multiset (Fin 1 ⊕ Fin 3) × Module.Dual ℂ (ConjModule M.V) => + ((0, DerivAlgebraComplex.basis p.1 ⊗ₜ[ℂ] p.2) : JetComponentSpace M) /-- The derivative monomials span the jet component space: every component function is the sum of its two halves, and each half is spanned by derivative monomials. -/ -lemma span_generators_eq_top : Submodule.span ℂ (generators V) = ⊤ := by +lemma span_generators_eq_top : Submodule.span ℂ (generators M) = ⊤ := by rw [eq_top_iff] rintro v - have hv : v = LinearMap.inl ℂ _ _ v.1 + LinearMap.inr ℂ _ _ v.2 := @@ -178,19 +180,19 @@ lemma span_generators_eq_top : Submodule.span ℂ (generators V) = ⊤ := by rw [hv] refine Submodule.add_mem _ ?_ ?_ · have hle : Submodule.span ℂ (Set.range fun p : Multiset (Fin 1 ⊕ Fin 3) × - Module.Dual ℂ V => DerivAlgebraComplex.basis p.1 ⊗ₜ[ℂ] p.2) ≤ - Submodule.comap (LinearMap.inl ℂ (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ V) - (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule V))) - (Submodule.span ℂ (generators V)) := by + Module.Dual ℂ M.V => DerivAlgebraComplex.basis p.1 ⊗ₜ[ℂ] p.2) ≤ + Submodule.comap (LinearMap.inl ℂ (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ M.V) + (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule M.V))) + (Submodule.span ℂ (generators M)) := by rw [Submodule.span_le] rintro _ ⟨p, rfl⟩ exact Submodule.subset_span (Or.inl ⟨p, rfl⟩) exact hle (by rw [basisTmul_span_top]; trivial) · have hle : Submodule.span ℂ (Set.range fun p : Multiset (Fin 1 ⊕ Fin 3) × - Module.Dual ℂ (ConjModule V) => DerivAlgebraComplex.basis p.1 ⊗ₜ[ℂ] p.2) ≤ - Submodule.comap (LinearMap.inr ℂ (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ V) - (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule V))) - (Submodule.span ℂ (generators V)) := by + Module.Dual ℂ (ConjModule M.V) => DerivAlgebraComplex.basis p.1 ⊗ₜ[ℂ] p.2) ≤ + Submodule.comap (LinearMap.inr ℂ (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ M.V) + (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule M.V))) + (Submodule.span ℂ (generators M)) := by rw [Submodule.span_le] rintro _ ⟨p, rfl⟩ exact Submodule.subset_span (Or.inr ⟨p, rfl⟩) @@ -198,8 +200,8 @@ lemma span_generators_eq_top : Submodule.span ℂ (generators V) = ⊤ := by /-- Every derivative monomial is a monomial eigenvector of the component map: this is the only property of the component map that the square-zero argument uses. -/ -lemma exists_jetComponentPoly_eq_monomial (w : ℕ) {v : JetComponentSpace V} - (hv : v ∈ generators V) : +lemma exists_jetComponentPoly_eq_monomial (w : ℕ) {v : JetComponentSpace M} + (hv : v ∈ generators M) : ∃ n : ℕ, jetComponentPoly w v = Polynomial.monomial n (ExteriorAlgebra.ι ℂ v) := by rcases hv with ⟨p, rfl⟩ | ⟨p, rfl⟩ · exact ⟨w + 2 * Multiset.card p.1, jetComponentPoly_inl w p.1 p.2⟩ @@ -210,14 +212,14 @@ set_option maxHeartbeats 800000 in demands. The symmetrised square is a bilinear form, so it is enough to check that it vanishes on the derivative monomials, where it is a monomial multiple of `ExteriorAlgebra.ι_add_mul_swap`; halving then gives the square itself. -/ -lemma jetComponentPoly_mul_self (w : ℕ) (v : JetComponentSpace V) : +lemma jetComponentPoly_mul_self (w : ℕ) (v : JetComponentSpace M) : jetComponentPoly w v * jetComponentPoly w v = 0 := by - have key : ((LinearMap.mul ℂ (Polynomial (FermionicAlgebra V))).compl₁₂ - (jetComponentPoly (V := V) w) (jetComponentPoly (V := V) w)) + - ((LinearMap.mul ℂ (Polynomial (FermionicAlgebra V))).compl₁₂ - (jetComponentPoly (V := V) w) (jetComponentPoly (V := V) w)).flip = 0 := by - refine LinearMap.ext_on span_generators_eq_top fun x hx => ?_ - refine LinearMap.ext_on span_generators_eq_top fun y hy => ?_ + have key : ((LinearMap.mul ℂ (Polynomial (FermionicAlgebra M))).compl₁₂ + (jetComponentPoly (M := M) w) (jetComponentPoly (M := M) w)) + + ((LinearMap.mul ℂ (Polynomial (FermionicAlgebra M))).compl₁₂ + (jetComponentPoly (M := M) w) (jetComponentPoly (M := M) w)).flip = 0 := by + refine LinearMap.ext_on (span_generators_eq_top (M := M)) fun x hx => ?_ + refine LinearMap.ext_on (span_generators_eq_top (M := M)) fun y hy => ?_ obtain ⟨n, hn⟩ := exists_jetComponentPoly_eq_monomial w hx obtain ⟨m, hm⟩ := exists_jetComponentPoly_eq_monomial w hy simp only [LinearMap.add_apply, LinearMap.compl₁₂_apply, LinearMap.flip_apply, @@ -245,12 +247,12 @@ lemma jetComponentPoly_mul_self (w : ℕ) (v : JetComponentSpace V) : `ℂ`-algebra map sending a generator of mass weight `n` to `X ^ n` times itself. It is `FermionicAlgebra.massWeightScale` with the scalar replaced by the formal variable `X`. -/ noncomputable def massWeightPoly (w : ℕ) : - FermionicAlgebra V →ₐ[ℂ] Polynomial (FermionicAlgebra V) := + FermionicAlgebra M →ₐ[ℂ] Polynomial (FermionicAlgebra M) := ExteriorAlgebra.lift ℂ ⟨jetComponentPoly w, jetComponentPoly_mul_self w⟩ /-- On a component function the mass-weight polynomial is the component-function map. -/ @[simp] -lemma massWeightPoly_ι (w : ℕ) (x : JetComponentSpace V) : +lemma massWeightPoly_ι (w : ℕ) (x : JetComponentSpace M) : massWeightPoly w (ExteriorAlgebra.ι ℂ x) = jetComponentPoly w x := by rw [massWeightPoly, ExteriorAlgebra.lift_ι_apply] @@ -263,7 +265,7 @@ lemma massWeightPoly_ι (w : ℕ) (x : JetComponentSpace V) : /-- The generator `∂_s ψ_φ` is a monomial eigenvector of mass weight `w + 2 |s|`: the field carries its own mass weight and each derivative adds two. -/ lemma massWeightPoly_iteratedJetDeriv_ofField (w : ℕ) (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ V) : + (φ : Module.Dual ℂ M.V) : massWeightPoly w (iteratedJetDeriv s (ofField φ)) = Polynomial.monomial (w + 2 * Multiset.card s) (iteratedJetDeriv s (ofField φ)) := by rw [iteratedJetDeriv_ofField, massWeightPoly_ι, jetComponentPoly_inl] @@ -271,21 +273,21 @@ lemma massWeightPoly_iteratedJetDeriv_ofField (w : ℕ) (s : Multiset (Fin 1 ⊕ /-- The conjugate generator `∂_s ψ̄_φ` is a monomial eigenvector of the same mass weight `w + 2 |s|` as the generator it conjugates. -/ lemma massWeightPoly_iteratedJetDeriv_ofConjField (w : ℕ) (s : Multiset (Fin 1 ⊕ Fin 3)) - (φ : Module.Dual ℂ (ConjModule V)) : + (φ : Module.Dual ℂ (ConjModule M.V)) : massWeightPoly w (iteratedJetDeriv s (ofConjField φ)) = Polynomial.monomial (w + 2 * Multiset.card s) (iteratedJetDeriv s (ofConjField φ)) := by rw [iteratedJetDeriv_ofConjField, massWeightPoly_ι, jetComponentPoly_inr] /-- The undifferentiated field has mass weight `w`. -/ -lemma massWeightPoly_ofField (w : ℕ) (φ : Module.Dual ℂ V) : +lemma massWeightPoly_ofField (w : ℕ) (φ : Module.Dual ℂ M.V) : massWeightPoly w (ofField φ) = Polynomial.monomial w (ofField φ) := by have h := massWeightPoly_iteratedJetDeriv_ofField w (0 : Multiset (Fin 1 ⊕ Fin 3)) φ rwa [iteratedJetDeriv_zero, LinearMap.id_apply, Multiset.card_zero, Nat.mul_zero, Nat.add_zero] at h /-- The undifferentiated conjugate field has mass weight `w`. -/ -lemma massWeightPoly_ofConjField (w : ℕ) (φ : Module.Dual ℂ (ConjModule V)) : +lemma massWeightPoly_ofConjField (w : ℕ) (φ : Module.Dual ℂ (ConjModule M.V)) : massWeightPoly w (ofConjField φ) = Polynomial.monomial w (ofConjField φ) := by have h := massWeightPoly_iteratedJetDeriv_ofConjField w (0 : Multiset (Fin 1 ⊕ Fin 3)) φ rwa [iteratedJetDeriv_zero, LinearMap.id_apply, Multiset.card_zero, Nat.mul_zero, @@ -301,7 +303,7 @@ lemma massWeightPoly_ofConjField (w : ℕ) (φ : Module.Dual ℂ (ConjModule V)) symbol it graded. The derivative monomials span, so it is enough to check this on the multiset basis. -/ lemma halfPoly_eval_one {W : Type} [AddCommGroup W] [Module ℂ W] (w : ℕ) - (k : DerivAlgebraComplex ⊗[ℂ] W →ₗ[ℂ] FermionicAlgebra V) + (k : DerivAlgebraComplex ⊗[ℂ] W →ₗ[ℂ] FermionicAlgebra M) (y : DerivAlgebraComplex ⊗[ℂ] W) : (halfPoly w k y).eval 1 = k y := by induction y using TensorProduct.induction_on with | zero => rw [map_zero, Polynomial.eval_zero, map_zero] @@ -321,7 +323,7 @@ lemma halfPoly_eval_one {W : Type} [AddCommGroup W] [Module ℂ W] (w : ℕ) rw [← TensorProduct.smul_tmul', map_smul, Polynomial.eval_smul, hb, map_smul] /-- Setting the formal variable to one recovers the component function. -/ -lemma jetComponentPoly_eval_one (w : ℕ) (x : JetComponentSpace V) : +lemma jetComponentPoly_eval_one (w : ℕ) (x : JetComponentSpace M) : (jetComponentPoly w x).eval 1 = ExteriorAlgebra.ι ℂ x := by rw [jetComponentPoly_apply, Polynomial.eval_add, halfPoly_eval_one, halfPoly_eval_one, ιFst, ιSnd, LinearMap.comp_apply, LinearMap.comp_apply, ← map_add] @@ -330,11 +332,11 @@ lemma jetComponentPoly_eval_one (w : ℕ) (x : JetComponentSpace V) : /-- Setting the formal variable to one recovers the original element: the mass-weight pieces of an element sum back to it. -/ -lemma massWeightPoly_eval_one (w : ℕ) (a : FermionicAlgebra V) : +lemma massWeightPoly_eval_one (w : ℕ) (a : FermionicAlgebra M) : (massWeightPoly w a).eval 1 = a := by - have h : (Polynomial.eval₂AlgHom (AlgHom.id ℂ (FermionicAlgebra V)) 1 + have h : (Polynomial.eval₂AlgHom (AlgHom.id ℂ (FermionicAlgebra M)) 1 fun b => Commute.one_right b).comp (massWeightPoly w) = - AlgHom.id ℂ (FermionicAlgebra V) := by + AlgHom.id ℂ (FermionicAlgebra M) := by refine ExteriorAlgebra.hom_ext (LinearMap.ext fun x => ?_) simp change Polynomial.eval₂ (RingHom.id _) 1 (jetComponentPoly w x) = _ @@ -346,7 +348,7 @@ lemma massWeightPoly_eval_one (w : ℕ) (a : FermionicAlgebra V) : pieces. It is not surjective, since a monomial of the wrong degree is not the grading of anything. -/ lemma massWeightPoly_injective (w : ℕ) : - Function.Injective (massWeightPoly (V := V) w) := by + Function.Injective (massWeightPoly (M := M) w) := by intro x y h rw [← massWeightPoly_eval_one w x, ← massWeightPoly_eval_one w y, h] diff --git a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Prod.lean b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Prod.lean index 431165af7..9b415df86 100644 --- a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Prod.lean +++ b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Prod.lean @@ -18,7 +18,7 @@ Two matter fields, valued in `V` and `W`, are jointly a single matter field valu `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)` +`FermionicAlgebra (M.prod N h) ≃ₐ[ℂ] (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 @@ -45,11 +45,14 @@ which is `CliffordAlgebra.prodEquiv` specialized to the zero quadratic form. @[expose] public section +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} + open scoped TensorProduct namespace StandardModel -variable {V W : Type} [AddCommGroup V] [Module ℂ V] [AddCommGroup W] [Module ℂ W] /-! @@ -70,9 +73,9 @@ with the component space itself, in /-- **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)) +abbrev FermionicAlgebra.evenOdd (M : MatterField jets) : + ZMod 2 → Submodule ℂ (FermionicAlgebra M) := + CliffordAlgebra.evenOdd (0 : QuadraticForm ℂ (JetComponentSpace M)) /-! @@ -87,15 +90,15 @@ abbrev FermionicAlgebra.evenOdd (V : Type) [AddCommGroup V] [Module ℂ V] : 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 <| +noncomputable def FermionicAlgebra.prodEquiv (M N : MatterField jets) + (h : M.massWeight = N.massWeight) : + FermionicAlgebra (M.prod N h) ≃ₐ[ℂ] + (FermionicAlgebra.evenOdd M ᵍ⊗[ℂ] FermionicAlgebra.evenOdd N) := + (ExteriorAlgebra.congr (JetComponentSpace.prodEquiv M N h)).trans <| (CliffordAlgebra.equivOfIsometry - (Q₁ := (0 : QuadraticForm ℂ (JetComponentSpace V × JetComponentSpace W))) - (Q₂ := (0 : QuadraticForm ℂ (JetComponentSpace V)).prod - (0 : QuadraticForm ℂ (JetComponentSpace W))) + (Q₁ := (0 : QuadraticForm ℂ (JetComponentSpace M × JetComponentSpace N))) + (Q₂ := (0 : QuadraticForm ℂ (JetComponentSpace M)).prod + (0 : QuadraticForm ℂ (JetComponentSpace N))) ⟨LinearEquiv.refl ℂ _, fun _ => by simp⟩).trans (CliffordAlgebra.prodEquiv _ _) diff --git a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/TransformsIn.lean b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/TransformsIn.lean index c8f9bad5e..a65d9945d 100644 --- a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/TransformsIn.lean +++ b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/TransformsIn.lean @@ -27,7 +27,7 @@ the image of the component space under `ExteriorAlgebra.ι`, and a multiset sum through a linear map. The conjugate generators are the same statement for the conjugate action -`JetComponentSpace.repConj rep` on +`JetComponentSpace.repConj M.repJet` on the jets of the conjugate field, which is what the conjugate half of the component space carries; so they are an instance of the same lemma, not a second proof. @@ -58,7 +58,9 @@ namespace FermionicAlgebra open Matrix MatrixGroups TensorProduct -variable {V : Type} [AddCommGroup V] [Module ℂ V] +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} {M : MatterField jets} /-! @@ -68,25 +70,25 @@ variable {V : Type} [AddCommGroup V] [Module ℂ V] /-- A multiset sum in the unconjugated half of the component space passes through the inclusion of the generators. -/ -private lemma sum_inl (m : Multiset (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ V)) : - ExteriorAlgebra.ι ℂ ((m.sum, 0) : JetComponentSpace V) - = (m.map fun a => ExteriorAlgebra.ι ℂ ((a, 0) : JetComponentSpace V)).sum := by - rw [show ExteriorAlgebra.ι ℂ ((m.sum, 0) : JetComponentSpace V) +private lemma sum_inl (m : Multiset (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ M.V)) : + ExteriorAlgebra.ι ℂ ((m.sum, 0) : JetComponentSpace M) + = (m.map fun a => ExteriorAlgebra.ι ℂ ((a, 0) : JetComponentSpace M)).sum := by + rw [show ExteriorAlgebra.ι ℂ ((m.sum, 0) : JetComponentSpace M) = ((ExteriorAlgebra.ι ℂ).comp - (LinearMap.inl ℂ (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ V) - (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule V)))) m.sum from rfl, + (LinearMap.inl ℂ (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ M.V) + (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule M.V)))) m.sum from rfl, map_multiset_sum] rfl /-- A multiset sum in the conjugate half of the component space passes through the inclusion of the generators. -/ -private lemma sum_inr (m : Multiset (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule V))) : - ExteriorAlgebra.ι ℂ ((0, m.sum) : JetComponentSpace V) - = (m.map fun a => ExteriorAlgebra.ι ℂ ((0, a) : JetComponentSpace V)).sum := by - rw [show ExteriorAlgebra.ι ℂ ((0, m.sum) : JetComponentSpace V) +private lemma sum_inr (m : Multiset (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule M.V))) : + ExteriorAlgebra.ι ℂ ((0, m.sum) : JetComponentSpace M) + = (m.map fun a => ExteriorAlgebra.ι ℂ ((0, a) : JetComponentSpace M)).sum := by + rw [show ExteriorAlgebra.ι ℂ ((0, m.sum) : JetComponentSpace M) = ((ExteriorAlgebra.ι ℂ).comp - (LinearMap.inr ℂ (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ V) - (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule V)))) m.sum from rfl, + (LinearMap.inr ℂ (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ M.V) + (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule M.V)))) m.sum from rfl, map_multiset_sum] rfl @@ -96,7 +98,6 @@ private lemma sum_inr (m : Multiset (DerivAlgebraComplex ⊗[ℂ] Module.Dual -/ -variable [Module.Free ℂ V] [Module.Finite ℂ V] /-! @@ -110,18 +111,15 @@ variable [Module.Free ℂ V] [Module.Finite ℂ V] `s₁` acting on the target index of `∂_{s₂} ψ_φ`. There is no inhomogeneous term: unlike a gauge field, a matter field transforms linearly. -/ lemma repJetGaugeGroupI_iteratedJetDeriv_ofField - (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) - (hlin : ∀ (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] V), - rep U (χ • z) = χ • rep U z) - (U : JetGaugeGroupI) (φ : Module.Dual ℂ V) (s : Multiset (Fin 1 ⊕ Fin 3)) : - repJetGaugeGroupI rep hlin U (iteratedJetDeriv s (ofField φ)) = + (U : G) (φ : Module.Dual ℂ M.V) (s : Multiset (Fin 1 ⊕ Fin 3)) : + repJetGaugeGroupI M U (iteratedJetDeriv s (ofField φ)) = (s.antidiagonal.map fun p => iteratedJetDeriv p.2 - (ofField (GaugeAlgebraRealization.repDualCoeff rep U⁻¹ p.1 φ))).sum := by + (ofField (GaugeAlgebraRealization.repDualCoeff M.repJet U⁻¹ p.1 φ))).sum := by rw [iteratedJetDeriv_ofField, repJetGaugeGroupI_ι, - show JetComponentSpace.repJet rep hlin U - ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace V) - = (JetComponentSpace.repDual rep hlin U (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ), 0) from by + show JetComponentSpace.repJet M U + ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace M) + = (JetComponentSpace.repDual M.repJet M.repJet_smul U (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ), 0) from by refine Prod.ext rfl ?_ rw [JetComponentSpace.repJet_snd] exact map_zero _, @@ -131,13 +129,10 @@ lemma repJetGaugeGroupI_iteratedJetDeriv_ofField /-- The derivative generators of a matter field transform in the representation `rep` carried by its jets, in the sense demanded by `LocalGaugeData.TransformsIn`. -/ -theorem transformsIn_iteratedJetDeriv_ofField - (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) - (hlin : ∀ (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] V), - rep U (χ • z) = χ • rep U z) : - LocalGaugeData.TransformsIn (repJetGaugeGroupI rep hlin) rep - fun s => (iteratedJetDeriv s).comp (ofField (V := V)) := - fun U φ s => repJetGaugeGroupI_iteratedJetDeriv_ofField rep hlin U φ s +theorem transformsIn_iteratedJetDeriv_ofField : + LocalGaugeData.TransformsIn (repJetGaugeGroupI M) M.repJet + fun s => (iteratedJetDeriv s).comp (ofField (M := M)) := + fun U φ s => repJetGaugeGroupI_iteratedJetDeriv_ofField (M := M) U φ s /-! @@ -146,26 +141,23 @@ theorem transformsIn_iteratedJetDeriv_ofField -/ /-- The transformation law of the derivative generators of the conjugate matter field. It - is the law of the field itself for the conjugate action `JetComponentSpace.repConj rep` on + is the law of the field itself for the conjugate action `JetComponentSpace.repConj M.repJet` on the jets of the conjugate field — the physicists' `ψ̄ ↦ ψ̄ U†` and its derivatives. -/ lemma repJetGaugeGroupI_iteratedJetDeriv_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)) + (U : G) (φ : Module.Dual ℂ (ConjModule M.V)) (s : Multiset (Fin 1 ⊕ Fin 3)) : - repJetGaugeGroupI rep hlin U (iteratedJetDeriv s (ofConjField φ)) = + repJetGaugeGroupI M U (iteratedJetDeriv s (ofConjField φ)) = (s.antidiagonal.map fun p => iteratedJetDeriv p.2 (ofConjField - (GaugeAlgebraRealization.repDualCoeff (JetComponentSpace.repConj rep) U⁻¹ p.1 + (GaugeAlgebraRealization.repDualCoeff (JetComponentSpace.repConj M.repJet) U⁻¹ p.1 φ))).sum := by rw [iteratedJetDeriv_ofConjField, repJetGaugeGroupI_ι, - show JetComponentSpace.repJet rep hlin U - ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace V) - = (0, JetComponentSpace.repDual (JetComponentSpace.repConj rep) - (JetComponentSpace.repConj_smul_comm hlin) U + show JetComponentSpace.repJet M U + ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace M) + = (0, JetComponentSpace.repDual (JetComponentSpace.repConj M.repJet) + (JetComponentSpace.repConj_smul_comm M.repJet_smul) U (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ)) from by refine Prod.ext ?_ rfl rw [JetComponentSpace.repJet_fst] @@ -175,15 +167,12 @@ lemma repJetGaugeGroupI_iteratedJetDeriv_ofConjField rw [Function.comp_apply, iteratedJetDeriv_ofConjField] /-- The derivative generators of the conjugate matter field transform in the conjugate - representation `JetComponentSpace.repConj rep`, in the sense demanded by + representation `JetComponentSpace.repConj M.repJet`, in the sense demanded by `LocalGaugeData.TransformsIn`. -/ -theorem transformsIn_iteratedJetDeriv_ofConjField - (rep : Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] V)) - (hlin : ∀ (U : JetGaugeGroupI) (χ : JetRing) (z : JetRing ⊗[ℂ] V), - rep U (χ • z) = χ • rep U z) : - LocalGaugeData.TransformsIn (repJetGaugeGroupI rep hlin) (JetComponentSpace.repConj rep) - fun s => (iteratedJetDeriv s).comp (ofConjField (V := V)) := - fun U φ s => repJetGaugeGroupI_iteratedJetDeriv_ofConjField rep hlin U φ s +theorem transformsIn_iteratedJetDeriv_ofConjField : + LocalGaugeData.TransformsIn (repJetGaugeGroupI M) (JetComponentSpace.repConj M.repJet) + fun s => (iteratedJetDeriv s).comp (ofConjField (M := M)) := + fun U φ s => repJetGaugeGroupI_iteratedJetDeriv_ofConjField (M := M) U φ s end FermionicAlgebra From 0c5619daa4eaf62a6a9d785999dca0abe211d15d Mon Sep 17 00:00:00 2001 From: doxtor6 Date: Thu, 10 Sep 2026 21:18:31 -0400 Subject: [PATCH 318/367] feat: the Standard Model as a model table on generic local gauge data MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Define the Standard Model from a table alone (Particles/StandardModel/Basic): the gauge group as the list of factors [.SU 3, .SU 2, .U1], one row per fermion field and one per scalar field. Everything else is derived by two generic layers. Generic local gauge data from factors (GaugeTheory/LocalGaugeData): * U1: LocalGaugeData.u1 (unitary jets, self-adjoint scalar jets), canonical U1Factor, faithfulness. * SU/Algebra, SU/Basic: su(n) over a *-algebra and LocalGaugeData.su n (special unitary jets, traceless hermitian jets, Maurer–Cartan form i (∂U) U⁻¹ with cocycle, flatness and the Leibniz rule for the adjoint), canonical SUFactor, faithfulness. * Prod: the product of local gauge data, lifting of factors, faithfulness. * OfFactors: FactorSpec, the carriers of a list of factors, LocalGaugeData.ofFactors and its canonical Factors.factors. * Relativity/JetRing/Jacobi, Taylor: Jacobi's formula and Taylor determinacy of jets. Matter fields from matrix representations (GaugeTheory/MatterField/MatrixRep): * Basic: LocalGaugeData.MatrixRep, a matrix of jets with its infinitesimal action subject to the derivative and equivariance identities. MatrixRep.isInfinitesimalActionOf proves IsInfinitesimalActionOf once for every matrix representation; MatrixRep.matterField compiles one to a MatterField. * Constructions: trivial, Kronecker-product and conjugate representations. * Factors: U1Factor with the charge twist (via pderiv_chargePow) and SUFactor with the fundamental representation. * Table: charge tuples over a list of factors, the representation they name, fermion and scalar rows, Table.fieldData. Consistency (Particles/StandardModel/Model/Consistency): the gauge data assembled from the factors is the existing StandardModel.localGaugeData by rfl (the carriers are JetGaugeGroupI and JetGaugeAlgebra on the nose), and the quark row reproduces QuarkDoublet.jetGaugeMatrix. The card imports only GaugeTheory; 15 fermionic and 1 bosonic species are counted by decide. Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01278bRQzZzgEJkS1zqSJmS2 --- Physlib.lean | 13 + .../GaugeTheory/LocalGaugeData/OfFactors.lean | 347 ++++++++++ .../GaugeTheory/LocalGaugeData/Prod.lean | 253 ++++++++ .../LocalGaugeData/SU/Algebra.lean | 173 +++++ .../GaugeTheory/LocalGaugeData/SU/Basic.lean | 591 +++++++++++++++++ .../GaugeTheory/LocalGaugeData/U1.lean | 354 +++++++++++ .../MatterField/MatrixRep/Basic.lean | 592 ++++++++++++++++++ .../MatterField/MatrixRep/Constructions.lean | 230 +++++++ .../MatterField/MatrixRep/Factors.lean | 270 ++++++++ .../MatterField/MatrixRep/Table.lean | 304 +++++++++ Physlib/Particles/StandardModel/Basic.lean | 107 ++++ .../StandardModel/Model/Consistency.lean | 63 ++ Physlib/Relativity/JetRing/Jacobi.lean | 93 +++ Physlib/Relativity/JetRing/Taylor.lean | 51 ++ 14 files changed, 3441 insertions(+) create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/OfFactors.lean create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Prod.lean create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/SU/Algebra.lean create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/SU/Basic.lean create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/U1.lean create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Basic.lean create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Constructions.lean create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Factors.lean create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Table.lean create mode 100644 Physlib/Particles/StandardModel/Basic.lean create mode 100644 Physlib/Particles/StandardModel/Model/Consistency.lean create mode 100644 Physlib/Relativity/JetRing/Jacobi.lean create mode 100644 Physlib/Relativity/JetRing/Taylor.lean diff --git a/Physlib.lean b/Physlib.lean index 626e3b91d..94fc582a9 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -37,8 +37,13 @@ public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.AdjointCoe public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.MaurerCartan +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.OfFactors +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Prod +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.SU.Algebra +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.SU.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.TransformsIn public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Truncation +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.U1 public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.Charge public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.CovariantDeriv @@ -46,6 +51,10 @@ public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.FieldAlgebra public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.GaugeAction public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.TransformsIn +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.MatrixRep.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.MatrixRep.Constructions +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.MatrixRep.Factors +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.MatrixRep.Table public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.Pi public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.Prod public import Physlib.ClassicalFieldTheory.Local.Variation @@ -298,6 +307,7 @@ public import Physlib.Particles.StandardModel.AnomalyCancellation.NoGrav.Basic public import Physlib.Particles.StandardModel.AnomalyCancellation.NoGrav.One.Lemmas public import Physlib.Particles.StandardModel.AnomalyCancellation.NoGrav.One.LinearParameterization public import Physlib.Particles.StandardModel.AnomalyCancellation.Permutations +public import Physlib.Particles.StandardModel.Basic public import Physlib.Particles.StandardModel.CovAlgebraRealization.Basic public import Physlib.Particles.StandardModel.CovAlgebraRealization.FermionGaugeSector.Basic public import Physlib.Particles.StandardModel.CovAlgebraRealization.FermionGaugeSector.MassWeight @@ -410,6 +420,7 @@ public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.MassDim public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.MassWeightPoly public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.Prod public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.TransformsIn +public import Physlib.Particles.StandardModel.Model.Consistency public import Physlib.Particles.StandardModel.Peeling public import Physlib.Particles.StandardModel.Representations public import Physlib.Particles.SuperSymmetry.MSSMNu.AnomalyCancellation.B3 @@ -580,7 +591,9 @@ public import Physlib.Relativity.Fermions.Weyl.Two public import Physlib.Relativity.Fermions.Weyl.Unit public import Physlib.Relativity.IsLorentzDeriv public import Physlib.Relativity.JetRing.Basic +public import Physlib.Relativity.JetRing.Jacobi public import Physlib.Relativity.JetRing.Matrix +public import Physlib.Relativity.JetRing.Taylor public import Physlib.Relativity.LightConeDeriv public import Physlib.Relativity.LorentzAlgebra.Basic public import Physlib.Relativity.LorentzAlgebra.Basis diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/OfFactors.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/OfFactors.lean new file mode 100644 index 000000000..21fe16306 --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/OfFactors.lean @@ -0,0 +1,347 @@ +/- +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.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.SU.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.U1 +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Prod +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.MatrixRep.Table +/-! +# Local gauge data from a list of factors + +## i. Overview + +A gauge group is named, as in a model-building table, by a list of symbols `U1` and +`SU n`. This file builds the local gauge data of such a list: the product, in the order of +the list, of the local gauge data `LocalGaugeData.u1` and `LocalGaugeData.su n` of the +factors. The carriers are the corresponding products of `JetU1` and `JetSU n`, and of +their Lie algebras, so that a model's gauge group is a concrete product of matrix groups. +The list of factors of the product, in the sense of the table layer, is assembled from +the canonical factors of the pieces (`Factors.factors`), and the product of faithful +packages is faithful. + +With this, a model on any gauge group built from `U(1)` and `SU(n)` factors is a table +alone: `LocalGaugeData.ofFactors Γ` is its gauge data and `Factors.factors Γ` is what its +rows are charged under. + +## ii. Key results + +- `LocalGaugeData.FactorSpec` : the symbols `U1` and `SU n`. +- `LocalGaugeData.ofFactors` : the local gauge data of a list of factors. +- `LocalGaugeData.Factors.factors` : the canonical factors of that gauge data. + +## iii. Table of contents + +- A. Factor symbols and their gauge data +- B. The carriers of a list of factors +- C. The gauge data of a list of factors +- D. The canonical factors + +-/ + +@[expose] public section + +namespace LocalGaugeData + +/-! + +## A. Factor symbols and their gauge data + +-/ + +/-- **A factor symbol**: `U(1)` or `SU(n)`. -/ +inductive FactorSpec + /-- The factor `U(1)`. -/ + | U1 + /-- The factor `SU(n)`. -/ + | SU (n : ℕ) + deriving DecidableEq, Repr + +namespace FactorSpec + +/-- The group of jets of a factor. -/ +def G : FactorSpec → Type + | .U1 => JetU1 + | .SU n => JetSU n + +/-- The Lie algebra of a factor. -/ +def 𝔤 : FactorSpec → Type + | .U1 => U1Algebra + | .SU n => SUAlgebra n + +/-- The group of a factor. -/ +def G₀ : FactorSpec → Type + | .U1 => _root_.U1 + | .SU n => _root_.SU n + +/-- The jets of the Lie algebra of a factor. -/ +def 𝔤J : FactorSpec → Type + | .U1 => JetU1Algebra + | .SU n => JetSUAlgebra n + +noncomputable instance instGroupG : (f : FactorSpec) → Group f.G + | .U1 => inferInstanceAs (Group JetU1) + | .SU n => inferInstanceAs (Group (JetSU n)) + +noncomputable instance instGroupG₀ : (f : FactorSpec) → Group f.G₀ + | .U1 => inferInstanceAs (Group _root_.U1) + | .SU n => inferInstanceAs (Group (_root_.SU n)) + +noncomputable instance instLieRing𝔤 : (f : FactorSpec) → LieRing f.𝔤 + | .U1 => inferInstanceAs (LieRing U1Algebra) + | .SU n => inferInstanceAs (LieRing (SUAlgebra n)) + +noncomputable instance instLieAlgebra𝔤 : (f : FactorSpec) → LieAlgebra ℝ f.𝔤 + | .U1 => inferInstanceAs (LieAlgebra ℝ U1Algebra) + | .SU n => inferInstanceAs (LieAlgebra ℝ (SUAlgebra n)) + +noncomputable instance instLieRing𝔤J : (f : FactorSpec) → LieRing f.𝔤J + | .U1 => inferInstanceAs (LieRing JetU1Algebra) + | .SU n => inferInstanceAs (LieRing (JetSUAlgebra n)) + +noncomputable instance instLieAlgebra𝔤J : (f : FactorSpec) → LieAlgebra ℝ f.𝔤J + | .U1 => inferInstanceAs (LieAlgebra ℝ JetU1Algebra) + | .SU n => inferInstanceAs (LieAlgebra ℝ (JetSUAlgebra n)) + +noncomputable instance instFinite𝔤 : (f : FactorSpec) → Module.Finite ℝ f.𝔤 + | .U1 => inferInstanceAs (Module.Finite ℝ U1Algebra) + | .SU n => inferInstanceAs (Module.Finite ℝ (SUAlgebra n)) + +/-- The local gauge data of a factor. -/ +noncomputable abbrev data : (f : FactorSpec) → LocalGaugeData f.G f.𝔤 f.G₀ f.𝔤J + | .U1 => u1 + | .SU n => su n + +/-- The canonical factor of the local gauge data of a factor symbol. -/ +noncomputable abbrev factor : (f : FactorSpec) → Factor f.data + | .U1 => .U1 u1Factor + | .SU n => .SU (suFactor n) + +noncomputable instance instFaithfulData : (f : FactorSpec) → f.data.Faithful + | .U1 => inferInstanceAs u1.Faithful + | .SU n => inferInstanceAs (su n).Faithful + +end FactorSpec + +/-! + +## B. The carriers of a list of factors + +The carriers of a list of factors are the products, in the order of the list, of the +carriers of the factors; a one-element list has the carriers of its factor. The carriers +are definitions rather than abbreviations, so that instance search on them goes through +the instances below rather than through the unfolded products: this keeps the instances +found at every use site identical to those inside the gauge data. + +-/ + +namespace Factors + +/-- The group of jets of a list of factors. -/ +def G : List FactorSpec → Type + | [] => Unit + | [f] => f.G + | f :: g :: gs => f.G × G (g :: gs) + +/-- The Lie algebra of a list of factors. -/ +def 𝔤 : List FactorSpec → Type + | [] => Unit + | [f] => f.𝔤 + | f :: g :: gs => f.𝔤 × 𝔤 (g :: gs) + +/-- The group of a list of factors. -/ +def G₀ : List FactorSpec → Type + | [] => Unit + | [f] => f.G₀ + | f :: g :: gs => f.G₀ × G₀ (g :: gs) + +/-- The jets of the Lie algebra of a list of factors. -/ +def 𝔤J : List FactorSpec → Type + | [] => Unit + | [f] => f.𝔤J + | f :: g :: gs => f.𝔤J × 𝔤J (g :: gs) + +instance : Bracket Unit Unit := ⟨fun _ _ => ()⟩ + +instance : LieRing Unit where + add_lie _ _ _ := rfl + lie_add _ _ _ := rfl + lie_self _ := rfl + leibniz_lie _ _ _ := rfl + +instance : LieAlgebra ℝ Unit where + lie_smul _ _ _ := rfl + +@[instance_reducible] +noncomputable def instGroupG : (Γ : List FactorSpec) → Group (G Γ) + | [] => inferInstanceAs (Group Unit) + | [f] => inferInstanceAs (Group f.G) + | f :: g :: gs => + letI := instGroupG (g :: gs) + inferInstanceAs (Group (f.G × G (g :: gs))) + +noncomputable instance (Γ : List FactorSpec) : Group (G Γ) := instGroupG Γ + +@[instance_reducible] +noncomputable def instGroupG₀ : (Γ : List FactorSpec) → Group (G₀ Γ) + | [] => inferInstanceAs (Group Unit) + | [f] => inferInstanceAs (Group f.G₀) + | f :: g :: gs => + letI := instGroupG₀ (g :: gs) + inferInstanceAs (Group (f.G₀ × G₀ (g :: gs))) + +noncomputable instance (Γ : List FactorSpec) : Group (G₀ Γ) := instGroupG₀ Γ + +@[instance_reducible] +noncomputable def instLieRing𝔤 : (Γ : List FactorSpec) → LieRing (𝔤 Γ) + | [] => inferInstanceAs (LieRing Unit) + | [f] => inferInstanceAs (LieRing f.𝔤) + | f :: g :: gs => + letI := instLieRing𝔤 (g :: gs) + inferInstanceAs (LieRing (f.𝔤 × 𝔤 (g :: gs))) + +noncomputable instance (Γ : List FactorSpec) : LieRing (𝔤 Γ) := instLieRing𝔤 Γ + +@[instance_reducible] +noncomputable def instLieAlgebra𝔤 : (Γ : List FactorSpec) → LieAlgebra ℝ (𝔤 Γ) + | [] => inferInstanceAs (LieAlgebra ℝ Unit) + | [f] => inferInstanceAs (LieAlgebra ℝ f.𝔤) + | f :: g :: gs => + letI := instLieRing𝔤 (g :: gs) + letI := instLieAlgebra𝔤 (g :: gs) + inferInstanceAs (LieAlgebra ℝ (f.𝔤 × 𝔤 (g :: gs))) + +noncomputable instance (Γ : List FactorSpec) : LieAlgebra ℝ (𝔤 Γ) := instLieAlgebra𝔤 Γ + +@[instance_reducible] +noncomputable def instLieRing𝔤J : (Γ : List FactorSpec) → LieRing (𝔤J Γ) + | [] => inferInstanceAs (LieRing Unit) + | [f] => inferInstanceAs (LieRing f.𝔤J) + | f :: g :: gs => + letI := instLieRing𝔤J (g :: gs) + inferInstanceAs (LieRing (f.𝔤J × 𝔤J (g :: gs))) + +noncomputable instance (Γ : List FactorSpec) : LieRing (𝔤J Γ) := instLieRing𝔤J Γ + +@[instance_reducible] +noncomputable def instLieAlgebra𝔤J : (Γ : List FactorSpec) → LieAlgebra ℝ (𝔤J Γ) + | [] => inferInstanceAs (LieAlgebra ℝ Unit) + | [f] => inferInstanceAs (LieAlgebra ℝ f.𝔤J) + | f :: g :: gs => + letI := instLieRing𝔤J (g :: gs) + letI := instLieAlgebra𝔤J (g :: gs) + inferInstanceAs (LieAlgebra ℝ (f.𝔤J × 𝔤J (g :: gs))) + +noncomputable instance (Γ : List FactorSpec) : LieAlgebra ℝ (𝔤J Γ) := instLieAlgebra𝔤J Γ + +instance instFinite𝔤 : (Γ : List FactorSpec) → Module.Finite ℝ (𝔤 Γ) + | [] => inferInstanceAs (Module.Finite ℝ Unit) + | [f] => inferInstanceAs (Module.Finite ℝ f.𝔤) + | f :: g :: gs => + letI := instLieRing𝔤 (g :: gs) + letI := instLieAlgebra𝔤 (g :: gs) + letI := instFinite𝔤 (g :: gs) + inferInstanceAs (Module.Finite ℝ (f.𝔤 × 𝔤 (g :: gs))) + +end Factors + +/-! + +## C. The gauge data of a list of factors + +-/ + +/-- The trivial local gauge data, of the empty list of factors. -/ +noncomputable def trivial : LocalGaugeData Unit Unit Unit Unit where + eval := 1 + ofConstant := 1 + eval_ofConstant _ := rfl + evalLie := 0 + ofConstantLie := 0 + ofConstantLie_lie _ _ := rfl + evalLie_ofConstantLie _ := rfl + deriv _ := 0 + deriv_comm _ _ _ := rfl + deriv_bracket _ _ _ := rfl + deriv_ofConstantLie _ _ := rfl + coord _ := 0 + deriv_coord _ _ _ := rfl + evalLie_coord _ _ := rfl + coord_lie _ _ _ := rfl + adjoint := 1 + adjoint_lie _ _ _ := rfl + adjointValue := 1 + evalLie_adjoint _ _ := rfl + maurerCartan _ _ := () + maurerCartan_ofConstant _ _ := rfl + maurerCartan_cocycle _ _ _ := rfl + maurerCartan_structure _ _ _ := rfl + deriv_adjoint _ _ _ := rfl + +instance instFaithfulTrivial : trivial.Faithful where + ext_of_evalLie_iteratedDeriv _ := rfl + eq_ofConstant_of_maurerCartan_eq_zero _ := rfl + +open Factors in +/-- **The local gauge data of a list of factors**: the product, in the order of the list, + of the local gauge data of the factors. -/ +noncomputable def ofFactors : (Γ : List FactorSpec) → LocalGaugeData (G Γ) (𝔤 Γ) (G₀ Γ) (𝔤J Γ) + | [] => trivial + | [f] => f.data + | f :: g :: gs => f.data.prod (ofFactors (g :: gs)) + +@[simp] +lemma ofFactors_nil : ofFactors [] = trivial := rfl + +@[simp] +lemma ofFactors_singleton (f : FactorSpec) : ofFactors [f] = f.data := rfl + +@[simp] +lemma ofFactors_cons_cons (f g : FactorSpec) (gs : List FactorSpec) : + ofFactors (f :: g :: gs) = f.data.prod (ofFactors (g :: gs)) := rfl + +/-- The local gauge data of a list of factors is faithful. -/ +noncomputable instance instFaithfulOfFactors : (Γ : List FactorSpec) → (ofFactors Γ).Faithful + | [] => inferInstanceAs trivial.Faithful + | [f] => inferInstanceAs f.data.Faithful + | f :: g :: gs => + letI := instFaithfulOfFactors (g :: gs) + inferInstanceAs (f.data.prod (ofFactors (g :: gs))).Faithful + +/-! + +## D. The canonical factors + +-/ + +variable {G₁ : Type} [Group G₁] {𝔤₁ : Type} [LieRing 𝔤₁] [LieAlgebra ℝ 𝔤₁] + {G₀₁ : Type} [Group G₀₁] {𝔤J₁ : Type} [LieRing 𝔤J₁] [LieAlgebra ℝ 𝔤J₁] + {G₂ : Type} [Group G₂] {𝔤₂ : Type} [LieRing 𝔤₂] [LieAlgebra ℝ 𝔤₂] + {G₀₂ : Type} [Group G₀₂] {𝔤J₂ : Type} [LieRing 𝔤J₂] [LieAlgebra ℝ 𝔤J₂] + {j₁ : LocalGaugeData G₁ 𝔤₁ G₀₁ 𝔤J₁} {j₂ : LocalGaugeData G₂ 𝔤₂ G₀₂ 𝔤J₂} + +/-- A factor of the first gauge data, as a factor of the product. -/ +noncomputable abbrev Factor.inl : Factor j₁ → Factor (j₁.prod j₂) + | .U1 F => .U1 F.inl + | .SU F => .SU F.inl + +/-- A factor of the second gauge data, as a factor of the product. -/ +noncomputable abbrev Factor.inr : Factor j₂ → Factor (j₁.prod j₂) + | .U1 F => .U1 F.inr + | .SU F => .SU F.inr + +/-- The factors of the second gauge data, as factors of the product. -/ +noncomputable abbrev Factors.inr : Factors j₂ → Factors (j₁.prod j₂) + | [] => [] + | F :: Fs => F.inr :: Factors.inr Fs + +/-- **The canonical factors** of the local gauge data of a list of factors. -/ +noncomputable abbrev Factors.factors : (Γ : List FactorSpec) → Factors (ofFactors Γ) + | [] => [] + | [f] => [f.factor] + | f :: g :: gs => f.factor.inl :: Factors.inr (Factors.factors (g :: gs)) + +end LocalGaugeData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Prod.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Prod.lean new file mode 100644 index 000000000..e0afbeb71 --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Prod.lean @@ -0,0 +1,253 @@ +/- +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.ClassicalFieldTheory.GaugeTheory.MatterField.MatrixRep.Factors +public import Mathlib.Algebra.Lie.Prod +/-! +# The product of local gauge data + +## i. Overview + +The local gauge data of a product of gauge groups: every structure map acts +componentwise, and every law holds componentwise. A `U(1)` or `SU(n)` factor of either +side lifts to a factor of the product, and the product of two faithful packages is +faithful. + +## ii. Key results + +- `LocalGaugeData.prod` : the product of two local gauge data. +- `U1Factor.inl`, `U1Factor.inr`, `SUFactor.inl`, `SUFactor.inr` : lifting factors to + the product. +- `LocalGaugeData.instFaithfulProd` : the product of faithful packages is faithful. + +## iii. Table of contents + +- A. Componentwise representations +- B. The product +- C. Lifting factors +- D. Faithfulness + +-/ + +@[expose] public section + +/-! + +## A. Componentwise representations + +-/ + +/-- The componentwise representation of a product group on a product space. -/ +noncomputable def Representation.prodMap {k G₁ G₂ V₁ V₂ : Type*} [CommSemiring k] + [Monoid G₁] [Monoid G₂] [AddCommMonoid V₁] [Module k V₁] [AddCommMonoid V₂] [Module k V₂] + (ρ₁ : Representation k G₁ V₁) (ρ₂ : Representation k G₂ V₂) : + Representation k (G₁ × G₂) (V₁ × V₂) where + toFun p := (ρ₁ p.1).prodMap (ρ₂ p.2) + map_one' := by + refine LinearMap.ext fun v => ?_ + simp + map_mul' p q := by + refine LinearMap.ext fun v => ?_ + simp [Module.End.mul_apply] + +@[simp] +lemma Representation.prodMap_apply {k G₁ G₂ V₁ V₂ : Type*} [CommSemiring k] + [Monoid G₁] [Monoid G₂] [AddCommMonoid V₁] [Module k V₁] [AddCommMonoid V₂] [Module k V₂] + (ρ₁ : Representation k G₁ V₁) (ρ₂ : Representation k G₂ V₂) (p : G₁ × G₂) (v : V₁ × V₂) : + Representation.prodMap ρ₁ ρ₂ p v = (ρ₁ p.1 v.1, ρ₂ p.2 v.2) := rfl + +namespace LocalGaugeData + +variable {G₁ : Type} [Group G₁] {𝔤₁ : Type} [LieRing 𝔤₁] [LieAlgebra ℝ 𝔤₁] + {G₀₁ : Type} [Group G₀₁] {𝔤J₁ : Type} [LieRing 𝔤J₁] [LieAlgebra ℝ 𝔤J₁] + {G₂ : Type} [Group G₂] {𝔤₂ : Type} [LieRing 𝔤₂] [LieAlgebra ℝ 𝔤₂] + {G₀₂ : Type} [Group G₀₂] {𝔤J₂ : Type} [LieRing 𝔤J₂] [LieAlgebra ℝ 𝔤J₂] + (j₁ : LocalGaugeData G₁ 𝔤₁ G₀₁ 𝔤J₁) (j₂ : LocalGaugeData G₂ 𝔤₂ G₀₂ 𝔤J₂) + +/-! + +## B. The product + +-/ + +/-- **The product of two local gauge data**: every structure map acts componentwise. -/ +noncomputable def prod : LocalGaugeData (G₁ × G₂) (𝔤₁ × 𝔤₂) (G₀₁ × G₀₂) (𝔤J₁ × 𝔤J₂) where + eval := j₁.eval.prodMap j₂.eval + ofConstant := j₁.ofConstant.prodMap j₂.ofConstant + eval_ofConstant g := Prod.ext (j₁.eval_ofConstant g.1) (j₂.eval_ofConstant g.2) + evalLie := j₁.evalLie.prodMap j₂.evalLie + ofConstantLie := j₁.ofConstantLie.prodMap j₂.ofConstantLie + ofConstantLie_lie a b := Prod.ext (j₁.ofConstantLie_lie a.1 b.1) (j₂.ofConstantLie_lie a.2 b.2) + evalLie_ofConstantLie a := + Prod.ext (j₁.evalLie_ofConstantLie a.1) (j₂.evalLie_ofConstantLie a.2) + deriv μ := (j₁.deriv μ).prodMap (j₂.deriv μ) + deriv_comm μ ν a := Prod.ext (j₁.deriv_comm μ ν a.1) (j₂.deriv_comm μ ν a.2) + deriv_bracket μ x y := Prod.ext (j₁.deriv_bracket μ x.1 y.1) (j₂.deriv_bracket μ x.2 y.2) + deriv_ofConstantLie μ a := + Prod.ext (j₁.deriv_ofConstantLie μ a.1) (j₂.deriv_ofConstantLie μ a.2) + coord μ := (j₁.coord μ).prodMap (j₂.coord μ) + deriv_coord μ ν a := by + by_cases h : μ = ν + · subst h + rw [if_pos rfl] + refine Prod.ext ?_ ?_ + · have := j₁.deriv_coord μ μ a.1 + rw [if_pos rfl] at this + exact this + · have := j₂.deriv_coord μ μ a.2 + rw [if_pos rfl] at this + exact this + · rw [if_neg h, add_zero] + refine Prod.ext ?_ ?_ + · have := j₁.deriv_coord μ ν a.1 + rw [if_neg h, add_zero] at this + exact this + · have := j₂.deriv_coord μ ν a.2 + rw [if_neg h, add_zero] at this + exact this + evalLie_coord μ a := Prod.ext (j₁.evalLie_coord μ a.1) (j₂.evalLie_coord μ a.2) + coord_lie μ a b := Prod.ext (j₁.coord_lie μ a.1 b.1) (j₂.coord_lie μ a.2 b.2) + adjoint := Representation.prodMap j₁.adjoint j₂.adjoint + adjoint_lie U x y := Prod.ext (j₁.adjoint_lie U.1 x.1 y.1) (j₂.adjoint_lie U.2 x.2 y.2) + adjointValue := Representation.prodMap j₁.adjointValue j₂.adjointValue + evalLie_adjoint U x := Prod.ext (j₁.evalLie_adjoint U.1 x.1) (j₂.evalLie_adjoint U.2 x.2) + maurerCartan U μ := (j₁.maurerCartan U.1 μ, j₂.maurerCartan U.2 μ) + maurerCartan_ofConstant g μ := + Prod.ext (j₁.maurerCartan_ofConstant g.1 μ) (j₂.maurerCartan_ofConstant g.2 μ) + maurerCartan_cocycle U V μ := + Prod.ext (j₁.maurerCartan_cocycle U.1 V.1 μ) (j₂.maurerCartan_cocycle U.2 V.2 μ) + maurerCartan_structure U μ ν := + Prod.ext (j₁.maurerCartan_structure U.1 μ ν) (j₂.maurerCartan_structure U.2 μ ν) + deriv_adjoint U μ x := Prod.ext (j₁.deriv_adjoint U.1 μ x.1) (j₂.deriv_adjoint U.2 μ x.2) + +@[simp] +lemma prod_eval (U : G₁ × G₂) : (j₁.prod j₂).eval U = (j₁.eval U.1, j₂.eval U.2) := rfl + +@[simp] +lemma prod_ofConstant (g : G₀₁ × G₀₂) : + (j₁.prod j₂).ofConstant g = (j₁.ofConstant g.1, j₂.ofConstant g.2) := rfl + +@[simp] +lemma prod_evalLie (a : 𝔤J₁ × 𝔤J₂) : (j₁.prod j₂).evalLie a = (j₁.evalLie a.1, j₂.evalLie a.2) := + rfl + +@[simp] +lemma prod_ofConstantLie (a : 𝔤₁ × 𝔤₂) : + (j₁.prod j₂).ofConstantLie a = (j₁.ofConstantLie a.1, j₂.ofConstantLie a.2) := rfl + +@[simp] +lemma prod_deriv (μ : Fin 1 ⊕ Fin 3) (a : 𝔤J₁ × 𝔤J₂) : + (j₁.prod j₂).deriv μ a = (j₁.deriv μ a.1, j₂.deriv μ a.2) := rfl + +@[simp] +lemma prod_adjoint (U : G₁ × G₂) (a : 𝔤J₁ × 𝔤J₂) : + (j₁.prod j₂).adjoint U a = (j₁.adjoint U.1 a.1, j₂.adjoint U.2 a.2) := rfl + +@[simp] +lemma prod_maurerCartan (U : G₁ × G₂) (μ : Fin 1 ⊕ Fin 3) : + (j₁.prod j₂).maurerCartan U μ = (j₁.maurerCartan U.1 μ, j₂.maurerCartan U.2 μ) := rfl + +@[simp] +lemma prod_iteratedDeriv (s : Multiset (Fin 1 ⊕ Fin 3)) (a : 𝔤J₁ × 𝔤J₂) : + (j₁.prod j₂).iteratedDeriv s a = (j₁.iteratedDeriv s a.1, j₂.iteratedDeriv s a.2) := by + induction s using Multiset.induction_on generalizing a with + | empty => simp + | cons μ t ih => + rw [iteratedDeriv_cons, iteratedDeriv_cons, iteratedDeriv_cons, LinearMap.comp_apply, + LinearMap.comp_apply, LinearMap.comp_apply, ih, prod_deriv] + +/-! + +## C. Lifting factors + +-/ + +variable {j₁ j₂} + +/-- A `U(1)` factor of the first gauge data, as a factor of the product. -/ +noncomputable def _root_.LocalGaugeData.U1Factor.inl (F : U1Factor j₁) : U1Factor (j₁.prod j₂) + where + u := F.u.comp (MonoidHom.fst G₁ G₂) + φ := F.φ.comp (LinearMap.fst ℝ 𝔤₁ 𝔤₂) + φJ a := F.φJ a.1 + φJ_ofConstantLie c := F.φJ_ofConstantLie c.1 + φJ_cc_foldl p a := by + rw [prod_iteratedDeriv] + exact F.φJ_cc_foldl p a.1 + φJ_maurerCartan U μ := F.φJ_maurerCartan U.1 μ + φJ_adjoint U c := F.φJ_adjoint U.1 c.1 + +/-- A `U(1)` factor of the second gauge data, as a factor of the product. -/ +noncomputable def _root_.LocalGaugeData.U1Factor.inr (F : U1Factor j₂) : U1Factor (j₁.prod j₂) + where + u := F.u.comp (MonoidHom.snd G₁ G₂) + φ := F.φ.comp (LinearMap.snd ℝ 𝔤₁ 𝔤₂) + φJ a := F.φJ a.2 + φJ_ofConstantLie c := F.φJ_ofConstantLie c.2 + φJ_cc_foldl p a := by + rw [prod_iteratedDeriv] + exact F.φJ_cc_foldl p a.2 + φJ_maurerCartan U μ := F.φJ_maurerCartan U.2 μ + φJ_adjoint U c := F.φJ_adjoint U.2 c.2 + +variable {n : Type} [Fintype n] [DecidableEq n] + +/-- An `SU(n)` factor of the first gauge data, as a factor of the product. -/ +noncomputable def _root_.LocalGaugeData.SUFactor.inl (F : SUFactor j₁ n) : + SUFactor (j₁.prod j₂) n where + u U := F.u U.1 + u_one := F.u_one + u_mul U V := F.u_mul U.1 V.1 + u_unitary U := F.u_unitary U.1 + φ := F.φ.comp (LinearMap.fst ℝ 𝔤₁ 𝔤₂) + φJ a := F.φJ a.1 + φJ_ofConstantLie c := F.φJ_ofConstantLie c.1 + φJ_cc_foldl p a := by + rw [prod_iteratedDeriv] + exact F.φJ_cc_foldl p a.1 + φJ_maurerCartan U μ := F.φJ_maurerCartan U.1 μ + φJ_adjoint U c := F.φJ_adjoint U.1 c.1 + +/-- An `SU(n)` factor of the second gauge data, as a factor of the product. -/ +noncomputable def _root_.LocalGaugeData.SUFactor.inr (F : SUFactor j₂ n) : + SUFactor (j₁.prod j₂) n where + u U := F.u U.2 + u_one := F.u_one + u_mul U V := F.u_mul U.2 V.2 + u_unitary U := F.u_unitary U.2 + φ := F.φ.comp (LinearMap.snd ℝ 𝔤₁ 𝔤₂) + φJ a := F.φJ a.2 + φJ_ofConstantLie c := F.φJ_ofConstantLie c.2 + φJ_cc_foldl p a := by + rw [prod_iteratedDeriv] + exact F.φJ_cc_foldl p a.2 + φJ_maurerCartan U μ := F.φJ_maurerCartan U.2 μ + φJ_adjoint U c := F.φJ_adjoint U.2 c.2 + +/-! + +## D. Faithfulness + +-/ + +/-- The product of two faithful packages is faithful. -/ +instance instFaithfulProd [j₁.Faithful] [j₂.Faithful] : (j₁.prod j₂).Faithful where + ext_of_evalLie_iteratedDeriv {x y} h := by + refine Prod.ext (j₁.ext_of_evalLie_iteratedDeriv fun s => ?_) + (j₂.ext_of_evalLie_iteratedDeriv fun s => ?_) + · have := congrArg Prod.fst (h s) + simpa only [prod_evalLie, prod_iteratedDeriv] using this + · have := congrArg Prod.snd (h s) + simpa only [prod_evalLie, prod_iteratedDeriv] using this + eq_ofConstant_of_maurerCartan_eq_zero {U} h := by + refine Prod.ext ?_ ?_ + · exact Faithful.eq_ofConstant_of_maurerCartan_eq_zero (jets := j₁) + (funext fun μ => congrArg Prod.fst (congrFun h μ)) + · exact Faithful.eq_ofConstant_of_maurerCartan_eq_zero (jets := j₂) + (funext fun μ => congrArg Prod.snd (congrFun h μ)) + +end LocalGaugeData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/SU/Algebra.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/SU/Algebra.lean new file mode 100644 index 000000000..9133969b3 --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/SU/Algebra.lean @@ -0,0 +1,173 @@ +/- +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 Mathlib.Algebra.Lie.Basic +public import Mathlib.Algebra.Star.SelfAdjoint +public import Mathlib.LinearAlgebra.Matrix.Trace +public import Mathlib.LinearAlgebra.UnitaryGroup +public import Mathlib.RepresentationTheory.Basic +public import Mathlib.Analysis.Complex.Basic +/-! +# The Lie algebra `su(n)` over a `*`-algebra + +## i. Overview + +The Lie algebra of `SU(n)` is the real Lie algebra of traceless hermitian `n × n` matrices, +with bracket `⁅a, b⁆ = i (a b − b a)` — the factor of `i` keeps the bracket of two hermitian +matrices hermitian. Nothing in this description depends on the entries being complex +numbers: it makes sense over any commutative `*`-algebra `R` over `ℂ`, and the two cases the +theory of jets needs are `R = ℂ` (the Lie algebra itself) and `R` the ring of formal power +series in the spacetime coordinates (its jets). `SUAlgebraOver R n` is this Lie algebra, +together with the conjugation action `a ↦ U a U†` of the unitary group of `R`. + +## ii. Key results + +- `SUAlgebraOver` : the traceless hermitian matrices as a real Lie algebra. +- `SUAlgebraOver.conj` : the conjugation representation of the unitary group. + +## iii. Table of contents + +- A. Traceless hermitian matrices +- B. The conjugation representation +- C. The bracket + +-/ + +@[expose] public section + +open Matrix + +/-! + +## A. Traceless hermitian matrices + +-/ + +/-- The submodule of traceless hermitian matrices. -/ +abbrev SUAlgebraOver.submodule (R : Type) [CommRing R] [StarRing R] [Algebra ℝ R] + [StarModule ℝ R] (n : ℕ) : Submodule ℝ (Matrix (Fin n) (Fin n) R) := + selfAdjoint.submodule ℝ (Matrix (Fin n) (Fin n) R) ⊓ + LinearMap.ker (Matrix.traceLinearMap (Fin n) ℝ R) + +/-- **The Lie algebra `su(n)` over `R`**: traceless hermitian `n × n` matrices with entries in + `R`, a real Lie algebra with bracket `i (a b − b a)`. -/ +abbrev SUAlgebraOver (R : Type) [CommRing R] [StarRing R] [Algebra ℝ R] [StarModule ℝ R] + (n : ℕ) : Type := + ↥(SUAlgebraOver.submodule R n) + +namespace SUAlgebraOver + +variable {R : Type} [CommRing R] [StarRing R] [Algebra ℝ R] [StarModule ℝ R] {n : ℕ} + +lemma mem_iff (A : Matrix (Fin n) (Fin n) R) : + A ∈ submodule R n ↔ star A = A ∧ A.trace = 0 := Iff.rfl + +/-- An element from a traceless hermitian matrix. -/ +def ofMatrix (A : Matrix (Fin n) (Fin n) R) (hA : star A = A) (hT : A.trace = 0) : + SUAlgebraOver R n := + ⟨A, hA, hT⟩ + +@[simp] +lemma ofMatrix_val (A : Matrix (Fin n) (Fin n) R) (hA : star A = A) (hT : A.trace = 0) : + (ofMatrix A hA hT).1 = A := rfl + +lemma star_val (a : SUAlgebraOver R n) : star a.1 = a.1 := a.2.1 + +lemma trace_val (a : SUAlgebraOver R n) : a.1.trace = 0 := a.2.2 + +@[ext] +lemma ext {a b : SUAlgebraOver R n} (h : a.1 = b.1) : a = b := Subtype.ext h + +/-! + +## B. The conjugation representation + +-/ + +/-- Conjugation `a ↦ U a U†` by a unitary matrix, as a real-linear map of `su(n)`. -/ +noncomputable def conjMap (U : unitaryGroup (Fin n) R) : + SUAlgebraOver R n →ₗ[ℝ] SUAlgebraOver R n where + toFun a := ofMatrix (U.1 * a.1 * star U.1) + (by rw [star_mul, star_mul, star_star, a.star_val, mul_assoc]) + (by + rw [Matrix.trace_mul_comm, ← mul_assoc, show star U.1 * U.1 = 1 from + (Unitary.mem_iff.mp U.2).1, one_mul, a.trace_val]) + map_add' a b := Subtype.ext (by simp [mul_add, add_mul]) + map_smul' r a := Subtype.ext (by simp) + +@[simp] +lemma conjMap_val (U : unitaryGroup (Fin n) R) (a : SUAlgebraOver R n) : + (conjMap U a).1 = U.1 * a.1 * star U.1 := rfl + +/-- **The conjugation representation** of the unitary group on `su(n)`. -/ +noncomputable def conj : Representation ℝ (unitaryGroup (Fin n) R) (SUAlgebraOver R n) where + toFun := conjMap + map_one' := LinearMap.ext fun a => Subtype.ext (by simp) + map_mul' U V := LinearMap.ext fun a => Subtype.ext (by simp [star_mul, mul_assoc]) + +@[simp] +lemma conj_apply_val (U : unitaryGroup (Fin n) R) (a : SUAlgebraOver R n) : + (conj U a).1 = U.1 * a.1 * star U.1 := rfl + +/-! + +## C. The bracket + +-/ + +variable [Algebra ℂ R] [StarModule ℂ R] + +/-- The bracket `i (a b − b a)`. -/ +noncomputable instance : Bracket (SUAlgebraOver R n) (SUAlgebraOver R n) where + bracket a b := ofMatrix (Complex.I • (a.1 * b.1 - b.1 * a.1)) + (by + rw [star_smul, star_sub, star_mul, star_mul, a.star_val, b.star_val, 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]) + +@[simp] +lemma bracket_val (a b : SUAlgebraOver R n) : + ⁅a, b⁆.1 = Complex.I • (a.1 * b.1 - b.1 * a.1) := rfl + +noncomputable instance : LieRing (SUAlgebraOver R n) where + add_lie a b c := Subtype.ext (by + simp only [bracket_val, Submodule.coe_add, add_mul, mul_add, smul_add, smul_sub] + abel) + lie_add a b c := Subtype.ext (by + simp only [bracket_val, Submodule.coe_add, add_mul, mul_add, smul_add, smul_sub] + abel) + lie_self a := Subtype.ext (by simp) + leibniz_lie a b c := Subtype.ext (by + simp only [bracket_val, Submodule.coe_add, mul_smul_comm, smul_mul_assoc, smul_smul, + Complex.I_mul_I, smul_sub, mul_sub, sub_mul, mul_assoc] + module) + +/-- Conjugation is an automorphism of the Lie algebra. -/ +lemma conj_lie (U : unitaryGroup (Fin n) R) (x y : SUAlgebraOver R n) : + conj U ⁅x, y⁆ = ⁅conj U x, conj U y⁆ := by + have hU : star U.1 * U.1 = 1 := (Unitary.mem_iff.mp U.2).1 + have key : ∀ X Y : Matrix (Fin n) (Fin n) R, + (U.1 * X * star U.1) * (U.1 * Y * star U.1) = U.1 * (X * Y) * star U.1 := by + intro X Y + simp only [mul_assoc] + rw [show star U.1 * (U.1 * (Y * star U.1)) = Y * star U.1 from by + rw [← mul_assoc, hU, one_mul]] + refine Subtype.ext ?_ + simp only [conj_apply_val, bracket_val, mul_smul_comm, smul_mul_assoc] + rw [key, key, mul_sub, sub_mul] + +variable [IsScalarTower ℝ ℂ R] + +noncomputable instance : LieAlgebra ℝ (SUAlgebraOver R n) where + lie_smul r a b := Subtype.ext (by + ext i j + simp only [bracket_val, Submodule.coe_smul, Matrix.smul_apply, Matrix.sub_apply, + Matrix.mul_apply] + simp only [Algebra.smul_def, mul_sub, Finset.mul_sum] + congr 1 <;> exact Finset.sum_congr rfl fun k _ => by ring) + +end SUAlgebraOver diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/SU/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/SU/Basic.lean new file mode 100644 index 000000000..db7f7a069 --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/SU/Basic.lean @@ -0,0 +1,591 @@ +/- +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.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.SU.Algebra +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.MatrixRep.Factors +public import Physlib.Relativity.JetRing.Jacobi +public import Physlib.Relativity.JetRing.Taylor +/-! +# The local gauge data of `SU(n)` + +## i. Overview + +The gauge group `SU(n)`, with its jets, its Lie algebra and the jets of its Lie algebra, +packaged as local gauge data `LocalGaugeData.su n`. The jets of gauge transformations are +the special unitary matrices of formal power series, the Lie algebra `su(n)` is the +traceless hermitian matrices (`SUAlgebraOver ℂ n`) and its jets the traceless hermitian +matrices of power series. Evaluation and the constant inclusion act entrywise, the adjoint +action is conjugation, and the Maurer–Cartan form is `i (∂_μ U) U⁻¹`, hermitian by the +differentiated unitarity relation and traceless by Jacobi's formula. + +The package comes with its canonical `SUFactor` and is faithful. + +## ii. Key results + +- `SU`, `JetSU`, `SUAlgebra`, `JetSUAlgebra` : the carriers. +- `JetSUAlgebra.mc` : the Maurer–Cartan form, with `mc_cocycle`, `mc_structure` and + `deriv_adjoint`. +- `LocalGaugeData.su` : the local gauge data of `SU(n)`. +- `LocalGaugeData.suFactor` : its canonical `SU(n)` factor. +- `LocalGaugeData.instFaithfulSU` : the package is faithful. + +## iii. Table of contents + +- A. The carriers +- B. The structure maps on the group +- C. The structure maps on the Lie algebra +- D. The Maurer–Cartan form and the identities +- E. The local gauge data +- F. The canonical factor and faithfulness + +-/ + +@[expose] public section + +open Matrix MatrixGroups MvPowerSeries + +/-! + +## A. The carriers + +-/ + +/-- The gauge group `SU(n)`. -/ +abbrev SU (n : ℕ) : Type := specialUnitaryGroup (Fin n) ℂ + +/-- Jets of `SU(n)` gauge transformations: special unitary matrices of formal power + series. -/ +abbrev JetSU (n : ℕ) : Type := specialUnitaryGroup (Fin n) JetRing + +/-- The Lie algebra `su(n)`: traceless hermitian matrices. -/ +abbrev SUAlgebra (n : ℕ) : Type := SUAlgebraOver ℂ n + +/-- Jets of the Lie algebra `su(n)`: traceless hermitian matrices of formal power series. -/ +abbrev JetSUAlgebra (n : ℕ) : Type := SUAlgebraOver JetRing n + +instance (n : ℕ) : Module.Finite ℝ (SUAlgebra n) := by infer_instance + +/-- The inclusion of the special unitary group into the unitary group. -/ +def specialUnitaryToUnitary (R : Type) [CommRing R] [StarRing R] (n : ℕ) : + specialUnitaryGroup (Fin n) R →* unitaryGroup (Fin n) R where + toFun U := ⟨U.1, (mem_specialUnitaryGroup_iff.mp U.2).1⟩ + map_one' := rfl + map_mul' _ _ := rfl + +@[simp] +lemma specialUnitaryToUnitary_val {R : Type} [CommRing R] [StarRing R] {n : ℕ} + (U : specialUnitaryGroup (Fin n) R) : (specialUnitaryToUnitary R n U).1 = U.1 := rfl + +namespace JetSU + +variable {n : ℕ} + +/-! + +## B. The structure maps on the group + +-/ + +lemma val_mul_star (U : JetSU n) : U.1 * star U.1 = 1 := + mem_unitaryGroup_iff.mp (mem_specialUnitaryGroup_iff.mp U.2).1 + +lemma star_mul_val (U : JetSU n) : star U.1 * U.1 = 1 := + mem_unitaryGroup_iff'.mp (mem_specialUnitaryGroup_iff.mp U.2).1 + +lemma det_val (U : JetSU n) : U.1.det = 1 := (mem_specialUnitaryGroup_iff.mp U.2).2 + +/-- For a special unitary matrix, the conjugate transpose is the adjugate. -/ +lemma star_val_eq_adjugate (U : JetSU n) : star U.1 = U.1.adjugate := by + calc star U.1 = star U.1 * (U.1 * U.1.adjugate) := by + rw [Matrix.mul_adjugate, det_val, one_smul, mul_one] + _ = star U.1 * U.1 * U.1.adjugate := by rw [mul_assoc] + _ = U.1.adjugate := by rw [star_mul_val, one_mul] + +/-- Entrywise inclusion of constants commutes with the conjugate transpose. -/ +lemma mapMatrix_C_star {κ : Type} [Fintype κ] [DecidableEq κ] (A : Matrix κ κ ℂ) : + (C : ℂ →+* JetRing).mapMatrix (star A) = star ((C : ℂ →+* JetRing).mapMatrix A) := by + ext i j + simp [RingHom.mapMatrix_apply, Matrix.map_apply, Matrix.star_apply] + +/-- Evaluation of a jet of an `SU(n)` gauge transformation at the base point: the entrywise + constant coefficient. -/ +noncomputable def eval : JetSU n →* SU 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 + (JetRing.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) + +@[simp] +lemma eval_val (U : JetSU n) : (eval U).1 = (constantCoeff : JetRing →+* ℂ).mapMatrix U.1 := rfl + +/-- The jet of a constant `SU(n)` gauge transformation: the entrywise inclusion of + constants. -/ +noncomputable def ofConstant : SU n →* JetSU n 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) + +@[simp] +lemma ofConstant_val (u : SU n) : (ofConstant u).1 = (C : ℂ →+* JetRing).mapMatrix u.1 := rfl + +@[simp] +lemma eval_ofConstant (g : SU n) : eval (ofConstant g) = g := by + refine Subtype.ext ?_ + ext i j + simp [RingHom.mapMatrix_apply, Matrix.map_apply] + +/-- The entrywise derivative commutes with the conjugate transpose. -/ +lemma star_map_pderiv {κ : Type} [Fintype κ] (μ : Fin 1 ⊕ Fin 3) (A : Matrix κ κ JetRing) : + 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 + +/-- The entrywise derivative of the conjugate transpose of a unitary matrix, through the + differentiated unitarity relation. -/ +lemma map_pderiv_star_val (μ : Fin 1 ⊕ Fin 3) (U : JetSU n) : + (star U.1).map (pderiv ℂ μ) = -(star U.1 * U.1.map (pderiv ℂ μ) * star U.1) := by + have h1 : U.1 * (star U.1).map (pderiv ℂ μ) = -(U.1.map (pderiv ℂ μ) * star U.1) := + eq_neg_of_add_eq_zero_right (by + rw [← JetRing.matrix_map_pderiv_mul, val_mul_star] + exact Matrix.ext fun i j => by + simp [Matrix.map_apply, Matrix.one_apply, apply_ite (pderiv ℂ μ)]) + calc (star U.1).map (pderiv ℂ μ) + = star U.1 * U.1 * (star U.1).map (pderiv ℂ μ) := by rw [star_mul_val, one_mul] + _ = -(star U.1 * U.1.map (pderiv ℂ μ) * star U.1) := by + rw [mul_assoc, h1, mul_neg, ← mul_assoc] + +/-- The Maurer–Cartan matrix `i (∂_μ U) U†` is hermitian. -/ +lemma star_mcMatrix (μ : Fin 1 ⊕ Fin 3) (U : JetSU n) : + star (Complex.I • (U.1.map (pderiv ℂ μ) * star U.1)) + = Complex.I • (U.1.map (pderiv ℂ μ) * star U.1) := by + rw [star_smul, star_mul, star_star, star_map_pderiv, map_pderiv_star_val, Complex.star_def, + Complex.conj_I, neg_smul, mul_neg, smul_neg, neg_neg, ← mul_assoc, ← mul_assoc, + val_mul_star, one_mul] + +/-- The Maurer–Cartan matrix `i (∂_μ U) U†` is traceless, by Jacobi's formula and + `det U = 1`. -/ +lemma trace_mcMatrix (μ : Fin 1 ⊕ Fin 3) (U : JetSU n) : + (Complex.I • (U.1.map (pderiv ℂ μ) * star U.1)).trace = 0 := by + rw [Matrix.trace_smul, star_val_eq_adjugate, ← JetRing.jacobi, det_val, pderiv_one, + smul_zero] + +end JetSU + +namespace JetSUAlgebra + +variable {n : ℕ} + +/-! + +## C. The structure maps on the Lie algebra + +-/ + +/-- The formal derivative in the direction `μ`, entrywise. -/ +noncomputable def deriv (μ : Fin 1 ⊕ Fin 3) : JetSUAlgebra n →ₗ[ℝ] JetSUAlgebra n where + toFun a := SUAlgebraOver.ofMatrix (a.1.map (pderiv ℂ μ)) + (by rw [JetSU.star_map_pderiv, a.star_val]) + (by rw [← AddMonoidHom.map_trace, a.trace_val, map_zero]) + map_add' a b := Subtype.ext (by + ext i j : 1 + simp [Matrix.map_apply]) + map_smul' r a := Subtype.ext (by + ext i j : 1 + simp only [SUAlgebraOver.ofMatrix_val, Submodule.coe_smul, Matrix.map_apply, + Matrix.smul_apply, RingHom.id_apply] + rw [← algebraMap_smul ℂ r, Derivation.map_smul, algebraMap_smul]) + +@[simp] +lemma deriv_val (μ : Fin 1 ⊕ Fin 3) (a : JetSUAlgebra n) : + (deriv μ a).1 = a.1.map (pderiv ℂ μ) := rfl + +/-- Multiplication by the coordinate `x_μ`, entrywise. -/ +noncomputable def coord (μ : Fin 1 ⊕ Fin 3) : JetSUAlgebra n →ₗ[ℝ] JetSUAlgebra n where + toFun a := SUAlgebraOver.ofMatrix ((X μ : JetRing) • a.1) + (by rw [star_smul, JetRing.star_X, a.star_val]) + (by rw [Matrix.trace_smul, a.trace_val, smul_zero]) + map_add' a b := Subtype.ext (by simp [smul_add]) + map_smul' r a := Subtype.ext (by simp [smul_comm r]) + +@[simp] +lemma coord_val (μ : Fin 1 ⊕ Fin 3) (a : JetSUAlgebra n) : + (coord μ a).1 = (X μ : JetRing) • a.1 := rfl + +lemma mapMatrix_constantCoeff_smul {κ : Type} [Fintype κ] [DecidableEq κ] (c : ℂ) + (M : Matrix κ κ JetRing) : + (constantCoeff : JetRing →+* ℂ).mapMatrix (c • M) + = c • (constantCoeff : JetRing →+* ℂ).mapMatrix M := by + ext i j + simp [RingHom.mapMatrix_apply, Matrix.map_apply] + +lemma star_mapMatrix_constantCoeff (a : JetSUAlgebra n) : + star ((constantCoeff : JetRing →+* ℂ).mapMatrix a.1) + = (constantCoeff : JetRing →+* ℂ).mapMatrix a.1 := by + rw [← JetRing.mapMatrix_constantCoeff_star, a.star_val] + +lemma trace_mapMatrix_constantCoeff (a : JetSUAlgebra n) : + ((constantCoeff : JetRing →+* ℂ).mapMatrix a.1).trace = 0 := by + rw [RingHom.mapMatrix_apply, ← AddMonoidHom.map_trace, a.trace_val, map_zero] + +/-- Evaluation at the base point: the entrywise constant coefficient, a morphism of Lie + algebras. -/ +noncomputable def evalLie : JetSUAlgebra n →ₗ⁅ℝ⁆ SUAlgebra n where + toFun a := SUAlgebraOver.ofMatrix ((constantCoeff : JetRing →+* ℂ).mapMatrix a.1) + (star_mapMatrix_constantCoeff a) (trace_mapMatrix_constantCoeff a) + map_add' a b := Subtype.ext (by + simp only [SUAlgebraOver.ofMatrix_val, Submodule.coe_add] + exact map_add _ _ _) + map_smul' r a := Subtype.ext (by + simp only [SUAlgebraOver.ofMatrix_val, Submodule.coe_smul, RingHom.id_apply] + ext i j + simp only [RingHom.mapMatrix_apply, Matrix.map_apply, Matrix.smul_apply] + rw [← algebraMap_smul ℂ r, constantCoeff_smul, algebraMap_smul]) + map_lie' := by + intro a b + refine Subtype.ext ?_ + simp only [SUAlgebraOver.ofMatrix_val, SUAlgebraOver.bracket_val] + rw [mapMatrix_constantCoeff_smul, map_sub, map_mul, map_mul] + +@[simp] +lemma evalLie_val (a : JetSUAlgebra n) : + (evalLie a).1 = (constantCoeff : JetRing →+* ℂ).mapMatrix a.1 := rfl + +lemma C_smul (r : ℝ) (x : ℂ) : (C (r • x) : JetRing) = r • C x := by + rw [Algebra.smul_def, Algebra.smul_def, map_mul, MvPowerSeries.algebraMap_apply] + +lemma star_mapMatrix_C (a : SUAlgebra n) : + star ((C : ℂ →+* JetRing).mapMatrix a.1) = (C : ℂ →+* JetRing).mapMatrix a.1 := by + rw [← JetSU.mapMatrix_C_star, a.star_val] + +lemma trace_mapMatrix_C (a : SUAlgebra n) : ((C : ℂ →+* JetRing).mapMatrix a.1).trace = 0 := by + rw [RingHom.mapMatrix_apply, ← AddMonoidHom.map_trace, a.trace_val, map_zero] + +/-- A constant as a jet: the entrywise constant power series. -/ +noncomputable def ofConstantLie : SUAlgebra n →ₗ[ℝ] JetSUAlgebra n where + toFun a := SUAlgebraOver.ofMatrix ((C : ℂ →+* JetRing).mapMatrix a.1) + (star_mapMatrix_C a) (trace_mapMatrix_C a) + map_add' a b := Subtype.ext (by + simp only [SUAlgebraOver.ofMatrix_val, Submodule.coe_add] + exact map_add _ _ _) + map_smul' r a := Subtype.ext (by + simp only [SUAlgebraOver.ofMatrix_val, Submodule.coe_smul, RingHom.id_apply] + ext i j : 1 + simp only [RingHom.mapMatrix_apply, Matrix.map_apply, Matrix.smul_apply] + exact C_smul r _) + +@[simp] +lemma ofConstantLie_val (a : SUAlgebra n) : + (ofConstantLie a).1 = (C : ℂ →+* JetRing).mapMatrix a.1 := rfl + +lemma mapMatrix_C_smul {κ : Type} [Fintype κ] [DecidableEq κ] (c : ℂ) (M : Matrix κ κ ℂ) : + (C : ℂ →+* JetRing).mapMatrix (c • M) = c • (C : ℂ →+* JetRing).mapMatrix M := by + ext i j : 1 + simp only [RingHom.mapMatrix_apply, Matrix.map_apply, Matrix.smul_apply, + MvPowerSeries.smul_eq_C_mul, smul_eq_mul, map_mul] + +/-- The constant inclusion is a morphism of Lie algebras. -/ +lemma ofConstantLie_lie (a b : SUAlgebra n) : + ofConstantLie ⁅a, b⁆ = ⁅ofConstantLie a, ofConstantLie b⁆ := by + refine Subtype.ext ?_ + simp only [ofConstantLie_val, SUAlgebraOver.bracket_val] + rw [mapMatrix_C_smul, map_sub, map_mul, map_mul] + +@[simp] +lemma evalLie_ofConstantLie (a : SUAlgebra n) : evalLie (ofConstantLie a) = a := by + refine Subtype.ext ?_ + ext i j + simp [RingHom.mapMatrix_apply, Matrix.map_apply, constantCoeff_C] + +/-- The adjoint action `a ↦ U a U†` of the jets of `SU(n)` on the jets of `su(n)`. -/ +noncomputable def adjoint : Representation ℝ (JetSU n) (JetSUAlgebra n) := + (SUAlgebraOver.conj (R := JetRing)).comp (specialUnitaryToUnitary JetRing n) + +@[simp] +lemma adjoint_val (U : JetSU n) (a : JetSUAlgebra n) : + (adjoint U a).1 = U.1 * a.1 * star U.1 := rfl + +/-- The adjoint action `a ↦ U a U†` of `SU(n)` on `su(n)`. -/ +noncomputable def adjointValue : Representation ℝ (SU n) (SUAlgebra n) := + (SUAlgebraOver.conj (R := ℂ)).comp (specialUnitaryToUnitary ℂ n) + +@[simp] +lemma adjointValue_val (U : SU n) (a : SUAlgebra n) : + (adjointValue U a).1 = U.1 * a.1 * star U.1 := rfl + +/-! + +## D. The Maurer–Cartan form and the identities + +-/ + +/-- The Maurer–Cartan form `i (∂_μ U) U†` of an `SU(n)` gauge jet. -/ +noncomputable def mc (U : JetSU n) (μ : Fin 1 ⊕ Fin 3) : JetSUAlgebra n := + SUAlgebraOver.ofMatrix (Complex.I • (U.1.map (pderiv ℂ μ) * star U.1)) + (JetSU.star_mcMatrix μ U) (JetSU.trace_mcMatrix μ U) + +@[simp] +lemma mc_val (U : JetSU n) (μ : Fin 1 ⊕ Fin 3) : + (mc U μ).1 = Complex.I • (U.1.map (pderiv ℂ μ) * star U.1) := rfl + +lemma deriv_comm (μ ν : Fin 1 ⊕ Fin 3) (a : JetSUAlgebra n) : + deriv μ (deriv ν a) = deriv ν (deriv μ a) := by + refine Subtype.ext ?_ + ext i j : 1 + simp [Matrix.map_apply, JetRing.pderiv_comm μ ν] + +/-- Pulling a complex scalar out of the entrywise derivative. -/ +lemma map_pderiv_smul {κ : Type} (μ : Fin 1 ⊕ Fin 3) (c : ℂ) (M : Matrix κ κ JetRing) : + (c • M).map (pderiv ℂ μ) = c • M.map (pderiv ℂ μ) := + Matrix.ext fun _ _ => Derivation.map_smul _ _ _ + +lemma map_pderiv_sub {κ : Type} (μ : Fin 1 ⊕ Fin 3) (M N : Matrix κ κ JetRing) : + (M - N).map (pderiv ℂ μ) = M.map (pderiv ℂ μ) - N.map (pderiv ℂ μ) := by + ext i j : 1 + simp only [Matrix.map_apply, Matrix.sub_apply, map_sub] + +/-- The derivative is a derivation of the bracket. -/ +lemma deriv_bracket (μ : Fin 1 ⊕ Fin 3) (x y : JetSUAlgebra n) : + deriv μ ⁅x, y⁆ = ⁅deriv μ x, y⁆ + ⁅x, deriv μ y⁆ := by + refine Subtype.ext ?_ + simp only [deriv_val, SUAlgebraOver.bracket_val, Submodule.coe_add, map_pderiv_smul, + map_pderiv_sub, JetRing.matrix_map_pderiv_mul] + rw [← smul_add] + congr 1 + abel + +@[simp] +lemma deriv_ofConstantLie (μ : Fin 1 ⊕ Fin 3) (a : SUAlgebra n) : + deriv μ (ofConstantLie a) = 0 := by + refine Subtype.ext ?_ + ext i j : 1 + simp [Matrix.map_apply, RingHom.mapMatrix_apply, pderiv_C] + +/-- The Leibniz rule for a coordinate: `∂_μ (x_ν a) = x_ν ∂_μ a + δ_{μν} a`. -/ +lemma deriv_coord (μ ν : Fin 1 ⊕ Fin 3) (a : JetSUAlgebra n) : + deriv μ (coord ν a) = coord ν (deriv μ a) + if μ = ν then a else 0 := by + by_cases h : μ = ν + · subst h + rw [if_pos rfl] + refine Subtype.ext ?_ + ext i j + simp only [deriv_val, coord_val, Submodule.coe_add, Matrix.map_apply, Matrix.smul_apply, + Matrix.add_apply, smul_eq_mul, Derivation.leibniz, pderiv_X_self] + ring + · rw [if_neg h, add_zero] + refine Subtype.ext ?_ + ext i j + simp only [deriv_val, coord_val, Matrix.map_apply, Matrix.smul_apply, smul_eq_mul, + Derivation.leibniz, pderiv_X_of_ne (Ne.symm h), mul_zero, add_zero] + +/-- A coordinate vanishes at the base point. -/ +lemma evalLie_coord (μ : Fin 1 ⊕ Fin 3) (a : JetSUAlgebra n) : evalLie (coord μ a) = 0 := by + refine Subtype.ext ?_ + ext i j + simp [RingHom.mapMatrix_apply, Matrix.map_apply, Matrix.smul_apply] + +/-- The coordinates are central for the bracket. -/ +lemma coord_lie (μ : Fin 1 ⊕ Fin 3) (a b : JetSUAlgebra n) : + ⁅coord μ a, b⁆ = coord μ ⁅a, b⁆ := by + refine Subtype.ext ?_ + simp only [SUAlgebraOver.bracket_val, coord_val, Matrix.smul_mul, Matrix.mul_smul, smul_sub, + smul_comm (X μ : JetRing) Complex.I] + +lemma adjoint_lie (U : JetSU n) (x y : JetSUAlgebra n) : + adjoint U ⁅x, y⁆ = ⁅adjoint U x, adjoint U y⁆ := + SUAlgebraOver.conj_lie _ x y + +/-- At the base point the adjoint action of a jet is the adjoint action of its value. -/ +lemma evalLie_adjoint (U : JetSU n) (x : JetSUAlgebra n) : + evalLie (adjoint U x) = adjointValue (JetSU.eval U) (evalLie x) := by + refine Subtype.ext ?_ + simp only [evalLie_val, adjoint_val, adjointValue_val, JetSU.eval_val, map_mul, + JetRing.mapMatrix_constantCoeff_star] + +@[simp] +lemma mc_ofConstant (g : SU n) (μ : Fin 1 ⊕ Fin 3) : mc (JetSU.ofConstant g) μ = 0 := by + refine Subtype.ext ?_ + ext i j : 1 + simp [Matrix.mul_apply, Matrix.map_apply, RingHom.mapMatrix_apply, pderiv_C] + +/-- The Maurer–Cartan form is a cocycle for the adjoint action. -/ +lemma mc_cocycle (U V : JetSU n) (μ : Fin 1 ⊕ Fin 3) : + mc (U * V) μ = mc U μ + adjoint U (mc V μ) := by + refine Subtype.ext ?_ + simp only [mc_val, Submodule.coe_add, adjoint_val, Submonoid.coe_mul] + rw [JetRing.matrix_map_pderiv_mul, star_mul, add_mul, smul_add, mul_smul_comm, + smul_mul_assoc] + congr 1 + · rw [mul_assoc, ← mul_assoc V.1, JetSU.val_mul_star, one_mul] + · simp only [mul_assoc] + +/-- The Maurer–Cartan form is flat: `∂_μ ω_ν − ∂_ν ω_μ + ⁅ω_μ, ω_ν⁆ = 0`. -/ +lemma mc_structure (U : JetSU n) (μ ν : Fin 1 ⊕ Fin 3) : + deriv μ (mc U ν) - deriv ν (mc U μ) + ⁅mc U μ, mc U ν⁆ = 0 := by + set A := U.1 with hA + have key : (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 + rw [JetRing.matrix_map_pderiv_mul, JetRing.matrix_map_pderiv_mul, + show (A.map (pderiv ℂ ν)).map (pderiv ℂ μ) = (A.map (pderiv ℂ μ)).map (pderiv ℂ ν) + from Matrix.ext fun _ _ => JetRing.pderiv_comm μ ν _, + JetSU.map_pderiv_star_val μ, JetSU.map_pderiv_star_val ν] + simp only [mul_neg, ← mul_assoc] + abel + have hcancel : ∀ P Q : Matrix (Fin n) (Fin n) JetRing, (P - Q) + (-P - -Q) = 0 := + fun P Q => by abel + refine Subtype.ext ?_ + simp only [Submodule.coe_add, Submodule.coe_sub, deriv_val, SUAlgebraOver.bracket_val, mc_val, + map_pderiv_smul, smul_mul_smul_comm, Submodule.coe_zero] + rw [← smul_sub, key, Complex.I_mul_I, neg_one_smul, neg_one_smul, ← smul_add, hcancel, + smul_zero] + +/-- The derivative of the adjoint action: `∂_μ (Ad_U x) = Ad_U (∂_μ x) − ⁅ω_μ(U), Ad_U x⁆`. -/ +lemma deriv_adjoint (U : JetSU n) (μ : Fin 1 ⊕ Fin 3) (x : JetSUAlgebra n) : + deriv μ (adjoint U x) = adjoint U (deriv μ x) - ⁅mc U μ, adjoint U x⁆ := by + set V := U.1 with hV + have hVV : star V * V = 1 := JetSU.star_mul_val U + have hq : (star V).map (pderiv ℂ μ) = -(star V * V.map (pderiv ℂ μ) * star V) := + JetSU.map_pderiv_star_val μ U + refine Subtype.ext ?_ + simp only [deriv_val, adjoint_val, Submodule.coe_sub, SUAlgebraOver.bracket_val, mc_val] + rw [JetRing.matrix_map_pderiv_mul, JetRing.matrix_map_pderiv_mul, 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 + +end JetSUAlgebra + +/-! + +## E. The local gauge data + +-/ + +namespace LocalGaugeData + +/-- **The local gauge data of `SU(n)`**: special unitary jets, traceless hermitian jets + with the bracket `i (a b − b a)` and the conjugation action, and the Maurer–Cartan form + `i (∂_μ U) U⁻¹`. -/ +noncomputable def su (n : ℕ) : LocalGaugeData (JetSU n) (SUAlgebra n) (SU n) (JetSUAlgebra n) + where + eval := JetSU.eval + ofConstant := JetSU.ofConstant + eval_ofConstant := JetSU.eval_ofConstant + evalLie := JetSUAlgebra.evalLie + ofConstantLie := JetSUAlgebra.ofConstantLie + ofConstantLie_lie := JetSUAlgebra.ofConstantLie_lie + evalLie_ofConstantLie := JetSUAlgebra.evalLie_ofConstantLie + deriv := JetSUAlgebra.deriv + deriv_comm := JetSUAlgebra.deriv_comm + deriv_bracket := JetSUAlgebra.deriv_bracket + deriv_ofConstantLie := JetSUAlgebra.deriv_ofConstantLie + coord := JetSUAlgebra.coord + deriv_coord := JetSUAlgebra.deriv_coord + evalLie_coord := JetSUAlgebra.evalLie_coord + coord_lie := JetSUAlgebra.coord_lie + adjoint := JetSUAlgebra.adjoint + adjoint_lie := JetSUAlgebra.adjoint_lie + adjointValue := JetSUAlgebra.adjointValue + evalLie_adjoint := JetSUAlgebra.evalLie_adjoint + maurerCartan := JetSUAlgebra.mc + maurerCartan_ofConstant := JetSUAlgebra.mc_ofConstant + maurerCartan_cocycle := JetSUAlgebra.mc_cocycle + maurerCartan_structure := JetSUAlgebra.mc_structure + deriv_adjoint := JetSUAlgebra.deriv_adjoint + +variable {n : ℕ} + +@[simp] lemma su_eval : (su n).eval = JetSU.eval := rfl +@[simp] lemma su_ofConstant : (su n).ofConstant = JetSU.ofConstant := rfl +@[simp] lemma su_evalLie : (su n).evalLie = JetSUAlgebra.evalLie := rfl +@[simp] lemma su_ofConstantLie : (su n).ofConstantLie = JetSUAlgebra.ofConstantLie := rfl +@[simp] lemma su_deriv (μ : Fin 1 ⊕ Fin 3) : (su n).deriv μ = JetSUAlgebra.deriv μ := rfl +@[simp] lemma su_adjoint : (su n).adjoint = JetSUAlgebra.adjoint := rfl +@[simp] lemma su_maurerCartan : (su n).maurerCartan = JetSUAlgebra.mc := rfl + +/-- The iterated derivative on `su(n)` jets is the entrywise iterated formal derivative. -/ +lemma su_iteratedDeriv_val (s : Multiset (Fin 1 ⊕ Fin 3)) (a : JetSUAlgebra n) : + ((su n).iteratedDeriv s a).1 = a.1.map fun f => s.foldl (fun h ρ => pderiv ℂ ρ h) f := by + induction s using Multiset.induction_on generalizing a with + | empty => + rw [iteratedDeriv_zero, LinearMap.id_apply] + ext i j : 1 + simp [Matrix.map_apply] + | cons μ t ih => + rw [iteratedDeriv_cons, LinearMap.comp_apply, su_deriv, JetSUAlgebra.deriv_val, ih, + Matrix.map_map] + ext i j : 1 + simp only [Matrix.map_apply, Function.comp_apply, Multiset.foldl_cons] + exact (JetRing.foldl_pderiv_pderiv t μ _).symm + +/-- The base-point value of the iterated derivative on `su(n)` jets, entrywise. -/ +lemma su_evalLie_iteratedDeriv_val (s : Multiset (Fin 1 ⊕ Fin 3)) (a : JetSUAlgebra n) : + ((su n).evalLie ((su n).iteratedDeriv s a)).1 + = a.1.map fun f => constantCoeff (s.foldl (fun h ρ => pderiv ℂ ρ h) f) := by + rw [su_evalLie, JetSUAlgebra.evalLie_val, su_iteratedDeriv_val, RingHom.mapMatrix_apply, + Matrix.map_map] + rfl + +/-! + +## F. The canonical factor and faithfulness + +-/ + +/-- The canonical `SU(n)` factor of the local gauge data of `SU(n)`. -/ +noncomputable def suFactor (n : ℕ) : SUFactor (su n) (Fin n) where + u U := U.1 + u_one := rfl + u_mul _ _ := rfl + u_unitary := JetSU.star_mul_val + φ := (SUAlgebraOver.submodule ℂ n).subtype + φJ a := a.1 + φJ_ofConstantLie _ := rfl + φJ_cc_foldl p a := (su_evalLie_iteratedDeriv_val p a).symm + φJ_maurerCartan _ _ := rfl + φJ_adjoint _ _ := rfl + +/-- The local gauge data of `SU(n)` is faithful. -/ +instance instFaithfulSU : (su n).Faithful where + ext_of_evalLie_iteratedDeriv {x y} h := by + refine Subtype.ext (Matrix.ext fun i j => ?_) + refine JetRing.ext_of_constantCoeff_foldl_pderiv fun s => ?_ + have hs := congrArg (fun a : SUAlgebra n => a.1 i j) (h s) + simpa only [su_evalLie_iteratedDeriv_val, Matrix.map_apply] using hs + eq_ofConstant_of_maurerCartan_eq_zero {U} h := by + have hd : ∀ μ, U.1.map (pderiv ℂ μ) = 0 := fun μ => by + have h1 : Complex.I • (U.1.map (pderiv ℂ μ) * star U.1) = 0 := + congrArg Subtype.val (congrFun h μ) + have h2 : U.1.map (pderiv ℂ μ) * star U.1 = 0 := by + have := congrArg (fun M => (-Complex.I) • M) h1 + simpa [smul_smul, Complex.I_mul_I] using this + calc U.1.map (pderiv ℂ μ) + = U.1.map (pderiv ℂ μ) * (star U.1 * U.1) := by rw [JetSU.star_mul_val, mul_one] + _ = 0 := by rw [← mul_assoc, h2, zero_mul] + refine Subtype.ext (Matrix.ext fun i j => ?_) + show U.1 i j = C (constantCoeff (U.1 i j)) + exact JetRing.eq_C_of_pderiv_eq_zero fun μ => congrArg (fun M => M i j) (hd μ) + +end LocalGaugeData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/U1.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/U1.lean new file mode 100644 index 000000000..6feaf07e9 --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/U1.lean @@ -0,0 +1,354 @@ +/- +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.ClassicalFieldTheory.GaugeTheory.MatterField.MatrixRep.Factors +public import Physlib.Relativity.JetRing.Taylor +/-! +# The local gauge data of `U(1)` + +## i. Overview + +The abelian gauge group `U(1)`, with its jets, its Lie algebra and the jets of its Lie +algebra, packaged as local gauge data `LocalGaugeData.u1`. The jets of gauge +transformations are the unitary formal power series, the Lie algebra is the self-adjoint +(real) scalars and its jets the self-adjoint power series, with vanishing bracket and +trivial adjoint action. The Maurer–Cartan form is `i (∂_μ u) u⁻¹`. + +The package comes with its canonical `U1Factor` and is faithful. + +## ii. Key results + +- `U1`, `JetU1`, `U1Algebra`, `JetU1Algebra` : the carriers. +- `LocalGaugeData.u1` : the local gauge data of `U(1)`. +- `LocalGaugeData.u1Factor` : its canonical `U(1)` factor. +- `LocalGaugeData.instFaithfulU1` : the package is faithful. + +## iii. Table of contents + +- A. The carriers +- B. The structure maps +- C. The Maurer–Cartan form +- D. The local gauge data +- E. The canonical factor and faithfulness + +-/ + +@[expose] public section + +open MvPowerSeries + +/-! + +## A. The carriers + +-/ + +/-- The gauge group `U(1)`. -/ +abbrev U1 : Type := ↥(unitary ℂ) + +/-- Jets of `U(1)` gauge transformations: unitary formal power series. -/ +abbrev JetU1 : Type := ↥(unitary JetRing) + +/-- The Lie algebra `u(1)` over a `*`-ring: the self-adjoint elements, with vanishing + bracket. -/ +abbrev U1AlgebraOver (R : Type) [Ring R] [StarRing R] : Type := ↥(selfAdjoint R) + +/-- The Lie algebra `u(1)`: the self-adjoint (real) scalars. -/ +abbrev U1Algebra : Type := U1AlgebraOver ℂ + +/-- Jets of the Lie algebra `u(1)`: the self-adjoint formal power series. -/ +abbrev JetU1Algebra : Type := U1AlgebraOver JetRing + +namespace U1AlgebraOver + +variable {R : Type} [CommRing R] [StarRing R] + +instance : Bracket (U1AlgebraOver R) (U1AlgebraOver R) := ⟨fun _ _ => 0⟩ + +@[simp] +lemma bracket_eq_zero (a b : U1AlgebraOver R) : ⁅a, b⁆ = 0 := rfl + +instance : LieRing (U1AlgebraOver R) where + add_lie _ _ _ := by simp + lie_add _ _ _ := by simp + lie_self _ := rfl + leibniz_lie _ _ _ := by simp + +instance [Algebra ℝ R] [StarModule ℝ R] : LieAlgebra ℝ (U1AlgebraOver R) where + lie_smul _ _ _ := by simp + +end U1AlgebraOver + +instance : Module.Finite ℝ U1Algebra := + inferInstanceAs (Module.Finite ℝ (selfAdjoint.submodule ℝ ℂ)) + +namespace JetU1 + +/-! + +## B. The structure maps + +-/ + +/-- Evaluation of a jet of a `U(1)` gauge transformation at the base point. -/ +noncomputable def eval : JetU1 →* U1 where + toFun u := ⟨constantCoeff u.1, by + obtain ⟨h1, h2⟩ := Unitary.mem_iff.mp u.2 + exact Unitary.mem_iff.mpr + ⟨by rw [← JetRing.constantCoeff_star, ← map_mul, h1, map_one], + by rw [← JetRing.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) + +@[simp] +lemma eval_val (u : JetU1) : (eval u : ℂ) = constantCoeff (u : JetRing) := rfl + +/-- The jet of a constant `U(1)` gauge transformation. -/ +noncomputable def ofConstant : U1 →* JetU1 where + toFun u := ⟨C u.1, by + obtain ⟨h1, h2⟩ := Unitary.mem_iff.mp u.2 + exact Unitary.mem_iff.mpr + ⟨by rw [JetRing.star_C, ← map_mul, h1, map_one], + by rw [JetRing.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) + +@[simp] +lemma ofConstant_val (u : U1) : (ofConstant u : JetRing) = C (u : ℂ) := rfl + +@[simp] +lemma eval_ofConstant (u : U1) : eval (ofConstant u) = u := + Subtype.ext (constantCoeff_C u.1) + +/-- The formal derivative of a `u(1)` jet. -/ +noncomputable def deriv (μ : Fin 1 ⊕ Fin 3) : JetU1Algebra →ₗ[ℝ] JetU1Algebra where + toFun a := ⟨pderiv ℂ μ a.1, by + show star (pderiv ℂ μ a.1) = pderiv ℂ μ a.1 + rw [← JetRing.pderiv_star, a.2]⟩ + map_add' a b := Subtype.ext (map_add _ _ _) + map_smul' r a := Subtype.ext (by + show pderiv ℂ μ (r • a.1) = r • pderiv ℂ μ a.1 + rw [← algebraMap_smul ℂ r, Derivation.map_smul, algebraMap_smul]) + +@[simp] +lemma deriv_val (μ : Fin 1 ⊕ Fin 3) (a : JetU1Algebra) : (deriv μ a : JetRing) = pderiv ℂ μ a := + rfl + +/-- Multiplication of a `u(1)` jet by the coordinate `x_μ`. -/ +noncomputable def coord (μ : Fin 1 ⊕ Fin 3) : JetU1Algebra →ₗ[ℝ] JetU1Algebra where + toFun a := ⟨(X μ : JetRing) * a.1, by + show star ((X μ : JetRing) * a.1) = (X μ : JetRing) * a.1 + rw [star_mul', JetRing.star_X, a.2]⟩ + map_add' a b := Subtype.ext (mul_add _ _ _) + map_smul' r a := Subtype.ext (mul_smul_comm _ _ _) + +@[simp] +lemma coord_val (μ : Fin 1 ⊕ Fin 3) (a : JetU1Algebra) : + (coord μ a : JetRing) = (X μ : JetRing) * a := rfl + +/-- Evaluation of a `u(1)` jet at the base point. -/ +noncomputable def evalLie : JetU1Algebra →ₗ⁅ℝ⁆ U1Algebra where + toFun a := ⟨constantCoeff a.1, by + show star (constantCoeff a.1) = constantCoeff a.1 + rw [← JetRing.constantCoeff_star, a.2]⟩ + map_add' a b := Subtype.ext (map_add _ _ _) + map_smul' r a := Subtype.ext (by + show constantCoeff (r • a.1) = r • constantCoeff a.1 + rw [← algebraMap_smul ℂ r, constantCoeff_smul, algebraMap_smul]) + map_lie' := by intro a b; simp + +@[simp] +lemma evalLie_val (a : JetU1Algebra) : (evalLie a : ℂ) = constantCoeff (a : JetRing) := rfl + +/-- A constant as a `u(1)` jet. -/ +noncomputable def ofConstantLie : U1Algebra →ₗ[ℝ] JetU1Algebra where + toFun a := ⟨C a.1, by + show star (C a.1 : JetRing) = C a.1 + rw [JetRing.star_C, a.2]⟩ + map_add' a b := Subtype.ext (map_add _ _ _) + map_smul' r a := Subtype.ext (by + show (C (r • a.1) : JetRing) = r • C a.1 + rw [Algebra.smul_def, Algebra.smul_def, map_mul, MvPowerSeries.algebraMap_apply]) + +@[simp] +lemma ofConstantLie_val (a : U1Algebra) : (ofConstantLie a : JetRing) = C (a : ℂ) := rfl + +/-! + +## C. The Maurer–Cartan form + +-/ + +/-- The Maurer–Cartan scalar `i (∂_μ u) u⁻¹` of a unitary jet is self-adjoint. -/ +lemma star_mcVal (u : JetU1) (μ : Fin 1 ⊕ Fin 3) : + star (Complex.I • (pderiv ℂ μ (u : JetRing) * star (u : JetRing))) + = Complex.I • (pderiv ℂ μ (u : JetRing) * star (u : JetRing)) := by + have hu : (u : JetRing) * star (u : JetRing) = 1 := Unitary.mul_star_self_of_mem u.2 + have h0 : pderiv ℂ μ ((u : JetRing) * star (u : JetRing)) = 0 := by rw [hu, pderiv_one] + rw [Derivation.leibniz, smul_eq_mul, smul_eq_mul] at h0 + rw [star_smul, star_mul', star_star, ← JetRing.pderiv_star, Complex.star_def, Complex.conj_I, + neg_smul, show pderiv ℂ μ (star (u : JetRing)) * (u : JetRing) + = -(pderiv ℂ μ (u : JetRing) * star (u : JetRing)) from by linear_combination h0, + smul_neg, neg_neg] + +/-- The Maurer–Cartan form `i (∂_μ u) u⁻¹` of a `U(1)` jet. -/ +noncomputable def mc (u : JetU1) (μ : Fin 1 ⊕ Fin 3) : JetU1Algebra := + ⟨Complex.I • (pderiv ℂ μ (u : JetRing) * star (u : JetRing)), star_mcVal u μ⟩ + +@[simp] +lemma mc_val (u : JetU1) (μ : Fin 1 ⊕ Fin 3) : + (mc u μ : JetRing) = Complex.I • (pderiv ℂ μ (u : JetRing) * star (u : JetRing)) := rfl + +lemma mc_ofConstant (g : U1) (μ : Fin 1 ⊕ Fin 3) : mc (ofConstant g) μ = 0 := + Subtype.ext (by simp [pderiv_C]) + +/-- The Maurer–Cartan form of `U(1)` is additive: the abelian cocycle law. -/ +lemma mc_mul (u v : JetU1) (μ : Fin 1 ⊕ Fin 3) : mc (u * v) μ = mc u μ + mc v μ := by + refine Subtype.ext ?_ + have hu : (u : JetRing) * star (u : JetRing) = 1 := Unitary.mul_star_self_of_mem u.2 + have hv : (v : JetRing) * star (v : JetRing) = 1 := Unitary.mul_star_self_of_mem v.2 + show Complex.I • (pderiv ℂ μ ((u : JetRing) * v) * star ((u : JetRing) * v)) + = Complex.I • (pderiv ℂ μ (u : JetRing) * star (u : JetRing)) + + Complex.I • (pderiv ℂ μ (v : JetRing) * star (v : JetRing)) + rw [← smul_add, Derivation.leibniz, star_mul', smul_eq_mul, smul_eq_mul] + congr 1 + linear_combination (pderiv ℂ μ (u : JetRing) * star (u : JetRing)) * hv + + (pderiv ℂ μ (v : JetRing) * star (v : JetRing)) * hu + +/-- The Maurer–Cartan form of `U(1)` is flat: the derivatives of a phase commute. -/ +lemma pderiv_mcVal_comm (u : JetU1) (μ ν : Fin 1 ⊕ Fin 3) : + pderiv ℂ μ (pderiv ℂ ν (u : JetRing) * star (u : JetRing)) + = pderiv ℂ ν (pderiv ℂ μ (u : JetRing) * star (u : JetRing)) := by + have hu : (u : JetRing) * star (u : JetRing) = 1 := Unitary.mul_star_self_of_mem u.2 + 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)) * ((mul_comm _ _).trans hu) + simp only [Derivation.leibniz, smul_eq_mul] + rw [hstar μ, hstar ν, JetRing.pderiv_comm μ ν] + ring + +end JetU1 + +/-! + +## D. The local gauge data + +-/ + +namespace LocalGaugeData + +/-- **The local gauge data of `U(1)`**: unitary jets, self-adjoint scalar jets with + vanishing bracket and trivial adjoint action, and the Maurer–Cartan form + `i (∂_μ u) u⁻¹`. -/ +noncomputable def u1 : LocalGaugeData JetU1 U1Algebra U1 JetU1Algebra where + eval := JetU1.eval + ofConstant := JetU1.ofConstant + eval_ofConstant := JetU1.eval_ofConstant + evalLie := JetU1.evalLie + ofConstantLie := JetU1.ofConstantLie + ofConstantLie_lie _ _ := by simp + evalLie_ofConstantLie a := Subtype.ext (by simp) + deriv := JetU1.deriv + deriv_comm μ ν a := Subtype.ext (JetRing.pderiv_comm μ ν a.1) + deriv_bracket _ _ _ := by simp + deriv_ofConstantLie μ a := Subtype.ext (by simp [pderiv_C]) + coord := JetU1.coord + deriv_coord μ ν a := by + refine Subtype.ext ?_ + by_cases h : μ = ν + · subst h + rw [if_pos rfl] + show pderiv ℂ μ ((X μ : JetRing) * a.1) = (X μ : JetRing) * pderiv ℂ μ a.1 + a.1 + rw [Derivation.leibniz, smul_eq_mul, smul_eq_mul, pderiv_X_self] + ring + · rw [if_neg h, add_zero] + show pderiv ℂ μ ((X ν : JetRing) * a.1) = (X ν : JetRing) * pderiv ℂ μ a.1 + rw [Derivation.leibniz, smul_eq_mul, smul_eq_mul, pderiv_X_of_ne (Ne.symm h)] + ring + evalLie_coord μ a := Subtype.ext (by simp) + coord_lie _ _ _ := by simp + adjoint := Representation.trivial ℝ JetU1 JetU1Algebra + adjoint_lie _ _ _ := by simp + adjointValue := Representation.trivial ℝ U1 U1Algebra + evalLie_adjoint _ _ := rfl + maurerCartan := JetU1.mc + maurerCartan_ofConstant := JetU1.mc_ofConstant + maurerCartan_cocycle u v μ := by + rw [JetU1.mc_mul] + rfl + maurerCartan_structure u μ ν := by + refine Subtype.ext ?_ + show pderiv ℂ μ (Complex.I • (pderiv ℂ ν (u : JetRing) * star (u : JetRing))) + - pderiv ℂ ν (Complex.I • (pderiv ℂ μ (u : JetRing) * star (u : JetRing))) + 0 = 0 + rw [Derivation.map_smul, Derivation.map_smul, JetU1.pderiv_mcVal_comm, sub_self, add_zero] + deriv_adjoint _ _ _ := by simp + +@[simp] lemma u1_eval : u1.eval = JetU1.eval := rfl +@[simp] lemma u1_ofConstant : u1.ofConstant = JetU1.ofConstant := rfl +@[simp] lemma u1_evalLie : u1.evalLie = JetU1.evalLie := rfl +@[simp] lemma u1_ofConstantLie : u1.ofConstantLie = JetU1.ofConstantLie := rfl +@[simp] lemma u1_deriv (μ : Fin 1 ⊕ Fin 3) : u1.deriv μ = JetU1.deriv μ := rfl +@[simp] lemma u1_maurerCartan : u1.maurerCartan = JetU1.mc := rfl +@[simp] lemma u1_adjoint (u : JetU1) (a : JetU1Algebra) : u1.adjoint u a = a := rfl + +/-- The iterated derivative on `u(1)` jets is the iterated formal derivative. -/ +lemma u1_iteratedDeriv_val (s : Multiset (Fin 1 ⊕ Fin 3)) (a : JetU1Algebra) : + (u1.iteratedDeriv s a : JetRing) = s.foldl (fun h ρ => pderiv ℂ ρ h) (a : JetRing) := by + induction s using Multiset.induction_on generalizing a with + | empty => rw [iteratedDeriv_zero, LinearMap.id_apply, Multiset.foldl_zero] + | cons μ t ih => + rw [iteratedDeriv_cons, LinearMap.comp_apply, u1_deriv, JetU1.deriv_val, ih, + Multiset.foldl_cons, JetRing.foldl_pderiv_pderiv] + +/-! + +## E. The canonical factor and faithfulness + +-/ + +/-- The canonical `U(1)` factor of the local gauge data of `U(1)`. -/ +noncomputable def u1Factor : U1Factor u1 where + u := MonoidHom.id JetU1 + φ := + { toFun a := (a : ℂ) + map_add' _ _ := rfl + map_smul' _ _ := rfl } + φJ a := (a : JetRing) + φJ_ofConstantLie _ := rfl + φJ_cc_foldl p a := by + show constantCoeff (p.foldl (fun h ρ => pderiv ℂ ρ h) (a : JetRing)) + = constantCoeff (u1.iteratedDeriv p a : JetRing) + rw [u1_iteratedDeriv_val] + φJ_maurerCartan _ _ := rfl + φJ_adjoint _ _ := rfl + +/-- The local gauge data of `U(1)` is faithful. -/ +instance instFaithfulU1 : u1.Faithful where + ext_of_evalLie_iteratedDeriv {x y} h := Subtype.ext <| + JetRing.ext_of_constantCoeff_foldl_pderiv fun s => by + have hs := congrArg Subtype.val (h s) + simpa only [u1_evalLie, JetU1.evalLie_val, u1_iteratedDeriv_val] using hs + eq_ofConstant_of_maurerCartan_eq_zero {u} h := by + have hu : (u : JetRing) * star (u : JetRing) = 1 := Unitary.mul_star_self_of_mem u.2 + have hd : ∀ μ, pderiv ℂ μ (u : JetRing) = 0 := fun μ => by + have h1 : Complex.I • (pderiv ℂ μ (u : JetRing) * star (u : JetRing)) = 0 := + congrArg Subtype.val (congrFun h μ) + have h2 : pderiv ℂ μ (u : JetRing) * star (u : JetRing) = 0 := by + have := congrArg (fun z => (-Complex.I) • z) h1 + simpa [smul_smul, Complex.I_mul_I] using this + calc pderiv ℂ μ (u : JetRing) + = pderiv ℂ μ (u : JetRing) * ((u : JetRing) * star (u : JetRing)) := by + rw [hu, mul_one] + _ = 0 := by rw [mul_comm (u : JetRing), ← mul_assoc, h2, zero_mul] + exact Subtype.ext (JetRing.eq_C_of_pderiv_eq_zero hd) + +end LocalGaugeData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Basic.lean new file mode 100644 index 000000000..462213ed3 --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Basic.lean @@ -0,0 +1,592 @@ +/- +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.ClassicalFieldTheory.GaugeTheory.MatterField.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction +public import Mathlib.LinearAlgebra.TensorProduct.Pi +public import Mathlib.LinearAlgebra.Matrix.ToLin +/-! +# Matrix representations of a jet gauge group + +## i. Overview + +A model-building table describes how a field transforms by a *matrix*: the jets of +gauge transformations act on the internal index `ι` of the field through a matrix of +jets `mat U`, the gauge algebra through a matrix of numbers `act c`, and the jets of the +gauge algebra through a matrix of jets `jetAct a`. This file packages such a matrix +representation as `LocalGaugeData.MatrixRep`, together with the two identities that make +`act` the infinitesimal action underlying `mat`: the *derivative identity* +`∂_μ (mat U) = -(jetAct (ω_μ U)) · mat U` in terms of the Maurer–Cartan form, and the +*equivariance identity* `mat U · jetAct c = jetAct (Ad_U c) · mat U`. + +The internal index is tensored with a Lorentz representation `S`: the target space of +the field is `S ⊗ (ι → ℂ)`, and the jets of the field are identified with +`S ⊗ (ι → JetRing)`, on which `mat U` acts by matrix–vector multiplication. The main +theorem, `MatrixRep.isInfinitesimalActionOf`, shows that this action of the gauge algebra +is the infinitesimal action underlying the jet gauge action in the sense of +`LocalGaugeData.IsInfinitesimalActionOf`, once and for all matrix representations; the +compilation `MatrixRep.matterField` then produces a `MatterField`. + +## ii. Key results + +- `LocalGaugeData.MatrixRep` : a matrix representation of the jet gauge group with its + infinitesimal action. +- `MatrixRep.jetEquiv` : the identification `JetRing ⊗ (S ⊗ (ι → ℂ)) ≃ S ⊗ (ι → JetRing)`. +- `MatrixRep.repJet`, `MatrixRep.repJet_smul` : the fibrewise jet gauge action. +- `MatrixRep.repCoeff_eq` : the base-point Taylor coefficients of the jet gauge action. +- `MatrixRep.isInfinitesimalActionOf` : the gauge-algebra action is the infinitesimal + action underlying the jet gauge action. +- `MatrixRep.matterField` : the matter field of a matrix representation. + +## iii. Table of contents + +- A. Matrix representations +- B. The target space and its jets +- C. Endomorphisms from matrices +- D. The jet gauge action +- E. The base-point Taylor coefficients +- F. The infinitesimal action underlies the jet gauge action +- G. The matter field + +-/ + +@[expose] public section + +open TensorProduct MvPowerSeries MatrixGroups + +namespace LocalGaugeData + +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + +/-! + +## A. Matrix representations + +-/ + +/-- **A matrix representation** of the jets of gauge transformations on an internal index + `ι`: the jets act by the matrix of jets `mat U`, the gauge algebra by the matrix `act c`, + and the jets of the gauge algebra by the matrix of jets `jetAct a`, subject to the + derivative identity and the equivariance identity that make `act` the infinitesimal + action underlying `mat`. -/ +structure MatrixRep (jets : LocalGaugeData G 𝔤 G₀ 𝔤J) (ι : Type) [Fintype ι] [DecidableEq ι] + where + /-- The matrix of jets by which a jet of gauge transformations acts. -/ + mat : G → Matrix ι ι JetRing + mat_one : mat 1 = 1 + mat_mul : ∀ U V, mat (U * V) = mat U * mat V + /-- The matrix by which an element of the gauge algebra acts. -/ + act : 𝔤 →ₗ[ℝ] Matrix ι ι ℂ + /-- The matrix of jets by which a jet of gauge algebra elements acts. -/ + jetAct : 𝔤J → Matrix ι ι JetRing + jetAct_ofConstantLie : ∀ c, jetAct (jets.ofConstantLie c) = (act c).map (C : ℂ → JetRing) + /-- The base-point Taylor coefficients of the jet action matrix are the action matrices + of the base-point Taylor coefficients. -/ + jetAct_map_cc_foldl : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (a : 𝔤J), + ((jetAct a).map fun f => constantCoeff (p.foldl (fun h ρ => pderiv ℂ ρ h) f)) + = act (jets.evalLie (jets.iteratedDeriv p a)) + /-- The derivative identity: the formal derivative of the matrix of a gauge jet is minus + the jet action of its Maurer–Cartan form times the matrix. -/ + mat_map_pderiv : ∀ (U : G) (μ : Fin 1 ⊕ Fin 3), + (mat U).map (fun f => pderiv ℂ μ f) = -(jetAct (jets.maurerCartan U μ) * mat U) + /-- The equivariance identity: the matrix of a gauge jet intertwines the constant jet + action with its adjoint transform. -/ + mat_mul_jetAct : ∀ (U : G) (c : 𝔤), + mat U * jetAct (jets.ofConstantLie c) + = jetAct (jets.adjoint U (jets.ofConstantLie c)) * mat U + +namespace MatrixRep + +variable {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} {ι : Type} + +/-! + +## B. The target space and its jets + +The target space of the field is `S ⊗ (ι → ℂ)` for a Lorentz representation `S`; its +jets `JetRing ⊗ (S ⊗ (ι → ℂ))` are identified with `S ⊗ (ι → JetRing)` by absorbing the +jet ring into the internal index. + +-/ + +/-- The entrywise formal derivative on `ι → JetRing`, as a `ℂ`-linear map. -/ +noncomputable def pderivPi (μ : Fin 1 ⊕ Fin 3) : (ι → JetRing) →ₗ[ℂ] (ι → JetRing) where + toFun w i := pderiv ℂ μ (w i) + map_add' _ _ := funext fun _ => map_add _ _ _ + map_smul' _ _ := funext fun _ => Derivation.map_smul _ _ _ + +lemma pderivPi_apply (μ : Fin 1 ⊕ Fin 3) (w : ι → JetRing) (i : ι) : + pderivPi μ w i = pderiv ℂ μ (w i) := rfl + +/-- The entrywise iterated formal derivative on `ι → JetRing`, as a `ℂ`-linear map. -/ +noncomputable def foldPi (x : Multiset (Fin 1 ⊕ Fin 3)) : + (ι → JetRing) →ₗ[ℂ] (ι → JetRing) where + toFun w i := x.foldl (fun h ρ => pderiv ℂ ρ h) (w i) + map_add' v w := funext fun i => JetRing.foldl_pderiv_add x _ _ + map_smul' z v := funext fun i => by + simp only [Pi.smul_apply, RingHom.id_apply] + induction x using Multiset.induction_on generalizing v with + | empty => rfl + | cons ν t ih => + rw [Multiset.foldl_cons, Multiset.foldl_cons, Derivation.map_smul] + exact ih (fun i => pderiv ℂ ν (v i)) + +lemma foldPi_apply (x : Multiset (Fin 1 ⊕ Fin 3)) (w : ι → JetRing) (i : ι) : + foldPi x w i = x.foldl (fun h ρ => pderiv ℂ ρ h) (w i) := rfl + +lemma foldPi_zero : foldPi (ι := ι) 0 = LinearMap.id := LinearMap.ext fun _ => rfl + +lemma pderivPi_comp_foldPi (μ : Fin 1 ⊕ Fin 3) (x : Multiset (Fin 1 ⊕ Fin 3)) : + pderivPi (ι := ι) μ ∘ₗ foldPi x = foldPi (μ ::ₘ x) := by + refine LinearMap.ext fun w => funext fun i => ?_ + simp only [LinearMap.comp_apply, pderivPi_apply, foldPi_apply, Multiset.foldl_cons] + exact (JetRing.foldl_pderiv_pderiv x μ (w i)).symm + +/-- The entrywise base-point evaluation on `ι → JetRing`, as a `ℂ`-linear map. -/ +noncomputable def ccPi : (ι → JetRing) →ₗ[ℂ] (ι → ℂ) where + toFun w i := constantCoeff (w i) + map_add' v w := funext fun i => map_add _ _ _ + map_smul' z v := funext fun i => by + simp only [Pi.smul_apply, RingHom.id_apply] + exact constantCoeff_smul _ _ + +lemma ccPi_apply (w : ι → JetRing) (i : ι) : ccPi w i = constantCoeff (w i) := rfl + +/-- The iterated formal derivative is `ℂ`-homogeneous. -/ +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. -/ +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] + +/-- A constant jet times a jet is the scalar multiple. -/ +lemma C_mul_eq_smul (z : ℂ) (f : JetRing) : (C z : JetRing) * f = z • f := by + rw [Algebra.smul_def] + rfl + +variable [Fintype ι] [DecidableEq ι] + +omit [DecidableEq ι] in +/-- The base-point evaluation of the iterated derivative of a matrix–vector product with + constant entries is the matrix–vector product of the base-point coefficients. -/ +lemma ccPi_foldPi_mulVec (x : Multiset (Fin 1 ⊕ Fin 3)) (A : Matrix ι ι JetRing) + (v : ι → ℂ) : + ccPi (foldPi x (A.mulVec fun k => (C (v k) : JetRing))) + = (A.map fun f => constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)).mulVec v := by + funext j + simp only [ccPi_apply, foldPi_apply, Matrix.mulVec, dotProduct, Matrix.map_apply] + rw [JetRing.foldl_pderiv_sum, map_sum] + refine Finset.sum_congr rfl fun k _ => ?_ + rw [mul_comm, C_mul_eq_smul, foldl_pderiv_smul, constantCoeff_smul, smul_eq_mul, mul_comm] + +/-! + +### The target space + +The target space `V` of the field is any complex vector space identified, through `e`, +with `S ⊗ (ι → ℂ)` for a Lorentz representation `S`. Keeping `V` abstract (rather than +taking `V = S ⊗ (ι → ℂ)` itself) keeps the real-scalar structure on `V` the canonical +`Module.complexToReal`, and lets the concrete target spaces of a model serve as `V`. + +-/ + +variable {S : Type} [AddCommGroup S] [Module ℂ S] +variable {V : Type} [AddCommGroup V] [Module ℂ V] + +/-- The jets of a `V`-valued field as `S ⊗ (ι → JetRing)`, through the identification + `e : V ≃ S ⊗ (ι → ℂ)`: the jet ring is absorbed into the internal index. -/ +noncomputable def jetEquiv (e : V ≃ₗ[ℂ] S ⊗[ℂ] (ι → ℂ)) : + JetRing ⊗[ℂ] V ≃ₗ[ℂ] S ⊗[ℂ] (ι → JetRing) := + (TensorProduct.congr (LinearEquiv.refl ℂ JetRing) e).trans <| + (TensorProduct.leftComm ℂ JetRing S (ι → ℂ)).trans <| + TensorProduct.congr (LinearEquiv.refl ℂ S) + ((TensorProduct.piScalarRight ℂ JetRing JetRing ι).restrictScalars ℂ) + +variable (e : V ≃ₗ[ℂ] S ⊗[ℂ] (ι → ℂ)) + +lemma jetEquiv_tmul (f : JetRing) (s : S) (v : ι → ℂ) : + jetEquiv e (f ⊗ₜ[ℂ] e.symm (s ⊗ₜ[ℂ] v)) = s ⊗ₜ[ℂ] (fun i => v i • f) := by + simp [jetEquiv, TensorProduct.piScalarRight_apply, TensorProduct.piScalarRightHom_tmul] + +omit [Fintype ι] [DecidableEq ι] in +/-- Induction on the jets of a `V`-valued field through the identification `e`. -/ +lemma induction_on {P : JetRing ⊗[ℂ] V → Prop} (z : JetRing ⊗[ℂ] V) + (zero : P 0) + (tmul : ∀ (f : JetRing) (s : S) (v : ι → ℂ), P (f ⊗ₜ[ℂ] e.symm (s ⊗ₜ[ℂ] v))) + (add : ∀ a b, P a → P b → P (a + b)) : P z := by + induction z using TensorProduct.induction_on with + | zero => exact zero + | add a b ha hb => exact add a b ha hb + | tmul f d => + obtain ⟨t, rfl⟩ : ∃ t, d = e.symm t := ⟨e d, (e.symm_apply_apply d).symm⟩ + induction t using TensorProduct.induction_on with + | zero => rw [map_zero, TensorProduct.tmul_zero]; exact zero + | add a b ha hb => rw [map_add, TensorProduct.tmul_add]; exact add _ _ ha hb + | tmul s v => exact tmul f s v + +/-- The identification of jets intertwines the formal derivative with the entrywise + derivative. -/ +lemma jetEquiv_jetDeriv (μ : Fin 1 ⊕ Fin 3) (z : JetRing ⊗[ℂ] V) : + jetEquiv e (jetDeriv μ z) = LinearMap.lTensor S (pderivPi μ) (jetEquiv e z) := by + induction z using induction_on e with + | zero => simp + | add a b ha hb => rw [map_add, map_add, ha, hb, map_add, map_add] + | tmul f s v => + rw [jetDeriv_tmul, jetEquiv_tmul, jetEquiv_tmul, LinearMap.lTensor_tmul] + congr 1 + funext i + simp [pderivPi_apply, Derivation.map_smul] + +/-- The identification of jets intertwines the iterated formal derivative with the + entrywise iterated derivative. -/ +lemma jetEquiv_jetIteratedDeriv (x : Multiset (Fin 1 ⊕ Fin 3)) (z : JetRing ⊗[ℂ] V) : + jetEquiv e (jetIteratedDeriv x z) = LinearMap.lTensor S (foldPi x) (jetEquiv e z) := by + induction x using Multiset.induction_on generalizing z with + | empty => rw [jetIteratedDeriv_zero, LinearMap.id_apply, foldPi_zero, LinearMap.lTensor_id, + LinearMap.id_apply] + | cons μ t ih => + rw [jetIteratedDeriv_cons, LinearMap.comp_apply, jetEquiv_jetDeriv, ih, + ← LinearMap.comp_apply, ← LinearMap.lTensor_comp, pderivPi_comp_foldPi] + +/-- The base-point evaluation of a jet through the identification. -/ +lemma jetEval_eq (z : JetRing ⊗[ℂ] V) : + jetEval z = e.symm (LinearMap.lTensor S ccPi (jetEquiv e z)) := by + induction z using induction_on e with + | zero => simp + | add a b ha hb => rw [map_add, map_add, ha, hb, map_add, map_add] + | tmul f s v => + rw [jetEval_tmul, jetEquiv_tmul, LinearMap.lTensor_tmul, + show ccPi (fun i => v i • f) = constantCoeff f • v from funext fun i => by + simp [ccPi_apply, constantCoeff_smul, mul_comm], + TensorProduct.tmul_smul, map_smul] + +/-- Multiplication by a scalar jet through the identification. -/ +lemma jetEquiv_smul (χ : JetRing) (z : JetRing ⊗[ℂ] V) : + jetEquiv e (χ • z) + = LinearMap.lTensor S ((LinearMap.lsmul JetRing (ι → JetRing) χ).restrictScalars ℂ) + (jetEquiv e z) := by + induction z using induction_on e with + | zero => simp + | add a b ha hb => rw [smul_add, map_add, map_add, ha, hb, map_add] + | tmul f s v => + rw [TensorProduct.smul_tmul', jetEquiv_tmul, jetEquiv_tmul, LinearMap.lTensor_tmul] + congr 1 + funext i + simp [smul_eq_mul] + +/-- A jet of a constant through the identification. -/ +lemma jetEquiv_jetOfConstant (s : S) (v : ι → ℂ) : + jetEquiv e (jetOfConstant (e.symm (s ⊗ₜ[ℂ] v))) = s ⊗ₜ[ℂ] (fun i => C (v i)) := by + rw [jetOfConstant_apply, jetEquiv_tmul] + congr 1 + funext i + rw [Algebra.smul_def, mul_one] + rfl + +/-! + +## C. Endomorphisms from matrices + +-/ + +/-- The endomorphism of the target space `V ≃ S ⊗ (ι → ℂ)` defined by a complex matrix on + the internal index, as an algebra map. -/ +noncomputable def valEndAlgHom : Matrix ι ι ℂ →ₐ[ℂ] Module.End ℂ V := + (e.symm.conjAlgEquiv (R := ℂ)).toAlgHom.comp <| + (Module.End.lTensorAlgHom ℂ (ι → ℂ) S).comp + (Matrix.toLinAlgEquiv' : Matrix ι ι ℂ ≃ₐ[ℂ] Module.End ℂ (ι → ℂ)).toAlgHom + +/-- The endomorphism of the target space `V ≃ S ⊗ (ι → ℂ)` defined by a complex matrix on + the internal index, with the Lorentz factor untouched. -/ +noncomputable def valEnd (B : Matrix ι ι ℂ) : V →ₗ[ℂ] V := valEndAlgHom e B + +lemma valEnd_apply (B : Matrix ι ι ℂ) (d : V) : + valEnd e B d = e.symm (LinearMap.lTensor S (Matrix.toLin' B) (e d)) := rfl + +lemma valEnd_apply_symm_tmul (B : Matrix ι ι ℂ) (s : S) (v : ι → ℂ) : + valEnd e B (e.symm (s ⊗ₜ[ℂ] v)) = e.symm (s ⊗ₜ[ℂ] (B.mulVec v)) := by + rw [valEnd_apply, LinearEquiv.apply_symm_apply, LinearMap.lTensor_tmul, Matrix.toLin'_apply] + +lemma valEnd_add (A B : Matrix ι ι ℂ) : valEnd e (A + B) = valEnd e A + valEnd e B := + map_add (valEndAlgHom e) A B + +lemma valEnd_smul (z : ℂ) (A : Matrix ι ι ℂ) : valEnd e (z • A) = z • valEnd e A := + map_smul (valEndAlgHom e) z A + +lemma valEnd_zero : valEnd e (0 : Matrix ι ι ℂ) = 0 := map_zero (valEndAlgHom e) + +lemma valEnd_neg (A : Matrix ι ι ℂ) : valEnd e (-A) = -valEnd e A := + map_neg (valEndAlgHom e) A + +lemma valEnd_multiset_sum (m : Multiset (Matrix ι ι ℂ)) : + valEnd e m.sum = (m.map (valEnd e)).sum := + map_multiset_sum (valEndAlgHom e) m + +lemma valEnd_mul (A B : Matrix ι ι ℂ) : valEnd e (A * B) = valEnd e A ∘ₗ valEnd e B := + map_mul (valEndAlgHom e) A B + +lemma valEnd_one : valEnd e (1 : Matrix ι ι ℂ) = LinearMap.id := map_one (valEndAlgHom e) + +variable (S) in +/-- The endomorphism of `S ⊗ (ι → JetRing)` defined by a matrix of jets on the internal + index. -/ +noncomputable def jetEnd (A : Matrix ι ι JetRing) : + S ⊗[ℂ] (ι → JetRing) →ₗ[ℂ] S ⊗[ℂ] (ι → JetRing) := + Module.End.lTensorAlgHom ℂ (ι → JetRing) S + ((Matrix.toLinAlgEquiv' A : Module.End JetRing (ι → JetRing)).restrictScalars ℂ) + +lemma jetEnd_eq_lTensor (A : Matrix ι ι JetRing) : + jetEnd S A = LinearMap.lTensor S + ((Matrix.toLinAlgEquiv' A : Module.End JetRing (ι → JetRing)).restrictScalars ℂ) := rfl + +lemma jetEnd_tmul (A : Matrix ι ι JetRing) (s : S) (w : ι → JetRing) : + jetEnd S A (s ⊗ₜ[ℂ] w) = s ⊗ₜ[ℂ] (A.mulVec w) := by + rw [jetEnd_eq_lTensor, LinearMap.lTensor_tmul, LinearMap.restrictScalars_apply, + Matrix.toLinAlgEquiv'_apply] + +lemma jetEnd_one : jetEnd S (1 : Matrix ι ι JetRing) = LinearMap.id := by + rw [jetEnd, map_one, + show ((1 : Module.End JetRing (ι → JetRing)).restrictScalars ℂ) = 1 from rfl, map_one] + rfl + +lemma jetEnd_mul (A B : Matrix ι ι JetRing) : jetEnd S (A * B) = jetEnd S A ∘ₗ jetEnd S B := by + rw [jetEnd, jetEnd, jetEnd, map_mul, + show ((Matrix.toLinAlgEquiv' A * Matrix.toLinAlgEquiv' B : + Module.End JetRing (ι → JetRing)).restrictScalars ℂ) + = (Matrix.toLinAlgEquiv' A : Module.End JetRing (ι → JetRing)).restrictScalars ℂ + * (Matrix.toLinAlgEquiv' B : Module.End JetRing (ι → JetRing)).restrictScalars ℂ from rfl, + map_mul] + rfl + +/-- The endomorphism of the jets `JetRing ⊗ V` of the field defined by a matrix of jets + on the internal index, through `jetEquiv`. -/ +noncomputable def matEnd (A : Matrix ι ι JetRing) : JetRing ⊗[ℂ] V →ₗ[ℂ] JetRing ⊗[ℂ] V := + (jetEquiv e).symm.toLinearMap ∘ₗ jetEnd S A ∘ₗ (jetEquiv e).toLinearMap + +lemma matEnd_apply (A : Matrix ι ι JetRing) (z : JetRing ⊗[ℂ] V) : + matEnd e A z = (jetEquiv e).symm (jetEnd S A (jetEquiv e z)) := rfl + +lemma matEnd_one : matEnd e (1 : Matrix ι ι JetRing) = LinearMap.id := by + refine LinearMap.ext fun z => ?_ + rw [matEnd_apply, jetEnd_one, LinearMap.id_apply, LinearEquiv.symm_apply_apply, + LinearMap.id_apply] + +lemma matEnd_mul (A B : Matrix ι ι JetRing) : + matEnd e (A * B) = matEnd e A ∘ₗ matEnd e B := by + refine LinearMap.ext fun z => ?_ + rw [LinearMap.comp_apply, matEnd_apply, matEnd_apply, matEnd_apply, jetEnd_mul, + LinearEquiv.apply_symm_apply, LinearMap.comp_apply] + +/-- The matrix endomorphisms are fibrewise: they commute with multiplication by scalar + jets. -/ +lemma matEnd_smul (A : Matrix ι ι JetRing) (χ : JetRing) (z : JetRing ⊗[ℂ] V) : + matEnd e A (χ • z) = χ • matEnd e A z := by + apply (jetEquiv e).injective + rw [matEnd_apply, LinearEquiv.apply_symm_apply, jetEquiv_smul, jetEquiv_smul, matEnd_apply, + LinearEquiv.apply_symm_apply, jetEnd_eq_lTensor, ← LinearMap.comp_apply, + ← LinearMap.comp_apply, ← LinearMap.lTensor_comp, ← LinearMap.lTensor_comp] + congr 2 + refine LinearMap.ext fun w => ?_ + simp only [LinearMap.comp_apply, LinearMap.restrictScalars_apply, LinearMap.lsmul_apply, + Matrix.toLinAlgEquiv'_apply, Matrix.mulVec_smul] + +/-! + +## D. The jet gauge action + +-/ + +variable (R : MatrixRep jets ι) + +/-- **The jet gauge action** of a matrix representation on the jets of a `V`-valued + field: the matrix of jets acts on the internal index by matrix–vector multiplication, + with the Lorentz factor untouched. -/ +noncomputable def repJet : Representation ℂ G (JetRing ⊗[ℂ] V) where + toFun U := matEnd e (R.mat U) + map_one' := by rw [R.mat_one, matEnd_one]; rfl + map_mul' U V := by rw [R.mat_mul, matEnd_mul]; rfl + +lemma repJet_apply (U : G) : R.repJet e U = matEnd e (R.mat U) := rfl + +/-- **The jet gauge action is fibrewise**: it commutes with multiplication by scalar + jets. -/ +lemma repJet_smul (U : G) (χ : JetRing) (z : JetRing ⊗[ℂ] V) : + R.repJet e U (χ • z) = χ • R.repJet e U z := by + rw [repJet_apply, matEnd_smul] + +/-- **The action of the gauge algebra** of a matrix representation on the target space + `V ≃ S ⊗ (ι → ℂ)`: the action matrix acts on the internal index, real-linearly in the + algebra slot and complex-linearly in the value slot. -/ +noncomputable def repAlgebra : 𝔤 →ₗ[ℝ] V →ₗ[ℂ] V where + toFun c := valEnd e (R.act c) + map_add' c₁ c₂ := by rw [map_add, valEnd_add] + map_smul' r c := by + rw [map_smul, ← algebraMap_smul ℂ r (R.act c), valEnd_smul, RingHom.id_apply] + refine LinearMap.ext fun v => ?_ + show (algebraMap ℝ ℂ r) • valEnd e (R.act c) v = r • valEnd e (R.act c) v + rw [algebraMap_smul] + +lemma repAlgebra_apply (c : 𝔤) : R.repAlgebra e c = valEnd e (R.act c) := rfl + +/-! + +## E. The base-point Taylor coefficients + +-/ + +/-- **The base-point Taylor coefficients of the jet gauge action** are the endomorphisms + of the base-point Taylor coefficients of the matrix of jets. -/ +lemma repCoeff_eq (U : G) (x : Multiset (Fin 1 ⊕ Fin 3)) : + GaugeAlgebraRealization.repCoeff (R.repJet e) U x + = valEnd e ((R.mat U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) := by + refine LinearMap.ext fun d => ?_ + obtain ⟨t, rfl⟩ : ∃ t, d = e.symm t := ⟨e d, (e.symm_apply_apply d).symm⟩ + induction t using TensorProduct.induction_on with + | zero => rw [map_zero, map_zero, map_zero] + | add a b ha hb => rw [map_add, map_add, map_add, ha, hb] + | tmul s v => + rw [show GaugeAlgebraRealization.repCoeff (R.repJet e) U x (e.symm (s ⊗ₜ[ℂ] v)) + = jetEval (jetIteratedDeriv x (R.repJet e U (jetOfConstant (e.symm (s ⊗ₜ[ℂ] v))))) + from rfl, + jetEval_eq e, jetEquiv_jetIteratedDeriv, repJet_apply, matEnd_apply, + LinearEquiv.apply_symm_apply, jetEquiv_jetOfConstant, jetEnd_tmul, + LinearMap.lTensor_tmul, LinearMap.lTensor_tmul, valEnd_apply_symm_tmul, + ccPi_foldPi_mulVec] + +/-! + +## F. The infinitesimal action underlies the jet gauge action + +-/ + +set_option maxHeartbeats 1000000 in +/-- **The action of the gauge algebra of a matrix representation is the infinitesimal + action underlying its jet gauge action**: the base-point Taylor coefficients obey the + Maurer–Cartan Leibniz law and intertwine the action with the adjoint transports. -/ +theorem isInfinitesimalActionOf : + jets.IsInfinitesimalActionOf (R.repAlgebra e) (R.repJet e) := by + constructor + · intro U μ x + have hMcons : ((R.mat U).map fun f => + constantCoeff ((μ ::ₘ x).foldl (fun h ρ => pderiv ℂ ρ h) f)) + = -((x.antidiagonal.map fun p => + R.act (jets.evalLie (jets.iteratedDeriv p.1 (jets.maurerCartan U μ))) + * ((R.mat U).map fun f => + constantCoeff (p.2.foldl (fun h ρ => pderiv ℂ ρ h) f))).sum) := by + rw [show ((R.mat U).map fun f => + constantCoeff ((μ ::ₘ x).foldl (fun h ρ => pderiv ℂ ρ h) f)) + = (((R.mat 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], + R.mat_map_pderiv, + Matrix.map_neg _ (fun f => by rw [foldl_pderiv_neg, map_neg]), + JetRing.matrix_constantCoeff_foldl_pderiv_mul] + exact congrArg Neg.neg (congrArg Multiset.sum (Multiset.map_congr rfl + fun p hp => by rw [R.jetAct_map_cc_foldl])) + rw [repCoeff_eq, hMcons, valEnd_neg, valEnd_multiset_sum, Multiset.map_map] + refine congrArg Neg.neg (congrArg Multiset.sum (Multiset.map_congr rfl + fun p hp => ?_)) + rw [Function.comp_apply, valEnd_mul, repCoeff_eq] + rfl + · intro U x c + have hcollapse : ∀ (m : Multiset (Fin 1 ⊕ Fin 3)), + (((R.act c).map (C : ℂ → JetRing)).map fun f => + constantCoeff (m.foldl (fun h ρ => pderiv ℂ ρ h) f)) + = if m = 0 then R.act 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 : ((R.mat U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) * R.act c + = (x.antidiagonal.map fun p => + R.act (jets.adjointCoeff U p.1 c) + * ((R.mat U).map fun f => + constantCoeff (p.2.foldl (fun h ρ => pderiv ℂ ρ h) f))).sum := by + have h1 : ((R.mat U * R.jetAct (jets.ofConstantLie c)).map + fun f => constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) + = ((R.mat U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) * R.act c := by + rw [R.jetAct_ofConstantLie, JetRing.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 => ((R.mat U).map fun f => + constantCoeff (p.1.foldl (fun h ρ => pderiv ℂ ρ h) f)) * + (if p.2 = 0 then R.act c else 0)) + (fun p _ hp => by rw [if_neg hp, Matrix.mul_zero]), + if_pos rfl] + rw [← h1, R.mat_mul_jetAct, JetRing.matrix_constantCoeff_foldl_pderiv_mul] + exact congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => by + rw [R.jetAct_map_cc_foldl, jets.adjointCoeff_apply]) + rw [repCoeff_eq, repAlgebra_apply, ← valEnd_mul, hMact, valEnd_multiset_sum, + Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) + rw [Function.comp_apply, valEnd_mul, repCoeff_eq] + rfl + +/-! + +## G. The matter field + +-/ + +/-- The Lorentz action on the target space `V ≃ S ⊗ (ι → ℂ)`: the given action on the + Lorentz factor `S`, transported through `e`. -/ +noncomputable def repLorentz (ρ : Representation ℂ SL(2,ℂ) S) : + Representation ℂ SL(2,ℂ) V := + (MonoidHomClass.toMonoidHom (e.symm.conjAlgEquiv (R := ℂ))).comp + (ρ.tprod (Representation.trivial ℂ SL(2,ℂ) (ι → ℂ))) + +variable [Module.Free ℂ V] [Module.Finite ℂ V] + +/-- **The matter field of a matrix representation**: the target space `V ≃ S ⊗ (ι → ℂ)` + with the Lorentz action on `S`, the jet gauge action of the matrix representation, and + the given mass weight. -/ +noncomputable def matterField (ρ : Representation ℂ SL(2,ℂ) S) (w : ℕ) : + MatterField jets where + V := V + repLorentz := repLorentz e ρ + repJet := R.repJet e + repAlgebra := R.repAlgebra e + repJet_smul := R.repJet_smul e + repAlgebra_isInfinitesimalAction := R.isInfinitesimalActionOf e + massWeight := w + +variable (ρ : Representation ℂ SL(2,ℂ) S) (w : ℕ) + +@[simp] +lemma matterField_V : (R.matterField e ρ w).V = V := rfl + +@[simp] +lemma matterField_repLorentz : (R.matterField e ρ w).repLorentz = repLorentz e ρ := rfl + +@[simp] +lemma matterField_repJet : (R.matterField e ρ w).repJet = R.repJet e := rfl + +@[simp] +lemma matterField_repAlgebra : (R.matterField e ρ w).repAlgebra = R.repAlgebra e := rfl + +@[simp] +lemma matterField_massWeight : (R.matterField e ρ w).massWeight = w := rfl + +end MatrixRep + +end LocalGaugeData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Constructions.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Constructions.lean new file mode 100644 index 000000000..bd11099d1 --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Constructions.lean @@ -0,0 +1,230 @@ +/- +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.ClassicalFieldTheory.GaugeTheory.MatterField.MatrixRep.Basic +public import Mathlib.LinearAlgebra.Matrix.Kronecker +/-! +# Constructions of matrix representations + +## i. Overview + +The matrix representations of a jet gauge group are closed under the operations by which +a model-building table combines the representations of the factors of the gauge group: +the trivial (singlet) representation, the Kronecker (tensor) product of two +representations, and the conjugate of a representation. This file provides these three +constructions; the representations of the individual factors are built in +`Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.MatrixRep.Factors`. + +## ii. Key results + +- `MatrixRep.trivial` : the singlet representation on `Fin 1`. +- `MatrixRep.kron` : the Kronecker product of two matrix representations. +- `MatrixRep.conj` : the conjugate of a matrix representation. + +## iii. Table of contents + +- A. Matrices with an identity factor +- B. The trivial representation +- C. The Kronecker product +- D. The conjugate representation + +-/ + +@[expose] public section + +open TensorProduct MvPowerSeries Kronecker + +namespace LocalGaugeData + +namespace MatrixRep + +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} + +/-! + +## A. Matrices with an identity factor + +Entrywise maps that send `0` to `0` pass through a Kronecker product with an identity +factor, whether or not they are multiplicative. + +-/ + +section KroneckerLemmas + +variable {α β : Type} {ι₁ ι₂ : Type} [DecidableEq ι₁] [DecidableEq ι₂] + +omit [DecidableEq ι₁] in +lemma kronecker_one_map [MulZeroOneClass α] [MulZeroOneClass β] (φ : α → β) (h0 : φ 0 = 0) + (A : Matrix ι₁ ι₁ α) : + (A ⊗ₖ (1 : Matrix ι₂ ι₂ α)).map φ = (A.map φ) ⊗ₖ (1 : Matrix ι₂ ι₂ β) := by + refine Matrix.ext fun i j => ?_ + simp only [Matrix.map_apply, Matrix.kroneckerMap_apply, Matrix.one_apply] + split_ifs <;> simp [h0] + +omit [DecidableEq ι₂] in +lemma one_kronecker_map [MulZeroOneClass α] [MulZeroOneClass β] (φ : α → β) (h0 : φ 0 = 0) + (B : Matrix ι₂ ι₂ α) : + ((1 : Matrix ι₁ ι₁ α) ⊗ₖ B).map φ = (1 : Matrix ι₁ ι₁ β) ⊗ₖ (B.map φ) := by + refine Matrix.ext fun i j => ?_ + simp only [Matrix.map_apply, Matrix.kroneckerMap_apply, Matrix.one_apply] + split_ifs <;> simp [h0] + +omit [DecidableEq ι₁] [DecidableEq ι₂] in +lemma kronecker_map_of_mul [Mul α] [Mul β] (φ : α → β) (hφ : ∀ a b, φ (a * b) = φ a * φ b) + (A : Matrix ι₁ ι₁ α) (B : Matrix ι₂ ι₂ α) : + (A ⊗ₖ B).map φ = (A.map φ) ⊗ₖ (B.map φ) := by + refine Matrix.ext fun i j => ?_ + simp only [Matrix.map_apply, Matrix.kroneckerMap_apply, hφ] + +omit [DecidableEq ι₁] [DecidableEq ι₂] in +lemma neg_kronecker [Mul α] [HasDistribNeg α] (A : Matrix ι₁ ι₁ α) (B : Matrix ι₂ ι₂ α) : + (-A) ⊗ₖ B = -(A ⊗ₖ B) := by + refine Matrix.ext fun i j => ?_ + simp only [Matrix.kroneckerMap_apply, Matrix.neg_apply, neg_mul] + +omit [DecidableEq ι₁] [DecidableEq ι₂] in +lemma kronecker_neg [Mul α] [HasDistribNeg α] (A : Matrix ι₁ ι₁ α) (B : Matrix ι₂ ι₂ α) : + A ⊗ₖ (-B) = -(A ⊗ₖ B) := by + refine Matrix.ext fun i j => ?_ + simp only [Matrix.kroneckerMap_apply, Matrix.neg_apply, mul_neg] + +end KroneckerLemmas + +/-! + +## B. The trivial representation + +-/ + +/-- **The trivial representation**: the one-dimensional singlet, on which every gauge jet + acts as the identity and the gauge algebra by zero. -/ +noncomputable def trivial : MatrixRep jets (Fin 1) where + mat _ := 1 + mat_one := rfl + mat_mul _ _ := (Matrix.one_mul 1).symm + act := 0 + jetAct _ := 0 + jetAct_ofConstantLie _ := by simp + jetAct_map_cc_foldl _ _ := by simp + mat_map_pderiv _ _ := by + refine Matrix.ext fun i j => ?_ + simp only [Matrix.map_apply, Matrix.one_apply, Matrix.zero_mul, neg_zero, Matrix.zero_apply] + split_ifs <;> simp + mat_mul_jetAct _ _ := by simp + +/-! + +## C. The Kronecker product + +-/ + +variable {ι₁ ι₂ : Type} [Fintype ι₁] [DecidableEq ι₁] [Fintype ι₂] [DecidableEq ι₂] + +/-- **The Kronecker product** of two matrix representations: the gauge jets act by the + Kronecker product of the two matrices of jets, the gauge algebra by the Kronecker sum + of the two action matrices. -/ +noncomputable def kron (R₁ : MatrixRep jets ι₁) (R₂ : MatrixRep jets ι₂) : + MatrixRep jets (ι₁ × ι₂) where + mat U := R₁.mat U ⊗ₖ R₂.mat U + mat_one := by rw [R₁.mat_one, R₂.mat_one, Matrix.one_kronecker_one] + mat_mul U V := by rw [R₁.mat_mul, R₂.mat_mul, Matrix.mul_kronecker_mul] + act := + { toFun c := R₁.act c ⊗ₖ (1 : Matrix ι₂ ι₂ ℂ) + (1 : Matrix ι₁ ι₁ ℂ) ⊗ₖ R₂.act c + map_add' a b := by + rw [map_add, map_add, Matrix.add_kronecker, Matrix.kronecker_add] + abel + map_smul' r c := by + simp only [map_smul, RingHom.id_apply] + rw [Matrix.smul_kronecker, Matrix.kronecker_smul, smul_add] } + jetAct a := R₁.jetAct a ⊗ₖ (1 : Matrix ι₂ ι₂ JetRing) + (1 : Matrix ι₁ ι₁ JetRing) ⊗ₖ R₂.jetAct a + jetAct_ofConstantLie c := by + show R₁.jetAct _ ⊗ₖ 1 + 1 ⊗ₖ R₂.jetAct _ = (R₁.act c ⊗ₖ 1 + 1 ⊗ₖ R₂.act c).map C + rw [R₁.jetAct_ofConstantLie, R₂.jetAct_ofConstantLie, Matrix.map_add _ (map_add C), + kronecker_one_map _ (map_zero C), one_kronecker_map _ (map_zero C)] + jetAct_map_cc_foldl p a := by + show (R₁.jetAct a ⊗ₖ 1 + 1 ⊗ₖ R₂.jetAct a).map _ = R₁.act _ ⊗ₖ 1 + 1 ⊗ₖ R₂.act _ + rw [Matrix.map_add _ (fun x y => by rw [JetRing.foldl_pderiv_add, map_add]), + kronecker_one_map _ (by simp), one_kronecker_map _ (by simp), + R₁.jetAct_map_cc_foldl, R₂.jetAct_map_cc_foldl] + mat_map_pderiv U μ := by + have hleib : (R₁.mat U ⊗ₖ R₂.mat U).map (fun f => pderiv ℂ μ f) + = ((R₁.mat U).map fun f => pderiv ℂ μ f) ⊗ₖ R₂.mat U + + R₁.mat U ⊗ₖ ((R₂.mat U).map fun f => pderiv ℂ μ f) := by + refine Matrix.ext fun i j => ?_ + simp only [Matrix.map_apply, Matrix.kroneckerMap_apply, Matrix.add_apply] + rw [Derivation.leibniz, smul_eq_mul, smul_eq_mul] + ring + rw [hleib, R₁.mat_map_pderiv, R₂.mat_map_pderiv, Matrix.add_mul, + ← Matrix.mul_kronecker_mul, ← Matrix.mul_kronecker_mul, Matrix.one_mul, Matrix.one_mul, + neg_kronecker, kronecker_neg, neg_add] + mat_mul_jetAct U c := by + show R₁.mat U ⊗ₖ R₂.mat U * (R₁.jetAct _ ⊗ₖ 1 + 1 ⊗ₖ R₂.jetAct _) + = (R₁.jetAct _ ⊗ₖ 1 + 1 ⊗ₖ R₂.jetAct _) * (R₁.mat U ⊗ₖ R₂.mat U) + rw [Matrix.mul_add, Matrix.add_mul, ← Matrix.mul_kronecker_mul, ← Matrix.mul_kronecker_mul, + ← Matrix.mul_kronecker_mul, ← Matrix.mul_kronecker_mul, Matrix.mul_one, Matrix.mul_one, + Matrix.one_mul, Matrix.one_mul, R₁.mat_mul_jetAct, R₂.mat_mul_jetAct] + +/-! + +## D. The conjugate representation + +-/ + +variable {ι : Type} [Fintype ι] [DecidableEq ι] + +/-- The iterated formal derivative commutes with conjugation. -/ +lemma foldl_pderiv_star (x : Multiset (Fin 1 ⊕ Fin 3)) (f : JetRing) : + x.foldl (fun h ρ => pderiv ℂ ρ h) (star f) = star (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, JetRing.pderiv_star, ih, Multiset.foldl_cons] + +/-- **The conjugate representation**: the gauge jets act by the entrywise conjugate matrix + of jets, the gauge algebra by the entrywise conjugate action matrix. -/ +noncomputable def conj (R : MatrixRep jets ι) : MatrixRep jets ι where + mat U := (R.mat U).map (starRingEnd JetRing) + mat_one := by rw [R.mat_one, Matrix.map_one _ (map_zero _) (map_one _)] + mat_mul U V := by rw [R.mat_mul, Matrix.map_mul] + act := + { toFun c := (R.act c).map (starRingEnd ℂ) + map_add' a b := by rw [map_add, Matrix.map_add _ (map_add _)] + map_smul' r c := by + simp only [map_smul, RingHom.id_apply] + exact Matrix.map_smul _ r (fun a => by + show star (r • a) = r • star a + rw [star_smul, star_trivial]) _ } + jetAct a := (R.jetAct a).map (starRingEnd JetRing) + jetAct_ofConstantLie c := by + show ((R.jetAct _).map _) = ((R.act c).map _).map _ + rw [R.jetAct_ofConstantLie, Matrix.map_map, Matrix.map_map] + congr 1 + funext z + exact JetRing.star_C z + jetAct_map_cc_foldl p a := by + show ((R.jetAct a).map _).map _ = (R.act _).map _ + rw [← R.jetAct_map_cc_foldl, Matrix.map_map, Matrix.map_map] + congr 1 + funext f + show constantCoeff (p.foldl (fun h ρ => pderiv ℂ ρ h) (star f)) + = star (constantCoeff (p.foldl (fun h ρ => pderiv ℂ ρ h) f)) + rw [foldl_pderiv_star, JetRing.constantCoeff_star] + mat_map_pderiv U μ := by + show ((R.mat U).map _).map _ = -((R.jetAct _).map _ * (R.mat U).map _) + rw [← Matrix.map_mul, ← Matrix.map_neg _ (map_neg _), ← R.mat_map_pderiv, Matrix.map_map, + Matrix.map_map] + congr 1 + funext f + exact JetRing.pderiv_star μ f + mat_mul_jetAct U c := by + show (R.mat U).map _ * (R.jetAct _).map _ = (R.jetAct _).map _ * (R.mat U).map _ + rw [← Matrix.map_mul, ← Matrix.map_mul, R.mat_mul_jetAct] + +end MatrixRep + +end LocalGaugeData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Factors.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Factors.lean new file mode 100644 index 000000000..170afad8b --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Factors.lean @@ -0,0 +1,270 @@ +/- +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.ClassicalFieldTheory.GaugeTheory.MatterField.MatrixRep.Constructions +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.Charge +/-! +# The factors of a gauge group as matrix representations + +## i. Overview + +A model-building table assigns to each field one charge per factor of the gauge group: a +rational charge under a `U(1)` factor, a representation label under an `SU(n)` factor. +This file packages what a factor of the local gauge data must provide for its +representations to be built as matrix representations: + +* `LocalGaugeData.U1Factor` : a unitary jet `u U` attached to each gauge jet, with the + matching components `φ`, `φJ` of the gauge algebra and its jets, related by the + Maurer–Cartan form `φJ (ω_μ U) = i (∂_μ u) u⁻¹` and invariant under the adjoint action; +* `LocalGaugeData.SUFactor` : a unitary matrix of jets `u U` attached to each gauge jet, + with the matching matrix components `φ`, `φJ`, related by the Maurer–Cartan form + `φJ (ω_μ U) = i (∂_μ u) u⁻¹` and transforming by conjugation under the adjoint action. + +From these, `U1Factor.charge n R` twists a matrix representation `R` by the charge-`n` +power of the unitary jet, and `SUFactor.fund` is the fundamental representation. Together +with `MatrixRep.trivial`, `MatrixRep.kron` and `MatrixRep.conj`, every representation +named in a table is assembled from these. + +## ii. Key results + +- `LocalGaugeData.U1Factor`, `U1Factor.charge` : a `U(1)` factor and the charge twist. +- `MatterField.pderiv_chargePow` : the derivative of a power of a unitary jet. +- `LocalGaugeData.SUFactor`, `SUFactor.fund` : an `SU(n)` factor and its fundamental + representation. + +## iii. Table of contents + +- A. Powers of a unitary jet +- B. `U(1)` factors and the charge twist +- C. `SU(n)` factors and the fundamental representation + +-/ + +@[expose] public section + +open TensorProduct MvPowerSeries + +/-! + +## A. Powers of a unitary jet + +-/ + +namespace MatterField + +/-- **The derivative of a power of a unitary jet**: `∂_μ (u ^ n) = n · u ^ n · (u⁻¹ ∂_μ u)`, + for every integer `n`. -/ +lemma pderiv_chargePow (n : ℤ) (w : unitary JetRing) (μ : Fin 1 ⊕ Fin 3) : + pderiv ℂ μ (chargePow n w) + = (n : ℂ) • (chargePow n w * (star (w : JetRing) * pderiv ℂ μ (w : JetRing))) := by + have hws : (w : JetRing) * star (w : JetRing) = 1 := Unitary.mul_star_self_of_mem w.2 + have hsw : star (w : JetRing) * (w : JetRing) = 1 := Unitary.star_mul_self_of_mem w.2 + have hD : pderiv ℂ μ (star (w : JetRing)) + = -(star (w : JetRing)) ^ 2 • pderiv ℂ μ (w : JetRing) := + Derivation.leibniz_of_mul_eq_one _ hsw + rcases n with k | k + · rw [show chargePow (Int.ofNat k) w = (w : JetRing) ^ k from by simp [chargePow], + Derivation.leibniz_pow] + rcases k with _ | k + · simp + · rw [Nat.add_sub_cancel, pow_succ, mul_assoc, ← mul_assoc (w : JetRing) (star _) _, hws, + one_mul] + simp only [Int.ofNat_eq_natCast, Int.cast_natCast, smul_eq_mul, nsmul_eq_mul, + Algebra.smul_def, map_natCast] + · rw [show chargePow (Int.negSucc k) w = (star (w : JetRing)) ^ (k + 1) from by + simp [chargePow, zpow_negSucc, ← Unitary.star_eq_inv], + Derivation.leibniz_pow, hD, Nat.add_sub_cancel, Int.cast_negSucc] + simp only [smul_eq_mul, nsmul_eq_mul, Algebra.smul_def, map_neg, map_natCast] + ring + +end MatterField + +namespace LocalGaugeData + +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + +/-! + +## B. `U(1)` factors and the charge twist + +-/ + +/-- **A `U(1)` factor** of the local gauge data: a unitary jet `u U` attached to each gauge + jet, with the corresponding components `φ c` of the gauge algebra and `φJ a` of its jets, + related by the Maurer–Cartan form `φJ (ω_μ U) = i (∂_μ u) u⁻¹` and invariant under the + adjoint action. -/ +structure U1Factor (jets : LocalGaugeData G 𝔤 G₀ 𝔤J) where + /-- The unitary jet of a gauge jet. -/ + u : G →* unitary JetRing + /-- The `u(1)` component of a gauge algebra element. -/ + φ : 𝔤 →ₗ[ℝ] ℂ + /-- The `u(1)` component of a jet of gauge algebra elements. -/ + φJ : 𝔤J → JetRing + φJ_ofConstantLie : ∀ c, φJ (jets.ofConstantLie c) = C (φ c) + φJ_cc_foldl : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (a : 𝔤J), + constantCoeff (p.foldl (fun h ρ => pderiv ℂ ρ h) (φJ a)) + = φ (jets.evalLie (jets.iteratedDeriv p a)) + φJ_maurerCartan : ∀ (U : G) (μ : Fin 1 ⊕ Fin 3), + φJ (jets.maurerCartan U μ) + = Complex.I • (pderiv ℂ μ (u U : JetRing) * star (u U : JetRing)) + φJ_adjoint : ∀ (U : G) (c : 𝔤), + φJ (jets.adjoint U (jets.ofConstantLie c)) = φJ (jets.ofConstantLie c) + +namespace U1Factor + +variable {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} (F : U1Factor jets) +variable {ι : Type} [Fintype ι] [DecidableEq ι] + +open MatterField + +/-- The derivative of the charge-`n` power of the unitary jet of a gauge jet, in terms of + the Maurer–Cartan form: `∂_μ (u ^ n) = -(i n) φJ (ω_μ U) · u ^ n`. -/ +lemma pderiv_chargePow_u (n : ℤ) (U : G) (μ : Fin 1 ⊕ Fin 3) : + pderiv ℂ μ (chargePow n (F.u U)) + = -(((Complex.I * n) • F.φJ (jets.maurerCartan U μ)) * chargePow n (F.u U)) := by + rw [pderiv_chargePow, F.φJ_maurerCartan, smul_smul, + show Complex.I * n * Complex.I = -(n : ℂ) from by + rw [mul_comm Complex.I, mul_assoc, Complex.I_mul_I, mul_neg_one], + neg_smul, neg_mul, neg_neg, + smul_mul_assoc] + congr 1 + ring + +/-- **The charge twist**: a matrix representation twisted by the charge-`n` power of the + unitary jet of the `U(1)` factor. The gauge algebra acts by the original action plus + `i n` times the `u(1)` component. -/ +noncomputable def charge (n : ℤ) (R : MatrixRep jets ι) : MatrixRep jets ι where + mat U := chargePow n (F.u U) • R.mat U + mat_one := by rw [map_one, chargePow_one, one_smul, R.mat_one] + mat_mul U V := by + rw [map_mul, chargePow_mul, R.mat_mul, Matrix.smul_mul, Matrix.mul_smul, smul_smul] + act := + { toFun c := R.act c + (Complex.I * n * F.φ c) • (1 : Matrix ι ι ℂ) + map_add' a b := by + rw [map_add, map_add, mul_add, add_smul] + abel + map_smul' r c := by + simp only [map_smul, RingHom.id_apply, smul_add] + congr 1 + rw [Complex.real_smul, ← algebraMap_smul ℂ r ((Complex.I * n * F.φ c) • (1 : Matrix ι ι ℂ)), + smul_smul] + show (Complex.I * n * (r * F.φ c)) • (1 : Matrix ι ι ℂ) + = ((r : ℂ) * (Complex.I * n * F.φ c)) • 1 + congr 1 + ring } + jetAct a := R.jetAct a + ((Complex.I * n) • F.φJ a) • (1 : Matrix ι ι JetRing) + jetAct_ofConstantLie c := by + show R.jetAct _ + ((Complex.I * n) • F.φJ _) • 1 + = (R.act c + (Complex.I * n * F.φ c) • 1).map C + rw [R.jetAct_ofConstantLie, F.φJ_ofConstantLie, Matrix.map_add _ (map_add C)] + congr 1 + refine Matrix.ext fun i j => ?_ + simp only [Matrix.map_apply, Matrix.smul_apply, Matrix.one_apply, smul_eq_mul] + split_ifs <;> simp [Algebra.smul_def, MvPowerSeries.algebraMap_apply] + jetAct_map_cc_foldl p a := by + show (R.jetAct a + ((Complex.I * n) • F.φJ a) • 1).map _ + = R.act _ + (Complex.I * n * F.φ _) • 1 + rw [Matrix.map_add _ (fun x y => by rw [JetRing.foldl_pderiv_add, map_add]), + R.jetAct_map_cc_foldl, ← F.φJ_cc_foldl] + congr 1 + refine Matrix.ext fun i j => ?_ + simp only [Matrix.map_apply, Matrix.smul_apply, Matrix.one_apply, smul_eq_mul] + split_ifs + · rw [mul_one, mul_one, MatrixRep.foldl_pderiv_smul, constantCoeff_smul, smul_eq_mul] + · rw [mul_zero, mul_zero, JetRing.foldl_pderiv_zero, map_zero] + mat_map_pderiv U μ := by + show (chargePow n (F.u U) • R.mat U).map _ + = -((R.jetAct _ + ((Complex.I * n) • F.φJ _) • 1) * (chargePow n (F.u U) • R.mat U)) + have hleib : (chargePow n (F.u U) • R.mat U).map (fun f => pderiv ℂ μ f) + = pderiv ℂ μ (chargePow n (F.u U)) • R.mat U + + chargePow n (F.u U) • ((R.mat U).map fun f => pderiv ℂ μ f) := by + refine Matrix.ext fun i j => ?_ + simp only [Matrix.map_apply, Matrix.smul_apply, Matrix.add_apply, smul_eq_mul] + rw [Derivation.leibniz, smul_eq_mul, smul_eq_mul] + ring + rw [hleib, F.pderiv_chargePow_u, R.mat_map_pderiv, Matrix.add_mul, Matrix.mul_smul, + Matrix.mul_smul, Matrix.smul_mul, Matrix.one_mul, smul_smul, smul_neg, neg_smul, neg_add, + mul_comm (chargePow n (F.u U))] + abel + mat_mul_jetAct U c := by + show chargePow n (F.u U) • R.mat U * (R.jetAct _ + ((Complex.I * n) • F.φJ _) • 1) + = (R.jetAct _ + ((Complex.I * n) • F.φJ _) • 1) * (chargePow n (F.u U) • R.mat U) + rw [F.φJ_adjoint, Matrix.smul_mul, Matrix.mul_smul, Matrix.mul_add, Matrix.add_mul, + Matrix.mul_smul, Matrix.smul_mul, Matrix.mul_one, Matrix.one_mul, R.mat_mul_jetAct] + +end U1Factor + +/-! + +## C. `SU(n)` factors and the fundamental representation + +-/ + +/-- **An `SU(n)` factor** of the local gauge data: a unitary matrix of jets `u U` attached + to each gauge jet, with the corresponding matrix components `φ c` of the gauge algebra + and `φJ a` of its jets, related by the Maurer–Cartan form `φJ (ω_μ U) = i (∂_μ u) u⁻¹` + and transforming by conjugation under the adjoint action. -/ +structure SUFactor (jets : LocalGaugeData G 𝔤 G₀ 𝔤J) (n : Type) [Fintype n] [DecidableEq n] + where + /-- The unitary matrix of jets of a gauge jet. -/ + u : G → Matrix n n JetRing + u_one : u 1 = 1 + u_mul : ∀ U V, u (U * V) = u U * u V + u_unitary : ∀ U, star (u U) * u U = 1 + /-- The matrix component of a gauge algebra element. -/ + φ : 𝔤 →ₗ[ℝ] Matrix n n ℂ + /-- The matrix component of a jet of gauge algebra elements. -/ + φJ : 𝔤J → Matrix n n JetRing + φJ_ofConstantLie : ∀ c, φJ (jets.ofConstantLie c) = (φ c).map (C : ℂ → JetRing) + φJ_cc_foldl : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (a : 𝔤J), + ((φJ a).map fun f => constantCoeff (p.foldl (fun h ρ => pderiv ℂ ρ h) f)) + = φ (jets.evalLie (jets.iteratedDeriv p a)) + φJ_maurerCartan : ∀ (U : G) (μ : Fin 1 ⊕ Fin 3), + φJ (jets.maurerCartan U μ) + = Complex.I • (((u U).map fun f => pderiv ℂ μ f) * star (u U)) + φJ_adjoint : ∀ (U : G) (c : 𝔤), + φJ (jets.adjoint U (jets.ofConstantLie c)) = u U * φJ (jets.ofConstantLie c) * star (u U) + +namespace SUFactor + +variable {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} {n : Type} [Fintype n] [DecidableEq n] + (F : SUFactor jets n) + +/-- **The fundamental representation** of an `SU(n)` factor: the gauge jets act by their + unitary matrices of jets, the gauge algebra by `i` times its matrix component. -/ +noncomputable def fund : MatrixRep jets n where + mat := F.u + mat_one := F.u_one + mat_mul := F.u_mul + act := + { toFun c := Complex.I • F.φ c + map_add' a b := by rw [map_add, smul_add] + map_smul' r c := by + simp only [map_smul, RingHom.id_apply] + rw [smul_comm] } + jetAct a := Complex.I • F.φJ a + jetAct_ofConstantLie c := by + show Complex.I • F.φJ _ = (Complex.I • F.φ c).map C + rw [F.φJ_ofConstantLie, Matrix.map_smul _ Complex.I (fun z => by + rw [smul_eq_mul, map_mul, MatrixRep.C_mul_eq_smul])] + jetAct_map_cc_foldl p a := by + show (Complex.I • F.φJ a).map _ = Complex.I • F.φ _ + rw [Matrix.map_smul _ Complex.I (fun f => by + rw [MatrixRep.foldl_pderiv_smul, constantCoeff_smul]), F.φJ_cc_foldl] + mat_map_pderiv U μ := by + show (F.u U).map _ = -(Complex.I • F.φJ _ * F.u U) + rw [F.φJ_maurerCartan, smul_smul, Complex.I_mul_I, neg_one_smul, Matrix.neg_mul, neg_neg, + Matrix.mul_assoc, F.u_unitary, Matrix.mul_one] + mat_mul_jetAct U c := by + show F.u U * (Complex.I • F.φJ _) = (Complex.I • F.φJ _) * F.u U + rw [F.φJ_adjoint, Matrix.smul_mul, Matrix.mul_smul, Matrix.mul_assoc, Matrix.mul_assoc, + F.u_unitary, Matrix.mul_one] + +end SUFactor + +end LocalGaugeData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Table.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Table.lean new file mode 100644 index 000000000..87856a5ad --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Table.lean @@ -0,0 +1,304 @@ +/- +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.ClassicalFieldTheory.GaugeTheory.MatterField.MatrixRep.Factors +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeFieldData.Basic +public import Physlib.Relativity.Fermions.Weyl.LeftHanded +public import Physlib.Relativity.Fermions.Weyl.RightHanded +/-! +# Model tables + +## i. Overview + +A gauge-theory model is written down, as in a model-building tool, as a *table*: the gauge +group as a list of factors, and one row per field recording its number of generations, +its Lorentz character and one charge per factor — an integer charge under a `U(1)` factor, +a representation label under an `SU(n)` factor. + +This file defines the tables over any local gauge data and compiles them into the general +theory. A gauge group is a list of `Factor`s, each a `U1Factor` or an `SUFactor` of the +local gauge data; the charges of a row form the tuple `Charges Γ` over the list, so that a +row reads `(1, .fund, .fund)`; the charges name a matrix representation `Charges.rep`, +assembled from the factors by the hypercharge twist and the Kronecker product; a row +compiles to a `MatterField` and a table to a `GaugeFieldData`. + +## ii. Key results + +- `LocalGaugeData.Factor`, `Factors` : a gauge group presented as a list of factors. +- `SURep`, `Charges` : the charge labels of a row and the charge tuple. +- `Charges.rep` : the matrix representation named by a charge tuple. +- `FermionRow`, `ScalarRow`, `Table` : the rows and the table. +- `FermionRow.matterField`, `ScalarRow.matterField`, `Table.fieldData` : the compilation. + +## iii. Table of contents + +- A. Factors and charge labels +- B. Charge tuples and their internal index +- C. The representation named by a charge tuple +- D. The rows and their matter fields +- E. The table and its field content + +-/ + +@[expose] public section + +open Matrix MatrixGroups TensorProduct + +namespace LocalGaugeData + +variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + +/-! + +## A. Factors and charge labels + +-/ + +/-- **A factor of the gauge group**, presented in the local gauge data: a `U(1)` factor or + an `SU(n)` factor. -/ +inductive Factor (jets : LocalGaugeData G 𝔤 G₀ 𝔤J) + /-- A `U(1)` factor. -/ + | U1 (F : U1Factor jets) + /-- An `SU(n)` factor. -/ + | SU {n : ℕ} (F : SUFactor jets (Fin n)) + +/-- **A gauge group presented by its factors.** -/ +abbrev Factors (jets : LocalGaugeData G 𝔤 G₀ 𝔤J) : Type := List (Factor jets) + +/-- **A representation label under `SU(n)`.** -/ +inductive SURep + /-- The singlet `1`. -/ + | singlet + /-- The fundamental `n`. -/ + | fund + /-- The antifundamental `n̄`. -/ + | antifund + deriving DecidableEq, Repr + +/-- The dimension of the representation of `SU(n)` a label names. -/ +abbrev SURep.dim (n : ℕ) : SURep → ℕ + | .singlet => 1 + | .fund => n + | .antifund => n + +variable {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} + +/-- The matrix representation of an `SU(n)` factor named by a label. -/ +noncomputable def SURep.rep {n : ℕ} (F : SUFactor jets (Fin n)) : + (r : SURep) → MatrixRep jets (Fin (r.dim n)) + | .singlet => MatrixRep.trivial + | .fund => F.fund + | .antifund => F.fund.conj + +/-- The charge a field carries under a factor: an integer under `U(1)`, a representation + label under `SU(n)`. -/ +abbrev Factor.Charge : Factor jets → Type + | .U1 _ => ℤ + | .SU _ => SURep + +/-! + +## B. Charge tuples and their internal index + +-/ + +/-- **The charge tuple** of a row: one charge per factor, as a nested pair so that a row + reads `(1, .fund, .fund)`. -/ +abbrev Charges : Factors jets → Type + | [] => Unit + | [f] => f.Charge + | f :: g :: gs => f.Charge × Charges (g :: gs) + +/-- **The internal index** of a field with the given charges: the product of the + `SU(n)`-representation indices; `U(1)` factors contribute no index. (A definition rather + than an abbreviation, so that instance search on `Idx Γ c` finds the instances below + instead of unfolding into a stuck match on `Γ`.) -/ +def Idx : (Γ : Factors jets) → Charges Γ → Type + | [], _ => Fin 1 + | [.U1 _], _ => Fin 1 + | [.SU (n := n) _], r => Fin (r.dim n) + | .U1 _ :: g :: gs, c => Idx (g :: gs) c.2 + | .SU (n := n) _ :: g :: gs, c => Fin (c.1.dim n) × Idx (g :: gs) c.2 + +/-- The index of a charge tuple is finite. -/ +@[instance_reducible] +def Idx.fintype : (Γ : Factors jets) → (c : Charges Γ) → Fintype (Idx Γ c) + | [], _ => inferInstanceAs (Fintype (Fin 1)) + | [.U1 _], _ => inferInstanceAs (Fintype (Fin 1)) + | [.SU (n := n) _], r => inferInstanceAs (Fintype (Fin (r.dim n))) + | .U1 _ :: g :: gs, c => Idx.fintype (g :: gs) c.2 + | .SU (n := n) _ :: g :: gs, c => + letI := Idx.fintype (g :: gs) c.2 + inferInstanceAs (Fintype (Fin (c.1.dim n) × Idx (g :: gs) c.2)) + +/-- The index of a charge tuple has decidable equality. -/ +@[instance_reducible] +def Idx.decidableEq : (Γ : Factors jets) → (c : Charges Γ) → DecidableEq (Idx Γ c) + | [], _ => inferInstanceAs (DecidableEq (Fin 1)) + | [.U1 _], _ => inferInstanceAs (DecidableEq (Fin 1)) + | [.SU (n := n) _], r => inferInstanceAs (DecidableEq (Fin (r.dim n))) + | .U1 _ :: g :: gs, c => Idx.decidableEq (g :: gs) c.2 + | .SU (n := n) _ :: g :: gs, c => + letI := Idx.decidableEq (g :: gs) c.2 + inferInstanceAs (DecidableEq (Fin (c.1.dim n) × Idx (g :: gs) c.2)) + +instance (Γ : Factors jets) (c : Charges Γ) : Fintype (Idx Γ c) := Idx.fintype Γ c + +instance (Γ : Factors jets) (c : Charges Γ) : DecidableEq (Idx Γ c) := Idx.decidableEq Γ c + +/-! + +## C. The representation named by a charge tuple + +-/ + +/-- **The matrix representation named by a charge tuple**: the Kronecker product of the + `SU(n)` representations the labels name, twisted by the charge powers of the `U(1)` + jets. -/ +noncomputable def Charges.rep : (Γ : Factors jets) → (c : Charges Γ) → MatrixRep jets (Idx Γ c) + | [], _ => MatrixRep.trivial + | [.U1 F], q => F.charge q MatrixRep.trivial + | [.SU F], r => SURep.rep F r + | .U1 F :: g :: gs, c => F.charge c.1 (Charges.rep (g :: gs) c.2) + | .SU F :: g :: gs, c => (SURep.rep F c.1).kron (Charges.rep (g :: gs) c.2) + +/-! + +## D. The rows and their matter fields + +-/ + +/-- The chirality of a fermion row: a left- or right-handed Weyl spinor. -/ +inductive Chirality + /-- A left-handed Weyl spinor. -/ + | L + /-- A right-handed Weyl spinor. -/ + | R + deriving DecidableEq, Repr + +/-- **A fermion row** of a table: the name of the field, its number of generations, its + chirality and its charges. -/ +structure FermionRow (Γ : Factors jets) where + /-- The name of the field. -/ + name : String + /-- The number of generations. -/ + generations : ℕ + /-- The chirality. -/ + chirality : Chirality + /-- The charges, one per factor. -/ + charges : Charges Γ + +/-- **A scalar row** of a table: the name of the field, its number of generations and its + charges. -/ +structure ScalarRow (Γ : Factors jets) where + /-- The name of the field. -/ + name : String + /-- The number of generations. -/ + generations : ℕ + /-- The charges, one per factor. -/ + charges : Charges Γ + +instance : Module.Finite ℂ Fermion.LeftHandedWeyl := + Module.Finite.of_basis Fermion.LeftHandedWeyl.basis + +instance : Module.Finite ℂ Fermion.RightHandedWeyl := + Module.Finite.of_basis Fermion.RightHandedWeyl.basis + +/-- The mass weight of a fermion, in the units in which a derivative has weight `2`. -/ +def fermionMassWeight : ℕ := 3 + +/-- The mass weight of a scalar, in the units in which a derivative has weight `2`. -/ +def scalarMassWeight : ℕ := 2 + +variable {Γ : Factors jets} + +/-- **The matter field of a fermion row**: a Weyl spinor of the row's chirality tensored + with the internal index of its charges, transforming in the representation the charges + name, of mass weight `3`. -/ +noncomputable def FermionRow.matterField (r : FermionRow Γ) : MatterField jets := + match r.chirality with + | .L => (Charges.rep Γ r.charges).matterField (LinearEquiv.refl ℂ _) + Fermion.LeftHandedWeyl.rep fermionMassWeight + | .R => (Charges.rep Γ r.charges).matterField (LinearEquiv.refl ℂ _) + Fermion.RightHandedWeyl.rep fermionMassWeight + +/-- **The matter field of a scalar row**: a Lorentz scalar with the internal index of its + charges, transforming in the representation the charges name, of mass weight `2`. -/ +noncomputable def ScalarRow.matterField (r : ScalarRow Γ) : MatterField jets := + (Charges.rep Γ r.charges).matterField (LinearEquiv.refl ℂ _) + (Representation.trivial ℂ SL(2,ℂ) ℂ) scalarMassWeight + +@[simp] +lemma FermionRow.matterField_massWeight (r : FermionRow Γ) : + r.matterField.massWeight = fermionMassWeight := by + cases h : r.chirality <;> simp [FermionRow.matterField, h] + +@[simp] +lemma ScalarRow.matterField_massWeight (r : ScalarRow Γ) : + r.matterField.massWeight = scalarMassWeight := rfl + +/-! + +## E. The table and its field content + +-/ + +/-- **A model table**: the gauge group as a list of factors, the fermion rows and the + scalar rows. -/ +structure Table (jets : LocalGaugeData G 𝔤 G₀ 𝔤J) where + /-- The gauge group. -/ + gauge : Factors jets + /-- The fermion rows. -/ + fermions : List (FermionRow gauge) + /-- The scalar rows. -/ + scalars : List (ScalarRow gauge) + +namespace Table + +variable [Module.Finite ℝ 𝔤] (T : Table jets) + +/-- The fermionic species of a table: a fermion row together with a generation. -/ +abbrev FermionSpecies : Type := + Σ i : Fin T.fermions.length, Fin (T.fermions.get i).generations + +/-- The bosonic species of a table: a scalar row together with a generation. -/ +abbrev BosonSpecies : Type := + Σ i : Fin T.scalars.length, Fin (T.scalars.get i).generations + +/-- **The field content of a table**: one matter field per species. -/ +noncomputable def fieldData : GaugeFieldData jets where + FermionSpecies := T.FermionSpecies + fermion s := (T.fermions.get s.1).matterField + BosonSpecies := T.BosonSpecies + boson s := (T.scalars.get s.1).matterField + +@[simp] +lemma fieldData_FermionSpecies : T.fieldData.FermionSpecies = T.FermionSpecies := rfl + +@[simp] +lemma fieldData_fermion (s : T.FermionSpecies) : + T.fieldData.fermion s = (T.fermions.get s.1).matterField := rfl + +@[simp] +lemma fieldData_BosonSpecies : T.fieldData.BosonSpecies = T.BosonSpecies := rfl + +@[simp] +lemma fieldData_boson (s : T.BosonSpecies) : + T.fieldData.boson s = (T.scalars.get s.1).matterField := rfl + +/-- Every fermionic species of a table has mass weight `3`. -/ +lemma fieldData_fermion_massWeight (s : T.FermionSpecies) : + (T.fieldData.fermion s).massWeight = fermionMassWeight := by simp + +/-- Every bosonic species of a table has mass weight `2`. -/ +lemma fieldData_boson_massWeight (s : T.BosonSpecies) : + (T.fieldData.boson s).massWeight = scalarMassWeight := by simp + +end Table + +end LocalGaugeData diff --git a/Physlib/Particles/StandardModel/Basic.lean b/Physlib/Particles/StandardModel/Basic.lean new file mode 100644 index 000000000..42e2d83d6 --- /dev/null +++ b/Physlib/Particles/StandardModel/Basic.lean @@ -0,0 +1,107 @@ +/- +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.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.OfFactors +/-! +# The Standard Model + +## i. Overview + +The Standard Model as a model table: the gauge group `SU(3) × SU(2) × U(1)` named by its +factors, one row per fermion field and one row per scalar field. Everything else is +derived: the local gauge data of the gauge group is assembled from the factors by +`LocalGaugeData.ofFactors`, and the table compiles, through +`Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.MatrixRep.Table`, to the field +content `StandardModel.Model.fieldData : GaugeFieldData gaugeData`, from which the general +theory derives the algebra of field operators and the gauge and Lorentz actions. + +Each row lists the name of the field, its number of generations, its chirality, and its +charges in the order of the factors: the `SU(3)` label, the `SU(2)` label and the +hypercharge. Hypercharges are integers, six times the conventional `Y`, so that the gauge +group acting is the honest `U(1)` of unitary jets. The right-handed singlets are +right-handed Weyl spinors in the fundamental of colour rather than conjugate left-handed +fields. + +## ii. Key results + +- `StandardModel.Model.gauge` : the gauge group, as a list of factors. +- `StandardModel.Model.gaugeData` : its local gauge data. +- `StandardModel.Model.fermions`, `scalars` : the field tables. +- `StandardModel.Model.fieldData` : the field content of the Standard Model. + +## iii. Table of contents + +- A. The gauge group +- B. The fields +- C. The field content + +-/ + +@[expose] public section + +open LocalGaugeData + +namespace StandardModel + +namespace Model + +/-! + +## A. The gauge group + +-/ + +/-- The gauge group `SU(3) × SU(2) × U(1)`, as a list of factors. -/ +abbrev gauge : List FactorSpec := [.SU 3, .SU 2, .U1] + +/-- The local gauge data of the Standard Model gauge group: jets of `SU(3) × SU(2) × U(1)` + gauge transformations with their Lie algebra of jets. -/ +noncomputable abbrev gaugeData := ofFactors gauge + +/-- The factors of the gauge group, as what the rows are charged under. -/ +noncomputable abbrev factors : Factors gaugeData := Factors.factors gauge + +/-! + +## B. The fields + +-/ + +/-- The fermion fields: `q ∼ (3, 2)_{1}`, `l ∼ (1, 2)_{-3}`, `u ∼ (3, 1)_{4}`, + `d ∼ (3, 1)_{-2}`, `e ∼ (1, 1)_{-6}`, three generations each. -/ +def fermions : List (FermionRow factors) := + [ ⟨"q", 3, .L, (.fund, .fund, 1)⟩, + ⟨"l", 3, .L, (.singlet, .fund, -3)⟩, + ⟨"u", 3, .R, (.fund, .singlet, 4)⟩, + ⟨"d", 3, .R, (.fund, .singlet, -2)⟩, + ⟨"e", 3, .R, (.singlet, .singlet, -6)⟩ ] + +/-- The scalar fields: the Higgs `H ∼ (1, 2)_{3}`. -/ +def scalars : List (ScalarRow factors) := [⟨"H", 1, (.singlet, .fund, 3)⟩] + +/-! + +## C. The field content + +-/ + +/-- **The Standard Model table.** -/ +noncomputable def table : Table gaugeData := ⟨factors, fermions, scalars⟩ + +/-- **The field content of the Standard Model**: the fifteen fermionic species (five rows + in three generations) and the Higgs, as matter fields of `gaugeData`. -/ +noncomputable def fieldData : GaugeFieldData gaugeData := table.fieldData + +/-- The Standard Model has fifteen fermionic species. -/ +lemma card_fermionSpecies : Fintype.card fieldData.FermionSpecies = 15 := by decide + +/-- The Standard Model has one bosonic species. -/ +lemma card_bosonSpecies : Fintype.card fieldData.BosonSpecies = 1 := by decide + +end Model + +end StandardModel diff --git a/Physlib/Particles/StandardModel/Model/Consistency.lean b/Physlib/Particles/StandardModel/Model/Consistency.lean new file mode 100644 index 000000000..8ab1fd2fa --- /dev/null +++ b/Physlib/Particles/StandardModel/Model/Consistency.lean @@ -0,0 +1,63 @@ +/- +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.StandardModel.Basic +public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData +public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet.GaugeAlgebraAction +/-! +# Consistency of the Standard Model table with the existing formalisation + +## i. Overview + +The Standard Model of `Physlib.Particles.StandardModel.Basic` is built from its table +alone. This file checks it against the hand-built formalisation: the local gauge data +assembled from the factors is the existing `StandardModel.localGaugeData`, and the quark +row acts by the existing colour–weak matrix of the quark doublet. + +## ii. Key results + +- `StandardModel.Model.localGaugeData_eq` : the gauge data of the table is the existing + local gauge data of the Standard Model. +- `StandardModel.Model.quarkDoublet_rep_mat` : the quark row reproduces + `QuarkDoublet.jetGaugeMatrix`. + +-/ + +@[expose] public section + +open LocalGaugeData Matrix + +namespace StandardModel + +namespace Model + +/-- The local gauge data assembled from the factors of the table is the existing local + gauge data of the Standard Model. -/ +theorem localGaugeData_eq : StandardModel.localGaugeData = gaugeData := rfl + +/-- The charges of the quark row. -/ +abbrev quarkCharges : Charges factors := (.fund, .fund, 1) + +/-- The quark row acts on its colour–weak index by the existing matrix `u · (U₃ ⊗ U₂)` of + the quark doublet, up to the trivial index of the `U(1)` factor. -/ +lemma quarkDoublet_rep_mat (U : JetGaugeGroupI) : + Matrix.reindex (Equiv.prodCongr (Equiv.refl (Fin 3)) (Equiv.prodUnique (Fin 2) (Fin 1))) + (Equiv.prodCongr (Equiv.refl (Fin 3)) (Equiv.prodUnique (Fin 2) (Fin 1))) + ((Charges.rep factors quarkCharges).mat U) + = QuarkDoublet.jetGaugeMatrix U := by + show Matrix.reindex (Equiv.prodCongr (Equiv.refl (Fin 3)) (Equiv.prodUnique (Fin 2) (Fin 1))) + (Equiv.prodCongr (Equiv.refl (Fin 3)) (Equiv.prodUnique (Fin 2) (Fin 1))) + (Matrix.kroneckerMap (· * ·) U.1.1 (Matrix.kroneckerMap (· * ·) U.2.1.1 + (MatterField.chargePow 1 U.2.2 • (1 : Matrix (Fin 1) (Fin 1) JetRing)))) + = QuarkDoublet.jetGaugeMatrix U + refine Matrix.ext fun i j => ?_ + simp [Matrix.kroneckerMap_apply, MatterField.chargePow, QuarkDoublet.jetGaugeMatrix] + ring + +end Model + +end StandardModel diff --git a/Physlib/Relativity/JetRing/Jacobi.lean b/Physlib/Relativity/JetRing/Jacobi.lean new file mode 100644 index 000000000..6cef130c5 --- /dev/null +++ b/Physlib/Relativity/JetRing/Jacobi.lean @@ -0,0 +1,93 @@ +/- +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.Relativity.JetRing.Matrix +public import Mathlib.LinearAlgebra.Matrix.Adjugate +/-! +# Jacobi's formula for matrices of jets + +## i. Overview + +Jacobi's formula `∂ det M = tr (∂M · adj M)` for a square matrix of jets, in the generality +needed by the jets of any special unitary group: it is what makes the Maurer–Cartan form +`i (∂U) U⁻¹` of an `SU(n)` jet traceless, since `det U = 1` and `U⁻¹ = adj U`. + +## ii. Key results + +- `JetRing.pderiv_finset_prod` : the Leibniz rule for a finite product. +- `JetRing.jacobi` : Jacobi's formula. + +## iii. Table of contents + +- A. The Leibniz rule for a finite product +- B. Jacobi's formula + +-/ + +@[expose] public section + +namespace JetRing + +open MvPowerSeries + +/-! + +## A. The Leibniz rule for a finite product + +-/ + +/-- The Leibniz rule for a finite product. -/ +lemma pderiv_finset_prod {ι : Type*} [DecidableEq ι] (μ : Fin 1 ⊕ Fin 3) (s : Finset ι) + (f : ι → JetRing) : + pderiv ℂ μ (∏ i ∈ s, f i) = ∑ i ∈ s, (∏ j ∈ s.erase i, f j) * pderiv ℂ μ (f i) := by + induction s using Finset.induction_on with + | empty => simp + | insert a s ha ih => + rw [Finset.prod_insert ha, Derivation.leibniz, smul_eq_mul, smul_eq_mul, ih, + Finset.sum_insert ha, Finset.erase_insert ha, Finset.mul_sum, add_comm] + congr 1 + refine Finset.sum_congr rfl fun i hi => ?_ + have hia : a ≠ i := fun h => ha (h ▸ hi) + rw [Finset.erase_insert_of_ne hia, + Finset.prod_insert (fun h => ha (Finset.mem_of_mem_erase h)), mul_assoc] + +/-! + +## B. Jacobi's formula + +-/ + +/-- **Jacobi's formula**: the derivative of a determinant is the trace of the derivative + against the adjugate. -/ +lemma jacobi {κ : Type} [Fintype κ] [DecidableEq κ] (M : Matrix κ κ JetRing) + (μ : Fin 1 ⊕ Fin 3) : + pderiv ℂ μ M.det = (M.map (pderiv ℂ μ) * M.adjugate).trace := by + have hcol : ∀ (σ : Equiv.Perm κ) (j : κ), + (∏ i ∈ Finset.univ.erase j, M (σ i) i) * pderiv ℂ μ (M (σ j) j) + = ∏ i, (M.updateCol j fun k => pderiv ℂ μ (M k j)) (σ i) i := by + intro σ j + rw [← Finset.mul_prod_erase Finset.univ _ (Finset.mem_univ j), Matrix.updateCol_self, + mul_comm] + congr 1 + exact Finset.prod_congr rfl fun i hi => by + rw [Matrix.updateCol_ne (Finset.ne_of_mem_erase hi)] + calc pderiv ℂ μ M.det + = ∑ j, ∑ σ : Equiv.Perm κ, Equiv.Perm.sign σ • + ∏ i, (M.updateCol j fun k => pderiv ℂ μ (M k j)) (σ i) i := by + rw [Matrix.det_apply, map_sum] + simp only [Units.smul_def, map_zsmul, pderiv_finset_prod, Finset.smul_sum, hcol] + exact Finset.sum_comm + _ = ∑ j, Matrix.mulVec M.adjugate (fun k => pderiv ℂ μ (M k j)) j := by + refine Finset.sum_congr rfl fun j _ => ?_ + rw [← Matrix.det_apply, ← Matrix.cramer_apply, Matrix.cramer_eq_adjugate_mulVec] + _ = (M.map (pderiv ℂ μ) * M.adjugate).trace := by + simp only [Matrix.mulVec, dotProduct, Matrix.trace, Matrix.diag, Matrix.mul_apply, + Matrix.map_apply] + rw [Finset.sum_comm] + exact Finset.sum_congr rfl fun j _ => Finset.sum_congr rfl fun k _ => mul_comm _ _ + +end JetRing diff --git a/Physlib/Relativity/JetRing/Taylor.lean b/Physlib/Relativity/JetRing/Taylor.lean new file mode 100644 index 000000000..77e91209a --- /dev/null +++ b/Physlib/Relativity/JetRing/Taylor.lean @@ -0,0 +1,51 @@ +/- +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.Relativity.JetRing.Basic +/-! +# Taylor determinacy of jets + +## i. Overview + +A jet is determined by the base-point values of its iterated derivatives, and a jet all of +whose first derivatives vanish is the constant jet of its value. These are the two facts +that make the jets of a matrix gauge group a faithful package of local gauge data, in the +sense of `LocalGaugeData.Faithful`. + +## ii. Key results + +- `JetRing.ext_of_constantCoeff_foldl_pderiv` : Taylor determinacy. +- `JetRing.eq_C_of_pderiv_eq_zero` : a jet with vanishing derivatives is constant. + +-/ + +@[expose] public section + +namespace JetRing + +open MvPowerSeries + +/-- **Taylor determinacy**: two jets with the same base-point values of all iterated + derivatives are equal. -/ +lemma ext_of_constantCoeff_foldl_pderiv {f g : JetRing} + (h : ∀ s : Multiset (Fin 1 ⊕ Fin 3), + constantCoeff (s.foldl (fun h ρ => pderiv ℂ ρ h) f) + = constantCoeff (s.foldl (fun h ρ => pderiv ℂ ρ h) g)) : f = g := by + ext m + obtain ⟨s, rfl⟩ : ∃ s : Multiset (Fin 1 ⊕ Fin 3), s.toFinsupp = m := + ⟨Multiset.toFinsupp.symm m, Multiset.toFinsupp.apply_symm_apply m⟩ + have hs := h s + rw [constantCoeff_foldl_pderiv, constantCoeff_foldl_pderiv] at hs + exact mul_left_cancel₀ (Nat.cast_ne_zero.mpr + (Finset.prod_ne_zero_iff.mpr fun _ _ => Nat.factorial_ne_zero _)) hs + +/-- A jet all of whose first derivatives vanish is the constant jet of its value. -/ +lemma eq_C_of_pderiv_eq_zero {f : JetRing} (hf : ∀ μ, pderiv ℂ μ f = 0) : + f = C (constantCoeff f) := + pderiv.ext (fun i => by rw [hf i, pderiv_C]) (by rw [constantCoeff_C]) + +end JetRing From 1174927d3629008cbeab49ff9cd16e9c8690eaac Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Fri, 11 Sep 2026 07:04:06 +0100 Subject: [PATCH 319/367] feat: Add start of dicussion for LocalGaugeGroup --- Draft.md | 111 +++++++++++++++++++++++++------------------------------ 1 file changed, 50 insertions(+), 61 deletions(-) diff --git a/Draft.md b/Draft.md index 7a50940ba..a240ec5d6 100644 --- a/Draft.md +++ b/Draft.md @@ -21,71 +21,60 @@ Of course, there is no question of the actual correctness of these theorems. Thu ## 2. Overview -In this paper we formalize the Standard Model Lagrangian. To do that we must first say what a Lagrangian is, and it is worth building that up from what is actually in front of us. -At the point `x` we have the fields: the gauge bosons, the fermions and the Higgs. We also have their conjugates, and all of their derivatives — `∂_μ H`, `∂_μ∂_ν H`, and so on. These are the ingredients, and a Lagrangian is built from nothing else. +The basic ingredient of a gauge theory is the +underlying gauge group. The full gauge group +of a theory is usually encoded by some class +of functions from spacetime to the global +gauge group `G₀`. Physicists are usually agnostic +about precisely what 'class' should to be considered. +The reason for this, is that physicists usually only +care about the local action of the full gauge group on the fields. +For such a local action, one only needs certain bits of information +about the whole gauge group, and in particular only +can be pretty agnostic about the class of functions used. + +The primiary role of the type `LocalGaugeData G 𝔤 G₀ 𝔤J` is to encode exactly this +local gauge data needed. Starting with the input data. +The group `G₀` represents the global gauge group of the theory. +The the Standard Model, this is `SU(3) × SU(2) × U(1)` (here we ignore +the possibility of discrete quotients). The Lie algebra `𝔤` +is the Lie algebra of the global gauge group `G₀`. + +The group `GJ` is slightly more complicated. Locally, at +a point `x` in spacetime, the +full gauge group appears through its action on fields +and finite-order derivatives. This action only +depends on the value of a gauge transformation +and its finite derivatives at the point `x`. In +otherwords, the possible taylor series at the point `x`. +If we assume that all smooth functions are valid gauge transformations +(the only time we make an assumption about the underlying class +of fields), then Borel's theorem tells us that every +possible taylor series (within the +constraints of the group) can arise from some smooth gauge transformation +(even if they have convergence zero). All such taylor +series form a group, which is precisely the local gauge group `GJ`. +How best to define `GJ` best depends on the group `G₀` and thus, +we include it here as input data. + +The Lie algebra `𝔤J` is to `𝔤` what `GJ` is to `G₀`. + +Let `G₀` be `SU(2)`, so that `𝔤` is the traceless self-adjoint matrices. +Because `SU(2)` is a matrix Lie group, a gauge transformation is a +matrix of functions on spacetime, and its Taylor series at `x` is just +the Taylor series of each of its four entries. The type of all +such (formal) Taylor series is what we call `JetRing`. +Since a Taylor series of a product of functions is the +product of their Taylor series, the traditional group law +carries over unchanged: it is still matrix multiplication, only now +with entries in `JetRing` rather than in `ℂ`. The same goes for the +equations `U† U = 1` and `det U = 1` which cut `SU(2)` out, and reading +them over `JetRing` is what gives us `GJ`. Likewise `𝔤J` is the +traceless self-adjoint matrices over `JetRing`. -To build one we add these ingredients, scale them by complex numbers, and multiply them together. Those three operations are exactly what an associative algebra over `ℂ` provides — so whatever the fields are, they are elements of such an algebra, which we call `B`. -Nothing further about B is ever used: no norm, no topology, no involution, and no commitment as to what its elements are. We therefore do not fix it. B is an arbitrary `ℂ`-algebra, and the fields are an arbitrary family of its elements, labelled the way the Standard Model fields are labelled. -What we do need to know is how those elements behave inside `B`: - -- how they multiply past one another — the fermionic ones anticommute, the bosonic ones commute; -- how the gauge group acts on them; -- how the Lorentz group acts on them; -- what mass dimension each one carries. - -`IsStandardModel` is precisely this package: an algebra `B`, a family of elements in it, an action of the gauge group and an action of the Lorentz group, together with the requirement that they fit together as the Standard Model fields do. - - - - -**The data structures** - -The main story is carried by three data structures. The first two are predicates — conditions on an arbitrary algebra B and a family of operators in it — while the third is a concrete algebra. - -- `IsStandardModel`: the condition that a family of operators in an algebra `B` behaves like the Standard Model fields — the gauge bosons, fermions and Higgs, together with their conjugates and all their derivatives, at a single implicit space-time point. It records how these operators commute, and how the full gauge group and the Lorentz group act on them. -- `IsCovStandardModel`: the same in covariant form. The gauge bosons are replaced by their field strengths, every derivative by a covariant derivative, and correspondingly only the global gauge group acts rather than the full one. -- `JetAlgebra`: the smallest concrete `B` containing all of these operators, subject to no relations beyond their statistics — bosonic generators commute, fermionic ones anticommute. - -**The connecting theorems** - -These three structures are interconnected to one another through a series of theorems: -1. `IsStandardModel.isCovStandardModel` — Every `IsStandardModel` defines a `IsCovStandardModel`, through the field strengths and the covariant derivatives. -2. `JetAlgebra.isStandardModel` — Within `JetAlgebra` there is an instance of `IsStandardModel`. -3. `JetAlgebra.isStandardModel_fieldAlgebra_eq_top` — Furthermore, the adjoin of the fields in `IsStandardModel` fully describe `JetAlgebra`. - - -**The reduction of invariants** - -These connecting theorems can be used -to form a reduction in the invariances: -1. `IsStandardModel.forall_repJet_and_repLorentz_eq_iff` — Every invariant under the full gauge group and the Lorentz group defined through the fields in `IsStandardModel` descends from an invariant of `IsCovStandardModel` under the global gauge group and the Lorentz group. This means we only have to deal with covariant derivatives, the field strengths, the global gauge group, and the Lorentz group when looking for invariants. -2. `JetAlgebra.isStandardModel_fieldAlgebra_eq_top`(corollary of this) — Every invariant of `JetAlgebra` is an invariant defined through `IsStandardModel`. - - -**The invariants theorems** - -Working back up the chain, we get an explict form of the invariants. Each of these give the explicit classification of the terms in the SM lagrangian up to total-derivatives, in the corresponding (general) contexts. -1. `IsCovStandardModel.mem_massWeightSubmoduleLE_eight_sup_and_gauge_lorentz_invariant_iff_lagrangian` — The full classification of the invariants of `IsCovStandardModel` up to mass-dimension 4. They are spanned by - - the constant `1`; - - the Higgs mass term `H†H`; - - the Higgs quartic `(H†H)²`, the Higgs kinetic term `∂^μH† ∂_μH`, and the two box terms `(□H†)H` and `H†□H`; - - the gauge kinetic terms `G^a_μν G^a^μν`, `W^a_μν W^a^μν`, `B_μν B^μν`, the corresponding θ-terms `ε^μνρσ G^a_μν G^a_ρσ` and its `W`, `B` analogues, and the contractions of the twice-derived hypercharge field `∂_μ∂_ν B_ρσ`; - - the fermion kinetic terms `ψ̄ σ̄^μ ∂_μ ψ`, one for each of the ten species and each pair of generations; - - the Yukawa couplings `H†Q d̄`, `ε H Q ū`, `H†L ē` and their conjugates, over each pair of generations. -2. `IsStandardModel.mem_massWeightSubmoduleLE_eight_and_invariant_iff_lagrangian` — From this, the full classification of the invariants of `IsStandardModel` up to mass-dimension 4. -3. `JetAlgebra.mem_massWeightSubmoduleLE_eight_and_invariant_iff_lagrangian` — Then, from this, the full classification of the invariants of `JetAlgebra`. - - -**Supporting API** -All of the above are supported by API around the Gauge group, the Lorentz group, and the individual matter fields. We discuss the main API here: -- *Lorentz group invariants*: Explicit classification of the full-group invariants in an algebra of terms which transform in certain representations. -- *Global gauge group invariants*: Explicit classification of the full-group invariants in an algebra of terms which transform in certain representations. -- *Fermions*: Specification of the underlying vector spaces, the Lorentz group action, the local and global gauge group actions on them. -- *Higgs*: Specification of the underlying vector space of the Higgs, the Lorentz group action, the local and global gauge group actions on it. -- *Gauge boson*: Specification of the Gauge algebra, the adjoint action, Maurer-Cartan terms etc, in this specific setting. ## 3. The details From 4e554a0d99c970e88fceea24c048e36c2488ca9f Mon Sep 17 00:00:00 2001 From: Joseph Tooby-Smith <72603918+jstoobysmith@users.noreply.github.com> Date: Fri, 11 Sep 2026 09:22:35 +0100 Subject: [PATCH 320/367] feat: Some TODOs --- .../GaugeTheory/GaugeFieldData/Basic.lean | 3 +++ .../GaugeTheory/LocalFieldAlgebra/Jet.lean | 4 ++++ .../GaugeTheory/LocalGaugeData/OfFactors.lean | 3 +++ .../AlgebraRealization/HiggsAlgebraCovRealization/Basic.lean | 4 ++++ .../StandardModel/HiggsBoson/JetAlgebra/Algebra.lean | 4 ++++ 5 files changed, 18 insertions(+) diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/Basic.lean index 1b0434db3..aa92b1eec 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/Basic.lean @@ -146,4 +146,7 @@ abbrev FermionValue (i : T.FermionSpecies) : Type := (T.fermion i).V /-- The value space of a bosonic species. -/ abbrev BosonValue (j : T.BosonSpecies) : Type := (T.boson j).V +TODO (lines := 143-148) (date := 2026-09-11) "I think these names should likely be + changed to something more descriptive." + end GaugeFieldData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Jet.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Jet.lean index ef35fd6d9..3fc6cfaac 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Jet.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Jet.lean @@ -32,6 +32,10 @@ provides the basic toolkit for them, independent of any gauge group: open TensorProduct MvPowerSeries variable {V : Type} [AddCommGroup V] [Module ℂ V] + +TODO (date := 2026-09-11) "If we actually need anything in this file, it should + be related to `JetComponentSpace` of a `MatterField` and it should appear in there." + /-! ## `V`-valued jets diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/OfFactors.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/OfFactors.lean index 21fe16306..a9a290591 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/OfFactors.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/OfFactors.lean @@ -164,6 +164,9 @@ def 𝔤J : List FactorSpec → Type | [f] => f.𝔤J | f :: g :: gs => f.𝔤J × 𝔤J (g :: gs) +TODO (lines := 142-166) (date := 2026-09-11) "These could all + likely be defined with the typical List.foldr construction, or List.prod of similar." + instance : Bracket Unit Unit := ⟨fun _ _ => ()⟩ instance : LieRing Unit where diff --git a/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/Basic.lean b/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/Basic.lean index f342fb708..e6ec2ed83 100644 --- a/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/Basic.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/Basic.lean @@ -129,6 +129,10 @@ structure HiggsAlgebraCovRealization (B : Type) [Ring B] [Algebra ℂ B] repLorentz_mul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂ +TODO (lines := 96-131) (date := 2026-09-11) "Should be generalized + to a general gauge theory to `ScalarAlgebraCovRealization`, + and that instance used here." + set_option linter.unusedVariables false namespace HiggsAlgebraCovRealization diff --git a/Physlib/Particles/StandardModel/HiggsBoson/JetAlgebra/Algebra.lean b/Physlib/Particles/StandardModel/HiggsBoson/JetAlgebra/Algebra.lean index 2dfe73a62..e8a73d8ea 100644 --- a/Physlib/Particles/StandardModel/HiggsBoson/JetAlgebra/Algebra.lean +++ b/Physlib/Particles/StandardModel/HiggsBoson/JetAlgebra/Algebra.lean @@ -60,6 +60,10 @@ namespace StandardModel they commute — the Higgs is a boson. -/ abbrev HiggsJetAlgebra : Type := BosonicAlgebra HiggsVec.matterField +TODO (lines := 56-62) (date := 2026-09-11) "We should no longer + need this result, we should just be able to use the general results + from gauge Theory." + namespace HiggsJetAlgebra /-! From 18f20c983348f5fca0814d10e3518669890b8f7e Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Fri, 11 Sep 2026 12:55:38 +0400 Subject: [PATCH 321/367] =?UTF-8?q?refactor:=20Reorder=20LocalGaugeData=20?= =?UTF-8?q?to=20G=E2=82=80=20=F0=9D=94=A4=20GJ=20=F0=9D=94=A4J=20and=20ren?= =?UTF-8?q?ame=20jet=20group=20G=20to=20GJ?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GaugeJetAlgebra/GaugeAction.lean | 66 +++++++++---------- .../GaugeJetAlgebra/GaugeField.lean | 8 +-- .../GaugeBoson/Realization/Basic.lean | 22 +++---- .../GaugeBoson/Realization/FieldStrength.lean | 12 ++-- .../GaugeBoson/Realization/GaugeLaw.lean | 24 +++---- .../GaugeBoson/Realization/Symmetrized.lean | 20 +++--- .../Realization/TransformsInAdjoint.lean | 18 ++--- .../GaugeTheory/GaugeFieldData/Basic.lean | 20 +++--- .../GaugeFieldData/BosonGenerators.lean | 56 ++++++++-------- .../GaugeFieldData/BosonMatterField.lean | 16 ++--- .../GaugeFieldData/BosonModule.lean | 6 +- .../GaugeFieldData/FermionGenerators.lean | 56 ++++++++-------- .../GaugeFieldData/FermionMatterField.lean | 16 ++--- .../GaugeFieldData/FermionModule.lean | 6 +- .../GaugeTheory/LocalFieldAlgebra/Basic.lean | 6 +- .../LocalFieldAlgebra/FieldAlgebra/Basic.lean | 6 +- .../FieldAlgebra/ConstantAction.lean | 14 ++-- .../FieldAlgebra/GaugeAction.lean | 32 ++++----- .../FieldAlgebra/JetDeriv.lean | 6 +- .../FieldAlgebra/JetDerivClass.lean | 6 +- .../FieldAlgebra/JetDerivConstruction.lean | 12 ++-- .../FieldAlgebra/LorentzAction.lean | 6 +- .../FieldAlgebra/MassDim.lean | 6 +- .../LocalFieldAlgebra/FieldAlgebra/Prod.lean | 6 +- .../FieldAlgebra/Statistics.lean | 12 ++-- .../LocalGaugeData/AdjointCoeff.lean | 44 ++++++------- .../GaugeTheory/LocalGaugeData/Basic.lean | 60 ++++++++--------- .../LocalGaugeData/InfinitesimalAction.lean | 42 ++++++------ .../LocalGaugeData/MaurerCartan.lean | 26 ++++---- .../GaugeTheory/LocalGaugeData/OfFactors.lean | 6 +- .../GaugeTheory/LocalGaugeData/Prod.lean | 4 +- .../GaugeTheory/LocalGaugeData/SU/Basic.lean | 2 +- .../LocalGaugeData/TransformsIn.lean | 26 ++++---- .../LocalGaugeData/Truncation.lean | 54 +++++++-------- .../GaugeTheory/LocalGaugeData/U1.lean | 2 +- .../GaugeTheory/MatterField/Basic.lean | 28 ++++---- .../GaugeTheory/MatterField/Charge.lean | 4 +- .../MatterField/CovariantDeriv.lean | 20 +++--- .../GaugeTheory/MatterField/FieldAlgebra.lean | 12 ++-- .../MatterField/JetComponentSpace/Basic.lean | 6 +- .../JetComponentSpace/GaugeAction.lean | 50 +++++++------- .../MatterField/MatrixRep/Basic.lean | 22 +++---- .../MatterField/MatrixRep/Constructions.lean | 6 +- .../MatterField/MatrixRep/Factors.lean | 26 ++++---- .../MatterField/MatrixRep/Table.lean | 12 ++-- .../GaugeTheory/MatterField/Pi.lean | 20 +++--- .../GaugeTheory/MatterField/Prod.lean | 12 ++-- .../GaugeGroup/LocalGaugeData.lean | 4 +- .../Matter/BosonicAlgebra/Basic.lean | 6 +- .../Matter/BosonicAlgebra/GaugeAction.lean | 22 +++---- .../Matter/BosonicAlgebra/JetDeriv.lean | 6 +- .../Matter/BosonicAlgebra/LorentzAction.lean | 6 +- .../Matter/BosonicAlgebra/MassDim.lean | 6 +- .../Matter/BosonicAlgebra/MassWeightPoly.lean | 6 +- .../Matter/BosonicAlgebra/Prod.lean | 6 +- .../Matter/BosonicAlgebra/TransformsIn.lean | 10 +-- .../Matter/FermionicAlgebra/Basic.lean | 6 +- .../Matter/FermionicAlgebra/GaugeAction.lean | 22 +++---- .../Matter/FermionicAlgebra/JetDeriv.lean | 6 +- .../FermionicAlgebra/LorentzAction.lean | 6 +- .../Matter/FermionicAlgebra/MassDim.lean | 6 +- .../FermionicAlgebra/MassWeightPoly.lean | 6 +- .../Matter/FermionicAlgebra/Prod.lean | 6 +- .../Matter/FermionicAlgebra/TransformsIn.lean | 10 +-- 64 files changed, 543 insertions(+), 539 deletions(-) diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/GaugeAction.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/GaugeAction.lean index 009fdc273..f20bf4b09 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/GaugeAction.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/GaugeAction.lean @@ -53,9 +53,9 @@ gives the cocycle identity for the Maurer–Cartan shift. 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 {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] +variable {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] +variable {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} set_option maxHeartbeats 1000000 @@ -73,13 +73,13 @@ namespace GaugeBoson variable (jets) in /-- 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 : G) (p : Multiset (Fin 1 ⊕ Fin 3)) : +noncomputable def adjointTransport (U : GJ) (p : Multiset (Fin 1 ⊕ Fin 3)) : (GaugeBoson 𝔤) →ₗ[ℝ] (GaugeBoson 𝔤) := (valLinEquiv 𝔤).symm.toLinearMap ∘ₗ TensorProduct.map LinearMap.id (jets.adjointCoeff U p) ∘ₗ (valLinEquiv 𝔤).toLinearMap -lemma adjointTransport_mk_tmul (U : G) (p : Multiset (Fin 1 ⊕ Fin 3)) +lemma adjointTransport_mk_tmul (U : GJ) (p : Multiset (Fin 1 ⊕ Fin 3)) (v : Lorentz.CoVector) (a : 𝔤) : adjointTransport jets U p ⟨v ⊗ₜ[ℝ] a⟩ = ⟨v ⊗ₜ[ℝ] jets.adjointCoeff U p a⟩ := rfl @@ -101,7 +101,7 @@ lemma adjointTransport_one (p : Multiset (Fin 1 ⊕ Fin 3)) : simp /-- The adjoint transport of a product: the antidiagonal convolution of transports. -/ -lemma adjointTransport_mul (U V : G) (p : Multiset (Fin 1 ⊕ Fin 3)) : +lemma adjointTransport_mul (U V : GJ) (p : Multiset (Fin 1 ⊕ Fin 3)) : adjointTransport jets (U * V) p = (p.antidiagonal.map fun r => adjointTransport jets U r.1 ∘ₗ adjointTransport jets V r.2).sum := by @@ -133,7 +133,7 @@ lemma adjointTransport_mul (U V : G) (p : Multiset (Fin 1 ⊕ Fin 3)) : /-- 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 : G) +lemma dualMap_adjointTransport_componentDual (U : GJ) (p : Multiset (Fin 1 ⊕ Fin 3)) (ω : Module.Dual ℝ Lorentz.CoVector) (φ : Module.Dual ℝ 𝔤) : (adjointTransport jets U p).dualMap ((componentDual 𝔤) ω φ) @@ -158,7 +158,7 @@ namespace GaugeJetAlgebra variable (jets) in /-- 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 : G) (s : Multiset (Fin 1 ⊕ Fin 3)) : +noncomputable def transportFun (U : GJ) (s : Multiset (Fin 1 ⊕ Fin 3)) : Module.Dual ℝ (GaugeBoson 𝔤) →ₗ[ℝ] (GaugeBoson.JetComponentSpace 𝔤) := (s.antidiagonal.map fun p => (TensorProduct.mk ℝ DerivAlgebraReal (Module.Dual ℝ (GaugeBoson 𝔤)) @@ -169,11 +169,11 @@ variable (jets) 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) : +noncomputable def transport (U : GJ) : (GaugeBoson.JetComponentSpace 𝔤) →ₗ[ℝ] (GaugeBoson.JetComponentSpace 𝔤) := TensorProduct.lift (DerivAlgebraReal.basisMultiset.constr ℝ (transportFun jets U)) -lemma transport_basis_tmul (U : G) (s : Multiset (Fin 1 ⊕ Fin 3)) +lemma transport_basis_tmul (U : GJ) (s : Multiset (Fin 1 ⊕ Fin 3)) (ψ : Module.Dual ℝ (GaugeBoson 𝔤)) : transport jets U (DerivAlgebraReal.basisMultiset s ⊗ₜ[ℝ] ψ) = (s.antidiagonal.map fun p => @@ -206,7 +206,7 @@ lemma _root_.GaugeBoson.JetComponentSpace.ext_of_basis | 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 jets (1 : G) = LinearMap.id := by +lemma transport_one : transport jets (1 : GJ) = 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]), @@ -224,7 +224,7 @@ lemma transport_one : transport jets (1 : G) = LinearMap.id := by /-- 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 : G) : +lemma transport_mul (U V : GJ) : transport jets (U * V) = transport jets V ∘ₗ transport jets U := by refine GaugeBoson.JetComponentSpace.ext_of_basis fun s ψ => ?_ have hdual : ∀ (p : Multiset (Fin 1 ⊕ Fin 3) × Multiset (Fin 1 ⊕ Fin 3)), @@ -279,7 +279,7 @@ variable (jets) in `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)) : +noncomputable def mcBosonCoeff (U : GJ) (s : Multiset (Fin 1 ⊕ Fin 3)) : (GaugeBoson 𝔤) := ⟨∑ μ, Lorentz.CoVector.basis μ ⊗ₜ[ℝ] jets.evalLie (jets.iteratedDeriv s (jets.maurerCartan U μ))⟩ @@ -294,13 +294,13 @@ lemma mcBosonCoeff_one (s : Multiset (Fin 1 ⊕ Fin 3)) : mcBosonCoeff jets 1 s /-- 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 : G) (s : Multiset (Fin 1 ⊕ Fin 3)) : +lemma mcBosonCoeff_mul (U V : GJ) (s : Multiset (Fin 1 ⊕ Fin 3)) : mcBosonCoeff jets (U * V) s = mcBosonCoeff jets U s + (s.antidiagonal.map fun p => GaugeBoson.adjointTransport jets U p.1 (mcBosonCoeff jets V p.2)).sum := by apply (GaugeBoson.valLinEquiv 𝔤).injective - have hE : ∀ (W : G) (t : Multiset (Fin 1 ⊕ Fin 3)), + have hE : ∀ (W : GJ) (t : Multiset (Fin 1 ⊕ Fin 3)), (GaugeBoson.valLinEquiv 𝔤) (mcBosonCoeff jets W t) = ∑ μ, Lorentz.CoVector.basis μ ⊗ₜ[ℝ] jets.evalLie (jets.iteratedDeriv t @@ -348,11 +348,11 @@ variable (jets) 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 𝔤) →ₗ[ℝ] ℝ := +noncomputable def mcShift (U : GJ) : (GaugeBoson.JetComponentSpace 𝔤) →ₗ[ℝ] ℝ := TensorProduct.lift (DerivAlgebraReal.basisMultiset.constr ℝ fun s => Module.Dual.eval ℝ (GaugeBoson 𝔤) (mcBosonCoeff jets U s)) -lemma mcShift_basis_tmul (U : G) (s : Multiset (Fin 1 ⊕ Fin 3)) +lemma mcShift_basis_tmul (U : GJ) (s : Multiset (Fin 1 ⊕ Fin 3)) (ψ : Module.Dual ℝ (GaugeBoson 𝔤)) : mcShift jets U (DerivAlgebraReal.basisMultiset s ⊗ₜ[ℝ] ψ) = ψ (mcBosonCoeff jets U s) := by @@ -360,12 +360,12 @@ lemma mcShift_basis_tmul (U : G) (s : Multiset (Fin 1 ⊕ Fin 3)) rfl @[simp] -lemma mcShift_one : mcShift jets (1 : G) = 0 := by +lemma mcShift_one : mcShift jets (1 : GJ) = 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) : +lemma mcShift_mul (U V : GJ) : mcShift jets (U * V) = mcShift jets V ∘ₗ transport jets U + mcShift jets U := by refine GaugeBoson.JetComponentSpace.ext_of_basis fun s ψ => ?_ rw [LinearMap.add_apply, LinearMap.comp_apply, mcShift_basis_tmul, mcBosonCoeff_mul, @@ -388,12 +388,12 @@ variable (jets) 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) : +noncomputable def gaugeGen (U : GJ) : (GaugeBoson.JetComponentSpace 𝔤) →ₗ[ℝ] (GaugeJetAlgebra 𝔤) := (SymmetricAlgebra.ι ℝ (GaugeBoson.JetComponentSpace 𝔤)).comp (transport jets U⁻¹) + (Algebra.linearMap ℝ (GaugeJetAlgebra 𝔤)).comp (mcShift jets U⁻¹) -lemma gaugeGen_apply (U : G) (x : (GaugeBoson.JetComponentSpace 𝔤)) : +lemma gaugeGen_apply (U : GJ) (x : (GaugeBoson.JetComponentSpace 𝔤)) : gaugeGen jets U x = SymmetricAlgebra.ι ℝ _ (transport jets U⁻¹ x) + algebraMap ℝ (GaugeJetAlgebra 𝔤) (mcShift jets U⁻¹ x) := rfl @@ -401,7 +401,7 @@ variable (jets) 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 +noncomputable def repJet : Representation ℝ GJ (GaugeJetAlgebra 𝔤) where toFun U := (SymmetricAlgebra.lift (gaugeGen jets U)).toLinearMap map_one' := by suffices h : SymmetricAlgebra.lift (gaugeGen jets 1) = AlgHom.id ℝ (GaugeJetAlgebra 𝔤) by @@ -430,12 +430,12 @@ noncomputable def repJet : Representation ℝ G (GaugeJetAlgebra 𝔤) where variable (jets) 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) : +noncomputable def repJetAlgHom (U : GJ) : (GaugeJetAlgebra 𝔤) →ₐ[ℝ] (GaugeJetAlgebra 𝔤) := SymmetricAlgebra.lift (gaugeGen jets U) @[simp] -lemma repJet_ι (U : G) (x : (GaugeBoson.JetComponentSpace 𝔤)) : +lemma repJet_ι (U : GJ) (x : (GaugeBoson.JetComponentSpace 𝔤)) : repJet jets U (SymmetricAlgebra.ι ℝ _ x) = SymmetricAlgebra.ι ℝ _ (transport jets U⁻¹ x) + algebraMap ℝ (GaugeJetAlgebra 𝔤) (mcShift jets U⁻¹ x) := by @@ -444,19 +444,19 @@ lemma repJet_ι (U : G) (x : (GaugeBoson.JetComponentSpace 𝔤)) : SymmetricAlgebra.lift_ι_apply, gaugeGen_apply] @[simp] -lemma repJet_apply_one (U : G) : +lemma repJet_apply_one (U : GJ) : repJet jets U (1 : (GaugeJetAlgebra 𝔤)) = 1 := by rw [show repJet jets U (1 : (GaugeJetAlgebra 𝔤)) = SymmetricAlgebra.lift (gaugeGen jets U) 1 from rfl, map_one] -lemma repJet_apply_mul (U : G) (x y : (GaugeJetAlgebra 𝔤)) : +lemma repJet_apply_mul (U : GJ) (x y : (GaugeJetAlgebra 𝔤)) : repJet jets U (x * y) = repJet jets U x * repJet jets U y := by rw [show repJet jets U (x * y) = SymmetricAlgebra.lift (gaugeGen jets U) (x * y) from rfl, map_mul] rfl @[simp] -lemma repJet_algebraMap (U : G) (r : ℝ) : +lemma repJet_algebraMap (U : GJ) (r : ℝ) : repJet jets U (algebraMap ℝ (GaugeJetAlgebra 𝔤) r) = algebraMap ℝ (GaugeJetAlgebra 𝔤) r := by rw [show repJet jets U (algebraMap ℝ (GaugeJetAlgebra 𝔤) r) @@ -471,7 +471,7 @@ lemma repJet_algebraMap (U : G) (r : ℝ) : /-- The component covector at `μ` picks the `μ`-th Maurer–Cartan Taylor coefficient out of the shift. -/ -lemma componentDual_dualBasis_mcBosonCoeff (W : G) +lemma componentDual_dualBasis_mcBosonCoeff (W : GJ) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : (GaugeBoson.componentDual 𝔤) (Lorentz.CoVector.basis.dualBasis μ) φ (mcBosonCoeff jets W s) = φ (jets.evalLie (jets.iteratedDeriv s @@ -495,7 +495,7 @@ lemma componentDual_dualBasis_mcBosonCoeff (W : G) `GaugeAlgebraRealization`: 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) +theorem repJet_iteratedJetDeriv_ofA (U : GJ) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : repJet jets U ((iteratedJetDeriv 𝔤) s ((ofA 𝔤) μ φ)) = (s.antidiagonal.map fun p => @@ -521,7 +521,7 @@ variable (jets) 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 + Representation ℂ GJ (ℂ ⊗[ℝ] (GaugeJetAlgebra 𝔤)) where toFun U := LinearMap.baseChange ℂ (repJet jets U) map_one' := by rw [map_one, Module.End.one_eq_id, LinearMap.baseChange_id, Module.End.one_eq_id] @@ -529,10 +529,10 @@ noncomputable def complexRepJet : 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 𝔤)) : +lemma complexRepJet_tmul (U : GJ) (z : ℂ) (x : (GaugeJetAlgebra 𝔤)) : complexRepJet jets U (z ⊗ₜ[ℝ] x) = z ⊗ₜ[ℝ] repJet jets U x := rfl -lemma complexRepJet_apply_mul (U : G) +lemma complexRepJet_apply_mul (U : GJ) (x y : ℂ ⊗[ℝ] (GaugeJetAlgebra 𝔤)) : complexRepJet jets U (x * y) = complexRepJet jets U x * complexRepJet jets U y := by @@ -572,7 +572,7 @@ lemma one_tmul_algebraMap (r : ℝ) : /-- The transformation law of the derivative generators on the complexification: the form consumed by the laws of a `GaugeAlgebraRealization`. -/ -theorem complexRepJet_iteratedD_one_tmul_ofA (U : G) +theorem complexRepJet_iteratedD_one_tmul_ofA (U : GJ) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : complexRepJet jets U (Lorentz.iteratedD (complexJetDeriv 𝔤) complexJetDeriv_comm s ((1 : ℂ) ⊗ₜ[ℝ] (ofA 𝔤) μ φ)) diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/GaugeField.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/GaugeField.lean index 1a21ba63a..4b08b803a 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/GaugeField.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/GaugeField.lean @@ -33,9 +33,9 @@ realization of the jet algebra in another algebra inherits. 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 {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] +variable {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] +variable {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} open TensorProduct Matrix MatrixGroups Lorentz @@ -83,7 +83,7 @@ variable (jets) in /-- The gauge law of the jet algebra: a jet `U` acts on `∂_s A_μ^φ` by the Leibniz convolution of the dual adjoint Taylor coefficients of `U⁻¹` against lower symbols, plus the base-point value of the `s`-th derivative of the Maurer–Cartan form of `U⁻¹`. -/ -lemma repJet_gaugeField (U : G) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) +lemma repJet_gaugeField (U : GJ) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : complexRepJet jets U (gaugeField 𝔤 s μ φ) = (s.antidiagonal.map fun p => gaugeField 𝔤 p.2 μ (jets.adjointDualCoeff U⁻¹ p.1 φ)).sum diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Basic.lean index 636a273e9..510f91b75 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Basic.lean @@ -45,7 +45,7 @@ differentiates `s` times with the Leibniz rule: 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 is a representation of the -jet group `G` and not merely of its value group `G₀`. +jet group `GJ` and not merely of its value group `G₀`. In the formalization, `h.A s μ φ` is the symbol `∂_s A_μ^a` contracted with a dual adjoint vector `φ`; `∂_x (Ad_{g⁻¹})^a_b|` acting on the dual index is `jets.adjointDualCoeff g⁻¹ x φ`; @@ -70,9 +70,9 @@ covector index and that each derivative slot transforms as a covector. 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 {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] +variable {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] +variable {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} open TensorProduct Matrix MatrixGroups Lorentz @@ -81,8 +81,8 @@ open TensorProduct Matrix MatrixGroups Lorentz Lorentz group, with both groups acting on the whole of `B` by algebra endomorphisms. The gauge-field symbols of `B` are the images of the jet algebra's symbols, `GaugeAlgebraRealization.A`, and they satisfy the jet algebra's laws by transport. -/ -structure GaugeAlgebraRealization (jets : LocalGaugeData G 𝔤 G₀ 𝔤J) (B : Type) [Ring B] - [Algebra ℂ B] (repJet : Representation ℂ G B) (repLorentz : Representation ℂ SL(2,ℂ) B) +structure GaugeAlgebraRealization (jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J) (B : Type) [Ring B] + [Algebra ℂ B] (repJet : Representation ℂ GJ B) (repLorentz : Representation ℂ SL(2,ℂ) B) where /-- The algebra map out of the gauge-boson jet algebra: it places the gauge-boson symbols, and every polynomial expression in them, inside `B`. -/ @@ -96,13 +96,13 @@ structure GaugeAlgebraRealization (jets : LocalGaugeData G 𝔤 G₀ 𝔤J) (B : A_eq : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), A s μ φ = toAlgHom (GaugeJetAlgebra.gaugeField 𝔤 s μ φ) /-- The map is equivariant for the jet gauge group. -/ - map_repJet : ∀ (U : G) (x : ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤), + map_repJet : ∀ (U : GJ) (x : ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤), toAlgHom (GaugeJetAlgebra.complexRepJet jets U x) = repJet U (toAlgHom x) /-- The map is equivariant for the Lorentz group. -/ map_repLorentz : ∀ (Λ : SL(2,ℂ)) (x : ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤), toAlgHom (GaugeJetAlgebra.complexRepLorentzGroup 𝔤 Λ x) = repLorentz Λ (toAlgHom x) /-- The jet gauge group acts on the whole of `B` by algebra endomorphisms. -/ - repJet_mul : ∀ (U : G) (b₁ b₂ : B), repJet U (b₁ * b₂) = repJet U b₁ * repJet U b₂ + repJet_mul : ∀ (U : GJ) (b₁ b₂ : B), repJet U (b₁ * b₂) = repJet U b₁ * repJet U b₂ /-- The Lorentz group acts on the whole of `B` by algebra endomorphisms. -/ repLorentz_mul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂ @@ -111,7 +111,7 @@ namespace GaugeAlgebraRealization open GaugeJetAlgebra -variable {B : Type} [Ring B] [Algebra ℂ B] {repJet : Representation ℂ G B} +variable {B : Type} [Ring B] [Algebra ℂ B] {repJet : Representation ℂ GJ B} {repLorentz : Representation ℂ SL(2,ℂ) B} variable (jets) in @@ -163,7 +163,7 @@ lemma lorentz_apply (Λ : SL(2,ℂ)) (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) convolution of the dual adjoint Taylor coefficients of `U⁻¹` against lower symbols (the multiset antidiagonal carrying the multinomial coefficients), plus the base-point value of the `s`-th derivative of the Maurer–Cartan form of `U⁻¹`. -/ -lemma gauge_apply_deriv (U : G) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) +lemma gauge_apply_deriv (U : GJ) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : repJet U (h.A s μ φ) = (s.antidiagonal.map fun p => h.A p.2 μ (jets.adjointDualCoeff U⁻¹ p.1 φ)).sum @@ -178,7 +178,7 @@ lemma gauge_apply_deriv (U : G) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ include h in /-- The gauge action preserves products: gauge transformations act on the algebra of local expressions as algebra homomorphisms. -/ -lemma gauge_mul (U : G) (b₁ b₂ : B) : repJet U (b₁ * b₂) = repJet U b₁ * repJet U b₂ := +lemma gauge_mul (U : GJ) (b₁ b₂ : B) : repJet U (b₁ * b₂) = repJet U b₁ * repJet U b₂ := h.repJet_mul U b₁ b₂ TODO (lines := 177-182) (date := 2026-09-10) "This lemma can be removed." diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/FieldStrength.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/FieldStrength.lean index a5608424e..353ec84ce 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/FieldStrength.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/FieldStrength.lean @@ -36,14 +36,14 @@ 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 {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] +variable {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] +variable {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} namespace GaugeAlgebraRealization variable {repLorentz : Representation ℂ SL(2,ℂ) B} -variable {repGauge : Representation ℂ G B} +variable {repGauge : Representation ℂ GJ B} variable {A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B} variable (h : GaugeAlgebraRealization jets B repGauge repLorentz) @@ -152,7 +152,7 @@ lemma fieldStrength_swap the antidiagonal, and the derived Maurer–Cartan shifts cancel the bracket-shift convolution through the all-orders structural equation. -/ theorem repGauge_fieldStrength - (U : G) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (U : GJ) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : repGauge U (fieldStrength h.A μ ν s φ) = (s.antidiagonal.map fun p => @@ -237,7 +237,7 @@ theorem transformsInAdjoint_fieldStrength the homogeneous law — the field strength transforms by the base-point dual adjoint action of `U⁻¹` on the adjoint index. -/ lemma repGauge_fieldStrength_zero - (U : G) (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + (U : GJ) (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : repGauge U (fieldStrength h.A μ ν 0 φ) = fieldStrength h.A μ ν 0 (jets.adjointDualCoeff U⁻¹ 0 φ) := by rw [h.repGauge_fieldStrength U 0 μ ν φ, Multiset.antidiagonal_zero, diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/GaugeLaw.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/GaugeLaw.lean index 438304b4b..721362109 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/GaugeLaw.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/GaugeLaw.lean @@ -46,9 +46,9 @@ 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 {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] +variable {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] +variable {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} open Lorentz @@ -56,7 +56,7 @@ open Lorentz namespace GaugeAlgebraRealization variable {repLorentz : Representation ℂ SL(2,ℂ) B} -variable {repGauge : Representation ℂ G B} +variable {repGauge : Representation ℂ GJ B} variable {A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B} variable (h : GaugeAlgebraRealization jets B repGauge repLorentz) @@ -93,7 +93,7 @@ noncomputable def commutator /-- 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 (U : G) +lemma repGauge_apply (U : GJ) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : repGauge U (h.A 0 μ φ) = h.A 0 μ (jets.adjointDualCoeff U⁻¹ ∅ φ) + algebraMap ℂ B (φ (jets.evalLie (jets.maurerCartan U⁻¹ μ))) := by @@ -105,7 +105,7 @@ lemma repGauge_apply (U : G) 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 - (U : G) (ρ σ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + (U : GJ) (ρ σ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : repGauge U (h.A {ρ} σ φ) = h.A {ρ} σ (jets.adjointDualCoeff U⁻¹ 0 φ) + h.A 0 σ (jets.adjointDualCoeff U⁻¹ {ρ} φ) + algebraMap ℂ B (φ (jets.evalLie @@ -254,7 +254,7 @@ set_option maxHeartbeats 1000000 in algebra homomorphisms (`gauge_mul`) and that the base-point adjoint transport is a morphism of Lie algebras. -/ lemma repGauge_commutator - (U : G) (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + (U : GJ) (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : repGauge U (commutator h.A μ ν φ) = commutator h.A μ ν (jets.adjointDualCoeff U⁻¹ 0 φ) - h.A 0 μ (jets.adjointDualCoeff U⁻¹ 0 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 @@ -342,7 +342,7 @@ lemma repGauge_commutator `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 - (U : G) (ρ σ τ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + (U : GJ) (ρ σ τ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : repGauge U (h.A (ρ ::ₘ {σ}) τ φ) = h.A (ρ ::ₘ {σ}) τ (jets.adjointDualCoeff U⁻¹ 0 φ) + h.A {ρ} τ (jets.adjointDualCoeff U⁻¹ {σ} φ) @@ -531,7 +531,7 @@ set_option maxHeartbeats 1000000 in Pure bilinearity, with `tensorBracket_one_left/right` computing the cross terms; `repGauge_commutator` is the special case of two field symbols. -/ lemma repGauge_bracketFam - (U : G) {f g f' g' : Module.Dual ℝ 𝔤 →ₗ[ℝ] B} + (U : GJ) {f g f' g' : Module.Dual ℝ 𝔤 →ₗ[ℝ] B} {cf cg : 𝔤} (hf : ∀ ψ : Module.Dual ℝ 𝔤, repGauge U (f ψ) = f' ψ + algebraMap ℂ B (ψ cf)) @@ -701,7 +701,7 @@ lemma tensorBracket_map_right_antidiagonal /-- 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)) +lemma bracketFam_adjointDualCoeff (U : GJ) (x : Multiset (Fin 1 ⊕ Fin 3)) (f g : Module.Dual ℝ 𝔤 →ₗ[ℝ] B) (φ : Module.Dual ℝ 𝔤) : bracketFam f g (jets.adjointDualCoeff U x φ) = (x.antidiagonal.map fun p => @@ -732,7 +732,7 @@ lemma bracketFam_adjointDualCoeff (U : G) (x : Multiset (Fin 1 ⊕ Fin 3)) `LocalGaugeData.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 - (U : G) (κ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (U : GJ) (κ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (τ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : repGauge U (h.A (κ ::ₘ s) τ φ) = (s.antidiagonal.map fun p => @@ -768,7 +768,7 @@ set_option maxHeartbeats 2000000 in at every derivative order simultaneously; the regrouping of the four-fold splitting is `Multiset.sum_antidiagonal_exchange`. -/ lemma repGauge_commutatorFam - (U : G) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (U : GJ) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : repGauge U (commutatorFam h.A μ ν s φ) = (s.antidiagonal.map fun p => diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Symmetrized.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Symmetrized.lean index 78b2eb06e..b1f08c3d2 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Symmetrized.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Symmetrized.lean @@ -76,14 +76,14 @@ 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 {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] +variable {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] +variable {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} namespace GaugeAlgebraRealization variable {repLorentz : Representation ℂ SL(2,ℂ) B} -variable {repGauge : Representation ℂ G B} +variable {repGauge : Representation ℂ GJ B} variable {A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B} variable (h : GaugeAlgebraRealization jets B repGauge repLorentz) @@ -488,7 +488,7 @@ lemma exists_le_of_mem_adjoin_symbols_union (S : Set B) {x : B} `U • sym(∂_s h.A)^φ = (1/|s|) ∑_{μ ∈ s} ∑_{x+y=s−μ} ∂_y A_μ^{∂_x Ad*(U⁻¹) φ}` ` + φ( sym(ω(U⁻¹))_s |₀ )`. -/ lemma repGauge_symmetrizedDeriv - (U : G) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤) : + (U : GJ) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤) : repGauge U (symmetrizedDeriv s h.A φ) = (1/(s.card : ℝ)) • (s.map fun μ => ((s - {μ}).antidiagonal.map fun p => @@ -694,7 +694,7 @@ lemma repGauge_iteratedCovDerivAdjoint_fieldStrength_of_mem_truncationKer_zero include h in /-- The gauge action fixes the unit, being multiplicative and invertible. -/ -lemma repGauge_one (U : G) : +lemma repGauge_one (U : GJ) : repGauge U (1 : B) = 1 := by have h2 : repGauge U (repGauge U⁻¹ (1 : B)) = 1 := by have h3 : repGauge U * repGauge U⁻¹ = 1 := by @@ -707,7 +707,7 @@ lemma repGauge_one (U : G) : /-- The gauge action of a jet as a ring endomorphism of the algebra of local expressions. -/ -def repGaugeRingHom (U : G) : B →+* B where +def repGaugeRingHom (U : GJ) : B →+* B where toFun := repGauge U map_one' := repGauge_one h U map_mul' := h.gauge_mul U @@ -715,7 +715,7 @@ def repGaugeRingHom (U : G) : B →+* B where map_add' := map_add _ @[simp] -lemma repGaugeRingHom_apply (U : G) (x : B) : +lemma repGaugeRingHom_apply (U : GJ) (x : B) : repGaugeRingHom h U x = repGauge U x := rfl /-! @@ -1173,7 +1173,7 @@ theorem invariant_mem_adjoin_fieldStrength [jets.Free] (S : Set B) (φ : Module.Dual ℝ 𝔤), ∀ y ∈ S, Commute y (h.A p μ φ)) (hS : ∀ y ∈ S, ∀ U : jets.truncationKer 0, repGauge U.1 y = y) {x : B} (hx : x ∈ Algebra.adjoin ℂ (symbols h.A ∪ S)) - (hinv : ∀ U : G, repGauge U x = x) : + (hinv : ∀ U : GJ, repGauge U x = x) : x ∈ Algebra.adjoin ℂ (tower h.A ∪ S) := by -- bound the symbol order of the invariant, working relative to the full tower obtain ⟨n, hxn⟩ := exists_le_of_mem_adjoin_symbols_union (tower h.A ∪ S) @@ -1222,7 +1222,7 @@ theorem invariant_mem_adjoin_fieldStrength [jets.Free] (S : Set (ℂ ⊗[ℝ] Ga (hx : x ∈ Algebra.adjoin ℂ ({b : ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤 | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), b = gaugeField 𝔤 p μ φ} ∪ S)) - (hinv : ∀ U : G, complexRepJet jets U x = x) : + (hinv : ∀ U : GJ, complexRepJet jets U x = x) : x ∈ Algebra.adjoin ℂ ({b : ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤 | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), b = GaugeAlgebraRealization.iteratedCovDerivAdjoint (gaugeField 𝔤) l diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/TransformsInAdjoint.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/TransformsInAdjoint.lean index 3547d11e6..819901aca 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/TransformsInAdjoint.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/TransformsInAdjoint.lean @@ -31,14 +31,14 @@ 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 {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] +variable {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] +variable {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} namespace GaugeAlgebraRealization variable {repLorentz : Representation ℂ SL(2,ℂ) B} -variable {repGauge : Representation ℂ G B} +variable {repGauge : Representation ℂ GJ B} variable {A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B} variable (h : GaugeAlgebraRealization jets B repGauge repLorentz) @@ -48,9 +48,9 @@ variable (jets) in 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) +def TransformsInAdjoint (repGauge : Representation ℂ GJ B) (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B) : Prop := - ∀ (U : G) (φ : Module.Dual ℝ 𝔤) (s : Multiset (Fin 1 ⊕ Fin 3)), + ∀ (U : GJ) (φ : Module.Dual ℝ 𝔤) (s : Multiset (Fin 1 ⊕ Fin 3)), repGauge U (F s φ) = (s.antidiagonal.map fun p => F p.2 (jets.adjointDualCoeff U⁻¹ p.1 φ)).sum @@ -59,7 +59,7 @@ def TransformsInAdjoint (repGauge : Representation ℂ G B) has a single term. -/ lemma TransformsInAdjoint.repGauge_zero {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B} - (hF : TransformsInAdjoint jets repGauge F) (U : G) (φ : Module.Dual ℝ 𝔤) : + (hF : TransformsInAdjoint jets repGauge F) (U : GJ) (φ : Module.Dual ℝ 𝔤) : repGauge U (F 0 φ) = F 0 (jets.adjointDualCoeff U⁻¹ 0 φ) := by simpa only [Multiset.antidiagonal_zero, Multiset.map_singleton, Multiset.sum_singleton] using hF U φ 0 @@ -107,7 +107,7 @@ lemma covDerivAdjoint_apply lemma TransformsInAdjoint.repGauge_cons {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B} (hF : TransformsInAdjoint jets repGauge F) - (U : G) (κ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (U : GJ) (κ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤) : repGauge U (F (κ ::ₘ s) φ) = (s.antidiagonal.map fun p => @@ -143,7 +143,7 @@ set_option maxHeartbeats 2000000 in lemma TransformsInAdjoint.repGauge_bracketFamConv {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B} (hF : TransformsInAdjoint jets repGauge F) - (U : G) (s : Multiset (Fin 1 ⊕ Fin 3)) (ρ : Fin 1 ⊕ Fin 3) + (U : GJ) (s : Multiset (Fin 1 ⊕ Fin 3)) (ρ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : repGauge U (bracketFamConv h.A ρ F s φ) = (s.antidiagonal.map fun p => diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/Basic.lean index aa92b1eec..efe08457c 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/Basic.lean @@ -13,8 +13,8 @@ public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.Basic A gauge theory is fixed, before any Lagrangian is chosen, by a gauge context and a matter content. The gauge context is the existing jet data of the gauge group, namely a global -group `G₀` with finite-dimensional real Lie algebra `𝔤`, a jet group `G` with jet Lie -algebra `𝔤J`, and a local-gauge-data package `jets : LocalGaugeData G 𝔤 G₀ 𝔤J` relating them. The +group `G₀` with finite-dimensional real Lie algebra `𝔤`, a jet group `GJ` with jet Lie +algebra `𝔤J`, and a local-gauge-data package `jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J` relating them. The matter content is a finite family of fermionic species and a finite family of bosonic species, each given by an existing `MatterField jets`. @@ -68,13 +68,13 @@ open Matrix MatrixGroups TensorProduct The gauge context is the parameter list of the structure below, namely the two groups, the two Lie algebras, the supplied local-gauge-data package `jets` and its Taylor–Leibniz law. It is -`jets` that makes `𝔤` the gauge algebra of `G` rather than an unrelated Lie algebra, and +`jets` that makes `𝔤` the gauge algebra of `GJ` rather than an unrelated Lie algebra, and it is supplied rather than inferred, so a second package over the same carriers is a different context. `GaugeFieldData` adds only the matter content on top of it. -/ -/-- The field data of a gauge theory. Over a gauge context, given by a jet gauge group `G` +/-- The field data of a gauge theory. Over a gauge context, given by a jet gauge group `GJ` with global group `G₀`, a finite-dimensional real gauge algebra `𝔤` with jet algebra `𝔤J` and a local-gauge-data package `jets` over them, it records a finite family of fermionic species and a finite family of bosonic species, each given by an existing @@ -92,9 +92,9 @@ different context. `GaugeFieldData` adds only the matter content on top of it. not assert that they are jointly consistent. Gauge-Lorentz compatibility, factorization of the jet action through its global value, and richness of the jet group are separate conditions, none of them imposed here. -/ -structure GaugeFieldData {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - [Module.Finite ℝ 𝔤] {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - (jets : LocalGaugeData G 𝔤 G₀ 𝔤J) where +structure GaugeFieldData {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + [Module.Finite ℝ 𝔤] {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + (jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J) where /-- The index type of the fermionic species. -/ FermionSpecies : Type [decidableEqFermionSpecies : DecidableEq FermionSpecies] @@ -114,9 +114,9 @@ attribute [instance] GaugeFieldData.decidableEqFermionSpecies namespace GaugeFieldData -variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] - {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} (T : GaugeFieldData jets) +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} (T : GaugeFieldData jets) /-! diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/BosonGenerators.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/BosonGenerators.lean index 9774dee65..42210706c 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/BosonGenerators.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/BosonGenerators.lean @@ -92,9 +92,9 @@ open Matrix MatrixGroups TensorProduct DirectSum namespace GaugeFieldData -variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] - {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} (T : GaugeFieldData jets) +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} (T : GaugeFieldData jets) /-! @@ -191,7 +191,7 @@ variable (T) species through the fibrewise jet action of its matter field. Both the fibrewise hypothesis and the finite dimensionality of the value space that `JetComponentSpace.repJet` needs are already fields of `MatterField`. -/ -noncomputable def repJetBoson : Representation ℂ G T.BosonGenerators where +noncomputable def repJetBoson : Representation ℂ GJ T.BosonGenerators where toFun U := T.assembleBoson fun i => (T.inclBoson i).comp (JetComponentSpace.repJet (T.boson i) U) map_one' := bosonGenerators_hom_ext fun i x => by simp @@ -200,7 +200,7 @@ noncomputable def repJetBoson : Representation ℂ G T.BosonGenerators where variable {T} @[simp] -lemma repJetBoson_inclBoson (U : G) (i : T.BosonSpecies) +lemma repJetBoson_inclBoson (U : GJ) (i : T.BosonSpecies) (x : JetComponentSpace (T.boson i)) : T.repJetBoson U (T.inclBoson i x) = T.inclBoson i @@ -294,7 +294,7 @@ variable {T} @[simp] lemma jetDerivBoson_inclBoson (μ : Fin 1 ⊕ Fin 3) (i : T.BosonSpecies) - (x : JetComponentSpace (T.BosonValue i)) : + (x : JetComponentSpace (T.boson i)) : T.jetDerivBoson μ (T.inclBoson i x) = T.inclBoson i (JetComponentSpace.jetDeriv μ x) := assembleBoson_inclBoson _ i x @@ -308,7 +308,7 @@ lemma jetDerivBoson_comm (μ ν : Fin 1 ⊕ Fin 3) : rw [LinearMap.comp_apply, LinearMap.comp_apply, jetDerivBoson_inclBoson, jetDerivBoson_inclBoson, jetDerivBoson_inclBoson, jetDerivBoson_inclBoson] exact congrArg (T.inclBoson i) - (LinearMap.congr_fun (JetComponentSpace.jetDeriv_comm (V := T.BosonValue i) μ ν) x) + (LinearMap.congr_fun (JetComponentSpace.jetDeriv_comm (M := T.boson i) μ ν) x) /-- The derivative shift is a Lorentz vector on the bosonic generator space: it is one on each species, and both operations are species-diagonal. -/ @@ -439,23 +439,23 @@ lemma bosonGeneratorsEquiv_repLorentzBoson (w : ℕ) (h : ∀ i, (T.boson i).mas /-- The identification is equivariant for the jet gauge action. The species-diagonal action of the jets of gauge transformations on the generator space is the action on the component functions of the single boson field, for the same reason as in the fermionic - case: each species is a subrepresentation of the bosonic module. No common mass weight is - needed, and both halves of the component space, with every derivative label, are - covered. -/ -lemma bosonGeneratorsEquiv_repJetBoson (U : G) (y : T.BosonGenerators) : - T.bosonGeneratorsEquiv (T.repJetBoson U y) - = JetComponentSpace.repJet T.repJetBosonModule repJetBosonModule_smul U - (T.bosonGeneratorsEquiv y) := by - have key : T.bosonGeneratorsEquiv.toLinearMap.comp (T.repJetBoson U) - = (JetComponentSpace.repJet T.repJetBosonModule repJetBosonModule_smul U).comp - T.bosonGeneratorsEquiv.toLinearMap := by + case: each species is a subrepresentation of the bosonic module. The common mass weight + enters only through the packaging of the bosonic module as a matter field; both halves + of the component space, with every derivative label, are covered. -/ +lemma bosonGeneratorsEquiv_repJetBoson (w : ℕ) (h : ∀ i, (T.boson i).massWeight = w) + (U : GJ) (y : T.BosonGenerators) : + T.bosonGeneratorsEquiv w h (T.repJetBoson U y) + = JetComponentSpace.repJet (T.bosonMatterField w h) U + (T.bosonGeneratorsEquiv w h y) := by + have key : (T.bosonGeneratorsEquiv w h).toLinearMap.comp (T.repJetBoson U) + = (JetComponentSpace.repJet (T.bosonMatterField w h) U).comp + (T.bosonGeneratorsEquiv w h).toLinearMap := by refine bosonGenerators_hom_ext fun j x => ?_ rw [LinearMap.comp_apply, LinearMap.comp_apply, LinearEquiv.coe_coe, repJetBoson_inclBoson, bosonGeneratorsEquiv_inclBoson, bosonGeneratorsEquiv_inclBoson] exact LinearMap.congr_fun (JetComponentSpace.comap_comp_repJet - T.repJetBosonModule repJetBosonModule_smul (T.boson j).repJet - (T.boson j).repJet_smul (T.projBosonValue j) + (T.projBosonField w h j) (fun U' => lTensor_projBosonValue_repJetBosonModule j U') U) x exact LinearMap.congr_fun key y @@ -482,19 +482,21 @@ lemma bosonGeneratorsEquiv_massWeightScaleBoson (w : ℕ) /-- The identification carries the derivative shift across. The species-diagonal shift of the derivative label on the generator space is the shift on the component functions of the single boson field: `comap` is natural in the value space, and the shift touches only - the derivative label, so neither operation sees which species a generator came from. No - common mass weight is needed. -/ -lemma bosonGeneratorsEquiv_jetDerivBoson (μ : Fin 1 ⊕ Fin 3) (y : T.BosonGenerators) : - T.bosonGeneratorsEquiv (T.jetDerivBoson μ y) - = JetComponentSpace.jetDeriv μ (T.bosonGeneratorsEquiv y) := by - have key : T.bosonGeneratorsEquiv.toLinearMap.comp (T.jetDerivBoson μ) - = (JetComponentSpace.jetDeriv μ).comp T.bosonGeneratorsEquiv.toLinearMap := by + the derivative label, so neither operation sees which species a generator came from. The + common mass weight enters only through the packaging of the bosonic module as a matter + field. -/ +lemma bosonGeneratorsEquiv_jetDerivBoson (w : ℕ) (h : ∀ i, (T.boson i).massWeight = w) + (μ : Fin 1 ⊕ Fin 3) (y : T.BosonGenerators) : + T.bosonGeneratorsEquiv w h (T.jetDerivBoson μ y) + = JetComponentSpace.jetDeriv μ (T.bosonGeneratorsEquiv w h y) := by + have key : (T.bosonGeneratorsEquiv w h).toLinearMap.comp (T.jetDerivBoson μ) + = (JetComponentSpace.jetDeriv μ).comp (T.bosonGeneratorsEquiv w h).toLinearMap := by refine bosonGenerators_hom_ext fun i x => ?_ rw [LinearMap.comp_apply, LinearMap.comp_apply, LinearEquiv.coe_coe, jetDerivBoson_inclBoson, bosonGeneratorsEquiv_inclBoson, bosonGeneratorsEquiv_inclBoson] exact LinearMap.congr_fun - (JetComponentSpace.comap_jetDeriv (T.projBosonValue i) μ) x + (JetComponentSpace.comap_jetDeriv (T.projBosonField w h i) μ) x exact LinearMap.congr_fun key y end GaugeFieldData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/BosonMatterField.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/BosonMatterField.lean index ac6bf8430..0a8158d17 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/BosonMatterField.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/BosonMatterField.lean @@ -64,9 +64,9 @@ open Matrix MatrixGroups TensorProduct namespace GaugeFieldData -variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] - {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} (T : GaugeFieldData jets) +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} (T : GaugeFieldData jets) /-! @@ -120,19 +120,19 @@ variable (T) module, acting species by species, and typed on `T.BosonModule` itself so that it can be spoken of without fixing a common mass weight. -/ noncomputable def repJetBosonModule : - Representation ℂ G (JetRing ⊗[ℂ] T.BosonModule) := + Representation ℂ GJ (JetRing ⊗[ℂ] T.BosonModule) := MatterField.repJetPi T.boson variable {T} /-- The jet gauge action on the bosonic module is fibrewise, as each species is. -/ -lemma repJetBosonModule_smul (U : G) (χ : JetRing) (z : JetRing ⊗[ℂ] T.BosonModule) : +lemma repJetBosonModule_smul (U : GJ) (χ : JetRing) (z : JetRing ⊗[ℂ] T.BosonModule) : T.repJetBosonModule U (χ • z) = χ • T.repJetBosonModule U z := MatterField.repJetPi_smul T.boson U χ z /-- A bosonic species is a subrepresentation of the jet gauge action on the bosonic module: the projection onto its value space intertwines the two actions on the jets. -/ -lemma lTensor_projBosonValue_repJetBosonModule (j : T.BosonSpecies) (U : G) : +lemma lTensor_projBosonValue_repJetBosonModule (j : T.BosonSpecies) (U : GJ) : (LinearMap.lTensor JetRing (T.projBosonValue j)).comp (T.repJetBosonModule U) = ((T.boson j).repJet U).comp (LinearMap.lTensor JetRing (T.projBosonValue j)) := @@ -164,7 +164,7 @@ lemma bosonMatterField_repAlgebra_apply (w : ℕ) species, through the identification `jetPiEquiv` of the jets of the bosonic module with the family of the jets of the species. -/ lemma bosonMatterField_repJet_apply (w : ℕ) - (h : ∀ i, (T.boson i).massWeight = w) (U : G) + (h : ∀ i, (T.boson i).massWeight = w) (U : GJ) (z : JetRing ⊗[ℂ] T.BosonModule) : (T.bosonMatterField w h).repJet U z = (jetPiEquiv T.BosonValue).symm @@ -172,7 +172,7 @@ lemma bosonMatterField_repJet_apply (w : ℕ) /-- The base-point Taylor coefficients of the bosonic jet action are those of the species, index by index. -/ -lemma repCoeff_bosonMatterField (w : ℕ) (h : ∀ i, (T.boson i).massWeight = w) (U : G) +lemma repCoeff_bosonMatterField (w : ℕ) (h : ∀ i, (T.boson i).massWeight = w) (U : GJ) (x : Multiset (Fin 1 ⊕ Fin 3)) : GaugeAlgebraRealization.repCoeff (T.bosonMatterField w h).repJet U x = LinearMap.piMap fun i => diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/BosonModule.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/BosonModule.lean index 517d46b9c..268141f58 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/BosonModule.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/BosonModule.lean @@ -58,9 +58,9 @@ open Matrix MatrixGroups TensorProduct namespace GaugeFieldData -variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] - {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} (T : GaugeFieldData jets) +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} (T : GaugeFieldData jets) /-! diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/FermionGenerators.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/FermionGenerators.lean index 65ddf992b..88770ac1c 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/FermionGenerators.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/FermionGenerators.lean @@ -89,9 +89,9 @@ open Matrix MatrixGroups TensorProduct DirectSum namespace GaugeFieldData -variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] - {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} (T : GaugeFieldData jets) +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} (T : GaugeFieldData jets) /-! @@ -188,7 +188,7 @@ variable (T) species through the fibrewise jet action of its matter field. Both the fibrewise hypothesis and the finite dimensionality of the value space that `JetComponentSpace.repJet` needs are already fields of `MatterField`. -/ -noncomputable def repJetFermion : Representation ℂ G T.FermionGenerators where +noncomputable def repJetFermion : Representation ℂ GJ T.FermionGenerators where toFun U := T.assembleFermion fun i => (T.inclFermion i).comp (JetComponentSpace.repJet (T.fermion i) U) map_one' := fermionGenerators_hom_ext fun i x => by simp @@ -197,7 +197,7 @@ noncomputable def repJetFermion : Representation ℂ G T.FermionGenerators where variable {T} @[simp] -lemma repJetFermion_inclFermion (U : G) (i : T.FermionSpecies) +lemma repJetFermion_inclFermion (U : GJ) (i : T.FermionSpecies) (x : JetComponentSpace (T.fermion i)) : T.repJetFermion U (T.inclFermion i x) = T.inclFermion i @@ -291,7 +291,7 @@ variable {T} @[simp] lemma jetDerivFermion_inclFermion (μ : Fin 1 ⊕ Fin 3) (i : T.FermionSpecies) - (x : JetComponentSpace (T.FermionValue i)) : + (x : JetComponentSpace (T.fermion i)) : T.jetDerivFermion μ (T.inclFermion i x) = T.inclFermion i (JetComponentSpace.jetDeriv μ x) := assembleFermion_inclFermion _ i x @@ -305,7 +305,7 @@ lemma jetDerivFermion_comm (μ ν : Fin 1 ⊕ Fin 3) : rw [LinearMap.comp_apply, LinearMap.comp_apply, jetDerivFermion_inclFermion, jetDerivFermion_inclFermion, jetDerivFermion_inclFermion, jetDerivFermion_inclFermion] exact congrArg (T.inclFermion i) - (LinearMap.congr_fun (JetComponentSpace.jetDeriv_comm (V := T.FermionValue i) μ ν) x) + (LinearMap.congr_fun (JetComponentSpace.jetDeriv_comm (M := T.fermion i) μ ν) x) /-- The derivative shift is a Lorentz vector on the fermionic generator space: it is one on each species, and both operations are species-diagonal. -/ @@ -439,25 +439,25 @@ lemma fermionGeneratorsEquiv_repLorentzFermion (w : ℕ) (h : ∀ i, (T.fermion the fermionic module, so pulling back along the projection onto it commutes with the two actions. - No common mass weight is needed. The gauge action of the assembled field is - `repJetFermionModule`, which exists whatever the weights are; only its packaging as one - `MatterField` would require them to agree. Both halves of the component space are - covered, the conjugate one included, and every derivative label with them: this is + The common mass weight enters only through the packaging of the fermionic module as the + matter field `T.fermionMatterField w h`; the gauge action itself is `repJetFermionModule`, + which exists whatever the weights are. Both halves of the component space are covered, + the conjugate one included, and every derivative label with them: this is `JetComponentSpace.comap_comp_repJet` at the species projection. -/ -lemma fermionGeneratorsEquiv_repJetFermion (U : G) (y : T.FermionGenerators) : - T.fermionGeneratorsEquiv (T.repJetFermion U y) - = JetComponentSpace.repJet T.repJetFermionModule repJetFermionModule_smul U - (T.fermionGeneratorsEquiv y) := by - have key : T.fermionGeneratorsEquiv.toLinearMap.comp (T.repJetFermion U) - = (JetComponentSpace.repJet T.repJetFermionModule repJetFermionModule_smul U).comp - T.fermionGeneratorsEquiv.toLinearMap := by +lemma fermionGeneratorsEquiv_repJetFermion (w : ℕ) (h : ∀ i, (T.fermion i).massWeight = w) + (U : GJ) (y : T.FermionGenerators) : + T.fermionGeneratorsEquiv w h (T.repJetFermion U y) + = JetComponentSpace.repJet (T.fermionMatterField w h) U + (T.fermionGeneratorsEquiv w h y) := by + have key : (T.fermionGeneratorsEquiv w h).toLinearMap.comp (T.repJetFermion U) + = (JetComponentSpace.repJet (T.fermionMatterField w h) U).comp + (T.fermionGeneratorsEquiv w h).toLinearMap := by refine fermionGenerators_hom_ext fun i x => ?_ rw [LinearMap.comp_apply, LinearMap.comp_apply, LinearEquiv.coe_coe, repJetFermion_inclFermion, fermionGeneratorsEquiv_inclFermion, fermionGeneratorsEquiv_inclFermion] exact LinearMap.congr_fun (JetComponentSpace.comap_comp_repJet - T.repJetFermionModule repJetFermionModule_smul (T.fermion i).repJet - (T.fermion i).repJet_smul (T.projFermionValue i) + (T.projFermionField w h i) (fun U' => lTensor_projFermionValue_repJetFermionModule i U') U) x exact LinearMap.congr_fun key y @@ -485,18 +485,20 @@ lemma fermionGeneratorsEquiv_massWeightScaleFermion (w : ℕ) of the derivative label on the generator space is the shift on the component functions of the single fermion field: `comap` is natural in the value space, and the shift touches only the derivative label, so neither operation sees which species a generator came from. - No common mass weight is needed. -/ -lemma fermionGeneratorsEquiv_jetDerivFermion (μ : Fin 1 ⊕ Fin 3) (y : T.FermionGenerators) : - T.fermionGeneratorsEquiv (T.jetDerivFermion μ y) - = JetComponentSpace.jetDeriv μ (T.fermionGeneratorsEquiv y) := by - have key : T.fermionGeneratorsEquiv.toLinearMap.comp (T.jetDerivFermion μ) - = (JetComponentSpace.jetDeriv μ).comp T.fermionGeneratorsEquiv.toLinearMap := by + The common mass weight enters only through the packaging of the fermionic module as a + matter field. -/ +lemma fermionGeneratorsEquiv_jetDerivFermion (w : ℕ) (h : ∀ i, (T.fermion i).massWeight = w) + (μ : Fin 1 ⊕ Fin 3) (y : T.FermionGenerators) : + T.fermionGeneratorsEquiv w h (T.jetDerivFermion μ y) + = JetComponentSpace.jetDeriv μ (T.fermionGeneratorsEquiv w h y) := by + have key : (T.fermionGeneratorsEquiv w h).toLinearMap.comp (T.jetDerivFermion μ) + = (JetComponentSpace.jetDeriv μ).comp (T.fermionGeneratorsEquiv w h).toLinearMap := by refine fermionGenerators_hom_ext fun i x => ?_ rw [LinearMap.comp_apply, LinearMap.comp_apply, LinearEquiv.coe_coe, jetDerivFermion_inclFermion, fermionGeneratorsEquiv_inclFermion, fermionGeneratorsEquiv_inclFermion] exact LinearMap.congr_fun - (JetComponentSpace.comap_jetDeriv (T.projFermionValue i) μ) x + (JetComponentSpace.comap_jetDeriv (T.projFermionField w h i) μ) x exact LinearMap.congr_fun key y end GaugeFieldData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/FermionMatterField.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/FermionMatterField.lean index 56cbbcf5d..6bb026234 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/FermionMatterField.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/FermionMatterField.lean @@ -60,9 +60,9 @@ open Matrix MatrixGroups TensorProduct namespace GaugeFieldData -variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] - {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} (T : GaugeFieldData jets) +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} (T : GaugeFieldData jets) /-! @@ -118,19 +118,19 @@ variable (T) weight; the gauge action of a theory whose fermions carry different mass dimensions is perfectly well defined, only its packaging as one `MatterField` is not. -/ noncomputable def repJetFermionModule : - Representation ℂ G (JetRing ⊗[ℂ] T.FermionModule) := + Representation ℂ GJ (JetRing ⊗[ℂ] T.FermionModule) := MatterField.repJetPi T.fermion variable {T} /-- The jet gauge action on the fermionic module is fibrewise, as each species is. -/ -lemma repJetFermionModule_smul (U : G) (χ : JetRing) (z : JetRing ⊗[ℂ] T.FermionModule) : +lemma repJetFermionModule_smul (U : GJ) (χ : JetRing) (z : JetRing ⊗[ℂ] T.FermionModule) : T.repJetFermionModule U (χ • z) = χ • T.repJetFermionModule U z := MatterField.repJetPi_smul T.fermion U χ z /-- A fermionic species is a subrepresentation of the jet gauge action on the fermionic module: the projection onto its value space intertwines the two actions on the jets. -/ -lemma lTensor_projFermionValue_repJetFermionModule (i : T.FermionSpecies) (U : G) : +lemma lTensor_projFermionValue_repJetFermionModule (i : T.FermionSpecies) (U : GJ) : (LinearMap.lTensor JetRing (T.projFermionValue i)).comp (T.repJetFermionModule U) = ((T.fermion i).repJet U).comp (LinearMap.lTensor JetRing (T.projFermionValue i)) := @@ -162,7 +162,7 @@ lemma fermionMatterField_repAlgebra_apply (w : ℕ) species, through the identification `jetPiEquiv` of the jets of the fermionic module with the family of the jets of the species. -/ lemma fermionMatterField_repJet_apply (w : ℕ) - (h : ∀ i, (T.fermion i).massWeight = w) (U : G) + (h : ∀ i, (T.fermion i).massWeight = w) (U : GJ) (z : JetRing ⊗[ℂ] T.FermionModule) : (T.fermionMatterField w h).repJet U z = (jetPiEquiv T.FermionValue).symm @@ -170,7 +170,7 @@ lemma fermionMatterField_repJet_apply (w : ℕ) /-- The base-point Taylor coefficients of the fermionic jet action are those of the species, index by index. -/ -lemma repCoeff_fermionMatterField (w : ℕ) (h : ∀ i, (T.fermion i).massWeight = w) (U : G) +lemma repCoeff_fermionMatterField (w : ℕ) (h : ∀ i, (T.fermion i).massWeight = w) (U : GJ) (x : Multiset (Fin 1 ⊕ Fin 3)) : GaugeAlgebraRealization.repCoeff (T.fermionMatterField w h).repJet U x = LinearMap.piMap fun i => diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/FermionModule.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/FermionModule.lean index 7174bc403..f5a132f23 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/FermionModule.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/FermionModule.lean @@ -58,9 +58,9 @@ open Matrix MatrixGroups TensorProduct namespace GaugeFieldData -variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] - {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} (T : GaugeFieldData jets) +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} (T : GaugeFieldData jets) /-! diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Basic.lean index e8cc0c9c3..6929a2fc8 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Basic.lean @@ -99,9 +99,9 @@ open TensorProduct namespace GaugeFieldData -variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] - {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} (T : GaugeFieldData jets) +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} (T : GaugeFieldData jets) /-! diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/Basic.lean index 75b032f48..13b14bd97 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/Basic.lean @@ -48,9 +48,9 @@ concrete algebras. open TensorProduct -variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} {M : MatterField jets} +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} {M : MatterField jets} /-! diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/ConstantAction.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/ConstantAction.lean index 24d400c6a..bb1d4afea 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/ConstantAction.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/ConstantAction.lean @@ -11,8 +11,8 @@ public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAl ## 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, +A jet gauge group `GJ` contains the constant — that is, global — gauge transformations as +the image of a homomorphism `ι : G₀ →* GJ` 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 @@ -32,14 +32,14 @@ namespace FieldAlgebra open TensorProduct -variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} (M : MatterField jets) +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} (M : MatterField jets) variable {A : Type} [Ring A] [Algebra ℂ A] [IsFieldAlgebra (JetComponentSpace M) A] -variable (ι : G₀ →* G) +variable (ι : G₀ →* GJ) /-- 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 + algebra: the restriction of the jet gauge action along the inclusion `ι : G₀ →* GJ` of the constant jets. -/ noncomputable def repConstant : Representation ℂ G₀ A := diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/GaugeAction.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/GaugeAction.lean index 7aa77ff7b..3df9d37ca 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/GaugeAction.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/GaugeAction.lean @@ -12,14 +12,14 @@ public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentS ## 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 +Given a fibrewise action of a group `GJ` on the jets `JetRing ⊗[ℂ] V` of a matter +field, the group `GJ` 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 +Here `GJ` is any group acting fibrewise on the jets. For the Standard Model, `GJ` is the jet gauge group `JetGaugeGroupI`, and the restriction to constant gauge transformations is in `Physlib.Particles.StandardModel.Matter.FieldAlgebra.GaugeAction`. @@ -32,7 +32,7 @@ gauge group `JetGaugeGroupI`, and the restriction to constant gauge transformati ## iii. Table of contents -- A. The action of the group `G` +- A. The action of the group `GJ` - A.1. Equivariance of the field and its conjugate -/ @@ -43,14 +43,14 @@ namespace FieldAlgebra open Matrix MatrixGroups TensorProduct -variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} (M : MatterField jets) +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} (M : MatterField jets) variable {A : Type} [Ring A] [Algebra ℂ A] [IsFieldAlgebra (JetComponentSpace M) A] /-! -## A. The action of the group `G` +## A. The action of the group `GJ` -/ @@ -59,7 +59,7 @@ variable {A : Type} [Ring A] [Algebra ℂ A] [IsFieldAlgebra (JetComponentSpace the jets and its fibrewise-linearity are fields of `M`, so neither has to be supplied here. -/ noncomputable def repJet : - Representation ℂ G (A) where + Representation ℂ GJ (A) where toFun U := (map A (JetComponentSpace.repJet M U)).toLinearMap map_one' := by @@ -68,30 +68,30 @@ noncomputable def repJet : simp only [map_mul, Module.End.mul_eq_comp, ← map_comp_map, AlgHom.comp_toLinearMap] -lemma repJet_apply (U : G) (x : A) : +lemma repJet_apply (U : GJ) (x : A) : repJet M U x = map A (JetComponentSpace.repJet M U) x := rfl @[simp] -lemma repJet_apply_one (U : G) : +lemma repJet_apply_one (U : GJ) : repJet M U (1 : A) = 1 := by simp [repJet_apply] -lemma repJet_apply_mul (U : G) (x y : A) : +lemma repJet_apply_mul (U : GJ) (x y : A) : repJet M U (x * y) = repJet M U x * repJet M U y := by simp [repJet_apply] /-- On a component function the jet gauge action is the action on the component space. -/ @[simp] -lemma repJet_ι (U : G) (v : JetComponentSpace M) : +lemma repJet_ι (U : GJ) (v : JetComponentSpace M) : repJet M U (ι A v) = ι A (JetComponentSpace.repJet M 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 (U : G) : A →ₐ[ℂ] A where +noncomputable def repJetAlgHom (U : GJ) : A →ₐ[ℂ] A where toFun := repJet M U map_add' := LinearMap.map_add _ map_zero' := LinearMap.map_zero _ @@ -114,7 +114,7 @@ the *value* of the gauge transformation at the base point alone. So `ofField` an by the contragredient of the value of the gauge transformation at the base point; no derivative of the gauge jet contributes. -/ lemma repJet_ofField - (U : G) (φ : Module.Dual ℂ M.V) : + (U : GJ) (φ : Module.Dual ℂ M.V) : repJet M U (ofField A φ) = ofField A (Module.Dual.transpose (jetEval ∘ₗ (M.repJet U⁻¹).comp jetOfConstant) φ) := by rw [ofField_apply, repJet_ι, ofField_apply] @@ -127,7 +127,7 @@ lemma repJet_ofField /-- **`ofConjField` is gauge equivariant**, for the conjugate action `repConj M.repJet` on the jets of the conjugate field — which is the physicists' `φ̄ ↦ φ̄ U†`. -/ lemma repJet_ofConjField - (U : G) (φ : Module.Dual ℂ (ConjModule M.V)) : + (U : GJ) (φ : Module.Dual ℂ (ConjModule M.V)) : repJet M U (ofConjField A φ) = ofConjField A (Module.Dual.transpose (jetEval ∘ₗ (JetComponentSpace.repConj M.repJet U⁻¹).comp jetOfConstant) φ) := by diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/JetDeriv.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/JetDeriv.lean index af4a42f10..0948b8cbf 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/JetDeriv.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/JetDeriv.lean @@ -44,9 +44,9 @@ namespace FieldAlgebra open TensorProduct -variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} {M : MatterField jets} +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} {M : MatterField jets} variable {A : Type} [Ring A] [Algebra ℂ A] [IsFieldAlgebra (JetComponentSpace M) A] [HasJetDeriv (JetComponentSpace M) (JetComponentSpace.jetDeriv (M := M)) A] diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/JetDerivClass.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/JetDerivClass.lean index 89b204035..5f2f2d22c 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/JetDerivClass.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/JetDerivClass.lean @@ -21,9 +21,9 @@ built on them is in @[expose] public section -variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} {M : MatterField jets} +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} {M : MatterField jets} /-- **A total derivative on a field algebra**: for each direction `μ` a linear map which is an (even) derivation and acts on the generators by `shift μ`, the shift of the derivative diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/JetDerivConstruction.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/JetDerivConstruction.lean index 30b3fc4b4..12a4e0e40 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/JetDerivConstruction.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/JetDerivConstruction.lean @@ -43,9 +43,9 @@ namespace BosonicAlgebra open TensorProduct -variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} {M : MatterField jets} +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} {M : MatterField jets} /-! @@ -128,9 +128,9 @@ namespace FermionicAlgebra open TensorProduct -variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} {M : MatterField jets} +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} {M : MatterField jets} /-! diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/LorentzAction.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/LorentzAction.lean index 76a43feca..6d12edabf 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/LorentzAction.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/LorentzAction.lean @@ -44,9 +44,9 @@ namespace FieldAlgebra open Matrix MatrixGroups TensorProduct -variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} (M : MatterField jets) +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} (M : MatterField jets) variable {A : Type} [Ring A] [Algebra ℂ A] [IsFieldAlgebra (JetComponentSpace M) A] /-! diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/MassDim.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/MassDim.lean index 8efca005b..078b2ccf7 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/MassDim.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/MassDim.lean @@ -40,9 +40,9 @@ namespace FieldAlgebra open TensorProduct -variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} {M : MatterField jets} +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} {M : MatterField jets} variable {A : Type} [Ring A] [Algebra ℂ A] [IsFieldAlgebra (JetComponentSpace M) A] /-! diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/Prod.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/Prod.lean index 35fc313c3..a164278f6 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/Prod.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/Prod.lean @@ -32,9 +32,9 @@ anticommute. @[expose] public section -variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} section Bosonic diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/Statistics.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/Statistics.lean index 55e3ef752..10b0bdf0d 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/Statistics.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/Statistics.lean @@ -45,9 +45,9 @@ section Bosonic open TensorProduct -variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} {M : MatterField jets} +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} {M : MatterField jets} /-! @@ -164,9 +164,9 @@ section Fermionic open TensorProduct -variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} {M : MatterField jets} +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} {M : MatterField jets} /-! diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/AdjointCoeff.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/AdjointCoeff.lean index cfbb2e3ca..b100ec876 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/AdjointCoeff.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/AdjointCoeff.lean @@ -53,9 +53,9 @@ coefficient through the Maurer–Cartan form. namespace LocalGaugeData -variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - (jets : LocalGaugeData G 𝔤 G₀ 𝔤J) +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + (jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J) /-! @@ -67,27 +67,27 @@ variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] jets, act by the adjoint of `U`, differentiate `x` times, and evaluate at the base point. For `x = 0` this is the adjoint action of the value of `U`; for `x ≠ 0` it sees the derivatives of the gauge transformation. -/ -noncomputable def adjointCoeff (U : G) (x : Multiset (Fin 1 ⊕ Fin 3)) : 𝔤 →ₗ[ℝ] 𝔤 := +noncomputable def adjointCoeff (U : GJ) (x : Multiset (Fin 1 ⊕ Fin 3)) : 𝔤 →ₗ[ℝ] 𝔤 := jets.evalLie.toLinearMap ∘ₗ jets.iteratedDeriv x ∘ₗ jets.adjoint U ∘ₗ jets.ofConstantLie -lemma adjointCoeff_apply (U : G) (x : Multiset (Fin 1 ⊕ Fin 3)) (a : 𝔤) : +lemma adjointCoeff_apply (U : GJ) (x : Multiset (Fin 1 ⊕ Fin 3)) (a : 𝔤) : jets.adjointCoeff U x a = jets.evalLie (jets.iteratedDeriv x (jets.adjoint U (jets.ofConstantLie a))) := rfl /-- The zeroth coefficient is the adjoint action of the value of the jet. -/ @[simp] -lemma adjointCoeff_zero (U : G) : jets.adjointCoeff U 0 = jets.adjointValue (jets.eval U) := by +lemma adjointCoeff_zero (U : GJ) : jets.adjointCoeff U 0 = jets.adjointValue (jets.eval U) := by refine LinearMap.ext fun a => ?_ rw [adjointCoeff_apply, iteratedDeriv_zero, LinearMap.id_apply, evalLie_adjoint_ofConstantLie] /-- A jet with trivial value has trivial zeroth coefficient. -/ -lemma adjointCoeff_zero_of_eval_eq_one {U : G} (hU : jets.eval U = 1) : +lemma adjointCoeff_zero_of_eval_eq_one {U : GJ} (hU : jets.eval U = 1) : jets.adjointCoeff U 0 = LinearMap.id := by rw [adjointCoeff_zero, hU, map_one, Module.End.one_eq_id] /-- The coefficients of the identity jet: only the base point survives. -/ lemma adjointCoeff_one (p : Multiset (Fin 1 ⊕ Fin 3)) : - jets.adjointCoeff (1 : G) p = if p = 0 then LinearMap.id else 0 := by + jets.adjointCoeff (1 : GJ) p = if p = 0 then LinearMap.id else 0 := by refine LinearMap.ext fun a => ?_ rw [adjointCoeff_apply, map_one, Module.End.one_apply] rcases eq_or_ne p 0 with rfl | hp @@ -98,7 +98,7 @@ lemma adjointCoeff_one (p : Multiset (Fin 1 ⊕ Fin 3)) : /-- The coefficients are derivations of the bracket up to convolution, by the iterated Leibniz rule for the jet bracket. -/ -lemma adjointCoeff_lie (U : G) (x : Multiset (Fin 1 ⊕ Fin 3)) (a b : 𝔤) : +lemma adjointCoeff_lie (U : GJ) (x : Multiset (Fin 1 ⊕ Fin 3)) (a b : 𝔤) : jets.adjointCoeff U x ⁅a, b⁆ = (x.antidiagonal.map fun p => ⁅jets.adjointCoeff U p.1 a, jets.adjointCoeff U p.2 b⁆).sum := by simp only [adjointCoeff_apply] @@ -116,7 +116,7 @@ lemma adjointCoeff_lie (U : G) (x : Multiset (Fin 1 ⊕ Fin 3)) (a b : 𝔤) : /-- One derivative of the adjoint action on a constant is minus the bracket with the Maurer–Cartan form: the Leibniz rule `deriv_adjoint` with the constant's derivative killed. -/ -lemma deriv_adjoint_ofConstantLie (U : G) (μ : Fin 1 ⊕ Fin 3) (a : 𝔤) : +lemma deriv_adjoint_ofConstantLie (U : GJ) (μ : Fin 1 ⊕ Fin 3) (a : 𝔤) : jets.deriv μ (jets.adjoint U (jets.ofConstantLie a)) = -⁅jets.maurerCartan U μ, jets.adjoint U (jets.ofConstantLie a)⁆ := by rw [jets.deriv_adjoint, jets.deriv_ofConstantLie, map_zero, zero_sub] @@ -124,7 +124,7 @@ lemma deriv_adjoint_ofConstantLie (U : G) (μ : Fin 1 ⊕ Fin 3) (a : 𝔤) : /-- One more derivative of a coefficient: differentiating the adjoint once produces minus `ad` of the Maurer–Cartan form, and the remaining derivatives distribute over the bracket by the Leibniz rule. -/ -lemma adjointCoeff_cons (U : G) (μ : Fin 1 ⊕ Fin 3) (x : Multiset (Fin 1 ⊕ Fin 3)) : +lemma adjointCoeff_cons (U : GJ) (μ : Fin 1 ⊕ Fin 3) (x : Multiset (Fin 1 ⊕ Fin 3)) : jets.adjointCoeff U (μ ::ₘ x) = -((x.antidiagonal.map fun p => LieAlgebra.ad ℝ 𝔤 (jets.evalLie (jets.iteratedDeriv p.1 (jets.maurerCartan U μ))) ∘ₗ @@ -149,7 +149,7 @@ lemma adjointCoeff_cons (U : G) (μ : Fin 1 ⊕ Fin 3) (x : Multiset (Fin 1 ⊕ with the Maurer–Cartan form, handled by the rule for the parts of `s`; on the other side the coefficients at `μ ::ₘ p` unfold by `adjointCoeff_cons`, and the two triple sums agree by coassociativity of the antidiagonal. -/ -lemma evalLie_iteratedDeriv_adjoint_cons (U : G) (μ : Fin 1 ⊕ Fin 3) +lemma evalLie_iteratedDeriv_adjoint_cons (U : GJ) (μ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (Y : 𝔤J) (ih : ∀ t ≤ s, ∀ Z : 𝔤J, jets.evalLie (jets.iteratedDeriv t (jets.adjoint U Z)) = (t.antidiagonal.map fun p => @@ -199,7 +199,7 @@ lemma evalLie_iteratedDeriv_adjoint_cons (U : G) (μ : Fin 1 ⊕ Fin 3) `Ad_U` with those of `Y`. For a matrix group this is the Leibniz rule for products of matrices of power series; here it follows from the single-derivative Leibniz rule `deriv_adjoint` by strong induction on the number of derivatives. -/ -theorem evalLie_iteratedDeriv_adjoint (U : G) (x : Multiset (Fin 1 ⊕ Fin 3)) (Y : 𝔤J) : +theorem evalLie_iteratedDeriv_adjoint (U : GJ) (x : Multiset (Fin 1 ⊕ Fin 3)) (Y : 𝔤J) : jets.evalLie (jets.iteratedDeriv x (jets.adjoint U Y)) = (x.antidiagonal.map fun p => jets.adjointCoeff U p.1 (jets.evalLie (jets.iteratedDeriv p.2 Y))).sum := by @@ -224,7 +224,7 @@ theorem evalLie_iteratedDeriv_adjoint (U : G) (x : Multiset (Fin 1 ⊕ Fin 3)) ( /-- The base-point Taylor data of `Ad_U Y` vanish up to a given order whenever those of `Y` do. -/ -lemma evalLie_iteratedDeriv_adjoint_eq_zero (U : G) {Y : 𝔤J} {s : Multiset (Fin 1 ⊕ Fin 3)} +lemma evalLie_iteratedDeriv_adjoint_eq_zero (U : GJ) {Y : 𝔤J} {s : Multiset (Fin 1 ⊕ Fin 3)} (h : ∀ q ≤ s, jets.evalLie (jets.iteratedDeriv q Y) = 0) : jets.evalLie (jets.iteratedDeriv s (jets.adjoint U Y)) = 0 := by rw [evalLie_iteratedDeriv_adjoint] @@ -234,7 +234,7 @@ lemma evalLie_iteratedDeriv_adjoint_eq_zero (U : G) {Y : 𝔤J} {s : Multiset (F /-- The coefficients are multiplicative up to convolution: the coefficient of a product of jets is the antidiagonal convolution of the coefficients of the factors. -/ -lemma adjointCoeff_mul (U V : G) (x : Multiset (Fin 1 ⊕ Fin 3)) : +lemma adjointCoeff_mul (U V : GJ) (x : Multiset (Fin 1 ⊕ Fin 3)) : jets.adjointCoeff (U * V) x = (x.antidiagonal.map fun p => jets.adjointCoeff U p.1 ∘ₗ jets.adjointCoeff V p.2).sum := by refine LinearMap.ext fun a => ?_ @@ -252,28 +252,28 @@ lemma adjointCoeff_mul (U V : G) (x : Multiset (Fin 1 ⊕ Fin 3)) : /-- The physicists' `∂_x (Ad_U)^a_b|₀` acting on the dual adjoint index of a gauge-field symbol: the transpose of `adjointCoeff U x`. -/ -noncomputable def adjointDualCoeff (U : G) (x : Multiset (Fin 1 ⊕ Fin 3)) : +noncomputable def adjointDualCoeff (U : GJ) (x : Multiset (Fin 1 ⊕ Fin 3)) : Module.Dual ℝ 𝔤 →ₗ[ℝ] Module.Dual ℝ 𝔤 := (jets.adjointCoeff U x).dualMap -lemma adjointDualCoeff_apply (U : G) (x : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤) +lemma adjointDualCoeff_apply (U : GJ) (x : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤) (a : 𝔤) : jets.adjointDualCoeff U x φ a = φ (jets.adjointCoeff U x a) := rfl /-- The zeroth dual coefficient is the dual of the adjoint action of the value of the jet. -/ -lemma adjointDualCoeff_zero (U : G) : +lemma adjointDualCoeff_zero (U : GJ) : jets.adjointDualCoeff U 0 = (jets.adjointValue (jets.eval U)).dualMap := by rw [adjointDualCoeff, adjointCoeff_zero] /-- A jet with trivial value has trivial zeroth dual coefficient. -/ -lemma adjointDualCoeff_zero_of_eval_eq_one {U : G} (hU : jets.eval U = 1) : +lemma adjointDualCoeff_zero_of_eval_eq_one {U : GJ} (hU : jets.eval U = 1) : jets.adjointDualCoeff U 0 = LinearMap.id := by rw [adjointDualCoeff, jets.adjointCoeff_zero_of_eval_eq_one hU, LinearMap.dualMap_id] /-- The dual form of `adjointCoeff_cons`: one more derivative of a dual coefficient is minus the antidiagonal convolution of lower dual coefficients against `ad` of the derived Maurer–Cartan form. -/ -lemma adjointDualCoeff_cons (U : G) (μ : Fin 1 ⊕ Fin 3) (x : Multiset (Fin 1 ⊕ Fin 3)) +lemma adjointDualCoeff_cons (U : GJ) (μ : Fin 1 ⊕ Fin 3) (x : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤) : jets.adjointDualCoeff U (μ ::ₘ x) φ = -((x.antidiagonal.map fun p => @@ -290,7 +290,7 @@ lemma adjointDualCoeff_cons (U : G) (μ : Fin 1 ⊕ Fin 3) (x : Multiset (Fin 1 precomposed with `ad` of the base-point Maurer–Cartan form. This is what cancels the Leibniz cross terms of the gauge law against the commutator cross terms in the field strength. -/ -lemma adjointDualCoeff_singleton (U : G) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : +lemma adjointDualCoeff_singleton (U : GJ) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : jets.adjointDualCoeff U {μ} φ = -jets.adjointDualCoeff U 0 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie (jets.maurerCartan U μ))) := by @@ -300,7 +300,7 @@ lemma adjointDualCoeff_singleton (U : G) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dua /-- The dual coefficient at two derivatives: the underived coefficient against `ad` of the derived Maurer–Cartan form, and the once-derived coefficient against `ad` of the Maurer–Cartan form itself. -/ -lemma adjointDualCoeff_pair (U : G) (ρ μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : +lemma adjointDualCoeff_pair (U : GJ) (ρ μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : jets.adjointDualCoeff U (ρ ::ₘ {μ}) φ = -jets.adjointDualCoeff U 0 (φ ∘ₗ LieAlgebra.ad ℝ 𝔤 (jets.evalLie (jets.deriv ρ (jets.maurerCartan U μ)))) diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Basic.lean index 90dae70b5..5208ce8e4 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Basic.lean @@ -17,36 +17,36 @@ public import Physlib.Relativity.DerivAlgebra 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 →ₗ⁅ℝ⁆ 𝔤`. +form a group `GJ`, and their infinitesimal counterparts a Lie algebra `𝔤J` over `ℝ`, with the +value at the base point given by `eval : GJ →* G₀` and `evalLie : 𝔤J →ₗ⁅ℝ⁆ 𝔤`. -This file records, as the structure `LocalGaugeData G 𝔤 G₀ 𝔤J`, exactly the structure of +This file records, as the structure `LocalGaugeData G₀ 𝔤 GJ 𝔤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, evaluating at the base +* the adjoint action of `GJ` on `𝔤J`, by Lie algebra automorphisms, evaluating at the base point to the adjoint action of `G₀` on `𝔤`; * the Maurer–Cartan form `maurerCartan U μ = i (∂_μ U) U⁻¹`, with its cocycle law, its flatness equation `maurerCartan_structure` and the Leibniz rule `deriv_adjoint` for the adjoint action. Everything else — the Taylor coefficients of the adjoint action, the truncation filtration -of `G`, the symmetrized Maurer–Cartan form — is *derived* from these laws in the sibling +of `GJ`, the symmetrized Maurer–Cartan form — is *derived* from these laws in the sibling files of this folder. Two further properties, which are true of any honest jet group but are not consequences of the transformation laws, are collected in the mixin `Faithful`: an element of `𝔤J` is determined by its base-point Taylor data, and a jet with vanishing Maurer–Cartan form is constant. -A term `jets : LocalGaugeData G 𝔤 G₀ 𝔤J` is supplied, not inferred: every construction +A term `jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J` is supplied, not inferred: every construction below, and every construction downstream, takes the package it works over as an ordinary argument. The four carriers do not determine it — a truncated jet group beside the full one is the same four carriers with different data — so there is nothing canonical for instance search to choose. -For the Standard Model, `G₀ = SU(3) × SU(2) × U(1)` and `G` is the same group with +For the Standard Model, `G₀ = SU(3) × SU(2) × U(1)` and `GJ` is the same group with coefficients in the ring of formal power series in the spacetime coordinates (`StandardModel.JetGaugeGroupI`), packaged as `StandardModel.localGaugeData`; nothing here depends on that choice. @@ -82,20 +82,20 @@ depends on that choice. -/ -/-- Local gauge data. A gauge group `G₀` with Lie algebra `𝔤`, its group of jets `G` with +/-- Local gauge data. A gauge group `G₀` with Lie algebra `𝔤`, its group of jets `GJ` 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. This is data attached to the four carriers, not a property of them, and it is passed - explicitly: the generic theory takes `jets : LocalGaugeData G 𝔤 G₀ 𝔤J` as an argument rather + explicitly: the generic theory takes `jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J` as an argument rather than searching for it. -/ -structure LocalGaugeData (G : Type) [Group G] (𝔤 : Type) [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - (G₀ : Type) [Group G₀] (𝔤J : Type) [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] where +structure LocalGaugeData (G₀ : Type) [Group G₀] (𝔤 : Type) [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + (GJ : Type) [Group GJ] (𝔤J : Type) [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] where /-- Evaluation of a gauge jet at the base point. -/ - eval : G →* G₀ + eval : GJ →* G₀ /-- A constant gauge transformation as a jet. -/ - ofConstant : G₀ →* G + ofConstant : G₀ →* GJ eval_ofConstant : ∀ g, eval (ofConstant g) = g /-- Evaluation of a Lie algebra jet at the base point. -/ evalLie : 𝔤J →ₗ⁅ℝ⁆ 𝔤 @@ -119,33 +119,33 @@ structure LocalGaugeData (G : Type) [Group G] (𝔤 : Type) [LieRing 𝔤] [LieA /-- The coordinates are central for the bracket. -/ coord_lie : ∀ (μ : Fin 1 ⊕ Fin 3) (a b : 𝔤J), ⁅coord μ a, b⁆ = coord μ ⁅a, b⁆ /-- 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⁆ + adjoint : Representation ℝ GJ 𝔤J + adjoint_lie : ∀ (U : GJ) (x y : 𝔤J), adjoint U ⁅x, y⁆ = ⁅adjoint U x, adjoint U y⁆ /-- The adjoint representation of the value group on its Lie algebra. -/ adjointValue : Representation ℝ G₀ 𝔤 /-- At the base point the adjoint action of a jet is the adjoint action of its value. -/ - evalLie_adjoint : ∀ (U : G) (x : 𝔤J), evalLie (adjoint U x) = adjointValue (eval U) (evalLie x) + evalLie_adjoint : ∀ (U : GJ) (x : 𝔤J), evalLie (adjoint U x) = adjointValue (eval U) (evalLie x) /-- The Maurer–Cartan form `i (∂_μ U) U⁻¹` of a gauge jet. -/ - maurerCartan : G → (Fin 1 ⊕ Fin 3) → 𝔤J + maurerCartan : GJ → (Fin 1 ⊕ Fin 3) → 𝔤J /-- A constant gauge transformation has vanishing Maurer–Cartan form: it has no spacetime dependence to differentiate. -/ maurerCartan_ofConstant : ∀ (g : G₀) (μ : Fin 1 ⊕ Fin 3), maurerCartan (ofConstant g) μ = 0 /-- The Maurer–Cartan form is a cocycle for the adjoint action. -/ - maurerCartan_cocycle : ∀ (U V : G) (μ : Fin 1 ⊕ Fin 3), + maurerCartan_cocycle : ∀ (U V : GJ) (μ : Fin 1 ⊕ Fin 3), maurerCartan (U * V) μ = maurerCartan U μ + adjoint U (maurerCartan V μ) /-- The Maurer–Cartan form is flat. -/ - maurerCartan_structure : ∀ (U : G) (μ ν : Fin 1 ⊕ Fin 3), + maurerCartan_structure : ∀ (U : GJ) (μ ν : Fin 1 ⊕ Fin 3), deriv μ (maurerCartan U ν) - deriv ν (maurerCartan U μ) + ⁅maurerCartan U μ, maurerCartan U ν⁆ = 0 /-- The Leibniz rule for the adjoint action. -/ - deriv_adjoint : ∀ (U : G) (μ : Fin 1 ⊕ Fin 3) (x : 𝔤J), + deriv_adjoint : ∀ (U : GJ) (μ : Fin 1 ⊕ Fin 3) (x : 𝔤J), deriv μ (adjoint U x) = adjoint U (deriv μ x) - ⁅maurerCartan U μ, adjoint U x⁆ namespace LocalGaugeData -variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - (jets : LocalGaugeData G 𝔤 G₀ 𝔤J) +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + (jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J) /-! @@ -162,7 +162,7 @@ lemma maurerCartan_one (μ : Fin 1 ⊕ Fin 3) : jets.maurerCartan 1 μ = 0 := by /-- The Maurer–Cartan form of an inverse: `ω_μ(U⁻¹) = − Ad_{U⁻¹} ω_μ(U)`, the cocycle law applied to `U⁻¹ U = 1`. -/ -lemma maurerCartan_inv (U : G) (μ : Fin 1 ⊕ Fin 3) : +lemma maurerCartan_inv (U : GJ) (μ : Fin 1 ⊕ Fin 3) : jets.maurerCartan U⁻¹ μ = - jets.adjoint U⁻¹ (jets.maurerCartan U μ) := by have h := jets.maurerCartan_cocycle U⁻¹ U μ rw [inv_mul_cancel, jets.maurerCartan_one] at h @@ -170,12 +170,12 @@ lemma maurerCartan_inv (U : G) (μ : Fin 1 ⊕ Fin 3) : /-- At the base point, the adjoint action of a jet on a constant is the adjoint action of its value. -/ -lemma evalLie_adjoint_ofConstantLie (U : G) (a : 𝔤) : +lemma evalLie_adjoint_ofConstantLie (U : GJ) (a : 𝔤) : jets.evalLie (jets.adjoint U (jets.ofConstantLie a)) = jets.adjointValue (jets.eval U) a := by rw [jets.evalLie_adjoint, jets.evalLie_ofConstantLie] /-- A jet with trivial value acts trivially on constants at the base point. -/ -lemma evalLie_adjoint_ofConstantLie_of_eval_eq_one {U : G} (hU : jets.eval U = 1) (a : 𝔤) : +lemma evalLie_adjoint_ofConstantLie_of_eval_eq_one {U : GJ} (hU : jets.eval U = 1) (a : 𝔤) : jets.evalLie (jets.adjoint U (jets.ofConstantLie a)) = a := by rw [evalLie_adjoint_ofConstantLie, hU, map_one, Module.End.one_apply] @@ -189,8 +189,8 @@ lemma evalLie_adjoint_ofConstantLie_of_eval_eq_one {U : G} (hU : jets.eval U = 1 structure rather than a construction from the rest of it. -/ lemma maurerCartan_eq_of_deriv_adjoint (hfaithful : ∀ x y : 𝔤J, (∀ z : 𝔤J, ⁅x, z⁆ = ⁅y, z⁆) → x = y) - (ω : G → (Fin 1 ⊕ Fin 3) → 𝔤J) - (hω : ∀ (U : G) (μ : Fin 1 ⊕ Fin 3) (x : 𝔤J), + (ω : GJ → (Fin 1 ⊕ Fin 3) → 𝔤J) + (hω : ∀ (U : GJ) (μ : Fin 1 ⊕ Fin 3) (x : 𝔤J), jets.deriv μ (jets.adjoint U x) = jets.adjoint U (jets.deriv μ x) - ⁅ω U μ, jets.adjoint U x⁆) : ω = jets.maurerCartan := by @@ -361,11 +361,11 @@ recorded separately from the structure because the covariance theory does not ne /-- A package is faithful when an element of `𝔤J` is determined by the base-point values of its iterated derivatives (Taylor determinacy) and a jet with vanishing Maurer–Cartan form is the constant jet of its value. -/ -class Faithful (jets : LocalGaugeData G 𝔤 G₀ 𝔤J) : Prop where +class Faithful (jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J) : Prop where ext_of_evalLie_iteratedDeriv : ∀ {x y : 𝔤J}, (∀ s : Multiset (Fin 1 ⊕ Fin 3), jets.evalLie (jets.iteratedDeriv s x) = jets.evalLie (jets.iteratedDeriv s y)) → x = y - eq_ofConstant_of_maurerCartan_eq_zero : ∀ {U : G}, + eq_ofConstant_of_maurerCartan_eq_zero : ∀ {U : GJ}, jets.maurerCartan U = 0 → U = jets.ofConstant (jets.eval U) /-- Taylor determinacy of a faithful package, in the form of an extensionality lemma. -/ diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/InfinitesimalAction.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/InfinitesimalAction.lean index 5cb99f40a..066f02426 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/InfinitesimalAction.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/InfinitesimalAction.lean @@ -22,7 +22,7 @@ proves the theorem it exists for: the covariant derivative preserves the gauge t `TransformsIn.covDerivAction`. Everything is stated over a supplied local-gauge-data package -`jets : LocalGaugeData G 𝔤 G₀ 𝔤J`; nothing depends on the Standard Model choice of it. +`jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J`; nothing depends on the Standard Model choice of it. ## ii. Key results @@ -51,16 +51,16 @@ open Matrix MatrixGroups TensorProduct MvPowerSeries variable {B : Type} [Ring B] [Algebra ℂ B] variable {V : Type} [AddCommGroup V] [Module ℂ V] -variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] -variable {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] -variable {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] +variable {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] +variable {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} namespace LocalGaugeData open GaugeAlgebraRealization variable {repLorentz : Representation ℂ SL(2,ℂ) B} -variable {repGauge : Representation ℂ G B} +variable {repGauge : Representation ℂ GJ B} variable {A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B} variable (h : GaugeAlgebraRealization jets B repGauge repLorentz) @@ -86,15 +86,15 @@ variable (h : GaugeAlgebraRealization jets B repGauge repLorentz) These are exactly the identities consumed by the proof that the covariant derivative `covDerivAction` preserves `TransformsIn`. -/ -structure IsInfinitesimalActionOf (jets : LocalGaugeData G 𝔤 G₀ 𝔤J) +structure IsInfinitesimalActionOf (jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J) (act : 𝔤 →ₗ[ℝ] V →ₗ[ℂ] V) - (rep : Representation ℂ G (JetRing ⊗[ℂ] V)) : Prop where - repCoeff_cons : ∀ (U : G) (μ : Fin 1 ⊕ Fin 3) (x : Multiset (Fin 1 ⊕ Fin 3)), + (rep : Representation ℂ GJ (JetRing ⊗[ℂ] V)) : Prop where + repCoeff_cons : ∀ (U : GJ) (μ : Fin 1 ⊕ Fin 3) (x : Multiset (Fin 1 ⊕ Fin 3)), repCoeff rep U (μ ::ₘ x) = -((x.antidiagonal.map fun p => act (jets.evalLie (jets.iteratedDeriv p.1 (jets.maurerCartan U μ))) ∘ₗ repCoeff rep U p.2).sum) - repCoeff_act : ∀ (U : G) (x : Multiset (Fin 1 ⊕ Fin 3)) (c : 𝔤), + repCoeff_act : ∀ (U : GJ) (x : Multiset (Fin 1 ⊕ Fin 3)) (c : 𝔤), repCoeff rep U x ∘ₗ act c = ((x.antidiagonal.map fun p => act (jets.adjointCoeff U p.1 c) ∘ₗ repCoeff rep U p.2).sum) @@ -104,8 +104,8 @@ structure IsInfinitesimalActionOf (jets : LocalGaugeData G 𝔤 G₀ 𝔤J) derived Maurer–Cartan form — the analogue of `LocalGaugeData.adjointDualCoeff_cons`. -/ lemma IsInfinitesimalActionOf.repDualCoeff_cons {act : 𝔤 →ₗ[ℝ] V →ₗ[ℂ] V} - {rep : Representation ℂ G (JetRing ⊗[ℂ] V)} - (h : IsInfinitesimalActionOf jets act rep) (U : G) (μ : Fin 1 ⊕ Fin 3) + {rep : Representation ℂ GJ (JetRing ⊗[ℂ] V)} + (h : IsInfinitesimalActionOf jets act rep) (U : GJ) (μ : Fin 1 ⊕ Fin 3) (x : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V) : repDualCoeff rep U (μ ::ₘ x) φ = -((x.antidiagonal.map fun p => @@ -129,7 +129,7 @@ lemma IsInfinitesimalActionOf.repDualCoeff_cons section MatterCovariance -variable {rep : Representation ℂ G (JetRing ⊗[ℂ] V)} +variable {rep : Representation ℂ GJ (JetRing ⊗[ℂ] V)} variable {act : 𝔤 →ₗ[ℝ] V →ₗ[ℂ] V} variable [FiniteDimensional ℂ V] @@ -139,7 +139,7 @@ variable [FiniteDimensional ℂ V] `IsInfinitesimalActionOf.repCoeff_act`, and the analogue of `bracketFam_adjointDualCoeff`. -/ lemma IsInfinitesimalActionOf.actionFam_repDualCoeff - (h : IsInfinitesimalActionOf jets act rep) (U : G) + (h : IsInfinitesimalActionOf jets act rep) (U : GJ) (x : Multiset (Fin 1 ⊕ Fin 3)) (f : Module.Dual ℝ 𝔤 →ₗ[ℝ] B) (g : Module.Dual ℂ V →ₗ[ℂ] B) (φ : Module.Dual ℂ V) : actionFam act f g (repDualCoeff rep U x φ) = @@ -174,7 +174,7 @@ lemma TransformsIn.repGauge_cons {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B} (hF : TransformsIn repGauge rep F) (hact : IsInfinitesimalActionOf jets act rep) - (U : G) (κ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (U : GJ) (κ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ V) : repGauge U (F (κ ::ₘ s) φ) = (s.antidiagonal.map fun p => @@ -210,7 +210,7 @@ lemma TransformsIn.repGauge_actionFamConv {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B} (hF : TransformsIn repGauge rep F) (hact : IsInfinitesimalActionOf jets act rep) - (U : G) (s : Multiset (Fin 1 ⊕ Fin 3)) (ρ : Fin 1 ⊕ Fin 3) + (U : GJ) (s : Multiset (Fin 1 ⊕ Fin 3)) (ρ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℂ V) : repGauge U (actionFamConv h.A act ρ F s φ) = (s.antidiagonal.map fun p => @@ -386,12 +386,12 @@ lemma conjJetEquiv_conjEquiv_tmul (g : JetRing) (u : V) : section ConjRep -variable {rep : Representation ℂ G (JetRing ⊗[ℂ] V)} +variable {rep : Representation ℂ GJ (JetRing ⊗[ℂ] V)} variable {act : 𝔤 →ₗ[ℝ] V →ₗ[ℂ] V} /-- The conjugate representation acts through `conjJetEquiv` by the original maps. -/ -lemma repConj_conjJetEquiv (rep : Representation ℂ G (JetRing ⊗[ℂ] V)) - (U : G) (w : JetRing ⊗[ℂ] V) : +lemma repConj_conjJetEquiv (rep : Representation ℂ GJ (JetRing ⊗[ℂ] V)) + (U : GJ) (w : JetRing ⊗[ℂ] V) : JetComponentSpace.repConj rep U (conjJetEquiv (conjEquiv (k := ℂ) (M := JetRing ⊗[ℂ] V) w)) = conjJetEquiv (conjEquiv (k := ℂ) (M := JetRing ⊗[ℂ] V) (rep U w)) := by @@ -403,8 +403,8 @@ lemma repConj_conjJetEquiv (rep : Representation ℂ G (JetRing ⊗[ℂ] V)) /-- 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 ℂ G (JetRing ⊗[ℂ] V)) - (U : G) (x : Multiset (Fin 1 ⊕ Fin 3)) : +lemma repCoeff_repConj (rep : Representation ℂ GJ (JetRing ⊗[ℂ] V)) + (U : GJ) (x : Multiset (Fin 1 ⊕ Fin 3)) : repCoeff (JetComponentSpace.repConj rep) U x = ConjModule.endConj (repCoeff rep U x) := by have hE_tmul := conjJetEquiv_conjEquiv_tmul (V := V) @@ -453,7 +453,7 @@ lemma repCoeff_repConj (rep : Representation ℂ G (JetRing ⊗[ℂ] V)) /-- The base-point triviality of the zeroth Taylor coefficient passes to the conjugate representation. -/ -lemma repCoeff_repConj_zero_eq_id {W : G} +lemma repCoeff_repConj_zero_eq_id {W : GJ} (hrep : repCoeff rep W 0 = LinearMap.id) : repCoeff (JetComponentSpace.repConj rep) W 0 = LinearMap.id := by rw [repCoeff_repConj, hrep, ConjModule.endConj_id] diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/MaurerCartan.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/MaurerCartan.lean index e3d42a58d..a120a467c 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/MaurerCartan.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/MaurerCartan.lean @@ -12,7 +12,7 @@ public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Basic ## i. Overview The Maurer–Cartan form `ω_μ(U) = i (∂_μ U) U⁻¹` of a package -`jets : LocalGaugeData G 𝔤 G₀ 𝔤J` is the field `jets.maurerCartan`, subject to the cocycle +`jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J` is the field `jets.maurerCartan`, subject to the cocycle law `maurerCartan_cocycle`, its value `maurerCartan_ofConstant` on constants, and the flatness (structural) equation `maurerCartan_structure`. This file develops what follows from those laws alone, for any package: nothing here mentions a particular gauge group. @@ -60,9 +60,9 @@ jet, and the truncation filtration it defines, is the subject of namespace LocalGaugeData -variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - (jets : LocalGaugeData G 𝔤 G₀ 𝔤J) +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + (jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J) /-! @@ -74,7 +74,7 @@ variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] the `s`-th derivative of `∂_μ ω_ν − ∂_ν ω_μ + ⁅ω_μ, ω_ν⁆ = 0`, with the bracket expanded by the iterated Leibniz rule. -/ lemma evalLie_iteratedDeriv_maurerCartan_structure - (U : G) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : + (U : GJ) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : jets.evalLie (jets.iteratedDeriv (μ ::ₘ s) (jets.maurerCartan U ν)) = jets.evalLie (jets.iteratedDeriv (ν ::ₘ s) (jets.maurerCartan U μ)) - (s.antidiagonal.map fun p => @@ -98,12 +98,12 @@ lemma evalLie_iteratedDeriv_maurerCartan_structure /-- The symmetrized Maurer–Cartan form `ω̄_r(U) = (1/|r|) ∑_{μ ∈ r} ∂_{r − {μ}} ω_μ(U)`: the average, over the directions of `r`, of the Maurer–Cartan form in one direction differentiated along the remaining ones. -/ -noncomputable def symmetrizedMaurerCartanForm (U : G) (r : Multiset (Fin 1 ⊕ Fin 3)) : 𝔤J := +noncomputable def symmetrizedMaurerCartanForm (U : GJ) (r : Multiset (Fin 1 ⊕ Fin 3)) : 𝔤J := ((1/(r.card : ℝ) : ℝ) • (r.map fun μ => (jets.iteratedDeriv (r - {μ}) (jets.maurerCartan U μ))).sum) @[simp] -lemma symmetrizedMaurerCartanForm_apply_zero (U : G) : +lemma symmetrizedMaurerCartanForm_apply_zero (U : GJ) : jets.symmetrizedMaurerCartanForm U 0 = 0 := by simp [symmetrizedMaurerCartanForm] @@ -119,13 +119,13 @@ lemma symmetrizedMaurerCartanForm_ofConstant (g : G₀) : simp [symmetrizedMaurerCartanForm, jets.maurerCartan_ofConstant] @[simp] -lemma symmetrizedMaurerCartanForm_singleton (U : G) (μ : Fin 1 ⊕ Fin 3) : +lemma symmetrizedMaurerCartanForm_singleton (U : GJ) (μ : Fin 1 ⊕ Fin 3) : jets.symmetrizedMaurerCartanForm U {μ} = jets.maurerCartan U μ := by simp [symmetrizedMaurerCartanForm, iteratedDeriv_zero] /-- The recursion for the symmetrized Maurer–Cartan form: peeling one direction off the multiset. -/ -lemma symmetrizedMaurerCartanForm_cons (U : G) (μ : Fin 1 ⊕ Fin 3) +lemma symmetrizedMaurerCartanForm_cons (U : GJ) (μ : Fin 1 ⊕ Fin 3) (r : Multiset (Fin 1 ⊕ Fin 3)) : jets.symmetrizedMaurerCartanForm U (μ ::ₘ r) = (1/(r.card + 1 : ℝ) : ℝ) • (jets.iteratedDeriv r (jets.maurerCartan U μ)) + ((r.card : ℝ)/(r.card + 1 : ℝ)) • @@ -165,7 +165,7 @@ lemma symmetrizedMaurerCartanForm_cons (U : G) (μ : Fin 1 ⊕ Fin 3) `ω` is the corresponding symmetrized form plus an average of iterated derivatives of brackets of `ω` in strictly fewer directions. This is the structural equation `maurerCartan_structure` used to trade the antisymmetric part for lower-order data. -/ -lemma iteratedDeriv_maurerCartan_eq_symmetrized_add (U : G) +lemma iteratedDeriv_maurerCartan_eq_symmetrized_add (U : GJ) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : jets.iteratedDeriv s (jets.maurerCartan U μ) = jets.symmetrizedMaurerCartanForm U (μ ::ₘ s) + @@ -214,7 +214,7 @@ lemma iteratedDeriv_maurerCartan_eq_symmetrized_add (U : G) symmetrized form, which vanishes by hypothesis, and brackets of `ω`s differentiated strictly fewer times, which vanish by the inductive hypothesis through `evalLie_iteratedDeriv_bracket_congr`. -/ -lemma evalLie_iteratedDeriv_maurerCartan_eq_zero_of_symmetrized_eq_zero (U : G) {n : ℕ} +lemma evalLie_iteratedDeriv_maurerCartan_eq_zero_of_symmetrized_eq_zero (U : GJ) {n : ℕ} (h : ∀ r : Multiset (Fin 1 ⊕ Fin 3), r ≠ 0 → r.card ≤ n → jets.evalLie (jets.symmetrizedMaurerCartanForm U r) = 0) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (hs : s.card < n) : @@ -255,7 +255,7 @@ lemma evalLie_iteratedDeriv_maurerCartan_eq_zero_of_symmetrized_eq_zero (U : G) /-- 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 evalLie_iteratedDeriv_maurerCartan_eq_of_symmetrized_eq (U V : G) (n : ℕ) +lemma evalLie_iteratedDeriv_maurerCartan_eq_of_symmetrized_eq (U V : GJ) (n : ℕ) (hsym : ∀ r, jets.evalLie (jets.symmetrizedMaurerCartanForm U r) = jets.evalLie (jets.symmetrizedMaurerCartanForm V r)) (ih : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), s.card < n → @@ -286,7 +286,7 @@ lemma evalLie_iteratedDeriv_maurerCartan_eq_of_symmetrized_eq (U V : G) (n : ℕ -/ /-- In a faithful package, the Maurer–Cartan form vanishes exactly on the constant jets. -/ -lemma maurerCartan_eq_zero_iff [jets.Faithful] (U : G) : +lemma maurerCartan_eq_zero_iff [jets.Faithful] (U : GJ) : jets.maurerCartan U = 0 ↔ U = jets.ofConstant (jets.eval U) := by refine ⟨Faithful.eq_ofConstant_of_maurerCartan_eq_zero, fun h => ?_⟩ funext μ diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/OfFactors.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/OfFactors.lean index a9a290591..55919b2fc 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/OfFactors.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/OfFactors.lean @@ -111,7 +111,7 @@ noncomputable instance instFinite𝔤 : (f : FactorSpec) → Module.Finite ℝ f | .SU n => inferInstanceAs (Module.Finite ℝ (SUAlgebra n)) /-- The local gauge data of a factor. -/ -noncomputable abbrev data : (f : FactorSpec) → LocalGaugeData f.G f.𝔤 f.G₀ f.𝔤J +noncomputable abbrev data : (f : FactorSpec) → LocalGaugeData f.G₀ f.𝔤 f.G f.𝔤J | .U1 => u1 | .SU n => su n @@ -291,7 +291,7 @@ instance instFaithfulTrivial : trivial.Faithful where open Factors in /-- **The local gauge data of a list of factors**: the product, in the order of the list, of the local gauge data of the factors. -/ -noncomputable def ofFactors : (Γ : List FactorSpec) → LocalGaugeData (G Γ) (𝔤 Γ) (G₀ Γ) (𝔤J Γ) +noncomputable def ofFactors : (Γ : List FactorSpec) → LocalGaugeData (G₀ Γ) (𝔤 Γ) (G Γ) (𝔤J Γ) | [] => trivial | [f] => f.data | f :: g :: gs => f.data.prod (ofFactors (g :: gs)) @@ -324,7 +324,7 @@ variable {G₁ : Type} [Group G₁] {𝔤₁ : Type} [LieRing 𝔤₁] [LieAlgeb {G₀₁ : Type} [Group G₀₁] {𝔤J₁ : Type} [LieRing 𝔤J₁] [LieAlgebra ℝ 𝔤J₁] {G₂ : Type} [Group G₂] {𝔤₂ : Type} [LieRing 𝔤₂] [LieAlgebra ℝ 𝔤₂] {G₀₂ : Type} [Group G₀₂] {𝔤J₂ : Type} [LieRing 𝔤J₂] [LieAlgebra ℝ 𝔤J₂] - {j₁ : LocalGaugeData G₁ 𝔤₁ G₀₁ 𝔤J₁} {j₂ : LocalGaugeData G₂ 𝔤₂ G₀₂ 𝔤J₂} + {j₁ : LocalGaugeData G₀₁ 𝔤₁ G₁ 𝔤J₁} {j₂ : LocalGaugeData G₀₂ 𝔤₂ G₂ 𝔤J₂} /-- A factor of the first gauge data, as a factor of the product. -/ noncomputable abbrev Factor.inl : Factor j₁ → Factor (j₁.prod j₂) diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Prod.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Prod.lean index e0afbeb71..0c91b914b 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Prod.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Prod.lean @@ -66,7 +66,7 @@ variable {G₁ : Type} [Group G₁] {𝔤₁ : Type} [LieRing 𝔤₁] [LieAlgeb {G₀₁ : Type} [Group G₀₁] {𝔤J₁ : Type} [LieRing 𝔤J₁] [LieAlgebra ℝ 𝔤J₁] {G₂ : Type} [Group G₂] {𝔤₂ : Type} [LieRing 𝔤₂] [LieAlgebra ℝ 𝔤₂] {G₀₂ : Type} [Group G₀₂] {𝔤J₂ : Type} [LieRing 𝔤J₂] [LieAlgebra ℝ 𝔤J₂] - (j₁ : LocalGaugeData G₁ 𝔤₁ G₀₁ 𝔤J₁) (j₂ : LocalGaugeData G₂ 𝔤₂ G₀₂ 𝔤J₂) + (j₁ : LocalGaugeData G₀₁ 𝔤₁ G₁ 𝔤J₁) (j₂ : LocalGaugeData G₀₂ 𝔤₂ G₂ 𝔤J₂) /-! @@ -75,7 +75,7 @@ variable {G₁ : Type} [Group G₁] {𝔤₁ : Type} [LieRing 𝔤₁] [LieAlgeb -/ /-- **The product of two local gauge data**: every structure map acts componentwise. -/ -noncomputable def prod : LocalGaugeData (G₁ × G₂) (𝔤₁ × 𝔤₂) (G₀₁ × G₀₂) (𝔤J₁ × 𝔤J₂) where +noncomputable def prod : LocalGaugeData (G₀₁ × G₀₂) (𝔤₁ × 𝔤₂) (G₁ × G₂) (𝔤J₁ × 𝔤J₂) where eval := j₁.eval.prodMap j₂.eval ofConstant := j₁.ofConstant.prodMap j₂.ofConstant eval_ofConstant g := Prod.ext (j₁.eval_ofConstant g.1) (j₂.eval_ofConstant g.2) diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/SU/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/SU/Basic.lean index db7f7a069..94f08931a 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/SU/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/SU/Basic.lean @@ -488,7 +488,7 @@ namespace LocalGaugeData /-- **The local gauge data of `SU(n)`**: special unitary jets, traceless hermitian jets with the bracket `i (a b − b a)` and the conjugation action, and the Maurer–Cartan form `i (∂_μ U) U⁻¹`. -/ -noncomputable def su (n : ℕ) : LocalGaugeData (JetSU n) (SUAlgebra n) (SU n) (JetSUAlgebra n) +noncomputable def su (n : ℕ) : LocalGaugeData (SU n) (SUAlgebra n) (JetSU n) (JetSUAlgebra n) where eval := JetSU.eval ofConstant := JetSU.ofConstant diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/TransformsIn.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/TransformsIn.lean index 442ef734c..b47977edd 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/TransformsIn.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/TransformsIn.lean @@ -21,7 +21,7 @@ lower symbols, with no inhomogeneous term. This is the generalization of property preserved by the covariant derivative in `Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction`. -Nothing here depends on the local gauge data beyond the group `G` acting; the definition +Nothing here depends on the local gauge data beyond the group `GJ` acting; the definition lives in the `LocalGaugeData` namespace with the transformation laws that consume it. ## ii. Key results @@ -43,7 +43,7 @@ open Matrix MatrixGroups TensorProduct MvPowerSeries variable {B : Type} [Ring B] [Algebra ℂ B] variable {V : Type} [AddCommGroup V] [Module ℂ V] -variable {G : Type} [Group G] +variable {GJ : Type} [Group GJ] namespace LocalGaugeData @@ -56,21 +56,21 @@ open GaugeAlgebraRealization 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 `AlgebraRealization`. -/ -def TransformsIn (repGauge : Representation ℂ G B) - (rep : Representation ℂ G (JetRing ⊗[ℂ] V)) +def TransformsIn (repGauge : Representation ℂ GJ B) + (rep : Representation ℂ GJ (JetRing ⊗[ℂ] V)) (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B) : Prop := - ∀ (U : G) (φ : Module.Dual ℂ V) (s : Multiset (Fin 1 ⊕ Fin 3)), + ∀ (U : GJ) (φ : 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 -variable {repGauge : Representation ℂ G B} - {rep : Representation ℂ G (JetRing ⊗[ℂ] V)} +variable {repGauge : Representation ℂ GJ B} + {rep : Representation ℂ GJ (JetRing ⊗[ℂ] V)} {F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] B} /-- A matter gauge tensor transforms at the base point through the dual coefficient of the base-point value of the gauge jet alone: the antidiagonal of the empty multiset has a single term. -/ -lemma TransformsIn.repGauge_zero (hF : TransformsIn repGauge rep F) (U : G) +lemma TransformsIn.repGauge_zero (hF : TransformsIn repGauge rep F) (U : GJ) (φ : Module.Dual ℂ V) : repGauge U (F 0 φ) = F 0 (repDualCoeff rep U⁻¹ 0 φ) := by simpa only [Multiset.antidiagonal_zero, Multiset.map_singleton, @@ -82,9 +82,9 @@ lemma TransformsIn.repGauge_zero (hF : TransformsIn repGauge rep F) (U : G) representation's zeroth Taylor coefficient is the identity on such jets. -/ lemma TransformsIn.repGauge_eq_of_eval_eq_one {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} (hF : TransformsIn repGauge rep F) - (hrep : ∀ {W : G}, jets.eval W = 1 → repCoeff rep W 0 = LinearMap.id) - {U : G} (hU : jets.eval U = 1) (φ : Module.Dual ℂ V) : + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} (hF : TransformsIn repGauge rep F) + (hrep : ∀ {W : GJ}, jets.eval W = 1 → repCoeff rep W 0 = LinearMap.id) + {U : GJ} (hU : jets.eval U = 1) (φ : Module.Dual ℂ V) : repGauge U (F 0 φ) = F 0 φ := by have hinv : jets.eval U⁻¹ = 1 := by rw [map_inv, hU, inv_one] rw [hF.repGauge_zero U φ, @@ -95,8 +95,8 @@ lemma TransformsIn.repGauge_eq_of_eval_eq_one {𝔤 : Type} [LieRing 𝔤] [LieA are the jets with trivial base-point value, so `repGauge_eq_of_eval_eq_one` applies. -/ lemma TransformsIn.repGauge_eq_of_mem_truncationKer_zero {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} (hF : TransformsIn repGauge rep F) - (hrep : ∀ {W : G}, jets.eval W = 1 → repCoeff rep W 0 = LinearMap.id) + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} (hF : TransformsIn repGauge rep F) + (hrep : ∀ {W : GJ}, jets.eval W = 1 → repCoeff rep W 0 = LinearMap.id) (U : jets.truncationKer 0) (φ : Module.Dual ℂ V) : repGauge U.1 (F 0 φ) = F 0 φ := hF.repGauge_eq_of_eval_eq_one hrep (jets.mem_truncationKer_zero_iff.mp U.2) φ diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Truncation.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Truncation.lean index 9beb9c001..f22647074 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Truncation.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Truncation.lean @@ -18,7 +18,7 @@ Taylor coefficients of matrix entries; for an abstract package `jets` it is phra the two things the package provides at the base point, the value `eval U` and the Maurer–Cartan form: `U` is trivial to order `n` when `eval U = 1` and the base-point Taylor coefficients of `ω_μ(U)` vanish below order `n`. The Taylor–Leibniz theorem makes these -jets a subgroup `truncationKer n`, normal in `G`, and the subgroups decrease with `n`. +jets a subgroup `truncationKer n`, normal in `GJ`, and the subgroups decrease with `n`. The zeroth member, the *pure jets* with `eval U = 1`, is the complement of the constant jets: every jet factors uniquely as a pure jet times the constant jet of its value, @@ -68,9 +68,9 @@ most `n` derivatives by a pure translation. namespace LocalGaugeData -variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - (jets : LocalGaugeData G 𝔤 G₀ 𝔤J) +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + (jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J) /-! @@ -81,7 +81,7 @@ variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] /-- The jets trivial to order `n`: value the identity, and base-point Taylor coefficients of the Maurer–Cartan form vanishing below order `n`. Closure under products and inverses is the cocycle law together with the Taylor–Leibniz theorem for the adjoint action. -/ -noncomputable def truncationKer (n : ℕ) : Subgroup G where +noncomputable def truncationKer (n : ℕ) : Subgroup GJ where carrier := {U | jets.eval U = 1 ∧ ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), s.card < n → jets.evalLie (jets.iteratedDeriv s (jets.maurerCartan U μ)) = 0} one_mem' := ⟨map_one _, fun s μ _ => by rw [maurerCartan_one, map_zero, map_zero]⟩ @@ -98,15 +98,15 @@ noncomputable def truncationKer (n : ℕ) : Subgroup G where exact jets.evalLie_iteratedDeriv_adjoint_eq_zero U⁻¹ fun q hq => hU.2 q μ (lt_of_le_of_lt (Multiset.card_le_card hq) hs) -lemma mem_truncationKer_iff {n : ℕ} {U : G} : +lemma mem_truncationKer_iff {n : ℕ} {U : GJ} : U ∈ jets.truncationKer n ↔ jets.eval U = 1 ∧ ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), s.card < n → jets.evalLie (jets.iteratedDeriv s (jets.maurerCartan U μ)) = 0 := Iff.rfl -lemma eval_eq_one_of_mem_truncationKer {n : ℕ} {U : G} (hU : U ∈ jets.truncationKer n) : +lemma eval_eq_one_of_mem_truncationKer {n : ℕ} {U : GJ} (hU : U ∈ jets.truncationKer n) : jets.eval U = 1 := hU.1 -lemma evalLie_iteratedDeriv_maurerCartan_eq_zero_of_mem_truncationKer {n : ℕ} {U : G} +lemma evalLie_iteratedDeriv_maurerCartan_eq_zero_of_mem_truncationKer {n : ℕ} {U : GJ} (hU : U ∈ jets.truncationKer n) {s : Multiset (Fin 1 ⊕ Fin 3)} (hs : s.card < n) (μ : Fin 1 ⊕ Fin 3) : jets.evalLie (jets.iteratedDeriv s (jets.maurerCartan U μ)) = 0 := hU.2 s μ hs @@ -116,7 +116,7 @@ lemma truncationKer_antitone : Antitone jets.truncationKer := fun _ _ hmn _ hU => ⟨hU.1, fun s μ hs => hU.2 s μ (lt_of_lt_of_le hs hmn)⟩ /-- The zeroth truncation kernel is the group of pure jets, those with identity value. -/ -lemma mem_truncationKer_zero_iff {U : G} : U ∈ jets.truncationKer 0 ↔ jets.eval U = 1 := +lemma mem_truncationKer_zero_iff {U : GJ} : U ∈ jets.truncationKer 0 ↔ jets.eval U = 1 := ⟨fun h => h.1, fun h => ⟨h, fun _ _ hs => absurd hs (Nat.not_lt_zero _)⟩⟩ /-! @@ -128,7 +128,7 @@ lemma mem_truncationKer_zero_iff {U : G} : U ∈ jets.truncationKer 0 ↔ jets.e /-- Deep jets kill the positive adjoint coefficients: for a jet trivial to order `n`, the adjoint coefficients of order between `1` and `n` vanish. One derivative of the adjoint is `ad` of the Maurer–Cartan form, whose base-point data vanish below order `n`. -/ -lemma adjointCoeff_eq_zero_of_mem_truncationKer {n : ℕ} {U : G} (hU : U ∈ jets.truncationKer n) +lemma adjointCoeff_eq_zero_of_mem_truncationKer {n : ℕ} {U : GJ} (hU : U ∈ jets.truncationKer n) {x : Multiset (Fin 1 ⊕ Fin 3)} (hx : x ≠ 0) (hxn : x.card ≤ n) : jets.adjointCoeff U x = 0 := by obtain ⟨μ, hμ⟩ := Multiset.card_pos_iff_exists_mem.mp (Multiset.card_pos.mpr hx) @@ -140,7 +140,7 @@ lemma adjointCoeff_eq_zero_of_mem_truncationKer {n : ℕ} {U : G} (hU : U ∈ je rw [hU.2 p.1 μ (by omega), map_zero, LinearMap.zero_comp] /-- The dual form of `adjointCoeff_eq_zero_of_mem_truncationKer`. -/ -lemma adjointDualCoeff_eq_zero_of_mem_truncationKer {n : ℕ} {U : G} +lemma adjointDualCoeff_eq_zero_of_mem_truncationKer {n : ℕ} {U : GJ} (hU : U ∈ jets.truncationKer n) {x : Multiset (Fin 1 ⊕ Fin 3)} (hx : x ≠ 0) (hxn : x.card ≤ n) : jets.adjointDualCoeff U x = 0 := by rw [adjointDualCoeff, jets.adjointCoeff_eq_zero_of_mem_truncationKer hU hx hxn] @@ -148,7 +148,7 @@ lemma adjointDualCoeff_eq_zero_of_mem_truncationKer {n : ℕ} {U : G} /-- Up to order `n`, a jet trivial to order `n` has the adjoint coefficients of the identity. -/ -lemma adjointCoeff_eq_one_of_mem_truncationKer {n : ℕ} {U : G} (hU : U ∈ jets.truncationKer n) +lemma adjointCoeff_eq_one_of_mem_truncationKer {n : ℕ} {U : GJ} (hU : U ∈ jets.truncationKer n) {x : Multiset (Fin 1 ⊕ Fin 3)} (hxn : x.card ≤ n) : jets.adjointCoeff U x = jets.adjointCoeff 1 x := by rw [adjointCoeff_one] @@ -158,7 +158,7 @@ lemma adjointCoeff_eq_one_of_mem_truncationKer {n : ℕ} {U : G} (hU : U ∈ jet · exact jets.adjointCoeff_eq_zero_of_mem_truncationKer hU h hxn /-- Up to order `n`, a jet trivial to order `n` is invisible on the right of a product. -/ -lemma adjointCoeff_mul_of_mem_truncationKer_right (g : G) {n : ℕ} {U : G} +lemma adjointCoeff_mul_of_mem_truncationKer_right (g : GJ) {n : ℕ} {U : GJ} (hU : U ∈ jets.truncationKer n) {x : Multiset (Fin 1 ⊕ Fin 3)} (hxn : x.card ≤ n) : jets.adjointCoeff (g * U) x = jets.adjointCoeff g x := by rw [adjointCoeff_mul, Multiset.sum_antidiagonal_eq_of_snd_ne_zero x _ fun p hp hp2 => ?_] @@ -168,7 +168,7 @@ lemma adjointCoeff_mul_of_mem_truncationKer_right (g : G) {n : ℕ} {U : G} LinearMap.comp_zero] /-- Up to order `n`, a jet trivial to order `n` is invisible on the left of a product. -/ -lemma adjointCoeff_mul_of_mem_truncationKer_left (g : G) {n : ℕ} {U : G} +lemma adjointCoeff_mul_of_mem_truncationKer_left (g : GJ) {n : ℕ} {U : GJ} (hU : U ∈ jets.truncationKer n) {x : Multiset (Fin 1 ⊕ Fin 3)} (hxn : x.card ≤ n) : jets.adjointCoeff (U * g) x = jets.adjointCoeff g x := by rw [adjointCoeff_mul, Multiset.sum_antidiagonal_eq_of_fst_ne_zero x _ fun p hp hp1 => ?_] @@ -179,7 +179,7 @@ lemma adjointCoeff_mul_of_mem_truncationKer_left (g : G) {n : ℕ} {U : G} /-- Up to order `n`, a conjugate of a jet trivial to order `n` has the adjoint coefficients of the identity. -/ -lemma adjointCoeff_conj_of_mem_truncationKer (g : G) {n : ℕ} {U : G} +lemma adjointCoeff_conj_of_mem_truncationKer (g : GJ) {n : ℕ} {U : GJ} (hU : U ∈ jets.truncationKer n) {x : Multiset (Fin 1 ⊕ Fin 3)} (hxn : x.card ≤ n) : jets.adjointCoeff (g * U * g⁻¹) x = jets.adjointCoeff 1 x := by rw [adjointCoeff_mul, Multiset.map_congr rfl (fun p hp => by @@ -189,7 +189,7 @@ lemma adjointCoeff_conj_of_mem_truncationKer (g : G) {n : ℕ} {U : G} /-- Up to order `n`, a conjugate of a jet trivial to order `n` acts trivially on the base-point Taylor data of the jet Lie algebra. -/ -lemma evalLie_iteratedDeriv_adjoint_conj_of_mem_truncationKer (g : G) {n : ℕ} {U : G} +lemma evalLie_iteratedDeriv_adjoint_conj_of_mem_truncationKer (g : GJ) {n : ℕ} {U : GJ} (hU : U ∈ jets.truncationKer n) {s : Multiset (Fin 1 ⊕ Fin 3)} (hs : s.card ≤ n) (Y : 𝔤J) : jets.evalLie (jets.iteratedDeriv s (jets.adjoint (g * U * g⁻¹) Y)) = jets.evalLie (jets.iteratedDeriv s Y) := by @@ -209,7 +209,7 @@ lemma evalLie_iteratedDeriv_adjoint_conj_of_mem_truncationKer (g : G) {n : ℕ} /-- The Maurer–Cartan form of a conjugate, by the cocycle law: the conjugating jet contributes its own form and its transport by the conjugate. -/ -lemma maurerCartan_conj (g U : G) (μ : Fin 1 ⊕ Fin 3) : +lemma maurerCartan_conj (g U : GJ) (μ : Fin 1 ⊕ Fin 3) : jets.maurerCartan (g * U * g⁻¹) μ = jets.maurerCartan g μ + jets.adjoint g (jets.maurerCartan U μ) - jets.adjoint (g * U * g⁻¹) (jets.maurerCartan g μ) := by @@ -234,18 +234,18 @@ instance truncationKer_normal (n : ℕ) : (jets.truncationKer n).Normal where -/ /-- The projection of a jet onto the pure jets, stripping its value: `U ↦ U · (U₀)⁻¹`. - This is not a group homomorphism; it is the cocycle of the splitting of `G` by the + This is not a group homomorphism; it is the cocycle of the splitting of `GJ` by the constant jets. -/ -noncomputable def truncationProjZero (U : G) : jets.truncationKer 0 := +noncomputable def truncationProjZero (U : GJ) : jets.truncationKer 0 := ⟨U * (jets.ofConstant (jets.eval U))⁻¹, jets.mem_truncationKer_zero_iff.mpr (by rw [map_mul, map_inv, eval_ofConstant, mul_inv_cancel])⟩ @[simp] -lemma coe_truncationProjZero (U : G) : - (jets.truncationProjZero U : G) = U * (jets.ofConstant (jets.eval U))⁻¹ := rfl +lemma coe_truncationProjZero (U : GJ) : + (jets.truncationProjZero U : GJ) = U * (jets.ofConstant (jets.eval U))⁻¹ := rfl /-- Every jet is its pure part times the constant jet of its value. -/ -lemma eq_truncationProjZero_mul_ofConstant (U : G) : +lemma eq_truncationProjZero_mul_ofConstant (U : GJ) : U = jets.truncationProjZero U * jets.ofConstant (jets.eval U) := by simp @@ -256,7 +256,7 @@ lemma truncationProjZero_surjective : Function.Surjective jets.truncationProjZer mul_one] /-- The pure part of a jet is trivial exactly when the jet is constant. -/ -lemma truncationProjZero_eq_one_iff {U : G} : +lemma truncationProjZero_eq_one_iff {U : GJ} : jets.truncationProjZero U = 1 ↔ U = jets.ofConstant (jets.eval U) := by rw [← Subtype.coe_inj, coe_truncationProjZero, Subgroup.coe_one, mul_inv_eq_one] @@ -268,7 +268,7 @@ lemma truncationProjZero_ofConstant (g : G₀) : /-- Stripping the value of a jet does not change its Maurer–Cartan form: by the cocycle law, right multiplication by a constant jet drops out. -/ @[simp] -lemma maurerCartan_truncationProjZero (U : G) (μ : Fin 1 ⊕ Fin 3) : +lemma maurerCartan_truncationProjZero (U : GJ) (μ : Fin 1 ⊕ Fin 3) : jets.maurerCartan (jets.truncationProjZero U) μ = jets.maurerCartan U μ := by rw [coe_truncationProjZero, ← map_inv, maurerCartan_cocycle, maurerCartan_ofConstant, map_zero, add_zero] @@ -331,7 +331,7 @@ variable [jets.Faithful] /-- A pure jet of a faithful package is determined by its Maurer–Cartan form. By the cocycle and inverse laws `ω(V⁻¹ U) = Ad_{V⁻¹}(ω(U) − ω(V)) = 0`, so `V⁻¹ U` is the constant jet of its value, which is the identity. -/ -lemma maurerCartan_injOn_truncationKer_zero {U V : G} (hU : U ∈ jets.truncationKer 0) +lemma maurerCartan_injOn_truncationKer_zero {U V : GJ} (hU : U ∈ jets.truncationKer 0) (hV : V ∈ jets.truncationKer 0) (h : jets.maurerCartan U = jets.maurerCartan V) : U = V := by have h1 : jets.maurerCartan (V⁻¹ * U) = 0 := by @@ -381,7 +381,7 @@ to each summand. -/ /-- The radial component `∑_μ x_μ ω_μ(U)` of the Maurer–Cartan form of a jet. -/ -noncomputable def radial (U : G) : 𝔤J := +noncomputable def radial (U : GJ) : 𝔤J := ∑ μ, jets.coord μ (jets.maurerCartan U μ) /-- The symmetrized Maurer–Cartan data are the Taylor data of the radial component: @@ -415,7 +415,7 @@ lemma symmetrizedMaurerCartanCoeff_eq_evalLie_iteratedDeriv_radial (U : jets.tru coordinates on the pure jets, `symmetrizedMaurerCartanCoeff_bijective`; like `Faithful` it is recorded separately from the structure because the covariance theory does not need it, only the classification of invariants does. -/ -class Free (jets : LocalGaugeData G 𝔤 G₀ 𝔤J) : Prop extends Faithful jets where +class Free (jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J) : Prop extends Faithful jets where exists_evalLie_iteratedDeriv_eq : ∀ c : Multiset (Fin 1 ⊕ Fin 3) → 𝔤, ∃ Y : 𝔤J, ∀ s, jets.evalLie (jets.iteratedDeriv s Y) = c s exists_radial_eq : ∀ ρ : 𝔤J, jets.evalLie ρ = 0 → ∃ U : jets.truncationKer 0, jets.radial U.1 = ρ diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/U1.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/U1.lean index 6feaf07e9..31fed1fbb 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/U1.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/U1.lean @@ -249,7 +249,7 @@ namespace LocalGaugeData /-- **The local gauge data of `U(1)`**: unitary jets, self-adjoint scalar jets with vanishing bracket and trivial adjoint action, and the Maurer–Cartan form `i (∂_μ u) u⁻¹`. -/ -noncomputable def u1 : LocalGaugeData JetU1 U1Algebra U1 JetU1Algebra where +noncomputable def u1 : LocalGaugeData U1 U1Algebra JetU1 JetU1Algebra where eval := JetU1.eval ofConstant := JetU1.ofConstant eval_ofConstant := JetU1.eval_ofConstant diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Basic.lean index ca3f850ed..dadcd17e8 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Basic.lean @@ -16,10 +16,10 @@ finite-dimensional complex vector space `V` in which the field takes its values, 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. -All of this is relative to a gauge context `jets : LocalGaugeData G 𝔤 G₀ 𝔤J`: the jet gauge -group `G` the field's jet action is a representation of, and the global group `G₀`, Lie -algebras `𝔤`, `𝔤J` and structure maps that make `G` the jets of `G₀` rather than an -unrelated group. Fixing `jets` rather than `G` alone is what lets the global gauge action +All of this is relative to a gauge context `jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J`: the jet gauge +group `GJ` the field's jet action is a representation of, and the global group `G₀`, Lie +algebras `𝔤`, `𝔤J` and structure maps that make `GJ` the jets of `G₀` rather than an +unrelated group. Fixing `jets` rather than `GJ` alone is what lets the global gauge action `repConstant` below be taken along the *canonical* inclusion `jets.ofConstant`, instead of an arbitrary homomorphism supplied by hand. @@ -51,14 +51,14 @@ open Matrix MatrixGroups TensorProduct -/ -/-- **A matter field** of a gauge theory over the gauge context `jets : LocalGaugeData G 𝔤 G₀ 𝔤J`: +/-- **A matter field** of a gauge theory over the gauge context `jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J`: 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, the infinitesimal + fibrewise action of `GJ` on the jets `JetRing ⊗[ℂ] V` of the field, the infinitesimal action of the gauge algebra generating it, and the mass weight of the field (in the units in which a derivative has weight `2`). -/ -structure MatterField {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - (jets : LocalGaugeData G 𝔤 G₀ 𝔤J) where +structure MatterField {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + (jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J) where /-- The target space of the field. -/ V : Type [instAddCommGroup : AddCommGroup V] @@ -68,11 +68,11 @@ structure MatterField {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlge /-- 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) + repJet : Representation ℂ GJ (JetRing ⊗[ℂ] V) /-- The action of the gauge algebra. -/ repAlgebra : 𝔤 →ₗ[ℝ] V →ₗ[ℂ] 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 + repJet_smul : ∀ (U : GJ) (χ : JetRing) (z : JetRing ⊗[ℂ] V), repJet U (χ • z) = χ • repJet U z /-- The action of the gauge algebra generates the action of the jets of gauge transformations: it is the infinitesimal action underlying `repJet`, the physicists' `i dρ(T^a)`. This is what makes the covariant derivative of the field transform @@ -86,8 +86,8 @@ attribute [instance] MatterField.instAddCommGroup MatterField.instModule namespace MatterField -variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} (M : MatterField jets) +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} (M : MatterField jets) end MatterField diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Charge.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Charge.lean index df829b5b2..58bfa3e60 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Charge.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Charge.lean @@ -111,7 +111,7 @@ lemma chargeRep_smul (n : ℤ) (U : unitary JetRing) (χ : JetRing) (z : JetRing on `jets` beyond its jet group, so it is supplied polymorphically. -/ noncomputable def charged {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - (jets : LocalGaugeData (unitary JetRing) 𝔤 G₀ 𝔤J) [Module.Free ℂ V] [Module.Finite ℂ V] + (jets : LocalGaugeData G₀ 𝔤 (unitary JetRing) 𝔤J) [Module.Free ℂ V] [Module.Finite ℂ V] (repLorentz : Representation ℂ SL(2,ℂ) V) (n : ℤ) (act : 𝔤 →ₗ[ℝ] V →ₗ[ℂ] V) (hact : jets.IsInfinitesimalActionOf act (chargeRep n V)) (w : ℕ) : MatterField jets where @@ -126,7 +126,7 @@ noncomputable def charged {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] @[simp] lemma charged_V {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - (jets : LocalGaugeData (unitary JetRing) 𝔤 G₀ 𝔤J) [Module.Free ℂ V] [Module.Finite ℂ V] + (jets : LocalGaugeData G₀ 𝔤 (unitary JetRing) 𝔤J) [Module.Free ℂ V] [Module.Finite ℂ V] (repLorentz : Representation ℂ SL(2,ℂ) V) (n : ℤ) (act : 𝔤 →ₗ[ℝ] V →ₗ[ℂ] V) (hact : jets.IsInfinitesimalActionOf act (chargeRep n V)) (w : ℕ) : (charged jets repLorentz n act hact w).V = V := rfl diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/CovariantDeriv.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/CovariantDeriv.lean index 0d8a42eec..b133778a5 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/CovariantDeriv.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/CovariantDeriv.lean @@ -60,17 +60,17 @@ 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 {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] +variable {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] +variable {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} variable {V : Type} [AddCommGroup V] [Module ℂ V] namespace GaugeAlgebraRealization variable {repLorentz : Representation ℂ SL(2,ℂ) B} -variable {repGauge : Representation ℂ G B} +variable {repGauge : Representation ℂ GJ B} variable {repLorentz : Representation ℂ SL(2,ℂ) B} -variable {repGauge : Representation ℂ G B} +variable {repGauge : Representation ℂ GJ B} variable {A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B} variable (h : GaugeAlgebraRealization jets B repGauge repLorentz) @@ -84,8 +84,8 @@ variable (h : GaugeAlgebraRealization jets B repGauge repLorentz) 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 := +noncomputable def repCoeff (rep : Representation ℂ GJ (JetRing ⊗[ℂ] V)) + (U : GJ) (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 @@ -93,8 +93,8 @@ noncomputable def repCoeff (rep : Representation ℂ G (JetRing ⊗[ℂ] V)) `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)) : +noncomputable def repDualCoeff (rep : Representation ℂ GJ (JetRing ⊗[ℂ] V)) + (U : GJ) (x : Multiset (Fin 1 ⊕ Fin 3)) : Module.Dual ℂ V →ₗ[ℂ] Module.Dual ℂ V := (repCoeff rep U x).dualMap @@ -295,7 +295,7 @@ include h in 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 - (U : G) {f f' : Module.Dual ℝ 𝔤 →ₗ[ℝ] B} + (U : GJ) {f f' : Module.Dual ℝ 𝔤 →ₗ[ℝ] B} {g g' : Module.Dual ℂ V →ₗ[ℂ] B} {cf : 𝔤} (hf : ∀ ψ : Module.Dual ℝ 𝔤, repGauge U (f ψ) = f' ψ + algebraMap ℂ B (ψ cf)) diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/FieldAlgebra.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/FieldAlgebra.lean index c5e88b03a..7c9b64be0 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/FieldAlgebra.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/FieldAlgebra.lean @@ -48,9 +48,9 @@ open Matrix MatrixGroups TensorProduct namespace MatterField -variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} (M : MatterField jets) +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} (M : MatterField jets) /-! @@ -75,11 +75,11 @@ abbrev FieldAlgebra : FieldStatistic → Type variable (A : Type) [Ring A] [Algebra ℂ A] [IsFieldAlgebra (JetComponentSpace M) A] /-- The jet gauge action on a field algebra of the matter field. -/ -noncomputable def repJetAlgebra : Representation ℂ G A := +noncomputable def repJetAlgebra : Representation ℂ GJ A := FieldAlgebra.repJet M /-- The global gauge action on a field algebra of the matter field, along the canonical - inclusion `jets.ofConstant : G₀ →* G` of the constant jets. -/ + inclusion `jets.ofConstant : G₀ →* GJ` of the constant jets. -/ noncomputable def repConstant : Representation ℂ G₀ A := FieldAlgebra.repConstant M jets.ofConstant @@ -91,7 +91,7 @@ noncomputable def repLorentzGroup : Representation ℂ SL(2,ℂ) A := noncomputable def massWeightScale (c : ℂ) : A →ₐ[ℂ] A := FieldAlgebra.massWeightScale M.massWeight c -lemma repJetAlgebra_ι (U : G) (x : JetComponentSpace M) : +lemma repJetAlgebra_ι (U : GJ) (x : JetComponentSpace M) : M.repJetAlgebra A U (FieldAlgebra.ι A x) = FieldAlgebra.ι A (JetComponentSpace.repJet M U x) := FieldAlgebra.repJet_ι M U x diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/Basic.lean index c918c2d94..deeebc0ea 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/Basic.lean @@ -48,9 +48,9 @@ is in `Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.Ga open Matrix MatrixGroups TensorProduct -variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} {M : MatterField jets} +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} {M : MatterField jets} /-- The space of component functions of the matter field `M`: the span of the symbols diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/GaugeAction.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/GaugeAction.lean index 9c5fb73d6..d6ff1d78a 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/GaugeAction.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/GaugeAction.lean @@ -13,9 +13,9 @@ public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.JetRep ## 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 +For a matter field valued in `V` with an action of a group `GJ` on its jets +`JetRing ⊗[ℂ] V`, this file constructs the induced action of `GJ` on the jet component +space. Here `GJ` 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`: @@ -50,9 +50,9 @@ open Matrix MatrixGroups TensorProduct variable {V : Type _} [AddCommGroup V] [Module ℂ V] variable {W : Type _} [AddCommGroup W] [Module ℂ W] -variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} /-- **The action of a coefficient on the symbols.** A coefficient `g ⊗ T` acts by `jetRingAction g` on the derivative label — the Leibniz convolution redistributing @@ -126,16 +126,16 @@ 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 : Representation ℂ GJ (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : GJ) (χ : JetRing) (z : JetRing ⊗[ℂ] V), rep U (χ • z) = χ • rep U z) : - Representation ℂ G (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ V) where + Representation ℂ GJ (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ V) where toFun U := symbolAction (jetCoeff rep U⁻¹) map_one' := by - have h1 : jetCoeff rep (1 : G)⁻¹ = 1 := by + have h1 : jetCoeff rep (1 : GJ)⁻¹ = 1 := by refine lift_injective fun v => ?_ rw [jetCoeff_spec rep] - show rep (1 : G)⁻¹ ((1 : JetRing) ⊗ₜ[ℂ] v) = (1 : JetRing) ⊗ₜ[ℂ] v + show rep (1 : GJ)⁻¹ ((1 : JetRing) ⊗ₜ[ℂ] v) = (1 : JetRing) ⊗ₜ[ℂ] v rw [inv_one, map_one] rfl rw [h1, Algebra.TensorProduct.one_def, symbolAction_tmul, @@ -157,10 +157,10 @@ the base point.** No derivative of the gauge jet contributes: the symbol `ψ_φ` 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 : Representation ℂ GJ (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : GJ) (χ : JetRing) (z : JetRing ⊗[ℂ] V), rep U (χ • z) = χ • rep U z) - (U : G) (φ : Module.Dual ℂ V) : + (U : GJ) (φ : Module.Dual ℂ V) : repDual rep hlin U ((1 : DerivAlgebraComplex) ⊗ₜ[ℂ] φ) = (1 : DerivAlgebraComplex) ⊗ₜ[ℂ] Module.Dual.transpose (jetEval ∘ₗ (rep U⁻¹).comp jetOfConstant) φ := by @@ -187,16 +187,16 @@ its fibrewise linearity `M.repJet_smul`, and the freeness and finiteness of `M.V the matter field rather than a bare value space is what removes all three from the argument list. -/ noncomputable def repJet (M : MatterField jets) : - Representation ℂ G (JetComponentSpace M) := + Representation ℂ GJ (JetComponentSpace M) := (repDual M.repJet M.repJet_smul).prod (repDual (repConj M.repJet) (repConj_smul_comm M.repJet_smul)) @[simp] -lemma repJet_fst (M : MatterField jets) (U : G) (x : JetComponentSpace M) : +lemma repJet_fst (M : MatterField jets) (U : GJ) (x : JetComponentSpace M) : (repJet M U x).1 = repDual M.repJet M.repJet_smul U x.1 := rfl @[simp] -lemma repJet_snd (M : MatterField jets) (U : G) (x : JetComponentSpace M) : +lemma repJet_snd (M : MatterField jets) (U : GJ) (x : JetComponentSpace M) : (repJet M U x).2 = repDual (repConj M.repJet) (repConj_smul_comm M.repJet_smul) U x.2 := rfl @@ -255,13 +255,13 @@ action; the group element is inverted on both sides alike, so no convention is d by it. -/ lemma comap_comp_repDual [Module.Free ℂ V] [Module.Finite ℂ V] [Module.Free ℂ W] [Module.Finite ℂ W] - (repV : Representation ℂ G (JetRing ⊗[ℂ] V)) - (hV : ∀ (U : G) (χ : JetRing) (z : JetRing ⊗[ℂ] V), repV U (χ • z) = χ • repV U z) - (repW : Representation ℂ G (JetRing ⊗[ℂ] W)) - (hW : ∀ (U : G) (χ : JetRing) (z : JetRing ⊗[ℂ] W), repW U (χ • z) = χ • repW U z) + (repV : Representation ℂ GJ (JetRing ⊗[ℂ] V)) + (hV : ∀ (U : GJ) (χ : JetRing) (z : JetRing ⊗[ℂ] V), repV U (χ • z) = χ • repV U z) + (repW : Representation ℂ GJ (JetRing ⊗[ℂ] W)) + (hW : ∀ (U : GJ) (χ : JetRing) (z : JetRing ⊗[ℂ] W), repW U (χ • z) = χ • repW U z) (f : V →ₗ[ℂ] W) - (hf : ∀ U : G, (LinearMap.lTensor JetRing f).comp (repV U) - = (repW U).comp (LinearMap.lTensor JetRing f)) (U : G) : + (hf : ∀ U : GJ, (LinearMap.lTensor JetRing f).comp (repV U) + = (repW U).comp (LinearMap.lTensor JetRing f)) (U : GJ) : (TensorProduct.map LinearMap.id (Module.Dual.transpose f)).comp (repDual repW hW U) = (repDual repV hV U).comp (TensorProduct.map LinearMap.id (Module.Dual.transpose f)) := by @@ -281,8 +281,8 @@ of linear maps on the whole component space, not a statement about undifferentia symbols. The conjugate half is the unconjugated argument applied to `repConj M.repJet` and `repConj N.repJet`, whose intertwining is `JetComponentSpace.lTensor_comp_repConj`. -/ lemma comap_comp_repJet {M N : MatterField jets} (f : M.V →ₗ[ℂ] N.V) - (hf : ∀ U : G, (LinearMap.lTensor JetRing f).comp (M.repJet U) - = (N.repJet U).comp (LinearMap.lTensor JetRing f)) (U : G) : + (hf : ∀ U : GJ, (LinearMap.lTensor JetRing f).comp (M.repJet U) + = (N.repJet U).comp (LinearMap.lTensor JetRing f)) (U : GJ) : (comap f).comp (repJet N U) = (repJet M U).comp (comap f) := by show (LinearMap.prodMap (TensorProduct.map LinearMap.id (Module.Dual.transpose f)) (TensorProduct.map LinearMap.id diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Basic.lean index 462213ed3..c05b37986 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Basic.lean @@ -60,8 +60,8 @@ open TensorProduct MvPowerSeries MatrixGroups namespace LocalGaugeData -variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] /-! @@ -74,10 +74,10 @@ variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] and the jets of the gauge algebra by the matrix of jets `jetAct a`, subject to the derivative identity and the equivariance identity that make `act` the infinitesimal action underlying `mat`. -/ -structure MatrixRep (jets : LocalGaugeData G 𝔤 G₀ 𝔤J) (ι : Type) [Fintype ι] [DecidableEq ι] +structure MatrixRep (jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J) (ι : Type) [Fintype ι] [DecidableEq ι] where /-- The matrix of jets by which a jet of gauge transformations acts. -/ - mat : G → Matrix ι ι JetRing + mat : GJ → Matrix ι ι JetRing mat_one : mat 1 = 1 mat_mul : ∀ U V, mat (U * V) = mat U * mat V /-- The matrix by which an element of the gauge algebra acts. -/ @@ -92,17 +92,17 @@ structure MatrixRep (jets : LocalGaugeData G 𝔤 G₀ 𝔤J) (ι : Type) [Finty = act (jets.evalLie (jets.iteratedDeriv p a)) /-- The derivative identity: the formal derivative of the matrix of a gauge jet is minus the jet action of its Maurer–Cartan form times the matrix. -/ - mat_map_pderiv : ∀ (U : G) (μ : Fin 1 ⊕ Fin 3), + mat_map_pderiv : ∀ (U : GJ) (μ : Fin 1 ⊕ Fin 3), (mat U).map (fun f => pderiv ℂ μ f) = -(jetAct (jets.maurerCartan U μ) * mat U) /-- The equivariance identity: the matrix of a gauge jet intertwines the constant jet action with its adjoint transform. -/ - mat_mul_jetAct : ∀ (U : G) (c : 𝔤), + mat_mul_jetAct : ∀ (U : GJ) (c : 𝔤), mat U * jetAct (jets.ofConstantLie c) = jetAct (jets.adjoint U (jets.ofConstantLie c)) * mat U namespace MatrixRep -variable {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} {ι : Type} +variable {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} {ι : Type} /-! @@ -415,16 +415,16 @@ variable (R : MatrixRep jets ι) /-- **The jet gauge action** of a matrix representation on the jets of a `V`-valued field: the matrix of jets acts on the internal index by matrix–vector multiplication, with the Lorentz factor untouched. -/ -noncomputable def repJet : Representation ℂ G (JetRing ⊗[ℂ] V) where +noncomputable def repJet : Representation ℂ GJ (JetRing ⊗[ℂ] V) where toFun U := matEnd e (R.mat U) map_one' := by rw [R.mat_one, matEnd_one]; rfl map_mul' U V := by rw [R.mat_mul, matEnd_mul]; rfl -lemma repJet_apply (U : G) : R.repJet e U = matEnd e (R.mat U) := rfl +lemma repJet_apply (U : GJ) : R.repJet e U = matEnd e (R.mat U) := rfl /-- **The jet gauge action is fibrewise**: it commutes with multiplication by scalar jets. -/ -lemma repJet_smul (U : G) (χ : JetRing) (z : JetRing ⊗[ℂ] V) : +lemma repJet_smul (U : GJ) (χ : JetRing) (z : JetRing ⊗[ℂ] V) : R.repJet e U (χ • z) = χ • R.repJet e U z := by rw [repJet_apply, matEnd_smul] @@ -450,7 +450,7 @@ lemma repAlgebra_apply (c : 𝔤) : R.repAlgebra e c = valEnd e (R.act c) := rfl /-- **The base-point Taylor coefficients of the jet gauge action** are the endomorphisms of the base-point Taylor coefficients of the matrix of jets. -/ -lemma repCoeff_eq (U : G) (x : Multiset (Fin 1 ⊕ Fin 3)) : +lemma repCoeff_eq (U : GJ) (x : Multiset (Fin 1 ⊕ Fin 3)) : GaugeAlgebraRealization.repCoeff (R.repJet e) U x = valEnd e ((R.mat U).map fun f => constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) := by diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Constructions.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Constructions.lean index bd11099d1..3fa486f43 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Constructions.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Constructions.lean @@ -42,9 +42,9 @@ namespace LocalGaugeData namespace MatrixRep -variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} /-! diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Factors.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Factors.lean index 170afad8b..c6a387746 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Factors.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Factors.lean @@ -85,8 +85,8 @@ end MatterField namespace LocalGaugeData -variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] /-! @@ -98,9 +98,9 @@ variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] jet, with the corresponding components `φ c` of the gauge algebra and `φJ a` of its jets, related by the Maurer–Cartan form `φJ (ω_μ U) = i (∂_μ u) u⁻¹` and invariant under the adjoint action. -/ -structure U1Factor (jets : LocalGaugeData G 𝔤 G₀ 𝔤J) where +structure U1Factor (jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J) where /-- The unitary jet of a gauge jet. -/ - u : G →* unitary JetRing + u : GJ →* unitary JetRing /-- The `u(1)` component of a gauge algebra element. -/ φ : 𝔤 →ₗ[ℝ] ℂ /-- The `u(1)` component of a jet of gauge algebra elements. -/ @@ -109,22 +109,22 @@ structure U1Factor (jets : LocalGaugeData G 𝔤 G₀ 𝔤J) where φJ_cc_foldl : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (a : 𝔤J), constantCoeff (p.foldl (fun h ρ => pderiv ℂ ρ h) (φJ a)) = φ (jets.evalLie (jets.iteratedDeriv p a)) - φJ_maurerCartan : ∀ (U : G) (μ : Fin 1 ⊕ Fin 3), + φJ_maurerCartan : ∀ (U : GJ) (μ : Fin 1 ⊕ Fin 3), φJ (jets.maurerCartan U μ) = Complex.I • (pderiv ℂ μ (u U : JetRing) * star (u U : JetRing)) - φJ_adjoint : ∀ (U : G) (c : 𝔤), + φJ_adjoint : ∀ (U : GJ) (c : 𝔤), φJ (jets.adjoint U (jets.ofConstantLie c)) = φJ (jets.ofConstantLie c) namespace U1Factor -variable {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} (F : U1Factor jets) +variable {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} (F : U1Factor jets) variable {ι : Type} [Fintype ι] [DecidableEq ι] open MatterField /-- The derivative of the charge-`n` power of the unitary jet of a gauge jet, in terms of the Maurer–Cartan form: `∂_μ (u ^ n) = -(i n) φJ (ω_μ U) · u ^ n`. -/ -lemma pderiv_chargePow_u (n : ℤ) (U : G) (μ : Fin 1 ⊕ Fin 3) : +lemma pderiv_chargePow_u (n : ℤ) (U : GJ) (μ : Fin 1 ⊕ Fin 3) : pderiv ℂ μ (chargePow n (F.u U)) = -(((Complex.I * n) • F.φJ (jets.maurerCartan U μ)) * chargePow n (F.u U)) := by rw [pderiv_chargePow, F.φJ_maurerCartan, smul_smul, @@ -209,10 +209,10 @@ end U1Factor to each gauge jet, with the corresponding matrix components `φ c` of the gauge algebra and `φJ a` of its jets, related by the Maurer–Cartan form `φJ (ω_μ U) = i (∂_μ u) u⁻¹` and transforming by conjugation under the adjoint action. -/ -structure SUFactor (jets : LocalGaugeData G 𝔤 G₀ 𝔤J) (n : Type) [Fintype n] [DecidableEq n] +structure SUFactor (jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J) (n : Type) [Fintype n] [DecidableEq n] where /-- The unitary matrix of jets of a gauge jet. -/ - u : G → Matrix n n JetRing + u : GJ → Matrix n n JetRing u_one : u 1 = 1 u_mul : ∀ U V, u (U * V) = u U * u V u_unitary : ∀ U, star (u U) * u U = 1 @@ -224,15 +224,15 @@ structure SUFactor (jets : LocalGaugeData G 𝔤 G₀ 𝔤J) (n : Type) [Fintype φJ_cc_foldl : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (a : 𝔤J), ((φJ a).map fun f => constantCoeff (p.foldl (fun h ρ => pderiv ℂ ρ h) f)) = φ (jets.evalLie (jets.iteratedDeriv p a)) - φJ_maurerCartan : ∀ (U : G) (μ : Fin 1 ⊕ Fin 3), + φJ_maurerCartan : ∀ (U : GJ) (μ : Fin 1 ⊕ Fin 3), φJ (jets.maurerCartan U μ) = Complex.I • (((u U).map fun f => pderiv ℂ μ f) * star (u U)) - φJ_adjoint : ∀ (U : G) (c : 𝔤), + φJ_adjoint : ∀ (U : GJ) (c : 𝔤), φJ (jets.adjoint U (jets.ofConstantLie c)) = u U * φJ (jets.ofConstantLie c) * star (u U) namespace SUFactor -variable {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} {n : Type} [Fintype n] [DecidableEq n] +variable {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} {n : Type} [Fintype n] [DecidableEq n] (F : SUFactor jets n) /-- **The fundamental representation** of an `SU(n)` factor: the gauge jets act by their diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Table.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Table.lean index 87856a5ad..e2992e9e7 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Table.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Table.lean @@ -50,8 +50,8 @@ open Matrix MatrixGroups TensorProduct namespace LocalGaugeData -variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] /-! @@ -61,14 +61,14 @@ variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] /-- **A factor of the gauge group**, presented in the local gauge data: a `U(1)` factor or an `SU(n)` factor. -/ -inductive Factor (jets : LocalGaugeData G 𝔤 G₀ 𝔤J) +inductive Factor (jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J) /-- A `U(1)` factor. -/ | U1 (F : U1Factor jets) /-- An `SU(n)` factor. -/ | SU {n : ℕ} (F : SUFactor jets (Fin n)) /-- **A gauge group presented by its factors.** -/ -abbrev Factors (jets : LocalGaugeData G 𝔤 G₀ 𝔤J) : Type := List (Factor jets) +abbrev Factors (jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J) : Type := List (Factor jets) /-- **A representation label under `SU(n)`.** -/ inductive SURep @@ -86,7 +86,7 @@ abbrev SURep.dim (n : ℕ) : SURep → ℕ | .fund => n | .antifund => n -variable {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} +variable {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} /-- The matrix representation of an `SU(n)` factor named by a label. -/ noncomputable def SURep.rep {n : ℕ} (F : SUFactor jets (Fin n)) : @@ -250,7 +250,7 @@ lemma ScalarRow.matterField_massWeight (r : ScalarRow Γ) : /-- **A model table**: the gauge group as a list of factors, the fermion rows and the scalar rows. -/ -structure Table (jets : LocalGaugeData G 𝔤 G₀ 𝔤J) where +structure Table (jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J) where /-- The gauge group. -/ gauge : Factors jets /-- The fermion rows. -/ diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Pi.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Pi.lean index b7e45d198..6bc72b629 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Pi.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Pi.lean @@ -58,9 +58,9 @@ open Matrix MatrixGroups TensorProduct namespace MatterField -variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} /-! @@ -119,8 +119,8 @@ variable {ι : Type} [Fintype ι] [DecidableEq ι] (M : ι → MatterField jets) indexed analogue of `Representation.prod`, which Mathlib provides only in the binary case. -/ noncomputable def repPi {W : ι → Type} [∀ i, AddCommGroup (W i)] - [∀ i, Module ℂ (W i)] (ρ : ∀ i, Representation ℂ G (W i)) : - Representation ℂ G (∀ i, W i) where + [∀ i, Module ℂ (W i)] (ρ : ∀ i, Representation ℂ GJ (W i)) : + Representation ℂ GJ (∀ i, W i) where toFun U := LinearMap.piMap fun i => ρ i U map_one' := by refine LinearMap.ext fun x => funext fun i => ?_ @@ -134,13 +134,13 @@ noncomputable def repPi {W : ι → Type} [∀ i, AddCommGroup (W i)] /-- **The jet gauge action of an indexed direct sum**: the family of actions, read through the identification of the jets of `∀ i, (M i).V` with the family of jets. -/ -noncomputable def repJetPi : Representation ℂ G (JetRing ⊗[ℂ] (∀ i, (M i).V)) where +noncomputable def repJetPi : Representation ℂ GJ (JetRing ⊗[ℂ] (∀ i, (M i).V)) where toFun U := LinearEquiv.conjRingEquiv (jetPiEquiv fun i => (M i).V).symm (repPi (fun i => (M i).repJet) U) map_one' := by rw [map_one, map_one] map_mul' U W := by rw [map_mul, map_mul] -lemma repJetPi_apply (U : G) (z : JetRing ⊗[ℂ] (∀ i, (M i).V)) : +lemma repJetPi_apply (U : GJ) (z : JetRing ⊗[ℂ] (∀ i, (M i).V)) : repJetPi M U z = (jetPiEquiv fun i => (M i).V).symm (fun i => (M i).repJet U (jetPiEquiv (fun i => (M i).V) z i)) := rfl @@ -148,7 +148,7 @@ lemma repJetPi_apply (U : G) (z : JetRing ⊗[ℂ] (∀ i, (M i).V)) : index, and each summand is fibrewise, so multiplication by a scalar jet passes through the splitting untouched. This is the field `repJet_smul` of `MatterField.pi`, stated separately so that it can be used without fixing a common mass weight. -/ -lemma repJetPi_smul (U : G) (χ : JetRing) (z : JetRing ⊗[ℂ] (∀ i, (M i).V)) : +lemma repJetPi_smul (U : GJ) (χ : JetRing) (z : JetRing ⊗[ℂ] (∀ i, (M i).V)) : repJetPi M U (χ • z) = χ • repJetPi M U z := by rw [repJetPi_apply, repJetPi_apply, show (fun i => (M i).repJet U (jetPiEquiv (fun i => (M i).V) (χ • z) i)) @@ -160,7 +160,7 @@ lemma repJetPi_smul (U : G) (χ : JetRing) (z : JetRing ⊗[ℂ] (∀ i, (M i).V projection onto the value space of one summand, applied to the jets, intertwines the summed action with that summand's own: the summed action is the family of the actions, and reading off a summand of the jets is the projection on the value factor. -/ -lemma lTensor_proj_repJetPi (i : ι) (U : G) : +lemma lTensor_proj_repJetPi (i : ι) (U : GJ) : (LinearMap.lTensor JetRing (LinearMap.proj i)).comp (repJetPi M U) = ((M i).repJet U).comp (LinearMap.lTensor JetRing (LinearMap.proj i)) := by refine LinearMap.ext fun z => ?_ @@ -188,7 +188,7 @@ lemma repAlgebraPi_apply (c : 𝔤) : /-- The base-point Taylor coefficients of the summed jet action are the family of the coefficients of the summands: `jetOfConstant`, `jetIteratedDeriv` and `jetEval` all act index by index through `jetPiEquiv`. -/ -lemma repCoeff_repJetPi (U : G) (x : Multiset (Fin 1 ⊕ Fin 3)) : +lemma repCoeff_repJetPi (U : GJ) (x : Multiset (Fin 1 ⊕ Fin 3)) : GaugeAlgebraRealization.repCoeff (repJetPi M) U x = LinearMap.piMap fun i => GaugeAlgebraRealization.repCoeff (M i).repJet U x := by refine LinearMap.ext fun p => funext fun i => ?_ diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Prod.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Prod.lean index 7deb04709..fd3dd7588 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Prod.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Prod.lean @@ -47,9 +47,9 @@ open Matrix MatrixGroups TensorProduct namespace MatterField -variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} /-! @@ -86,12 +86,12 @@ private lemma prodMap_multiset_sum {ι V₁ V₂ : Type} [AddCommGroup V₁] [Mo /-- **The jet gauge action of a direct sum**: the two actions, read through the identification of the jets of `M.V × N.V` with the pair of jets. -/ noncomputable def repJetProd : - Representation ℂ G (JetRing ⊗[ℂ] (M.V × N.V)) where + Representation ℂ GJ (JetRing ⊗[ℂ] (M.V × N.V)) where toFun U := LinearEquiv.conjRingEquiv jetProdEquiv.symm ((M.repJet.prod N.repJet) U) map_one' := by rw [map_one, map_one] map_mul' U W := by rw [map_mul, map_mul] -lemma repJetProd_apply (U : G) (z : JetRing ⊗[ℂ] (M.V × N.V)) : +lemma repJetProd_apply (U : GJ) (z : JetRing ⊗[ℂ] (M.V × N.V)) : repJetProd M N U z = jetProdEquiv.symm (M.repJet U (jetProdEquiv z).1, N.repJet U (jetProdEquiv z).2) := rfl @@ -110,7 +110,7 @@ lemma repAlgebraProd_apply (c : 𝔤) : /-- The base-point Taylor coefficients of the summed jet action are the pair of the coefficients of the summands: `jetOfConstant`, `jetIteratedDeriv` and `jetEval` all act componentwise through `jetProdEquiv`. -/ -lemma repCoeff_repJetProd (U : G) (x : Multiset (Fin 1 ⊕ Fin 3)) : +lemma repCoeff_repJetProd (U : GJ) (x : Multiset (Fin 1 ⊕ Fin 3)) : GaugeAlgebraRealization.repCoeff (repJetProd M N) U x = (GaugeAlgebraRealization.repCoeff M.repJet U x).prodMap (GaugeAlgebraRealization.repCoeff N.repJet U x) := by diff --git a/Physlib/Particles/StandardModel/GaugeGroup/LocalGaugeData.lean b/Physlib/Particles/StandardModel/GaugeGroup/LocalGaugeData.lean index eec5b6fc9..d70f98a91 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/LocalGaugeData.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/LocalGaugeData.lean @@ -14,7 +14,7 @@ public import Physlib.Particles.StandardModel.GaugeGroup.MaurerCartan.Basic ## i. Overview The generic theory of gauge and matter fields is stated against a supplied local-gauge-data -package `jets : LocalGaugeData G 𝔤 G₀ 𝔤J`. The Standard Model already carries all of its +package `jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J`. The Standard Model already carries all of its data, for the jet gauge group `JetGaugeGroupI` of `SU(3) × SU(2) × U(1)` with jet Lie algebra `JetGaugeAlgebra`, global group `GaugeGroupI` and gauge algebra `GaugeAlgebra`. @@ -72,7 +72,7 @@ is registered globally. is an existing Standard Model construction and every proof field an existing Standard Model lemma. -/ noncomputable def localGaugeData : - LocalGaugeData JetGaugeGroupI GaugeAlgebra GaugeGroupI JetGaugeAlgebra where + LocalGaugeData GaugeGroupI GaugeAlgebra JetGaugeGroupI JetGaugeAlgebra where eval := JetGaugeGroupI.eval ofConstant := JetGaugeGroupI.ofConstant eval_ofConstant := JetGaugeGroupI.eval_ofConstant diff --git a/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/Basic.lean b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/Basic.lean index 2ec540f5b..8ccc1ac39 100644 --- a/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/Basic.lean +++ b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/Basic.lean @@ -48,9 +48,9 @@ namespace StandardModel open TensorProduct -variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} {M : MatterField jets} +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} {M : MatterField jets} /-! diff --git a/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/GaugeAction.lean b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/GaugeAction.lean index 7a971a505..9a28dba10 100644 --- a/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/GaugeAction.lean +++ b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/GaugeAction.lean @@ -45,9 +45,9 @@ namespace BosonicAlgebra open Matrix MatrixGroups TensorProduct -variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} (M : MatterField jets) +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} (M : MatterField jets) /-! @@ -59,7 +59,7 @@ variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] applied to the gauge action on the jet component space. The fibrewise action on the jets and its fibrewise-linearity are fields of `M`. -/ noncomputable def repJetGaugeGroupI : - Representation ℂ G (BosonicAlgebra M) where + Representation ℂ GJ (BosonicAlgebra M) where toFun U := (SymmetricAlgebra.map (JetComponentSpace.repJet M U)).toLinearMap map_one' := by @@ -69,18 +69,18 @@ noncomputable def repJetGaugeGroupI : AlgHom.comp_toLinearMap] lemma repJetGaugeGroupI_apply - (U : G) (x : BosonicAlgebra M) : + (U : GJ) (x : BosonicAlgebra M) : repJetGaugeGroupI M U x = SymmetricAlgebra.map (JetComponentSpace.repJet M U) x := rfl @[simp] lemma repJetGaugeGroupI_apply_one - (U : G) : + (U : GJ) : repJetGaugeGroupI M U (1 : BosonicAlgebra M) = 1 := by simp [repJetGaugeGroupI_apply] lemma repJetGaugeGroupI_apply_mul - (U : G) (x y : BosonicAlgebra M) : + (U : GJ) (x y : BosonicAlgebra M) : repJetGaugeGroupI M U (x * y) = repJetGaugeGroupI M U x * repJetGaugeGroupI M U y := by simp [repJetGaugeGroupI_apply] @@ -88,7 +88,7 @@ lemma repJetGaugeGroupI_apply_mul /-- On a component function the jet gauge action is the action on the component space. -/ @[simp] lemma repJetGaugeGroupI_ι - (U : G) (v : JetComponentSpace M) : + (U : GJ) (v : JetComponentSpace M) : repJetGaugeGroupI M U (SymmetricAlgebra.ι ℂ _ v) = SymmetricAlgebra.ι ℂ _ (JetComponentSpace.repJet M U v) := by rw [repJetGaugeGroupI_apply, SymmetricAlgebra.map_apply_ι] @@ -96,7 +96,7 @@ lemma repJetGaugeGroupI_ι /-- The jet gauge action as an algebra homomorphism: a gauge transformation acts on a Lagrangian term factor by factor. -/ noncomputable def repJetGaugeGroupIAlgHom - (U : G) : BosonicAlgebra M →ₐ[ℂ] BosonicAlgebra M where + (U : GJ) : BosonicAlgebra M →ₐ[ℂ] BosonicAlgebra M where toFun := repJetGaugeGroupI M U map_add' := LinearMap.map_add _ map_zero' := LinearMap.map_zero _ @@ -119,7 +119,7 @@ the *value* of the gauge transformation at the base point alone. So `ofField` an by the contragredient of the value of the gauge transformation at the base point; no derivative of the gauge jet contributes. -/ lemma repJetGaugeGroupI_ofField - (U : G) (φ : Module.Dual ℂ M.V) : + (U : GJ) (φ : Module.Dual ℂ M.V) : repJetGaugeGroupI M U (ofField φ) = ofField (Module.Dual.transpose (jetEval ∘ₗ (M.repJet U⁻¹).comp jetOfConstant) φ) := by rw [ofField_apply, repJetGaugeGroupI_ι, ofField_apply] @@ -133,7 +133,7 @@ lemma repJetGaugeGroupI_ofField `JetComponentSpace.repConj rep` on the jets of the conjugate field — which is the physicists' `φ̄ ↦ φ̄ U†`. -/ lemma repJetGaugeGroupI_ofConjField - (U : G) (φ : Module.Dual ℂ (ConjModule M.V)) : + (U : GJ) (φ : Module.Dual ℂ (ConjModule M.V)) : repJetGaugeGroupI M U (ofConjField φ) = ofConjField (Module.Dual.transpose (jetEval ∘ₗ (JetComponentSpace.repConj M.repJet U⁻¹).comp jetOfConstant) φ) := by diff --git a/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/JetDeriv.lean b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/JetDeriv.lean index 65de432ea..96264c198 100644 --- a/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/JetDeriv.lean +++ b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/JetDeriv.lean @@ -50,9 +50,9 @@ namespace BosonicAlgebra open TensorProduct -variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} {M : MatterField jets} +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} {M : MatterField jets} /-! diff --git a/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/LorentzAction.lean b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/LorentzAction.lean index 8c1096403..d73172941 100644 --- a/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/LorentzAction.lean +++ b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/LorentzAction.lean @@ -45,9 +45,9 @@ namespace BosonicAlgebra open Matrix MatrixGroups TensorProduct -variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} (M : MatterField jets) +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} (M : MatterField jets) /-! diff --git a/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/MassDim.lean b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/MassDim.lean index ead1cc083..53fb69a8c 100644 --- a/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/MassDim.lean +++ b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/MassDim.lean @@ -41,9 +41,9 @@ namespace BosonicAlgebra open TensorProduct -variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} {M : MatterField jets} +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} {M : MatterField jets} /-! diff --git a/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/MassWeightPoly.lean b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/MassWeightPoly.lean index 74b91ffa8..100b5a935 100644 --- a/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/MassWeightPoly.lean +++ b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/MassWeightPoly.lean @@ -51,9 +51,9 @@ namespace BosonicAlgebra open TensorProduct -variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} {M : MatterField jets} +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} {M : MatterField jets} /-! diff --git a/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/Prod.lean b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/Prod.lean index 1c0d6129f..175b8284b 100644 --- a/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/Prod.lean +++ b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/Prod.lean @@ -39,9 +39,9 @@ sum is the tensor product of the symmetric algebras, which is @[expose] public section -variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} open scoped TensorProduct diff --git a/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/TransformsIn.lean b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/TransformsIn.lean index 47ab11906..29c73ac00 100644 --- a/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/TransformsIn.lean +++ b/Physlib/Particles/StandardModel/Matter/BosonicAlgebra/TransformsIn.lean @@ -58,9 +58,9 @@ namespace BosonicAlgebra open Matrix MatrixGroups TensorProduct -variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} {M : MatterField jets} +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} {M : MatterField jets} /-! @@ -113,7 +113,7 @@ private lemma sum_inr (m : Multiset (DerivAlgebraComplex ⊗[ℂ] Module.Dual `s₁` acting on the target index of `∂_{s₂} ψ_φ`. There is no inhomogeneous term: unlike a gauge field, a matter field transforms linearly. -/ lemma repJetGaugeGroupI_iteratedJetDeriv_ofField - (U : G) (φ : Module.Dual ℂ M.V) (s : Multiset (Fin 1 ⊕ Fin 3)) : + (U : GJ) (φ : Module.Dual ℂ M.V) (s : Multiset (Fin 1 ⊕ Fin 3)) : repJetGaugeGroupI M U (iteratedJetDeriv s (ofField φ)) = (s.antidiagonal.map fun p => iteratedJetDeriv p.2 @@ -147,7 +147,7 @@ theorem transformsIn_iteratedJetDeriv_ofField : the jets of the conjugate field — the physicists' `ψ̄ ↦ ψ̄ U†` and its derivatives. -/ lemma repJetGaugeGroupI_iteratedJetDeriv_ofConjField - (U : G) (φ : Module.Dual ℂ (ConjModule M.V)) + (U : GJ) (φ : Module.Dual ℂ (ConjModule M.V)) (s : Multiset (Fin 1 ⊕ Fin 3)) : repJetGaugeGroupI M U (iteratedJetDeriv s (ofConjField φ)) = (s.antidiagonal.map fun p => diff --git a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Basic.lean b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Basic.lean index 5f5aec754..00d012b1f 100644 --- a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Basic.lean +++ b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Basic.lean @@ -48,9 +48,9 @@ namespace StandardModel open TensorProduct -variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} {M : MatterField jets} +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} {M : MatterField jets} /-! diff --git a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/GaugeAction.lean b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/GaugeAction.lean index 9604296b1..f26db5fe6 100644 --- a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/GaugeAction.lean +++ b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/GaugeAction.lean @@ -44,9 +44,9 @@ namespace FermionicAlgebra open Matrix MatrixGroups TensorProduct -variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} (M : MatterField jets) +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} (M : MatterField jets) /-! @@ -58,7 +58,7 @@ variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] applied to the gauge action on the jet component space. The fibrewise action on the jets and its fibrewise-linearity are fields of `M`. -/ noncomputable def repJetGaugeGroupI : - Representation ℂ G (FermionicAlgebra M) where + Representation ℂ GJ (FermionicAlgebra M) where toFun U := (ExteriorAlgebra.map (JetComponentSpace.repJet M U)).toLinearMap map_one' := by @@ -69,18 +69,18 @@ noncomputable def repJetGaugeGroupI : AlgHom.comp_toLinearMap] lemma repJetGaugeGroupI_apply - (U : G) (x : FermionicAlgebra M) : + (U : GJ) (x : FermionicAlgebra M) : repJetGaugeGroupI M U x = ExteriorAlgebra.map (JetComponentSpace.repJet M U) x := rfl @[simp] lemma repJetGaugeGroupI_apply_one - (U : G) : + (U : GJ) : repJetGaugeGroupI M U (1 : FermionicAlgebra M) = 1 := by simp [repJetGaugeGroupI_apply] lemma repJetGaugeGroupI_apply_mul - (U : G) (x y : FermionicAlgebra M) : + (U : GJ) (x y : FermionicAlgebra M) : repJetGaugeGroupI M U (x * y) = repJetGaugeGroupI M U x * repJetGaugeGroupI M U y := by simp [repJetGaugeGroupI_apply] @@ -88,7 +88,7 @@ lemma repJetGaugeGroupI_apply_mul /-- On a component function the jet gauge action is the action on the component space. -/ @[simp] lemma repJetGaugeGroupI_ι - (U : G) (v : JetComponentSpace M) : + (U : GJ) (v : JetComponentSpace M) : repJetGaugeGroupI M U (ExteriorAlgebra.ι ℂ v) = ExteriorAlgebra.ι ℂ (JetComponentSpace.repJet M U v) := by rw [repJetGaugeGroupI_apply, ExteriorAlgebra.map_apply_ι] @@ -96,7 +96,7 @@ lemma repJetGaugeGroupI_ι /-- The jet gauge action as an algebra homomorphism: a gauge transformation acts on a Lagrangian term factor by factor. -/ noncomputable def repJetGaugeGroupIAlgHom - (U : G) : FermionicAlgebra M →ₐ[ℂ] FermionicAlgebra M where + (U : GJ) : FermionicAlgebra M →ₐ[ℂ] FermionicAlgebra M where toFun := repJetGaugeGroupI M U map_add' := LinearMap.map_add _ map_zero' := LinearMap.map_zero _ @@ -119,7 +119,7 @@ the *value* of the gauge transformation at the base point alone. So `ofField` an by the contragredient of the value of the gauge transformation at the base point; no derivative of the gauge jet contributes. -/ lemma repJetGaugeGroupI_ofField - (U : G) (φ : Module.Dual ℂ M.V) : + (U : GJ) (φ : Module.Dual ℂ M.V) : repJetGaugeGroupI M U (ofField φ) = ofField (Module.Dual.transpose (jetEval ∘ₗ (M.repJet U⁻¹).comp jetOfConstant) φ) := by rw [ofField_apply, repJetGaugeGroupI_ι, ofField_apply] @@ -133,7 +133,7 @@ lemma repJetGaugeGroupI_ofField `JetComponentSpace.repConj rep` on the jets of the conjugate field — which is the physicists' `ψ̄ ↦ ψ̄ U†`. -/ lemma repJetGaugeGroupI_ofConjField - (U : G) (φ : Module.Dual ℂ (ConjModule M.V)) : + (U : GJ) (φ : Module.Dual ℂ (ConjModule M.V)) : repJetGaugeGroupI M U (ofConjField φ) = ofConjField (Module.Dual.transpose (jetEval ∘ₗ (JetComponentSpace.repConj M.repJet U⁻¹).comp jetOfConstant) φ) := by diff --git a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/JetDeriv.lean b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/JetDeriv.lean index e410748db..f8836ec90 100644 --- a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/JetDeriv.lean +++ b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/JetDeriv.lean @@ -53,9 +53,9 @@ namespace FermionicAlgebra open TensorProduct -variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} {M : MatterField jets} +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} {M : MatterField jets} /-! diff --git a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/LorentzAction.lean b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/LorentzAction.lean index 9b81b7dc0..b87261b86 100644 --- a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/LorentzAction.lean +++ b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/LorentzAction.lean @@ -45,9 +45,9 @@ namespace FermionicAlgebra open Matrix MatrixGroups TensorProduct -variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} (M : MatterField jets) +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} (M : MatterField jets) /-! diff --git a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/MassDim.lean b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/MassDim.lean index c1597c490..286848c3a 100644 --- a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/MassDim.lean +++ b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/MassDim.lean @@ -42,9 +42,9 @@ namespace FermionicAlgebra open TensorProduct -variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} {M : MatterField jets} +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} {M : MatterField jets} /-! diff --git a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/MassWeightPoly.lean b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/MassWeightPoly.lean index 63656c17f..aa08640b4 100644 --- a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/MassWeightPoly.lean +++ b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/MassWeightPoly.lean @@ -52,9 +52,9 @@ namespace FermionicAlgebra open TensorProduct -variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} {M : MatterField jets} +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} {M : MatterField jets} /-! diff --git a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Prod.lean b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Prod.lean index e13f95a62..3008487d9 100644 --- a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Prod.lean +++ b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Prod.lean @@ -45,9 +45,9 @@ which is `CliffordAlgebra.prodEquiv` specialized to the zero quadratic form. @[expose] public section -variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} open scoped TensorProduct diff --git a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/TransformsIn.lean b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/TransformsIn.lean index a65d9945d..9a7b096bd 100644 --- a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/TransformsIn.lean +++ b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/TransformsIn.lean @@ -58,9 +58,9 @@ namespace FermionicAlgebra open Matrix MatrixGroups TensorProduct -variable {G : Type} [Group G] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G 𝔤 G₀ 𝔤J} {M : MatterField jets} +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} {M : MatterField jets} /-! @@ -111,7 +111,7 @@ private lemma sum_inr (m : Multiset (DerivAlgebraComplex ⊗[ℂ] Module.Dual `s₁` acting on the target index of `∂_{s₂} ψ_φ`. There is no inhomogeneous term: unlike a gauge field, a matter field transforms linearly. -/ lemma repJetGaugeGroupI_iteratedJetDeriv_ofField - (U : G) (φ : Module.Dual ℂ M.V) (s : Multiset (Fin 1 ⊕ Fin 3)) : + (U : GJ) (φ : Module.Dual ℂ M.V) (s : Multiset (Fin 1 ⊕ Fin 3)) : repJetGaugeGroupI M U (iteratedJetDeriv s (ofField φ)) = (s.antidiagonal.map fun p => iteratedJetDeriv p.2 @@ -145,7 +145,7 @@ theorem transformsIn_iteratedJetDeriv_ofField : the jets of the conjugate field — the physicists' `ψ̄ ↦ ψ̄ U†` and its derivatives. -/ lemma repJetGaugeGroupI_iteratedJetDeriv_ofConjField - (U : G) (φ : Module.Dual ℂ (ConjModule M.V)) + (U : GJ) (φ : Module.Dual ℂ (ConjModule M.V)) (s : Multiset (Fin 1 ⊕ Fin 3)) : repJetGaugeGroupI M U (iteratedJetDeriv s (ofConjField φ)) = (s.antidiagonal.map fun p => From 3b5dedf911496b5a4cfd6dbc7bc03b00f63bbfc8 Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Sat, 12 Sep 2026 14:13:17 +0400 Subject: [PATCH 322/367] refactor: Make GaugeFieldData.FermionGenerators and BosonGenerators defs with explicit instances --- .../GaugeFieldData/BosonGenerators.lean | 19 +++++++++++++++---- .../GaugeFieldData/FermionGenerators.lean | 19 +++++++++++++++---- .../GaugeTheory/LocalFieldAlgebra/Basic.lean | 19 +++++++++++++------ 3 files changed, 43 insertions(+), 14 deletions(-) diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/BosonGenerators.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/BosonGenerators.lean index 42210706c..6978b040e 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/BosonGenerators.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/BosonGenerators.lean @@ -111,12 +111,22 @@ variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ is what lets the species carry different mass weights: the scaling of one component space is natural in the value space — `JetComponentSpace.comap_comp_massWeightScale` — and so cannot tell the species apart. When the weights do agree the two descriptions coincide, - which is section C below. -/ -abbrev BosonGenerators : Type := ⨁ i, JetComponentSpace (T.boson i) + which is section C below. + + This `def` and its explicit instances reduce instance-term expansion in the symmetric + algebra and tensor products built on it. Use the inclusion, assembly and extensionality + API in downstream proofs; unfold the direct-sum representation explicitly when necessary. -/ +def BosonGenerators : Type := ⨁ i, JetComponentSpace (T.boson i) + +instance : AddCommGroup T.BosonGenerators := + inferInstanceAs (AddCommGroup (⨁ i, JetComponentSpace (T.boson i))) + +instance : Module ℂ T.BosonGenerators := + inferInstanceAs (Module ℂ (⨁ i, JetComponentSpace (T.boson i))) /-- The inclusion of the component space of one bosonic species into the bosonic generator space. -/ -abbrev inclBoson (i : T.BosonSpecies) : +def inclBoson (i : T.BosonSpecies) : JetComponentSpace (T.boson i) →ₗ[ℂ] T.BosonGenerators := DirectSum.lof ℂ T.BosonSpecies (fun i => JetComponentSpace (T.boson i)) i @@ -126,12 +136,13 @@ variable {N : Type*} [AddCommMonoid N] [Module ℂ N] /-- The assembly of a species-wise family of linear maps out of the bosonic generator space into a common target. -/ -abbrev assembleBoson (f : ∀ i, JetComponentSpace (T.boson i) →ₗ[ℂ] N) : +def assembleBoson (f : ∀ i, JetComponentSpace (T.boson i) →ₗ[ℂ] N) : T.BosonGenerators →ₗ[ℂ] N := DirectSum.toModule ℂ T.BosonSpecies N f variable {T} +@[simp] lemma assembleBoson_inclBoson (f : ∀ i, JetComponentSpace (T.boson i) →ₗ[ℂ] N) (i : T.BosonSpecies) (x : JetComponentSpace (T.boson i)) : T.assembleBoson f (T.inclBoson i x) = f i x := diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/FermionGenerators.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/FermionGenerators.lean index 88770ac1c..f7c547393 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/FermionGenerators.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/FermionGenerators.lean @@ -108,12 +108,22 @@ variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ is what lets the species carry different mass weights: the scaling of one component space is natural in the value space — `JetComponentSpace.comap_comp_massWeightScale` — and so cannot tell the species apart. When the weights do agree the two descriptions coincide, - which is section C below. -/ -abbrev FermionGenerators : Type := ⨁ i, JetComponentSpace (T.fermion i) + which is section C below. + + This `def` and its explicit instances reduce instance-term expansion in the exterior + algebra and tensor products built on it. Use the inclusion, assembly and extensionality + API in downstream proofs; unfold the direct-sum representation explicitly when necessary. -/ +def FermionGenerators : Type := ⨁ i, JetComponentSpace (T.fermion i) + +instance : AddCommGroup T.FermionGenerators := + inferInstanceAs (AddCommGroup (⨁ i, JetComponentSpace (T.fermion i))) + +instance : Module ℂ T.FermionGenerators := + inferInstanceAs (Module ℂ (⨁ i, JetComponentSpace (T.fermion i))) /-- The inclusion of the component space of one fermionic species into the fermionic generator space. -/ -abbrev inclFermion (i : T.FermionSpecies) : +def inclFermion (i : T.FermionSpecies) : JetComponentSpace (T.fermion i) →ₗ[ℂ] T.FermionGenerators := DirectSum.lof ℂ T.FermionSpecies (fun i => JetComponentSpace (T.fermion i)) i @@ -123,12 +133,13 @@ variable {N : Type*} [AddCommMonoid N] [Module ℂ N] /-- The assembly of a species-wise family of linear maps out of the fermionic generator space into a common target. -/ -abbrev assembleFermion (f : ∀ i, JetComponentSpace (T.fermion i) →ₗ[ℂ] N) : +def assembleFermion (f : ∀ i, JetComponentSpace (T.fermion i) →ₗ[ℂ] N) : T.FermionGenerators →ₗ[ℂ] N := DirectSum.toModule ℂ T.FermionSpecies N f variable {T} +@[simp] lemma assembleFermion_inclFermion (f : ∀ i, JetComponentSpace (T.fermion i) →ₗ[ℂ] N) (i : T.FermionSpecies) (x : JetComponentSpace (T.fermion i)) : T.assembleFermion f (T.inclFermion i x) = f i x := diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Basic.lean index 6929a2fc8..8a0034098 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Basic.lean @@ -480,8 +480,9 @@ lemma assemble_mul_self_iff {B : Type*} [Ring B] [Algebra ℂ B] (∀ v, T.assembleFermion f v * T.assembleFermion f v = 0) ↔ ((∀ i x, f i x * f i x = 0) ∧ ∀ i j x y, f i x * f j y = -(f j y * f i x)) := by - rw [DirectSum.mul_self_iff_lof] - simp + have h := DirectSum.mul_self_iff_lof (F := DirectSum.toModule ℂ T.FermionSpecies B f) + simp only [DirectSum.toModule_lof] at h + exact h namespace Assignment @@ -534,24 +535,29 @@ lemma fermionTotal_mul_swap (v w : T.FermionGenerators) : /-- The assembled bosonic images commute pairwise. -/ lemma bosonTotal_commute (v w : T.BosonGenerators) : Commute (d.bosonTotal v) (d.bosonTotal w) := - DirectSum.commute_of_lof (fun i j x y => by simpa using d.boson_commute i j x y) v w + DirectSum.commute_of_lof (fun i j x y => by + show Commute (d.bosonTotal (T.inclBoson i x)) (d.bosonTotal (T.inclBoson j y)) + simpa using d.boson_commute i j x y) v w /-- The assembled bosonic images commute with the connection images. -/ lemma bosonTotal_commute_connection (v : T.BosonGenerators) (w : GaugeBoson.JetComponentSpace 𝔤) : Commute (d.bosonTotal v) (d.connection w) := DirectSum.commute_of_lof_left (fun j y => by + show Commute (d.bosonTotal (T.inclBoson j y)) (d.connection w) simpa using d.boson_commute_connection j y w) v /-- The assembled bosonic images commute with the assembled fermionic images. -/ lemma bosonTotal_commute_fermionTotal (v : T.BosonGenerators) (w : T.FermionGenerators) : Commute (d.bosonTotal v) (d.fermionTotal w) := DirectSum.commute_of_lof (fun j i y x => by + show Commute (d.bosonTotal (T.inclBoson j y)) (d.fermionTotal (T.inclFermion i x)) simpa using d.boson_commute_fermion j i y x) v w /-- The connection images commute with the assembled fermionic images. -/ lemma connection_commute_fermionTotal (v : GaugeBoson.JetComponentSpace 𝔤) (w : T.FermionGenerators) : Commute (d.connection v) (d.fermionTotal w) := (DirectSum.commute_of_lof_left (fun i x => by + show Commute (d.fermionTotal (T.inclFermion i x)) (d.connection v) simpa using (d.connection_commute_fermion v i x).symm) w).symm /-! @@ -855,12 +861,13 @@ lemma range_lift : rintro _ ((⟨v, rfl⟩ | ⟨v, rfl⟩) | ⟨v, rfl⟩) · rw [d.lift_ιFermionTotal] refine DirectSum.mem_of_lof (fun i x => ?_) v - rw [show DirectSum.lof ℂ _ _ i x = T.inclFermion i x from rfl, - d.fermionTotal_inclFermion] + show d.fermionTotal (T.inclFermion i x) ∈ _ + rw [d.fermionTotal_inclFermion] exact Algebra.subset_adjoin (Or.inl (Or.inl (Set.mem_iUnion.mpr ⟨i, x, rfl⟩))) · rw [d.lift_ιBosonTotal] refine DirectSum.mem_of_lof (fun j y => ?_) v - rw [show DirectSum.lof ℂ _ _ j y = T.inclBoson j y from rfl, d.bosonTotal_inclBoson] + show d.bosonTotal (T.inclBoson j y) ∈ _ + rw [d.bosonTotal_inclBoson] exact Algebra.subset_adjoin (Or.inl (Or.inr (Set.mem_iUnion.mpr ⟨j, y, rfl⟩))) · exact d.lift_ιConnection v ▸ Algebra.subset_adjoin (Or.inr ⟨v, rfl⟩) · rintro y hy From 813bbd1ae087fe72f0bb9d14870947c68dfff5f6 Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Sat, 12 Sep 2026 18:01:40 +0400 Subject: [PATCH 323/367] feat: LocalGaugeFieldAlgebra.fieldStrength, covDerivFieldStrength and the LocalGaugeCovFieldAlgebra subalgebra --- Physlib.lean | 16 +- .../GaugeTheory/GaugeBoson/Basic.lean | 2 +- .../LocalGaugeCovFieldAlgebra/Basic.lean | 225 +++++++++ .../Basic.lean | 41 +- .../LocalGaugeFieldAlgebra/FieldStrength.lean | 443 ++++++++++++++++++ .../GaugeAction.lean | 70 +-- .../GaugeField.lean | 22 +- .../JetDeriv.lean | 51 +- .../LorentzAction.lean | 32 +- .../MassDim.lean | 21 +- .../MassWeightPoly.lean | 88 ++-- .../GaugeBoson/Realization/Basic.lean | 22 +- .../GaugeBoson/Realization/FieldStrength.lean | 30 +- .../GaugeBoson/Realization/GaugeLaw.lean | 132 +++++- .../GaugeBoson/Realization/Symmetrized.lean | 49 +- .../Realization/TransformsInAdjoint.lean | 56 ++- Physlib/Mathematics/Fin.lean | 14 + Physlib/Particles/LagrangianTheory/Basic.lean | 2 +- .../AlgebraRealization/CovariantDeriv.lean | 10 +- .../Fermions/DownSinglet/Basic.lean | 2 +- .../DownSinglet/GaugeAlgebraAction.lean | 2 +- .../LeptonDoublet/GaugeAlgebraAction.lean | 2 +- .../LeptonSinglet/GaugeAlgebraAction.lean | 2 +- .../QuarkDoublet/GaugeAlgebraAction.lean | 2 +- .../UpSinglet/GaugeAlgebraAction.lean | 2 +- .../HiggsBoson/GaugeAlgebraAction.lean | 2 +- .../StandardModel/JetAlgebra/Basic.lean | 10 +- .../JetAlgebra/FieldAlgebra.lean | 59 ++- .../StandardModel/JetAlgebra/GaugeAction.lean | 36 +- .../StandardModel/JetAlgebra/Generators.lean | 4 +- .../StandardModel/JetAlgebra/Invariants.lean | 23 +- .../StandardModel/JetAlgebra/JetDeriv.lean | 72 +-- .../JetAlgebra/LorentzAction.lean | 40 +- .../JetAlgebra/MassWeightPoly.lean | 30 +- .../JetAlgebra/SectorEquiv/Basic.lean | 2 +- 35 files changed, 1256 insertions(+), 360 deletions(-) create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeCovFieldAlgebra/Basic.lean rename Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/{GaugeJetAlgebra => LocalGaugeFieldAlgebra}/Basic.lean (66%) create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeFieldAlgebra/FieldStrength.lean rename Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/{GaugeJetAlgebra => LocalGaugeFieldAlgebra}/GaugeAction.lean (91%) rename Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/{GaugeJetAlgebra => LocalGaugeFieldAlgebra}/GaugeField.lean (85%) rename Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/{GaugeJetAlgebra => LocalGaugeFieldAlgebra}/JetDeriv.lean (88%) rename Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/{GaugeJetAlgebra => LocalGaugeFieldAlgebra}/LorentzAction.lean (92%) rename Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/{GaugeJetAlgebra => LocalGaugeFieldAlgebra}/MassDim.lean (90%) rename Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/{GaugeJetAlgebra => LocalGaugeFieldAlgebra}/MassWeightPoly.lean (74%) diff --git a/Physlib.lean b/Physlib.lean index 94fc582a9..507908af5 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -1,13 +1,15 @@ module public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Basic -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.Basic -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.GaugeAction -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.GaugeField -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.JetDeriv -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.LorentzAction -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.MassDim -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.MassWeightPoly +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeCovFieldAlgebra.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeFieldAlgebra.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeFieldAlgebra.FieldStrength +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeFieldAlgebra.GaugeAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeFieldAlgebra.GaugeField +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeFieldAlgebra.JetDeriv +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeFieldAlgebra.LorentzAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeFieldAlgebra.MassDim +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeFieldAlgebra.MassWeightPoly public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.FieldStrength public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.GaugeLaw diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Basic.lean index 61193da41..e615d4128 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Basic.lean @@ -21,7 +21,7 @@ throughout. This file is the target space alone — its linear structure, the Lorentz action, the global gauge action, and the jet component space spanned by the component functions `∂_s A_μ^φ`. The jet algebra built on it, and the actions and gradings it carries, are in -`Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra`. For the Standard +`Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeFieldAlgebra`. For the Standard Model, `𝔤` is `StandardModel.GaugeAlgebra`. ## ii. Key results diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeCovFieldAlgebra/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeCovFieldAlgebra/Basic.lean new file mode 100644 index 000000000..8b1d10ed6 --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeCovFieldAlgebra/Basic.lean @@ -0,0 +1,225 @@ +/- +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.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeFieldAlgebra.FieldStrength +public import Physlib.Mathematics.AlgebraRepresentation +/-! +# The covariant field algebra of the gauge bosons + +## i. Overview + +`LocalGaugeCovFieldAlgebra 𝔤` is the real unital subalgebra of +`LocalGaugeFieldAlgebra 𝔤` generated by the field strength and its iterated covariant +derivatives `∇_{l₁} ⋯ ∇_{lₙ} F_μν^φ` — the set `GaugeAlgebraRealization.tower` of the +family `derivA 𝔤` — together with the scalars. + +Its elements are gauge covariant, not gauge invariant: a jet acts on each generator +through the base-point adjoint action of its value alone, rotating the adjoint index, so +the subalgebra is preserved and the jet action on it factors through evaluation to the +ordinary gauge group. The Lorentz group preserves it too, the generators mixing among +themselves. The canonical inclusion into the ambient algebra is `Subalgebra.val`, and the +restricted actions are built with `Representation.restrictSubalgebra`. + +## ii. Key results + +- `LocalGaugeCovFieldAlgebra` : the covariant field algebra, with + `LocalGaugeCovFieldAlgebra.induction` and `LocalGaugeCovFieldAlgebra.mapsTo` as its + generation API. +- `LocalGaugeCovFieldAlgebra.repJet`, `LocalGaugeCovFieldAlgebra.repValue`, + `LocalGaugeCovFieldAlgebra.repLorentzGroup` : the restricted actions of the jet gauge + group, of the ordinary gauge group and of the Lorentz group. +- `LocalGaugeCovFieldAlgebra.repJet_eq_repValue_eval` : the jet action factors through + evaluation. + +## iii. Table of contents + +- A. The covariant field algebra + - A.1. Generation +- B. Stability under the actions +- C. The restricted actions + - C.1. The action of the ordinary gauge group + +-/ + +@[expose] public section + +set_option linter.unusedSectionVars false + +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] +variable {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] +variable {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} + +open TensorProduct Matrix MatrixGroups Lorentz +open LocalGaugeFieldAlgebra (derivA fieldStrength covDerivFieldStrength repJetAlgHom + repJet_covDerivFieldStrength_eval repLorentzGroup_covDerivFieldStrength repJet_algebraMap + repJet_apply_mul) + +/-! + +## A. The covariant field algebra + +-/ + +variable (𝔤) in +/-- The covariant field algebra of the gauge bosons: the real unital subalgebra of the + local gauge field algebra generated by the field strength and its iterated covariant + derivatives `∇_{l₁} ⋯ ∇_{lₙ} F_μν^φ`, along all ordered lists of directions. -/ +noncomputable def LocalGaugeCovFieldAlgebra : Subalgebra ℝ (LocalGaugeFieldAlgebra 𝔤) := + Algebra.adjoin ℝ (GaugeAlgebraRealization.tower (derivA 𝔤)) + +namespace LocalGaugeCovFieldAlgebra + +/-- The generating set, as the covariant derivatives of the field strength. -/ +lemma mem_tower_iff (x : LocalGaugeFieldAlgebra 𝔤) : + x ∈ GaugeAlgebraRealization.tower (derivA 𝔤) ↔ + ∃ (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), + x = covDerivFieldStrength 𝔤 l μ ν φ := + Iff.rfl + +/-! + +### A.1. Generation + +-/ + +lemma covDerivFieldStrength_mem (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ 𝔤) : covDerivFieldStrength 𝔤 l μ ν φ ∈ LocalGaugeCovFieldAlgebra 𝔤 := + Algebra.subset_adjoin ⟨l, μ, ν, φ, rfl⟩ + +lemma fieldStrength_mem (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + fieldStrength 𝔤 μ ν φ ∈ LocalGaugeCovFieldAlgebra 𝔤 := + covDerivFieldStrength_mem [] μ ν φ + +/-- The generation principle: a property holding on the covariant derivatives of the + field strength and on the scalars, and closed under sums and products, holds on the + whole covariant field algebra. -/ +lemma induction {P : LocalGaugeFieldAlgebra 𝔤 → Prop} {x : LocalGaugeFieldAlgebra 𝔤} + (hx : x ∈ LocalGaugeCovFieldAlgebra 𝔤) + (hgen : ∀ (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), + P (covDerivFieldStrength 𝔤 l μ ν φ)) + (halg : ∀ r : ℝ, P (algebraMap ℝ (LocalGaugeFieldAlgebra 𝔤) r)) + (hadd : ∀ x y, P x → P y → P (x + y)) + (hmul : ∀ x y, P x → P y → P (x * y)) : P x := by + induction hx using Algebra.adjoin_induction with + | mem b hb => + obtain ⟨l, μ, ν, φ, rfl⟩ := hb + exact hgen l μ ν φ + | algebraMap r => exact halg r + | add a b _ _ ha hb => exact hadd a b ha hb + | mul a b _ _ ha hb => exact hmul a b ha hb + +/-- An algebra endomorphism carrying the generators into the covariant field algebra + carries the whole covariant field algebra into itself. -/ +lemma mapsTo (f : LocalGaugeFieldAlgebra 𝔤 →ₐ[ℝ] LocalGaugeFieldAlgebra 𝔤) + (hgen : ∀ (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), + f (covDerivFieldStrength 𝔤 l μ ν φ) ∈ LocalGaugeCovFieldAlgebra 𝔤) + {x : LocalGaugeFieldAlgebra 𝔤} (hx : x ∈ LocalGaugeCovFieldAlgebra 𝔤) : + f x ∈ LocalGaugeCovFieldAlgebra 𝔤 := by + have hle : (LocalGaugeCovFieldAlgebra 𝔤).map f ≤ LocalGaugeCovFieldAlgebra 𝔤 := by + rw [LocalGaugeCovFieldAlgebra, ← Algebra.adjoin_image] + refine Algebra.adjoin_le ?_ + rintro _ ⟨_, ⟨l, μ, ν, φ, rfl⟩, rfl⟩ + exact hgen l μ ν φ + exact hle ⟨x, hx, rfl⟩ + +/-! + +## B. Stability under the actions + +-/ + +/-- The jet gauge group preserves the covariant field algebra: a jet rotates the adjoint + index of each generator through the value of its inverse. -/ +lemma repJet_mem (U : GJ) {x : LocalGaugeFieldAlgebra 𝔤} + (hx : x ∈ LocalGaugeCovFieldAlgebra 𝔤) : + LocalGaugeFieldAlgebra.repJet jets U x ∈ LocalGaugeCovFieldAlgebra 𝔤 := + mapsTo (repJetAlgHom jets U) (fun l μ ν φ => by + show LocalGaugeFieldAlgebra.repJet jets U (covDerivFieldStrength 𝔤 l μ ν φ) ∈ _ + rw [repJet_covDerivFieldStrength_eval] + exact covDerivFieldStrength_mem l μ ν _) hx + +/-- The Lorentz group preserves the covariant field algebra: the generators mix among + themselves by the columns of the Lorentz matrix. -/ +lemma repLorentzGroup_mem (Λ : SL(2,ℂ)) {x : LocalGaugeFieldAlgebra 𝔤} + (hx : x ∈ LocalGaugeCovFieldAlgebra 𝔤) : + LocalGaugeFieldAlgebra.repLorentzGroup 𝔤 Λ x ∈ LocalGaugeCovFieldAlgebra 𝔤 := + mapsTo (SymmetricAlgebra.map (GaugeBoson.JetComponentSpace.repLorentzGroup 𝔤 Λ)) + (fun l μ ν φ => by + show LocalGaugeFieldAlgebra.repLorentzGroup 𝔤 Λ (covDerivFieldStrength 𝔤 l μ ν φ) ∈ _ + obtain ⟨n, l', rfl⟩ : ∃ (n : ℕ) (l' : Fin n → (Fin 1 ⊕ Fin 3)), l = List.ofFn l' := + ⟨_, l.get, (List.ofFn_get l).symm⟩ + rw [repLorentzGroup_covDerivFieldStrength] + exact Subalgebra.sum_mem _ fun p _ => Subalgebra.smul_mem _ + (Subalgebra.sum_mem _ fun a _ => Subalgebra.smul_mem _ + (Subalgebra.sum_mem _ fun b _ => Subalgebra.smul_mem _ + (covDerivFieldStrength_mem _ a b φ) _) _) _) hx + +/-! + +## C. The restricted actions + +-/ + +variable (jets) in +/-- The action of the jet gauge group on the covariant field algebra, restricted from the + local gauge field algebra. -/ +noncomputable def repJet : Representation ℝ GJ (LocalGaugeCovFieldAlgebra 𝔤) := + (LocalGaugeFieldAlgebra.repJet jets).restrictSubalgebra _ fun U _ hx => repJet_mem U hx + +@[simp] +lemma coe_repJet (U : GJ) (x : LocalGaugeCovFieldAlgebra 𝔤) : + (repJet jets U x : LocalGaugeFieldAlgebra 𝔤) = LocalGaugeFieldAlgebra.repJet jets U x := rfl + +variable (𝔤) in +/-- The action of the Lorentz group on the covariant field algebra, restricted from the + local gauge field algebra. -/ +noncomputable def repLorentzGroup : Representation ℝ SL(2,ℂ) (LocalGaugeCovFieldAlgebra 𝔤) := + (LocalGaugeFieldAlgebra.repLorentzGroup 𝔤).restrictSubalgebra _ + fun Λ _ hx => repLorentzGroup_mem Λ hx + +@[simp] +lemma coe_repLorentzGroup (Λ : SL(2,ℂ)) (x : LocalGaugeCovFieldAlgebra 𝔤) : + (repLorentzGroup 𝔤 Λ x : LocalGaugeFieldAlgebra 𝔤) + = LocalGaugeFieldAlgebra.repLorentzGroup 𝔤 Λ x := rfl + +/-! + +### C.1. The action of the ordinary gauge group + +-/ + +variable (jets) in +/-- The action of the ordinary gauge group on the covariant field algebra: the jet action + at the constant jets. -/ +noncomputable def repValue : Representation ℝ G₀ (LocalGaugeCovFieldAlgebra 𝔤) := + (repJet jets).comp jets.ofConstant + +@[simp] +lemma coe_repValue (g : G₀) (x : LocalGaugeCovFieldAlgebra 𝔤) : + (repValue jets g x : LocalGaugeFieldAlgebra 𝔤) + = LocalGaugeFieldAlgebra.repJet jets (jets.ofConstant g) x := rfl + +/-- The action of the jet gauge group on the covariant field algebra factors through + evaluation: a jet acts as the constant jet of its value. The derivatives of a gauge + transformation act trivially on covariant expressions. -/ +theorem repJet_eq_repValue_eval (U : GJ) (x : LocalGaugeCovFieldAlgebra 𝔤) : + repJet jets U x = repValue jets (jets.eval U) x := by + refine Subtype.ext ?_ + rw [coe_repJet, coe_repValue] + refine LocalGaugeCovFieldAlgebra.induction (P := fun y => LocalGaugeFieldAlgebra.repJet jets U y + = LocalGaugeFieldAlgebra.repJet jets (jets.ofConstant (jets.eval U)) y) x.2 ?_ ?_ ?_ ?_ + · intro l μ ν φ + rw [repJet_covDerivFieldStrength_eval, repJet_covDerivFieldStrength_eval, + map_inv jets.eval, map_inv jets.eval, jets.eval_ofConstant] + · intro r + rw [repJet_algebraMap, repJet_algebraMap] + · intro x y hx hy + rw [map_add, map_add, hx, hy] + · intro x y hx hy + rw [repJet_apply_mul, repJet_apply_mul, hx, hy] + +end LocalGaugeCovFieldAlgebra diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeFieldAlgebra/Basic.lean similarity index 66% rename from Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/Basic.lean rename to Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeFieldAlgebra/Basic.lean index 99f67f4f0..1be18d0b1 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeFieldAlgebra/Basic.lean @@ -12,18 +12,18 @@ public import Physlib.Mathematics.SymmetricAlgebra public import Mathlib.LinearAlgebra.Dual.Lemmas /-! -# The jet algebra of the gauge bosons of a gauge theory +# The local gauge field algebra 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 ⊗[ℝ] 𝔤`, the target space `GaugeBoson 𝔤` of -`Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Basic`. 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_μ^φ`, 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 ℝ 𝔤` throughout, -following the dual-family formulation of +`Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Basic`. Its *local gauge field +algebra* `LocalGaugeFieldAlgebra 𝔤` — the jet algebra in which the gauge-boson part of a +Lagrangian lives — is the free commutative algebra on the component functions `∂_s A_μ^φ`, +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 ℝ 𝔤` throughout, following the dual-family formulation of `Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization`. For the Standard Model, `𝔤` is `StandardModel.GaugeAlgebra`. @@ -33,12 +33,15 @@ Following the split promised for this directory, the structure is: 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. +5. `MassDim` and `MassWeightPoly` — the mass-dimension grading; +6. `FieldStrength` — the field strength and its covariant derivatives, out of which the + covariant subalgebra `LocalGaugeCovFieldAlgebra` is generated. ## ii. Key results -- `GaugeJetAlgebra` : the jet algebra of the gauge bosons. -- `GaugeJetAlgebra.ofComponent`, `GaugeJetAlgebra.ofA` : the generators. +- `LocalGaugeFieldAlgebra` : the local gauge field algebra, the jet algebra of the gauge + bosons. +- `LocalGaugeFieldAlgebra.ofComponent`, `LocalGaugeFieldAlgebra.ofA` : the generators. ## iii. Table of contents @@ -64,13 +67,13 @@ open TensorProduct -/ 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 𝔤) +/-- The local gauge field algebra, 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 LocalGaugeFieldAlgebra : Type := SymmetricAlgebra ℝ (GaugeBoson.JetComponentSpace 𝔤) -namespace GaugeJetAlgebra +namespace LocalGaugeFieldAlgebra /-! @@ -81,7 +84,7 @@ namespace GaugeJetAlgebra 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 𝔤) := +noncomputable def ofComponent : Module.Dual ℝ (GaugeBoson 𝔤) →ₗ[ℝ] (LocalGaugeFieldAlgebra 𝔤) := (SymmetricAlgebra.ι ℝ _).comp (TensorProduct.mk ℝ DerivAlgebraReal (Module.Dual ℝ (GaugeBoson 𝔤)) 1) @@ -94,7 +97,7 @@ variable (𝔤) in 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 𝔤) := + Module.Dual ℝ 𝔤 →ₗ[ℝ] (LocalGaugeFieldAlgebra 𝔤) := (ofComponent 𝔤).comp ((GaugeBoson.componentDual 𝔤) (Lorentz.CoVector.basis.dualBasis μ)) lemma ofA_apply (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : @@ -107,5 +110,5 @@ lemma adjoin_ι_eq_top : Algebra.adjoin ℝ (Set.range (SymmetricAlgebra.ι ℝ (GaugeBoson.JetComponentSpace 𝔤))) = ⊤ := SymmetricAlgebra.adjoin_range_ι -end GaugeJetAlgebra +end LocalGaugeFieldAlgebra diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeFieldAlgebra/FieldStrength.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeFieldAlgebra/FieldStrength.lean new file mode 100644 index 000000000..d76d2902d --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeFieldAlgebra/FieldStrength.lean @@ -0,0 +1,443 @@ +/- +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.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.Symmetrized +public import Physlib.Mathematics.Fin +public import Mathlib.RingTheory.Flat.Basic +/-! +# The field strength in the local gauge field algebra + +## i. Overview + +The field strength and its covariant derivatives are built for an arbitrary realization of +the gauge bosons in `Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization`, as +families of derivative symbols over a family of gauge-field symbols. Here they are +specialized to the real algebra `LocalGaugeFieldAlgebra 𝔤` itself, whose symbols are its +own generators `∂_s A_μ^φ` (`derivA`). + +Two facts make the specialization work. The symbols that the families carry are honest +iterated derivatives of their base values +(`iteratedCovDerivAdjoint_fieldStrength_derivA`), which turns the symbol-level recursion +of `iteratedCovDerivAdjoint` into the recursion `covDerivFieldStrength_cons` on elements +of the algebra. And the gauge law is not reproved: the complexified tower is the image of +the real one under `x ↦ 1 ⊗ₜ x`, which is injective and intertwines the two gauge actions, +so the law of the identity realization descends. The Lorentz law is proved directly from +the recursion. + +Everything here is over `ℝ`. The complexification `ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤` +appears only as that bridge; it is never identified with the real algebra. + +## ii. Key results + +- `LocalGaugeFieldAlgebra.fieldStrength`, `LocalGaugeFieldAlgebra.covDerivFieldStrength` : + the field strength `F_μν^φ` and its ordered covariant derivatives `∇_l F_μν^φ`. +- `LocalGaugeFieldAlgebra.repJet_covDerivFieldStrength_eval` : the gauge law, through the + value of the jet alone. +- `LocalGaugeFieldAlgebra.repLorentzGroup_covDerivFieldStrength` : the Lorentz law. + +## iii. Table of contents + +- A. The derivative symbols of the real algebra +- B. The field strength and its covariant derivatives +- C. The derivative symbols of the covariant tower are iterated derivatives +- D. The gauge law, by descent from the complexification +- E. The Lorentz law + +-/ + +@[expose] public section + +set_option linter.unusedSectionVars false + +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] +variable {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] +variable {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} + +open TensorProduct Matrix MatrixGroups Lorentz +open GaugeAlgebraRealization (bracketFam commutatorFam bracketFamConv covDerivAdjoint + iteratedCovDerivAdjoint) + +namespace LocalGaugeFieldAlgebra + +/-! + +## A. The derivative symbols of the real algebra + +-/ + +variable (𝔤) in +/-- The derivative symbols `∂_s A_μ^φ` of the local gauge field algebra, as a family over + the derivative multiset `s` and the spacetime index `μ`: the iterated total derivative of + the gauge-field generator. The field strength and its covariant derivatives are built + out of this family. -/ +noncomputable def derivA (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : + Module.Dual ℝ 𝔤 →ₗ[ℝ] LocalGaugeFieldAlgebra 𝔤 := + (iteratedJetDeriv 𝔤 s).comp (ofA 𝔤 μ) + +lemma derivA_apply (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ 𝔤) : derivA 𝔤 s μ φ = iteratedJetDeriv 𝔤 s (ofA 𝔤 μ φ) := rfl + +@[simp] +lemma derivA_zero (μ : Fin 1 ⊕ Fin 3) : derivA 𝔤 0 μ = ofA 𝔤 μ := rfl + +/-- The derivative symbols are the iterated derivatives of the undifferentiated symbol. -/ +lemma derivA_eq_iteratedJetDeriv (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ 𝔤) : derivA 𝔤 s μ φ = iteratedJetDeriv 𝔤 s (derivA 𝔤 0 μ φ) := rfl + +/-- The complexified symbols `gaugeField` are the images of the real symbols. -/ +lemma gaugeField_eq_one_tmul_derivA (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ 𝔤) : gaugeField 𝔤 s μ φ = (1 : ℂ) ⊗ₜ[ℝ] derivA 𝔤 s μ φ := by + rw [gaugeField_apply, iteratedD_complexJetDeriv_one_tmul] + rfl + +/-! + +## B. The field strength and its covariant derivatives + +-/ + +variable (𝔤) in +/-- The field strength `F_μν = ∂_μ A_ν − ∂_ν A_μ + ⁅A_μ, A_ν⁆` of the local gauge field + algebra: the underived field strength of the family of derivative symbols, in the + conventions of `GaugeAlgebraRealization.fieldStrength`, where the bracket of the gauge + algebra carries the physicists' factor of `i`. -/ +noncomputable def fieldStrength (μ ν : Fin 1 ⊕ Fin 3) : + Module.Dual ℝ 𝔤 →ₗ[ℝ] LocalGaugeFieldAlgebra 𝔤 := + GaugeAlgebraRealization.fieldStrength (derivA 𝔤) μ ν 0 + +/-- The field strength written in the generators of the algebra. -/ +lemma fieldStrength_apply (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + fieldStrength 𝔤 μ ν φ = jetDeriv 𝔤 μ (ofA 𝔤 ν φ) - jetDeriv 𝔤 ν (ofA 𝔤 μ φ) + + bracketFam (ofA 𝔤 μ) (ofA 𝔤 ν) φ := by + rw [fieldStrength, GaugeAlgebraRealization.fieldStrength_zero, + GaugeAlgebraRealization.commutator_eq_bracketFam] + simp only [LinearMap.add_apply, LinearMap.sub_apply, derivA_apply, iteratedJetDeriv_singleton, + derivA_zero] + +/-- The field strength is antisymmetric in its two covector indices. -/ +lemma fieldStrength_swap (μ ν : Fin 1 ⊕ Fin 3) : + fieldStrength 𝔤 ν μ = - fieldStrength 𝔤 μ ν := + GaugeAlgebraRealization.fieldStrength_swap (derivA 𝔤) (fun _ _ _ _ _ _ => Commute.all _ _) μ ν 0 + +variable (𝔤) in +/-- The iterated covariant derivative `∇_{l₁} ⋯ ∇_{lₙ} F_μν` of the field strength along an + ordered list of directions, with `∇_ρ F = ∂_ρ F + ⁅A_ρ, F⁆` the covariant derivative in + the adjoint. Covariant derivatives do not commute, so the iteration is indexed by a list + and not by a multiset; the empty list gives the field strength itself. -/ +noncomputable def covDerivFieldStrength (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : + Module.Dual ℝ 𝔤 →ₗ[ℝ] LocalGaugeFieldAlgebra 𝔤 := + iteratedCovDerivAdjoint (derivA 𝔤) l (GaugeAlgebraRealization.fieldStrength (derivA 𝔤) μ ν) 0 + +/-- Zero covariant derivatives: the field strength itself. -/ +@[simp] +lemma covDerivFieldStrength_nil (μ ν : Fin 1 ⊕ Fin 3) : + covDerivFieldStrength 𝔤 [] μ ν = fieldStrength 𝔤 μ ν := rfl + +/-! + +## C. The derivative symbols of the covariant tower are iterated derivatives + +The families of `GaugeAlgebraRealization` carry the derivative symbols `∂_s F` of a +covariant expression as data. Here the Leibniz convolutions defining the derived brackets +really are the Leibniz rule of the total derivative, so those symbols are the iterated +total derivatives `∂_s` of the value at `0`. + +-/ + +/-- The Leibniz rule of the iterated total derivative on a bracket of families: the + antidiagonal convolution of the iterated derivatives of the two factors. -/ +lemma iteratedJetDeriv_bracketFam (s : Multiset (Fin 1 ⊕ Fin 3)) + (f g : Module.Dual ℝ 𝔤 →ₗ[ℝ] LocalGaugeFieldAlgebra 𝔤) (φ : Module.Dual ℝ 𝔤) : + iteratedJetDeriv 𝔤 s (bracketFam f g φ) = (s.antidiagonal.map fun p => + bracketFam (iteratedJetDeriv 𝔤 p.1 ∘ₗ f) (iteratedJetDeriv 𝔤 p.2 ∘ₗ g) φ).sum := by + induction s using Multiset.induction_on with + | empty => + simp only [iteratedJetDeriv_zero, LinearMap.id_apply, Multiset.antidiagonal_zero, + Multiset.map_singleton, Multiset.sum_singleton, LinearMap.id_comp] + | cons κ s ih => + have hterm : ∀ p : Multiset (Fin 1 ⊕ Fin 3) × Multiset (Fin 1 ⊕ Fin 3), + jetDeriv 𝔤 κ (bracketFam (iteratedJetDeriv 𝔤 p.1 ∘ₗ f) (iteratedJetDeriv 𝔤 p.2 ∘ₗ g) φ) + = bracketFam (iteratedJetDeriv 𝔤 (κ ::ₘ p.1) ∘ₗ f) (iteratedJetDeriv 𝔤 p.2 ∘ₗ g) φ + + bracketFam (iteratedJetDeriv 𝔤 p.1 ∘ₗ f) + (iteratedJetDeriv 𝔤 (κ ::ₘ p.2) ∘ₗ g) φ := by + intro p + rw [← LinearMap.comp_apply (jetDeriv 𝔤 κ), + GaugeAlgebraRealization.bracketFam_derivation _ (jetDeriv_mul κ), LinearMap.add_apply, + iteratedJetDeriv_cons, iteratedJetDeriv_cons, LinearMap.comp_assoc, + LinearMap.comp_assoc] + rw [iteratedJetDeriv_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 + +/-- If a family consists of the iterated derivatives of its base value, so does its derived + bracket against the gauge field: the Leibniz convolution is the iterated derivative of the + bracket of the base values. -/ +lemma bracketFamConv_derivA (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] + LocalGaugeFieldAlgebra 𝔤) + (hF : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤), + F s φ = iteratedJetDeriv 𝔤 s (F 0 φ)) + (ρ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤) : + bracketFamConv (derivA 𝔤) ρ F s φ + = iteratedJetDeriv 𝔤 s (bracketFam (ofA 𝔤 ρ) (F 0) φ) := by + have hF' : ∀ t, F t = iteratedJetDeriv 𝔤 t ∘ₗ F 0 := fun t => LinearMap.ext (hF t) + rw [iteratedJetDeriv_bracketFam, bracketFamConv, Multiset.sum_linearMap_apply, + Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p _ => ?_) + rw [Function.comp_apply, hF' p.2] + rfl + +/-- The covariant derivative of a family of iterated derivatives is again a family of + iterated derivatives. -/ +lemma covDerivAdjoint_derivA (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] + LocalGaugeFieldAlgebra 𝔤) + (hF : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤), + F s φ = iteratedJetDeriv 𝔤 s (F 0 φ)) + (ρ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤) : + covDerivAdjoint (derivA 𝔤) F ρ s φ + = iteratedJetDeriv 𝔤 s (covDerivAdjoint (derivA 𝔤) F ρ 0 φ) := by + have h1 : F (ρ ::ₘ s) φ = iteratedJetDeriv 𝔤 s (F (ρ ::ₘ 0) φ) := by + rw [hF (ρ ::ₘ s), hF (ρ ::ₘ 0), iteratedJetDeriv_cons', iteratedJetDeriv_cons', + iteratedJetDeriv_zero, LinearMap.id_comp, LinearMap.comp_apply] + rw [GaugeAlgebraRealization.covDerivAdjoint_apply, + GaugeAlgebraRealization.covDerivAdjoint_apply, map_add, h1, bracketFamConv_derivA F hF, + bracketFamConv_derivA F hF ρ 0, iteratedJetDeriv_zero, LinearMap.id_apply] + +/-- The derivative symbols of the field strength are the iterated derivatives of the field + strength. -/ +lemma fieldStrength_derivA (μ ν : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℝ 𝔤) : + GaugeAlgebraRealization.fieldStrength (derivA 𝔤) μ ν s φ + = iteratedJetDeriv 𝔤 s (fieldStrength 𝔤 μ ν φ) := by + have hd : ∀ σ τ : Fin 1 ⊕ Fin 3, + derivA 𝔤 (σ ::ₘ s) τ φ = iteratedJetDeriv 𝔤 s (derivA 𝔤 (σ ::ₘ 0) τ φ) := by + intro σ τ + rw [derivA_apply, derivA_apply, iteratedJetDeriv_cons', iteratedJetDeriv_cons', + iteratedJetDeriv_zero, LinearMap.id_comp, LinearMap.comp_apply] + have hcomm : ∀ t, commutatorFam (derivA 𝔤) μ ν t + = bracketFamConv (derivA 𝔤) μ (fun r => derivA 𝔤 r ν) t := fun t => rfl + rw [fieldStrength, GaugeAlgebraRealization.fieldStrength_apply, + GaugeAlgebraRealization.fieldStrength_apply, map_add, map_sub, hd μ ν, hd ν μ, hcomm, + hcomm, bracketFamConv_derivA _ (fun _ _ => rfl), bracketFamConv_derivA _ (fun _ _ => rfl), + iteratedJetDeriv_zero, LinearMap.id_apply] + +/-- The derivative symbols of the covariant derivatives of the field strength are the + iterated derivatives of their base values. -/ +lemma iteratedCovDerivAdjoint_fieldStrength_derivA (l : List (Fin 1 ⊕ Fin 3)) + (μ ν : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤) : + iteratedCovDerivAdjoint (derivA 𝔤) l (GaugeAlgebraRealization.fieldStrength (derivA 𝔤) μ ν) + s φ + = iteratedJetDeriv 𝔤 s (covDerivFieldStrength 𝔤 l μ ν φ) := by + induction l generalizing s φ with + | nil => exact fieldStrength_derivA μ ν s φ + | cons ρ l ih => exact covDerivAdjoint_derivA _ ih ρ s φ + +/-- The covariant derivative `∇_ρ F = ∂_ρ F + ⁅A_ρ, F⁆` peeled off the front of the list: + the recursion on elements of the algebra. -/ +lemma covDerivFieldStrength_cons (ρ : Fin 1 ⊕ Fin 3) (l : List (Fin 1 ⊕ Fin 3)) + (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + covDerivFieldStrength 𝔤 (ρ :: l) μ ν φ + = jetDeriv 𝔤 ρ (covDerivFieldStrength 𝔤 l μ ν φ) + + bracketFam (ofA 𝔤 ρ) (covDerivFieldStrength 𝔤 l μ ν) φ := by + show covDerivAdjoint (derivA 𝔤) (iteratedCovDerivAdjoint (derivA 𝔤) l + (GaugeAlgebraRealization.fieldStrength (derivA 𝔤) μ ν)) ρ 0 φ = _ + rw [GaugeAlgebraRealization.covDerivAdjoint_apply, iteratedCovDerivAdjoint_fieldStrength_derivA, + bracketFamConv_derivA _ (iteratedCovDerivAdjoint_fieldStrength_derivA l μ ν), + iteratedJetDeriv_zero, LinearMap.id_apply, iteratedJetDeriv_cons', iteratedJetDeriv_zero, + LinearMap.id_comp] + rfl + +/-! + +## D. The gauge law, by descent from the complexification + +The gauge law is proved in +`Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization` for a realization in a +complex algebra, and `GaugeAlgebraRealization.id` realizes the real algebra in its +complexification. Injectivity of `x ↦ 1 ⊗ₜ x` reads the real law off the complex one; no +reality argument beyond that is involved. + +-/ + +/-- The complexified covariant tower of the identity realization is the image of the real + one. -/ +lemma one_tmul_iteratedCovDerivAdjoint_fieldStrength (l : List (Fin 1 ⊕ Fin 3)) + (μ ν : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤) : + (1 : ℂ) ⊗ₜ[ℝ] iteratedCovDerivAdjoint (derivA 𝔤) l + (GaugeAlgebraRealization.fieldStrength (derivA 𝔤) μ ν) s φ + = iteratedCovDerivAdjoint (gaugeField 𝔤) l + (GaugeAlgebraRealization.fieldStrength (gaugeField 𝔤) μ ν) s φ := by + set ι : LocalGaugeFieldAlgebra 𝔤 →ₗ[ℝ] ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤 := + (Algebra.TensorProduct.includeRight : + LocalGaugeFieldAlgebra 𝔤 →ₐ[ℝ] ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤).toLinearMap with hι + have hmul : ∀ x y, ι (x * y) = ι x * ι y := fun x y => + map_mul (Algebra.TensorProduct.includeRight : + LocalGaugeFieldAlgebra 𝔤 →ₐ[ℝ] ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤) x y + have hA : (fun p ρ => ι ∘ₗ derivA 𝔤 p ρ) = gaugeField 𝔤 := by + funext p ρ + exact LinearMap.ext fun φ => (gaugeField_eq_one_tmul_derivA p ρ φ).symm + have key := congrFun (GaugeAlgebraRealization.iteratedCovDerivAdjoint_map ι hmul (derivA 𝔤) l + (GaugeAlgebraRealization.fieldStrength (derivA 𝔤) μ ν)) s + rw [show (fun p => ι ∘ₗ GaugeAlgebraRealization.fieldStrength (derivA 𝔤) μ ν p) + = GaugeAlgebraRealization.fieldStrength (fun p ρ => ι ∘ₗ derivA 𝔤 p ρ) μ ν from + funext fun p => (GaugeAlgebraRealization.fieldStrength_map ι hmul _ μ ν p).symm, hA] at key + exact (LinearMap.congr_fun key φ).symm + +/-- The gauge law of the covariant derivatives of the field strength at every derivative + order: a jet acts by the Leibniz convolution of the dual adjoint Taylor coefficients of + `U⁻¹` against lower derivative symbols, with no Maurer–Cartan shift. -/ +theorem repJet_iteratedCovDerivAdjoint_fieldStrength (U : GJ) (l : List (Fin 1 ⊕ Fin 3)) + (μ ν : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤) : + repJet jets U (iteratedCovDerivAdjoint (derivA 𝔤) l + (GaugeAlgebraRealization.fieldStrength (derivA 𝔤) μ ν) s φ) + = (s.antidiagonal.map fun p => iteratedCovDerivAdjoint (derivA 𝔤) l + (GaugeAlgebraRealization.fieldStrength (derivA 𝔤) μ ν) p.2 + (jets.adjointDualCoeff U⁻¹ p.1 φ)).sum := by + -- `x ↦ 1 ⊗ₜ x` is injective: `ℝ → ℂ` is injective and every real module is flat. + apply Module.Flat.tensorProduct_mk_injective ℝ _ ℂ + simp only [TensorProduct.mk_apply] + rw [← complexRepJet_tmul, one_tmul_iteratedCovDerivAdjoint_fieldStrength, Multiset.tmul_sum, + Multiset.map_map] + refine (GaugeAlgebraRealization.transformsInAdjoint_iteratedCovDerivAdjoint + (GaugeAlgebraRealization.id jets) l μ ν U φ s).trans ?_ + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p _ => ?_) + exact (one_tmul_iteratedCovDerivAdjoint_fieldStrength l μ ν p.2 _).symm + +/-- The gauge law of the covariant derivatives of the field strength: a jet acts through + the zeroth dual adjoint Taylor coefficient of `U⁻¹` on the adjoint index alone. -/ +theorem repJet_covDerivFieldStrength (U : GJ) (l : List (Fin 1 ⊕ Fin 3)) + (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + repJet jets U (covDerivFieldStrength 𝔤 l μ ν φ) + = covDerivFieldStrength 𝔤 l μ ν (jets.adjointDualCoeff U⁻¹ 0 φ) := by + rw [covDerivFieldStrength] + simpa only [Multiset.antidiagonal_zero, Multiset.map_singleton, Multiset.sum_singleton] + using repJet_iteratedCovDerivAdjoint_fieldStrength (jets := jets) U l μ ν 0 φ + +/-- On the covariant derivatives of the field strength the local gauge action factors + through evaluation: a jet `U` acts through the dual base-point adjoint action of the + value `jets.eval U⁻¹` of its inverse, and the derivatives of the jet are not seen. The + covariant expressions are gauge covariant, not gauge invariant. -/ +theorem repJet_covDerivFieldStrength_eval (U : GJ) (l : List (Fin 1 ⊕ Fin 3)) + (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + repJet jets U (covDerivFieldStrength 𝔤 l μ ν φ) + = covDerivFieldStrength 𝔤 l μ ν ((jets.adjointValue (jets.eval U⁻¹)).dualMap φ) := by + rw [repJet_covDerivFieldStrength, jets.adjointDualCoeff_zero] + +/-- The field strength transforms in the adjoint. -/ +lemma repJet_fieldStrength (U : GJ) (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + repJet jets U (fieldStrength 𝔤 μ ν φ) + = fieldStrength 𝔤 μ ν ((jets.adjointValue (jets.eval U⁻¹)).dualMap φ) := + repJet_covDerivFieldStrength_eval U [] μ ν φ + +/-! + +## E. The Lorentz law + +-/ + +-- The entry `Λ_{b a}` of the Lorentz matrix of `Λ : SL(2,ℂ)`. +set_option quotPrecheck false in +local notation:max "L[" Λ "]" b:max a:max => ((SL2C.toLorentzGroup Λ).1 b a : ℝ) + +/-- The Lorentz action on the gauge-field generator, as a linear map. -/ +lemma repLorentzGroup_comp_ofA (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) : + (repLorentzGroup 𝔤 Λ) ∘ₗ ofA 𝔤 μ = ∑ a, L[Λ] a μ • ofA 𝔤 a := + LinearMap.ext fun φ => by + simp only [LinearMap.comp_apply, repLorentzGroup_ofA, LinearMap.sum_apply, + LinearMap.smul_apply] + +/-- The Lorentz action passes through the bracket of a gauge-field generator against a + family, mixing the covector index of the generator. -/ +lemma repLorentzGroup_bracketFam_ofA (Λ : SL(2,ℂ)) (ρ : Fin 1 ⊕ Fin 3) + (F : Module.Dual ℝ 𝔤 →ₗ[ℝ] LocalGaugeFieldAlgebra 𝔤) (φ : Module.Dual ℝ 𝔤) : + repLorentzGroup 𝔤 Λ (bracketFam (ofA 𝔤 ρ) F φ) + = ∑ a, L[Λ] a ρ • bracketFam (ofA 𝔤 a) ((repLorentzGroup 𝔤 Λ) ∘ₗ F) φ := by + rw [← LinearMap.comp_apply, + ← GaugeAlgebraRealization.bracketFam_map _ (repLorentzGroup_apply_mul Λ), + repLorentzGroup_comp_ofA, GaugeAlgebraRealization.bracketFam_finset_sum_left, + LinearMap.sum_apply] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [GaugeAlgebraRealization.bracketFam_smul_left, LinearMap.smul_apply] + +/-- The Lorentz law of the field strength: both covector indices mix by the columns of the + Lorentz matrix, the adjoint index is untouched. -/ +lemma repLorentzGroup_fieldStrength (Λ : SL(2,ℂ)) (μ ν : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ 𝔤) : + repLorentzGroup 𝔤 Λ (fieldStrength 𝔤 μ ν φ) + = ∑ a, L[Λ] a μ • ∑ b, L[Λ] b ν • fieldStrength 𝔤 a b φ := by + have hder : ∀ σ τ : Fin 1 ⊕ Fin 3, repLorentzGroup 𝔤 Λ (jetDeriv 𝔤 σ (ofA 𝔤 τ φ)) + = ∑ a, L[Λ] a σ • ∑ b, L[Λ] b τ • jetDeriv 𝔤 a (ofA 𝔤 b φ) := by + intro σ τ + rw [repLorentzGroup_jetDeriv] + refine Finset.sum_congr rfl fun a _ => ?_ + rw [repLorentzGroup_ofA, map_sum] + refine congrArg _ (Finset.sum_congr rfl fun b _ => ?_) + rw [map_smul] + have hswap : ∑ a, L[Λ] a ν • ∑ b, L[Λ] b μ • jetDeriv 𝔤 a (ofA 𝔤 b φ) + = ∑ a, L[Λ] a μ • ∑ b, L[Λ] b ν • jetDeriv 𝔤 b (ofA 𝔤 a φ) := by + simp only [Finset.smul_sum, smul_smul] + rw [Finset.sum_comm] + exact Finset.sum_congr rfl fun a _ => Finset.sum_congr rfl fun b _ => by rw [mul_comm] + have hbr : repLorentzGroup 𝔤 Λ (bracketFam (ofA 𝔤 μ) (ofA 𝔤 ν) φ) + = ∑ a, L[Λ] a μ • ∑ b, L[Λ] b ν • bracketFam (ofA 𝔤 a) (ofA 𝔤 b) φ := by + rw [repLorentzGroup_bracketFam_ofA, Finset.sum_congr rfl fun a _ => by + rw [repLorentzGroup_comp_ofA, GaugeAlgebraRealization.bracketFam_finset_sum_right, + LinearMap.sum_apply, Finset.sum_congr rfl fun b _ => by + rw [GaugeAlgebraRealization.bracketFam_smul_right, LinearMap.smul_apply]]] + rw [fieldStrength_apply, map_add, map_sub, hder, hder, hswap, hbr] + simp only [fieldStrength_apply, smul_sub, smul_add, Finset.sum_sub_distrib, + Finset.sum_add_distrib] + +/-- The Lorentz law of the covariant derivatives of the field strength: every covariant + slot and both covector indices of the field strength mix by the columns of the Lorentz + matrix, the adjoint index is untouched. -/ +theorem repLorentzGroup_covDerivFieldStrength (Λ : SL(2,ℂ)) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + repLorentzGroup 𝔤 Λ (covDerivFieldStrength 𝔤 (List.ofFn l) μ ν φ) + = ∑ p : Fin n → (Fin 1 ⊕ Fin 3), (∏ i, L[Λ] (p i) (l i)) • + ∑ a, L[Λ] a μ • ∑ b, L[Λ] b ν • covDerivFieldStrength 𝔤 (List.ofFn p) a b φ := by + induction n generalizing φ with + | zero => + rw [List.ofFn_zero, covDerivFieldStrength_nil, repLorentzGroup_fieldStrength, + Fintype.sum_unique (ι := Fin 0 → (Fin 1 ⊕ Fin 3))] + simp + | succ n ih => + have hT : (repLorentzGroup 𝔤 Λ) ∘ₗ covDerivFieldStrength 𝔤 (List.ofFn fun i => l i.succ) μ ν + = ∑ p : Fin n → (Fin 1 ⊕ Fin 3), (∏ i, L[Λ] (p i) (l i.succ)) • + ∑ a, L[Λ] a μ • ∑ b, L[Λ] b ν • covDerivFieldStrength 𝔤 (List.ofFn p) a b := + LinearMap.ext fun φ => by + simp only [LinearMap.comp_apply, ih (fun i => l i.succ), LinearMap.sum_apply, + LinearMap.smul_apply] + have hcov : ∀ (c : Fin 1 ⊕ Fin 3) (p : Fin n → (Fin 1 ⊕ Fin 3)), + ∑ a, L[Λ] a μ • ∑ b, L[Λ] b ν • + covDerivFieldStrength 𝔤 (List.ofFn (Fin.cons c p)) a b φ + = jetDeriv 𝔤 c (∑ a, L[Λ] a μ • ∑ b, L[Λ] b ν • + covDerivFieldStrength 𝔤 (List.ofFn p) a b φ) + + bracketFam (ofA 𝔤 c) (∑ a, L[Λ] a μ • ∑ b, L[Λ] b ν • + covDerivFieldStrength 𝔤 (List.ofFn p) a b) φ := by + intro c p + simp only [List.ofFn_succ, Fin.cons_zero, Fin.cons_succ, covDerivFieldStrength_cons, + map_sum, map_smul, GaugeAlgebraRealization.bracketFam_finset_sum_right, + GaugeAlgebraRealization.bracketFam_smul_right, LinearMap.sum_apply, + LinearMap.smul_apply, smul_add, Finset.sum_add_distrib] + rw [List.ofFn_succ, covDerivFieldStrength_cons, map_add, repLorentzGroup_jetDeriv, + repLorentzGroup_bracketFam_ofA, hT, ← Finset.sum_add_distrib, + Physlib.Fin.sum_pi_succ_prod_smul (fun i b => L[Λ] b (l i))] + simp only [mul_smul] + refine Finset.sum_congr rfl fun c _ => ?_ + rw [ih (fun i => l i.succ), map_sum (jetDeriv 𝔤 c), + GaugeAlgebraRealization.bracketFam_finset_sum_right, LinearMap.sum_apply, + Finset.smul_sum, Finset.smul_sum, ← Finset.sum_add_distrib] + refine Finset.sum_congr rfl fun p _ => ?_ + rw [hcov c p] + simp only [smul_add, map_smul, GaugeAlgebraRealization.bracketFam_smul_right, + LinearMap.smul_apply] + +end LocalGaugeFieldAlgebra diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/GaugeAction.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeFieldAlgebra/GaugeAction.lean similarity index 91% rename from Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/GaugeAction.lean rename to Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeFieldAlgebra/GaugeAction.lean index f20bf4b09..da3ab0b69 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/GaugeAction.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeFieldAlgebra/GaugeAction.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.JetDeriv +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeFieldAlgebra.JetDeriv public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.AdjointCoeff public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.MaurerCartan public import Physlib.Relativity.IsLorentzDeriv @@ -31,13 +31,13 @@ gives the cocycle identity for the Maurer–Cartan shift. ## ii. Key results - `GaugeBoson.adjointTransport` : the adjoint Taylor coefficients on the target space. -- `GaugeJetAlgebra.transport` : the linear part of the gauge action on the component +- `LocalGaugeFieldAlgebra.transport` : the linear part of the gauge action on the component space. -- `GaugeJetAlgebra.mcShift` : the Maurer–Cartan shift. -- `GaugeJetAlgebra.repJet` : the action of the jet gauge group on the jet algebra. -- `GaugeJetAlgebra.repJet_iteratedJetDeriv_ofA` : the transformation law of the derivative +- `LocalGaugeFieldAlgebra.mcShift` : the Maurer–Cartan shift. +- `LocalGaugeFieldAlgebra.repJet` : the action of the jet gauge group on the jet algebra. +- `LocalGaugeFieldAlgebra.repJet_iteratedJetDeriv_ofA` : the transformation law of the derivative generators, in the form used by `GaugeAlgebraRealization`. -- `GaugeJetAlgebra.complexRepJet` : the action on the complexified jet algebra. +- `LocalGaugeFieldAlgebra.complexRepJet` : the action on the complexified jet algebra. ## iii. Table of contents @@ -153,7 +153,7 @@ lemma dualMap_adjointTransport_componentDual (U : GJ) end GaugeBoson -namespace GaugeJetAlgebra +namespace LocalGaugeFieldAlgebra variable (jets) in /-- The value of the transport on the derivative symbol at `s`: the all-orders Leibniz @@ -264,7 +264,7 @@ lemma transport_mul (U V : GJ) : (GaugeBoson.adjointTransport jets V b).dualMap ((GaugeBoson.adjointTransport jets U a).dualMap ψ) -end GaugeJetAlgebra +end LocalGaugeFieldAlgebra /-! @@ -272,7 +272,7 @@ end GaugeJetAlgebra -/ -namespace GaugeJetAlgebra +namespace LocalGaugeFieldAlgebra variable (jets) in /-- The Taylor coefficient of the Maurer–Cartan form of `U` at the derivative multiset @@ -389,26 +389,26 @@ variable (jets) in 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 : GJ) : - (GaugeBoson.JetComponentSpace 𝔤) →ₗ[ℝ] (GaugeJetAlgebra 𝔤) := + (GaugeBoson.JetComponentSpace 𝔤) →ₗ[ℝ] (LocalGaugeFieldAlgebra 𝔤) := (SymmetricAlgebra.ι ℝ (GaugeBoson.JetComponentSpace 𝔤)).comp (transport jets U⁻¹) - + (Algebra.linearMap ℝ (GaugeJetAlgebra 𝔤)).comp (mcShift jets U⁻¹) + + (Algebra.linearMap ℝ (LocalGaugeFieldAlgebra 𝔤)).comp (mcShift jets U⁻¹) lemma gaugeGen_apply (U : GJ) (x : (GaugeBoson.JetComponentSpace 𝔤)) : gaugeGen jets U x = SymmetricAlgebra.ι ℝ _ (transport jets U⁻¹ x) - + algebraMap ℝ (GaugeJetAlgebra 𝔤) (mcShift jets U⁻¹ x) := rfl + + algebraMap ℝ (LocalGaugeFieldAlgebra 𝔤) (mcShift jets U⁻¹ x) := rfl variable (jets) 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 ℝ GJ (GaugeJetAlgebra 𝔤) where +noncomputable def repJet : Representation ℝ GJ (LocalGaugeFieldAlgebra 𝔤) where toFun U := (SymmetricAlgebra.lift (gaugeGen jets U)).toLinearMap map_one' := by - suffices h : SymmetricAlgebra.lift (gaugeGen jets 1) = AlgHom.id ℝ (GaugeJetAlgebra 𝔤) by + suffices h : SymmetricAlgebra.lift (gaugeGen jets 1) = AlgHom.id ℝ (LocalGaugeFieldAlgebra 𝔤) by rw [h]; rfl refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun x => ?_) show SymmetricAlgebra.lift (gaugeGen jets 1) (SymmetricAlgebra.ι ℝ _ x) - = AlgHom.id ℝ (GaugeJetAlgebra 𝔤) (SymmetricAlgebra.ι ℝ _ x) + = AlgHom.id ℝ (LocalGaugeFieldAlgebra 𝔤) (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 @@ -431,25 +431,25 @@ variable (jets) 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 : GJ) : - (GaugeJetAlgebra 𝔤) →ₐ[ℝ] (GaugeJetAlgebra 𝔤) := + (LocalGaugeFieldAlgebra 𝔤) →ₐ[ℝ] (LocalGaugeFieldAlgebra 𝔤) := SymmetricAlgebra.lift (gaugeGen jets U) @[simp] lemma repJet_ι (U : GJ) (x : (GaugeBoson.JetComponentSpace 𝔤)) : repJet jets U (SymmetricAlgebra.ι ℝ _ x) = SymmetricAlgebra.ι ℝ _ (transport jets U⁻¹ x) - + algebraMap ℝ (GaugeJetAlgebra 𝔤) (mcShift jets U⁻¹ x) := by + + algebraMap ℝ (LocalGaugeFieldAlgebra 𝔤) (mcShift jets U⁻¹ x) := by rw [show repJet jets U (SymmetricAlgebra.ι ℝ _ x) = SymmetricAlgebra.lift (gaugeGen jets U) (SymmetricAlgebra.ι ℝ _ x) from rfl, SymmetricAlgebra.lift_ι_apply, gaugeGen_apply] @[simp] lemma repJet_apply_one (U : GJ) : - repJet jets U (1 : (GaugeJetAlgebra 𝔤)) = 1 := by - rw [show repJet jets U (1 : (GaugeJetAlgebra 𝔤)) + repJet jets U (1 : (LocalGaugeFieldAlgebra 𝔤)) = 1 := by + rw [show repJet jets U (1 : (LocalGaugeFieldAlgebra 𝔤)) = SymmetricAlgebra.lift (gaugeGen jets U) 1 from rfl, map_one] -lemma repJet_apply_mul (U : GJ) (x y : (GaugeJetAlgebra 𝔤)) : +lemma repJet_apply_mul (U : GJ) (x y : (LocalGaugeFieldAlgebra 𝔤)) : repJet jets U (x * y) = repJet jets U x * repJet jets U y := by rw [show repJet jets U (x * y) = SymmetricAlgebra.lift (gaugeGen jets U) (x * y) from rfl, map_mul] @@ -457,10 +457,10 @@ lemma repJet_apply_mul (U : GJ) (x y : (GaugeJetAlgebra 𝔤)) : @[simp] lemma repJet_algebraMap (U : GJ) (r : ℝ) : - repJet jets U (algebraMap ℝ (GaugeJetAlgebra 𝔤) r) - = algebraMap ℝ (GaugeJetAlgebra 𝔤) r := by - rw [show repJet jets U (algebraMap ℝ (GaugeJetAlgebra 𝔤) r) - = SymmetricAlgebra.lift (gaugeGen jets U) (algebraMap ℝ (GaugeJetAlgebra 𝔤) r) from rfl, + repJet jets U (algebraMap ℝ (LocalGaugeFieldAlgebra 𝔤) r) + = algebraMap ℝ (LocalGaugeFieldAlgebra 𝔤) r := by + rw [show repJet jets U (algebraMap ℝ (LocalGaugeFieldAlgebra 𝔤) r) + = SymmetricAlgebra.lift (gaugeGen jets U) (algebraMap ℝ (LocalGaugeFieldAlgebra 𝔤) r) from rfl, AlgHom.commutes] /-! @@ -500,7 +500,7 @@ theorem repJet_iteratedJetDeriv_ofA (U : GJ) repJet jets U ((iteratedJetDeriv 𝔤) s ((ofA 𝔤) μ φ)) = (s.antidiagonal.map fun p => (iteratedJetDeriv 𝔤) p.2 ((ofA 𝔤) μ (jets.adjointDualCoeff U⁻¹ p.1 φ))).sum - + algebraMap ℝ (GaugeJetAlgebra 𝔤) + + algebraMap ℝ (LocalGaugeFieldAlgebra 𝔤) (φ (jets.evalLie (jets.iteratedDeriv s (jets.maurerCartan U⁻¹ μ)))) := by rw [iteratedJetDeriv_ofA, repJet_ι, transport_basis_tmul, mcShift_basis_tmul, @@ -521,7 +521,7 @@ variable (jets) in /-- The action of the jet gauge group on the complexified gauge-boson jet algebra, by base change. -/ noncomputable def complexRepJet : - Representation ℂ GJ (ℂ ⊗[ℝ] (GaugeJetAlgebra 𝔤)) where + Representation ℂ GJ (ℂ ⊗[ℝ] (LocalGaugeFieldAlgebra 𝔤)) where toFun U := LinearMap.baseChange ℂ (repJet jets U) map_one' := by rw [map_one, Module.End.one_eq_id, LinearMap.baseChange_id, Module.End.one_eq_id] @@ -529,11 +529,11 @@ noncomputable def complexRepJet : rw [map_mul, Module.End.mul_eq_comp, LinearMap.baseChange_comp, Module.End.mul_eq_comp] @[simp] -lemma complexRepJet_tmul (U : GJ) (z : ℂ) (x : (GaugeJetAlgebra 𝔤)) : +lemma complexRepJet_tmul (U : GJ) (z : ℂ) (x : (LocalGaugeFieldAlgebra 𝔤)) : complexRepJet jets U (z ⊗ₜ[ℝ] x) = z ⊗ₜ[ℝ] repJet jets U x := rfl lemma complexRepJet_apply_mul (U : GJ) - (x y : ℂ ⊗[ℝ] (GaugeJetAlgebra 𝔤)) : + (x y : ℂ ⊗[ℝ] (LocalGaugeFieldAlgebra 𝔤)) : complexRepJet jets U (x * y) = complexRepJet jets U x * complexRepJet jets U y := by induction x using TensorProduct.induction_on with @@ -551,7 +551,7 @@ lemma complexRepJet_apply_mul (U : GJ) /-- 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 𝔤)) : + (x : (LocalGaugeFieldAlgebra 𝔤)) : Lorentz.iteratedD (complexJetDeriv 𝔤) complexJetDeriv_comm s ((1 : ℂ) ⊗ₜ[ℝ] x) = (1 : ℂ) ⊗ₜ[ℝ] (iteratedJetDeriv 𝔤) s x := by induction s using Multiset.induction_on generalizing x with @@ -562,12 +562,12 @@ lemma iteratedD_complexJetDeriv_one_tmul (s : Multiset (Fin 1 ⊕ Fin 3)) /-- 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 + (1 : ℂ) ⊗ₜ[ℝ] (algebraMap ℝ (LocalGaugeFieldAlgebra 𝔤) r) + = algebraMap ℂ (ℂ ⊗[ℝ] (LocalGaugeFieldAlgebra 𝔤)) ((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 + show ((r : ℝ) • ((1 : ℂ) ⊗ₜ[ℝ] (1 : (LocalGaugeFieldAlgebra 𝔤)))) + = (((r : ℝ) : ℂ)) • ((1 : ℂ) ⊗ₜ[ℝ] (1 : (LocalGaugeFieldAlgebra 𝔤))) from (algebraMap_smul ℂ r _).symm, Algebra.TensorProduct.one_def] /-- The transformation law of the derivative generators on the complexification: the @@ -579,7 +579,7 @@ theorem complexRepJet_iteratedD_one_tmul_ofA (U : GJ) = (s.antidiagonal.map fun p => Lorentz.iteratedD (complexJetDeriv 𝔤) complexJetDeriv_comm p.2 ((1 : ℂ) ⊗ₜ[ℝ] (ofA 𝔤) μ (jets.adjointDualCoeff U⁻¹ p.1 φ))).sum - + algebraMap ℂ (ℂ ⊗[ℝ] (GaugeJetAlgebra 𝔤)) + + algebraMap ℂ (ℂ ⊗[ℝ] (LocalGaugeFieldAlgebra 𝔤)) (((φ (jets.evalLie (jets.iteratedDeriv s (jets.maurerCartan U⁻¹ μ))) : ℝ)) : ℂ) := by rw [iteratedD_complexJetDeriv_one_tmul, complexRepJet_tmul, @@ -589,5 +589,5 @@ theorem complexRepJet_iteratedD_one_tmul_ofA (U : GJ) exact congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => by rw [Function.comp_apply, iteratedD_complexJetDeriv_one_tmul]) -end GaugeJetAlgebra +end LocalGaugeFieldAlgebra diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/GaugeField.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeFieldAlgebra/GaugeField.lean similarity index 85% rename from Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/GaugeField.lean rename to Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeFieldAlgebra/GaugeField.lean index 4b08b803a..119bea662 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/GaugeField.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeFieldAlgebra/GaugeField.lean @@ -5,8 +5,8 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.LorentzAction -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.GaugeAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeFieldAlgebra.LorentzAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeFieldAlgebra.GaugeAction public import Physlib.Relativity.SL2C.Basic /-! # The gauge-field symbols of the jet algebra and their laws @@ -15,7 +15,7 @@ public import Physlib.Relativity.SL2C.Basic The derivative symbols `∂_s A_μ^φ` of the complexified gauge-boson jet algebra, packaged as a family over the derivative multiset, the spacetime index and the dual of the gauge -algebra, `GaugeJetAlgebra.gaugeField`, and the two transformation laws they satisfy: the +algebra, `LocalGaugeFieldAlgebra.gaugeField`, and the two transformation laws they satisfy: the Lorentz law, in which the symbol carries one covector index and each derivative slot transforms as a covector, and the gauge law, in which a jet acts by the Leibniz convolution of its adjoint Taylor coefficients plus the Maurer–Cartan shift. These are the laws that a @@ -23,9 +23,9 @@ realization of the jet algebra in another algebra inherits. ## ii. Key results -- `GaugeJetAlgebra.gaugeField` : the gauge-field symbols of the jet algebra. -- `GaugeJetAlgebra.repLorentz_gaugeField` : the Lorentz law. -- `GaugeJetAlgebra.repJet_gaugeField` : the gauge law. +- `LocalGaugeFieldAlgebra.gaugeField` : the gauge-field symbols of the jet algebra. +- `LocalGaugeFieldAlgebra.repLorentz_gaugeField` : the Lorentz law. +- `LocalGaugeFieldAlgebra.repJet_gaugeField` : the gauge law. -/ @@ -39,16 +39,16 @@ variable {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} open TensorProduct Matrix MatrixGroups Lorentz -namespace GaugeJetAlgebra +namespace LocalGaugeFieldAlgebra 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 𝔤) := + Module.Dual ℝ 𝔤 →ₗ[ℝ] ℂ ⊗[ℝ] (LocalGaugeFieldAlgebra 𝔤) := (Lorentz.iteratedD (complexJetDeriv 𝔤) complexJetDeriv_comm s).restrictScalars ℝ ∘ₗ - (TensorProduct.mk ℝ ℂ (GaugeJetAlgebra 𝔤) 1).comp ((ofA 𝔤) μ) + (TensorProduct.mk ℝ ℂ (LocalGaugeFieldAlgebra 𝔤) 1).comp ((ofA 𝔤) μ) @[simp] lemma gaugeField_apply (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) @@ -87,8 +87,8 @@ lemma repJet_gaugeField (U : GJ) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 (φ : Module.Dual ℝ 𝔤) : complexRepJet jets U (gaugeField 𝔤 s μ φ) = (s.antidiagonal.map fun p => gaugeField 𝔤 p.2 μ (jets.adjointDualCoeff U⁻¹ p.1 φ)).sum - + algebraMap ℂ (ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤) + + algebraMap ℂ (ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤) (φ (jets.evalLie (jets.iteratedDeriv s (jets.maurerCartan U⁻¹ μ)))) := complexRepJet_iteratedD_one_tmul_ofA U s μ φ -end GaugeJetAlgebra +end LocalGaugeFieldAlgebra diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/JetDeriv.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeFieldAlgebra/JetDeriv.lean similarity index 88% rename from Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/JetDeriv.lean rename to Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeFieldAlgebra/JetDeriv.lean index 0ba407fdf..e5262468b 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/JetDeriv.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeFieldAlgebra/JetDeriv.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeFieldAlgebra.Basic /-! # The formal total derivative on the gauge-boson jet algebra @@ -20,18 +20,18 @@ 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 +derivative extends to the complexification `ℂ ⊗[ℝ] LocalGaugeFieldAlgebra` 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 +- `LocalGaugeFieldAlgebra.jetDeriv` : the formal total derivative, a derivation. +- `LocalGaugeFieldAlgebra.iteratedJetDeriv` : the iterated derivative along a multiset. +- `LocalGaugeFieldAlgebra.iteratedJetDeriv_ofA` : `∂_s A_μ^φ` as a generator. +- `LocalGaugeFieldAlgebra.adjoin_iteratedJetDeriv_eq_top` : the algebra is generated by the gauge fields and their derivatives. -- `GaugeJetAlgebra.complexJetDeriv` : the derivative on the complexification. +- `LocalGaugeFieldAlgebra.complexJetDeriv` : the derivative on the complexification. ## iii. Table of contents @@ -94,7 +94,7 @@ lemma JetComponentSpace.jetDeriv_comm (μ ν : Fin 1 ⊕ Fin 3) : end GaugeBoson -namespace GaugeJetAlgebra +namespace LocalGaugeFieldAlgebra /-! @@ -106,7 +106,8 @@ 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 𝔤) := +noncomputable def jetDeriv (ν : Fin 1 ⊕ Fin 3) : + (LocalGaugeFieldAlgebra 𝔤) →ₗ[ℝ] (LocalGaugeFieldAlgebra 𝔤) := SymmetricAlgebra.derivationOfLinear ((GaugeBoson.JetComponentSpace.jetDeriv 𝔤) ν) @[simp] @@ -116,21 +117,21 @@ lemma jetDeriv_ι (ν : Fin 1 ⊕ Fin 3) (x : (GaugeBoson.JetComponentSpace 𝔤 SymmetricAlgebra.derivationOfLinear_ι _ x @[simp] -lemma jetDeriv_one (ν : Fin 1 ⊕ Fin 3) : (jetDeriv 𝔤) ν (1 : (GaugeJetAlgebra 𝔤)) = 0 := +lemma jetDeriv_one (ν : Fin 1 ⊕ Fin 3) : (jetDeriv 𝔤) ν (1 : (LocalGaugeFieldAlgebra 𝔤)) = 0 := SymmetricAlgebra.derivationOfLinear_one _ @[simp] lemma jetDeriv_algebraMap (ν : Fin 1 ⊕ Fin 3) (r : ℝ) : - (jetDeriv 𝔤) ν (algebraMap ℝ (GaugeJetAlgebra 𝔤) r) = 0 := + (jetDeriv 𝔤) ν (algebraMap ℝ (LocalGaugeFieldAlgebra 𝔤) 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 𝔤)) : +lemma jetDeriv_mul (ν : Fin 1 ⊕ Fin 3) (x y : (LocalGaugeFieldAlgebra 𝔤)) : (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 𝔤)) : +lemma jetDeriv_comm_apply (μ ν : Fin 1 ⊕ Fin 3) (x : (LocalGaugeFieldAlgebra 𝔤)) : (jetDeriv 𝔤) μ ((jetDeriv 𝔤) ν x) = (jetDeriv 𝔤) ν ((jetDeriv 𝔤) μ x) := SymmetricAlgebra.derivationOfLinear_comm_apply (GaugeBoson.JetComponentSpace.jetDeriv_comm μ ν) x @@ -146,7 +147,7 @@ lemma jetDeriv_comm (μ ν : Fin 1 ⊕ Fin 3) : -/ instance : RightCommutative - (fun (D : (GaugeJetAlgebra 𝔤) →ₗ[ℝ] (GaugeJetAlgebra 𝔤)) (μ : Fin 1 ⊕ Fin 3) => + (fun (D : (LocalGaugeFieldAlgebra 𝔤) →ₗ[ℝ] (LocalGaugeFieldAlgebra 𝔤)) (μ : Fin 1 ⊕ Fin 3) => D.comp ((jetDeriv 𝔤) μ)) where right_comm D μ ν := by show (D.comp ((jetDeriv 𝔤) μ)).comp ((jetDeriv 𝔤) ν) = (D.comp ((jetDeriv 𝔤) ν)).comp @@ -157,7 +158,7 @@ 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 𝔤) := + (LocalGaugeFieldAlgebra 𝔤) →ₗ[ℝ] (LocalGaugeFieldAlgebra 𝔤) := s.foldl (fun D μ => D.comp ((jetDeriv 𝔤) μ)) LinearMap.id @[simp] @@ -166,7 +167,7 @@ lemma iteratedJetDeriv_zero : /-- 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 𝔤), + ∀ D : (LocalGaugeFieldAlgebra 𝔤) →ₗ[ℝ] (LocalGaugeFieldAlgebra 𝔤), s.foldl (fun D μ => D.comp ((jetDeriv 𝔤) μ)) D = D ∘ₗ (iteratedJetDeriv 𝔤) s := by induction s using Multiset.induction_on with | empty => @@ -199,6 +200,12 @@ lemma iteratedJetDeriv_add (s t : Multiset (Fin 1 ⊕ Fin 3)) : add_comm s ({μ} : Multiset (Fin 1 ⊕ Fin 3)), add_assoc], iteratedJetDeriv_cons, ih, iteratedJetDeriv_cons, LinearMap.comp_assoc] +/-- The companion of `iteratedJetDeriv_cons`, peeling the new derivative on the inside: + the derivatives commute, so the extra direction may equally be applied first. -/ +lemma iteratedJetDeriv_cons' (μ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : + (iteratedJetDeriv 𝔤) (μ ::ₘ s) = (iteratedJetDeriv 𝔤) s ∘ₗ (jetDeriv 𝔤) μ := by + rw [← Multiset.singleton_add, iteratedJetDeriv_add, iteratedJetDeriv_singleton] + /-- 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) @@ -280,8 +287,8 @@ 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 𝔤) := + = (⊤ : Subalgebra ℝ (LocalGaugeFieldAlgebra 𝔤)) := by + set S : Set (LocalGaugeFieldAlgebra 𝔤) := ⋃ s : Multiset (Fin 1 ⊕ Fin 3), ⋃ μ : Fin 1 ⊕ Fin 3, Set.range (fun φ : Module.Dual ℝ 𝔤 => (iteratedJetDeriv 𝔤) s ((ofA 𝔤) μ φ)) with hS @@ -338,16 +345,16 @@ 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 𝔤) := + ℂ ⊗[ℝ] (LocalGaugeFieldAlgebra 𝔤) →ₗ[ℂ] ℂ ⊗[ℝ] (LocalGaugeFieldAlgebra 𝔤) := LinearMap.baseChange ℂ ((jetDeriv 𝔤) ν) @[simp] -lemma complexJetDeriv_tmul (ν : Fin 1 ⊕ Fin 3) (z : ℂ) (x : (GaugeJetAlgebra 𝔤)) : +lemma complexJetDeriv_tmul (ν : Fin 1 ⊕ Fin 3) (z : ℂ) (x : (LocalGaugeFieldAlgebra 𝔤)) : (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 𝔤)) : +lemma complexJetDeriv_mul (ν : Fin 1 ⊕ Fin 3) (x y : ℂ ⊗[ℝ] (LocalGaugeFieldAlgebra 𝔤)) : (complexJetDeriv 𝔤) ν (x * y) = (complexJetDeriv 𝔤) ν x * y + x * (complexJetDeriv 𝔤) ν y := by induction x using TensorProduct.induction_on with @@ -373,5 +380,5 @@ lemma complexJetDeriv_comm (μ ν : Fin 1 ⊕ Fin 3) : rw [complexJetDeriv, complexJetDeriv, ← LinearMap.baseChange_comp, ← LinearMap.baseChange_comp, jetDeriv_comm] -end GaugeJetAlgebra +end LocalGaugeFieldAlgebra diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/LorentzAction.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeFieldAlgebra/LorentzAction.lean similarity index 92% rename from Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/LorentzAction.lean rename to Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeFieldAlgebra/LorentzAction.lean index ed0194ae3..f0a2ae2b7 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/LorentzAction.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeFieldAlgebra/LorentzAction.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.JetDeriv +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeFieldAlgebra.JetDeriv public import Physlib.Relativity.IsLorentzDeriv /-! @@ -24,10 +24,10 @@ the boost-weight machinery. - `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. +- `LocalGaugeFieldAlgebra.repLorentzGroup` : the Lorentz action on the jet algebra. +- `LocalGaugeFieldAlgebra.repLorentzGroup_jetDeriv` : the total derivative is a Lorentz vector. +- `LocalGaugeFieldAlgebra.complexRepLorentzGroup` : the action on the complexification. +- `LocalGaugeFieldAlgebra.instIsLorentzDeriv` : the `Lorentz.IsLorentzDeriv` instance. ## iii. Table of contents @@ -118,7 +118,7 @@ lemma JetComponentSpace.repLorentzGroup_jetDeriv (Λ : SL(2,ℂ)) (μ : Fin 1 end GaugeBoson -namespace GaugeJetAlgebra +namespace LocalGaugeFieldAlgebra /-! @@ -129,7 +129,7 @@ namespace GaugeJetAlgebra 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 +noncomputable def repLorentzGroup : Representation ℝ SL(2,ℂ) (LocalGaugeFieldAlgebra 𝔤) where toFun Λ := (SymmetricAlgebra.map ((GaugeBoson.JetComponentSpace.repLorentzGroup 𝔤) Λ)).toLinearMap map_one' := by @@ -138,16 +138,16 @@ noncomputable def repLorentzGroup : Representation ℝ SL(2,ℂ) (GaugeJetAlgebr simp only [map_mul, Module.End.mul_eq_comp, ← SymmetricAlgebra.map_comp_map, AlgHom.comp_toLinearMap] -lemma repLorentzGroup_apply (Λ : SL(2,ℂ)) (x : (GaugeJetAlgebra 𝔤)) : +lemma repLorentzGroup_apply (Λ : SL(2,ℂ)) (x : (LocalGaugeFieldAlgebra 𝔤)) : (repLorentzGroup 𝔤) Λ x = SymmetricAlgebra.map ((GaugeBoson.JetComponentSpace.repLorentzGroup 𝔤) Λ) x := rfl @[simp] lemma repLorentzGroup_apply_one (Λ : SL(2,ℂ)) : - (repLorentzGroup 𝔤) Λ (1 : (GaugeJetAlgebra 𝔤)) = 1 := by + (repLorentzGroup 𝔤) Λ (1 : (LocalGaugeFieldAlgebra 𝔤)) = 1 := by simp [repLorentzGroup_apply] -lemma repLorentzGroup_apply_mul (Λ : SL(2,ℂ)) (x y : (GaugeJetAlgebra 𝔤)) : +lemma repLorentzGroup_apply_mul (Λ : SL(2,ℂ)) (x y : (LocalGaugeFieldAlgebra 𝔤)) : (repLorentzGroup 𝔤) Λ (x * y) = (repLorentzGroup 𝔤) Λ x * (repLorentzGroup 𝔤) Λ y := by simp [repLorentzGroup_apply] @@ -164,7 +164,7 @@ lemma repLorentzGroup_ι (Λ : SL(2,ℂ)) (v : (GaugeBoson.JetComponentSpace -/ /-- **The total derivative on the gauge-boson jet algebra is a Lorentz vector.** -/ -lemma repLorentzGroup_jetDeriv (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) (x : (GaugeJetAlgebra 𝔤)) : +lemma repLorentzGroup_jetDeriv (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) (x : (LocalGaugeFieldAlgebra 𝔤)) : (repLorentzGroup 𝔤) Λ ((jetDeriv 𝔤) μ x) = ∑ a, ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ) • (jetDeriv 𝔤) a ((repLorentzGroup 𝔤) Λ x) := by @@ -196,7 +196,7 @@ lemma repLorentzGroup_jetDeriv (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) (x : (Gau variable (𝔤) in /-- The Lorentz action on the complexified gauge-boson jet algebra, by base change. -/ noncomputable def complexRepLorentzGroup : - Representation ℂ SL(2,ℂ) (ℂ ⊗[ℝ] (GaugeJetAlgebra 𝔤)) where + Representation ℂ SL(2,ℂ) (ℂ ⊗[ℝ] (LocalGaugeFieldAlgebra 𝔤)) where toFun Λ := LinearMap.baseChange ℂ ((repLorentzGroup 𝔤) Λ) map_one' := by rw [map_one, Module.End.one_eq_id, LinearMap.baseChange_id, Module.End.one_eq_id] @@ -204,10 +204,10 @@ noncomputable def complexRepLorentzGroup : 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 𝔤)) : +lemma complexRepLorentzGroup_tmul (Λ : SL(2,ℂ)) (z : ℂ) (x : (LocalGaugeFieldAlgebra 𝔤)) : (complexRepLorentzGroup 𝔤) Λ (z ⊗ₜ[ℝ] x) = z ⊗ₜ[ℝ] (repLorentzGroup 𝔤) Λ x := rfl -lemma complexRepLorentzGroup_apply_mul (Λ : SL(2,ℂ)) (x y : ℂ ⊗[ℝ] (GaugeJetAlgebra 𝔤)) : +lemma complexRepLorentzGroup_apply_mul (Λ : SL(2,ℂ)) (x y : ℂ ⊗[ℝ] (LocalGaugeFieldAlgebra 𝔤)) : (complexRepLorentzGroup 𝔤) Λ (x * y) = (complexRepLorentzGroup 𝔤) Λ x * (complexRepLorentzGroup 𝔤) Λ y := by induction x using TensorProduct.induction_on with @@ -224,7 +224,7 @@ lemma complexRepLorentzGroup_apply_mul (Λ : SL(2,ℂ)) (x y : ℂ ⊗[ℝ] (Gau /-- **The complexified total derivative is a Lorentz vector.** -/ lemma complexRepLorentzGroup_jetDeriv (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) - (x : ℂ ⊗[ℝ] (GaugeJetAlgebra 𝔤)) : + (x : ℂ ⊗[ℝ] (LocalGaugeFieldAlgebra 𝔤)) : (complexRepLorentzGroup 𝔤) Λ ((complexJetDeriv 𝔤) μ x) = ∑ a, (((Lorentz.SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • (complexJetDeriv 𝔤) a ((complexRepLorentzGroup 𝔤) Λ x) := by @@ -309,5 +309,5 @@ lemma complexRepLorentzGroup_one_tmul_ofA (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3 = algebraMap ℝ ℂ ((Lorentz.SL2C.toLorentzGroup Λ).1 a μ) from rfl, algebraMap_smul] -end GaugeJetAlgebra +end LocalGaugeFieldAlgebra diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/MassDim.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeFieldAlgebra/MassDim.lean similarity index 90% rename from Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/MassDim.lean rename to Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeFieldAlgebra/MassDim.lean index 5f494b911..2af249d26 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/MassDim.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeFieldAlgebra/MassDim.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.JetDeriv +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeFieldAlgebra.JetDeriv /-! # Mass dimension on the gauge-boson jet algebra @@ -23,10 +23,10 @@ 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|`. +- `LocalGaugeFieldAlgebra.massWeightScale` : the mass-weight scaling. +- `LocalGaugeFieldAlgebra.massWeightScale_ofA` : the gauge field carries mass weight two. +- `LocalGaugeFieldAlgebra.massWeightScale_jetDeriv` : a derivative adds mass weight two. +- `LocalGaugeFieldAlgebra.massWeightScale_iteratedJetDeriv` : `∂_s` adds mass weight `2 |s|`. ## iii. Table of contents @@ -84,7 +84,7 @@ lemma JetComponentSpace.massWeightScale_jetDeriv (c : ℝ) (μ : Fin 1 ⊕ Fin 3 end GaugeBoson -namespace GaugeJetAlgebra +namespace LocalGaugeFieldAlgebra /-! @@ -96,7 +96,8 @@ 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 𝔤) := +noncomputable def massWeightScale (c : ℝ) : + (LocalGaugeFieldAlgebra 𝔤) →ₐ[ℝ] (LocalGaugeFieldAlgebra 𝔤) := SymmetricAlgebra.map ((GaugeBoson.JetComponentSpace.massWeightScale 𝔤) c) @[simp] @@ -119,7 +120,7 @@ lemma massWeightScale_ofA (c : ℝ) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 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 𝔤)) : +lemma massWeightScale_jetDeriv (c : ℝ) (μ : Fin 1 ⊕ Fin 3) (x : (LocalGaugeFieldAlgebra 𝔤)) : (massWeightScale 𝔤) c ((jetDeriv 𝔤) μ x) = c ^ 2 • (jetDeriv 𝔤) μ ((massWeightScale 𝔤) c x) := by induction x using SymmetricAlgebra.induction with @@ -136,7 +137,7 @@ lemma massWeightScale_jetDeriv (c : ℝ) (μ : Fin 1 ⊕ Fin 3) (x : (GaugeJetAl /-- **The iterated derivative `∂_s` adds mass weight `2 |s|`.** -/ lemma massWeightScale_iteratedJetDeriv (c : ℝ) (s : Multiset (Fin 1 ⊕ Fin 3)) - (x : (GaugeJetAlgebra 𝔤)) : + (x : (LocalGaugeFieldAlgebra 𝔤)) : (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 @@ -150,5 +151,5 @@ lemma massWeightScale_iteratedJetDeriv (c : ℝ) (s : Multiset (Fin 1 ⊕ Fin 3) rw [Multiset.card_cons] ring -end GaugeJetAlgebra +end LocalGaugeFieldAlgebra diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/MassWeightPoly.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeFieldAlgebra/MassWeightPoly.lean similarity index 74% rename from Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/MassWeightPoly.lean rename to Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeFieldAlgebra/MassWeightPoly.lean index 79080b412..e3148672e 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/GaugeJetAlgebra/MassWeightPoly.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeFieldAlgebra/MassWeightPoly.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.JetDeriv +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeFieldAlgebra.JetDeriv /-! # The mass-weight polynomial on the gauge-boson jet algebra @@ -16,21 +16,21 @@ grading: the generator `∂_s A_μ^φ` is sent to `X ^ (2 + 2 |s|)` times itself carrying mass weight two and each derivative two more. The gauge-boson jet algebra is real, but the jet algebra of the Standard Model uses its -complexification `ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤`. So the grading is built in two steps: +complexification `ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤`. So the grading is built in two steps: the universal property of the symmetric algebra gives a real algebra map landing in -`Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤)` — a commutative target, so there is no +`Polynomial (ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤)` — a commutative target, so there is no side condition — and the universal property of the tensor product extends it along the scalars to `complexMassWeightPoly`, which is what the ambient theory sees. ## ii. Key results -- `GaugeJetAlgebra.massWeightPoly` : the mass-weight grading on the real jet algebra. -- `GaugeJetAlgebra.massWeightPoly_iteratedJetDeriv_ofA` : `∂_s A_μ^φ` is a monomial +- `LocalGaugeFieldAlgebra.massWeightPoly` : the mass-weight grading on the real jet algebra. +- `LocalGaugeFieldAlgebra.massWeightPoly_iteratedJetDeriv_ofA` : `∂_s A_μ^φ` is a monomial eigenvector of weight `2 + 2 |s|`. -- `GaugeJetAlgebra.complexMassWeightPoly` : the grading on the complexification. -- `GaugeJetAlgebra.complexMassWeightPoly_tmul_iteratedJetDeriv_ofA` : the generator lemma +- `LocalGaugeFieldAlgebra.complexMassWeightPoly` : the grading on the complexification. +- `LocalGaugeFieldAlgebra.complexMassWeightPoly_tmul_iteratedJetDeriv_ofA` : the generator lemma on the complexification. -- `GaugeJetAlgebra.complexMassWeightPoly_eval_one` : setting the variable to one recovers +- `LocalGaugeFieldAlgebra.complexMassWeightPoly_eval_one` : setting the variable to one recovers the element. ## iii. Table of contents @@ -48,7 +48,7 @@ set_option linter.unusedSectionVars false variable {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] -namespace GaugeJetAlgebra +namespace LocalGaugeFieldAlgebra open TensorProduct @@ -61,18 +61,18 @@ open TensorProduct /-- The monomial map into polynomials over the complexified jet algebra, as a map of `ℝ`-modules rather than of modules over the complexified jet algebra. -/ noncomputable def monomialₗ (n : ℕ) : - (ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤) →ₗ[ℝ] - Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤) := + (ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤) →ₗ[ℝ] + Polynomial (ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤) := (Polynomial.monomial n).restrictScalars ℝ @[simp] -lemma monomialₗ_apply (n : ℕ) (x : ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤) : +lemma monomialₗ_apply (n : ℕ) (x : ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤) : (monomialₗ (𝔤 := 𝔤)) n x = Polynomial.monomial n x := rfl /-- A component function, viewed inside the complexified jet algebra: the generator `∂_s A_μ^φ` tensored with the scalar one. -/ noncomputable def ιComplex : - (GaugeBoson.JetComponentSpace 𝔤) →ₗ[ℝ] ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤 := + (GaugeBoson.JetComponentSpace 𝔤) →ₗ[ℝ] ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤 := Algebra.TensorProduct.includeRight.toLinearMap.comp (SymmetricAlgebra.ι ℝ (GaugeBoson.JetComponentSpace 𝔤)) @@ -86,7 +86,7 @@ lemma ιComplex_apply (x : (GaugeBoson.JetComponentSpace 𝔤)) : derivative symbols. -/ noncomputable def jetComponentPoly : (GaugeBoson.JetComponentSpace 𝔤) →ₗ[ℝ] - Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤) := + Polynomial (ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤) := TensorProduct.lift (DerivAlgebraReal.basisMultiset.constr ℝ fun s => (monomialₗ (2 + 2 * Multiset.card s)).comp (ιComplex.comp (TensorProduct.mk ℝ DerivAlgebraReal @@ -112,10 +112,10 @@ lemma jetComponentPoly_basisMultiset_tmul (s : Multiset (Fin 1 ⊕ Fin 3)) a generator of mass weight `n` to `X ^ n` times its image in the complexification. It needs no side condition because the target is commutative. -/ noncomputable def massWeightPoly : - GaugeJetAlgebra 𝔤 →ₐ[ℝ] - Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤) := by + LocalGaugeFieldAlgebra 𝔤 →ₐ[ℝ] + Polynomial (ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤) := by exact SymmetricAlgebra.lift (R := ℝ) (M := (GaugeBoson.JetComponentSpace 𝔤)) - (A := Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤)) jetComponentPoly + (A := Polynomial (ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤)) jetComponentPoly /-- On a component function the mass-weight polynomial is the component-function map. -/ @[simp] @@ -128,20 +128,20 @@ lemma massWeightPoly_ι (x : (GaugeBoson.JetComponentSpace 𝔤)) : @[simp] lemma massWeightPoly_iteratedJetDeriv_ofA (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : - (massWeightPoly (𝔤 := 𝔤)) (GaugeJetAlgebra.iteratedJetDeriv 𝔤 s - (GaugeJetAlgebra.ofA 𝔤 μ φ)) = + (massWeightPoly (𝔤 := 𝔤)) (LocalGaugeFieldAlgebra.iteratedJetDeriv 𝔤 s + (LocalGaugeFieldAlgebra.ofA 𝔤 μ φ)) = Polynomial.monomial (2 + 2 * Multiset.card s) ((1 : ℂ) ⊗ₜ[ℝ] - GaugeJetAlgebra.iteratedJetDeriv 𝔤 s - (GaugeJetAlgebra.ofA 𝔤 μ φ)) := by - rw [GaugeJetAlgebra.iteratedJetDeriv_ofA, massWeightPoly_ι, jetComponentPoly_basisMultiset_tmul, - ιComplex_apply] + LocalGaugeFieldAlgebra.iteratedJetDeriv 𝔤 s + (LocalGaugeFieldAlgebra.ofA 𝔤 μ φ)) := by + rw [LocalGaugeFieldAlgebra.iteratedJetDeriv_ofA, massWeightPoly_ι, + jetComponentPoly_basisMultiset_tmul, ιComplex_apply] /-- The undifferentiated gauge field has mass weight two — mass dimension one. -/ lemma massWeightPoly_ofA (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : - (massWeightPoly (𝔤 := 𝔤)) (GaugeJetAlgebra.ofA 𝔤 μ φ) = - Polynomial.monomial 2 ((1 : ℂ) ⊗ₜ[ℝ] GaugeJetAlgebra.ofA 𝔤 μ φ) := by + (massWeightPoly (𝔤 := 𝔤)) (LocalGaugeFieldAlgebra.ofA 𝔤 μ φ) = + Polynomial.monomial 2 ((1 : ℂ) ⊗ₜ[ℝ] LocalGaugeFieldAlgebra.ofA 𝔤 μ φ) := by have h := massWeightPoly_iteratedJetDeriv_ofA (𝔤 := 𝔤) (0 : Multiset (Fin 1 ⊕ Fin 3)) μ φ - rwa [GaugeJetAlgebra.iteratedJetDeriv_zero, LinearMap.id_apply, Multiset.card_zero, + rwa [LocalGaugeFieldAlgebra.iteratedJetDeriv_zero, LinearMap.id_apply, Multiset.card_zero, Nat.mul_zero, Nat.add_zero] at h @@ -155,19 +155,19 @@ lemma massWeightPoly_ofA (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : map obtained from the real one by extending the scalars, the grading the jet algebra of the Standard Model sees on its gauge sector. -/ noncomputable def complexMassWeightPoly : - (ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤) →ₐ[ℂ] - Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤) := by + (ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤) →ₐ[ℂ] + Polynomial (ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤) := by refine Algebra.TensorProduct.lift (R := ℝ) (S := ℂ) (A := ℂ) - (B := GaugeJetAlgebra 𝔤) - (C := Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤)) - (Algebra.ofId ℂ (Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤))) massWeightPoly ?_ + (B := LocalGaugeFieldAlgebra 𝔤) + (C := Polynomial (ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤)) + (Algebra.ofId ℂ (Polynomial (ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤))) massWeightPoly ?_ intro x y - exact Commute.all (S := Polynomial (ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤)) _ _ + exact Commute.all (S := Polynomial (ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤)) _ _ /-- On a pure tensor the complexified grading is the scalar times the real grading. -/ -lemma complexMassWeightPoly_tmul (z : ℂ) (x : GaugeJetAlgebra 𝔤) : +lemma complexMassWeightPoly_tmul (z : ℂ) (x : LocalGaugeFieldAlgebra 𝔤) : (complexMassWeightPoly (𝔤 := 𝔤)) (z ⊗ₜ[ℝ] x) = - Polynomial.C (z ⊗ₜ[ℝ] (1 : GaugeJetAlgebra 𝔤)) * massWeightPoly x := by + Polynomial.C (z ⊗ₜ[ℝ] (1 : LocalGaugeFieldAlgebra 𝔤)) * massWeightPoly x := by rw [complexMassWeightPoly, Algebra.TensorProduct.lift_tmul] congr 1 @@ -177,11 +177,11 @@ set_option maxHeartbeats 400000 in @[simp] lemma complexMassWeightPoly_tmul_iteratedJetDeriv_ofA (z : ℂ) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : - (complexMassWeightPoly (𝔤 := 𝔤)) (z ⊗ₜ[ℝ] GaugeJetAlgebra.iteratedJetDeriv 𝔤 s - (GaugeJetAlgebra.ofA 𝔤 μ φ)) = + (complexMassWeightPoly (𝔤 := 𝔤)) (z ⊗ₜ[ℝ] LocalGaugeFieldAlgebra.iteratedJetDeriv 𝔤 s + (LocalGaugeFieldAlgebra.ofA 𝔤 μ φ)) = Polynomial.monomial (2 + 2 * Multiset.card s) (z ⊗ₜ[ℝ] - GaugeJetAlgebra.iteratedJetDeriv 𝔤 s - (GaugeJetAlgebra.ofA 𝔤 μ φ)) := by + LocalGaugeFieldAlgebra.iteratedJetDeriv 𝔤 s + (LocalGaugeFieldAlgebra.ofA 𝔤 μ φ)) := by rw [complexMassWeightPoly_tmul, massWeightPoly_iteratedJetDeriv_ofA, ← Polynomial.monomial_zero_left, Polynomial.monomial_mul_monomial, Nat.zero_add, Algebra.TensorProduct.tmul_mul_tmul, mul_one, one_mul] @@ -217,14 +217,14 @@ lemma jetComponentPoly_eval_one (x : (GaugeBoson.JetComponentSpace 𝔤)) : set_option maxHeartbeats 400000 in /-- Setting the formal variable to one recovers the original element, viewed in the complexification. -/ -lemma massWeightPoly_eval_one (x : GaugeJetAlgebra 𝔤) : +lemma massWeightPoly_eval_one (x : LocalGaugeFieldAlgebra 𝔤) : ((massWeightPoly (𝔤 := 𝔤)) x).eval 1 = Algebra.TensorProduct.includeRight (R := ℝ) (A := ℂ) - (B := GaugeJetAlgebra 𝔤) x := by - have h : (Polynomial.eval₂AlgHom (AlgHom.id ℝ (ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤)) 1 + (B := LocalGaugeFieldAlgebra 𝔤) x := by + have h : (Polynomial.eval₂AlgHom (AlgHom.id ℝ (ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤)) 1 fun b => Commute.one_right b).comp massWeightPoly = (Algebra.TensorProduct.includeRight : - GaugeJetAlgebra 𝔤 →ₐ[ℝ] ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤) := by + LocalGaugeFieldAlgebra 𝔤 →ₐ[ℝ] ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤) := by refine SymmetricAlgebra.algHom_ext (LinearMap.ext fun y => ?_) simp change Polynomial.eval₂ (RingHom.id _) 1 (jetComponentPoly y) = _ @@ -234,7 +234,7 @@ lemma massWeightPoly_eval_one (x : GaugeJetAlgebra 𝔤) : /-- Setting the formal variable to one recovers the original element of the complexified jet algebra: the mass-weight pieces sum back to it. -/ -lemma complexMassWeightPoly_eval_one (y : ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤) : +lemma complexMassWeightPoly_eval_one (y : ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤) : ((complexMassWeightPoly (𝔤 := 𝔤)) y).eval 1 = y := by induction y using TensorProduct.induction_on with | zero => rw [map_zero, Polynomial.eval_zero] @@ -250,4 +250,4 @@ lemma complexMassWeightPoly_injective : Function.Injective (complexMassWeightPol intro x y h rw [← complexMassWeightPoly_eval_one x, ← complexMassWeightPoly_eval_one y, h] -end GaugeJetAlgebra +end LocalGaugeFieldAlgebra diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Basic.lean index 510f91b75..9ad03ca96 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Basic.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.GaugeField +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeFieldAlgebra.GaugeField /-! # Realizations of the gauge-boson jet algebra @@ -14,7 +14,7 @@ public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebr An algebra `B` carries the gauge bosons of a gauge theory when the gauge-boson jet algebra, the universal algebra on the symbols `∂_s A_μ^φ`, maps into it compatibly with the actions of the jet gauge group and of the Lorentz group. That is the structure -`GaugeAlgebraRealization`: an algebra map `ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤 →ₐ[ℂ] B` equivariant for +`GaugeAlgebraRealization`: an algebra map `ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤 →ₐ[ℂ] B` equivariant for the two groups, together with the demands that both groups act on the whole of `B` by algebra endomorphisms. It is the gauge-boson part of the Standard Model's `AlgebraRealization`, for any local-gauge-data package `jets`, and every result about a @@ -25,7 +25,7 @@ the map, `GaugeAlgebraRealization.A`, and their transformation laws are the jet own laws pushed along it. The base case is the jet algebra realized in itself, `GaugeAlgebraRealization.id`: its Lorentz law is that of a Lorentz derivative, and its gauge law is the substitution action of the jet gauge group constructed in -`GaugeJetAlgebra.GaugeAction`. +`LocalGaugeFieldAlgebra.GaugeAction`. ## ii. The physics @@ -86,7 +86,7 @@ structure GaugeAlgebraRealization (jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J) (B where /-- The algebra map out of the gauge-boson jet algebra: it places the gauge-boson symbols, and every polynomial expression in them, inside `B`. -/ - toAlgHom : ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤 →ₐ[ℂ] B + toAlgHom : ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤 →ₐ[ℂ] B /-- The gauge-field symbols `∂_s A_μ^φ` of `B`. They are determined by the map, as the images of the jet algebra's symbols (`A_eq`), and are recorded as data so that the theory can treat them as opaque symbols and a concrete realization can present the @@ -94,13 +94,13 @@ structure GaugeAlgebraRealization (jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J) (B A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B /-- The symbols are the images of the jet algebra's symbols. -/ A_eq : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), - A s μ φ = toAlgHom (GaugeJetAlgebra.gaugeField 𝔤 s μ φ) + A s μ φ = toAlgHom (LocalGaugeFieldAlgebra.gaugeField 𝔤 s μ φ) /-- The map is equivariant for the jet gauge group. -/ - map_repJet : ∀ (U : GJ) (x : ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤), - toAlgHom (GaugeJetAlgebra.complexRepJet jets U x) = repJet U (toAlgHom x) + map_repJet : ∀ (U : GJ) (x : ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤), + toAlgHom (LocalGaugeFieldAlgebra.complexRepJet jets U x) = repJet U (toAlgHom x) /-- The map is equivariant for the Lorentz group. -/ - map_repLorentz : ∀ (Λ : SL(2,ℂ)) (x : ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤), - toAlgHom (GaugeJetAlgebra.complexRepLorentzGroup 𝔤 Λ x) = repLorentz Λ (toAlgHom x) + map_repLorentz : ∀ (Λ : SL(2,ℂ)) (x : ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤), + toAlgHom (LocalGaugeFieldAlgebra.complexRepLorentzGroup 𝔤 Λ x) = repLorentz Λ (toAlgHom x) /-- The jet gauge group acts on the whole of `B` by algebra endomorphisms. -/ repJet_mul : ∀ (U : GJ) (b₁ b₂ : B), repJet U (b₁ * b₂) = repJet U b₁ * repJet U b₂ /-- The Lorentz group acts on the whole of `B` by algebra endomorphisms. -/ @@ -109,14 +109,14 @@ structure GaugeAlgebraRealization (jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J) (B namespace GaugeAlgebraRealization -open GaugeJetAlgebra +open LocalGaugeFieldAlgebra variable {B : Type} [Ring B] [Algebra ℂ B] {repJet : Representation ℂ GJ B} {repLorentz : Representation ℂ SL(2,ℂ) B} variable (jets) in /-- The gauge-boson jet algebra realized in itself, by the identity. -/ -noncomputable def id : GaugeAlgebraRealization jets (ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤) +noncomputable def id : GaugeAlgebraRealization jets (ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤) (complexRepJet jets) (complexRepLorentzGroup 𝔤) where toAlgHom := AlgHom.id ℂ _ A := gaugeField 𝔤 diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/FieldStrength.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/FieldStrength.lean index 353ec84ce..f83e7ec91 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/FieldStrength.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/FieldStrength.lean @@ -35,17 +35,16 @@ derivative order simultaneously (`repGauge_fieldStrength`, set_option linter.unusedSectionVars false open Matrix MatrixGroups TensorProduct -variable {B : Type} [Ring B] [Algebra ℂ B] +variable {B : Type} [Ring B] variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] variable {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] variable {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} namespace GaugeAlgebraRealization -variable {repLorentz : Representation ℂ SL(2,ℂ) B} -variable {repGauge : Representation ℂ GJ B} -variable {A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B} -variable (h : GaugeAlgebraRealization jets B repGauge repLorentz) +section RealScalars + +variable [Module ℝ B] [SMulCommClass ℝ B B] [IsScalarTower ℝ B 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 @@ -142,6 +141,25 @@ lemma fieldStrength_swap rw [fieldStrength, fieldStrength, commutatorFam_swap A hA μ ν s] abel +/-- The field strength is natural in the algebra: a multiplicative linear map carries the + field strength of a family to the field strength of its image. -/ +lemma fieldStrength_map {B' : Type} [Ring B'] [Module ℝ B'] [SMulCommClass ℝ B' B'] + [IsScalarTower ℝ B' B'] (Φ : B →ₗ[ℝ] B') (hΦ : ∀ b₁ b₂, Φ (b₁ * b₂) = Φ b₁ * Φ b₂) + (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B) + (μ ν : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : + fieldStrength (fun p ρ => Φ ∘ₗ A p ρ) μ ν s = Φ ∘ₗ fieldStrength A μ ν s := by + rw [fieldStrength, fieldStrength, commutatorFam_map Φ hΦ, LinearMap.comp_add, + LinearMap.comp_sub] + +end RealScalars + +section ComplexScalars + +variable [Algebra ℂ B] {repLorentz : Representation ℂ SL(2,ℂ) B} + {repGauge : Representation ℂ GJ B} + {A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B} + (h : GaugeAlgebraRealization jets B repGauge repLorentz) + /-- **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 @@ -243,5 +261,7 @@ lemma repGauge_fieldStrength_zero rw [h.repGauge_fieldStrength U 0 μ ν φ, Multiset.antidiagonal_zero, Multiset.map_singleton, Multiset.sum_singleton] +end ComplexScalars + end GaugeAlgebraRealization diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/GaugeLaw.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/GaugeLaw.lean index 721362109..c2f352894 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/GaugeLaw.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/GaugeLaw.lean @@ -45,7 +45,7 @@ covariant families built later. set_option linter.unusedSectionVars false open Matrix MatrixGroups TensorProduct MvPowerSeries -variable {B : Type} [Ring B] [Algebra ℂ B] +variable {B : Type} [Ring B] variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] variable {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] variable {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} @@ -55,10 +55,9 @@ open Lorentz namespace GaugeAlgebraRealization -variable {repLorentz : Representation ℂ SL(2,ℂ) B} -variable {repGauge : Representation ℂ GJ B} -variable {A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B} -variable (h : GaugeAlgebraRealization jets B repGauge repLorentz) +section RealScalars + +variable [Module ℝ B] [SMulCommClass ℝ B B] [IsScalarTower ℝ B B] /-- The canonical equivalence, through finite-dimensional duality, between algebra-valued fields `B ⊗ 𝔤` and their component families `φ ↦ A^φ`: the element @@ -90,6 +89,15 @@ noncomputable def commutator (μ ν : Fin 1 ⊕ Fin 3) : Module.Dual ℝ 𝔤 →ₗ[ℝ] B := dualPairEquiv (tensorBracket (dualPairEquiv.symm (A 0 μ)) (dualPairEquiv.symm (A 0 ν))) +end RealScalars + +section ComplexScalars + +variable [Algebra ℂ B] {repLorentz : Representation ℂ SL(2,ℂ) B} + {repGauge : Representation ℂ GJ B} + {A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B} + (h : GaugeAlgebraRealization jets B repGauge repLorentz) + /-- 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. -/ @@ -124,12 +132,18 @@ lemma repGauge_deriv_apply refine h.trans ?_ abel +end ComplexScalars + /-! ## Pure-tensor computations for `dualPairEquiv` and `tensorBracket` -/ +section RealScalars + +variable [Module ℝ B] [SMulCommClass ℝ B B] [IsScalarTower ℝ B B] + @[simp] lemma dualPairEquiv_tmul (b : B) (a : 𝔤) (φ : Module.Dual ℝ 𝔤) : dualPairEquiv (b ⊗ₜ[ℝ] a) φ = φ a • b := by @@ -157,11 +171,6 @@ lemma dualPairEquiv_map_right (T : 𝔤 →ₗ[ℝ] 𝔤) | 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 @@ -234,12 +243,26 @@ lemma tensorBracket_one_left (c : 𝔤) (t : B ⊗[ℝ] 𝔤) : | tmul b a => simp | add x y hx hy => simp [hx, hy] +end RealScalars + /-! ## The gauge transformation of the commutator -/ +section ComplexScalars + +variable [Algebra ℂ B] {repLorentz : Representation ℂ SL(2,ℂ) B} + {repGauge : Representation ℂ GJ B} + {A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B} + (h : GaugeAlgebraRealization jets B repGauge repLorentz) + +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] + 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 @@ -371,12 +394,18 @@ lemma repGauge_deriv_deriv_apply refine h.trans ?_ abel +end ComplexScalars + /-! ## The bracket of general component families -/ +section RealScalars + +variable [Module ℝ B] [SMulCommClass ℝ B B] [IsScalarTower ℝ B B] + /-- 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. -/ @@ -412,6 +441,14 @@ 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] +lemma bracketFam_smul_left (c : ℝ) (f g : Module.Dual ℝ 𝔤 →ₗ[ℝ] B) : + bracketFam (c • f) g = c • bracketFam f g := by + simp only [bracketFam, map_smul, LinearMap.smul_apply] + +lemma bracketFam_smul_right (c : ℝ) (f g : Module.Dual ℝ 𝔤 →ₗ[ℝ] B) : + bracketFam f (c • g) = c • bracketFam f g := by + simp only [bracketFam, map_smul] + /-- 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. -/ @@ -446,6 +483,35 @@ lemma bracketFam_apply_eq_sum (f g : Module.Dual ℝ 𝔤 →ₗ[ℝ] B) simp [tensorBracket_tmul, dualPairEquiv_tmul] rw [Finset.sum_comm] +/-- The bracket of families is natural in the algebra: a multiplicative linear map carries + the bracket of two families to the bracket of their images. -/ +lemma bracketFam_map {B' : Type} [Ring B'] [Module ℝ B'] [SMulCommClass ℝ B' B'] + [IsScalarTower ℝ B' B'] (Φ : B →ₗ[ℝ] B') (hΦ : ∀ b₁ b₂, Φ (b₁ * b₂) = Φ b₁ * Φ b₂) + (f g : Module.Dual ℝ 𝔤 →ₗ[ℝ] B) : + bracketFam (Φ ∘ₗ f) (Φ ∘ₗ g) = Φ ∘ₗ bracketFam f g := by + refine LinearMap.ext fun φ => ?_ + rw [LinearMap.comp_apply, bracketFam_apply_eq_sum, bracketFam_apply_eq_sum, map_sum] + refine Finset.sum_congr rfl fun j _ => ?_ + rw [map_sum] + refine Finset.sum_congr rfl fun k _ => ?_ + rw [map_smul, hΦ] + rfl + +/-- The derived commutator family is natural in the algebra. -/ +lemma commutatorFam_map {B' : Type} [Ring B'] [Module ℝ B'] [SMulCommClass ℝ B' B'] + [IsScalarTower ℝ B' B'] (Φ : B →ₗ[ℝ] B') (hΦ : ∀ b₁ b₂, Φ (b₁ * b₂) = Φ b₁ * Φ b₂) + (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B) + (μ ν : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : + commutatorFam (fun p ρ => Φ ∘ₗ A p ρ) μ ν s = Φ ∘ₗ commutatorFam A μ ν s := by + refine LinearMap.ext fun φ => ?_ + rw [LinearMap.comp_apply, commutatorFam, commutatorFam, Multiset.sum_linearMap_apply, + Multiset.sum_linearMap_apply, Multiset.map_map, Multiset.map_map, map_multiset_sum, + Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p _ => ?_) + simp only [Function.comp_apply] + rw [bracketFam_map Φ hΦ] + rfl + /-- 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) : @@ -478,6 +544,17 @@ lemma tensorBracket_map_left_derivation (Δ : B →ₗ[ℝ] B) simp only [map_add, LinearMap.add_apply, hx, hy] abel +/-- The bracket of families under a derivation of the algebra: the Leibniz rule, in + family form. -/ +lemma bracketFam_derivation (Δ : B →ₗ[ℝ] B) + (hΔ : ∀ b₁ b₂, Δ (b₁ * b₂) = Δ b₁ * b₂ + b₁ * Δ b₂) (f g : Module.Dual ℝ 𝔤 →ₗ[ℝ] B) : + Δ ∘ₗ bracketFam f g = bracketFam (Δ ∘ₗ f) g + bracketFam f (Δ ∘ₗ g) := by + refine LinearMap.ext fun φ => ?_ + show Δ (dualPairEquiv (tensorBracket (dualPairEquiv.symm f) (dualPairEquiv.symm g)) φ) = _ + rw [← dualPairEquiv_map_left, tensorBracket_map_left_derivation Δ hΔ, map_add, + LinearMap.add_apply, ← symm_comp_left, ← symm_comp_left] + rfl + /-- `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 @@ -523,6 +600,15 @@ lemma bracketFam_dualMap_derivation (T₀ T₁ : 𝔤 →ₗ[ℝ] 𝔤) dualPairEquiv_map_right] rfl +end RealScalars + +section ComplexScalars + +variable [Algebra ℂ B] {repLorentz : Representation ℂ SL(2,ℂ) B} + {repGauge : Representation ℂ GJ B} + {A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B} + (h : GaugeAlgebraRealization jets B repGauge repLorentz) + include h in set_option maxHeartbeats 1000000 in /-- The gauge transformation of the bracket of two component families with affine @@ -632,6 +718,7 @@ lemma commutatorFam_mem · exact hle ▸ Multiset.card_le_card (Multiset.le_add_right _ _) · exact hle ▸ Multiset.card_le_card (Multiset.le_add_left _ _) +end ComplexScalars /-! @@ -639,6 +726,10 @@ lemma commutatorFam_mem -/ +section RealScalars + +variable [Module ℝ B] [SMulCommClass ℝ B B] [IsScalarTower ℝ B B] + lemma bracketFam_zero_left (g : Module.Dual ℝ 𝔤 →ₗ[ℝ] B) : bracketFam 0 g = 0 := by simp [bracketFam] @@ -661,6 +752,16 @@ lemma bracketFam_sum_right (f : Module.Dual ℝ 𝔤 →ₗ[ℝ] B) | empty => simp [bracketFam_zero_right] | cons g S ih => simp [bracketFam_add_right, ih] +lemma bracketFam_finset_sum_left {ι : Type*} (S : Finset ι) + (f : ι → Module.Dual ℝ 𝔤 →ₗ[ℝ] B) (g : Module.Dual ℝ 𝔤 →ₗ[ℝ] B) : + bracketFam (∑ i ∈ S, f i) g = ∑ i ∈ S, bracketFam (f i) g := by + simp only [bracketFam, map_sum, LinearMap.sum_apply] + +lemma bracketFam_finset_sum_right {ι : Type*} (S : Finset ι) + (f : Module.Dual ℝ 𝔤 →ₗ[ℝ] B) (g : ι → Module.Dual ℝ 𝔤 →ₗ[ℝ] B) : + bracketFam f (∑ i ∈ S, g i) = ∑ i ∈ S, bracketFam f (g i) := by + simp only [bracketFam, map_sum] + /-! ## The bracket of families against the adjoint coefficients @@ -721,12 +822,21 @@ lemma bracketFam_adjointDualCoeff (U : GJ) (x : Multiset (Fin 1 ⊕ Fin 3)) rw [← symm_comp_right, ← symm_comp_right, hcoeff p.1, hcoeff p.2] rfl +end RealScalars + /-! ## The gauge transformation of iterated derivatives -/ +section ComplexScalars + +variable [Algebra ℂ B] {repLorentz : Representation ℂ SL(2,ℂ) B} + {repGauge : Representation ℂ GJ B} + {A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B} + (h : GaugeAlgebraRealization jets B repGauge repLorentz) + /-- The `κ ::ₘ s` case of `gauge_apply_deriv` with the extra derivative traced through: the Leibniz splittings where `κ` stays a derivative, minus (by `LocalGaugeData.adjointDualCoeff_cons`) the splittings where `κ` hits the adjoint — an `ad` of the @@ -865,5 +975,7 @@ lemma repGauge_commutatorFam h.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 ComplexScalars + end GaugeAlgebraRealization diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Symmetrized.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Symmetrized.lean index b1f08c3d2..28ab4bc3b 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Symmetrized.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Symmetrized.lean @@ -75,17 +75,17 @@ set_option linter.unusedSectionVars false open Matrix MatrixGroups TensorProduct MvPowerSeries -variable {B : Type} [Ring B] [Algebra ℂ B] +variable {B : Type} [Ring B] variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] variable {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] variable {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} namespace GaugeAlgebraRealization -variable {repLorentz : Representation ℂ SL(2,ℂ) B} -variable {repGauge : Representation ℂ GJ B} -variable {A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B} -variable (h : GaugeAlgebraRealization jets B repGauge repLorentz) +section RealScalars + +variable [Module ℝ B] [SMulCommClass ℝ B B] [IsScalarTower ℝ B B] + {A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B} /-! @@ -178,6 +178,22 @@ noncomputable def iteratedCovDerivAdjoint | [], F => F | ρ :: l, F => covDerivAdjoint A (iteratedCovDerivAdjoint A l F) ρ +/-- The iterated covariant derivative is natural in the algebra. -/ +lemma iteratedCovDerivAdjoint_map {B' : Type} [Ring B'] [Module ℝ B'] [SMulCommClass ℝ B' B'] + [IsScalarTower ℝ B' B'] (Φ : B →ₗ[ℝ] B') (hΦ : ∀ b₁ b₂, Φ (b₁ * b₂) = Φ b₁ * Φ b₂) + (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B) + (l : List (Fin 1 ⊕ Fin 3)) (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B) : + iteratedCovDerivAdjoint (fun p σ => Φ ∘ₗ A p σ) l (fun p => Φ ∘ₗ F p) = + fun p => Φ ∘ₗ iteratedCovDerivAdjoint A l F p := by + induction l with + | nil => rfl + | cons ρ l ih => + funext s + show covDerivAdjoint (fun p σ => Φ ∘ₗ A p σ) + (iteratedCovDerivAdjoint (fun p σ => Φ ∘ₗ A p σ) l (fun p => Φ ∘ₗ F p)) ρ s = + Φ ∘ₗ covDerivAdjoint A (iteratedCovDerivAdjoint A l F) ρ s + rw [ih, covDerivAdjoint_map Φ hΦ] + variable (A) in /-- The derivative symbols `∂_p A_μ^φ` with at most `n` derivatives. -/ abbrev symbolsLE (n : ℕ) : Set B := @@ -229,6 +245,15 @@ lemma towerLT_subset_tower (n : ℕ) : towerLT A n ⊆ tower A := by rintro b ⟨l, ν, lam, φ, _, rfl⟩ exact ⟨l, ν, lam, φ, rfl⟩ +end RealScalars + +section ComplexScalars + +variable [Algebra ℂ B] {repLorentz : Representation ℂ SL(2,ℂ) B} + {repGauge : Representation ℂ GJ B} + {A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B} + (h : GaugeAlgebraRealization jets B repGauge repLorentz) + /-- Symbol subalgebras are monotone in the order bound. -/ lemma adjoin_symbols_mono {n m : ℕ} (hnm : n ≤ m) : Algebra.adjoin ℂ (symbolsLE A n) ≤ Algebra.adjoin ℂ (symbolsLE A m) := @@ -1199,6 +1224,8 @@ theorem invariant_mem_adjoin_fieldStrength [jets.Free] (S : Set B) intro hk exact ih (mem_adjoin_symSymbolsLE_of_repGauge_eq h S hcS hS k hk fun U => hinv U.1) +end ComplexScalars + end GaugeAlgebraRealization /-! @@ -1207,7 +1234,7 @@ end GaugeAlgebraRealization -/ -namespace GaugeJetAlgebra +namespace LocalGaugeFieldAlgebra variable (jets) in /-- The classification of gauge invariants of the gauge-boson jet algebra: for a free @@ -1216,14 +1243,14 @@ variable (jets) in covariant derivatives of the field strength and the elements of `S`. This is the case of the identity realization; the commutation of `S` with the symbols is automatic in the commutative jet algebra. -/ -theorem invariant_mem_adjoin_fieldStrength [jets.Free] (S : Set (ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤)) +theorem invariant_mem_adjoin_fieldStrength [jets.Free] (S : Set (ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤)) (hS : ∀ y ∈ S, ∀ U : jets.truncationKer 0, complexRepJet jets U.1 y = y) - {x : ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤} - (hx : x ∈ Algebra.adjoin ℂ ({b : ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤 | + {x : ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤} + (hx : x ∈ Algebra.adjoin ℂ ({b : ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤 | ∃ (p : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), b = gaugeField 𝔤 p μ φ} ∪ S)) (hinv : ∀ U : GJ, complexRepJet jets U x = x) : - x ∈ Algebra.adjoin ℂ ({b : ℂ ⊗[ℝ] GaugeJetAlgebra 𝔤 | + x ∈ Algebra.adjoin ℂ ({b : ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤 | ∃ (l : List (Fin 1 ⊕ Fin 3)) (ν lam : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), b = GaugeAlgebraRealization.iteratedCovDerivAdjoint (gaugeField 𝔤) l (GaugeAlgebraRealization.fieldStrength (gaugeField 𝔤) ν lam) 0 φ} ∪ S) := by @@ -1232,4 +1259,4 @@ theorem invariant_mem_adjoin_fieldStrength [jets.Free] (S : Set (ℂ ⊗[ℝ] Ga rw [GaugeAlgebraRealization.id_A] at key exact key -end GaugeJetAlgebra +end LocalGaugeFieldAlgebra diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/TransformsInAdjoint.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/TransformsInAdjoint.lean index 819901aca..dcf84a631 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/TransformsInAdjoint.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/TransformsInAdjoint.lean @@ -30,17 +30,19 @@ derivative of the field strength is an adjoint gauge tensor. set_option linter.unusedSectionVars false open Matrix MatrixGroups TensorProduct -variable {B : Type} [Ring B] [Algebra ℂ B] +variable {B : Type} [Ring B] variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] variable {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] variable {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} namespace GaugeAlgebraRealization -variable {repLorentz : Representation ℂ SL(2,ℂ) B} -variable {repGauge : Representation ℂ GJ B} -variable {A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B} -variable (h : GaugeAlgebraRealization jets B repGauge repLorentz) +section ComplexScalars + +variable [Algebra ℂ B] {repLorentz : Representation ℂ SL(2,ℂ) B} + {repGauge : Representation ℂ GJ B} + {A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B} + (h : GaugeAlgebraRealization jets B repGauge repLorentz) variable (jets) in /-- A family of derivative symbols `F` *transforms in the adjoint* (is an adjoint gauge @@ -64,6 +66,12 @@ lemma TransformsInAdjoint.repGauge_zero simpa only [Multiset.antidiagonal_zero, Multiset.map_singleton, Multiset.sum_singleton] using hF U φ 0 +end ComplexScalars + +section RealScalars + +variable [Module ℝ B] [SMulCommClass ℝ B B] [IsScalarTower ℝ B B] + /-- **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. -/ @@ -94,12 +102,48 @@ lemma covDerivAdjoint_apply (ρ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℝ 𝔤) : covDerivAdjoint A F ρ s φ = F (ρ ::ₘ s) φ + bracketFamConv A ρ F s φ := rfl +/-- The derived bracket family is natural in the algebra. -/ +lemma bracketFamConv_map {B' : Type} [Ring B'] [Module ℝ B'] [SMulCommClass ℝ B' B'] + [IsScalarTower ℝ B' B'] (Φ : B →ₗ[ℝ] B') (hΦ : ∀ b₁ b₂, Φ (b₁ * b₂) = Φ b₁ * Φ b₂) + (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)) : + bracketFamConv (fun p σ => Φ ∘ₗ A p σ) ρ (fun p => Φ ∘ₗ F p) s = + Φ ∘ₗ bracketFamConv A ρ F s := by + refine LinearMap.ext fun φ => ?_ + rw [LinearMap.comp_apply, bracketFamConv, bracketFamConv, Multiset.sum_linearMap_apply, + Multiset.sum_linearMap_apply, Multiset.map_map, Multiset.map_map, map_multiset_sum, + Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p _ => ?_) + simp only [Function.comp_apply] + rw [bracketFam_map Φ hΦ] + rfl + +/-- The covariant derivative is natural in the algebra. -/ +lemma covDerivAdjoint_map {B' : Type} [Ring B'] [Module ℝ B'] [SMulCommClass ℝ B' B'] + [IsScalarTower ℝ B' B'] (Φ : B →ₗ[ℝ] B') (hΦ : ∀ b₁ b₂, Φ (b₁ * b₂) = Φ b₁ * Φ b₂) + (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)) : + covDerivAdjoint (fun p σ => Φ ∘ₗ A p σ) (fun p => Φ ∘ₗ F p) ρ s = + Φ ∘ₗ covDerivAdjoint A F ρ s := by + rw [covDerivAdjoint, covDerivAdjoint, bracketFamConv_map Φ hΦ, LinearMap.comp_add] + +end RealScalars + /-! ## The iterated covariance of the covariant derivative -/ +section ComplexScalars + +variable [Algebra ℂ B] {repLorentz : Representation ℂ SL(2,ℂ) B} + {repGauge : Representation ℂ GJ B} + {A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B} + (h : GaugeAlgebraRealization jets B repGauge repLorentz) + /-- If `F` transforms in the adjoint, so do its `κ ::ₘ s`-derived symbols with the extra derivative traced through `LocalGaugeData.adjointDualCoeff_cons`: the Leibniz splittings where `κ` stays a derivative, minus the convolution where `κ` hits the adjoint — @@ -270,5 +314,7 @@ theorem TransformsInAdjoint.covDerivAdjoint hR, hcancel] abel +end ComplexScalars + end GaugeAlgebraRealization diff --git a/Physlib/Mathematics/Fin.lean b/Physlib/Mathematics/Fin.lean index d78163ead..90579221b 100644 --- a/Physlib/Mathematics/Fin.lean +++ b/Physlib/Mathematics/Fin.lean @@ -5,6 +5,8 @@ Authors: Joseph Tooby-Smith -/ module +public import Mathlib.Algebra.BigOperators.Fin +public import Mathlib.Algebra.Module.Defs public import Mathlib.Algebra.Order.Group.Nat public import Mathlib.Algebra.Order.Monoid.NatCast public import Mathlib.Logic.Equiv.Fin.Basic @@ -282,4 +284,16 @@ lemma equivCons_symm_succ {n m : ℕ} (e : Fin n ≃ Fin m) (i : ℕ) (hi : i + lemma equivCons_succ {n m : ℕ} (e : Fin n ≃ Fin m) (i : ℕ) (hi : i + 1 < n.succ) : (Fin.equivCons e) ⟨i + 1, hi⟩ = (e ⟨i, Nat.succ_lt_succ_iff.mp hi⟩).succ := rfl +/-- A sum over tuples of indices, weighted by one scalar factor per slot, split into the + first slot and the remaining ones. -/ +lemma sum_pi_succ_prod_smul {R M ι : Type*} [CommSemiring R] [AddCommMonoid M] [Module R M] + [Fintype ι] {n : ℕ} (c : Fin (n + 1) → ι → R) (X : (Fin (n + 1) → ι) → M) : + ∑ q : Fin (n + 1) → ι, (∏ i, c i (q i)) • X q = + ∑ b : ι, ∑ p : Fin n → ι, (c 0 b * ∏ i, c i.succ (p i)) • X (Fin.cons b p) := by + rw [← (Fin.consEquiv fun _ : Fin (n + 1) => ι).sum_comp, Fintype.sum_prod_type] + refine Finset.sum_congr rfl fun b _ => Finset.sum_congr rfl fun p _ => ?_ + show (∏ i, c i ((Fin.cons b p : Fin (n + 1) → ι) i)) • X (Fin.cons b p) = _ + rw [Fin.prod_univ_succ] + simp only [Fin.cons_zero, Fin.cons_succ] + end Physlib.Fin diff --git a/Physlib/Particles/LagrangianTheory/Basic.lean b/Physlib/Particles/LagrangianTheory/Basic.lean index 944ec97d8..1d02e9bbb 100644 --- a/Physlib/Particles/LagrangianTheory/Basic.lean +++ b/Physlib/Particles/LagrangianTheory/Basic.lean @@ -32,7 +32,7 @@ public import Physlib.Relativity.SL2C.Basic `LagrangianTheory.dualRealJetAlgebraBasis` is the basis of the symmetric algebra of dual real jet slots `SymmetricAlgebra ℝ (Module.Dual ℝ Lorentz.CoVector)`, indexed by multisets of spacetime indices. It is the multiset-indexed basis used throughout the gauge-boson jet -algebra (`GaugeBosons/GaugeJetAlgebra`) to name a monomial in the derivative slots by the +algebra (`GaugeBoson/LocalGaugeFieldAlgebra`) to name a monomial in the derivative slots by the multiset of spacetime indices it carries. -/ diff --git a/Physlib/Particles/StandardModel/AlgebraRealization/CovariantDeriv.lean b/Physlib/Particles/StandardModel/AlgebraRealization/CovariantDeriv.lean index 636c57e71..926417f5a 100644 --- a/Physlib/Particles/StandardModel/AlgebraRealization/CovariantDeriv.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/CovariantDeriv.lean @@ -4,6 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE. Authors: Joseph Tooby-Smith -/ module +public import Physlib.Mathematics.Fin public import Physlib.Particles.StandardModel.AlgebraRealization.Commutations public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData /-! @@ -189,13 +190,8 @@ lemma sum_fin_succ_prod_smul {n : ℕ} (l : Fin (n + 1) → (Fin 1 ⊕ Fin 3)) (X : (Fin (n + 1) → (Fin 1 ⊕ Fin 3)) → M) : ∑ q : Fin (n + 1) → (Fin 1 ⊕ Fin 3), (∏ i, L[Λ] (q i) (l i)) • X q = ∑ b, ∑ p : Fin n → (Fin 1 ⊕ Fin 3), - (L[Λ] b (l 0) * ∏ i, L[Λ] (p i) (l i.succ)) • X (Fin.cons b p) := by - rw [← (Fin.consEquiv fun _ : Fin (n + 1) => Fin 1 ⊕ Fin 3).sum_comp, Fintype.sum_prod_type] - refine Finset.sum_congr rfl fun b _ => Finset.sum_congr rfl fun p _ => ?_ - show (∏ i, L[Λ] ((Fin.cons b p : Fin (n + 1) → (Fin 1 ⊕ Fin 3)) i) (l i)) • - X (Fin.cons b p) = _ - rw [Fin.prod_univ_succ] - simp only [Fin.cons_zero, Fin.cons_succ] + (L[Λ] b (l 0) * ∏ i, L[Λ] (p i) (l i.succ)) • X (Fin.cons b p) := + Physlib.Fin.sum_pi_succ_prod_smul (fun i b => L[Λ] b (l i)) X /-- 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 diff --git a/Physlib/Particles/StandardModel/Fermions/DownSinglet/Basic.lean b/Physlib/Particles/StandardModel/Fermions/DownSinglet/Basic.lean index 4c7e0a776..59a493c2e 100644 --- a/Physlib/Particles/StandardModel/Fermions/DownSinglet/Basic.lean +++ b/Physlib/Particles/StandardModel/Fermions/DownSinglet/Basic.lean @@ -12,7 +12,7 @@ public import Physlib.Particles.StandardModel.GaugeGroup.JetGaugeGroup.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.GaugeAction -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.GaugeAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeFieldAlgebra.GaugeAction 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/DownSinglet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/DownSinglet/GaugeAlgebraAction.lean index 64831cefb..ca260da45 100644 --- a/Physlib/Particles/StandardModel/Fermions/DownSinglet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/DownSinglet/GaugeAlgebraAction.lean @@ -8,7 +8,7 @@ module public import Physlib.Particles.StandardModel.Fermions.DownSinglet.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.GaugeAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeFieldAlgebra.GaugeAction public import Mathlib.LinearAlgebra.TensorProduct.Pi public import Mathlib.Analysis.Normed.Lp.Matrix public import Mathlib.RingTheory.TensorProduct.Maps diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean index 2b40db79b..853323e6e 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean @@ -8,7 +8,7 @@ module public import Physlib.Particles.StandardModel.Fermions.LeptonDoublet.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.GaugeAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeFieldAlgebra.GaugeAction public import Mathlib.LinearAlgebra.TensorProduct.Pi public import Mathlib.Analysis.Normed.Lp.Matrix public import Mathlib.RingTheory.TensorProduct.Maps diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/GaugeAlgebraAction.lean index aa6d1e76f..4212fec25 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/GaugeAlgebraAction.lean @@ -8,7 +8,7 @@ module public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.GaugeAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeFieldAlgebra.GaugeAction /-! # The gauge-algebra action on the charged-lepton singlet diff --git a/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/GaugeAlgebraAction.lean index b79b89a4f..a8f4c79d5 100644 --- a/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/GaugeAlgebraAction.lean @@ -8,7 +8,7 @@ module public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.GaugeAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeFieldAlgebra.GaugeAction public import Mathlib.LinearAlgebra.TensorProduct.Pi public import Mathlib.LinearAlgebra.Matrix.Kronecker public import Mathlib.Analysis.Normed.Lp.Matrix diff --git a/Physlib/Particles/StandardModel/Fermions/UpSinglet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/UpSinglet/GaugeAlgebraAction.lean index 985227703..9c06bf622 100644 --- a/Physlib/Particles/StandardModel/Fermions/UpSinglet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/UpSinglet/GaugeAlgebraAction.lean @@ -8,7 +8,7 @@ module public import Physlib.Particles.StandardModel.Fermions.UpSinglet.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.GaugeAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeFieldAlgebra.GaugeAction public import Mathlib.LinearAlgebra.TensorProduct.Pi public import Mathlib.Analysis.Normed.Lp.Matrix public import Mathlib.RingTheory.TensorProduct.Maps diff --git a/Physlib/Particles/StandardModel/HiggsBoson/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/HiggsBoson/GaugeAlgebraAction.lean index 2de6272c6..99925a3e9 100644 --- a/Physlib/Particles/StandardModel/HiggsBoson/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/HiggsBoson/GaugeAlgebraAction.lean @@ -8,7 +8,7 @@ module public import Physlib.Particles.StandardModel.HiggsBoson.JetAlgebra.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.GaugeAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeFieldAlgebra.GaugeAction public import Mathlib.LinearAlgebra.TensorProduct.Pi public import Mathlib.Analysis.Normed.Lp.Matrix public import Mathlib.RingTheory.TensorProduct.Maps diff --git a/Physlib/Particles/StandardModel/JetAlgebra/Basic.lean b/Physlib/Particles/StandardModel/JetAlgebra/Basic.lean index c89c4080c..03a8b93c1 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/Basic.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/Basic.lean @@ -7,7 +7,7 @@ module public import Physlib.Particles.StandardModel.Fermions.JetAlgebra.Basic public import Physlib.Particles.StandardModel.HiggsBoson.JetAlgebra.Algebra -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeFieldAlgebra.Basic public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData public import Physlib.Mathematics.AlgebraRepresentation public import Physlib.Particles.StandardModel.JetAlgebra.SectorEquiv.Basic @@ -26,7 +26,7 @@ anticommutativity of the fermions lives entirely inside the fermionic factor, wh fifteen species share one exterior algebra. The three sector inclusions keep their old names and their old sources — the sector -algebras `FermionJetAlgebra`, `HiggsJetAlgebra` and `GaugeJetAlgebra GaugeAlgebra` — so +algebras `FermionJetAlgebra`, `HiggsJetAlgebra` and `LocalGaugeFieldAlgebra GaugeAlgebra` — so that every downstream family of field symbols is unchanged. The two matter inclusions factor through the sector equivalences of `Physlib.Particles.StandardModel.JetAlgebra.SectorEquiv.Basic`; the connection sector needs @@ -93,10 +93,10 @@ noncomputable def includeHiggs : HiggsJetAlgebra →ₐ[ℂ] JetAlgebra := /-- The inclusion of the gauge sector. The Standard Model gauge bosons are the generic ones at `GaugeAlgebra`, so this is the connection inclusion of the datum itself. -/ noncomputable def includeGauge : - (ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) →ₐ[ℂ] JetAlgebra := + (ℂ ⊗[ℝ] (LocalGaugeFieldAlgebra GaugeAlgebra)) →ₐ[ℂ] JetAlgebra := fieldData.includeConnection -lemma includeGauge_apply (y : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) : +lemma includeGauge_apply (y : ℂ ⊗[ℝ] (LocalGaugeFieldAlgebra GaugeAlgebra)) : includeGauge y = ((1 : fieldData.MatterAlgebra) ⊗ₜ[ℂ] y : JetAlgebra) := GaugeFieldData.includeConnection_apply y @@ -169,7 +169,7 @@ private lemma tensor_includeRight_comm {A B : Type*} [Ring A] [Algebra ℂ A] /-- The image of the gauge sector is central: gauge-boson symbols commute with everything, as bosons must. -/ -lemma includeGauge_commute (y : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) (x : JetAlgebra) : +lemma includeGauge_commute (y : ℂ ⊗[ℝ] (LocalGaugeFieldAlgebra GaugeAlgebra)) (x : JetAlgebra) : x * includeGauge y = includeGauge y * x := tensor_includeRight_comm y x diff --git a/Physlib/Particles/StandardModel/JetAlgebra/FieldAlgebra.lean b/Physlib/Particles/StandardModel/JetAlgebra/FieldAlgebra.lean index 145f09214..900adaaf7 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/FieldAlgebra.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/FieldAlgebra.lean @@ -27,16 +27,15 @@ reduces the whole algebra to its pure tensors, and a pure tensor is the product three sector inclusions applied to its factors; so it is enough that each sector inclusion lands in the adjoined algebra. Each of those is the sector's own generation theorem — `FermionicAlgebra.adjoin_iteratedJetDeriv_eq_top`, its bosonic counterpart, and -`GaugeJetAlgebra.adjoin_iteratedJetDeriv_eq_top` — pushed through the inclusion. +`LocalGaugeFieldAlgebra.adjoin_iteratedJetDeriv_eq_top` — pushed through the inclusion. Two things do not come for free. The fermion families are indexed by covectors on the *individual species*, while the fermionic generation theorem produces every covector on the total target space `FermionSpace`; the gap is closed by `FermionSpace.span_speciesDual_eq_top`, which says the pulled-back covectors span. And the -gauge sector's generation theorem is a statement over `ℝ` about `GaugeJetAlgebra GaugeAlgebra`, -whereas -the gauge tensor factor is the complexification `ℂ ⊗[ℝ] GaugeJetAlgebra GaugeAlgebra`; the extra -complex +gauge sector's generation theorem is a statement over `ℝ` about +`LocalGaugeFieldAlgebra GaugeAlgebra`, whereas the gauge tensor factor is the complexification +`ℂ ⊗[ℝ] LocalGaugeFieldAlgebra GaugeAlgebra`; the extra complex scalar is supplied by the algebra map, since `z ⊗ₜ x = (z ⊗ₜ 1) * (1 ⊗ₜ x)` and the first factor is the image of `z` under `algebraMap`. @@ -368,9 +367,9 @@ lemma includeFermion_mem_adjoin_generators (f : FermionJetAlgebra) : ### B.4. The gauge sector -The gauge tensor factor is the complexification `ℂ ⊗[ℝ] GaugeJetAlgebra GaugeAlgebra`, +The gauge tensor factor is the complexification `ℂ ⊗[ℝ] LocalGaugeFieldAlgebra GaugeAlgebra`, while the gauge sector's generation theorem is a statement over `ℝ` about -`GaugeJetAlgebra GaugeAlgebra` itself. The real part of the factor is handled by that +`LocalGaugeFieldAlgebra GaugeAlgebra` itself. The real part of the factor is handled by that theorem transported along the real algebra map `x ↦ 1 ⊗ₜ x`; the complex scalar is then supplied by `z ⊗ₜ x = (z ⊗ₜ 1) * (1 ⊗ₜ x)`, whose first factor is the image of `z` under `algebraMap` and so lies in every subalgebra. @@ -380,32 +379,32 @@ supplied by `z ⊗ₜ x = (z ⊗ₜ 1) * (1 ⊗ₜ x)`, whose first factor is th /-- The iterated derivative of the complexification acts on a pure tensor through the gauge sector's own iterated derivative. -/ lemma iteratedD_complexJetDeriv_tmul (s : Multiset (Fin 1 ⊕ Fin 3)) (z : ℂ) - (x : (GaugeJetAlgebra GaugeAlgebra)) : - Lorentz.iteratedD (GaugeJetAlgebra.complexJetDeriv GaugeAlgebra) - GaugeJetAlgebra.complexJetDeriv_comm s (z ⊗ₜ[ℝ] x) - = z ⊗ₜ[ℝ] (GaugeJetAlgebra.iteratedJetDeriv GaugeAlgebra) s x := by + (x : (LocalGaugeFieldAlgebra GaugeAlgebra)) : + Lorentz.iteratedD (LocalGaugeFieldAlgebra.complexJetDeriv GaugeAlgebra) + LocalGaugeFieldAlgebra.complexJetDeriv_comm s (z ⊗ₜ[ℝ] x) + = z ⊗ₜ[ℝ] (LocalGaugeFieldAlgebra.iteratedJetDeriv GaugeAlgebra) s x := by induction s using Multiset.induction_on with | empty => - rw [Lorentz.iteratedD_zero, GaugeJetAlgebra.iteratedJetDeriv_zero, LinearMap.id_apply, + rw [Lorentz.iteratedD_zero, LocalGaugeFieldAlgebra.iteratedJetDeriv_zero, LinearMap.id_apply, LinearMap.id_apply] | cons μ s ih => - rw [Lorentz.iteratedD_cons, GaugeJetAlgebra.iteratedJetDeriv_cons, + rw [Lorentz.iteratedD_cons, LocalGaugeFieldAlgebra.iteratedJetDeriv_cons, LinearMap.comp_apply, LinearMap.comp_apply, ih, - GaugeJetAlgebra.complexJetDeriv_tmul] + LocalGaugeFieldAlgebra.complexJetDeriv_tmul] /-- The real gauge-boson jet algebra inside the jet algebra of the Standard Model: the inclusion of the gauge sector precomposed with the inclusion of the real part of the complexification. It is a map of `ℝ`-algebras, which is the level at which the gauge sector's generation theorem is stated. -/ -noncomputable def includeGaugeReal : (GaugeJetAlgebra GaugeAlgebra) →ₐ[ℝ] JetAlgebra := +noncomputable def includeGaugeReal : (LocalGaugeFieldAlgebra GaugeAlgebra) →ₐ[ℝ] JetAlgebra := (AlgHom.restrictScalars ℝ includeGauge).comp (Algebra.TensorProduct.includeRight (R := ℝ) (A := ℂ) - (B := (GaugeJetAlgebra GaugeAlgebra))) + (B := (LocalGaugeFieldAlgebra GaugeAlgebra))) /-- The real gauge inclusion is the gauge inclusion of the pure tensor with complex part one. -/ @[simp] -lemma includeGaugeReal_apply (x : (GaugeJetAlgebra GaugeAlgebra)) : +lemma includeGaugeReal_apply (x : (LocalGaugeFieldAlgebra GaugeAlgebra)) : includeGaugeReal x = includeGauge ((1 : ℂ) ⊗ₜ[ℝ] x) := rfl /-- A gauge-field symbol is the gauge sector's own derivative symbol, included through the @@ -413,21 +412,21 @@ lemma includeGaugeReal_apply (x : (GaugeJetAlgebra GaugeAlgebra)) : lemma gaugeField_eq_includeGaugeReal (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : gaugeField s μ φ - = includeGaugeReal ((GaugeJetAlgebra.iteratedJetDeriv GaugeAlgebra) s - ((GaugeJetAlgebra.ofA GaugeAlgebra) μ φ)) := + = includeGaugeReal ((LocalGaugeFieldAlgebra.iteratedJetDeriv GaugeAlgebra) s + ((LocalGaugeFieldAlgebra.ofA GaugeAlgebra) μ φ)) := (gaugeField_apply s μ φ).trans ((congrArg includeGauge - (iteratedD_complexJetDeriv_tmul s 1 (GaugeJetAlgebra.ofA GaugeAlgebra μ φ))).trans + (iteratedD_complexJetDeriv_tmul s 1 (LocalGaugeFieldAlgebra.ofA GaugeAlgebra μ φ))).trans (includeGaugeReal_apply _).symm) /-- Every element of the real gauge sector lies in the algebra generated by the symbols: the gauge-boson jet algebra is generated over `ℝ` by the derivative symbols of the gauge field, and those are the gauge family. -/ -lemma includeGaugeReal_mem_adjoin_generators (x : (GaugeJetAlgebra GaugeAlgebra)) : +lemma includeGaugeReal_mem_adjoin_generators (x : (LocalGaugeFieldAlgebra GaugeAlgebra)) : includeGaugeReal x ∈ Algebra.adjoin ℂ generators := by have h : includeGaugeReal x ∈ (Algebra.adjoin ℂ generators).restrictScalars ℝ := by refine mem_of_adjoin_eq_top includeGaugeReal - GaugeJetAlgebra.adjoin_iteratedJetDeriv_eq_top ?_ x + LocalGaugeFieldAlgebra.adjoin_iteratedJetDeriv_eq_top ?_ x rintro _ ⟨y, hy, rfl⟩ simp only [Set.mem_iUnion, Set.mem_range] at hy obtain ⟨s, μ, φ, rfl⟩ := hy @@ -437,17 +436,17 @@ lemma includeGaugeReal_mem_adjoin_generators (x : (GaugeJetAlgebra GaugeAlgebra) /-- Every element of the complexified gauge sector lies in the algebra generated by the symbols: a pure tensor splits as a complex scalar times the image of its real part. -/ -lemma includeGauge_mem_adjoin_generators (y : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) : +lemma includeGauge_mem_adjoin_generators (y : ℂ ⊗[ℝ] (LocalGaugeFieldAlgebra GaugeAlgebra)) : includeGauge y ∈ Algebra.adjoin ℂ generators := by induction y using TensorProduct.induction_on with | zero => exact mem_adjoin_generators_of_eq (map_zero includeGauge).symm (zero_mem _) | add a b ha hb => exact mem_adjoin_generators_of_eq (map_add includeGauge a b).symm (add_mem ha hb) | tmul z x => - have hsplit : (z ⊗ₜ[ℝ] x : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) - = algebraMap ℂ (ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) z * ((1 : ℂ) ⊗ₜ[ℝ] x) := by - rw [show algebraMap ℂ (ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) z - = z ⊗ₜ[ℝ] (1 : (GaugeJetAlgebra GaugeAlgebra)) from rfl, + have hsplit : (z ⊗ₜ[ℝ] x : ℂ ⊗[ℝ] (LocalGaugeFieldAlgebra GaugeAlgebra)) + = algebraMap ℂ (ℂ ⊗[ℝ] (LocalGaugeFieldAlgebra GaugeAlgebra)) z * ((1 : ℂ) ⊗ₜ[ℝ] x) := by + rw [show algebraMap ℂ (ℂ ⊗[ℝ] (LocalGaugeFieldAlgebra GaugeAlgebra)) z + = z ⊗ₜ[ℝ] (1 : (LocalGaugeFieldAlgebra GaugeAlgebra)) from rfl, Algebra.TensorProduct.tmul_mul_tmul, mul_one, one_mul] refine mem_adjoin_generators_of_eq (congrArg includeGauge hsplit).symm ?_ exact mem_adjoin_generators_of_eq (map_mul includeGauge _ _).symm @@ -505,7 +504,7 @@ private lemma tensor_tmul_tmul {A B C : Type*} [Ring A] [Algebra ℂ A] [Ring B] lemma includeFermionFactor_mul_includeBosonFactor_mul_includeConnection (a : ExteriorAlgebra ℂ fieldData.FermionGenerators) (b : SymmetricAlgebra ℂ fieldData.BosonGenerators) - (c : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) : + (c : ℂ ⊗[ℝ] (LocalGaugeFieldAlgebra GaugeAlgebra)) : fieldData.includeFermion a * fieldData.includeBoson b * fieldData.includeConnection c = ((a ⊗ₜ[ℂ] b) ⊗ₜ[ℂ] c : JetAlgebra) := (congrArg₂ (fun x y : JetAlgebra => x * y) @@ -518,7 +517,7 @@ lemma includeFermionFactor_mul_includeBosonFactor_mul_includeConnection /-- Every pure tensor of the jet algebra lies in the algebra generated by the symbols. -/ lemma tmul_mem_adjoin_generators (w : fieldData.MatterAlgebra) - (y : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) : + (y : ℂ ⊗[ℝ] (LocalGaugeFieldAlgebra GaugeAlgebra)) : (w ⊗ₜ[ℂ] y : JetAlgebra) ∈ Algebra.adjoin ℂ generators := by induction w using TensorProduct.induction_on with | zero => @@ -547,7 +546,7 @@ theorem adjoin_generators_eq_top : Algebra.adjoin ℂ generators = (⊤ : Subalgebra ℂ JetAlgebra) := by refine top_le_iff.mp ?_ rw [← Algebra.TensorProduct.adjoin_tmul_eq_top ℂ fieldData.MatterAlgebra - (ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra))] + (ℂ ⊗[ℝ] (LocalGaugeFieldAlgebra GaugeAlgebra))] refine Algebra.adjoin_le ?_ rintro _ ⟨w, y, rfl⟩ exact tmul_mem_adjoin_generators w y diff --git a/Physlib/Particles/StandardModel/JetAlgebra/GaugeAction.lean b/Physlib/Particles/StandardModel/JetAlgebra/GaugeAction.lean index d7a54e8bd..b9b91b4f9 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/GaugeAction.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/GaugeAction.lean @@ -8,7 +8,7 @@ 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.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.GaugeAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeFieldAlgebra.GaugeAction public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData public import Physlib.Particles.StandardModel.JetAlgebra.SectorEquiv.Structure /-! @@ -19,7 +19,7 @@ public import Physlib.Particles.StandardModel.JetAlgebra.SectorEquiv.Structure The jet gauge group acts on the jet algebra of the Standard Model factor by factor. On the two matter factors it is the free-algebra functor applied to the species-wise action `fieldData.repJetFermion`, `fieldData.repJetBoson` on the generator spaces; on the -connection factor it is the generic affine action `GaugeJetAlgebra.complexRepJet` of the +connection factor it is the generic affine action `LocalGaugeFieldAlgebra.complexRepJet` of the Standard Model's local gauge data, whose linear part is the all-orders Leibniz convolution of the adjoint Taylor coefficients and whose constant part is the Maurer–Cartan shift. The action is multiplicative — a jet of gauge transformations acts on a Lagrangian term factor @@ -80,19 +80,19 @@ noncomputable abbrev repJetGaugeGroupIBoson : /-- The jet gauge action on the jet algebra of the Standard Model. Matter is acted on species by species from `fieldData`; the connection factor carries the generic affine - `GaugeJetAlgebra.complexRepJet` action of the Standard Model local gauge data. -/ + `LocalGaugeFieldAlgebra.complexRepJet` action of the Standard Model local gauge data. -/ noncomputable def repJetGaugeGroupI : Representation ℂ JetGaugeGroupI JetAlgebra := (repJetGaugeGroupIFermion.tprod repJetGaugeGroupIBoson).tprod - (_root_.GaugeJetAlgebra.complexRepJet localGaugeData) + (_root_.LocalGaugeFieldAlgebra.complexRepJet localGaugeData) @[simp] lemma repJetGaugeGroupI_tmul (U : JetGaugeGroupI) (w : ExteriorAlgebra ℂ fieldData.FermionGenerators ⊗[ℂ] SymmetricAlgebra ℂ fieldData.BosonGenerators) - (g : ℂ ⊗[ℝ] _root_.GaugeJetAlgebra GaugeAlgebra) : + (g : ℂ ⊗[ℝ] _root_.LocalGaugeFieldAlgebra GaugeAlgebra) : repJetGaugeGroupI U (w ⊗ₜ[ℂ] g) = ((repJetGaugeGroupIFermion.tprod repJetGaugeGroupIBoson) U w) - ⊗ₜ[ℂ] (_root_.GaugeJetAlgebra.complexRepJet localGaugeData U g) := rfl + ⊗ₜ[ℂ] (_root_.LocalGaugeFieldAlgebra.complexRepJet localGaugeData U g) := rfl /-! @@ -108,7 +108,7 @@ lemma repJetGaugeGroupI_apply_mul (U : JetGaugeGroupI) (x y : JetAlgebra) : (Representation.tprod_apply_mul _ _ (fun V a b => Representation.exteriorAlgebra_apply_mul _ V a b) (fun V a b => Representation.symmetricAlgebra_apply_mul _ V a b)) - (fun V a b => _root_.GaugeJetAlgebra.complexRepJet_apply_mul (jets := localGaugeData) + (fun V a b => _root_.LocalGaugeFieldAlgebra.complexRepJet_apply_mul (jets := localGaugeData) V a b) U x y /-! @@ -119,10 +119,10 @@ lemma repJetGaugeGroupI_apply_mul (U : JetGaugeGroupI) (x y : JetAlgebra) : /-- The jet gauge action on the complexified gauge sector fixes the unit. -/ lemma complexRepJetGaugeGroupI_apply_one (U : JetGaugeGroupI) : - (_root_.GaugeJetAlgebra.complexRepJet localGaugeData) U - (1 : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) = 1 := by - rw [Algebra.TensorProduct.one_def, _root_.GaugeJetAlgebra.complexRepJet_tmul, - _root_.GaugeJetAlgebra.repJet_apply_one] + (_root_.LocalGaugeFieldAlgebra.complexRepJet localGaugeData) U + (1 : ℂ ⊗[ℝ] (LocalGaugeFieldAlgebra GaugeAlgebra)) = 1 := by + rw [Algebra.TensorProduct.one_def, _root_.LocalGaugeFieldAlgebra.complexRepJet_tmul, + _root_.LocalGaugeFieldAlgebra.repJet_apply_one] /-- The matter factor of the jet gauge action fixes the unit. The proof instantiates the abstract `Representation.tprod_apply_one`, so that the unit of the matter factor is never @@ -137,14 +137,14 @@ lemma repJetGaugeGroupI_matter_one (U : JetGaugeGroupI) : /-- The jet gauge action restricts to the generic connection factor, where it is the generic affine action of the Standard Model local gauge data. -/ lemma repJetGaugeGroupI_includeConnection (U : JetGaugeGroupI) - (y : ℂ ⊗[ℝ] _root_.GaugeJetAlgebra GaugeAlgebra) : + (y : ℂ ⊗[ℝ] _root_.LocalGaugeFieldAlgebra GaugeAlgebra) : repJetGaugeGroupI U (fieldData.includeConnection y) = fieldData.includeConnection - (_root_.GaugeJetAlgebra.complexRepJet localGaugeData U y) := + (_root_.LocalGaugeFieldAlgebra.complexRepJet localGaugeData U y) := (congrArg (repJetGaugeGroupI U) (GaugeFieldData.includeConnection_apply y)).trans ((Representation.tprod_apply_one_tmul _ _ U (repJetGaugeGroupI_matter_one U) y).trans (GaugeFieldData.includeConnection_apply - (_root_.GaugeJetAlgebra.complexRepJet localGaugeData U y)).symm) + (_root_.LocalGaugeFieldAlgebra.complexRepJet localGaugeData U y)).symm) /-- The jet gauge action restricts to the fermionic factor, where it is the exterior-algebra functor applied to the species-wise action of the datum. The factor @@ -159,7 +159,7 @@ lemma repJetGaugeGroupI_includeFermionFactor (U : JetGaugeGroupI) ((Representation.tprod_apply_tmul_one _ _ U _ (complexRepJetGaugeGroupI_apply_one U)).trans ((congrArg (fun w : fieldData.MatterAlgebra => - ((w ⊗ₜ[ℂ] (1 : ℂ ⊗[ℝ] _root_.GaugeJetAlgebra GaugeAlgebra)) : JetAlgebra)) + ((w ⊗ₜ[ℂ] (1 : ℂ ⊗[ℝ] _root_.LocalGaugeFieldAlgebra GaugeAlgebra)) : JetAlgebra)) (Representation.tprod_apply_tmul_one _ _ U a (Representation.symmetricAlgebra_apply_one _ U))).trans (GaugeFieldData.includeFermion_apply (repJetGaugeGroupIFermion U a)).symm)) @@ -174,7 +174,7 @@ lemma repJetGaugeGroupI_includeBosonFactor (U : JetGaugeGroupI) ((Representation.tprod_apply_tmul_one _ _ U _ (complexRepJetGaugeGroupI_apply_one U)).trans ((congrArg (fun w : fieldData.MatterAlgebra => - ((w ⊗ₜ[ℂ] (1 : ℂ ⊗[ℝ] _root_.GaugeJetAlgebra GaugeAlgebra)) : JetAlgebra)) + ((w ⊗ₜ[ℂ] (1 : ℂ ⊗[ℝ] _root_.LocalGaugeFieldAlgebra GaugeAlgebra)) : JetAlgebra)) (Representation.tprod_apply_one_tmul _ _ U (Representation.exteriorAlgebra_apply_one _ U) b)).trans (GaugeFieldData.includeBoson_apply (repJetGaugeGroupIBoson U b)).symm)) @@ -194,9 +194,9 @@ to each sector's own action under its existing name. inclusion is the connection inclusion of the datum, the Standard Model gauge bosons being the generic ones at `GaugeAlgebra`. -/ lemma repJetGaugeGroupI_includeGauge (U : JetGaugeGroupI) - (y : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) : + (y : ℂ ⊗[ℝ] (LocalGaugeFieldAlgebra GaugeAlgebra)) : repJetGaugeGroupI U (includeGauge y) - = includeGauge (_root_.GaugeJetAlgebra.complexRepJet localGaugeData U y) := + = includeGauge (_root_.LocalGaugeFieldAlgebra.complexRepJet localGaugeData U y) := repJetGaugeGroupI_includeConnection U y /-- The jet gauge action restricts to the fermionic sector's own action. -/ diff --git a/Physlib/Particles/StandardModel/JetAlgebra/Generators.lean b/Physlib/Particles/StandardModel/JetAlgebra/Generators.lean index 1019b04ad..c78b42c15 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/Generators.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/Generators.lean @@ -443,7 +443,7 @@ together with the membership of each family; the instance then instantiates them lemma gaugeField_commute (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (ψ : Module.Dual ℝ GaugeAlgebra) (x : JetAlgebra) : Commute (gaugeField s μ ψ) x := - (includeGauge_commute ((GaugeJetAlgebra.gaugeField GaugeAlgebra) s μ ψ) x).symm + (includeGauge_commute ((LocalGaugeFieldAlgebra.gaugeField GaugeAlgebra) s μ ψ) x).symm /-! @@ -502,7 +502,7 @@ lemma MemHiggsSector.commute_of_memFermionSector {x y : JetAlgebra} exact (congrArg₂ (fun a b : JetAlgebra => a * b) (GaugeFieldData.includeBoson_apply (higgsAlgebraEquiv h)) (GaugeFieldData.includeFermion_apply (fermionAlgebraEquiv f))).trans - ((tensor_left_comm_right (C := ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) + ((tensor_left_comm_right (C := ℂ ⊗[ℝ] (LocalGaugeFieldAlgebra GaugeAlgebra)) (fermionAlgebraEquiv f) (higgsAlgebraEquiv h)).trans (congrArg₂ (fun a b : JetAlgebra => a * b) (GaugeFieldData.includeFermion_apply (fermionAlgebraEquiv f)).symm diff --git a/Physlib/Particles/StandardModel/JetAlgebra/Invariants.lean b/Physlib/Particles/StandardModel/JetAlgebra/Invariants.lean index 2c1f3a2d2..48c0fce21 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/Invariants.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/Invariants.lean @@ -81,12 +81,12 @@ open TensorProduct Matrix MatrixGroups noncomputable def gaugeField (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : Module.Dual ℝ GaugeAlgebra →ₗ[ℝ] JetAlgebra := (includeGauge.toLinearMap.restrictScalars ℝ).comp - ((GaugeJetAlgebra.gaugeField GaugeAlgebra) s μ) + ((LocalGaugeFieldAlgebra.gaugeField GaugeAlgebra) s μ) @[simp] lemma gaugeField_apply (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra) : - gaugeField s μ φ = includeGauge ((GaugeJetAlgebra.gaugeField GaugeAlgebra) s μ φ) := rfl + gaugeField s μ φ = includeGauge ((LocalGaugeFieldAlgebra.gaugeField GaugeAlgebra) s μ φ) := rfl /-- The gauge-field symbols `∂_s A_μ^φ` are the connection generators of the field datum: the derivative label, the spacetime index and the adjoint covector are unchanged, and the @@ -98,18 +98,19 @@ lemma gaugeField_eq_ιConnection (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 = fieldData.ιConnection (DerivAlgebraReal.basisMultiset s ⊗ₜ[ℝ] GaugeBoson.componentDual GaugeAlgebra (Lorentz.CoVector.basis.dualBasis μ) φ) := by - have hsector : (GaugeJetAlgebra.gaugeField GaugeAlgebra) s μ φ + have hsector : (LocalGaugeFieldAlgebra.gaugeField GaugeAlgebra) s μ φ = (1 : ℂ) ⊗ₜ[ℝ] SymmetricAlgebra.ι ℝ (GaugeBoson.JetComponentSpace GaugeAlgebra) (DerivAlgebraReal.basisMultiset s ⊗ₜ[ℝ] GaugeBoson.componentDual GaugeAlgebra (Lorentz.CoVector.basis.dualBasis μ) φ) := - (GaugeJetAlgebra.gaugeField_apply s μ φ).trans - ((GaugeJetAlgebra.iteratedD_complexJetDeriv_one_tmul s - ((GaugeJetAlgebra.ofA GaugeAlgebra) μ φ)).trans - (congrArg (fun g : GaugeJetAlgebra GaugeAlgebra => (1 : ℂ) ⊗ₜ[ℝ] g) - (GaugeJetAlgebra.iteratedJetDeriv_ofA s μ φ))) + (LocalGaugeFieldAlgebra.gaugeField_apply s μ φ).trans + ((LocalGaugeFieldAlgebra.iteratedD_complexJetDeriv_one_tmul s + ((LocalGaugeFieldAlgebra.ofA GaugeAlgebra) μ φ)).trans + (congrArg (fun g : LocalGaugeFieldAlgebra GaugeAlgebra => (1 : ℂ) ⊗ₜ[ℝ] g) + (LocalGaugeFieldAlgebra.iteratedJetDeriv_ofA s μ φ))) exact ((gaugeField_apply s μ φ).trans - (congrArg (fun y : ℂ ⊗[ℝ] GaugeJetAlgebra GaugeAlgebra => includeGauge y) hsector)).trans + (congrArg (fun y : ℂ ⊗[ℝ] LocalGaugeFieldAlgebra GaugeAlgebra => includeGauge y) + hsector)).trans (includeGauge_one_tmul_ι _) /-! @@ -119,7 +120,7 @@ lemma gaugeField_eq_ιConnection (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 -/ /-- The gauge sector lands in the centre of the jet algebra. -/ -lemma includeGauge_mem_center (y : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) : +lemma includeGauge_mem_center (y : ℂ ⊗[ℝ] (LocalGaugeFieldAlgebra GaugeAlgebra)) : includeGauge y ∈ Subring.center JetAlgebra := Subring.mem_center_iff.mpr fun z => includeGauge_commute y z @@ -175,7 +176,7 @@ theorem invariant_mem_adjoin_fieldStrength (S : Set JetAlgebra) GaugeAlgebraRealization.invariant_mem_adjoin_fieldStrength gaugeRealization S (fun p μ φ y _ => Subring.mem_center_iff.mp - (includeGauge_mem_center ((GaugeJetAlgebra.gaugeField GaugeAlgebra) p μ φ)) y) + (includeGauge_mem_center ((LocalGaugeFieldAlgebra.gaugeField GaugeAlgebra) p μ φ)) y) hS hx hinv end JetAlgebra diff --git a/Physlib/Particles/StandardModel/JetAlgebra/JetDeriv.lean b/Physlib/Particles/StandardModel/JetAlgebra/JetDeriv.lean index 6a68306cd..1af2cef58 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/JetDeriv.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/JetDeriv.lean @@ -8,7 +8,7 @@ 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.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.JetDeriv +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeFieldAlgebra.JetDeriv /-! # The total derivative on the jet algebra of the Standard Model @@ -93,7 +93,7 @@ noncomputable def jetDeriv (μ : Fin 1 ⊕ Fin 3) : JetAlgebra →ₗ[ℂ] JetAl + TensorProduct.map (TensorProduct.map LinearMap.id (jetDerivBosonFactor μ)) LinearMap.id + TensorProduct.map LinearMap.id - (_root_.GaugeJetAlgebra.complexJetDeriv GaugeAlgebra μ) + (_root_.LocalGaugeFieldAlgebra.complexJetDeriv GaugeAlgebra μ) /-! @@ -103,11 +103,11 @@ noncomputable def jetDeriv (μ : Fin 1 ⊕ Fin 3) : JetAlgebra →ₗ[ℂ] JetAl lemma jetDeriv_tmul (μ : Fin 1 ⊕ Fin 3) (f : ExteriorAlgebra ℂ fieldData.FermionGenerators) (h : SymmetricAlgebra ℂ fieldData.BosonGenerators) - (g : ℂ ⊗[ℝ] _root_.GaugeJetAlgebra GaugeAlgebra) : + (g : ℂ ⊗[ℝ] _root_.LocalGaugeFieldAlgebra GaugeAlgebra) : jetDeriv μ ((f ⊗ₜ[ℂ] h) ⊗ₜ[ℂ] g) = ((jetDerivFermionFactor μ f) ⊗ₜ[ℂ] h) ⊗ₜ[ℂ] g + (f ⊗ₜ[ℂ] (jetDerivBosonFactor μ h)) ⊗ₜ[ℂ] g - + (f ⊗ₜ[ℂ] h) ⊗ₜ[ℂ] (_root_.GaugeJetAlgebra.complexJetDeriv GaugeAlgebra μ g) := + + (f ⊗ₜ[ℂ] h) ⊗ₜ[ℂ] (_root_.LocalGaugeFieldAlgebra.complexJetDeriv GaugeAlgebra μ g) := rfl /-! @@ -210,13 +210,13 @@ private lemma iteratedD_map {A B : Type} [Ring A] [Algebra ℂ A] [Ring B] [Alge /-- The connection factor's derivative annihilates the unit of the complexified gauge-boson jet algebra. -/ private lemma complexJetDeriv_one (μ : Fin 1 ⊕ Fin 3) : - _root_.GaugeJetAlgebra.complexJetDeriv GaugeAlgebra μ - (1 : ℂ ⊗[ℝ] _root_.GaugeJetAlgebra GaugeAlgebra) = 0 := - (congrArg (_root_.GaugeJetAlgebra.complexJetDeriv GaugeAlgebra μ) + _root_.LocalGaugeFieldAlgebra.complexJetDeriv GaugeAlgebra μ + (1 : ℂ ⊗[ℝ] _root_.LocalGaugeFieldAlgebra GaugeAlgebra) = 0 := + (congrArg (_root_.LocalGaugeFieldAlgebra.complexJetDeriv GaugeAlgebra μ) Algebra.TensorProduct.one_def).trans - ((_root_.GaugeJetAlgebra.complexJetDeriv_tmul μ 1 1).trans - ((congrArg (fun z : _root_.GaugeJetAlgebra GaugeAlgebra => (1 : ℂ) ⊗ₜ[ℝ] z) - (_root_.GaugeJetAlgebra.jetDeriv_one μ)).trans + ((_root_.LocalGaugeFieldAlgebra.complexJetDeriv_tmul μ 1 1).trans + ((congrArg (fun z : _root_.LocalGaugeFieldAlgebra GaugeAlgebra => (1 : ℂ) ⊗ₜ[ℝ] z) + (_root_.LocalGaugeFieldAlgebra.jetDeriv_one μ)).trans (TensorProduct.tmul_zero _ _))) /-- The derivative acts on the fermionic factor through that factor's own derivation. The @@ -245,10 +245,10 @@ lemma jetDeriv_includeBosonFactor (μ : Fin 1 ⊕ Fin 3) /-- The derivative acts on the connection factor through the generic gauge-boson derivative. -/ lemma jetDeriv_includeConnection (μ : Fin 1 ⊕ Fin 3) - (y : ℂ ⊗[ℝ] _root_.GaugeJetAlgebra GaugeAlgebra) : + (y : ℂ ⊗[ℝ] _root_.LocalGaugeFieldAlgebra GaugeAlgebra) : jetDeriv μ (fieldData.includeConnection y) = fieldData.includeConnection - (_root_.GaugeJetAlgebra.complexJetDeriv GaugeAlgebra μ y) := + (_root_.LocalGaugeFieldAlgebra.complexJetDeriv GaugeAlgebra μ y) := (congrArg (jetDeriv μ) ((GaugeFieldData.includeConnection_apply y).trans (congrArg (fun w : fieldData.MatterAlgebra => w ⊗ₜ[ℂ] y) @@ -257,11 +257,11 @@ lemma jetDeriv_includeConnection (μ : Fin 1 ⊕ Fin 3) (SymmetricAlgebra.derivationOfLinear_one _) y).trans ((congrArg (fun w : fieldData.MatterAlgebra => - (w ⊗ₜ[ℂ] _root_.GaugeJetAlgebra.complexJetDeriv GaugeAlgebra μ y + (w ⊗ₜ[ℂ] _root_.LocalGaugeFieldAlgebra.complexJetDeriv GaugeAlgebra μ y : JetAlgebra)) GaugeFieldData.one_matterAlgebra.symm).trans (GaugeFieldData.includeConnection_apply - (_root_.GaugeJetAlgebra.complexJetDeriv GaugeAlgebra μ y)).symm)) + (_root_.LocalGaugeFieldAlgebra.complexJetDeriv GaugeAlgebra μ y)).symm)) /-! @@ -293,9 +293,9 @@ lemma jetDeriv_includeHiggs (μ : Fin 1 ⊕ Fin 3) (h : HiggsJetAlgebra) : gauge sector inclusion is the connection inclusion of the datum, the Standard Model gauge bosons being the generic ones at `GaugeAlgebra`. -/ lemma jetDeriv_includeGauge (μ : Fin 1 ⊕ Fin 3) - (y : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) : + (y : ℂ ⊗[ℝ] (LocalGaugeFieldAlgebra GaugeAlgebra)) : jetDeriv μ (includeGauge y) - = includeGauge (_root_.GaugeJetAlgebra.complexJetDeriv GaugeAlgebra μ y) := + = includeGauge (_root_.LocalGaugeFieldAlgebra.complexJetDeriv GaugeAlgebra μ y) := jetDeriv_includeConnection μ y /-! @@ -374,20 +374,20 @@ private lemma add₃_derivation {R : Type*} [NonUnitalNonAssocRing R] 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 := ℂ ⊗[ℝ] _root_.GaugeJetAlgebra GaugeAlgebra) + (B := ℂ ⊗[ℝ] _root_.LocalGaugeFieldAlgebra GaugeAlgebra) (TensorProduct.map (jetDerivFermionFactor μ) LinearMap.id) (TensorProduct.map_derivation_left (jetDerivFermionFactor μ) (ExteriorAlgebra.derivationOfLinear_mul _)) x y have h₂ := TensorProduct.map_derivation_left - (B := ℂ ⊗[ℝ] _root_.GaugeJetAlgebra GaugeAlgebra) + (B := ℂ ⊗[ℝ] _root_.LocalGaugeFieldAlgebra GaugeAlgebra) (TensorProduct.map LinearMap.id (jetDerivBosonFactor μ)) (TensorProduct.map_derivation_right (jetDerivBosonFactor μ) (SymmetricAlgebra.derivationOfLinear_mul _)) x y have h₃ := TensorProduct.map_derivation_right (A := ExteriorAlgebra ℂ fieldData.FermionGenerators ⊗[ℂ] SymmetricAlgebra ℂ fieldData.BosonGenerators) - (_root_.GaugeJetAlgebra.complexJetDeriv GaugeAlgebra μ) - (_root_.GaugeJetAlgebra.complexJetDeriv_mul μ) x y + (_root_.LocalGaugeFieldAlgebra.complexJetDeriv GaugeAlgebra μ) + (_root_.LocalGaugeFieldAlgebra.complexJetDeriv_mul μ) x y exact add₃_derivation h₁ h₂ h₃ /-! @@ -415,13 +415,13 @@ private lemma add₃_comp_comm {M : Type*} [AddCommMonoid M] [Module ℂ M] lemma jetDeriv_comm (μ ν : Fin 1 ⊕ Fin 3) : (jetDeriv μ).comp (jetDeriv ν) = (jetDeriv ν).comp (jetDeriv μ) := by have hW := fun (D D' : fieldData.MatterAlgebra →ₗ[ℂ] fieldData.MatterAlgebra) => - map_comp_map_left (B := ℂ ⊗[ℝ] _root_.GaugeJetAlgebra GaugeAlgebra) D D' - have hG := fun (D D' : (ℂ ⊗[ℝ] _root_.GaugeJetAlgebra GaugeAlgebra) →ₗ[ℂ] - (ℂ ⊗[ℝ] _root_.GaugeJetAlgebra GaugeAlgebra)) => + map_comp_map_left (B := ℂ ⊗[ℝ] _root_.LocalGaugeFieldAlgebra GaugeAlgebra) D D' + have hG := fun (D D' : (ℂ ⊗[ℝ] _root_.LocalGaugeFieldAlgebra GaugeAlgebra) →ₗ[ℂ] + (ℂ ⊗[ℝ] _root_.LocalGaugeFieldAlgebra GaugeAlgebra)) => map_comp_map_right (A := fieldData.MatterAlgebra) D D' have hWG := fun (D : fieldData.MatterAlgebra →ₗ[ℂ] fieldData.MatterAlgebra) - (D' : (ℂ ⊗[ℝ] _root_.GaugeJetAlgebra GaugeAlgebra) →ₗ[ℂ] - (ℂ ⊗[ℝ] _root_.GaugeJetAlgebra GaugeAlgebra)) => + (D' : (ℂ ⊗[ℝ] _root_.LocalGaugeFieldAlgebra GaugeAlgebra) →ₗ[ℂ] + (ℂ ⊗[ℝ] _root_.LocalGaugeFieldAlgebra GaugeAlgebra)) => map_left_comm_map_right D D' have hFH := fun (D : ExteriorAlgebra ℂ fieldData.FermionGenerators →ₗ[ℂ] ExteriorAlgebra ℂ fieldData.FermionGenerators) @@ -444,7 +444,7 @@ lemma jetDeriv_comm (μ ν : Fin 1 ⊕ Fin 3) : (fieldData.jetDerivBoson_comm μ ν) z have h11 := (hW _ _).trans ((congrArg (fun m => TensorProduct.map m - (LinearMap.id (M := ℂ ⊗[ℝ] _root_.GaugeJetAlgebra GaugeAlgebra))) + (LinearMap.id (M := ℂ ⊗[ℝ] _root_.LocalGaugeFieldAlgebra GaugeAlgebra))) ((hFF _ _).trans ((congrArg (fun d => TensorProduct.map d (LinearMap.id (M := SymmetricAlgebra ℂ fieldData.BosonGenerators))) @@ -452,7 +452,7 @@ lemma jetDeriv_comm (μ ν : Fin 1 ⊕ Fin 3) : (hW _ _).symm) have h22 := (hW _ _).trans ((congrArg (fun m => TensorProduct.map m - (LinearMap.id (M := ℂ ⊗[ℝ] _root_.GaugeJetAlgebra GaugeAlgebra))) + (LinearMap.id (M := ℂ ⊗[ℝ] _root_.LocalGaugeFieldAlgebra GaugeAlgebra))) ((hHH _ _).trans ((congrArg (fun d => TensorProduct.map (LinearMap.id (M := ExteriorAlgebra ℂ fieldData.FermionGenerators)) d) @@ -462,15 +462,15 @@ lemma jetDeriv_comm (μ ν : Fin 1 ⊕ Fin 3) : ((congrArg (fun d => TensorProduct.map (LinearMap.id (M := ExteriorAlgebra ℂ fieldData.FermionGenerators ⊗[ℂ] SymmetricAlgebra ℂ fieldData.BosonGenerators)) d) - (_root_.GaugeJetAlgebra.complexJetDeriv_comm μ ν)).trans (hG _ _).symm) + (_root_.LocalGaugeFieldAlgebra.complexJetDeriv_comm μ ν)).trans (hG _ _).symm) have h12 := (hW _ _).trans ((congrArg (fun m => TensorProduct.map m - (LinearMap.id (M := ℂ ⊗[ℝ] _root_.GaugeJetAlgebra GaugeAlgebra))) + (LinearMap.id (M := ℂ ⊗[ℝ] _root_.LocalGaugeFieldAlgebra GaugeAlgebra))) (hFH (jetDerivFermionFactor μ) (jetDerivBosonFactor ν))).trans (hW _ _).symm) have h21 := (hW _ _).trans ((congrArg (fun m => TensorProduct.map m - (LinearMap.id (M := ℂ ⊗[ℝ] _root_.GaugeJetAlgebra GaugeAlgebra))) + (LinearMap.id (M := ℂ ⊗[ℝ] _root_.LocalGaugeFieldAlgebra GaugeAlgebra))) (hFH (jetDerivFermionFactor ν) (jetDerivBosonFactor μ)).symm).trans (hW _ _).symm) exact add₃_comp_comm h11 h12 (hWG _ _) h21 h22 (hWG _ _) (hWG _ _).symm @@ -510,14 +510,14 @@ lemma iteratedD_includeHiggs (s : Multiset (Fin 1 ⊕ Fin 3)) (h : HiggsJetAlgeb iterated derivative. Like its two siblings this instantiates the abstract `iteratedD_map` rather than running the induction inside the jet algebra. -/ lemma iteratedD_includeGauge (s : Multiset (Fin 1 ⊕ Fin 3)) - (y : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) : + (y : ℂ ⊗[ℝ] (LocalGaugeFieldAlgebra GaugeAlgebra)) : Lorentz.iteratedD jetDeriv jetDeriv_comm s (includeGauge y) = includeGauge (Lorentz.iteratedD - (_root_.GaugeJetAlgebra.complexJetDeriv GaugeAlgebra) - _root_.GaugeJetAlgebra.complexJetDeriv_comm s y) := by - have hmap := iteratedD_map (A := ℂ ⊗[ℝ] _root_.GaugeJetAlgebra GaugeAlgebra) - (B := JetAlgebra) (_root_.GaugeJetAlgebra.complexJetDeriv GaugeAlgebra) - _root_.GaugeJetAlgebra.complexJetDeriv_comm jetDeriv jetDeriv_comm + (_root_.LocalGaugeFieldAlgebra.complexJetDeriv GaugeAlgebra) + _root_.LocalGaugeFieldAlgebra.complexJetDeriv_comm s y) := by + have hmap := iteratedD_map (A := ℂ ⊗[ℝ] _root_.LocalGaugeFieldAlgebra GaugeAlgebra) + (B := JetAlgebra) (_root_.LocalGaugeFieldAlgebra.complexJetDeriv GaugeAlgebra) + _root_.LocalGaugeFieldAlgebra.complexJetDeriv_comm jetDeriv jetDeriv_comm includeGauge.toLinearMap (fun μ x => (jetDeriv_includeGauge μ x).symm) s y exact hmap.symm diff --git a/Physlib/Particles/StandardModel/JetAlgebra/LorentzAction.lean b/Physlib/Particles/StandardModel/JetAlgebra/LorentzAction.lean index 5dcc0727b..96ea8fdd0 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/LorentzAction.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/LorentzAction.lean @@ -8,7 +8,7 @@ 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.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.LorentzAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeFieldAlgebra.LorentzAction public import Physlib.Particles.StandardModel.JetAlgebra.SectorEquiv.Structure /-! # The Lorentz action on the jet algebra of the Standard Model @@ -84,16 +84,16 @@ noncomputable abbrev repLorentzGroupBoson : transform independently. -/ noncomputable def repLorentzGroup : Representation ℂ SL(2,ℂ) JetAlgebra := (repLorentzGroupFermion.tprod repLorentzGroupBoson).tprod - (_root_.GaugeJetAlgebra.complexRepLorentzGroup GaugeAlgebra) + (_root_.LocalGaugeFieldAlgebra.complexRepLorentzGroup GaugeAlgebra) @[simp] lemma repLorentzGroup_tmul (Λ : SL(2,ℂ)) (w : ExteriorAlgebra ℂ fieldData.FermionGenerators ⊗[ℂ] SymmetricAlgebra ℂ fieldData.BosonGenerators) - (g : ℂ ⊗[ℝ] _root_.GaugeJetAlgebra GaugeAlgebra) : + (g : ℂ ⊗[ℝ] _root_.LocalGaugeFieldAlgebra GaugeAlgebra) : repLorentzGroup Λ (w ⊗ₜ[ℂ] g) = ((repLorentzGroupFermion.tprod repLorentzGroupBoson) Λ w) - ⊗ₜ[ℂ] (_root_.GaugeJetAlgebra.complexRepLorentzGroup GaugeAlgebra Λ g) := rfl + ⊗ₜ[ℂ] (_root_.LocalGaugeFieldAlgebra.complexRepLorentzGroup GaugeAlgebra Λ g) := rfl /-! @@ -109,7 +109,7 @@ lemma repLorentzGroup_apply_mul (Λ : SL(2,ℂ)) (x y : JetAlgebra) : (fun Λ' a b => Representation.exteriorAlgebra_apply_mul _ Λ' a b) (fun Λ' a b => Representation.symmetricAlgebra_apply_mul _ Λ' a b)) (fun Λ' a b => - _root_.GaugeJetAlgebra.complexRepLorentzGroup_apply_mul Λ' a b) Λ x y + _root_.LocalGaugeFieldAlgebra.complexRepLorentzGroup_apply_mul Λ' a b) Λ x y /-! @@ -119,11 +119,11 @@ lemma repLorentzGroup_apply_mul (Λ : SL(2,ℂ)) (x y : JetAlgebra) : /-- The Lorentz action on the complexified gauge sector fixes the unit. -/ lemma complexRepLorentzGroup_apply_one (Λ : SL(2,ℂ)) : - (_root_.GaugeJetAlgebra.complexRepLorentzGroup GaugeAlgebra) Λ - (1 : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) = 1 := by + (_root_.LocalGaugeFieldAlgebra.complexRepLorentzGroup GaugeAlgebra) Λ + (1 : ℂ ⊗[ℝ] (LocalGaugeFieldAlgebra GaugeAlgebra)) = 1 := by rw [Algebra.TensorProduct.one_def, - _root_.GaugeJetAlgebra.complexRepLorentzGroup_tmul, - _root_.GaugeJetAlgebra.repLorentzGroup_apply_one] + _root_.LocalGaugeFieldAlgebra.complexRepLorentzGroup_tmul, + _root_.LocalGaugeFieldAlgebra.repLorentzGroup_apply_one] /-- The matter factor of the Lorentz action fixes the unit, by the same abstract instantiation as in the gauge action. -/ @@ -136,14 +136,14 @@ lemma repLorentzGroup_matter_one (Λ : SL(2,ℂ)) : /-- The Lorentz action restricts to the generic connection factor. -/ lemma repLorentzGroup_includeConnection (Λ : SL(2,ℂ)) - (y : ℂ ⊗[ℝ] _root_.GaugeJetAlgebra GaugeAlgebra) : + (y : ℂ ⊗[ℝ] _root_.LocalGaugeFieldAlgebra GaugeAlgebra) : repLorentzGroup Λ (fieldData.includeConnection y) = fieldData.includeConnection - (_root_.GaugeJetAlgebra.complexRepLorentzGroup GaugeAlgebra Λ y) := + (_root_.LocalGaugeFieldAlgebra.complexRepLorentzGroup GaugeAlgebra Λ y) := (congrArg (repLorentzGroup Λ) (GaugeFieldData.includeConnection_apply y)).trans ((Representation.tprod_apply_one_tmul _ _ Λ (repLorentzGroup_matter_one Λ) y).trans (GaugeFieldData.includeConnection_apply - (_root_.GaugeJetAlgebra.complexRepLorentzGroup GaugeAlgebra Λ y)).symm) + (_root_.LocalGaugeFieldAlgebra.complexRepLorentzGroup GaugeAlgebra Λ y)).symm) /-- The Lorentz action restricts to the fermionic factor, where it is the exterior-algebra functor applied to the species-wise action of the datum. -/ @@ -155,7 +155,7 @@ lemma repLorentzGroup_includeFermionFactor (Λ : SL(2,ℂ)) ((Representation.tprod_apply_tmul_one _ _ Λ _ (complexRepLorentzGroup_apply_one Λ)).trans ((congrArg (fun w : fieldData.MatterAlgebra => - ((w ⊗ₜ[ℂ] (1 : ℂ ⊗[ℝ] _root_.GaugeJetAlgebra GaugeAlgebra)) : JetAlgebra)) + ((w ⊗ₜ[ℂ] (1 : ℂ ⊗[ℝ] _root_.LocalGaugeFieldAlgebra GaugeAlgebra)) : JetAlgebra)) (Representation.tprod_apply_tmul_one _ _ Λ a (Representation.symmetricAlgebra_apply_one _ Λ))).trans (GaugeFieldData.includeFermion_apply (repLorentzGroupFermion Λ a)).symm)) @@ -170,7 +170,7 @@ lemma repLorentzGroup_includeBosonFactor (Λ : SL(2,ℂ)) ((Representation.tprod_apply_tmul_one _ _ Λ _ (complexRepLorentzGroup_apply_one Λ)).trans ((congrArg (fun w : fieldData.MatterAlgebra => - ((w ⊗ₜ[ℂ] (1 : ℂ ⊗[ℝ] _root_.GaugeJetAlgebra GaugeAlgebra)) : JetAlgebra)) + ((w ⊗ₜ[ℂ] (1 : ℂ ⊗[ℝ] _root_.LocalGaugeFieldAlgebra GaugeAlgebra)) : JetAlgebra)) (Representation.tprod_apply_one_tmul _ _ Λ (Representation.exteriorAlgebra_apply_one _ Λ) b)).trans (GaugeFieldData.includeBoson_apply (repLorentzGroupBoson Λ b)).symm)) @@ -185,9 +185,9 @@ lemma repLorentzGroup_includeBosonFactor (Λ : SL(2,ℂ)) inclusion is the connection inclusion of the datum, the Standard Model gauge bosons being the generic ones at `GaugeAlgebra`. -/ lemma repLorentzGroup_includeGauge (Λ : SL(2,ℂ)) - (y : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) : + (y : ℂ ⊗[ℝ] (LocalGaugeFieldAlgebra GaugeAlgebra)) : repLorentzGroup Λ (includeGauge y) - = includeGauge (_root_.GaugeJetAlgebra.complexRepLorentzGroup GaugeAlgebra Λ y) := + = includeGauge (_root_.LocalGaugeFieldAlgebra.complexRepLorentzGroup GaugeAlgebra Λ y) := repLorentzGroup_includeConnection Λ y /-- The Lorentz action restricts to the fermionic sector's own action. -/ @@ -253,12 +253,12 @@ lemma repLorentzGroup_jetDeriv (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) (x : JetA have e : ∀ ν, TensorProduct.map (TensorProduct.map (jetDerivFermionFactor ν) LinearMap.id + TensorProduct.map LinearMap.id (jetDerivBosonFactor ν)) - (LinearMap.id (M := ℂ ⊗[ℝ] _root_.GaugeJetAlgebra GaugeAlgebra)) + (LinearMap.id (M := ℂ ⊗[ℝ] _root_.LocalGaugeFieldAlgebra GaugeAlgebra)) + TensorProduct.map LinearMap.id - (_root_.GaugeJetAlgebra.complexJetDeriv GaugeAlgebra ν) + (_root_.LocalGaugeFieldAlgebra.complexJetDeriv GaugeAlgebra ν) = jetDeriv ν := fun ν => congrArg (fun m => m + TensorProduct.map LinearMap.id - (_root_.GaugeJetAlgebra.complexJetDeriv GaugeAlgebra ν)) + (_root_.LocalGaugeFieldAlgebra.complexJetDeriv GaugeAlgebra ν)) (TensorProduct.map_add_left _ _ _) -- The two factor covariances are stated without a type ascription: instantiating the -- abstract lemma against an expected type leaves the family and the coefficients as @@ -293,7 +293,7 @@ lemma repLorentzGroup_jetDeriv (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) (x : JetA tprod_deriv_sum _ _ _ _ _ Λ ν (fun κ z => hFermion κ z) (fun κ z => hBoson κ z) w refine (congrArg (fun (L : JetAlgebra →ₗ[ℂ] JetAlgebra) => repLorentzGroup Λ (L x)) (e μ).symm).trans ((tprod_deriv_sum _ _ _ _ _ Λ μ hFH - (fun κ z => _root_.GaugeJetAlgebra.complexRepLorentzGroup_jetDeriv Λ κ z) x).trans + (fun κ z => _root_.LocalGaugeFieldAlgebra.complexRepLorentzGroup_jetDeriv Λ κ z) x).trans (Finset.sum_congr rfl fun a _ => congrArg (fun (L : JetAlgebra →ₗ[ℂ] JetAlgebra) => (((Lorentz.SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • L (repLorentzGroup Λ x)) diff --git a/Physlib/Particles/StandardModel/JetAlgebra/MassWeightPoly.lean b/Physlib/Particles/StandardModel/JetAlgebra/MassWeightPoly.lean index a3cceae9a..badef2fd8 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/MassWeightPoly.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/MassWeightPoly.lean @@ -8,7 +8,7 @@ module public import Physlib.Particles.StandardModel.JetAlgebra.Generators public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.MassWeightPoly public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.MassWeightPoly -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.MassWeightPoly +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeFieldAlgebra.MassWeightPoly /-! # The mass-weight polynomial on the jet algebra of the Standard Model @@ -17,7 +17,7 @@ public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebr Each of the three sectors of the jet algebra of the Standard Model carries its own mass-weight grading: `FermionicAlgebra.massWeightPoly 3` on the fermions, whose symbols have mass dimension `3/2`, `BosonicAlgebra.massWeightPoly 2` on the Higgs and -`GaugeJetAlgebra.complexMassWeightPoly` on the gauge bosons, whose symbols have mass +`LocalGaugeFieldAlgebra.complexMassWeightPoly` on the gauge bosons, whose symbols have mass dimension one. This file assembles them into a single grading `massWeightPoly : JetAlgebra →ₐ[ℂ] Polynomial JetAlgebra` @@ -119,7 +119,7 @@ lemma commute_mapAlgHom {A B C : Type*} [Semiring A] [Algebra ℂ A] [Semiring B in the gauge sector: the gauge sector is central, so the commutation holds coefficient by coefficient. -/ lemma commute_mapAlgHom_includeGauge (p : Polynomial JetAlgebra) - (q : Polynomial (ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra))) : + (q : Polynomial (ℂ ⊗[ℝ] (LocalGaugeFieldAlgebra GaugeAlgebra))) : Commute p (Polynomial.mapAlgHom includeGauge q) := by induction q using Polynomial.induction_on' with | add q₁ q₂ h₁ h₂ => rw [map_add]; exact h₁.add_right h₂ @@ -156,8 +156,8 @@ noncomputable def higgsMassWeightPoly : HiggsJetAlgebra →ₐ[ℂ] Polynomial J /-- The gauge-boson mass-weight grading, transported into the full jet algebra. The gauge symbols have mass dimension one, hence mass weight two. -/ noncomputable def gaugeMassWeightPoly : - (ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) →ₐ[ℂ] Polynomial JetAlgebra := - (Polynomial.mapAlgHom includeGauge).comp GaugeJetAlgebra.complexMassWeightPoly + (ℂ ⊗[ℝ] (LocalGaugeFieldAlgebra GaugeAlgebra)) →ₐ[ℂ] Polynomial JetAlgebra := + (Polynomial.mapAlgHom includeGauge).comp LocalGaugeFieldAlgebra.complexMassWeightPoly /-- The fermionic grading read on the fermionic factor of the carrier: the fermionic sector grading, precomposed with the sector equivalence. The sector helper above keeps its own @@ -203,7 +203,7 @@ noncomputable def matterMassWeightPoly : outer lift being the centrality of the gauge sector. -/ noncomputable def massWeightPoly : JetAlgebra →ₐ[ℂ] Polynomial JetAlgebra := Algebra.TensorProduct.lift (R := ℂ) (S := ℂ) - (A := fieldData.MatterAlgebra) (B := ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) + (A := fieldData.MatterAlgebra) (B := ℂ ⊗[ℝ] (LocalGaugeFieldAlgebra GaugeAlgebra)) (C := Polynomial JetAlgebra) matterMassWeightPoly gaugeMassWeightPoly fun _ _ => commute_mapAlgHom_includeGauge _ _ @@ -220,7 +220,7 @@ generator computation below is one of them followed by a sector generator lemma. /-- On a pure tensor the grading is the product of the matter and gauge gradings. -/ lemma massWeightPoly_tmul (x : fieldData.MatterAlgebra) - (y : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) : + (y : ℂ ⊗[ℝ] (LocalGaugeFieldAlgebra GaugeAlgebra)) : massWeightPoly (x ⊗ₜ[ℂ] y) = matterMassWeightPoly x * gaugeMassWeightPoly y := rfl /-- On a pure tensor the matter grading is the product of the fermionic and bosonic factor @@ -261,7 +261,7 @@ lemma massWeightPoly_includeBosonFactor ((mul_one _).trans (one_mul _)))) /-- On the connection factor the grading is the generic gauge-boson grading. -/ -lemma massWeightPoly_includeConnection (y : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) : +lemma massWeightPoly_includeConnection (y : ℂ ⊗[ℝ] (LocalGaugeFieldAlgebra GaugeAlgebra)) : massWeightPoly (fieldData.includeConnection y) = gaugeMassWeightPoly y := (congrArg massWeightPoly (GaugeFieldData.includeConnection_apply y)).trans ((massWeightPoly_tmul _ _).trans @@ -291,9 +291,9 @@ lemma massWeightPoly_includeHiggs (h : HiggsJetAlgebra) : /-- On the gauge sector the grading is the gauge sector's own grading, pushed forward along the gauge inclusion. The gauge sector inclusion is the connection inclusion of the datum, so there is nothing to transport here. -/ -lemma massWeightPoly_includeGauge (y : ℂ ⊗[ℝ] (GaugeJetAlgebra GaugeAlgebra)) : +lemma massWeightPoly_includeGauge (y : ℂ ⊗[ℝ] (LocalGaugeFieldAlgebra GaugeAlgebra)) : massWeightPoly (includeGauge y) - = Polynomial.mapAlgHom includeGauge (GaugeJetAlgebra.complexMassWeightPoly y) := + = Polynomial.mapAlgHom includeGauge (LocalGaugeFieldAlgebra.complexMassWeightPoly y) := massWeightPoly_includeConnection y /-- The mass-weight exponent of a symbol of mass dimension one, in the two forms the @@ -363,16 +363,16 @@ lemma massWeightPoly_gaugeField (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ massWeightPoly (gaugeField s μ φ) = Polynomial.monomial (2 * (1 + Multiset.card s)) (gaugeField s μ φ) := have hg : gaugeField s μ φ - = includeGauge ((1 : ℂ) ⊗ₜ[ℝ] GaugeJetAlgebra.iteratedJetDeriv GaugeAlgebra s - (GaugeJetAlgebra.ofA GaugeAlgebra μ φ)) := + = includeGauge ((1 : ℂ) ⊗ₜ[ℝ] LocalGaugeFieldAlgebra.iteratedJetDeriv GaugeAlgebra s + (LocalGaugeFieldAlgebra.ofA GaugeAlgebra μ φ)) := (gaugeField_apply s μ φ).trans (congrArg includeGauge - (_root_.GaugeJetAlgebra.iteratedD_complexJetDeriv_one_tmul s - (_root_.GaugeJetAlgebra.ofA GaugeAlgebra μ φ))) + (_root_.LocalGaugeFieldAlgebra.iteratedD_complexJetDeriv_one_tmul s + (_root_.LocalGaugeFieldAlgebra.ofA GaugeAlgebra μ φ))) (congrArg massWeightPoly hg).trans ((massWeightPoly_includeGauge _).trans ((congrArg (Polynomial.mapAlgHom includeGauge) - (GaugeJetAlgebra.complexMassWeightPoly_tmul_iteratedJetDeriv_ofA + (LocalGaugeFieldAlgebra.complexMassWeightPoly_tmul_iteratedJetDeriv_ofA 1 s μ φ)).trans ((Polynomial.mapAlgHom_monomial includeGauge _ _).trans ((monomial_two_mul_one_add _ _).trans diff --git a/Physlib/Particles/StandardModel/JetAlgebra/SectorEquiv/Basic.lean b/Physlib/Particles/StandardModel/JetAlgebra/SectorEquiv/Basic.lean index a986eaab7..9a8b328e4 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/SectorEquiv/Basic.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/SectorEquiv/Basic.lean @@ -10,7 +10,7 @@ public import Physlib.Particles.StandardModel.Fermions.JetAlgebra.Basic public import Physlib.Particles.StandardModel.HiggsBoson.JetAlgebra.Basic public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.JetDeriv public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.JetDeriv -public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.GaugeJetAlgebra.GaugeField +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeFieldAlgebra.GaugeField public import Physlib.Mathematics.ExteriorAlgebra public import Physlib.Mathematics.SymmetricAlgebra /-! From 00ded6738d651536db940ec079cba83253aacd99 Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Sun, 13 Sep 2026 00:57:14 +0400 Subject: [PATCH 324/367] feat: Algebra Realization for LocalGaugeFieldAlgebra and LocalGaugeCovFieldAlgebra --- Physlib.lean | 2 + .../LocalGaugeCovFieldAlgebra/Basic.lean | 93 +++++- .../Realization.lean | 224 +++++++++++++ .../LocalGaugeFieldAlgebra/FieldStrength.lean | 29 ++ .../LocalGaugeFieldAlgebra/Realization.lean | 305 ++++++++++++++++++ .../GaugeBoson/Realization/Basic.lean | 12 + .../Mathematics/AlgebraRepresentation.lean | 25 ++ 7 files changed, 687 insertions(+), 3 deletions(-) create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeCovFieldAlgebra/Realization.lean create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeFieldAlgebra/Realization.lean diff --git a/Physlib.lean b/Physlib.lean index 507908af5..188d3e2bb 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -2,6 +2,7 @@ module public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeCovFieldAlgebra.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeCovFieldAlgebra.Realization public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeFieldAlgebra.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeFieldAlgebra.FieldStrength public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeFieldAlgebra.GaugeAction @@ -10,6 +11,7 @@ public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeFiel public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeFieldAlgebra.LorentzAction public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeFieldAlgebra.MassDim public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeFieldAlgebra.MassWeightPoly +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeFieldAlgebra.Realization public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.FieldStrength public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.GaugeLaw diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeCovFieldAlgebra/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeCovFieldAlgebra/Basic.lean index 8b1d10ed6..9f4507ffb 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeCovFieldAlgebra/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeCovFieldAlgebra/Basic.lean @@ -27,8 +27,10 @@ restricted actions are built with `Representation.restrictSubalgebra`. ## ii. Key results - `LocalGaugeCovFieldAlgebra` : the covariant field algebra, with - `LocalGaugeCovFieldAlgebra.induction` and `LocalGaugeCovFieldAlgebra.mapsTo` as its - generation API. + `LocalGaugeCovFieldAlgebra.induction`, `LocalGaugeCovFieldAlgebra.mapsTo` and + `LocalGaugeCovFieldAlgebra.algHom_ext` as its generation API. +- `LocalGaugeCovFieldAlgebra.covF` : the generators `∇_l F_μν^φ` as elements of the + covariant field algebra. - `LocalGaugeCovFieldAlgebra.repJet`, `LocalGaugeCovFieldAlgebra.repValue`, `LocalGaugeCovFieldAlgebra.repLorentzGroup` : the restricted actions of the jet gauge group, of the ordinary gauge group and of the Lorentz group. @@ -39,9 +41,11 @@ restricted actions are built with `Representation.restrictSubalgebra`. - A. The covariant field algebra - A.1. Generation + - A.2. The generators as elements of the covariant field algebra - B. Stability under the actions - C. The restricted actions - C.1. The action of the ordinary gauge group + - C.2. The actions on the generators -/ @@ -128,6 +132,42 @@ lemma mapsTo (f : LocalGaugeFieldAlgebra 𝔤 →ₐ[ℝ] LocalGaugeFieldAlgebra /-! +### A.2. The generators as elements of the covariant field algebra + +-/ + +variable (𝔤) in +/-- The generators `∇_l F_μν^φ` of the covariant field algebra, as elements of it. -/ +noncomputable def covF (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : + Module.Dual ℝ 𝔤 →ₗ[ℝ] LocalGaugeCovFieldAlgebra 𝔤 where + toFun φ := ⟨covDerivFieldStrength 𝔤 l μ ν φ, covDerivFieldStrength_mem l μ ν φ⟩ + map_add' _ _ := Subtype.ext (map_add _ _ _) + map_smul' _ _ := Subtype.ext (map_smul _ _ _) + +@[simp] +lemma coe_covF (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + (covF 𝔤 l μ ν φ : LocalGaugeFieldAlgebra 𝔤) = covDerivFieldStrength 𝔤 l μ ν φ := rfl + +lemma coe_covF_nil (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + (covF 𝔤 [] μ ν φ : LocalGaugeFieldAlgebra 𝔤) = fieldStrength 𝔤 μ ν φ := rfl + +lemma val_comp_covF (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : + (LocalGaugeCovFieldAlgebra 𝔤).val.toLinearMap ∘ₗ covF 𝔤 l μ ν + = covDerivFieldStrength 𝔤 l μ ν := rfl + +/-- Two algebra maps out of the covariant field algebra agreeing on the generators are + equal. This is uniqueness only: the covariant field algebra is not free on the generators, + so an assignment of their images does not by itself define a map. -/ +lemma algHom_ext {B : Type} [Semiring B] [Algebra ℝ B] + {f g : LocalGaugeCovFieldAlgebra 𝔤 →ₐ[ℝ] B} + (h : ∀ (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), + f (covF 𝔤 l μ ν φ) = g (covF 𝔤 l μ ν φ)) : f = g := + AlgHom.ext_of_eq_adjoin rfl fun x hx => by + obtain ⟨l, μ, ν, φ, rfl⟩ := hx + exact h l μ ν φ + +/-! + ## B. Stability under the actions -/ @@ -174,6 +214,10 @@ noncomputable def repJet : Representation ℝ GJ (LocalGaugeCovFieldAlgebra 𝔤 lemma coe_repJet (U : GJ) (x : LocalGaugeCovFieldAlgebra 𝔤) : (repJet jets U x : LocalGaugeFieldAlgebra 𝔤) = LocalGaugeFieldAlgebra.repJet jets U x := rfl +lemma repJet_apply_mul (U : GJ) (x y : LocalGaugeCovFieldAlgebra 𝔤) : + repJet jets U (x * y) = repJet jets U x * repJet jets U y := + Subtype.ext (LocalGaugeFieldAlgebra.repJet_apply_mul U (x : LocalGaugeFieldAlgebra 𝔤) y) + variable (𝔤) in /-- The action of the Lorentz group on the covariant field algebra, restricted from the local gauge field algebra. -/ @@ -186,6 +230,11 @@ lemma coe_repLorentzGroup (Λ : SL(2,ℂ)) (x : LocalGaugeCovFieldAlgebra 𝔤) (repLorentzGroup 𝔤 Λ x : LocalGaugeFieldAlgebra 𝔤) = LocalGaugeFieldAlgebra.repLorentzGroup 𝔤 Λ x := rfl +lemma repLorentzGroup_apply_mul (Λ : SL(2,ℂ)) (x y : LocalGaugeCovFieldAlgebra 𝔤) : + repLorentzGroup 𝔤 Λ (x * y) = repLorentzGroup 𝔤 Λ x * repLorentzGroup 𝔤 Λ y := + Subtype.ext + (LocalGaugeFieldAlgebra.repLorentzGroup_apply_mul Λ (x : LocalGaugeFieldAlgebra 𝔤) y) + /-! ### C.1. The action of the ordinary gauge group @@ -203,6 +252,10 @@ lemma coe_repValue (g : G₀) (x : LocalGaugeCovFieldAlgebra 𝔤) : (repValue jets g x : LocalGaugeFieldAlgebra 𝔤) = LocalGaugeFieldAlgebra.repJet jets (jets.ofConstant g) x := rfl +lemma repValue_apply_mul (g : G₀) (x y : LocalGaugeCovFieldAlgebra 𝔤) : + repValue jets g (x * y) = repValue jets g x * repValue jets g y := + repJet_apply_mul (jets.ofConstant g) x y + /-- The action of the jet gauge group on the covariant field algebra factors through evaluation: a jet acts as the constant jet of its value. The derivatives of a gauge transformation act trivially on covariant expressions. -/ @@ -220,6 +273,40 @@ theorem repJet_eq_repValue_eval (U : GJ) (x : LocalGaugeCovFieldAlgebra 𝔤) : · intro x y hx hy rw [map_add, map_add, hx, hy] · intro x y hx hy - rw [repJet_apply_mul, repJet_apply_mul, hx, hy] + rw [LocalGaugeFieldAlgebra.repJet_apply_mul, LocalGaugeFieldAlgebra.repJet_apply_mul, hx, hy] + +/-! + +### C.2. The actions on the generators + +-/ + +/-- The ordinary gauge group rotates the adjoint index of a generator through the dual + adjoint action of the inverse. -/ +lemma repValue_covF (g : G₀) (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ 𝔤) : + repValue jets g (covF 𝔤 l μ ν φ) = covF 𝔤 l μ ν ((jets.adjointValue g⁻¹).dualMap φ) := by + refine Subtype.ext ?_ + rw [coe_repValue, coe_covF, coe_covF, repJet_covDerivFieldStrength_eval, map_inv jets.eval, + jets.eval_ofConstant] + +/-- A jet acts on a generator through the value of its inverse alone. -/ +lemma repJet_covF (U : GJ) (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ 𝔤) : + repJet jets U (covF 𝔤 l μ ν φ) + = covF 𝔤 l μ ν ((jets.adjointValue (jets.eval U⁻¹)).dualMap φ) := by + rw [repJet_eq_repValue_eval, repValue_covF, map_inv jets.eval] + +/-- The Lorentz law of the generators: every covariant slot and both covector indices mix + by the columns of the Lorentz matrix. -/ +lemma repLorentzGroup_covF (Λ : SL(2,ℂ)) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + repLorentzGroup 𝔤 Λ (covF 𝔤 (List.ofFn 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 ν : ℝ) • + covF 𝔤 (List.ofFn p) a b φ := by + refine Subtype.ext ?_ + rw [coe_repLorentzGroup, coe_covF, repLorentzGroup_covDerivFieldStrength] + simp only [AddSubmonoidClass.coe_finsetSum, Subalgebra.coe_smul, coe_covF] end LocalGaugeCovFieldAlgebra diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeCovFieldAlgebra/Realization.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeCovFieldAlgebra/Realization.lean new file mode 100644 index 000000000..f79ee1c51 --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeCovFieldAlgebra/Realization.lean @@ -0,0 +1,224 @@ +/- +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.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeCovFieldAlgebra.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeFieldAlgebra.Realization +/-! +# Realizations of the covariant field algebra + +## i. Overview + +A real algebra `B` carries the covariant gauge-boson tower when the covariant field algebra +maps into it by a real algebra map equivariant for the ordinary gauge group `G₀` (acting on +the source by `repValue`) and for the Lorentz group, both acting on `B` by algebra +endomorphisms: `LocalGaugeCovFieldAlgebra.Realization`. The gauge compatibility is with `G₀` +alone because the jet action on the covariant field algebra factors through evaluation. + +The covariant field algebra is not free on its generators, so a realization is its algebra +map and not an assignment of the generators; generation gives uniqueness only +(`Realization.ext_F`). A realization of the local gauge field algebra restricts to one of +the covariant field algebra (`LocalGaugeFieldAlgebra.Realization.restrict`), with `G₀` +acting on the target through the constant jets. The converse extension is not claimed. + +## ii. Key results + +- `LocalGaugeCovFieldAlgebra.Realization` : an algebra carrying the covariant tower. +- `LocalGaugeCovFieldAlgebra.Realization.F` : the covariant tower of a realization, with the + laws `gauge_F` and `lorentz_F` and the extensionality `ext_F`. +- `LocalGaugeFieldAlgebra.Realization.restrict` : restriction to the covariant field + algebra, with `restrict_F_eq_iteratedCovDerivAdjoint` identifying its tower. + +## iii. Table of contents + +- A. Realizations +- B. The covariant tower of a realization +- C. Restriction from the local gauge field algebra + +-/ + +@[expose] public section + +set_option linter.unusedSectionVars false + +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] +variable {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] +variable {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} + +open TensorProduct Matrix MatrixGroups Lorentz +open LocalGaugeFieldAlgebra (fieldStrength covDerivFieldStrength) + +namespace LocalGaugeCovFieldAlgebra + +/-! + +## A. Realizations + +-/ + +/-- A real algebra `B` carrying the covariant gauge-boson tower of the package `jets`: a + real algebra map out of the covariant field algebra, equivariant for the ordinary gauge + group and the Lorentz group, both acting on the whole of `B` by algebra endomorphisms. -/ +@[ext] +structure Realization (jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J) (B : Type) [Ring B] [Algebra ℝ B] + (repGauge : Representation ℝ G₀ B) (repLorentz : Representation ℝ SL(2,ℂ) B) where + /-- The algebra map out of the covariant field algebra. -/ + toAlgHom : LocalGaugeCovFieldAlgebra 𝔤 →ₐ[ℝ] B + /-- The map is equivariant for the ordinary gauge group. -/ + map_repValue : ∀ (g : G₀) (x : LocalGaugeCovFieldAlgebra 𝔤), + toAlgHom (repValue jets g x) = repGauge g (toAlgHom x) + /-- The map is equivariant for the Lorentz group. -/ + map_repLorentz : ∀ (Λ : SL(2,ℂ)) (x : LocalGaugeCovFieldAlgebra 𝔤), + toAlgHom (repLorentzGroup 𝔤 Λ x) = repLorentz Λ (toAlgHom x) + /-- The ordinary gauge group acts on the whole of `B` by algebra endomorphisms. -/ + repGauge_mul : ∀ (g : G₀) (b₁ b₂ : B), repGauge g (b₁ * b₂) = repGauge g b₁ * repGauge g b₂ + /-- The Lorentz group acts on the whole of `B` by algebra endomorphisms. -/ + repLorentz_mul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂ + +namespace Realization + +variable {B : Type} [Ring B] [Algebra ℝ B] {repGauge : Representation ℝ G₀ B} + {repLorentz : Representation ℝ SL(2,ℂ) B} + +variable (jets) in +/-- The covariant field algebra realized in itself, by the identity. -/ +noncomputable def id : Realization jets (LocalGaugeCovFieldAlgebra 𝔤) (repValue jets) + (repLorentzGroup 𝔤) where + toAlgHom := AlgHom.id ℝ _ + map_repValue _ _ := rfl + map_repLorentz _ _ := rfl + repGauge_mul := repValue_apply_mul + repLorentz_mul := repLorentzGroup_apply_mul + +@[simp] +lemma id_toAlgHom : (id jets).toAlgHom = AlgHom.id ℝ (LocalGaugeCovFieldAlgebra 𝔤) := rfl + +variable (k : Realization jets B repGauge repLorentz) + +/-! + +## B. The covariant tower of a realization + +-/ + +/-- The covariant tower `∇_l F_μν^φ` of a realization: the images of the generators of the + covariant field algebra. -/ +noncomputable def F (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : + Module.Dual ℝ 𝔤 →ₗ[ℝ] B := + k.toAlgHom.toLinearMap ∘ₗ covF 𝔤 l μ ν + +lemma F_apply (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + k.F l μ ν φ = k.toAlgHom (covF 𝔤 l μ ν φ) := rfl + +@[simp] +lemma id_F : (id jets).F = covF 𝔤 := rfl + +lemma F_nil (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + k.F [] μ ν φ = k.toAlgHom ⟨fieldStrength 𝔤 μ ν φ, fieldStrength_mem μ ν φ⟩ := rfl + +lemma commute_F (l l' : List (Fin 1 ⊕ Fin 3)) (μ ν μ' ν' : Fin 1 ⊕ Fin 3) + (φ ψ : Module.Dual ℝ 𝔤) : Commute (k.F l μ ν φ) (k.F l' μ' ν' ψ) := + (Commute.all _ _).map k.toAlgHom + +/-- Two realizations with the same covariant tower are equal. This is uniqueness only: a + tower in `B` need not come from a realization. -/ +lemma ext_F {k₁ k₂ : Realization jets B repGauge repLorentz} + (hF : ∀ (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), + k₁.F l μ ν φ = k₂.F l μ ν φ) : k₁ = k₂ := + Realization.ext (algHom_ext hF) + +/-- The gauge law of the covariant tower: the adjoint index rotates through the dual + adjoint action of the inverse. -/ +lemma gauge_F (g : G₀) (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ 𝔤) : + repGauge g (k.F l μ ν φ) = k.F l μ ν ((jets.adjointValue g⁻¹).dualMap φ) := by + rw [F_apply, ← k.map_repValue, repValue_covF] + rfl + +/-- The Lorentz law of the covariant tower: every covariant slot and both covector indices + mix by the columns of the Lorentz matrix. -/ +lemma lorentz_F (Λ : SL(2,ℂ)) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ 𝔤) : + repLorentz Λ (k.F (List.ofFn 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 ν : ℝ) • + k.F (List.ofFn p) a b φ := by + rw [F_apply, ← k.map_repLorentz, repLorentzGroup_covF, map_sum] + refine Finset.sum_congr rfl fun p _ => ?_ + rw [map_smul, map_sum] + refine congrArg _ (Finset.sum_congr rfl fun a _ => ?_) + rw [map_smul, map_sum] + exact congrArg _ (Finset.sum_congr rfl fun b _ => map_smul k.toAlgHom _ _) + +/-- A covariant realization intertwines the jet action with the `G₀` action at the value + of the jet. -/ +lemma map_repJet (U : GJ) (x : LocalGaugeCovFieldAlgebra 𝔤) : + k.toAlgHom (repJet jets U x) = repGauge (jets.eval U) (k.toAlgHom x) := by + rw [repJet_eq_repValue_eval, k.map_repValue] + +end Realization + +end LocalGaugeCovFieldAlgebra + +/-! + +## C. Restriction from the local gauge field algebra + +-/ + +namespace LocalGaugeFieldAlgebra.Realization + +variable {B : Type} [Ring B] [Algebra ℝ B] {repJet : Representation ℝ GJ B} + {repLorentz : Representation ℝ SL(2,ℂ) B} (h : Realization jets B repJet repLorentz) + +/-- The restriction of a realization of the local gauge field algebra to the covariant + field algebra, along the inclusion; the ordinary gauge group acts on the target as the + constant jets. -/ +noncomputable def restrict : + LocalGaugeCovFieldAlgebra.Realization jets B (repJet.comp jets.ofConstant) repLorentz where + toAlgHom := h.toAlgHom.comp (LocalGaugeCovFieldAlgebra 𝔤).val + map_repValue g x := h.map_repJet (jets.ofConstant g) x + map_repLorentz Λ x := h.map_repLorentz Λ x + repGauge_mul g := h.repJet_mul (jets.ofConstant g) + repLorentz_mul := h.repLorentz_mul + +@[simp] +lemma restrict_toAlgHom_apply (x : LocalGaugeCovFieldAlgebra 𝔤) : + h.restrict.toAlgHom x = h.toAlgHom x := rfl + +lemma restrict_id_toAlgHom : + (id jets).restrict.toAlgHom = (LocalGaugeCovFieldAlgebra 𝔤).val := + AlgHom.ext fun _ => rfl + +lemma restrict_F (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + h.restrict.F l μ ν φ = h.toAlgHom (covDerivFieldStrength 𝔤 l μ ν φ) := rfl + +/-- The covariant tower of a restriction is the covariant tower of the symbols of `B`. -/ +lemma restrict_F_eq_iteratedCovDerivAdjoint (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ 𝔤) : + h.restrict.F l μ ν φ = GaugeAlgebraRealization.iteratedCovDerivAdjoint h.A l + (GaugeAlgebraRealization.fieldStrength h.A μ ν) 0 φ := + h.toAlgHom_covDerivFieldStrength l μ ν φ + +lemma restrict_F_nil (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + h.restrict.F [] μ ν φ = GaugeAlgebraRealization.fieldStrength h.A μ ν 0 φ := + h.toAlgHom_fieldStrength μ ν φ + +lemma restrict_map_repJet (U : GJ) (x : LocalGaugeCovFieldAlgebra 𝔤) : + h.restrict.toAlgHom (LocalGaugeCovFieldAlgebra.repJet jets U x) + = repJet U (h.restrict.toAlgHom x) := + h.map_repJet U x + +/-- On the image of the covariant field algebra a jet acts as the constant jet of its + value; nothing is assumed about the jet action elsewhere in `B`. -/ +lemma repJet_restrict_toAlgHom (U : GJ) (x : LocalGaugeCovFieldAlgebra 𝔤) : + repJet U (h.restrict.toAlgHom x) + = repJet (jets.ofConstant (jets.eval U)) (h.restrict.toAlgHom x) := by + rw [← restrict_map_repJet, h.restrict.map_repJet] + rfl + +end LocalGaugeFieldAlgebra.Realization diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeFieldAlgebra/FieldStrength.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeFieldAlgebra/FieldStrength.lean index d76d2902d..a2ce33c32 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeFieldAlgebra/FieldStrength.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeFieldAlgebra/FieldStrength.lean @@ -94,6 +94,15 @@ lemma gaugeField_eq_one_tmul_derivA (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 rw [gaugeField_apply, iteratedD_complexJetDeriv_one_tmul] rfl +/-- Two algebra maps out of the local gauge field algebra agreeing on the derivative + symbols `∂_s A_μ^φ` are equal. -/ +lemma algHom_ext {B : Type} [Semiring B] [Algebra ℝ B] {f g : LocalGaugeFieldAlgebra 𝔤 →ₐ[ℝ] B} + (h : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), + f (derivA 𝔤 s μ φ) = g (derivA 𝔤 s μ φ)) : f = g := by + refine AlgHom.ext_of_adjoin_eq_top adjoin_iteratedJetDeriv_eq_top fun x hx => ?_ + obtain ⟨_, ⟨s, rfl⟩, _, ⟨μ, rfl⟩, φ, rfl⟩ := hx + exact h s μ φ + /-! ## B. The field strength and its covariant derivatives @@ -353,6 +362,26 @@ lemma repLorentzGroup_comp_ofA (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) : simp only [LinearMap.comp_apply, repLorentzGroup_ofA, LinearMap.sum_apply, LinearMap.smul_apply] +/-- The Lorentz law of the derivative symbols, read off the complexified law + `repLorentz_gaugeField` along the injective `x ↦ 1 ⊗ₜ x`. -/ +lemma repLorentzGroup_derivA (Λ : SL(2,ℂ)) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + repLorentzGroup 𝔤 Λ (derivA 𝔤 (List.ofFn l) μ φ) + = ∑ p : Fin n → (Fin 1 ⊕ Fin 3), (∏ i, L[Λ] (p i) (l i)) • + ∑ a, L[Λ] a μ • derivA 𝔤 (List.ofFn p) a φ := by + -- `x ↦ 1 ⊗ₜ x` is injective: `ℝ → ℂ` is injective and every real module is flat. + apply Module.Flat.tensorProduct_mk_injective ℝ _ ℂ + simp only [TensorProduct.mk_apply] + rw [← complexRepLorentzGroup_tmul, ← gaugeField_eq_one_tmul_derivA, repLorentz_gaugeField, + TensorProduct.tmul_sum] + refine Finset.sum_congr rfl fun p _ => ?_ + rw [TensorProduct.tmul_smul, TensorProduct.tmul_sum, ← Complex.ofReal_prod, + show (((∏ i, L[Λ] (p i) (l i) : ℝ)) : ℂ) = algebraMap ℝ ℂ (∏ i, L[Λ] (p i) (l i)) from rfl, + algebraMap_smul] + refine congrArg _ (Finset.sum_congr rfl fun a _ => ?_) + rw [TensorProduct.tmul_smul, gaugeField_eq_one_tmul_derivA, + show ((L[Λ] a μ : ℝ) : ℂ) = algebraMap ℝ ℂ (L[Λ] a μ) from rfl, algebraMap_smul] + /-- The Lorentz action passes through the bracket of a gauge-field generator against a family, mixing the covector index of the generator. -/ lemma repLorentzGroup_bracketFam_ofA (Λ : SL(2,ℂ)) (ρ : Fin 1 ⊕ Fin 3) diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeFieldAlgebra/Realization.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeFieldAlgebra/Realization.lean new file mode 100644 index 000000000..0f09f4806 --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeFieldAlgebra/Realization.lean @@ -0,0 +1,305 @@ +/- +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.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeFieldAlgebra.FieldStrength +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.Basic +public import Physlib.Mathematics.AlgebraRepresentation +/-! +# Realizations of the local gauge field algebra + +## i. Overview + +A real algebra `B` carries the gauge bosons when the local gauge field algebra maps into it +by a real algebra map equivariant for the jet gauge group and the Lorentz group, both acting +on `B` by algebra endomorphisms: `LocalGaugeFieldAlgebra.Realization`. The derivative +symbols of `B` are the images of the algebra's own symbols `∂_s A_μ^φ` (`Realization.A`); +no derivative operator on `B` is involved. + +`GaugeAlgebraRealization` is the same notion with complex scalars, out of the +complexification `ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤`. For a complex target the two agree by +the universal property of base change `AlgHom.liftEquiv` (section D); the real algebra is +never identified with its complexification. + +## ii. Key results + +- `LocalGaugeFieldAlgebra.Realization` : an algebra carrying the gauge bosons over `ℝ`. +- `LocalGaugeFieldAlgebra.Realization.A` : the derivative symbols of a realization, with the + laws `gauge_apply_deriv` and `lorentz_apply` and the extensionality `ext_A`. +- `LocalGaugeFieldAlgebra.Realization.toAlgHom_covDerivFieldStrength` : the map carries the + covariant derivatives of the field strength to those of the symbols of `B`. +- `LocalGaugeFieldAlgebra.Realization.equivGaugeAlgebraRealization` : for a complex target, + real realizations are the complex realizations. + +## iii. Table of contents + +- A. Realizations +- B. The derivative symbols of a realization +- C. The field strength of a realization +- D. Comparison with the complex realizations + +-/ + +@[expose] public section + +set_option linter.unusedSectionVars false + +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] +variable {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] +variable {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} + +open TensorProduct Matrix MatrixGroups Lorentz + +namespace LocalGaugeFieldAlgebra + +/-! + +## A. Realizations + +-/ + +/-- A real algebra `B` carrying the gauge bosons of the package `jets`: a real algebra map + out of the local gauge field algebra, equivariant for the jet gauge group and the Lorentz + group, both acting on the whole of `B` by algebra endomorphisms. -/ +@[ext] +structure Realization (jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J) (B : Type) [Ring B] [Algebra ℝ B] + (repJet : Representation ℝ GJ B) (repLorentz : Representation ℝ SL(2,ℂ) B) where + /-- The algebra map out of the local gauge field algebra. -/ + toAlgHom : LocalGaugeFieldAlgebra 𝔤 →ₐ[ℝ] B + /-- The map is equivariant for the jet gauge group. -/ + map_repJet : ∀ (U : GJ) (x : LocalGaugeFieldAlgebra 𝔤), + toAlgHom (LocalGaugeFieldAlgebra.repJet jets U x) = repJet U (toAlgHom x) + /-- The map is equivariant for the Lorentz group. -/ + map_repLorentz : ∀ (Λ : SL(2,ℂ)) (x : LocalGaugeFieldAlgebra 𝔤), + toAlgHom (LocalGaugeFieldAlgebra.repLorentzGroup 𝔤 Λ x) = repLorentz Λ (toAlgHom x) + /-- The jet gauge group acts on the whole of `B` by algebra endomorphisms. -/ + repJet_mul : ∀ (U : GJ) (b₁ b₂ : B), repJet U (b₁ * b₂) = repJet U b₁ * repJet U b₂ + /-- The Lorentz group acts on the whole of `B` by algebra endomorphisms. -/ + repLorentz_mul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂ + +namespace Realization + +section RealTarget + +variable {B : Type} [Ring B] [Algebra ℝ B] {repJet : Representation ℝ GJ B} + {repLorentz : Representation ℝ SL(2,ℂ) B} + +variable (jets) in +/-- The local gauge field algebra realized in itself, by the identity. -/ +noncomputable def id : Realization jets (LocalGaugeFieldAlgebra 𝔤) + (LocalGaugeFieldAlgebra.repJet jets) (repLorentzGroup 𝔤) where + toAlgHom := AlgHom.id ℝ _ + map_repJet _ _ := rfl + map_repLorentz _ _ := rfl + repJet_mul := repJet_apply_mul + repLorentz_mul := repLorentzGroup_apply_mul + +@[simp] +lemma id_toAlgHom : (id jets).toAlgHom = AlgHom.id ℝ (LocalGaugeFieldAlgebra 𝔤) := rfl + +variable (h : Realization jets B repJet repLorentz) + +/-! + +## B. The derivative symbols of a realization + +-/ + +/-- The derivative symbols `∂_s A_μ^φ` of a realization: the images of the algebra's own + symbols `derivA`. -/ +noncomputable def A (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) : + Module.Dual ℝ 𝔤 →ₗ[ℝ] B := + h.toAlgHom.toLinearMap ∘ₗ derivA 𝔤 s μ + +lemma A_apply (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + h.A s μ φ = h.toAlgHom (derivA 𝔤 s μ φ) := rfl + +@[simp] +lemma id_A : (id jets).A = derivA 𝔤 := rfl + +lemma commute_A (p q : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (φ ψ : Module.Dual ℝ 𝔤) : Commute (h.A p μ φ) (h.A q ν ψ) := + (Commute.all _ _).map h.toAlgHom + +/-- Two realizations with the same derivative symbols are equal. -/ +lemma ext_A {h₁ h₂ : Realization jets B repJet repLorentz} + (hA : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), + h₁.A s μ φ = h₂.A s μ φ) : h₁ = h₂ := + Realization.ext (algHom_ext hA) + +/-- The gauge law: a jet `U` acts on `∂_s A_μ^φ` by the Leibniz convolution of the dual + adjoint Taylor coefficients of `U⁻¹` against lower symbols, plus the base-point value of + the `s`-th derivative of the Maurer–Cartan form of `U⁻¹`. -/ +lemma gauge_apply_deriv (U : GJ) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ 𝔤) : + repJet U (h.A s μ φ) = + (s.antidiagonal.map fun p => h.A p.2 μ (jets.adjointDualCoeff U⁻¹ p.1 φ)).sum + + algebraMap ℝ B (φ (jets.evalLie (jets.iteratedDeriv s (jets.maurerCartan U⁻¹ μ)))) := by + rw [A_apply, ← h.map_repJet, derivA_apply, repJet_iteratedJetDeriv_ofA, map_add, + map_multiset_sum, Multiset.map_map, AlgHom.commutes] + rfl + +/-- The Lorentz law: the symbol carries one covector index, and each derivative slot + transforms as a covector. -/ +lemma lorentz_apply (Λ : SL(2,ℂ)) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ 𝔤) : + repLorentz Λ (h.A (List.ofFn l) μ φ) = + ∑ p : Fin n → (Fin 1 ⊕ Fin 3), (∏ i, ((SL2C.toLorentzGroup Λ).1 (p i) (l i) : ℝ)) • + ∑ a, ((SL2C.toLorentzGroup Λ).1 a μ : ℝ) • h.A (List.ofFn p) a φ := by + rw [A_apply, ← h.map_repLorentz, repLorentzGroup_derivA, map_sum] + refine Finset.sum_congr rfl fun p _ => ?_ + rw [map_smul, map_sum] + exact congrArg _ (Finset.sum_congr rfl fun a _ => map_smul h.toAlgHom _ _) + +/-! + +## C. The field strength of a realization + +-/ + +/-- The map of a realization carries the covariant derivatives of the field strength to + those of its symbols. -/ +lemma toAlgHom_covDerivFieldStrength (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ 𝔤) : + h.toAlgHom (covDerivFieldStrength 𝔤 l μ ν φ) + = GaugeAlgebraRealization.iteratedCovDerivAdjoint h.A l + (GaugeAlgebraRealization.fieldStrength h.A μ ν) 0 φ := by + have key := congrFun (GaugeAlgebraRealization.iteratedCovDerivAdjoint_map + h.toAlgHom.toLinearMap (map_mul h.toAlgHom) (derivA 𝔤) l + (GaugeAlgebraRealization.fieldStrength (derivA 𝔤) μ ν)) 0 + rw [show (fun p => h.toAlgHom.toLinearMap ∘ₗ + GaugeAlgebraRealization.fieldStrength (derivA 𝔤) μ ν p) + = GaugeAlgebraRealization.fieldStrength h.A μ ν from + funext fun p => (GaugeAlgebraRealization.fieldStrength_map _ (map_mul h.toAlgHom) _ μ ν + p).symm] at key + exact (LinearMap.congr_fun key φ).symm + +lemma toAlgHom_fieldStrength (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + h.toAlgHom (fieldStrength 𝔤 μ ν φ) = GaugeAlgebraRealization.fieldStrength h.A μ ν 0 φ := + h.toAlgHom_covDerivFieldStrength [] μ ν φ + +end RealTarget + +/-! + +## D. Comparison with the complex realizations + +-/ + +section ComplexTarget + +variable {B : Type} [Ring B] [Algebra ℂ B] {repJet : Representation ℂ GJ B} + {repLorentz : Representation ℂ SL(2,ℂ) B} + +/-- The complexification of a jet-equivariant real algebra map is equivariant for the + complexified jet action. -/ +lemma liftEquiv_complexRepJet (f : LocalGaugeFieldAlgebra 𝔤 →ₐ[ℝ] B) + (hf : ∀ (U : GJ) (x : LocalGaugeFieldAlgebra 𝔤), + f (LocalGaugeFieldAlgebra.repJet jets U x) = repJet U (f x)) + (U : GJ) (x : ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤) : + AlgHom.liftEquiv ℝ ℂ (LocalGaugeFieldAlgebra 𝔤) B f (complexRepJet jets U x) + = repJet U (AlgHom.liftEquiv ℝ ℂ (LocalGaugeFieldAlgebra 𝔤) B f x) := by + induction x using TensorProduct.induction_on with + | zero => rw [map_zero, map_zero, map_zero] + | add x y hx hy => rw [map_add, map_add, hx, hy, map_add, map_add] + | tmul z a => + rw [complexRepJet_tmul, AlgHom.liftEquiv_tmul, AlgHom.liftEquiv_tmul, map_smul (repJet U), + hf] + +/-- The complexification of a Lorentz-equivariant real algebra map is equivariant for the + complexified Lorentz action. -/ +lemma liftEquiv_complexRepLorentzGroup (f : LocalGaugeFieldAlgebra 𝔤 →ₐ[ℝ] B) + (hf : ∀ (Λ : SL(2,ℂ)) (x : LocalGaugeFieldAlgebra 𝔤), + f (LocalGaugeFieldAlgebra.repLorentzGroup 𝔤 Λ x) = repLorentz Λ (f x)) + (Λ : SL(2,ℂ)) (x : ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤) : + AlgHom.liftEquiv ℝ ℂ (LocalGaugeFieldAlgebra 𝔤) B f (complexRepLorentzGroup 𝔤 Λ x) + = repLorentz Λ (AlgHom.liftEquiv ℝ ℂ (LocalGaugeFieldAlgebra 𝔤) B f x) := by + induction x using TensorProduct.induction_on with + | zero => rw [map_zero, map_zero, map_zero] + | add x y hx hy => rw [map_add, map_add, hx, hy, map_add, map_add] + | tmul z a => + rw [complexRepLorentzGroup_tmul, AlgHom.liftEquiv_tmul, AlgHom.liftEquiv_tmul, + map_smul (repLorentz Λ), hf] + +/-- The complexification of a real realization in a complex algebra, by `AlgHom.liftEquiv`; + the symbols are unchanged. -/ +noncomputable def toGaugeAlgebraRealization + (h : Realization jets B (repJet.restrictScalars ℝ) (repLorentz.restrictScalars ℝ)) : + GaugeAlgebraRealization jets B repJet repLorentz where + toAlgHom := AlgHom.liftEquiv ℝ ℂ (LocalGaugeFieldAlgebra 𝔤) B h.toAlgHom + A := h.A + A_eq s μ φ := by + rw [gaugeField_eq_one_tmul_derivA, AlgHom.liftEquiv_tmul, one_smul] + rfl + map_repJet := liftEquiv_complexRepJet h.toAlgHom h.map_repJet + map_repLorentz := liftEquiv_complexRepLorentzGroup h.toAlgHom h.map_repLorentz + repJet_mul := h.repJet_mul + repLorentz_mul := h.repLorentz_mul + +@[simp] +lemma toGaugeAlgebraRealization_A + (h : Realization jets B (repJet.restrictScalars ℝ) (repLorentz.restrictScalars ℝ)) : + h.toGaugeAlgebraRealization.A = h.A := rfl + +lemma toGaugeAlgebraRealization_toAlgHom_one_tmul + (h : Realization jets B (repJet.restrictScalars ℝ) (repLorentz.restrictScalars ℝ)) + (x : LocalGaugeFieldAlgebra 𝔤) : + h.toGaugeAlgebraRealization.toAlgHom ((1 : ℂ) ⊗ₜ[ℝ] x) = h.toAlgHom x := by + rw [toGaugeAlgebraRealization, AlgHom.liftEquiv_tmul, one_smul] + +/-- The restriction of scalars of a complex realization: the algebra map precomposed with + `x ↦ 1 ⊗ₜ x`. -/ +noncomputable def _root_.GaugeAlgebraRealization.toRealization + (h : GaugeAlgebraRealization jets B repJet repLorentz) : + Realization jets B (repJet.restrictScalars ℝ) (repLorentz.restrictScalars ℝ) where + toAlgHom := (AlgHom.liftEquiv ℝ ℂ (LocalGaugeFieldAlgebra 𝔤) B).symm h.toAlgHom + map_repJet U x := by + show h.toAlgHom ((1 : ℂ) ⊗ₜ[ℝ] LocalGaugeFieldAlgebra.repJet jets U x) + = repJet U (h.toAlgHom ((1 : ℂ) ⊗ₜ[ℝ] x)) + rw [← complexRepJet_tmul, h.map_repJet] + map_repLorentz Λ x := by + show h.toAlgHom ((1 : ℂ) ⊗ₜ[ℝ] LocalGaugeFieldAlgebra.repLorentzGroup 𝔤 Λ x) + = repLorentz Λ (h.toAlgHom ((1 : ℂ) ⊗ₜ[ℝ] x)) + rw [← complexRepLorentzGroup_tmul, h.map_repLorentz] + repJet_mul := h.repJet_mul + repLorentz_mul := h.repLorentz_mul + +@[simp] +lemma _root_.GaugeAlgebraRealization.toRealization_toAlgHom_apply + (h : GaugeAlgebraRealization jets B repJet repLorentz) (x : LocalGaugeFieldAlgebra 𝔤) : + h.toRealization.toAlgHom x = h.toAlgHom ((1 : ℂ) ⊗ₜ[ℝ] x) := rfl + +@[simp] +lemma _root_.GaugeAlgebraRealization.toRealization_A + (h : GaugeAlgebraRealization jets B repJet repLorentz) : h.toRealization.A = h.A := by + funext s μ + refine LinearMap.ext fun φ => ?_ + rw [h.A_apply, gaugeField_eq_one_tmul_derivA] + rfl + +lemma _root_.GaugeAlgebraRealization.toRealization_id_toAlgHom : + (GaugeAlgebraRealization.id jets).toRealization.toAlgHom + = (Algebra.TensorProduct.includeRight : + LocalGaugeFieldAlgebra 𝔤 →ₐ[ℝ] ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤) := + AlgHom.ext fun _ => rfl + +/-- For a complex target, real realizations are the complex realizations. -/ +noncomputable def equivGaugeAlgebraRealization : + Realization jets B (repJet.restrictScalars ℝ) (repLorentz.restrictScalars ℝ) + ≃ GaugeAlgebraRealization jets B repJet repLorentz where + toFun := toGaugeAlgebraRealization + invFun := GaugeAlgebraRealization.toRealization + left_inv h := Realization.ext + ((AlgHom.liftEquiv ℝ ℂ (LocalGaugeFieldAlgebra 𝔤) B).symm_apply_apply h.toAlgHom) + right_inv h := GaugeAlgebraRealization.ext + ((AlgHom.liftEquiv ℝ ℂ (LocalGaugeFieldAlgebra 𝔤) B).apply_symm_apply h.toAlgHom) + +end ComplexTarget + +end Realization + +end LocalGaugeFieldAlgebra diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Basic.lean index 9ad03ca96..cabf57668 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Basic.lean @@ -135,6 +135,18 @@ lemma A_apply (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Modu @[simp] lemma id_A : (GaugeAlgebraRealization.id jets).A = gaugeField 𝔤 := rfl +/-- A realization is determined by its algebra map. -/ +lemma ext {h₁ h₂ : GaugeAlgebraRealization jets B repJet repLorentz} + (h : h₁.toAlgHom = h₂.toAlgHom) : h₁ = h₂ := by + obtain ⟨f₁, A₁, hA₁, _, _, _, _⟩ := h₁ + obtain ⟨f₂, A₂, hA₂, _, _, _, _⟩ := h₂ + dsimp only at h + subst h + have hA : A₁ = A₂ := funext fun s => funext fun μ => LinearMap.ext fun φ => + (hA₁ s μ φ).trans (hA₂ s μ φ).symm + subst hA + rfl + /-- The gauge-field symbols of a realization commute, being images of a commutative algebra. -/ lemma commute_A (p q : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) diff --git a/Physlib/Mathematics/AlgebraRepresentation.lean b/Physlib/Mathematics/AlgebraRepresentation.lean index 95a8de478..2374c1f67 100644 --- a/Physlib/Mathematics/AlgebraRepresentation.lean +++ b/Physlib/Mathematics/AlgebraRepresentation.lean @@ -26,17 +26,22 @@ algebra presented as a quotient can be reduced cheaply. Section B restricts a representation to a subalgebra it preserves. The invariance hypothesis is stated pointwise, in the form the ambient invariance lemmas produce. +Section C restricts the scalars of a representation: a representation on a complex vector +space is in particular a representation on the underlying real vector space. + ## ii. Key results - `Representation.tprod_apply_one`, `Representation.tprod_apply_one_tmul`, `Representation.tprod_apply_tmul_one` : the unit laws on a tensor product. - `Representation.tprod_apply_mul` : multiplicativity on a tensor product. - `Representation.restrictSubalgebra` : the restriction to an invariant subalgebra. +- `Representation.restrictScalars` : the restriction of scalars. ## iii. Table of contents - A. Tensor products of multiplicative representations - B. Restriction to an invariant subalgebra +- C. Restriction of scalars -/ @@ -125,4 +130,24 @@ lemma coe_restrictSubalgebra {k A G : Type*} [CommSemiring k] (hS : ∀ (g : G) {x : A}, x ∈ S → ρ g x ∈ S) (g : G) (x : S) : (ρ.restrictSubalgebra S hS g x : A) = ρ g (x : A) := rfl +/-! + +## C. Restriction of scalars + +-/ + +/-- The restriction of scalars of a representation: a representation on an `S`-module is a + representation on the same space as an `R`-module, for `R` acting through `S`. -/ +def restrictScalars (R : Type*) {S G V : Type*} [CommSemiring R] [CommSemiring S] [Monoid G] + [AddCommMonoid V] [Module R V] [Module S V] [LinearMap.CompatibleSMul V V R S] + (ρ : Representation S G V) : Representation R G V where + toFun g := (ρ g).restrictScalars R + map_one' := LinearMap.ext fun x => LinearMap.congr_fun (map_one ρ) x + map_mul' g₁ g₂ := LinearMap.ext fun x => LinearMap.congr_fun (map_mul ρ g₁ g₂) x + +@[simp] +lemma restrictScalars_apply (R : Type*) {S G V : Type*} [CommSemiring R] [CommSemiring S] + [Monoid G] [AddCommMonoid V] [Module R V] [Module S V] [LinearMap.CompatibleSMul V V R S] + (ρ : Representation S G V) (g : G) (x : V) : ρ.restrictScalars R g x = ρ g x := rfl + end Representation From 8969eb089f17414f2c80b4b3df05be84de4ce2e8 Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Sun, 13 Sep 2026 13:49:33 +0400 Subject: [PATCH 325/367] feat: construct the covariant field algebra for general gauge theories --- Physlib.lean | 7 + .../LocalGaugeFieldAlgebra/GaugeAction.lean | 14 + .../LocalGaugeFieldAlgebra/LorentzAction.lean | 16 + .../GaugeTheory/GaugeFieldData/Basic.lean | 23 + .../LocalCovFieldAlgebra/Basic.lean | 544 ++++++++++++++++++ .../GaugeTheory/LocalFieldAlgebra/Basic.lean | 11 +- .../LocalFieldAlgebra/CovariantDeriv.lean | 408 +++++++++++++ .../LocalFieldAlgebra/GaugeAction.lean | 218 +++++++ .../GaugeTheory/LocalFieldAlgebra/Jet.lean | 10 + .../LocalFieldAlgebra/LorentzAction.lean | 227 ++++++++ .../LocalFieldAlgebra/TransformsIn.lean | 364 ++++++++++++ .../LocalGaugeData/TransformsIn.lean | 32 ++ .../GaugeTheory/MatterField/Basic.lean | 30 + .../MatterField/CovariantDeriv.lean | 27 + .../MatterField/LorentzCovariantDeriv.lean | 279 +++++++++ .../MatterField/MatrixRep/Basic.lean | 41 ++ .../MatterField/MatrixRep/Table.lean | 31 + Physlib/Mathematics/AlgebraGeneration.lean | 18 + .../StandardModel/Fermions/MatterField.lean | 44 +- .../Particles/StandardModel/FieldData.lean | 69 ++- .../StandardModel/HiggsBoson/MatterField.lean | 11 + Physlib/Relativity/DerivAlgebra.lean | 26 + Physlib/Relativity/LorentzMix.lean | 308 ++++++++++ 23 files changed, 2753 insertions(+), 5 deletions(-) create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/LocalCovFieldAlgebra/Basic.lean create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/CovariantDeriv.lean create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/GaugeAction.lean create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/LorentzAction.lean create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/TransformsIn.lean create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/LorentzCovariantDeriv.lean create mode 100644 Physlib/Relativity/LorentzMix.lean diff --git a/Physlib.lean b/Physlib.lean index 188d3e2bb..bf27d7fc6 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -24,7 +24,9 @@ public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeFieldData.BosonModul public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeFieldData.FermionGenerators public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeFieldData.FermionMatterField public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeFieldData.FermionModule +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalCovFieldAlgebra.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.CovariantDeriv public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.ConstantAction public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.GaugeAction @@ -35,8 +37,11 @@ public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAl public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.MassDim public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.Prod public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.Statistics +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.GaugeAction public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.Jet public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.JetRep +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.LorentzAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.TransformsIn public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.AdjointCoeff public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction @@ -55,6 +60,7 @@ public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.FieldAlgebra public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.GaugeAction public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.TransformsIn +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.LorentzCovariantDeriv public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.MatrixRep.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.MatrixRep.Constructions public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.MatrixRep.Factors @@ -623,6 +629,7 @@ public import Physlib.Relativity.LorentzGroup.Restricted.Basic public import Physlib.Relativity.LorentzGroup.Restricted.FromBoostRotation public import Physlib.Relativity.LorentzGroup.Rotations public import Physlib.Relativity.LorentzGroup.ToVector +public import Physlib.Relativity.LorentzMix public import Physlib.Relativity.MinkowskiMatrix public import Physlib.Relativity.PauliMatrices.AsTensor public import Physlib.Relativity.PauliMatrices.Basic diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeFieldAlgebra/GaugeAction.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeFieldAlgebra/GaugeAction.lean index da3ab0b69..ef01cc7e9 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeFieldAlgebra/GaugeAction.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeFieldAlgebra/GaugeAction.lean @@ -532,6 +532,20 @@ noncomputable def complexRepJet : lemma complexRepJet_tmul (U : GJ) (z : ℂ) (x : (LocalGaugeFieldAlgebra 𝔤)) : complexRepJet jets U (z ⊗ₜ[ℝ] x) = z ⊗ₜ[ℝ] repJet jets U x := rfl +variable (jets) in +/-- The action of a jet on the complexified gauge-boson jet algebra, as an algebra + endomorphism: the base change of `repJetAlgHom`. -/ +noncomputable def complexRepJetAlgHom (U : GJ) : + ℂ ⊗[ℝ] (LocalGaugeFieldAlgebra 𝔤) →ₐ[ℂ] ℂ ⊗[ℝ] (LocalGaugeFieldAlgebra 𝔤) := + Algebra.TensorProduct.map (AlgHom.id ℂ ℂ) (repJetAlgHom jets U) + +lemma complexRepJet_apply (U : GJ) (x : ℂ ⊗[ℝ] (LocalGaugeFieldAlgebra 𝔤)) : + complexRepJet jets U x = complexRepJetAlgHom jets U x := by + induction x using TensorProduct.induction_on with + | zero => rw [map_zero, map_zero] + | add x₁ x₂ h₁ h₂ => rw [map_add, map_add, h₁, h₂] + | tmul z a => rfl + lemma complexRepJet_apply_mul (U : GJ) (x y : ℂ ⊗[ℝ] (LocalGaugeFieldAlgebra 𝔤)) : complexRepJet jets U (x * y) diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeFieldAlgebra/LorentzAction.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeFieldAlgebra/LorentzAction.lean index f0a2ae2b7..adaa8941c 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeFieldAlgebra/LorentzAction.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeFieldAlgebra/LorentzAction.lean @@ -207,6 +207,22 @@ noncomputable def complexRepLorentzGroup : lemma complexRepLorentzGroup_tmul (Λ : SL(2,ℂ)) (z : ℂ) (x : (LocalGaugeFieldAlgebra 𝔤)) : (complexRepLorentzGroup 𝔤) Λ (z ⊗ₜ[ℝ] x) = z ⊗ₜ[ℝ] (repLorentzGroup 𝔤) Λ x := rfl +variable (𝔤) in +/-- The action of a Lorentz transformation on the complexified gauge-boson jet algebra, as + an algebra endomorphism: the base change of the symmetric-algebra functor applied to the + action on the jet component space. -/ +noncomputable def complexRepLorentzGroupAlgHom (Λ : SL(2,ℂ)) : + ℂ ⊗[ℝ] (LocalGaugeFieldAlgebra 𝔤) →ₐ[ℂ] ℂ ⊗[ℝ] (LocalGaugeFieldAlgebra 𝔤) := + Algebra.TensorProduct.map (AlgHom.id ℂ ℂ) + (SymmetricAlgebra.map ((GaugeBoson.JetComponentSpace.repLorentzGroup 𝔤) Λ)) + +lemma complexRepLorentzGroup_apply (Λ : SL(2,ℂ)) (x : ℂ ⊗[ℝ] (LocalGaugeFieldAlgebra 𝔤)) : + (complexRepLorentzGroup 𝔤) Λ x = complexRepLorentzGroupAlgHom 𝔤 Λ x := by + induction x using TensorProduct.induction_on with + | zero => rw [map_zero, map_zero] + | add x₁ x₂ h₁ h₂ => rw [map_add, map_add, h₁, h₂] + | tmul z a => rfl + lemma complexRepLorentzGroup_apply_mul (Λ : SL(2,ℂ)) (x y : ℂ ⊗[ℝ] (LocalGaugeFieldAlgebra 𝔤)) : (complexRepLorentzGroup 𝔤) Λ (x * y) = (complexRepLorentzGroup 𝔤) Λ x * (complexRepLorentzGroup 𝔤) Λ y := by diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/Basic.lean index efe08457c..701312358 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeFieldData/Basic.lean @@ -50,11 +50,14 @@ invariance is claimed here. - `GaugeFieldData` : the matter content of a gauge theory over a gauge context. - `GaugeFieldData.FermionValue`, `GaugeFieldData.BosonValue` : the value space of a species. +- `GaugeFieldData.PureJetsActTrivially`, `GaugeFieldData.GaugeLorentzCompatible` : the two + conditions of `MatterField`, imposed on every species of the datum. ## iii. Table of contents - A. The gauge context and the field datum - B. The value spaces of the species +- C. Conditions on the species of a datum -/ @@ -149,4 +152,24 @@ abbrev BosonValue (j : T.BosonSpecies) : Type := (T.boson j).V TODO (lines := 143-148) (date := 2026-09-11) "I think these names should likely be changed to something more descriptive." +/-! + +## C. Conditions on the species of a datum + +The two conditions of `MatterField` (section B of +`Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.Basic`), imposed species by species. +They are stated on the datum alone so that a concrete theory can record them next to its +field data; the covariant derivative theory assumes them where it needs them. + +-/ + +/-- Pure gauge jets act trivially at the base point on every species of the datum. -/ +def PureJetsActTrivially : Prop := + (∀ i, (T.fermion i).PureJetsActTrivially) ∧ (∀ j, (T.boson j).PureJetsActTrivially) + +/-- The infinitesimal gauge action of every species of the datum commutes with its Lorentz + representation. -/ +def GaugeLorentzCompatible : Prop := + (∀ i, (T.fermion i).GaugeLorentzCompatible) ∧ (∀ j, (T.boson j).GaugeLorentzCompatible) + end GaugeFieldData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalCovFieldAlgebra/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalCovFieldAlgebra/Basic.lean new file mode 100644 index 000000000..c8e350088 --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalCovFieldAlgebra/Basic.lean @@ -0,0 +1,544 @@ +/- +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.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.CovariantDeriv +public import Physlib.Mathematics.AlgebraRepresentation +/-! +# The covariant field algebra of a gauge theory + +## i. Overview + +`T.LocalCovFieldAlgebra` is the complex unital subalgebra of the local field algebra `J(T)` +of a field datum generated by the covariant expressions of the theory: the covariant +towers `∇_{l 0} ⋯ ∇_{l (n-1)} ψ` of every matter species and of their conjugate components, +along all ordered tuples of directions, with the undifferentiated fields as the case +`n = 0`, and the field strength with its ordered covariant derivatives `∇_l F_μν` included +from the gauge-only algebra. Being a subalgebra of `J(T)` it inherits the relations of +`J(T)`; no second free algebra is built, and `algHom_ext` gives uniqueness of maps out of +it but not their existence. + +Its elements are gauge covariant, not gauge invariant. The jet gauge group preserves it +unconditionally, and under `GaugeFieldData.PureJetsActTrivially` its action factors +through evaluation to the ordinary gauge group; the Lorentz group preserves it under +`GaugeFieldData.GaugeLorentzCompatible`. The restricted actions are built with +`Representation.restrictSubalgebra`, so they agree with the ambient actions under the +inclusion `Subalgebra.val` by construction. + +## ii. Key results + +- `GaugeFieldData.LocalCovFieldAlgebra` : the covariant field algebra, with + `LocalCovFieldAlgebra.induction`, `LocalCovFieldAlgebra.mapsTo` and + `LocalCovFieldAlgebra.algHom_ext`. +- `LocalCovFieldAlgebra.covFermion`, `LocalCovFieldAlgebra.covFieldStrength` and + companions : the generators as elements of the covariant field algebra. +- `LocalCovFieldAlgebra.repJet`, `LocalCovFieldAlgebra.repValue`, + `LocalCovFieldAlgebra.repLorentzGroup` : the restricted actions. +- `LocalCovFieldAlgebra.repJet_eq_repValue_eval` : the factorization through evaluation. + +## iii. Table of contents + +- A. The covariant field algebra + - A.1. Generation + - A.2. The generators as elements of the covariant field algebra +- B. Stability under the actions +- C. The restricted actions + - C.1. The action of the ordinary gauge group + - C.2. The actions on the generators + +-/ + +@[expose] public section + +open TensorProduct Matrix MatrixGroups Lorentz +open GaugeAlgebraRealization (repDualCoeff) + +namespace GaugeFieldData + +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} (T : GaugeFieldData jets) + +/-! + +## A. The covariant field algebra + +-/ + +/-- The covariant generators of the local field algebra: the included field-strength tower + and the covariant matter towers of every species, unconjugated and conjugate, along all + ordered tuples of directions. -/ +def covGenerators : Set T.LocalFieldAlgebra := + (⋃ l : List (Fin 1 ⊕ Fin 3), ⋃ μ, ⋃ ν, Set.range (T.covDerivFieldStrength l μ ν)) + ∪ ((⋃ i, ⋃ n : ℕ, ⋃ l : Fin n → (Fin 1 ⊕ Fin 3), + Set.range (T.covDerivFermion i l) ∪ Set.range (T.covDerivConjFermion i l)) + ∪ (⋃ j, ⋃ n : ℕ, ⋃ l : Fin n → (Fin 1 ⊕ Fin 3), + Set.range (T.covDerivBoson j l) ∪ Set.range (T.covDerivConjBoson j l))) + +/-- The covariant field algebra of a field datum: the complex unital subalgebra of its local + field algebra generated by the covariant matter towers of every species, their conjugates, + and the included field-strength tower. -/ +noncomputable def LocalCovFieldAlgebra : Subalgebra ℂ T.LocalFieldAlgebra := + Algebra.adjoin ℂ T.covGenerators + +namespace LocalCovFieldAlgebra + +variable {T} + +/-! + +### A.1. Generation + +-/ + +lemma covDerivFieldStrength_mem (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ 𝔤) : T.covDerivFieldStrength l μ ν φ ∈ T.LocalCovFieldAlgebra := + Algebra.subset_adjoin (Or.inl (Set.mem_iUnion.mpr ⟨l, Set.mem_iUnion.mpr ⟨μ, + Set.mem_iUnion.mpr ⟨ν, φ, rfl⟩⟩⟩)) + +lemma covDerivFermion_mem (i : T.FermionSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (T.FermionValue i)) : T.covDerivFermion i l φ ∈ T.LocalCovFieldAlgebra := + Algebra.subset_adjoin (Or.inr (Or.inl (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, + Set.mem_iUnion.mpr ⟨l, Or.inl ⟨φ, rfl⟩⟩⟩⟩))) + +lemma covDerivConjFermion_mem (i : T.FermionSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule (T.FermionValue i))) : + T.covDerivConjFermion i l φ ∈ T.LocalCovFieldAlgebra := + Algebra.subset_adjoin (Or.inr (Or.inl (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, + Set.mem_iUnion.mpr ⟨l, Or.inr ⟨φ, rfl⟩⟩⟩⟩))) + +lemma covDerivBoson_mem (j : T.BosonSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (T.BosonValue j)) : T.covDerivBoson j l φ ∈ T.LocalCovFieldAlgebra := + Algebra.subset_adjoin (Or.inr (Or.inr (Set.mem_iUnion.mpr ⟨j, Set.mem_iUnion.mpr ⟨n, + Set.mem_iUnion.mpr ⟨l, Or.inl ⟨φ, rfl⟩⟩⟩⟩))) + +lemma covDerivConjBoson_mem (j : T.BosonSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule (T.BosonValue j))) : + T.covDerivConjBoson j l φ ∈ T.LocalCovFieldAlgebra := + Algebra.subset_adjoin (Or.inr (Or.inr (Set.mem_iUnion.mpr ⟨j, Set.mem_iUnion.mpr ⟨n, + Set.mem_iUnion.mpr ⟨l, Or.inr ⟨φ, rfl⟩⟩⟩⟩))) + +/-- The undifferentiated matter symbols lie in the covariant field algebra, as the case of + zero covariant derivatives. -/ +lemma fermionSymbol_zero_mem (i : T.FermionSpecies) (φ : Module.Dual ℂ (T.FermionValue i)) : + T.fermionSymbol i 0 φ ∈ T.LocalCovFieldAlgebra := + covDerivFermion_mem i (fun k : Fin 0 => k.elim0) φ + +lemma conjFermionSymbol_zero_mem (i : T.FermionSpecies) + (φ : Module.Dual ℂ (ConjModule (T.FermionValue i))) : + T.conjFermionSymbol i 0 φ ∈ T.LocalCovFieldAlgebra := + covDerivConjFermion_mem i (fun k : Fin 0 => k.elim0) φ + +lemma bosonSymbol_zero_mem (j : T.BosonSpecies) (φ : Module.Dual ℂ (T.BosonValue j)) : + T.bosonSymbol j 0 φ ∈ T.LocalCovFieldAlgebra := + covDerivBoson_mem j (fun k : Fin 0 => k.elim0) φ + +lemma conjBosonSymbol_zero_mem (j : T.BosonSpecies) + (φ : Module.Dual ℂ (ConjModule (T.BosonValue j))) : + T.conjBosonSymbol j 0 φ ∈ T.LocalCovFieldAlgebra := + covDerivConjBoson_mem j (fun k : Fin 0 => k.elim0) φ + +/-- Case analysis on the covariant generators. -/ +lemma covGenerators_cases {P : T.LocalFieldAlgebra → Prop} {b : T.LocalFieldAlgebra} + (hb : b ∈ T.covGenerators) + (hF : ∀ (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), + P (T.covDerivFieldStrength l μ ν φ)) + (hψ : ∀ (i : T.FermionSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (T.FermionValue i)), P (T.covDerivFermion i l φ)) + (hψc : ∀ (i : T.FermionSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule (T.FermionValue i))), P (T.covDerivConjFermion i l φ)) + (hφ : ∀ (j : T.BosonSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (T.BosonValue j)), P (T.covDerivBoson j l φ)) + (hφc : ∀ (j : T.BosonSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule (T.BosonValue j))), P (T.covDerivConjBoson j l φ)) : + P b := by + simp only [covGenerators, Set.mem_union, Set.mem_iUnion, Set.mem_range] at hb + obtain ⟨l, μ, ν, φ, rfl⟩ | ⟨i, n, l, ⟨φ, rfl⟩ | ⟨φ, rfl⟩⟩ | ⟨j, n, l, ⟨φ, rfl⟩ | ⟨φ, rfl⟩⟩ := hb + · exact hF l μ ν φ + · exact hψ i l φ + · exact hψc i l φ + · exact hφ j l φ + · exact hφc j l φ + +/-- The generation principle: a property holding on the covariant generators and on the + scalars, and closed under sums and products, holds on the whole covariant field + algebra. -/ +lemma induction {P : T.LocalFieldAlgebra → Prop} {x : T.LocalFieldAlgebra} + (hx : x ∈ T.LocalCovFieldAlgebra) + (hF : ∀ (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), + P (T.covDerivFieldStrength l μ ν φ)) + (hψ : ∀ (i : T.FermionSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (T.FermionValue i)), P (T.covDerivFermion i l φ)) + (hψc : ∀ (i : T.FermionSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule (T.FermionValue i))), P (T.covDerivConjFermion i l φ)) + (hφ : ∀ (j : T.BosonSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (T.BosonValue j)), P (T.covDerivBoson j l φ)) + (hφc : ∀ (j : T.BosonSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule (T.BosonValue j))), P (T.covDerivConjBoson j l φ)) + (halg : ∀ z : ℂ, P (z • (1 : T.LocalFieldAlgebra))) + (hadd : ∀ x y, P x → P y → P (x + y)) + (hmul : ∀ x y, P x → P y → P (x * y)) : P x := by + induction hx using Algebra.adjoin_induction with + | mem b hb => exact covGenerators_cases hb hF hψ hψc hφ hφc + | algebraMap z => + rw [Algebra.algebraMap_eq_smul_one] + exact halg z + | add a b _ _ ha hb => exact hadd a b ha hb + | mul a b _ _ ha hb => exact hmul a b ha hb + +/-- An algebra endomorphism carrying the covariant generators into the covariant field + algebra carries the whole covariant field algebra into itself. -/ +lemma mapsTo (f : T.LocalFieldAlgebra →ₐ[ℂ] T.LocalFieldAlgebra) + (hgen : ∀ b ∈ T.covGenerators, f b ∈ T.LocalCovFieldAlgebra) + {x : T.LocalFieldAlgebra} (hx : x ∈ T.LocalCovFieldAlgebra) : + f x ∈ T.LocalCovFieldAlgebra := by + have hle : T.LocalCovFieldAlgebra.map f ≤ T.LocalCovFieldAlgebra := by + rw [LocalCovFieldAlgebra, ← Algebra.adjoin_image] + refine Algebra.adjoin_le ?_ + rintro _ ⟨b, hb, rfl⟩ + exact hgen b hb + exact hle ⟨x, hx, rfl⟩ + +/-- Two algebra maps out of the covariant field algebra agreeing on the covariant + generators are equal. This is uniqueness only: the covariant field algebra is not free on + its generators, so an assignment of their images does not by itself define a map. -/ +lemma algHom_ext {B : Type} [Semiring B] [Algebra ℂ B] + {f g : ↥T.LocalCovFieldAlgebra →ₐ[ℂ] B} + (h : ∀ b (hb : b ∈ T.covGenerators), f ⟨b, Algebra.subset_adjoin hb⟩ + = g ⟨b, Algebra.subset_adjoin hb⟩) : f = g := + AlgHom.ext_of_eq_adjoin rfl fun b hb => h b hb + +/-! + +### A.2. The generators as elements of the covariant field algebra + +-/ + +variable (T) + +/-- The included field-strength tower `∇_l F_μν^φ`, as elements of the covariant field + algebra. -/ +noncomputable def covFieldStrength (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ 𝔤) : T.LocalCovFieldAlgebra := + ⟨T.covDerivFieldStrength l μ ν φ, covDerivFieldStrength_mem l μ ν φ⟩ + +/-- The covariant tower `∇_l ψ^φ` of a fermionic species, as elements of the covariant field + algebra. -/ +noncomputable def covFermion (i : T.FermionSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (T.FermionValue i) →ₗ[ℂ] T.LocalCovFieldAlgebra where + toFun φ := ⟨T.covDerivFermion i l φ, covDerivFermion_mem i l φ⟩ + map_add' _ _ := Subtype.ext (map_add (T.covDerivFermion i l) _ _) + map_smul' _ _ := Subtype.ext (map_smul (T.covDerivFermion i l) _ _) + +/-- The conjugate covariant tower of a fermionic species, as elements of the covariant field + algebra. -/ +noncomputable def covConjFermion (i : T.FermionSpecies) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (ConjModule (T.FermionValue i)) →ₗ[ℂ] T.LocalCovFieldAlgebra where + toFun φ := ⟨T.covDerivConjFermion i l φ, covDerivConjFermion_mem i l φ⟩ + map_add' _ _ := Subtype.ext (map_add (T.covDerivConjFermion i l) _ _) + map_smul' _ _ := Subtype.ext (map_smul (T.covDerivConjFermion i l) _ _) + +/-- The covariant tower of a bosonic species, as elements of the covariant field algebra. -/ +noncomputable def covBoson (j : T.BosonSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (T.BosonValue j) →ₗ[ℂ] T.LocalCovFieldAlgebra where + toFun φ := ⟨T.covDerivBoson j l φ, covDerivBoson_mem j l φ⟩ + map_add' _ _ := Subtype.ext (map_add (T.covDerivBoson j l) _ _) + map_smul' _ _ := Subtype.ext (map_smul (T.covDerivBoson j l) _ _) + +/-- The conjugate covariant tower of a bosonic species, as elements of the covariant field + algebra. -/ +noncomputable def covConjBoson (j : T.BosonSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (ConjModule (T.BosonValue j)) →ₗ[ℂ] T.LocalCovFieldAlgebra where + toFun φ := ⟨T.covDerivConjBoson j l φ, covDerivConjBoson_mem j l φ⟩ + map_add' _ _ := Subtype.ext (map_add (T.covDerivConjBoson j l) _ _) + map_smul' _ _ := Subtype.ext (map_smul (T.covDerivConjBoson j l) _ _) + +variable {T} + +@[simp] +lemma coe_covFieldStrength (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ 𝔤) : + (covFieldStrength T l μ ν φ : T.LocalFieldAlgebra) = T.covDerivFieldStrength l μ ν φ := rfl + +@[simp] +lemma coe_covFermion (i : T.FermionSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (T.FermionValue i)) : + (covFermion T i l φ : T.LocalFieldAlgebra) = T.covDerivFermion i l φ := rfl + +@[simp] +lemma coe_covConjFermion (i : T.FermionSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule (T.FermionValue i))) : + (covConjFermion T i l φ : T.LocalFieldAlgebra) = T.covDerivConjFermion i l φ := rfl + +@[simp] +lemma coe_covBoson (j : T.BosonSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (T.BosonValue j)) : + (covBoson T j l φ : T.LocalFieldAlgebra) = T.covDerivBoson j l φ := rfl + +@[simp] +lemma coe_covConjBoson (j : T.BosonSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule (T.BosonValue j))) : + (covConjBoson T j l φ : T.LocalFieldAlgebra) = T.covDerivConjBoson j l φ := rfl + +/-! + +## B. Stability under the actions + +-/ + +/-- The jet gauge group preserves the covariant field algebra: a jet carries each generator + to a generator of the same tower. -/ +lemma repJet_mem (U : GJ) {x : T.LocalFieldAlgebra} (hx : x ∈ T.LocalCovFieldAlgebra) : + T.repJet U x ∈ T.LocalCovFieldAlgebra := by + refine mapsTo (T.repJetAlgHom U) (fun b hb => ?_) hx + refine covGenerators_cases (P := fun b => T.repJetAlgHom U b ∈ T.LocalCovFieldAlgebra) hb + (fun l μ ν φ => ?_) (fun i n l φ => ?_) (fun i n l φ => ?_) + (fun j n l φ => ?_) (fun j n l φ => ?_) + · rw [← repJet_apply, repJet_covDerivFieldStrength] + exact covDerivFieldStrength_mem l μ ν _ + · rw [← repJet_apply, repJet_covDerivFermion] + exact covDerivFermion_mem i l _ + · rw [← repJet_apply, repJet_covDerivConjFermion] + exact covDerivConjFermion_mem i l _ + · rw [← repJet_apply, repJet_covDerivBoson] + exact covDerivBoson_mem j l _ + · rw [← repJet_apply, repJet_covDerivConjBoson] + exact covDerivConjBoson_mem j l _ + +/-- The Lorentz group preserves the covariant field algebra under + `GaugeFieldData.GaugeLorentzCompatible`: the generators mix among themselves. -/ +lemma repLorentzGroup_mem (hGL : T.GaugeLorentzCompatible) (Λ : SL(2,ℂ)) + {x : T.LocalFieldAlgebra} (hx : x ∈ T.LocalCovFieldAlgebra) : + T.repLorentzGroup Λ x ∈ T.LocalCovFieldAlgebra := by + refine mapsTo (T.repLorentzAlgHom Λ) (fun b hb => ?_) hx + refine covGenerators_cases (P := fun b => T.repLorentzAlgHom Λ b ∈ T.LocalCovFieldAlgebra) hb + (fun l μ ν φ => ?_) (fun i n l φ => ?_) (fun i n l φ => ?_) + (fun j n l φ => ?_) (fun j n l φ => ?_) + · obtain ⟨n, l', rfl⟩ : ∃ (n : ℕ) (l' : Fin n → (Fin 1 ⊕ Fin 3)), l = List.ofFn l' := + ⟨_, l.get, (List.ofFn_get l).symm⟩ + rw [← repLorentzGroup_apply, repLorentzGroup_covDerivFieldStrength] + exact Subalgebra.sum_mem _ fun p _ => Subalgebra.smul_mem _ + (Subalgebra.sum_mem _ fun a _ => Subalgebra.smul_mem _ + (Subalgebra.sum_mem _ fun b _ => Subalgebra.smul_mem _ + (covDerivFieldStrength_mem _ a b φ) _) _) _ + · rw [← repLorentzGroup_apply, repLorentzGroup_covDerivFermion Λ i (hGL.1 i)] + exact Subalgebra.sum_mem _ fun p _ => Subalgebra.smul_mem _ (covDerivFermion_mem i p _) _ + · rw [← repLorentzGroup_apply, repLorentzGroup_covDerivConjFermion Λ i (hGL.1 i)] + exact Subalgebra.sum_mem _ fun p _ => Subalgebra.smul_mem _ + (covDerivConjFermion_mem i p _) _ + · rw [← repLorentzGroup_apply, repLorentzGroup_covDerivBoson Λ j (hGL.2 j)] + exact Subalgebra.sum_mem _ fun p _ => Subalgebra.smul_mem _ (covDerivBoson_mem j p _) _ + · rw [← repLorentzGroup_apply, repLorentzGroup_covDerivConjBoson Λ j (hGL.2 j)] + exact Subalgebra.sum_mem _ fun p _ => Subalgebra.smul_mem _ + (covDerivConjBoson_mem j p _) _ + +/-! + +## C. The restricted actions + +-/ + +variable (T) + +/-- The action of the jet gauge group on the covariant field algebra, restricted from the + local field algebra. -/ +noncomputable def repJet : Representation ℂ GJ T.LocalCovFieldAlgebra := + T.repJet.restrictSubalgebra T.LocalCovFieldAlgebra fun U _ hx => repJet_mem U hx + +variable {T} + +@[simp] +lemma coe_repJet (U : GJ) (x : T.LocalCovFieldAlgebra) : + (repJet T U x : T.LocalFieldAlgebra) = T.repJet U x := rfl + +lemma repJet_apply_mul (U : GJ) (x y : T.LocalCovFieldAlgebra) : + repJet T U (x * y) = repJet T U x * repJet T U y := + Subtype.ext (GaugeFieldData.repJet_apply_mul U (x : T.LocalFieldAlgebra) y) + +variable (T) + +/-- The action of the Lorentz group on the covariant field algebra, restricted from the + local field algebra under `GaugeFieldData.GaugeLorentzCompatible`. -/ +noncomputable def repLorentzGroup (hGL : T.GaugeLorentzCompatible) : + Representation ℂ SL(2,ℂ) T.LocalCovFieldAlgebra := + T.repLorentzGroup.restrictSubalgebra T.LocalCovFieldAlgebra + fun Λ _ hx => repLorentzGroup_mem hGL Λ hx + +variable {T} + +@[simp] +lemma coe_repLorentzGroup (hGL : T.GaugeLorentzCompatible) (Λ : SL(2,ℂ)) + (x : T.LocalCovFieldAlgebra) : + (repLorentzGroup T hGL Λ x : T.LocalFieldAlgebra) = T.repLorentzGroup Λ x := rfl + +lemma repLorentzGroup_apply_mul (hGL : T.GaugeLorentzCompatible) (Λ : SL(2,ℂ)) + (x y : T.LocalCovFieldAlgebra) : + repLorentzGroup T hGL Λ (x * y) = repLorentzGroup T hGL Λ x * repLorentzGroup T hGL Λ y := + Subtype.ext (GaugeFieldData.repLorentzGroup_apply_mul Λ (x : T.LocalFieldAlgebra) y) + +/-! + +### C.1. The action of the ordinary gauge group + +-/ + +variable (T) + +/-- The action of the ordinary gauge group on the covariant field algebra: the jet action at + the constant jets. -/ +noncomputable def repValue : Representation ℂ G₀ T.LocalCovFieldAlgebra := + (repJet T).comp jets.ofConstant + +variable {T} + +@[simp] +lemma coe_repValue (g : G₀) (x : T.LocalCovFieldAlgebra) : + (repValue T g x : T.LocalFieldAlgebra) = T.repJet (jets.ofConstant g) x := rfl + +lemma repValue_apply_mul (g : G₀) (x y : T.LocalCovFieldAlgebra) : + repValue T g (x * y) = repValue T g x * repValue T g y := + repJet_apply_mul (jets.ofConstant g) x y + +/-- Under `GaugeFieldData.PureJetsActTrivially`, the action of the jet gauge group on the + covariant field algebra factors through evaluation: a jet acts as the constant jet of its + value, so the derivatives of a gauge transformation act trivially on covariant + expressions. -/ +theorem repJet_eq_repValue_eval (hP : T.PureJetsActTrivially) (U : GJ) + (x : T.LocalCovFieldAlgebra) : repJet T U x = repValue T (jets.eval U) x := by + refine Subtype.ext ?_ + show T.repJet U x = T.repJet (jets.ofConstant (jets.eval U)) x + refine induction (P := fun y => T.repJet U y = T.repJet (jets.ofConstant (jets.eval U)) y) + x.2 ?_ ?_ ?_ ?_ ?_ ?_ ?_ ?_ + · intro l μ ν φ + exact repJet_covDerivFieldStrength_ofConstant_eval U l μ ν φ + · intro i n l φ + exact repJet_covDerivFermion_ofConstant_eval U i (hP.1 i) l φ + · intro i n l φ + exact repJet_covDerivConjFermion_ofConstant_eval U i (hP.1 i) l φ + · intro j n l φ + exact repJet_covDerivBoson_ofConstant_eval U j (hP.2 j) l φ + · intro j n l φ + exact repJet_covDerivConjBoson_ofConstant_eval U j (hP.2 j) l φ + · intro z + exact (map_smul (T.repJet U) z 1).trans + (((congrArg (z • ·) (repJet_apply_one U)).trans + (congrArg (z • ·) (repJet_apply_one _)).symm).trans + (map_smul (T.repJet (jets.ofConstant (jets.eval U))) z 1).symm) + · intro x y hx hy + exact (map_add (T.repJet U) x y).trans + ((congrArg₂ (· + ·) hx hy).trans + (map_add (T.repJet (jets.ofConstant (jets.eval U))) x y).symm) + · intro x y hx hy + exact (GaugeFieldData.repJet_apply_mul U x y).trans + ((congrArg₂ (· * ·) hx hy).trans (GaugeFieldData.repJet_apply_mul _ x y).symm) + +/-! + +### C.2. The actions on the generators + +-/ + +/-- The ordinary gauge group rotates the adjoint index of the field-strength tower through + the dual adjoint action of the inverse. -/ +lemma repValue_covFieldStrength (g : G₀) (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ 𝔤) : + repValue T g (covFieldStrength T l μ ν φ) + = covFieldStrength T l μ ν ((jets.adjointValue g⁻¹).dualMap φ) := by + refine Subtype.ext ?_ + rw [coe_repValue, coe_covFieldStrength, coe_covFieldStrength, repJet_covDerivFieldStrength, + map_inv jets.eval, jets.eval_ofConstant] + +/-- A jet acts on the field-strength tower through the value of its inverse alone. -/ +lemma repJet_covFieldStrength (U : GJ) (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ 𝔤) : + repJet T U (covFieldStrength T l μ ν φ) + = covFieldStrength T l μ ν ((jets.adjointValue (jets.eval U⁻¹)).dualMap φ) := + Subtype.ext (repJet_covDerivFieldStrength U l μ ν φ) + +/-- A jet acts on the covariant tower of a fermionic species through the zeroth dual Taylor + coefficient of its inverse on the value index. -/ +lemma repJet_covFermion (U : GJ) (i : T.FermionSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (T.FermionValue i)) : + repJet T U (covFermion T i l φ) + = covFermion T i l (repDualCoeff (T.fermion i).repJet U⁻¹ 0 φ) := + Subtype.ext (repJet_covDerivFermion U i l φ) + +lemma repJet_covConjFermion (U : GJ) (i : T.FermionSpecies) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule (T.FermionValue i))) : + repJet T U (covConjFermion T i l φ) + = covConjFermion T i l + (repDualCoeff (JetComponentSpace.repConj (T.fermion i).repJet) U⁻¹ 0 φ) := + Subtype.ext (repJet_covDerivConjFermion U i l φ) + +lemma repJet_covBoson (U : GJ) (j : T.BosonSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (T.BosonValue j)) : + repJet T U (covBoson T j l φ) = covBoson T j l (repDualCoeff (T.boson j).repJet U⁻¹ 0 φ) := + Subtype.ext (repJet_covDerivBoson U j l φ) + +lemma repJet_covConjBoson (U : GJ) (j : T.BosonSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule (T.BosonValue j))) : + repJet T U (covConjBoson T j l φ) + = covConjBoson T j l + (repDualCoeff (JetComponentSpace.repConj (T.boson j).repJet) U⁻¹ 0 φ) := + Subtype.ext (repJet_covDerivConjBoson U j l φ) + +-- The entry `Λ_{b a}` of the Lorentz matrix of `Λ : SL(2,ℂ)`, as a complex scalar. +set_option quotPrecheck false in +local notation:max "L[" Λ "]" b:max a:max => (((SL2C.toLorentzGroup Λ).1 b a : ℝ) : ℂ) + +/-- The Lorentz law of the field-strength tower in the covariant field algebra: every + covariant slot and both covector indices mix by the columns of the Lorentz matrix. -/ +lemma repLorentzGroup_covFieldStrength (hGL : T.GaugeLorentzCompatible) (Λ : SL(2,ℂ)) + {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + repLorentzGroup T hGL Λ (covFieldStrength T (List.ofFn l) μ ν φ) + = ∑ p : Fin n → (Fin 1 ⊕ Fin 3), (∏ k, L[Λ] (p k) (l k)) • + ∑ a, L[Λ] a μ • ∑ b, L[Λ] b ν • covFieldStrength T (List.ofFn p) a b φ := by + refine Subtype.ext ((repLorentzGroup_covDerivFieldStrength Λ l μ ν φ).trans ?_) + simp only [AddSubmonoidClass.coe_finsetSum, Subalgebra.coe_smul, coe_covFieldStrength] + +/-- The Lorentz law of the covariant tower of a fermionic species in the covariant field + algebra: every covariant slot mixes by the columns of the Lorentz matrix and the value + index transforms contragrediently. -/ +lemma repLorentzGroup_covFermion (hGL : T.GaugeLorentzCompatible) (Λ : SL(2,ℂ)) + (i : T.FermionSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (T.FermionValue i)) : + repLorentzGroup T hGL Λ (covFermion T i l φ) + = ∑ p : Fin n → (Fin 1 ⊕ Fin 3), (∏ k, L[Λ] (p k) (l k)) • + covFermion T i p ((T.fermion i).repLorentz.dual Λ φ) := by + refine Subtype.ext ((repLorentzGroup_covDerivFermion Λ i (hGL.1 i) l φ).trans ?_) + simp only [AddSubmonoidClass.coe_finsetSum, Subalgebra.coe_smul, coe_covFermion] + +lemma repLorentzGroup_covConjFermion (hGL : T.GaugeLorentzCompatible) (Λ : SL(2,ℂ)) + (i : T.FermionSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule (T.FermionValue i))) : + repLorentzGroup T hGL Λ (covConjFermion T i l φ) + = ∑ p : Fin n → (Fin 1 ⊕ Fin 3), (∏ k, L[Λ] (p k) (l k)) • + covConjFermion T i p ((T.fermion i).repLorentz.conj.dual Λ φ) := by + refine Subtype.ext ((repLorentzGroup_covDerivConjFermion Λ i (hGL.1 i) l φ).trans ?_) + simp only [AddSubmonoidClass.coe_finsetSum, Subalgebra.coe_smul, coe_covConjFermion] + +lemma repLorentzGroup_covBoson (hGL : T.GaugeLorentzCompatible) (Λ : SL(2,ℂ)) + (j : T.BosonSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (T.BosonValue j)) : + repLorentzGroup T hGL Λ (covBoson T j l φ) + = ∑ p : Fin n → (Fin 1 ⊕ Fin 3), (∏ k, L[Λ] (p k) (l k)) • + covBoson T j p ((T.boson j).repLorentz.dual Λ φ) := by + refine Subtype.ext ((repLorentzGroup_covDerivBoson Λ j (hGL.2 j) l φ).trans ?_) + simp only [AddSubmonoidClass.coe_finsetSum, Subalgebra.coe_smul, coe_covBoson] + +lemma repLorentzGroup_covConjBoson (hGL : T.GaugeLorentzCompatible) (Λ : SL(2,ℂ)) + (j : T.BosonSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule (T.BosonValue j))) : + repLorentzGroup T hGL Λ (covConjBoson T j l φ) + = ∑ p : Fin n → (Fin 1 ⊕ Fin 3), (∏ k, L[Λ] (p k) (l k)) • + covConjBoson T j p ((T.boson j).repLorentz.conj.dual Λ φ) := by + refine Subtype.ext ((repLorentzGroup_covDerivConjBoson Λ j (hGL.2 j) l φ).trans ?_) + simp only [AddSubmonoidClass.coe_finsetSum, Subalgebra.coe_smul, coe_covConjBoson] + +end LocalCovFieldAlgebra + +end GaugeFieldData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Basic.lean index 8a0034098..e6f2d7291 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Basic.lean @@ -302,6 +302,13 @@ lemma ιConnection_commute_ιFermionTotal (v : GaugeBoson.JetComponentSpace 𝔤 simp [Commute, SemiconjBy, ιConnection_apply, ιFermionTotal_apply, Algebra.TensorProduct.tmul_mul_tmul, mul_comm] +/-- The connection factor is central: its elements commute with the whole algebra, the + factor being commutative and tensored in as the right factor. -/ +lemma includeConnection_commute + (c : ℂ ⊗[ℝ] SymmetricAlgebra ℝ (GaugeBoson.JetComponentSpace 𝔤)) (x : T.LocalFieldAlgebra) : + Commute (T.includeConnection c) x := + (Algebra.TensorProduct.includeRight_mul_comm c x).symm + /-- A fermionic generator of a species squares to zero. -/ @[simp] lemma ιFermion_mul_self (i : T.FermionSpecies) (x : JetComponentSpace (T.fermion i)) : @@ -397,7 +404,7 @@ lemma adjoin_generators_eq_top : Algebra.adjoin ℂ T.generators = ⊤ := by /-- Two algebra maps out of the local field algebra agreeing on the whole of the three generator spaces are equal. The target is not assumed commutative, so this cannot be deduced from `SymmetricAlgebra.algHom_ext`; it comes from generation. -/ -lemma algHom_ext_generators {B : Type*} [Ring B] [Algebra ℂ B] +lemma algHom_ext_generators {B : Type*} [Semiring B] [Algebra ℂ B] {Φ Ψ : T.LocalFieldAlgebra →ₐ[ℂ] B} (hf : ∀ v, Φ (T.ιFermionTotal v) = Ψ (T.ιFermionTotal v)) (hb : ∀ v, Φ (T.ιBosonTotal v) = Ψ (T.ιBosonTotal v)) @@ -412,7 +419,7 @@ variable {T} every species and on the connection generators. A linear map out of the fermionic generator space is determined by its restrictions to the species, so the species-wise hypotheses already give the hypotheses of `algHom_ext_generators`. -/ -lemma algHom_ext {B : Type*} [Ring B] [Algebra ℂ B] {Φ Ψ : T.LocalFieldAlgebra →ₐ[ℂ] B} +lemma algHom_ext {B : Type*} [Semiring B] [Algebra ℂ B] {Φ Ψ : T.LocalFieldAlgebra →ₐ[ℂ] B} (hf : ∀ i x, Φ (T.ιFermion i x) = Ψ (T.ιFermion i x)) (hb : ∀ j y, Φ (T.ιBoson j y) = Ψ (T.ιBoson j y)) (ha : ∀ v, Φ (T.ιConnection v) = Ψ (T.ιConnection v)) : Φ = Ψ := diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/CovariantDeriv.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/CovariantDeriv.lean new file mode 100644 index 000000000..79f4a26d8 --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/CovariantDeriv.lean @@ -0,0 +1,408 @@ +/- +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.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.TransformsIn +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.LorentzCovariantDeriv +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeFieldAlgebra.FieldStrength +/-! +# The covariant derivatives in the local field algebra + +## i. Overview + +The covariant expressions of a gauge theory are the iterated covariant derivatives of its +matter fields and of the field strength, built here inside the local field algebra `J(T)` +of a field datum. For a matter species the tower is `GaugeAlgebraRealization.covDerivIter` +on the symbol family of the species: `∇_{l 0} ⋯ ∇_{l (n-1)} ψ` along an ordered tuple `l` +of directions, with `∇_ρ F = [∂_ρ F] + A_ρ · F` through the infinitesimal action +`repAlgebra` of the species on the value index, the conjugate components through the +conjugate action. Zero derivatives is the undifferentiated symbol, and the ordered labels +are kept: nothing is identified with the multiset-indexed ordinary derivatives. For the +gauge bosons the tower is the gauge-only `LocalGaugeFieldAlgebra.covDerivFieldStrength`, +included through the connection factor. + +A jet acts on every tower through the base-point Taylor coefficient of its inverse on the +value index alone, unconditionally; under `MatterField.PureJetsActTrivially` the action on +a matter tower factors through evaluation to the ordinary gauge group. A Lorentz +transformation mixes the covariant slots by the columns of the Lorentz matrix and the value +index contragrediently, under `MatterField.GaugeLorentzCompatible` for the matter towers +and unconditionally for the field strength. + +## ii. Key results + +- `GaugeFieldData.covDerivFermion`, `GaugeFieldData.covDerivConjFermion`, + `GaugeFieldData.covDerivBoson`, `GaugeFieldData.covDerivConjBoson`, + `GaugeFieldData.covDerivFieldStrength` : the covariant towers. +- `GaugeFieldData.repJet_covDerivFermion` and companions : the gauge laws; + `GaugeFieldData.repJet_covDerivFermion_ofConstant_eval` and companions : the + factorization through evaluation. +- `GaugeFieldData.repLorentzGroup_covDerivFermion` and companions : the Lorentz laws. + +## iii. Table of contents + +- A. The covariant matter towers +- B. The included field-strength tower +- C. The gauge laws +- D. The Lorentz laws + +-/ + +@[expose] public section + +open TensorProduct Matrix MatrixGroups Lorentz +open GaugeAlgebraRealization (covDerivIter covDerivAction actionFamConv fieldStrength + iteratedCovDerivAdjoint repDualCoeff) + +namespace GaugeFieldData + +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} (T : GaugeFieldData jets) + +/-! + +## A. The covariant matter towers + +-/ + +/-- The iterated covariant derivative `∇_{l 0} ⋯ ∇_{l (n-1)} ψ` of a fermionic species along + an ordered tuple of directions, as a family over the covectors of its value space. -/ +noncomputable def covDerivFermion (i : T.FermionSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (T.FermionValue i) →ₗ[ℂ] T.LocalFieldAlgebra := + covDerivIter T.gaugeRealization.A (T.fermion i).repAlgebra (T.fermionSymbol i) n l 0 + +/-- The iterated covariant derivative of the conjugate components of a fermionic species, + through the conjugate infinitesimal action. -/ +noncomputable def covDerivConjFermion (i : T.FermionSpecies) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (ConjModule (T.FermionValue i)) →ₗ[ℂ] T.LocalFieldAlgebra := + covDerivIter T.gaugeRealization.A (LocalGaugeData.actionConj (T.fermion i).repAlgebra) + (T.conjFermionSymbol i) n l 0 + +/-- The iterated covariant derivative of a bosonic species. -/ +noncomputable def covDerivBoson (j : T.BosonSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (T.BosonValue j) →ₗ[ℂ] T.LocalFieldAlgebra := + covDerivIter T.gaugeRealization.A (T.boson j).repAlgebra (T.bosonSymbol j) n l 0 + +/-- The iterated covariant derivative of the conjugate components of a bosonic species. -/ +noncomputable def covDerivConjBoson (j : T.BosonSpecies) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (ConjModule (T.BosonValue j)) →ₗ[ℂ] T.LocalFieldAlgebra := + covDerivIter T.gaugeRealization.A (LocalGaugeData.actionConj (T.boson j).repAlgebra) + (T.conjBosonSymbol j) n l 0 + +variable {T} + +/-- Zero covariant derivatives: the undifferentiated symbol. -/ +lemma covDerivFermion_zero (i : T.FermionSpecies) (l : Fin 0 → (Fin 1 ⊕ Fin 3)) : + T.covDerivFermion i l = T.fermionSymbol i 0 := rfl + +lemma covDerivConjFermion_zero (i : T.FermionSpecies) (l : Fin 0 → (Fin 1 ⊕ Fin 3)) : + T.covDerivConjFermion i l = T.conjFermionSymbol i 0 := rfl + +lemma covDerivBoson_zero (j : T.BosonSpecies) (l : Fin 0 → (Fin 1 ⊕ Fin 3)) : + T.covDerivBoson j l = T.bosonSymbol j 0 := rfl + +lemma covDerivConjBoson_zero (j : T.BosonSpecies) (l : Fin 0 → (Fin 1 ⊕ Fin 3)) : + T.covDerivConjBoson j l = T.conjBosonSymbol j 0 := rfl + +/-- One more covariant derivative, peeled off the front of the tuple: the derivative symbol + `[∂_{l 0} ∇_{l'} ψ]` of the lower tower plus the derived action `A_{l 0} · ∇_{l'} ψ` of the + gauge field on its value index, both read off the lower tower as a family. -/ +lemma covDerivFermion_succ (i : T.FermionSpecies) {n : ℕ} (l : Fin (n + 1) → (Fin 1 ⊕ Fin 3)) : + T.covDerivFermion i l + = covDerivIter T.gaugeRealization.A (T.fermion i).repAlgebra (T.fermionSymbol i) n + (fun k => l k.succ) {l 0} + + actionFamConv T.gaugeRealization.A (T.fermion i).repAlgebra (l 0) + (covDerivIter T.gaugeRealization.A (T.fermion i).repAlgebra (T.fermionSymbol i) n + fun k => l k.succ) 0 := rfl + +lemma covDerivConjFermion_succ (i : T.FermionSpecies) {n : ℕ} + (l : Fin (n + 1) → (Fin 1 ⊕ Fin 3)) : + T.covDerivConjFermion i l + = covDerivIter T.gaugeRealization.A (LocalGaugeData.actionConj (T.fermion i).repAlgebra) + (T.conjFermionSymbol i) n (fun k => l k.succ) {l 0} + + actionFamConv T.gaugeRealization.A (LocalGaugeData.actionConj (T.fermion i).repAlgebra) + (l 0) (covDerivIter T.gaugeRealization.A + (LocalGaugeData.actionConj (T.fermion i).repAlgebra) (T.conjFermionSymbol i) n + fun k => l k.succ) 0 := rfl + +lemma covDerivBoson_succ (j : T.BosonSpecies) {n : ℕ} (l : Fin (n + 1) → (Fin 1 ⊕ Fin 3)) : + T.covDerivBoson j l + = covDerivIter T.gaugeRealization.A (T.boson j).repAlgebra (T.bosonSymbol j) n + (fun k => l k.succ) {l 0} + + actionFamConv T.gaugeRealization.A (T.boson j).repAlgebra (l 0) + (covDerivIter T.gaugeRealization.A (T.boson j).repAlgebra (T.bosonSymbol j) n + fun k => l k.succ) 0 := rfl + +lemma covDerivConjBoson_succ (j : T.BosonSpecies) {n : ℕ} + (l : Fin (n + 1) → (Fin 1 ⊕ Fin 3)) : + T.covDerivConjBoson j l + = covDerivIter T.gaugeRealization.A (LocalGaugeData.actionConj (T.boson j).repAlgebra) + (T.conjBosonSymbol j) n (fun k => l k.succ) {l 0} + + actionFamConv T.gaugeRealization.A (LocalGaugeData.actionConj (T.boson j).repAlgebra) + (l 0) (covDerivIter T.gaugeRealization.A + (LocalGaugeData.actionConj (T.boson j).repAlgebra) (T.conjBosonSymbol j) n + fun k => l k.succ) 0 := rfl + +variable (T) + +/-! + +## B. The included field-strength tower + +-/ + +/-- The field strength and its ordered covariant derivatives `∇_l F_μν^φ`, included from + the real gauge-only algebra through the connection factor. -/ +noncomputable def covDerivFieldStrength (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : + Module.Dual ℝ 𝔤 →ₗ[ℝ] T.LocalFieldAlgebra := + (T.includeConnection.restrictScalars ℝ).toLinearMap ∘ₗ + (Algebra.TensorProduct.includeRight (R := ℝ) (A := ℂ) + (B := LocalGaugeFieldAlgebra 𝔤)).toLinearMap ∘ₗ + LocalGaugeFieldAlgebra.covDerivFieldStrength 𝔤 l μ ν + +variable {T} + +lemma covDerivFieldStrength_apply (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ 𝔤) : + T.covDerivFieldStrength l μ ν φ + = T.includeConnection ((1 : ℂ) ⊗ₜ[ℝ] + LocalGaugeFieldAlgebra.covDerivFieldStrength 𝔤 l μ ν φ) := rfl + +/-- Zero covariant derivatives: the included field strength. -/ +lemma covDerivFieldStrength_nil (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + T.covDerivFieldStrength [] μ ν φ + = T.includeConnection ((1 : ℂ) ⊗ₜ[ℝ] LocalGaugeFieldAlgebra.fieldStrength 𝔤 μ ν φ) := rfl + +/-- The included tower is the covariant tower of the gauge-field symbols of `J(T)` computed + by the realization theory, the tower being natural along the inclusion of the connection + factor. -/ +lemma covDerivFieldStrength_eq_iteratedCovDerivAdjoint (l : List (Fin 1 ⊕ Fin 3)) + (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + T.covDerivFieldStrength l μ ν φ + = iteratedCovDerivAdjoint T.gaugeRealization.A l + (fieldStrength T.gaugeRealization.A μ ν) 0 φ := by + let ι : (ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤) →ₗ[ℝ] T.LocalFieldAlgebra := + T.includeConnection.toLinearMap.restrictScalars ℝ + have hmul : ∀ x y, ι (x * y) = ι x * ι y := fun x y => map_mul T.includeConnection x y + have hF : ∀ p, ι ∘ₗ fieldStrength (LocalGaugeFieldAlgebra.gaugeField 𝔤) μ ν p + = fieldStrength (B := T.LocalFieldAlgebra) + (fun p ρ => ι ∘ₗ LocalGaugeFieldAlgebra.gaugeField 𝔤 p ρ) μ ν p := + fun p => (GaugeAlgebraRealization.fieldStrength_map + (B := ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤) (B' := T.LocalFieldAlgebra) ι hmul + (LocalGaugeFieldAlgebra.gaugeField 𝔤) μ ν p).symm + have key : iteratedCovDerivAdjoint (B := T.LocalFieldAlgebra) + (fun p ρ => ι ∘ₗ LocalGaugeFieldAlgebra.gaugeField 𝔤 p ρ) l + (fieldStrength (B := T.LocalFieldAlgebra) + (fun p ρ => ι ∘ₗ LocalGaugeFieldAlgebra.gaugeField 𝔤 p ρ) μ ν) 0 φ + = ι (iteratedCovDerivAdjoint (LocalGaugeFieldAlgebra.gaugeField 𝔤) l + (fieldStrength (LocalGaugeFieldAlgebra.gaugeField 𝔤) μ ν) 0 φ) := by + rw [← funext hF] + exact LinearMap.congr_fun (congrFun (GaugeAlgebraRealization.iteratedCovDerivAdjoint_map + (B := ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤) (B' := T.LocalFieldAlgebra) ι hmul + (LocalGaugeFieldAlgebra.gaugeField 𝔤) l + (fieldStrength (LocalGaugeFieldAlgebra.gaugeField 𝔤) μ ν)) 0) φ + rw [covDerivFieldStrength_apply, LocalGaugeFieldAlgebra.covDerivFieldStrength, + LocalGaugeFieldAlgebra.one_tmul_iteratedCovDerivAdjoint_fieldStrength] + exact key.symm + +/-! + +## C. The gauge laws + +-/ + +section GaugeLaws + +variable (U : GJ) + +/-- The gauge law of the covariant tower of a fermionic species: a jet acts through the + zeroth dual Taylor coefficient of its inverse on the value index alone. -/ +theorem repJet_covDerivFermion (i : T.FermionSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (T.FermionValue i)) : + T.repJet U (T.covDerivFermion i l φ) + = T.covDerivFermion i l (repDualCoeff (T.fermion i).repJet U⁻¹ 0 φ) := + (LocalGaugeData.TransformsIn.covDerivIter T.gaugeRealization (transformsIn_fermionSymbol i) + (T.fermion i).repAlgebra_isInfinitesimalAction n l).repGauge_zero U φ + +/-- The gauge law of the conjugate covariant tower of a fermionic species, through the + conjugate representation. -/ +theorem repJet_covDerivConjFermion (i : T.FermionSpecies) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule (T.FermionValue i))) : + T.repJet U (T.covDerivConjFermion i l φ) + = T.covDerivConjFermion i l + (repDualCoeff (JetComponentSpace.repConj (T.fermion i).repJet) U⁻¹ 0 φ) := + (LocalGaugeData.TransformsIn.covDerivIter T.gaugeRealization + (transformsIn_conjFermionSymbol i) + (T.fermion i).repAlgebra_isInfinitesimalAction.conj n l).repGauge_zero U φ + +/-- The gauge law of the covariant tower of a bosonic species. -/ +theorem repJet_covDerivBoson (j : T.BosonSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (T.BosonValue j)) : + T.repJet U (T.covDerivBoson j l φ) + = T.covDerivBoson j l (repDualCoeff (T.boson j).repJet U⁻¹ 0 φ) := + (LocalGaugeData.TransformsIn.covDerivIter T.gaugeRealization (transformsIn_bosonSymbol j) + (T.boson j).repAlgebra_isInfinitesimalAction n l).repGauge_zero U φ + +/-- The gauge law of the conjugate covariant tower of a bosonic species. -/ +theorem repJet_covDerivConjBoson (j : T.BosonSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule (T.BosonValue j))) : + T.repJet U (T.covDerivConjBoson j l φ) + = T.covDerivConjBoson j l + (repDualCoeff (JetComponentSpace.repConj (T.boson j).repJet) U⁻¹ 0 φ) := + (LocalGaugeData.TransformsIn.covDerivIter T.gaugeRealization (transformsIn_conjBosonSymbol j) + (T.boson j).repAlgebra_isInfinitesimalAction.conj n l).repGauge_zero U φ + +/-- The gauge law of the included field-strength tower: a jet acts through the dual + adjoint action of the value of its inverse, from the gauge-only law. -/ +theorem repJet_covDerivFieldStrength (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ 𝔤) : + T.repJet U (T.covDerivFieldStrength l μ ν φ) + = T.covDerivFieldStrength l μ ν ((jets.adjointValue (jets.eval U⁻¹)).dualMap φ) := by + rw [covDerivFieldStrength_apply, repJet_apply, repJetAlgHom_includeConnection_one_tmul, + LocalGaugeFieldAlgebra.repJet_covDerivFieldStrength_eval] + rfl + +/-- Under `MatterField.PureJetsActTrivially` for the species, the jet action on its + covariant tower factors through evaluation: a jet acts as the constant jet of its + value. -/ +lemma repJet_covDerivFermion_ofConstant_eval (i : T.FermionSpecies) + (hi : (T.fermion i).PureJetsActTrivially) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (T.FermionValue i)) : + T.repJet U (T.covDerivFermion i l φ) + = T.repJet (jets.ofConstant (jets.eval U)) (T.covDerivFermion i l φ) := + (LocalGaugeData.TransformsIn.covDerivIter T.gaugeRealization (transformsIn_fermionSymbol i) + (T.fermion i).repAlgebra_isInfinitesimalAction n l).repGauge_zero_eq_ofConstant_eval + (T.fermion i).repJet_smul hi U φ + +lemma repJet_covDerivConjFermion_ofConstant_eval (i : T.FermionSpecies) + (hi : (T.fermion i).PureJetsActTrivially) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule (T.FermionValue i))) : + T.repJet U (T.covDerivConjFermion i l φ) + = T.repJet (jets.ofConstant (jets.eval U)) (T.covDerivConjFermion i l φ) := + (LocalGaugeData.TransformsIn.covDerivIter T.gaugeRealization + (transformsIn_conjFermionSymbol i) + (T.fermion i).repAlgebra_isInfinitesimalAction.conj n l).repGauge_zero_eq_ofConstant_eval + (JetComponentSpace.repConj_smul_comm (T.fermion i).repJet_smul) + (fun hW => LocalGaugeData.repCoeff_repConj_zero_eq_id (hi hW)) U φ + +lemma repJet_covDerivBoson_ofConstant_eval (j : T.BosonSpecies) + (hj : (T.boson j).PureJetsActTrivially) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (T.BosonValue j)) : + T.repJet U (T.covDerivBoson j l φ) + = T.repJet (jets.ofConstant (jets.eval U)) (T.covDerivBoson j l φ) := + (LocalGaugeData.TransformsIn.covDerivIter T.gaugeRealization (transformsIn_bosonSymbol j) + (T.boson j).repAlgebra_isInfinitesimalAction n l).repGauge_zero_eq_ofConstant_eval + (T.boson j).repJet_smul hj U φ + +lemma repJet_covDerivConjBoson_ofConstant_eval (j : T.BosonSpecies) + (hj : (T.boson j).PureJetsActTrivially) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule (T.BosonValue j))) : + T.repJet U (T.covDerivConjBoson j l φ) + = T.repJet (jets.ofConstant (jets.eval U)) (T.covDerivConjBoson j l φ) := + (LocalGaugeData.TransformsIn.covDerivIter T.gaugeRealization (transformsIn_conjBosonSymbol j) + (T.boson j).repAlgebra_isInfinitesimalAction.conj n l).repGauge_zero_eq_ofConstant_eval + (JetComponentSpace.repConj_smul_comm (T.boson j).repJet_smul) + (fun hW => LocalGaugeData.repCoeff_repConj_zero_eq_id (hj hW)) U φ + +/-- The jet action on the field-strength tower factors through evaluation, with no + condition. -/ +lemma repJet_covDerivFieldStrength_ofConstant_eval (l : List (Fin 1 ⊕ Fin 3)) + (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + T.repJet U (T.covDerivFieldStrength l μ ν φ) + = T.repJet (jets.ofConstant (jets.eval U)) (T.covDerivFieldStrength l μ ν φ) := by + rw [repJet_covDerivFieldStrength, repJet_covDerivFieldStrength, map_inv jets.eval, + map_inv jets.eval, jets.eval_ofConstant] + +end GaugeLaws + +/-! + +## D. The Lorentz laws + +-/ + +section LorentzLaws + +-- The entry `Λ_{b a}` of the Lorentz matrix of `Λ : SL(2,ℂ)`, as a complex scalar. +set_option quotPrecheck false in +local notation:max "L[" Λ "]" b:max a:max => (((SL2C.toLorentzGroup Λ).1 b a : ℝ) : ℂ) + +variable (Λ : SL(2,ℂ)) + +/-- The Lorentz law of the covariant tower of a fermionic species, under + `MatterField.GaugeLorentzCompatible` for the species: every covariant slot mixes by the + columns of the Lorentz matrix and the value index transforms contragrediently. -/ +theorem repLorentzGroup_covDerivFermion (i : T.FermionSpecies) + (hi : (T.fermion i).GaugeLorentzCompatible) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (T.FermionValue i)) : + T.repLorentzGroup Λ (T.covDerivFermion i l φ) + = ∑ p : Fin n → (Fin 1 ⊕ Fin 3), (∏ k, L[Λ] (p k) (l k)) • + T.covDerivFermion i p ((T.fermion i).repLorentz.dual Λ φ) := + GaugeAlgebraRealization.isLorentzCovDerivTransforms_covDerivIter T.gaugeRealization hi + (T.fermionSymbol i) (isLorentzDerivTransforms_fermionSymbol i) Λ n l φ + +/-- The Lorentz law of the conjugate covariant tower of a fermionic species. -/ +theorem repLorentzGroup_covDerivConjFermion (i : T.FermionSpecies) + (hi : (T.fermion i).GaugeLorentzCompatible) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule (T.FermionValue i))) : + T.repLorentzGroup Λ (T.covDerivConjFermion i l φ) + = ∑ p : Fin n → (Fin 1 ⊕ Fin 3), (∏ k, L[Λ] (p k) (l k)) • + T.covDerivConjFermion i p ((T.fermion i).repLorentz.conj.dual Λ φ) := + GaugeAlgebraRealization.isLorentzCovDerivTransforms_covDerivIter_conj T.gaugeRealization hi + (T.conjFermionSymbol i) (isLorentzDerivTransforms_conjFermionSymbol i) Λ n l φ + +/-- The Lorentz law of the covariant tower of a bosonic species. -/ +theorem repLorentzGroup_covDerivBoson (j : T.BosonSpecies) + (hj : (T.boson j).GaugeLorentzCompatible) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (T.BosonValue j)) : + T.repLorentzGroup Λ (T.covDerivBoson j l φ) + = ∑ p : Fin n → (Fin 1 ⊕ Fin 3), (∏ k, L[Λ] (p k) (l k)) • + T.covDerivBoson j p ((T.boson j).repLorentz.dual Λ φ) := + GaugeAlgebraRealization.isLorentzCovDerivTransforms_covDerivIter T.gaugeRealization hj + (T.bosonSymbol j) (isLorentzDerivTransforms_bosonSymbol j) Λ n l φ + +/-- The Lorentz law of the conjugate covariant tower of a bosonic species. -/ +theorem repLorentzGroup_covDerivConjBoson (j : T.BosonSpecies) + (hj : (T.boson j).GaugeLorentzCompatible) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule (T.BosonValue j))) : + T.repLorentzGroup Λ (T.covDerivConjBoson j l φ) + = ∑ p : Fin n → (Fin 1 ⊕ Fin 3), (∏ k, L[Λ] (p k) (l k)) • + T.covDerivConjBoson j p ((T.boson j).repLorentz.conj.dual Λ φ) := + GaugeAlgebraRealization.isLorentzCovDerivTransforms_covDerivIter_conj T.gaugeRealization hj + (T.conjBosonSymbol j) (isLorentzDerivTransforms_conjBosonSymbol j) Λ n l φ + +/-- A real scalar acting on the inclusion of a real element of the gauge-only algebra is the + same complex scalar acting on it. -/ +private lemma includeConnection_one_tmul_real_smul (r : ℝ) (x : LocalGaugeFieldAlgebra 𝔤) : + T.includeConnection ((1 : ℂ) ⊗ₜ[ℝ] (r • x)) + = ((r : ℝ) : ℂ) • T.includeConnection ((1 : ℂ) ⊗ₜ[ℝ] x) := by + rw [TensorProduct.tmul_smul, ← algebraMap_smul ℂ r ((1 : ℂ) ⊗ₜ[ℝ] x), map_smul] + rfl + +/-- The Lorentz law of the field-strength tower, with no condition: every covariant slot + and both covector indices mix by the columns of the Lorentz matrix. -/ +theorem repLorentzGroup_covDerivFieldStrength {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + T.repLorentzGroup Λ (T.covDerivFieldStrength (List.ofFn l) μ ν φ) + = ∑ p : Fin n → (Fin 1 ⊕ Fin 3), (∏ k, L[Λ] (p k) (l k)) • + ∑ a, L[Λ] a μ • ∑ b, L[Λ] b ν • T.covDerivFieldStrength (List.ofFn p) a b φ := by + rw [covDerivFieldStrength_apply, repLorentzGroup_apply, + repLorentzAlgHom_includeConnection_one_tmul, + LocalGaugeFieldAlgebra.repLorentzGroup_covDerivFieldStrength, TensorProduct.tmul_sum, + map_sum] + refine Finset.sum_congr rfl fun p _ => ?_ + rw [includeConnection_one_tmul_real_smul, Complex.ofReal_prod, TensorProduct.tmul_sum, map_sum] + refine congrArg _ (Finset.sum_congr rfl fun a _ => ?_) + rw [includeConnection_one_tmul_real_smul, TensorProduct.tmul_sum, map_sum] + refine congrArg _ (Finset.sum_congr rfl fun b _ => ?_) + rw [includeConnection_one_tmul_real_smul] + rfl + +end LorentzLaws + +end GaugeFieldData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/GaugeAction.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/GaugeAction.lean new file mode 100644 index 000000000..48cb1385b --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/GaugeAction.lean @@ -0,0 +1,218 @@ +/- +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.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeFieldAlgebra.GaugeAction +/-! +# The jet gauge action on the local field algebra + +## i. Overview + +The jet gauge group `GJ` acts on the local field algebra `J(T)` of a field datum by algebra +endomorphisms: on the generators of a matter species by the action +`JetComponentSpace.repJet` of that species, and on the connection generators by the affine +action `LocalGaugeFieldAlgebra.repJet` of the gauge-only algebra, with its Maurer–Cartan +shift. The three generator actions form a compatible assignment, whose lift through the +universal property of `J(T)` is the action of one jet; the representation laws follow from +uniqueness, without unfolding the tensor-product carrier. + +## ii. Key results + +- `GaugeFieldData.repJetAlgHom`, `GaugeFieldData.repJet` : the action of a jet, as an + algebra endomorphism and as a representation, with `repJet_ιFermion`, `repJet_ιBoson`, + `repJet_ιConnection` on the generators. +- `GaugeFieldData.repJet_includeConnection` : on the connection factor the action is the + complexified gauge-only action. + +## iii. Table of contents + +- A. The gauge assignment of a jet +- B. The action of a jet +- C. The action on the connection factor +- D. The representation + +-/ + +@[expose] public section + +open TensorProduct + +namespace GaugeFieldData + +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} (T : GaugeFieldData jets) + +/-! + +## A. The gauge assignment of a jet + +-/ + +/-- The connection generators after the action of a jet: the gauge-only action on the + degree-one element, included into the local field algebra. -/ +noncomputable def gaugeConnection (U : GJ) : + GaugeBoson.JetComponentSpace 𝔤 →ₗ[ℝ] T.LocalFieldAlgebra := + ((T.includeConnection).restrictScalars ℝ).toLinearMap ∘ₗ + (Algebra.TensorProduct.includeRight (R := ℝ) (A := ℂ) + (B := SymmetricAlgebra ℝ (GaugeBoson.JetComponentSpace 𝔤))).toLinearMap ∘ₗ + (LocalGaugeFieldAlgebra.repJetAlgHom jets U).toLinearMap ∘ₗ + SymmetricAlgebra.ι ℝ (GaugeBoson.JetComponentSpace 𝔤) + +/-- The assignment of the generators defining the action of a jet: each matter species + acts on its own component functions, the connection generators through the gauge-only + action. The relations hold because the images are generators of the same kind, or lie in + the central connection factor. -/ +noncomputable def gaugeAssignment (U : GJ) : T.Assignment T.LocalFieldAlgebra where + fermion i := T.ιFermion i ∘ₗ JetComponentSpace.repJet (T.fermion i) U + boson j := T.ιBoson j ∘ₗ JetComponentSpace.repJet (T.boson j) U + connection := T.gaugeConnection U + fermion_mul_self i _ := ιFermion_mul_self i _ + fermion_mul_swap i j _ _ := ιFermion_mul_swap i j _ _ + boson_commute i j _ _ := ιBoson_commute i j _ _ + connection_commute _ _ := (Commute.all _ _).map T.includeConnection + boson_commute_connection _ _ _ := (includeConnection_commute _ _).symm + boson_commute_fermion j i _ _ := ιBoson_commute_ιFermion j i _ _ + connection_commute_fermion _ _ _ := includeConnection_commute _ _ + +/-! + +## B. The action of a jet + +-/ + +/-- The action of a jet on the local field algebra, as an algebra endomorphism: the lift + of its gauge assignment. -/ +noncomputable def repJetAlgHom (U : GJ) : T.LocalFieldAlgebra →ₐ[ℂ] T.LocalFieldAlgebra := + (T.gaugeAssignment U).lift + +variable {T} + +@[simp] +lemma repJetAlgHom_ιFermion (U : GJ) (i : T.FermionSpecies) + (x : JetComponentSpace (T.fermion i)) : + T.repJetAlgHom U (T.ιFermion i x) + = T.ιFermion i (JetComponentSpace.repJet (T.fermion i) U x) := + (T.gaugeAssignment U).lift_ιFermion i x + +@[simp] +lemma repJetAlgHom_ιBoson (U : GJ) (j : T.BosonSpecies) (y : JetComponentSpace (T.boson j)) : + T.repJetAlgHom U (T.ιBoson j y) = T.ιBoson j (JetComponentSpace.repJet (T.boson j) U y) := + (T.gaugeAssignment U).lift_ιBoson j y + +@[simp] +lemma repJetAlgHom_ιConnection (U : GJ) (v : GaugeBoson.JetComponentSpace 𝔤) : + T.repJetAlgHom U (T.ιConnection v) + = T.includeConnection ((1 : ℂ) ⊗ₜ[ℝ] + LocalGaugeFieldAlgebra.repJet jets U (SymmetricAlgebra.ι ℝ _ v)) := + (T.gaugeAssignment U).lift_ιConnection v + +/-! + +## C. The action on the connection factor + +-/ + +/-- The action of a jet restricts to the complexified gauge-only action on the connection + factor, as an equation of algebra maps out of the complexified gauge-only algebra: it is + enough to compare them on the real generators, where it is the computation rule of the + lift. -/ +lemma repJetAlgHom_comp_includeConnection (U : GJ) : + (T.repJetAlgHom U).comp T.includeConnection + = T.includeConnection.comp (LocalGaugeFieldAlgebra.complexRepJetAlgHom jets U) := by + refine Algebra.TensorProduct.ext (Subsingleton.elim _ _) ?_ + refine AlgHom.ext_of_adjoin_eq_top SymmetricAlgebra.adjoin_range_ι ?_ + rintro _ ⟨v, rfl⟩ + exact repJetAlgHom_ιConnection U v + +/-- The action of a jet restricts to the complexified gauge-only action on the connection + factor. -/ +lemma repJetAlgHom_includeConnection (U : GJ) (y : ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤) : + T.repJetAlgHom U (T.includeConnection y) + = T.includeConnection (LocalGaugeFieldAlgebra.complexRepJet jets U y) := by + rw [LocalGaugeFieldAlgebra.complexRepJet_apply] + exact AlgHom.congr_fun (repJetAlgHom_comp_includeConnection U) y + +/-- On the real gauge-only algebra, included, a jet acts through the gauge-only action. -/ +lemma repJetAlgHom_includeConnection_one_tmul (U : GJ) (x : LocalGaugeFieldAlgebra 𝔤) : + T.repJetAlgHom U (T.includeConnection ((1 : ℂ) ⊗ₜ[ℝ] x)) + = T.includeConnection ((1 : ℂ) ⊗ₜ[ℝ] LocalGaugeFieldAlgebra.repJet jets U x) := + repJetAlgHom_includeConnection U ((1 : ℂ) ⊗ₜ[ℝ] x) + +/-! + +## D. The representation + +-/ + +/-- The identity jet acts as the identity. -/ +lemma repJetAlgHom_one : T.repJetAlgHom 1 = AlgHom.id ℂ T.LocalFieldAlgebra := by + refine algHom_ext (fun i x => ?_) (fun j y => ?_) (fun v => ?_) + · rw [repJetAlgHom_ιFermion, map_one, Module.End.one_apply, AlgHom.id_apply] + · rw [repJetAlgHom_ιBoson, map_one, Module.End.one_apply, AlgHom.id_apply] + · rw [repJetAlgHom_ιConnection, map_one, Module.End.one_apply, AlgHom.id_apply] + rfl + +/-- The action of a product of jets is the composite of the actions. -/ +lemma repJetAlgHom_mul (U V : GJ) : + T.repJetAlgHom (U * V) = (T.repJetAlgHom U).comp (T.repJetAlgHom V) := by + refine algHom_ext (fun i x => ?_) (fun j y => ?_) (fun v => ?_) + · rw [repJetAlgHom_ιFermion, AlgHom.comp_apply, repJetAlgHom_ιFermion, repJetAlgHom_ιFermion, + map_mul, Module.End.mul_apply] + · rw [repJetAlgHom_ιBoson, AlgHom.comp_apply, repJetAlgHom_ιBoson, repJetAlgHom_ιBoson, + map_mul, Module.End.mul_apply] + · refine (repJetAlgHom_ιConnection (U * V) v).trans ?_ + refine Eq.trans ?_ (congrArg (T.repJetAlgHom U) (repJetAlgHom_ιConnection V v)).symm + refine Eq.trans ?_ (repJetAlgHom_includeConnection_one_tmul U _).symm + refine congrArg (fun z => T.includeConnection ((1 : ℂ) ⊗ₜ[ℝ] z)) ?_ + rw [map_mul (LocalGaugeFieldAlgebra.repJet jets), Module.End.mul_apply] + +variable (T) + +/-- The action of the jet gauge group on the local field algebra. -/ +noncomputable def repJet : Representation ℂ GJ T.LocalFieldAlgebra where + toFun U := (T.repJetAlgHom U).toLinearMap + map_one' := LinearMap.ext fun x => AlgHom.congr_fun repJetAlgHom_one x + map_mul' U V := LinearMap.ext fun x => AlgHom.congr_fun (repJetAlgHom_mul U V) x + +variable {T} + +lemma repJet_apply (U : GJ) (x : T.LocalFieldAlgebra) : + T.repJet U x = T.repJetAlgHom U x := rfl + +lemma repJet_apply_mul (U : GJ) (x y : T.LocalFieldAlgebra) : + T.repJet U (x * y) = T.repJet U x * T.repJet U y := + map_mul (T.repJetAlgHom U) x y + +lemma repJet_apply_one (U : GJ) : T.repJet U (1 : T.LocalFieldAlgebra) = 1 := + (T.repJetAlgHom U).map_one + +@[simp] +lemma repJet_ιFermion (U : GJ) (i : T.FermionSpecies) (x : JetComponentSpace (T.fermion i)) : + T.repJet U (T.ιFermion i x) = T.ιFermion i (JetComponentSpace.repJet (T.fermion i) U x) := + repJetAlgHom_ιFermion U i x + +@[simp] +lemma repJet_ιBoson (U : GJ) (j : T.BosonSpecies) (y : JetComponentSpace (T.boson j)) : + T.repJet U (T.ιBoson j y) = T.ιBoson j (JetComponentSpace.repJet (T.boson j) U y) := + repJetAlgHom_ιBoson U j y + +@[simp] +lemma repJet_ιConnection (U : GJ) (v : GaugeBoson.JetComponentSpace 𝔤) : + T.repJet U (T.ιConnection v) + = T.includeConnection ((1 : ℂ) ⊗ₜ[ℝ] + LocalGaugeFieldAlgebra.repJet jets U (SymmetricAlgebra.ι ℝ _ v)) := + repJetAlgHom_ιConnection U v + +/-- The jet gauge action restricts to the complexified gauge-only action on the connection + factor. -/ +lemma repJet_includeConnection (U : GJ) (y : ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤) : + T.repJet U (T.includeConnection y) + = T.includeConnection (LocalGaugeFieldAlgebra.complexRepJet jets U y) := + repJetAlgHom_includeConnection U y + +end GaugeFieldData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Jet.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Jet.lean index 3fc6cfaac..acbcb63ec 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Jet.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Jet.lean @@ -132,6 +132,16 @@ lemma jetEval_tmul (f : JetRing) (v : V) : lemma jetEval_jetOfConstant (v : V) : jetEval (jetOfConstant v) = v := by simp +/-- Evaluation at the base point is semilinear over the jet ring: a scalar jet acts through + its constant coefficient. -/ +lemma jetEval_smul (f : JetRing) (z : JetRing ⊗[ℂ] V) : + jetEval (f • z) = constantCoeff f • jetEval z := by + induction z using TensorProduct.induction_on with + | zero => rw [smul_zero, map_zero, smul_zero] + | add a b ha hb => rw [smul_add, map_add, ha, hb, map_add, smul_add] + | tmul g v => rw [TensorProduct.smul_tmul', smul_eq_mul, jetEval_tmul, jetEval_tmul, map_mul, + mul_smul] + /-! ## The jets of a product of value spaces diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/LorentzAction.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/LorentzAction.lean new file mode 100644 index 000000000..368d77570 --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/LorentzAction.lean @@ -0,0 +1,227 @@ +/- +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.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeFieldAlgebra.LorentzAction +/-! +# The Lorentz action on the local field algebra + +## i. Overview + +The Lorentz group `SL(2,ℂ)` acts on the local field algebra `J(T)` of a field datum by +algebra endomorphisms: on the generators of a matter species by the action +`JetComponentSpace.repLorentzGroup` of that species, mixing the derivative label and the +target index, and on the connection generators by the gauge-only action +`LocalGaugeFieldAlgebra.repLorentzGroup`. The construction is that of the jet gauge action +in `Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.GaugeAction`: the lift of a +compatible assignment, with the representation laws from uniqueness. + +## ii. Key results + +- `GaugeFieldData.repLorentzAlgHom`, `GaugeFieldData.repLorentzGroup` : the action of a + Lorentz transformation, as an algebra endomorphism and as a representation, with + `repLorentzGroup_ιFermion`, `repLorentzGroup_ιBoson`, `repLorentzGroup_ιConnection` on the + generators. +- `GaugeFieldData.repLorentzGroup_includeConnection` : on the connection factor the action + is the complexified gauge-only action. + +## iii. Table of contents + +- A. The Lorentz assignment of a transformation +- B. The action of a transformation +- C. The action on the connection factor +- D. The representation + +-/ + +@[expose] public section + +open TensorProduct Matrix MatrixGroups + +namespace GaugeFieldData + +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} (T : GaugeFieldData jets) + +/-! + +## A. The Lorentz assignment of a transformation + +-/ + +/-- The connection generators after a Lorentz transformation: the gauge-only action on the + degree-one element, included into the local field algebra. -/ +noncomputable def lorentzConnection (Λ : SL(2,ℂ)) : + GaugeBoson.JetComponentSpace 𝔤 →ₗ[ℝ] T.LocalFieldAlgebra := + ((T.includeConnection).restrictScalars ℝ).toLinearMap ∘ₗ + (Algebra.TensorProduct.includeRight (R := ℝ) (A := ℂ) + (B := SymmetricAlgebra ℝ (GaugeBoson.JetComponentSpace 𝔤))).toLinearMap ∘ₗ + (SymmetricAlgebra.map (GaugeBoson.JetComponentSpace.repLorentzGroup 𝔤 Λ)).toLinearMap ∘ₗ + SymmetricAlgebra.ι ℝ (GaugeBoson.JetComponentSpace 𝔤) + +/-- The assignment of the generators defining the action of a Lorentz transformation: each + matter species acts on its own component functions, the connection generators through + the gauge-only action. -/ +noncomputable def lorentzAssignment (Λ : SL(2,ℂ)) : T.Assignment T.LocalFieldAlgebra where + fermion i := T.ιFermion i ∘ₗ JetComponentSpace.repLorentzGroup (T.fermion i) Λ + boson j := T.ιBoson j ∘ₗ JetComponentSpace.repLorentzGroup (T.boson j) Λ + connection := T.lorentzConnection Λ + fermion_mul_self i _ := ιFermion_mul_self i _ + fermion_mul_swap i j _ _ := ιFermion_mul_swap i j _ _ + boson_commute i j _ _ := ιBoson_commute i j _ _ + connection_commute _ _ := (Commute.all _ _).map T.includeConnection + boson_commute_connection _ _ _ := (includeConnection_commute _ _).symm + boson_commute_fermion j i _ _ := ιBoson_commute_ιFermion j i _ _ + connection_commute_fermion _ _ _ := includeConnection_commute _ _ + +/-! + +## B. The action of a transformation + +-/ + +/-- The action of a Lorentz transformation on the local field algebra, as an algebra + endomorphism: the lift of its Lorentz assignment. -/ +noncomputable def repLorentzAlgHom (Λ : SL(2,ℂ)) : + T.LocalFieldAlgebra →ₐ[ℂ] T.LocalFieldAlgebra := + (T.lorentzAssignment Λ).lift + +variable {T} + +@[simp] +lemma repLorentzAlgHom_ιFermion (Λ : SL(2,ℂ)) (i : T.FermionSpecies) + (x : JetComponentSpace (T.fermion i)) : + T.repLorentzAlgHom Λ (T.ιFermion i x) + = T.ιFermion i (JetComponentSpace.repLorentzGroup (T.fermion i) Λ x) := + (T.lorentzAssignment Λ).lift_ιFermion i x + +@[simp] +lemma repLorentzAlgHom_ιBoson (Λ : SL(2,ℂ)) (j : T.BosonSpecies) + (y : JetComponentSpace (T.boson j)) : + T.repLorentzAlgHom Λ (T.ιBoson j y) + = T.ιBoson j (JetComponentSpace.repLorentzGroup (T.boson j) Λ y) := + (T.lorentzAssignment Λ).lift_ιBoson j y + +@[simp] +lemma repLorentzAlgHom_ιConnection (Λ : SL(2,ℂ)) (v : GaugeBoson.JetComponentSpace 𝔤) : + T.repLorentzAlgHom Λ (T.ιConnection v) + = T.includeConnection ((1 : ℂ) ⊗ₜ[ℝ] + LocalGaugeFieldAlgebra.repLorentzGroup 𝔤 Λ (SymmetricAlgebra.ι ℝ _ v)) := + (T.lorentzAssignment Λ).lift_ιConnection v + +/-! + +## C. The action on the connection factor + +-/ + +/-- The action of a Lorentz transformation restricts to the complexified gauge-only action + on the connection factor, as an equation of algebra maps out of the complexified + gauge-only algebra, compared on the real generators. -/ +lemma repLorentzAlgHom_comp_includeConnection (Λ : SL(2,ℂ)) : + (T.repLorentzAlgHom Λ).comp T.includeConnection + = T.includeConnection.comp (LocalGaugeFieldAlgebra.complexRepLorentzGroupAlgHom 𝔤 Λ) := by + refine Algebra.TensorProduct.ext (Subsingleton.elim _ _) ?_ + refine AlgHom.ext_of_adjoin_eq_top SymmetricAlgebra.adjoin_range_ι ?_ + rintro _ ⟨v, rfl⟩ + exact repLorentzAlgHom_ιConnection Λ v + +/-- The action of a Lorentz transformation restricts to the complexified gauge-only action + on the connection factor. -/ +lemma repLorentzAlgHom_includeConnection (Λ : SL(2,ℂ)) (y : ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤) : + T.repLorentzAlgHom Λ (T.includeConnection y) + = T.includeConnection (LocalGaugeFieldAlgebra.complexRepLorentzGroup 𝔤 Λ y) := by + rw [LocalGaugeFieldAlgebra.complexRepLorentzGroup_apply] + exact AlgHom.congr_fun (repLorentzAlgHom_comp_includeConnection Λ) y + +/-- On the real gauge-only algebra, included, a Lorentz transformation acts through the + gauge-only action. -/ +lemma repLorentzAlgHom_includeConnection_one_tmul (Λ : SL(2,ℂ)) (x : LocalGaugeFieldAlgebra 𝔤) : + T.repLorentzAlgHom Λ (T.includeConnection ((1 : ℂ) ⊗ₜ[ℝ] x)) + = T.includeConnection ((1 : ℂ) ⊗ₜ[ℝ] LocalGaugeFieldAlgebra.repLorentzGroup 𝔤 Λ x) := + repLorentzAlgHom_includeConnection Λ ((1 : ℂ) ⊗ₜ[ℝ] x) + +/-! + +## D. The representation + +-/ + +/-- The identity transformation acts as the identity. -/ +lemma repLorentzAlgHom_one : T.repLorentzAlgHom 1 = AlgHom.id ℂ T.LocalFieldAlgebra := by + refine algHom_ext (fun i x => ?_) (fun j y => ?_) (fun v => ?_) + · rw [repLorentzAlgHom_ιFermion, map_one, Module.End.one_apply, AlgHom.id_apply] + · rw [repLorentzAlgHom_ιBoson, map_one, Module.End.one_apply, AlgHom.id_apply] + · rw [repLorentzAlgHom_ιConnection, map_one, Module.End.one_apply, AlgHom.id_apply] + rfl + +/-- The action of a product of transformations is the composite of the actions. -/ +lemma repLorentzAlgHom_mul (Λ₁ Λ₂ : SL(2,ℂ)) : + T.repLorentzAlgHom (Λ₁ * Λ₂) = (T.repLorentzAlgHom Λ₁).comp (T.repLorentzAlgHom Λ₂) := by + refine algHom_ext (fun i x => ?_) (fun j y => ?_) (fun v => ?_) + · rw [repLorentzAlgHom_ιFermion, AlgHom.comp_apply, repLorentzAlgHom_ιFermion, + repLorentzAlgHom_ιFermion, map_mul, Module.End.mul_apply] + · rw [repLorentzAlgHom_ιBoson, AlgHom.comp_apply, repLorentzAlgHom_ιBoson, + repLorentzAlgHom_ιBoson, map_mul, Module.End.mul_apply] + · refine (repLorentzAlgHom_ιConnection (Λ₁ * Λ₂) v).trans ?_ + refine Eq.trans ?_ + (congrArg (T.repLorentzAlgHom Λ₁) (repLorentzAlgHom_ιConnection Λ₂ v)).symm + refine Eq.trans ?_ (repLorentzAlgHom_includeConnection_one_tmul Λ₁ _).symm + refine congrArg (fun z => T.includeConnection ((1 : ℂ) ⊗ₜ[ℝ] z)) ?_ + rw [map_mul (LocalGaugeFieldAlgebra.repLorentzGroup 𝔤), Module.End.mul_apply] + +variable (T) + +/-- The action of the Lorentz group on the local field algebra. -/ +noncomputable def repLorentzGroup : Representation ℂ SL(2,ℂ) T.LocalFieldAlgebra where + toFun Λ := (T.repLorentzAlgHom Λ).toLinearMap + map_one' := LinearMap.ext fun x => AlgHom.congr_fun repLorentzAlgHom_one x + map_mul' Λ₁ Λ₂ := LinearMap.ext fun x => AlgHom.congr_fun (repLorentzAlgHom_mul Λ₁ Λ₂) x + +variable {T} + +lemma repLorentzGroup_apply (Λ : SL(2,ℂ)) (x : T.LocalFieldAlgebra) : + T.repLorentzGroup Λ x = T.repLorentzAlgHom Λ x := rfl + +lemma repLorentzGroup_apply_mul (Λ : SL(2,ℂ)) (x y : T.LocalFieldAlgebra) : + T.repLorentzGroup Λ (x * y) = T.repLorentzGroup Λ x * T.repLorentzGroup Λ y := + map_mul (T.repLorentzAlgHom Λ) x y + +lemma repLorentzGroup_apply_one (Λ : SL(2,ℂ)) : + T.repLorentzGroup Λ (1 : T.LocalFieldAlgebra) = 1 := + (T.repLorentzAlgHom Λ).map_one + +@[simp] +lemma repLorentzGroup_ιFermion (Λ : SL(2,ℂ)) (i : T.FermionSpecies) + (x : JetComponentSpace (T.fermion i)) : + T.repLorentzGroup Λ (T.ιFermion i x) + = T.ιFermion i (JetComponentSpace.repLorentzGroup (T.fermion i) Λ x) := + repLorentzAlgHom_ιFermion Λ i x + +@[simp] +lemma repLorentzGroup_ιBoson (Λ : SL(2,ℂ)) (j : T.BosonSpecies) + (y : JetComponentSpace (T.boson j)) : + T.repLorentzGroup Λ (T.ιBoson j y) + = T.ιBoson j (JetComponentSpace.repLorentzGroup (T.boson j) Λ y) := + repLorentzAlgHom_ιBoson Λ j y + +@[simp] +lemma repLorentzGroup_ιConnection (Λ : SL(2,ℂ)) (v : GaugeBoson.JetComponentSpace 𝔤) : + T.repLorentzGroup Λ (T.ιConnection v) + = T.includeConnection ((1 : ℂ) ⊗ₜ[ℝ] + LocalGaugeFieldAlgebra.repLorentzGroup 𝔤 Λ (SymmetricAlgebra.ι ℝ _ v)) := + repLorentzAlgHom_ιConnection Λ v + +/-- The Lorentz action restricts to the complexified gauge-only action on the connection + factor. -/ +lemma repLorentzGroup_includeConnection (Λ : SL(2,ℂ)) (y : ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤) : + T.repLorentzGroup Λ (T.includeConnection y) + = T.includeConnection (LocalGaugeFieldAlgebra.complexRepLorentzGroup 𝔤 Λ y) := + repLorentzAlgHom_includeConnection Λ y + +end GaugeFieldData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/TransformsIn.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/TransformsIn.lean new file mode 100644 index 000000000..7f4745a1d --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/TransformsIn.lean @@ -0,0 +1,364 @@ +/- +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.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.GaugeAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.LorentzAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.TransformsIn +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.Realization.Basic +/-! +# The field symbols of the local field algebra and their transformation laws + +## i. Overview + +The generators of the local field algebra `J(T)` of a field datum are the derivative +symbols of its species: `∂_s ψ^φ`, indexed by a derivative multiset `s` and a covector `φ` +of the value space, the conjugate symbols `∂_s ψ̄^φ`, indexed by a covector of the +conjugate value space, and the gauge-field symbols `∂_s A_μ^φ` of the connection factor. +This file packages the matter symbols of each species as families over `s` and proves +their two transformation laws, `LocalGaugeData.TransformsIn` for the jet gauge action and +`IsLorentzDerivTransforms` for the Lorentz action, and packages the connection factor as +a realization of the gauge bosons in `J(T)`, so that the covariant derivative theory of +`Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.CovariantDeriv` applies inside `J(T)`. + +## ii. Key results + +- `GaugeFieldData.gaugeRealization` : the connection factor as a realization of the gauge + bosons in `J(T)`. +- `GaugeFieldData.fermionSymbol`, `GaugeFieldData.conjFermionSymbol`, + `GaugeFieldData.bosonSymbol`, `GaugeFieldData.conjBosonSymbol` : the matter symbols. +- `GaugeFieldData.transformsIn_fermionSymbol`, + `GaugeFieldData.isLorentzDerivTransforms_fermionSymbol` and companions : their gauge + and Lorentz laws. + +## iii. Table of contents + +- A. The connection factor as a realization of the gauge bosons +- B. The matter symbol families +- C. The jet gauge transformation of the matter symbols +- D. The Lorentz transformation of the matter symbols + +-/ + +@[expose] public section + +open TensorProduct Matrix MatrixGroups Lorentz + +namespace GaugeFieldData + +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} (T : GaugeFieldData jets) + +/-! + +## A. The connection factor as a realization of the gauge bosons + +-/ + +/-- The connection factor as a realization of the gauge bosons in `J(T)`: the inclusion of + the complexified gauge-only algebra, equivariant for both actions, with the included + gauge-field symbols as its symbols. -/ +noncomputable def gaugeRealization : + GaugeAlgebraRealization jets T.LocalFieldAlgebra T.repJet T.repLorentzGroup where + toAlgHom := T.includeConnection + A s μ := (T.includeConnection.restrictScalars ℝ).toLinearMap ∘ₗ + LocalGaugeFieldAlgebra.gaugeField 𝔤 s μ + A_eq _ _ _ := rfl + map_repJet U x := (repJet_includeConnection U x).symm + map_repLorentz Λ x := (repLorentzGroup_includeConnection Λ x).symm + repJet_mul := repJet_apply_mul + repLorentz_mul := repLorentzGroup_apply_mul + +variable {T} + +lemma gaugeRealization_toAlgHom : T.gaugeRealization.toAlgHom = T.includeConnection := rfl + +lemma gaugeRealization_A (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ 𝔤) : + T.gaugeRealization.A s μ φ + = T.includeConnection (LocalGaugeFieldAlgebra.gaugeField 𝔤 s μ φ) := rfl + +variable (T) + +/-! + +## B. The matter symbol families + +-/ + +/-- The unconjugated symbols of a fermionic species, as a linear map on the unconjugated + half of its component space. -/ +noncomputable def fermionSymbolMap (i : T.FermionSpecies) : + DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (T.FermionValue i) →ₗ[ℂ] T.LocalFieldAlgebra := + T.ιFermion i ∘ₗ LinearMap.inl ℂ _ _ + +/-- The conjugate symbols of a fermionic species, as a linear map on the conjugate half of + its component space. -/ +noncomputable def conjFermionSymbolMap (i : T.FermionSpecies) : + DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule (T.FermionValue i)) →ₗ[ℂ] + T.LocalFieldAlgebra := + T.ιFermion i ∘ₗ LinearMap.inr ℂ _ _ + +/-- The unconjugated symbols of a bosonic species, as a linear map on the unconjugated + half of its component space. -/ +noncomputable def bosonSymbolMap (j : T.BosonSpecies) : + DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (T.BosonValue j) →ₗ[ℂ] T.LocalFieldAlgebra := + T.ιBoson j ∘ₗ LinearMap.inl ℂ _ _ + +/-- The conjugate symbols of a bosonic species, as a linear map on the conjugate half of + its component space. -/ +noncomputable def conjBosonSymbolMap (j : T.BosonSpecies) : + DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule (T.BosonValue j)) →ₗ[ℂ] + T.LocalFieldAlgebra := + T.ιBoson j ∘ₗ LinearMap.inr ℂ _ _ + +/-- The derivative symbols `∂_s ψ^φ` of a fermionic species: the family over the + derivative multiset `s`, indexed by the covectors of the value space. -/ +noncomputable def fermionSymbol (i : T.FermionSpecies) (s : Multiset (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (T.FermionValue i) →ₗ[ℂ] T.LocalFieldAlgebra := + T.fermionSymbolMap i ∘ₗ TensorProduct.mk ℂ _ _ (DerivAlgebraComplex.basis s) + +/-- The conjugate derivative symbols `∂_s ψ̄^φ` of a fermionic species, indexed by the + covectors of the conjugate value space. -/ +noncomputable def conjFermionSymbol (i : T.FermionSpecies) (s : Multiset (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (ConjModule (T.FermionValue i)) →ₗ[ℂ] T.LocalFieldAlgebra := + T.conjFermionSymbolMap i ∘ₗ TensorProduct.mk ℂ _ _ (DerivAlgebraComplex.basis s) + +/-- The derivative symbols `∂_s φ^χ` of a bosonic species. -/ +noncomputable def bosonSymbol (j : T.BosonSpecies) (s : Multiset (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (T.BosonValue j) →ₗ[ℂ] T.LocalFieldAlgebra := + T.bosonSymbolMap j ∘ₗ TensorProduct.mk ℂ _ _ (DerivAlgebraComplex.basis s) + +/-- The conjugate derivative symbols `∂_s φ̄^χ` of a bosonic species. -/ +noncomputable def conjBosonSymbol (j : T.BosonSpecies) (s : Multiset (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (ConjModule (T.BosonValue j)) →ₗ[ℂ] T.LocalFieldAlgebra := + T.conjBosonSymbolMap j ∘ₗ TensorProduct.mk ℂ _ _ (DerivAlgebraComplex.basis s) + +variable {T} + +lemma fermionSymbol_apply (i : T.FermionSpecies) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (T.FermionValue i)) : + T.fermionSymbol i s φ = T.ιFermion i (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) := rfl + +lemma conjFermionSymbol_apply (i : T.FermionSpecies) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule (T.FermionValue i))) : + T.conjFermionSymbol i s φ = T.ιFermion i (0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) := rfl + +lemma bosonSymbol_apply (j : T.BosonSpecies) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (T.BosonValue j)) : + T.bosonSymbol j s φ = T.ιBoson j (DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) := rfl + +lemma conjBosonSymbol_apply (j : T.BosonSpecies) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule (T.BosonValue j))) : + T.conjBosonSymbol j s φ = T.ιBoson j (0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) := rfl + +/-! + +## C. The jet gauge transformation of the matter symbols + +Each symbol map intertwines the jet gauge action on `J(T)` with `JetComponentSpace.repDual` +on its half of the component space, and the law of the symbols is +`JetComponentSpace.repDual_basis_tmul` pushed through the symbol map. + +-/ + +section GaugeLaw + +variable {V : Type} [AddCommGroup V] [Module ℂ V] [Module.Free ℂ V] [Module.Finite ℂ V] + +/-- The transformation law of a family of symbols built from a linear map intertwining the + jet gauge action with `JetComponentSpace.repDual`. -/ +private lemma transformsIn_of_repDual (rep : Representation ℂ GJ (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : GJ) (χ : JetRing) (z : JetRing ⊗[ℂ] V), rep U (χ • z) = χ • rep U z) + (Φ : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ V →ₗ[ℂ] T.LocalFieldAlgebra) + (hΦ : ∀ (U : GJ) (x : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ V), + T.repJet U (Φ x) = Φ (JetComponentSpace.repDual rep hlin U x)) : + LocalGaugeData.TransformsIn (B := T.LocalFieldAlgebra) T.repJet rep + (fun s => Φ ∘ₗ TensorProduct.mk ℂ _ _ (DerivAlgebraComplex.basis s)) := by + intro U φ s + rw [LinearMap.comp_apply, TensorProduct.mk_apply, hΦ, JetComponentSpace.repDual_basis_tmul, + map_multiset_sum, Multiset.map_map] + rfl + +/-- The unconjugated fermionic symbol map intertwines the jet gauge actions. -/ +lemma repJet_fermionSymbolMap (i : T.FermionSpecies) (U : GJ) + (x : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (T.FermionValue i)) : + T.repJet U (T.fermionSymbolMap i x) + = T.fermionSymbolMap i + (JetComponentSpace.repDual (T.fermion i).repJet (T.fermion i).repJet_smul U x) := by + rw [fermionSymbolMap, LinearMap.comp_apply, LinearMap.comp_apply, repJet_ιFermion] + exact congrArg (T.ιFermion i) (Prod.ext (JetComponentSpace.repJet_fst _ _ _) + ((JetComponentSpace.repJet_snd _ _ _).trans (map_zero _))) + +/-- The conjugate fermionic symbol map intertwines the jet gauge actions. -/ +lemma repJet_conjFermionSymbolMap (i : T.FermionSpecies) (U : GJ) + (x : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule (T.FermionValue i))) : + T.repJet U (T.conjFermionSymbolMap i x) + = T.conjFermionSymbolMap i + (JetComponentSpace.repDual (JetComponentSpace.repConj (T.fermion i).repJet) + (JetComponentSpace.repConj_smul_comm (T.fermion i).repJet_smul) U x) := by + rw [conjFermionSymbolMap, LinearMap.comp_apply, LinearMap.comp_apply, repJet_ιFermion] + exact congrArg (T.ιFermion i) (Prod.ext ((JetComponentSpace.repJet_fst _ _ _).trans (map_zero _)) + (JetComponentSpace.repJet_snd _ _ _)) + +/-- The unconjugated bosonic symbol map intertwines the jet gauge actions. -/ +lemma repJet_bosonSymbolMap (j : T.BosonSpecies) (U : GJ) + (x : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (T.BosonValue j)) : + T.repJet U (T.bosonSymbolMap j x) + = T.bosonSymbolMap j + (JetComponentSpace.repDual (T.boson j).repJet (T.boson j).repJet_smul U x) := by + rw [bosonSymbolMap, LinearMap.comp_apply, LinearMap.comp_apply, repJet_ιBoson] + exact congrArg (T.ιBoson j) (Prod.ext (JetComponentSpace.repJet_fst _ _ _) + ((JetComponentSpace.repJet_snd _ _ _).trans (map_zero _))) + +/-- The conjugate bosonic symbol map intertwines the jet gauge actions. -/ +lemma repJet_conjBosonSymbolMap (j : T.BosonSpecies) (U : GJ) + (x : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule (T.BosonValue j))) : + T.repJet U (T.conjBosonSymbolMap j x) + = T.conjBosonSymbolMap j + (JetComponentSpace.repDual (JetComponentSpace.repConj (T.boson j).repJet) + (JetComponentSpace.repConj_smul_comm (T.boson j).repJet_smul) U x) := by + rw [conjBosonSymbolMap, LinearMap.comp_apply, LinearMap.comp_apply, repJet_ιBoson] + exact congrArg (T.ιBoson j) (Prod.ext ((JetComponentSpace.repJet_fst _ _ _).trans (map_zero _)) + (JetComponentSpace.repJet_snd _ _ _)) + +/-- The symbols of a fermionic species transform in the jet gauge representation of the + species. -/ +lemma transformsIn_fermionSymbol (i : T.FermionSpecies) : + LocalGaugeData.TransformsIn (B := T.LocalFieldAlgebra) T.repJet (T.fermion i).repJet + (T.fermionSymbol i) := + transformsIn_of_repDual _ _ _ (repJet_fermionSymbolMap i) + +/-- The conjugate symbols of a fermionic species transform in the conjugate of the jet + gauge representation of the species. -/ +lemma transformsIn_conjFermionSymbol (i : T.FermionSpecies) : + LocalGaugeData.TransformsIn (B := T.LocalFieldAlgebra) T.repJet + (JetComponentSpace.repConj (T.fermion i).repJet) (T.conjFermionSymbol i) := + transformsIn_of_repDual _ _ _ (repJet_conjFermionSymbolMap i) + +/-- The symbols of a bosonic species transform in the jet gauge representation of the + species. -/ +lemma transformsIn_bosonSymbol (j : T.BosonSpecies) : + LocalGaugeData.TransformsIn (B := T.LocalFieldAlgebra) T.repJet (T.boson j).repJet + (T.bosonSymbol j) := + transformsIn_of_repDual _ _ _ (repJet_bosonSymbolMap j) + +/-- The conjugate symbols of a bosonic species transform in the conjugate of the jet gauge + representation of the species. -/ +lemma transformsIn_conjBosonSymbol (j : T.BosonSpecies) : + LocalGaugeData.TransformsIn (B := T.LocalFieldAlgebra) T.repJet + (JetComponentSpace.repConj (T.boson j).repJet) (T.conjBosonSymbol j) := + transformsIn_of_repDual _ _ _ (repJet_conjBosonSymbolMap j) + +end GaugeLaw + +/-! + +## D. The Lorentz transformation of the matter symbols + +Each symbol map intertwines the Lorentz action on `J(T)` with the tensor product of the +action on derivative labels and the contragredient action on the value index, and the law +of the symbols is that of the derivative monomials, +`DerivAlgebraComplex.repLorentzGroup_basis_ofFn`. + +-/ + +section LorentzLaw + +variable {V : Type} [AddCommGroup V] [Module ℂ V] + +/-- The Lorentz law of a family of symbols built from a linear map intertwining the Lorentz + action with the tensor product of the action on derivative labels and a representation on + the covectors. -/ +private lemma isLorentzDerivTransforms_of_tprod (rep : Representation ℂ SL(2,ℂ) V) + (Φ : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ V →ₗ[ℂ] T.LocalFieldAlgebra) + (hΦ : ∀ (Λ : SL(2,ℂ)) (x : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ V), + T.repLorentzGroup Λ (Φ x) + = Φ ((DerivAlgebraComplex.repLorentzGroup.tprod rep.dual) Λ x)) : + IsLorentzDerivTransforms (A := T.LocalFieldAlgebra) T.repLorentzGroup rep + (fun s => Φ ∘ₗ TensorProduct.mk ℂ _ _ (DerivAlgebraComplex.basis s)) := by + intro Λ n l φ + rw [LinearMap.comp_apply, TensorProduct.mk_apply, hΦ, Representation.tprod_apply, + TensorProduct.map_tmul, DerivAlgebraComplex.repLorentzGroup_basis_ofFn, + TensorProduct.sum_tmul, map_sum] + refine Finset.sum_congr rfl fun p _ => ?_ + rw [← TensorProduct.smul_tmul', map_smul] + rfl + +/-- The unconjugated fermionic symbol map intertwines the Lorentz actions. -/ +lemma repLorentzGroup_fermionSymbolMap (i : T.FermionSpecies) (Λ : SL(2,ℂ)) + (x : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (T.FermionValue i)) : + T.repLorentzGroup Λ (T.fermionSymbolMap i x) + = T.fermionSymbolMap i + ((DerivAlgebraComplex.repLorentzGroup.tprod (T.fermion i).repLorentz.dual) Λ x) := by + rw [fermionSymbolMap, LinearMap.comp_apply, LinearMap.comp_apply, repLorentzGroup_ιFermion] + exact congrArg (T.ιFermion i) (Prod.ext (JetComponentSpace.repLorentzGroup_fst _ _) + ((JetComponentSpace.repLorentzGroup_snd _ _).trans (map_zero _))) + +/-- The conjugate fermionic symbol map intertwines the Lorentz actions. -/ +lemma repLorentzGroup_conjFermionSymbolMap (i : T.FermionSpecies) (Λ : SL(2,ℂ)) + (x : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule (T.FermionValue i))) : + T.repLorentzGroup Λ (T.conjFermionSymbolMap i x) + = T.conjFermionSymbolMap i + ((DerivAlgebraComplex.repLorentzGroup.tprod (T.fermion i).repLorentz.conj.dual) Λ x) := by + rw [conjFermionSymbolMap, LinearMap.comp_apply, LinearMap.comp_apply, repLorentzGroup_ιFermion] + exact congrArg (T.ιFermion i) + (Prod.ext ((JetComponentSpace.repLorentzGroup_fst _ _).trans (map_zero _)) + (JetComponentSpace.repLorentzGroup_snd _ _)) + +/-- The unconjugated bosonic symbol map intertwines the Lorentz actions. -/ +lemma repLorentzGroup_bosonSymbolMap (j : T.BosonSpecies) (Λ : SL(2,ℂ)) + (x : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (T.BosonValue j)) : + T.repLorentzGroup Λ (T.bosonSymbolMap j x) + = T.bosonSymbolMap j + ((DerivAlgebraComplex.repLorentzGroup.tprod (T.boson j).repLorentz.dual) Λ x) := by + rw [bosonSymbolMap, LinearMap.comp_apply, LinearMap.comp_apply, repLorentzGroup_ιBoson] + exact congrArg (T.ιBoson j) (Prod.ext (JetComponentSpace.repLorentzGroup_fst _ _) + ((JetComponentSpace.repLorentzGroup_snd _ _).trans (map_zero _))) + +/-- The conjugate bosonic symbol map intertwines the Lorentz actions. -/ +lemma repLorentzGroup_conjBosonSymbolMap (j : T.BosonSpecies) (Λ : SL(2,ℂ)) + (x : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule (T.BosonValue j))) : + T.repLorentzGroup Λ (T.conjBosonSymbolMap j x) + = T.conjBosonSymbolMap j + ((DerivAlgebraComplex.repLorentzGroup.tprod (T.boson j).repLorentz.conj.dual) Λ x) := by + rw [conjBosonSymbolMap, LinearMap.comp_apply, LinearMap.comp_apply, repLorentzGroup_ιBoson] + exact congrArg (T.ιBoson j) + (Prod.ext ((JetComponentSpace.repLorentzGroup_fst _ _).trans (map_zero _)) + (JetComponentSpace.repLorentzGroup_snd _ _)) + +/-- The symbols of a fermionic species transform as the derivative symbols of a field in + the Lorentz representation of the species. -/ +lemma isLorentzDerivTransforms_fermionSymbol (i : T.FermionSpecies) : + IsLorentzDerivTransforms (A := T.LocalFieldAlgebra) T.repLorentzGroup + (T.fermion i).repLorentz (T.fermionSymbol i) := + isLorentzDerivTransforms_of_tprod _ _ (repLorentzGroup_fermionSymbolMap i) + +/-- The conjugate symbols of a fermionic species transform as the derivative symbols of a + field in the conjugate of the Lorentz representation of the species. -/ +lemma isLorentzDerivTransforms_conjFermionSymbol (i : T.FermionSpecies) : + IsLorentzDerivTransforms (A := T.LocalFieldAlgebra) T.repLorentzGroup + (T.fermion i).repLorentz.conj (T.conjFermionSymbol i) := + isLorentzDerivTransforms_of_tprod _ _ (repLorentzGroup_conjFermionSymbolMap i) + +/-- The symbols of a bosonic species transform as the derivative symbols of a field in the + Lorentz representation of the species. -/ +lemma isLorentzDerivTransforms_bosonSymbol (j : T.BosonSpecies) : + IsLorentzDerivTransforms (A := T.LocalFieldAlgebra) T.repLorentzGroup + (T.boson j).repLorentz (T.bosonSymbol j) := + isLorentzDerivTransforms_of_tprod _ _ (repLorentzGroup_bosonSymbolMap j) + +/-- The conjugate symbols of a bosonic species transform as the derivative symbols of a + field in the conjugate of the Lorentz representation of the species. -/ +lemma isLorentzDerivTransforms_conjBosonSymbol (j : T.BosonSpecies) : + IsLorentzDerivTransforms (A := T.LocalFieldAlgebra) T.repLorentzGroup + (T.boson j).repLorentz.conj (T.conjBosonSymbol j) := + isLorentzDerivTransforms_of_tprod _ _ (repLorentzGroup_conjBosonSymbolMap j) + +end LorentzLaw + +end GaugeFieldData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/TransformsIn.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/TransformsIn.lean index b47977edd..d048264dd 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/TransformsIn.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/TransformsIn.lean @@ -91,6 +91,38 @@ lemma TransformsIn.repGauge_eq_of_eval_eq_one {𝔤 : Type} [LieRing 𝔤] [LieA show repDualCoeff rep U⁻¹ 0 = (repCoeff rep U⁻¹ 0).dualMap from rfl, hrep hinv] rfl +/-- If pure jets act trivially at the base point, the zeroth Taylor coefficient of a jet + is that of the constant jet of its value: every jet is a pure jet times the constant jet + of its value, and the zeroth coefficients are multiplicative for a fibrewise + representation. -/ +lemma repCoeff_zero_eq_ofConstant_eval {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + (jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J) (rep : Representation ℂ GJ (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : GJ) (χ : JetRing) (z : JetRing ⊗[ℂ] V), rep U (χ • z) = χ • rep U z) + (hrep : ∀ {W : GJ}, jets.eval W = 1 → repCoeff rep W 0 = LinearMap.id) (U : GJ) : + repCoeff rep U 0 = repCoeff rep (jets.ofConstant (jets.eval U)) 0 := by + have hW : jets.eval (U * (jets.ofConstant (jets.eval U))⁻¹) = 1 := by + rw [map_mul, map_inv, jets.eval_ofConstant, mul_inv_cancel] + calc repCoeff rep U 0 + = repCoeff rep (U * (jets.ofConstant (jets.eval U))⁻¹ * jets.ofConstant (jets.eval U)) 0 := by + rw [inv_mul_cancel_right] + _ = repCoeff rep (jets.ofConstant (jets.eval U)) 0 := by + rw [repCoeff_zero_mul rep hlin, hrep hW, LinearMap.id_comp] + +/-- If pure jets act trivially at the base point, a matter gauge tensor transforms at the + base point as under the constant jet of the value of the gauge jet: the jet action on + underived symbols factors through evaluation. -/ +lemma TransformsIn.repGauge_zero_eq_ofConstant_eval {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {G₀ : Type} [Group G₀] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} (hF : TransformsIn repGauge rep F) + (hlin : ∀ (U : GJ) (χ : JetRing) (z : JetRing ⊗[ℂ] V), rep U (χ • z) = χ • rep U z) + (hrep : ∀ {W : GJ}, jets.eval W = 1 → repCoeff rep W 0 = LinearMap.id) (U : GJ) + (φ : Module.Dual ℂ V) : + repGauge U (F 0 φ) = repGauge (jets.ofConstant (jets.eval U)) (F 0 φ) := by + rw [hF.repGauge_zero, hF.repGauge_zero, repDualCoeff, repDualCoeff, + repCoeff_zero_eq_ofConstant_eval jets rep hlin hrep U⁻¹, map_inv jets.eval, + ← map_inv jets.ofConstant] + /-- Matter gauge tensors are fixed by pure jets: the members of the zeroth truncation kernel are the jets with trivial base-point value, so `repGauge_eq_of_eval_eq_one` applies. -/ lemma TransformsIn.repGauge_eq_of_mem_truncationKer_zero {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Basic.lean index dadcd17e8..48bb260e0 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Basic.lean @@ -33,10 +33,13 @@ component space this file's data indexes. A concrete theory therefore only has t ## ii. Key results - `MatterField` : the data of a matter field. +- `MatterField.PureJetsActTrivially`, `MatterField.GaugeLorentzCompatible` : two conditions + on a matter field used by the covariant derivative theory. ## iii. Table of contents - A. The data of a matter field +- B. Conditions on a matter field -/ @@ -90,4 +93,31 @@ variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} (M : MatterField jets) +/-! + +## B. Conditions on a matter field + +Two properties the data of a matter field does not in general imply: the transformation +laws constrain the base-point coefficient of a pure jet only to commute with the +infinitesimal action (a scalar twist by a character of the jet group nontrivial on pure +jets preserves every field of the structure), and they do not relate the gauge and Lorentz +actions at all. Both hold for the matter fields of the physical theories, and they are +recorded as conditions rather than as fields, to be assumed where the covariant derivative +theory needs them: the first for the factorization of the jet action through evaluation, +the second for the Lorentz law of the covariant derivatives. + +-/ + +/-- Pure gauge jets act trivially at the base point: a jet with trivial value has identity + zeroth Taylor coefficient on the value space. With the fibrewise law, the base-point + value of the jet action is then a function of the value of the jet. -/ +def PureJetsActTrivially : Prop := + ∀ {W : GJ}, jets.eval W = 1 → GaugeAlgebraRealization.repCoeff M.repJet W 0 = LinearMap.id + +/-- The infinitesimal gauge action commutes with the Lorentz representation on the value + space. -/ +def GaugeLorentzCompatible : Prop := + ∀ (c : 𝔤) (Λ : SL(2,ℂ)) (v : M.V), + M.repAlgebra c (M.repLorentz Λ v) = M.repLorentz Λ (M.repAlgebra c v) + end MatterField diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/CovariantDeriv.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/CovariantDeriv.lean index b133778a5..f4b04d6d8 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/CovariantDeriv.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/CovariantDeriv.lean @@ -98,6 +98,33 @@ noncomputable def repDualCoeff (rep : Representation ℂ GJ (JetRing ⊗[ℂ] V) Module.Dual ℂ V →ₗ[ℂ] Module.Dual ℂ V := (repCoeff rep U x).dualMap +/-- For a fibrewise representation, evaluating the transform of a jet at the base point + is the zeroth Taylor coefficient of the transform of its base-point value: the jet ring + factor passes through the action and is then evaluated. -/ +lemma jetEval_rep_of_smul (rep : Representation ℂ GJ (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : GJ) (χ : JetRing) (z : JetRing ⊗[ℂ] V), rep U (χ • z) = χ • rep U z) + (U : GJ) (z : JetRing ⊗[ℂ] V) : + jetEval (rep U z) = repCoeff rep U 0 (jetEval z) := by + induction z using TensorProduct.induction_on with + | zero => simp only [map_zero] + | add a b ha hb => rw [map_add, map_add, ha, hb, map_add, map_add] + | tmul f v => + rw [show f ⊗ₜ[ℂ] v = f • jetOfConstant v from by + rw [jetOfConstant_apply, TensorProduct.smul_tmul', smul_eq_mul, mul_one], + hlin, jetEval_smul, jetEval_smul, jetEval_jetOfConstant, map_smul] + simp only [repCoeff, LinearMap.comp_apply, jetIteratedDeriv_zero, LinearMap.id_apply] + +/-- The zeroth Taylor coefficients of a fibrewise representation are multiplicative: they + form a representation of the jet gauge group on the value space. -/ +lemma repCoeff_zero_mul (rep : Representation ℂ GJ (JetRing ⊗[ℂ] V)) + (hlin : ∀ (U : GJ) (χ : JetRing) (z : JetRing ⊗[ℂ] V), rep U (χ • z) = χ • rep U z) + (U W : GJ) : repCoeff rep (U * W) 0 = repCoeff rep U 0 ∘ₗ repCoeff rep W 0 := by + refine LinearMap.ext fun v => ?_ + have h := jetEval_rep_of_smul rep hlin U (rep W (jetOfConstant v)) + simp only [repCoeff, LinearMap.comp_apply, jetIteratedDeriv_zero, LinearMap.id_apply, map_mul, + Module.End.mul_apply] at h ⊢ + exact h + /-! ## The covariant derivative through an infinitesimal action diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/LorentzCovariantDeriv.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/LorentzCovariantDeriv.lean new file mode 100644 index 000000000..c35fdbf90 --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/LorentzCovariantDeriv.lean @@ -0,0 +1,279 @@ +/- +Copyright (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 +-/ +module + +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction +public import Physlib.Relativity.LorentzMix +/-! +# The Lorentz law of the covariant derivatives of a matter family + +## i. Overview + +The covariant derivative of a matter family adds one ordered derivative slot and the +correction `A_ρ · F`, the derived action `actionFamConv` of the gauge field on the value +index. Expanded in bases, the correction is a scalar combination of Leibniz convolutions of +gauge-field symbols against matter symbols, which gives its Lorentz law and its linearity +in the matter family; the contragredient twist `rep.dual Λ` of the value index passes +through it when the infinitesimal gauge action commutes with the Lorentz action on the +value space (`hcomm`), the one hypothesis on the species. These are the inputs of the +abstract induction `Lorentz.repLorentz_tower`, for any realization of the gauge bosons in +a complex algebra `B`. + +## ii. Key results + +- `GaugeAlgebraRealization.repLorentz_covDerivIter` : the Lorentz law of the iterated + covariant derivative at every derivative multiset. +- `GaugeAlgebraRealization.isLorentzCovDerivTransforms_covDerivIter`, `..._conj` : the + covariant tower of a matter family, and of a conjugate family, transforms as the + covariant derivatives of a Lorentz-covariant field. + +## iii. Table of contents + +- A. Families in the multiset form of the Lorentz law +- B. The derived action family in bases +- C. The Lorentz law of the covariant tower + +-/ + +@[expose] public section + +open Matrix MatrixGroups TensorProduct Lorentz + +namespace GaugeAlgebraRealization + +variable {B : Type} [Ring B] [Algebra ℂ B] +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] +variable {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] +variable {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} +variable {V : Type} [AddCommGroup V] [Module ℂ V] [FiniteDimensional ℂ V] +variable {A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B} +variable {act : 𝔤 →ₗ[ℝ] V →ₗ[ℂ] V} +variable {repLorentz : Representation ℂ SL(2,ℂ) B} +variable {repGauge : Representation ℂ GJ B} +variable (h : GaugeAlgebraRealization jets B repGauge repLorentz) + +-- The entry `Λ_{b a}` of the Lorentz matrix of `Λ : SL(2,ℂ)`, as a complex scalar. +set_option quotPrecheck false in +local notation:max "L[" Λ "]" b:max a:max => (((SL2C.toLorentzGroup Λ).1 b a : ℝ) : ℂ) + +/-! + +## A. Families in the multiset form of the Lorentz law + +-/ + +/-- A scalar combination of convolutions against the gauge field is linear in the + right-hand families. -/ +lemma sum_derivConv_sum_fam {ι κ ι' : Type} [Fintype ι] [Fintype κ] [Fintype ι'] + (f : ι → Multiset (Fin 1 ⊕ Fin 3) → B) (coef : ι → κ → ℂ) (c : ι' → ℂ) + (g : ι' → κ → Multiset (Fin 1 ⊕ Fin 3) → B) (s : Multiset (Fin 1 ⊕ Fin 3)) : + ∑ j, ∑ k, coef j k • derivConv (f j) (fun y => ∑ i, c i • g i k y) s = + ∑ i, c i • ∑ j, ∑ k, coef j k • derivConv (f j) (g i k) s := by + simp only [derivConv_sum_right, Finset.smul_sum, smul_smul, mul_comm] + exact Finset.sum_comm_cycle + +/-- A Lorentz law in the tuple form, read on the underlying multisets: the transformed + family mixes by `lorentzMix`. -/ +lemma repLorentz_eq_lorentzMix (Λ : SL(2,ℂ)) (f g : Multiset (Fin 1 ⊕ Fin 3) → B) + (hfg : ∀ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)), repLorentz Λ (f (List.ofFn l)) = + ∑ p : Fin n → (Fin 1 ⊕ Fin 3), (∏ i, L[Λ] (p i) (l i)) • g (List.ofFn p)) + (x : Multiset (Fin 1 ⊕ Fin 3)) : repLorentz Λ (f x) = lorentzMix Λ g x 0 := by + obtain ⟨n, l, rfl⟩ : ∃ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)), x = List.ofFn l := + ⟨_, x.toList.get, by rw [List.ofFn_get, Multiset.coe_toList]⟩ + rw [hfg n l, lorentzMix_ofFn] + exact Finset.sum_congr rfl fun p _ => by rw [add_zero] + +/-- The Lorentz law of the gauge-field symbols, in the multiset form. -/ +lemma repLorentz_apply_mix (Λ : SL(2,ℂ)) + (x : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (χ : Module.Dual ℝ 𝔤) : + repLorentz Λ (h.A x μ χ) = lorentzMix Λ (fun t => ∑ a, L[Λ] a μ • h.A t a χ) x 0 := + repLorentz_eq_lorentzMix Λ (fun x => h.A x μ χ) (fun t => ∑ a, L[Λ] a μ • h.A t a χ) + (fun n l => h.lorentz_apply Λ n l μ χ) x + +omit [FiniteDimensional ℂ V] in +/-- The Lorentz law of a family of derivative symbols, in the multiset form. -/ +lemma isLorentzDerivTransforms_mix {rep : Representation ℂ SL(2,ℂ) V} + {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 := + repLorentz_eq_lorentzMix Λ (fun x => F x χ) (fun t => F t (rep.dual Λ χ)) + (fun n l => hF Λ n l χ) x + +/-- The Lorentz law of a scalar combination of convolutions against the gauge field: the + direction of the gauge field mixes by its own column, the derivative slots by + `lorentzMix`, and the right-hand families are replaced by their transforms. -/ +lemma repLorentz_sum_derivConv (Λ : SL(2,ℂ)) (ρ : Fin 1 ⊕ Fin 3) + {ι κ : Type} [Fintype ι] [Fintype κ] (bg : Module.Basis ι ℝ 𝔤) (coef : ι → κ → ℂ) + (g g' : κ → Multiset (Fin 1 ⊕ Fin 3) → B) + (hg : ∀ k y, repLorentz Λ (g k y) = lorentzMix Λ (g' k) y 0) + (s : Multiset (Fin 1 ⊕ Fin 3)) : + repLorentz Λ (∑ j, ∑ k, coef j k • derivConv (fun x => h.A x ρ (bg.coord j)) (g k) s) = + ∑ a, L[Λ] a ρ • lorentzMix Λ + (fun t => ∑ j, ∑ k, coef j k • derivConv (fun x => h.A x a (bg.coord j)) (g' k) t) + s 0 := by + have h1 : ∀ j k, repLorentz Λ (derivConv (fun x => h.A x ρ (bg.coord j)) (g k) s) = + ∑ a, L[Λ] a ρ • lorentzMix Λ (derivConv (fun x => h.A x a (bg.coord j)) (g' k)) s 0 := by + intro j k + rw [repLorentz_derivConv h.repLorentz_mul Λ _ + (fun t => ∑ a, L[Λ] a ρ • h.A t a (bg.coord j)) _ (g' k) + (fun x => repLorentz_apply_mix h Λ x ρ _) (hg k)] + simp only [← lorentzMix_smul_fam, ← lorentzMix_sum_fam] + exact congrArg (fun G => lorentzMix Λ G s 0) (funext fun r => derivConv_sum_left _ _ _ r) + simp only [map_sum, map_smul, h1, lorentzMix_sum_fam, lorentzMix_smul_fam, Finset.smul_sum, + smul_smul, mul_comm] + exact Finset.sum_comm_cycle + +/-! + +## B. The derived action family in bases + +-/ + +/-- 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 ι ℝ 𝔤) (bv : Module.Basis κ ℂ V) + (f : Module.Dual ℝ 𝔤 →ₗ[ℝ] 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 ι ℝ 𝔤) (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 + simp only [actionFamConv, Multiset.sum_linearMap_apply, Multiset.map_map, Function.comp_def, + actionFam_apply_eq_sum bg bv, Multiset.sum_map_finsetSum, derivConv, Multiset.smul_sum] + +/-- 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 + simp only [actionFamConv_eq_sum (Module.finBasis ℝ 𝔤) (Module.finBasis ℂ V), + LinearMap.sum_apply, LinearMap.smul_apply] + exact sum_derivConv_sum_fam _ _ _ _ s + +/-- 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 (Λ : 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 h.A act ρ G s φ) = + ∑ a, L[Λ] a ρ • lorentzMix Λ (fun t => actionFamConv h.A act a G' t φ) s 0 := by + classical + set bg := Module.finBasis ℝ 𝔤 + set bv := Module.finBasis ℂ V + simp only [actionFamConv_eq_sum bg bv] + exact repLorentz_sum_derivConv h Λ ρ bg (fun j k => φ (act (bg j) (bv k))) + (fun k y => G y (bv.coord k)) (fun k t => G' t (bv.coord k)) (fun k y => hG y _) s + +omit [FiniteDimensional ℂ V] [Module.Finite ℝ 𝔤] 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 : 𝔤) (v : V), act c (T v) = T (act c v)) + (ψ : Module.Dual ℂ V →ₗ[ℂ] B) (c : 𝔤) (φ : Module.Dual ℂ V) : + ∑ k, φ (act c (bv k)) • ψ (T.dualMap (bv.coord k)) = + ∑ k, (T.dualMap φ) (act c (bv k)) • ψ (bv.coord k) := by + simp only [← map_smul, ← map_sum] + rw [show (∑ k, φ (act c (bv k)) • bv.coord k) = φ ∘ₗ act c from + bv.sum_dual_apply_smul_coord (φ ∘ₗ act c), + show (∑ k, (T.dualMap φ) (act c (bv k)) • bv.coord k) = (T.dualMap φ) ∘ₗ act c from + bv.sum_dual_apply_smul_coord ((T.dualMap φ) ∘ₗ act c)] + exact congrArg ψ (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 : 𝔤) (v : V), act c (T v) = T (act c v)) + (f : Module.Dual ℝ 𝔤 →ₗ[ℝ] B) (g : Module.Dual ℂ V →ₗ[ℂ] B) + (φ : Module.Dual ℂ V) : + actionFam act f (g ∘ₗ T.dualMap) φ = actionFam act f g (T.dualMap φ) := by + classical + simp only [actionFam_apply_eq_sum (Module.finBasis ℝ 𝔤) (Module.finBasis ℂ V), + LinearMap.comp_apply, ← mul_smul_comm, ← Finset.mul_sum, dual_twist _ T hT g] + +/-- The contragredient action may be pulled out of a derived action family. -/ +lemma actionFamConv_comp_dual (T : V →ₗ[ℂ] V) + (hT : ∀ (c : 𝔤) (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 + simp only [actionFamConv, Multiset.sum_linearMap_apply, Multiset.map_map, Function.comp_def, + actionFam_comp_dual T hT] + +/-! + +## C. The Lorentz law of the covariant tower + +-/ + +/-- 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 contragrediently. -/ +lemma repLorentz_covDerivIter {rep : Representation ℂ SL(2,ℂ) V} + (hcomm : ∀ (c : 𝔤) (Λ : 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 h.A act F n l s φ) = ∑ p : Fin n → (Fin 1 ⊕ Fin 3), + (∏ i, L[Λ] (p i) (l i)) • + lorentzMix Λ (fun t => covDerivIter h.A act F n p t (rep.dual Λ φ)) s 0 := + repLorentz_tower Λ (covDerivIter h.A act F) (covDerivIter h.A act F) (actionFamConv h.A act) + (rep.dual Λ) (fun _ _ _ => rfl) (fun _ _ _ => rfl) + (fun _ s φ => isLorentzDerivTransforms_mix hF Λ s φ) + (fun ρ G G' hG s φ => repLorentz_actionFamConv h Λ ρ G G' hG s φ) + (fun ρ _ _ c G s φ => actionFamConv_sum_fam ρ c G s φ) + (fun ρ G s φ => actionFamConv_comp_dual (rep Λ⁻¹) (fun c v => hcomm c Λ⁻¹ v) ρ G s φ) + n l s φ + +/-- 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 {rep : Representation ℂ SL(2,ℂ) V} + (hcomm : ∀ (c : 𝔤) (Λ : 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 h.A act F n l 0) := by + intro Λ n l φ + rw [repLorentz_covDerivIter h hcomm F hF Λ n l 0 φ] + simp only [lorentzMix_zero] + +omit [FiniteDimensional ℂ V] [Module.Finite ℝ 𝔤] in +/-- 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 (rep : Representation ℂ SL(2,ℂ) V) + (hcomm : ∀ (c : 𝔤) (Λ : SL(2,ℂ)) (v : V), act c (rep Λ v) = rep Λ (act c v)) + (c : 𝔤) (Λ : SL(2,ℂ)) (v : ConjModule V) : + LocalGaugeData.actionConj act c (rep.conj Λ v) = + rep.conj Λ (LocalGaugeData.actionConj act c v) := + congrArg (conjEquiv (k := ℂ) (M := V)) (hcomm c Λ _) + +/-- The Lorentz law of the covariant tower of a conjugate family, from the commutation of + the gauge action with the Lorentz action of the unconjugated species. -/ +theorem isLorentzCovDerivTransforms_covDerivIter_conj {rep : Representation ℂ SL(2,ℂ) V} + (hcomm : ∀ (c : 𝔤) (Λ : SL(2,ℂ)) (v : V), act c (rep Λ v) = rep Λ (act c v)) + (F : Multiset (Fin 1 ⊕ Fin 3) → Module.Dual ℂ (ConjModule V) →ₗ[ℂ] B) + (hF : IsLorentzDerivTransforms repLorentz rep.conj F) : + IsLorentzCovDerivTransforms repLorentz rep.conj + (fun {n} l => covDerivIter h.A (LocalGaugeData.actionConj act) F n l 0) := + isLorentzCovDerivTransforms_covDerivIter h (actionConj_comm_repConj rep hcomm) F hF + +end GaugeAlgebraRealization diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Basic.lean index c05b37986..ad469f03d 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Basic.lean @@ -41,6 +41,10 @@ compilation `MatrixRep.matterField` then produces a `MatterField`. - `MatrixRep.isInfinitesimalActionOf` : the gauge-algebra action is the infinitesimal action underlying the jet gauge action. - `MatrixRep.matterField` : the matter field of a matrix representation. +- `MatrixRep.matterField_gaugeLorentzCompatible` : its gauge and Lorentz actions commute, + acting on different tensor factors. +- `MatrixRep.matterField_pureJetsActTrivially` : pure jets act trivially on it at the base + point, when their matrices have identity constant term. ## iii. Table of contents @@ -587,6 +591,43 @@ lemma matterField_repAlgebra : (R.matterField e ρ w).repAlgebra = R.repAlgebra @[simp] lemma matterField_massWeight : (R.matterField e ρ w).massWeight = w := rfl +omit [Fintype ι] [DecidableEq ι] [Module.Free ℂ V] [Module.Finite ℂ V] in +lemma repLorentz_apply_symm_tmul (Λ : SL(2,ℂ)) (s : S) (v : ι → ℂ) : + repLorentz e ρ Λ (e.symm (s ⊗ₜ[ℂ] v)) = e.symm (ρ Λ s ⊗ₜ[ℂ] v) := by + simp [repLorentz, Representation.tprod_apply] + +omit [Module.Free ℂ V] [Module.Finite ℂ V] in +/-- The gauge algebra acts on the internal index and the Lorentz group on the Lorentz + factor, so the two actions commute. -/ +lemma repAlgebra_comm_repLorentz (c : 𝔤) (Λ : SL(2,ℂ)) (v : V) : + R.repAlgebra e c (repLorentz e ρ Λ v) = repLorentz e ρ Λ (R.repAlgebra e c v) := by + obtain ⟨t, rfl⟩ : ∃ t, v = e.symm t := ⟨e v, (e.symm_apply_apply v).symm⟩ + induction t using TensorProduct.induction_on with + | zero => simp + | add a b ha hb => rw [map_add, map_add, map_add, ha, hb, map_add, map_add] + | tmul s w => + rw [repAlgebra_apply, repLorentz_apply_symm_tmul, valEnd_apply_symm_tmul, + valEnd_apply_symm_tmul, repLorentz_apply_symm_tmul] + +/-- The matter field of a matrix representation satisfies `MatterField.GaugeLorentzCompatible`, + for every matrix representation and Lorentz factor: the two actions live on different + tensor factors. -/ +lemma matterField_gaugeLorentzCompatible : (R.matterField e ρ w).GaugeLorentzCompatible := + fun c Λ v => repAlgebra_comm_repLorentz e R ρ c Λ v + +/-- The matter field of a matrix representation satisfies `MatterField.PureJetsActTrivially` + as soon as the matrix of every jet with trivial value has identity constant term. This + hypothesis is not a consequence of the axioms of `MatrixRep`, which fix the constant term + of `mat` on pure jets only up to a scalar character. -/ +lemma matterField_pureJetsActTrivially + (hmat : ∀ {W : GJ}, jets.eval W = 1 → (R.mat W).map (constantCoeff : JetRing → ℂ) = 1) : + (R.matterField e ρ w).PureJetsActTrivially := by + intro W hW + show GaugeAlgebraRealization.repCoeff (R.repJet e) W 0 = LinearMap.id + rw [repCoeff_eq] + simp only [Multiset.foldl_zero] + rw [hmat hW, valEnd_one] + end MatrixRep end LocalGaugeData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Table.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Table.lean index e2992e9e7..92fbf1e11 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Table.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Table.lean @@ -33,6 +33,10 @@ compiles to a `MatterField` and a table to a `GaugeFieldData`. - `Charges.rep` : the matrix representation named by a charge tuple. - `FermionRow`, `ScalarRow`, `Table` : the rows and the table. - `FermionRow.matterField`, `ScalarRow.matterField`, `Table.fieldData` : the compilation. +- `Table.fieldData_gaugeLorentzCompatible` : the field content of a table satisfies + `GaugeFieldData.GaugeLorentzCompatible`, species by species through + `Table.fieldData_fermion_gaugeLorentzCompatible` and + `Table.fieldData_boson_gaugeLorentzCompatible`. ## iii. Table of contents @@ -242,6 +246,18 @@ lemma FermionRow.matterField_massWeight (r : FermionRow Γ) : lemma ScalarRow.matterField_massWeight (r : ScalarRow Γ) : r.matterField.massWeight = scalarMassWeight := rfl +/-- The gauge and Lorentz actions of a fermion row commute: the row is a matrix + representation on the internal index tensored with a Weyl spinor. -/ +lemma FermionRow.matterField_gaugeLorentzCompatible (r : FermionRow Γ) : + r.matterField.GaugeLorentzCompatible := by + cases h : r.chirality <;> simp only [FermionRow.matterField, h] <;> + exact MatrixRep.matterField_gaugeLorentzCompatible _ _ _ _ + +/-- The gauge and Lorentz actions of a scalar row commute. -/ +lemma ScalarRow.matterField_gaugeLorentzCompatible (r : ScalarRow Γ) : + r.matterField.GaugeLorentzCompatible := + MatrixRep.matterField_gaugeLorentzCompatible _ _ _ _ + /-! ## E. The table and its field content @@ -299,6 +315,21 @@ lemma fieldData_fermion_massWeight (s : T.FermionSpecies) : lemma fieldData_boson_massWeight (s : T.BosonSpecies) : (T.fieldData.boson s).massWeight = scalarMassWeight := by simp +/-- Every fermionic species of a table satisfies `MatterField.GaugeLorentzCompatible`. -/ +lemma fieldData_fermion_gaugeLorentzCompatible (s : T.FermionSpecies) : + (T.fieldData.fermion s).GaugeLorentzCompatible := + FermionRow.matterField_gaugeLorentzCompatible _ + +/-- Every bosonic species of a table satisfies `MatterField.GaugeLorentzCompatible`. -/ +lemma fieldData_boson_gaugeLorentzCompatible (s : T.BosonSpecies) : + (T.fieldData.boson s).GaugeLorentzCompatible := + ScalarRow.matterField_gaugeLorentzCompatible _ + +/-- The field content of a table satisfies `GaugeFieldData.GaugeLorentzCompatible`: every + row is a matrix representation on the internal index tensored with a Lorentz factor. -/ +lemma fieldData_gaugeLorentzCompatible : T.fieldData.GaugeLorentzCompatible := + ⟨T.fieldData_fermion_gaugeLorentzCompatible, T.fieldData_boson_gaugeLorentzCompatible⟩ + end Table end LocalGaugeData diff --git a/Physlib/Mathematics/AlgebraGeneration.lean b/Physlib/Mathematics/AlgebraGeneration.lean index 742151a34..1831358bf 100644 --- a/Physlib/Mathematics/AlgebraGeneration.lean +++ b/Physlib/Mathematics/AlgebraGeneration.lean @@ -131,6 +131,24 @@ lemma eq_top_of_tmul_one_of_one_tmul {S : Subalgebra R (A ⊗[R] B)} end Factors +section Central + +variable {R A B : Type*} [CommSemiring R] [Semiring A] [Algebra R A] [CommSemiring B] + [Algebra R B] + +/-- A commutative right factor is central in the tensor product. Stated as an equation of + products at abstract types, so that it can be instantiated on a concrete tensor product + without unifying its multiplication instances. -/ +lemma includeRight_mul_comm (b : B) (x : A ⊗[R] B) : + x * includeRight (R := R) (A := A) b = includeRight (R := R) (A := A) b * x := by + induction x using _root_.TensorProduct.induction_on with + | zero => rw [zero_mul, mul_zero] + | add u v hu hv => rw [add_mul, mul_add, hu, hv] + | tmul a c => + rw [includeRight_apply, tmul_mul_tmul, tmul_mul_tmul, mul_one, one_mul, mul_comm c b] + +end Central + /-! ### B.2. Generation after an extension of scalars diff --git a/Physlib/Particles/StandardModel/Fermions/MatterField.lean b/Physlib/Particles/StandardModel/Fermions/MatterField.lean index d493b48d2..d5eed483c 100644 --- a/Physlib/Particles/StandardModel/Fermions/MatterField.lean +++ b/Physlib/Particles/StandardModel/Fermions/MatterField.lean @@ -41,7 +41,9 @@ Mass weight three is the fermionic weight already fixed by Each comes with the four projection rules `…matterField_V`, `…matterField_repLorentz`, `…matterField_repJet` and `…matterField_massWeight` identifying its fields with the -existing Standard Model definitions. +existing Standard Model definitions, and with the two conditions +`…matterField_pureJetsActTrivially` and `…matterField_gaugeLorentzCompatible` consumed by +the covariant derivative theory, restated from the species files. ## iii. Table of contents @@ -95,6 +97,14 @@ lemma matterField_repAlgebra : matterField.repAlgebra = gaugeAlgebraAction := rf @[simp] lemma matterField_massWeight : matterField.massWeight = 3 := rfl +/-- Pure gauge jets act trivially on the lepton doublet at the base point. -/ +lemma matterField_pureJetsActTrivially : matterField.PureJetsActTrivially := + fun hW => repCoeff_zero_of_eval_eq_one hW + +/-- The gauge and Lorentz actions on the lepton doublet commute. -/ +lemma matterField_gaugeLorentzCompatible : matterField.GaugeLorentzCompatible := + gaugeAlgebraAction_comm_repLorentzGroup + end LeptonDoublet /-! @@ -131,6 +141,14 @@ lemma matterField_repAlgebra : matterField.repAlgebra = gaugeAlgebraAction := rf @[simp] lemma matterField_massWeight : matterField.massWeight = 3 := rfl +/-- Pure gauge jets act trivially on the charged-lepton singlet at the base point. -/ +lemma matterField_pureJetsActTrivially : matterField.PureJetsActTrivially := + fun hW => repCoeff_zero_of_eval_eq_one hW + +/-- The gauge and Lorentz actions on the charged-lepton singlet commute. -/ +lemma matterField_gaugeLorentzCompatible : matterField.GaugeLorentzCompatible := + gaugeAlgebraAction_comm_repLorentzGroup + end LeptonSinglet /-! @@ -169,6 +187,14 @@ lemma matterField_repAlgebra : matterField.repAlgebra = gaugeAlgebraAction := rf @[simp] lemma matterField_massWeight : matterField.massWeight = 3 := rfl +/-- Pure gauge jets act trivially on the quark doublet at the base point. -/ +lemma matterField_pureJetsActTrivially : matterField.PureJetsActTrivially := + fun hW => repCoeff_zero_of_eval_eq_one hW + +/-- The gauge and Lorentz actions on the quark doublet commute. -/ +lemma matterField_gaugeLorentzCompatible : matterField.GaugeLorentzCompatible := + gaugeAlgebraAction_comm_repLorentzGroup + end QuarkDoublet /-! @@ -205,6 +231,14 @@ lemma matterField_repAlgebra : matterField.repAlgebra = gaugeAlgebraAction := rf @[simp] lemma matterField_massWeight : matterField.massWeight = 3 := rfl +/-- Pure gauge jets act trivially on the up-type singlet at the base point. -/ +lemma matterField_pureJetsActTrivially : matterField.PureJetsActTrivially := + fun hW => repCoeff_zero_of_eval_eq_one hW + +/-- The gauge and Lorentz actions on the up-type singlet commute. -/ +lemma matterField_gaugeLorentzCompatible : matterField.GaugeLorentzCompatible := + gaugeAlgebraAction_comm_repLorentzGroup + end UpSinglet /-! @@ -241,6 +275,14 @@ lemma matterField_repAlgebra : matterField.repAlgebra = gaugeAlgebraAction := rf @[simp] lemma matterField_massWeight : matterField.massWeight = 3 := rfl +/-- Pure gauge jets act trivially on the down-type singlet at the base point. -/ +lemma matterField_pureJetsActTrivially : matterField.PureJetsActTrivially := + fun hW => repCoeff_zero_of_eval_eq_one hW + +/-- The gauge and Lorentz actions on the down-type singlet commute. -/ +lemma matterField_gaugeLorentzCompatible : matterField.GaugeLorentzCompatible := + gaugeAlgebraAction_comm_repLorentzGroup + end DownSinglet end StandardModel diff --git a/Physlib/Particles/StandardModel/FieldData.lean b/Physlib/Particles/StandardModel/FieldData.lean index cc1cbea5d..d9ecd81d8 100644 --- a/Physlib/Particles/StandardModel/FieldData.lean +++ b/Physlib/Particles/StandardModel/FieldData.lean @@ -40,6 +40,10 @@ further Standard Model input. - `StandardModel.fieldData` : the field data of the Standard Model. - `StandardModel.card_fieldData_fermionSpecies`, `StandardModel.card_fieldData_bosonSpecies` : fifteen fermionic multiplets, one Higgs. +- `StandardModel.fieldData_pureJetsActTrivially`, + `StandardModel.fieldData_gaugeLorentzCompatible` : the datum satisfies the two + conditions of the covariant derivative theory, assembled from the species-wise lemmas + `StandardModel.fieldData_fermion_pureJetsActTrivially` and companions. - `StandardModel.fieldData_massWeightScaleFermion_inclFermion_basis_tmul` : a fermionic component function `∂_s ψ_α` scales by `c ^ (3 + 2 |s|)`. @@ -47,7 +51,8 @@ further Standard Model input. - A. The fermion species - B. The field datum -- C. The mass weights +- C. The conditions of the covariant derivative theory +- D. The mass weights -/ @@ -116,6 +121,26 @@ lemma matterField_downSinglet (i : Fin 3) : lemma matterField_massWeight (t : FermionType) : (matterField t).massWeight = 3 := by cases t <;> rfl +/-- Pure gauge jets act trivially on every Standard Model fermion at the base point. -/ +lemma matterField_pureJetsActTrivially (t : FermionType) : + (matterField t).PureJetsActTrivially := by + cases t + · exact LeptonDoublet.matterField_pureJetsActTrivially + · exact LeptonSinglet.matterField_pureJetsActTrivially + · exact QuarkDoublet.matterField_pureJetsActTrivially + · exact UpSinglet.matterField_pureJetsActTrivially + · exact DownSinglet.matterField_pureJetsActTrivially + +/-- The gauge and Lorentz actions on every Standard Model fermion commute. -/ +lemma matterField_gaugeLorentzCompatible (t : FermionType) : + (matterField t).GaugeLorentzCompatible := by + cases t + · exact LeptonDoublet.matterField_gaugeLorentzCompatible + · exact LeptonSinglet.matterField_gaugeLorentzCompatible + · exact QuarkDoublet.matterField_gaugeLorentzCompatible + · exact UpSinglet.matterField_gaugeLorentzCompatible + · exact DownSinglet.matterField_gaugeLorentzCompatible + end FermionType /-! @@ -161,7 +186,47 @@ lemma card_fieldData_bosonSpecies : Nat.card fieldData.BosonSpecies = 1 := by /-! -## C. The mass weights +## C. The conditions of the covariant derivative theory + +Every species of the Standard Model satisfies the two conditions +`MatterField.PureJetsActTrivially` and `MatterField.GaugeLorentzCompatible`, species by +species, and the datum therefore satisfies the conjunctions +`GaugeFieldData.PureJetsActTrivially` and `GaugeFieldData.GaugeLorentzCompatible`. + +-/ + +/-- Pure gauge jets act trivially on every fermionic species of the Standard Model. -/ +lemma fieldData_fermion_pureJetsActTrivially (t : FermionType) : + (fieldData.fermion t).PureJetsActTrivially := + t.matterField_pureJetsActTrivially + +/-- Pure gauge jets act trivially on the bosonic species of the Standard Model. -/ +lemma fieldData_boson_pureJetsActTrivially (j : fieldData.BosonSpecies) : + (fieldData.boson j).PureJetsActTrivially := + HiggsVec.matterField_pureJetsActTrivially + +/-- The gauge and Lorentz actions commute on every fermionic species of the Standard + Model. -/ +lemma fieldData_fermion_gaugeLorentzCompatible (t : FermionType) : + (fieldData.fermion t).GaugeLorentzCompatible := + t.matterField_gaugeLorentzCompatible + +/-- The gauge and Lorentz actions commute on the bosonic species of the Standard Model. -/ +lemma fieldData_boson_gaugeLorentzCompatible (j : fieldData.BosonSpecies) : + (fieldData.boson j).GaugeLorentzCompatible := + HiggsVec.matterField_gaugeLorentzCompatible + +/-- Pure gauge jets act trivially on every species of the Standard Model. -/ +lemma fieldData_pureJetsActTrivially : fieldData.PureJetsActTrivially := + ⟨fieldData_fermion_pureJetsActTrivially, fieldData_boson_pureJetsActTrivially⟩ + +/-- The gauge and Lorentz actions commute on every species of the Standard Model. -/ +lemma fieldData_gaugeLorentzCompatible : fieldData.GaugeLorentzCompatible := + ⟨fieldData_fermion_gaugeLorentzCompatible, fieldData_boson_gaugeLorentzCompatible⟩ + +/-! + +## D. The mass weights A Standard Model fermion carries mass weight three and the Higgs weight two, in the units in which a derivative has weight two. The first two are read off the matter fields, the diff --git a/Physlib/Particles/StandardModel/HiggsBoson/MatterField.lean b/Physlib/Particles/StandardModel/HiggsBoson/MatterField.lean index 7f9300281..2bd27f807 100644 --- a/Physlib/Particles/StandardModel/HiggsBoson/MatterField.lean +++ b/Physlib/Particles/StandardModel/HiggsBoson/MatterField.lean @@ -28,6 +28,9 @@ scalar, and mass weight two is the weight already fixed by - `StandardModel.HiggsVec.matterField` : the Higgs field as a matter field, with the four projection rules identifying its fields with the existing definitions. +- `StandardModel.HiggsVec.matterField_pureJetsActTrivially`, + `StandardModel.HiggsVec.matterField_gaugeLorentzCompatible` : the two conditions consumed + by the covariant derivative theory, restated from the Higgs files. ## iii. Table of contents @@ -77,6 +80,14 @@ lemma matterField_repAlgebra : matterField.repAlgebra = gaugeAlgebraAction := rf @[simp] lemma matterField_massWeight : matterField.massWeight = 2 := rfl +/-- Pure gauge jets act trivially on the Higgs at the base point. -/ +lemma matterField_pureJetsActTrivially : matterField.PureJetsActTrivially := + fun hW => repCoeff_zero_of_eval_eq_one hW + +/-- The gauge action on the Higgs commutes with its (trivial) Lorentz action. -/ +lemma matterField_gaugeLorentzCompatible : matterField.GaugeLorentzCompatible := + gaugeAlgebraAction_comm_repLorentz + end HiggsVec end StandardModel diff --git a/Physlib/Relativity/DerivAlgebra.lean b/Physlib/Relativity/DerivAlgebra.lean index f4d18feaf..9ce687caa 100644 --- a/Physlib/Relativity/DerivAlgebra.lean +++ b/Physlib/Relativity/DerivAlgebra.lean @@ -22,6 +22,7 @@ public import Mathlib.RingTheory.MvPowerSeries.Derivative public import Physlib.Relativity.JetRing.Matrix public import Physlib.Relativity.Tensors.ComplexTensor.Vector.Pre.Basic public import Physlib.Relativity.Tensors.RealTensor.CoVector.Representation +public import Physlib.Mathematics.Fin /-! # Derivative algebras @@ -576,6 +577,31 @@ lemma repLorentzGroup_basis_singleton (Λ : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) : refine Finset.sum_congr rfl fun ν _ => ?_ rw [map_smul, basis_singleton] +/-- The Lorentz action on the derivative monomial of an ordered tuple of directions: every + slot mixes by the columns of the Lorentz matrix, one factor per slot. -/ +lemma repLorentzGroup_basis_ofFn (Λ : SL(2,ℂ)) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + repLorentzGroup Λ (basis (List.ofFn l)) = + ∑ p : Fin n → (Fin 1 ⊕ Fin 3), + (∏ i, (((Lorentz.SL2C.toLorentzGroup Λ).1 (p i) (l i) : ℝ) : ℂ)) • basis (List.ofFn p) := by + induction n with + | zero => + rw [Fintype.sum_unique, Finset.univ_eq_empty, Finset.prod_empty, one_smul] + simp only [List.ofFn_zero, Multiset.coe_nil] + rw [show (0 : Multiset (Fin 1 ⊕ Fin 3)) = {} from rfl, basis_nil, repLorentzGroup_apply_one] + | succ n ih => + have hcons : ∀ (b : Fin 1 ⊕ Fin 3) (p : Fin n → (Fin 1 ⊕ Fin 3)), + basis (List.ofFn (Fin.cons b p : Fin (n + 1) → (Fin 1 ⊕ Fin 3))) = + basis ({b} : Multiset (Fin 1 ⊕ Fin 3)) * basis (List.ofFn p) := by + intro b p + rw [basis_mul, Multiset.singleton_add, List.ofFn_succ, ← Multiset.cons_coe] + simp only [Fin.cons_zero, Fin.cons_succ] + rw [List.ofFn_succ, ← Multiset.cons_coe, ← Multiset.singleton_add, ← basis_mul, + repLorentzGroup_apply_mul, repLorentzGroup_basis_singleton, ih, Finset.sum_mul_sum, + Physlib.Fin.sum_pi_succ_prod_smul + (fun i b => (((Lorentz.SL2C.toLorentzGroup Λ).1 b (l i) : ℝ) : ℂ))] + refine Finset.sum_congr rfl fun b _ => Finset.sum_congr rfl fun p _ => ?_ + rw [smul_mul_smul_comm, hcons] + /-! ### B.6. The derivative-degree scaling diff --git a/Physlib/Relativity/LorentzMix.lean b/Physlib/Relativity/LorentzMix.lean new file mode 100644 index 000000000..362f02655 --- /dev/null +++ b/Physlib/Relativity/LorentzMix.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, Nathaneal Sajan +-/ +module + +public import Physlib.Relativity.IsLorentzDeriv +public import Physlib.Relativity.SL2C.Basic +public import Physlib.Mathematics.Fin +public import Physlib.Mathematics.MultisetAntidiagonal +/-! +# The Lorentz mixing of derivative slots + +## i. Overview + +A Lorentz transformation mixes each derivative slot of a symbol through a column `Λ_{b a}` +of the Lorentz matrix. On families indexed by multisets of directions this is the operator +`lorentzMix`: peel one direction `a`, put it back as every direction `b` weighted by +`Λ_{b a}`, and mix what is left; peeling commutes, so the operator descends to multisets, +and `lorentzMix_ofFn` is its tuple form. The correction terms of a covariant derivative are +Leibniz convolutions `derivConv` over the multiset antidiagonal, and `lorentzMix` is a +morphism for the convolution. The Lorentz law of any covariant tower built one slot at a +time from a covariant correction is then one induction, `repLorentz_tower`. Nothing here +depends on a gauge group. + +## ii. Key results + +- `Lorentz.lorentzMix`, `Lorentz.lorentzMix_ofFn` : the mixing operator and its tuple form. +- `Lorentz.derivConv`, `Lorentz.lorentzMix_derivConv` : the Leibniz convolution, and the + mixing operator as a morphism for it. +- `Lorentz.repLorentz_tower` : the Lorentz law of an abstract covariant tower. + +## iii. Table of contents + +- A. The Lorentz mixing of derivative slots +- B. The Leibniz convolution +- C. The Lorentz law of a covariant tower + +-/ + +@[expose] public section + +namespace Lorentz + +open Matrix MatrixGroups + +-- The entry `Λ_{b a}` of the Lorentz matrix of `Λ : SL(2,ℂ)`, as a complex scalar. +set_option quotPrecheck false in +local notation:max "L[" Λ "]" b:max a:max => (((SL2C.toLorentzGroup Λ).1 b a : ℝ) : ℂ) + +/-! + +## A. The Lorentz mixing of derivative slots + +-/ + +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 `Λ_{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, L[Λ] 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] + exact Finset.sum_congr rfl fun b₁ _ => Finset.sum_congr rfl fun b₂ _ => by + 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) + +@[simp] +lemma lorentzMix_zero : lorentzMix Λ G 0 = G := Multiset.foldr_zero _ _ + +/-- Mixing along `a ::ₘ s` peels `a` after mixing along `s`. -/ +lemma lorentzMix_cons_apply (a : Fin 1 ⊕ Fin 3) (s t : Multiset (Fin 1 ⊕ Fin 3)) : + lorentzMix Λ G (a ::ₘ s) t = ∑ b, L[Λ] b a • lorentzMix Λ G s (b ::ₘ t) := + congrFun (Multiset.foldr_cons _ _ _ _) t + +/-- Evaluating a mixed family away from the empty multiset is mixing the translated + family at the empty multiset. -/ +lemma lorentzMix_apply_add (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 + simp only [lorentzMix_cons_apply, ih G, ih (fun r => G (r + t)), Multiset.add_cons, + Multiset.cons_add, add_zero] + +/-- Peeling at the empty multiset: the peeled direction is pushed into the family. -/ +lemma lorentzMix_cons_zero (a : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) : + lorentzMix Λ G (a ::ₘ s) 0 = ∑ b, L[Λ] b a • lorentzMix Λ (fun t => G (b ::ₘ t)) s 0 := by + simp only [lorentzMix_cons_apply, lorentzMix_apply_add Λ s G, Multiset.add_cons, add_zero] + +/-- The mixing operator commutes with any linear map applied to the values. -/ +lemma lorentzMix_map (Φ : M →ₗ[ℂ] N) (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 => simp only [lorentzMix_cons_apply, map_sum, map_smul, ih] + +/-- The mixing operator is homogeneous in the family. -/ +lemma lorentzMix_smul_fam (c : ℂ) (s t : Multiset (Fin 1 ⊕ Fin 3)) : + lorentzMix Λ (fun r => c • G r) s t = c • lorentzMix Λ G s t := + (lorentzMix_map Λ G (c • LinearMap.id) s t).symm + +/-- The mixing operator is additive in the family. -/ +lemma lorentzMix_add_fam (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 => + simp only [lorentzMix_cons_apply, ih, smul_add, Finset.sum_add_distrib] + +/-- The mixing operator commutes with finite sums of families. -/ +lemma lorentzMix_sum_fam {ι : Type*} [Fintype ι] (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 => + simp only [lorentzMix_cons_apply, ih, Finset.smul_sum] + exact Finset.sum_comm + +/-- 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, L[Λ] (p i) (l i)) • G ((List.ofFn p : List (Fin 1 ⊕ Fin 3)) + t) := by + induction n generalizing t with + | zero => rw [Fintype.sum_unique]; simp + | succ n ih => + rw [List.ofFn_succ, ← Multiset.cons_coe, lorentzMix_cons_apply, + Physlib.Fin.sum_pi_succ_prod_smul (fun i b => L[Λ] b (l i))] + refine Finset.sum_congr rfl fun b _ => ?_ + rw [ih (fun i => l i.succ) (b ::ₘ t), Finset.smul_sum] + refine Finset.sum_congr rfl fun p _ => ?_ + rw [smul_smul, List.ofFn_succ, ← Multiset.cons_coe, Multiset.cons_add, Multiset.add_cons] + simp only [Fin.cons_zero, Fin.cons_succ] + +end LorentzMix + +/-! + +## B. The Leibniz convolution + +-/ + +section DerivConv + +variable {B : Type} [Ring B] [Algebra ℂ B] + +/-- 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 (a ::ₘ r)) s + derivConv (fun r => f (a ::ₘ r)) g s := by + simp only [derivConv, Multiset.antidiagonal_cons, Multiset.map_add, Multiset.sum_add, + Multiset.map_map] + rfl + +/-- 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 + simp only [derivConv, Finset.mul_sum, mul_smul_comm, Multiset.sum_map_finsetSum, + Multiset.smul_sum, Multiset.map_map, Function.comp_def] + +/-- 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 + simp only [derivConv, Finset.sum_mul, smul_mul_assoc, Multiset.sum_map_finsetSum, + Multiset.smul_sum, Multiset.map_map, Function.comp_def] + +/-- 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 + rw [derivConv_cons, lorentzMix_cons_zero] + simp only [lorentzMix_cons_zero, derivConv_sum_right, derivConv_sum_left, + derivConv_cons, lorentzMix_add_fam, ← ih, smul_add, Finset.sum_add_distrib] + +/-- 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 {repLorentz : Representation ℂ SL(2,ℂ) B} + (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]) + +end DerivConv + +/-! + +## C. The Lorentz law of a covariant tower + +A covariant tower is built one slot at a time: the tower along `l 0 :: l'` is the tower +along `l'` with one more plain derivative, plus a correction `C (l 0)` applied to the tower +along `l'`. The induction is run once, for an abstract tower with a Lorentz covariant +correction that is linear in the family it corrects and lets a twist of the value index +through. + +-/ + +section Tower + +variable {B : Type} [Ring B] [Algebra ℂ B] {repLorentz : Representation ℂ SL(2,ℂ) B} + +/-- The Lorentz law of a covariant tower `T` built by the step `hstep` from a correction + `C`, transforming into a tower `T'` built by the same step: the seed of `T` transforms + into the seed of `T'` with the value index twisted by `τ` (`hzero`), and the correction is + Lorentz covariant (`hC`), linear in the family it corrects (`hClin`) and lets the twist + through (`hCτ`). Then the covariant slots mix by their own columns of the Lorentz matrix, + the plain slots by `lorentzMix`, and the value index by `τ`. -/ +theorem repLorentz_tower {K : Type} [Field K] {W : Type} [AddCommGroup W] [Module K W] + [Module K B] [SMulCommClass K ℂ B] (Λ : SL(2,ℂ)) + (T T' : (n : ℕ) → (Fin n → (Fin 1 ⊕ Fin 3)) → Multiset (Fin 1 ⊕ Fin 3) → W →ₗ[K] B) + (C : (Fin 1 ⊕ Fin 3) → (Multiset (Fin 1 ⊕ Fin 3) → W →ₗ[K] B) → + Multiset (Fin 1 ⊕ Fin 3) → W →ₗ[K] B) + (τ : W →ₗ[K] W) + (hstep : ∀ (n : ℕ) (l : Fin (n + 1) → (Fin 1 ⊕ Fin 3)) (s : Multiset (Fin 1 ⊕ Fin 3)), + T (n + 1) l s = T n (fun i => l i.succ) (l 0 ::ₘ s) + C (l 0) (T n fun i => l i.succ) s) + (hstep' : ∀ (n : ℕ) (l : Fin (n + 1) → (Fin 1 ⊕ Fin 3)) (s : Multiset (Fin 1 ⊕ Fin 3)), + T' (n + 1) l s = T' n (fun i => l i.succ) (l 0 ::ₘ s) + C (l 0) (T' n fun i => l i.succ) s) + (hzero : ∀ (l : Fin 0 → (Fin 1 ⊕ Fin 3)) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : W), + repLorentz Λ (T 0 l s φ) = lorentzMix Λ (fun t => T' 0 l t (τ φ)) s 0) + (hC : ∀ (ρ : Fin 1 ⊕ Fin 3) (G G' : Multiset (Fin 1 ⊕ Fin 3) → W →ₗ[K] B), + (∀ y χ, repLorentz Λ (G y χ) = lorentzMix Λ (fun t => G' t χ) y 0) → + ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : W), repLorentz Λ (C ρ G s φ) = + ∑ a, L[Λ] a ρ • lorentzMix Λ (fun t => C a G' t φ) s 0) + (hClin : ∀ (ρ : Fin 1 ⊕ Fin 3) {ι : Type} [Fintype ι] (c : ι → ℂ) + (G : ι → Multiset (Fin 1 ⊕ Fin 3) → W →ₗ[K] B) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : W), C ρ (fun t => ∑ i, c i • G i t) s φ = ∑ i, c i • C ρ (G i) s φ) + (hCτ : ∀ (ρ : Fin 1 ⊕ Fin 3) (G : Multiset (Fin 1 ⊕ Fin 3) → W →ₗ[K] B) + (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : W), + C ρ (fun t => G t ∘ₗ τ) s φ = C ρ G s (τ φ)) : + ∀ (n : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : W), + repLorentz Λ (T n l s φ) = + ∑ p : Fin n → (Fin 1 ⊕ Fin 3), + (∏ i, L[Λ] (p i) (l i)) • lorentzMix Λ (fun t => T' n p t (τ φ)) s 0 := by + intro n + induction n with + | zero => + intro l s φ + rw [Fintype.sum_eq_single l fun p hp => absurd (Subsingleton.elim p l) hp] + simp only [Finset.univ_eq_empty, Finset.prod_empty, one_smul] + exact hzero l s φ + | succ n ih => + intro l s φ + -- the Lorentz law of the lower tower, in the form the correction term consumes + have hG : ∀ y χ, repLorentz Λ (T n (fun i => l i.succ) y χ) = + lorentzMix Λ (fun t => (∑ p : Fin n → (Fin 1 ⊕ Fin 3), + (∏ i, L[Λ] (p i) (l i.succ)) • (T' n p t ∘ₗ τ)) χ) y 0 := by + intro y χ + simp only [LinearMap.sum_apply, LinearMap.smul_apply, LinearMap.comp_apply, + lorentzMix_sum_fam, lorentzMix_smul_fam] + exact ih _ y χ + rw [hstep, LinearMap.add_apply, map_add, ih _ (l 0 ::ₘ s) φ, hC (l 0) _ _ hG s φ, + Physlib.Fin.sum_pi_succ_prod_smul (fun i b => L[Λ] b (l i))] + -- both sides as double sums over the first direction and the lower tuple + simp only [lorentzMix_cons_zero, hClin, hCτ, hstep', Fin.cons_zero, Fin.cons_succ, + LinearMap.add_apply, lorentzMix_add_fam, lorentzMix_sum_fam, lorentzMix_smul_fam, + Finset.smul_sum, smul_smul, smul_add, Finset.sum_add_distrib] + congr 1 + rw [Finset.sum_comm] + exact Finset.sum_congr rfl fun b _ => Finset.sum_congr rfl fun p _ => by rw [mul_comm] + +end Tower + +end Lorentz From 08a18519edc5a213ac96111754a842d518919aaf Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Sun, 13 Sep 2026 16:53:42 +0400 Subject: [PATCH 326/367] feat: define full field algebra realizations and covariant restriction --- Physlib.lean | 2 + .../GaugeBoson/Realization/Symmetrized.lean | 15 + .../LocalCovFieldAlgebra/Basic.lean | 36 +- .../LocalCovFieldAlgebra/Realization.lean | 436 ++++++++++++++++++ .../LocalFieldAlgebra/GaugeAction.lean | 20 + .../LocalFieldAlgebra/LorentzAction.lean | 11 + .../LocalFieldAlgebra/Realization.lean | 393 ++++++++++++++++ .../MatterField/CovariantDeriv.lean | 82 ++++ .../Mathematics/AlgebraRepresentation.lean | 41 ++ 9 files changed, 1034 insertions(+), 2 deletions(-) create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/LocalCovFieldAlgebra/Realization.lean create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Realization.lean diff --git a/Physlib.lean b/Physlib.lean index bf27d7fc6..566d80b11 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -25,6 +25,7 @@ public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeFieldData.FermionGen public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeFieldData.FermionMatterField public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeFieldData.FermionModule public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalCovFieldAlgebra.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalCovFieldAlgebra.Realization public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.CovariantDeriv public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.Basic @@ -41,6 +42,7 @@ public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.GaugeAc public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.Jet public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.JetRep public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.LorentzAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.Realization public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.TransformsIn public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.AdjointCoeff public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Basic diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Symmetrized.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Symmetrized.lean index 28ab4bc3b..a0b4fdffd 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Symmetrized.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Symmetrized.lean @@ -194,6 +194,21 @@ lemma iteratedCovDerivAdjoint_map {B' : Type} [Ring B'] [Module ℝ B'] [SMulCom Φ ∘ₗ covDerivAdjoint A (iteratedCovDerivAdjoint A l F) ρ s rw [ih, covDerivAdjoint_map Φ hΦ] +/-- The covariant tower of the field strength is natural in the algebra: the tower of the + image family is the image of the tower. -/ +lemma iteratedCovDerivAdjoint_fieldStrength_map {B' : Type} [Ring B'] [Module ℝ B'] + [SMulCommClass ℝ B' B'] [IsScalarTower ℝ B' B'] (Φ : B →ₗ[ℝ] B') + (hΦ : ∀ b₁ b₂, Φ (b₁ * b₂) = Φ b₁ * Φ b₂) + (A : Multiset (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) → Module.Dual ℝ 𝔤 →ₗ[ℝ] B) + (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + iteratedCovDerivAdjoint (fun p σ => Φ ∘ₗ A p σ) l + (fieldStrength (fun p σ => Φ ∘ₗ A p σ) μ ν) 0 φ + = Φ (iteratedCovDerivAdjoint A l (fieldStrength A μ ν) 0 φ) := by + have key := congrFun (iteratedCovDerivAdjoint_map Φ hΦ A l (fieldStrength A μ ν)) 0 + rw [show (fun p => Φ ∘ₗ fieldStrength A μ ν p) = fieldStrength (fun p σ => Φ ∘ₗ A p σ) μ ν + from funext fun p => (fieldStrength_map Φ hΦ A μ ν p).symm] at key + exact LinearMap.congr_fun key φ + variable (A) in /-- The derivative symbols `∂_p A_μ^φ` with at most `n` derivatives. -/ abbrev symbolsLE (n : ℕ) : Set B := diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalCovFieldAlgebra/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalCovFieldAlgebra/Basic.lean index c8e350088..bb353e6e8 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalCovFieldAlgebra/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalCovFieldAlgebra/Basic.lean @@ -31,8 +31,8 @@ inclusion `Subalgebra.val` by construction. ## ii. Key results - `GaugeFieldData.LocalCovFieldAlgebra` : the covariant field algebra, with - `LocalCovFieldAlgebra.induction`, `LocalCovFieldAlgebra.mapsTo` and - `LocalCovFieldAlgebra.algHom_ext`. + `LocalCovFieldAlgebra.induction`, `LocalCovFieldAlgebra.mapsTo`, + `LocalCovFieldAlgebra.algHom_ext` and `LocalCovFieldAlgebra.algHom_ext_towers`. - `LocalCovFieldAlgebra.covFermion`, `LocalCovFieldAlgebra.covFieldStrength` and companions : the generators as elements of the covariant field algebra. - `LocalCovFieldAlgebra.repJet`, `LocalCovFieldAlgebra.repValue`, @@ -284,6 +284,38 @@ lemma coe_covConjBoson (j : T.BosonSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ (φ : Module.Dual ℂ (ConjModule (T.BosonValue j))) : (covConjBoson T j l φ : T.LocalFieldAlgebra) = T.covDerivConjBoson j l φ := rfl +/-- Two algebra maps out of the covariant field algebra agreeing on the five towers are + equal. Like `GaugeFieldData.LocalCovFieldAlgebra.algHom_ext` this is uniqueness only. -/ +lemma algHom_ext_towers {B : Type} [Semiring B] [Algebra ℂ B] + {f g : ↥T.LocalCovFieldAlgebra →ₐ[ℂ] B} + (hF : ∀ (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), + f (covFieldStrength T l μ ν φ) = g (covFieldStrength T l μ ν φ)) + (hψ : ∀ (i : T.FermionSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (T.FermionValue i)), + f (covFermion T i l φ) = g (covFermion T i l φ)) + (hψc : ∀ (i : T.FermionSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule (T.FermionValue i))), + f (covConjFermion T i l φ) = g (covConjFermion T i l φ)) + (hφ : ∀ (j : T.BosonSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (T.BosonValue j)), + f (covBoson T j l φ) = g (covBoson T j l φ)) + (hφc : ∀ (j : T.BosonSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule (T.BosonValue j))), + f (covConjBoson T j l φ) = g (covConjBoson T j l φ)) : f = g := by + refine algHom_ext fun b hb => ?_ + refine covGenerators_cases (P := fun b => ∀ hb' : b ∈ T.LocalCovFieldAlgebra, + f ⟨b, hb'⟩ = g ⟨b, hb'⟩) hb ?_ ?_ ?_ ?_ ?_ (Algebra.subset_adjoin hb) + · intro l μ ν φ _ + exact hF l μ ν φ + · intro i n l φ _ + exact hψ i l φ + · intro i n l φ _ + exact hψc i l φ + · intro j n l φ _ + exact hφ j l φ + · intro j n l φ _ + exact hφc j l φ + /-! ## B. Stability under the actions diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalCovFieldAlgebra/Realization.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalCovFieldAlgebra/Realization.lean new file mode 100644 index 000000000..99815cf47 --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalCovFieldAlgebra/Realization.lean @@ -0,0 +1,436 @@ +/- +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.ClassicalFieldTheory.GaugeTheory.LocalCovFieldAlgebra.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.Realization +/-! +# Realizations of the covariant field algebra + +## i. Overview + +A complex algebra `B` carries the covariant expressions of a gauge-field datum when the +covariant field algebra maps into it by a complex algebra map equivariant for the ordinary +gauge group `G₀` and for the Lorentz group, both acting on `B` by algebra endomorphisms: +`GaugeFieldData.LocalCovFieldAlgebra.Realization`. The gauge compatibility is with `G₀` +alone because the source action of the ordinary gauge group is the jet action at the +constant jets; the Lorentz action of the source exists only under +`GaugeFieldData.GaugeLorentzCompatible`, which the structure therefore carries. + +The covariant field algebra is a subalgebra of `J(T)` and is not free on its five towers, +so a realization is its algebra map and not an assignment of the towers; generation gives +uniqueness only (`Realization.ext_towers`). A realization of the local field algebra +restricts to one of the covariant field algebra +(`GaugeFieldData.Realization.restrict`), with `G₀` acting on the target through the +constant jets. The converse extension is not claimed. + +Under `GaugeFieldData.PureJetsActTrivially` the jet action factors through evaluation on +the realized covariant image, in the two forms of section D. That hypothesis is needed +nowhere else. + +## ii. Key results + +- `GaugeFieldData.LocalCovFieldAlgebra.Realization` : an algebra carrying the covariant + towers, with the tower images `fieldStrength`, `fermion`, `conjFermion`, `boson`, + `conjBoson` and their gauge and Lorentz laws. +- `GaugeFieldData.Realization.restrict` : restriction to the covariant field algebra, with + `restrict_fieldStrength_eq_iteratedCovDerivAdjoint` and + `restrict_fermion_eq_covDerivIter` identifying its towers. +- `GaugeFieldData.Realization.repJet_restrict_toAlgHom` and + `GaugeFieldData.LocalCovFieldAlgebra.Realization.map_repJet` : the factorization through + evaluation under `GaugeFieldData.PureJetsActTrivially`. + +## iii. Table of contents + +- A. Realizations +- B. The covariant towers of a realization +- C. Restriction from the local field algebra +- D. Factorization through evaluation + +-/ + +@[expose] public section + +set_option linter.unusedSectionVars false + +open TensorProduct Matrix MatrixGroups Lorentz +open GaugeAlgebraRealization (repDualCoeff) + +namespace GaugeFieldData + +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} {T : GaugeFieldData jets} + +-- The entry `Λ_{b a}` of the Lorentz matrix of `Λ : SL(2,ℂ)`, as a complex scalar. +set_option quotPrecheck false in +local notation:max "L[" Λ "]" b:max a:max => (((SL2C.toLorentzGroup Λ).1 b a : ℝ) : ℂ) + +namespace LocalCovFieldAlgebra + +/-! + +## A. Realizations + +-/ + +/-- A complex algebra `B` carrying the covariant expressions of the datum `T`: a complex + algebra map out of the covariant field algebra, equivariant for the ordinary gauge group + and the Lorentz group, both acting on the whole of `B` by algebra endomorphisms. The + Lorentz action of the source needs `GaugeFieldData.GaugeLorentzCompatible`, which is a + parameter; no other species condition is used. -/ +@[ext] +structure Realization (T : GaugeFieldData jets) (hGL : T.GaugeLorentzCompatible) (B : Type) + [Semiring B] [Algebra ℂ B] (repGauge : Representation ℂ G₀ B) + (repLorentz : Representation ℂ SL(2,ℂ) B) where + /-- The algebra map out of the covariant field algebra. -/ + toAlgHom : ↥T.LocalCovFieldAlgebra →ₐ[ℂ] B + /-- The map is equivariant for the ordinary gauge group. -/ + map_repValue : ∀ (g : G₀) (x : ↥T.LocalCovFieldAlgebra), + toAlgHom (repValue T g x) = repGauge g (toAlgHom x) + /-- The map is equivariant for the Lorentz group. -/ + map_repLorentz : ∀ (Λ : SL(2,ℂ)) (x : ↥T.LocalCovFieldAlgebra), + toAlgHom (repLorentzGroup T hGL Λ x) = repLorentz Λ (toAlgHom x) + /-- The ordinary gauge group acts on the whole of `B` by algebra endomorphisms. -/ + repGauge_mul : ∀ (g : G₀) (b₁ b₂ : B), repGauge g (b₁ * b₂) = repGauge g b₁ * repGauge g b₂ + /-- The Lorentz group acts on the whole of `B` by algebra endomorphisms. -/ + repLorentz_mul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂ + +namespace Realization + +variable {B : Type} [Semiring B] [Algebra ℂ B] {repGauge : Representation ℂ G₀ B} + {repLorentz : Representation ℂ SL(2,ℂ) B} {hGL : T.GaugeLorentzCompatible} + +variable (T hGL) in +/-- The covariant field algebra realized in itself, by the identity. -/ +noncomputable def id : Realization T hGL (↥T.LocalCovFieldAlgebra) (repValue T) + (repLorentzGroup T hGL) where + toAlgHom := AlgHom.id ℂ _ + map_repValue _ _ := rfl + map_repLorentz _ _ := rfl + repGauge_mul := repValue_apply_mul + repLorentz_mul := repLorentzGroup_apply_mul hGL + +@[simp] +lemma id_toAlgHom : (id T hGL).toAlgHom = AlgHom.id ℂ ↥T.LocalCovFieldAlgebra := rfl + +variable (k : Realization T hGL B repGauge repLorentz) + +/-! + +## B. The covariant towers of a realization + +-/ + +/-- The realized field-strength tower `∇_l F_μν^φ`. -/ +noncomputable def fieldStrength (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ 𝔤) : B := + k.toAlgHom.toLinearMap (covFieldStrength T l μ ν φ) + +/-- The realized covariant tower `∇_l ψ^φ` of a fermionic species. -/ +noncomputable def fermion (i : T.FermionSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (T.FermionValue i) →ₗ[ℂ] B := + k.toAlgHom.toLinearMap ∘ₗ covFermion T i l + +/-- The realized conjugate covariant tower of a fermionic species. -/ +noncomputable def conjFermion (i : T.FermionSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (ConjModule (T.FermionValue i)) →ₗ[ℂ] B := + k.toAlgHom.toLinearMap ∘ₗ covConjFermion T i l + +/-- The realized covariant tower of a bosonic species. -/ +noncomputable def boson (j : T.BosonSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (T.BosonValue j) →ₗ[ℂ] B := + k.toAlgHom.toLinearMap ∘ₗ covBoson T j l + +/-- The realized conjugate covariant tower of a bosonic species. -/ +noncomputable def conjBoson (j : T.BosonSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (ConjModule (T.BosonValue j)) →ₗ[ℂ] B := + k.toAlgHom.toLinearMap ∘ₗ covConjBoson T j l + +lemma fermion_apply (i : T.FermionSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (T.FermionValue i)) : + k.fermion i l φ = k.toAlgHom (covFermion T i l φ) := rfl + +lemma conjFermion_apply (i : T.FermionSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule (T.FermionValue i))) : + k.conjFermion i l φ = k.toAlgHom (covConjFermion T i l φ) := rfl + +lemma boson_apply (j : T.BosonSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (T.BosonValue j)) : + k.boson j l φ = k.toAlgHom (covBoson T j l φ) := rfl + +lemma conjBoson_apply (j : T.BosonSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule (T.BosonValue j))) : + k.conjBoson j l φ = k.toAlgHom (covConjBoson T j l φ) := rfl + +@[simp] +lemma id_fermion (i : T.FermionSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) : + (id T hGL).fermion i l = covFermion T i l := rfl + +@[simp] +lemma id_fieldStrength (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) : + (id T hGL).fieldStrength l μ ν = covFieldStrength T l μ ν := rfl + +/-- Two realizations with the same five towers are equal. This is uniqueness only: the + covariant field algebra is not free on its towers, so an assignment of the tower images + does not by itself define a realization. -/ +lemma ext_towers {k₁ k₂ : Realization T hGL B repGauge repLorentz} + (hF : ∀ (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), + k₁.fieldStrength l μ ν φ = k₂.fieldStrength l μ ν φ) + (hψ : ∀ (i : T.FermionSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (T.FermionValue i)), k₁.fermion i l φ = k₂.fermion i l φ) + (hψc : ∀ (i : T.FermionSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule (T.FermionValue i))), + k₁.conjFermion i l φ = k₂.conjFermion i l φ) + (hφ : ∀ (j : T.BosonSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (T.BosonValue j)), k₁.boson j l φ = k₂.boson j l φ) + (hφc : ∀ (j : T.BosonSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule (T.BosonValue j))), + k₁.conjBoson j l φ = k₂.conjBoson j l φ) : k₁ = k₂ := + Realization.ext (algHom_ext_towers hF hψ hψc hφ hφc) + +/-- The gauge law of the realized field-strength tower: the adjoint index rotates through + the dual adjoint action of the inverse. -/ +lemma gauge_fieldStrength (g : G₀) (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ 𝔤) : + repGauge g (k.fieldStrength l μ ν φ) + = k.fieldStrength l μ ν ((jets.adjointValue g⁻¹).dualMap φ) := by + have key : repGauge g (k.fieldStrength l μ ν φ) + = k.toAlgHom.toLinearMap (repValue T g (covFieldStrength T l μ ν φ)) := + (k.map_repValue g _).symm + rw [key, repValue_covFieldStrength] + rfl + +/-- The gauge law of a realized matter tower: the value index rotates through the zeroth + dual Taylor coefficient of the inverse constant jet. -/ +lemma gauge_fermion (g : G₀) (i : T.FermionSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (T.FermionValue i)) : + repGauge g (k.fermion i l φ) + = k.fermion i l (repDualCoeff (T.fermion i).repJet (jets.ofConstant g)⁻¹ 0 φ) := + (k.map_repValue g (covFermion T i l φ)).symm.trans + (congrArg k.toAlgHom (repJet_covFermion (jets.ofConstant g) i l φ)) + +lemma gauge_conjFermion (g : G₀) (i : T.FermionSpecies) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule (T.FermionValue i))) : + repGauge g (k.conjFermion i l φ) = k.conjFermion i l + (repDualCoeff (JetComponentSpace.repConj (T.fermion i).repJet) + (jets.ofConstant g)⁻¹ 0 φ) := + (k.map_repValue g (covConjFermion T i l φ)).symm.trans + (congrArg k.toAlgHom (repJet_covConjFermion (jets.ofConstant g) i l φ)) + +lemma gauge_boson (g : G₀) (j : T.BosonSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (T.BosonValue j)) : + repGauge g (k.boson j l φ) + = k.boson j l (repDualCoeff (T.boson j).repJet (jets.ofConstant g)⁻¹ 0 φ) := + (k.map_repValue g (covBoson T j l φ)).symm.trans + (congrArg k.toAlgHom (repJet_covBoson (jets.ofConstant g) j l φ)) + +lemma gauge_conjBoson (g : G₀) (j : T.BosonSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule (T.BosonValue j))) : + repGauge g (k.conjBoson j l φ) = k.conjBoson j l + (repDualCoeff (JetComponentSpace.repConj (T.boson j).repJet) + (jets.ofConstant g)⁻¹ 0 φ) := + (k.map_repValue g (covConjBoson T j l φ)).symm.trans + (congrArg k.toAlgHom (repJet_covConjBoson (jets.ofConstant g) j l φ)) + +/-- The Lorentz law of the realized field-strength tower: every covariant slot and both + covector indices mix by the columns of the Lorentz matrix. -/ +lemma lorentz_fieldStrength (Λ : SL(2,ℂ)) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + repLorentz Λ (k.fieldStrength (List.ofFn l) μ ν φ) + = ∑ p : Fin n → (Fin 1 ⊕ Fin 3), (∏ a, L[Λ] (p a) (l a)) • + ∑ a, L[Λ] a μ • ∑ b, L[Λ] b ν • k.fieldStrength (List.ofFn p) a b φ := by + have key : repLorentz Λ (k.fieldStrength (List.ofFn l) μ ν φ) + = k.toAlgHom.toLinearMap + (repLorentzGroup T hGL Λ (covFieldStrength T (List.ofFn l) μ ν φ)) := + (k.map_repLorentz Λ _).symm + rw [key, repLorentzGroup_covFieldStrength hGL, map_sum] + refine Finset.sum_congr rfl fun p _ => ?_ + rw [map_smul, map_sum] + refine congrArg _ (Finset.sum_congr rfl fun a _ => ?_) + rw [map_smul, map_sum] + exact congrArg _ (Finset.sum_congr rfl fun b _ => map_smul _ _ _) + +/-- The Lorentz law of a realized matter tower: every covariant slot mixes by the columns of + the Lorentz matrix and the value index transforms contragrediently. -/ +lemma lorentz_fermion (Λ : SL(2,ℂ)) (i : T.FermionSpecies) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (T.FermionValue i)) : + repLorentz Λ (k.fermion i l φ) + = ∑ p : Fin n → (Fin 1 ⊕ Fin 3), (∏ a, L[Λ] (p a) (l a)) • + k.fermion i p ((T.fermion i).repLorentz.dual Λ φ) := by + have key : repLorentz Λ (k.fermion i l φ) = k.toAlgHom.toLinearMap + (repLorentzGroup T hGL Λ (covFermion T i l φ)) := (k.map_repLorentz Λ _).symm + rw [key, repLorentzGroup_covFermion hGL, map_sum] + exact Finset.sum_congr rfl fun p _ => map_smul _ _ _ + +lemma lorentz_conjFermion (Λ : SL(2,ℂ)) (i : T.FermionSpecies) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule (T.FermionValue i))) : + repLorentz Λ (k.conjFermion i l φ) + = ∑ p : Fin n → (Fin 1 ⊕ Fin 3), (∏ a, L[Λ] (p a) (l a)) • + k.conjFermion i p ((T.fermion i).repLorentz.conj.dual Λ φ) := by + have key : repLorentz Λ (k.conjFermion i l φ) = k.toAlgHom.toLinearMap + (repLorentzGroup T hGL Λ (covConjFermion T i l φ)) := (k.map_repLorentz Λ _).symm + rw [key, repLorentzGroup_covConjFermion hGL, map_sum] + exact Finset.sum_congr rfl fun p _ => map_smul _ _ _ + +lemma lorentz_boson (Λ : SL(2,ℂ)) (j : T.BosonSpecies) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (T.BosonValue j)) : + repLorentz Λ (k.boson j l φ) + = ∑ p : Fin n → (Fin 1 ⊕ Fin 3), (∏ a, L[Λ] (p a) (l a)) • + k.boson j p ((T.boson j).repLorentz.dual Λ φ) := by + have key : repLorentz Λ (k.boson j l φ) = k.toAlgHom.toLinearMap + (repLorentzGroup T hGL Λ (covBoson T j l φ)) := (k.map_repLorentz Λ _).symm + rw [key, repLorentzGroup_covBoson hGL, map_sum] + exact Finset.sum_congr rfl fun p _ => map_smul _ _ _ + +lemma lorentz_conjBoson (Λ : SL(2,ℂ)) (j : T.BosonSpecies) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule (T.BosonValue j))) : + repLorentz Λ (k.conjBoson j l φ) + = ∑ p : Fin n → (Fin 1 ⊕ Fin 3), (∏ a, L[Λ] (p a) (l a)) • + k.conjBoson j p ((T.boson j).repLorentz.conj.dual Λ φ) := by + have key : repLorentz Λ (k.conjBoson j l φ) = k.toAlgHom.toLinearMap + (repLorentzGroup T hGL Λ (covConjBoson T j l φ)) := (k.map_repLorentz Λ _).symm + rw [key, repLorentzGroup_covConjBoson hGL, map_sum] + exact Finset.sum_congr rfl fun p _ => map_smul _ _ _ + +end Realization + +end LocalCovFieldAlgebra + +/-! + +## C. Restriction from the local field algebra + +-/ + +namespace Realization + +variable {B : Type} [Ring B] [Algebra ℂ B] {repJet : Representation ℂ GJ B} + {repLorentz : Representation ℂ SL(2,ℂ) B} (h : Realization T B repJet repLorentz) + (hGL : T.GaugeLorentzCompatible) + +/-- The restriction of a realization of the local field algebra to the covariant field + algebra, along the inclusion; the ordinary gauge group acts on the target through the + constant jets. No species condition beyond `hGL` is used. -/ +noncomputable def restrict : + LocalCovFieldAlgebra.Realization T hGL B (repJet.comp jets.ofConstant) repLorentz where + toAlgHom := h.toAlgHom.comp T.LocalCovFieldAlgebra.val + map_repValue g x := h.map_repJet (jets.ofConstant g) x + map_repLorentz Λ x := h.map_repLorentz Λ x + repGauge_mul g := h.repJet_mul (jets.ofConstant g) + repLorentz_mul := h.repLorentz_mul + +@[simp] +lemma restrict_toAlgHom_apply (x : ↥T.LocalCovFieldAlgebra) : + (h.restrict hGL).toAlgHom x = h.toAlgHom x := rfl + +lemma restrict_id_toAlgHom : + ((id T).restrict hGL).toAlgHom = T.LocalCovFieldAlgebra.val := + AlgHom.ext fun _ => rfl + +lemma restrict_fieldStrength (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ 𝔤) : + (h.restrict hGL).fieldStrength l μ ν φ = h.toAlgHom (T.covDerivFieldStrength l μ ν φ) := + rfl + +lemma restrict_fermion (i : T.FermionSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (T.FermionValue i)) : + (h.restrict hGL).fermion i l φ = h.toAlgHom (T.covDerivFermion i l φ) := rfl + +lemma restrict_conjFermion (i : T.FermionSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule (T.FermionValue i))) : + (h.restrict hGL).conjFermion i l φ = h.toAlgHom (T.covDerivConjFermion i l φ) := rfl + +lemma restrict_boson (j : T.BosonSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (T.BosonValue j)) : + (h.restrict hGL).boson j l φ = h.toAlgHom (T.covDerivBoson j l φ) := rfl + +lemma restrict_conjBoson (j : T.BosonSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule (T.BosonValue j))) : + (h.restrict hGL).conjBoson j l φ = h.toAlgHom (T.covDerivConjBoson j l φ) := rfl + +/-- The field-strength tower of a restriction is the covariant tower of the realized + gauge-boson symbols. -/ +lemma restrict_fieldStrength_eq_iteratedCovDerivAdjoint (l : List (Fin 1 ⊕ Fin 3)) + (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + (h.restrict hGL).fieldStrength l μ ν φ + = GaugeAlgebraRealization.iteratedCovDerivAdjoint h.gaugeRealization.A l + (GaugeAlgebraRealization.fieldStrength h.gaugeRealization.A μ ν) 0 φ := + h.toAlgHom_covDerivFieldStrength l μ ν φ + +/-- A matter tower of a restriction is the covariant tower of the realized symbols of the + species, computed against the realized gauge-boson symbols. -/ +lemma restrict_fermion_eq_covDerivIter (i : T.FermionSpecies) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (T.FermionValue i)) : + (h.restrict hGL).fermion i l φ + = GaugeAlgebraRealization.covDerivIter h.gaugeRealization.A (T.fermion i).repAlgebra + (h.fermionSymbol i) n l 0 φ := + h.toAlgHom_covDerivFermion i l φ + +lemma restrict_conjFermion_eq_covDerivIter (i : T.FermionSpecies) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule (T.FermionValue i))) : + (h.restrict hGL).conjFermion i l φ + = GaugeAlgebraRealization.covDerivIter h.gaugeRealization.A + (LocalGaugeData.actionConj (T.fermion i).repAlgebra) (h.conjFermionSymbol i) n l 0 φ := + h.toAlgHom_covDerivConjFermion i l φ + +lemma restrict_boson_eq_covDerivIter (j : T.BosonSpecies) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (T.BosonValue j)) : + (h.restrict hGL).boson j l φ + = GaugeAlgebraRealization.covDerivIter h.gaugeRealization.A (T.boson j).repAlgebra + (h.bosonSymbol j) n l 0 φ := + h.toAlgHom_covDerivBoson j l φ + +lemma restrict_conjBoson_eq_covDerivIter (j : T.BosonSpecies) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule (T.BosonValue j))) : + (h.restrict hGL).conjBoson j l φ + = GaugeAlgebraRealization.covDerivIter h.gaugeRealization.A + (LocalGaugeData.actionConj (T.boson j).repAlgebra) (h.conjBosonSymbol j) n l 0 φ := + h.toAlgHom_covDerivConjBoson j l φ + +/-- Full jet equivariance survives restriction, with no species condition. -/ +lemma restrict_map_repJet (U : GJ) (x : ↥T.LocalCovFieldAlgebra) : + (h.restrict hGL).toAlgHom (LocalCovFieldAlgebra.repJet T U x) + = repJet U ((h.restrict hGL).toAlgHom x) := + h.map_repJet U x + +/-! + +## D. Factorization through evaluation + +-/ + +/-- Under `GaugeFieldData.PureJetsActTrivially`, a jet acts on the realized covariant image + as the constant jet of its value; nothing is assumed about the jet action elsewhere in + `B`. -/ +lemma repJet_restrict_toAlgHom (hP : T.PureJetsActTrivially) (U : GJ) + (x : ↥T.LocalCovFieldAlgebra) : + repJet U ((h.restrict hGL).toAlgHom x) + = repJet (jets.ofConstant (jets.eval U)) ((h.restrict hGL).toAlgHom x) := by + rw [restrict_toAlgHom_apply, ← h.map_repJet U (x : T.LocalFieldAlgebra), + ← h.map_repJet (jets.ofConstant (jets.eval U)) (x : T.LocalFieldAlgebra)] + exact congrArg h.toAlgHom (congrArg (fun y : ↥T.LocalCovFieldAlgebra => + (y : T.LocalFieldAlgebra)) (LocalCovFieldAlgebra.repJet_eq_repValue_eval hP U x)) + +end Realization + +namespace LocalCovFieldAlgebra.Realization + +variable {B : Type} [Semiring B] [Algebra ℂ B] {repGauge : Representation ℂ G₀ B} + {repLorentz : Representation ℂ SL(2,ℂ) B} {hGL : T.GaugeLorentzCompatible} + +/-- Under `GaugeFieldData.PureJetsActTrivially`, a covariant realization intertwines the + source jet action with the target action of the ordinary gauge group at the value of the + jet. -/ +lemma map_repJet (k : Realization T hGL B repGauge repLorentz) (hP : T.PureJetsActTrivially) + (U : GJ) (x : ↥T.LocalCovFieldAlgebra) : + k.toAlgHom (repJet T U x) = repGauge (jets.eval U) (k.toAlgHom x) := by + rw [repJet_eq_repValue_eval hP, k.map_repValue] + +end LocalCovFieldAlgebra.Realization + +end GaugeFieldData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/GaugeAction.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/GaugeAction.lean index 48cb1385b..88d082523 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/GaugeAction.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/GaugeAction.lean @@ -27,6 +27,7 @@ uniqueness, without unfolding the tensor-product carrier. `repJet_ιConnection` on the generators. - `GaugeFieldData.repJet_includeConnection` : on the connection factor the action is the complexified gauge-only action. +- `GaugeFieldData.repJet_ιConnection_affine` : the affine law of the connection generators. ## iii. Table of contents @@ -215,4 +216,23 @@ lemma repJet_includeConnection (U : GJ) (y : ℂ ⊗[ℝ] LocalGaugeFieldAlgebra = T.includeConnection (LocalGaugeFieldAlgebra.complexRepJet jets U y) := repJetAlgHom_includeConnection U y +/-- The affine gauge law of the connection generators: a jet carries a connection + generator to the transported generator of its inverse plus the Maurer–Cartan shift, the + gauge field being a connection and not a tensor. This is the generator-level form of + `GaugeFieldData.repJet_ιConnection`, with no reference to the connection factor. -/ +lemma repJet_ιConnection_affine (U : GJ) (v : GaugeBoson.JetComponentSpace 𝔤) : + T.repJet U (T.ιConnection v) + = T.ιConnection (LocalGaugeFieldAlgebra.transport jets U⁻¹ v) + + (LocalGaugeFieldAlgebra.mcShift jets U⁻¹ v : ℂ) • (1 : T.LocalFieldAlgebra) := by + rw [repJet_ιConnection, LocalGaugeFieldAlgebra.repJet_ι, TensorProduct.tmul_add, map_add, + show ((1 : ℂ) ⊗ₜ[ℝ] algebraMap ℝ (LocalGaugeFieldAlgebra 𝔤) + (LocalGaugeFieldAlgebra.mcShift jets U⁻¹ v)) + = algebraMap ℝ (ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤) + (LocalGaugeFieldAlgebra.mcShift jets U⁻¹ v) from + (Algebra.TensorProduct.includeRight_apply _).symm.trans + (AlgHom.commutes Algebra.TensorProduct.includeRight _), + IsScalarTower.algebraMap_apply ℝ ℂ (ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤), AlgHom.commutes, + Algebra.algebraMap_eq_smul_one] + rfl + end GaugeFieldData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/LorentzAction.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/LorentzAction.lean index 368d77570..0913df0b0 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/LorentzAction.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/LorentzAction.lean @@ -28,6 +28,7 @@ compatible assignment, with the representation laws from uniqueness. generators. - `GaugeFieldData.repLorentzGroup_includeConnection` : on the connection factor the action is the complexified gauge-only action. +- `GaugeFieldData.repLorentzGroup_ιConnection_eq` : the law of the connection generators. ## iii. Table of contents @@ -224,4 +225,14 @@ lemma repLorentzGroup_includeConnection (Λ : SL(2,ℂ)) (y : ℂ ⊗[ℝ] Local = T.includeConnection (LocalGaugeFieldAlgebra.complexRepLorentzGroup 𝔤 Λ y) := repLorentzAlgHom_includeConnection Λ y +/-- The Lorentz law of the connection generators: a transformation carries a connection + generator to the generator of the transformed component, with no shift. This is the + generator-level form of `GaugeFieldData.repLorentzGroup_ιConnection`, with no reference + to the connection factor. -/ +lemma repLorentzGroup_ιConnection_eq (Λ : SL(2,ℂ)) (v : GaugeBoson.JetComponentSpace 𝔤) : + T.repLorentzGroup Λ (T.ιConnection v) + = T.ιConnection (GaugeBoson.JetComponentSpace.repLorentzGroup 𝔤 Λ v) := by + rw [repLorentzGroup_ιConnection, LocalGaugeFieldAlgebra.repLorentzGroup_ι] + rfl + end GaugeFieldData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Realization.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Realization.lean new file mode 100644 index 000000000..857339089 --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Realization.lean @@ -0,0 +1,393 @@ +/- +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.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.CovariantDeriv +public import Physlib.Mathematics.AlgebraRepresentation +/-! +# Realizations of the local field algebra + +## i. Overview + +A complex algebra `B` carries the fields of a gauge-field datum when the local field +algebra `J(T)` maps into it by a complex algebra map equivariant for the jet gauge group +and the Lorentz group, both acting on `B` by algebra endomorphisms: +`GaugeFieldData.Realization`. The generator images are not stored: they are read off the +map as `Realization.toAssignment`, the connection factor as `Realization.gaugeRealization` +and the matter symbols as `Realization.fermionSymbol` and companions. + +By the universal property of `J(T)` a realization is the same thing as a compatible +assignment of the generators satisfying the six generator-level transformation laws of +`GaugeFieldData.Assignment.IsEquivariant`, the connection law being affine: a jet moves a +connection generator by the transport of its inverse plus the Maurer–Cartan shift. + +## ii. Key results + +- `GaugeFieldData.Realization` : an algebra carrying the fields of a datum. +- `GaugeFieldData.Realization.gaugeRealization` : the gauge bosons of a realization, with + `toAlgHom_covDerivFieldStrength` identifying the realized field-strength tower. +- `GaugeFieldData.Realization.toAlgHom_covDerivFermion` and companions : the realized + covariant matter towers are the towers of the realized symbols. +- `GaugeFieldData.Assignment.IsEquivariant` : the generator-level equivariance of an + assignment, with `IsEquivariant.toRealization` and + `GaugeFieldData.realizationEquivAssignment`. + +## iii. Table of contents + +- A. Realizations +- B. The assignment of a realization +- C. The gauge bosons of a realization +- D. The matter symbols and towers of a realization +- E. Equivariant assignments + +-/ + +@[expose] public section + +set_option linter.unusedSectionVars false + +open TensorProduct Matrix MatrixGroups Lorentz + +namespace GaugeFieldData + +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} {T : GaugeFieldData jets} + +/-! + +## A. Realizations + +-/ + +/-- A complex algebra `B` carrying the fields of the datum `T`: a complex algebra map out + of the local field algebra, equivariant for the jet gauge group and the Lorentz group, + both acting on the whole of `B` by algebra endomorphisms. No commutativity, injectivity + or surjectivity is assumed, and no derivative operator on `B` is involved. -/ +@[ext] +structure Realization (T : GaugeFieldData jets) (B : Type) [Ring B] [Algebra ℂ B] + (repJet : Representation ℂ GJ B) (repLorentz : Representation ℂ SL(2,ℂ) B) where + /-- The algebra map out of the local field algebra. -/ + toAlgHom : T.LocalFieldAlgebra →ₐ[ℂ] B + /-- The map is equivariant for the jet gauge group. -/ + map_repJet : ∀ (U : GJ) (x : T.LocalFieldAlgebra), + toAlgHom (T.repJet U x) = repJet U (toAlgHom x) + /-- The map is equivariant for the Lorentz group. -/ + map_repLorentz : ∀ (Λ : SL(2,ℂ)) (x : T.LocalFieldAlgebra), + toAlgHom (T.repLorentzGroup Λ x) = repLorentz Λ (toAlgHom x) + /-- The jet gauge group acts on the whole of `B` by algebra endomorphisms. -/ + repJet_mul : ∀ (U : GJ) (b₁ b₂ : B), repJet U (b₁ * b₂) = repJet U b₁ * repJet U b₂ + /-- The Lorentz group acts on the whole of `B` by algebra endomorphisms. -/ + repLorentz_mul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂ + +namespace Realization + +variable {B : Type} [Ring B] [Algebra ℂ B] {repJet : Representation ℂ GJ B} + {repLorentz : Representation ℂ SL(2,ℂ) B} + +variable (T) in +/-- The local field algebra realized in itself, by the identity. -/ +noncomputable def id : Realization T T.LocalFieldAlgebra T.repJet T.repLorentzGroup where + toAlgHom := AlgHom.id ℂ _ + map_repJet _ _ := rfl + map_repLorentz _ _ := rfl + repJet_mul := GaugeFieldData.repJet_apply_mul + repLorentz_mul := GaugeFieldData.repLorentzGroup_apply_mul + +@[simp] +lemma id_toAlgHom : (id T).toAlgHom = AlgHom.id ℂ T.LocalFieldAlgebra := rfl + +/-- Two realizations agreeing on the generators of every species and on the connection + generators are equal. -/ +lemma ext_generators {h₁ h₂ : Realization T B repJet repLorentz} + (hf : ∀ i x, h₁.toAlgHom (T.ιFermion i x) = h₂.toAlgHom (T.ιFermion i x)) + (hb : ∀ j y, h₁.toAlgHom (T.ιBoson j y) = h₂.toAlgHom (T.ιBoson j y)) + (ha : ∀ v, h₁.toAlgHom (T.ιConnection v) = h₂.toAlgHom (T.ιConnection v)) : h₁ = h₂ := + Realization.ext (algHom_ext hf hb ha) + +variable (h : Realization T B repJet repLorentz) + +/-! + +## B. The assignment of a realization + +-/ + +/-- The generator images of a realization, as a compatible assignment: the inverse of the + universal property applied to its algebra map. -/ +noncomputable def toAssignment : T.Assignment B := (liftEquiv T B).symm h.toAlgHom + +lemma toAssignment_fermion (i : T.FermionSpecies) (x : JetComponentSpace (T.fermion i)) : + h.toAssignment.fermion i x = h.toAlgHom (T.ιFermion i x) := rfl + +lemma toAssignment_boson (j : T.BosonSpecies) (y : JetComponentSpace (T.boson j)) : + h.toAssignment.boson j y = h.toAlgHom (T.ιBoson j y) := rfl + +lemma toAssignment_connection (v : GaugeBoson.JetComponentSpace 𝔤) : + h.toAssignment.connection v = h.toAlgHom (T.ιConnection v) := rfl + +@[simp] +lemma lift_toAssignment : h.toAssignment.lift = h.toAlgHom := + (liftEquiv T B).apply_symm_apply h.toAlgHom + +/-! + +## C. The gauge bosons of a realization + +-/ + +/-- The gauge bosons of a realization: the connection factor of `J(T)` carried into `B`, + so that the gauge-boson symbol theory applies to the images. -/ +noncomputable def gaugeRealization : GaugeAlgebraRealization jets B repJet repLorentz where + toAlgHom := h.toAlgHom.comp T.gaugeRealization.toAlgHom + A s μ := h.toAlgHom.toLinearMap.restrictScalars ℝ ∘ₗ T.gaugeRealization.A s μ + A_eq _ _ _ := rfl + map_repJet U x := by + rw [AlgHom.comp_apply, T.gaugeRealization.map_repJet, h.map_repJet, AlgHom.comp_apply] + map_repLorentz Λ x := by + rw [AlgHom.comp_apply, T.gaugeRealization.map_repLorentz, h.map_repLorentz, + AlgHom.comp_apply] + repJet_mul := h.repJet_mul + repLorentz_mul := h.repLorentz_mul + +lemma gaugeRealization_A (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ 𝔤) : + h.gaugeRealization.A s μ φ = h.toAlgHom (T.gaugeRealization.A s μ φ) := rfl + +@[simp] +lemma id_gaugeRealization_A : (id T).gaugeRealization.A = T.gaugeRealization.A := rfl + +/-- The map of a realization carries the included field-strength tower to the covariant + tower of the realized gauge-boson symbols. -/ +lemma toAlgHom_covDerivFieldStrength (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ 𝔤) : + h.toAlgHom (T.covDerivFieldStrength l μ ν φ) + = GaugeAlgebraRealization.iteratedCovDerivAdjoint h.gaugeRealization.A l + (GaugeAlgebraRealization.fieldStrength h.gaugeRealization.A μ ν) 0 φ := by + rw [covDerivFieldStrength_eq_iteratedCovDerivAdjoint] + exact (GaugeAlgebraRealization.iteratedCovDerivAdjoint_fieldStrength_map + (B := T.LocalFieldAlgebra) (B' := B) (h.toAlgHom.toLinearMap.restrictScalars ℝ) + (map_mul h.toAlgHom) T.gaugeRealization.A l μ ν φ).symm + +/-! + +## D. The matter symbols and towers of a realization + +-/ + +/-- The realized derivative symbols of a fermionic species. -/ +noncomputable def fermionSymbol (i : T.FermionSpecies) (s : Multiset (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (T.FermionValue i) →ₗ[ℂ] B := + h.toAlgHom.toLinearMap ∘ₗ T.fermionSymbol i s + +/-- The realized conjugate derivative symbols of a fermionic species. -/ +noncomputable def conjFermionSymbol (i : T.FermionSpecies) (s : Multiset (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (ConjModule (T.FermionValue i)) →ₗ[ℂ] B := + h.toAlgHom.toLinearMap ∘ₗ T.conjFermionSymbol i s + +/-- The realized derivative symbols of a bosonic species. -/ +noncomputable def bosonSymbol (j : T.BosonSpecies) (s : Multiset (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (T.BosonValue j) →ₗ[ℂ] B := + h.toAlgHom.toLinearMap ∘ₗ T.bosonSymbol j s + +/-- The realized conjugate derivative symbols of a bosonic species. -/ +noncomputable def conjBosonSymbol (j : T.BosonSpecies) (s : Multiset (Fin 1 ⊕ Fin 3)) : + Module.Dual ℂ (ConjModule (T.BosonValue j)) →ₗ[ℂ] B := + h.toAlgHom.toLinearMap ∘ₗ T.conjBosonSymbol j s + +/-- The realized covariant tower of a fermionic species is the covariant tower of its + realized symbols, computed against the realized gauge-boson symbols. No derivative + operator on `B` is involved: both sides are the same finite algebraic expression. -/ +lemma toAlgHom_covDerivFermion (i : T.FermionSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (T.FermionValue i)) : + h.toAlgHom (T.covDerivFermion i l φ) + = GaugeAlgebraRealization.covDerivIter h.gaugeRealization.A (T.fermion i).repAlgebra + (h.fermionSymbol i) n l 0 φ := + (LinearMap.congr_fun (congrFun (GaugeAlgebraRealization.covDerivIter_map + h.toAlgHom.toLinearMap (map_mul h.toAlgHom) T.gaugeRealization.A (T.fermion i).repAlgebra + (T.fermionSymbol i) n l) 0) φ).symm + +lemma toAlgHom_covDerivConjFermion (i : T.FermionSpecies) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule (T.FermionValue i))) : + h.toAlgHom (T.covDerivConjFermion i l φ) + = GaugeAlgebraRealization.covDerivIter h.gaugeRealization.A + (LocalGaugeData.actionConj (T.fermion i).repAlgebra) (h.conjFermionSymbol i) n l 0 φ := + (LinearMap.congr_fun (congrFun (GaugeAlgebraRealization.covDerivIter_map + h.toAlgHom.toLinearMap (map_mul h.toAlgHom) T.gaugeRealization.A + (LocalGaugeData.actionConj (T.fermion i).repAlgebra) (T.conjFermionSymbol i) n l) 0) φ).symm + +lemma toAlgHom_covDerivBoson (j : T.BosonSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (T.BosonValue j)) : + h.toAlgHom (T.covDerivBoson j l φ) + = GaugeAlgebraRealization.covDerivIter h.gaugeRealization.A (T.boson j).repAlgebra + (h.bosonSymbol j) n l 0 φ := + (LinearMap.congr_fun (congrFun (GaugeAlgebraRealization.covDerivIter_map + h.toAlgHom.toLinearMap (map_mul h.toAlgHom) T.gaugeRealization.A (T.boson j).repAlgebra + (T.bosonSymbol j) n l) 0) φ).symm + +lemma toAlgHom_covDerivConjBoson (j : T.BosonSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule (T.BosonValue j))) : + h.toAlgHom (T.covDerivConjBoson j l φ) + = GaugeAlgebraRealization.covDerivIter h.gaugeRealization.A + (LocalGaugeData.actionConj (T.boson j).repAlgebra) (h.conjBosonSymbol j) n l 0 φ := + (LinearMap.congr_fun (congrFun (GaugeAlgebraRealization.covDerivIter_map + h.toAlgHom.toLinearMap (map_mul h.toAlgHom) T.gaugeRealization.A + (LocalGaugeData.actionConj (T.boson j).repAlgebra) (T.conjBosonSymbol j) n l) 0) φ).symm + +end Realization + +/-! + +## E. Equivariant assignments + +-/ + +/-- An algebra map carries an affine combination `x + z • 1` to the same combination of + the image, the scalar shift of the connection law being an algebra element. -/ +lemma map_add_smul_one {A B : Type*} [Semiring A] [Algebra ℂ A] [Semiring B] [Algebra ℂ B] + (f : A →ₐ[ℂ] B) (x : A) (z : ℂ) : f (x + z • (1 : A)) = f x + z • (1 : B) := by + rw [← Algebra.algebraMap_eq_smul_one, map_add, AlgHom.commutes, + Algebra.algebraMap_eq_smul_one] + +/-- The generator-level transformation laws of an assignment: each matter species + transforms by the jet action of its own component space, and the connection generators + transform affinely, by the transport of the inverse jet plus its Maurer–Cartan shift. + The Lorentz laws are all linear. These are the laws the generators of `J(T)` themselves + satisfy. -/ +structure Assignment.IsEquivariant {B : Type} [Ring B] [Algebra ℂ B] (d : T.Assignment B) + (repJet : Representation ℂ GJ B) (repLorentz : Representation ℂ SL(2,ℂ) B) : Prop where + /-- A jet acts on the generators of a fermionic species by the action of its component + space. -/ + repJet_fermion : ∀ (U : GJ) (i : T.FermionSpecies) (x : JetComponentSpace (T.fermion i)), + repJet U (d.fermion i x) = d.fermion i (JetComponentSpace.repJet (T.fermion i) U x) + /-- A jet acts on the generators of a bosonic species by the action of its component + space. -/ + repJet_boson : ∀ (U : GJ) (j : T.BosonSpecies) (y : JetComponentSpace (T.boson j)), + repJet U (d.boson j y) = d.boson j (JetComponentSpace.repJet (T.boson j) U y) + /-- A jet acts affinely on the connection generators. -/ + repJet_connection : ∀ (U : GJ) (v : GaugeBoson.JetComponentSpace 𝔤), + repJet U (d.connection v) = d.connection (LocalGaugeFieldAlgebra.transport jets U⁻¹ v) + + (LocalGaugeFieldAlgebra.mcShift jets U⁻¹ v : ℂ) • (1 : B) + /-- A Lorentz transformation acts on the generators of a fermionic species by the action + of its component space. -/ + repLorentz_fermion : ∀ (Λ : SL(2,ℂ)) (i : T.FermionSpecies) + (x : JetComponentSpace (T.fermion i)), repLorentz Λ (d.fermion i x) + = d.fermion i (JetComponentSpace.repLorentzGroup (T.fermion i) Λ x) + /-- A Lorentz transformation acts on the generators of a bosonic species by the action of + its component space. -/ + repLorentz_boson : ∀ (Λ : SL(2,ℂ)) (j : T.BosonSpecies) + (y : JetComponentSpace (T.boson j)), repLorentz Λ (d.boson j y) + = d.boson j (JetComponentSpace.repLorentzGroup (T.boson j) Λ y) + /-- A Lorentz transformation acts linearly on the connection generators. -/ + repLorentz_connection : ∀ (Λ : SL(2,ℂ)) (v : GaugeBoson.JetComponentSpace 𝔤), + repLorentz Λ (d.connection v) + = d.connection (GaugeBoson.JetComponentSpace.repLorentzGroup 𝔤 Λ v) + +namespace Assignment + +variable {B : Type} [Ring B] [Algebra ℂ B] {repJet : Representation ℂ GJ B} + {repLorentz : Representation ℂ SL(2,ℂ) B} + +/-- The assignment of a realization is equivariant: the laws are those of the generators of + `J(T)`, transported along the map. -/ +lemma _root_.GaugeFieldData.Realization.toAssignment_isEquivariant + (h : Realization T B repJet repLorentz) : + h.toAssignment.IsEquivariant repJet repLorentz where + repJet_fermion U i x := + (h.map_repJet U (T.ιFermion i x)).symm.trans + (congrArg h.toAlgHom (repJet_ιFermion U i x)) + repJet_boson U j y := + (h.map_repJet U (T.ιBoson j y)).symm.trans (congrArg h.toAlgHom (repJet_ιBoson U j y)) + repJet_connection U v := + (h.map_repJet U (T.ιConnection v)).symm.trans + ((congrArg h.toAlgHom (repJet_ιConnection_affine U v)).trans + (map_add_smul_one h.toAlgHom _ _)) + repLorentz_fermion Λ i x := + (h.map_repLorentz Λ (T.ιFermion i x)).symm.trans + (congrArg h.toAlgHom (repLorentzGroup_ιFermion Λ i x)) + repLorentz_boson Λ j y := + (h.map_repLorentz Λ (T.ιBoson j y)).symm.trans + (congrArg h.toAlgHom (repLorentzGroup_ιBoson Λ j y)) + repLorentz_connection Λ v := + (h.map_repLorentz Λ (T.ιConnection v)).symm.trans + (congrArg h.toAlgHom (repLorentzGroup_ιConnection_eq Λ v)) + +/-- The lift of an equivariant assignment intertwines the jet gauge actions, as an equality + of algebra maps: both sides agree on the generators of every species and on the + connection generators. -/ +lemma IsEquivariant.lift_comp_repJetAlgHom {d : T.Assignment B} + (hd : d.IsEquivariant repJet repLorentz) + (hJ : ∀ (U : GJ) (b₁ b₂ : B), repJet U (b₁ * b₂) = repJet U b₁ * repJet U b₂) (U : GJ) : + d.lift.comp (T.repJetAlgHom U) = (repJet.toAlgHom hJ U).comp d.lift := by + refine algHom_ext (fun i y => ?_) (fun j y => ?_) (fun v => ?_) + · rw [AlgHom.comp_apply, repJetAlgHom_ιFermion, lift_ιFermion, AlgHom.comp_apply, + lift_ιFermion, Representation.toAlgHom_apply, hd.repJet_fermion] + · rw [AlgHom.comp_apply, repJetAlgHom_ιBoson, lift_ιBoson, AlgHom.comp_apply, + lift_ιBoson, Representation.toAlgHom_apply, hd.repJet_boson] + · show d.lift (T.repJet U (T.ιConnection v)) = repJet U (d.lift (T.ιConnection v)) + rw [repJet_ιConnection_affine, map_add_smul_one d.lift, lift_ιConnection, + lift_ιConnection, hd.repJet_connection] + +/-- The lift of an equivariant assignment intertwines the Lorentz actions, as an equality of + algebra maps. -/ +lemma IsEquivariant.lift_comp_repLorentzAlgHom {d : T.Assignment B} + (hd : d.IsEquivariant repJet repLorentz) + (hL : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂) (Λ : SL(2,ℂ)) : + d.lift.comp (T.repLorentzAlgHom Λ) = (repLorentz.toAlgHom hL Λ).comp d.lift := by + refine algHom_ext (fun i y => ?_) (fun j y => ?_) (fun v => ?_) + · rw [AlgHom.comp_apply, repLorentzAlgHom_ιFermion, lift_ιFermion, AlgHom.comp_apply, + lift_ιFermion, Representation.toAlgHom_apply, hd.repLorentz_fermion] + · rw [AlgHom.comp_apply, repLorentzAlgHom_ιBoson, lift_ιBoson, AlgHom.comp_apply, + lift_ιBoson, Representation.toAlgHom_apply, hd.repLorentz_boson] + · show d.lift (T.repLorentzGroup Λ (T.ιConnection v)) + = repLorentz Λ (d.lift (T.ιConnection v)) + rw [repLorentzGroup_ιConnection_eq, lift_ιConnection, lift_ιConnection, + hd.repLorentz_connection] + +/-- An equivariant assignment lifts to a realization: each equivariance law is an equality + of two algebra maps agreeing on the generators, so it follows from the generator laws by + the universal property. -/ +noncomputable def IsEquivariant.toRealization {d : T.Assignment B} + (hd : d.IsEquivariant repJet repLorentz) + (hJ : ∀ (U : GJ) (b₁ b₂ : B), repJet U (b₁ * b₂) = repJet U b₁ * repJet U b₂) + (hL : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂) : + Realization T B repJet repLorentz where + toAlgHom := d.lift + map_repJet U x := AlgHom.congr_fun (hd.lift_comp_repJetAlgHom hJ U) x + map_repLorentz Λ x := AlgHom.congr_fun (hd.lift_comp_repLorentzAlgHom hL Λ) x + repJet_mul := hJ + repLorentz_mul := hL + +@[simp] +lemma IsEquivariant.toRealization_toAlgHom {d : T.Assignment B} + (hd : d.IsEquivariant repJet repLorentz) + (hJ : ∀ (U : GJ) (b₁ b₂ : B), repJet U (b₁ * b₂) = repJet U b₁ * repJet U b₂) + (hL : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂) : + (hd.toRealization hJ hL).toAlgHom = d.lift := rfl + +end Assignment + +variable (T) in +/-- The mapping-out universal property of `J(T)` in equivariant form: for target actions by + algebra endomorphisms, realizations of `T` in `B` are exactly the equivariant compatible + assignments of its generators. -/ +noncomputable def realizationEquivAssignment {B : Type} [Ring B] [Algebra ℂ B] + {repJet : Representation ℂ GJ B} {repLorentz : Representation ℂ SL(2,ℂ) B} + (hJ : ∀ (U : GJ) (b₁ b₂ : B), repJet U (b₁ * b₂) = repJet U b₁ * repJet U b₂) + (hL : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂) : + {d : T.Assignment B // d.IsEquivariant repJet repLorentz} + ≃ Realization T B repJet repLorentz where + toFun d := d.2.toRealization hJ hL + invFun h := ⟨h.toAssignment, h.toAssignment_isEquivariant⟩ + left_inv d := Subtype.ext ((liftEquiv T B).symm_apply_apply d.1) + right_inv h := Realization.ext ((liftEquiv T B).apply_symm_apply h.toAlgHom) + +end GaugeFieldData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/CovariantDeriv.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/CovariantDeriv.lean index f4b04d6d8..ac007b0d2 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/CovariantDeriv.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/CovariantDeriv.lean @@ -660,6 +660,88 @@ theorem adjoin_symbols_eq_adjoin_covDerivIter (act : 𝔤 →ₗ[ℝ] V →ₗ[ · exact Algebra.subset_adjoin (Or.inl ⟨s, μ, ψ, rfl⟩) · exact covDerivIter_mem_adjoin_symbols act F n l 0 φ +/-! + +## Naturality in the algebra + +The matter analogue of `bracketFam_map` and `iteratedCovDerivAdjoint_map`: a +multiplicative linear map into another algebra carries the derived action, and hence +the whole covariant matter tower, to the tower of the image families. The derived +action is a finite sum of products of components, so only multiplicativity is needed; +no derivative operator on the target is involved. + +-/ + +section Naturality + +variable {B' : Type} [Ring B'] [Algebra ℂ B'] (Φ : B →ₗ[ℂ] B') + (hΦ : ∀ b₁ b₂, Φ (b₁ * b₂) = Φ b₁ * Φ b₂) + +include hΦ + +/-- The action of an adjoint-indexed family on a matter family is natural in the + algebra. -/ +lemma actionFam_map (act : 𝔤 →ₗ[ℝ] V →ₗ[ℂ] V) (f : Module.Dual ℝ 𝔤 →ₗ[ℝ] B) + (g : Module.Dual ℂ V →ₗ[ℂ] B) : + actionFam act (Φ.restrictScalars ℝ ∘ₗ f) (Φ ∘ₗ g) = Φ ∘ₗ actionFam act f g := by + refine LinearMap.ext fun φ => ?_ + rw [actionFam, actionFam, + dualPairEquiv_symm_eq_sum (Module.finBasis ℝ 𝔤) (Φ.restrictScalars ℝ ∘ₗ f), + dualPairEquivC_symm_eq_sum (Module.finBasis ℂ V) (Φ ∘ₗ g), + 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, + LinearMap.comp_apply, LinearMap.coe_restrictScalars, map_smul, hΦ] + +/-- The derived action family is natural in the algebra. -/ +lemma actionFamConv_map + (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)) : + actionFamConv (fun p σ => Φ.restrictScalars ℝ ∘ₗ A p σ) act ρ (fun p => Φ ∘ₗ F p) s + = Φ ∘ₗ actionFamConv A act ρ F s := by + refine LinearMap.ext fun φ => ?_ + rw [LinearMap.comp_apply, actionFamConv, actionFamConv, Multiset.sum_linearMap_apply, + Multiset.sum_linearMap_apply, Multiset.map_map, Multiset.map_map, map_multiset_sum, + Multiset.map_map] + refine congrArg Multiset.sum (Multiset.map_congr rfl fun p _ => ?_) + simp only [Function.comp_apply] + rw [actionFam_map Φ hΦ] + rfl + +/-- The covariant derivative of a matter family is natural in the algebra. -/ +lemma covDerivAction_map + (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)) : + covDerivAction (fun p σ => Φ.restrictScalars ℝ ∘ₗ A p σ) act (fun p => Φ ∘ₗ F p) ρ s + = Φ ∘ₗ covDerivAction A act F ρ s := by + rw [covDerivAction, covDerivAction, actionFamConv_map Φ hΦ, LinearMap.comp_add] + +/-- The iterated covariant derivative of a matter family is natural in the algebra: the + image of the tower is the tower of the image families, at every ordered tuple of + directions and every derivative multiset. -/ +lemma covDerivIter_map + (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 : ℕ) (l : Fin n → (Fin 1 ⊕ Fin 3)) : + covDerivIter (fun p σ => Φ.restrictScalars ℝ ∘ₗ A p σ) act (fun p => Φ ∘ₗ F p) n l + = fun s => Φ ∘ₗ covDerivIter A act F n l s := by + induction n with + | zero => rfl + | succ n ih => + funext s + show covDerivAction (fun p σ => Φ.restrictScalars ℝ ∘ₗ A p σ) act + (covDerivIter (fun p σ => Φ.restrictScalars ℝ ∘ₗ A p σ) act (fun p => Φ ∘ₗ F p) n + fun i => l i.succ) (l 0) s + = Φ ∘ₗ covDerivAction A act (covDerivIter A act F n fun i => l i.succ) (l 0) s + rw [ih, covDerivAction_map Φ hΦ] + +end Naturality + end Action diff --git a/Physlib/Mathematics/AlgebraRepresentation.lean b/Physlib/Mathematics/AlgebraRepresentation.lean index 2374c1f67..4ed1fd5af 100644 --- a/Physlib/Mathematics/AlgebraRepresentation.lean +++ b/Physlib/Mathematics/AlgebraRepresentation.lean @@ -36,12 +36,14 @@ space is in particular a representation on the underlying real vector space. - `Representation.tprod_apply_mul` : multiplicativity on a tensor product. - `Representation.restrictSubalgebra` : the restriction to an invariant subalgebra. - `Representation.restrictScalars` : the restriction of scalars. +- `Representation.toAlgHom` : a multiplicative representation of a group as algebra maps. ## iii. Table of contents - A. Tensor products of multiplicative representations - B. Restriction to an invariant subalgebra - C. Restriction of scalars +- D. Multiplicative representations as algebra maps -/ @@ -150,4 +152,43 @@ lemma restrictScalars_apply (R : Type*) {S G V : Type*} [CommSemiring R] [CommSe [Monoid G] [AddCommMonoid V] [Module R V] [Module S V] [LinearMap.CompatibleSMul V V R S] (ρ : Representation S G V) (g : G) (x : V) : ρ.restrictScalars R g x = ρ g x := rfl +/-! + +## D. Multiplicative representations as algebra maps + +-/ + +section Multiplicative + +variable {k G A : Type*} [CommSemiring k] [Group G] [Ring A] [Algebra k A] + (ρ : Representation k G A) (hρ : ∀ (g : G) (x y : A), ρ g (x * y) = ρ g x * ρ g y) + +include hρ in +/-- A representation of a group acting by multiplicative maps preserves the unit. The + action of `g` is surjective, its inverse being the action of `g⁻¹`, so `ρ g 1` is a left + unit on the whole algebra. -/ +lemma apply_one_of_mul (g : G) : ρ g 1 = 1 := by + have hsurj (b : A) : ρ g (ρ g⁻¹ b) = b := by + rw [← Module.End.mul_apply, ← map_mul ρ, mul_inv_cancel, map_one, Module.End.one_apply] + have key (b : A) : ρ g 1 * b = b := by + conv_lhs => rw [← hsurj b, ← hρ, one_mul] + rw [hsurj] + simpa using key 1 + +/-- A representation of a group acting by multiplicative maps acts by algebra + endomorphisms. -/ +noncomputable def toAlgHom (g : G) : A →ₐ[k] A where + toFun := ρ g + map_one' := apply_one_of_mul ρ hρ g + map_mul' := hρ g + map_zero' := map_zero (ρ g) + map_add' := map_add (ρ g) + commutes' r := by + rw [Algebra.algebraMap_eq_smul_one, map_smul, apply_one_of_mul ρ hρ g] + +@[simp] +lemma toAlgHom_apply (g : G) (x : A) : ρ.toAlgHom hρ g x = ρ g x := rfl + +end Multiplicative + end Representation From 901261721a5f40f73d49d63e65a4159466a8d02a Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Sun, 13 Sep 2026 21:26:46 +0400 Subject: [PATCH 327/367] Refactor: a more clever approach to algebra realization --- .../Realization.lean | 66 ++++---- .../LocalGaugeFieldAlgebra/Realization.lean | 102 +++++-------- .../LocalCovFieldAlgebra/Realization.lean | 65 ++++---- .../LocalFieldAlgebra/Realization.lean | 79 +++++----- .../Mathematics/AlgebraRepresentation.lean | 141 ++++++++++++++++++ 5 files changed, 294 insertions(+), 159 deletions(-) diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeCovFieldAlgebra/Realization.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeCovFieldAlgebra/Realization.lean index f79ee1c51..34ed5376d 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeCovFieldAlgebra/Realization.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeCovFieldAlgebra/Realization.lean @@ -61,23 +61,13 @@ namespace LocalGaugeCovFieldAlgebra /-- A real algebra `B` carrying the covariant gauge-boson tower of the package `jets`: a real algebra map out of the covariant field algebra, equivariant for the ordinary gauge - group and the Lorentz group, both acting on the whole of `B` by algebra endomorphisms. -/ -@[ext] -structure Realization (jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J) (B : Type) [Ring B] [Algebra ℝ B] - (repGauge : Representation ℝ G₀ B) (repLorentz : Representation ℝ SL(2,ℂ) B) where - /-- The algebra map out of the covariant field algebra. -/ - toAlgHom : LocalGaugeCovFieldAlgebra 𝔤 →ₐ[ℝ] B - /-- The map is equivariant for the ordinary gauge group. -/ - map_repValue : ∀ (g : G₀) (x : LocalGaugeCovFieldAlgebra 𝔤), - toAlgHom (repValue jets g x) = repGauge g (toAlgHom x) - /-- The map is equivariant for the Lorentz group. -/ - map_repLorentz : ∀ (Λ : SL(2,ℂ)) (x : LocalGaugeCovFieldAlgebra 𝔤), - toAlgHom (repLorentzGroup 𝔤 Λ x) = repLorentz Λ (toAlgHom x) - /-- The ordinary gauge group acts on the whole of `B` by algebra endomorphisms. -/ - repGauge_mul : ∀ (g : G₀) (b₁ b₂ : B), repGauge g (b₁ * b₂) = repGauge g b₁ * repGauge g b₂ - /-- The Lorentz group acts on the whole of `B` by algebra endomorphisms. -/ - repLorentz_mul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), - repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂ + group and the Lorentz group, both acting on the whole of `B` by algebra endomorphisms. It + is built from the fields `toAlgHom`, `map_fst`, `map_snd`, `fst_mul`, `snd_mul` of + `Representation.EquivariantAlgHom`, which the lemmas `map_repValue`, `map_repLorentz`, + `repGauge_mul` and `repLorentz_mul` name. -/ +abbrev Realization (jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J) (B : Type) [Ring B] [Algebra ℝ B] + (repGauge : Representation ℝ G₀ B) (repLorentz : Representation ℝ SL(2,ℂ) B) := + Representation.EquivariantAlgHom (repValue jets) repGauge (repLorentzGroup 𝔤) repLorentz namespace Realization @@ -87,18 +77,36 @@ variable {B : Type} [Ring B] [Algebra ℝ B] {repGauge : Representation ℝ G₀ variable (jets) in /-- The covariant field algebra realized in itself, by the identity. -/ noncomputable def id : Realization jets (LocalGaugeCovFieldAlgebra 𝔤) (repValue jets) - (repLorentzGroup 𝔤) where - toAlgHom := AlgHom.id ℝ _ - map_repValue _ _ := rfl - map_repLorentz _ _ := rfl - repGauge_mul := repValue_apply_mul - repLorentz_mul := repLorentzGroup_apply_mul + (repLorentzGroup 𝔤) := + Representation.EquivariantAlgHom.id _ _ repValue_apply_mul repLorentzGroup_apply_mul @[simp] lemma id_toAlgHom : (id jets).toAlgHom = AlgHom.id ℝ (LocalGaugeCovFieldAlgebra 𝔤) := rfl variable (k : Realization jets B repGauge repLorentz) +/-- The map is equivariant for the ordinary gauge group. -/ +lemma map_repValue (g : G₀) (x : LocalGaugeCovFieldAlgebra 𝔤) : + k.toAlgHom (repValue jets g x) = repGauge g (k.toAlgHom x) := + k.map_fst g x + +/-- The map is equivariant for the Lorentz group. -/ +lemma map_repLorentz (Λ : SL(2,ℂ)) (x : LocalGaugeCovFieldAlgebra 𝔤) : + k.toAlgHom (repLorentzGroup 𝔤 Λ x) = repLorentz Λ (k.toAlgHom x) := + k.map_snd Λ x + +include k in +/-- The ordinary gauge group acts on the whole of `B` by algebra endomorphisms. -/ +lemma repGauge_mul (g : G₀) (b₁ b₂ : B) : + repGauge g (b₁ * b₂) = repGauge g b₁ * repGauge g b₂ := + k.fst_mul g b₁ b₂ + +include k in +/-- The Lorentz group acts on the whole of `B` by algebra endomorphisms. -/ +lemma repLorentz_mul (Λ : SL(2,ℂ)) (b₁ b₂ : B) : + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂ := + k.snd_mul Λ b₁ b₂ + /-! ## B. The covariant tower of a realization @@ -129,7 +137,7 @@ lemma commute_F (l l' : List (Fin 1 ⊕ Fin 3)) (μ ν μ' ν' : Fin 1 ⊕ Fin 3 lemma ext_F {k₁ k₂ : Realization jets B repGauge repLorentz} (hF : ∀ (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), k₁.F l μ ν φ = k₂.F l μ ν φ) : k₁ = k₂ := - Realization.ext (algHom_ext hF) + Representation.EquivariantAlgHom.ext (algHom_ext hF) /-- The gauge law of the covariant tower: the adjoint index rotates through the dual adjoint action of the inverse. -/ @@ -179,12 +187,10 @@ variable {B : Type} [Ring B] [Algebra ℝ B] {repJet : Representation ℝ GJ B} field algebra, along the inclusion; the ordinary gauge group acts on the target as the constant jets. -/ noncomputable def restrict : - LocalGaugeCovFieldAlgebra.Realization jets B (repJet.comp jets.ofConstant) repLorentz where - toAlgHom := h.toAlgHom.comp (LocalGaugeCovFieldAlgebra 𝔤).val - map_repValue g x := h.map_repJet (jets.ofConstant g) x - map_repLorentz Λ x := h.map_repLorentz Λ x - repGauge_mul g := h.repJet_mul (jets.ofConstant g) - repLorentz_mul := h.repLorentz_mul + LocalGaugeCovFieldAlgebra.Realization jets B (repJet.comp jets.ofConstant) repLorentz := + (h.restrictSubalgebra (LocalGaugeCovFieldAlgebra 𝔤) + (fun U _ hx => LocalGaugeCovFieldAlgebra.repJet_mem U hx) + (fun Λ _ hx => LocalGaugeCovFieldAlgebra.repLorentzGroup_mem Λ hx)).compFst jets.ofConstant @[simp] lemma restrict_toAlgHom_apply (x : LocalGaugeCovFieldAlgebra 𝔤) : diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeFieldAlgebra/Realization.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeFieldAlgebra/Realization.lean index 0f09f4806..31d33be36 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeFieldAlgebra/Realization.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeFieldAlgebra/Realization.lean @@ -63,23 +63,14 @@ namespace LocalGaugeFieldAlgebra /-- A real algebra `B` carrying the gauge bosons of the package `jets`: a real algebra map out of the local gauge field algebra, equivariant for the jet gauge group and the Lorentz - group, both acting on the whole of `B` by algebra endomorphisms. -/ -@[ext] -structure Realization (jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J) (B : Type) [Ring B] [Algebra ℝ B] - (repJet : Representation ℝ GJ B) (repLorentz : Representation ℝ SL(2,ℂ) B) where - /-- The algebra map out of the local gauge field algebra. -/ - toAlgHom : LocalGaugeFieldAlgebra 𝔤 →ₐ[ℝ] B - /-- The map is equivariant for the jet gauge group. -/ - map_repJet : ∀ (U : GJ) (x : LocalGaugeFieldAlgebra 𝔤), - toAlgHom (LocalGaugeFieldAlgebra.repJet jets U x) = repJet U (toAlgHom x) - /-- The map is equivariant for the Lorentz group. -/ - map_repLorentz : ∀ (Λ : SL(2,ℂ)) (x : LocalGaugeFieldAlgebra 𝔤), - toAlgHom (LocalGaugeFieldAlgebra.repLorentzGroup 𝔤 Λ x) = repLorentz Λ (toAlgHom x) - /-- The jet gauge group acts on the whole of `B` by algebra endomorphisms. -/ - repJet_mul : ∀ (U : GJ) (b₁ b₂ : B), repJet U (b₁ * b₂) = repJet U b₁ * repJet U b₂ - /-- The Lorentz group acts on the whole of `B` by algebra endomorphisms. -/ - repLorentz_mul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), - repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂ + group, both acting on the whole of `B` by algebra endomorphisms. It is built from the + fields `toAlgHom`, `map_fst`, `map_snd`, `fst_mul`, `snd_mul` of + `Representation.EquivariantAlgHom`, which the lemmas `map_repJet`, `map_repLorentz`, + `repJet_mul` and `repLorentz_mul` name. -/ +abbrev Realization (jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J) (B : Type) [Ring B] [Algebra ℝ B] + (repJet : Representation ℝ GJ B) (repLorentz : Representation ℝ SL(2,ℂ) B) := + Representation.EquivariantAlgHom (LocalGaugeFieldAlgebra.repJet jets) repJet + (LocalGaugeFieldAlgebra.repLorentzGroup 𝔤) repLorentz namespace Realization @@ -91,18 +82,35 @@ variable {B : Type} [Ring B] [Algebra ℝ B] {repJet : Representation ℝ GJ B} variable (jets) in /-- The local gauge field algebra realized in itself, by the identity. -/ noncomputable def id : Realization jets (LocalGaugeFieldAlgebra 𝔤) - (LocalGaugeFieldAlgebra.repJet jets) (repLorentzGroup 𝔤) where - toAlgHom := AlgHom.id ℝ _ - map_repJet _ _ := rfl - map_repLorentz _ _ := rfl - repJet_mul := repJet_apply_mul - repLorentz_mul := repLorentzGroup_apply_mul + (LocalGaugeFieldAlgebra.repJet jets) (repLorentzGroup 𝔤) := + Representation.EquivariantAlgHom.id _ _ repJet_apply_mul repLorentzGroup_apply_mul @[simp] lemma id_toAlgHom : (id jets).toAlgHom = AlgHom.id ℝ (LocalGaugeFieldAlgebra 𝔤) := rfl variable (h : Realization jets B repJet repLorentz) +/-- The map is equivariant for the jet gauge group. -/ +lemma map_repJet (U : GJ) (x : LocalGaugeFieldAlgebra 𝔤) : + h.toAlgHom (LocalGaugeFieldAlgebra.repJet jets U x) = repJet U (h.toAlgHom x) := + h.map_fst U x + +/-- The map is equivariant for the Lorentz group. -/ +lemma map_repLorentz (Λ : SL(2,ℂ)) (x : LocalGaugeFieldAlgebra 𝔤) : + h.toAlgHom (LocalGaugeFieldAlgebra.repLorentzGroup 𝔤 Λ x) = repLorentz Λ (h.toAlgHom x) := + h.map_snd Λ x + +include h in +/-- The jet gauge group acts on the whole of `B` by algebra endomorphisms. -/ +lemma repJet_mul (U : GJ) (b₁ b₂ : B) : repJet U (b₁ * b₂) = repJet U b₁ * repJet U b₂ := + h.fst_mul U b₁ b₂ + +include h in +/-- The Lorentz group acts on the whole of `B` by algebra endomorphisms. -/ +lemma repLorentz_mul (Λ : SL(2,ℂ)) (b₁ b₂ : B) : + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂ := + h.snd_mul Λ b₁ b₂ + /-! ## B. The derivative symbols of a realization @@ -129,7 +137,7 @@ lemma commute_A (p q : Multiset (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) lemma ext_A {h₁ h₂ : Realization jets B repJet repLorentz} (hA : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤), h₁.A s μ φ = h₂.A s μ φ) : h₁ = h₂ := - Realization.ext (algHom_ext hA) + Representation.EquivariantAlgHom.ext (algHom_ext hA) /-- The gauge law: a jet `U` acts on `∂_s A_μ^φ` by the Leibniz convolution of the dual adjoint Taylor coefficients of `U⁻¹` against lower symbols, plus the base-point value of @@ -195,36 +203,6 @@ section ComplexTarget variable {B : Type} [Ring B] [Algebra ℂ B] {repJet : Representation ℂ GJ B} {repLorentz : Representation ℂ SL(2,ℂ) B} -/-- The complexification of a jet-equivariant real algebra map is equivariant for the - complexified jet action. -/ -lemma liftEquiv_complexRepJet (f : LocalGaugeFieldAlgebra 𝔤 →ₐ[ℝ] B) - (hf : ∀ (U : GJ) (x : LocalGaugeFieldAlgebra 𝔤), - f (LocalGaugeFieldAlgebra.repJet jets U x) = repJet U (f x)) - (U : GJ) (x : ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤) : - AlgHom.liftEquiv ℝ ℂ (LocalGaugeFieldAlgebra 𝔤) B f (complexRepJet jets U x) - = repJet U (AlgHom.liftEquiv ℝ ℂ (LocalGaugeFieldAlgebra 𝔤) B f x) := by - induction x using TensorProduct.induction_on with - | zero => rw [map_zero, map_zero, map_zero] - | add x y hx hy => rw [map_add, map_add, hx, hy, map_add, map_add] - | tmul z a => - rw [complexRepJet_tmul, AlgHom.liftEquiv_tmul, AlgHom.liftEquiv_tmul, map_smul (repJet U), - hf] - -/-- The complexification of a Lorentz-equivariant real algebra map is equivariant for the - complexified Lorentz action. -/ -lemma liftEquiv_complexRepLorentzGroup (f : LocalGaugeFieldAlgebra 𝔤 →ₐ[ℝ] B) - (hf : ∀ (Λ : SL(2,ℂ)) (x : LocalGaugeFieldAlgebra 𝔤), - f (LocalGaugeFieldAlgebra.repLorentzGroup 𝔤 Λ x) = repLorentz Λ (f x)) - (Λ : SL(2,ℂ)) (x : ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤) : - AlgHom.liftEquiv ℝ ℂ (LocalGaugeFieldAlgebra 𝔤) B f (complexRepLorentzGroup 𝔤 Λ x) - = repLorentz Λ (AlgHom.liftEquiv ℝ ℂ (LocalGaugeFieldAlgebra 𝔤) B f x) := by - induction x using TensorProduct.induction_on with - | zero => rw [map_zero, map_zero, map_zero] - | add x y hx hy => rw [map_add, map_add, hx, hy, map_add, map_add] - | tmul z a => - rw [complexRepLorentzGroup_tmul, AlgHom.liftEquiv_tmul, AlgHom.liftEquiv_tmul, - map_smul (repLorentz Λ), hf] - /-- The complexification of a real realization in a complex algebra, by `AlgHom.liftEquiv`; the symbols are unchanged. -/ noncomputable def toGaugeAlgebraRealization @@ -235,8 +213,10 @@ noncomputable def toGaugeAlgebraRealization A_eq s μ φ := by rw [gaugeField_eq_one_tmul_derivA, AlgHom.liftEquiv_tmul, one_smul] rfl - map_repJet := liftEquiv_complexRepJet h.toAlgHom h.map_repJet - map_repLorentz := liftEquiv_complexRepLorentzGroup h.toAlgHom h.map_repLorentz + map_repJet := Representation.liftEquiv_baseChange h.toAlgHom + (LocalGaugeFieldAlgebra.repJet jets) repJet h.map_repJet + map_repLorentz := Representation.liftEquiv_baseChange h.toAlgHom + (LocalGaugeFieldAlgebra.repLorentzGroup 𝔤) repLorentz h.map_repLorentz repJet_mul := h.repJet_mul repLorentz_mul := h.repLorentz_mul @@ -257,16 +237,16 @@ noncomputable def _root_.GaugeAlgebraRealization.toRealization (h : GaugeAlgebraRealization jets B repJet repLorentz) : Realization jets B (repJet.restrictScalars ℝ) (repLorentz.restrictScalars ℝ) where toAlgHom := (AlgHom.liftEquiv ℝ ℂ (LocalGaugeFieldAlgebra 𝔤) B).symm h.toAlgHom - map_repJet U x := by + map_fst U x := by show h.toAlgHom ((1 : ℂ) ⊗ₜ[ℝ] LocalGaugeFieldAlgebra.repJet jets U x) = repJet U (h.toAlgHom ((1 : ℂ) ⊗ₜ[ℝ] x)) rw [← complexRepJet_tmul, h.map_repJet] - map_repLorentz Λ x := by + map_snd Λ x := by show h.toAlgHom ((1 : ℂ) ⊗ₜ[ℝ] LocalGaugeFieldAlgebra.repLorentzGroup 𝔤 Λ x) = repLorentz Λ (h.toAlgHom ((1 : ℂ) ⊗ₜ[ℝ] x)) rw [← complexRepLorentzGroup_tmul, h.map_repLorentz] - repJet_mul := h.repJet_mul - repLorentz_mul := h.repLorentz_mul + fst_mul := h.repJet_mul + snd_mul := h.repLorentz_mul @[simp] lemma _root_.GaugeAlgebraRealization.toRealization_toAlgHom_apply @@ -293,7 +273,7 @@ noncomputable def equivGaugeAlgebraRealization : ≃ GaugeAlgebraRealization jets B repJet repLorentz where toFun := toGaugeAlgebraRealization invFun := GaugeAlgebraRealization.toRealization - left_inv h := Realization.ext + left_inv h := Representation.EquivariantAlgHom.ext ((AlgHom.liftEquiv ℝ ℂ (LocalGaugeFieldAlgebra 𝔤) B).symm_apply_apply h.toAlgHom) right_inv h := GaugeAlgebraRealization.ext ((AlgHom.liftEquiv ℝ ℂ (LocalGaugeFieldAlgebra 𝔤) B).apply_symm_apply h.toAlgHom) diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalCovFieldAlgebra/Realization.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalCovFieldAlgebra/Realization.lean index 99815cf47..ce60e2db1 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalCovFieldAlgebra/Realization.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalCovFieldAlgebra/Realization.lean @@ -81,24 +81,13 @@ namespace LocalCovFieldAlgebra algebra map out of the covariant field algebra, equivariant for the ordinary gauge group and the Lorentz group, both acting on the whole of `B` by algebra endomorphisms. The Lorentz action of the source needs `GaugeFieldData.GaugeLorentzCompatible`, which is a - parameter; no other species condition is used. -/ -@[ext] -structure Realization (T : GaugeFieldData jets) (hGL : T.GaugeLorentzCompatible) (B : Type) + parameter; no other species condition is used. It is built from the fields `toAlgHom`, + `map_fst`, `map_snd`, `fst_mul`, `snd_mul` of `Representation.EquivariantAlgHom`, which + the lemmas `map_repValue`, `map_repLorentz`, `repGauge_mul` and `repLorentz_mul` name. -/ +abbrev Realization (T : GaugeFieldData jets) (hGL : T.GaugeLorentzCompatible) (B : Type) [Semiring B] [Algebra ℂ B] (repGauge : Representation ℂ G₀ B) - (repLorentz : Representation ℂ SL(2,ℂ) B) where - /-- The algebra map out of the covariant field algebra. -/ - toAlgHom : ↥T.LocalCovFieldAlgebra →ₐ[ℂ] B - /-- The map is equivariant for the ordinary gauge group. -/ - map_repValue : ∀ (g : G₀) (x : ↥T.LocalCovFieldAlgebra), - toAlgHom (repValue T g x) = repGauge g (toAlgHom x) - /-- The map is equivariant for the Lorentz group. -/ - map_repLorentz : ∀ (Λ : SL(2,ℂ)) (x : ↥T.LocalCovFieldAlgebra), - toAlgHom (repLorentzGroup T hGL Λ x) = repLorentz Λ (toAlgHom x) - /-- The ordinary gauge group acts on the whole of `B` by algebra endomorphisms. -/ - repGauge_mul : ∀ (g : G₀) (b₁ b₂ : B), repGauge g (b₁ * b₂) = repGauge g b₁ * repGauge g b₂ - /-- The Lorentz group acts on the whole of `B` by algebra endomorphisms. -/ - repLorentz_mul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), - repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂ + (repLorentz : Representation ℂ SL(2,ℂ) B) := + Representation.EquivariantAlgHom (repValue T) repGauge (repLorentzGroup T hGL) repLorentz namespace Realization @@ -108,18 +97,36 @@ variable {B : Type} [Semiring B] [Algebra ℂ B] {repGauge : Representation ℂ variable (T hGL) in /-- The covariant field algebra realized in itself, by the identity. -/ noncomputable def id : Realization T hGL (↥T.LocalCovFieldAlgebra) (repValue T) - (repLorentzGroup T hGL) where - toAlgHom := AlgHom.id ℂ _ - map_repValue _ _ := rfl - map_repLorentz _ _ := rfl - repGauge_mul := repValue_apply_mul - repLorentz_mul := repLorentzGroup_apply_mul hGL + (repLorentzGroup T hGL) := + Representation.EquivariantAlgHom.id _ _ repValue_apply_mul (repLorentzGroup_apply_mul hGL) @[simp] lemma id_toAlgHom : (id T hGL).toAlgHom = AlgHom.id ℂ ↥T.LocalCovFieldAlgebra := rfl variable (k : Realization T hGL B repGauge repLorentz) +/-- The map is equivariant for the ordinary gauge group. -/ +lemma map_repValue (g : G₀) (x : ↥T.LocalCovFieldAlgebra) : + k.toAlgHom (repValue T g x) = repGauge g (k.toAlgHom x) := + k.map_fst g x + +/-- The map is equivariant for the Lorentz group. -/ +lemma map_repLorentz (Λ : SL(2,ℂ)) (x : ↥T.LocalCovFieldAlgebra) : + k.toAlgHom (repLorentzGroup T hGL Λ x) = repLorentz Λ (k.toAlgHom x) := + k.map_snd Λ x + +include k in +/-- The ordinary gauge group acts on the whole of `B` by algebra endomorphisms. -/ +lemma repGauge_mul (g : G₀) (b₁ b₂ : B) : + repGauge g (b₁ * b₂) = repGauge g b₁ * repGauge g b₂ := + k.fst_mul g b₁ b₂ + +include k in +/-- The Lorentz group acts on the whole of `B` by algebra endomorphisms. -/ +lemma repLorentz_mul (Λ : SL(2,ℂ)) (b₁ b₂ : B) : + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂ := + k.snd_mul Λ b₁ b₂ + /-! ## B. The covariant towers of a realization @@ -191,7 +198,7 @@ lemma ext_towers {k₁ k₂ : Realization T hGL B repGauge repLorentz} (hφc : ∀ (j : T.BosonSpecies) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule (T.BosonValue j))), k₁.conjBoson j l φ = k₂.conjBoson j l φ) : k₁ = k₂ := - Realization.ext (algHom_ext_towers hF hψ hψc hφ hφc) + Representation.EquivariantAlgHom.ext (algHom_ext_towers hF hψ hψc hφ hφc) /-- The gauge law of the realized field-strength tower: the adjoint index rotates through the dual adjoint action of the inverse. -/ @@ -317,12 +324,10 @@ variable {B : Type} [Ring B] [Algebra ℂ B] {repJet : Representation ℂ GJ B} algebra, along the inclusion; the ordinary gauge group acts on the target through the constant jets. No species condition beyond `hGL` is used. -/ noncomputable def restrict : - LocalCovFieldAlgebra.Realization T hGL B (repJet.comp jets.ofConstant) repLorentz where - toAlgHom := h.toAlgHom.comp T.LocalCovFieldAlgebra.val - map_repValue g x := h.map_repJet (jets.ofConstant g) x - map_repLorentz Λ x := h.map_repLorentz Λ x - repGauge_mul g := h.repJet_mul (jets.ofConstant g) - repLorentz_mul := h.repLorentz_mul + LocalCovFieldAlgebra.Realization T hGL B (repJet.comp jets.ofConstant) repLorentz := + (h.restrictSubalgebra T.LocalCovFieldAlgebra + (fun U _ hx => LocalCovFieldAlgebra.repJet_mem U hx) + (fun Λ _ hx => LocalCovFieldAlgebra.repLorentzGroup_mem hGL Λ hx)).compFst jets.ofConstant @[simp] lemma restrict_toAlgHom_apply (x : ↥T.LocalCovFieldAlgebra) : diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Realization.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Realization.lean index 857339089..7775b62c7 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Realization.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Realization.lean @@ -66,23 +66,14 @@ variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ /-- A complex algebra `B` carrying the fields of the datum `T`: a complex algebra map out of the local field algebra, equivariant for the jet gauge group and the Lorentz group, both acting on the whole of `B` by algebra endomorphisms. No commutativity, injectivity - or surjectivity is assumed, and no derivative operator on `B` is involved. -/ -@[ext] -structure Realization (T : GaugeFieldData jets) (B : Type) [Ring B] [Algebra ℂ B] - (repJet : Representation ℂ GJ B) (repLorentz : Representation ℂ SL(2,ℂ) B) where - /-- The algebra map out of the local field algebra. -/ - toAlgHom : T.LocalFieldAlgebra →ₐ[ℂ] B - /-- The map is equivariant for the jet gauge group. -/ - map_repJet : ∀ (U : GJ) (x : T.LocalFieldAlgebra), - toAlgHom (T.repJet U x) = repJet U (toAlgHom x) - /-- The map is equivariant for the Lorentz group. -/ - map_repLorentz : ∀ (Λ : SL(2,ℂ)) (x : T.LocalFieldAlgebra), - toAlgHom (T.repLorentzGroup Λ x) = repLorentz Λ (toAlgHom x) - /-- The jet gauge group acts on the whole of `B` by algebra endomorphisms. -/ - repJet_mul : ∀ (U : GJ) (b₁ b₂ : B), repJet U (b₁ * b₂) = repJet U b₁ * repJet U b₂ - /-- The Lorentz group acts on the whole of `B` by algebra endomorphisms. -/ - repLorentz_mul : ∀ (Λ : SL(2,ℂ)) (b₁ b₂ : B), - repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂ + or surjectivity is assumed, and no derivative operator on `B` is involved. It is built + from the fields `toAlgHom`, `map_fst`, `map_snd`, `fst_mul`, `snd_mul` of + `Representation.EquivariantAlgHom`, which the lemmas `map_repJet`, `map_repLorentz`, + `repJet_mul` and `repLorentz_mul` name. -/ +abbrev Realization (T : GaugeFieldData jets) (B : Type) [Ring B] [Algebra ℂ B] + (repJet : Representation ℂ GJ B) (repLorentz : Representation ℂ SL(2,ℂ) B) := + Representation.EquivariantAlgHom (A := T.LocalFieldAlgebra) T.repJet repJet + T.repLorentzGroup repLorentz namespace Realization @@ -91,12 +82,9 @@ variable {B : Type} [Ring B] [Algebra ℂ B] {repJet : Representation ℂ GJ B} variable (T) in /-- The local field algebra realized in itself, by the identity. -/ -noncomputable def id : Realization T T.LocalFieldAlgebra T.repJet T.repLorentzGroup where - toAlgHom := AlgHom.id ℂ _ - map_repJet _ _ := rfl - map_repLorentz _ _ := rfl - repJet_mul := GaugeFieldData.repJet_apply_mul - repLorentz_mul := GaugeFieldData.repLorentzGroup_apply_mul +noncomputable def id : Realization T T.LocalFieldAlgebra T.repJet T.repLorentzGroup := + Representation.EquivariantAlgHom.id _ _ GaugeFieldData.repJet_apply_mul + GaugeFieldData.repLorentzGroup_apply_mul @[simp] lemma id_toAlgHom : (id T).toAlgHom = AlgHom.id ℂ T.LocalFieldAlgebra := rfl @@ -107,10 +95,31 @@ lemma ext_generators {h₁ h₂ : Realization T B repJet repLorentz} (hf : ∀ i x, h₁.toAlgHom (T.ιFermion i x) = h₂.toAlgHom (T.ιFermion i x)) (hb : ∀ j y, h₁.toAlgHom (T.ιBoson j y) = h₂.toAlgHom (T.ιBoson j y)) (ha : ∀ v, h₁.toAlgHom (T.ιConnection v) = h₂.toAlgHom (T.ιConnection v)) : h₁ = h₂ := - Realization.ext (algHom_ext hf hb ha) + Representation.EquivariantAlgHom.ext (algHom_ext hf hb ha) variable (h : Realization T B repJet repLorentz) +/-- The map is equivariant for the jet gauge group. -/ +lemma map_repJet (U : GJ) (x : T.LocalFieldAlgebra) : + h.toAlgHom (T.repJet U x) = repJet U (h.toAlgHom x) := + h.map_fst U x + +/-- The map is equivariant for the Lorentz group. -/ +lemma map_repLorentz (Λ : SL(2,ℂ)) (x : T.LocalFieldAlgebra) : + h.toAlgHom (T.repLorentzGroup Λ x) = repLorentz Λ (h.toAlgHom x) := + h.map_snd Λ x + +include h in +/-- The jet gauge group acts on the whole of `B` by algebra endomorphisms. -/ +lemma repJet_mul (U : GJ) (b₁ b₂ : B) : repJet U (b₁ * b₂) = repJet U b₁ * repJet U b₂ := + h.fst_mul U b₁ b₂ + +include h in +/-- The Lorentz group acts on the whole of `B` by algebra endomorphisms. -/ +lemma repLorentz_mul (Λ : SL(2,ℂ)) (b₁ b₂ : B) : + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂ := + h.snd_mul Λ b₁ b₂ + /-! ## B. The assignment of a realization @@ -246,13 +255,6 @@ end Realization -/ -/-- An algebra map carries an affine combination `x + z • 1` to the same combination of - the image, the scalar shift of the connection law being an algebra element. -/ -lemma map_add_smul_one {A B : Type*} [Semiring A] [Algebra ℂ A] [Semiring B] [Algebra ℂ B] - (f : A →ₐ[ℂ] B) (x : A) (z : ℂ) : f (x + z • (1 : A)) = f x + z • (1 : B) := by - rw [← Algebra.algebraMap_eq_smul_one, map_add, AlgHom.commutes, - Algebra.algebraMap_eq_smul_one] - /-- The generator-level transformation laws of an assignment: each matter species transforms by the jet action of its own component space, and the connection generators transform affinely, by the transport of the inverse jet plus its Maurer–Cartan shift. @@ -305,7 +307,7 @@ lemma _root_.GaugeFieldData.Realization.toAssignment_isEquivariant repJet_connection U v := (h.map_repJet U (T.ιConnection v)).symm.trans ((congrArg h.toAlgHom (repJet_ιConnection_affine U v)).trans - (map_add_smul_one h.toAlgHom _ _)) + (AlgHom.map_add_smul_one h.toAlgHom _ _)) repLorentz_fermion Λ i x := (h.map_repLorentz Λ (T.ιFermion i x)).symm.trans (congrArg h.toAlgHom (repLorentzGroup_ιFermion Λ i x)) @@ -329,7 +331,7 @@ lemma IsEquivariant.lift_comp_repJetAlgHom {d : T.Assignment B} · rw [AlgHom.comp_apply, repJetAlgHom_ιBoson, lift_ιBoson, AlgHom.comp_apply, lift_ιBoson, Representation.toAlgHom_apply, hd.repJet_boson] · show d.lift (T.repJet U (T.ιConnection v)) = repJet U (d.lift (T.ιConnection v)) - rw [repJet_ιConnection_affine, map_add_smul_one d.lift, lift_ιConnection, + rw [repJet_ιConnection_affine, AlgHom.map_add_smul_one d.lift, lift_ιConnection, lift_ιConnection, hd.repJet_connection] /-- The lift of an equivariant assignment intertwines the Lorentz actions, as an equality of @@ -359,10 +361,10 @@ noncomputable def IsEquivariant.toRealization {d : T.Assignment B} repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂) : Realization T B repJet repLorentz where toAlgHom := d.lift - map_repJet U x := AlgHom.congr_fun (hd.lift_comp_repJetAlgHom hJ U) x - map_repLorentz Λ x := AlgHom.congr_fun (hd.lift_comp_repLorentzAlgHom hL Λ) x - repJet_mul := hJ - repLorentz_mul := hL + map_fst U x := AlgHom.congr_fun (hd.lift_comp_repJetAlgHom hJ U) x + map_snd Λ x := AlgHom.congr_fun (hd.lift_comp_repLorentzAlgHom hL Λ) x + fst_mul := hJ + snd_mul := hL @[simp] lemma IsEquivariant.toRealization_toAlgHom {d : T.Assignment B} @@ -388,6 +390,7 @@ noncomputable def realizationEquivAssignment {B : Type} [Ring B] [Algebra ℂ B] toFun d := d.2.toRealization hJ hL invFun h := ⟨h.toAssignment, h.toAssignment_isEquivariant⟩ left_inv d := Subtype.ext ((liftEquiv T B).symm_apply_apply d.1) - right_inv h := Realization.ext ((liftEquiv T B).apply_symm_apply h.toAlgHom) + right_inv h := + Representation.EquivariantAlgHom.ext ((liftEquiv T B).apply_symm_apply h.toAlgHom) end GaugeFieldData diff --git a/Physlib/Mathematics/AlgebraRepresentation.lean b/Physlib/Mathematics/AlgebraRepresentation.lean index 4ed1fd5af..b3e700892 100644 --- a/Physlib/Mathematics/AlgebraRepresentation.lean +++ b/Physlib/Mathematics/AlgebraRepresentation.lean @@ -29,6 +29,14 @@ hypothesis is stated pointwise, in the form the ambient invariance lemmas produc Section C restricts the scalars of a representation: a representation on a complex vector space is in particular a representation on the underlying real vector space. +Section E bundles an algebra map together with equivariance for two independently supplied +pairs of representations of two monoids, the two target representations being multiplicative +on the whole target: `Representation.EquivariantAlgHom`. Nothing relates the two pairs, the +target actions are not assumed to commute, and they are not assumed unital, which over a +monoid does not follow from multiplicativity. Section F base changes such a map along an +extension of scalars, and section G records the one affine identity an algebra map is used +for when a representation acts on generators by a shift. + ## ii. Key results - `Representation.tprod_apply_one`, `Representation.tprod_apply_one_tmul`, @@ -37,6 +45,11 @@ space is in particular a representation on the underlying real vector space. - `Representation.restrictSubalgebra` : the restriction to an invariant subalgebra. - `Representation.restrictScalars` : the restriction of scalars. - `Representation.toAlgHom` : a multiplicative representation of a group as algebra maps. +- `Representation.EquivariantAlgHom` : an algebra map intertwining two pairs of + representations, with `EquivariantAlgHom.id`, `EquivariantAlgHom.restrictSubalgebra` and + `EquivariantAlgHom.compFst`. +- `Representation.liftEquiv_baseChange` : base change preserves equivariance. +- `AlgHom.map_add_smul_one` : an algebra map on an affine combination `x + z • 1`. ## iii. Table of contents @@ -44,6 +57,9 @@ space is in particular a representation on the underlying real vector space. - B. Restriction to an invariant subalgebra - C. Restriction of scalars - D. Multiplicative representations as algebra maps +- E. Equivariant algebra maps +- F. Base change of an equivariant algebra map +- G. Affine combinations under an algebra map -/ @@ -191,4 +207,129 @@ lemma toAlgHom_apply (g : G) (x : A) : ρ.toAlgHom hρ g x = ρ g x := rfl end Multiplicative +/-! + +## E. Equivariant algebra maps + +-/ + +section Equivariant + +variable {k : Type*} [CommSemiring k] {G₁ G₂ : Type*} [Monoid G₁] [Monoid G₂] + {A B : Type*} [Semiring A] [Algebra k A] [Semiring B] [Algebra k B] + +/-- An algebra map `A →ₐ[k] B` intertwining two pairs of representations, `ρ₁, σ₁` of the + monoid `G₁` and `ρ₂, σ₂` of the monoid `G₂`, with both target representations multiplicative + on the whole of `B`. The two pairs are independent: the actions of `G₁` and `G₂` are not + assumed to commute, and no relation between them is used. Unit preservation is not a field + and does not follow from multiplicativity over a monoid; when the acting monoid is a group + and the target is a ring it does (`Representation.apply_one_of_mul`), and the target action + is then by algebra endomorphisms. -/ +@[ext] +structure EquivariantAlgHom (ρ₁ : Representation k G₁ A) (σ₁ : Representation k G₁ B) + (ρ₂ : Representation k G₂ A) (σ₂ : Representation k G₂ B) where + /-- The underlying algebra map. -/ + toAlgHom : A →ₐ[k] B + /-- The map is equivariant for the first pair of representations. -/ + map_fst : ∀ (g : G₁) (x : A), toAlgHom (ρ₁ g x) = σ₁ g (toAlgHom x) + /-- The map is equivariant for the second pair of representations. -/ + map_snd : ∀ (g : G₂) (x : A), toAlgHom (ρ₂ g x) = σ₂ g (toAlgHom x) + /-- The first target action is multiplicative on the whole of `B`. -/ + fst_mul : ∀ (g : G₁) (b₁ b₂ : B), σ₁ g (b₁ * b₂) = σ₁ g b₁ * σ₁ g b₂ + /-- The second target action is multiplicative on the whole of `B`. -/ + snd_mul : ∀ (g : G₂) (b₁ b₂ : B), σ₂ g (b₁ * b₂) = σ₂ g b₁ * σ₂ g b₂ + +namespace EquivariantAlgHom + +variable {ρ₁ : Representation k G₁ A} {σ₁ : Representation k G₁ B} + {ρ₂ : Representation k G₂ A} {σ₂ : Representation k G₂ B} + +variable (ρ₁ ρ₂) in +/-- The identity map of an algebra carrying two multiplicative representations. -/ +def id (h₁ : ∀ (g : G₁) (x y : A), ρ₁ g (x * y) = ρ₁ g x * ρ₁ g y) + (h₂ : ∀ (g : G₂) (x y : A), ρ₂ g (x * y) = ρ₂ g x * ρ₂ g y) : + EquivariantAlgHom ρ₁ ρ₁ ρ₂ ρ₂ where + toAlgHom := AlgHom.id k A + map_fst _ _ := rfl + map_snd _ _ := rfl + fst_mul := h₁ + snd_mul := h₂ + +@[simp] +lemma id_toAlgHom (h₁ : ∀ (g : G₁) (x y : A), ρ₁ g (x * y) = ρ₁ g x * ρ₁ g y) + (h₂ : ∀ (g : G₂) (x y : A), ρ₂ g (x * y) = ρ₂ g x * ρ₂ g y) : + (EquivariantAlgHom.id ρ₁ ρ₂ h₁ h₂).toAlgHom = AlgHom.id k A := rfl + +/-- The restriction to a subalgebra of the source preserved by both source representations, + along its inclusion; the target and its two actions are unchanged. -/ +noncomputable def restrictSubalgebra (f : EquivariantAlgHom ρ₁ σ₁ ρ₂ σ₂) (S : Subalgebra k A) + (hS₁ : ∀ (g : G₁) {x : A}, x ∈ S → ρ₁ g x ∈ S) + (hS₂ : ∀ (g : G₂) {x : A}, x ∈ S → ρ₂ g x ∈ S) : + EquivariantAlgHom (ρ₁.restrictSubalgebra S hS₁) σ₁ (ρ₂.restrictSubalgebra S hS₂) σ₂ where + toAlgHom := f.toAlgHom.comp S.val + map_fst g x := f.map_fst g x + map_snd g x := f.map_snd g x + fst_mul := f.fst_mul + snd_mul := f.snd_mul + +@[simp] +lemma restrictSubalgebra_toAlgHom_apply (f : EquivariantAlgHom ρ₁ σ₁ ρ₂ σ₂) (S : Subalgebra k A) + (hS₁ : ∀ (g : G₁) {x : A}, x ∈ S → ρ₁ g x ∈ S) + (hS₂ : ∀ (g : G₂) {x : A}, x ∈ S → ρ₂ g x ∈ S) (x : S) : + (f.restrictSubalgebra S hS₁ hS₂).toAlgHom x = f.toAlgHom x := rfl + +/-- The precomposition of the first pair of representations with a monoid map; the algebra + map is unchanged. -/ +def compFst {H : Type*} [Monoid H] (f : EquivariantAlgHom ρ₁ σ₁ ρ₂ σ₂) (φ : H →* G₁) : + EquivariantAlgHom (ρ₁.comp φ) (σ₁.comp φ) ρ₂ σ₂ where + toAlgHom := f.toAlgHom + map_fst h x := f.map_fst (φ h) x + map_snd := f.map_snd + fst_mul h := f.fst_mul (φ h) + snd_mul := f.snd_mul + +@[simp] +lemma compFst_toAlgHom {H : Type*} [Monoid H] (f : EquivariantAlgHom ρ₁ σ₁ ρ₂ σ₂) (φ : H →* G₁) : + (f.compFst φ).toAlgHom = f.toAlgHom := rfl + +end EquivariantAlgHom + +end Equivariant + +/-! + +## F. Base change of an equivariant algebra map + +-/ + +/-- Base change along `R → S` preserves equivariance: the `S`-algebra map out of `S ⊗[R] A` + corresponding to an equivariant `R`-algebra map `f` intertwines the base change of the + source action with the target action. -/ +lemma liftEquiv_baseChange {R S A B G : Type*} [CommSemiring R] [CommSemiring S] [Algebra R S] + [Semiring A] [Algebra R A] [Semiring B] [Algebra S B] [Algebra R B] [IsScalarTower R S B] + [Monoid G] (f : A →ₐ[R] B) (ρ : Representation R G A) (σ : Representation S G B) + (hf : ∀ (g : G) (x : A), f (ρ g x) = σ g (f x)) (g : G) (x : S ⊗[R] A) : + AlgHom.liftEquiv R S A B f (LinearMap.baseChange S (ρ g) x) + = σ g (AlgHom.liftEquiv R S A B f x) := by + induction x using TensorProduct.induction_on with + | zero => rw [map_zero, map_zero, map_zero] + | add x y hx hy => rw [map_add, map_add, hx, hy, map_add, map_add] + | tmul z a => + rw [LinearMap.baseChange_tmul, AlgHom.liftEquiv_tmul, AlgHom.liftEquiv_tmul, + map_smul (σ g), hf] + end Representation + +/-! + +## G. Affine combinations under an algebra map + +-/ + +/-- An algebra map carries an affine combination `x + z • 1` to the same combination of the + image, the shift being the image of a scalar. -/ +lemma AlgHom.map_add_smul_one {k A B : Type*} [CommSemiring k] [Semiring A] [Algebra k A] + [Semiring B] [Algebra k B] (f : A →ₐ[k] B) (x : A) (z : k) : + f (x + z • (1 : A)) = f x + z • (1 : B) := by + rw [← Algebra.algebraMap_eq_smul_one, map_add, AlgHom.commutes, + Algebra.algebraMap_eq_smul_one] From dd3edc45f0de9927e1c04e2e97f08b8194415cf4 Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Sun, 13 Sep 2026 23:55:47 +0400 Subject: [PATCH 328/367] feat: define ordinary and covariant gauge-theory sector algebras --- Physlib.lean | 2 + .../LocalCovFieldAlgebra/Basic.lean | 63 +-- .../LocalCovFieldAlgebra/Sector.lean | 505 ++++++++++++++++++ .../LocalFieldAlgebra/CovariantDeriv.lean | 71 ++- .../GaugeTheory/LocalFieldAlgebra/Sector.lean | 363 +++++++++++++ Physlib/Mathematics/AlgebraGeneration.lean | 13 +- .../Mathematics/AlgebraRepresentation.lean | 12 +- 7 files changed, 991 insertions(+), 38 deletions(-) create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/LocalCovFieldAlgebra/Sector.lean create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Sector.lean diff --git a/Physlib.lean b/Physlib.lean index 566d80b11..46cfd41e8 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -26,6 +26,7 @@ public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeFieldData.FermionMat public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeFieldData.FermionModule public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalCovFieldAlgebra.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalCovFieldAlgebra.Realization +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalCovFieldAlgebra.Sector public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.CovariantDeriv public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.Basic @@ -43,6 +44,7 @@ public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.Jet public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.JetRep public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.LorentzAction public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.Realization +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.Sector public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.TransformsIn public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.AdjointCoeff public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Basic diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalCovFieldAlgebra/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalCovFieldAlgebra/Basic.lean index bb353e6e8..7ad39cb4f 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalCovFieldAlgebra/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalCovFieldAlgebra/Basic.lean @@ -37,7 +37,8 @@ inclusion `Subalgebra.val` by construction. companions : the generators as elements of the covariant field algebra. - `LocalCovFieldAlgebra.repJet`, `LocalCovFieldAlgebra.repValue`, `LocalCovFieldAlgebra.repLorentzGroup` : the restricted actions. -- `LocalCovFieldAlgebra.repJet_eq_repValue_eval` : the factorization through evaluation. +- `LocalCovFieldAlgebra.repJet_eq_ofConstant_eval_of_mem`, + `LocalCovFieldAlgebra.repJet_eq_repValue_eval` : the factorization through evaluation. ## iii. Table of contents @@ -194,13 +195,8 @@ lemma induction {P : T.LocalFieldAlgebra → Prop} {x : T.LocalFieldAlgebra} lemma mapsTo (f : T.LocalFieldAlgebra →ₐ[ℂ] T.LocalFieldAlgebra) (hgen : ∀ b ∈ T.covGenerators, f b ∈ T.LocalCovFieldAlgebra) {x : T.LocalFieldAlgebra} (hx : x ∈ T.LocalCovFieldAlgebra) : - f x ∈ T.LocalCovFieldAlgebra := by - have hle : T.LocalCovFieldAlgebra.map f ≤ T.LocalCovFieldAlgebra := by - rw [LocalCovFieldAlgebra, ← Algebra.adjoin_image] - refine Algebra.adjoin_le ?_ - rintro _ ⟨b, hb, rfl⟩ - exact hgen b hb - exact hle ⟨x, hx, rfl⟩ + f x ∈ T.LocalCovFieldAlgebra := + Algebra.apply_mem_of_mem_adjoin f hgen hx /-- Two algebra maps out of the covariant field algebra agreeing on the covariant generators are equal. This is uniqueness only: the covariant field algebra is not free on @@ -350,23 +346,16 @@ lemma repLorentzGroup_mem (hGL : T.GaugeLorentzCompatible) (Λ : SL(2,ℂ)) refine covGenerators_cases (P := fun b => T.repLorentzAlgHom Λ b ∈ T.LocalCovFieldAlgebra) hb (fun l μ ν φ => ?_) (fun i n l φ => ?_) (fun i n l φ => ?_) (fun j n l φ => ?_) (fun j n l φ => ?_) - · obtain ⟨n, l', rfl⟩ : ∃ (n : ℕ) (l' : Fin n → (Fin 1 ⊕ Fin 3)), l = List.ofFn l' := - ⟨_, l.get, (List.ofFn_get l).symm⟩ - rw [← repLorentzGroup_apply, repLorentzGroup_covDerivFieldStrength] - exact Subalgebra.sum_mem _ fun p _ => Subalgebra.smul_mem _ - (Subalgebra.sum_mem _ fun a _ => Subalgebra.smul_mem _ - (Subalgebra.sum_mem _ fun b _ => Subalgebra.smul_mem _ - (covDerivFieldStrength_mem _ a b φ) _) _) _ - · rw [← repLorentzGroup_apply, repLorentzGroup_covDerivFermion Λ i (hGL.1 i)] - exact Subalgebra.sum_mem _ fun p _ => Subalgebra.smul_mem _ (covDerivFermion_mem i p _) _ - · rw [← repLorentzGroup_apply, repLorentzGroup_covDerivConjFermion Λ i (hGL.1 i)] - exact Subalgebra.sum_mem _ fun p _ => Subalgebra.smul_mem _ - (covDerivConjFermion_mem i p _) _ - · rw [← repLorentzGroup_apply, repLorentzGroup_covDerivBoson Λ j (hGL.2 j)] - exact Subalgebra.sum_mem _ fun p _ => Subalgebra.smul_mem _ (covDerivBoson_mem j p _) _ - · rw [← repLorentzGroup_apply, repLorentzGroup_covDerivConjBoson Λ j (hGL.2 j)] - exact Subalgebra.sum_mem _ fun p _ => Subalgebra.smul_mem _ - (covDerivConjBoson_mem j p _) _ + · exact repLorentzGroup_covDerivFieldStrength_mem Λ l μ ν φ + fun l' a b => covDerivFieldStrength_mem l' a b φ + · exact repLorentzGroup_covDerivFermion_mem Λ i (hGL.1 i) l φ + fun p ψ => covDerivFermion_mem i p ψ + · exact repLorentzGroup_covDerivConjFermion_mem Λ i (hGL.1 i) l φ + fun p ψ => covDerivConjFermion_mem i p ψ + · exact repLorentzGroup_covDerivBoson_mem Λ j (hGL.2 j) l φ + fun p ψ => covDerivBoson_mem j p ψ + · exact repLorentzGroup_covDerivConjBoson_mem Λ j (hGL.2 j) l φ + fun p ψ => covDerivConjBoson_mem j p ψ /-! @@ -435,16 +424,14 @@ lemma repValue_apply_mul (g : G₀) (x y : T.LocalCovFieldAlgebra) : repValue T g (x * y) = repValue T g x * repValue T g y := repJet_apply_mul (jets.ofConstant g) x y -/-- Under `GaugeFieldData.PureJetsActTrivially`, the action of the jet gauge group on the - covariant field algebra factors through evaluation: a jet acts as the constant jet of its - value, so the derivatives of a gauge transformation act trivially on covariant - expressions. -/ -theorem repJet_eq_repValue_eval (hP : T.PureJetsActTrivially) (U : GJ) - (x : T.LocalCovFieldAlgebra) : repJet T U x = repValue T (jets.eval U) x := by - refine Subtype.ext ?_ - show T.repJet U x = T.repJet (jets.ofConstant (jets.eval U)) x +/-- Under `GaugeFieldData.PureJetsActTrivially`, a jet acts on every element of the + covariant field algebra as the constant jet of its value, stated in the local field + algebra. -/ +lemma repJet_eq_ofConstant_eval_of_mem (hP : T.PureJetsActTrivially) (U : GJ) + {x : T.LocalFieldAlgebra} (hx : x ∈ T.LocalCovFieldAlgebra) : + T.repJet U x = T.repJet (jets.ofConstant (jets.eval U)) x := by refine induction (P := fun y => T.repJet U y = T.repJet (jets.ofConstant (jets.eval U)) y) - x.2 ?_ ?_ ?_ ?_ ?_ ?_ ?_ ?_ + hx ?_ ?_ ?_ ?_ ?_ ?_ ?_ ?_ · intro l μ ν φ exact repJet_covDerivFieldStrength_ofConstant_eval U l μ ν φ · intro i n l φ @@ -468,6 +455,14 @@ theorem repJet_eq_repValue_eval (hP : T.PureJetsActTrivially) (U : GJ) exact (GaugeFieldData.repJet_apply_mul U x y).trans ((congrArg₂ (· * ·) hx hy).trans (GaugeFieldData.repJet_apply_mul _ x y).symm) +/-- Under `GaugeFieldData.PureJetsActTrivially`, the action of the jet gauge group on the + covariant field algebra factors through evaluation: a jet acts as the constant jet of its + value, so the derivatives of a gauge transformation act trivially on covariant + expressions. -/ +theorem repJet_eq_repValue_eval (hP : T.PureJetsActTrivially) (U : GJ) + (x : T.LocalCovFieldAlgebra) : repJet T U x = repValue T (jets.eval U) x := + Subtype.ext (repJet_eq_ofConstant_eval_of_mem hP U x.2) + /-! ### C.2. The actions on the generators diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalCovFieldAlgebra/Sector.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalCovFieldAlgebra/Sector.lean new file mode 100644 index 000000000..f249e7700 --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalCovFieldAlgebra/Sector.lean @@ -0,0 +1,505 @@ +/- +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.ClassicalFieldTheory.GaugeTheory.LocalCovFieldAlgebra.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.Sector +/-! +# The covariant sector algebras of the local field algebra + +## i. Overview + +A sector `S`, a finite set of `GaugeFieldData.FieldCategory`, selects covariant generator +families of the local field algebra `J(T)` of a field datum: the covariant towers +`∇_{l 0} ⋯ ∇_{l (n-1)} ψ` of every fermionic species and their conjugates, along all +ordered tuples of directions, for `fermion`; those of every bosonic species and their +conjugates for `scalar`; and the included field-strength tower `∇_l F_μν` for `gauge`. +Towers of length zero are the undifferentiated fields, and the ordered derivative labels +are kept. The covariant sector algebra `T.CovSectorAlgebra S` is the complex unital +subalgebra of `J(T)` generated by the selected towers; the full sector recovers +`T.LocalCovFieldAlgebra`, so every covariant sector algebra lies in it. + +As for the ordinary sectors, `scalar` names the bosonic species without any Lorentz-scalar +hypothesis. A covariant sector algebra is not claimed to lie in the ordinary sector algebra +of the same sector: a covariant matter derivative contains connection terms whether or not +`gauge` is selected. + +The actions and their restrictions follow the covariant field algebra, with the same +hypotheses: none for the jet and ordinary gauge groups, +`GaugeFieldData.GaugeLorentzCompatible` for the Lorentz group, and +`GaugeFieldData.PureJetsActTrivially` for the factorization of the jet action through +evaluation. + +## ii. Key results + +- `GaugeFieldData.CovSectorAlgebra` : the covariant sector algebra of a sector, with + `CovSectorAlgebra.induction` and `CovSectorAlgebra.algHom_ext`. +- `CovSectorAlgebra.mono`, `CovSectorAlgebra.empty`, `CovSectorAlgebra.univ`, + `CovSectorAlgebra.union`, `CovSectorAlgebra.le_localCovFieldAlgebra` : the lattice laws + of the selection and the containment in the covariant field algebra. +- `CovSectorAlgebra.repJet`, `CovSectorAlgebra.repValue`, + `CovSectorAlgebra.repLorentzGroup` : the restricted actions. +- `CovSectorAlgebra.repJet_eq_repValue_eval` : the factorization through evaluation. + +## iii. Table of contents + +- A. The covariant generators of a sector +- B. The covariant sector algebra + - B.1. Membership of the selected towers + - B.2. Generation + - B.3. The lattice laws of the selection +- C. Stability under the actions +- D. The restricted actions + - D.1. The action of the ordinary gauge group + - D.2. The inclusions + +-/ + +@[expose] public section + +open TensorProduct Matrix MatrixGroups Lorentz + +namespace GaugeFieldData + +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} (T : GaugeFieldData jets) + +/-! + +## A. The covariant generators of a sector + +-/ + +/-- The covariant generators of one field category. -/ +def covCategoryGenerators : FieldCategory → Set T.LocalFieldAlgebra + | .fermion => ⋃ i, ⋃ n : ℕ, ⋃ l : Fin n → (Fin 1 ⊕ Fin 3), + Set.range (T.covDerivFermion i l) ∪ Set.range (T.covDerivConjFermion i l) + | .gauge => ⋃ l : List (Fin 1 ⊕ Fin 3), ⋃ μ, ⋃ ν, Set.range (T.covDerivFieldStrength l μ ν) + | .scalar => ⋃ j, ⋃ n : ℕ, ⋃ l : Fin n → (Fin 1 ⊕ Fin 3), + Set.range (T.covDerivBoson j l) ∪ Set.range (T.covDerivConjBoson j l) + +/-- The covariant generators selected by a sector. -/ +def covSectorGenerators (S : Finset FieldCategory) : Set T.LocalFieldAlgebra := + ⋃ c ∈ S, T.covCategoryGenerators c + +lemma covSectorGenerators_mono {S S' : Finset FieldCategory} (h : S ⊆ S') : + T.covSectorGenerators S ⊆ T.covSectorGenerators S' := + Set.iUnion₂_subset fun _ hc => Finset.subset_set_biUnion_of_mem (h hc) + +@[simp] +lemma covSectorGenerators_empty : T.covSectorGenerators ∅ = ∅ := by + simp [covSectorGenerators] + +lemma covSectorGenerators_union (S S' : Finset FieldCategory) : + T.covSectorGenerators (S ∪ S') = T.covSectorGenerators S ∪ T.covSectorGenerators S' := + Finset.set_biUnion_union S S' _ + +/-- The full sector selects the covariant generators of the covariant field algebra. -/ +lemma covSectorGenerators_univ : T.covSectorGenerators Finset.univ = T.covGenerators := by + ext x + simp only [covSectorGenerators, Finset.mem_univ, Set.iUnion_true, Set.mem_iUnion] + constructor + · rintro ⟨c, hc⟩ + cases c + · exact Or.inr (Or.inl hc) + · exact Or.inl hc + · exact Or.inr (Or.inr hc) + · rintro (h | h | h) + exacts [⟨.gauge, h⟩, ⟨.fermion, h⟩, ⟨.scalar, h⟩] + +/-! + +## B. The covariant sector algebra + +-/ + +/-- The covariant sector algebra of a sector `S`: the subalgebra of the local field + algebra generated by the covariant towers of the selected categories. -/ +noncomputable def CovSectorAlgebra (S : Finset FieldCategory) : + Subalgebra ℂ T.LocalFieldAlgebra := + Algebra.adjoin ℂ (T.covSectorGenerators S) + +namespace CovSectorAlgebra + +variable {T} {S : Finset FieldCategory} + +/-! + +### B.1. Membership of the selected towers + +-/ + +lemma covDerivFieldStrength_mem (hS : FieldCategory.gauge ∈ S) (l : List (Fin 1 ⊕ Fin 3)) + (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + T.covDerivFieldStrength l μ ν φ ∈ T.CovSectorAlgebra S := + Algebra.subset_adjoin (Finset.subset_set_biUnion_of_mem (f := T.covCategoryGenerators) hS + (Set.mem_iUnion.mpr ⟨l, Set.mem_iUnion.mpr ⟨μ, Set.mem_iUnion.mpr ⟨ν, φ, rfl⟩⟩⟩)) + +lemma covDerivFermion_mem (hS : FieldCategory.fermion ∈ S) (i : T.FermionSpecies) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (T.FermionValue i)) : + T.covDerivFermion i l φ ∈ T.CovSectorAlgebra S := + Algebra.subset_adjoin (Finset.subset_set_biUnion_of_mem (f := T.covCategoryGenerators) hS + (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, Set.mem_iUnion.mpr ⟨l, Or.inl ⟨φ, rfl⟩⟩⟩⟩)) + +lemma covDerivConjFermion_mem (hS : FieldCategory.fermion ∈ S) (i : T.FermionSpecies) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule (T.FermionValue i))) : + T.covDerivConjFermion i l φ ∈ T.CovSectorAlgebra S := + Algebra.subset_adjoin (Finset.subset_set_biUnion_of_mem (f := T.covCategoryGenerators) hS + (Set.mem_iUnion.mpr ⟨i, Set.mem_iUnion.mpr ⟨n, Set.mem_iUnion.mpr ⟨l, Or.inr ⟨φ, rfl⟩⟩⟩⟩)) + +lemma covDerivBoson_mem (hS : FieldCategory.scalar ∈ S) (j : T.BosonSpecies) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (T.BosonValue j)) : + T.covDerivBoson j l φ ∈ T.CovSectorAlgebra S := + Algebra.subset_adjoin (Finset.subset_set_biUnion_of_mem (f := T.covCategoryGenerators) hS + (Set.mem_iUnion.mpr ⟨j, Set.mem_iUnion.mpr ⟨n, Set.mem_iUnion.mpr ⟨l, Or.inl ⟨φ, rfl⟩⟩⟩⟩)) + +lemma covDerivConjBoson_mem (hS : FieldCategory.scalar ∈ S) (j : T.BosonSpecies) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule (T.BosonValue j))) : + T.covDerivConjBoson j l φ ∈ T.CovSectorAlgebra S := + Algebra.subset_adjoin (Finset.subset_set_biUnion_of_mem (f := T.covCategoryGenerators) hS + (Set.mem_iUnion.mpr ⟨j, Set.mem_iUnion.mpr ⟨n, Set.mem_iUnion.mpr ⟨l, Or.inr ⟨φ, rfl⟩⟩⟩⟩)) + +/-- The included field strength, as the tower of empty length. -/ +lemma fieldStrength_mem (hS : FieldCategory.gauge ∈ S) (μ ν : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ 𝔤) : + T.includeConnection ((1 : ℂ) ⊗ₜ[ℝ] LocalGaugeFieldAlgebra.fieldStrength 𝔤 μ ν φ) + ∈ T.CovSectorAlgebra S := + covDerivFieldStrength_mem hS [] μ ν φ + +/-- The undifferentiated matter symbols, as the towers of length zero. -/ +lemma fermionSymbol_zero_mem (hS : FieldCategory.fermion ∈ S) (i : T.FermionSpecies) + (φ : Module.Dual ℂ (T.FermionValue i)) : T.fermionSymbol i 0 φ ∈ T.CovSectorAlgebra S := + covDerivFermion_mem hS i (fun k : Fin 0 => k.elim0) φ + +lemma conjFermionSymbol_zero_mem (hS : FieldCategory.fermion ∈ S) (i : T.FermionSpecies) + (φ : Module.Dual ℂ (ConjModule (T.FermionValue i))) : + T.conjFermionSymbol i 0 φ ∈ T.CovSectorAlgebra S := + covDerivConjFermion_mem hS i (fun k : Fin 0 => k.elim0) φ + +lemma bosonSymbol_zero_mem (hS : FieldCategory.scalar ∈ S) (j : T.BosonSpecies) + (φ : Module.Dual ℂ (T.BosonValue j)) : T.bosonSymbol j 0 φ ∈ T.CovSectorAlgebra S := + covDerivBoson_mem hS j (fun k : Fin 0 => k.elim0) φ + +lemma conjBosonSymbol_zero_mem (hS : FieldCategory.scalar ∈ S) (j : T.BosonSpecies) + (φ : Module.Dual ℂ (ConjModule (T.BosonValue j))) : + T.conjBosonSymbol j 0 φ ∈ T.CovSectorAlgebra S := + covDerivConjBoson_mem hS j (fun k : Fin 0 => k.elim0) φ + +/-! + +### B.2. Generation + +-/ + +/-- Case analysis on the covariant generators of a sector. -/ +lemma covSectorGenerators_cases {P : T.LocalFieldAlgebra → Prop} {b : T.LocalFieldAlgebra} + (hb : b ∈ T.covSectorGenerators S) + (hF : FieldCategory.gauge ∈ S → ∀ (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ 𝔤), P (T.covDerivFieldStrength l μ ν φ)) + (hψ : FieldCategory.fermion ∈ S → ∀ (i : T.FermionSpecies) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (T.FermionValue i)), + P (T.covDerivFermion i l φ)) + (hψc : FieldCategory.fermion ∈ S → ∀ (i : T.FermionSpecies) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule (T.FermionValue i))), + P (T.covDerivConjFermion i l φ)) + (hφ : FieldCategory.scalar ∈ S → ∀ (j : T.BosonSpecies) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (T.BosonValue j)), + P (T.covDerivBoson j l φ)) + (hφc : FieldCategory.scalar ∈ S → ∀ (j : T.BosonSpecies) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule (T.BosonValue j))), + P (T.covDerivConjBoson j l φ)) : P b := by + simp only [covSectorGenerators, Set.mem_iUnion, exists_prop] at hb + obtain ⟨c, hc, hbc⟩ := hb + cases c with + | fermion => + simp only [covCategoryGenerators, Set.mem_iUnion, Set.mem_union, Set.mem_range] at hbc + obtain ⟨i, n, l, ⟨φ, rfl⟩ | ⟨φ, rfl⟩⟩ := hbc + · exact hψ hc i l φ + · exact hψc hc i l φ + | gauge => + simp only [covCategoryGenerators, Set.mem_iUnion, Set.mem_range] at hbc + obtain ⟨l, μ, ν, φ, rfl⟩ := hbc + exact hF hc l μ ν φ + | scalar => + simp only [covCategoryGenerators, Set.mem_iUnion, Set.mem_union, Set.mem_range] at hbc + obtain ⟨j, n, l, ⟨φ, rfl⟩ | ⟨φ, rfl⟩⟩ := hbc + · exact hφ hc j l φ + · exact hφc hc j l φ + +/-- A property holding on the selected towers and the scalars and closed under sums and + products holds on the covariant sector algebra. -/ +lemma induction {P : T.LocalFieldAlgebra → Prop} {x : T.LocalFieldAlgebra} + (hx : x ∈ T.CovSectorAlgebra S) + (hF : FieldCategory.gauge ∈ S → ∀ (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ 𝔤), P (T.covDerivFieldStrength l μ ν φ)) + (hψ : FieldCategory.fermion ∈ S → ∀ (i : T.FermionSpecies) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (T.FermionValue i)), + P (T.covDerivFermion i l φ)) + (hψc : FieldCategory.fermion ∈ S → ∀ (i : T.FermionSpecies) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule (T.FermionValue i))), + P (T.covDerivConjFermion i l φ)) + (hφ : FieldCategory.scalar ∈ S → ∀ (j : T.BosonSpecies) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (T.BosonValue j)), + P (T.covDerivBoson j l φ)) + (hφc : FieldCategory.scalar ∈ S → ∀ (j : T.BosonSpecies) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule (T.BosonValue j))), + P (T.covDerivConjBoson j l φ)) + (halg : ∀ z : ℂ, P (z • (1 : T.LocalFieldAlgebra))) + (hadd : ∀ x y, P x → P y → P (x + y)) + (hmul : ∀ x y, P x → P y → P (x * y)) : P x := by + induction hx using Algebra.adjoin_induction with + | mem b hb => exact covSectorGenerators_cases hb hF hψ hψc hφ hφc + | algebraMap z => + rw [Algebra.algebraMap_eq_smul_one] + exact halg z + | add a b _ _ ha hb => exact hadd a b ha hb + | mul a b _ _ ha hb => exact hmul a b ha hb + +/-- Two algebra maps out of a covariant sector algebra agreeing on the selected towers + are equal. This is uniqueness only: the algebra is not free on its towers, so an + assignment on them need not extend to a map. -/ +lemma algHom_ext {B : Type} [Semiring B] [Algebra ℂ B] + {f g : ↥(T.CovSectorAlgebra S) →ₐ[ℂ] B} + (hF : ∀ (hS : FieldCategory.gauge ∈ S) (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ 𝔤), + f ⟨T.covDerivFieldStrength l μ ν φ, covDerivFieldStrength_mem hS l μ ν φ⟩ + = g ⟨T.covDerivFieldStrength l μ ν φ, covDerivFieldStrength_mem hS l μ ν φ⟩) + (hψ : ∀ (hS : FieldCategory.fermion ∈ S) (i : T.FermionSpecies) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (T.FermionValue i)), + f ⟨T.covDerivFermion i l φ, covDerivFermion_mem hS i l φ⟩ + = g ⟨T.covDerivFermion i l φ, covDerivFermion_mem hS i l φ⟩) + (hψc : ∀ (hS : FieldCategory.fermion ∈ S) (i : T.FermionSpecies) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule (T.FermionValue i))), + f ⟨T.covDerivConjFermion i l φ, covDerivConjFermion_mem hS i l φ⟩ + = g ⟨T.covDerivConjFermion i l φ, covDerivConjFermion_mem hS i l φ⟩) + (hφ : ∀ (hS : FieldCategory.scalar ∈ S) (j : T.BosonSpecies) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (T.BosonValue j)), + f ⟨T.covDerivBoson j l φ, covDerivBoson_mem hS j l φ⟩ + = g ⟨T.covDerivBoson j l φ, covDerivBoson_mem hS j l φ⟩) + (hφc : ∀ (hS : FieldCategory.scalar ∈ S) (j : T.BosonSpecies) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule (T.BosonValue j))), + f ⟨T.covDerivConjBoson j l φ, covDerivConjBoson_mem hS j l φ⟩ + = g ⟨T.covDerivConjBoson j l φ, covDerivConjBoson_mem hS j l φ⟩) : f = g := by + refine AlgHom.ext_of_eq_adjoin rfl fun b hb => ?_ + refine covSectorGenerators_cases (P := fun b => ∀ hb' : b ∈ T.CovSectorAlgebra S, + f ⟨b, hb'⟩ = g ⟨b, hb'⟩) hb ?_ ?_ ?_ ?_ ?_ (Algebra.subset_adjoin hb) + · intro hS l μ ν φ _ + exact hF hS l μ ν φ + · intro hS i n l φ _ + exact hψ hS i l φ + · intro hS i n l φ _ + exact hψc hS i l φ + · intro hS j n l φ _ + exact hφ hS j l φ + · intro hS j n l φ _ + exact hφc hS j l φ + +/-! + +### B.3. The lattice laws of the selection + +-/ + +variable (T) + +lemma mono {S S' : Finset FieldCategory} (h : S ⊆ S') : + T.CovSectorAlgebra S ≤ T.CovSectorAlgebra S' := + Algebra.adjoin_mono (covSectorGenerators_mono T h) + +/-- The empty covariant sector algebra is the image of the scalars. -/ +@[simp] +lemma empty : T.CovSectorAlgebra ∅ = ⊥ := by + unfold CovSectorAlgebra + rw [covSectorGenerators_empty, Algebra.adjoin_empty] + +@[simp] +lemma univ : T.CovSectorAlgebra Finset.univ = T.LocalCovFieldAlgebra := by + unfold CovSectorAlgebra + rw [covSectorGenerators_univ] + rfl + +lemma union (S S' : Finset FieldCategory) : + T.CovSectorAlgebra (S ∪ S') = T.CovSectorAlgebra S ⊔ T.CovSectorAlgebra S' := by + unfold CovSectorAlgebra + rw [covSectorGenerators_union, Algebra.adjoin_union] + +variable (S) in +lemma le_localCovFieldAlgebra : T.CovSectorAlgebra S ≤ T.LocalCovFieldAlgebra := + (univ T).symm ▸ mono T (Finset.subset_univ S) + +variable {T} + +/-! + +## C. Stability under the actions + +A jet carries a tower element to an element of the same tower, and a Lorentz +transformation to a combination of elements of the same tower, so both actions preserve +every covariant sector algebra. + +-/ + +lemma repJet_mem (U : GJ) {x : T.LocalFieldAlgebra} (hx : x ∈ T.CovSectorAlgebra S) : + T.repJet U x ∈ T.CovSectorAlgebra S := by + refine Algebra.apply_mem_of_mem_adjoin (T.repJetAlgHom U) (fun b hb => ?_) hx + refine covSectorGenerators_cases (P := fun b => T.repJetAlgHom U b ∈ T.CovSectorAlgebra S) hb + (fun hS l μ ν φ => ?_) (fun hS i n l φ => ?_) (fun hS i n l φ => ?_) + (fun hS j n l φ => ?_) (fun hS j n l φ => ?_) + · rw [← repJet_apply, repJet_covDerivFieldStrength] + exact covDerivFieldStrength_mem hS l μ ν _ + · rw [← repJet_apply, repJet_covDerivFermion] + exact covDerivFermion_mem hS i l _ + · rw [← repJet_apply, repJet_covDerivConjFermion] + exact covDerivConjFermion_mem hS i l _ + · rw [← repJet_apply, repJet_covDerivBoson] + exact covDerivBoson_mem hS j l _ + · rw [← repJet_apply, repJet_covDerivConjBoson] + exact covDerivConjBoson_mem hS j l _ + +lemma repLorentzGroup_mem (hGL : T.GaugeLorentzCompatible) (Λ : SL(2,ℂ)) + {x : T.LocalFieldAlgebra} (hx : x ∈ T.CovSectorAlgebra S) : + T.repLorentzGroup Λ x ∈ T.CovSectorAlgebra S := by + refine Algebra.apply_mem_of_mem_adjoin (T.repLorentzAlgHom Λ) (fun b hb => ?_) hx + refine covSectorGenerators_cases + (P := fun b => T.repLorentzAlgHom Λ b ∈ T.CovSectorAlgebra S) hb + (fun hS l μ ν φ => ?_) (fun hS i n l φ => ?_) (fun hS i n l φ => ?_) + (fun hS j n l φ => ?_) (fun hS j n l φ => ?_) + · exact repLorentzGroup_covDerivFieldStrength_mem Λ l μ ν φ + fun l' a b => covDerivFieldStrength_mem hS l' a b φ + · exact repLorentzGroup_covDerivFermion_mem Λ i (hGL.1 i) l φ + fun p ψ => covDerivFermion_mem hS i p ψ + · exact repLorentzGroup_covDerivConjFermion_mem Λ i (hGL.1 i) l φ + fun p ψ => covDerivConjFermion_mem hS i p ψ + · exact repLorentzGroup_covDerivBoson_mem Λ j (hGL.2 j) l φ + fun p ψ => covDerivBoson_mem hS j p ψ + · exact repLorentzGroup_covDerivConjBoson_mem Λ j (hGL.2 j) l φ + fun p ψ => covDerivConjBoson_mem hS j p ψ + +/-! + +## D. The restricted actions + +-/ + +variable (T S) + +/-- The jet gauge group acting on a covariant sector algebra, by restriction. -/ +noncomputable def repJet : Representation ℂ GJ (T.CovSectorAlgebra S) := + T.repJet.restrictSubalgebra (T.CovSectorAlgebra S) fun U _ hx => repJet_mem U hx + +/-- The Lorentz group acting on a covariant sector algebra, by restriction. -/ +noncomputable def repLorentzGroup (hGL : T.GaugeLorentzCompatible) : + Representation ℂ SL(2,ℂ) (T.CovSectorAlgebra S) := + T.repLorentzGroup.restrictSubalgebra (T.CovSectorAlgebra S) + fun Λ _ hx => repLorentzGroup_mem hGL Λ hx + +variable {T S} + +@[simp] +lemma coe_repJet (U : GJ) (x : T.CovSectorAlgebra S) : + (repJet T S U x : T.LocalFieldAlgebra) = T.repJet U x := rfl + +lemma repJet_apply_mul (U : GJ) (x y : T.CovSectorAlgebra S) : + repJet T S U (x * y) = repJet T S U x * repJet T S U y := + Subtype.ext (GaugeFieldData.repJet_apply_mul U (x : T.LocalFieldAlgebra) y) + +@[simp] +lemma coe_repLorentzGroup (hGL : T.GaugeLorentzCompatible) (Λ : SL(2,ℂ)) + (x : T.CovSectorAlgebra S) : + (repLorentzGroup T S hGL Λ x : T.LocalFieldAlgebra) = T.repLorentzGroup Λ x := rfl + +lemma repLorentzGroup_apply_mul (hGL : T.GaugeLorentzCompatible) (Λ : SL(2,ℂ)) + (x y : T.CovSectorAlgebra S) : + repLorentzGroup T S hGL Λ (x * y) + = repLorentzGroup T S hGL Λ x * repLorentzGroup T S hGL Λ y := + Subtype.ext (GaugeFieldData.repLorentzGroup_apply_mul Λ (x : T.LocalFieldAlgebra) y) + +/-! + +### D.1. The action of the ordinary gauge group + +-/ + +variable (T S) + +/-- The ordinary gauge group acting on a covariant sector algebra, through the constant + jets. -/ +noncomputable def repValue : Representation ℂ G₀ (T.CovSectorAlgebra S) := + (repJet T S).comp jets.ofConstant + +variable {T S} + +@[simp] +lemma coe_repValue (g : G₀) (x : T.CovSectorAlgebra S) : + (repValue T S g x : T.LocalFieldAlgebra) = T.repJet (jets.ofConstant g) x := rfl + +lemma repValue_apply_mul (g : G₀) (x y : T.CovSectorAlgebra S) : + repValue T S g (x * y) = repValue T S g x * repValue T S g y := + repJet_apply_mul (jets.ofConstant g) x y + +/-- Under `GaugeFieldData.PureJetsActTrivially`, the jet action factors through + evaluation: `LocalCovFieldAlgebra.repJet_eq_ofConstant_eval_of_mem` read on the + sector. -/ +lemma repJet_eq_repValue_eval (hP : T.PureJetsActTrivially) (U : GJ) + (x : T.CovSectorAlgebra S) : repJet T S U x = repValue T S (jets.eval U) x := + Subtype.ext (LocalCovFieldAlgebra.repJet_eq_ofConstant_eval_of_mem hP U + (le_localCovFieldAlgebra T S x.2)) + +/-! + +### D.2. The inclusions + +The restricted actions agree along `Subalgebra.inclusion` with those of a larger sector and +of the covariant field algebra. + +-/ + +lemma inclusion_repJet {S' : Finset FieldCategory} (h : S ⊆ S') (U : GJ) + (x : T.CovSectorAlgebra S) : + Subalgebra.inclusion (mono T h) (repJet T S U x) + = repJet T S' U (Subalgebra.inclusion (mono T h) x) := by + -- `rfl` unfolds the ambient action through its universal property and times out. + unfold repJet + exact Representation.inclusion_restrictSubalgebra T.repJet (mono T h) _ _ U x + +lemma inclusion_repLorentzGroup {S' : Finset FieldCategory} (h : S ⊆ S') + (hGL : T.GaugeLorentzCompatible) (Λ : SL(2,ℂ)) (x : T.CovSectorAlgebra S) : + Subalgebra.inclusion (mono T h) (repLorentzGroup T S hGL Λ x) + = repLorentzGroup T S' hGL Λ (Subalgebra.inclusion (mono T h) x) := by + unfold repLorentzGroup + exact Representation.inclusion_restrictSubalgebra T.repLorentzGroup (mono T h) _ _ Λ x + +lemma inclusion_repValue {S' : Finset FieldCategory} (h : S ⊆ S') (g : G₀) + (x : T.CovSectorAlgebra S) : + Subalgebra.inclusion (mono T h) (repValue T S g x) + = repValue T S' g (Subalgebra.inclusion (mono T h) x) := + inclusion_repJet h (jets.ofConstant g) x + +lemma inclusion_localCovFieldAlgebra_repJet (U : GJ) (x : T.CovSectorAlgebra S) : + Subalgebra.inclusion (le_localCovFieldAlgebra T S) (repJet T S U x) + = LocalCovFieldAlgebra.repJet T U (Subalgebra.inclusion (le_localCovFieldAlgebra T S) x) := by + unfold repJet LocalCovFieldAlgebra.repJet + exact Representation.inclusion_restrictSubalgebra T.repJet (le_localCovFieldAlgebra T S) + _ _ U x + +lemma inclusion_localCovFieldAlgebra_repLorentzGroup (hGL : T.GaugeLorentzCompatible) + (Λ : SL(2,ℂ)) (x : T.CovSectorAlgebra S) : + Subalgebra.inclusion (le_localCovFieldAlgebra T S) (repLorentzGroup T S hGL Λ x) + = LocalCovFieldAlgebra.repLorentzGroup T hGL Λ + (Subalgebra.inclusion (le_localCovFieldAlgebra T S) x) := by + unfold repLorentzGroup LocalCovFieldAlgebra.repLorentzGroup + exact Representation.inclusion_restrictSubalgebra T.repLorentzGroup + (le_localCovFieldAlgebra T S) _ _ Λ x + +lemma inclusion_localCovFieldAlgebra_repValue (g : G₀) (x : T.CovSectorAlgebra S) : + Subalgebra.inclusion (le_localCovFieldAlgebra T S) (repValue T S g x) + = LocalCovFieldAlgebra.repValue T g (Subalgebra.inclusion (le_localCovFieldAlgebra T S) x) := + inclusion_localCovFieldAlgebra_repJet (jets.ofConstant g) x + +end CovSectorAlgebra + +end GaugeFieldData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/CovariantDeriv.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/CovariantDeriv.lean index 79f4a26d8..6ef48b28e 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/CovariantDeriv.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/CovariantDeriv.lean @@ -39,7 +39,9 @@ and unconditionally for the field strength. - `GaugeFieldData.repJet_covDerivFermion` and companions : the gauge laws; `GaugeFieldData.repJet_covDerivFermion_ofConstant_eval` and companions : the factorization through evaluation. -- `GaugeFieldData.repLorentzGroup_covDerivFermion` and companions : the Lorentz laws. +- `GaugeFieldData.repLorentzGroup_covDerivFermion` and companions : the Lorentz laws; + `GaugeFieldData.repLorentzGroup_covDerivFermion_mem` and companions : a Lorentz + transformation of a tower element lies in any subalgebra containing the tower. ## iii. Table of contents @@ -47,6 +49,7 @@ and unconditionally for the field strength. - B. The included field-strength tower - C. The gauge laws - D. The Lorentz laws + - D.1. Transformed tower elements in a subalgebra containing the tower -/ @@ -403,6 +406,72 @@ theorem repLorentzGroup_covDerivFieldStrength {n : ℕ} (l : Fin n → (Fin 1 rw [includeConnection_one_tmul_real_smul] rfl +/-! + +### D.1. Transformed tower elements in a subalgebra containing the tower + +The Lorentz laws mix a tower element only with elements of the same tower, so its Lorentz +transformation lies in any subalgebra containing the required tower elements. This says +nothing about the other elements of such a subalgebra; the covariant field algebra and its +sector subalgebras obtain their stability from it by generation. + +-/ + +variable {S : Subalgebra ℂ T.LocalFieldAlgebra} + +/-- Under `MatterField.GaugeLorentzCompatible` for the species, a Lorentz transformation + carries an element of the covariant tower of a fermionic species into any subalgebra + containing the tower of that length. -/ +lemma repLorentzGroup_covDerivFermion_mem (i : T.FermionSpecies) + (hi : (T.fermion i).GaugeLorentzCompatible) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (T.FermionValue i)) + (hS : ∀ (p : Fin n → (Fin 1 ⊕ Fin 3)) (ψ : Module.Dual ℂ (T.FermionValue i)), + T.covDerivFermion i p ψ ∈ S) : + T.repLorentzGroup Λ (T.covDerivFermion i l φ) ∈ S := by + rw [repLorentzGroup_covDerivFermion Λ i hi l φ] + exact Subalgebra.sum_mem _ fun p _ => Subalgebra.smul_mem _ (hS p _) _ + +lemma repLorentzGroup_covDerivConjFermion_mem (i : T.FermionSpecies) + (hi : (T.fermion i).GaugeLorentzCompatible) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule (T.FermionValue i))) + (hS : ∀ (p : Fin n → (Fin 1 ⊕ Fin 3)) (ψ : Module.Dual ℂ (ConjModule (T.FermionValue i))), + T.covDerivConjFermion i p ψ ∈ S) : + T.repLorentzGroup Λ (T.covDerivConjFermion i l φ) ∈ S := by + rw [repLorentzGroup_covDerivConjFermion Λ i hi l φ] + exact Subalgebra.sum_mem _ fun p _ => Subalgebra.smul_mem _ (hS p _) _ + +lemma repLorentzGroup_covDerivBoson_mem (j : T.BosonSpecies) + (hj : (T.boson j).GaugeLorentzCompatible) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (T.BosonValue j)) + (hS : ∀ (p : Fin n → (Fin 1 ⊕ Fin 3)) (ψ : Module.Dual ℂ (T.BosonValue j)), + T.covDerivBoson j p ψ ∈ S) : + T.repLorentzGroup Λ (T.covDerivBoson j l φ) ∈ S := by + rw [repLorentzGroup_covDerivBoson Λ j hj l φ] + exact Subalgebra.sum_mem _ fun p _ => Subalgebra.smul_mem _ (hS p _) _ + +lemma repLorentzGroup_covDerivConjBoson_mem (j : T.BosonSpecies) + (hj : (T.boson j).GaugeLorentzCompatible) {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule (T.BosonValue j))) + (hS : ∀ (p : Fin n → (Fin 1 ⊕ Fin 3)) (ψ : Module.Dual ℂ (ConjModule (T.BosonValue j))), + T.covDerivConjBoson j p ψ ∈ S) : + T.repLorentzGroup Λ (T.covDerivConjBoson j l φ) ∈ S := by + rw [repLorentzGroup_covDerivConjBoson Λ j hj l φ] + exact Subalgebra.sum_mem _ fun p _ => Subalgebra.smul_mem _ (hS p _) _ + +/-- A Lorentz transformation carries an element of the field-strength tower into any + subalgebra containing the whole tower of its adjoint covector, with no condition. -/ +lemma repLorentzGroup_covDerivFieldStrength_mem (l : List (Fin 1 ⊕ Fin 3)) + (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) + (hS : ∀ (l' : List (Fin 1 ⊕ Fin 3)) (a b : Fin 1 ⊕ Fin 3), + T.covDerivFieldStrength l' a b φ ∈ S) : + T.repLorentzGroup Λ (T.covDerivFieldStrength l μ ν φ) ∈ S := by + obtain ⟨n, l', rfl⟩ : ∃ (n : ℕ) (l' : Fin n → (Fin 1 ⊕ Fin 3)), l = List.ofFn l' := + ⟨_, l.get, (List.ofFn_get l).symm⟩ + rw [repLorentzGroup_covDerivFieldStrength] + exact Subalgebra.sum_mem _ fun p _ => Subalgebra.smul_mem _ + (Subalgebra.sum_mem _ fun a _ => Subalgebra.smul_mem _ + (Subalgebra.sum_mem _ fun b _ => Subalgebra.smul_mem _ (hS _ a b) _) _) _ + end LorentzLaws end GaugeFieldData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Sector.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Sector.lean new file mode 100644 index 000000000..b791cfe76 --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Sector.lean @@ -0,0 +1,363 @@ +/- +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.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.TransformsIn +public import Physlib.Mathematics.AlgebraRepresentation +/-! +# The ordinary sector algebras of the local field algebra + +## i. Overview + +A sector is a finite set of `GaugeFieldData.FieldCategory`, chosen among `fermion`, `gauge` +and `scalar`. It selects ordinary generator families of the local field algebra `J(T)` of a +field datum: the derivative symbols `∂_s ψ` of every fermionic species and their conjugates +for `fermion`, those of every bosonic species and their conjugates for `scalar`, and the +connection symbols `∂_s A_μ` for `gauge`. The ordinary sector algebra `T.SectorAlgebra S` +is the complex unital subalgebra of `J(T)` generated by the selected families. + +The category `scalar` names the bosonic species `T.BosonSpecies` of the datum; a bosonic +`MatterField` need not be a Lorentz scalar, and the selection does not assert that it is. +A sector selects generator families only: no multiplicity of fields, mass dimension, gauge +invariance or Lagrangian term is encoded. + +## ii. Key results + +- `GaugeFieldData.FieldCategory` : the three categories of fields. +- `GaugeFieldData.SectorAlgebra` : the ordinary sector algebra of a sector, with + `SectorAlgebra.induction` and `SectorAlgebra.algHom_ext`. +- `SectorAlgebra.mono`, `SectorAlgebra.empty`, `SectorAlgebra.univ`, + `SectorAlgebra.union` : the lattice laws of the selection. +- `SectorAlgebra.repJet`, `SectorAlgebra.repLorentzGroup` : the restricted actions. + +## iii. Table of contents + +- A. Field categories and their ordinary generators +- B. The ordinary sector algebra + - B.1. Membership of the selected families + - B.2. Generation + - B.3. The lattice laws of the selection +- C. Stability under the actions +- D. The restricted actions + +-/ + +@[expose] public section + +open TensorProduct Matrix MatrixGroups + +namespace GaugeFieldData + +/-! + +## A. Field categories and their ordinary generators + +-/ + +/-- The categories of fields a sector may select. -/ +inductive FieldCategory where + /-- The fermionic species. -/ + | fermion : FieldCategory + /-- The gauge bosons. -/ + | gauge : FieldCategory + /-- The bosonic species. -/ + | scalar : FieldCategory +deriving DecidableEq + +/-- The three categories exhaust `FieldCategory`. -/ +instance : Fintype FieldCategory where + elems := {FieldCategory.fermion, FieldCategory.gauge, FieldCategory.scalar} + complete := fun c => by cases c <;> decide + +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} (T : GaugeFieldData jets) + +/-- The ordinary generators of one field category. -/ +def categoryGenerators : FieldCategory → Set T.LocalFieldAlgebra + | .fermion => Set.range T.ιFermionTotal + | .gauge => Set.range T.ιConnection + | .scalar => Set.range T.ιBosonTotal + +/-- The ordinary generators selected by a sector. -/ +def sectorGenerators (S : Finset FieldCategory) : Set T.LocalFieldAlgebra := + ⋃ c ∈ S, T.categoryGenerators c + +lemma sectorGenerators_mono {S S' : Finset FieldCategory} (h : S ⊆ S') : + T.sectorGenerators S ⊆ T.sectorGenerators S' := + Set.iUnion₂_subset fun _ hc => Finset.subset_set_biUnion_of_mem (h hc) + +@[simp] +lemma sectorGenerators_empty : T.sectorGenerators ∅ = ∅ := by + simp [sectorGenerators] + +lemma sectorGenerators_union (S S' : Finset FieldCategory) : + T.sectorGenerators (S ∪ S') = T.sectorGenerators S ∪ T.sectorGenerators S' := + Finset.set_biUnion_union S S' _ + +/-- The full sector selects the generators of the local field algebra. -/ +lemma sectorGenerators_univ : T.sectorGenerators Finset.univ = T.generators := by + ext x + simp only [sectorGenerators, Finset.mem_univ, Set.iUnion_true, Set.mem_iUnion] + constructor + · rintro ⟨c, hc⟩ + cases c + · exact Or.inl (Or.inl hc) + · exact Or.inr hc + · exact Or.inl (Or.inr hc) + · rintro ((h | h) | h) + exacts [⟨.fermion, h⟩, ⟨.scalar, h⟩, ⟨.gauge, h⟩] + +/-! + +## B. The ordinary sector algebra + +-/ + +/-- The ordinary sector algebra of a sector `S`: the subalgebra of the local field algebra + generated by the ordinary generators of the selected categories. -/ +noncomputable def SectorAlgebra (S : Finset FieldCategory) : Subalgebra ℂ T.LocalFieldAlgebra := + Algebra.adjoin ℂ (T.sectorGenerators S) + +namespace SectorAlgebra + +variable {T} {S : Finset FieldCategory} + +/-! + +### B.1. Membership of the selected families + +-/ + +lemma ιFermionTotal_mem (hS : FieldCategory.fermion ∈ S) (v : T.FermionGenerators) : + T.ιFermionTotal v ∈ T.SectorAlgebra S := + Algebra.subset_adjoin + (Finset.subset_set_biUnion_of_mem (f := T.categoryGenerators) hS ⟨v, rfl⟩) + +lemma ιFermion_mem (hS : FieldCategory.fermion ∈ S) (i : T.FermionSpecies) + (x : JetComponentSpace (T.fermion i)) : T.ιFermion i x ∈ T.SectorAlgebra S := + ιFermionTotal_mem hS _ + +lemma fermionSymbol_mem (hS : FieldCategory.fermion ∈ S) (i : T.FermionSpecies) + (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (T.FermionValue i)) : + T.fermionSymbol i s φ ∈ T.SectorAlgebra S := + ιFermion_mem hS i _ + +lemma conjFermionSymbol_mem (hS : FieldCategory.fermion ∈ S) (i : T.FermionSpecies) + (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule (T.FermionValue i))) : + T.conjFermionSymbol i s φ ∈ T.SectorAlgebra S := + ιFermion_mem hS i _ + +lemma ιBosonTotal_mem (hS : FieldCategory.scalar ∈ S) (v : T.BosonGenerators) : + T.ιBosonTotal v ∈ T.SectorAlgebra S := + Algebra.subset_adjoin + (Finset.subset_set_biUnion_of_mem (f := T.categoryGenerators) hS ⟨v, rfl⟩) + +lemma ιBoson_mem (hS : FieldCategory.scalar ∈ S) (j : T.BosonSpecies) + (y : JetComponentSpace (T.boson j)) : T.ιBoson j y ∈ T.SectorAlgebra S := + ιBosonTotal_mem hS _ + +lemma bosonSymbol_mem (hS : FieldCategory.scalar ∈ S) (j : T.BosonSpecies) + (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (T.BosonValue j)) : + T.bosonSymbol j s φ ∈ T.SectorAlgebra S := + ιBoson_mem hS j _ + +lemma conjBosonSymbol_mem (hS : FieldCategory.scalar ∈ S) (j : T.BosonSpecies) + (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule (T.BosonValue j))) : + T.conjBosonSymbol j s φ ∈ T.SectorAlgebra S := + ιBoson_mem hS j _ + +lemma ιConnection_mem (hS : FieldCategory.gauge ∈ S) (v : GaugeBoson.JetComponentSpace 𝔤) : + T.ιConnection v ∈ T.SectorAlgebra S := + Algebra.subset_adjoin + (Finset.subset_set_biUnion_of_mem (f := T.categoryGenerators) hS ⟨v, rfl⟩) + +/-! + +### B.2. Generation + +-/ + +/-- Case analysis on the generators of a sector. -/ +lemma sectorGenerators_cases {P : T.LocalFieldAlgebra → Prop} {b : T.LocalFieldAlgebra} + (hb : b ∈ T.sectorGenerators S) + (hf : FieldCategory.fermion ∈ S → ∀ v, P (T.ιFermionTotal v)) + (hs : FieldCategory.scalar ∈ S → ∀ v, P (T.ιBosonTotal v)) + (hg : FieldCategory.gauge ∈ S → ∀ v, P (T.ιConnection v)) : P b := by + simp only [sectorGenerators, Set.mem_iUnion, exists_prop] at hb + obtain ⟨c, hc, hbc⟩ := hb + cases c with + | fermion => obtain ⟨v, rfl⟩ := hbc; exact hf hc v + | gauge => obtain ⟨v, rfl⟩ := hbc; exact hg hc v + | scalar => obtain ⟨v, rfl⟩ := hbc; exact hs hc v + +/-- A property holding on the selected generators and the scalars and closed under sums + and products holds on the sector algebra. -/ +lemma induction {P : T.LocalFieldAlgebra → Prop} {x : T.LocalFieldAlgebra} + (hx : x ∈ T.SectorAlgebra S) + (hf : FieldCategory.fermion ∈ S → ∀ v, P (T.ιFermionTotal v)) + (hs : FieldCategory.scalar ∈ S → ∀ v, P (T.ιBosonTotal v)) + (hg : FieldCategory.gauge ∈ S → ∀ v, P (T.ιConnection v)) + (halg : ∀ z : ℂ, P (z • (1 : T.LocalFieldAlgebra))) + (hadd : ∀ x y, P x → P y → P (x + y)) + (hmul : ∀ x y, P x → P y → P (x * y)) : P x := by + induction hx using Algebra.adjoin_induction with + | mem b hb => exact sectorGenerators_cases hb hf hs hg + | algebraMap z => + rw [Algebra.algebraMap_eq_smul_one] + exact halg z + | add a b _ _ ha hb => exact hadd a b ha hb + | mul a b _ _ ha hb => exact hmul a b ha hb + +/-- Two algebra maps out of a sector algebra agreeing on the selected generators are + equal. This is uniqueness only: a sector algebra is not free on its generators. -/ +lemma algHom_ext {B : Type} [Semiring B] [Algebra ℂ B] + {f g : ↥(T.SectorAlgebra S) →ₐ[ℂ] B} + (hf : ∀ (hS : FieldCategory.fermion ∈ S) (v : T.FermionGenerators), + f ⟨T.ιFermionTotal v, ιFermionTotal_mem hS v⟩ = g ⟨T.ιFermionTotal v, ιFermionTotal_mem hS v⟩) + (hs : ∀ (hS : FieldCategory.scalar ∈ S) (v : T.BosonGenerators), + f ⟨T.ιBosonTotal v, ιBosonTotal_mem hS v⟩ = g ⟨T.ιBosonTotal v, ιBosonTotal_mem hS v⟩) + (hg : ∀ (hS : FieldCategory.gauge ∈ S) (v : GaugeBoson.JetComponentSpace 𝔤), + f ⟨T.ιConnection v, ιConnection_mem hS v⟩ = g ⟨T.ιConnection v, ιConnection_mem hS v⟩) : + f = g := by + refine AlgHom.ext_of_eq_adjoin rfl fun b hb => ?_ + refine sectorGenerators_cases (P := fun b => ∀ hb' : b ∈ T.SectorAlgebra S, + f ⟨b, hb'⟩ = g ⟨b, hb'⟩) hb ?_ ?_ ?_ (Algebra.subset_adjoin hb) + · intro hS v _ + exact hf hS v + · intro hS v _ + exact hs hS v + · intro hS v _ + exact hg hS v + +/-! + +### B.3. The lattice laws of the selection + +-/ + +variable (T) + +lemma mono {S S' : Finset FieldCategory} (h : S ⊆ S') : + T.SectorAlgebra S ≤ T.SectorAlgebra S' := + Algebra.adjoin_mono (sectorGenerators_mono T h) + +/-- The empty sector algebra is the image of the scalars. -/ +@[simp] +lemma empty : T.SectorAlgebra ∅ = ⊥ := by + unfold SectorAlgebra + rw [sectorGenerators_empty, Algebra.adjoin_empty] + +@[simp] +lemma univ : T.SectorAlgebra Finset.univ = ⊤ := by + unfold SectorAlgebra + rw [sectorGenerators_univ, adjoin_generators_eq_top] + +lemma union (S S' : Finset FieldCategory) : + T.SectorAlgebra (S ∪ S') = T.SectorAlgebra S ⊔ T.SectorAlgebra S' := by + unfold SectorAlgebra + rw [sectorGenerators_union, Algebra.adjoin_union] + +variable {T} + +/-! + +## C. Stability under the actions + +Each generator law of `J(T)` stays inside the family of the generator it acts on, the +connection law up to a scalar shift, so both actions preserve every sector algebra. + +-/ + +lemma repJet_mem (U : GJ) {x : T.LocalFieldAlgebra} (hx : x ∈ T.SectorAlgebra S) : + T.repJet U x ∈ T.SectorAlgebra S := by + refine Algebra.apply_mem_of_mem_adjoin (T.repJetAlgHom U) (fun b hb => ?_) hx + refine sectorGenerators_cases (P := fun b => T.repJetAlgHom U b ∈ T.SectorAlgebra S) hb + (fun hS v => ?_) (fun hS v => ?_) (fun hS v => ?_) + · refine DirectSum.mem_of_lof (F := (T.repJetAlgHom U).toLinearMap ∘ₗ T.ιFermionTotal) + (fun i x => ?_) v + show T.repJet U (T.ιFermion i x) ∈ _ + rw [repJet_ιFermion] + exact ιFermion_mem hS i _ + · refine DirectSum.mem_of_lof (F := (T.repJetAlgHom U).toLinearMap ∘ₗ T.ιBosonTotal) + (fun j y => ?_) v + show T.repJet U (T.ιBoson j y) ∈ _ + rw [repJet_ιBoson] + exact ιBoson_mem hS j _ + · rw [← repJet_apply, repJet_ιConnection_affine] + exact add_mem (ιConnection_mem hS _) (Subalgebra.smul_mem _ (one_mem _) _) + +lemma repLorentzGroup_mem (Λ : SL(2,ℂ)) {x : T.LocalFieldAlgebra} (hx : x ∈ T.SectorAlgebra S) : + T.repLorentzGroup Λ x ∈ T.SectorAlgebra S := by + refine Algebra.apply_mem_of_mem_adjoin (T.repLorentzAlgHom Λ) (fun b hb => ?_) hx + refine sectorGenerators_cases (P := fun b => T.repLorentzAlgHom Λ b ∈ T.SectorAlgebra S) hb + (fun hS v => ?_) (fun hS v => ?_) (fun hS v => ?_) + · refine DirectSum.mem_of_lof (F := (T.repLorentzAlgHom Λ).toLinearMap ∘ₗ T.ιFermionTotal) + (fun i x => ?_) v + show T.repLorentzGroup Λ (T.ιFermion i x) ∈ _ + rw [repLorentzGroup_ιFermion] + exact ιFermion_mem hS i _ + · refine DirectSum.mem_of_lof (F := (T.repLorentzAlgHom Λ).toLinearMap ∘ₗ T.ιBosonTotal) + (fun j y => ?_) v + show T.repLorentzGroup Λ (T.ιBoson j y) ∈ _ + rw [repLorentzGroup_ιBoson] + exact ιBoson_mem hS j _ + · rw [← repLorentzGroup_apply, repLorentzGroup_ιConnection_eq] + exact ιConnection_mem hS _ + +/-! + +## D. The restricted actions + +The restricted actions of two nested sectors agree along `Subalgebra.inclusion`. + +-/ + +variable (T S) + +/-- The jet gauge group acting on a sector algebra, by restriction. -/ +noncomputable def repJet : Representation ℂ GJ (T.SectorAlgebra S) := + T.repJet.restrictSubalgebra (T.SectorAlgebra S) fun U _ hx => repJet_mem U hx + +/-- The Lorentz group acting on a sector algebra, by restriction. -/ +noncomputable def repLorentzGroup : Representation ℂ SL(2,ℂ) (T.SectorAlgebra S) := + T.repLorentzGroup.restrictSubalgebra (T.SectorAlgebra S) fun Λ _ hx => repLorentzGroup_mem Λ hx + +variable {T S} + +@[simp] +lemma coe_repJet (U : GJ) (x : T.SectorAlgebra S) : + (repJet T S U x : T.LocalFieldAlgebra) = T.repJet U x := rfl + +lemma repJet_apply_mul (U : GJ) (x y : T.SectorAlgebra S) : + repJet T S U (x * y) = repJet T S U x * repJet T S U y := + Subtype.ext (GaugeFieldData.repJet_apply_mul U (x : T.LocalFieldAlgebra) y) + +@[simp] +lemma coe_repLorentzGroup (Λ : SL(2,ℂ)) (x : T.SectorAlgebra S) : + (repLorentzGroup T S Λ x : T.LocalFieldAlgebra) = T.repLorentzGroup Λ x := rfl + +lemma repLorentzGroup_apply_mul (Λ : SL(2,ℂ)) (x y : T.SectorAlgebra S) : + repLorentzGroup T S Λ (x * y) = repLorentzGroup T S Λ x * repLorentzGroup T S Λ y := + Subtype.ext (GaugeFieldData.repLorentzGroup_apply_mul Λ (x : T.LocalFieldAlgebra) y) + +lemma inclusion_repJet {S' : Finset FieldCategory} (h : S ⊆ S') (U : GJ) (x : T.SectorAlgebra S) : + Subalgebra.inclusion (mono T h) (repJet T S U x) + = repJet T S' U (Subalgebra.inclusion (mono T h) x) := by + -- `rfl` unfolds the ambient action through its universal property and times out. + unfold repJet + exact Representation.inclusion_restrictSubalgebra T.repJet (mono T h) _ _ U x + +lemma inclusion_repLorentzGroup {S' : Finset FieldCategory} (h : S ⊆ S') (Λ : SL(2,ℂ)) + (x : T.SectorAlgebra S) : + Subalgebra.inclusion (mono T h) (repLorentzGroup T S Λ x) + = repLorentzGroup T S' Λ (Subalgebra.inclusion (mono T h) x) := by + unfold repLorentzGroup + exact Representation.inclusion_restrictSubalgebra T.repLorentzGroup (mono T h) _ _ Λ x + +end SectorAlgebra + +end GaugeFieldData diff --git a/Physlib/Mathematics/AlgebraGeneration.lean b/Physlib/Mathematics/AlgebraGeneration.lean index 1831358bf..8054e48cf 100644 --- a/Physlib/Mathematics/AlgebraGeneration.lean +++ b/Physlib/Mathematics/AlgebraGeneration.lean @@ -32,8 +32,10 @@ Nothing here has physics content, and nothing is assumed finite. ## ii. Key results -- `Algebra.range_le_of_adjoin_eq_top`, `Algebra.commute_of_adjoin_eq_top` : the range of an - algebra map, and its commutation with an element, are determined on a generating set. +- `Algebra.range_le_of_adjoin_eq_top`, `Algebra.apply_mem_of_mem_adjoin`, + `Algebra.commute_of_adjoin_eq_top` : the range of an algebra map, the subalgebras it + carries a generated subalgebra into, and its commutation with an element, are + determined on a generating set. - `Algebra.TensorProduct.eq_top_of_tmul_one_of_one_tmul` : a tensor product is generated by its two factors. - `Algebra.TensorProduct.adjoin_one_tmul_eq_top` : extension of scalars preserves @@ -81,6 +83,13 @@ lemma range_le_of_adjoin_eq_top {s : Set A} (hs : Algebra.adjoin R s = ⊤) (φ rw [← Algebra.map_top, ← hs, AlgHom.map_adjoin] exact Algebra.adjoin_le (Set.image_subset_iff.mpr h) +/-- An algebra map carrying a generating set into a subalgebra `S` carries the generated + subalgebra into `S`. This is what extends the stability of a subalgebra under an + endomorphism from its generators to all of its elements. -/ +lemma apply_mem_of_mem_adjoin {s : Set A} (φ : A →ₐ[R] B) {S : Subalgebra R B} + (h : ∀ x ∈ s, φ x ∈ S) {x : A} (hx : x ∈ Algebra.adjoin R s) : φ x ∈ S := + (Subalgebra.mem_comap S φ x).mp (Algebra.adjoin_le (S := S.comap φ) h hx) + /-- If `s` generates `A` and `y` commutes with the image of `s` under an algebra map, then `y` commutes with the whole image. This is what extends a commutation relation from generators to a factor of a tensor product. -/ diff --git a/Physlib/Mathematics/AlgebraRepresentation.lean b/Physlib/Mathematics/AlgebraRepresentation.lean index b3e700892..1ae584156 100644 --- a/Physlib/Mathematics/AlgebraRepresentation.lean +++ b/Physlib/Mathematics/AlgebraRepresentation.lean @@ -42,7 +42,8 @@ for when a representation acts on generators by a shift. - `Representation.tprod_apply_one`, `Representation.tprod_apply_one_tmul`, `Representation.tprod_apply_tmul_one` : the unit laws on a tensor product. - `Representation.tprod_apply_mul` : multiplicativity on a tensor product. -- `Representation.restrictSubalgebra` : the restriction to an invariant subalgebra. +- `Representation.restrictSubalgebra` : the restriction to an invariant subalgebra, with + `Representation.inclusion_restrictSubalgebra` for two nested ones. - `Representation.restrictScalars` : the restriction of scalars. - `Representation.toAlgHom` : a multiplicative representation of a group as algebra maps. - `Representation.EquivariantAlgHom` : an algebra map intertwining two pairs of @@ -148,6 +149,15 @@ lemma coe_restrictSubalgebra {k A G : Type*} [CommSemiring k] (hS : ∀ (g : G) {x : A}, x ∈ S → ρ g x ∈ S) (g : G) (x : S) : (ρ.restrictSubalgebra S hS g x : A) = ρ g (x : A) := rfl +/-- The restrictions to two nested invariant subalgebras agree along the inclusion of the + smaller into the larger. -/ +lemma inclusion_restrictSubalgebra {k A G : Type*} [CommSemiring k] + [Monoid G] [Semiring A] [Algebra k A] (ρ : Representation k G A) {S S' : Subalgebra k A} + (h : S ≤ S') (hS : ∀ (g : G) {x : A}, x ∈ S → ρ g x ∈ S) + (hS' : ∀ (g : G) {x : A}, x ∈ S' → ρ g x ∈ S') (g : G) (x : S) : + Subalgebra.inclusion h (ρ.restrictSubalgebra S hS g x) + = ρ.restrictSubalgebra S' hS' g (Subalgebra.inclusion h x) := rfl + /-! ## C. Restriction of scalars From 4bb847b7297877564ef794c1dd7453b8de48e117 Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Mon, 14 Sep 2026 03:27:07 +0400 Subject: [PATCH 329/367] feat: define sector realizations and restriction maps --- Physlib.lean | 2 + .../LocalCovFieldAlgebra/Realization.lean | 3 + .../SectorRealization.lean | 308 ++++++++++++++++++ .../LocalFieldAlgebra/SectorRealization.lean | 217 ++++++++++++ .../Mathematics/AlgebraRepresentation.lean | 33 +- 5 files changed, 555 insertions(+), 8 deletions(-) create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/LocalCovFieldAlgebra/SectorRealization.lean create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/SectorRealization.lean diff --git a/Physlib.lean b/Physlib.lean index 46cfd41e8..447dbe1db 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -27,6 +27,7 @@ public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeFieldData.FermionMod public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalCovFieldAlgebra.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalCovFieldAlgebra.Realization public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalCovFieldAlgebra.Sector +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalCovFieldAlgebra.SectorRealization public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.CovariantDeriv public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.Basic @@ -45,6 +46,7 @@ public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.JetRep public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.LorentzAction public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.Realization public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.Sector +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.SectorRealization public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.TransformsIn public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.AdjointCoeff public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Basic diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalCovFieldAlgebra/Realization.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalCovFieldAlgebra/Realization.lean index ce60e2db1..95f045b6d 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalCovFieldAlgebra/Realization.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalCovFieldAlgebra/Realization.lean @@ -329,6 +329,9 @@ noncomputable def restrict : (fun U _ hx => LocalCovFieldAlgebra.repJet_mem U hx) (fun Λ _ hx => LocalCovFieldAlgebra.repLorentzGroup_mem hGL Λ hx)).compFst jets.ofConstant +lemma restrict_toAlgHom : (h.restrict hGL).toAlgHom = h.toAlgHom.comp T.LocalCovFieldAlgebra.val := + rfl + @[simp] lemma restrict_toAlgHom_apply (x : ↥T.LocalCovFieldAlgebra) : (h.restrict hGL).toAlgHom x = h.toAlgHom x := rfl diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalCovFieldAlgebra/SectorRealization.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalCovFieldAlgebra/SectorRealization.lean new file mode 100644 index 000000000..a11d90bc0 --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalCovFieldAlgebra/SectorRealization.lean @@ -0,0 +1,308 @@ +/- +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.ClassicalFieldTheory.GaugeTheory.LocalCovFieldAlgebra.Realization +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalCovFieldAlgebra.Sector +/-! +# Realizations of the covariant sector algebras + +## i. Overview + +A complex algebra `B` carries the covariant sector `S` of a field datum when the covariant +sector algebra `T.CovSectorAlgebra S` maps into it by a complex algebra map equivariant for +the ordinary gauge group `G₀` and for the Lorentz group, both acting on `B` by algebra +endomorphisms: `GaugeFieldData.CovSectorAlgebra.Realization`. The source gauge action is the +jet action at the constant jets; the source Lorentz action exists under +`GaugeFieldData.GaugeLorentzCompatible`, which the type carries. + +A covariant sector algebra is not free on its towers, so only uniqueness from the tower +images is asserted (`Realization.ext_towers`). Realizations restrict along +`Subalgebra.inclusion` into a covariant sector from the covariant field algebra, from a larger +covariant sector, and from the local field algebra, with `G₀` acting on the target through the +constant jets; successive restrictions agree with the direct ones. An ordinary sector +realization does not restrict to the covariant sector of the same selection, which need not +lie in it. + +`GaugeFieldData.PureJetsActTrivially` is used only in `Realization.map_repJet`. + +## ii. Key results + +- `GaugeFieldData.CovSectorAlgebra.Realization` : an algebra carrying a covariant sector. +- `GaugeFieldData.CovSectorAlgebra.Realization.restrict` : restriction to a smaller sector, + with `restrict_restrict`. +- `GaugeFieldData.LocalCovFieldAlgebra.Realization.restrictSector` : restriction of a + realization of the covariant field algebra to a sector, with its tower computation rules + and `restrict_restrictSector`. +- `GaugeFieldData.Realization.restrictCovSector` : restriction of a realization of the local + field algebra to a covariant sector, with `restrictSector_restrict` identifying it with + the restriction through the covariant field algebra. + +## iii. Table of contents + +- A. Sector realizations +- B. Restriction to a smaller sector +- C. Restriction from the covariant field algebra +- D. Restriction from the local field algebra + +-/ + +@[expose] public section + +open TensorProduct Matrix MatrixGroups Lorentz + +namespace GaugeFieldData + +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} {T : GaugeFieldData jets} + +namespace CovSectorAlgebra + +/-! + +## A. Sector realizations + +-/ + +/-- A complex algebra `B` carrying the covariant sector `S` of the datum `T`: a complex + algebra map out of the covariant sector algebra, equivariant for the ordinary gauge group + and the Lorentz group, both acting on the whole of `B` by algebra endomorphisms. The source + Lorentz action needs `hGL`; no other species condition is used. The lemmas `map_repValue`, + `map_repLorentz`, `repGauge_mul` and `repLorentz_mul` name its fields. -/ +abbrev Realization (T : GaugeFieldData jets) (S : Finset FieldCategory) + (hGL : T.GaugeLorentzCompatible) (B : Type) [Semiring B] [Algebra ℂ B] + (repGauge : Representation ℂ G₀ B) (repLorentz : Representation ℂ SL(2,ℂ) B) := + Representation.EquivariantAlgHom (repValue T S) repGauge (repLorentzGroup T S hGL) repLorentz + +namespace Realization + +variable {S : Finset FieldCategory} {B : Type} [Semiring B] [Algebra ℂ B] + {repGauge : Representation ℂ G₀ B} {repLorentz : Representation ℂ SL(2,ℂ) B} + {hGL : T.GaugeLorentzCompatible} + +variable (T S hGL) in +/-- A covariant sector algebra realized in itself, by the identity. -/ +noncomputable def id : + Realization T S hGL (T.CovSectorAlgebra S) (repValue T S) (repLorentzGroup T S hGL) := + Representation.EquivariantAlgHom.id _ _ repValue_apply_mul (repLorentzGroup_apply_mul hGL) + +@[simp] +lemma id_toAlgHom : (id T S hGL).toAlgHom = AlgHom.id ℂ (T.CovSectorAlgebra S) := rfl + +variable (k : Realization T S hGL B repGauge repLorentz) + +lemma map_repValue (g : G₀) (x : T.CovSectorAlgebra S) : + k.toAlgHom (repValue T S g x) = repGauge g (k.toAlgHom x) := + k.map_fst g x + +lemma map_repLorentz (Λ : SL(2,ℂ)) (x : T.CovSectorAlgebra S) : + k.toAlgHom (repLorentzGroup T S hGL Λ x) = repLorentz Λ (k.toAlgHom x) := + k.map_snd Λ x + +include k in +lemma repGauge_mul (g : G₀) (b₁ b₂ : B) : + repGauge g (b₁ * b₂) = repGauge g b₁ * repGauge g b₂ := + k.fst_mul g b₁ b₂ + +include k in +lemma repLorentz_mul (Λ : SL(2,ℂ)) (b₁ b₂ : B) : + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂ := + k.snd_mul Λ b₁ b₂ + +/-- A sector realization is determined by its images of the selected towers; uniqueness + only, the algebra not being free on its towers. -/ +lemma ext_towers {k₁ k₂ : Realization T S hGL B repGauge repLorentz} + (hF : ∀ (hS : FieldCategory.gauge ∈ S) (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ 𝔤), + k₁.toAlgHom ⟨T.covDerivFieldStrength l μ ν φ, covDerivFieldStrength_mem hS l μ ν φ⟩ + = k₂.toAlgHom ⟨T.covDerivFieldStrength l μ ν φ, covDerivFieldStrength_mem hS l μ ν φ⟩) + (hψ : ∀ (hS : FieldCategory.fermion ∈ S) (i : T.FermionSpecies) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (T.FermionValue i)), + k₁.toAlgHom ⟨T.covDerivFermion i l φ, covDerivFermion_mem hS i l φ⟩ + = k₂.toAlgHom ⟨T.covDerivFermion i l φ, covDerivFermion_mem hS i l φ⟩) + (hψc : ∀ (hS : FieldCategory.fermion ∈ S) (i : T.FermionSpecies) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule (T.FermionValue i))), + k₁.toAlgHom ⟨T.covDerivConjFermion i l φ, covDerivConjFermion_mem hS i l φ⟩ + = k₂.toAlgHom ⟨T.covDerivConjFermion i l φ, covDerivConjFermion_mem hS i l φ⟩) + (hφ : ∀ (hS : FieldCategory.scalar ∈ S) (j : T.BosonSpecies) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (T.BosonValue j)), + k₁.toAlgHom ⟨T.covDerivBoson j l φ, covDerivBoson_mem hS j l φ⟩ + = k₂.toAlgHom ⟨T.covDerivBoson j l φ, covDerivBoson_mem hS j l φ⟩) + (hφc : ∀ (hS : FieldCategory.scalar ∈ S) (j : T.BosonSpecies) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule (T.BosonValue j))), + k₁.toAlgHom ⟨T.covDerivConjBoson j l φ, covDerivConjBoson_mem hS j l φ⟩ + = k₂.toAlgHom ⟨T.covDerivConjBoson j l φ, covDerivConjBoson_mem hS j l φ⟩) : + k₁ = k₂ := + Representation.EquivariantAlgHom.ext (algHom_ext hF hψ hψc hφ hφc) + +/-- Under `GaugeFieldData.PureJetsActTrivially` the jet action factors through evaluation: + a jet acts on the realized image as its value. -/ +lemma map_repJet (hP : T.PureJetsActTrivially) (U : GJ) (x : T.CovSectorAlgebra S) : + k.toAlgHom (repJet T S U x) = repGauge (jets.eval U) (k.toAlgHom x) := by + rw [repJet_eq_repValue_eval hP, k.map_repValue] + +/-! + +## B. Restriction to a smaller sector + +-/ + +variable {S' : Finset FieldCategory} + +/-- The restriction of a covariant sector realization to a smaller sector. -/ +noncomputable def restrict (k : Realization T S' hGL B repGauge repLorentz) (hS : S ⊆ S') : + Realization T S hGL B repGauge repLorentz := + k.comp (Subalgebra.inclusion (mono T hS)) (inclusion_repValue hS) + (inclusion_repLorentzGroup hS hGL) + +lemma restrict_toAlgHom (k : Realization T S' hGL B repGauge repLorentz) (hS : S ⊆ S') : + (k.restrict hS).toAlgHom = k.toAlgHom.comp (Subalgebra.inclusion (mono T hS)) := rfl + +@[simp] +lemma restrict_toAlgHom_apply (k : Realization T S' hGL B repGauge repLorentz) (hS : S ⊆ S') + (x : T.CovSectorAlgebra S) : + (k.restrict hS).toAlgHom x = k.toAlgHom (Subalgebra.inclusion (mono T hS) x) := rfl + +lemma restrict_toAlgHom_mk (k : Realization T S' hGL B repGauge repLorentz) (hS : S ⊆ S') + (x : T.LocalFieldAlgebra) (hx : x ∈ T.CovSectorAlgebra S) : + (k.restrict hS).toAlgHom ⟨x, hx⟩ = k.toAlgHom ⟨x, mono T hS hx⟩ := rfl + +lemma restrict_id_toAlgHom (hS : S ⊆ S') : + ((id T S' hGL).restrict hS).toAlgHom = Subalgebra.inclusion (mono T hS) := + AlgHom.ext fun _ => rfl + +lemma restrict_restrict {S'' : Finset FieldCategory} + (k : Realization T S'' hGL B repGauge repLorentz) (hS' : S' ⊆ S'') (hS : S ⊆ S') : + (k.restrict hS').restrict hS = k.restrict (hS.trans hS') := + -- Stated through the computation rules: a bare `rfl` sends the kernel into a timeout. + Representation.EquivariantAlgHom.ext (AlgHom.ext fun x => by + simp only [restrict_toAlgHom_apply, Subalgebra.inclusion_inclusion]) + +end Realization + +end CovSectorAlgebra + +/-! + +## C. Restriction from the covariant field algebra + +-/ + +namespace LocalCovFieldAlgebra.Realization + +variable {B : Type} [Semiring B] [Algebra ℂ B] {repGauge : Representation ℂ G₀ B} + {repLorentz : Representation ℂ SL(2,ℂ) B} {hGL : T.GaugeLorentzCompatible} + (k : Realization T hGL B repGauge repLorentz) (S : Finset FieldCategory) + +/-- The restriction of a realization of the covariant field algebra to a covariant sector. -/ +noncomputable def restrictSector : CovSectorAlgebra.Realization T S hGL B repGauge repLorentz := + k.comp (Subalgebra.inclusion (CovSectorAlgebra.le_localCovFieldAlgebra T S)) + CovSectorAlgebra.inclusion_localCovFieldAlgebra_repValue + (CovSectorAlgebra.inclusion_localCovFieldAlgebra_repLorentzGroup hGL) + +lemma restrictSector_toAlgHom : + (k.restrictSector S).toAlgHom + = k.toAlgHom.comp (Subalgebra.inclusion (CovSectorAlgebra.le_localCovFieldAlgebra T S)) := + rfl + +@[simp] +lemma restrictSector_toAlgHom_apply (x : T.CovSectorAlgebra S) : + (k.restrictSector S).toAlgHom x + = k.toAlgHom (Subalgebra.inclusion (CovSectorAlgebra.le_localCovFieldAlgebra T S) x) := + rfl + +lemma restrictSector_id_toAlgHom : + ((id T hGL).restrictSector S).toAlgHom + = Subalgebra.inclusion (CovSectorAlgebra.le_localCovFieldAlgebra T S) := + AlgHom.ext fun _ => rfl + +lemma restrictSector_fieldStrength (hS : FieldCategory.gauge ∈ S) (l : List (Fin 1 ⊕ Fin 3)) + (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + (k.restrictSector S).toAlgHom + ⟨T.covDerivFieldStrength l μ ν φ, CovSectorAlgebra.covDerivFieldStrength_mem hS l μ ν φ⟩ + = k.fieldStrength l μ ν φ := rfl + +lemma restrictSector_fermion (hS : FieldCategory.fermion ∈ S) (i : T.FermionSpecies) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (T.FermionValue i)) : + (k.restrictSector S).toAlgHom + ⟨T.covDerivFermion i l φ, CovSectorAlgebra.covDerivFermion_mem hS i l φ⟩ + = k.fermion i l φ := rfl + +lemma restrictSector_conjFermion (hS : FieldCategory.fermion ∈ S) (i : T.FermionSpecies) + {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule (T.FermionValue i))) : + (k.restrictSector S).toAlgHom + ⟨T.covDerivConjFermion i l φ, CovSectorAlgebra.covDerivConjFermion_mem hS i l φ⟩ + = k.conjFermion i l φ := rfl + +lemma restrictSector_boson (hS : FieldCategory.scalar ∈ S) (j : T.BosonSpecies) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (T.BosonValue j)) : + (k.restrictSector S).toAlgHom + ⟨T.covDerivBoson j l φ, CovSectorAlgebra.covDerivBoson_mem hS j l φ⟩ + = k.boson j l φ := rfl + +lemma restrictSector_conjBoson (hS : FieldCategory.scalar ∈ S) (j : T.BosonSpecies) {n : ℕ} + (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule (T.BosonValue j))) : + (k.restrictSector S).toAlgHom + ⟨T.covDerivConjBoson j l φ, CovSectorAlgebra.covDerivConjBoson_mem hS j l φ⟩ + = k.conjBoson j l φ := rfl + +lemma restrict_restrictSector {S' : Finset FieldCategory} (hS : S ⊆ S') : + (k.restrictSector S').restrict hS = k.restrictSector S := + Representation.EquivariantAlgHom.ext (AlgHom.ext fun x => by + simp only [CovSectorAlgebra.Realization.restrict_toAlgHom_apply, + restrictSector_toAlgHom_apply, Subalgebra.inclusion_inclusion]) + +end LocalCovFieldAlgebra.Realization + +/-! + +## D. Restriction from the local field algebra + +-/ + +namespace Realization + +variable {B : Type} [Ring B] [Algebra ℂ B] {repJet : Representation ℂ GJ B} + {repLorentz : Representation ℂ SL(2,ℂ) B} (h : Realization T B repJet repLorentz) + (hGL : T.GaugeLorentzCompatible) (S : Finset FieldCategory) + +/-- The restriction of a realization of the local field algebra to a covariant sector; the + ordinary gauge group acts on the target through the constant jets. -/ +noncomputable def restrictCovSector : + CovSectorAlgebra.Realization T S hGL B (repJet.comp jets.ofConstant) repLorentz := + (h.restrictSubalgebra (T.CovSectorAlgebra S) + (fun U _ hx => CovSectorAlgebra.repJet_mem U hx) + (fun Λ _ hx => CovSectorAlgebra.repLorentzGroup_mem hGL Λ hx)).compFst jets.ofConstant + +lemma restrictCovSector_toAlgHom : + (h.restrictCovSector hGL S).toAlgHom = h.toAlgHom.comp (T.CovSectorAlgebra S).val := rfl + +@[simp] +lemma restrictCovSector_toAlgHom_apply (x : T.CovSectorAlgebra S) : + (h.restrictCovSector hGL S).toAlgHom x = h.toAlgHom x := rfl + +/-- Jet equivariance survives restriction without `PureJetsActTrivially`. -/ +lemma restrictCovSector_map_repJet (U : GJ) (x : T.CovSectorAlgebra S) : + (h.restrictCovSector hGL S).toAlgHom (CovSectorAlgebra.repJet T S U x) + = repJet U ((h.restrictCovSector hGL S).toAlgHom x) := + h.map_repJet U x + +/-- Restriction through the covariant field algebra is the direct restriction. -/ +lemma restrictSector_restrict : + (h.restrict hGL).restrictSector S = h.restrictCovSector hGL S := + Representation.EquivariantAlgHom.ext (by + rw [LocalCovFieldAlgebra.Realization.restrictSector_toAlgHom, restrict_toAlgHom, + restrictCovSector_toAlgHom, AlgHom.comp_assoc, Subalgebra.val_comp_inclusion]) + +lemma restrict_restrictCovSector {S' : Finset FieldCategory} (hS : S ⊆ S') : + (h.restrictCovSector hGL S').restrict hS = h.restrictCovSector hGL S := by + rw [← restrictSector_restrict, ← restrictSector_restrict, + LocalCovFieldAlgebra.Realization.restrict_restrictSector] + +end Realization + +end GaugeFieldData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/SectorRealization.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/SectorRealization.lean new file mode 100644 index 000000000..302a8792f --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/SectorRealization.lean @@ -0,0 +1,217 @@ +/- +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.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.Realization +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.Sector +/-! +# Realizations of the ordinary sector algebras + +## i. Overview + +A complex algebra `B` carries the ordinary sector `S` of a field datum when the sector +algebra `T.SectorAlgebra S` maps into it by a complex algebra map equivariant for the jet +gauge group and the Lorentz group, both acting on `B` by algebra endomorphisms: +`GaugeFieldData.SectorAlgebra.Realization`. No species condition is involved. + +A sector realization is determined by its images of the selected generators +(`Realization.ext_generators`); nothing asserts that an arbitrary assignment of those images +extends to a realization. Realizations restrict along `Subalgebra.inclusion` from the local +field algebra to every sector and from a sector to every smaller one, and successive +restrictions agree with the direct one. + +## ii. Key results + +- `GaugeFieldData.SectorAlgebra.Realization` : an algebra carrying an ordinary sector. +- `GaugeFieldData.SectorAlgebra.Realization.restrict` : restriction to a smaller sector, + with `restrict_restrict`. +- `GaugeFieldData.Realization.restrictSector` : restriction of a realization of the local + field algebra to a sector, with `restrict_restrictSector`. + +## iii. Table of contents + +- A. Sector realizations +- B. Restriction to a smaller sector +- C. Restriction from the local field algebra + +-/ + +@[expose] public section + +open TensorProduct Matrix MatrixGroups + +namespace GaugeFieldData + +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} {T : GaugeFieldData jets} + +namespace SectorAlgebra + +/-! + +## A. Sector realizations + +-/ + +/-- A complex algebra `B` carrying the ordinary sector `S` of the datum `T`: a complex + algebra map out of the sector algebra, equivariant for the jet gauge group and the Lorentz + group, both acting on the whole of `B` by algebra endomorphisms. The lemmas `map_repJet`, + `map_repLorentz`, `repJet_mul` and `repLorentz_mul` name its fields. -/ +abbrev Realization (T : GaugeFieldData jets) (S : Finset FieldCategory) (B : Type) + [Semiring B] [Algebra ℂ B] (repJet : Representation ℂ GJ B) + (repLorentz : Representation ℂ SL(2,ℂ) B) := + Representation.EquivariantAlgHom (SectorAlgebra.repJet T S) repJet + (SectorAlgebra.repLorentzGroup T S) repLorentz + +namespace Realization + +variable {S : Finset FieldCategory} {B : Type} [Semiring B] [Algebra ℂ B] + {repJet : Representation ℂ GJ B} {repLorentz : Representation ℂ SL(2,ℂ) B} + +variable (T S) in +/-- A sector algebra realized in itself, by the identity. -/ +noncomputable def id : + Realization T S (T.SectorAlgebra S) (SectorAlgebra.repJet T S) + (SectorAlgebra.repLorentzGroup T S) := + Representation.EquivariantAlgHom.id _ _ repJet_apply_mul repLorentzGroup_apply_mul + +@[simp] +lemma id_toAlgHom : (id T S).toAlgHom = AlgHom.id ℂ (T.SectorAlgebra S) := rfl + +variable (h : Realization T S B repJet repLorentz) + +lemma map_repJet (U : GJ) (x : T.SectorAlgebra S) : + h.toAlgHom (SectorAlgebra.repJet T S U x) = repJet U (h.toAlgHom x) := + h.map_fst U x + +lemma map_repLorentz (Λ : SL(2,ℂ)) (x : T.SectorAlgebra S) : + h.toAlgHom (SectorAlgebra.repLorentzGroup T S Λ x) = repLorentz Λ (h.toAlgHom x) := + h.map_snd Λ x + +include h in +lemma repJet_mul (U : GJ) (b₁ b₂ : B) : repJet U (b₁ * b₂) = repJet U b₁ * repJet U b₂ := + h.fst_mul U b₁ b₂ + +include h in +lemma repLorentz_mul (Λ : SL(2,ℂ)) (b₁ b₂ : B) : + repLorentz Λ (b₁ * b₂) = repLorentz Λ b₁ * repLorentz Λ b₂ := + h.snd_mul Λ b₁ b₂ + +/-- A sector realization is determined by its images of the selected generators. Only + uniqueness is asserted, not the extension of an arbitrary assignment. -/ +lemma ext_generators {h₁ h₂ : Realization T S B repJet repLorentz} + (hf : ∀ (hS : FieldCategory.fermion ∈ S) (v : T.FermionGenerators), + h₁.toAlgHom ⟨T.ιFermionTotal v, ιFermionTotal_mem hS v⟩ + = h₂.toAlgHom ⟨T.ιFermionTotal v, ιFermionTotal_mem hS v⟩) + (hs : ∀ (hS : FieldCategory.scalar ∈ S) (v : T.BosonGenerators), + h₁.toAlgHom ⟨T.ιBosonTotal v, ιBosonTotal_mem hS v⟩ + = h₂.toAlgHom ⟨T.ιBosonTotal v, ιBosonTotal_mem hS v⟩) + (hg : ∀ (hS : FieldCategory.gauge ∈ S) (v : GaugeBoson.JetComponentSpace 𝔤), + h₁.toAlgHom ⟨T.ιConnection v, ιConnection_mem hS v⟩ + = h₂.toAlgHom ⟨T.ιConnection v, ιConnection_mem hS v⟩) : h₁ = h₂ := + Representation.EquivariantAlgHom.ext (algHom_ext hf hs hg) + +/-! + +## B. Restriction to a smaller sector + +-/ + +variable {S' : Finset FieldCategory} + +/-- The restriction of a sector realization to a smaller sector. -/ +noncomputable def restrict (h : Realization T S' B repJet repLorentz) (hS : S ⊆ S') : + Realization T S B repJet repLorentz := + h.comp (Subalgebra.inclusion (mono T hS)) (inclusion_repJet hS) (inclusion_repLorentzGroup hS) + +lemma restrict_toAlgHom (h : Realization T S' B repJet repLorentz) (hS : S ⊆ S') : + (h.restrict hS).toAlgHom = h.toAlgHom.comp (Subalgebra.inclusion (mono T hS)) := rfl + +@[simp] +lemma restrict_toAlgHom_apply (h : Realization T S' B repJet repLorentz) (hS : S ⊆ S') + (x : T.SectorAlgebra S) : + (h.restrict hS).toAlgHom x = h.toAlgHom (Subalgebra.inclusion (mono T hS) x) := rfl + +lemma restrict_toAlgHom_mk (h : Realization T S' B repJet repLorentz) (hS : S ⊆ S') + (x : T.LocalFieldAlgebra) (hx : x ∈ T.SectorAlgebra S) : + (h.restrict hS).toAlgHom ⟨x, hx⟩ = h.toAlgHom ⟨x, mono T hS hx⟩ := rfl + +lemma restrict_id_toAlgHom (hS : S ⊆ S') : + ((id T S').restrict hS).toAlgHom = Subalgebra.inclusion (mono T hS) := + AlgHom.ext fun _ => rfl + +lemma restrict_restrict {S'' : Finset FieldCategory} (h : Realization T S'' B repJet repLorentz) + (hS' : S' ⊆ S'') (hS : S ⊆ S') : + (h.restrict hS').restrict hS = h.restrict (hS.trans hS') := + -- Stated through the computation rules: a bare `rfl` sends the kernel into a timeout. + Representation.EquivariantAlgHom.ext (AlgHom.ext fun x => by + simp only [restrict_toAlgHom_apply, Subalgebra.inclusion_inclusion]) + +end Realization + +end SectorAlgebra + +/-! + +## C. Restriction from the local field algebra + +-/ + +namespace Realization + +variable {B : Type} [Ring B] [Algebra ℂ B] {repJet : Representation ℂ GJ B} + {repLorentz : Representation ℂ SL(2,ℂ) B} (h : Realization T B repJet repLorentz) + (S : Finset FieldCategory) + +/-- The restriction of a realization of the local field algebra to a sector. -/ +noncomputable def restrictSector : SectorAlgebra.Realization T S B repJet repLorentz := + h.restrictSubalgebra (T.SectorAlgebra S) (fun U _ hx => SectorAlgebra.repJet_mem U hx) + (fun Λ _ hx => SectorAlgebra.repLorentzGroup_mem Λ hx) + +lemma restrictSector_toAlgHom : + (h.restrictSector S).toAlgHom = h.toAlgHom.comp (T.SectorAlgebra S).val := rfl + +@[simp] +lemma restrictSector_toAlgHom_apply (x : T.SectorAlgebra S) : + (h.restrictSector S).toAlgHom x = h.toAlgHom x := rfl + +lemma restrictSector_id_toAlgHom : + ((id T).restrictSector S).toAlgHom = (T.SectorAlgebra S).val := + AlgHom.ext fun _ => rfl + +lemma restrictSector_fermionSymbol (hS : FieldCategory.fermion ∈ S) (i : T.FermionSpecies) + (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (T.FermionValue i)) : + (h.restrictSector S).toAlgHom ⟨T.fermionSymbol i s φ, SectorAlgebra.fermionSymbol_mem hS i s φ⟩ + = h.fermionSymbol i s φ := rfl + +lemma restrictSector_conjFermionSymbol (hS : FieldCategory.fermion ∈ S) + (i : T.FermionSpecies) (s : Multiset (Fin 1 ⊕ Fin 3)) + (φ : Module.Dual ℂ (ConjModule (T.FermionValue i))) : + (h.restrictSector S).toAlgHom + ⟨T.conjFermionSymbol i s φ, SectorAlgebra.conjFermionSymbol_mem hS i s φ⟩ + = h.conjFermionSymbol i s φ := rfl + +lemma restrictSector_bosonSymbol (hS : FieldCategory.scalar ∈ S) (j : T.BosonSpecies) + (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (T.BosonValue j)) : + (h.restrictSector S).toAlgHom ⟨T.bosonSymbol j s φ, SectorAlgebra.bosonSymbol_mem hS j s φ⟩ + = h.bosonSymbol j s φ := rfl + +lemma restrictSector_conjBosonSymbol (hS : FieldCategory.scalar ∈ S) (j : T.BosonSpecies) + (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule (T.BosonValue j))) : + (h.restrictSector S).toAlgHom + ⟨T.conjBosonSymbol j s φ, SectorAlgebra.conjBosonSymbol_mem hS j s φ⟩ + = h.conjBosonSymbol j s φ := rfl + +lemma restrict_restrictSector {S' : Finset FieldCategory} (hS : S ⊆ S') : + (h.restrictSector S').restrict hS = h.restrictSector S := + Representation.EquivariantAlgHom.ext (by + rw [SectorAlgebra.Realization.restrict_toAlgHom, restrictSector_toAlgHom, + restrictSector_toAlgHom, AlgHom.comp_assoc, Subalgebra.val_comp_inclusion]) + +end Realization + +end GaugeFieldData diff --git a/Physlib/Mathematics/AlgebraRepresentation.lean b/Physlib/Mathematics/AlgebraRepresentation.lean index 1ae584156..c0b90acc0 100644 --- a/Physlib/Mathematics/AlgebraRepresentation.lean +++ b/Physlib/Mathematics/AlgebraRepresentation.lean @@ -47,8 +47,8 @@ for when a representation acts on generators by a shift. - `Representation.restrictScalars` : the restriction of scalars. - `Representation.toAlgHom` : a multiplicative representation of a group as algebra maps. - `Representation.EquivariantAlgHom` : an algebra map intertwining two pairs of - representations, with `EquivariantAlgHom.id`, `EquivariantAlgHom.restrictSubalgebra` and - `EquivariantAlgHom.compFst`. + representations, with `EquivariantAlgHom.id`, `EquivariantAlgHom.comp`, + `EquivariantAlgHom.restrictSubalgebra` and `EquivariantAlgHom.compFst`. - `Representation.liftEquiv_baseChange` : base change preserves equivariance. - `AlgHom.map_add_smul_one` : an algebra map on an affine combination `x + z • 1`. @@ -270,17 +270,34 @@ lemma id_toAlgHom (h₁ : ∀ (g : G₁) (x y : A), ρ₁ g (x * y) = ρ₁ g x (h₂ : ∀ (g : G₂) (x y : A), ρ₂ g (x * y) = ρ₂ g x * ρ₂ g y) : (EquivariantAlgHom.id ρ₁ ρ₂ h₁ h₂).toAlgHom = AlgHom.id k A := rfl +/-- The precomposition with an algebra map into the source intertwining two representations + on its own source with the two source representations; the target and its two actions are + unchanged. -/ +def comp {A' : Type*} [Semiring A'] [Algebra k A'] {ρ₁' : Representation k G₁ A'} + {ρ₂' : Representation k G₂ A'} (f : EquivariantAlgHom ρ₁ σ₁ ρ₂ σ₂) (φ : A' →ₐ[k] A) + (hφ₁ : ∀ (g : G₁) (x : A'), φ (ρ₁' g x) = ρ₁ g (φ x)) + (hφ₂ : ∀ (g : G₂) (x : A'), φ (ρ₂' g x) = ρ₂ g (φ x)) : + EquivariantAlgHom ρ₁' σ₁ ρ₂' σ₂ where + toAlgHom := f.toAlgHom.comp φ + map_fst g x := (congrArg f.toAlgHom (hφ₁ g x)).trans (f.map_fst g (φ x)) + map_snd g x := (congrArg f.toAlgHom (hφ₂ g x)).trans (f.map_snd g (φ x)) + fst_mul := f.fst_mul + snd_mul := f.snd_mul + +@[simp] +lemma comp_toAlgHom {A' : Type*} [Semiring A'] [Algebra k A'] {ρ₁' : Representation k G₁ A'} + {ρ₂' : Representation k G₂ A'} (f : EquivariantAlgHom ρ₁ σ₁ ρ₂ σ₂) (φ : A' →ₐ[k] A) + (hφ₁ : ∀ (g : G₁) (x : A'), φ (ρ₁' g x) = ρ₁ g (φ x)) + (hφ₂ : ∀ (g : G₂) (x : A'), φ (ρ₂' g x) = ρ₂ g (φ x)) : + (f.comp φ hφ₁ hφ₂).toAlgHom = f.toAlgHom.comp φ := rfl + /-- The restriction to a subalgebra of the source preserved by both source representations, along its inclusion; the target and its two actions are unchanged. -/ noncomputable def restrictSubalgebra (f : EquivariantAlgHom ρ₁ σ₁ ρ₂ σ₂) (S : Subalgebra k A) (hS₁ : ∀ (g : G₁) {x : A}, x ∈ S → ρ₁ g x ∈ S) (hS₂ : ∀ (g : G₂) {x : A}, x ∈ S → ρ₂ g x ∈ S) : - EquivariantAlgHom (ρ₁.restrictSubalgebra S hS₁) σ₁ (ρ₂.restrictSubalgebra S hS₂) σ₂ where - toAlgHom := f.toAlgHom.comp S.val - map_fst g x := f.map_fst g x - map_snd g x := f.map_snd g x - fst_mul := f.fst_mul - snd_mul := f.snd_mul + EquivariantAlgHom (ρ₁.restrictSubalgebra S hS₁) σ₁ (ρ₂.restrictSubalgebra S hS₂) σ₂ := + f.comp S.val (fun _ _ => rfl) (fun _ _ => rfl) @[simp] lemma restrictSubalgebra_toAlgHom_apply (f : EquivariantAlgHom ρ₁ σ₁ ρ₂ σ₂) (S : Subalgebra k A) From 7e52a75be709d6c0df5feadb985c24dbe88ebe22 Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Tue, 15 Sep 2026 10:45:14 +0400 Subject: [PATCH 330/367] feat: prove gauge-sector algebra and realization equivalences --- Physlib.lean | 4 + .../LocalGaugeCovFieldAlgebra/Basic.lean | 71 ++++++ .../LocalCovFieldAlgebra/GaugeSector.lean | 214 +++++++++++++++++ .../GaugeSectorRealization.lean | 161 +++++++++++++ .../LocalFieldAlgebra/GaugeSector.lean | 226 ++++++++++++++++++ .../GaugeSectorRealization.lean | 126 ++++++++++ .../Mathematics/AlgebraRepresentation.lean | 126 +++++++++- 7 files changed, 924 insertions(+), 4 deletions(-) create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/LocalCovFieldAlgebra/GaugeSector.lean create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/LocalCovFieldAlgebra/GaugeSectorRealization.lean create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/GaugeSector.lean create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/GaugeSectorRealization.lean diff --git a/Physlib.lean b/Physlib.lean index 447dbe1db..379163dde 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -25,6 +25,8 @@ public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeFieldData.FermionGen public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeFieldData.FermionMatterField public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeFieldData.FermionModule public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalCovFieldAlgebra.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalCovFieldAlgebra.GaugeSector +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalCovFieldAlgebra.GaugeSectorRealization public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalCovFieldAlgebra.Realization public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalCovFieldAlgebra.Sector public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalCovFieldAlgebra.SectorRealization @@ -41,6 +43,8 @@ public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAl public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.Prod public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.Statistics public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.GaugeAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.GaugeSector +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.GaugeSectorRealization public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.Jet public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.JetRep public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.LorentzAction diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeCovFieldAlgebra/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeCovFieldAlgebra/Basic.lean index 9f4507ffb..20dac30b1 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeCovFieldAlgebra/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeCovFieldAlgebra/Basic.lean @@ -36,6 +36,8 @@ restricted actions are built with `Representation.restrictSubalgebra`. group, of the ordinary gauge group and of the Lorentz group. - `LocalGaugeCovFieldAlgebra.repJet_eq_repValue_eval` : the jet action factors through evaluation. +- `LocalGaugeCovFieldAlgebra.complexVal` : the complexified inclusion, injective by + flatness, with the complexified actions `complexRepValue` and `complexRepLorentzGroup`. ## iii. Table of contents @@ -46,6 +48,7 @@ restricted actions are built with `Representation.restrictSubalgebra`. - C. The restricted actions - C.1. The action of the ordinary gauge group - C.2. The actions on the generators +- D. The complexification -/ @@ -98,6 +101,13 @@ lemma fieldStrength_mem (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : fieldStrength 𝔤 μ ν φ ∈ LocalGaugeCovFieldAlgebra 𝔤 := covDerivFieldStrength_mem [] μ ν φ +/-- Inside the covariant field algebra, the preimage of the generating tower under the + inclusion generates the whole real subalgebra. -/ +lemma adjoin_preimage_tower_eq_top : + Algebra.adjoin ℝ ((Subtype.val : LocalGaugeCovFieldAlgebra 𝔤 → LocalGaugeFieldAlgebra 𝔤) + ⁻¹' GaugeAlgebraRealization.tower (derivA 𝔤)) = ⊤ := + Algebra.adjoin_adjoin_coe_preimage + /-- The generation principle: a property holding on the covariant derivatives of the field strength and on the scalars, and closed under sums and products, holds on the whole covariant field algebra. -/ @@ -309,4 +319,65 @@ lemma repLorentzGroup_covF (Λ : SL(2,ℂ)) {n : ℕ} (l : Fin n → (Fin 1 ⊕ rw [coe_repLorentzGroup, coe_covF, repLorentzGroup_covDerivFieldStrength] simp only [AddSubmonoidClass.coe_finsetSum, Subalgebra.coe_smul, coe_covF] +/-! + +## D. The complexification + +The real covariant field algebra base changed along `ℝ → ℂ`, for the comparison with the +covariant gauge sector of a field datum; the complexified inclusion is injective by +flatness of `ℂ` over `ℝ`. + +-/ + +variable (𝔤) in +/-- The complexified covariant field algebra inside the complexified local gauge field + algebra: the base change of `Subalgebra.val` along `ℝ → ℂ`. -/ +noncomputable def complexVal : + (ℂ ⊗[ℝ] LocalGaugeCovFieldAlgebra 𝔤) →ₐ[ℂ] ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤 := + Algebra.TensorProduct.map (AlgHom.id ℂ ℂ) (LocalGaugeCovFieldAlgebra 𝔤).val + +@[simp] +lemma complexVal_tmul (z : ℂ) (x : LocalGaugeCovFieldAlgebra 𝔤) : + complexVal 𝔤 (z ⊗ₜ[ℝ] x) = z ⊗ₜ[ℝ] (x : LocalGaugeFieldAlgebra 𝔤) := rfl + +lemma complexVal_injective : Function.Injective (complexVal 𝔤) := + Module.Flat.lTensor_preserves_injective_linearMap + (LocalGaugeCovFieldAlgebra 𝔤).val.toLinearMap Subtype.val_injective + +variable (jets) in +/-- The action of the ordinary gauge group on the complexified covariant field algebra, by + base change. -/ +noncomputable def complexRepValue : + Representation ℂ G₀ (ℂ ⊗[ℝ] LocalGaugeCovFieldAlgebra 𝔤) := + Representation.baseChange ℂ (repValue jets) + +@[simp] +lemma complexRepValue_tmul (g : G₀) (z : ℂ) (x : LocalGaugeCovFieldAlgebra 𝔤) : + complexRepValue jets g (z ⊗ₜ[ℝ] x) = z ⊗ₜ[ℝ] repValue jets g x := rfl + +variable (𝔤) in +/-- The Lorentz action on the complexified covariant field algebra, by base change. -/ +noncomputable def complexRepLorentzGroup : + Representation ℂ SL(2,ℂ) (ℂ ⊗[ℝ] LocalGaugeCovFieldAlgebra 𝔤) := + Representation.baseChange ℂ (repLorentzGroup 𝔤) + +@[simp] +lemma complexRepLorentzGroup_tmul (Λ : SL(2,ℂ)) (z : ℂ) (x : LocalGaugeCovFieldAlgebra 𝔤) : + complexRepLorentzGroup 𝔤 Λ (z ⊗ₜ[ℝ] x) = z ⊗ₜ[ℝ] repLorentzGroup 𝔤 Λ x := rfl + +/-- Along the complexified inclusion the ordinary gauge group acts as the constant jets. -/ +lemma complexVal_complexRepValue (g : G₀) (y : ℂ ⊗[ℝ] LocalGaugeCovFieldAlgebra 𝔤) : + complexVal 𝔤 (complexRepValue jets g y) + = LocalGaugeFieldAlgebra.complexRepJet jets (jets.ofConstant g) (complexVal 𝔤 y) := + Representation.baseChange_naturality (σ := (LocalGaugeFieldAlgebra.repJet jets).comp + jets.ofConstant) ℂ (LocalGaugeCovFieldAlgebra 𝔤).val.toLinearMap coe_repValue g y + +/-- Along the complexified inclusion the Lorentz action is the ambient one. -/ +lemma complexVal_complexRepLorentzGroup (Λ : SL(2,ℂ)) + (y : ℂ ⊗[ℝ] LocalGaugeCovFieldAlgebra 𝔤) : + complexVal 𝔤 (complexRepLorentzGroup 𝔤 Λ y) + = LocalGaugeFieldAlgebra.complexRepLorentzGroup 𝔤 Λ (complexVal 𝔤 y) := + Representation.baseChange_naturality (σ := LocalGaugeFieldAlgebra.repLorentzGroup 𝔤) ℂ + (LocalGaugeCovFieldAlgebra 𝔤).val.toLinearMap coe_repLorentzGroup Λ y + end LocalGaugeCovFieldAlgebra diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalCovFieldAlgebra/GaugeSector.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalCovFieldAlgebra/GaugeSector.lean new file mode 100644 index 000000000..07640cd79 --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalCovFieldAlgebra/GaugeSector.lean @@ -0,0 +1,214 @@ +/- +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.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeCovFieldAlgebra.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalCovFieldAlgebra.Sector +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.GaugeSector +/-! +# The covariant gauge sector as the complexified covariant gauge-only algebra + +## i. Overview + +The covariant gauge sector `T.CovSectorAlgebra {FieldCategory.gauge}` of the local field +algebra is the complex subalgebra generated by the included field-strength tower. The +covariant gauge-only algebra `LocalGaugeCovFieldAlgebra 𝔤` is real, so the comparison is +with its complexification: the canonical inclusion, the complexified real subalgebra +inclusion followed by `GaugeFieldData.includeConnection`, is injective with range that +sector. + +Injectivity of the complexified subalgebra inclusion is flatness of `ℂ` over `ℝ`; the +retraction of the ordinary comparison supplies injectivity of `includeConnection` only. No +species condition is used, and `GaugeFieldData.GaugeLorentzCompatible` appears only to name +the Lorentz action of the covariant sector. + +## ii. Key results + +- `GaugeFieldData.includeCovConnection` : the canonical inclusion, with + `GaugeFieldData.includeCovConnection_injective`. +- `GaugeFieldData.range_includeCovConnection` : its range is the covariant gauge sector. +- `GaugeFieldData.covGaugeSectorEquiv` : the equivalence + `ℂ ⊗[ℝ] ↥(LocalGaugeCovFieldAlgebra 𝔤) ≃ₐ[ℂ] ↥(T.CovSectorAlgebra {FieldCategory.gauge})`. +- `GaugeFieldData.covGaugeSectorEquiv_complexRepValue`, + `GaugeFieldData.covGaugeSectorEquiv_complexRepLorentzGroup` : the two intertwining laws. + +## iii. Table of contents + +- A. The inclusion of the complexified covariant gauge-only algebra + - A.1. Injectivity +- B. The range of the inclusion +- C. The equivalence with the covariant gauge sector + - C.1. Computation on the field-strength tower +- D. Compatibility with the symmetries + +-/ + +@[expose] public section + +open TensorProduct Matrix MatrixGroups + +namespace GaugeFieldData + +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} (T : GaugeFieldData jets) + +/-! + +## A. The inclusion of the complexified covariant gauge-only algebra + +-/ + +/-- The complexified covariant gauge-only algebra inside the local field algebra: the + complexification of the real covariant subalgebra inclusion, followed by the connection + inclusion. -/ +noncomputable def includeCovConnection : + (ℂ ⊗[ℝ] LocalGaugeCovFieldAlgebra 𝔤) →ₐ[ℂ] T.LocalFieldAlgebra := + T.includeConnection.comp (LocalGaugeCovFieldAlgebra.complexVal 𝔤) + +variable {T} + +@[simp] +lemma includeCovConnection_apply (y : ℂ ⊗[ℝ] LocalGaugeCovFieldAlgebra 𝔤) : + T.includeCovConnection y + = T.includeConnection (LocalGaugeCovFieldAlgebra.complexVal 𝔤 y) := rfl + +lemma includeCovConnection_one_tmul (x : LocalGaugeCovFieldAlgebra 𝔤) : + T.includeCovConnection ((1 : ℂ) ⊗ₜ[ℝ] x) + = T.includeConnection ((1 : ℂ) ⊗ₜ[ℝ] (x : LocalGaugeFieldAlgebra 𝔤)) := rfl + +/-! + +### A.1. Injectivity + +-/ + +/-- The complexified covariant gauge-only algebra embeds in the local field algebra. -/ +lemma includeCovConnection_injective : Function.Injective T.includeCovConnection := + includeConnection_injective.comp LocalGaugeCovFieldAlgebra.complexVal_injective + +/-! + +## B. The range of the inclusion + +-/ + +variable (T) + +/-- The range of the inclusion is the covariant gauge sector. -/ +lemma range_includeCovConnection : + T.includeCovConnection.range = T.CovSectorAlgebra {FieldCategory.gauge} := by + refine le_antisymm ?_ (Algebra.adjoin_le ?_) + · refine Algebra.range_le_of_adjoin_eq_top + (Algebra.TensorProduct.adjoin_one_tmul_eq_top ℂ _ + LocalGaugeCovFieldAlgebra.adjoin_preimage_tower_eq_top) T.includeCovConnection ?_ + rintro _ ⟨x, hx, rfl⟩ + obtain ⟨l, μ, ν, φ, hxl⟩ := + (LocalGaugeCovFieldAlgebra.mem_tower_iff (x : LocalGaugeFieldAlgebra 𝔤)).mp hx + have hx' : T.includeCovConnection ((1 : ℂ) ⊗ₜ[ℝ] x) = T.covDerivFieldStrength l μ ν φ := + (includeCovConnection_one_tmul x).trans + (congrArg (fun z => T.includeConnection ((1 : ℂ) ⊗ₜ[ℝ] z)) hxl) + show T.includeCovConnection ((1 : ℂ) ⊗ₜ[ℝ] x) ∈ T.CovSectorAlgebra {FieldCategory.gauge} + rw [hx'] + exact CovSectorAlgebra.covDerivFieldStrength_mem (Finset.mem_singleton_self _) l μ ν φ + · intro b hb + exact CovSectorAlgebra.covSectorGenerators_cases + (P := fun b => b ∈ T.includeCovConnection.range) hb + (fun _ l μ ν φ => ⟨(1 : ℂ) ⊗ₜ[ℝ] LocalGaugeCovFieldAlgebra.covF 𝔤 l μ ν φ, rfl⟩) + (fun hS => absurd hS (by decide)) (fun hS => absurd hS (by decide)) + (fun hS => absurd hS (by decide)) (fun hS => absurd hS (by decide)) + +lemma includeCovConnection_mem_covGaugeSector (y : ℂ ⊗[ℝ] LocalGaugeCovFieldAlgebra 𝔤) : + T.includeCovConnection y ∈ T.CovSectorAlgebra {FieldCategory.gauge} := by + rw [← range_includeCovConnection T] + exact ⟨y, rfl⟩ + +/-! + +## C. The equivalence with the covariant gauge sector + +-/ + +/-- The covariant gauge sector is the complexification of the covariant gauge-only algebra: + the inclusion, corestricted to its range. -/ +noncomputable def covGaugeSectorEquiv : + (ℂ ⊗[ℝ] LocalGaugeCovFieldAlgebra 𝔤) ≃ₐ[ℂ] ↥(T.CovSectorAlgebra {FieldCategory.gauge}) := + (AlgEquiv.ofInjective T.includeCovConnection includeCovConnection_injective).trans + (Subalgebra.equivOfEq _ _ (range_includeCovConnection T)) + +variable {T} + +/-- In the local field algebra the equivalence is the canonical inclusion. -/ +@[simp] +lemma coe_covGaugeSectorEquiv (y : ℂ ⊗[ℝ] LocalGaugeCovFieldAlgebra 𝔤) : + (T.covGaugeSectorEquiv y : T.LocalFieldAlgebra) = T.includeCovConnection y := rfl + +/-- The inverse recovers an element from its inclusion. -/ +lemma covGaugeSectorEquiv_symm_includeCovConnection (y : ℂ ⊗[ℝ] LocalGaugeCovFieldAlgebra 𝔤) + (hy : T.includeCovConnection y ∈ T.CovSectorAlgebra {FieldCategory.gauge}) : + T.covGaugeSectorEquiv.symm ⟨T.includeCovConnection y, hy⟩ = y := by + rw [show (⟨T.includeCovConnection y, hy⟩ : ↥(T.CovSectorAlgebra {FieldCategory.gauge})) + = T.covGaugeSectorEquiv y from Subtype.ext rfl, AlgEquiv.symm_apply_apply] + +/-! + +### C.1. Computation on the field-strength tower + +-/ + +/-- A generator, embedded with the scalar `1`, is the included tower element with the same + derivative labels, spacetime indices and adjoint covector. -/ +lemma coe_covGaugeSectorEquiv_one_tmul_covF (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ 𝔤) : + (T.covGaugeSectorEquiv ((1 : ℂ) ⊗ₜ[ℝ] LocalGaugeCovFieldAlgebra.covF 𝔤 l μ ν φ) : + T.LocalFieldAlgebra) = T.covDerivFieldStrength l μ ν φ := rfl + +/-- Zero covariant derivatives: the included field strength itself. -/ +lemma coe_covGaugeSectorEquiv_one_tmul_covF_nil (μ ν : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ 𝔤) : + (T.covGaugeSectorEquiv ((1 : ℂ) ⊗ₜ[ℝ] LocalGaugeCovFieldAlgebra.covF 𝔤 [] μ ν φ) : + T.LocalFieldAlgebra) + = T.includeConnection ((1 : ℂ) ⊗ₜ[ℝ] LocalGaugeFieldAlgebra.fieldStrength 𝔤 μ ν φ) := rfl + +/-- `z ⊗ₜ x` maps to `z` times the image of `1 ⊗ₜ x`. -/ +lemma coe_covGaugeSectorEquiv_tmul (z : ℂ) (x : LocalGaugeCovFieldAlgebra 𝔤) : + (T.covGaugeSectorEquiv (z ⊗ₜ[ℝ] x) : T.LocalFieldAlgebra) + = z • (T.covGaugeSectorEquiv ((1 : ℂ) ⊗ₜ[ℝ] x) : T.LocalFieldAlgebra) := by + have h : z ⊗ₜ[ℝ] x = z • ((1 : ℂ) ⊗ₜ[ℝ] x) := by + rw [TensorProduct.smul_tmul', smul_eq_mul, mul_one] + show T.includeCovConnection (z ⊗ₜ[ℝ] x) = z • T.includeCovConnection ((1 : ℂ) ⊗ₜ[ℝ] x) + rw [h] + exact T.includeCovConnection.toLinearMap.map_smul z ((1 : ℂ) ⊗ₜ[ℝ] x) + +/-! + +## D. Compatibility with the symmetries + +-/ + +/-- The equivalence intertwines the complexified gauge-only action of the ordinary gauge + group with the value action of the covariant gauge sector. -/ +lemma covGaugeSectorEquiv_complexRepValue (g : G₀) (y : ℂ ⊗[ℝ] LocalGaugeCovFieldAlgebra 𝔤) : + T.covGaugeSectorEquiv (LocalGaugeCovFieldAlgebra.complexRepValue jets g y) + = CovSectorAlgebra.repValue T {FieldCategory.gauge} g (T.covGaugeSectorEquiv y) := + Subtype.ext (by + simp only [coe_covGaugeSectorEquiv, CovSectorAlgebra.coe_repValue, + includeCovConnection_apply, LocalGaugeCovFieldAlgebra.complexVal_complexRepValue, + repJet_includeConnection]) + +/-- The equivalence intertwines the complexified gauge-only Lorentz action with the Lorentz + action of the covariant gauge sector. -/ +lemma covGaugeSectorEquiv_complexRepLorentzGroup (hGL : T.GaugeLorentzCompatible) + (Λ : SL(2,ℂ)) (y : ℂ ⊗[ℝ] LocalGaugeCovFieldAlgebra 𝔤) : + T.covGaugeSectorEquiv (LocalGaugeCovFieldAlgebra.complexRepLorentzGroup 𝔤 Λ y) + = CovSectorAlgebra.repLorentzGroup T {FieldCategory.gauge} hGL Λ + (T.covGaugeSectorEquiv y) := + Subtype.ext (by + simp only [coe_covGaugeSectorEquiv, CovSectorAlgebra.coe_repLorentzGroup, + includeCovConnection_apply, LocalGaugeCovFieldAlgebra.complexVal_complexRepLorentzGroup, + repLorentzGroup_includeConnection]) + +end GaugeFieldData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalCovFieldAlgebra/GaugeSectorRealization.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalCovFieldAlgebra/GaugeSectorRealization.lean new file mode 100644 index 000000000..1e58b044d --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalCovFieldAlgebra/GaugeSectorRealization.lean @@ -0,0 +1,161 @@ +/- +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.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeCovFieldAlgebra.Realization +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalCovFieldAlgebra.GaugeSector +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalCovFieldAlgebra.SectorRealization +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.GaugeSectorRealization +/-! +# Realizations of the covariant gauge sector + +## i. Overview + +For a complex algebra `B`, realizations of the covariant gauge sector +`T.CovSectorAlgebra {FieldCategory.gauge}` are the real realizations of the covariant +gauge-only algebra `LocalGaugeCovFieldAlgebra 𝔤` in `B`, its gauge and Lorentz actions +viewed over `ℝ` by restriction of scalars. The correspondence is +`GaugeFieldData.covGaugeSectorEquiv` composed with `AlgHom.liftEquiv`, and the +field-strength towers agree on both sides. + +`GaugeFieldData.GaugeLorentzCompatible` is carried only to name the source Lorentz action, +as on the sector realizations themselves. Restricting a realization of the whole local +field algebra to the covariant gauge sector and passing to the gauge-only side is the +covariant restriction of its ordinary gauge-only realization. + +## ii. Key results + +- `GaugeFieldData.covGaugeSectorRealizationEquiv` : the correspondence, with both round + trips. +- `GaugeFieldData.covGaugeSectorRealizationEquiv_F`, + `GaugeFieldData.covGaugeSectorRealizationEquiv_symm_toAlgHom_covF` : the field-strength + towers of corresponding realizations. +- `GaugeFieldData.covGaugeSectorRealizationEquiv_restrictCovSector` : compatibility with + restriction from the local field algebra. + +## iii. Table of contents + +- A. The correspondence +- B. Computation +- C. Compatibility with restriction + +-/ + +@[expose] public section + +open TensorProduct Matrix MatrixGroups + +namespace GaugeFieldData + +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} {T : GaugeFieldData jets} {B : Type} [Ring B] + [Algebra ℂ B] {repGauge : Representation ℂ G₀ B} {repLorentz : Representation ℂ SL(2,ℂ) B} + +/-! + +## A. The correspondence + +-/ + +variable (T) in +/-- Realizations of the covariant gauge sector are the real realizations of the covariant + gauge-only algebra, the target keeping its complex actions restricted to `ℝ`. -/ +noncomputable def covGaugeSectorRealizationEquiv (hGL : T.GaugeLorentzCompatible) : + CovSectorAlgebra.Realization T {FieldCategory.gauge} hGL B repGauge repLorentz + ≃ LocalGaugeCovFieldAlgebra.Realization jets B (repGauge.restrictScalars ℝ) + (repLorentz.restrictScalars ℝ) := + (Representation.EquivariantAlgHom.compEquiv T.covGaugeSectorEquiv + covGaugeSectorEquiv_complexRepValue + (covGaugeSectorEquiv_complexRepLorentzGroup hGL)).trans + (Representation.EquivariantAlgHom.liftEquivBaseChange + LocalGaugeCovFieldAlgebra.complexRepValue_tmul + LocalGaugeCovFieldAlgebra.complexRepLorentzGroup_tmul).symm + +/-! + +## B. Computation + +-/ + +variable (hGL : T.GaugeLorentzCompatible) + +lemma covGaugeSectorRealizationEquiv_toAlgHom + (k : CovSectorAlgebra.Realization T {FieldCategory.gauge} hGL B repGauge repLorentz) : + (T.covGaugeSectorRealizationEquiv hGL k).toAlgHom + = ((k.toAlgHom.comp T.covGaugeSectorEquiv.toAlgHom).restrictScalars ℝ).comp + Algebra.TensorProduct.includeRight := rfl + +@[simp] +lemma covGaugeSectorRealizationEquiv_toAlgHom_apply + (k : CovSectorAlgebra.Realization T {FieldCategory.gauge} hGL B repGauge repLorentz) + (x : LocalGaugeCovFieldAlgebra 𝔤) : + (T.covGaugeSectorRealizationEquiv hGL k).toAlgHom x + = k.toAlgHom (T.covGaugeSectorEquiv ((1 : ℂ) ⊗ₜ[ℝ] x)) := rfl + +/-- The field-strength tower of the corresponding real realization is the sector tower, + with the same derivative labels, spacetime indices and adjoint covector. -/ +lemma covGaugeSectorRealizationEquiv_F + (k : CovSectorAlgebra.Realization T {FieldCategory.gauge} hGL B repGauge repLorentz) + (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + (T.covGaugeSectorRealizationEquiv hGL k).F l μ ν φ + = k.toAlgHom + (T.covGaugeSectorEquiv ((1 : ℂ) ⊗ₜ[ℝ] LocalGaugeCovFieldAlgebra.covF 𝔤 l μ ν φ)) := + rfl + +lemma covGaugeSectorRealizationEquiv_symm_toAlgHom + (h : LocalGaugeCovFieldAlgebra.Realization jets B (repGauge.restrictScalars ℝ) + (repLorentz.restrictScalars ℝ)) : + ((T.covGaugeSectorRealizationEquiv hGL).symm h).toAlgHom + = (AlgHom.liftEquiv ℝ ℂ (LocalGaugeCovFieldAlgebra 𝔤) B h.toAlgHom).comp + T.covGaugeSectorEquiv.symm.toAlgHom := rfl + +@[simp] +lemma covGaugeSectorRealizationEquiv_symm_toAlgHom_apply + (h : LocalGaugeCovFieldAlgebra.Realization jets B (repGauge.restrictScalars ℝ) + (repLorentz.restrictScalars ℝ)) (x : T.CovSectorAlgebra {FieldCategory.gauge}) : + ((T.covGaugeSectorRealizationEquiv hGL).symm h).toAlgHom x + = AlgHom.liftEquiv ℝ ℂ (LocalGaugeCovFieldAlgebra 𝔤) B h.toAlgHom + (T.covGaugeSectorEquiv.symm x) := rfl + +/-- The sector towers of the corresponding sector realization are the tower of the real + realization; at `l = []` this is the field strength. -/ +lemma covGaugeSectorRealizationEquiv_symm_toAlgHom_covF + (h : LocalGaugeCovFieldAlgebra.Realization jets B (repGauge.restrictScalars ℝ) + (repLorentz.restrictScalars ℝ)) (l : List (Fin 1 ⊕ Fin 3)) (μ ν : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ 𝔤) : + ((T.covGaugeSectorRealizationEquiv hGL).symm h).toAlgHom + (T.covGaugeSectorEquiv ((1 : ℂ) ⊗ₜ[ℝ] LocalGaugeCovFieldAlgebra.covF 𝔤 l μ ν φ)) + = h.F l μ ν φ := + calc ((T.covGaugeSectorRealizationEquiv hGL).symm h).toAlgHom + (T.covGaugeSectorEquiv ((1 : ℂ) ⊗ₜ[ℝ] LocalGaugeCovFieldAlgebra.covF 𝔤 l μ ν φ)) + = AlgHom.liftEquiv ℝ ℂ (LocalGaugeCovFieldAlgebra 𝔤) B h.toAlgHom + ((1 : ℂ) ⊗ₜ[ℝ] LocalGaugeCovFieldAlgebra.covF 𝔤 l μ ν φ) := + congrArg _ (T.covGaugeSectorEquiv.symm_apply_apply _) + _ = h.F l μ ν φ := by + rw [AlgHom.liftEquiv_tmul, one_smul, LocalGaugeCovFieldAlgebra.Realization.F_apply] + +/-! + +## C. Compatibility with restriction + +-/ + +/-- Restricting a realization of the local field algebra to the covariant gauge sector and + passing to the gauge-only side gives the covariant restriction of its ordinary gauge-only + realization. -/ +lemma covGaugeSectorRealizationEquiv_restrictCovSector + {repJet : Representation ℂ GJ B} (h : Realization T B repJet repLorentz) : + T.covGaugeSectorRealizationEquiv hGL (h.restrictCovSector hGL {FieldCategory.gauge}) + = (T.gaugeSectorRealizationEquiv (h.restrictSector {FieldCategory.gauge})).restrict := + Representation.EquivariantAlgHom.ext (AlgHom.ext fun x => by + rw [covGaugeSectorRealizationEquiv_toAlgHom_apply, + Realization.restrictCovSector_toAlgHom_apply, + LocalGaugeFieldAlgebra.Realization.restrict_toAlgHom_apply, + gaugeSectorRealizationEquiv_toAlgHom_apply, Realization.restrictSector_toAlgHom_apply, + coe_covGaugeSectorEquiv, coe_gaugeSectorEquiv, includeCovConnection_one_tmul]) + +end GaugeFieldData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/GaugeSector.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/GaugeSector.lean new file mode 100644 index 000000000..3df82983e --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/GaugeSector.lean @@ -0,0 +1,226 @@ +/- +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.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.Sector +/-! +# The gauge sector as the complexified gauge-only algebra + +## i. Overview + +The gauge sector `T.SectorAlgebra {FieldCategory.gauge}` of the local field algebra is the +complex subalgebra generated by the connection symbols. The gauge-only algebra +`LocalGaugeFieldAlgebra 𝔤` is real, a connection being a real object, so the comparison is +with its complexification: the canonical inclusion `T.includeConnection` is injective with +range that sector, and the resulting equivalence intertwines the complexified gauge-only +actions with the restricted sector actions. + +Injectivity comes from a retraction, the lift of the assignment sending every matter +generator to zero and keeping the connection generators. No nontriviality, no basis and no +additional finite-dimensionality assumption is used; the ambient `[Module.Finite ℝ 𝔤]` of +the surrounding modules is unchanged. Neither condition on the matter species is needed. + +## ii. Key results + +- `GaugeFieldData.connectionRetraction` : the retraction onto the complexified gauge-only + algebra, and `GaugeFieldData.includeConnection_injective`. +- `GaugeFieldData.range_includeConnection` : the range of the inclusion is the gauge + sector. +- `GaugeFieldData.gaugeSectorEquiv` : the equivalence + `ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤 ≃ₐ[ℂ] ↥(T.SectorAlgebra {FieldCategory.gauge})`. +- `GaugeFieldData.gaugeSectorEquiv_complexRepJet`, + `GaugeFieldData.gaugeSectorEquiv_complexRepLorentzGroup` : the two intertwining laws. + +## iii. Table of contents + +- A. The retraction onto the connection factor + - A.1. Injectivity of the inclusion +- B. The range of the inclusion +- C. The equivalence with the gauge sector + - C.1. Computation on generators and symbols +- D. Compatibility with the symmetries + +-/ + +@[expose] public section + +open TensorProduct Matrix MatrixGroups + +namespace GaugeFieldData + +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} (T : GaugeFieldData jets) + +/-! + +## A. The retraction onto the connection factor + +-/ + +/-- The assignment sending every matter generator to zero and keeping the connection + generators. Its relations hold in the commutative target. -/ +noncomputable def connectionAssignment : + T.Assignment (ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤) where + fermion _ := 0 + boson _ := 0 + connection := + (Algebra.TensorProduct.includeRight (R := ℝ) (A := ℂ) + (B := SymmetricAlgebra ℝ (GaugeBoson.JetComponentSpace 𝔤))).toLinearMap ∘ₗ + SymmetricAlgebra.ι ℝ (GaugeBoson.JetComponentSpace 𝔤) + fermion_mul_self _ _ := by simp + fermion_mul_swap _ _ _ _ := by simp + boson_commute _ _ _ _ := Commute.all _ _ + connection_commute _ _ := Commute.all _ _ + boson_commute_connection _ _ _ := Commute.all _ _ + boson_commute_fermion _ _ _ _ := Commute.all _ _ + connection_commute_fermion _ _ _ := Commute.all _ _ + +/-- The retraction of the local field algebra onto the complexified gauge-only algebra: it + forgets the matter symbols. -/ +noncomputable def connectionRetraction : + T.LocalFieldAlgebra →ₐ[ℂ] ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤 := + T.connectionAssignment.lift + +variable {T} + +@[simp] +lemma connectionRetraction_ιConnection (v : GaugeBoson.JetComponentSpace 𝔤) : + T.connectionRetraction (T.ιConnection v) + = (1 : ℂ) ⊗ₜ[ℝ] SymmetricAlgebra.ι ℝ (GaugeBoson.JetComponentSpace 𝔤) v := + T.connectionAssignment.lift_ιConnection v + +/-! + +### A.1. Injectivity of the inclusion + +-/ + +/-- The retraction is a left inverse of the connection inclusion. -/ +lemma connectionRetraction_comp_includeConnection : + T.connectionRetraction.comp T.includeConnection + = AlgHom.id ℂ (ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤) := by + refine Algebra.TensorProduct.ext (Subsingleton.elim _ _) ?_ + refine AlgHom.ext_of_adjoin_eq_top SymmetricAlgebra.adjoin_range_ι ?_ + rintro _ ⟨v, rfl⟩ + exact connectionRetraction_ιConnection v + +lemma connectionRetraction_includeConnection (y : ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤) : + T.connectionRetraction (T.includeConnection y) = y := + AlgHom.congr_fun connectionRetraction_comp_includeConnection y + +/-- The complexified gauge-only algebra embeds in the local field algebra. -/ +lemma includeConnection_injective : Function.Injective T.includeConnection := + Function.LeftInverse.injective connectionRetraction_includeConnection + +/-! + +## B. The range of the inclusion + +-/ + +variable (T) + +/-- The range of the connection inclusion is the gauge sector. -/ +lemma range_includeConnection : + T.includeConnection.range = T.SectorAlgebra {FieldCategory.gauge} := by + refine le_antisymm ?_ (Algebra.adjoin_le ?_) + · refine Algebra.range_le_of_adjoin_eq_top + (Algebra.TensorProduct.adjoin_one_tmul_eq_top ℂ + (Set.range (SymmetricAlgebra.ι ℝ (GaugeBoson.JetComponentSpace 𝔤))) + SymmetricAlgebra.adjoin_range_ι) T.includeConnection ?_ + rintro _ ⟨_, ⟨v, rfl⟩, rfl⟩ + exact SectorAlgebra.ιConnection_mem (Finset.mem_singleton_self _) v + · intro b hb + refine SectorAlgebra.sectorGenerators_cases (P := fun b => b ∈ T.includeConnection.range) + hb (fun hS => absurd hS (by decide)) (fun hS => absurd hS (by decide)) + (fun _ v => ⟨(1 : ℂ) ⊗ₜ[ℝ] SymmetricAlgebra.ι ℝ (GaugeBoson.JetComponentSpace 𝔤) v, rfl⟩) + +lemma includeConnection_mem_gaugeSector (y : ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤) : + T.includeConnection y ∈ T.SectorAlgebra {FieldCategory.gauge} := by + rw [← range_includeConnection T] + exact ⟨y, rfl⟩ + +/-! + +## C. The equivalence with the gauge sector + +-/ + +/-- The gauge sector is the complexification of the gauge-only algebra: the connection + inclusion, corestricted to its range. The source is complexified because the gauge-only + algebra is real while the sector is a complex subalgebra. -/ +noncomputable def gaugeSectorEquiv : + (ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤) ≃ₐ[ℂ] ↥(T.SectorAlgebra {FieldCategory.gauge}) := + (AlgEquiv.ofInjective T.includeConnection includeConnection_injective).trans + (Subalgebra.equivOfEq _ _ (range_includeConnection T)) + +variable {T} + +/-- In the local field algebra the equivalence is the canonical inclusion. -/ +@[simp] +lemma coe_gaugeSectorEquiv (y : ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤) : + (T.gaugeSectorEquiv y : T.LocalFieldAlgebra) = T.includeConnection y := rfl + +/-- The inverse recovers an element from its inclusion. -/ +lemma gaugeSectorEquiv_symm_includeConnection (y : ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤) + (hy : T.includeConnection y ∈ T.SectorAlgebra {FieldCategory.gauge}) : + T.gaugeSectorEquiv.symm ⟨T.includeConnection y, hy⟩ = y := by + rw [show (⟨T.includeConnection y, hy⟩ : ↥(T.SectorAlgebra {FieldCategory.gauge})) + = T.gaugeSectorEquiv y from Subtype.ext rfl, AlgEquiv.symm_apply_apply] + +/-! + +### C.1. Computation on generators and symbols + +-/ + +/-- A real gauge-only generator, embedded with the scalar `1`, is the corresponding + connection symbol. -/ +lemma coe_gaugeSectorEquiv_one_tmul_ι (v : GaugeBoson.JetComponentSpace 𝔤) : + (T.gaugeSectorEquiv ((1 : ℂ) ⊗ₜ[ℝ] + SymmetricAlgebra.ι ℝ (GaugeBoson.JetComponentSpace 𝔤) v) : T.LocalFieldAlgebra) + = T.ιConnection v := rfl + +/-- `z ⊗ₜ x` maps to `z` times the image of `1 ⊗ₜ x`. -/ +lemma coe_gaugeSectorEquiv_tmul (z : ℂ) (x : LocalGaugeFieldAlgebra 𝔤) : + (T.gaugeSectorEquiv (z ⊗ₜ[ℝ] x) : T.LocalFieldAlgebra) + = z • (T.gaugeSectorEquiv ((1 : ℂ) ⊗ₜ[ℝ] x) : T.LocalFieldAlgebra) := by + have h : z ⊗ₜ[ℝ] x = z • ((1 : ℂ) ⊗ₜ[ℝ] x) := by + rw [TensorProduct.smul_tmul', smul_eq_mul, mul_one] + show T.includeConnection (z ⊗ₜ[ℝ] x) = z • T.includeConnection ((1 : ℂ) ⊗ₜ[ℝ] x) + rw [h] + exact T.includeConnection.toLinearMap.map_smul z ((1 : ℂ) ⊗ₜ[ℝ] x) + +/-- The gauge-field symbol `∂_s A_μ^φ`, for any derivative multiset, spacetime index and + adjoint covector, is the connection symbol with the same labels. -/ +lemma coe_gaugeSectorEquiv_gaugeField (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ 𝔤) : + (T.gaugeSectorEquiv (LocalGaugeFieldAlgebra.gaugeField 𝔤 s μ φ) : T.LocalFieldAlgebra) + = T.gaugeRealization.A s μ φ := rfl + +/-! + +## D. Compatibility with the symmetries + +-/ + +/-- The equivalence intertwines the complexified gauge-only jet action with the restricted + jet action of the gauge sector. -/ +lemma gaugeSectorEquiv_complexRepJet (U : GJ) (y : ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤) : + T.gaugeSectorEquiv (LocalGaugeFieldAlgebra.complexRepJet jets U y) + = SectorAlgebra.repJet T {FieldCategory.gauge} U (T.gaugeSectorEquiv y) := + Subtype.ext (repJet_includeConnection U y).symm + +/-- The equivalence intertwines the complexified gauge-only Lorentz action with the + restricted Lorentz action of the gauge sector. -/ +lemma gaugeSectorEquiv_complexRepLorentzGroup (Λ : SL(2,ℂ)) + (y : ℂ ⊗[ℝ] LocalGaugeFieldAlgebra 𝔤) : + T.gaugeSectorEquiv (LocalGaugeFieldAlgebra.complexRepLorentzGroup 𝔤 Λ y) + = SectorAlgebra.repLorentzGroup T {FieldCategory.gauge} Λ (T.gaugeSectorEquiv y) := + Subtype.ext (repLorentzGroup_includeConnection Λ y).symm + +end GaugeFieldData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/GaugeSectorRealization.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/GaugeSectorRealization.lean new file mode 100644 index 000000000..ce7c2d207 --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/GaugeSectorRealization.lean @@ -0,0 +1,126 @@ +/- +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.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeFieldAlgebra.Realization +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.GaugeSector +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.SectorRealization +/-! +# Realizations of the ordinary gauge sector + +## i. Overview + +For a complex algebra `B`, realizations of the ordinary gauge sector +`T.SectorAlgebra {FieldCategory.gauge}` are the real realizations of the gauge-only algebra +`LocalGaugeFieldAlgebra 𝔤` in `B`, its two actions viewed over `ℝ` by restriction of +scalars. The correspondence is the algebra equivalence `GaugeFieldData.gaugeSectorEquiv` +composed with the universal property of base change `AlgHom.liftEquiv`; the gauge symbols +`∂_s A_μ^φ` agree on both sides. + +## ii. Key results + +- `GaugeFieldData.gaugeSectorRealizationEquiv` : the correspondence, with both round trips. +- `GaugeFieldData.gaugeSectorRealizationEquiv_A`, + `GaugeFieldData.gaugeSectorRealizationEquiv_symm_toAlgHom_gaugeField` : the gauge symbols + of corresponding realizations. + +## iii. Table of contents + +- A. The correspondence +- B. Computation + +-/ + +@[expose] public section + +open TensorProduct Matrix MatrixGroups + +namespace GaugeFieldData + +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} {T : GaugeFieldData jets} {B : Type} [Ring B] + [Algebra ℂ B] {repJet : Representation ℂ GJ B} {repLorentz : Representation ℂ SL(2,ℂ) B} + +/-! + +## A. The correspondence + +-/ + +variable (T) in +/-- Realizations of the ordinary gauge sector are the real realizations of the gauge-only + algebra, the target keeping its complex actions restricted to `ℝ`. -/ +noncomputable def gaugeSectorRealizationEquiv : + SectorAlgebra.Realization T {FieldCategory.gauge} B repJet repLorentz + ≃ LocalGaugeFieldAlgebra.Realization jets B (repJet.restrictScalars ℝ) + (repLorentz.restrictScalars ℝ) := + (Representation.EquivariantAlgHom.compEquiv T.gaugeSectorEquiv + gaugeSectorEquiv_complexRepJet gaugeSectorEquiv_complexRepLorentzGroup).trans + (Representation.EquivariantAlgHom.liftEquivBaseChange + LocalGaugeFieldAlgebra.complexRepJet_tmul + LocalGaugeFieldAlgebra.complexRepLorentzGroup_tmul).symm + +/-! + +## B. Computation + +-/ + +lemma gaugeSectorRealizationEquiv_toAlgHom + (f : SectorAlgebra.Realization T {FieldCategory.gauge} B repJet repLorentz) : + (T.gaugeSectorRealizationEquiv f).toAlgHom + = ((f.toAlgHom.comp T.gaugeSectorEquiv.toAlgHom).restrictScalars ℝ).comp + Algebra.TensorProduct.includeRight := rfl + +@[simp] +lemma gaugeSectorRealizationEquiv_toAlgHom_apply + (f : SectorAlgebra.Realization T {FieldCategory.gauge} B repJet repLorentz) + (x : LocalGaugeFieldAlgebra 𝔤) : + (T.gaugeSectorRealizationEquiv f).toAlgHom x + = f.toAlgHom (T.gaugeSectorEquiv ((1 : ℂ) ⊗ₜ[ℝ] x)) := rfl + +/-- The gauge symbols of the corresponding real realization are the sector symbols. -/ +lemma gaugeSectorRealizationEquiv_A + (f : SectorAlgebra.Realization T {FieldCategory.gauge} B repJet repLorentz) + (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ 𝔤) : + (T.gaugeSectorRealizationEquiv f).A s μ φ + = f.toAlgHom (T.gaugeSectorEquiv (LocalGaugeFieldAlgebra.gaugeField 𝔤 s μ φ)) := + (congrArg (fun y => f.toAlgHom (T.gaugeSectorEquiv y)) + (LocalGaugeFieldAlgebra.gaugeField_eq_one_tmul_derivA s μ φ)).symm + +lemma gaugeSectorRealizationEquiv_symm_toAlgHom + (h : LocalGaugeFieldAlgebra.Realization jets B (repJet.restrictScalars ℝ) + (repLorentz.restrictScalars ℝ)) : + (T.gaugeSectorRealizationEquiv.symm h).toAlgHom + = (AlgHom.liftEquiv ℝ ℂ (LocalGaugeFieldAlgebra 𝔤) B h.toAlgHom).comp + T.gaugeSectorEquiv.symm.toAlgHom := rfl + +@[simp] +lemma gaugeSectorRealizationEquiv_symm_toAlgHom_apply + (h : LocalGaugeFieldAlgebra.Realization jets B (repJet.restrictScalars ℝ) + (repLorentz.restrictScalars ℝ)) (x : T.SectorAlgebra {FieldCategory.gauge}) : + (T.gaugeSectorRealizationEquiv.symm h).toAlgHom x + = AlgHom.liftEquiv ℝ ℂ (LocalGaugeFieldAlgebra 𝔤) B h.toAlgHom + (T.gaugeSectorEquiv.symm x) := rfl + +/-- The sector symbols of the corresponding sector realization are the gauge symbols. -/ +lemma gaugeSectorRealizationEquiv_symm_toAlgHom_gaugeField + (h : LocalGaugeFieldAlgebra.Realization jets B (repJet.restrictScalars ℝ) + (repLorentz.restrictScalars ℝ)) (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ 𝔤) : + (T.gaugeSectorRealizationEquiv.symm h).toAlgHom + (T.gaugeSectorEquiv (LocalGaugeFieldAlgebra.gaugeField 𝔤 s μ φ)) = h.A s μ φ := + calc (T.gaugeSectorRealizationEquiv.symm h).toAlgHom + (T.gaugeSectorEquiv (LocalGaugeFieldAlgebra.gaugeField 𝔤 s μ φ)) + = AlgHom.liftEquiv ℝ ℂ (LocalGaugeFieldAlgebra 𝔤) B h.toAlgHom + (LocalGaugeFieldAlgebra.gaugeField 𝔤 s μ φ) := + congrArg _ (T.gaugeSectorEquiv.symm_apply_apply _) + _ = h.A s μ φ := by + rw [LocalGaugeFieldAlgebra.gaugeField_eq_one_tmul_derivA, AlgHom.liftEquiv_tmul, + one_smul, LocalGaugeFieldAlgebra.Realization.A_apply] + +end GaugeFieldData diff --git a/Physlib/Mathematics/AlgebraRepresentation.lean b/Physlib/Mathematics/AlgebraRepresentation.lean index c0b90acc0..11edf507c 100644 --- a/Physlib/Mathematics/AlgebraRepresentation.lean +++ b/Physlib/Mathematics/AlgebraRepresentation.lean @@ -34,8 +34,8 @@ pairs of representations of two monoids, the two target representations being mu on the whole target: `Representation.EquivariantAlgHom`. Nothing relates the two pairs, the target actions are not assumed to commute, and they are not assumed unital, which over a monoid does not follow from multiplicativity. Section F base changes such a map along an -extension of scalars, and section G records the one affine identity an algebra map is used -for when a representation acts on generators by a shift. +extension of scalars, in both directions, and section G records the one affine identity an +algebra map is used for when a representation acts on generators by a shift. ## ii. Key results @@ -48,8 +48,13 @@ for when a representation acts on generators by a shift. - `Representation.toAlgHom` : a multiplicative representation of a group as algebra maps. - `Representation.EquivariantAlgHom` : an algebra map intertwining two pairs of representations, with `EquivariantAlgHom.id`, `EquivariantAlgHom.comp`, - `EquivariantAlgHom.restrictSubalgebra` and `EquivariantAlgHom.compFst`. -- `Representation.liftEquiv_baseChange` : base change preserves equivariance. + `EquivariantAlgHom.compEquiv`, `EquivariantAlgHom.restrictSubalgebra` and + `EquivariantAlgHom.compFst`. +- `Representation.baseChange` : the base change of a representation, with + `Representation.baseChange_naturality`. +- `Representation.liftEquiv_baseChange` : base change preserves equivariance, and + `Representation.EquivariantAlgHom.liftEquivBaseChange` : equivariant maps out of a base + change are the equivariant maps over the smaller ring. - `AlgHom.map_add_smul_one` : an algebra map on an affine combination `x + z • 1`. ## iii. Table of contents @@ -291,6 +296,40 @@ lemma comp_toAlgHom {A' : Type*} [Semiring A'] [Algebra k A'] {ρ₁' : Represen (hφ₂ : ∀ (g : G₂) (x : A'), φ (ρ₂' g x) = ρ₂ g (φ x)) : (f.comp φ hφ₁ hφ₂).toAlgHom = f.toAlgHom.comp φ := rfl +/-- Precomposition with an algebra equivalence of the sources intertwining the source + representations: equivariant maps out of equivalent sources correspond. -/ +noncomputable def compEquiv {A' : Type*} [Semiring A'] [Algebra k A'] + {ρ₁' : Representation k G₁ A'} {ρ₂' : Representation k G₂ A'} (e : A' ≃ₐ[k] A) + (he₁ : ∀ (g : G₁) (x : A'), e (ρ₁' g x) = ρ₁ g (e x)) + (he₂ : ∀ (g : G₂) (x : A'), e (ρ₂' g x) = ρ₂ g (e x)) : + EquivariantAlgHom ρ₁ σ₁ ρ₂ σ₂ ≃ EquivariantAlgHom ρ₁' σ₁ ρ₂' σ₂ where + toFun f := f.comp e.toAlgHom he₁ he₂ + invFun f := f.comp e.symm.toAlgHom + (fun g x => e.injective (by + simp only [AlgEquiv.coe_toAlgHom, AlgEquiv.apply_symm_apply, he₁])) + (fun g x => e.injective (by + simp only [AlgEquiv.coe_toAlgHom, AlgEquiv.apply_symm_apply, he₂])) + left_inv f := + EquivariantAlgHom.ext (AlgHom.ext fun x => congrArg f.toAlgHom (e.apply_symm_apply x)) + right_inv f := + EquivariantAlgHom.ext (AlgHom.ext fun x => congrArg f.toAlgHom (e.symm_apply_apply x)) + +@[simp] +lemma compEquiv_toAlgHom {A' : Type*} [Semiring A'] [Algebra k A'] + {ρ₁' : Representation k G₁ A'} {ρ₂' : Representation k G₂ A'} (e : A' ≃ₐ[k] A) + (he₁ : ∀ (g : G₁) (x : A'), e (ρ₁' g x) = ρ₁ g (e x)) + (he₂ : ∀ (g : G₂) (x : A'), e (ρ₂' g x) = ρ₂ g (e x)) + (f : EquivariantAlgHom ρ₁ σ₁ ρ₂ σ₂) : + (compEquiv e he₁ he₂ f).toAlgHom = f.toAlgHom.comp e.toAlgHom := rfl + +@[simp] +lemma compEquiv_symm_toAlgHom {A' : Type*} [Semiring A'] [Algebra k A'] + {ρ₁' : Representation k G₁ A'} {ρ₂' : Representation k G₂ A'} (e : A' ≃ₐ[k] A) + (he₁ : ∀ (g : G₁) (x : A'), e (ρ₁' g x) = ρ₁ g (e x)) + (he₂ : ∀ (g : G₂) (x : A'), e (ρ₂' g x) = ρ₂ g (e x)) + (f : EquivariantAlgHom ρ₁' σ₁ ρ₂' σ₂) : + ((compEquiv e he₁ he₂).symm f).toAlgHom = f.toAlgHom.comp e.symm.toAlgHom := rfl + /-- The restriction to a subalgebra of the source preserved by both source representations, along its inclusion; the target and its two actions are unchanged. -/ noncomputable def restrictSubalgebra (f : EquivariantAlgHom ρ₁ σ₁ ρ₂ σ₂) (S : Subalgebra k A) @@ -345,6 +384,85 @@ lemma liftEquiv_baseChange {R S A B G : Type*} [CommSemiring R] [CommSemiring S] rw [LinearMap.baseChange_tmul, AlgHom.liftEquiv_tmul, AlgHom.liftEquiv_tmul, map_smul (σ g), hf] +/-- The base change of a representation along `R → S`: the same action on the second factor + of `S ⊗[R] M`. -/ +noncomputable def baseChange {R M G : Type*} [CommSemiring R] (S : Type*) [CommSemiring S] + [Algebra R S] [AddCommMonoid M] [Module R M] [Monoid G] (ρ : Representation R G M) : + Representation S G (S ⊗[R] M) where + toFun g := LinearMap.baseChange S (ρ g) + map_one' := by + rw [map_one, Module.End.one_eq_id, LinearMap.baseChange_id, Module.End.one_eq_id] + map_mul' g₁ g₂ := by + rw [map_mul, Module.End.mul_eq_comp, LinearMap.baseChange_comp, Module.End.mul_eq_comp] + +@[simp] +lemma baseChange_tmul {R M G : Type*} [CommSemiring R] (S : Type*) [CommSemiring S] + [Algebra R S] [AddCommMonoid M] [Module R M] [Monoid G] (ρ : Representation R G M) (g : G) + (s : S) (x : M) : baseChange S ρ g (s ⊗ₜ[R] x) = s ⊗ₜ[R] ρ g x := rfl + +/-- Base change is natural: a linear map intertwining two representations base changes to + one intertwining their base changes. -/ +lemma baseChange_naturality {R M N G : Type*} [CommSemiring R] (S : Type*) [CommSemiring S] + [Algebra R S] [AddCommMonoid M] [Module R M] [AddCommMonoid N] [Module R N] [Monoid G] + {ρ : Representation R G M} {σ : Representation R G N} (f : M →ₗ[R] N) + (h : ∀ (g : G) (x : M), f (ρ g x) = σ g (f x)) (g : G) (y : S ⊗[R] M) : + LinearMap.baseChange S f (baseChange S ρ g y) + = baseChange S σ g (LinearMap.baseChange S f y) := by + induction y using TensorProduct.induction_on with + | zero => simp + | add u v hu hv => rw [map_add, map_add, hu, hv, map_add, map_add] + | tmul s x => + rw [LinearMap.baseChange_tmul, baseChange_tmul, baseChange_tmul, LinearMap.baseChange_tmul, h] + +/-- A representation on a base change acting on the pure tensors through a representation on + the second factor is that representation's base change. -/ +lemma eq_baseChange_of_tmul {R S A G : Type*} [CommSemiring R] [CommSemiring S] [Algebra R S] + [AddCommMonoid A] [Module R A] [Monoid G] (ρ : Representation R G A) + (ρ' : Representation S G (S ⊗[R] A)) + (h : ∀ (g : G) (s : S) (x : A), ρ' g (s ⊗ₜ[R] x) = s ⊗ₜ[R] ρ g x) (g : G) (y : S ⊗[R] A) : + ρ' g y = LinearMap.baseChange S (ρ g) y := by + induction y using TensorProduct.induction_on with + | zero => rw [map_zero, map_zero] + | add u v hu hv => rw [map_add, map_add, hu, hv] + | tmul s x => rw [h, LinearMap.baseChange_tmul] + +/-- For a target over `S`, the equivariant `R`-algebra maps out of `A` are the equivariant + `S`-algebra maps out of the base change `S ⊗[R] A`, by `AlgHom.liftEquiv`. The two source + actions on the base change are recognised by their values on the pure tensors, and the + target keeps its `S`-actions, restricted to `R` on the left-hand side. -/ +noncomputable def EquivariantAlgHom.liftEquivBaseChange {R S A B G₁ G₂ : Type*} [CommSemiring R] + [CommSemiring S] [Algebra R S] [Semiring A] [Algebra R A] [Semiring B] [Algebra S B] + [Algebra R B] [IsScalarTower R S B] [Monoid G₁] [Monoid G₂] + {ρ₁ : Representation R G₁ A} {ρ₂ : Representation R G₂ A} + {ρ₁' : Representation S G₁ (S ⊗[R] A)} {ρ₂' : Representation S G₂ (S ⊗[R] A)} + {σ₁ : Representation S G₁ B} {σ₂ : Representation S G₂ B} + (h₁ : ∀ (g : G₁) (s : S) (x : A), ρ₁' g (s ⊗ₜ[R] x) = s ⊗ₜ[R] ρ₁ g x) + (h₂ : ∀ (g : G₂) (s : S) (x : A), ρ₂' g (s ⊗ₜ[R] x) = s ⊗ₜ[R] ρ₂ g x) : + EquivariantAlgHom ρ₁ (σ₁.restrictScalars R) ρ₂ (σ₂.restrictScalars R) + ≃ EquivariantAlgHom ρ₁' σ₁ ρ₂' σ₂ where + toFun f := + { toAlgHom := AlgHom.liftEquiv R S A B f.toAlgHom + map_fst := fun g y => by + rw [eq_baseChange_of_tmul ρ₁ ρ₁' h₁] + exact liftEquiv_baseChange f.toAlgHom ρ₁ σ₁ f.map_fst g y + map_snd := fun g y => by + rw [eq_baseChange_of_tmul ρ₂ ρ₂' h₂] + exact liftEquiv_baseChange f.toAlgHom ρ₂ σ₂ f.map_snd g y + fst_mul := f.fst_mul + snd_mul := f.snd_mul } + invFun F := + { toAlgHom := (AlgHom.liftEquiv R S A B).symm F.toAlgHom + map_fst := fun g x => by + show F.toAlgHom ((1 : S) ⊗ₜ[R] ρ₁ g x) = σ₁ g (F.toAlgHom ((1 : S) ⊗ₜ[R] x)) + rw [← h₁, F.map_fst] + map_snd := fun g x => by + show F.toAlgHom ((1 : S) ⊗ₜ[R] ρ₂ g x) = σ₂ g (F.toAlgHom ((1 : S) ⊗ₜ[R] x)) + rw [← h₂, F.map_snd] + fst_mul := F.fst_mul + snd_mul := F.snd_mul } + left_inv f := EquivariantAlgHom.ext ((AlgHom.liftEquiv R S A B).symm_apply_apply f.toAlgHom) + right_inv F := EquivariantAlgHom.ext ((AlgHom.liftEquiv R S A B).apply_symm_apply F.toAlgHom) + end Representation /-! From 9d51c73b93b02785f685d90c432f7cd850b0eead Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Fri, 18 Sep 2026 22:52:52 +0400 Subject: [PATCH 331/367] refactor: generalize and restructure some Lorentz tensor and invariant results --- Physlib.lean | 2 + .../MassWeight/MassDimEight.lean | 81 ++-- .../MassWeight/MassDimLTEight.lean | 40 +- .../GaugeHiggsSector/MassWeight.lean | 98 ++-- .../YukawaSector/MassDimLTEight.lean | 6 +- .../MassWeight/MassDimEight.lean | 78 ++-- .../MassWeight/MassDimLTEight.lean | 97 ++-- Physlib/Particles/StandardModel/Peeling.lean | 1 + Physlib/Relativity/LorentzGroup/Basic.lean | 21 + .../LorentzGroup/Invariants/Basic.lean | 26 +- .../LorentzGroup/Invariants/IsBiLeftWeyl.lean | 13 +- .../LorentzGroup/Invariants/IsBiLorentz.lean | 134 ++---- .../Invariants/IsLeftRightWeyl.lean | 15 +- .../Invariants/IsQuadLorentz.lean | 438 ++++-------------- .../Invariants/IsSingleLorentz.lean | 111 +---- .../LorentzGroup/Invariants/IsTriLorentz.lean | 105 +---- .../Invariants/IsVectorLeftRightWeyl.lean | 38 +- .../LorentzGroup/Invariants/LightCone.lean | 261 +++++++++++ .../LorentzGroup/Invariants/TensorFamily.lean | 179 +++++++ 19 files changed, 852 insertions(+), 892 deletions(-) create mode 100644 Physlib/Relativity/LorentzGroup/Invariants/LightCone.lean create mode 100644 Physlib/Relativity/LorentzGroup/Invariants/TensorFamily.lean diff --git a/Physlib.lean b/Physlib.lean index 379163dde..d507552e2 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -633,6 +633,8 @@ 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.Invariants.IsVectorLeftRightWeyl +public import Physlib.Relativity.LorentzGroup.Invariants.LightCone +public import Physlib.Relativity.LorentzGroup.Invariants.TensorFamily 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/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/MassWeight/MassDimEight.lean b/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/MassWeight/MassDimEight.lean index 6e70ded42..92c9226b7 100644 --- a/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/MassWeight/MassDimEight.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/MassWeight/MassDimEight.lean @@ -17,7 +17,7 @@ underived contraction. The Lorentz classification then contracts the derivative The Higgs is a Lorentz scalar, so the only covector indices at this weight are the two derivative slots, and two covector indices admit exactly one invariant contraction, the -metric trace, which is `IsBiLorentz`. Contracting the mixed family gives the kinetic term +metric trace, which is `BiLorentz`. Contracting the mixed family gives the kinetic term `∂^μ H† ∂_μ H`; contracting the two families carrying both derivatives on one tower gives `□H† H` and `H† □H`. The square of the underived contraction has no index to contract and survives as it stands: it is the quartic potential `(H† H)²`. @@ -106,7 +106,7 @@ include h in /-- Both derivatives on the Higgs tower: a bi-Lorentz tensor in the two derivative slots. -/ lemma isBiLorentz_dotGaugeHiggs_left : - IsBiLorentz B repLorentz + IsLorentzTensorFamily 2 B repLorentz (fun d : Fin 2 → Fin 1 ⊕ Fin 3 => h.dotGaugeHiggs d ![]) where repLorentz_T g l := by rw [h.repLorentz_dotGaugeHiggs g l (![] : Fin 0 → Fin 1 ⊕ Fin 3)] @@ -116,7 +116,7 @@ lemma isBiLorentz_dotGaugeHiggs_left : include h in /-- Both derivatives on the conjugate tower: a bi-Lorentz tensor in the same way. -/ lemma isBiLorentz_dotGaugeHiggs_right : - IsBiLorentz B repLorentz + IsLorentzTensorFamily 2 B repLorentz (fun d : Fin 2 → Fin 1 ⊕ Fin 3 => h.dotGaugeHiggs ![] d) where repLorentz_T g l := by rw [h.repLorentz_dotGaugeHiggs g (![] : Fin 0 → Fin 1 ⊕ Fin 3) l, sum_cov_zero] @@ -127,7 +127,7 @@ include h in /-- One derivative on each tower: the family whose metric contraction is the kinetic term. -/ lemma isBiLorentz_dotGaugeHiggs_mixed : - IsBiLorentz B repLorentz + IsLorentzTensorFamily 2 B repLorentz (fun d : Fin 2 → Fin 1 ⊕ Fin 3 => h.dotGaugeHiggs ![d 0] ![d 1]) where repLorentz_T g l := by rw [h.repLorentz_dotGaugeHiggs g ![l 0] ![l 1], sum_cov_one, sum_cov_two] @@ -140,16 +140,16 @@ lemma isBiLorentz_dotGaugeHiggs_mixed : /-- The span of the isospin contractions with both derivatives on the Higgs tower is the span of the components of the corresponding bi-Lorentz tensor. -/ lemma dotSpan_two_zero_eq : - h.dotSpan 2 0 = (h.isBiLorentz_dotGaugeHiggs_left).span := by - rw [dotSpan, IsBiLorentz.span] + h.dotSpan 2 0 = componentSpan (fun d : Fin 2 → Fin 1 ⊕ Fin 3 => h.dotGaugeHiggs d ![]) := by + rw [dotSpan, componentSpan] refine iSup_congr fun d => le_antisymm (iSup_le fun d' => ?_) (le_iSup_of_le ![] le_rfl) rw [Subsingleton.elim d' (![] : Fin 0 → Fin 1 ⊕ Fin 3)] /-- The span of the isospin contractions with both derivatives on the conjugate tower is the span of the components of the corresponding bi-Lorentz tensor. -/ lemma dotSpan_zero_two_eq : - h.dotSpan 0 2 = (h.isBiLorentz_dotGaugeHiggs_right).span := by - rw [dotSpan, IsBiLorentz.span] + h.dotSpan 0 2 = componentSpan (fun d : Fin 2 → Fin 1 ⊕ Fin 3 => h.dotGaugeHiggs ![] d) := by + rw [dotSpan, componentSpan] refine le_antisymm (iSup_le fun d => iSup_le fun d' => le_iSup_of_le d' ?_) (iSup_le fun d => le_iSup_of_le ![] (le_iSup_of_le d le_rfl)) rw [Subsingleton.elim d (![] : Fin 0 → Fin 1 ⊕ Fin 3)] @@ -157,8 +157,9 @@ lemma dotSpan_zero_two_eq : /-- The span of the isospin contractions with one derivative on each tower is the span of the components of the mixed bi-Lorentz tensor. -/ lemma dotSpan_one_one_eq : - h.dotSpan 1 1 = (h.isBiLorentz_dotGaugeHiggs_mixed).span := by - rw [dotSpan, IsBiLorentz.span] + h.dotSpan 1 1 + = componentSpan (fun d : Fin 2 → Fin 1 ⊕ Fin 3 => h.dotGaugeHiggs ![d 0] ![d 1]) := by + rw [dotSpan, componentSpan] refine le_antisymm (iSup_le fun d => iSup_le fun d' => le_iSup_of_le ![d 0, d' 0] ?_) (iSup_le fun d => le_iSup_of_le ![d 0] (le_iSup_of_le ![d 1] le_rfl)) simp only [Matrix.cons_val_zero, Matrix.cons_val_one, etaExpand_cov_one] @@ -170,18 +171,18 @@ lemma dotSpan_one_one_eq : Two covector indices admit one invariant contraction, the metric trace, and the metric is carried to itself by a Lorentz matrix — that is the defining property of the Lorentz group, -recorded as `sum_minkowskiMatrixZ_mul` — so the trace of a bi-Lorentz family is a Lorentz -invariant. It is a gauge invariant too whenever the components are, and the components +recorded as `LorentzGroup.sum_minkowskiMatrixZ_mul` — so the trace of a bi-Lorentz family is a +Lorentz invariant. It is a gauge invariant too whenever the components are, and the components here are isospin contractions, which the gauge group fixes. -/ /-- The metric trace of a bi-Lorentz family is a Lorentz invariant. -/ lemma repLorentz_metricContraction {T : (Fin 2 → Fin 1 ⊕ Fin 3) → B} - (hT : IsBiLorentz B repLorentz T) (g : SL(2,ℂ)) : - repLorentz g (IsBiLorentz.metricContraction (T := T)) - = IsBiLorentz.metricContraction (T := T) := by - rw [IsBiLorentz.metricContraction, map_sum] + (hT : IsLorentzTensorFamily 2 B repLorentz T) (g : SL(2,ℂ)) : + repLorentz g (BiLorentz.metricContraction (T := T)) + = BiLorentz.metricContraction (T := T) := by + rw [BiLorentz.metricContraction, map_sum] have step : ∀ d : Fin 2 → Fin 1 ⊕ Fin 3, repLorentz g (((minkowskiMatrixZ (d 0) (d 1) : ℤ) : ℂ) • T d) = ∑ a : Fin 2 → Fin 1 ⊕ Fin 3, @@ -196,22 +197,22 @@ lemma repLorentz_metricContraction {T : (Fin 2 → Fin 1 ⊕ Fin 3) → B} congr 1 rw [sum_cov_two] simp only [Fin.prod_univ_two, Matrix.cons_val_zero, Matrix.cons_val_one] - exact IsQuadLorentz.sum_minkowskiMatrixZ_mul (SL2C.toLorentzGroup g) (a 0) (a 1) + exact LorentzGroup.sum_minkowskiMatrixZ_mul (SL2C.toLorentzGroup g) (a 0) (a 1) /-- The metric trace of a family of gauge invariants is a gauge invariant. -/ lemma rep_metricContraction {T : (Fin 2 → Fin 1 ⊕ Fin 3) → B} (hTG : ∀ (g : GaugeGroupI) (d : Fin 2 → Fin 1 ⊕ Fin 3), rep g (T d) = T d) (g : GaugeGroupI) : - rep g (IsBiLorentz.metricContraction (T := T)) - = IsBiLorentz.metricContraction (T := T) := by - rw [IsBiLorentz.metricContraction, map_sum] + rep g (BiLorentz.metricContraction (T := T)) + = BiLorentz.metricContraction (T := T) := by + rw [BiLorentz.metricContraction, map_sum] exact Finset.sum_congr rfl fun d _ => by rw [map_smul, hTG g d] /-! ## D. Peeling a bi-Lorentz span off a stable submodule -`IsBiLorentz.exists_smul_metricContraction_of_invariant_subset` removes one family at a +`BiLorentz.exists_smul_metricContraction_of_invariant_subset` removes one family at a time from a join, leaving a multiple of the metric trace and a remainder in the stable submodule. Section C makes that multiple fixed by both groups, so the remainder inherits both invariances from the element peeled and the peeling can be iterated. A submodule of @@ -220,32 +221,20 @@ same bookkeeping. -/ -/-- 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 _))) - /-- Peeling one bi-Lorentz span off a Lorentz-stable submodule: an element of the span together with `S` fixed by both groups is a multiple of the metric trace plus a remainder in `S` fixed by both groups. -/ lemma exists_mem_of_invariant_isBiLorentz_span_sup {T : (Fin 2 → Fin 1 ⊕ Fin 3) → B} - (hT : IsBiLorentz B repLorentz T) + (hT : IsLorentzTensorFamily 2 B repLorentz T) (hTG : ∀ (g : GaugeGroupI) (d : Fin 2 → Fin 1 ⊕ Fin 3), rep 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) (hL : ∀ g : SL(2,ℂ), repLorentz g x = x) + (hx : x ∈ componentSpan T ⊔ S) (hL : ∀ g : SL(2,ℂ), repLorentz g x = x) (hG : ∀ g : GaugeGroupI, rep g x = x) : ∃ y ∈ S, (∀ g : SL(2,ℂ), repLorentz g y = y) ∧ (∀ g : GaugeGroupI, rep g y = y) - ∧ x - y ∈ ℂ ∙ IsBiLorentz.metricContraction (T := T) := by + ∧ x - y ∈ ℂ ∙ BiLorentz.metricContraction (T := T) := by obtain ⟨a, y, hyS, hxy⟩ := - hT.exists_smul_metricContraction_of_invariant_subset S hS hx hL - have hmem : x - y ∈ ℂ ∙ IsBiLorentz.metricContraction (T := T) := by + BiLorentz.exists_smul_metricContraction_of_invariant_subset hT S hS hx hL + have hmem : x - y ∈ ℂ ∙ BiLorentz.metricContraction (T := T) := by rw [hxy, add_sub_cancel_right] exact Submodule.smul_mem _ _ (Submodule.mem_span_singleton_self _) refine ⟨y, hyS, fun g => ?_, fun g => ?_, hmem⟩ @@ -294,11 +283,11 @@ the kinetic term and the quartic potential. noncomputable def lorentzContractionEightSpan (h : HiggsAlgebraCovRealization B rep repLorentz massWeightPoly) : Submodule ℂ B := - ℂ ∙ IsBiLorentz.metricContraction + ℂ ∙ BiLorentz.metricContraction (T := fun d : Fin 2 → Fin 1 ⊕ Fin 3 => h.dotGaugeHiggs d ![]) - ⊔ (ℂ ∙ IsBiLorentz.metricContraction + ⊔ (ℂ ∙ BiLorentz.metricContraction (T := fun d : Fin 2 → Fin 1 ⊕ Fin 3 => h.dotGaugeHiggs ![] d) - ⊔ (ℂ ∙ IsBiLorentz.metricContraction + ⊔ (ℂ ∙ BiLorentz.metricContraction (T := fun d : Fin 2 → Fin 1 ⊕ Fin 3 => h.dotGaugeHiggs ![d 0] ![d 1]) ⊔ ℂ ∙ (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![]))) @@ -346,12 +335,12 @@ theorem exists_mem_of_gauge_and_lorentz_invariant (S : Submodule ℂ B) have hS₂L : ∀ g : SL(2,ℂ), ∀ y ∈ S₂, repLorentz g y ∈ S₂ := by refine stable_sup_lorentz (fun g y hy => ?_) hS₃L rw [h.dotSpan_one_one_eq] at hy ⊢ - exact isBiLorentz_span_stable _ g hy + exact h.isBiLorentz_dotGaugeHiggs_mixed.repLorentz_mem_componentSpan g hy have hS₁L : ∀ g : SL(2,ℂ), ∀ y ∈ S₁, repLorentz g y ∈ S₁ := by refine stable_sup_lorentz (fun g y hy => ?_) hS₂L rw [h.dotSpan_zero_two_eq] at hy ⊢ - exact isBiLorentz_span_stable _ g hy - have hx₁ : x ∈ (h.isBiLorentz_dotGaugeHiggs_left).span ⊔ S₁ := by + exact h.isBiLorentz_dotGaugeHiggs_right.repLorentz_mem_componentSpan g hy + have hx₁ : x ∈ componentSpan (fun d : Fin 2 → Fin 1 ⊕ Fin 3 => h.dotGaugeHiggs d ![]) ⊔ S₁ := by rw [← h.dotSpan_two_zero_eq, hS₁def, hS₂def, hS₃def] have hstep : x ∈ (h.dotSpan 2 0 ⊔ h.dotSpan 0 2 ⊔ h.dotSpan 1 1 ⊔ Q) ⊔ S := by rw [show x = (x - y₀) + y₀ from by abel] @@ -405,8 +394,8 @@ include h in eight. -/ lemma metricContraction_mem_massWeightSubmodule {T : (Fin 2 → Fin 1 ⊕ Fin 3) → B} (hT : ∀ d, T d ∈ h.massWeightSubmodule 8) : - IsBiLorentz.metricContraction (T := T) ∈ h.massWeightSubmodule 8 := by - rw [IsBiLorentz.metricContraction] + BiLorentz.metricContraction (T := T) ∈ h.massWeightSubmodule 8 := by + rw [BiLorentz.metricContraction] exact Submodule.sum_mem _ fun d _ => Submodule.smul_mem _ _ (hT d) include h in diff --git a/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/MassWeight/MassDimLTEight.lean b/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/MassWeight/MassDimLTEight.lean index 9197deeb4..bbfb22717 100644 --- a/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/MassWeight/MassDimLTEight.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/MassWeight/MassDimLTEight.lean @@ -20,7 +20,7 @@ weight is neutral, which is the gauge classification of `mem_of_invariant_massWeightSubmodule_two_sup`. Weight six dies on Lorentz counting. Its gauge invariants are the isospin contractions with one derivative, `∂_μ H† H` and `H† ∂_μ H`, and a single covector index admits no invariant contraction at all — the metric -ties two indices and the Levi-Civita symbol four — which is `IsSingleLorentz`. +ties two indices and the Levi-Civita symbol four — which is `SingleLorentz`. Weight four survives because the Higgs is a Lorentz scalar. Its gauge invariants are the multiples of `H† H`, and with no derivative slot there is no Lorentz index to contract, so @@ -82,7 +82,7 @@ lemma sum_cov_zero {M : Type*} [AddCommMonoid M] (f : (Fin 0 → Fin 1 ⊕ Fin 3 At mass weight six the gauge classification leaves the isospin contractions carrying one derivative, on either of the two towers. The Higgs is a Lorentz scalar, so the only Lorentz index such a contraction has is that derivative slot, and read as a family indexed -by it the contraction is a Lorentz vector. `IsSingleLorentz` says that one covector index +by it the contraction is a Lorentz vector. `SingleLorentz` says that one covector index admits no invariant contraction, so a Lorentz invariant of the span together with a stable submodule already lies in the submodule; the spans are themselves stable, so the two of them peel off one after the other. @@ -93,7 +93,7 @@ include h in /-- The isospin contraction of a once-derived Higgs tower against an underived conjugate tower, read as a family indexed by its derivative slot, is a Lorentz vector. -/ lemma isSingleLorentz_dotGaugeHiggs_left : - IsSingleLorentz B repLorentz + IsLorentzTensorFamily 1 B repLorentz (fun d : Fin 1 → Fin 1 ⊕ Fin 3 => h.dotGaugeHiggs d ![]) where repLorentz_T g l := by rw [h.repLorentz_dotGaugeHiggs g l (![] : Fin 0 → Fin 1 ⊕ Fin 3)] @@ -104,7 +104,7 @@ include h in /-- The isospin contraction of an underived Higgs tower against a once-derived conjugate tower is a Lorentz vector in the same way. -/ lemma isSingleLorentz_dotGaugeHiggs_right : - IsSingleLorentz B repLorentz + IsLorentzTensorFamily 1 B repLorentz (fun d : Fin 1 → Fin 1 ⊕ Fin 3 => h.dotGaugeHiggs ![] d) where repLorentz_T g l := by rw [h.repLorentz_dotGaugeHiggs g (![] : Fin 0 → Fin 1 ⊕ Fin 3) l, sum_cov_zero] @@ -114,32 +114,20 @@ lemma isSingleLorentz_dotGaugeHiggs_right : /-- The span of the isospin contractions with one derivative on the Higgs tower is the span of the components of the corresponding Lorentz vector. -/ lemma dotSpan_one_zero_eq : - h.dotSpan 1 0 = (h.isSingleLorentz_dotGaugeHiggs_left).span := by - rw [dotSpan, IsSingleLorentz.span] + h.dotSpan 1 0 = componentSpan (fun d : Fin 1 → Fin 1 ⊕ Fin 3 => h.dotGaugeHiggs d ![]) := by + rw [dotSpan, componentSpan] refine iSup_congr fun d => le_antisymm (iSup_le fun d' => ?_) (le_iSup_of_le ![] le_rfl) rw [Subsingleton.elim d' (![] : Fin 0 → Fin 1 ⊕ Fin 3)] /-- The span of the isospin contractions with one derivative on the conjugate tower is the span of the components of the corresponding Lorentz vector. -/ lemma dotSpan_zero_one_eq : - h.dotSpan 0 1 = (h.isSingleLorentz_dotGaugeHiggs_right).span := by - rw [dotSpan, IsSingleLorentz.span] + h.dotSpan 0 1 = componentSpan (fun d : Fin 1 → Fin 1 ⊕ Fin 3 => h.dotGaugeHiggs ![] d) := by + rw [dotSpan, componentSpan] refine le_antisymm (iSup_le fun d => iSup_le fun d' => le_iSup_of_le d' ?_) (iSup_le fun d => le_iSup_of_le ![] (le_iSup_of_le d le_rfl)) rw [Subsingleton.elim d (![] : Fin 0 → Fin 1 ⊕ Fin 3)] -/-- The span of the components of a Lorentz vector is stable under the Lorentz group: - each component goes to a combination of components. -/ -lemma isSingleLorentz_span_stable {T : (Fin 1 → Fin 1 ⊕ Fin 3) → B} - (hT : IsSingleLorentz 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 join of two Lorentz-stable submodules is Lorentz stable. -/ lemma stable_sup_lorentz {S₁ S₂ : Submodule ℂ B} (h₁ : ∀ g : SL(2,ℂ), ∀ y ∈ S₁, repLorentz g y ∈ S₁) @@ -240,14 +228,16 @@ theorem mem_of_gauge_lorentz_invariant_massWeightSubmodule_six_sup (S : Submodul repLorentz g y ∈ h.dotSpan 0 1 ⊔ S := by refine stable_sup_lorentz (fun g y hy => ?_) hSL rw [h.dotSpan_zero_one_eq] at hy ⊢ - exact isSingleLorentz_span_stable _ g hy - have hstep : x ∈ (h.isSingleLorentz_dotGaugeHiggs_left).span ⊔ (h.dotSpan 0 1 ⊔ S) := by + exact h.isSingleLorentz_dotGaugeHiggs_right.repLorentz_mem_componentSpan g hy + have hstep : x ∈ componentSpan (fun d : Fin 1 → Fin 1 ⊕ Fin 3 => h.dotGaugeHiggs d ![]) + ⊔ (h.dotSpan 0 1 ⊔ S) := by rw [← h.dotSpan_one_zero_eq, ← sup_assoc] exact hxmem - have hnext := (h.isSingleLorentz_dotGaugeHiggs_left).mem_of_invariant_of_mem_sup _ - hstab hstep hL + have hnext := SingleLorentz.mem_of_invariant_of_mem_sup + h.isSingleLorentz_dotGaugeHiggs_left _ hstab hstep hL rw [h.dotSpan_zero_one_eq] at hnext - exact (h.isSingleLorentz_dotGaugeHiggs_right).mem_of_invariant_of_mem_sup S hSL hnext hL + exact SingleLorentz.mem_of_invariant_of_mem_sup h.isSingleLorentz_dotGaugeHiggs_right S hSL + hnext hL /-! diff --git a/Physlib/Particles/StandardModel/CovAlgebraRealization/GaugeHiggsSector/MassWeight.lean b/Physlib/Particles/StandardModel/CovAlgebraRealization/GaugeHiggsSector/MassWeight.lean index 6509e613b..2612cd6b3 100644 --- a/Physlib/Particles/StandardModel/CovAlgebraRealization/GaugeHiggsSector/MassWeight.lean +++ b/Physlib/Particles/StandardModel/CovAlgebraRealization/GaugeHiggsSector/MassWeight.lean @@ -66,49 +66,39 @@ A family transforming as a Lorentz tensor stays one when multiplied by an elemen Lorentz group fixes, and its metric trace is multiplied by that element too. So a field strength against an underived Higgs is a tensor of the same two or three indices as the field strength alone. A once-derived Higgs contributes an index of its own, and a -bi-Lorentz family against a Lorentz vector is a triple Lorentz family. +rank-two family against a Lorentz vector is a rank-three family. -/ -/-- Multiplying a bi-Lorentz family by a Lorentz-inert element gives a bi-Lorentz family: - the element rides through the transformation law untouched. -/ -lemma IsBiLorentz.mul_fixed +/-- Multiplying a Lorentz tensor family by a Lorentz-inert element gives a family of the + same rank: the element rides through the transformation law untouched. -/ +lemma IsLorentzTensorFamily.mul_fixed {n : ℕ} (hmul : ∀ (Λ : SL(2,ℂ)) (x y : B), repLorentz Λ (x * y) = repLorentz Λ x * repLorentz Λ y) - {T : (Fin 2 → Fin 1 ⊕ Fin 3) → B} (hT : IsBiLorentz B repLorentz T) {y : B} + {T : (Fin n → Fin 1 ⊕ Fin 3) → B} (hT : IsLorentzTensorFamily n B repLorentz T) {y : B} (hy : ∀ g : SL(2,ℂ), repLorentz g y = y) : - IsBiLorentz B repLorentz fun d => T d * y where + IsLorentzTensorFamily n B repLorentz fun d => T d * y where repLorentz_T g l := by rw [hmul, hT.repLorentz_T g l, hy g, Finset.sum_mul] exact Finset.sum_congr rfl fun a _ => smul_mul_assoc _ _ _ /-- The metric trace of a family multiplied on the right by a fixed element is the metric trace of the family, multiplied by that element. -/ -lemma IsBiLorentz.metricContraction_mul (T : (Fin 2 → Fin 1 ⊕ Fin 3) → B) (y : B) : - IsBiLorentz.metricContraction (T := fun d => T d * y) - = IsBiLorentz.metricContraction (T := T) * y := by - rw [IsBiLorentz.metricContraction, IsBiLorentz.metricContraction, Finset.sum_mul] +lemma BiLorentz.metricContraction_mul (T : (Fin 2 → Fin 1 ⊕ Fin 3) → B) (y : B) : + BiLorentz.metricContraction (T := fun d => T d * y) + = BiLorentz.metricContraction (T := T) * y := by + rw [BiLorentz.metricContraction, BiLorentz.metricContraction, Finset.sum_mul] exact Finset.sum_congr rfl fun d _ => (smul_mul_assoc _ _ _).symm -/-- Multiplying a triple Lorentz family by a Lorentz-inert element gives a triple Lorentz - family. -/ -lemma IsTriLorentz.mul_fixed +/-- A rank-two family against a Lorentz vector is a rank-three family: the two covector + indices of the first factor and the single index of the second make three. -/ +lemma IsLorentzTensorFamily.mul_vector (hmul : ∀ (Λ : SL(2,ℂ)) (x y : B), repLorentz Λ (x * y) = repLorentz Λ x * repLorentz Λ y) - {T : (Fin 3 → Fin 1 ⊕ Fin 3) → B} (hT : IsTriLorentz B repLorentz T) {y : B} - (hy : ∀ g : SL(2,ℂ), repLorentz g y = y) : - IsTriLorentz B repLorentz fun d => T d * y where - repLorentz_T g l := by - rw [hmul, hT.repLorentz_T g l, hy g, Finset.sum_mul] - exact Finset.sum_congr rfl fun a _ => smul_mul_assoc _ _ _ - -/-- A bi-Lorentz family against a Lorentz vector is a triple Lorentz family: the two - covector indices of the first factor and the single index of the second make three. -/ -lemma IsBiLorentz.isTriLorentz_mul_vector - (hmul : ∀ (Λ : SL(2,ℂ)) (x y : B), repLorentz Λ (x * y) = repLorentz Λ x * repLorentz Λ y) - {T : (Fin 2 → Fin 1 ⊕ Fin 3) → B} (hT : IsBiLorentz B repLorentz T) + {T : (Fin 2 → Fin 1 ⊕ Fin 3) → B} (hT : IsLorentzTensorFamily 2 B repLorentz T) {U : (Fin 1 ⊕ Fin 3) → B} (hU : ∀ (g : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3), repLorentz g (U μ) = ∑ ν : Fin 1 ⊕ Fin 3, (((SL2C.toLorentzGroup g).1 ν μ : ℝ) : ℂ) • U ν) : - IsTriLorentz B repLorentz fun d : Fin 3 → Fin 1 ⊕ Fin 3 => T ![d 0, d 1] * U (d 2) where + IsLorentzTensorFamily 3 B repLorentz + fun d : Fin 3 → Fin 1 ⊕ Fin 3 => T ![d 0, d 1] * U (d 2) where repLorentz_T g l := by rw [hmul, hT.repLorentz_T g ![l 0, l 1], hU g (l 2), StandardModel.IsGaugeSector.sum_cov_two, StandardModel.IsGaugeSector.sum_cov_three, @@ -150,10 +140,11 @@ and the inertness of products and joins that the peeling consumes. modulo. An element of a join lies in a join over finitely many of the summands, so the finite peeling of the gauge sector suffices. -/ lemma mem_of_lorentz_invariant_iSup_isBiLorentz_span {ι : Type} - {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) + {T : ι → (Fin 2 → Fin 1 ⊕ Fin 3) → B} + (hT : ∀ i, IsLorentzTensorFamily 2 B repLorentz (T i)) + (hzero : ∀ i, BiLorentz.metricContraction (T := T i) = 0) (S : Submodule ℂ B) (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) {x : B} - (hx : x ∈ (⨆ i, (hT i).span) ⊔ S) + (hx : x ∈ (⨆ i, componentSpan (T i)) ⊔ S) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by classical obtain ⟨u, hu, z, hz, rfl⟩ := Submodule.mem_sup.1 hx @@ -165,9 +156,10 @@ lemma mem_of_lorentz_invariant_iSup_isBiLorentz_span {ι : Type} Lorentz families lies in the stable submodule it is taken modulo: three covector indices admit no invariant contraction at all. -/ lemma mem_of_lorentz_invariant_iSup_isTriLorentz_span {ι : Type} - {T : ι → (Fin 3 → Fin 1 ⊕ Fin 3) → B} (hT : ∀ i, IsTriLorentz B repLorentz (T i)) + {T : ι → (Fin 3 → Fin 1 ⊕ Fin 3) → B} + (hT : ∀ i, IsLorentzTensorFamily 3 B repLorentz (T i)) (S : Submodule ℂ B) (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) {x : B} - (hx : x ∈ (⨆ i, (hT i).span) ⊔ S) + (hx : x ∈ (⨆ i, componentSpan (T i)) ⊔ S) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by classical obtain ⟨u, hu, z, hz, rfl⟩ := Submodule.mem_sup.1 hx @@ -284,22 +276,21 @@ theorem mem_of_lorentz_invariant_derivSubmodule_zero_mul_fixed_sup (C : Submodul (hSL : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) {x : B} (hx : x ∈ h.isGaugeSector.derivSubmodule 0 * C ⊔ S) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by - have hT : ∀ i : Module.Dual ℝ GaugeAlgebra × C, IsBiLorentz B repLorentz - (fun l : Fin 2 → Fin 1 ⊕ Fin 3 => h.covF ![] (l 0) (l 1) i.1 * (i.2 : B)) := + let T : Module.Dual ℝ GaugeAlgebra × C → (Fin 2 → Fin 1 ⊕ Fin 3) → B := + fun i l => h.covF ![] (l 0) (l 1) i.1 * (i.2 : B) + have hT : ∀ i, IsLorentzTensorFamily 2 B repLorentz (T i) := fun i => (h.isGaugeSector.isBiLorentz_F_underived i.1).mul_fixed h.repLorentz_mul fun g => hC g (i.2 : B) i.2.2 - have hzero : ∀ i : Module.Dual ℝ GaugeAlgebra × C, - IsBiLorentz.metricContraction - (T := fun l : Fin 2 → Fin 1 ⊕ Fin 3 => h.covF ![] (l 0) (l 1) i.1 * (i.2 : B)) = 0 := by + have hzero : ∀ i, BiLorentz.metricContraction (T := T i) = 0 := by intro i refine IsGaugeSector.metricContraction_eq_zero_of_antisymm fun a b => ?_ - simp only [Matrix.cons_val_zero, Matrix.cons_val_one] + simp only [T, Matrix.cons_val_zero, Matrix.cons_val_one] rw [h.isGaugeSector.F_antisymm ![] a b i.1, neg_mul] refine mem_of_lorentz_invariant_iSup_isBiLorentz_span hT hzero S hSL ?_ hinv refine sup_le_sup_right ?_ S hx refine Submodule.mul_le.mpr fun a ha b hb => ?_ have key : h.isGaugeSector.derivSubmodule 0 - ≤ Submodule.comap (LinearMap.mulRight ℂ b) (⨆ i, (hT i).span) := by + ≤ Submodule.comap (LinearMap.mulRight ℂ b) (⨆ i, componentSpan (T i)) := by rw [IsGaugeSector.derivSubmodule] refine iSup_le fun l => iSup_le fun μ => iSup_le fun ν => ?_ rw [Submodule.span_le] @@ -307,7 +298,7 @@ theorem mem_of_lorentz_invariant_derivSubmodule_zero_mul_fixed_sup (C : Submodul simp only [SetLike.mem_coe, Submodule.mem_comap, LinearMap.mulRight_apply] rw [Subsingleton.elim l ![]] refine Submodule.mem_iSup_of_mem (φ, ⟨b, hb⟩) (Submodule.mem_iSup_of_mem ![μ, ν] ?_) - simp only [Matrix.cons_val_zero, Matrix.cons_val_one] + simp only [T, Matrix.cons_val_zero, Matrix.cons_val_one] exact Submodule.mem_span_singleton_self _ exact key ha @@ -318,22 +309,23 @@ theorem mem_of_lorentz_invariant_derivSubmodule_one_mul_fixed_sup (C : Submodule (hSL : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) {x : B} (hx : x ∈ h.isGaugeSector.derivSubmodule 1 * C ⊔ S) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by - have hT : ∀ i : Module.Dual ℝ GaugeAlgebra × C, IsTriLorentz B repLorentz - (fun l : Fin 3 → Fin 1 ⊕ Fin 3 => h.covF ![l 0] (l 1) (l 2) i.1 * (i.2 : B)) := + let T : Module.Dual ℝ GaugeAlgebra × C → (Fin 3 → Fin 1 ⊕ Fin 3) → B := + fun i l => h.covF ![l 0] (l 1) (l 2) i.1 * (i.2 : B) + have hT : ∀ i, IsLorentzTensorFamily 3 B repLorentz (T i) := fun i => (h.isGaugeSector.isTriLorentz_F_deriv_one i.1).mul_fixed h.repLorentz_mul fun g => hC g (i.2 : B) i.2.2 refine mem_of_lorentz_invariant_iSup_isTriLorentz_span hT S hSL ?_ hinv refine sup_le_sup_right ?_ S hx refine Submodule.mul_le.mpr fun a ha b hb => ?_ have key : h.isGaugeSector.derivSubmodule 1 - ≤ Submodule.comap (LinearMap.mulRight ℂ b) (⨆ i, (hT i).span) := by + ≤ Submodule.comap (LinearMap.mulRight ℂ b) (⨆ i, componentSpan (T i)) := by rw [IsGaugeSector.derivSubmodule] refine iSup_le fun l => iSup_le fun μ => iSup_le fun ν => ?_ rw [Submodule.span_le] rintro _ ⟨φ, rfl⟩ simp only [SetLike.mem_coe, Submodule.mem_comap, LinearMap.mulRight_apply] refine Submodule.mem_iSup_of_mem (φ, ⟨b, hb⟩) (Submodule.mem_iSup_of_mem ![l 0, μ, ν] ?_) - simp only [Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, + simp only [T, Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, Matrix.cons_val_two, Matrix.tail_cons, IsGaugeSector.etaExpand_cov_one] exact Submodule.mem_span_singleton_self _ exact key ha @@ -356,18 +348,20 @@ theorem mem_of_lorentz_invariant_derivSubmodule_zero_mul_higgs_one_sup (S : Subm · simp only [Sum.elim_inr, ← h.isHiggsSector_covBarH 1 ![μ]] rw [h.isHiggsSector.repLorentz_barH_apply g ψ 1 ![μ], IsGaugeSector.sum_cov_one] exact Finset.sum_congr rfl fun ν _ => by simp - have hT : ∀ i : Module.Dual ℝ GaugeAlgebra × - (Module.Dual ℂ HiggsVec ⊕ Module.Dual ℂ (ConjModule HiggsVec)), - IsTriLorentz B repLorentz (fun l : Fin 3 → Fin 1 ⊕ Fin 3 => h.covF ![] (l 0) (l 1) i.1 * - Sum.elim (fun φ => h.covH ![l 2] φ) (fun ψ => h.covBarH ![l 2] ψ) i.2) := - fun i => (h.isGaugeSector.isBiLorentz_F_underived i.1).isTriLorentz_mul_vector + let T : Module.Dual ℝ GaugeAlgebra × + (Module.Dual ℂ HiggsVec ⊕ Module.Dual ℂ (ConjModule HiggsVec)) → + (Fin 3 → Fin 1 ⊕ Fin 3) → B := + fun i l => h.covF ![] (l 0) (l 1) i.1 * + Sum.elim (fun φ => h.covH ![l 2] φ) (fun ψ => h.covBarH ![l 2] ψ) i.2 + have hT : ∀ i, IsLorentzTensorFamily 3 B repLorentz (T i) := + fun i => (h.isGaugeSector.isBiLorentz_F_underived i.1).mul_vector h.repLorentz_mul (hU i.2) refine mem_of_lorentz_invariant_iSup_isTriLorentz_span hT S hSL ?_ hinv refine sup_le_sup_right ?_ S hx refine Submodule.mul_le.mpr fun a ha b hb => ?_ have key : ∀ (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), h.isHiggsSector.derivSubmodule 1 - ≤ Submodule.comap (LinearMap.mulLeft ℂ (h.covF ![] μ ν φ)) (⨆ i, (hT i).span) := by + ≤ Submodule.comap (LinearMap.mulLeft ℂ (h.covF ![] μ ν φ)) (⨆ i, componentSpan (T i)) := by intro μ ν φ rw [HiggsAlgebraCovRealization.derivSubmodule] refine sup_le ?_ ?_ @@ -378,7 +372,7 @@ theorem mem_of_lorentz_invariant_derivSubmodule_zero_mul_higgs_one_sup (S : Subm simp only [Submodule.mem_comap, LinearMap.mulLeft_apply] refine Submodule.mem_iSup_of_mem (φ, Sum.inl ψ) (Submodule.mem_iSup_of_mem ![μ, ν, ρ] ?_) - simp only [Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.cons_val_two, + simp only [T, Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.cons_val_two, Matrix.tail_cons, Sum.elim_inl] exact Submodule.mem_span_singleton_self _ · rw [HiggsAlgebraCovRealization.barHiggsSubmodule] @@ -388,11 +382,11 @@ theorem mem_of_lorentz_invariant_derivSubmodule_zero_mul_higgs_one_sup (S : Subm simp only [Submodule.mem_comap, LinearMap.mulLeft_apply] refine Submodule.mem_iSup_of_mem (φ, Sum.inr ψ) (Submodule.mem_iSup_of_mem ![μ, ν, ρ] ?_) - simp only [Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.cons_val_two, + simp only [T, Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.cons_val_two, Matrix.tail_cons, Sum.elim_inr] exact Submodule.mem_span_singleton_self _ have hA : h.isGaugeSector.derivSubmodule 0 - ≤ Submodule.comap (LinearMap.mulRight ℂ b) (⨆ i, (hT i).span) := by + ≤ Submodule.comap (LinearMap.mulRight ℂ b) (⨆ i, componentSpan (T i)) := by rw [IsGaugeSector.derivSubmodule] refine iSup_le fun l => iSup_le fun μ => iSup_le fun ν => ?_ rw [Submodule.span_le] diff --git a/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/MassDimLTEight.lean b/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/MassDimLTEight.lean index 757d68cd2..0804d251f 100644 --- a/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/MassDimLTEight.lean +++ b/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/MassDimLTEight.lean @@ -186,7 +186,7 @@ lemma mem_of_invariant_of_mem_sup_of_odd_supp {M : Type*} [AddCommGroup M] [Modu (hx : x ∈ V ⊔ S) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by have hzero : d.piece 0 = ⊥ := d.piece_eq_bot 0 fun hmem => hodd 0 hmem ⟨0, rfl⟩ have hle : ∀ m : ℤ, (d.piece m).map S.mkQ - ≤ boostWeightSubmodule (IsQuadLorentz.quotRep (repLorentz := repLorentz) S hS) j m := + ≤ boostWeightSubmodule (repLorentz.quotient S fun g y hy => hS g y hy) j m := fun m => le_trans (Submodule.map_mono (d.piece_le m)) (map_boostWeightSubmodule_le S.mkQ (fun _ _ => rfl) j m) have hmem : S.mkQ x ∈ ⨆ m : ℤ, (d.piece m).map S.mkQ := by @@ -195,8 +195,8 @@ lemma mem_of_invariant_of_mem_sup_of_odd_supp {M : Type*} [AddCommGroup M] [Modu ← Submodule.map_iSup] exact Submodule.mem_map_of_mem (le_of_eq d.iSup_piece.symm hy) have hinv' : ∀ g : SL(2,ℂ), - IsQuadLorentz.quotRep (repLorentz := repLorentz) S hS g (S.mkQ x) = S.mkQ x := - fun g => by rw [IsQuadLorentz.quotRep_mkQ, hinv g] + (repLorentz.quotient S fun g y hy => hS g y hy) g (S.mkQ x) = S.mkQ x := + fun g => by rw [quotient_apply_mkQ, hinv g] have hx0 := mem_of_mem_iSup_of_boostWeight_zero hle hmem (mem_boostWeightSubmodule_zero_of_invariant hinv' j) rw [hzero, Submodule.map_bot, Submodule.mem_bot] at hx0 diff --git a/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/MassDimEight.lean b/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/MassDimEight.lean index ec861f004..189df5cc0 100644 --- a/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/MassDimEight.lean +++ b/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/MassDimEight.lean @@ -50,7 +50,7 @@ each of the four families. Both classifications are one-directional as stated, and the converse is that each span 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 +it sits inside the gauge span and is spanned by contractions that `QuadLorentz` 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`. @@ -1061,7 +1061,7 @@ lemma traceContractionEightSpan_sup_hyperchargeDerivSpan_le : 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`: `repLorentz_F` at no covariant derivatives moves each covector +sense of `IsLorentzTensorFamily 4`: `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 are sums of such products over a gauge index, and a finite sum of quadruple Lorentz tensors is one again. So is the twice-derived @@ -1105,7 +1105,7 @@ lemma sum_mul_sum_eq_sum_pi_four (c c' : (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) (∑ a, ∑ b, c a b • X a b) * (∑ x, ∑ y, c' x y • Y x y) = ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, (c (d 0) (d 1) * c' (d 2) (d 3)) • (X (d 0) (d 1) * Y (d 2) (d 3)) := by - rw [IsQuadLorentz.sum_pi_four, Fintype.sum_mul_sum] + rw [QuadLorentz.sum_pi_four, Fintype.sum_mul_sum] refine Finset.sum_congr rfl fun a _ => ?_ simp only [Fintype.sum_mul_sum, smul_mul_smul_comm, Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, Matrix.cons_val_two, Matrix.tail_cons, Matrix.cons_val_three] @@ -1115,7 +1115,7 @@ 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 + IsLorentzTensorFamily 4 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) φ, @@ -1126,8 +1126,8 @@ lemma isQuadLorentz_F_mul (φ ψ : Module.Dual ℝ GaugeAlgebra) : /-- 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 + (hT : ∀ i, IsLorentzTensorFamily 4 B repLorentz (T i)) : + IsLorentzTensorFamily 4 B repLorentz (fun d => ∑ i, T i d) where repLorentz_T g l := by simp only [map_sum, fun i => (hT i).repLorentz_T g l, Finset.smul_sum] exact Finset.sum_comm @@ -1138,24 +1138,25 @@ include h in lemma isQuadLorentz_of_eq_sum {ι : Type} [Fintype ι] {T : EightIdx → B} (φ : ι → Module.Dual ℝ GaugeAlgebra) (hT : ∀ d, T d = ∑ i, F ![] (d 0) (d 1) (φ i) * F ![] (d 2) (d 3) (φ i)) : - IsQuadLorentz B repLorentz T := by + IsLorentzTensorFamily 4 B repLorentz T := by rw [show T = fun d => ∑ i, F ![] (d 0) (d 1) (φ i) * F ![] (d 2) (d 3) (φ i) from funext hT] exact isQuadLorentz_sum fun _ => h.isQuadLorentz_F_mul _ _ /-- The gluon trace contractions, read as a family of four four-vector indices, form a quadruple Lorentz tensor: a sum over the colour index of products of two underived field-strength symbols. -/ -lemma isQuadLorentz_gluonTrace : IsQuadLorentz B repLorentz h.gluonTrace := +lemma isQuadLorentz_gluonTrace : IsLorentzTensorFamily 4 B repLorentz h.gluonTrace := h.isQuadLorentz_of_eq_sum (fun a : Fin 8 => GaugeAlgebra.stdBasis.coord (Sum.inl a)) h.gluonTrace_eq /-- The `W`-boson trace contractions form a quadruple Lorentz tensor. -/ -lemma isQuadLorentz_wTrace : IsQuadLorentz B repLorentz h.wTrace := +lemma isQuadLorentz_wTrace : IsLorentzTensorFamily 4 B repLorentz h.wTrace := h.isQuadLorentz_of_eq_sum (fun i : Fin 3 => GaugeAlgebra.stdBasis.coord (Sum.inr (Sum.inl i))) h.wTrace_eq /-- The hypercharge trace contractions form a quadruple Lorentz tensor. -/ -lemma isQuadLorentz_hyperchargeTrace : IsQuadLorentz B repLorentz h.hyperchargeTrace := by +lemma isQuadLorentz_hyperchargeTrace : + IsLorentzTensorFamily 4 B repLorentz h.hyperchargeTrace := by rw [show h.hyperchargeTrace = fun d => 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 @@ -1175,10 +1176,11 @@ lemma sum_pi_two_cov {M : Type*} [AddCommMonoid M] (f : (Fin 2 → Fin 1 ⊕ Fin /-- The twice-derived hypercharge field strengths, read as a family of four four-vector indices, form a quadruple Lorentz tensor: the two derivative slots and the two covector indices all rotate. This is the second shape of mass weight eight. -/ -lemma isQuadLorentz_hyperchargeDeriv : IsQuadLorentz B repLorentz h.hyperchargeDeriv where +lemma isQuadLorentz_hyperchargeDeriv : + IsLorentzTensorFamily 4 B repLorentz h.hyperchargeDeriv where repLorentz_T g l := by simp only [hyperchargeDeriv, hyperchargeField] - rw [h.repLorentz_F g 2 ![l 0, l 1] (l 2) (l 3), sum_pi_two_cov, IsQuadLorentz.sum_pi_four] + rw [h.repLorentz_F g 2 ![l 0, l 1] (l 2) (l 3), sum_pi_two_cov, QuadLorentz.sum_pi_four] simp only [Finset.smul_sum, smul_smul, Fin.prod_univ_two, Fin.prod_univ_four, mul_assoc, Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, Matrix.cons_val_two, Matrix.tail_cons, Matrix.cons_val_three] @@ -1186,44 +1188,46 @@ lemma isQuadLorentz_hyperchargeDeriv : IsQuadLorentz B repLorentz h.hyperchargeD /-- The span of the components of a quadruple Lorentz tensor is stable under the Lorentz group. -/ lemma isQuadLorentz_span_stable {T : (Fin 4 → Fin 1 ⊕ Fin 3) → B} - (hT : IsQuadLorentz B repLorentz T) (g : SL(2,ℂ)) : - ∀ y ∈ hT.span, repLorentz g y ∈ hT.span := - span_stable_of_map_eq_sum T _ (hT.repLorentz_T g) + (hT : IsLorentzTensorFamily 4 B repLorentz T) (g : SL(2,ℂ)) : + ∀ y ∈ componentSpan T, repLorentz g y ∈ componentSpan T := + fun _ hy => hT.repLorentz_mem_componentSpan g hy /-- 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 := - ⨆ i : Fin 4, ℂ ∙ IsQuadLorentz.contraction T i + ⨆ i : Fin 4, ℂ ∙ QuadLorentz.contraction T i /-- 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 := +lemma quadContractionSpan_le_span {T : (Fin 4 → Fin 1 ⊕ Fin 3) → B} : + quadContractionSpan T ≤ componentSpan T := iSup_span_singleton_le _ fun i => by - rw [IsQuadLorentz.contraction_eq] - exact hT.sum_smul_mem_span _ + rw [QuadLorentz.contraction_eq] + exact sum_smul_mem_componentSpan T _ /-- The span of the four Lorentz contractions of a quadruple Lorentz family is a space of - Lorentz invariants, the four contractions being invariant by `IsQuadLorentz`. -/ + Lorentz invariants, the four contractions being invariant by `QuadLorentz`. -/ lemma quadContractionSpan_le_lorentzInvariants {T : (Fin 4 → Fin 1 ⊕ Fin 3) → B} - (hT : IsQuadLorentz B repLorentz T) : quadContractionSpan T ≤ repLorentz.invariants := + (hT : IsLorentzTensorFamily 4 B repLorentz T) : + quadContractionSpan T ≤ repLorentz.invariants := iSup_span_singleton_le _ fun i => - (Representation.mem_invariants _ _).2 (hT.repLorentz_contraction i) + (Representation.mem_invariants _ _).2 (QuadLorentz.repLorentz_contraction hT i) /-- Peeling the span of a quadruple Lorentz tensor off a Lorentz-stable submodule, in the form `exists_mem_of_invariant_iSup_sup` takes: the remainder is Lorentz invariant by the - sup lemma of `IsQuadLorentz`, and the difference is a combination of the four + sup lemma of `QuadLorentz`, and the difference is a combination of the four contractions. -/ lemma exists_mem_of_invariant_isQuadLorentz_span_sup {T : (Fin 4 → Fin 1 ⊕ Fin 3) → B} - (hT : IsQuadLorentz B repLorentz T) (S : Submodule ℂ B) - (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) {x : B} (hx : x ∈ hT.span ⊔ S) + (hT : IsLorentzTensorFamily 4 B repLorentz T) (S : Submodule ℂ B) + (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) {x : B} + (hx : x ∈ componentSpan T ⊔ S) (hLinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : ∃ y ∈ S, (∀ g : SL(2,ℂ), repLorentz g y = y) ∧ x - y ∈ quadContractionSpan T := by obtain ⟨a₁, a₂, a₃, a₄, y, hyS, rfl, hyinv⟩ := - (hT.mem_span_sup_invariant_iff x S hS).1 ⟨hx, hLinv⟩ - have hmem := sum_smul_mem_iSup_span (IsQuadLorentz.contraction T) ![a₁, a₂, a₃, a₄] - rw [IsQuadLorentz.sum_smul_contraction] at hmem + (QuadLorentz.mem_span_sup_invariant_iff hT x S hS).1 ⟨hx, hLinv⟩ + have hmem := sum_smul_mem_iSup_span (QuadLorentz.contraction T) ![a₁, a₂, a₃, a₄] + rw [QuadLorentz.sum_smul_contraction] at hmem exact ⟨y, hyS, hyinv, by rwa [add_sub_cancel_right]⟩ /-- The span of the four Lorentz contractions of each of the three underived @@ -1239,13 +1243,13 @@ noncomputable def lorentzContractionEightSpan : Submodule ℂ B := the matching block of the gauge span. -/ lemma lorentzContractionEightSpan_le_traceContractionEightSpan_sup : h.lorentzContractionEightSpan ≤ h.traceContractionEightSpan ⊔ h.hyperchargeDerivSpan := - sup_le ((quadContractionSpan_le_span h.isQuadLorentz_gluonTrace).trans + sup_le ((quadContractionSpan_le_span (T := h.gluonTrace)).trans (le_sup_of_le_left le_sup_left)) - (sup_le ((quadContractionSpan_le_span h.isQuadLorentz_wTrace).trans + (sup_le ((quadContractionSpan_le_span (T := h.wTrace)).trans (le_sup_of_le_left (le_sup_of_le_right le_sup_left))) - (sup_le ((quadContractionSpan_le_span h.isQuadLorentz_hyperchargeTrace).trans + (sup_le ((quadContractionSpan_le_span (T := h.hyperchargeTrace)).trans (le_sup_of_le_left (le_sup_of_le_right le_sup_right))) - ((quadContractionSpan_le_span h.isQuadLorentz_hyperchargeDeriv).trans le_sup_right))) + ((quadContractionSpan_le_span (T := h.hyperchargeDeriv)).trans 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. -/ @@ -1276,9 +1280,9 @@ theorem exists_mem_of_gauge_and_lorentz_invariant (S : Submodule ℂ B) have hS₂ := fun g => sup_stable (isQuadLorentz_span_stable h.isQuadLorentz_hyperchargeTrace g) (hS₃ g) have hS₁ := fun g => sup_stable (isQuadLorentz_span_stable h.isQuadLorentz_wTrace g) (hS₂ g) - have hx₁ : x ∈ (h.isQuadLorentz_gluonTrace).span ⊔ ((h.isQuadLorentz_wTrace).span - ⊔ ((h.isQuadLorentz_hyperchargeTrace).span - ⊔ ((h.isQuadLorentz_hyperchargeDeriv).span ⊔ S))) := by + have hx₁ : x ∈ componentSpan h.gluonTrace ⊔ (componentSpan h.wTrace + ⊔ (componentSpan h.hyperchargeTrace + ⊔ (componentSpan h.hyperchargeDeriv ⊔ S))) := by have hmem := Submodule.mem_sup.2 ⟨x - y₀, hxy₀, y₀, hy₀S, sub_add_cancel x y₀⟩ rwa [traceContractionEightSpan, sup_assoc, sup_assoc, sup_assoc] at hmem obtain ⟨y₁, hy₁, hy₁L, hxy₁⟩ := @@ -1311,7 +1315,7 @@ theorem exists_mem_of_gauge_and_lorentz_invariant (S : Submodule ℂ B) The converse of the Lorentz classification: the Lorentz contraction span is made of gauge and Lorentz invariants of mass weight eight. Its gauge invariance was already needed in section H, and its mass weight passes to it from the gauge span in the same way; Lorentz -invariance comes from `IsQuadLorentz` directly, each block being spanned by the four +invariance comes from `QuadLorentz` directly, each block being spanned by the four contractions of a quadruple Lorentz family. -/ diff --git a/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/MassDimLTEight.lean b/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/MassDimLTEight.lean index af81cd214..648805638 100644 --- a/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/MassDimLTEight.lean +++ b/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/MassDimLTEight.lean @@ -160,7 +160,7 @@ 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 + IsLorentzTensorFamily 2 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) φ, @@ -178,7 +178,7 @@ 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 + IsLorentzTensorFamily 3 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] @@ -206,8 +206,8 @@ hence zero, and the trace vanishes with them. 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] + BiLorentz.metricContraction (T := T) = 0 := by + rw [BiLorentz.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) @@ -236,64 +236,42 @@ 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) + (hT : IsLorentzTensorFamily 2 B repLorentz T) + (hzero : BiLorentz.metricContraction (T := T) = 0) (S : Submodule ℂ B) + (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) {x : B} + (hx : x ∈ componentSpan T ⊔ 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 + BiLorentz.exists_smul_metricContraction_of_invariant_subset hT 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) + {T : ι → (Fin 2 → Fin 1 ⊕ Fin 3) → B} + (hT : ∀ i, IsLorentzTensorFamily 2 B repLorentz (T i)) + (hzero : ∀ i, BiLorentz.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) + (hx : x ∈ (⨆ i ∈ s, componentSpan (T i)) ⊔ 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 + rw [show (⨆ i ∈ (∅ : Finset ι), componentSpan (T i)) = ⊥ 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 + have hstab : ∀ g : SL(2,ℂ), ∀ y ∈ (⨆ i ∈ s, componentSpan (T i)) ⊔ S, + repLorentz g y ∈ (⨆ i ∈ s, componentSpan (T i)) ⊔ S := by intro g y hy - have key : ((⨆ i ∈ s, (hT i).span) ⊔ S) - ≤ Submodule.comap (repLorentz g) ((⨆ i ∈ s, (hT i).span) ⊔ S) := + have key : ((⨆ i ∈ s, componentSpan (T i)) ⊔ S) + ≤ Submodule.comap (repLorentz g) ((⨆ i ∈ s, componentSpan (T i)) ⊔ 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)))) + (Submodule.mem_iSup_of_mem hi ((hT i).repLorentz_mem_componentSpan 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 @@ -303,27 +281,28 @@ lemma mem_of_lorentz_invariant_biSup_isBiLorentz_span {ι : Type} [DecidableEq 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)) + {T : ι → (Fin 3 → Fin 1 ⊕ Fin 3) → B} + (hT : ∀ i, IsLorentzTensorFamily 3 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) + {x : B} (hx : x ∈ (⨆ i ∈ s, componentSpan (T i)) ⊔ 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 + rw [show (⨆ i ∈ (∅ : Finset ι), componentSpan (T i)) = ⊥ 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 + have hstab : ∀ g : SL(2,ℂ), ∀ y ∈ (⨆ i ∈ s, componentSpan (T i)) ⊔ S, + repLorentz g y ∈ (⨆ i ∈ s, componentSpan (T i)) ⊔ S := by intro g y hy - have key : ((⨆ i ∈ s, (hT i).span) ⊔ S) - ≤ Submodule.comap (repLorentz g) ((⨆ i ∈ s, (hT i).span) ⊔ S) := + have key : ((⨆ i ∈ s, componentSpan (T i)) ⊔ S) + ≤ Submodule.comap (repLorentz g) ((⨆ i ∈ s, componentSpan (T i)) ⊔ 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)))) + (Submodule.mem_iSup_of_mem hi ((hT i).repLorentz_mem_componentSpan 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 + exact ih (TriLorentz.mem_of_invariant_of_mem_sup (hT a) _ 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) : @@ -345,7 +324,7 @@ 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 + BiLorentz.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] @@ -357,7 +336,8 @@ include h in 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 + componentSpan (fun d : Fin 2 → Fin 1 ⊕ Fin 3 => + F ![] (d 0) (d 1) (GaugeAlgebra.stdBasis.coord c)) := by rw [derivSubmodule] refine iSup_le fun l => iSup_le fun μ => iSup_le fun ν => ?_ rw [Submodule.span_le] @@ -366,7 +346,8 @@ lemma derivSubmodule_zero_le_iSup_span : 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 + componentSpan (fun d : Fin 2 → Fin 1 ⊕ Fin 3 => + F ![] (d 0) (d 1) (GaugeAlgebra.stdBasis.coord c)) := by refine iSup_mono fun c => ?_ rw [Submodule.span_singleton_le_iff_mem] refine Submodule.mem_iSup_of_mem ![μ, ν] ?_ @@ -395,8 +376,8 @@ theorem mem_of_lorentz_invariant_massWeightSubmodule_four_sup (S : Submodule ℂ 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`. +all, so the rank-three classification needs no antisymmetry and no gauge input either: the +twelve spans peel off and the invariant is left in `S`. -/ @@ -412,7 +393,8 @@ include h in 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 + componentSpan (fun d : Fin 3 → Fin 1 ⊕ Fin 3 => + F ![d 0] (d 1) (d 2) (GaugeAlgebra.stdBasis.coord c)) := by rw [derivSubmodule] refine iSup_le fun l => iSup_le fun μ => iSup_le fun ν => ?_ rw [Submodule.span_le] @@ -421,7 +403,8 @@ lemma derivSubmodule_one_le_iSup_span : 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 + componentSpan (fun d : Fin 3 → Fin 1 ⊕ Fin 3 => + F ![d 0] (d 1) (d 2) (GaugeAlgebra.stdBasis.coord c)) := by refine iSup_mono fun c => ?_ rw [Submodule.span_singleton_le_iff_mem] refine Submodule.mem_iSup_of_mem ![l 0, μ, ν] ?_ diff --git a/Physlib/Particles/StandardModel/Peeling.lean b/Physlib/Particles/StandardModel/Peeling.lean index dfb9f9e3e..0f5a9d67a 100644 --- a/Physlib/Particles/StandardModel/Peeling.lean +++ b/Physlib/Particles/StandardModel/Peeling.lean @@ -9,6 +9,7 @@ public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecompositio public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU3FunAntiFun public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU2AntiFundamental public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU2BiFundamental +public import Physlib.Relativity.IsLorentzDeriv public import Physlib.Relativity.LorentzGroup.Invariants.IsBiLeftWeyl public import Physlib.Relativity.LorentzGroup.Invariants.IsVectorLeftRightWeyl /-! diff --git a/Physlib/Relativity/LorentzGroup/Basic.lean b/Physlib/Relativity/LorentzGroup/Basic.lean index 7ae8ca105..105fb7c23 100644 --- a/Physlib/Relativity/LorentzGroup/Basic.lean +++ b/Physlib/Relativity/LorentzGroup/Basic.lean @@ -470,6 +470,27 @@ lemma toComplex_transpose_mul_minkowskiMatrix_mul_self (Λ : LorentzGroup d) : · simp only [Matrix.map_mul] simp only [transpose_mul_minkowskiMatrix_mul_self] +/-- The defining relation `Λ η Λᵀ = η` over `ℂ`, read on the entry `(a, b)` and with the + integer Minkowski matrix in place of `minkowskiMatrix`. This is the form the invariant + classifications contract against, one metric pairing per pair of slots. -/ +lemma sum_minkowskiMatrixZ_mul (Λ : LorentzGroup d) (a b : Fin 1 ⊕ Fin d) : + ∑ x : Fin 1 ⊕ Fin d, ∑ y : Fin 1 ⊕ Fin d, ((minkowskiMatrixZ x y : ℤ) : ℂ) + * (((Λ.1 a x : ℝ) : ℂ) * ((Λ.1 b y : ℝ) : ℂ)) + = ((minkowskiMatrixZ a b : ℤ) : ℂ) := by + have hR : ∑ x : Fin 1 ⊕ Fin d, ∑ y : Fin 1 ⊕ Fin d, + ((minkowskiMatrixZ x y : ℤ) : ℝ) * (Λ.1 a x * Λ.1 b y) + = ((minkowskiMatrixZ a b : ℤ) : ℝ) := by + have h := congrFun (congrFun + (mul_minkowskiMatrix_mul_transpose (Λ := Λ)) a) b + simp only [Matrix.mul_apply, Matrix.transpose_apply] at h + rw [minkowskiMatrixZ.cast_apply, ← h, Finset.sum_comm] + refine Finset.sum_congr rfl fun y _ => ?_ + rw [Finset.sum_mul] + exact Finset.sum_congr rfl fun x _ => by rw [minkowskiMatrixZ.cast_apply]; ring + have hC := congrArg (fun r : ℝ => (r : ℂ)) hR + push_cast at hC ⊢ + exact hC + lemma toComplex_mulVec_ofReal (v : Fin 1 ⊕ Fin d → ℝ) (Λ : LorentzGroup d) : toComplex Λ *ᵥ (ofRealHom ∘ v) = ofRealHom ∘ (Λ *ᵥ v) := by simp only [toComplex, MonoidHom.coe_mk, OneHom.coe_mk] diff --git a/Physlib/Relativity/LorentzGroup/Invariants/Basic.lean b/Physlib/Relativity/LorentzGroup/Invariants/Basic.lean index 22c25c72d..6bd609931 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/Basic.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/Basic.lean @@ -209,6 +209,10 @@ lemma act_eq_actMat (Λ : Matrix (Fin 1 ⊕ Fin 3) (Fin 1 ⊕ Fin 3) ℝ) def IsInvariantCoeff (c : (Fin n → Fin 1 ⊕ Fin 3) → ℂ) : Prop := ∀ g : SL(2,ℂ), act (SL2C.toLorentzGroup g).1 c = c +section Monoid + +variable {B : Type*} [AddCommMonoid B] [Module ℂ B] + /-- Transforming a contraction is the same as contracting the transformed coefficient tensor. -/ lemma repLorentz_sum_smul {T : (Fin n → Fin 1 ⊕ Fin 3) → B} {repLorentz : Representation ℂ SL(2,ℂ) B} @@ -219,6 +223,18 @@ lemma repLorentz_sum_smul {T : (Fin n → Fin 1 ⊕ Fin 3) → B} simp only [map_sum, map_smul, hT, Finset.smul_sum, smul_smul, act, Finset.sum_smul] exact Finset.sum_comm +/-- Contracting the components with an invariant coefficient tensor gives a vector fixed by + the representation. -/ +lemma repLorentz_sum_smul_of_isInvariantCoeff {T : (Fin n → Fin 1 ⊕ Fin 3) → B} + {repLorentz : Representation ℂ SL(2,ℂ) B} + (hT : ∀ (g : SL(2,ℂ)) l, repLorentz g (T l) = ∑ a : Fin n → Fin 1 ⊕ Fin 3, + (∏ i, (((SL2C.toLorentzGroup g).1 (a i) (l i) : ℝ) : ℂ)) • T a) + {c : (Fin n → Fin 1 ⊕ Fin 3) → ℂ} (hc : IsInvariantCoeff c) (g : SL(2,ℂ)) : + repLorentz g (∑ d, c d • T d) = ∑ d, c d • T d := by + rw [repLorentz_sum_smul hT, hc g] + +end Monoid + /-- An invariant of the span is the contraction of an invariant coefficient tensor: the adjoint of `act Λ` is the action of `Λᵀ`, which is the Lorentz matrix of `g†`. -/ theorem exists_isInvariantCoeff_of_mem_span {T : (Fin n → Fin 1 ⊕ Fin 3) → B} @@ -234,16 +250,6 @@ theorem exists_isInvariantCoeff_of_mem_span {T : (Fin n → Fin 1 ⊕ Fin 3) → simp [Matrix.transpose_apply]⟩) hx hinv exact ⟨c, fun g => (act_eq_actMat _ c).trans (hc g), hx'⟩ -/-- Contracting the components with an invariant coefficient tensor gives a vector fixed by - the representation. -/ -lemma repLorentz_sum_smul_of_isInvariantCoeff {T : (Fin n → Fin 1 ⊕ Fin 3) → B} - {repLorentz : Representation ℂ SL(2,ℂ) B} - (hT : ∀ (g : SL(2,ℂ)) l, repLorentz g (T l) = ∑ a : Fin n → Fin 1 ⊕ Fin 3, - (∏ i, (((SL2C.toLorentzGroup g).1 (a i) (l i) : ℝ) : ℂ)) • T a) - {c : (Fin n → Fin 1 ⊕ Fin 3) → ℂ} (hc : IsInvariantCoeff c) (g : SL(2,ℂ)) : - repLorentz g (∑ d, c d • T d) = ∑ d, c d • T d := by - rw [repLorentz_sum_smul hT, hc g] - /-- A light-cone component of a coefficient tensor along axis `i`: the multi-index `κ` picks one light-cone direction per slot and `c` is contracted against that choice. -/ def lightConeComponent (i : Fin 3) (c : (Fin n → Fin 1 ⊕ Fin 3) → ℂ) (κ : Fin n → Fin 4) : ℂ := diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsBiLeftWeyl.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsBiLeftWeyl.lean index 30f05e515..76070ca03 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsBiLeftWeyl.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsBiLeftWeyl.lean @@ -50,7 +50,6 @@ invariance is the same condition for both and the classification carries over (I namespace Lorentz open TensorProduct Matrix MatrixGroups SL2C Invariants -open IsQuadLorentz (quotRep quotRep_mkQ) /-! @@ -355,12 +354,12 @@ the classification applies there and lifts back with an error term in `S`. 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) +lemma isBiLeftWeyl_quotient (S : Submodule ℂ B) (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) : - IsBiLeftWeyl (B ⧸ S) (quotRep (repLorentz := repLorentz) S hS) + IsBiLeftWeyl (B ⧸ S) (repLorentz.quotient S fun g y hy => hS g y hy) (fun l => S.mkQ (T l)) where repLorentz_T g l := by - rw [quotRep_mkQ, hT.repLorentz_T g l, map_sum] + rw [quotient_apply_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 @@ -378,7 +377,7 @@ lemma exists_smul_epsilonContraction_of_invariant_subset {x : B} (S : Submodule (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 hT' := hT.isBiLeftWeyl_quotient 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 @@ -387,9 +386,9 @@ lemma exists_smul_epsilonContraction_of_invariant_subset {x : B} (S : Submodule 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 + (repLorentz.quotient S fun g y hy => hS g y hy) g (S.mkQ x) = S.mkQ x := by intro g - rw [quotRep_mkQ, hinv g] + rw [quotient_apply_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⟩ diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsBiLorentz.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsBiLorentz.lean index cd9ed859a..da2ad9c34 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsBiLorentz.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsBiLorentz.lean @@ -5,7 +5,8 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Relativity.LorentzGroup.Invariants.IsQuadLorentz +public import Physlib.Relativity.LorentzGroup.Invariants.LightCone +public import Physlib.Relativity.LorentzGroup.Invariants.TensorFamily public meta import Mathlib.Data.Fintype.Sum public meta import Mathlib.Data.Fintype.Pi /-! @@ -22,19 +23,19 @@ symbol needing four. That is `exists_smul_metricContraction_of_invariant`, and Lorentz-stable subspace `S`, the form the Standard Model files use. The components are vectors `T d` of a complex vector space `B` carrying a representation -`repLorentz` of `SL(2,ℂ)`, indexed by two directions, and `IsBiLorentz` says the group -moves them with one factor of the Lorentz matrix per slot (A). `hT.span` is the set of -their combinations. +`repLorentz` of `SL(2,ℂ)`, indexed by two directions, and `IsLorentzTensorFamily 2` says the +group moves them with one factor of the Lorentz matrix per slot. `componentSpan T` is the set +of their combinations. An invariant of the span is `∑_d c_d • T d` for a coefficient tensor `c` that the Lorentz -matrices themselves fix (A, from `Invariants.Basic`), and the rest is the two-index case of the -argument in `IsQuadLorentz`, reusing its light-cone coefficients and sector matrices. Along a -spatial axis the four light-cone directions carry boost weights `2`, `-2`, `0`, `0`, and an +matrices themselves fix (from `Invariants.Basic`), and the rest runs at two slots on the +light-cone coefficients and sector matrices of `Invariants.LightCone`. Along a spatial axis +the four light-cone directions carry boost weights `2`, `-2`, `0`, `0`, and an invariant `c` has no light-cone component of nonzero weight, so it is fixed by the weight-zero -projection along each axis (B); averaging the three gives one linear map on the `16` -coefficients, `12` times an integer matrix with a short closed form (C, D). Its eigenvalues are +projection along each axis (A); averaging the three gives one linear map on the `16` +coefficients, `12` times an integer matrix with a short closed form (B, C). Its eigenvalues are `12`, `10`, `4`, `0`, with `12` simple, so the cubic `λ (λ - 4) (λ - 10)` sends everything onto -that one eigenvector, which is the metric (E). Section F draws the conclusion and G divides +that one eigenvector, which is the metric (D). Section E draws the conclusion and F divides out `S`. No rotation averaging is needed here, unlike the four-index case: for two indices the @@ -46,64 +47,20 @@ three weight-zero conditions already cut the `16` components down to a single li namespace Lorentz open TensorProduct Matrix MatrixGroups SL2C Invariants -open IsQuadLorentz (lightConeCoeffZ coe_lightConeCoeffZ lightConeCoeffInvQ - coe_lightConeCoeffInvQ lightConeCoeffInvZ coe_lightConeCoeffInvZ sectorIndex sectorWeight - lightConeWeight_eq_sectorWeight slotTransition slotTransitionZ slotTransitionZ_eq_sum quotRep - quotRep_mkQ) -/-! - -## A. Bi-Lorentz tensors and the span of their components - -A direction is an element of `Fin 1 ⊕ Fin 3`, time or one of the three axes, and an index -vector puts one in each of the two slots, so `T d` is `T^{μν}` at `(μ, ν) = d`. -`IsBiLorentz B repLorentz T` says the group moves the components with one factor of the -Lorentz matrix per slot, and `hT.span` is the set of combinations `∑ d, c d • T d`. - --/ - -/-- 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 +namespace BiLorentz 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) - -set_option linter.unusedVariables false in -/-- The span of the components; `hT` is unused, and is present only so it reads `hT.span`. -/ -def span (hT : IsBiLorentz B repLorentz T) : Submodule ℂ B := ⨆ d, ℂ ∙ T d - -/-- A vector lies in the span exactly when it is a combination `∑ d, c 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 - rw [span, ← Submodule.span_range_eq_iSup, ← Fintype.range_linearCombination, - LinearMap.mem_range] - simp only [Fintype.linearCombination_apply, eq_comm] - - -include hT in -/-- An invariant of the span is the contraction of an invariant coefficient tensor. -/ -theorem exists_isInvariantCoeff_of_mem_span {x : B} (hx : x ∈ hT.span) - (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : - ∃ c : (Fin 2 → Fin 1 ⊕ Fin 3) → ℂ, IsInvariantCoeff c ∧ x = ∑ d, c d • T d := - Invariants.exists_isInvariantCoeff_of_mem_span hT.repLorentz_T hx hinv /-! -## B. The weight-zero transition along one axis +## A. The weight-zero transition along one axis An invariant coefficient tensor keeps only its light-cone components of total weight zero, so writing it back on the coefficients it is fixed by one matrix per axis: a sum over the sector -patterns of total weight zero of the per-slot sector matrices of `IsQuadLorentz`. +patterns of total weight zero of the per-slot sector matrices of `Invariants.LightCone`. -/ @@ -193,7 +150,7 @@ lemma eq_sum_weightZeroTransition {c : (Fin 2 → Fin 1 ⊕ Fin 3) → ℂ} /-! -## C. The average over the axes +## B. The average over the axes An invariant coefficient tensor is fixed by each of the three weight-zero transitions, hence by their average. @@ -225,7 +182,7 @@ lemma eq_sum_boostAverageTransition {c : (Fin 2 → Fin 1 ⊕ Fin 3) → ℂ} /-! -## D. The average as an integer matrix +## C. The average as an integer matrix Twelve times the average is an integer matrix on the `16` components, with a short closed form that the kernel can evaluate cheaply. @@ -233,7 +190,7 @@ form that 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`. -/ + balanced-sector convolution of the integer slot matrices of `Invariants.LightCone`. -/ 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) @@ -310,7 +267,7 @@ lemma boostAverageZ_eq : boostAverageZ = Matrix.of boostAverageEntry := by /-! -## E. The certificate polynomial and the trace projector +## D. The certificate polynomial and the trace projector The average has eigenvalues `12`, `10`, `4` and `0` on the `16` components, with the invariant eigenvalue `12` simple, so the cubic `λ (λ - 4) (λ - 10)` sends the matrix to a @@ -369,9 +326,9 @@ lemma boostAverageZ_symm (d e : Fin 2 → Fin 1 ⊕ Fin 3) : /-! -## F. The classification of the Lorentz invariants +## E. The classification of the Lorentz invariants -## F.1. The metric contraction +## E.1. The metric contraction -/ @@ -382,7 +339,7 @@ noncomputable def metricContraction : B := /-! -## F.2. Iterating the averaged round on the coefficients +## E.2. Iterating the averaged round on the coefficients -/ @@ -420,7 +377,7 @@ lemma pow_mul_eq_sum_pow_boostAverageZ {c : (Fin 2 → Fin 1 ⊕ Fin 3) → ℂ} /-! -## F.3. The certificate round +## E.3. The certificate round -/ @@ -457,17 +414,16 @@ lemma eq_smul_minkowskiMatrixZ {c : (Fin 2 → Fin 1 ⊕ Fin 3) → ℂ} (hc : I /-! -## F.4. The classification +## E.4. The classification -/ -include hT in /-- Every Lorentz invariant in the span of the components is a 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) : +theorem exists_smul_metricContraction_of_invariant (hT : IsLorentzTensorFamily 2 B repLorentz T) + {x : B} (hx : x ∈ componentSpan T) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : ∃ a : ℂ, x = a • metricContraction (T := T) := by - obtain ⟨c, hc, rfl⟩ := hT.exists_isInvariantCoeff_of_mem_span hx hinv + obtain ⟨c, hc, rfl⟩ := hT.exists_isInvariantCoeff_of_mem_componentSpan hx hinv refine ⟨(4 : ℂ)⁻¹ * ∑ e, ((minkowskiMatrixZ (e 0) (e 1) : ℤ) : ℂ) * c e, ?_⟩ rw [metricContraction, Finset.smul_sum] refine Finset.sum_congr rfl fun d _ => ?_ @@ -475,25 +431,14 @@ theorem exists_smul_metricContraction_of_invariant {x : B} (hx : x ∈ hT.span) /-! -## G. The classification modulo a Lorentz-stable submodule +## F. The classification modulo a Lorentz-stable submodule A stable subspace `S` is divided out by passing to the quotient `B ⧸ S`, that is `B` with `S` declared zero: the classes of the components again form a bi-Lorentz tensor, so -section F applies there and lifts back with an error term in `S`. +section E applies there and lifts back with an error term in `S`. -/ -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) : @@ -502,26 +447,15 @@ lemma mkQ_metricContraction (S : Submodule ℂ B) : rw [metricContraction, metricContraction, map_sum] exact Finset.sum_congr rfl fun d _ => map_smul _ _ _ -include hT in /-- The same modulo a Lorentz-stable subspace `S`: a multiple of the metric contraction plus an error in `S`. -/ -lemma exists_smul_metricContraction_of_invariant_subset {x : B} (S : Submodule ℂ B) +lemma exists_smul_metricContraction_of_invariant_subset + (hT : IsLorentzTensorFamily 2 B repLorentz T) {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) : + (hx : x ∈ componentSpan T ⊔ 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' + obtain ⟨a, hcomb⟩ := exists_smul_metricContraction_of_invariant (hT.quotient S hS) + (mkQ_mem_componentSpan T S hx) fun g => by rw [quotient_apply_mkQ, hinv g] 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 @@ -529,6 +463,6 @@ lemma exists_smul_metricContraction_of_invariant_subset {x : B} (S : Submodule abel rwa [Submodule.ker_mkQ] at hker -end IsBiLorentz +end BiLorentz end Lorentz diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsLeftRightWeyl.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsLeftRightWeyl.lean index 0d5126614..299eb1c33 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsLeftRightWeyl.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsLeftRightWeyl.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Relativity.LorentzGroup.Invariants.IsQuadLorentz +public import Physlib.Relativity.LorentzGroup.Invariants.TensorFamily public import Physlib.Relativity.Fermions.Weyl.BoostWeight /-! # Lorentz invariants of a left-handed and a right-handed Weyl index @@ -44,7 +44,6 @@ its classification, still that there is no invariant, hence no Dirac mass term, namespace Lorentz open TensorProduct Matrix MatrixGroups SL2C Invariants -open IsQuadLorentz (quotRep quotRep_mkQ) /-! @@ -442,12 +441,12 @@ classification applies there and lifts back with an error term in `S`. 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) +lemma isLeftRightWeyl_quotient (S : Submodule ℂ B) (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) : - IsLeftRightWeyl (B ⧸ S) (quotRep (repLorentz := repLorentz) S hS) + IsLeftRightWeyl (B ⧸ S) (repLorentz.quotient S fun g y hy => hS g y hy) (fun l => S.mkQ (T l)) where repLorentz_T g l := by - rw [quotRep_mkQ, hT.repLorentz_T g l, map_sum] + rw [quotient_apply_mkQ, hT.repLorentz_T g l, map_sum] exact Finset.sum_congr rfl fun a _ => map_smul _ _ _ include hT in @@ -456,7 +455,7 @@ include hT in 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 hT' := hT.isLeftRightWeyl_quotient 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 @@ -465,9 +464,9 @@ lemma mem_of_invariant_of_mem_sup {x : B} (S : Submodule ℂ B) 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 + (repLorentz.quotient S fun g y hy => hS g y hy) g (S.mkQ x) = S.mkQ x := by intro g - rw [quotRep_mkQ, hinv g] + rw [quotient_apply_mkQ, hinv g] have hzero := hT'.eq_zero_of_invariant hmk hinv' rwa [← Submodule.ker_mkQ S, LinearMap.mem_ker] diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean index b21add045..6228001a7 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean @@ -5,11 +5,10 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Relativity.LorentzGroup.Invariants.Basic +public import Physlib.Relativity.LorentzGroup.Invariants.LightCone +public import Physlib.Relativity.LorentzGroup.Invariants.TensorFamily public import Physlib.Mathematics.LeviCivita.Basic public import Mathlib.LinearAlgebra.Matrix.Determinant.Basic --- Not used here; `Peeling` reaches it through this file. -public import Physlib.Relativity.IsLorentzDeriv /-! # Lorentz invariants of a rank-four tensor @@ -24,13 +23,13 @@ by every rotation and boost, the Lorentz transformations coming from `SL(2,ℂ)` There are no others. The fourth is a pseudoscalar, so it would drop out if reflections were allowed; independence is not proved, and for a given `T` the four may be dependent or zero. The components are vectors `T d` of a complex vector space `B` carrying a representation -`repLorentz` of `SL(2,ℂ)`, and `IsQuadLorentz B repLorentz T` says the group moves them with -one factor of the Lorentz matrix per slot (A). A vector of `B` is invariant when every -`repLorentz g` fixes it, and `hT.span` is the set of contractions `∑_d c_d • T d`. The theorem -`mem_span_sup_invariant_iff` (H) allows a Lorentz-stable subspace `S` beside the span, where -the files using it park their other tensors: a vector of `hT.span ⊔ S`, the sums `u + y`, is -invariant exactly when it is a combination of the four contractions plus an invariant `y` of -`S`. For `S = ⊥` that is `exists_smul_contraction_of_invariant`. +`repLorentz` of `SL(2,ℂ)`, and `IsLorentzTensorFamily 4 B repLorentz T` says the group moves +them with one factor of the Lorentz matrix per slot (A). A vector of `B` is invariant when every +`repLorentz g` fixes it, and `componentSpan T` is the set of contractions `∑_d c_d • T d`. The +theorem `mem_span_sup_invariant_iff` (H) allows a Lorentz-stable subspace `S` beside the span, +where the files using it park their other tensors: a vector of `componentSpan T ⊔ S`, the sums +`u + y`, is invariant exactly when it is a combination of the four contractions plus an +invariant `y` of `S`. For `S = ⊥` that is `exists_smul_contraction_of_invariant`. The four coefficient tensors are invariant, by `Λ η Λᵀ = η` and `det Λ = 1` (B); an invariant of the span is the contraction of an invariant one, by projecting off the tensors that contract @@ -47,11 +46,12 @@ open Matrix MatrixGroups SL2C Invariants /-! -## A. Quadruple Lorentz tensors, their span, and coefficient tensors +## A. Rank-four families, their span, and coefficient tensors A direction is an element of `Fin 1 ⊕ Fin 3`, time or one of the three axes; an index vector `d : Fin 4 → Fin 1 ⊕ Fin 3` puts one in each slot, so `T d` is `T^{μνρσ}` at `(μ, ν, ρ, σ) = d`. -The law is +The predicate and the span are `IsLorentzTensorFamily 4` and `componentSpan`, both from +`Invariants.TensorFamily`. The law is `repLorentz g (T l) = ∑_a Λ_{a₀ l₀} Λ_{a₁ l₁} Λ_{a₂ l₂} Λ_{a₃ l₃} • T a`, @@ -64,37 +64,11 @@ play, kept apart by name: `x : B` is Lorentz invariant when `repLorentz g x = x` stated for any number of slots in `Invariants.Basic` and used here at four. -/ -/-- A family `T` of vectors of `B`, one per index vector, which `repLorentz` moves the way the - components of a rank-four tensor transform: one factor of the Lorentz matrix per slot, the - moved index second in each factor and the summed one first. -/ -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, - 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 +namespace QuadLorentz 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) - -set_option linter.unusedVariables false in -/-- The span of the `256` components; `hT` is unused, and is present only so it reads `hT.span`. -/ -def span (hT : IsQuadLorentz B repLorentz T) : Submodule ℂ B := ⨆ d, ℂ ∙ T d - -/-- A vector lies in the span exactly when it is a contraction `∑ d, c 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 - rw [span, ← Submodule.span_range_eq_iSup, ← Fintype.range_linearCombination, - LinearMap.mem_range] - simp only [Fintype.linearCombination_apply, eq_comm] - -/-- Every contraction of the components lies in their span. -/ -lemma sum_smul_mem_span (c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ) : ∑ d, c d • T d ∈ hT.span := - (hT.mem_span_iff _).2 ⟨c, rfl⟩ /-! @@ -157,34 +131,38 @@ lemma sum_smul_contraction (a : Fin 4 → ℂ) : rfl /-- The outer contraction lies in the span of the components. -/ -lemma outerContraction_mem_span : outerContraction T ∈ hT.span := hT.sum_smul_mem_span _ +lemma outerContraction_mem_span : outerContraction T ∈ componentSpan T := + sum_smul_mem_componentSpan T _ /-- The inner contraction lies in the span of the components. -/ -lemma innerContraction_mem_span : innerContraction T ∈ hT.span := hT.sum_smul_mem_span _ +lemma innerContraction_mem_span : innerContraction T ∈ componentSpan T := + sum_smul_mem_componentSpan T _ /-- The split contraction lies in the span of the components. -/ -lemma splitContraction_mem_span : splitContraction T ∈ hT.span := hT.sum_smul_mem_span _ +lemma splitContraction_mem_span : splitContraction T ∈ componentSpan T := + sum_smul_mem_componentSpan T _ /-- The Levi-Civita contraction lies in the span of the components. -/ -lemma epsilonContraction_mem_span : epsilonContraction T ∈ hT.span := hT.sum_smul_mem_span _ +lemma epsilonContraction_mem_span : epsilonContraction T ∈ componentSpan T := + sum_smul_mem_componentSpan T _ /-- A combination of the four contractions lies in the span of the components. -/ lemma smul_contraction_mem_span (a₁ a₂ a₃ a₄ : ℂ) : a₁ • outerContraction T + a₂ • innerContraction T + a₃ • splitContraction T - + a₄ • epsilonContraction 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) + + a₄ • epsilonContraction T ∈ componentSpan T := + add_mem (add_mem (add_mem (Submodule.smul_mem _ _ (outerContraction_mem_span (T := T))) + (Submodule.smul_mem _ _ (innerContraction_mem_span (T := T)))) + (Submodule.smul_mem _ _ (splitContraction_mem_span (T := T)))) + (Submodule.smul_mem _ _ (epsilonContraction_mem_span (T := T))) /-! ## B.2. The four coefficient tensors are invariant -`Λ η Λᵀ = η` defines the Lorentz group; entry by entry it is `sum_minkowskiMatrixZ_mul`, and -a pair of metrics is two copies of it, one per pair of slots (`act_outerPair`). The inner and -split -pairings are the outer one with the slots permuted (`act_outerPair_comp`). The symbol against +`Λ η Λᵀ = η` defines the Lorentz group; entry by entry it is +`LorentzGroup.sum_minkowskiMatrixZ_mul`, and a pair of metrics is two copies of it, one per +pair of slots (`act_outerPair`). The inner and split pairings are the outer one with the slots +permuted (`act_outerPair_comp`). The symbol against four rows of `M` gives `det M` times the symbol of those rows (`sum_leviCivitaSymbol_mul_prod`), and `det Λ = 1` here: the only use of the determinant, and the reason there are four invariants and not three, a reflection having `det = -1`. `sum_pi_four` is bookkeeping. @@ -208,26 +186,8 @@ lemma sum_pi_four {M : Type*} [AddCommMonoid M] (F : (Fin 4 → Fin 1 ⊕ Fin 3) fin_cases i <;> simp] simp only [Fintype.sum_prod_type] -/-- The defining relation `Λ η Λᵀ = η`, read on the entry `(a, b)`. -/ -lemma sum_minkowskiMatrixZ_mul (Λ : LorentzGroup 3) (a b : Fin 1 ⊕ Fin 3) : - ∑ x : Fin 1 ⊕ Fin 3, ∑ y : Fin 1 ⊕ Fin 3, ((minkowskiMatrixZ x y : ℤ) : ℂ) - * (((Λ.1 a x : ℝ) : ℂ) * ((Λ.1 b y : ℝ) : ℂ)) - = ((minkowskiMatrixZ a b : ℤ) : ℂ) := by - have hR : ∑ x : Fin 1 ⊕ Fin 3, ∑ y : Fin 1 ⊕ Fin 3, - ((minkowskiMatrixZ x y : ℤ) : ℝ) * (Λ.1 a x * Λ.1 b y) - = ((minkowskiMatrixZ 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 [minkowskiMatrixZ.cast_apply, ← h, Finset.sum_comm] - refine Finset.sum_congr rfl fun y _ => ?_ - rw [Finset.sum_mul] - exact Finset.sum_congr rfl fun x _ => by rw [minkowskiMatrixZ.cast_apply]; ring - have hC := congrArg (fun r : ℝ => (r : ℂ)) hR - push_cast at hC ⊢ - exact hC - -/-- The pairing of slots `(0,1)` and `(2,3)` is fixed: two copies of `sum_minkowskiMatrixZ_mul`. -/ +/-- The pairing of slots `(0,1)` and `(2,3)` is fixed: two copies of + `LorentzGroup.sum_minkowskiMatrixZ_mul`. -/ lemma act_outerPair (Λ : LorentzGroup 3) (a : Fin 4 → Fin 1 ⊕ Fin 3) : act Λ.1 (fun d => ((minkowskiMatrixZ (d 0) (d 1) * minkowskiMatrixZ (d 2) (d 3) : ℤ) : ℂ)) a = ((minkowskiMatrixZ (a 0) (a 1) * minkowskiMatrixZ (a 2) (a 3) : ℤ) : ℂ) := by @@ -245,7 +205,7 @@ lemma act_outerPair (Λ : LorentzGroup 3) (a : Fin 4 → Fin 1 ⊕ Fin 3) : push_cast ring rw [act, sum_pi_four] - simp only [h, ← Finset.mul_sum, ← Finset.sum_mul, sum_minkowskiMatrixZ_mul] + simp only [h, ← Finset.mul_sum, ← Finset.sum_mul, LorentzGroup.sum_minkowskiMatrixZ_mul] push_cast ring @@ -302,47 +262,40 @@ Contracting with an invariant coefficient tensor gives an invariant vector, so e is invariant, as is any combination: with `smul_contraction_mem_span`, the easy direction. -/ -include hT in /-- Each of the four contractions is Lorentz invariant, its coefficient tensor being invariant. -/ -lemma repLorentz_contraction (i : Fin 4) (g : SL(2,ℂ)) : - repLorentz g (contraction T i) = contraction T i := by - rw [contraction_eq, - Invariants.repLorentz_sum_smul_of_isInvariantCoeff hT.repLorentz_T - (isInvariantCoeff_contractionCoeff i)] +lemma repLorentz_contraction (hT : IsLorentzTensorFamily 4 B repLorentz T) (i : Fin 4) + (g : SL(2,ℂ)) : repLorentz g (contraction T i) = contraction T i := by + rw [contraction_eq, hT.isInvariant_sum_smul (isInvariantCoeff_contractionCoeff i)] -include hT in /-- The outer contraction is Lorentz invariant. -/ -lemma repLorentz_outerContraction (g : SL(2,ℂ)) : +lemma repLorentz_outerContraction (hT : IsLorentzTensorFamily 4 B repLorentz T) (g : SL(2,ℂ)) : repLorentz g (outerContraction T) = outerContraction T := - hT.repLorentz_contraction 0 g + repLorentz_contraction hT 0 g -include hT in /-- The inner contraction is Lorentz invariant. -/ -lemma repLorentz_innerContraction (g : SL(2,ℂ)) : +lemma repLorentz_innerContraction (hT : IsLorentzTensorFamily 4 B repLorentz T) (g : SL(2,ℂ)) : repLorentz g (innerContraction T) = innerContraction T := - hT.repLorentz_contraction 1 g + repLorentz_contraction hT 1 g -include hT in /-- The split contraction is Lorentz invariant. -/ -lemma repLorentz_splitContraction (g : SL(2,ℂ)) : +lemma repLorentz_splitContraction (hT : IsLorentzTensorFamily 4 B repLorentz T) (g : SL(2,ℂ)) : repLorentz g (splitContraction T) = splitContraction T := - hT.repLorentz_contraction 2 g + repLorentz_contraction hT 2 g -include hT in /-- The Levi-Civita contraction is Lorentz invariant. -/ -lemma repLorentz_epsilonContraction (g : SL(2,ℂ)) : - repLorentz g (epsilonContraction T) = epsilonContraction T := - hT.repLorentz_contraction 3 g +lemma repLorentz_epsilonContraction (hT : IsLorentzTensorFamily 4 B repLorentz T) + (g : SL(2,ℂ)) : repLorentz g (epsilonContraction T) = epsilonContraction T := + repLorentz_contraction hT 3 g -include hT in /-- A combination of the four contractions is Lorentz invariant. -/ -lemma repLorentz_smul_contraction (a₁ a₂ a₃ a₄ : ℂ) (g : SL(2,ℂ)) : +lemma repLorentz_smul_contraction (hT : IsLorentzTensorFamily 4 B repLorentz T) + (a₁ a₂ a₃ a₄ : ℂ) (g : SL(2,ℂ)) : repLorentz g (a₁ • outerContraction T + a₂ • innerContraction T + a₃ • splitContraction T + a₄ • epsilonContraction T) = a₁ • outerContraction T + a₂ • innerContraction T + a₃ • splitContraction T + a₄ • epsilonContraction T := by - simp only [map_add, map_smul, hT.repLorentz_outerContraction, hT.repLorentz_innerContraction, - hT.repLorentz_splitContraction, hT.repLorentz_epsilonContraction] + simp only [map_add, map_smul, repLorentz_outerContraction hT, repLorentz_innerContraction hT, + repLorentz_splitContraction hT, repLorentz_epsilonContraction hT] /-! @@ -358,16 +311,10 @@ only move to and from the plain function type. The complement `Kᗮ` is preserve is again such a matrix, that of `g†`; the action is not unitary, and is not used to be. So keep the `Kᗮ` part of `c`: it still contracts to `x`, and acting on it changes it by an element of `K` and of `Kᗮ`, hence by `0`. The argument is the same for any number of slots and is carried -out there, `exists_isInvariantCoeff_of_mem_span` below being the reading of it for four. +out in `Invariants.Basic`, reached here through +`IsLorentzTensorFamily.exists_isInvariantCoeff_of_mem_componentSpan`. -/ -include hT in -/-- An invariant of the span is the contraction of an invariant coefficient tensor. -/ -theorem exists_isInvariantCoeff_of_mem_span {x : B} (hx : x ∈ hT.span) - (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : - ∃ c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ, IsInvariantCoeff c ∧ x = ∑ d, c d • T d := - Invariants.exists_isInvariantCoeff_of_mem_span hT.repLorentz_T hx hinv - /-! ## D. The rotations by `π` about the axes and the rotation `x → y → z → x` @@ -496,120 +443,13 @@ what they force is enough. ## E.2. The weight-zero projection Writing each coordinate direction in the light-cone basis recovers `c` from its light-cone -components (`eq_sum_lightConeComponent`), and for an invariant `c` only weight zero survives: -`16 * c d = ∑_e transitionZ i d e 0 * c e`. Time and the axis span the boost plane -(`InBoostPlane`); a direction in it is a half-sum of `D₀ ∓ Dᵢ`, so `lightConeCoeffInvZ` carries -twice the true coefficients and four slots give the `2 ^ 4 = 16`, bought for integer entries. -`transitionZ i d e m` is `16` times the entry, at `d` and `e`, of the map keeping total weight -`m`, built a slot at a time: a slot of `d` in the boost plane takes weight `2` or `-2`, leaving -`m - 2` or `m + 2`, a transverse slot takes either weight `0` direction, which is why those two -are added, and leaves `m` (`transitionZ_eq_sum` as one sum). +components (`eq_sum_lightConeComponent`), and for an invariant `c` only weight zero survives. +The projection that keeps total weight `m` is `Invariants.transitionZ`, built a slot at a time +and stated at any number of slots in `Invariants.LightCone`; each slot carries the factor `2` +of `lightConeCoeffInvZ`, so at four slots the projection is `2 ^ 4 = 16` times the true one. +That is the only place the `16` comes from. -/ -/-- The four light-cone directions of axis `i`, as integers. -/ -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 copy casts to `lightConeCoeff`. -/ -lemma coe_lightConeCoeffZ (i : Fin 3) (κ : Fin 4) (μ : Fin 1 ⊕ Fin 3) : - ((lightConeCoeffZ i κ μ : ℤ) : ℂ) = lightConeCoeff i κ μ := by - rw [lightConeCoeffZ, lightConeCoeff] - split_ifs <;> norm_num - -/-- Twice the coordinate directions in the light-cone basis, the `2` clearing the halves. -/ -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 copy is exactly twice `lightConeCoeffInv`. -/ -lemma coe_lightConeCoeffInvZ_eq_two_mul (i : Fin 3) (μ : Fin 1 ⊕ Fin 3) (κ : Fin 4) : - ((lightConeCoeffInvZ i μ κ : ℤ) : ℂ) = 2 * lightConeCoeffInv i μ κ := by - rw [lightConeCoeffInvZ, lightConeCoeffInv] - split_ifs <;> norm_num - -/-- The boost plane of axis `i`: time and the axis, the two directions the boost moves. -/ -def InBoostPlane (i : Fin 3) (μ : Fin 1 ⊕ Fin 3) : Prop := μ = Sum.inl 0 ∨ μ = Sum.inr i - -instance (i : Fin 3) (μ : Fin 1 ⊕ Fin 3) : Decidable (InBoostPlane i μ) := - inferInstanceAs (Decidable (_ ∨ _)) - -/-- A direction in the boost plane has no transverse light-cone components. -/ -lemma lightConeCoeffInvZ_eq_zero_of_inBoostPlane {i : Fin 3} {μ : Fin 1 ⊕ Fin 3} - (hμ : InBoostPlane i μ) {κ : Fin 4} (hκ : κ = 2 ∨ κ = 3) : - lightConeCoeffInvZ i μ κ = 0 := by - rcases hμ with rfl | rfl <;> rcases hκ with rfl | rfl <;> simp [lightConeCoeffInvZ] - -/-- A transverse direction has no light-cone components in the boost plane. -/ -lemma lightConeCoeffInvZ_eq_zero_of_not_inBoostPlane {i : Fin 3} {μ : Fin 1 ⊕ Fin 3} - (hμ : ¬InBoostPlane i μ) {κ : Fin 4} (hκ : κ = 0 ∨ κ = 1) : - lightConeCoeffInvZ i μ κ = 0 := by - simp only [InBoostPlane, not_or] at hμ - rcases hκ with rfl | rfl <;> simp [lightConeCoeffInvZ, hμ.1, hμ.2] - -/-- One slot's factor: twice the coefficient of `κ` in `μ`, times that of `ν` in `κ`. -/ -def slotZ (i : Fin 3) (κ : Fin 4) (μ ν : Fin 1 ⊕ Fin 3) : ℤ := - lightConeCoeffInvZ i μ κ * lightConeCoeffZ i κ ν - -/-- Sixteen times the entry, at `d` and `e`, of the map keeping the light-cone components of total - weight `m` along axis `i`. A slot of `d` in the boost plane takes weight `2` or `-2`, leaving - `m - 2` or `m + 2`; a transverse slot takes weight `0` and leaves `m`. -/ -def transitionZ (i : Fin 3) : {n : ℕ} → (d e : Fin n → Fin 1 ⊕ Fin 3) → ℤ → ℤ - | 0, _, _, m => if m = 0 then 1 else 0 - | _ + 1, d, e, m => - if InBoostPlane i (d 0) then - slotZ i 0 (d 0) (e 0) * transitionZ i (Fin.tail d) (Fin.tail e) (m - 2) - + slotZ i 1 (d 0) (e 0) * transitionZ i (Fin.tail d) (Fin.tail e) (m + 2) - else (slotZ i 2 (d 0) (e 0) + slotZ i 3 (d 0) (e 0)) - * transitionZ i (Fin.tail d) (Fin.tail e) m - -/-- The recursion unfolded, as a sum over the multi-indices of total weight `m`. -/ -lemma transitionZ_eq_sum (i : Fin 3) : - ∀ {n : ℕ} (d e : Fin n → Fin 1 ⊕ Fin 3) (m : ℤ), - transitionZ i d e m - = ∑ κ ∈ Finset.univ.filter - (fun κ : Fin n → Fin 4 => (∑ s, lightConeWeight (κ s)) = m), - ∏ s, slotZ i (κ s) (d s) (e s) - | 0, d, e, m => by - rw [Finset.sum_filter, Fintype.sum_unique] - simp [transitionZ, eq_comm] - | n + 1, d, e, m => by - have hpeel : ∀ κ : Fin 4, - (∑ κ' : Fin n → Fin 4, if lightConeWeight κ + ∑ s, lightConeWeight (κ' s) = m then - slotZ i κ (d 0) (e 0) * ∏ s, slotZ i (κ' s) (d s.succ) (e s.succ) else 0) - = slotZ i κ (d 0) (e 0) - * transitionZ i (Fin.tail d) (Fin.tail e) (m - lightConeWeight κ) := by - intro κ - rw [transitionZ_eq_sum i (Fin.tail d) (Fin.tail e), Finset.sum_filter, Finset.mul_sum] - exact Finset.sum_congr rfl fun κ' _ => by - rw [mul_ite, mul_zero] - exact if_congr (by omega) rfl rfl - calc transitionZ i d e m - = ∑ κ : Fin 4, slotZ i κ (d 0) (e 0) - * transitionZ i (Fin.tail d) (Fin.tail e) (m - lightConeWeight κ) := by - rw [Fin.sum_univ_four, transitionZ] - simp only [show lightConeWeight 0 = 2 from rfl, show lightConeWeight 1 = -2 from rfl, - show lightConeWeight 2 = 0 from rfl, show lightConeWeight 3 = 0 from rfl, - sub_neg_eq_add, sub_zero] - by_cases h : InBoostPlane i (d 0) - · rw [if_pos h] - simp [slotZ, lightConeCoeffInvZ_eq_zero_of_inBoostPlane h] - · rw [if_neg h] - simp [slotZ, lightConeCoeffInvZ_eq_zero_of_not_inBoostPlane h] - ring - _ = _ := by - rw [Finset.sum_filter, - ← Equiv.sum_comp (Fin.consEquiv fun _ : Fin (n + 1) => Fin 4), Fintype.sum_prod_type] - refine Finset.sum_congr rfl fun κ _ => ?_ - rw [← hpeel κ] - refine Finset.sum_congr rfl fun κ' _ => ?_ - simp only [Fin.consEquiv_apply, Fin.sum_univ_succ, Fin.prod_univ_succ, Fin.cons_zero, - Fin.cons_succ] - /-- An invariant coefficient tensor is its own weight-zero projection. -/ lemma sixteen_mul_eq_sum_transitionZ {c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ} (hc : IsInvariantCoeff c) (i : Fin 3) (d : Fin 4 → Fin 1 ⊕ Fin 3) : @@ -929,80 +769,42 @@ theorem exists_eq_sum {c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ} (hc : IsInvarian C to G give `exists_smul_contraction_of_invariant`, the case `S = ⊥` of the theorem. For general `S`, right to left is immediate and does not use `hS`; left to right passes to the quotient `B ⧸ S`, that is `B` with `S` declared zero and `S.mkQ` the map to classes. Stability -lets `repLorentz` act there (`quotRep`) and the classes of the components again form a -quadruple Lorentz tensor (`isQuadLorentz_quotRep`), so back in `B` the difference between `x` -and the matching combination of contractions has zero class, hence lies in `S`, and is -invariant as a difference of invariants. +lets `repLorentz` act there and the classes of the components again form a rank-four family, +both by `IsLorentzTensorFamily.quotient`, so back in `B` the difference between `x` and the +matching combination of contractions has zero class, hence lies in `S`, and is invariant as a +difference of invariants. -/ -include hT in /-- Every Lorentz invariant of the span is a combination of the four contractions. -/ -theorem exists_smul_contraction_of_invariant {x : B} (hx : x ∈ hT.span) - (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : +theorem exists_smul_contraction_of_invariant (hT : IsLorentzTensorFamily 4 B repLorentz T) + {x : B} (hx : x ∈ componentSpan T) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : ∃ a₁ a₂ a₃ a₄ : ℂ, x = a₁ • outerContraction T + a₂ • innerContraction T + a₃ • splitContraction T + a₄ • epsilonContraction T := by - obtain ⟨c, hc, rfl⟩ := hT.exists_isInvariantCoeff_of_mem_span hx hinv + obtain ⟨c, hc, rfl⟩ := hT.exists_isInvariantCoeff_of_mem_componentSpan hx hinv obtain ⟨a, rfl⟩ := exists_eq_sum hc refine ⟨a 0, a 1, a 2, a 3, ?_⟩ rw [← sum_smul_contraction] simp only [contraction_eq, Finset.smul_sum, Finset.sum_smul, smul_smul] exact Finset.sum_comm -/-- The representation induced on `B ⧸ S`, well defined because `S` is stable. -/ -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] - -/-- `S.mkQ y` is the class of `y`, and the induced representation moves a class by any lift. -/ -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 - /-- Taking classes turns a contraction of the components into one of their classes. -/ lemma mkQ_sum_smul (S : Submodule ℂ B) (c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ) : S.mkQ (∑ d, c d • T d) = ∑ d, c d • S.mkQ (T d) := by rw [map_sum] exact Finset.sum_congr rfl fun d _ => map_smul _ _ _ -include hT in -/-- The classes of the components 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, mkQ_sum_smul] - -include hT in /-- Left to right in `mem_span_sup_invariant_iff`, proved in the quotient by `S`. -/ -lemma exists_smul_contraction_of_invariant_subset {x : B} (S : Submodule ℂ B) +lemma exists_smul_contraction_of_invariant_subset + (hT : IsLorentzTensorFamily 4 B repLorentz T) {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) : + (hx : x ∈ componentSpan T ⊔ S) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : ∃ a₁ a₂ a₃ a₄ : ℂ, ∃ y ∈ S, x = a₁ • outerContraction T + a₂ • innerContraction T + a₃ • splitContraction T + a₄ • epsilonContraction T + y ∧ ∀ g : SL(2,ℂ), repLorentz g y = y := by - have hT' := hT.isQuadLorentz_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 - rw [← huz, map_add, show S.mkQ z = 0 from (Submodule.Quotient.mk_eq_zero S).2 hz, - add_zero, hc, mkQ_sum_smul] - exact hT'.sum_smul_mem_span c - have hinv' : ∀ g : SL(2,ℂ), - quotRep (repLorentz := repLorentz) S hS g (S.mkQ x) = S.mkQ x := - fun g => by rw [quotRep_mkQ, hinv g] - obtain ⟨a₁, a₂, a₃, a₄, hcomb⟩ := hT'.exists_smul_contraction_of_invariant hmk hinv' + obtain ⟨a₁, a₂, a₃, a₄, hcomb⟩ := exists_smul_contraction_of_invariant (hT.quotient S hS) + (mkQ_mem_componentSpan T S hx) fun g => by rw [quotient_apply_mkQ, hinv g] simp only [outerContraction, innerContraction, splitContraction, epsilonContraction, ← mkQ_sum_smul] at hcomb refine ⟨a₁, a₂, a₃, a₄, @@ -1012,104 +814,24 @@ lemma exists_smul_contraction_of_invariant_subset {x : B} (S : Submodule ℂ B) innerContraction, splitContraction, epsilonContraction] simp only [map_add, map_smul] abel - · rw [map_sub, hinv g, hT.repLorentz_smul_contraction a₁ a₂ a₃ a₄ g] - -include hT in -/-- A vector of `hT.span ⊔ S`, the sums `u + y` with `u` in the span and `y` in the Lorentz-stable - subspace `S`, is invariant exactly when it is a combination of the four contractions plus an - invariant `y` of `S`. `hS` is used only left to right. -/ -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) + · rw [map_sub, hinv g, repLorentz_smul_contraction hT a₁ a₂ a₃ a₄ g] + +/-- A vector of `componentSpan T ⊔ S`, the sums `u + y` with `u` in the span and `y` in the + Lorentz-stable subspace `S`, is invariant exactly when it is a combination of the four + contractions plus an invariant `y` of `S`. `hS` is used only left to right. -/ +theorem mem_span_sup_invariant_iff (hT : IsLorentzTensorFamily 4 B repLorentz T) (x : B) + (S : Submodule ℂ B) (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) : + (x ∈ componentSpan T ⊔ S ∧ ∀ g : SL(2,ℂ), repLorentz g x = x) ↔ ∃ a₁ a₂ a₃ a₄ : ℂ, ∃ y ∈ S, x = a₁ • outerContraction T + a₂ • innerContraction T + a₃ • splitContraction T + a₄ • epsilonContraction 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, ?_⟩ + refine ⟨fun h => exists_smul_contraction_of_invariant_subset hT 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₄)) + refine ⟨add_mem (Submodule.mem_sup_left (smul_contraction_mem_span (T := T) 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] - -/-! - -## Aside: what other files import from here - -None of this is used above. It repeats E over `ℚ`, sorting the light-cone directions into -sectors by weight, raising `2`, lowering `-2` and transverse `0`, which is the form -`IsBiLorentz` needs. --/ - -/-- The inverse light-cone coefficients of section E over `ℚ`, with the halves kept as halves. -/ -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 - -/-- The integer mirror is twice the rational one. -/ -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 - -/-- The sector of each light-cone direction: `0` raising, `1` lowering, `2` and `3` transverse. -/ -def sectorIndex : Fin 4 → Fin 3 := ![0, 1, 2, 2] - -/-- The boost weight of each sector: `2` raising, `-2` lowering, `0` transverse. -/ -def sectorWeight : Fin 3 → ℤ := ![2, -2, 0] - -/-- The light-cone weight of a direction is the weight of its sector. -/ -lemma lightConeWeight_eq_sectorWeight (κ : Fin 4) : - lightConeWeight κ = sectorWeight (sectorIndex κ) := by - fin_cases κ <;> rfl - -/-- The slot factor summed over the directions of one sector, over `ℚ`. -/ -def slotTransition (i : Fin 3) (κ : Fin 3) (μ ν : Fin 1 ⊕ Fin 3) : ℚ := - ∑ κ' ∈ Finset.univ.filter (fun κ' : Fin 4 => sectorIndex κ' = κ), - lightConeCoeffInvQ i μ κ' * (lightConeCoeffZ i κ' ν : ℚ) - -/-- The slot factor summed over one sector, in closed form over `ℤ`: on the boost plane the - raising sector carries `[[1, -1], [-1, 1]]` and the lowering sector the all-ones matrix, and - the transverse sector is twice the identity on the transverse directions. -/ -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 is the sector sum of the slot factors. -/ -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 - rw [Finset.sum_filter, Fin.sum_univ_four] - rcases μ with a | j <;> rcases ν with b | l - · simp only [Fin.fin_one_eq_zero a, Fin.fin_one_eq_zero b] - fin_cases κ <;> simp [slotTransitionZ, lightConeCoeffInvZ, lightConeCoeffZ, sectorIndex] - · simp only [Fin.fin_one_eq_zero a] - fin_cases κ <;> fin_cases i <;> fin_cases l <;> - simp [slotTransitionZ, lightConeCoeffInvZ, lightConeCoeffZ, sectorIndex] - · simp only [Fin.fin_one_eq_zero b] - fin_cases κ <;> fin_cases i <;> fin_cases j <;> - simp [slotTransitionZ, lightConeCoeffInvZ, lightConeCoeffZ, sectorIndex] - · fin_cases κ <;> fin_cases i <;> fin_cases j <;> fin_cases l <;> - simp [slotTransitionZ, lightConeCoeffInvZ, lightConeCoeffZ, sectorIndex] - -/-- The integer sector matrix is twice the rational one, which is what the two names promise. -/ -lemma coe_slotTransitionZ (i : Fin 3) (κ : Fin 3) (μ ν : Fin 1 ⊕ Fin 3) : - ((slotTransitionZ i κ μ ν : ℤ) : ℚ) = 2 * slotTransition i κ μ ν := by - rw [slotTransitionZ_eq_sum, slotTransition, Finset.mul_sum] - push_cast - exact Finset.sum_congr rfl fun κ' _ => by rw [coe_lightConeCoeffInvZ]; ring + rw [map_add, repLorentz_smul_contraction hT a₁ a₂ a₃ a₄ g, hyinv g] -end IsQuadLorentz +end QuadLorentz end Lorentz diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsSingleLorentz.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsSingleLorentz.lean index 5d0f3a836..3d4be5625 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsSingleLorentz.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsSingleLorentz.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Relativity.LorentzGroup.Invariants.IsQuadLorentz +public import Physlib.Relativity.LorentzGroup.Invariants.TensorFamily /-! # Lorentz invariants of a single four-vector index @@ -15,15 +15,15 @@ is `eq_zero_of_invariant`, and `mem_of_invariant_of_mem_sup` is the same stateme Lorentz-stable subspace `S`, the form the Standard Model files use. The components are vectors `T d` of a complex vector space `B` carrying a representation -`repLorentz` of `SL(2,ℂ)`, indexed by one direction `d`, and `IsSingleLorentz` says the group -moves them by the Lorentz matrix (A). `hT.span` is the set of their combinations. +`repLorentz` of `SL(2,ℂ)`, indexed by one direction `d`, and `IsLorentzTensorFamily 1` says the +group moves them by the Lorentz matrix. `componentSpan T` is the set of their combinations. An invariant of the span is `∑_d c_d • T d` for a coefficient tensor `c` that the Lorentz -matrices themselves fix (A, from `Invariants.Basic`). Along a spatial axis the four light-cone +matrices themselves fix (`Invariants.Basic`). Along a spatial axis the four light-cone directions carry boost weights `2`, `-2`, `0`, `0`, and an invariant `c` has no light-cone component of nonzero weight, which with one index says `c_d = 0` unless `d` is one of the two -directions transverse to time and to that axis (B). No direction is transverse to all three -axes, so running the three axes in turn leaves `c = 0` (C). Section D divides out `S`. +directions transverse to time and to that axis (A). No direction is transverse to all three +axes, so running the three axes in turn leaves `c = 0` (B). Section C divides out `S`. -/ @[expose] public section @@ -31,58 +31,16 @@ axes, so running the three axes in turn leaves `c = 0` (C). Section D divides ou namespace Lorentz open TensorProduct Matrix MatrixGroups SL2C Invariants -open IsQuadLorentz (quotRep quotRep_mkQ) -/-! - -## A. Single Lorentz tensors, their span, and coefficient tensors - -A direction is an element of `Fin 1 ⊕ Fin 3`, time or one of the three axes, and `T d` is the -component `T^{μ}` at `μ = d`. `IsSingleLorentz B repLorentz T` says the group moves them by the -Lorentz matrix `Λ` of `g : SL(2,ℂ)`, and `hT.span` is the set of combinations `∑ d, c d • T d` -(`mem_span_iff`). The components may be dependent, so the `c` writing a vector of the span is -not determined by it; `Invariants.exists_isInvariantCoeff_of_mem_span` picks out one that the -matrices fix, `act Λ c = c`, and the rest of the file classifies those. - --/ - -/-- 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 +namespace SingleLorentz 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) - -set_option linter.unusedVariables false in -/-- The span of the components; `hT` is unused, and is present only so it reads `hT.span`. -/ -def span (hT : IsSingleLorentz B repLorentz T) : Submodule ℂ B := ⨆ d, ℂ ∙ T d - -/-- A vector lies in the span exactly when it is a combination `∑ d, c d • T d`. -/ -lemma mem_span_iff (x : B) : - x ∈ hT.span ↔ ∃ c : (Fin 1 → Fin 1 ⊕ Fin 3) → ℂ, x = ∑ d, c d • T d := by - rw [span, ← Submodule.span_range_eq_iSup, ← Fintype.range_linearCombination, - LinearMap.mem_range] - simp only [Fintype.linearCombination_apply, eq_comm] - -include hT in -/-- An invariant of the span is the contraction of an invariant coefficient tensor. -/ -theorem exists_isInvariantCoeff_of_mem_span {x : B} (hx : x ∈ hT.span) - (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : - ∃ c : (Fin 1 → Fin 1 ⊕ Fin 3) → ℂ, IsInvariantCoeff c ∧ x = ∑ d, c d • T d := - Invariants.exists_isInvariantCoeff_of_mem_span hT.repLorentz_T hx hinv /-! -## B. What one axis leaves +## A. What one axis leaves The boost along the axis `i` scales the light-cone directions `D₀ - Dᵢ`, `D₀ + Dᵢ` and the two transverse ones by `t²`, `t⁻²`, `1`, `1`, so their weights are `2`, `-2`, `0`, `0`. An invariant @@ -122,9 +80,9 @@ lemma eq_zero_of_not_transverse {c : (Fin 1 → Fin 1 ⊕ Fin 3) → ℂ} (hc : /-! -## C. The classification of the Lorentz invariants +## B. The classification of the Lorentz invariants -No direction is transverse to all three axes at once, so applying B to the three axes in turn +No direction is transverse to all three axes at once, so applying A to the three axes in turn leaves no coefficient standing. -/ @@ -148,55 +106,32 @@ lemma eq_zero_of_isInvariantCoeff {c : (Fin 1 → Fin 1 ⊕ Fin 3) → ℂ} · exact eq_zero_of_not_transverse hc 1 h1 · exact eq_zero_of_not_transverse hc 0 h0 -include hT in /-- Every Lorentz invariant in the span of the components is zero: one index carries no invariant contraction. -/ -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, rfl⟩ := hT.exists_isInvariantCoeff_of_mem_span hx hinv +theorem eq_zero_of_invariant (hT : IsLorentzTensorFamily 1 B repLorentz T) {x : B} + (hx : x ∈ componentSpan T) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x = 0 := by + obtain ⟨c, hc, rfl⟩ := hT.exists_isInvariantCoeff_of_mem_componentSpan hx hinv simp [eq_zero_of_isInvariantCoeff hc] /-! -## D. The classification modulo a Lorentz-stable submodule +## C. The classification modulo a Lorentz-stable submodule A stable subspace `S` is divided out by passing to the quotient `B ⧸ S`, that is `B` with `S` declared zero: the classes of the components again form a single Lorentz tensor, so -section D applies there and an invariant of `hT.span ⊔ S` lies in `S`. +section B applies there and an invariant of `componentSpan T ⊔ S` lies in `S`. -/ -include hT in -/-- The classes of the components in the quotient 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 -/-- A Lorentz invariant of `hT.span ⊔ S`, for a Lorentz-stable subspace `S`, 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' +/-- A Lorentz invariant of `componentSpan T ⊔ S`, for a Lorentz-stable subspace `S`, already + lies in `S`. -/ +lemma mem_of_invariant_of_mem_sup (hT : IsLorentzTensorFamily 1 B repLorentz T) {x : B} + (S : Submodule ℂ B) (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) + (hx : x ∈ componentSpan T ⊔ S) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by + have hzero := eq_zero_of_invariant (hT.quotient S hS) (mkQ_mem_componentSpan T S hx) + fun g => by rw [quotient_apply_mkQ, hinv g] rwa [← Submodule.ker_mkQ S, LinearMap.mem_ker] -end IsSingleLorentz +end SingleLorentz end Lorentz diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsTriLorentz.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsTriLorentz.lean index 060c502a5..bad105c24 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsTriLorentz.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsTriLorentz.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Relativity.LorentzGroup.Invariants.IsQuadLorentz +public import Physlib.Relativity.LorentzGroup.Invariants.TensorFamily public meta import Mathlib.Data.Fintype.Sum public meta import Mathlib.Data.Fintype.Pi /-! @@ -18,20 +18,20 @@ odd number is left over either way. That is `eq_zero_of_invariant`, and the form the Standard Model files use. The components are vectors `T d` of a complex vector space `B` carrying a representation -`repLorentz` of `SL(2,ℂ)`, indexed by three directions, and `IsTriLorentz` says the group -moves them with one factor of the Lorentz matrix per slot (B). `hT.span` is the set of -their combinations. +`repLorentz` of `SL(2,ℂ)`, indexed by three directions, and `IsLorentzTensorFamily 3` says the +group moves them with one factor of the Lorentz matrix per slot. `componentSpan T` is the set +of their combinations. An invariant of the span is `∑_d c_d • T d` for a coefficient tensor `c` that the Lorentz -matrices themselves fix (B, from `Invariants.Basic`). One axis then does all the work, with a +matrices themselves fix (from `Invariants.Basic`). One axis then does all the work, with a parity argument in place of a certificate. Along a spatial axis the four light-cone directions carry boost weights `2`, `-2`, `0`, `0`, and an invariant `c` has no light-cone component of nonzero weight. In a multi-index of total weight `0` the `+2` and `-2` slots pair off, leaving an odd number of the three slots transverse. The half turn about the axis, the rotation by `π`, fixes time and the axis and negates the two transverse directions (A), so it multiplies each weight-zero component by `-1` to an odd power, that is by `-1`, and an invariant component both -fixed and negated is `0` (C). Every light-cone component of `c` vanishes, so `c` does, and with -it the invariant. Section D divides out `S`. +fixed and negated is `0` (B). Every light-cone component of `c` vanishes, so `c` does, and with +it the invariant. Section C divides out `S`. -/ @[expose] public section @@ -39,7 +39,6 @@ it the invariant. Section D divides out `S`. namespace Lorentz open TensorProduct Matrix MatrixGroups SL2C Invariants -open IsQuadLorentz (quotRep quotRep_mkQ) /-! @@ -141,52 +140,15 @@ lemma prod_lightConeSign_of_sum_lightConeWeight_eq_zero (c : Fin 3 → Fin 4) 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 +namespace TriLorentz 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) - -set_option linter.unusedVariables false in -/-- The span of the components; `hT` is unused, and is present only so it reads `hT.span`. -/ -def span (hT : IsTriLorentz B repLorentz T) : Submodule ℂ B := ⨆ d, ℂ ∙ T d - -/-- A vector lies in the span exactly when it is a combination `∑ d, c d • T d`. -/ -lemma mem_span_iff (x : B) : - x ∈ hT.span ↔ ∃ c : (Fin 3 → Fin 1 ⊕ Fin 3) → ℂ, x = ∑ d, c d • T d := by - rw [span, ← Submodule.span_range_eq_iSup, ← Fintype.range_linearCombination, - LinearMap.mem_range] - simp only [Fintype.linearCombination_apply, eq_comm] - -include hT in -/-- An invariant of the span is the contraction of an invariant coefficient tensor. -/ -theorem exists_isInvariantCoeff_of_mem_span {x : B} (hx : x ∈ hT.span) - (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : - ∃ c : (Fin 3 → Fin 1 ⊕ Fin 3) → ℂ, IsInvariantCoeff c ∧ x = ∑ d, c d • T d := - Invariants.exists_isInvariantCoeff_of_mem_span hT.repLorentz_T hx hinv /-! -## C. The classification of the Lorentz invariants +## B. The classification of the Lorentz invariants Writing a coefficient tensor in the light-cone basis of one axis leaves only the multi-indices of total weight zero, the others being killed by the boost. The half turn about that axis @@ -237,55 +199,32 @@ lemma eq_zero_of_isInvariantCoeff {c : (Fin 3 → Fin 1 ⊕ Fin 3) → ℂ} · rw [lightConeComponent_eq_zero_of_weight_zero hc 2 hκ, mul_zero] · rw [hc.lightConeComponent_eq_zero 2 hκ, mul_zero] -include hT in /-- Every Lorentz invariant in the span of the components is zero: three indices carry no invariant contraction. -/ -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, rfl⟩ := hT.exists_isInvariantCoeff_of_mem_span hx hinv +theorem eq_zero_of_invariant (hT : IsLorentzTensorFamily 3 B repLorentz T) {x : B} + (hx : x ∈ componentSpan T) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x = 0 := by + obtain ⟨c, hc, rfl⟩ := hT.exists_isInvariantCoeff_of_mem_componentSpan hx hinv simp [eq_zero_of_isInvariantCoeff hc] /-! -## D. The classification modulo a Lorentz-stable submodule +## C. The classification modulo a Lorentz-stable submodule A stable subspace `S` is divided out by passing to the quotient `B ⧸ S`, that is `B` with `S` declared zero: the classes of the components again form a triple Lorentz tensor, so -section E applies there and an invariant of `hT.span ⊔ S` lies in `S`. +section B applies there and an invariant of `componentSpan T ⊔ S` lies in `S`. -/ -include hT in -/-- The classes of the components in the quotient 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 -/-- A Lorentz invariant of `hT.span ⊔ S`, for a Lorentz-stable subspace `S`, 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' +/-- A Lorentz invariant of `componentSpan T ⊔ S`, for a Lorentz-stable subspace `S`, already + lies in `S`. -/ +lemma mem_of_invariant_of_mem_sup (hT : IsLorentzTensorFamily 3 B repLorentz T) {x : B} + (S : Submodule ℂ B) (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) + (hx : x ∈ componentSpan T ⊔ S) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by + have hzero := eq_zero_of_invariant (hT.quotient S hS) (mkQ_mem_componentSpan T S hx) + fun g => by rw [quotient_apply_mkQ, hinv g] rwa [← Submodule.ker_mkQ S, LinearMap.mem_ker] -end IsTriLorentz +end TriLorentz end Lorentz diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsVectorLeftRightWeyl.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsVectorLeftRightWeyl.lean index 8b415bedd..0f2470e14 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsVectorLeftRightWeyl.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsVectorLeftRightWeyl.lean @@ -27,7 +27,7 @@ representation, which is the four-vector representation, so the three indices ar four-vector indices, and two of those admit only the metric trace. The proof makes that literal. The covariant Pauli matrices intertwine the two index laws (A), so contracting the Weyl pair against them turns `T` into a bi-Lorentz tensor, invertibly by Fierz -completeness, leaving the span unchanged (C); `IsBiLorentz` then supplies the +completeness, leaving the span unchanged (C); `BiLorentz` then supplies the classification (D), its metric trace being the Pauli contraction of `T`. Section E gives the model family, whose Pauli contraction is `PauliMatrix.asTensor`. @@ -49,7 +49,7 @@ there is no Dirac mass term. namespace Lorentz open TensorProduct Matrix MatrixGroups SL2C -open IsQuadLorentz (sum_minkowskiMatrixZ_mul quotRep quotRep_mkQ) +open LorentzGroup (sum_minkowskiMatrixZ_mul) /-! @@ -193,8 +193,9 @@ noncomputable def vectorPair : (Fin 2 → Fin 1 ⊕ Fin 3) → B := include hT in /-- The Pauli contraction of the Weyl pair carries the two spinor indices into a second - four-vector index: the resulting family is a bi-Lorentz tensor. -/ -lemma isBiLorentz_vectorPair : IsBiLorentz B repLorentz (vectorPair (T := T)) where + four-vector index: the resulting family is a rank-two Lorentz tensor family. -/ +lemma isLorentzTensorFamily_vectorPair : + IsLorentzTensorFamily 2 B repLorentz (vectorPair (T := T)) where repLorentz_T g l := by have hstep : ∀ p : Fin 2 × Fin 2, pauliLower (l 1) p.1 p.2 • repLorentz g (T (l 0, p)) @@ -292,7 +293,8 @@ lemma mem_span_vectorPair (d : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2) : include hT in /-- The reduction does not change the span of the components. -/ -lemma iSup_span_vectorPair : (⨆ e, ℂ ∙ vectorPair (T := T) e) = hT.span := by +lemma componentSpan_vectorPair : componentSpan (vectorPair (T := T)) = hT.span := by + rw [componentSpan] refine le_antisymm (iSup_le fun e => ?_) (iSup_le fun d => ?_) · rw [Submodule.span_singleton_le_iff_mem] exact hT.vectorPair_mem_span e @@ -302,8 +304,8 @@ lemma iSup_span_vectorPair : (⨆ e, ℂ ∙ vectorPair (T := T) e) = hT.span := /-- The metric trace of the reduced family is exactly the Pauli contraction of `T`: the two lowerings of the vector index cancel, so no sign and no scalar appear. -/ lemma metricContraction_vectorPair : - IsBiLorentz.metricContraction (T := vectorPair (T := T)) = pauliContraction (T := T) := by - rw [IsBiLorentz.metricContraction, sum_pi_fin_two, pauliContraction] + BiLorentz.metricContraction (T := vectorPair (T := T)) = pauliContraction (T := T) := by + rw [BiLorentz.metricContraction, sum_pi_fin_two, pauliContraction] refine Finset.sum_congr rfl fun ν _ => ?_ rw [Finset.sum_eq_single ν (fun ρ _ hρ => ?_) (fun hν => absurd (Finset.mem_univ ν) hν)] · simp only [vectorPair, Matrix.cons_val_zero, Matrix.cons_val_one, Finset.smul_sum, @@ -321,7 +323,7 @@ lemma metricContraction_vectorPair : ## D. The classification of the Lorentz invariants -`IsBiLorentz` classifies the invariants of `vectorPair`, and its metric trace is the Pauli +`BiLorentz` classifies the invariants of `vectorPair`, and its metric trace is the Pauli contraction of `T`, so every invariant of the span is a multiple of `pauliContraction`. -/ @@ -331,7 +333,7 @@ include hT in `Λ η Λᵀ = η` read through the reduction of section C. -/ lemma repLorentz_pauliContraction (g : SL(2,ℂ)) : repLorentz g (pauliContraction (T := T)) = pauliContraction (T := T) := by - have hV := hT.isBiLorentz_vectorPair + have hV := hT.isLorentzTensorFamily_vectorPair have hstep : ∀ d : Fin 2 → Fin 1 ⊕ Fin 3, repLorentz g (((minkowskiMatrixZ (d 0) (d 1) : ℤ) : ℂ) • vectorPair (T := T) d) = ∑ a : Fin 2 → Fin 1 ⊕ Fin 3, @@ -341,7 +343,7 @@ lemma repLorentz_pauliContraction (g : SL(2,ℂ)) : intro d rw [map_smul, hV.repLorentz_T g d, Finset.smul_sum] exact Finset.sum_congr rfl fun a _ => smul_smul _ _ _ - rw [← metricContraction_vectorPair (T := T), IsBiLorentz.metricContraction, map_sum] + rw [← metricContraction_vectorPair (T := T), BiLorentz.metricContraction, map_sum] calc ∑ d : Fin 2 → Fin 1 ⊕ Fin 3, repLorentz g (((minkowskiMatrixZ (d 0) (d 1) : ℤ) : ℂ) • vectorPair (T := T) d) = ∑ a : Fin 2 → Fin 1 ⊕ Fin 3, (∑ d : Fin 2 → Fin 1 ⊕ Fin 3, @@ -365,11 +367,11 @@ include hT in theorem exists_smul_pauliContraction_of_invariant {x : B} (hx : x ∈ hT.span) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : ∃ a : ℂ, x = a • pauliContraction (T := T) := by - have hV := hT.isBiLorentz_vectorPair - have hx' : x ∈ hV.span := by - rw [IsBiLorentz.span, hT.iSup_span_vectorPair] + have hV := hT.isLorentzTensorFamily_vectorPair + have hx' : x ∈ componentSpan (vectorPair (T := T)) := by + rw [hT.componentSpan_vectorPair] exact hx - obtain ⟨a, ha⟩ := hV.exists_smul_metricContraction_of_invariant hx' hinv + obtain ⟨a, ha⟩ := BiLorentz.exists_smul_metricContraction_of_invariant hV hx' hinv exact ⟨a, by rwa [metricContraction_vectorPair] at ha⟩ include hT in @@ -379,12 +381,12 @@ lemma exists_smul_pauliContraction_of_invariant_subset {x : B} (S : Submodule (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 • pauliContraction (T := T) + y := by - have hV := hT.isBiLorentz_vectorPair - have hx' : x ∈ hV.span ⊔ S := by - rw [IsBiLorentz.span, hT.iSup_span_vectorPair] + have hV := hT.isLorentzTensorFamily_vectorPair + have hx' : x ∈ componentSpan (vectorPair (T := T)) ⊔ S := by + rw [hT.componentSpan_vectorPair] exact hx obtain ⟨a, y, hy, ha⟩ := - hV.exists_smul_metricContraction_of_invariant_subset S hS hx' hinv + BiLorentz.exists_smul_metricContraction_of_invariant_subset hV S hS hx' hinv exact ⟨a, y, hy, by rwa [metricContraction_vectorPair] at ha⟩ end IsVectorLeftRightWeyl diff --git a/Physlib/Relativity/LorentzGroup/Invariants/LightCone.lean b/Physlib/Relativity/LorentzGroup/Invariants/LightCone.lean new file mode 100644 index 000000000..9dda1d858 --- /dev/null +++ b/Physlib/Relativity/LorentzGroup/Invariants/LightCone.lean @@ -0,0 +1,261 @@ +/- +Copyright (c) 2026 Joseph Tooby-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.Basic +/-! +# The light-cone basis of a boost axis over the integers and the rationals + +`lightConeCoeff` and `lightConeCoeffInv` of `LightConeDeriv` change a spacetime index into the +light-cone basis of a spatial axis `i`: the two directions `D₀ - Dᵢ` and `D₀ + Dᵢ` of the plane +the boost along `i` moves, and the two transverse directions. Their entries are `0`, `±1` and +`±1/2`, so both matrices have integer or rational mirrors, and every classification in this +folder computes with a mirror rather than with `ℂ`: the kernel evaluates `ℤ` and `ℚ` and does +not evaluate `ℂ`. This file holds the mirrors and what is proved about them at an arbitrary +number of indices; the rank-specific files contract them against as many slots as they have. + +The change of basis one way is `lightConeCoeffZ`, an exact integer copy. The other way needs +the halves: `lightConeCoeffInvQ` keeps them, and `lightConeCoeffInvZ` clears them, so it is +twice the true inverse and a contraction over `n` slots carries a factor `2 ^ n` that the +rank-specific file divides out. That is the only normalization in play, and +`coe_lightConeCoeffInvZ_eq_two_mul` and `coe_lightConeCoeffInvZ` record it against `ℂ` and `ℚ`. + +Three groupings of the four light-cone directions are used. `InBoostPlane` separates the two +directions of weight `±2` from the two transverse ones, one index at a time. `sectorIndex` +sorts the four into the three sectors of distinct boost weight, raising, lowering and +transverse, `sectorWeight` records those weights, and `slotTransition` and `slotTransitionZ` +sum one slot of the change of basis over a sector. `slotZ` keeps the four directions apart +instead, and `transitionZ` composes it over `n` slots into `2 ^ n` times the map keeping the +light-cone components of total weight `m`; `transitionZ_eq_sum` unfolds that recursion into a +single sum over the multi-indices of that weight. +-/ + +@[expose] public section + +namespace Lorentz + +open Matrix MatrixGroups SL2C + +namespace Invariants + +/-! + +## A. The change of basis over the integers and the rationals + +-/ + +/-- The four light-cone directions of axis `i`, as integers. -/ +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 copy casts to `lightConeCoeff`. -/ +lemma coe_lightConeCoeffZ (i : Fin 3) (κ : Fin 4) (μ : Fin 1 ⊕ Fin 3) : + ((lightConeCoeffZ i κ μ : ℤ) : ℂ) = lightConeCoeff i κ μ := by + rw [lightConeCoeffZ, lightConeCoeff] + split_ifs <;> norm_num + +/-- Twice the coordinate directions in the light-cone basis, the `2` clearing the halves. -/ +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 copy is exactly twice `lightConeCoeffInv`. -/ +lemma coe_lightConeCoeffInvZ_eq_two_mul (i : Fin 3) (μ : Fin 1 ⊕ Fin 3) (κ : Fin 4) : + ((lightConeCoeffInvZ i μ κ : ℤ) : ℂ) = 2 * lightConeCoeffInv i μ κ := by + rw [lightConeCoeffInvZ, lightConeCoeffInv] + split_ifs <;> norm_num + +/-- The inverse light-cone coefficients over `ℚ`, with the halves kept as halves. -/ +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 + +/-- The integer mirror is twice the rational one. -/ +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 + +/-! + +## B. The boost plane + +The boost along axis `i` moves time and the axis and fixes the two transverse directions, so +the light-cone directions of weight `±2` are supported in the first pair and the two of weight +`0` in the second. Either half of that statement kills half of `lightConeCoeffInvZ`. + +-/ + +/-- The boost plane of axis `i`: time and the axis, the two directions the boost moves. -/ +def InBoostPlane (i : Fin 3) (μ : Fin 1 ⊕ Fin 3) : Prop := μ = Sum.inl 0 ∨ μ = Sum.inr i + +instance (i : Fin 3) (μ : Fin 1 ⊕ Fin 3) : Decidable (InBoostPlane i μ) := + inferInstanceAs (Decidable (_ ∨ _)) + +/-- A direction in the boost plane has no transverse light-cone components. -/ +lemma lightConeCoeffInvZ_eq_zero_of_inBoostPlane {i : Fin 3} {μ : Fin 1 ⊕ Fin 3} + (hμ : InBoostPlane i μ) {κ : Fin 4} (hκ : κ = 2 ∨ κ = 3) : + lightConeCoeffInvZ i μ κ = 0 := by + rcases hμ with rfl | rfl <;> rcases hκ with rfl | rfl <;> simp [lightConeCoeffInvZ] + +/-- A transverse direction has no light-cone components in the boost plane. -/ +lemma lightConeCoeffInvZ_eq_zero_of_not_inBoostPlane {i : Fin 3} {μ : Fin 1 ⊕ Fin 3} + (hμ : ¬InBoostPlane i μ) {κ : Fin 4} (hκ : κ = 0 ∨ κ = 1) : + lightConeCoeffInvZ i μ κ = 0 := by + simp only [InBoostPlane, not_or] at hμ + rcases hκ with rfl | rfl <;> simp [lightConeCoeffInvZ, hμ.1, hμ.2] + +/-! + +## C. The three sectors of the light-cone directions + +The four light-cone directions carry only three distinct boost weights, `2`, `-2` and `0` twice, +and a sum over multi-indices of a given total weight only sees that much: `sectorIndex` sorts +the directions accordingly, and summing one slot of the change of basis over a sector gives +`slotTransition` over `ℚ` and `slotTransitionZ` over `ℤ`, again twice as large. + +-/ + +/-- The sector of each light-cone direction: `0` raising, `1` lowering, `2` and `3` transverse. -/ +def sectorIndex : Fin 4 → Fin 3 := ![0, 1, 2, 2] + +/-- The boost weight of each sector: `2` raising, `-2` lowering, `0` transverse. -/ +def sectorWeight : Fin 3 → ℤ := ![2, -2, 0] + +/-- The light-cone weight of a direction is the weight of its sector. -/ +lemma lightConeWeight_eq_sectorWeight (κ : Fin 4) : + lightConeWeight κ = sectorWeight (sectorIndex κ) := by + fin_cases κ <;> rfl + +/-- The slot factor summed over the directions of one sector, over `ℚ`. -/ +def slotTransition (i : Fin 3) (κ : Fin 3) (μ ν : Fin 1 ⊕ Fin 3) : ℚ := + ∑ κ' ∈ Finset.univ.filter (fun κ' : Fin 4 => sectorIndex κ' = κ), + lightConeCoeffInvQ i μ κ' * (lightConeCoeffZ i κ' ν : ℚ) + +/-- The slot factor summed over one sector, in closed form over `ℤ`: on the boost plane the + raising sector carries `[[1, -1], [-1, 1]]` and the lowering sector the all-ones matrix, and + the transverse sector is twice the identity on the transverse directions. -/ +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 is the sector sum of the slot factors. -/ +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 + rw [Finset.sum_filter, Fin.sum_univ_four] + rcases μ with a | j <;> rcases ν with b | l + · simp only [Fin.fin_one_eq_zero a, Fin.fin_one_eq_zero b] + fin_cases κ <;> simp [slotTransitionZ, lightConeCoeffInvZ, lightConeCoeffZ, sectorIndex] + · simp only [Fin.fin_one_eq_zero a] + fin_cases κ <;> fin_cases i <;> fin_cases l <;> + simp [slotTransitionZ, lightConeCoeffInvZ, lightConeCoeffZ, sectorIndex] + · simp only [Fin.fin_one_eq_zero b] + fin_cases κ <;> fin_cases i <;> fin_cases j <;> + simp [slotTransitionZ, lightConeCoeffInvZ, lightConeCoeffZ, sectorIndex] + · fin_cases κ <;> fin_cases i <;> fin_cases j <;> fin_cases l <;> + simp [slotTransitionZ, lightConeCoeffInvZ, lightConeCoeffZ, sectorIndex] + +/-- The integer sector matrix is twice the rational one, which is what the two names promise. -/ +lemma coe_slotTransitionZ (i : Fin 3) (κ : Fin 3) (μ ν : Fin 1 ⊕ Fin 3) : + ((slotTransitionZ i κ μ ν : ℤ) : ℚ) = 2 * slotTransition i κ μ ν := by + rw [slotTransitionZ_eq_sum, slotTransition, Finset.mul_sum] + push_cast + exact Finset.sum_congr rfl fun κ' _ => by rw [coe_lightConeCoeffInvZ]; ring + +/-! + +## D. The weight-keeping transition over any number of slots + +Keeping the four directions apart instead of their three sectors, one slot of the change of +basis is `slotZ`, and composing it over `n` slots while tracking the weight left to distribute +gives `transitionZ`. The recursion follows B: a slot whose direction lies in the boost plane +takes weight `2` or `-2` and leaves `m - 2` or `m + 2`, and a transverse slot takes either +direction of weight `0`, which is why those two are added, and leaves `m`. + +-/ + +/-- One slot's factor: twice the coefficient of `κ` in `μ`, times that of `ν` in `κ`. -/ +def slotZ (i : Fin 3) (κ : Fin 4) (μ ν : Fin 1 ⊕ Fin 3) : ℤ := + lightConeCoeffInvZ i μ κ * lightConeCoeffZ i κ ν + +/-- Two to the number of slots times the entry, at `d` and `e`, of the map keeping the light-cone + components of total weight `m` along axis `i`; the factor is the one `lightConeCoeffInvZ` + carries, one per slot. A slot of `d` in the boost plane takes weight `2` or `-2`, leaving + `m - 2` or `m + 2`; a transverse slot takes weight `0` and leaves `m`. -/ +def transitionZ (i : Fin 3) : {n : ℕ} → (d e : Fin n → Fin 1 ⊕ Fin 3) → ℤ → ℤ + | 0, _, _, m => if m = 0 then 1 else 0 + | _ + 1, d, e, m => + if InBoostPlane i (d 0) then + slotZ i 0 (d 0) (e 0) * transitionZ i (Fin.tail d) (Fin.tail e) (m - 2) + + slotZ i 1 (d 0) (e 0) * transitionZ i (Fin.tail d) (Fin.tail e) (m + 2) + else (slotZ i 2 (d 0) (e 0) + slotZ i 3 (d 0) (e 0)) + * transitionZ i (Fin.tail d) (Fin.tail e) m + +/-- The recursion unfolded, as a sum over the multi-indices of total weight `m`. -/ +lemma transitionZ_eq_sum (i : Fin 3) : + ∀ {n : ℕ} (d e : Fin n → Fin 1 ⊕ Fin 3) (m : ℤ), + transitionZ i d e m + = ∑ κ ∈ Finset.univ.filter + (fun κ : Fin n → Fin 4 => (∑ s, lightConeWeight (κ s)) = m), + ∏ s, slotZ i (κ s) (d s) (e s) + | 0, d, e, m => by + rw [Finset.sum_filter, Fintype.sum_unique] + simp [transitionZ, eq_comm] + | n + 1, d, e, m => by + have hpeel : ∀ κ : Fin 4, + (∑ κ' : Fin n → Fin 4, if lightConeWeight κ + ∑ s, lightConeWeight (κ' s) = m then + slotZ i κ (d 0) (e 0) * ∏ s, slotZ i (κ' s) (d s.succ) (e s.succ) else 0) + = slotZ i κ (d 0) (e 0) + * transitionZ i (Fin.tail d) (Fin.tail e) (m - lightConeWeight κ) := by + intro κ + rw [transitionZ_eq_sum i (Fin.tail d) (Fin.tail e), Finset.sum_filter, Finset.mul_sum] + exact Finset.sum_congr rfl fun κ' _ => by + rw [mul_ite, mul_zero] + exact if_congr (by omega) rfl rfl + calc transitionZ i d e m + = ∑ κ : Fin 4, slotZ i κ (d 0) (e 0) + * transitionZ i (Fin.tail d) (Fin.tail e) (m - lightConeWeight κ) := by + rw [Fin.sum_univ_four, transitionZ] + simp only [show lightConeWeight 0 = 2 from rfl, show lightConeWeight 1 = -2 from rfl, + show lightConeWeight 2 = 0 from rfl, show lightConeWeight 3 = 0 from rfl, + sub_neg_eq_add, sub_zero] + by_cases h : InBoostPlane i (d 0) + · rw [if_pos h] + simp [slotZ, lightConeCoeffInvZ_eq_zero_of_inBoostPlane h] + · rw [if_neg h] + simp [slotZ, lightConeCoeffInvZ_eq_zero_of_not_inBoostPlane h] + ring + _ = _ := by + rw [Finset.sum_filter, + ← Equiv.sum_comp (Fin.consEquiv fun _ : Fin (n + 1) => Fin 4), Fintype.sum_prod_type] + refine Finset.sum_congr rfl fun κ _ => ?_ + rw [← hpeel κ] + refine Finset.sum_congr rfl fun κ' _ => ?_ + simp only [Fin.consEquiv_apply, Fin.sum_univ_succ, Fin.prod_univ_succ, Fin.cons_zero, + Fin.cons_succ] + + +end Invariants + +end Lorentz diff --git a/Physlib/Relativity/LorentzGroup/Invariants/TensorFamily.lean b/Physlib/Relativity/LorentzGroup/Invariants/TensorFamily.lean new file mode 100644 index 000000000..bbfbfee1f --- /dev/null +++ b/Physlib/Relativity/LorentzGroup/Invariants/TensorFamily.lean @@ -0,0 +1,179 @@ +/- +Copyright (c) 2026 Joseph Tooby-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.Basic +/-! +# Families of components carrying four-vector indices + +A family `T` of vectors of a complex module `B`, indexed by `n` spacetime directions and moved +by a representation of `SL(2,ℂ)` with one factor of the Lorentz matrix per index, is what the +rank-specific files of this folder classify the invariants of. This file holds the predicate +saying so, at an arbitrary number of indices, together with the part of its interface that does +not depend on that number. + +The transformation law is + +`repLorentz g (T l) = ∑_a (∏ i, Λ(g)_{a i, l i}) • T a`, + +with `l` free and `a` summed, and the summed index first in each factor of the Lorentz matrix +`Λ(g)` of `g`. That is how the basis vectors of a tensor power of the vector representation +move, and `Invariants.act` is the matching action on coefficients. + +Nothing here assumes the components independent or `B` finite dimensional: the span of the +components is taken as it is, and a vector of it is written as a combination in a way that need +not be unique. The rank-zero case is admitted and says that every component is invariant. +-/ + +@[expose] public section + +namespace Lorentz + +open Matrix MatrixGroups SL2C Invariants + +/-! + +## A. The span of a family of components + +The span exists for any family, with no transformation law in sight, so it is defined on the +family alone. `mem_componentSpan_iff` is the only thing ever asked of it: its elements are the +combinations of the components. + +-/ + +section Span + +variable {ι B : Type*} [AddCommMonoid B] [Module ℂ B] + +/-- The span of the components of a family `T`. -/ +def componentSpan (T : ι → B) : Submodule ℂ B := ⨆ i, ℂ ∙ T i + +variable [Fintype ι] + +/-- A vector lies in the component span exactly when it is a combination `∑ i, c i • T i`. -/ +lemma mem_componentSpan_iff (T : ι → B) (x : B) : + x ∈ componentSpan T ↔ ∃ c : ι → ℂ, x = ∑ i, c i • T i := by + classical + rw [componentSpan, ← Submodule.span_range_eq_iSup, ← Fintype.range_linearCombination, + LinearMap.mem_range] + simp only [Fintype.linearCombination_apply, eq_comm] + +/-- Every combination of the components lies in their span. -/ +lemma sum_smul_mem_componentSpan (T : ι → B) (c : ι → ℂ) : ∑ i, c i • T i ∈ componentSpan T := + (mem_componentSpan_iff T _).2 ⟨c, rfl⟩ + +end Span + +section SpanQuotient + +variable {ι B : Type*} [Fintype ι] [AddCommGroup B] [Module ℂ B] + +/-- Taking classes modulo a submodule `S` carries `componentSpan T ⊔ S` into the span of the + classes of the components. -/ +lemma mkQ_mem_componentSpan (T : ι → B) (S : Submodule ℂ B) {x : B} + (hx : x ∈ componentSpan T ⊔ S) : S.mkQ x ∈ componentSpan fun i => S.mkQ (T i) := by + obtain ⟨u, hu, z, hz, rfl⟩ := Submodule.mem_sup.1 hx + obtain ⟨c, rfl⟩ := (mem_componentSpan_iff T u).1 hu + refine (mem_componentSpan_iff _ _).2 ⟨c, ?_⟩ + rw [map_add, show S.mkQ z = 0 from (Submodule.Quotient.mk_eq_zero S).2 hz, add_zero, map_sum] + exact Finset.sum_congr rfl fun i _ => map_smul _ _ _ + +end SpanQuotient + +/-! + +## B. Families transforming with one Lorentz matrix per index + +-/ + +/-- A family `T` of vectors of `B`, one per index vector `l : Fin n → Fin 1 ⊕ Fin 3`, which + `repLorentz` moves the way the components of a rank-`n` tensor `T^{μ₁ ⋯ μₙ}` transform: one + factor of the Lorentz matrix per slot, the moved index second in each factor and the summed + one first. -/ +structure IsLorentzTensorFamily (n : ℕ) (B : Type*) [AddCommMonoid B] [Module ℂ B] + (repLorentz : Representation ℂ SL(2,ℂ) B) + (T : (Fin n → (Fin 1 ⊕ Fin 3)) → B) : Prop where + repLorentz_T : ∀ (g : SL(2,ℂ)) l, + repLorentz g (T l) = ∑ (a : Fin n → Fin 1 ⊕ Fin 3), + (∏ (i : Fin n), (((SL2C.toLorentzGroup g).1 (a i) (l i) : ℝ) : ℂ)) • T a + +namespace IsLorentzTensorFamily + +section Monoid + +variable {n : ℕ} {B : Type*} [AddCommMonoid B] [Module ℂ B] + {repLorentz : Representation ℂ SL(2,ℂ) B} + {T : (Fin n → (Fin 1 ⊕ Fin 3)) → B} + +/-- The image of the family under a linear map intertwining the two representations is again + such a family. The map is not assumed injective or surjective. -/ +lemma map {B' : Type*} [AddCommMonoid B'] [Module ℂ B'] {rep' : Representation ℂ SL(2,ℂ) B'} + (hT : IsLorentzTensorFamily n B repLorentz T) (f : B →ₗ[ℂ] B') + (hf : ∀ (g : SL(2,ℂ)) (y : B), f (repLorentz g y) = rep' g (f y)) : + IsLorentzTensorFamily n B' rep' fun l => f (T l) where + repLorentz_T g l := by + rw [← hf, hT.repLorentz_T g l, map_sum] + exact Finset.sum_congr rfl fun a _ => map_smul _ _ _ + +/-- The span of the components is Lorentz stable: each component goes to a combination of the + components. -/ +lemma repLorentz_mem_componentSpan (hT : IsLorentzTensorFamily n B repLorentz T) (g : SL(2,ℂ)) + {x : B} (hx : x ∈ componentSpan T) : repLorentz g x ∈ componentSpan T := by + obtain ⟨c, rfl⟩ := (mem_componentSpan_iff T x).1 hx + exact (mem_componentSpan_iff T _).2 ⟨_, repLorentz_sum_smul hT.repLorentz_T g c⟩ + +end Monoid + +section Group + +variable {n : ℕ} {B : Type*} [AddCommGroup B] [Module ℂ B] + {repLorentz : Representation ℂ SL(2,ℂ) B} + {T : (Fin n → (Fin 1 ⊕ Fin 3)) → B} + +/-- The classes of the components in the quotient by a Lorentz-stable submodule again form a + Lorentz tensor family of the same rank, for Mathlib's quotient representation. -/ +lemma quotient (hT : IsLorentzTensorFamily n B repLorentz T) (S : Submodule ℂ B) + (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) : + IsLorentzTensorFamily n (B ⧸ S) (repLorentz.quotient S fun g y hy => hS g y hy) + fun l => S.mkQ (T l) := + hT.map S.mkQ fun _ _ => rfl + +/-- A Lorentz invariant lying in the span of the components is the contraction of a coefficient + tensor that the Lorentz matrices themselves fix. -/ +theorem exists_isInvariantCoeff_of_mem_componentSpan + (hT : IsLorentzTensorFamily n B repLorentz T) {x : B} (hx : x ∈ componentSpan T) + (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : + ∃ c : (Fin n → Fin 1 ⊕ Fin 3) → ℂ, IsInvariantCoeff c ∧ x = ∑ d, c d • T d := + Invariants.exists_isInvariantCoeff_of_mem_span hT.repLorentz_T hx hinv + +/-- Contracting the components with an invariant coefficient tensor gives a Lorentz + invariant. -/ +lemma isInvariant_sum_smul (hT : IsLorentzTensorFamily n B repLorentz T) + {c : (Fin n → Fin 1 ⊕ Fin 3) → ℂ} (hc : IsInvariantCoeff c) (g : SL(2,ℂ)) : + repLorentz g (∑ d, c d • T d) = ∑ d, c d • T d := + repLorentz_sum_smul_of_isInvariantCoeff hT.repLorentz_T hc g + +end Group + +end IsLorentzTensorFamily + +/-! + +## C. The quotient representation on classes + +Dividing out a Lorentz-stable submodule `S` uses Mathlib's `Representation.quotient`. The +stability hypothesis is kept in the membership form the rest of the library uses, and converted +where Mathlib asks for the `comap` form. + +-/ + +/-- The quotient representation on `B ⧸ S` moves the class of `y` by moving `y`. -/ +lemma quotient_apply_mkQ {B : Type*} [AddCommGroup B] [Module ℂ B] + (repLorentz : Representation ℂ SL(2,ℂ) B) (S : Submodule ℂ B) + (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) (g : SL(2,ℂ)) (y : B) : + repLorentz.quotient S (fun g y hy => hS g y hy) g (S.mkQ y) = S.mkQ (repLorentz g y) := rfl + +end Lorentz From f5639c572ab608bb3c2ebd8e284b00d9614c0c36 Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Sat, 19 Sep 2026 21:58:40 +0400 Subject: [PATCH 332/367] refactor: more clean up for lorentz invariance, change file names and rearrange results --- Physlib.lean | 10 +- Physlib/Mathematics/Fin.lean | 19 +++ .../MassWeight/MassDimEight.lean | 68 +++++------ .../MassWeight/MassDimLTEight.lean | 24 ++-- .../GaugeHiggsSector/MassWeight.lean | 54 ++++----- .../YukawaSector/MassDimLTEight.lean | 2 +- .../MassWeight/MassDimEight.lean | 100 ++++++++-------- .../MassWeight/MassDimLTEight.lean | 48 ++++---- .../LorentzGroup/Invariants/Basic.lean | 30 +++-- .../Invariants/IsLeftRightWeyl.lean | 2 +- .../Invariants/IsVectorLeftRightWeyl.lean | 27 ++--- .../LorentzGroup/Invariants/LightCone.lean | 73 ++++++------ ...nsorFamily.lean => LorentzCovariance.lean} | 26 ++-- .../{IsQuadLorentz.lean => RankFour.lean} | 112 +++++++++--------- .../{IsSingleLorentz.lean => RankOne.lean} | 12 +- .../{IsTriLorentz.lean => RankThree.lean} | 24 ++-- .../{IsBiLorentz.lean => RankTwo.lean} | 49 ++++---- 17 files changed, 358 insertions(+), 322 deletions(-) rename Physlib/Relativity/LorentzGroup/Invariants/{TensorFamily.lean => LorentzCovariance.lean} (88%) rename Physlib/Relativity/LorentzGroup/Invariants/{IsQuadLorentz.lean => RankFour.lean} (92%) rename Physlib/Relativity/LorentzGroup/Invariants/{IsSingleLorentz.lean => RankOne.lean} (94%) rename Physlib/Relativity/LorentzGroup/Invariants/{IsTriLorentz.lean => RankThree.lean} (93%) rename Physlib/Relativity/LorentzGroup/Invariants/{IsBiLorentz.lean => RankTwo.lean} (93%) diff --git a/Physlib.lean b/Physlib.lean index d507552e2..06f241d65 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -627,14 +627,14 @@ public import Physlib.Relativity.LorentzGroup.Boosts.WeightGrading public import Physlib.Relativity.LorentzGroup.FermionicParity public import Physlib.Relativity.LorentzGroup.Invariants.Basic 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.Invariants.IsTriLorentz public import Physlib.Relativity.LorentzGroup.Invariants.IsVectorLeftRightWeyl public import Physlib.Relativity.LorentzGroup.Invariants.LightCone -public import Physlib.Relativity.LorentzGroup.Invariants.TensorFamily +public import Physlib.Relativity.LorentzGroup.Invariants.LorentzCovariance +public import Physlib.Relativity.LorentzGroup.Invariants.RankFour +public import Physlib.Relativity.LorentzGroup.Invariants.RankOne +public import Physlib.Relativity.LorentzGroup.Invariants.RankThree +public import Physlib.Relativity.LorentzGroup.Invariants.RankTwo public import Physlib.Relativity.LorentzGroup.Orthochronous.Basic public import Physlib.Relativity.LorentzGroup.Proper public import Physlib.Relativity.LorentzGroup.Restricted.Basic diff --git a/Physlib/Mathematics/Fin.lean b/Physlib/Mathematics/Fin.lean index 90579221b..d85e8a235 100644 --- a/Physlib/Mathematics/Fin.lean +++ b/Physlib/Mathematics/Fin.lean @@ -296,4 +296,23 @@ lemma sum_pi_succ_prod_smul {R M ι : Type*} [CommSemiring R] [AddCommMonoid M] rw [Fin.prod_univ_succ] simp only [Fin.cons_zero, Fin.cons_succ] +/-- Peeling the first slot off a sum over the tuples of a prescribed total weight: the first + slot takes its own weight `w b` and the remaining slots make up the rest. Each slot draws its + letter from the same alphabet `ι`, `w` gives a letter its weight and the weights of the slots + add; `f s` is the factor contributed by slot `s`. -/ +lemma sum_filter_weight_succ {R ι : Type*} [CommSemiring R] [Fintype ι] {n : ℕ} (w : ι → ℤ) + (f : Fin (n + 1) → ι → R) (m : ℤ) : + ∑ q ∈ Finset.univ.filter (fun q : Fin (n + 1) → ι => (∑ s, w (q s)) = m), ∏ s, f s (q s) + = ∑ b : ι, f 0 b + * ∑ q ∈ Finset.univ.filter (fun q : Fin n → ι => (∑ s, w (q s)) = m - w b), + ∏ s, f s.succ (q s) := by + rw [Finset.sum_filter, ← Equiv.sum_comp (Fin.consEquiv fun _ : Fin (n + 1) => ι), + Fintype.sum_prod_type] + refine Finset.sum_congr rfl fun b _ => ?_ + rw [Finset.sum_filter, Finset.mul_sum] + refine Finset.sum_congr rfl fun q _ => ?_ + simp only [Fin.consEquiv_apply, Fin.sum_univ_succ, Fin.prod_univ_succ, Fin.cons_zero, + Fin.cons_succ, mul_ite, mul_zero] + exact if_congr (by omega) rfl rfl + end Physlib.Fin diff --git a/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/MassWeight/MassDimEight.lean b/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/MassWeight/MassDimEight.lean index 92c9226b7..299727f49 100644 --- a/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/MassWeight/MassDimEight.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/MassWeight/MassDimEight.lean @@ -6,7 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.AlgebraRealization.HiggsAlgebraCovRealization.MassWeight.MassDimLTEight -public import Physlib.Relativity.LorentzGroup.Invariants.IsBiLorentz +public import Physlib.Relativity.LorentzGroup.Invariants.RankTwo /-! # The Higgs invariants of mass weight eight @@ -17,7 +17,7 @@ underived contraction. The Lorentz classification then contracts the derivative The Higgs is a Lorentz scalar, so the only covector indices at this weight are the two derivative slots, and two covector indices admit exactly one invariant contraction, the -metric trace, which is `BiLorentz`. Contracting the mixed family gives the kinetic term +metric trace, which is `RankTwo`. Contracting the mixed family gives the kinetic term `∂^μ H† ∂_μ H`; contracting the two families carrying both derivatives on one tower gives `□H† H` and `H† □H`. The square of the underived contraction has no index to contract and survives as it stands: it is the quartic potential `(H† H)²`. @@ -105,8 +105,8 @@ Lorentz group moving each slot by the Lorentz matrix of the `SL(2,ℂ)` element. include h in /-- Both derivatives on the Higgs tower: a bi-Lorentz tensor in the two derivative slots. -/ -lemma isBiLorentz_dotGaugeHiggs_left : - IsLorentzTensorFamily 2 B repLorentz +lemma isLorentzCovariant_rankTwo_dotGaugeHiggs_left : + IsLorentzCovariant 2 B repLorentz (fun d : Fin 2 → Fin 1 ⊕ Fin 3 => h.dotGaugeHiggs d ![]) where repLorentz_T g l := by rw [h.repLorentz_dotGaugeHiggs g l (![] : Fin 0 → Fin 1 ⊕ Fin 3)] @@ -115,8 +115,8 @@ lemma isBiLorentz_dotGaugeHiggs_left : include h in /-- Both derivatives on the conjugate tower: a bi-Lorentz tensor in the same way. -/ -lemma isBiLorentz_dotGaugeHiggs_right : - IsLorentzTensorFamily 2 B repLorentz +lemma isLorentzCovariant_rankTwo_dotGaugeHiggs_right : + IsLorentzCovariant 2 B repLorentz (fun d : Fin 2 → Fin 1 ⊕ Fin 3 => h.dotGaugeHiggs ![] d) where repLorentz_T g l := by rw [h.repLorentz_dotGaugeHiggs g (![] : Fin 0 → Fin 1 ⊕ Fin 3) l, sum_cov_zero] @@ -126,8 +126,8 @@ lemma isBiLorentz_dotGaugeHiggs_right : include h in /-- One derivative on each tower: the family whose metric contraction is the kinetic term. -/ -lemma isBiLorentz_dotGaugeHiggs_mixed : - IsLorentzTensorFamily 2 B repLorentz +lemma isLorentzCovariant_rankTwo_dotGaugeHiggs_mixed : + IsLorentzCovariant 2 B repLorentz (fun d : Fin 2 → Fin 1 ⊕ Fin 3 => h.dotGaugeHiggs ![d 0] ![d 1]) where repLorentz_T g l := by rw [h.repLorentz_dotGaugeHiggs g ![l 0] ![l 1], sum_cov_one, sum_cov_two] @@ -179,10 +179,10 @@ here are isospin contractions, which the gauge group fixes. /-- The metric trace of a bi-Lorentz family is a Lorentz invariant. -/ lemma repLorentz_metricContraction {T : (Fin 2 → Fin 1 ⊕ Fin 3) → B} - (hT : IsLorentzTensorFamily 2 B repLorentz T) (g : SL(2,ℂ)) : - repLorentz g (BiLorentz.metricContraction (T := T)) - = BiLorentz.metricContraction (T := T) := by - rw [BiLorentz.metricContraction, map_sum] + (hT : IsLorentzCovariant 2 B repLorentz T) (g : SL(2,ℂ)) : + repLorentz g (RankTwo.metricContraction (T := T)) + = RankTwo.metricContraction (T := T) := by + rw [RankTwo.metricContraction, map_sum] have step : ∀ d : Fin 2 → Fin 1 ⊕ Fin 3, repLorentz g (((minkowskiMatrixZ (d 0) (d 1) : ℤ) : ℂ) • T d) = ∑ a : Fin 2 → Fin 1 ⊕ Fin 3, @@ -203,16 +203,16 @@ lemma repLorentz_metricContraction {T : (Fin 2 → Fin 1 ⊕ Fin 3) → B} lemma rep_metricContraction {T : (Fin 2 → Fin 1 ⊕ Fin 3) → B} (hTG : ∀ (g : GaugeGroupI) (d : Fin 2 → Fin 1 ⊕ Fin 3), rep g (T d) = T d) (g : GaugeGroupI) : - rep g (BiLorentz.metricContraction (T := T)) - = BiLorentz.metricContraction (T := T) := by - rw [BiLorentz.metricContraction, map_sum] + rep g (RankTwo.metricContraction (T := T)) + = RankTwo.metricContraction (T := T) := by + rw [RankTwo.metricContraction, map_sum] exact Finset.sum_congr rfl fun d _ => by rw [map_smul, hTG g d] /-! ## D. Peeling a bi-Lorentz span off a stable submodule -`BiLorentz.exists_smul_metricContraction_of_invariant_subset` removes one family at a +`RankTwo.exists_smul_metricContraction_of_invariant_subset` removes one family at a time from a join, leaving a multiple of the metric trace and a remainder in the stable submodule. Section C makes that multiple fixed by both groups, so the remainder inherits both invariances from the element peeled and the peeling can be iterated. A submodule of @@ -224,17 +224,17 @@ same bookkeeping. /-- Peeling one bi-Lorentz span off a Lorentz-stable submodule: an element of the span together with `S` fixed by both groups is a multiple of the metric trace plus a remainder in `S` fixed by both groups. -/ -lemma exists_mem_of_invariant_isBiLorentz_span_sup {T : (Fin 2 → Fin 1 ⊕ Fin 3) → B} - (hT : IsLorentzTensorFamily 2 B repLorentz T) +lemma exists_mem_of_invariant_rankTwo_span_sup {T : (Fin 2 → Fin 1 ⊕ Fin 3) → B} + (hT : IsLorentzCovariant 2 B repLorentz T) (hTG : ∀ (g : GaugeGroupI) (d : Fin 2 → Fin 1 ⊕ Fin 3), rep g (T d) = T d) (S : Submodule ℂ B) (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) {x : B} (hx : x ∈ componentSpan T ⊔ S) (hL : ∀ g : SL(2,ℂ), repLorentz g x = x) (hG : ∀ g : GaugeGroupI, rep g x = x) : ∃ y ∈ S, (∀ g : SL(2,ℂ), repLorentz g y = y) ∧ (∀ g : GaugeGroupI, rep g y = y) - ∧ x - y ∈ ℂ ∙ BiLorentz.metricContraction (T := T) := by + ∧ x - y ∈ ℂ ∙ RankTwo.metricContraction (T := T) := by obtain ⟨a, y, hyS, hxy⟩ := - BiLorentz.exists_smul_metricContraction_of_invariant_subset hT S hS hx hL - have hmem : x - y ∈ ℂ ∙ BiLorentz.metricContraction (T := T) := by + RankTwo.exists_smul_metricContraction_of_invariant_subset hT S hS hx hL + have hmem : x - y ∈ ℂ ∙ RankTwo.metricContraction (T := T) := by rw [hxy, add_sub_cancel_right] exact Submodule.smul_mem _ _ (Submodule.mem_span_singleton_self _) refine ⟨y, hyS, fun g => ?_, fun g => ?_, hmem⟩ @@ -283,11 +283,11 @@ the kinetic term and the quartic potential. noncomputable def lorentzContractionEightSpan (h : HiggsAlgebraCovRealization B rep repLorentz massWeightPoly) : Submodule ℂ B := - ℂ ∙ BiLorentz.metricContraction + ℂ ∙ RankTwo.metricContraction (T := fun d : Fin 2 → Fin 1 ⊕ Fin 3 => h.dotGaugeHiggs d ![]) - ⊔ (ℂ ∙ BiLorentz.metricContraction + ⊔ (ℂ ∙ RankTwo.metricContraction (T := fun d : Fin 2 → Fin 1 ⊕ Fin 3 => h.dotGaugeHiggs ![] d) - ⊔ (ℂ ∙ BiLorentz.metricContraction + ⊔ (ℂ ∙ RankTwo.metricContraction (T := fun d : Fin 2 → Fin 1 ⊕ Fin 3 => h.dotGaugeHiggs ![d 0] ![d 1]) ⊔ ℂ ∙ (h.dotGaugeHiggs ![] ![] * h.dotGaugeHiggs ![] ![]))) @@ -335,11 +335,11 @@ theorem exists_mem_of_gauge_and_lorentz_invariant (S : Submodule ℂ B) have hS₂L : ∀ g : SL(2,ℂ), ∀ y ∈ S₂, repLorentz g y ∈ S₂ := by refine stable_sup_lorentz (fun g y hy => ?_) hS₃L rw [h.dotSpan_one_one_eq] at hy ⊢ - exact h.isBiLorentz_dotGaugeHiggs_mixed.repLorentz_mem_componentSpan g hy + exact h.isLorentzCovariant_rankTwo_dotGaugeHiggs_mixed.repLorentz_mem_componentSpan g hy have hS₁L : ∀ g : SL(2,ℂ), ∀ y ∈ S₁, repLorentz g y ∈ S₁ := by refine stable_sup_lorentz (fun g y hy => ?_) hS₂L rw [h.dotSpan_zero_two_eq] at hy ⊢ - exact h.isBiLorentz_dotGaugeHiggs_right.repLorentz_mem_componentSpan g hy + exact h.isLorentzCovariant_rankTwo_dotGaugeHiggs_right.repLorentz_mem_componentSpan g hy have hx₁ : x ∈ componentSpan (fun d : Fin 2 → Fin 1 ⊕ Fin 3 => h.dotGaugeHiggs d ![]) ⊔ S₁ := by rw [← h.dotSpan_two_zero_eq, hS₁def, hS₂def, hS₃def] have hstep : x ∈ (h.dotSpan 2 0 ⊔ h.dotSpan 0 2 ⊔ h.dotSpan 1 1 ⊔ Q) ⊔ S := by @@ -354,15 +354,15 @@ theorem exists_mem_of_gauge_and_lorentz_invariant (S : Submodule ℂ B) (le_sup_of_le_right (le_sup_of_le_right (le_sup_of_le_right le_sup_right))) exact hle hstep obtain ⟨y₁, hy₁, hy₁L, hy₁G, hxy₁⟩ := - exists_mem_of_invariant_isBiLorentz_span_sup h.isBiLorentz_dotGaugeHiggs_left + exists_mem_of_invariant_rankTwo_span_sup h.isLorentzCovariant_rankTwo_dotGaugeHiggs_left (fun g d => h.rep_dotGaugeHiggs_invariant g d ![]) S₁ hS₁L hx₁ hL hG rw [hS₁def, h.dotSpan_zero_two_eq] at hy₁ obtain ⟨y₂, hy₂, hy₂L, hy₂G, hxy₂⟩ := - exists_mem_of_invariant_isBiLorentz_span_sup h.isBiLorentz_dotGaugeHiggs_right + exists_mem_of_invariant_rankTwo_span_sup h.isLorentzCovariant_rankTwo_dotGaugeHiggs_right (fun g d => h.rep_dotGaugeHiggs_invariant g ![] d) S₂ hS₂L hy₁ hy₁L hy₁G rw [hS₂def, h.dotSpan_one_one_eq] at hy₂ obtain ⟨y₃, hy₃, hy₃L, hy₃G, hxy₃⟩ := - exists_mem_of_invariant_isBiLorentz_span_sup h.isBiLorentz_dotGaugeHiggs_mixed + exists_mem_of_invariant_rankTwo_span_sup h.isLorentzCovariant_rankTwo_dotGaugeHiggs_mixed (fun g d => h.rep_dotGaugeHiggs_invariant g ![d 0] ![d 1]) S₃ hS₃L hy₂ hy₂L hy₂G obtain ⟨y, hyS, hyL, hyG, hxy⟩ := exists_mem_of_invariant_sup_fixed Q S hQL hQG hy₃ hy₃L hy₃G @@ -394,8 +394,8 @@ include h in eight. -/ lemma metricContraction_mem_massWeightSubmodule {T : (Fin 2 → Fin 1 ⊕ Fin 3) → B} (hT : ∀ d, T d ∈ h.massWeightSubmodule 8) : - BiLorentz.metricContraction (T := T) ∈ h.massWeightSubmodule 8 := by - rw [BiLorentz.metricContraction] + RankTwo.metricContraction (T := T) ∈ h.massWeightSubmodule 8 := by + rw [RankTwo.metricContraction] exact Submodule.sum_mem _ fun d _ => Submodule.smul_mem _ _ (hT d) include h in @@ -443,9 +443,9 @@ lemma repLorentz_of_mem_lorentzContractionEightSpan (g : SL(2,ℂ)) {y : B} refine sup_le ?_ (sup_le ?_ (sup_le ?_ ?_)) <;> rw [Submodule.span_singleton_le_iff_mem] <;> simp only [LinearMap.mem_ker, LinearMap.sub_apply, LinearMap.id_apply, sub_eq_zero] - · exact repLorentz_metricContraction h.isBiLorentz_dotGaugeHiggs_left g - · exact repLorentz_metricContraction h.isBiLorentz_dotGaugeHiggs_right g - · exact repLorentz_metricContraction h.isBiLorentz_dotGaugeHiggs_mixed g + · exact repLorentz_metricContraction h.isLorentzCovariant_rankTwo_dotGaugeHiggs_left g + · exact repLorentz_metricContraction h.isLorentzCovariant_rankTwo_dotGaugeHiggs_right g + · exact repLorentz_metricContraction h.isLorentzCovariant_rankTwo_dotGaugeHiggs_mixed g · exact h.invariant_dotGaugeHiggs_sq.1 g have hy' := key hy simp only [LinearMap.mem_ker, LinearMap.sub_apply, LinearMap.id_apply, sub_eq_zero] at hy' diff --git a/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/MassWeight/MassDimLTEight.lean b/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/MassWeight/MassDimLTEight.lean index bbfb22717..c6d8616c2 100644 --- a/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/MassWeight/MassDimLTEight.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/MassWeight/MassDimLTEight.lean @@ -6,7 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.AlgebraRealization.HiggsAlgebraCovRealization.MassWeight.GaugeWeightDecomposition -public import Physlib.Relativity.LorentzGroup.Invariants.IsSingleLorentz +public import Physlib.Relativity.LorentzGroup.Invariants.RankOne /-! # The Higgs invariants below mass weight eight @@ -20,7 +20,7 @@ weight is neutral, which is the gauge classification of `mem_of_invariant_massWeightSubmodule_two_sup`. Weight six dies on Lorentz counting. Its gauge invariants are the isospin contractions with one derivative, `∂_μ H† H` and `H† ∂_μ H`, and a single covector index admits no invariant contraction at all — the metric -ties two indices and the Levi-Civita symbol four — which is `SingleLorentz`. +ties two indices and the Levi-Civita symbol four — which is `RankOne`. Weight four survives because the Higgs is a Lorentz scalar. Its gauge invariants are the multiples of `H† H`, and with no derivative slot there is no Lorentz index to contract, so @@ -82,7 +82,7 @@ lemma sum_cov_zero {M : Type*} [AddCommMonoid M] (f : (Fin 0 → Fin 1 ⊕ Fin 3 At mass weight six the gauge classification leaves the isospin contractions carrying one derivative, on either of the two towers. The Higgs is a Lorentz scalar, so the only Lorentz index such a contraction has is that derivative slot, and read as a family indexed -by it the contraction is a Lorentz vector. `SingleLorentz` says that one covector index +by it the contraction is a Lorentz vector. `RankOne` says that one covector index admits no invariant contraction, so a Lorentz invariant of the span together with a stable submodule already lies in the submodule; the spans are themselves stable, so the two of them peel off one after the other. @@ -92,8 +92,8 @@ them peel off one after the other. include h in /-- The isospin contraction of a once-derived Higgs tower against an underived conjugate tower, read as a family indexed by its derivative slot, is a Lorentz vector. -/ -lemma isSingleLorentz_dotGaugeHiggs_left : - IsLorentzTensorFamily 1 B repLorentz +lemma isLorentzCovariant_rankOne_dotGaugeHiggs_left : + IsLorentzCovariant 1 B repLorentz (fun d : Fin 1 → Fin 1 ⊕ Fin 3 => h.dotGaugeHiggs d ![]) where repLorentz_T g l := by rw [h.repLorentz_dotGaugeHiggs g l (![] : Fin 0 → Fin 1 ⊕ Fin 3)] @@ -103,8 +103,8 @@ lemma isSingleLorentz_dotGaugeHiggs_left : include h in /-- The isospin contraction of an underived Higgs tower against a once-derived conjugate tower is a Lorentz vector in the same way. -/ -lemma isSingleLorentz_dotGaugeHiggs_right : - IsLorentzTensorFamily 1 B repLorentz +lemma isLorentzCovariant_rankOne_dotGaugeHiggs_right : + IsLorentzCovariant 1 B repLorentz (fun d : Fin 1 → Fin 1 ⊕ Fin 3 => h.dotGaugeHiggs ![] d) where repLorentz_T g l := by rw [h.repLorentz_dotGaugeHiggs g (![] : Fin 0 → Fin 1 ⊕ Fin 3) l, sum_cov_zero] @@ -228,16 +228,16 @@ theorem mem_of_gauge_lorentz_invariant_massWeightSubmodule_six_sup (S : Submodul repLorentz g y ∈ h.dotSpan 0 1 ⊔ S := by refine stable_sup_lorentz (fun g y hy => ?_) hSL rw [h.dotSpan_zero_one_eq] at hy ⊢ - exact h.isSingleLorentz_dotGaugeHiggs_right.repLorentz_mem_componentSpan g hy + exact h.isLorentzCovariant_rankOne_dotGaugeHiggs_right.repLorentz_mem_componentSpan g hy have hstep : x ∈ componentSpan (fun d : Fin 1 → Fin 1 ⊕ Fin 3 => h.dotGaugeHiggs d ![]) ⊔ (h.dotSpan 0 1 ⊔ S) := by rw [← h.dotSpan_one_zero_eq, ← sup_assoc] exact hxmem - have hnext := SingleLorentz.mem_of_invariant_of_mem_sup - h.isSingleLorentz_dotGaugeHiggs_left _ hstab hstep hL + have hnext := RankOne.mem_of_invariant_of_mem_sup + h.isLorentzCovariant_rankOne_dotGaugeHiggs_left _ hstab hstep hL rw [h.dotSpan_zero_one_eq] at hnext - exact SingleLorentz.mem_of_invariant_of_mem_sup h.isSingleLorentz_dotGaugeHiggs_right S hSL - hnext hL + exact RankOne.mem_of_invariant_of_mem_sup + h.isLorentzCovariant_rankOne_dotGaugeHiggs_right S hSL hnext hL /-! diff --git a/Physlib/Particles/StandardModel/CovAlgebraRealization/GaugeHiggsSector/MassWeight.lean b/Physlib/Particles/StandardModel/CovAlgebraRealization/GaugeHiggsSector/MassWeight.lean index 2612cd6b3..59fec0ceb 100644 --- a/Physlib/Particles/StandardModel/CovAlgebraRealization/GaugeHiggsSector/MassWeight.lean +++ b/Physlib/Particles/StandardModel/CovAlgebraRealization/GaugeHiggsSector/MassWeight.lean @@ -72,32 +72,32 @@ rank-two family against a Lorentz vector is a rank-three family. /-- Multiplying a Lorentz tensor family by a Lorentz-inert element gives a family of the same rank: the element rides through the transformation law untouched. -/ -lemma IsLorentzTensorFamily.mul_fixed {n : ℕ} +lemma IsLorentzCovariant.mul_fixed {n : ℕ} (hmul : ∀ (Λ : SL(2,ℂ)) (x y : B), repLorentz Λ (x * y) = repLorentz Λ x * repLorentz Λ y) - {T : (Fin n → Fin 1 ⊕ Fin 3) → B} (hT : IsLorentzTensorFamily n B repLorentz T) {y : B} + {T : (Fin n → Fin 1 ⊕ Fin 3) → B} (hT : IsLorentzCovariant n B repLorentz T) {y : B} (hy : ∀ g : SL(2,ℂ), repLorentz g y = y) : - IsLorentzTensorFamily n B repLorentz fun d => T d * y where + IsLorentzCovariant n B repLorentz fun d => T d * y where repLorentz_T g l := by rw [hmul, hT.repLorentz_T g l, hy g, Finset.sum_mul] exact Finset.sum_congr rfl fun a _ => smul_mul_assoc _ _ _ /-- The metric trace of a family multiplied on the right by a fixed element is the metric trace of the family, multiplied by that element. -/ -lemma BiLorentz.metricContraction_mul (T : (Fin 2 → Fin 1 ⊕ Fin 3) → B) (y : B) : - BiLorentz.metricContraction (T := fun d => T d * y) - = BiLorentz.metricContraction (T := T) * y := by - rw [BiLorentz.metricContraction, BiLorentz.metricContraction, Finset.sum_mul] +lemma RankTwo.metricContraction_mul (T : (Fin 2 → Fin 1 ⊕ Fin 3) → B) (y : B) : + RankTwo.metricContraction (T := fun d => T d * y) + = RankTwo.metricContraction (T := T) * y := by + rw [RankTwo.metricContraction, RankTwo.metricContraction, Finset.sum_mul] exact Finset.sum_congr rfl fun d _ => (smul_mul_assoc _ _ _).symm /-- A rank-two family against a Lorentz vector is a rank-three family: the two covector indices of the first factor and the single index of the second make three. -/ -lemma IsLorentzTensorFamily.mul_vector +lemma IsLorentzCovariant.mul_vector (hmul : ∀ (Λ : SL(2,ℂ)) (x y : B), repLorentz Λ (x * y) = repLorentz Λ x * repLorentz Λ y) - {T : (Fin 2 → Fin 1 ⊕ Fin 3) → B} (hT : IsLorentzTensorFamily 2 B repLorentz T) + {T : (Fin 2 → Fin 1 ⊕ Fin 3) → B} (hT : IsLorentzCovariant 2 B repLorentz T) {U : (Fin 1 ⊕ Fin 3) → B} (hU : ∀ (g : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3), repLorentz g (U μ) = ∑ ν : Fin 1 ⊕ Fin 3, (((SL2C.toLorentzGroup g).1 ν μ : ℝ) : ℂ) • U ν) : - IsLorentzTensorFamily 3 B repLorentz + IsLorentzCovariant 3 B repLorentz fun d : Fin 3 → Fin 1 ⊕ Fin 3 => T ![d 0, d 1] * U (d 2) where repLorentz_T g l := by rw [hmul, hT.repLorentz_T g ![l 0, l 1], hU g (l 2), @@ -139,32 +139,32 @@ and the inertness of products and joins that the peeling consumes. bi-Lorentz families with vanishing metric traces lies in the stable submodule it is taken modulo. An element of a join lies in a join over finitely many of the summands, so the finite peeling of the gauge sector suffices. -/ -lemma mem_of_lorentz_invariant_iSup_isBiLorentz_span {ι : Type} +lemma mem_of_lorentz_invariant_iSup_rankTwo_span {ι : Type} {T : ι → (Fin 2 → Fin 1 ⊕ Fin 3) → B} - (hT : ∀ i, IsLorentzTensorFamily 2 B repLorentz (T i)) - (hzero : ∀ i, BiLorentz.metricContraction (T := T i) = 0) (S : Submodule ℂ B) + (hT : ∀ i, IsLorentzCovariant 2 B repLorentz (T i)) + (hzero : ∀ i, RankTwo.metricContraction (T := T i) = 0) (S : Submodule ℂ B) (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) {x : B} (hx : x ∈ (⨆ i, componentSpan (T i)) ⊔ S) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by classical obtain ⟨u, hu, z, hz, rfl⟩ := Submodule.mem_sup.1 hx obtain ⟨s, hs⟩ := Submodule.mem_iSup_iff_exists_finset.1 hu - exact IsGaugeSector.mem_of_lorentz_invariant_biSup_isBiLorentz_span hT hzero S hS s + exact IsGaugeSector.mem_of_lorentz_invariant_biSup_rankTwo_span hT hzero S hS s (Submodule.mem_sup.2 ⟨u, hs, z, hz, rfl⟩) hinv /-- A Lorentz invariant of a join, over an arbitrary index type, of the spans of triple Lorentz families lies in the stable submodule it is taken modulo: three covector indices admit no invariant contraction at all. -/ -lemma mem_of_lorentz_invariant_iSup_isTriLorentz_span {ι : Type} +lemma mem_of_lorentz_invariant_iSup_rankThree_span {ι : Type} {T : ι → (Fin 3 → Fin 1 ⊕ Fin 3) → B} - (hT : ∀ i, IsLorentzTensorFamily 3 B repLorentz (T i)) + (hT : ∀ i, IsLorentzCovariant 3 B repLorentz (T i)) (S : Submodule ℂ B) (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) {x : B} (hx : x ∈ (⨆ i, componentSpan (T i)) ⊔ S) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by classical obtain ⟨u, hu, z, hz, rfl⟩ := Submodule.mem_sup.1 hx obtain ⟨s, hs⟩ := Submodule.mem_iSup_iff_exists_finset.1 hu - exact IsGaugeSector.mem_of_lorentz_invariant_biSup_isTriLorentz_span hT S hS s + exact IsGaugeSector.mem_of_lorentz_invariant_biSup_rankThree_span hT S hS s (Submodule.mem_sup.2 ⟨u, hs, z, hz, rfl⟩) hinv /-- A product of two pointwise Lorentz-inert submodules is pointwise Lorentz inert. -/ @@ -278,15 +278,15 @@ theorem mem_of_lorentz_invariant_derivSubmodule_zero_mul_fixed_sup (C : Submodul (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by let T : Module.Dual ℝ GaugeAlgebra × C → (Fin 2 → Fin 1 ⊕ Fin 3) → B := fun i l => h.covF ![] (l 0) (l 1) i.1 * (i.2 : B) - have hT : ∀ i, IsLorentzTensorFamily 2 B repLorentz (T i) := - fun i => (h.isGaugeSector.isBiLorentz_F_underived i.1).mul_fixed h.repLorentz_mul + have hT : ∀ i, IsLorentzCovariant 2 B repLorentz (T i) := + fun i => (h.isGaugeSector.isLorentzCovariant_F_underived i.1).mul_fixed h.repLorentz_mul fun g => hC g (i.2 : B) i.2.2 - have hzero : ∀ i, BiLorentz.metricContraction (T := T i) = 0 := by + have hzero : ∀ i, RankTwo.metricContraction (T := T i) = 0 := by intro i refine IsGaugeSector.metricContraction_eq_zero_of_antisymm fun a b => ?_ simp only [T, Matrix.cons_val_zero, Matrix.cons_val_one] rw [h.isGaugeSector.F_antisymm ![] a b i.1, neg_mul] - refine mem_of_lorentz_invariant_iSup_isBiLorentz_span hT hzero S hSL ?_ hinv + refine mem_of_lorentz_invariant_iSup_rankTwo_span hT hzero S hSL ?_ hinv refine sup_le_sup_right ?_ S hx refine Submodule.mul_le.mpr fun a ha b hb => ?_ have key : h.isGaugeSector.derivSubmodule 0 @@ -311,10 +311,10 @@ theorem mem_of_lorentz_invariant_derivSubmodule_one_mul_fixed_sup (C : Submodule (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by let T : Module.Dual ℝ GaugeAlgebra × C → (Fin 3 → Fin 1 ⊕ Fin 3) → B := fun i l => h.covF ![l 0] (l 1) (l 2) i.1 * (i.2 : B) - have hT : ∀ i, IsLorentzTensorFamily 3 B repLorentz (T i) := - fun i => (h.isGaugeSector.isTriLorentz_F_deriv_one i.1).mul_fixed h.repLorentz_mul + have hT : ∀ i, IsLorentzCovariant 3 B repLorentz (T i) := + fun i => (h.isGaugeSector.isLorentzCovariant_F_deriv_one i.1).mul_fixed h.repLorentz_mul fun g => hC g (i.2 : B) i.2.2 - refine mem_of_lorentz_invariant_iSup_isTriLorentz_span hT S hSL ?_ hinv + refine mem_of_lorentz_invariant_iSup_rankThree_span hT S hSL ?_ hinv refine sup_le_sup_right ?_ S hx refine Submodule.mul_le.mpr fun a ha b hb => ?_ have key : h.isGaugeSector.derivSubmodule 1 @@ -353,10 +353,10 @@ theorem mem_of_lorentz_invariant_derivSubmodule_zero_mul_higgs_one_sup (S : Subm (Fin 3 → Fin 1 ⊕ Fin 3) → B := fun i l => h.covF ![] (l 0) (l 1) i.1 * Sum.elim (fun φ => h.covH ![l 2] φ) (fun ψ => h.covBarH ![l 2] ψ) i.2 - have hT : ∀ i, IsLorentzTensorFamily 3 B repLorentz (T i) := - fun i => (h.isGaugeSector.isBiLorentz_F_underived i.1).mul_vector + have hT : ∀ i, IsLorentzCovariant 3 B repLorentz (T i) := + fun i => (h.isGaugeSector.isLorentzCovariant_F_underived i.1).mul_vector h.repLorentz_mul (hU i.2) - refine mem_of_lorentz_invariant_iSup_isTriLorentz_span hT S hSL ?_ hinv + refine mem_of_lorentz_invariant_iSup_rankThree_span hT S hSL ?_ hinv refine sup_le_sup_right ?_ S hx refine Submodule.mul_le.mpr fun a ha b hb => ?_ have key : ∀ (μ ν : Fin 1 ⊕ Fin 3) (φ : Module.Dual ℝ GaugeAlgebra), diff --git a/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/MassDimLTEight.lean b/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/MassDimLTEight.lean index 0804d251f..915d98171 100644 --- a/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/MassDimLTEight.lean +++ b/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/MassDimLTEight.lean @@ -7,7 +7,7 @@ module public import Physlib.Particles.StandardModel.CovAlgebraRealization.YukawaSector.Basic public import Physlib.Particles.StandardModel.AlgebraRealization.HiggsAlgebraCovRealization.DerivSubmodule.BoostWeightDecomposition -public import Physlib.Relativity.LorentzGroup.Invariants.IsQuadLorentz +public import Physlib.Relativity.LorentzGroup.Invariants.RankFour -- The fermion boost weights enter only inside the proofs below, so this import is kept -- private: its public form is one character over the line-length limit. import Physlib.Particles.StandardModel.IsFermionSector.DerivSubmodule.BoostWeightDecomposition diff --git a/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/MassDimEight.lean b/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/MassDimEight.lean index 189df5cc0..a4f5c056c 100644 --- a/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/MassDimEight.lean +++ b/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/MassDimEight.lean @@ -11,7 +11,7 @@ public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU2BiAdjoi 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 Physlib.Relativity.LorentzGroup.Invariants.RankFour public import Mathlib.RepresentationTheory.Invariants /-! # Products of two field strengths as bi-adjoint gauge tensors @@ -50,7 +50,7 @@ each of the four families. Both classifications are one-directional as stated, and the converse is that each span 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 `QuadLorentz` shows to +it sits inside the gauge span and is spanned by contractions that `RankFour` 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`. @@ -1061,7 +1061,7 @@ lemma traceContractionEightSpan_sup_hyperchargeDerivSpan_le : 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 `IsLorentzTensorFamily 4`: `repLorentz_F` at no covariant derivatives moves each covector +sense of `IsLorentzCovariant 4`: `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 are sums of such products over a gauge index, and a finite sum of quadruple Lorentz tensors is one again. So is the twice-derived @@ -1105,7 +1105,7 @@ lemma sum_mul_sum_eq_sum_pi_four (c c' : (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) (∑ a, ∑ b, c a b • X a b) * (∑ x, ∑ y, c' x y • Y x y) = ∑ d : Fin 4 → Fin 1 ⊕ Fin 3, (c (d 0) (d 1) * c' (d 2) (d 3)) • (X (d 0) (d 1) * Y (d 2) (d 3)) := by - rw [QuadLorentz.sum_pi_four, Fintype.sum_mul_sum] + rw [RankFour.sum_pi_four, Fintype.sum_mul_sum] refine Finset.sum_congr rfl fun a _ => ?_ simp only [Fintype.sum_mul_sum, smul_mul_smul_comm, Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, Matrix.cons_val_two, Matrix.tail_cons, Matrix.cons_val_three] @@ -1114,8 +1114,8 @@ lemma sum_mul_sum_eq_sum_pi_four (c c' : (Fin 1 ⊕ Fin 3) → (Fin 1 ⊕ Fin 3) 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) : - IsLorentzTensorFamily 4 B repLorentz +lemma isLorentzCovariant_F_mul (φ ψ : Module.Dual ℝ GaugeAlgebra) : + IsLorentzCovariant 4 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) φ, @@ -1125,9 +1125,9 @@ lemma isQuadLorentz_F_mul (φ ψ : Module.Dual ℝ GaugeAlgebra) : /-- 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, IsLorentzTensorFamily 4 B repLorentz (T i)) : - IsLorentzTensorFamily 4 B repLorentz (fun d => ∑ i, T i d) where +lemma isLorentzCovariant_sum {ι : Type} [Fintype ι] {T : ι → (Fin 4 → Fin 1 ⊕ Fin 3) → B} + (hT : ∀ i, IsLorentzCovariant 4 B repLorentz (T i)) : + IsLorentzCovariant 4 B repLorentz (fun d => ∑ i, T i d) where repLorentz_T g l := by simp only [map_sum, fun i => (hT i).repLorentz_T g l, Finset.smul_sum] exact Finset.sum_comm @@ -1135,33 +1135,33 @@ lemma isQuadLorentz_sum {ι : Type} [Fintype ι] {T : ι → (Fin 4 → Fin 1 include h in /-- A family of four four-vector indices whose members are sums of products of two underived field-strength symbols is a quadruple Lorentz tensor. -/ -lemma isQuadLorentz_of_eq_sum {ι : Type} [Fintype ι] {T : EightIdx → B} +lemma isLorentzCovariant_of_eq_sum {ι : Type} [Fintype ι] {T : EightIdx → B} (φ : ι → Module.Dual ℝ GaugeAlgebra) (hT : ∀ d, T d = ∑ i, F ![] (d 0) (d 1) (φ i) * F ![] (d 2) (d 3) (φ i)) : - IsLorentzTensorFamily 4 B repLorentz T := by + IsLorentzCovariant 4 B repLorentz T := by rw [show T = fun d => ∑ i, F ![] (d 0) (d 1) (φ i) * F ![] (d 2) (d 3) (φ i) from funext hT] - exact isQuadLorentz_sum fun _ => h.isQuadLorentz_F_mul _ _ + exact isLorentzCovariant_sum fun _ => h.isLorentzCovariant_F_mul _ _ /-- The gluon trace contractions, read as a family of four four-vector indices, form a quadruple Lorentz tensor: a sum over the colour index of products of two underived field-strength symbols. -/ -lemma isQuadLorentz_gluonTrace : IsLorentzTensorFamily 4 B repLorentz h.gluonTrace := - h.isQuadLorentz_of_eq_sum (fun a : Fin 8 => GaugeAlgebra.stdBasis.coord (Sum.inl a)) +lemma isLorentzCovariant_gluonTrace : IsLorentzCovariant 4 B repLorentz h.gluonTrace := + h.isLorentzCovariant_of_eq_sum (fun a : Fin 8 => GaugeAlgebra.stdBasis.coord (Sum.inl a)) h.gluonTrace_eq /-- The `W`-boson trace contractions form a quadruple Lorentz tensor. -/ -lemma isQuadLorentz_wTrace : IsLorentzTensorFamily 4 B repLorentz h.wTrace := - h.isQuadLorentz_of_eq_sum (fun i : Fin 3 => GaugeAlgebra.stdBasis.coord (Sum.inr (Sum.inl i))) - h.wTrace_eq +lemma isLorentzCovariant_wTrace : IsLorentzCovariant 4 B repLorentz h.wTrace := + h.isLorentzCovariant_of_eq_sum + (fun i : Fin 3 => GaugeAlgebra.stdBasis.coord (Sum.inr (Sum.inl i))) h.wTrace_eq /-- The hypercharge trace contractions form a quadruple Lorentz tensor. -/ -lemma isQuadLorentz_hyperchargeTrace : - IsLorentzTensorFamily 4 B repLorentz h.hyperchargeTrace := by +lemma isLorentzCovariant_hyperchargeTrace : + IsLorentzCovariant 4 B repLorentz h.hyperchargeTrace := by rw [show h.hyperchargeTrace = fun d => 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 h.hyperchargeTrace_eq] - exact h.isQuadLorentz_F_mul _ _ + exact h.isLorentzCovariant_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) : @@ -1176,26 +1176,26 @@ lemma sum_pi_two_cov {M : Type*} [AddCommMonoid M] (f : (Fin 2 → Fin 1 ⊕ Fin /-- The twice-derived hypercharge field strengths, read as a family of four four-vector indices, form a quadruple Lorentz tensor: the two derivative slots and the two covector indices all rotate. This is the second shape of mass weight eight. -/ -lemma isQuadLorentz_hyperchargeDeriv : - IsLorentzTensorFamily 4 B repLorentz h.hyperchargeDeriv where +lemma isLorentzCovariant_hyperchargeDeriv : + IsLorentzCovariant 4 B repLorentz h.hyperchargeDeriv where repLorentz_T g l := by simp only [hyperchargeDeriv, hyperchargeField] - rw [h.repLorentz_F g 2 ![l 0, l 1] (l 2) (l 3), sum_pi_two_cov, QuadLorentz.sum_pi_four] + rw [h.repLorentz_F g 2 ![l 0, l 1] (l 2) (l 3), sum_pi_two_cov, RankFour.sum_pi_four] simp only [Finset.smul_sum, smul_smul, Fin.prod_univ_two, Fin.prod_univ_four, mul_assoc, Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.head_cons, Matrix.cons_val_two, Matrix.tail_cons, Matrix.cons_val_three] /-- The span of the components of a quadruple Lorentz tensor is stable under the Lorentz group. -/ -lemma isQuadLorentz_span_stable {T : (Fin 4 → Fin 1 ⊕ Fin 3) → B} - (hT : IsLorentzTensorFamily 4 B repLorentz T) (g : SL(2,ℂ)) : +lemma rankFour_span_stable {T : (Fin 4 → Fin 1 ⊕ Fin 3) → B} + (hT : IsLorentzCovariant 4 B repLorentz T) (g : SL(2,ℂ)) : ∀ y ∈ componentSpan T, repLorentz g y ∈ componentSpan T := fun _ hy => hT.repLorentz_mem_componentSpan g hy /-- 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 := - ⨆ i : Fin 4, ℂ ∙ QuadLorentz.contraction T i + ⨆ i : Fin 4, ℂ ∙ RankFour.contraction T i /-- 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 @@ -1203,31 +1203,31 @@ noncomputable def quadContractionSpan (T : (Fin 4 → Fin 1 ⊕ Fin 3) → B) : lemma quadContractionSpan_le_span {T : (Fin 4 → Fin 1 ⊕ Fin 3) → B} : quadContractionSpan T ≤ componentSpan T := iSup_span_singleton_le _ fun i => by - rw [QuadLorentz.contraction_eq] + rw [RankFour.contraction_eq] exact sum_smul_mem_componentSpan T _ /-- The span of the four Lorentz contractions of a quadruple Lorentz family is a space of - Lorentz invariants, the four contractions being invariant by `QuadLorentz`. -/ + Lorentz invariants, the four contractions being invariant by `RankFour`. -/ lemma quadContractionSpan_le_lorentzInvariants {T : (Fin 4 → Fin 1 ⊕ Fin 3) → B} - (hT : IsLorentzTensorFamily 4 B repLorentz T) : + (hT : IsLorentzCovariant 4 B repLorentz T) : quadContractionSpan T ≤ repLorentz.invariants := iSup_span_singleton_le _ fun i => - (Representation.mem_invariants _ _).2 (QuadLorentz.repLorentz_contraction hT i) + (Representation.mem_invariants _ _).2 (RankFour.repLorentz_contraction hT i) /-- Peeling the span of a quadruple Lorentz tensor off a Lorentz-stable submodule, in the form `exists_mem_of_invariant_iSup_sup` takes: the remainder is Lorentz invariant by the - sup lemma of `QuadLorentz`, and the difference is a combination of the four + sup lemma of `RankFour`, and the difference is a combination of the four contractions. -/ -lemma exists_mem_of_invariant_isQuadLorentz_span_sup {T : (Fin 4 → Fin 1 ⊕ Fin 3) → B} - (hT : IsLorentzTensorFamily 4 B repLorentz T) (S : Submodule ℂ B) +lemma exists_mem_of_invariant_rankFour_span_sup {T : (Fin 4 → Fin 1 ⊕ Fin 3) → B} + (hT : IsLorentzCovariant 4 B repLorentz T) (S : Submodule ℂ B) (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) {x : B} (hx : x ∈ componentSpan T ⊔ S) (hLinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : ∃ y ∈ S, (∀ g : SL(2,ℂ), repLorentz g y = y) ∧ x - y ∈ quadContractionSpan T := by obtain ⟨a₁, a₂, a₃, a₄, y, hyS, rfl, hyinv⟩ := - (QuadLorentz.mem_span_sup_invariant_iff hT x S hS).1 ⟨hx, hLinv⟩ - have hmem := sum_smul_mem_iSup_span (QuadLorentz.contraction T) ![a₁, a₂, a₃, a₄] - rw [QuadLorentz.sum_smul_contraction] at hmem + (RankFour.mem_span_sup_invariant_iff hT x S hS).1 ⟨hx, hLinv⟩ + have hmem := sum_smul_mem_iSup_span (RankFour.contraction T) ![a₁, a₂, a₃, a₄] + rw [RankFour.sum_smul_contraction] at hmem exact ⟨y, hyS, hyinv, by rwa [add_sub_cancel_right]⟩ /-- The span of the four Lorentz contractions of each of the three underived @@ -1275,24 +1275,24 @@ theorem exists_mem_of_gauge_and_lorentz_invariant (S : Submodule ℂ B) ∧ x - y ∈ h.lorentzContractionEightSpan := by obtain ⟨y₀, hy₀S, -, hxy₀⟩ := h.exists_mem_of_invariant_massWeightSubmodule_eight_sup S hS hx hGinv - have hS₃ := fun g => sup_stable (isQuadLorentz_span_stable h.isQuadLorentz_hyperchargeDeriv g) + have hS₃ := fun g => sup_stable (rankFour_span_stable h.isLorentzCovariant_hyperchargeDeriv g) (hSL g) - have hS₂ := fun g => sup_stable (isQuadLorentz_span_stable h.isQuadLorentz_hyperchargeTrace g) + have hS₂ := fun g => sup_stable (rankFour_span_stable h.isLorentzCovariant_hyperchargeTrace g) (hS₃ g) - have hS₁ := fun g => sup_stable (isQuadLorentz_span_stable h.isQuadLorentz_wTrace g) (hS₂ g) + have hS₁ := fun g => sup_stable (rankFour_span_stable h.isLorentzCovariant_wTrace g) (hS₂ g) have hx₁ : x ∈ componentSpan h.gluonTrace ⊔ (componentSpan h.wTrace ⊔ (componentSpan h.hyperchargeTrace ⊔ (componentSpan h.hyperchargeDeriv ⊔ S))) := by have hmem := Submodule.mem_sup.2 ⟨x - y₀, hxy₀, y₀, hy₀S, sub_add_cancel x y₀⟩ rwa [traceContractionEightSpan, sup_assoc, sup_assoc, sup_assoc] at hmem obtain ⟨y₁, hy₁, hy₁L, hxy₁⟩ := - exists_mem_of_invariant_isQuadLorentz_span_sup h.isQuadLorentz_gluonTrace _ hS₁ hx₁ hLinv + exists_mem_of_invariant_rankFour_span_sup h.isLorentzCovariant_gluonTrace _ hS₁ hx₁ hLinv obtain ⟨y₂, hy₂, hy₂L, hxy₂⟩ := - exists_mem_of_invariant_isQuadLorentz_span_sup h.isQuadLorentz_wTrace _ hS₂ hy₁ hy₁L - obtain ⟨y₃, hy₃, hy₃L, hxy₃⟩ := exists_mem_of_invariant_isQuadLorentz_span_sup - h.isQuadLorentz_hyperchargeTrace _ hS₃ hy₂ hy₂L - obtain ⟨y₄, hy₄, hy₄L, hxy₄⟩ := exists_mem_of_invariant_isQuadLorentz_span_sup - h.isQuadLorentz_hyperchargeDeriv S hSL hy₃ hy₃L + exists_mem_of_invariant_rankFour_span_sup h.isLorentzCovariant_wTrace _ hS₂ hy₁ hy₁L + obtain ⟨y₃, hy₃, hy₃L, hxy₃⟩ := exists_mem_of_invariant_rankFour_span_sup + h.isLorentzCovariant_hyperchargeTrace _ hS₃ hy₂ hy₂L + obtain ⟨y₄, hy₄, hy₄L, hxy₄⟩ := exists_mem_of_invariant_rankFour_span_sup + h.isLorentzCovariant_hyperchargeDeriv S hSL hy₃ hy₃L have hxy : x - y₄ ∈ h.lorentzContractionEightSpan := by rw [show x - y₄ = x - y₁ + (y₁ - y₂ + (y₂ - y₃ + (y₃ - y₄))) from by abel, lorentzContractionEightSpan] @@ -1315,7 +1315,7 @@ theorem exists_mem_of_gauge_and_lorentz_invariant (S : Submodule ℂ B) The converse of the Lorentz classification: the Lorentz contraction span is made of gauge and Lorentz invariants of mass weight eight. Its gauge invariance was already needed in section H, and its mass weight passes to it from the gauge span in the same way; Lorentz -invariance comes from `QuadLorentz` directly, each block being spanned by the four +invariance comes from `RankFour` directly, each block being spanned by the four contractions of a quadruple Lorentz family. -/ @@ -1329,10 +1329,10 @@ lemma lorentzContractionEightSpan_le_massWeightSubmodule : /-- The Lorentz contraction span is a space of Lorentz invariants. -/ lemma lorentzContractionEightSpan_le_lorentzInvariants : h.lorentzContractionEightSpan ≤ repLorentz.invariants := - 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))) + sup_le (quadContractionSpan_le_lorentzInvariants h.isLorentzCovariant_gluonTrace) + (sup_le (quadContractionSpan_le_lorentzInvariants h.isLorentzCovariant_wTrace) + (sup_le (quadContractionSpan_le_lorentzInvariants h.isLorentzCovariant_hyperchargeTrace) + (quadContractionSpan_le_lorentzInvariants h.isLorentzCovariant_hyperchargeDeriv))) /-! diff --git a/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/MassDimLTEight.lean b/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/MassDimLTEight.lean index 648805638..e750d596e 100644 --- a/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/MassDimLTEight.lean +++ b/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/MassDimLTEight.lean @@ -6,8 +6,8 @@ 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 +public import Physlib.Relativity.LorentzGroup.Invariants.RankTwo +public import Physlib.Relativity.LorentzGroup.Invariants.RankThree /-! # The invariants below mass weight eight @@ -159,8 +159,8 @@ of `IsGaugeSector` moving every index by the Lorentz matrix of the `SL(2,ℂ)` e 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) : - IsLorentzTensorFamily 2 B repLorentz +lemma isLorentzCovariant_F_underived (φ : Module.Dual ℝ GaugeAlgebra) : + IsLorentzCovariant 2 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) φ, @@ -177,8 +177,8 @@ lemma isBiLorentz_F_underived (φ : Module.Dual ℝ GaugeAlgebra) : 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) : - IsLorentzTensorFamily 3 B repLorentz +lemma isLorentzCovariant_F_deriv_one (φ : Module.Dual ℝ GaugeAlgebra) : + IsLorentzCovariant 3 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] @@ -206,8 +206,8 @@ hence zero, and the trace vanishes with them. 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]) : - BiLorentz.metricContraction (T := T) = 0 := by - rw [BiLorentz.metricContraction] + RankTwo.metricContraction (T := T) = 0 := by + rw [RankTwo.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) @@ -238,23 +238,23 @@ peeled. /-- 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 : IsLorentzTensorFamily 2 B repLorentz T) - (hzero : BiLorentz.metricContraction (T := T) = 0) (S : Submodule ℂ B) +lemma mem_of_lorentz_invariant_rankTwo_span_sup {T : (Fin 2 → Fin 1 ⊕ Fin 3) → B} + (hT : IsLorentzCovariant 2 B repLorentz T) + (hzero : RankTwo.metricContraction (T := T) = 0) (S : Submodule ℂ B) (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) {x : B} (hx : x ∈ componentSpan T ⊔ S) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by obtain ⟨a, y, hy, hxy⟩ := - BiLorentz.exists_smul_metricContraction_of_invariant_subset hT S hS hx hinv + RankTwo.exists_smul_metricContraction_of_invariant_subset hT 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 ι] +lemma mem_of_lorentz_invariant_biSup_rankTwo_span {ι : Type} [DecidableEq ι] {T : ι → (Fin 2 → Fin 1 ⊕ Fin 3) → B} - (hT : ∀ i, IsLorentzTensorFamily 2 B repLorentz (T i)) - (hzero : ∀ i, BiLorentz.metricContraction (T := T i) = 0) (S : Submodule ℂ B) + (hT : ∀ i, IsLorentzCovariant 2 B repLorentz (T i)) + (hzero : ∀ i, RankTwo.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, componentSpan (T i)) ⊔ S) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by @@ -274,15 +274,15 @@ lemma mem_of_lorentz_invariant_biSup_isBiLorentz_span {ι : Type} [DecidableEq (Submodule.mem_iSup_of_mem hi ((hT i).repLorentz_mem_componentSpan 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 + exact ih (mem_of_lorentz_invariant_rankTwo_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 ι] +lemma mem_of_lorentz_invariant_biSup_rankThree_span {ι : Type} [DecidableEq ι] {T : ι → (Fin 3 → Fin 1 ⊕ Fin 3) → B} - (hT : ∀ i, IsLorentzTensorFamily 3 B repLorentz (T i)) + (hT : ∀ i, IsLorentzCovariant 3 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, componentSpan (T i)) ⊔ S) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by @@ -302,7 +302,7 @@ lemma mem_of_lorentz_invariant_biSup_isTriLorentz_span {ι : Type} [DecidableEq (Submodule.mem_iSup_of_mem hi ((hT i).repLorentz_mem_componentSpan g hz)))) fun z hz => Submodule.mem_sup_right (hS g z hz) exact key hy - exact ih (TriLorentz.mem_of_invariant_of_mem_sup (hT a) _ hstab hx hinv) hinv + exact ih (RankThree.mem_of_invariant_of_mem_sup (hT a) _ 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) : @@ -324,7 +324,7 @@ 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) : - BiLorentz.metricContraction + RankTwo.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] @@ -362,8 +362,8 @@ theorem mem_of_lorentz_invariant_massWeightSubmodule_four_sup (S : Submodule ℂ (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)) + refine mem_of_lorentz_invariant_biSup_rankTwo_span + (fun c => h.isLorentzCovariant_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 @@ -420,8 +420,8 @@ theorem mem_of_lorentz_invariant_massWeightSubmodule_six_sup (S : Submodule ℂ (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)) + refine mem_of_lorentz_invariant_biSup_rankThree_span + (fun c => h.isLorentzCovariant_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 diff --git a/Physlib/Relativity/LorentzGroup/Invariants/Basic.lean b/Physlib/Relativity/LorentzGroup/Invariants/Basic.lean index 6bd609931..d82c88f74 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/Basic.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/Basic.lean @@ -255,6 +255,25 @@ theorem exists_isInvariantCoeff_of_mem_span {T : (Fin n → Fin 1 ⊕ Fin 3) → def lightConeComponent (i : Fin 3) (c : (Fin n → Fin 1 ⊕ Fin 3) → ℂ) (κ : Fin n → Fin 4) : ℂ := ∑ a, (∏ s, lightConeCoeff i (κ s) (a s)) * c a +/-- A light-cone multi-index that `Λ` reproduces up to a scalar `k` has its light-cone + component scaled by `k`. The hypothesis is the eigenvector equation for the covector + `∏ₛ lightConeCoeff i (κ s) (·)` under the transposed action, which is the form the light-cone + directions of an axis satisfy for the transformations diagonal in that basis: the boost along + the axis, with `k` a power of its parameter, and the half turn about it, with `k` the product + of the signs of the slots. -/ +lemma lightConeComponent_act (i : Fin 3) (Λ : Matrix (Fin 1 ⊕ Fin 3) (Fin 1 ⊕ Fin 3) ℝ) + (c : (Fin n → Fin 1 ⊕ Fin 3) → ℂ) (κ : Fin n → Fin 4) (k : ℂ) + (hΛ : ∀ d : Fin n → Fin 1 ⊕ Fin 3, + ∑ a : Fin n → Fin 1 ⊕ Fin 3, (∏ s, lightConeCoeff i (κ s) (a s)) + * ∏ s, ((Λ (a s) (d s) : ℝ) : ℂ) + = k * ∏ s, lightConeCoeff i (κ s) (d s)) : + lightConeComponent i (act Λ c) κ = k * lightConeComponent i c κ := by + simp only [lightConeComponent, act, Finset.mul_sum] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun d _ => ?_ + rw [← mul_assoc, mul_comm _ (c d), ← hΛ d, Finset.mul_sum] + exact Finset.sum_congr rfl fun a _ => by ring + /-- The Lorentz matrix of a boost is symmetric. -/ lemma toLorentzGroup_boostAxis_symm (i : Fin 3) {t : ℝ} (ht : t ≠ 0) (a b : Fin 1 ⊕ Fin 3) : (SL2C.toLorentzGroup (SL2C.boostAxis i t ht)).1 a b @@ -267,14 +286,9 @@ lemma toLorentzGroup_boostAxis_symm (i : Fin 3) {t : ℝ} (ht : t ≠ 0) (a b : lemma lightConeComponent_act_boostAxis (i : Fin 3) (c : (Fin n → Fin 1 ⊕ Fin 3) → ℂ) (κ : Fin n → Fin 4) {t : ℝ} (ht : t ≠ 0) : lightConeComponent i (act (SL2C.toLorentzGroup (SL2C.boostAxis i t ht)).1 c) κ - = ((t : ℝ) : ℂ) ^ (∑ s, lightConeWeight (κ s)) * lightConeComponent i c κ := by - simp only [lightConeComponent, act, Finset.mul_sum] - rw [Finset.sum_comm] - refine Finset.sum_congr rfl fun d _ => ?_ - have h := sum_prod_lightConeCoeff i κ d ht - simp only [toLorentzGroup_boostAxis_symm i ht (d _)] at h - rw [← mul_assoc, mul_comm _ (c d), ← h, Finset.mul_sum] - exact Finset.sum_congr rfl fun a _ => by ring + = ((t : ℝ) : ℂ) ^ (∑ s, lightConeWeight (κ s)) * lightConeComponent i c κ := + lightConeComponent_act i _ c κ _ fun d => by + simpa only [toLorentzGroup_boostAxis_symm i ht (d _)] using sum_prod_lightConeCoeff i κ d ht /-- An invariant coefficient tensor has no light-cone component of nonzero weight: the boost at `t = 2` would rescale such a component by a factor other than `1`. -/ diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsLeftRightWeyl.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsLeftRightWeyl.lean index 299eb1c33..9cc7eb50e 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsLeftRightWeyl.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsLeftRightWeyl.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Relativity.LorentzGroup.Invariants.TensorFamily +public import Physlib.Relativity.LorentzGroup.Invariants.LorentzCovariance public import Physlib.Relativity.Fermions.Weyl.BoostWeight /-! # Lorentz invariants of a left-handed and a right-handed Weyl index diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsVectorLeftRightWeyl.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsVectorLeftRightWeyl.lean index 0f2470e14..5185558c8 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsVectorLeftRightWeyl.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsVectorLeftRightWeyl.lean @@ -6,7 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Relativity.LorentzGroup.Invariants.IsBiLeftWeyl -public import Physlib.Relativity.LorentzGroup.Invariants.IsBiLorentz +public import Physlib.Relativity.LorentzGroup.Invariants.RankTwo public import Physlib.Relativity.PauliMatrices.AsTensor /-! # Lorentz invariants of a four-vector index and a left-right Weyl pair @@ -27,7 +27,7 @@ representation, which is the four-vector representation, so the three indices ar four-vector indices, and two of those admit only the metric trace. The proof makes that literal. The covariant Pauli matrices intertwine the two index laws (A), so contracting the Weyl pair against them turns `T` into a bi-Lorentz tensor, invertibly by Fierz -completeness, leaving the span unchanged (C); `BiLorentz` then supplies the +completeness, leaving the span unchanged (C); `RankTwo` then supplies the classification (D), its metric trace being the Pauli contraction of `T`. Section E gives the model family, whose Pauli contraction is `PauliMatrix.asTensor`. @@ -194,8 +194,8 @@ noncomputable def vectorPair : (Fin 2 → Fin 1 ⊕ Fin 3) → B := include hT in /-- The Pauli contraction of the Weyl pair carries the two spinor indices into a second four-vector index: the resulting family is a rank-two Lorentz tensor family. -/ -lemma isLorentzTensorFamily_vectorPair : - IsLorentzTensorFamily 2 B repLorentz (vectorPair (T := T)) where +lemma isLorentzCovariant_vectorPair : + IsLorentzCovariant 2 B repLorentz (vectorPair (T := T)) where repLorentz_T g l := by have hstep : ∀ p : Fin 2 × Fin 2, pauliLower (l 1) p.1 p.2 • repLorentz g (T (l 0, p)) @@ -304,8 +304,8 @@ lemma componentSpan_vectorPair : componentSpan (vectorPair (T := T)) = hT.span : /-- The metric trace of the reduced family is exactly the Pauli contraction of `T`: the two lowerings of the vector index cancel, so no sign and no scalar appear. -/ lemma metricContraction_vectorPair : - BiLorentz.metricContraction (T := vectorPair (T := T)) = pauliContraction (T := T) := by - rw [BiLorentz.metricContraction, sum_pi_fin_two, pauliContraction] + RankTwo.metricContraction (T := vectorPair (T := T)) = pauliContraction (T := T) := by + rw [RankTwo.metricContraction, sum_pi_fin_two, pauliContraction] refine Finset.sum_congr rfl fun ν _ => ?_ rw [Finset.sum_eq_single ν (fun ρ _ hρ => ?_) (fun hν => absurd (Finset.mem_univ ν) hν)] · simp only [vectorPair, Matrix.cons_val_zero, Matrix.cons_val_one, Finset.smul_sum, @@ -323,7 +323,7 @@ lemma metricContraction_vectorPair : ## D. The classification of the Lorentz invariants -`BiLorentz` classifies the invariants of `vectorPair`, and its metric trace is the Pauli +`RankTwo` classifies the invariants of `vectorPair`, and its metric trace is the Pauli contraction of `T`, so every invariant of the span is a multiple of `pauliContraction`. -/ @@ -333,7 +333,7 @@ include hT in `Λ η Λᵀ = η` read through the reduction of section C. -/ lemma repLorentz_pauliContraction (g : SL(2,ℂ)) : repLorentz g (pauliContraction (T := T)) = pauliContraction (T := T) := by - have hV := hT.isLorentzTensorFamily_vectorPair + have hV := hT.isLorentzCovariant_vectorPair have hstep : ∀ d : Fin 2 → Fin 1 ⊕ Fin 3, repLorentz g (((minkowskiMatrixZ (d 0) (d 1) : ℤ) : ℂ) • vectorPair (T := T) d) = ∑ a : Fin 2 → Fin 1 ⊕ Fin 3, @@ -343,7 +343,7 @@ lemma repLorentz_pauliContraction (g : SL(2,ℂ)) : intro d rw [map_smul, hV.repLorentz_T g d, Finset.smul_sum] exact Finset.sum_congr rfl fun a _ => smul_smul _ _ _ - rw [← metricContraction_vectorPair (T := T), BiLorentz.metricContraction, map_sum] + rw [← metricContraction_vectorPair (T := T), RankTwo.metricContraction, map_sum] calc ∑ d : Fin 2 → Fin 1 ⊕ Fin 3, repLorentz g (((minkowskiMatrixZ (d 0) (d 1) : ℤ) : ℂ) • vectorPair (T := T) d) = ∑ a : Fin 2 → Fin 1 ⊕ Fin 3, (∑ d : Fin 2 → Fin 1 ⊕ Fin 3, @@ -367,11 +367,11 @@ include hT in theorem exists_smul_pauliContraction_of_invariant {x : B} (hx : x ∈ hT.span) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : ∃ a : ℂ, x = a • pauliContraction (T := T) := by - have hV := hT.isLorentzTensorFamily_vectorPair + have hV := hT.isLorentzCovariant_vectorPair have hx' : x ∈ componentSpan (vectorPair (T := T)) := by rw [hT.componentSpan_vectorPair] exact hx - obtain ⟨a, ha⟩ := BiLorentz.exists_smul_metricContraction_of_invariant hV hx' hinv + obtain ⟨a, ha⟩ := RankTwo.exists_smul_metricContraction_of_invariant hV hx' hinv exact ⟨a, by rwa [metricContraction_vectorPair] at ha⟩ include hT in @@ -381,12 +381,12 @@ lemma exists_smul_pauliContraction_of_invariant_subset {x : B} (S : Submodule (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 • pauliContraction (T := T) + y := by - have hV := hT.isLorentzTensorFamily_vectorPair + have hV := hT.isLorentzCovariant_vectorPair have hx' : x ∈ componentSpan (vectorPair (T := T)) ⊔ S := by rw [hT.componentSpan_vectorPair] exact hx obtain ⟨a, y, hy, ha⟩ := - BiLorentz.exists_smul_metricContraction_of_invariant_subset hV S hS hx' hinv + RankTwo.exists_smul_metricContraction_of_invariant_subset hV S hS hx' hinv exact ⟨a, y, hy, by rwa [metricContraction_vectorPair] at ha⟩ end IsVectorLeftRightWeyl @@ -789,4 +789,3 @@ end IsVectorDualLeftRightWeyl end DualClassification end Lorentz - diff --git a/Physlib/Relativity/LorentzGroup/Invariants/LightCone.lean b/Physlib/Relativity/LorentzGroup/Invariants/LightCone.lean index 9dda1d858..8baf4ee63 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/LightCone.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/LightCone.lean @@ -5,6 +5,7 @@ Authors: Joseph Tooby-Smith -/ module +public import Physlib.Mathematics.Fin public import Physlib.Relativity.LorentzGroup.Invariants.Basic /-! # The light-cone basis of a boost axis over the integers and the rationals @@ -12,10 +13,11 @@ public import Physlib.Relativity.LorentzGroup.Invariants.Basic `lightConeCoeff` and `lightConeCoeffInv` of `LightConeDeriv` change a spacetime index into the light-cone basis of a spatial axis `i`: the two directions `D₀ - Dᵢ` and `D₀ + Dᵢ` of the plane the boost along `i` moves, and the two transverse directions. Their entries are `0`, `±1` and -`±1/2`, so both matrices have integer or rational mirrors, and every classification in this -folder computes with a mirror rather than with `ℂ`: the kernel evaluates `ℤ` and `ℚ` and does -not evaluate `ℂ`. This file holds the mirrors and what is proved about them at an arbitrary -number of indices; the rank-specific files contract them against as many slots as they have. +`±1/2`, so both matrices have integer or rational mirrors, and the rank-two and rank-four +classifications compute with a mirror rather than with `ℂ`: the kernel evaluates `ℤ` and `ℚ` +and does not evaluate `ℂ`. The Weyl classifications carry their own weight bases and use none +of this. This file holds the mirrors and what is proved about them at an arbitrary number of +indices; the rank-specific files contract them against as many slots as they have. The change of basis one way is `lightConeCoeffZ`, an exact integer copy. The other way needs the halves: `lightConeCoeffInvQ` keeps them, and `lightConeCoeffInvZ` clears them, so it is @@ -193,6 +195,13 @@ gives `transitionZ`. The recursion follows B: a slot whose direction lies in the takes weight `2` or `-2` and leaves `m - 2` or `m + 2`, and a transverse slot takes either direction of weight `0`, which is why those two are added, and leaves `m`. +Unfolding the recursion into a single sum splits into two independent steps. The case split of +the recursion is the boost-plane support argument of B and nothing else: once it is resolved, +one slot is a plain sum over the four directions, each taking its own weight out of `m` +(`transitionZ_succ`). What is left has no light-cone content at all, the peeling of the first +slot off a weight-constrained sum over tuples, which is `Physlib.Fin.sum_filter_weight_succ`. +`transitionZ_eq_sum` is the induction that composes them. + -/ /-- One slot's factor: twice the coefficient of `κ` in `μ`, times that of `ν` in `κ`. -/ @@ -212,6 +221,25 @@ def transitionZ (i : Fin 3) : {n : ℕ} → (d e : Fin n → Fin 1 ⊕ Fin 3) else (slotZ i 2 (d 0) (e 0) + slotZ i 3 (d 0) (e 0)) * transitionZ i (Fin.tail d) (Fin.tail e) m +/-- One slot of the transition, with the case split of the recursion resolved: the first slot + runs over all four light-cone directions, each taking its own weight out of `m`. The two + directions of the boost plane drop out of a transverse slot and the two transverse ones drop + out of a slot in the boost plane, which is what the two branches of `transitionZ` record. -/ +lemma transitionZ_succ (i : Fin 3) {n : ℕ} (d e : Fin (n + 1) → Fin 1 ⊕ Fin 3) (m : ℤ) : + transitionZ i d e m + = ∑ κ : Fin 4, slotZ i κ (d 0) (e 0) + * transitionZ i (Fin.tail d) (Fin.tail e) (m - lightConeWeight κ) := by + rw [Fin.sum_univ_four, transitionZ] + simp only [show lightConeWeight 0 = 2 from rfl, show lightConeWeight 1 = -2 from rfl, + show lightConeWeight 2 = 0 from rfl, show lightConeWeight 3 = 0 from rfl, + sub_neg_eq_add, sub_zero] + by_cases h : InBoostPlane i (d 0) + · rw [if_pos h] + simp [slotZ, lightConeCoeffInvZ_eq_zero_of_inBoostPlane h] + · rw [if_neg h] + simp [slotZ, lightConeCoeffInvZ_eq_zero_of_not_inBoostPlane h] + ring + /-- The recursion unfolded, as a sum over the multi-indices of total weight `m`. -/ lemma transitionZ_eq_sum (i : Fin 3) : ∀ {n : ℕ} (d e : Fin n → Fin 1 ⊕ Fin 3) (m : ℤ), @@ -223,38 +251,11 @@ lemma transitionZ_eq_sum (i : Fin 3) : rw [Finset.sum_filter, Fintype.sum_unique] simp [transitionZ, eq_comm] | n + 1, d, e, m => by - have hpeel : ∀ κ : Fin 4, - (∑ κ' : Fin n → Fin 4, if lightConeWeight κ + ∑ s, lightConeWeight (κ' s) = m then - slotZ i κ (d 0) (e 0) * ∏ s, slotZ i (κ' s) (d s.succ) (e s.succ) else 0) - = slotZ i κ (d 0) (e 0) - * transitionZ i (Fin.tail d) (Fin.tail e) (m - lightConeWeight κ) := by - intro κ - rw [transitionZ_eq_sum i (Fin.tail d) (Fin.tail e), Finset.sum_filter, Finset.mul_sum] - exact Finset.sum_congr rfl fun κ' _ => by - rw [mul_ite, mul_zero] - exact if_congr (by omega) rfl rfl - calc transitionZ i d e m - = ∑ κ : Fin 4, slotZ i κ (d 0) (e 0) - * transitionZ i (Fin.tail d) (Fin.tail e) (m - lightConeWeight κ) := by - rw [Fin.sum_univ_four, transitionZ] - simp only [show lightConeWeight 0 = 2 from rfl, show lightConeWeight 1 = -2 from rfl, - show lightConeWeight 2 = 0 from rfl, show lightConeWeight 3 = 0 from rfl, - sub_neg_eq_add, sub_zero] - by_cases h : InBoostPlane i (d 0) - · rw [if_pos h] - simp [slotZ, lightConeCoeffInvZ_eq_zero_of_inBoostPlane h] - · rw [if_neg h] - simp [slotZ, lightConeCoeffInvZ_eq_zero_of_not_inBoostPlane h] - ring - _ = _ := by - rw [Finset.sum_filter, - ← Equiv.sum_comp (Fin.consEquiv fun _ : Fin (n + 1) => Fin 4), Fintype.sum_prod_type] - refine Finset.sum_congr rfl fun κ _ => ?_ - rw [← hpeel κ] - refine Finset.sum_congr rfl fun κ' _ => ?_ - simp only [Fin.consEquiv_apply, Fin.sum_univ_succ, Fin.prod_univ_succ, Fin.cons_zero, - Fin.cons_succ] - + rw [transitionZ_succ, + Physlib.Fin.sum_filter_weight_succ lightConeWeight fun s κ => slotZ i κ (d s) (e s)] + refine Finset.sum_congr rfl fun κ₀ _ => ?_ + rw [transitionZ_eq_sum i (Fin.tail d) (Fin.tail e)] + rfl end Invariants diff --git a/Physlib/Relativity/LorentzGroup/Invariants/TensorFamily.lean b/Physlib/Relativity/LorentzGroup/Invariants/LorentzCovariance.lean similarity index 88% rename from Physlib/Relativity/LorentzGroup/Invariants/TensorFamily.lean rename to Physlib/Relativity/LorentzGroup/Invariants/LorentzCovariance.lean index bbfbfee1f..ab62ab298 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/TensorFamily.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/LorentzCovariance.lean @@ -7,7 +7,7 @@ module public import Physlib.Relativity.LorentzGroup.Invariants.Basic /-! -# Families of components carrying four-vector indices +# Lorentz covariance of component families A family `T` of vectors of a complex module `B`, indexed by `n` spacetime directions and moved by a representation of `SL(2,ℂ)` with one factor of the Lorentz matrix per index, is what the @@ -39,8 +39,8 @@ open Matrix MatrixGroups SL2C Invariants ## A. The span of a family of components The span exists for any family, with no transformation law in sight, so it is defined on the -family alone. `mem_componentSpan_iff` is the only thing ever asked of it: its elements are the -combinations of the components. +family alone. Its elements are exactly the combinations of the components, which is what +`mem_componentSpan_iff` records and what everything below reads it through. -/ @@ -93,14 +93,14 @@ end SpanQuotient `repLorentz` moves the way the components of a rank-`n` tensor `T^{μ₁ ⋯ μₙ}` transform: one factor of the Lorentz matrix per slot, the moved index second in each factor and the summed one first. -/ -structure IsLorentzTensorFamily (n : ℕ) (B : Type*) [AddCommMonoid B] [Module ℂ B] +structure IsLorentzCovariant (n : ℕ) (B : Type*) [AddCommMonoid B] [Module ℂ B] (repLorentz : Representation ℂ SL(2,ℂ) B) (T : (Fin n → (Fin 1 ⊕ Fin 3)) → B) : Prop where repLorentz_T : ∀ (g : SL(2,ℂ)) l, repLorentz g (T l) = ∑ (a : Fin n → Fin 1 ⊕ Fin 3), (∏ (i : Fin n), (((SL2C.toLorentzGroup g).1 (a i) (l i) : ℝ) : ℂ)) • T a -namespace IsLorentzTensorFamily +namespace IsLorentzCovariant section Monoid @@ -111,16 +111,16 @@ variable {n : ℕ} {B : Type*} [AddCommMonoid B] [Module ℂ B] /-- The image of the family under a linear map intertwining the two representations is again such a family. The map is not assumed injective or surjective. -/ lemma map {B' : Type*} [AddCommMonoid B'] [Module ℂ B'] {rep' : Representation ℂ SL(2,ℂ) B'} - (hT : IsLorentzTensorFamily n B repLorentz T) (f : B →ₗ[ℂ] B') + (hT : IsLorentzCovariant n B repLorentz T) (f : B →ₗ[ℂ] B') (hf : ∀ (g : SL(2,ℂ)) (y : B), f (repLorentz g y) = rep' g (f y)) : - IsLorentzTensorFamily n B' rep' fun l => f (T l) where + IsLorentzCovariant n B' rep' fun l => f (T l) where repLorentz_T g l := by rw [← hf, hT.repLorentz_T g l, map_sum] exact Finset.sum_congr rfl fun a _ => map_smul _ _ _ /-- The span of the components is Lorentz stable: each component goes to a combination of the components. -/ -lemma repLorentz_mem_componentSpan (hT : IsLorentzTensorFamily n B repLorentz T) (g : SL(2,ℂ)) +lemma repLorentz_mem_componentSpan (hT : IsLorentzCovariant n B repLorentz T) (g : SL(2,ℂ)) {x : B} (hx : x ∈ componentSpan T) : repLorentz g x ∈ componentSpan T := by obtain ⟨c, rfl⟩ := (mem_componentSpan_iff T x).1 hx exact (mem_componentSpan_iff T _).2 ⟨_, repLorentz_sum_smul hT.repLorentz_T g c⟩ @@ -135,30 +135,30 @@ variable {n : ℕ} {B : Type*} [AddCommGroup B] [Module ℂ B] /-- The classes of the components in the quotient by a Lorentz-stable submodule again form a Lorentz tensor family of the same rank, for Mathlib's quotient representation. -/ -lemma quotient (hT : IsLorentzTensorFamily n B repLorentz T) (S : Submodule ℂ B) +lemma quotient (hT : IsLorentzCovariant n B repLorentz T) (S : Submodule ℂ B) (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) : - IsLorentzTensorFamily n (B ⧸ S) (repLorentz.quotient S fun g y hy => hS g y hy) + IsLorentzCovariant n (B ⧸ S) (repLorentz.quotient S fun g y hy => hS g y hy) fun l => S.mkQ (T l) := hT.map S.mkQ fun _ _ => rfl /-- A Lorentz invariant lying in the span of the components is the contraction of a coefficient tensor that the Lorentz matrices themselves fix. -/ theorem exists_isInvariantCoeff_of_mem_componentSpan - (hT : IsLorentzTensorFamily n B repLorentz T) {x : B} (hx : x ∈ componentSpan T) + (hT : IsLorentzCovariant n B repLorentz T) {x : B} (hx : x ∈ componentSpan T) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : ∃ c : (Fin n → Fin 1 ⊕ Fin 3) → ℂ, IsInvariantCoeff c ∧ x = ∑ d, c d • T d := Invariants.exists_isInvariantCoeff_of_mem_span hT.repLorentz_T hx hinv /-- Contracting the components with an invariant coefficient tensor gives a Lorentz invariant. -/ -lemma isInvariant_sum_smul (hT : IsLorentzTensorFamily n B repLorentz T) +lemma isInvariant_sum_smul (hT : IsLorentzCovariant n B repLorentz T) {c : (Fin n → Fin 1 ⊕ Fin 3) → ℂ} (hc : IsInvariantCoeff c) (g : SL(2,ℂ)) : repLorentz g (∑ d, c d • T d) = ∑ d, c d • T d := repLorentz_sum_smul_of_isInvariantCoeff hT.repLorentz_T hc g end Group -end IsLorentzTensorFamily +end IsLorentzCovariant /-! diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean b/Physlib/Relativity/LorentzGroup/Invariants/RankFour.lean similarity index 92% rename from Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean rename to Physlib/Relativity/LorentzGroup/Invariants/RankFour.lean index 6228001a7..d999df97a 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsQuadLorentz.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/RankFour.lean @@ -6,7 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Relativity.LorentzGroup.Invariants.LightCone -public import Physlib.Relativity.LorentzGroup.Invariants.TensorFamily +public import Physlib.Relativity.LorentzGroup.Invariants.LorentzCovariance public import Physlib.Mathematics.LeviCivita.Basic public import Mathlib.LinearAlgebra.Matrix.Determinant.Basic /-! @@ -23,7 +23,7 @@ by every rotation and boost, the Lorentz transformations coming from `SL(2,ℂ)` There are no others. The fourth is a pseudoscalar, so it would drop out if reflections were allowed; independence is not proved, and for a given `T` the four may be dependent or zero. The components are vectors `T d` of a complex vector space `B` carrying a representation -`repLorentz` of `SL(2,ℂ)`, and `IsLorentzTensorFamily 4 B repLorentz T` says the group moves +`repLorentz` of `SL(2,ℂ)`, and `IsLorentzCovariant 4 B repLorentz T` says the group moves them with one factor of the Lorentz matrix per slot (A). A vector of `B` is invariant when every `repLorentz g` fixes it, and `componentSpan T` is the set of contractions `∑_d c_d • T d`. The theorem `mem_span_sup_invariant_iff` (H) allows a Lorentz-stable subspace `S` beside the span, @@ -50,8 +50,8 @@ open Matrix MatrixGroups SL2C Invariants A direction is an element of `Fin 1 ⊕ Fin 3`, time or one of the three axes; an index vector `d : Fin 4 → Fin 1 ⊕ Fin 3` puts one in each slot, so `T d` is `T^{μνρσ}` at `(μ, ν, ρ, σ) = d`. -The predicate and the span are `IsLorentzTensorFamily 4` and `componentSpan`, both from -`Invariants.TensorFamily`. The law is +The predicate and the span are `IsLorentzCovariant 4` and `componentSpan`, both from +`Invariants.LorentzCovariance`. The law is `repLorentz g (T l) = ∑_a Λ_{a₀ l₀} Λ_{a₁ l₁} Λ_{a₂ l₂} Λ_{a₃ l₃} • T a`, @@ -64,7 +64,7 @@ play, kept apart by name: `x : B` is Lorentz invariant when `repLorentz g x = x` stated for any number of slots in `Invariants.Basic` and used here at four. -/ -namespace QuadLorentz +namespace RankFour variable {B : Type*} [AddCommGroup B] [Module ℂ B] {repLorentz : Representation ℂ SL(2,ℂ) B} @@ -263,32 +263,32 @@ is invariant, as is any combination: with `smul_contraction_mem_span`, the easy -/ /-- Each of the four contractions is Lorentz invariant, its coefficient tensor being invariant. -/ -lemma repLorentz_contraction (hT : IsLorentzTensorFamily 4 B repLorentz T) (i : Fin 4) +lemma repLorentz_contraction (hT : IsLorentzCovariant 4 B repLorentz T) (i : Fin 4) (g : SL(2,ℂ)) : repLorentz g (contraction T i) = contraction T i := by rw [contraction_eq, hT.isInvariant_sum_smul (isInvariantCoeff_contractionCoeff i)] /-- The outer contraction is Lorentz invariant. -/ -lemma repLorentz_outerContraction (hT : IsLorentzTensorFamily 4 B repLorentz T) (g : SL(2,ℂ)) : +lemma repLorentz_outerContraction (hT : IsLorentzCovariant 4 B repLorentz T) (g : SL(2,ℂ)) : repLorentz g (outerContraction T) = outerContraction T := repLorentz_contraction hT 0 g /-- The inner contraction is Lorentz invariant. -/ -lemma repLorentz_innerContraction (hT : IsLorentzTensorFamily 4 B repLorentz T) (g : SL(2,ℂ)) : +lemma repLorentz_innerContraction (hT : IsLorentzCovariant 4 B repLorentz T) (g : SL(2,ℂ)) : repLorentz g (innerContraction T) = innerContraction T := repLorentz_contraction hT 1 g /-- The split contraction is Lorentz invariant. -/ -lemma repLorentz_splitContraction (hT : IsLorentzTensorFamily 4 B repLorentz T) (g : SL(2,ℂ)) : +lemma repLorentz_splitContraction (hT : IsLorentzCovariant 4 B repLorentz T) (g : SL(2,ℂ)) : repLorentz g (splitContraction T) = splitContraction T := repLorentz_contraction hT 2 g /-- The Levi-Civita contraction is Lorentz invariant. -/ -lemma repLorentz_epsilonContraction (hT : IsLorentzTensorFamily 4 B repLorentz T) +lemma repLorentz_epsilonContraction (hT : IsLorentzCovariant 4 B repLorentz T) (g : SL(2,ℂ)) : repLorentz g (epsilonContraction T) = epsilonContraction T := repLorentz_contraction hT 3 g /-- A combination of the four contractions is Lorentz invariant. -/ -lemma repLorentz_smul_contraction (hT : IsLorentzTensorFamily 4 B repLorentz T) +lemma repLorentz_smul_contraction (hT : IsLorentzCovariant 4 B repLorentz T) (a₁ a₂ a₃ a₄ : ℂ) (g : SL(2,ℂ)) : repLorentz g (a₁ • outerContraction T + a₂ • innerContraction T + a₃ • splitContraction T + a₄ • epsilonContraction T) @@ -302,17 +302,15 @@ lemma repLorentz_smul_contraction (hT : IsLorentzTensorFamily 4 B repLorentz T) ## C. An invariant of the span is the contraction of an invariant tensor The components may satisfy linear relations, so the `c` with `x = ∑ c_d • T d` is not -determined by `x` and need not be invariant. Let `K` be the coefficient tensors contracting to -`0`, a subspace of `ℂ^{256}` that the group preserves and that is the whole ambiguity in `c`. -Give `ℂ^{256}` the standard inner product `∑_d conj(u_d) v_d`, positive definite and unrelated -to `η`, written `EuclideanSpace ℂ (Fin 4 → Fin 1 ⊕ Fin 3)`, where `WithLp.toLp 2` and `.ofLp` -only move to and from the plain function type. The complement `Kᗮ` is preserved too, since -`act Λ` across the inner product becomes `act Λᵀ` (`Invariants.inner_actMat`) and `Λᵀ` -is again such a matrix, that of `g†`; the action is not unitary, and is not used to be. So keep -the `Kᗮ` part of `c`: it still contracts to `x`, and acting on it changes it by an element of -`K` and of `Kᗮ`, hence by `0`. The argument is the same for any number of slots and is carried -out in `Invariants.Basic`, reached here through -`IsLorentzTensorFamily.exists_isInvariantCoeff_of_mem_componentSpan`. +determined by `x` and need not be invariant. Replacing `c` by its part orthogonal to the +coefficient tensors that contract to `0` repairs that without changing the vector; the argument +is the same for any number of slots and is carried out in `Invariants.Basic`, reached here +through `IsLorentzCovariant.exists_isInvariantCoeff_of_mem_componentSpan`. + +The inner product it uses is the standard one on the `ℂ^{256}` of coefficient tensors, positive +definite and unrelated to `η`; `B` carries none, and the coefficient action is not unitary. All +that is needed is that the adjoint of `act Λ` is `act Λᵀ`, which is again the action of a +Lorentz matrix coming from `SL(2,ℂ)`, that of `g†`. -/ /-! @@ -657,8 +655,9 @@ and rows `w i = contractionWeight i`, so it sends any vector to a combination of Lean checks it by computing all `484` entries of each side. On a solution `b` every factor turns `M` into `48`, giving `48² - 44 * 48 + 192 = 384`, then `32`, `16`, `48`, so the left sends `b` to `48 * 16 * 32 * 384 = 9437184` times `b` and the right to `393216 • (projector b)`. -As `9437184 = 393216 * 24` this leaves `projector b = 24 b`, writing `b`, and with it `c`, as a -combination of the four; the `24` is `contractionWeight_mul_contractionOrbit`. The identity is +As `9437184 = 393216 * 24` this leaves `projector b = 24 b` (`projector_mulVec`), writing `b`, +and with it `c`, as a combination of the four; the `24` is +`contractionWeight_mul_contractionOrbit`. The identity is `λ (3λ - 2) (3λ - 1) (12λ² - 11λ + 1) / 4` at `λ = M / 48` with denominators cleared, but that is only where it came from: the file proves nothing about the spectrum. -/ @@ -692,11 +691,14 @@ lemma certificate : revert k l decide +kernel -/-- `24` times the orbit coordinates of an invariant tensor is `projector` applied to them. -/ -lemma orbitCoord_eq {c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ} (hc : IsInvariantCoeff c) - (k : Fin 22) : - 24 * c (orbitRep k) - = ∑ i, (contractionOrbit i k : ℂ) * ∑ l, (contractionWeight i l : ℂ) * c (orbitRep l) := by +/-- The integer projector matrix acts on invariant orbit coordinates by multiplication by `24`. + The `24` is the normalization of `projector`: each factor of the certificate acts on such a + vector as a scalar, `M` by `48`, `M - z` by `48 - z` and the quadratic factor by + `48 ^ 2 - 44 * 48 + 192 = 384`, so the left-hand side scales it by + `48 * 32 * 16 * 384 = 9437184`, and dividing by the `393216` on the right leaves `24`. -/ +lemma projector_mulVec {c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ} (hc : IsInvariantCoeff c) : + projector.map (Int.cast : ℤ → ℂ) *ᵥ (fun k => c (orbitRep k)) + = (24 : ℂ) • fun k => c (orbitRep k) := by set b : Fin 22 → ℂ := fun k => c (orbitRep k) with hb set M : Matrix (Fin 22) (Fin 22) ℂ := orbitMatrix.map (Int.cast : ℤ → ℂ) with hM have hMb : M *ᵥ b = (48 : ℂ) • b := orbitMatrix_mulVec hc @@ -728,19 +730,25 @@ lemma orbitCoord_eq {c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ} (hc : IsInvariantC rw [hcert] rw [← Matrix.mulVec_mulVec, hquad, ← Matrix.mulVec_mulVec, h₂, ← Matrix.mulVec_mulVec, h₃, h₄, Matrix.smul_mulVec] at hpb - have hk := congrFun hpb k + refine smul_right_injective (Fin 22 → ℂ) (show (393216 : ℂ) ≠ 0 by norm_num) ?_ + simp only [← hpb, smul_smul] + norm_num + +/-- `24` times an orbit coordinate of an invariant tensor, read entry by entry off the previous + lemma: `projector` is built from the columns `contractionOrbit i` and the rows + `contractionWeight i`. -/ +lemma orbitCoord_eq {c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ} (hc : IsInvariantCoeff c) + (k : Fin 22) : + 24 * c (orbitRep k) + = ∑ i, (contractionOrbit i k : ℂ) * ∑ l, (contractionWeight i l : ℂ) * c (orbitRep l) := by + have hk := congrFun (projector_mulVec hc) k simp only [Pi.smul_apply, smul_eq_mul, Matrix.mulVec, dotProduct, Matrix.map_apply, projector, - Matrix.of_apply, Int.cast_sum, Int.cast_mul, Finset.sum_mul, hb] at hk + Matrix.of_apply, Int.cast_sum, Int.cast_mul, Finset.sum_mul] at hk rw [Finset.sum_comm] at hk - have hk' : (393216 : ℂ) * (24 * c (orbitRep k)) - = (393216 : ℂ) * ∑ i, (contractionOrbit i k : ℂ) - * ∑ l, (contractionWeight i l : ℂ) * c (orbitRep l) := by - rw [← mul_assoc, show (393216 : ℂ) * 24 = 9437184 by norm_num, hk] - congr 1 - exact Finset.sum_congr rfl fun i _ => by - rw [Finset.mul_sum] - exact Finset.sum_congr rfl fun l _ => by ring - exact mul_left_cancel₀ (by norm_num) hk' + rw [← hk] + exact Finset.sum_congr rfl fun i _ => by + rw [Finset.mul_sum] + exact Finset.sum_congr rfl fun l _ => by ring /-- An invariant coefficient tensor is a combination of the four. -/ theorem exists_eq_sum {c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ} (hc : IsInvariantCoeff c) : @@ -770,13 +778,13 @@ C to G give `exists_smul_contraction_of_invariant`, the case `S = ⊥` of the th general `S`, right to left is immediate and does not use `hS`; left to right passes to the quotient `B ⧸ S`, that is `B` with `S` declared zero and `S.mkQ` the map to classes. Stability lets `repLorentz` act there and the classes of the components again form a rank-four family, -both by `IsLorentzTensorFamily.quotient`, so back in `B` the difference between `x` and the +both by `IsLorentzCovariant.quotient`, so back in `B` the difference between `x` and the matching combination of contractions has zero class, hence lies in `S`, and is invariant as a difference of invariants. -/ /-- Every Lorentz invariant of the span is a combination of the four contractions. -/ -theorem exists_smul_contraction_of_invariant (hT : IsLorentzTensorFamily 4 B repLorentz T) +theorem exists_smul_contraction_of_invariant (hT : IsLorentzCovariant 4 B repLorentz T) {x : B} (hx : x ∈ componentSpan T) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : ∃ a₁ a₂ a₃ a₄ : ℂ, x = a₁ • outerContraction T + a₂ • innerContraction T + a₃ • splitContraction T @@ -788,15 +796,9 @@ theorem exists_smul_contraction_of_invariant (hT : IsLorentzTensorFamily 4 B rep simp only [contraction_eq, Finset.smul_sum, Finset.sum_smul, smul_smul] exact Finset.sum_comm -/-- Taking classes turns a contraction of the components into one of their classes. -/ -lemma mkQ_sum_smul (S : Submodule ℂ B) (c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ) : - S.mkQ (∑ d, c d • T d) = ∑ d, c d • S.mkQ (T d) := by - rw [map_sum] - exact Finset.sum_congr rfl fun d _ => map_smul _ _ _ - /-- Left to right in `mem_span_sup_invariant_iff`, proved in the quotient by `S`. -/ lemma exists_smul_contraction_of_invariant_subset - (hT : IsLorentzTensorFamily 4 B repLorentz T) {x : B} (S : Submodule ℂ B) + (hT : IsLorentzCovariant 4 B repLorentz T) {x : B} (S : Submodule ℂ B) (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) (hx : x ∈ componentSpan T ⊔ S) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : ∃ a₁ a₂ a₃ a₄ : ℂ, ∃ y ∈ S, @@ -805,21 +807,19 @@ lemma exists_smul_contraction_of_invariant_subset ∧ ∀ g : SL(2,ℂ), repLorentz g y = y := by obtain ⟨a₁, a₂, a₃, a₄, hcomb⟩ := exists_smul_contraction_of_invariant (hT.quotient S hS) (mkQ_mem_componentSpan T S hx) fun g => by rw [quotient_apply_mkQ, hinv g] - simp only [outerContraction, innerContraction, splitContraction, epsilonContraction, - ← mkQ_sum_smul] at hcomb refine ⟨a₁, a₂, a₃, a₄, x - (a₁ • outerContraction T + a₂ • innerContraction T + a₃ • splitContraction T + a₄ • epsilonContraction T), ?_, by abel, fun g => ?_⟩ - · rw [← Submodule.ker_mkQ S, LinearMap.mem_ker, map_sub, hcomb, outerContraction, - innerContraction, splitContraction, epsilonContraction] - simp only [map_add, map_smul] + · rw [← Submodule.ker_mkQ S, LinearMap.mem_ker, map_sub, hcomb] + simp only [outerContraction, innerContraction, splitContraction, epsilonContraction, + map_add, map_smul, map_sum] abel · rw [map_sub, hinv g, repLorentz_smul_contraction hT a₁ a₂ a₃ a₄ g] /-- A vector of `componentSpan T ⊔ S`, the sums `u + y` with `u` in the span and `y` in the Lorentz-stable subspace `S`, is invariant exactly when it is a combination of the four contractions plus an invariant `y` of `S`. `hS` is used only left to right. -/ -theorem mem_span_sup_invariant_iff (hT : IsLorentzTensorFamily 4 B repLorentz T) (x : B) +theorem mem_span_sup_invariant_iff (hT : IsLorentzCovariant 4 B repLorentz T) (x : B) (S : Submodule ℂ B) (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) : (x ∈ componentSpan T ⊔ S ∧ ∀ g : SL(2,ℂ), repLorentz g x = x) ↔ ∃ a₁ a₂ a₃ a₄ : ℂ, ∃ y ∈ S, @@ -832,6 +832,6 @@ theorem mem_span_sup_invariant_iff (hT : IsLorentzTensorFamily 4 B repLorentz T) (Submodule.mem_sup_right hyS), fun g => ?_⟩ rw [map_add, repLorentz_smul_contraction hT a₁ a₂ a₃ a₄ g, hyinv g] -end QuadLorentz +end RankFour end Lorentz diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsSingleLorentz.lean b/Physlib/Relativity/LorentzGroup/Invariants/RankOne.lean similarity index 94% rename from Physlib/Relativity/LorentzGroup/Invariants/IsSingleLorentz.lean rename to Physlib/Relativity/LorentzGroup/Invariants/RankOne.lean index 3d4be5625..fd39780e3 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsSingleLorentz.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/RankOne.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Relativity.LorentzGroup.Invariants.TensorFamily +public import Physlib.Relativity.LorentzGroup.Invariants.LorentzCovariance /-! # Lorentz invariants of a single four-vector index @@ -15,7 +15,7 @@ is `eq_zero_of_invariant`, and `mem_of_invariant_of_mem_sup` is the same stateme Lorentz-stable subspace `S`, the form the Standard Model files use. The components are vectors `T d` of a complex vector space `B` carrying a representation -`repLorentz` of `SL(2,ℂ)`, indexed by one direction `d`, and `IsLorentzTensorFamily 1` says the +`repLorentz` of `SL(2,ℂ)`, indexed by one direction `d`, and `IsLorentzCovariant 1` says the group moves them by the Lorentz matrix. `componentSpan T` is the set of their combinations. An invariant of the span is `∑_d c_d • T d` for a coefficient tensor `c` that the Lorentz @@ -32,7 +32,7 @@ namespace Lorentz open TensorProduct Matrix MatrixGroups SL2C Invariants -namespace SingleLorentz +namespace RankOne variable {B : Type*} [AddCommGroup B] [Module ℂ B] {repLorentz : Representation ℂ SL(2,ℂ) B} @@ -108,7 +108,7 @@ lemma eq_zero_of_isInvariantCoeff {c : (Fin 1 → Fin 1 ⊕ Fin 3) → ℂ} /-- Every Lorentz invariant in the span of the components is zero: one index carries no invariant contraction. -/ -theorem eq_zero_of_invariant (hT : IsLorentzTensorFamily 1 B repLorentz T) {x : B} +theorem eq_zero_of_invariant (hT : IsLorentzCovariant 1 B repLorentz T) {x : B} (hx : x ∈ componentSpan T) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x = 0 := by obtain ⟨c, hc, rfl⟩ := hT.exists_isInvariantCoeff_of_mem_componentSpan hx hinv simp [eq_zero_of_isInvariantCoeff hc] @@ -125,13 +125,13 @@ section B applies there and an invariant of `componentSpan T ⊔ S` lies in `S`. /-- A Lorentz invariant of `componentSpan T ⊔ S`, for a Lorentz-stable subspace `S`, already lies in `S`. -/ -lemma mem_of_invariant_of_mem_sup (hT : IsLorentzTensorFamily 1 B repLorentz T) {x : B} +lemma mem_of_invariant_of_mem_sup (hT : IsLorentzCovariant 1 B repLorentz T) {x : B} (S : Submodule ℂ B) (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) (hx : x ∈ componentSpan T ⊔ S) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by have hzero := eq_zero_of_invariant (hT.quotient S hS) (mkQ_mem_componentSpan T S hx) fun g => by rw [quotient_apply_mkQ, hinv g] rwa [← Submodule.ker_mkQ S, LinearMap.mem_ker] -end SingleLorentz +end RankOne end Lorentz diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsTriLorentz.lean b/Physlib/Relativity/LorentzGroup/Invariants/RankThree.lean similarity index 93% rename from Physlib/Relativity/LorentzGroup/Invariants/IsTriLorentz.lean rename to Physlib/Relativity/LorentzGroup/Invariants/RankThree.lean index bad105c24..573ec9633 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsTriLorentz.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/RankThree.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Relativity.LorentzGroup.Invariants.TensorFamily +public import Physlib.Relativity.LorentzGroup.Invariants.LorentzCovariance public meta import Mathlib.Data.Fintype.Sum public meta import Mathlib.Data.Fintype.Pi /-! @@ -18,7 +18,7 @@ odd number is left over either way. That is `eq_zero_of_invariant`, and the form the Standard Model files use. The components are vectors `T d` of a complex vector space `B` carrying a representation -`repLorentz` of `SL(2,ℂ)`, indexed by three directions, and `IsLorentzTensorFamily 3` says the +`repLorentz` of `SL(2,ℂ)`, indexed by three directions, and `IsLorentzCovariant 3` says the group moves them with one factor of the Lorentz matrix per slot. `componentSpan T` is the set of their combinations. @@ -140,7 +140,7 @@ lemma prod_lightConeSign_of_sum_lightConeWeight_eq_zero (c : Fin 3 → Fin 4) revert c decide -namespace TriLorentz +namespace RankThree variable {B : Type*} [AddCommGroup B] [Module ℂ B] {repLorentz : Representation ℂ SL(2,ℂ) B} @@ -169,14 +169,10 @@ lemma toLorentzGroup_halfTurn_symm (i : Fin 3) (a b : Fin 1 ⊕ Fin 3) : lemma lightConeComponent_act_halfTurn {n : ℕ} (i : Fin 3) (c : (Fin n → Fin 1 ⊕ Fin 3) → ℂ) (κ : Fin n → Fin 4) : lightConeComponent i (act (SL2C.toLorentzGroup (SL2C.halfTurn i)).1 c) κ - = ((∏ s, lightConeSign (κ s) : ℤ) : ℂ) * lightConeComponent i c κ := by - simp only [lightConeComponent, act, Finset.mul_sum] - rw [Finset.sum_comm] - refine Finset.sum_congr rfl fun d _ => ?_ - have h := sum_prod_halfTurn_lightConeCoeff i κ d - simp only [toLorentzGroup_halfTurn_symm i (d _)] at h - rw [← mul_assoc, mul_comm _ (c d), ← h, Finset.mul_sum] - exact Finset.sum_congr rfl fun a _ => by ring + = ((∏ s, lightConeSign (κ s) : ℤ) : ℂ) * lightConeComponent i c κ := + lightConeComponent_act i _ c κ _ fun d => by + simpa only [toLorentzGroup_halfTurn_symm i (d _)] using + sum_prod_halfTurn_lightConeCoeff i κ d /-- An invariant coefficient tensor has no weight-zero light-cone component either, the half turn negating those. -/ @@ -201,7 +197,7 @@ lemma eq_zero_of_isInvariantCoeff {c : (Fin 3 → Fin 1 ⊕ Fin 3) → ℂ} /-- Every Lorentz invariant in the span of the components is zero: three indices carry no invariant contraction. -/ -theorem eq_zero_of_invariant (hT : IsLorentzTensorFamily 3 B repLorentz T) {x : B} +theorem eq_zero_of_invariant (hT : IsLorentzCovariant 3 B repLorentz T) {x : B} (hx : x ∈ componentSpan T) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x = 0 := by obtain ⟨c, hc, rfl⟩ := hT.exists_isInvariantCoeff_of_mem_componentSpan hx hinv simp [eq_zero_of_isInvariantCoeff hc] @@ -218,13 +214,13 @@ section B applies there and an invariant of `componentSpan T ⊔ S` lies in `S`. /-- A Lorentz invariant of `componentSpan T ⊔ S`, for a Lorentz-stable subspace `S`, already lies in `S`. -/ -lemma mem_of_invariant_of_mem_sup (hT : IsLorentzTensorFamily 3 B repLorentz T) {x : B} +lemma mem_of_invariant_of_mem_sup (hT : IsLorentzCovariant 3 B repLorentz T) {x : B} (S : Submodule ℂ B) (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) (hx : x ∈ componentSpan T ⊔ S) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by have hzero := eq_zero_of_invariant (hT.quotient S hS) (mkQ_mem_componentSpan T S hx) fun g => by rw [quotient_apply_mkQ, hinv g] rwa [← Submodule.ker_mkQ S, LinearMap.mem_ker] -end TriLorentz +end RankThree end Lorentz diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsBiLorentz.lean b/Physlib/Relativity/LorentzGroup/Invariants/RankTwo.lean similarity index 93% rename from Physlib/Relativity/LorentzGroup/Invariants/IsBiLorentz.lean rename to Physlib/Relativity/LorentzGroup/Invariants/RankTwo.lean index da2ad9c34..a8b91479a 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsBiLorentz.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/RankTwo.lean @@ -6,7 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Relativity.LorentzGroup.Invariants.LightCone -public import Physlib.Relativity.LorentzGroup.Invariants.TensorFamily +public import Physlib.Relativity.LorentzGroup.Invariants.LorentzCovariance public meta import Mathlib.Data.Fintype.Sum public meta import Mathlib.Data.Fintype.Pi /-! @@ -23,7 +23,7 @@ symbol needing four. That is `exists_smul_metricContraction_of_invariant`, and Lorentz-stable subspace `S`, the form the Standard Model files use. The components are vectors `T d` of a complex vector space `B` carrying a representation -`repLorentz` of `SL(2,ℂ)`, indexed by two directions, and `IsLorentzTensorFamily 2` says the +`repLorentz` of `SL(2,ℂ)`, indexed by two directions, and `IsLorentzCovariant 2` says the group moves them with one factor of the Lorentz matrix per slot. `componentSpan T` is the set of their combinations. @@ -48,7 +48,7 @@ namespace Lorentz open TensorProduct Matrix MatrixGroups SL2C Invariants -namespace BiLorentz +namespace RankTwo variable {B : Type*} [AddCommGroup B] [Module ℂ B] {repLorentz : Representation ℂ SL(2,ℂ) B} @@ -381,27 +381,34 @@ lemma pow_mul_eq_sum_pow_boostAverageZ {c : (Fin 2 → Fin 1 ⊕ Fin 3) → ℂ} -/ +/-- The certificate polynomial contracted against an invariant coefficient tensor. Each power of + the integer average contributes the matching power of `12`, and the cubic evaluates to + `12 ^ 3 - 14 * 12 ^ 2 + 40 * 12 = 192`. -/ +lemma sum_Q_mul_eq {c : (Fin 2 → Fin 1 ⊕ Fin 3) → ℂ} (hc : IsInvariantCoeff c) + (d : Fin 2 → Fin 1 ⊕ Fin 3) : + ∑ e, ((Q d e : ℤ) : ℂ) * c e = (192 : ℂ) * c d := by + have h1 := pow_mul_eq_sum_pow_boostAverageZ hc 1 d + have h2 := pow_mul_eq_sum_pow_boostAverageZ hc 2 d + have h3 := pow_mul_eq_sum_pow_boostAverageZ hc 3 d + simp only [pow_one] at h1 + rw [show (∑ 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) from by + simp only [Finset.mul_sum, ← Finset.sum_sub_distrib, ← Finset.sum_add_distrib] + refine Finset.sum_congr rfl fun e _ => ?_ + rw [Q_eq_poly] + push_cast [Matrix.sub_apply, Matrix.add_apply, Matrix.smul_apply, smul_eq_mul] + ring, ← h1, ← h2, ← h3] + ring + /-- The certificate applied to an invariant coefficient tensor: `192 c = 48 η (η ⬝ c)`, so every invariant coefficient tensor is a multiple of the metric. -/ lemma eq_smul_minkowskiMatrixZ {c : (Fin 2 → Fin 1 ⊕ Fin 3) → ℂ} (hc : IsInvariantCoeff c) (d : Fin 2 → Fin 1 ⊕ Fin 3) : c d = ((4 : ℂ)⁻¹ * ∑ e, ((minkowskiMatrixZ (e 0) (e 1) : ℤ) : ℂ) * c e) * ((minkowskiMatrixZ (d 0) (d 1) : ℤ) : ℂ) := by - have hQ : ∑ e, ((Q d e : ℤ) : ℂ) * c e = (192 : ℂ) * c d := by - have h1 := pow_mul_eq_sum_pow_boostAverageZ hc 1 d - have h2 := pow_mul_eq_sum_pow_boostAverageZ hc 2 d - have h3 := pow_mul_eq_sum_pow_boostAverageZ hc 3 d - simp only [pow_one] at h1 - rw [show (∑ 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) from by - simp only [Finset.mul_sum, ← Finset.sum_sub_distrib, ← Finset.sum_add_distrib] - refine Finset.sum_congr rfl fun e _ => ?_ - rw [Q_eq_poly] - push_cast [Matrix.sub_apply, Matrix.add_apply, Matrix.smul_apply, smul_eq_mul] - ring, ← h1, ← h2, ← h3] - ring + have hQ := sum_Q_mul_eq hc d rw [show (∑ e, ((Q d e : ℤ) : ℂ) * c e) = 48 * ((minkowskiMatrixZ (d 0) (d 1) : ℤ) : ℂ) * ∑ e, ((minkowskiMatrixZ (e 0) (e 1) : ℤ) : ℂ) * c e from by @@ -420,7 +427,7 @@ lemma eq_smul_minkowskiMatrixZ {c : (Fin 2 → Fin 1 ⊕ Fin 3) → ℂ} (hc : I /-- Every Lorentz invariant in the span of the components is a multiple of the metric contraction. -/ -theorem exists_smul_metricContraction_of_invariant (hT : IsLorentzTensorFamily 2 B repLorentz T) +theorem exists_smul_metricContraction_of_invariant (hT : IsLorentzCovariant 2 B repLorentz T) {x : B} (hx : x ∈ componentSpan T) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : ∃ a : ℂ, x = a • metricContraction (T := T) := by obtain ⟨c, hc, rfl⟩ := hT.exists_isInvariantCoeff_of_mem_componentSpan hx hinv @@ -450,7 +457,7 @@ lemma mkQ_metricContraction (S : Submodule ℂ B) : /-- The same modulo a Lorentz-stable subspace `S`: a multiple of the metric contraction plus an error in `S`. -/ lemma exists_smul_metricContraction_of_invariant_subset - (hT : IsLorentzTensorFamily 2 B repLorentz T) {x : B} (S : Submodule ℂ B) + (hT : IsLorentzCovariant 2 B repLorentz T) {x : B} (S : Submodule ℂ B) (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) (hx : x ∈ componentSpan T ⊔ S) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : ∃ a : ℂ, ∃ y ∈ S, x = a • metricContraction (T := T) + y := by @@ -463,6 +470,6 @@ lemma exists_smul_metricContraction_of_invariant_subset abel rwa [Submodule.ker_mkQ] at hker -end BiLorentz +end RankTwo end Lorentz From 5589e23dde62da95d6f7e4d9467cf63ecc111680 Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Sun, 20 Sep 2026 22:38:28 +0400 Subject: [PATCH 333/367] refactor: clean up weyl invariance --- Physlib.lean | 1 + Physlib/Mathematics/LinearCombination.lean | 40 ++ Physlib/Particles/StandardModel/Peeling.lean | 5 +- .../Relativity/Fermions/Weyl/BoostWeight.lean | 107 ++- Physlib/Relativity/Fermions/Weyl/Metric.lean | 60 ++ .../Relativity/LorentzGroup/Boosts/Axis.lean | 6 + .../LorentzGroup/Invariants/Basic.lean | 67 +- .../LorentzGroup/Invariants/IsBiLeftWeyl.lean | 472 ++++--------- .../Invariants/IsLeftRightWeyl.lean | 252 ++----- .../Invariants/IsVectorLeftRightWeyl.lean | 624 ++++++------------ .../Invariants/LorentzCovariance.lean | 9 + .../LorentzGroup/Invariants/RankTwo.lean | 16 + .../Relativity/PauliMatrices/SelfAdjoint.lean | 24 + Physlib/Relativity/SL2C/Basic.lean | 42 ++ 14 files changed, 734 insertions(+), 991 deletions(-) create mode 100644 Physlib/Mathematics/LinearCombination.lean diff --git a/Physlib.lean b/Physlib.lean index 06f241d65..6fadd45bf 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -216,6 +216,7 @@ public import Physlib.Mathematics.InnerProductSpace.Submodule public import Physlib.Mathematics.KroneckerDelta.Basic public import Physlib.Mathematics.KroneckerDelta.Contraction public import Physlib.Mathematics.LeviCivita.Basic +public import Physlib.Mathematics.LinearCombination public import Physlib.Mathematics.LinearMaps public import Physlib.Mathematics.LinearPMap public import Physlib.Mathematics.List diff --git a/Physlib/Mathematics/LinearCombination.lean b/Physlib/Mathematics/LinearCombination.lean new file mode 100644 index 000000000..6e5bbc86b --- /dev/null +++ b/Physlib/Mathematics/LinearCombination.lean @@ -0,0 +1,40 @@ +/- +Copyright (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 +-/ +module + +public import Mathlib.Algebra.BigOperators.Group.Finset.Sigma +public import Mathlib.Algebra.BigOperators.GroupWithZero.Action +public import Mathlib.Algebra.Module.BigOperators +public import Mathlib.Algebra.Module.LinearMap.Defs +/-! +# Finite linear combinations under a linear map + +A family `T : ι → B` of vectors of a module, indexed by a finite type, has the combinations +`∑ i, c i • T i` for coefficients `c : ι → R`. Two bookkeeping identities about them: contracting +against coefficients moved by a matrix regroups as the same combination of the matrix-moved +components, and a linear map given on the family by a matrix moves a combination by that matrix +acting on the coefficients. +-/ + +@[expose] public section + +variable {ι κ R B B' : Type*} [Fintype ι] [Fintype κ] [CommSemiring R] + [AddCommMonoid B] [Module R B] [AddCommMonoid B'] [Module R B'] + +/-- Contracting the components against coefficients moved by a matrix is the original + combination of the matrix-moved components. -/ +lemma Fintype.sum_sum_mul_smul (M : ι → κ → R) (c : κ → R) (T : ι → B) : + ∑ a, (∑ d, c d * M a d) • T a = ∑ d, c d • ∑ a, M a d • T a := by + simp only [Finset.sum_smul, Finset.smul_sum, mul_smul] + exact Finset.sum_comm + +/-- A linear map that moves each component of a family by a matrix moves a combination of the + components by that matrix acting on the coefficients, with the free index first. -/ +lemma LinearMap.map_sum_smul_of_forall_eq (φ : B →ₗ[R] B') (T : ι → B) (T' : κ → B') + (M : κ → ι → R) (hT : ∀ l, φ (T l) = ∑ a, M a l • T' a) (c : ι → R) : + φ (∑ l, c l • T l) = ∑ a, (∑ l, c l * M a l) • T' a := by + rw [map_sum, Fintype.sum_sum_mul_smul] + exact Finset.sum_congr rfl fun l _ => by rw [map_smul, hT] diff --git a/Physlib/Particles/StandardModel/Peeling.lean b/Physlib/Particles/StandardModel/Peeling.lean index 0f5a9d67a..fc67c986f 100644 --- a/Physlib/Particles/StandardModel/Peeling.lean +++ b/Physlib/Particles/StandardModel/Peeling.lean @@ -456,10 +456,7 @@ noncomputable def Step.ofVectorDualLeftRightWeyl {B : Type*} [AddCommGroup B] [M (hT : IsVectorDualLeftRightWeyl B repLorentz T) : Step (fun Λ : SL(2,ℂ) => repLorentz Λ) (⨆ q, ℂ ∙ T q) where contraction := IsVectorDualLeftRightWeyl.pauliBarContraction (T := T) - stable := isStableUnder_iSup_span_singleton_of_sum fun Λ q => by - refine ⟨fun a => ((((SL2C.toLorentzGroup Λ).1 a.1 q.1 : ℝ) : ℂ) - * ((Λ.1⁻¹)ᵀ a.2.1 q.2.1 * (Λ.1⁻¹)ᴴ a.2.2 q.2.2)), ?_⟩ - rw [show q = (q.1, q.2) from rfl, hT.repLorentz_T, Fintype.sum_prod_type] + stable := isStableUnder_iSup_span_singleton_of_sum fun Λ q => ⟨_, hT.repLorentz_T' Λ q⟩ contraction_fixed Λ := hT.repLorentz_pauliBarContraction Λ classify S hS _ hx hinv := hT.exists_smul_pauliBarContraction_of_invariant_subset S hS hx hinv diff --git a/Physlib/Relativity/Fermions/Weyl/BoostWeight.lean b/Physlib/Relativity/Fermions/Weyl/BoostWeight.lean index d833dbff6..396071f7a 100644 --- a/Physlib/Relativity/Fermions/Weyl/BoostWeight.lean +++ b/Physlib/Relativity/Fermions/Weyl/BoostWeight.lean @@ -13,7 +13,14 @@ public import Physlib.Relativity.LorentzGroup.Boosts.WeightGrading 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. +the second weight `-1`. A Weyl spinor is a half-vector (A). + +Along a general axis the boost is the `z`-boost conjugated by `SL2C.rotationZToAxis`, so the +columns of that rotation are boost eigenvectors of the same weights. Section B records them as +explicit coefficient vectors on the standard Weyl basis, for a left-handed index and, through +the conjugate boost, for a right-handed one, with the matrices writing the standard basis back. +Their normalisation is not uniform across the axes and is kept as it is. Section C is the weight +of a pair of Weyl indices. -/ @@ -23,7 +30,13 @@ namespace Lorentz open Matrix MatrixGroups -/-- **The boost weight of a Weyl-spinor index.** Along the `z`-axis the `SL(2,ℂ)` boost is +/-! + +## A. The boost weight along the `z`-axis + +-/ + +/-- 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 @@ -48,4 +61,94 @@ lemma leftHandedWeyl_rep_boostAxis_two_basis (t : ℝ) (ht : t ≠ 0) (k : Fin 2 fin_cases k <;> simp [weylWeight, Fin.sum_univ_two] +/-! + +## B. The Weyl weight bases along a spatial axis + +-/ + +/-- 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 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 [SL2C.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 + +/-! + +## C. The weight of a pair of Weyl indices + +-/ + +/-- 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 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] + end Lorentz diff --git a/Physlib/Relativity/Fermions/Weyl/Metric.lean b/Physlib/Relativity/Fermions/Weyl/Metric.lean index b58764ff8..0fe2296d0 100644 --- a/Physlib/Relativity/Fermions/Weyl/Metric.lean +++ b/Physlib/Relativity/Fermions/Weyl/Metric.lean @@ -362,3 +362,63 @@ lemma dualRightContraction_apply_metric : end end Fermion + +/-! + +## The symplectic form as an element of `SL(2,ℂ)` + +`ε = metricRaw` has determinant one, so it lies in `SL(2,ℂ)`, and `gᵀ ε g = ε` for every `g` +there. The single-index identities move a factor of `(g⁻¹)ᵀ` or `(g⁻¹)ᴴ` across `ε`, where it +becomes a factor of `g` or of its conjugate on the other slot: they are `metricRaw_comm` and +`metricRaw_comm_star` at `g⁻¹`, read entrywise. + +-/ + +namespace Lorentz.SL2C + +open Matrix MatrixGroups + +/-- The antisymmetric symplectic form `ε = !![0, 1; -1, 0]`, the Weyl metric + `Fermion.metricRaw`, as an element of `SL(2,ℂ)`. -/ +def epsilon : SL(2,ℂ) := + ⟨Fermion.metricRaw, by simp [Fermion.metricRaw, Matrix.det_fin_two_of]⟩ + +/-- The matrix underlying `epsilon`. -/ +lemma epsilon_coe : (epsilon : Matrix (Fin 2) (Fin 2) ℂ) = !![0, 1; -1, 0] := rfl + +/-- The matrix underlying `epsilon` is the Weyl metric `Fermion.metricRaw`. -/ +lemma epsilon_coe_metricRaw : (epsilon : Matrix (Fin 2) (Fin 2) ℂ) = Fermion.metricRaw := rfl + +/-- The entries of `ε` are real. -/ +lemma star_epsilon_apply (l k : Fin 2) : star (epsilon.1 l k) = epsilon.1 l k := by + fin_cases l <;> fin_cases k <;> simp [epsilon_coe] + +/-- `ε g⁻¹ = gᵀ ε`: `Fermion.metricRaw_comm` at `g⁻¹`. -/ +lemma epsilon_mul_inv (g : SL(2,ℂ)) : epsilon.1 * g.1⁻¹ = g.1ᵀ * epsilon.1 := by + have h := Fermion.metricRaw_comm g⁻¹ + rw [inverse_coe g⁻¹, inv_inv, ← inverse_coe g] at h + exact h + +/-- `ε` is the invariant symplectic form of `SL(2,ℂ)`: `gᵀ ε g = ε`. -/ +lemma transpose_mul_epsilon_mul (g : SL(2,ℂ)) : g.1ᵀ * epsilon.1 * g.1 = epsilon.1 := by + rw [← epsilon_mul_inv, Matrix.mul_assoc, Matrix.nonsing_inv_mul _ (by simp), Matrix.mul_one] + +/-- Single-index form: a factor of `(g⁻¹)ᵀ` moved across `ε` becomes a factor of `g` on the + other slot. -/ +lemma sum_epsilon_mul_inv_transpose (g : SL(2,ℂ)) (l a : Fin 2) : + ∑ k : Fin 2, epsilon.1 l k * (g.1⁻¹)ᵀ a k = ∑ b : Fin 2, g.1 b l * epsilon.1 b a := by + have h : (epsilon.1 * g.1⁻¹) l a = (g.1ᵀ * epsilon.1) l a := by rw [epsilon_mul_inv] + simpa [Matrix.mul_apply, Matrix.transpose_apply] using h + +/-- The conjugate single-index form: a factor of `(g⁻¹)ᴴ` moved across `ε` becomes a factor of + the conjugate of `g` on the other slot. -/ +lemma sum_epsilon_mul_inv_conjTranspose (g : SL(2,ℂ)) (l a : Fin 2) : + ∑ k : Fin 2, epsilon.1 l k * (g.1⁻¹)ᴴ a k + = ∑ b : Fin 2, star (g.1 b l) * epsilon.1 b a := by + have h0 := Fermion.metricRaw_comm_star g⁻¹ + rw [inverse_coe g⁻¹, inv_inv, ← inverse_coe g] at h0 + have h : (epsilon.1 * (g.1⁻¹).map star) l a = (g.1ᴴ * epsilon.1) l a := by + rw [epsilon_coe_metricRaw, h0] + simpa [Matrix.mul_apply, Matrix.conjTranspose_apply, Matrix.map_apply] using h + +end Lorentz.SL2C diff --git a/Physlib/Relativity/LorentzGroup/Boosts/Axis.lean b/Physlib/Relativity/LorentzGroup/Boosts/Axis.lean index d626b6953..f78a5c015 100644 --- a/Physlib/Relativity/LorentzGroup/Boosts/Axis.lean +++ b/Physlib/Relativity/LorentzGroup/Boosts/Axis.lean @@ -136,6 +136,12 @@ 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] +/-- Hermiticity read on the entries: conjugating an entry of an axis boost transposes it. -/ +lemma star_boostAxis_apply (i : Fin 3) (t : ℝ) (ht : t ≠ 0) (β α : Fin 2) : + star ((boostAxis i t ht).1 β α) = (boostAxis i t ht).1 α β := by + have h := congrFun (congrFun (boostAxis_conjTranspose i t ht) α) β + rwa [Matrix.conjTranspose_apply] at h + /-! ## B. Axis conjugation diff --git a/Physlib/Relativity/LorentzGroup/Invariants/Basic.lean b/Physlib/Relativity/LorentzGroup/Invariants/Basic.lean index d82c88f74..d4825743c 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/Basic.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/Basic.lean @@ -6,6 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Relativity.LightConeDeriv +public import Physlib.Mathematics.LinearCombination public import Mathlib.Analysis.InnerProductSpace.Projection.Basic /-! # Invariants of the span of a family of components @@ -36,8 +37,8 @@ transpose is the same product for the transposed matrix, which is again a Lorent from `SL(2,ℂ)`, so `exists_isInvariantCoeff_of_mem_span` applies. Writing each slot of a coefficient tensor in the light-cone basis of an axis splits it into pieces that a boost scales by powers of its parameter, and an invariant keeps only the piece of weight zero: -`IsInvariantCoeff.lightConeComponent_eq_zero`. The Weyl patterns have their own weight bases, -built in the files that need them on top of the second step. +`IsInvariantCoeff.lightConeComponent_eq_zero`. The Weyl patterns run the same argument on the +second step with the Weyl weight bases of `Fermions.Weyl.BoostWeight`. -/ @[expose] public section @@ -125,6 +126,10 @@ The coefficients then move by `actMat M_g`, whose adjoint is the action of the c transpose of `M_g`. So the hypothesis of A reads: for every `g` some `g'` has `M_{g'}` the conjugate transpose of `M_g`. In every case below `g'` is `g†`. +The weight argument is also generic: a covector that the transposed matrix reproduces up to a +scalar reads off a component that `actMat M_g` scales by that scalar, so an invariant +coefficient function has no such component unless the scalar is `1`. + -/ section Mat @@ -164,15 +169,38 @@ theorem exists_invariantCoeff_matrix (T : ι → B) (φ : G → B →ₗ[ℂ] B) {x : B} (hx : x ∈ ⨆ i, ℂ ∙ T i) (hinv : ∀ g, φ g x = x) : ∃ c : ι → ℂ, (∀ g, actMat (M g) c = c) ∧ x = ∑ i, c i • T i := by obtain ⟨c, hc, hinvc⟩ := exists_invariantCoeff T φ (fun g => actMatₗ (M g)) - (fun g c => by - simp only [map_sum, map_smul, hT, Finset.smul_sum, smul_smul, actMatₗ, LinearMap.coe_mk, - AddHom.coe_mk, actMat, Finset.sum_smul] - exact Finset.sum_comm) + (fun g c => (φ g).map_sum_smul_of_forall_eq T T (M g) (hT g) c) (fun g => by obtain ⟨g', hg'⟩ := hM g exact ⟨g', fun u v => inner_actMat (M g) (M g') hg' u v⟩) hx hinv exact ⟨c, hinvc, hc⟩ +/-- A covector `P` that the transposed matrix reproduces up to a scalar `k` reads off a + component of the coefficients that `actMat M` scales by `k`. -/ +lemma sum_mul_actMat (M : ι → ι → ℂ) (P c : ι → ℂ) (k : ℂ) + (hP : ∀ d, ∑ a, P a * M a d = k * P d) : + ∑ a, P a * actMat M c a = k * ∑ a, P a * c a := by + simp only [actMat, Finset.mul_sum] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl fun d _ => ?_ + rw [← mul_assoc, mul_comm _ (c d), ← hP d, Finset.mul_sum] + exact Finset.sum_congr rfl fun a _ => by ring + +/-- A coefficient function fixed by `actMat M` has no component along a covector that the + transposed matrix scales by an eigenvalue other than `1`. -/ +lemma sum_mul_eq_zero_of_actMat_eq (M : ι → ι → ℂ) {P c : ι → ℂ} (hc : actMat M c = c) {k : ℂ} + (hP : ∀ d, ∑ a, P a * M a d = k * P d) (hk : k ≠ 1) : + ∑ a, P a * c a = 0 := by + have h := sum_mul_actMat M P c k hP + rw [hc] at h + exact (mul_left_eq_self₀.1 h.symm).resolve_left hk + +/-- The boost with parameter `2` distinguishes every nonzero weight: `2 ^ w ≠ 1` for `w ≠ 0`. -/ +lemma two_zpow_ne_one {w : ℤ} (hw : w ≠ 0) : ((2 : ℝ) : ℂ) ^ w ≠ 1 := by + rw [← Complex.ofReal_zpow, Ne, Complex.ofReal_eq_one, + zpow_eq_one_iff_right₀ (by norm_num) (by norm_num)] + exact hw + end Mat /-! @@ -219,9 +247,8 @@ lemma repLorentz_sum_smul {T : (Fin n → Fin 1 ⊕ Fin 3) → B} (hT : ∀ (g : SL(2,ℂ)) l, repLorentz g (T l) = ∑ a : Fin n → Fin 1 ⊕ Fin 3, (∏ i, (((SL2C.toLorentzGroup g).1 (a i) (l i) : ℝ) : ℂ)) • T a) (g : SL(2,ℂ)) (c : (Fin n → Fin 1 ⊕ Fin 3) → ℂ) : - repLorentz g (∑ d, c d • T d) = ∑ a, act (SL2C.toLorentzGroup g).1 c a • T a := by - simp only [map_sum, map_smul, hT, Finset.smul_sum, smul_smul, act, Finset.sum_smul] - exact Finset.sum_comm + repLorentz g (∑ d, c d • T d) = ∑ a, act (SL2C.toLorentzGroup g).1 c a • T a := + (repLorentz g).map_sum_smul_of_forall_eq T T _ (hT g) c /-- Contracting the components with an invariant coefficient tensor gives a vector fixed by the representation. -/ @@ -267,12 +294,8 @@ lemma lightConeComponent_act (i : Fin 3) (Λ : Matrix (Fin 1 ⊕ Fin 3) (Fin 1 ∑ a : Fin n → Fin 1 ⊕ Fin 3, (∏ s, lightConeCoeff i (κ s) (a s)) * ∏ s, ((Λ (a s) (d s) : ℝ) : ℂ) = k * ∏ s, lightConeCoeff i (κ s) (d s)) : - lightConeComponent i (act Λ c) κ = k * lightConeComponent i c κ := by - simp only [lightConeComponent, act, Finset.mul_sum] - rw [Finset.sum_comm] - refine Finset.sum_congr rfl fun d _ => ?_ - rw [← mul_assoc, mul_comm _ (c d), ← hΛ d, Finset.mul_sum] - exact Finset.sum_congr rfl fun a _ => by ring + lightConeComponent i (act Λ c) κ = k * lightConeComponent i c κ := + sum_mul_actMat _ _ c k hΛ /-- The Lorentz matrix of a boost is symmetric. -/ lemma toLorentzGroup_boostAxis_symm (i : Fin 3) {t : ℝ} (ht : t ≠ 0) (a b : Fin 1 ⊕ Fin 3) : @@ -295,14 +318,12 @@ lemma lightConeComponent_act_boostAxis (i : Fin 3) (c : (Fin n → Fin 1 ⊕ Fin lemma IsInvariantCoeff.lightConeComponent_eq_zero {c : (Fin n → Fin 1 ⊕ Fin 3) → ℂ} (hc : IsInvariantCoeff c) (i : Fin 3) {κ : Fin n → Fin 4} (hκ : ∑ s, lightConeWeight (κ s) ≠ 0) : - lightConeComponent i c κ = 0 := by - have h := lightConeComponent_act_boostAxis i c κ (two_ne_zero (α := ℝ)) - rw [hc] at h - have h2 : ((2 : ℝ) : ℂ) ^ (∑ s, lightConeWeight (κ s)) ≠ 1 := by - rw [← Complex.ofReal_zpow, Ne, Complex.ofReal_eq_one, - zpow_eq_one_iff_right₀ (by norm_num) (by norm_num)] - exact hκ - exact (mul_left_eq_self₀.1 h.symm).resolve_left h2 + lightConeComponent i c κ = 0 := + sum_mul_eq_zero_of_actMat_eq _ (hc (SL2C.boostAxis i 2 two_ne_zero)) + (fun d => by + simpa only [toLorentzGroup_boostAxis_symm i two_ne_zero (d _)] using + sum_prod_lightConeCoeff i κ d two_ne_zero) + (two_zpow_ne_one hκ) /-- A coefficient tensor is recovered from its light-cone components. -/ lemma eq_sum_lightConeComponent (i : Fin 3) (c : (Fin n → Fin 1 ⊕ Fin 3) → ℂ) diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsBiLeftWeyl.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsBiLeftWeyl.lean index 76070ca03..42921258f 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsBiLeftWeyl.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsBiLeftWeyl.lean @@ -10,39 +10,34 @@ public import Physlib.Relativity.Fermions.Weyl.Metric /-! # Lorentz invariants of two left-handed Weyl indices -Two Weyl spinors of the same handedness have exactly one Lorentz-invariant contraction, -the antisymmetric one +Every Lorentz invariant in the span of the components of a family `T^{α₁ α₂}` carrying two +left-handed Weyl indices is a multiple of the antisymmetric contraction -`epsilonContraction = ε_{α β} ψ^α χ^β`, +`epsilonContraction = ε_{α β} T^{α β}`, -which is the shape of a Dirac or Majorana mass term. There is nothing else: `SL(2,ℂ)` -preserves the determinant on a pair of fundamental indices and no more. That is +the shape of a Majorana or Dirac mass term. That is `exists_smul_epsilonContraction_of_invariant`, with `exists_smul_epsilonContraction_of_invariant_subset` the same statement modulo a -Lorentz-stable subspace `S`; `repLorentz_epsilonContraction` checks that the contraction -is invariant. +Lorentz-stable subspace `S`; `repLorentz_epsilonContraction` checks that the contraction is +invariant. The components are vectors `T a` of a complex vector space `B` carrying a representation -`repLorentz` of `SL(2,ℂ)`, indexed by two left-handed Weyl indices, and `IsBiLeftWeyl` -says the group moves each index by the matrix of `g` (B). `hT.span` is the set of their -combinations. - -An invariant of the span is `∑_a c_a • T a` for a coefficient function `c` that the group -itself fixes (B, from `Invariants.Basic`), and the proof is then the same-handedness twin of -`IsLeftRightWeyl`, reusing its Weyl weight bases (A, C). The coefficients transform -contragrediently, so their weight basis is the conjugate of the components'. An invariant has -weight `0` along every axis, so it is fixed by the weight-zero projection along each; averaging -the three gives `M = 2 - swap` (D), and `M c = 3 c` says exactly that `c` is antisymmetric, -which is the `ε` contraction (E). Section F divides out `S`. - -Sections G to K handle dual Weyl indices, which transform by the contragredient -`(Λ⁻¹)ᵀ`, or for a barred species by `(Λ⁻¹)ᴴ`. Neither is the fundamental law, and two -separate mechanisms bridge the gap. The contragredient is inner, `(Λ⁻¹)ᵀ = ε Λ ε⁻¹`, so -re-indexing both slots by `ε` turns a contragredient family into a fundamental one -without touching the representation (G, J). Entrywise conjugation is instead an -automorphism of `SL(2,ℂ)` (H), so a conjugated family is a fundamental family for the -twisted representation `repLorentz.comp conjHom`; the twist is by a surjection, so -invariance is the same condition for both and the classification carries over (I, K). +`repLorentz` of `SL(2,ℂ)`, and `IsBiLeftWeyl` says the group moves each index by the matrix +of `g` (B). An invariant of `componentSpan T` is `∑_a c_a • T a` for a coefficient function `c` +fixed by the action `act` (B, from `Invariants.Basic`), and the argument is the same-handedness +twin of `IsLeftRightWeyl`: the coefficients move by the component matrix `g_{a₁ l₁} g_{a₂ l₂}` +applied to `c`, whose left eigenvectors for an axis boost take the conjugated Weyl weight basis +on both slots (A, C). An invariant is fixed by the weight-zero projection along each axis; the +three projections sum to `2 - swap` (D), and `M c = 3 c` says exactly that `c` is antisymmetric, +which is the `ε` symbol (E). Section F divides out `S`. + +Sections G and H transport the classification to dual Weyl indices, which transform by +`(g⁻¹)ᵀ` on an undotted slot and by `(g⁻¹)ᴴ` on a dotted one. The symplectic form `ε` of +`Fermions.Weyl.Metric` satisfies `ε g⁻¹ = gᵀ ε`, so re-indexing both slots by `ε` turns a +dual family into a fundamental one for the same representation. Entrywise conjugation is the +involutive automorphism `SL2C.conjHom` of `SL(2,ℂ)`, so a dotted family is an undotted one for +the twisted representation `repLorentz.comp conjHom`, and invariance under the twist is +invariance under `repLorentz`, the twist being surjective. -/ @[expose] public section @@ -55,10 +50,10 @@ open TensorProduct Matrix MatrixGroups SL2C Invariants ## 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`. What is graded -here is the coefficient function, which transforms contragrediently, so both slots take the -conjugated basis. +Both indices are graded by the Weyl weight basis of `Fermions.Weyl.BoostWeight`, so the weight +basis of the pair is its tensor square and the weight is `pairWeight`. The axis boosts are +Hermitian, so as left eigenvectors of the coefficient matrix both slots take the conjugated +basis. -/ @@ -86,8 +81,8 @@ lemma sum_biLeftCoeffInv_mul (i : Fin 3) (α β : Fin 2 × Fin 2) : obtain ⟨β₁, β₂⟩ := β by_cases h1 : α₁ = β₁ <;> by_cases h2 : α₂ = β₂ <;> simp [h1, h2, Prod.mk.injEq] -/-- The pair weight basis diagonalises the axis-`i` boost on coefficients, with the weight - `pairWeight`. -/ +/-- The pair weight basis consists of left eigenvectors of the coefficient matrix + `g_{a₁ l₁} g_{a₂ l₂}` of the axis-`i` boost, with eigenvalue `t ^ pairWeight κ`. -/ lemma sum_boostAxis_biLeftCoeff (i : Fin 3) (κ l : Fin 2 × Fin 2) {t : ℝ} (ht : t ≠ 0) : ∑ a : Fin 2 × Fin 2, biLeftCoeff i κ a * ((SL2C.boostAxis i t ht).1 a.1 l.1 * (SL2C.boostAxis i t ht).1 a.2 l.2) @@ -107,15 +102,12 @@ lemma sum_boostAxis_biLeftCoeff (i : Fin 3) (κ l : Fin 2 × Fin 2) {t : ℝ} (h /-! -## B. Bi-left-handed Weyl tensors, their span, and coefficient functions - -`IsBiLeftWeyl B repLorentz T` says the group moves each index of `T^{α₁ α₂}` by the matrix -of `g`, and `hT.span` is the set of combinations `∑ a, c a • T a` of the four components. +## B. Bi-left-handed Weyl tensors and their coefficient functions -/ -/-- 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,ℂ)`. -/ +/-- A family `T` indexed by two left-handed Weyl indices, moved by `repLorentz` as a tensor + `T^{α₁ α₂}`: each index by the matrix of `g`, the summed index first in each factor. -/ structure IsBiLeftWeyl (B : Type*) [AddCommMonoid B] [Module ℂ B] (repLorentz : Representation ℂ SL(2,ℂ) B) (T : Fin 2 × Fin 2 → B) : Prop where @@ -129,18 +121,8 @@ variable {B : Type*} [AddCommGroup B] [Module ℂ B] {T : Fin 2 × Fin 2 → B} (hT : IsBiLeftWeyl B repLorentz T) -set_option linter.unusedVariables false in -/-- The span of the components; `hT` is unused, and is present only so it reads `hT.span`. -/ -def span (hT : IsBiLeftWeyl B repLorentz T) : Submodule ℂ B := ⨆ d, ℂ ∙ T d - -/-- A vector lies in the span exactly when it is a combination `∑ d, c d • T d`. -/ -lemma mem_span_iff (x : B) : - x ∈ hT.span ↔ ∃ c : Fin 2 × Fin 2 → ℂ, x = ∑ d, c d • T d := by - rw [span, ← Submodule.span_range_eq_iSup, ← Fintype.range_linearCombination, - LinearMap.mem_range] - simp only [Fintype.linearCombination_apply, eq_comm] - -/-- The action of `g : SL(2,ℂ)` on coefficient functions: one factor of `g` per slot, with +/-- The action of `g : SL(2,ℂ)` on coefficient functions, + `act g c a = ∑ d, c d * (g a.1 d.1 * g a.2 d.2)`: the component matrix applied to `c`, with the free index first in each factor and the summed one second. -/ def act (g : SL(2,ℂ)) (c : Fin 2 × Fin 2 → ℂ) (a : Fin 2 × Fin 2) : ℂ := ∑ d : Fin 2 × Fin 2, c d * (g.1 a.1 d.1 * g.1 a.2 d.2) @@ -151,23 +133,23 @@ def IsInvariantCoeff (c : Fin 2 × Fin 2 → ℂ) : Prop := ∀ g : SL(2,ℂ), a include hT in /-- An invariant of the span is the contraction of an invariant coefficient function: the adjoint of the action of `g` is the action of `g†`. -/ -theorem exists_isInvariantCoeff_of_mem_span {x : B} (hx : x ∈ hT.span) +theorem exists_isInvariantCoeff_of_mem_componentSpan {x : B} (hx : x ∈ componentSpan T) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : ∃ c : Fin 2 × Fin 2 → ℂ, IsInvariantCoeff c ∧ x = ∑ d, c d • T d := by obtain ⟨c, hc, hx'⟩ := Invariants.exists_invariantCoeff_matrix T (fun g => repLorentz g) (fun g a d => g.1 a.1 d.1 * g.1 a.2 d.2) hT.repLorentz_T (fun g => ⟨Invariants.dagger g, fun a d => by simp [Invariants.dagger, Matrix.conjTranspose_apply]⟩) - (by rwa [← span]) hinv + hx hinv exact ⟨c, hc, hx'⟩ /-! ## C. The weight grading of the coefficients -The four products `biLeftCoeff i κ` of two weight covectors read off the weight components of -a coefficient function, and the axis-`i` boost multiplies the component at `κ` by -`t ^ pairWeight κ`. An invariant function has no component of weight `±2`. +The four covectors `biLeftCoeff i κ` read off the weight components of a coefficient function, +and the axis-`i` boost multiplies the component at `κ` by `t ^ pairWeight κ`. An invariant +function has no component of weight `±2`. -/ @@ -179,28 +161,14 @@ def weightComponent (i : Fin 3) (c : Fin 2 × Fin 2 → ℂ) (κ : Fin 2 × Fin lemma weightComponent_act_boostAxis (i : Fin 3) (c : Fin 2 × Fin 2 → ℂ) (κ : Fin 2 × Fin 2) {t : ℝ} (ht : t ≠ 0) : weightComponent i (act (SL2C.boostAxis i t ht) c) κ - = ((t : ℝ) : ℂ) ^ (pairWeight κ) * weightComponent i c κ := by - simp only [weightComponent, act, Finset.mul_sum] - rw [Finset.sum_comm] - refine Finset.sum_congr rfl fun d _ => ?_ - calc ∑ a : Fin 2 × Fin 2, biLeftCoeff i κ a * (c d * ((SL2C.boostAxis i t ht).1 a.1 d.1 - * (SL2C.boostAxis i t ht).1 a.2 d.2)) - = c d * ∑ a : Fin 2 × Fin 2, biLeftCoeff i κ a * ((SL2C.boostAxis i t ht).1 a.1 d.1 - * (SL2C.boostAxis i t ht).1 a.2 d.2) := by - rw [Finset.mul_sum] - exact Finset.sum_congr rfl fun a _ => by ring - _ = _ := by rw [sum_boostAxis_biLeftCoeff i κ d ht]; ring + = ((t : ℝ) : ℂ) ^ (pairWeight κ) * weightComponent i c κ := + sum_mul_actMat _ _ c _ fun l => sum_boostAxis_biLeftCoeff i κ l ht /-- An invariant coefficient function has no weight component of nonzero weight. -/ lemma weightComponent_eq_zero {c : Fin 2 × Fin 2 → ℂ} (hc : IsInvariantCoeff c) (i : Fin 3) - {κ : Fin 2 × Fin 2} (hκ : pairWeight κ ≠ 0) : weightComponent i c κ = 0 := by - have h := weightComponent_act_boostAxis i c κ (two_ne_zero (α := ℝ)) - rw [hc] at h - have h2 : ((2 : ℝ) : ℂ) ^ (pairWeight κ) ≠ 1 := by - rw [← Complex.ofReal_zpow, Ne, Complex.ofReal_eq_one, - zpow_eq_one_iff_right₀ (by norm_num) (by norm_num)] - exact hκ - exact (mul_left_eq_self₀.1 h.symm).resolve_left h2 + {κ : Fin 2 × Fin 2} (hκ : pairWeight κ ≠ 0) : weightComponent i c κ = 0 := + sum_mul_eq_zero_of_actMat_eq _ (hc (SL2C.boostAxis i 2 two_ne_zero)) + (fun l => sum_boostAxis_biLeftCoeff i κ l two_ne_zero) (two_zpow_ne_one hκ) /-- A coefficient function is recovered from its weight components. -/ lemma eq_sum_weightComponent (i : Fin 3) (c : Fin 2 × Fin 2 → ℂ) (α : Fin 2 × Fin 2) : @@ -263,12 +231,12 @@ is that multiple of the `ε` contraction. -/ /-- The `ε` symbol on a pair of same-handedness spinor indices, in the convention of - `Fermion.metricRaw`. -/ + `Fermion.metricRaw`: `epsZ (0, 1) = 1`. -/ 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. -/ +/-- The `ε` contraction `ε_{α β} T^{α β}` of two same-handedness Weyl indices, the shape of a + fermion mass term. -/ noncomputable def epsilonContraction : B := ∑ α : Fin 2 × Fin 2, ((epsZ α : ℤ) : ℂ) • T α @@ -321,10 +289,10 @@ lemma eq_neg_swap {c : Fin 2 × Fin 2 → ℂ} (hc : IsInvariantCoeff c) (β : F 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) +theorem exists_smul_epsilonContraction_of_invariant {x : B} (hx : x ∈ componentSpan T) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : ∃ a : ℂ, x = a • epsilonContraction (T := T) := by - obtain ⟨c, hc, rfl⟩ := hT.exists_isInvariantCoeff_of_mem_span hx hinv + obtain ⟨c, hc, rfl⟩ := hT.exists_isInvariantCoeff_of_mem_componentSpan hx hinv have h00 : c (0, 0) = 0 := by have h := eq_neg_swap hc (0, 0) rw [Prod.swap_prod_mk] at h @@ -345,9 +313,9 @@ theorem exists_smul_epsilonContraction_of_invariant {x : B} (hx : x ∈ hT.span) ## F. The classification modulo a Lorentz-stable submodule -A stable subspace `S` is divided out by passing to the quotient `B ⧸ S`, that is `B` with -`S` declared zero: the classes of the components again form a bi-left-handed tensor, so -the classification applies there and lifts back with an error term in `S`. +A stable subspace `S` is divided out by passing to the quotient `B ⧸ S`: the classes of the +components again form a bi-left-handed tensor, so the classification applies there and lifts +back with an error term in `S`. -/ @@ -375,21 +343,10 @@ include hT in 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) : + (hx : x ∈ componentSpan T ⊔ S) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : ∃ a : ℂ, ∃ y ∈ S, x = a • epsilonContraction (T := T) + y := by - have hT' := hT.isBiLeftWeyl_quotient 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,ℂ), - (repLorentz.quotient S fun g y hy => hS g y hy) g (S.mkQ x) = S.mkQ x := by - intro g - rw [quotient_apply_mkQ, hinv g] - obtain ⟨a, hcomb⟩ := hT'.exists_smul_epsilonContraction_of_invariant hmk hinv' + obtain ⟨a, hcomb⟩ := (hT.isBiLeftWeyl_quotient S hS).exists_smul_epsilonContraction_of_invariant + (mkQ_mem_componentSpan T S hx) fun g => by rw [quotient_apply_mkQ, hinv g] 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 @@ -401,162 +358,22 @@ end IsBiLeftWeyl /-! -## G. The symplectic form and the contragredient as an inner twist - -`ε = !![0, 1; -1, 0]` has determinant one, so it lies in `SL(2,ℂ)`, and `Λᵀ ε Λ = ε` for -every `Λ` there: that is `det Λ = 1` written out. Rearranged it reads -`(Λ⁻¹)ᵀ = ε Λ ε⁻¹`, so the contragredient is the fundamental matrix conjugated by a fixed -group element, a change of basis on the index type rather than of representation. - --/ - -namespace SL2C - -/-- The antisymmetric symplectic form `ε = !![0, 1; -1, 0]`, whose underlying matrix is - the Weyl metric `Fermion.metricRaw`, as an element of `SL(2,ℂ)`. -/ -def epsilon : SL(2,ℂ) := - ⟨Fermion.metricRaw, by simp [Fermion.metricRaw, Matrix.det_fin_two_of]⟩ - -/-- The matrix underlying `epsilon`. -/ -lemma epsilon_coe : (epsilon : Matrix (Fin 2) (Fin 2) ℂ) = !![0, 1; -1, 0] := rfl - -/-- The matrix underlying `epsilon` is the Weyl metric `Fermion.metricRaw`. -/ -lemma epsilon_coe_metricRaw : - (epsilon : Matrix (Fin 2) (Fin 2) ℂ) = Fermion.metricRaw := rfl - -/-- The form `ε` is the invariant symplectic form of `SL(2,ℂ)`: `Λᵀ ε Λ = ε`, which is - the determinant condition `det Λ = 1` written out entrywise. -/ -lemma transpose_mul_epsilon_mul (g : SL(2,ℂ)) : - g.1ᵀ * epsilon.1 * g.1 = epsilon.1 := 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 - ext i j - fin_cases i <;> fin_cases j <;> - simp [epsilon_coe, Matrix.mul_apply, Fin.sum_univ_two] <;> - first | linear_combination | linear_combination hdet | linear_combination -hdet - -/-- The matrix of `ε` times the matrix of its group inverse is the identity. -/ -lemma epsilon_mul_epsilon_inv : epsilon.1 * (epsilon⁻¹ : SL(2,ℂ)).1 = 1 := by - rw [← SpecialLinearGroup.coe_mul, mul_inv_cancel] - rfl - -/-- The contragredient is inner: conjugation by `ε` carries the fundamental matrix `Λ` - to the inverse transpose `(Λ⁻¹)ᵀ`. -/ -lemma inv_transpose_eq_epsilon_conj (g : SL(2,ℂ)) : - (g.1⁻¹)ᵀ = epsilon.1 * g.1 * (epsilon⁻¹ : SL(2,ℂ)).1 := by - symm - calc epsilon.1 * g.1 * (epsilon⁻¹ : SL(2,ℂ)).1 - = ((g.1⁻¹)ᵀ * Fermion.metricRaw) * (epsilon⁻¹ : SL(2,ℂ)).1 := by - rw [epsilon_coe_metricRaw, Fermion.metricRaw_comm] - _ = (g.1⁻¹)ᵀ * (epsilon.1 * (epsilon⁻¹ : SL(2,ℂ)).1) := by - rw [epsilon_coe_metricRaw, Matrix.mul_assoc] - _ = (g.1⁻¹)ᵀ := by rw [epsilon_mul_epsilon_inv, Matrix.mul_one] - -/-- The form of the symplectic identity used to re-index: `ε Λ⁻¹ = Λᵀ ε`. -/ -lemma epsilon_mul_inv_eq_transpose_mul_epsilon (g : SL(2,ℂ)) : - epsilon.1 * g.1⁻¹ = g.1ᵀ * epsilon.1 := by - have hg : g.1 * g.1⁻¹ = 1 := by - rw [SL2C.inverse_coe, ← SpecialLinearGroup.coe_mul, mul_inv_cancel] - rfl - calc epsilon.1 * g.1⁻¹ = (g.1ᵀ * epsilon.1 * g.1) * g.1⁻¹ := by - rw [transpose_mul_epsilon_mul] - _ = g.1ᵀ * epsilon.1 * (g.1 * g.1⁻¹) := by rw [Matrix.mul_assoc] - _ = g.1ᵀ * epsilon.1 := by rw [hg, Matrix.mul_one] - -/-! - -## H. The conjugation automorphism of `SL(2,ℂ)` - -Entrywise conjugation is a monoid homomorphism `SL(2,ℂ) → SL(2,ℂ)`, multiplicative -because conjugation is a ring homomorphism and landing in `SL(2,ℂ)` because -`det (conj Λ) = 1`; it is its own inverse. Unlike the `ε` twist of G this is a genuine -automorphism, so twisting a representation along it gives a different representation. - --/ - -/-- Entrywise conjugation of an element of `SL(2,ℂ)` again has determinant one. -/ -lemma det_map_star (g : SL(2,ℂ)) : (g.1.map star).det = 1 := 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 [Matrix.det_fin_two] - simp only [Matrix.map_apply] - rw [← star_mul', ← star_mul', ← star_sub, hdet, star_one] - -/-- Entrywise complex conjugation as a monoid endomorphism of `SL(2,ℂ)`. -/ -def conjHom : SL(2,ℂ) →* SL(2,ℂ) where - toFun g := ⟨g.1.map star, det_map_star g⟩ - map_one' := by - apply Subtype.ext - ext i j - simp [Matrix.map_apply, Matrix.one_apply] - map_mul' g h := by - apply Subtype.ext - simp [Matrix.SpecialLinearGroup.coe_mul, Matrix.map_mul] - rfl - -/-- The matrix underlying `conjHom g` is the entrywise conjugate of that of `g`. -/ -lemma conjHom_coe (g : SL(2,ℂ)) : (conjHom g).1 = g.1.map star := rfl - -/-- Conjugation is an involution. -/ -lemma conjHom_conjHom (g : SL(2,ℂ)) : conjHom (conjHom g) = g := by - apply Subtype.ext - ext i j - simp [conjHom_coe, Matrix.map_apply] - -/-- Being an involution, conjugation is surjective. -/ -lemma conjHom_surjective : Function.Surjective conjHom := - fun g => ⟨conjHom g, conjHom_conjHom g⟩ - -/-- Being an involution, conjugation is bijective. -/ -lemma conjHom_bijective : Function.Bijective conjHom := - Function.bijective_iff_has_inverse.2 ⟨conjHom, conjHom_conjHom, conjHom_conjHom⟩ - -end SL2C - -/-! - -## I. Transfer of invariance along a surjective endomorphism +## G. Dual-index families and the `ε` re-index -Twisting by a surjective monoid endomorphism `σ` does not change what invariance means: -`rep g x = x` and `rep (σ g) x = x` range over the same group elements. That is what -makes the conjugation twist of H free. - --/ - -/-- Invariance under a representation and invariance under its twist by a surjective - monoid endomorphism of the group are the same condition. -/ -lemma forall_comp_apply_eq_self_iff {k G V : Type*} [CommSemiring k] [Monoid G] - [AddCommMonoid V] [Module k V] (rep : Representation k G V) {σ : G →* G} - (hσ : Function.Surjective σ) (x : V) : - (∀ g : G, (rep.comp σ) g x = x) ↔ ∀ g : G, rep g x = x := by - constructor - · intro h g - obtain ⟨g', rfl⟩ := hσ g - exact h g' - · intro h g - exact h (σ g) - -/-! - -## J. Dual-index families and the `ε` re-index - -`IsBiDualLeftWeyl` and `IsBiDualRightWeyl` are the laws the Standard Model's fermion -symbols carry: one factor of `(Λ⁻¹)ᵀ` per index for an undotted pair, one of `(Λ⁻¹)ᴴ` for -a dotted pair. The re-index `epsReindex` sends both slots through `ε`. By G it converts -the contragredient law into the fundamental one and leaves the representation alone; it is -an involution, so the span is unchanged; and it leaves the `ε` contraction exactly as it -was, with no sign or scalar. For a dotted family the same re-index works once the -representation is twisted by `conjHom`, conjugating the group argument undoing the -conjugation of the entries. Neither law is vacuous: -`isBiDualLeftWeyl_dualLeftHandedWeyl` and `isBiDualRightWeyl_dualRightHandedWeyl` check -they are what the tensor squares of the repo's dual Weyl representations carry. +`IsBiDualLeftWeyl` and `IsBiDualRightWeyl` are the laws the Standard Model's fermion symbols +carry: one factor of `(g⁻¹)ᵀ` per index for an undotted pair, one of `(g⁻¹)ᴴ` for a dotted +pair; `isBiDualLeftWeyl_dualLeftHandedWeyl` and `isBiDualRightWeyl_dualRightHandedWeyl` pin +them to the tensor squares of the repository's dual Weyl representations. The re-index +`epsReindex` sends both slots through `ε`: it converts the undotted law into the fundamental +one for the same representation, is an involution, leaves the span unchanged and leaves the +`ε` contraction exactly as it was, with no sign or scalar. For a dotted family the same +re-index works once the representation is twisted by `SL2C.conjHom`, conjugating the group +argument undoing the conjugation of the entries. -/ /-- A family `T` indexed by two dual left-handed Weyl indices, moved as `T_{α₁ α₂}`: one factor - of the contragredient matrix `(Λ⁻¹)ᵀ` per index. -/ + of the inverse transpose `(g⁻¹)ᵀ` per index. -/ structure IsBiDualLeftWeyl (B : Type*) [AddCommMonoid B] [Module ℂ B] (repLorentz : Representation ℂ SL(2,ℂ) B) (T : Fin 2 × Fin 2 → B) : Prop where @@ -564,7 +381,8 @@ structure IsBiDualLeftWeyl (B : Type*) [AddCommMonoid B] [Module ℂ B] repLorentz g (T l) = ∑ (a : Fin 2 × Fin 2), ((g.1⁻¹)ᵀ a.1 l.1 * (g.1⁻¹)ᵀ a.2 l.2) • T a -/-- The same for two dual right-handed indices, `T_{α̇₁ α̇₂}`: one factor of `(Λ⁻¹)ᴴ` per index. -/ +/-- The same for two dual right-handed indices, `T_{α̇₁ α̇₂}`: one factor of the inverse + conjugate transpose `(g⁻¹)ᴴ` per index. -/ structure IsBiDualRightWeyl (B : Type*) [AddCommMonoid B] [Module ℂ B] (repLorentz : Representation ℂ SL(2,ℂ) B) (T : Fin 2 × Fin 2 → B) : Prop where @@ -574,7 +392,7 @@ structure IsBiDualRightWeyl (B : Type*) [AddCommMonoid B] [Module ℂ B] open Fermion in /-- The tensor square of the dual left-handed Weyl representation, on the products of - basis vectors, is the basic example of a family with the contragredient index law. -/ + basis vectors, carries the undotted dual law. -/ lemma isBiDualLeftWeyl_dualLeftHandedWeyl : IsBiDualLeftWeyl (DualLeftHandedWeyl ⊗[ℂ] DualLeftHandedWeyl) (DualLeftHandedWeyl.rep.tprod DualLeftHandedWeyl.rep) @@ -589,8 +407,8 @@ lemma isBiDualLeftWeyl_dualLeftHandedWeyl : rw [mul_comm] open Fermion in -/-- The tensor square of the dual right-handed Weyl representation carries the conjugate - contragredient law: the basic example. -/ +/-- The tensor square of the dual right-handed Weyl representation carries the dotted dual + law. -/ lemma isBiDualRightWeyl_dualRightHandedWeyl : IsBiDualRightWeyl (DualRightHandedWeyl ⊗[ℂ] DualRightHandedWeyl) (DualRightHandedWeyl.rep.tprod DualRightHandedWeyl.rep) @@ -647,34 +465,18 @@ lemma epsilonContraction_epsReindex : epsReindex_zero_one, epsReindex_one_zero] abel -/-- Every re-indexed component lies in the span of the original components. -/ -lemma epsReindex_mem_iSup (d : Fin 2 × Fin 2) : epsReindex T d ∈ ⨆ e, ℂ ∙ T e := - sum_mem fun k _ => Submodule.smul_mem _ _ - (Submodule.mem_iSup_of_mem k (Submodule.mem_span_singleton_self _)) - /-- The re-index does not change the span of the components. -/ -lemma iSup_span_epsReindex : (⨆ d, ℂ ∙ epsReindex T d) = ⨆ d, ℂ ∙ T d := by - refine le_antisymm (iSup_le fun d => ?_) (iSup_le fun d => ?_) - · rw [Submodule.span_singleton_le_iff_mem] - exact epsReindex_mem_iSup T d - · rw [Submodule.span_singleton_le_iff_mem] - have h : T d = epsReindex (epsReindex T) d := by rw [epsReindex_epsReindex] - rw [h] - exact epsReindex_mem_iSup (epsReindex T) d +lemma componentSpan_epsReindex : componentSpan (epsReindex T) = componentSpan T := by + refine le_antisymm ((componentSpan_le_iff _ _).2 fun d => sum_smul_mem_componentSpan T _) + ((componentSpan_le_iff _ _).2 fun d => ?_) + have h : T d = epsReindex (epsReindex T) d := by rw [epsReindex_epsReindex] + rw [h] + exact sum_smul_mem_componentSpan (epsReindex T) _ end Reindex -/-- The single-index form of the symplectic identity: moving a contragredient factor - across `ε` turns it into a fundamental factor acting on the other slot. -/ -lemma sum_epsilon_mul_inv_transpose (g : SL(2,ℂ)) (l a : Fin 2) : - ∑ k : Fin 2, epsilon.1 l k * (g.1⁻¹)ᵀ a k - = ∑ b : Fin 2, g.1 b l * epsilon.1 b a := by - have h : (epsilon.1 * g.1⁻¹) l a = (g.1ᵀ * epsilon.1) l a := by - rw [SL2C.epsilon_mul_inv_eq_transpose_mul_epsilon] - simpa [Matrix.mul_apply, Matrix.transpose_apply] using h - -/-- The two-index form of the symplectic identity, obtained from the single-index form - by factorising each sum over the two slots. -/ +/-- The two-slot form of the symplectic identity `sum_epsilon_mul_inv_transpose`: moving both + factors of `(g⁻¹)ᵀ` across `ε` turns them into factors of `g` on the other slots. -/ lemma sum_biEpsilon_mul_inv_transpose (g : SL(2,ℂ)) (l a : Fin 2 × Fin 2) : ∑ k : Fin 2 × Fin 2, (epsilon.1 l.1 k.1 * epsilon.1 l.2 k.2) * ((g.1⁻¹)ᵀ a.1 k.1 * (g.1⁻¹)ᵀ a.2 k.2) @@ -694,52 +496,24 @@ lemma sum_biEpsilon_mul_inv_transpose (g : SL(2,ℂ)) (l a : Fin 2 × Fin 2) : exact Finset.sum_congr rfl fun b₁ _ => Finset.sum_congr rfl fun b₂ _ => by ring rw [← hL, ← hR, sum_epsilon_mul_inv_transpose, sum_epsilon_mul_inv_transpose] -/-- The `ε` re-index turns the contragredient law into the fundamental one for the same - representation: a change of basis on the index type, not of representation. -/ +/-- The `ε` re-index turns the undotted dual law into the fundamental one for the same + representation: the symplectic identity `sum_biEpsilon_mul_inv_transpose` is the only + mathematical step. -/ lemma IsBiDualLeftWeyl.isBiLeftWeyl_epsReindex {B : Type*} [AddCommGroup B] [Module ℂ B] {repLorentz : Representation ℂ SL(2,ℂ) B} {T : Fin 2 × Fin 2 → B} (hT : IsBiDualLeftWeyl B repLorentz T) : IsBiLeftWeyl B repLorentz (epsReindex T) where repLorentz_T g l := by - have hstep : ∀ k : Fin 2 × Fin 2, - (epsilon.1 l.1 k.1 * epsilon.1 l.2 k.2) • repLorentz g (T k) - = ∑ a : Fin 2 × Fin 2, ((epsilon.1 l.1 k.1 * epsilon.1 l.2 k.2) - * ((g.1⁻¹)ᵀ a.1 k.1 * (g.1⁻¹)ᵀ a.2 k.2)) • T a := by - intro k - rw [hT.repLorentz_T, Finset.smul_sum] - exact Finset.sum_congr rfl fun a _ => smul_smul _ _ _ - calc repLorentz g (epsReindex T l) - = ∑ k : Fin 2 × Fin 2, (epsilon.1 l.1 k.1 * epsilon.1 l.2 k.2) - • repLorentz g (T k) := by - simp only [epsReindex, map_sum, map_smul] - _ = ∑ a : Fin 2 × Fin 2, (∑ k : Fin 2 × Fin 2, - (epsilon.1 l.1 k.1 * epsilon.1 l.2 k.2) - * ((g.1⁻¹)ᵀ a.1 k.1 * (g.1⁻¹)ᵀ a.2 k.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, (∑ b : Fin 2 × Fin 2, (g.1 b.1 l.1 * g.1 b.2 l.2) - * (epsilon.1 b.1 a.1 * epsilon.1 b.2 a.2)) • T a := - Finset.sum_congr rfl fun a _ => by - rw [sum_biEpsilon_mul_inv_transpose] - _ = ∑ b : Fin 2 × Fin 2, (g.1 b.1 l.1 * g.1 b.2 l.2) • epsReindex T b := by - symm - simp only [epsReindex, Finset.smul_sum, smul_smul] - rw [Finset.sum_comm] - exact Finset.sum_congr rfl fun a _ => (Finset.sum_smul).symm - -/-- Conjugating the group argument undoes the conjugation of the matrix entries: the - inverse conjugate transpose at `conjHom g` is the plain inverse transpose at `g`. -/ -lemma conjHom_inv_conjTranspose (g : SL(2,ℂ)) : - (((SL2C.conjHom g).1)⁻¹)ᴴ = (g.1⁻¹)ᵀ := by - have h1 : ((SL2C.conjHom g).1)⁻¹ = (g.1⁻¹).map star := by - rw [SL2C.inverse_coe, ← map_inv, SL2C.conjHom_coe, SL2C.inverse_coe] - rw [h1] - ext i j - simp [Matrix.conjTranspose_apply, Matrix.map_apply] - -/-- A family with the conjugate contragredient index law is a family with the plain - contragredient index law for the representation twisted by `conjHom`. -/ + have h := (repLorentz g).map_sum_smul_of_forall_eq T T + (fun a k => (g.1⁻¹)ᵀ a.1 k.1 * (g.1⁻¹)ᵀ a.2 k.2) (hT.repLorentz_T g) + (fun k => epsilon.1 l.1 k.1 * epsilon.1 l.2 k.2) + simp only [sum_biEpsilon_mul_inv_transpose] at h + rw [Fintype.sum_sum_mul_smul (fun (a b : Fin 2 × Fin 2) => + epsilon.1 b.1 a.1 * epsilon.1 b.2 a.2)] at h + exact h + +/-- A family with the dotted dual law is a family with the undotted dual law for the + representation twisted by `conjHom`. -/ lemma IsBiDualRightWeyl.isBiDualLeftWeyl_comp {B : Type*} [AddCommGroup B] [Module ℂ B] {repLorentz : Representation ℂ SL(2,ℂ) B} {T : Fin 2 × Fin 2 → B} (hT : IsBiDualRightWeyl B repLorentz T) : @@ -748,8 +522,8 @@ lemma IsBiDualRightWeyl.isBiDualLeftWeyl_comp {B : Type*} [AddCommGroup B] [Modu have h := hT.repLorentz_T (SL2C.conjHom g) l rwa [conjHom_inv_conjTranspose] at h -/-- The `ε` re-index turns a family with the conjugate contragredient index law into a - family with the fundamental index law for the conjugation-twisted representation. -/ +/-- The `ε` re-index turns a family with the dotted dual law into a family with the + fundamental law for the conjugation-twisted representation. -/ lemma IsBiDualRightWeyl.isBiLeftWeyl_epsReindex {B : Type*} [AddCommGroup B] [Module ℂ B] {repLorentz : Representation ℂ SL(2,ℂ) B} {T : Fin 2 × Fin 2 → B} (hT : IsBiDualRightWeyl B repLorentz T) : @@ -758,14 +532,12 @@ lemma IsBiDualRightWeyl.isBiLeftWeyl_epsReindex {B : Type*} [AddCommGroup B] /-! -## K. The classification of the invariants of a dual-index family +## H. The classification of the invariants of a dual-index family -Sections G to J assemble into contragredient and conjugate contragredient versions of -`exists_smul_epsilonContraction_of_invariant`, and of its form modulo a stable subspace. -Nothing had to be redone: the argument is generic in the representation, so it applies to -the twisted one as it stands. The re-index leaves the `ε` contraction alone, so the -contraction in the conclusions is that of the original family, `T (0, 1) - T (1, 0)`, -with no sign or scalar attached. +The re-index leaves the `ε` contraction alone, so the contraction in the conclusions is that +of the original family, `T (0, 1) - T (1, 0)`, with no sign or scalar attached. For the dotted +law the twist by `conjHom` is surjective, so invariance under the twisted representation is +invariance under `repLorentz`. -/ @@ -774,8 +546,7 @@ section DualClassification variable {B : Type*} [AddCommGroup B] [Module ℂ B] {repLorentz : Representation ℂ SL(2,ℂ) B} {T : Fin 2 × Fin 2 → B} -/-- The `ε` contraction of a family with the contragredient index law is Lorentz - invariant. -/ +/-- The `ε` contraction of a family with the undotted dual law is Lorentz invariant. -/ lemma IsBiDualLeftWeyl.repLorentz_epsilonContraction (hT : IsBiDualLeftWeyl B repLorentz T) (g : SL(2,ℂ)) : repLorentz g (IsBiLeftWeyl.epsilonContraction (T := T)) @@ -783,62 +554,55 @@ lemma IsBiDualLeftWeyl.repLorentz_epsilonContraction have h := hT.isBiLeftWeyl_epsReindex.repLorentz_epsilonContraction g rwa [epsilonContraction_epsReindex] at h -/-- The `ε` contraction of a family with the conjugate contragredient index law is - Lorentz invariant. -/ +/-- The `ε` contraction of a family with the dotted dual law is Lorentz invariant. -/ lemma IsBiDualRightWeyl.repLorentz_epsilonContraction (hT : IsBiDualRightWeyl B repLorentz T) (g : SL(2,ℂ)) : repLorentz g (IsBiLeftWeyl.epsilonContraction (T := T)) = IsBiLeftWeyl.epsilonContraction (T := T) := by have h := hT.isBiLeftWeyl_epsReindex.repLorentz_epsilonContraction rw [epsilonContraction_epsReindex] at h - exact (forall_comp_apply_eq_self_iff repLorentz SL2C.conjHom_surjective _).1 h g + exact (conjHom_involutive.surjective.forall (p := fun g => + repLorentz g (IsBiLeftWeyl.epsilonContraction (T := T)) + = IsBiLeftWeyl.epsilonContraction (T := T))).2 h g -/-- For the contragredient law, every Lorentz invariant of the span is a multiple of the `ε` +/-- For the undotted dual law, every Lorentz invariant of the span is a multiple of the `ε` contraction of that family. -/ theorem IsBiDualLeftWeyl.exists_smul_epsilonContraction_of_invariant - (hT : IsBiDualLeftWeyl B repLorentz T) {x : B} (hx : x ∈ ⨆ d, ℂ ∙ T d) + (hT : IsBiDualLeftWeyl B repLorentz T) {x : B} (hx : x ∈ componentSpan T) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : ∃ a : ℂ, x = a • IsBiLeftWeyl.epsilonContraction (T := T) := by - have hT' := hT.isBiLeftWeyl_epsReindex - have hx' : x ∈ hT'.span := by - rw [IsBiLeftWeyl.span, iSup_span_epsReindex] - exact hx - obtain ⟨a, ha⟩ := hT'.exists_smul_epsilonContraction_of_invariant hx' hinv + obtain ⟨a, ha⟩ := hT.isBiLeftWeyl_epsReindex.exists_smul_epsilonContraction_of_invariant + (by rwa [componentSpan_epsReindex]) hinv exact ⟨a, by rwa [epsilonContraction_epsReindex] at ha⟩ -/-- The classification of the Lorentz invariants of a family with the contragredient - index law, modulo a Lorentz-stable submodule `S`. -/ +/-- The same modulo a Lorentz-stable submodule `S`. -/ theorem IsBiDualLeftWeyl.exists_smul_epsilonContraction_of_invariant_subset (hT : IsBiDualLeftWeyl B repLorentz T) {x : B} (S : Submodule ℂ B) (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) - (hx : x ∈ (⨆ d, ℂ ∙ T d) ⊔ S) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : + (hx : x ∈ componentSpan T ⊔ S) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : ∃ a : ℂ, ∃ y ∈ S, x = a • IsBiLeftWeyl.epsilonContraction (T := T) + y := by - have hT' := hT.isBiLeftWeyl_epsReindex - have hx' : x ∈ hT'.span ⊔ S := by - rw [IsBiLeftWeyl.span, iSup_span_epsReindex] - exact hx obtain ⟨a, y, hy, ha⟩ := - hT'.exists_smul_epsilonContraction_of_invariant_subset S hS hx' hinv + hT.isBiLeftWeyl_epsReindex.exists_smul_epsilonContraction_of_invariant_subset S hS + (by rwa [componentSpan_epsReindex]) hinv exact ⟨a, y, hy, by rwa [epsilonContraction_epsReindex] at ha⟩ -/-- The same for the conjugate contragredient law. -/ +/-- For the dotted dual law, every Lorentz invariant of the span is a multiple of the `ε` + contraction of that family. -/ theorem IsBiDualRightWeyl.exists_smul_epsilonContraction_of_invariant - (hT : IsBiDualRightWeyl B repLorentz T) {x : B} (hx : x ∈ ⨆ d, ℂ ∙ T d) + (hT : IsBiDualRightWeyl B repLorentz T) {x : B} (hx : x ∈ componentSpan T) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : ∃ a : ℂ, x = a • IsBiLeftWeyl.epsilonContraction (T := T) := hT.isBiDualLeftWeyl_comp.exists_smul_epsilonContraction_of_invariant hx - ((forall_comp_apply_eq_self_iff repLorentz SL2C.conjHom_surjective x).2 hinv) + fun g => hinv (SL2C.conjHom g) -/-- The classification of the Lorentz invariants of a family with the conjugate - contragredient index law, modulo a Lorentz-stable submodule `S`. -/ +/-- The same modulo a Lorentz-stable submodule `S`. -/ theorem IsBiDualRightWeyl.exists_smul_epsilonContraction_of_invariant_subset (hT : IsBiDualRightWeyl B repLorentz T) {x : B} (S : Submodule ℂ B) (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) - (hx : x ∈ (⨆ d, ℂ ∙ T d) ⊔ S) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : + (hx : x ∈ componentSpan T ⊔ S) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : ∃ a : ℂ, ∃ y ∈ S, x = a • IsBiLeftWeyl.epsilonContraction (T := T) + y := hT.isBiDualLeftWeyl_comp.exists_smul_epsilonContraction_of_invariant_subset S - (fun g y hy => hS (SL2C.conjHom g) y hy) hx - ((forall_comp_apply_eq_self_iff repLorentz SL2C.conjHom_surjective x).2 hinv) + (fun g y hy => hS (SL2C.conjHom g) y hy) hx fun g => hinv (SL2C.conjHom g) end DualClassification diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsLeftRightWeyl.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsLeftRightWeyl.lean index 9cc7eb50e..aee405896 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsLeftRightWeyl.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsLeftRightWeyl.lean @@ -11,32 +11,25 @@ public import Physlib.Relativity.Fermions.Weyl.BoostWeight # Lorentz invariants of a left-handed and a right-handed Weyl index A bispinor `T^{α α'}`, carrying one left-handed and one right-handed Weyl index, has no -Lorentz invariant built from its four components but `0`. The pair of indices carries the -`(1/2, 1/2)` representation, which is the four-vector representation, and a single -four-vector index has nothing to contract with; this file proves that from scratch on the -spinor side. That is `eq_zero_of_invariant`, and `mem_of_invariant_of_mem_sup` is the same -statement modulo a Lorentz-stable subspace `S`, the form the Standard Model files use. +Lorentz invariant in the span of its four components but `0`: the pair carries the +`(1/2, 1/2)` representation, a single four-vector index, which has nothing to contract with. +That is `eq_zero_of_invariant`, and `mem_of_invariant_of_mem_sup` is the same statement modulo +a Lorentz-stable subspace `S`, the form the Standard Model files use. The components are vectors `T a` of a complex vector space `B` carrying a representation -`repLorentz` of `SL(2,ℂ)`, indexed by a pair of Weyl indices, and `IsLeftRightWeyl` says -the group moves the left index by the matrix of `g` and the right index by its complex -conjugate (C). `hT.span` is the set of their combinations. - -An invariant of the span is `∑_a c_a • T a` for a coefficient function `c` that the group -itself fixes (C, from `Invariants.Basic`), and the proof then follows the four-vector one with -the light-cone basis replaced by Weyl weight bases. Along a spatial axis the `SL(2,ℂ)` boost is -the diagonal `z`-boost conjugated by `rotationZToAxis i`, so the columns of that rotation are -boost eigenvectors of weight `±1` (A). The coefficients transform contragrediently, so their -weight basis conjugates the left slot and not the right, the opposite of the components; the -four products of a left and a right eigenvector carry weights `2`, `0`, `0`, `-2` (B). An -invariant has weight `0` along every axis, so it is fixed by the weight-zero projection along -each (D); averaging the three gives a matrix `M` with `M ^ 2 = 2 M` (E), and an invariant would -need `M c = 3 c`, which forces `c = 0` (F). Section G divides out `S`. - -A family carrying dual Weyl indices transforms by the contragredient `(Λ⁻¹)ᵀ` on the -undotted slot and by `(Λ⁻¹)ᴴ` on the dotted one. That law is `IsDualLeftRightWeyl` here; -its classification, still that there is no invariant, hence no Dirac mass term, is in -`IsVectorLeftRightWeyl`. +`repLorentz` of `SL(2,ℂ)`, and `IsLeftRightWeyl` says the group moves the left index by the +matrix of `g` and the right index by its complex conjugate (B). An invariant of +`componentSpan T` is `∑_a c_a • T a` for a coefficient function `c` fixed by the action `act` +(B, from `Invariants.Basic`), and the argument is the four-vector one with the light-cone basis +replaced by the Weyl weight bases of `Fermions.Weyl.BoostWeight`. The coefficients move by the +component matrix `g_{a₁ l₁} ḡ_{a₂ l₂}` applied to `c`, whose left eigenvectors for an axis +boost are the products `pairCoeff` of a conjugated left and a plain right weight vector, with +weights `2`, `0`, `0`, `-2` (A, C). An invariant is fixed by the weight-zero projection along +each axis (D); the three projections sum to a matrix `M` with `M ^ 2 = 2 M`, while an invariant +would need `M c = 3 c`, which forces `c = 0` (E). Section F divides out `S`. + +The dual law, `(g⁻¹)ᵀ` on the undotted and `(g⁻¹)ᴴ` on the dotted slot, is +`IsDualLeftRightWeyl` in `IsVectorLeftRightWeyl`, which transports this classification to it. -/ @[expose] public section @@ -47,114 +40,15 @@ open TensorProduct Matrix MatrixGroups SL2C Invariants /-! -## A. The Weyl weight bases along a spatial axis - -Along the `z`-axis the `SL(2,ℂ)` boost is `diag (t, t⁻¹)`, which the standard Weyl basis -already diagonalises, with weights `weylWeight`. Along a general axis the boost is that -one conjugated by `rotationZToAxis`, so the columns of the rotation are the eigenvectors, -recorded here without their `√2` normalisation. A right-handed index sees the conjugate -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 the coefficients of a left-right pair +## A. The weight basis of the coefficients 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. What is graded here is -the coefficient function, which transforms contragrediently, so its left slot takes the -conjugated basis and its right slot the plain one, the opposite of the components. +product of the two, and its weight is the sum of the two Weyl weights. The axis boosts are +Hermitian, so as left eigenvectors of the coefficient matrix the left slot takes the +conjugated basis and the right slot the plain one, the opposite of the components. -/ -/-- 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 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 the coefficients of a left-right pair of indices. -/ def pairCoeff (i : Fin 3) (κ α : Fin 2 × Fin 2) : ℂ := weylCoeffC i κ.1 α.1 * weylCoeff i κ.2 α.2 @@ -179,8 +73,8 @@ lemma sum_pairCoeffInv_mul (i : Fin 3) (α β : Fin 2 × Fin 2) : obtain ⟨β₁, β₂⟩ := β by_cases h1 : α₁ = β₁ <;> by_cases h2 : α₂ = β₂ <;> simp [h1, h2, Prod.mk.injEq] -/-- The pair weight basis diagonalises the axis-`i` boost on coefficients, with the weight - `pairWeight`. -/ +/-- The pair weight basis consists of left eigenvectors of the coefficient matrix + `g_{a₁ l₁} ḡ_{a₂ l₂}` of the axis-`i` boost, with eigenvalue `t ^ pairWeight κ`. -/ lemma sum_boostAxis_pairCoeff (i : Fin 3) (κ l : Fin 2 × Fin 2) {t : ℝ} (ht : t ≠ 0) : ∑ a : Fin 2 × Fin 2, pairCoeff i κ a * ((SL2C.boostAxis i t ht).1 a.1 l.1 * star ((SL2C.boostAxis i t ht).1 a.2 l.2)) @@ -201,16 +95,13 @@ lemma sum_boostAxis_pairCoeff (i : Fin 3) (κ l : Fin 2 × Fin 2) {t : ℝ} (ht /-! -## C. Left-right bispinors, their span, and coefficient functions - -`IsLeftRightWeyl B repLorentz T` says the group moves the left index of `T^{α α'}` by the -matrix of `g` and the right index by its complex conjugate, and `hT.span` is the set of -combinations `∑ a, c a • T a` of the four components. +## B. Left-right bispinors and their coefficient functions -/ /-- A family `T` indexed by one left-handed and one right-handed Weyl index, moved by - `repLorentz` as a bispinor `T^{α α'}`. -/ + `repLorentz` as a bispinor `T^{α α'}`: the left index by the matrix of `g` and the right + index by its complex conjugate, the summed index first in each factor. -/ structure IsLeftRightWeyl (B : Type*) [AddCommMonoid B] [Module ℂ B] (repLorentz : Representation ℂ SL(2,ℂ) B) (T : Fin 2 × Fin 2 → B) : Prop where @@ -225,19 +116,9 @@ variable {B : Type*} [AddCommGroup B] [Module ℂ B] {T : Fin 2 × Fin 2 → B} (hT : IsLeftRightWeyl B repLorentz T) -set_option linter.unusedVariables false in -/-- The span of the components; `hT` is unused, and is present only so it reads `hT.span`. -/ -def span (hT : IsLeftRightWeyl B repLorentz T) : Submodule ℂ B := ⨆ d, ℂ ∙ T d - -/-- A vector lies in the span exactly when it is a combination `∑ d, c d • T d`. -/ -lemma mem_span_iff (x : B) : - x ∈ hT.span ↔ ∃ c : Fin 2 × Fin 2 → ℂ, x = ∑ d, c d • T d := by - rw [span, ← Submodule.span_range_eq_iSup, ← Fintype.range_linearCombination, - LinearMap.mem_range] - simp only [Fintype.linearCombination_apply, eq_comm] - -/-- The action of `g : SL(2,ℂ)` on coefficient functions: the left slot moves by `g` and the - right by its conjugate, with the free index first in each factor and the summed one second. -/ +/-- The action of `g : SL(2,ℂ)` on coefficient functions, + `act g c a = ∑ d, c d * (g a.1 d.1 * star (g a.2 d.2))`: the component matrix applied to `c`, + with the free index first in each factor and the summed one second. -/ def act (g : SL(2,ℂ)) (c : Fin 2 × Fin 2 → ℂ) (a : Fin 2 × Fin 2) : ℂ := ∑ d : Fin 2 × Fin 2, c d * (g.1 a.1 d.1 * star (g.1 a.2 d.2)) @@ -247,24 +128,24 @@ def IsInvariantCoeff (c : Fin 2 × Fin 2 → ℂ) : Prop := ∀ g : SL(2,ℂ), a include hT in /-- An invariant of the span is the contraction of an invariant coefficient function: the adjoint of the action of `g` is the action of `g†`. -/ -theorem exists_isInvariantCoeff_of_mem_span {x : B} (hx : x ∈ hT.span) +theorem exists_isInvariantCoeff_of_mem_componentSpan {x : B} (hx : x ∈ componentSpan T) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : ∃ c : Fin 2 × Fin 2 → ℂ, IsInvariantCoeff c ∧ x = ∑ d, c d • T d := by obtain ⟨c, hc, hx'⟩ := Invariants.exists_invariantCoeff_matrix T (fun g => repLorentz g) (fun g a d => g.1 a.1 d.1 * star (g.1 a.2 d.2)) hT.repLorentz_T (fun g => ⟨Invariants.dagger g, fun a d => by simp [Invariants.dagger, Matrix.conjTranspose_apply, mul_comm]⟩) - (by rwa [← span]) hinv + hx hinv exact ⟨c, hc, hx'⟩ /-! -## D. The weight grading of the coefficients +## C. The weight grading of the coefficients -The four products `pairCoeff i κ` of a left and a right weight covector read off the weight -components of a coefficient function, and the axis-`i` boost multiplies the component at `κ` -by `t ^ pairWeight κ`. An invariant function therefore has no component of weight `±2`, and is -recovered from its two weight-zero components alone. +The four covectors `pairCoeff i κ` read off the weight components of a coefficient function, +and the axis-`i` boost multiplies the component at `κ` by `t ^ pairWeight κ`. An invariant +function therefore has no component of weight `±2`, and is recovered from its two weight-zero +components alone. -/ @@ -276,28 +157,14 @@ def weightComponent (i : Fin 3) (c : Fin 2 × Fin 2 → ℂ) (κ : Fin 2 × Fin lemma weightComponent_act_boostAxis (i : Fin 3) (c : Fin 2 × Fin 2 → ℂ) (κ : Fin 2 × Fin 2) {t : ℝ} (ht : t ≠ 0) : weightComponent i (act (SL2C.boostAxis i t ht) c) κ - = ((t : ℝ) : ℂ) ^ (pairWeight κ) * weightComponent i c κ := by - simp only [weightComponent, act, Finset.mul_sum] - rw [Finset.sum_comm] - refine Finset.sum_congr rfl fun d _ => ?_ - calc ∑ a : Fin 2 × Fin 2, pairCoeff i κ a * (c d * ((SL2C.boostAxis i t ht).1 a.1 d.1 - * star ((SL2C.boostAxis i t ht).1 a.2 d.2))) - = c d * ∑ a : Fin 2 × Fin 2, pairCoeff i κ a * ((SL2C.boostAxis i t ht).1 a.1 d.1 - * star ((SL2C.boostAxis i t ht).1 a.2 d.2)) := by - rw [Finset.mul_sum] - exact Finset.sum_congr rfl fun a _ => by ring - _ = _ := by rw [sum_boostAxis_pairCoeff i κ d ht]; ring + = ((t : ℝ) : ℂ) ^ (pairWeight κ) * weightComponent i c κ := + sum_mul_actMat _ _ c _ fun l => sum_boostAxis_pairCoeff i κ l ht /-- An invariant coefficient function has no weight component of nonzero weight. -/ lemma weightComponent_eq_zero {c : Fin 2 × Fin 2 → ℂ} (hc : IsInvariantCoeff c) (i : Fin 3) - {κ : Fin 2 × Fin 2} (hκ : pairWeight κ ≠ 0) : weightComponent i c κ = 0 := by - have h := weightComponent_act_boostAxis i c κ (two_ne_zero (α := ℝ)) - rw [hc] at h - have h2 : ((2 : ℝ) : ℂ) ^ (pairWeight κ) ≠ 1 := by - rw [← Complex.ofReal_zpow, Ne, Complex.ofReal_eq_one, - zpow_eq_one_iff_right₀ (by norm_num) (by norm_num)] - exact hκ - exact (mul_left_eq_self₀.1 h.symm).resolve_left h2 + {κ : Fin 2 × Fin 2} (hκ : pairWeight κ ≠ 0) : weightComponent i c κ = 0 := + sum_mul_eq_zero_of_actMat_eq _ (hc (SL2C.boostAxis i 2 two_ne_zero)) + (fun l => sum_boostAxis_pairCoeff i κ l two_ne_zero) (two_zpow_ne_one hκ) /-- A coefficient function is recovered from its weight components. -/ lemma eq_sum_weightComponent (i : Fin 3) (c : Fin 2 × Fin 2 → ℂ) (α : Fin 2 × Fin 2) : @@ -309,7 +176,7 @@ lemma eq_sum_weightComponent (i : Fin 3) (c : Fin 2 × Fin 2 → ℂ) (α : Fin /-! -## E. The weight-zero round and its average over the axes +## D. The weight-zero round and its average over the axes Keeping only the weight-zero components writes an invariant coefficient function as one matrix per axis applied to itself, and the three average to a matrix with a short closed form. @@ -334,7 +201,7 @@ lemma eq_sum_weightZeroTransition {c : Fin 2 × Fin 2 → ℂ} (hc : IsInvariant /-! -## F. The quadratic certificate and the classification +## E. The quadratic certificate and the classification The summed transition `M` satisfies `M ^ 2 = 2 M`, while an invariant coefficient function would have to satisfy `M c = 3 c`. Only `c = 0` does both. @@ -423,18 +290,18 @@ lemma eq_zero_of_isInvariantCoeff {c : Fin 2 × Fin 2 → ℂ} (hc : IsInvariant include hT in /-- Every Lorentz invariant in the span of the components is zero: the pair of indices carries the four-vector representation, which has no invariant contraction. -/ -theorem eq_zero_of_invariant {x : B} (hx : x ∈ hT.span) +theorem eq_zero_of_invariant {x : B} (hx : x ∈ componentSpan T) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x = 0 := by - obtain ⟨c, hc, rfl⟩ := hT.exists_isInvariantCoeff_of_mem_span hx hinv + obtain ⟨c, hc, rfl⟩ := hT.exists_isInvariantCoeff_of_mem_componentSpan hx hinv simp [eq_zero_of_isInvariantCoeff hc] /-! -## G. The classification modulo a Lorentz-stable submodule +## F. The classification modulo a Lorentz-stable submodule -A stable subspace `S` is divided out by passing to the quotient `B ⧸ S`, that is `B` with -`S` declared zero: the classes of the components again form a bispinor, so the -classification applies there and lifts back with an error term in `S`. +A stable subspace `S` is divided out by passing to the quotient `B ⧸ S`: the classes of the +components again form a bispinor, so the classification applies there and lifts back with an +error term in `S`. -/ @@ -450,24 +317,13 @@ lemma isLeftRightWeyl_quotient (S : Submodule ℂ B) exact Finset.sum_congr rfl fun a _ => map_smul _ _ _ include hT in -/-- A Lorentz invariant of `hT.span ⊔ S`, for a Lorentz-stable subspace `S`, already lies - in `S`. -/ +/-- A Lorentz invariant of `componentSpan T ⊔ S`, for a Lorentz-stable subspace `S`, 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_quotient 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,ℂ), - (repLorentz.quotient S fun g y hy => hS g y hy) g (S.mkQ x) = S.mkQ x := by - intro g - rw [quotient_apply_mkQ, hinv g] - have hzero := hT'.eq_zero_of_invariant hmk hinv' + (hx : x ∈ componentSpan T ⊔ S) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by + have hzero := (hT.isLeftRightWeyl_quotient S hS).eq_zero_of_invariant + (mkQ_mem_componentSpan T S hx) fun g => by rw [quotient_apply_mkQ, hinv g] rwa [← Submodule.ker_mkQ S, LinearMap.mem_ker] end IsLeftRightWeyl diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsVectorLeftRightWeyl.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsVectorLeftRightWeyl.lean index 5185558c8..fd1f6c3e9 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsVectorLeftRightWeyl.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsVectorLeftRightWeyl.lean @@ -11,37 +11,33 @@ public import Physlib.Relativity.PauliMatrices.AsTensor /-! # Lorentz invariants of a four-vector index and a left-right Weyl pair -A family `T^{μ α α'}` carrying one four-vector index and one opposite-chirality Weyl pair -has exactly one Lorentz-invariant contraction, the one against the Pauli matrices - -`pauliContraction = σ_μ^{α α'} T^{μ}{}_{α α'}`. - -This is the shape of the fermion kinetic term `ψ̄_{α'} σ̄^{μ α' α} ∂_μ ψ_α`, and why this -file exists: no other classifier covers a vector index tied to opposite-chirality spinor -indices, which the fermion sector needs at mass weight eight. The theorem is -`exists_smul_pauliContraction_of_invariant`, and `repLorentz_pauliContraction` checks the -contraction is invariant. - -The count is easy to see: an opposite-chirality Weyl pair carries the `(1/2, 1/2)` -representation, which is the four-vector representation, so the three indices are two -four-vector indices, and two of those admit only the metric trace. The proof makes that -literal. The covariant Pauli matrices intertwine the two index laws (A), so contracting -the Weyl pair against them turns `T` into a bi-Lorentz tensor, invertibly by Fierz -completeness, leaving the span unchanged (C); `RankTwo` then supplies the -classification (D), its metric trace being the Pauli contraction of `T`. Section E gives -the model family, whose Pauli contraction is `PauliMatrix.asTensor`. - -The Standard Model's fermion symbols are `Module.Dual`-valued, so their spinor indices -carry the contragredient law. As in `IsBiLeftWeyl`, the symplectic form `ε` bridges the -gap: it is inner for `SL(2,ℂ)`, so re-indexing the two spinor slots by `ε` converts the -contragredient law into the fundamental one without touching the representation (F, G). -No conjugation twist is needed, the mixed law already carrying one conjugate factor and -`ε` having real entries, and the derivative slot keeps the plain Lorentz law, only the -value index of a symbol being dualised. The re-index does move the contraction, sending -the Pauli matrices to their transposes, so the invariant in the dual conclusions is the -conjugate Pauli contraction `pauliBarContraction`, with scalar `+1` (H). F and H also give -the mass-weight-six statement: a dual Weyl pair with no vector index has no invariant, so -there is no Dirac mass term. +Every Lorentz invariant in the span of the components of a family `T^{μ α α'}` carrying one +four-vector index and one opposite-chirality Weyl pair is a multiple of the contraction +against the Pauli matrices + +`pauliContraction = σ_μ^{α α'} T^{μ}{}_{α α'}`, + +the shape of the fermion kinetic term `ψ̄_{α'} σ̄^{μ α' α} ∂_μ ψ_α`. The theorem is +`exists_smul_pauliContraction_of_invariant`, and `repLorentz_pauliContraction` checks that +the contraction is invariant. + +An opposite-chirality Weyl pair carries the `(1/2, 1/2)` representation, which is the +four-vector representation, so the three indices are two four-vector indices, and two of +those admit only the metric trace. The proof makes that literal: contracting the Weyl pair +against the covariant Pauli matrices `PauliMatrix.pauliLower`, which intertwine the two index +laws (`SL2C.sum_pauliLower_mul_sl2c`), turns `T` into a rank-two Lorentz family, invertibly +by Fierz completeness and hence with the same span (B); `RankTwo` supplies the classification, +its metric contraction being the Pauli contraction of `T` (C). Section D gives the model +family, whose Pauli contraction is `PauliMatrix.asTensor`. + +The Standard Model's fermion symbols are `Module.Dual`-valued, so their spinor indices carry +the dual laws `(g⁻¹)ᵀ` and `(g⁻¹)ᴴ` (E). As in `IsBiLeftWeyl`, re-indexing the two spinor +slots by the symplectic form `ε` converts them into the fundamental laws for the same +representation; no conjugation twist is needed, the mixed law already carrying one conjugate +factor and `ε` having real entries, and the vector slot keeps the plain Lorentz law. The +re-index does move the contraction, sending the Pauli matrices to their transposes `pauliBar`, +so the invariant in the dual conclusions is `pauliBarContraction`, with scalar `+1` (F, G). +A dual pair with no vector index has no invariant at all (G). -/ @[expose] public section @@ -49,74 +45,14 @@ there is no Dirac mass term. namespace Lorentz open TensorProduct Matrix MatrixGroups SL2C -open LorentzGroup (sum_minkowskiMatrixZ_mul) /-! -## A. The covariant Pauli matrices +## A. Vector-Weyl families and the Pauli contraction -`pauliLower μ` is the Pauli matrix with its vector index lowered and `pauliBar` its -conjugate. Two identities are needed: they are orthonormal for the trace pairing, which is -the Fierz completeness relation, and they intertwine the vector and Weyl index laws, which -is `SL2C.toSelfAdjointMap_basis` read entrywise. - --/ - -/-- The Pauli matrices with the vector index lowered by the Minkowski metric. -/ -def pauliLower (μ : Fin 1 ⊕ Fin 3) : Matrix (Fin 2) (Fin 2) ℂ := - (PauliMatrix.pauliSelfAdjoint' μ).1 - -/-- The covariant Pauli matrices are the basis vectors of `PauliMatrix.pauliBasis'`. -/ -lemma pauliBasis'_coe (μ : Fin 1 ⊕ Fin 3) : - (PauliMatrix.pauliBasis' μ).1 = pauliLower μ := by - rw [PauliMatrix.pauliBasis', Module.Basis.coe_mk, pauliLower] - -/-- Lowering the vector index multiplies by the diagonal entry of the metric. -/ -lemma pauliLower_eq_smul (μ : Fin 1 ⊕ Fin 3) : - pauliLower μ = ((minkowskiMatrixZ μ μ : ℤ) : ℂ) • PauliMatrix.pauliMatrix μ := by - rcases μ with μ | μ <;> fin_cases μ <;> - simp [pauliLower, PauliMatrix.pauliSelfAdjoint', minkowskiMatrixZ] - -/-- The conjugate Pauli matrices, the transposes of the covariant ones. These are the - matrices `σ̄_μ` carrying two dual spinor indices. -/ -def pauliBar (μ : Fin 1 ⊕ Fin 3) : Matrix (Fin 2) (Fin 2) ℂ := (pauliLower μ)ᵀ - -/-- The Fierz completeness relation for the covariant Pauli matrices: they form a basis - of the two by two matrices, with the trace pairing as the duality. -/ -lemma sum_pauliLower_mul_pauliLower (α α' β β' : Fin 2) : - ∑ ρ : Fin 1 ⊕ Fin 3, pauliLower ρ β' β * pauliLower ρ α α' - = 2 * ((if α = β then 1 else 0) * (if α' = β' then 1 else 0)) := by - fin_cases α <;> fin_cases α' <;> fin_cases β <;> fin_cases β' <;> - simp [pauliLower, PauliMatrix.pauliSelfAdjoint', PauliMatrix.pauliMatrix, - Fintype.sum_sum_type, Fin.sum_univ_three] <;> - norm_num [Complex.ext_iff] - -/-- Sandwiching `σ_μ` between `g` and `gᴴ` mixes the Pauli matrices by a column of the Lorentz - matrix of `g`: the intertwining property, `SL2C.toSelfAdjointMap_basis` read entrywise. -/ -lemma sum_pauliLower_mul_sl2c (g : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) (β β' : Fin 2) : - ∑ p : Fin 2 × Fin 2, pauliLower μ p.1 p.2 * (g.1 β p.1 * star (g.1 β' p.2)) - = ∑ ν : Fin 1 ⊕ Fin 3, (((SL2C.toLorentzGroup g).1 ν μ : ℝ) : ℂ) - * pauliLower ν β β' := by - have h := congrArg (fun A : selfAdjoint (Matrix (Fin 2) (Fin 2) ℂ) => A.1 β β') - (SL2C.toSelfAdjointMap_basis (M := g) μ) - simp only [SL2C.toSelfAdjointMap_apply_coe, AddSubmonoidClass.coe_finsetSum, - Matrix.sum_apply, selfAdjoint.val_smul, Matrix.smul_apply, Complex.real_smul, - pauliBasis'_coe] at h - rw [← h, Matrix.mul_apply, Fintype.sum_prod_type_right] - refine Finset.sum_congr rfl fun p₂ _ => ?_ - rw [Matrix.mul_apply, Finset.sum_mul] - exact Finset.sum_congr rfl fun p₁ _ => by - rw [Matrix.conjTranspose_apply] - ring - -/-! - -## B. Vector-Weyl families and the span of their components - -`IsVectorLeftRightWeyl B repLorentz T` says the group moves the vector index of -`T^{μ α α'}` by the Lorentz matrix, the left Weyl index by the matrix of `g` and the right -one by its complex conjugate. `hT.span` is the set of combinations of the `16` components, -and `pauliContraction` is the contraction `σ_μ^{α α'} T^{μ}{}_{α α'}`. +`IsVectorLeftRightWeyl B repLorentz T` says the group moves the vector index of `T^{μ α α'}` +by the Lorentz matrix, the left Weyl index by the matrix of `g` and the right one by its +complex conjugate. -/ @@ -134,7 +70,8 @@ lemma sum_pi_fin_two {M : Type*} [AddCommMonoid M] (f : (Fin 2 → Fin 1 ⊕ Fin /-- A family `T` indexed by a four-vector index and a left- and a right-handed Weyl index, moved by `repLorentz` as `T^{μ α α'}`: the vector index by the Lorentz matrix, the left - index by the matrix of `g` and the right index by its complex conjugate. -/ + index by the matrix of `g` and the right index by its complex conjugate, the summed index + first in each factor. -/ structure IsVectorLeftRightWeyl (B : Type*) [AddCommMonoid B] [Module ℂ B] (repLorentz : Representation ℂ SL(2,ℂ) B) (T : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2 → B) : Prop where @@ -150,132 +87,98 @@ variable {B : Type*} [AddCommGroup B] [Module ℂ B] {T : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2 → B} (hT : IsVectorLeftRightWeyl B repLorentz T) -set_option linter.unusedVariables false in -/-- The span of the components; `hT` is unused, and is present only so it reads `hT.span`. -/ -def span (hT : IsVectorLeftRightWeyl B repLorentz T) : Submodule ℂ B := ⨆ d, ℂ ∙ T d - -/-- A vector lies in the span exactly when it is a combination `∑ d, c d • T d`. -/ -lemma mem_span_iff (x : B) : - x ∈ hT.span ↔ ∃ c : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2 → ℂ, x = ∑ d, c d • T d := by - rw [span, ← Submodule.span_range_eq_iSup, ← Fintype.range_linearCombination, - LinearMap.mem_range] - simp only [Fintype.linearCombination_apply, eq_comm] +include hT in +/-- The index law as one matrix on the product index. -/ +lemma repLorentz_T' (g : SL(2,ℂ)) (d : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2) : + repLorentz g (T d) = ∑ e : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2, + ((((SL2C.toLorentzGroup g).1 e.1 d.1 : ℝ) : ℂ) + * (g.1 e.2.1 d.2.1 * star (g.1 e.2.2 d.2.2))) • T e := by + rw [show d = (d.1, d.2) from rfl, hT.repLorentz_T, Fintype.sum_prod_type] -/-- The Pauli contraction `σ_μ^{α α'} T^μ_{α α'}`, the kinetic-term contraction of a - four-vector index against a pair of opposite-chirality Weyl indices. -/ +include hT in +/-- Moving a contraction of the Weyl pair at vector index `μ`: the vector index moves by the + Lorentz matrix and the coefficient function by `IsLeftRightWeyl.act g`. -/ +lemma repLorentz_sum_smul (g : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) (c : Fin 2 × Fin 2 → ℂ) : + repLorentz g (∑ a : Fin 2 × Fin 2, c a • T (μ, a)) + = ∑ ν : Fin 1 ⊕ Fin 3, (((SL2C.toLorentzGroup g).1 ν μ : ℝ) : ℂ) + • ∑ q : Fin 2 × Fin 2, IsLeftRightWeyl.act g c q • T (ν, q) := by + rw [(repLorentz g).map_sum_smul_of_forall_eq (fun a => T (μ, a)) T + (fun e a => (((SL2C.toLorentzGroup g).1 e.1 μ : ℝ) : ℂ) + * (g.1 e.2.1 a.1 * star (g.1 e.2.2 a.2))) (fun a => hT.repLorentz_T' g (μ, a)) c, + Fintype.sum_prod_type] + refine Finset.sum_congr rfl fun ν _ => ?_ + rw [Finset.smul_sum] + refine Finset.sum_congr rfl fun q _ => ?_ + rw [smul_smul, IsLeftRightWeyl.act, Finset.mul_sum] + exact congrArg (· • T (ν, q)) (Finset.sum_congr rfl fun p _ => by ring) + +/-- The Pauli contraction `∑ μ, ∑ a, σ^μ_{a₁ a₂} • T (μ, a)` against the Pauli matrices + `PauliMatrix.pauliMatrix`: the kinetic-term contraction of a four-vector index against a + pair of opposite-chirality Weyl indices. -/ noncomputable def pauliContraction : B := ∑ μ : Fin 1 ⊕ Fin 3, ∑ a : Fin 2 × Fin 2, PauliMatrix.pauliMatrix μ a.1 a.2 • T (μ, a) -end IsVectorLeftRightWeyl - /-! -## C. The reduction to a pair of four-vector indices +## B. The reduction to a pair of four-vector indices -Contracting the Weyl pair against the Pauli matrices turns `T` into a family -`vectorPair` of two four-vector indices, which is a bi-Lorentz tensor. By Fierz +Contracting the Weyl pair against the covariant Pauli matrices turns `T` into a family +`vectorPair` of two four-vector indices, which is a rank-two Lorentz family. By Fierz completeness the contraction is invertible, so the two families have the same span. -/ -namespace IsVectorLeftRightWeyl - -variable {B : Type*} [AddCommGroup B] [Module ℂ B] - {repLorentz : Representation ℂ SL(2,ℂ) B} - {T : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2 → B} - (hT : IsVectorLeftRightWeyl B repLorentz T) - /-- The family of two four-vector indices obtained by contracting the Weyl pair of `T` against the covariant Pauli matrices. -/ noncomputable def vectorPair : (Fin 2 → Fin 1 ⊕ Fin 3) → B := - fun d => ∑ a : Fin 2 × Fin 2, pauliLower (d 1) a.1 a.2 • T (d 0, a) + fun d => ∑ a : Fin 2 × Fin 2, PauliMatrix.pauliLower (d 1) a.1 a.2 • T (d 0, a) include hT in -/-- The Pauli contraction of the Weyl pair carries the two spinor indices into a second - four-vector index: the resulting family is a rank-two Lorentz tensor family. -/ +/-- The reduced family is a rank-two Lorentz family: the intertwining identity + `SL2C.sum_pauliLower_mul_sl2c` carries the Weyl pair into a second vector index. -/ lemma isLorentzCovariant_vectorPair : IsLorentzCovariant 2 B repLorentz (vectorPair (T := T)) where repLorentz_T g l := by - have hstep : ∀ p : Fin 2 × Fin 2, - pauliLower (l 1) p.1 p.2 • repLorentz g (T (l 0, p)) - = ∑ ν : Fin 1 ⊕ Fin 3, ∑ q : Fin 2 × Fin 2, - (pauliLower (l 1) p.1 p.2 * ((((SL2C.toLorentzGroup g).1 ν (l 0) : ℝ) : ℂ) - * (g.1 q.1 p.1 * star (g.1 q.2 p.2)))) • T (ν, q) := by - intro p - rw [hT.repLorentz_T g (l 0) p, Finset.smul_sum] - exact Finset.sum_congr rfl fun ν _ => by - rw [Finset.smul_sum] - exact Finset.sum_congr rfl fun q _ => smul_smul _ _ _ - calc repLorentz g (vectorPair (T := T) l) - = ∑ p : Fin 2 × Fin 2, - pauliLower (l 1) p.1 p.2 • repLorentz g (T (l 0, p)) := by - simp only [vectorPair, map_sum, map_smul] - _ = ∑ ν : Fin 1 ⊕ Fin 3, ∑ q : Fin 2 × Fin 2, - (∑ p : Fin 2 × Fin 2, pauliLower (l 1) p.1 p.2 - * ((((SL2C.toLorentzGroup g).1 ν (l 0) : ℝ) : ℂ) - * (g.1 q.1 p.1 * star (g.1 q.2 p.2)))) • T (ν, q) := by - simp only [hstep] - rw [Finset.sum_comm] - refine Finset.sum_congr rfl fun ν _ => ?_ - rw [Finset.sum_comm] - exact Finset.sum_congr rfl fun q _ => (Finset.sum_smul).symm - _ = ∑ ν : Fin 1 ⊕ Fin 3, ∑ ρ : Fin 1 ⊕ Fin 3, - ((((SL2C.toLorentzGroup g).1 ν (l 0) : ℝ) : ℂ) - * (((SL2C.toLorentzGroup g).1 ρ (l 1) : ℝ) : ℂ)) - • vectorPair (T := T) ![ν, ρ] := by - refine Finset.sum_congr rfl fun ν _ => ?_ - have hinner : ∀ q : Fin 2 × Fin 2, - (∑ p : Fin 2 × Fin 2, pauliLower (l 1) p.1 p.2 - * ((((SL2C.toLorentzGroup g).1 ν (l 0) : ℝ) : ℂ) - * (g.1 q.1 p.1 * star (g.1 q.2 p.2)))) - = (((SL2C.toLorentzGroup g).1 ν (l 0) : ℝ) : ℂ) - * ∑ ρ : Fin 1 ⊕ Fin 3, (((SL2C.toLorentzGroup g).1 ρ (l 1) : ℝ) : ℂ) - * pauliLower ρ q.1 q.2 := by - intro q - rw [← sum_pauliLower_mul_sl2c g (l 1) q.1 q.2, Finset.mul_sum] - exact Finset.sum_congr rfl fun p _ => by ring - simp only [hinner] - symm - simp only [vectorPair, Matrix.cons_val_zero, Matrix.cons_val_one, - Finset.smul_sum, smul_smul] - rw [Finset.sum_comm] - refine Finset.sum_congr rfl fun q _ => ?_ - rw [← Finset.sum_smul, Finset.mul_sum] - exact congrArg (· • T (ν, q)) (Finset.sum_congr rfl fun ρ _ => by ring) - _ = ∑ a : Fin 2 → Fin 1 ⊕ Fin 3, - (∏ i : Fin 2, (((SL2C.toLorentzGroup g).1 (a i) (l i) : ℝ) : ℂ)) - • vectorPair (T := T) a := by - rw [sum_pi_fin_two] - refine Finset.sum_congr rfl fun ν _ => Finset.sum_congr rfl fun ρ _ => ?_ - simp only [Fin.prod_univ_two, Matrix.cons_val_zero, Matrix.cons_val_one] + rw [vectorPair, hT.repLorentz_sum_smul, sum_pi_fin_two] + refine Finset.sum_congr rfl fun ν _ => ?_ + simp only [IsLeftRightWeyl.act, sum_pauliLower_mul_sl2c] + rw [Fintype.sum_sum_mul_smul + (fun (q : Fin 2 × Fin 2) (ρ : Fin 1 ⊕ Fin 3) => PauliMatrix.pauliLower ρ q.1 q.2) + (fun ρ => (((SL2C.toLorentzGroup g).1 ρ (l 1) : ℝ) : ℂ)) (fun q => T (ν, q)), + Finset.smul_sum] + refine Finset.sum_congr rfl fun ρ _ => ?_ + simp only [vectorPair, smul_smul, Fin.prod_univ_two, Matrix.cons_val_zero, + Matrix.cons_val_one] +omit hT in /-- Every component of the reduced family lies in the span of the components of `T`. -/ -lemma vectorPair_mem_span (d : Fin 2 → Fin 1 ⊕ Fin 3) : - vectorPair (T := T) d ∈ hT.span := - sum_mem fun a _ => Submodule.smul_mem _ _ - (Submodule.mem_iSup_of_mem (d 0, a) (Submodule.mem_span_singleton_self _)) +lemma vectorPair_mem_componentSpan (d : Fin 2 → Fin 1 ⊕ Fin 3) : + vectorPair (T := T) d ∈ componentSpan T := + sum_mem fun a _ => Submodule.smul_mem _ _ (mem_componentSpan_self T (d 0, a)) +omit hT in /-- The reduction is invertible: by the Fierz completeness relation each component of `T` is recovered from the reduced family. -/ lemma eq_sum_vectorPair (μ : Fin 1 ⊕ Fin 3) (b : Fin 2 × Fin 2) : T (μ, b) = ∑ ρ : Fin 1 ⊕ Fin 3, - ((2 : ℂ)⁻¹ * pauliLower ρ b.2 b.1) • vectorPair (T := T) ![μ, ρ] := by + ((2 : ℂ)⁻¹ * PauliMatrix.pauliLower ρ b.2 b.1) • vectorPair (T := T) ![μ, ρ] := by calc T (μ, b) = ∑ a : Fin 2 × Fin 2, ((if a.1 = b.1 then (1 : ℂ) else 0) * (if a.2 = b.2 then 1 else 0)) • T (μ, a) := by rw [Fintype.sum_prod_type] simp [ite_smul, Finset.sum_ite_eq'] _ = ∑ a : Fin 2 × Fin 2, (∑ ρ : Fin 1 ⊕ Fin 3, - (2 : ℂ)⁻¹ * pauliLower ρ b.2 b.1 * pauliLower ρ a.1 a.2) • T (μ, a) := by + (2 : ℂ)⁻¹ * PauliMatrix.pauliLower ρ b.2 b.1 * PauliMatrix.pauliLower ρ a.1 a.2) + • T (μ, a) := by refine Finset.sum_congr rfl fun a _ => ?_ congr 1 rw [show (∑ ρ : Fin 1 ⊕ Fin 3, - (2 : ℂ)⁻¹ * pauliLower ρ b.2 b.1 * pauliLower ρ a.1 a.2) + (2 : ℂ)⁻¹ * PauliMatrix.pauliLower ρ b.2 b.1 * PauliMatrix.pauliLower ρ a.1 a.2) = (2 : ℂ)⁻¹ * ∑ ρ : Fin 1 ⊕ Fin 3, - pauliLower ρ b.2 b.1 * pauliLower ρ a.1 a.2 from by + PauliMatrix.pauliLower ρ b.2 b.1 * PauliMatrix.pauliLower ρ a.1 a.2 from by rw [Finset.mul_sum] exact Finset.sum_congr rfl fun ρ _ => (mul_assoc _ _ _), - sum_pauliLower_mul_pauliLower a.1 a.2 b.1 b.2] + PauliMatrix.sum_pauliLower_mul_pauliLower a.1 a.2 b.1 b.2] field_simp _ = _ := by simp only [vectorPair, Matrix.cons_val_zero, Matrix.cons_val_one, @@ -285,23 +188,19 @@ lemma eq_sum_vectorPair (μ : Fin 1 ⊕ Fin 3) (b : Fin 2 × Fin 2) : omit hT in /-- Every component of `T` lies in the span of the components of the reduced family. -/ -lemma mem_span_vectorPair (d : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2) : - T d ∈ ⨆ e, ℂ ∙ vectorPair (T := T) e := by +lemma mem_componentSpan_vectorPair (d : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2) : + T d ∈ componentSpan (vectorPair (T := T)) := by rw [show T d = T (d.1, d.2) from rfl, eq_sum_vectorPair (T := T) d.1 d.2] - exact sum_mem fun ρ _ => Submodule.smul_mem _ _ - (Submodule.mem_iSup_of_mem _ (Submodule.mem_span_singleton_self _)) + exact sum_mem fun ρ _ => Submodule.smul_mem _ _ (mem_componentSpan_self _ _) -include hT in +omit hT in /-- The reduction does not change the span of the components. -/ -lemma componentSpan_vectorPair : componentSpan (vectorPair (T := T)) = hT.span := by - rw [componentSpan] - refine le_antisymm (iSup_le fun e => ?_) (iSup_le fun d => ?_) - · rw [Submodule.span_singleton_le_iff_mem] - exact hT.vectorPair_mem_span e - · rw [Submodule.span_singleton_le_iff_mem] - exact mem_span_vectorPair (T := T) d - -/-- The metric trace of the reduced family is exactly the Pauli contraction of `T`: the +lemma componentSpan_vectorPair : componentSpan (vectorPair (T := T)) = componentSpan T := + le_antisymm ((componentSpan_le_iff _ _).2 fun d => vectorPair_mem_componentSpan d) + ((componentSpan_le_iff _ _).2 fun d => mem_componentSpan_vectorPair d) + +omit hT in +/-- The metric contraction of the reduced family is exactly the Pauli contraction of `T`: the two lowerings of the vector index cancel, so no sign and no scalar appear. -/ lemma metricContraction_vectorPair : RankTwo.metricContraction (T := vectorPair (T := T)) = pauliContraction (T := T) := by @@ -312,7 +211,7 @@ lemma metricContraction_vectorPair : smul_smul] refine Finset.sum_congr rfl fun a _ => ?_ congr 1 - rw [pauliLower_eq_smul, Matrix.smul_apply, smul_eq_mul, ← mul_assoc] + rw [PauliMatrix.pauliLower_eq_smul, Matrix.smul_apply, smul_eq_mul, ← mul_assoc] rcases ν with ν | ν <;> fin_cases ν <;> norm_num [minkowskiMatrixZ] · rw [show minkowskiMatrixZ (![ν, ρ] 0) (![ν, ρ] 1) = 0 from by simp only [Matrix.cons_val_zero, Matrix.cons_val_one] @@ -321,57 +220,28 @@ lemma metricContraction_vectorPair : /-! -## D. The classification of the Lorentz invariants +## C. The classification of the Lorentz invariants -`RankTwo` classifies the invariants of `vectorPair`, and its metric trace is the Pauli +`RankTwo` classifies the invariants of `vectorPair`, and its metric contraction is the Pauli contraction of `T`, so every invariant of the span is a multiple of `pauliContraction`. -/ include hT in -/-- The Pauli contraction really is a Lorentz invariant: this is the metric invariance - `Λ η Λᵀ = η` read through the reduction of section C. -/ +/-- The Pauli contraction is a Lorentz invariant: `RankTwo.repLorentz_metricContraction` read + through the reduction. -/ lemma repLorentz_pauliContraction (g : SL(2,ℂ)) : repLorentz g (pauliContraction (T := T)) = pauliContraction (T := T) := by - have hV := hT.isLorentzCovariant_vectorPair - have hstep : ∀ d : Fin 2 → Fin 1 ⊕ Fin 3, - repLorentz g (((minkowskiMatrixZ (d 0) (d 1) : ℤ) : ℂ) • vectorPair (T := T) d) - = ∑ a : Fin 2 → Fin 1 ⊕ Fin 3, - (((minkowskiMatrixZ (d 0) (d 1) : ℤ) : ℂ) - * ∏ i : Fin 2, (((SL2C.toLorentzGroup g).1 (a i) (d i) : ℝ) : ℂ)) - • vectorPair (T := T) a := by - intro d - rw [map_smul, hV.repLorentz_T g d, Finset.smul_sum] - exact Finset.sum_congr rfl fun a _ => smul_smul _ _ _ - rw [← metricContraction_vectorPair (T := T), RankTwo.metricContraction, map_sum] - calc ∑ d : Fin 2 → Fin 1 ⊕ Fin 3, - repLorentz g (((minkowskiMatrixZ (d 0) (d 1) : ℤ) : ℂ) • vectorPair (T := T) d) - = ∑ a : Fin 2 → Fin 1 ⊕ Fin 3, (∑ d : Fin 2 → Fin 1 ⊕ Fin 3, - ((minkowskiMatrixZ (d 0) (d 1) : ℤ) : ℂ) - * ∏ i : Fin 2, (((SL2C.toLorentzGroup g).1 (a i) (d i) : ℝ) : ℂ)) - • vectorPair (T := 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, - ((minkowskiMatrixZ (a 0) (a 1) : ℤ) : ℂ) • vectorPair (T := T) a := by - refine Finset.sum_congr rfl fun a _ => ?_ - congr 1 - rw [sum_pi_fin_two] - rw [← sum_minkowskiMatrixZ_mul (SL2C.toLorentzGroup g) (a 0) (a 1)] - refine Finset.sum_congr rfl fun x _ => Finset.sum_congr rfl fun y _ => ?_ - simp only [Fin.prod_univ_two, Matrix.cons_val_zero, Matrix.cons_val_one] + rw [← metricContraction_vectorPair] + exact RankTwo.repLorentz_metricContraction hT.isLorentzCovariant_vectorPair g include hT in /-- Every Lorentz invariant in the span of the components is a multiple of `pauliContraction`. -/ -theorem exists_smul_pauliContraction_of_invariant {x : B} (hx : x ∈ hT.span) +theorem exists_smul_pauliContraction_of_invariant {x : B} (hx : x ∈ componentSpan T) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : ∃ a : ℂ, x = a • pauliContraction (T := T) := by - have hV := hT.isLorentzCovariant_vectorPair - have hx' : x ∈ componentSpan (vectorPair (T := T)) := by - rw [hT.componentSpan_vectorPair] - exact hx - obtain ⟨a, ha⟩ := RankTwo.exists_smul_metricContraction_of_invariant hV hx' hinv + obtain ⟨a, ha⟩ := RankTwo.exists_smul_metricContraction_of_invariant + hT.isLorentzCovariant_vectorPair (by rwa [componentSpan_vectorPair]) hinv exact ⟨a, by rwa [metricContraction_vectorPair] at ha⟩ include hT in @@ -379,32 +249,27 @@ include hT in error in `S`. -/ lemma exists_smul_pauliContraction_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) : + (hx : x ∈ componentSpan T ⊔ S) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : ∃ a : ℂ, ∃ y ∈ S, x = a • pauliContraction (T := T) + y := by - have hV := hT.isLorentzCovariant_vectorPair - have hx' : x ∈ componentSpan (vectorPair (T := T)) ⊔ S := by - rw [hT.componentSpan_vectorPair] - exact hx - obtain ⟨a, y, hy, ha⟩ := - RankTwo.exists_smul_metricContraction_of_invariant_subset hV S hS hx' hinv + obtain ⟨a, y, hy, ha⟩ := RankTwo.exists_smul_metricContraction_of_invariant_subset + hT.isLorentzCovariant_vectorPair S hS (by rwa [componentSpan_vectorPair]) hinv exact ⟨a, y, hy, by rwa [metricContraction_vectorPair] at ha⟩ end IsVectorLeftRightWeyl /-! -## E. The Pauli tensor as the model example +## D. The Pauli tensor as the model example The tensor product of the complex four-vector representation with the two Weyl -representations carries exactly this law on products of basis vectors, and the Pauli -contraction of that family is `PauliMatrix.asTensor`. So the classifier is not vacuous: -on the model family the invariant line is spanned by a tensor already known to be nonzero. +representations carries this law on products of basis vectors, and the Pauli contraction of +that family is `PauliMatrix.asTensor`, which by section C spans its invariants. -/ open Fermion in /-- The tensor product of the four-vector and the two Weyl representations carries this index - law on products of basis vectors: the basic example. -/ + law on products of basis vectors. -/ lemma isVectorLeftRightWeyl_pauli : IsVectorLeftRightWeyl (ContrℂModule ⊗[ℂ] (LeftHandedWeyl ⊗[ℂ] RightHandedWeyl)) (ContrℂModule.SL2CRep.tprod (LeftHandedWeyl.rep.tprod RightHandedWeyl.rep)) @@ -438,8 +303,7 @@ lemma isVectorLeftRightWeyl_pauli : module open PauliMatrix Fermion in -/-- Its Pauli contraction is `PauliMatrix.asTensor`, which by section D spans the invariants, - so the invariant space here really is one dimensional. -/ +/-- The Pauli contraction of the model family is `PauliMatrix.asTensor`. -/ lemma pauliContraction_pauli : IsVectorLeftRightWeyl.pauliContraction (T := fun d : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2 => complexContrBasis d.1 ⊗ₜ[ℂ] @@ -454,18 +318,17 @@ lemma pauliContraction_pauli : /-! -## F. Dual Weyl indices and the `ε` re-index +## E. Dual Weyl indices and the `ε` re-index -A `Module.Dual`-valued symbol carries the contragredient law on its spinor indices: -`IsDualLeftRightWeyl` for a Weyl pair alone, `IsVectorDualLeftRightWeyl` with a vector -index alongside. The symplectic form `ε` is what converts those laws into the fundamental -ones. +A `Module.Dual`-valued symbol carries the dual law on its spinor indices: `IsDualLeftRightWeyl` +for a Weyl pair alone, `IsVectorDualLeftRightWeyl` with a vector index alongside. The +symplectic identities of `Fermions.Weyl.Metric` convert those laws into the fundamental ones. -/ /-- A family `T` indexed by a dual left- and a dual right-handed Weyl index, moved as - `T_{α α'}`: the undotted index by the contragredient matrix, the dotted one by its - complex conjugate. -/ + `T_{α α'}`: the undotted index by the inverse transpose `(g⁻¹)ᵀ`, the dotted one by the + inverse conjugate transpose `(g⁻¹)ᴴ`. -/ structure IsDualLeftRightWeyl (B : Type*) [AddCommMonoid B] [Module ℂ B] (repLorentz : Representation ℂ SL(2,ℂ) B) (T : Fin 2 × Fin 2 → B) : Prop where @@ -485,8 +348,8 @@ structure IsVectorDualLeftRightWeyl (B : Type*) [AddCommMonoid B] [Module ℂ B] * ((g.1⁻¹)ᵀ a.1 l.1 * (g.1⁻¹)ᴴ a.2 l.2)) • T (ν, a) open Fermion in -/-- The tensor product of the two dual Weyl representations carries the mixed contragredient - law: the basic example. -/ +/-- The tensor product of the two dual Weyl representations carries the mixed dual law on + products of basis vectors. -/ lemma isDualLeftRightWeyl_dualWeyl : IsDualLeftRightWeyl (DualLeftHandedWeyl ⊗[ℂ] DualRightHandedWeyl) (DualLeftHandedWeyl.rep.tprod DualRightHandedWeyl.rep) @@ -500,23 +363,9 @@ lemma isDualLeftRightWeyl_dualWeyl : exact Finset.sum_congr rfl fun x _ => Finset.sum_congr rfl fun y _ => by rw [mul_comm] -/-- The entries of the symplectic form are real. -/ -lemma star_epsilon_apply (l k : Fin 2) : star (epsilon.1 l k) = epsilon.1 l k := by - fin_cases l <;> fin_cases k <;> simp [SL2C.epsilon_coe] - -/-- The conjugate single-index form of the symplectic identity: moving a conjugate - contragredient factor across `ε` turns it into a conjugate fundamental factor. -/ -lemma sum_epsilon_mul_inv_conjTranspose (g : SL(2,ℂ)) (l a : Fin 2) : - ∑ k : Fin 2, epsilon.1 l k * (g.1⁻¹)ᴴ a k - = ∑ b : Fin 2, star (g.1 b l) * epsilon.1 b a := by - have h := congrArg star (sum_epsilon_mul_inv_transpose g l a) - simp only [star_sum, star_mul', star_epsilon_apply] at h - rw [← h] - exact Finset.sum_congr rfl fun k _ => by - rw [Matrix.conjTranspose_apply, Matrix.transpose_apply] - -/-- The mixed two-index form of the symplectic identity, obtained from the plain and the - conjugate single-index forms by factorising each sum over the two slots. -/ +/-- The mixed two-slot form of the symplectic identities `sum_epsilon_mul_inv_transpose` and + `sum_epsilon_mul_inv_conjTranspose`: moving `(g⁻¹)ᵀ` and `(g⁻¹)ᴴ` across `ε` turns them into + `g` and its conjugate on the other slots. -/ lemma sum_mixedEpsilon_mul_inv (g : SL(2,ℂ)) (l a : Fin 2 × Fin 2) : ∑ k : Fin 2 × Fin 2, (epsilon.1 l.1 k.1 * epsilon.1 l.2 k.2) * ((g.1⁻¹)ᵀ a.1 k.1 * (g.1⁻¹)ᴴ a.2 k.2) @@ -536,42 +385,25 @@ lemma sum_mixedEpsilon_mul_inv (g : SL(2,ℂ)) (l a : Fin 2 × Fin 2) : exact Finset.sum_congr rfl fun b₁ _ => Finset.sum_congr rfl fun b₂ _ => by ring rw [← hL, ← hR, sum_epsilon_mul_inv_transpose, sum_epsilon_mul_inv_conjTranspose] -/-- The `ε` re-index turns a family with the mixed contragredient index law into a family - with the mixed fundamental index law, for the very same representation. -/ +/-- The `ε` re-index turns the mixed dual law into the mixed fundamental law for the same + representation: the symplectic identity `sum_mixedEpsilon_mul_inv` is the only mathematical + step. -/ lemma IsDualLeftRightWeyl.isLeftRightWeyl_epsReindex {B : Type*} [AddCommGroup B] [Module ℂ B] {repLorentz : Representation ℂ SL(2,ℂ) B} {T : Fin 2 × Fin 2 → B} (hT : IsDualLeftRightWeyl B repLorentz T) : IsLeftRightWeyl B repLorentz (epsReindex T) where repLorentz_T g l := by - have hstep : ∀ k : Fin 2 × Fin 2, - (epsilon.1 l.1 k.1 * epsilon.1 l.2 k.2) • repLorentz g (T k) - = ∑ a : Fin 2 × Fin 2, ((epsilon.1 l.1 k.1 * epsilon.1 l.2 k.2) - * ((g.1⁻¹)ᵀ a.1 k.1 * (g.1⁻¹)ᴴ a.2 k.2)) • T a := by - intro k - rw [hT.repLorentz_T, Finset.smul_sum] - exact Finset.sum_congr rfl fun a _ => smul_smul _ _ _ - calc repLorentz g (epsReindex T l) - = ∑ k : Fin 2 × Fin 2, (epsilon.1 l.1 k.1 * epsilon.1 l.2 k.2) - • repLorentz g (T k) := by - simp only [epsReindex, map_sum, map_smul] - _ = ∑ a : Fin 2 × Fin 2, (∑ k : Fin 2 × Fin 2, - (epsilon.1 l.1 k.1 * epsilon.1 l.2 k.2) - * ((g.1⁻¹)ᵀ a.1 k.1 * (g.1⁻¹)ᴴ a.2 k.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, (∑ b : Fin 2 × Fin 2, (g.1 b.1 l.1 * star (g.1 b.2 l.2)) - * (epsilon.1 b.1 a.1 * epsilon.1 b.2 a.2)) • T a := - Finset.sum_congr rfl fun a _ => by rw [sum_mixedEpsilon_mul_inv] - _ = ∑ b : Fin 2 × Fin 2, (g.1 b.1 l.1 * star (g.1 b.2 l.2)) • epsReindex T b := by - symm - simp only [epsReindex, Finset.smul_sum, smul_smul] - rw [Finset.sum_comm] - exact Finset.sum_congr rfl fun a _ => (Finset.sum_smul).symm + have h := (repLorentz g).map_sum_smul_of_forall_eq T T + (fun a k => (g.1⁻¹)ᵀ a.1 k.1 * (g.1⁻¹)ᴴ a.2 k.2) (hT.repLorentz_T g) + (fun k => epsilon.1 l.1 k.1 * epsilon.1 l.2 k.2) + simp only [sum_mixedEpsilon_mul_inv] at h + rw [Fintype.sum_sum_mul_smul (fun (a b : Fin 2 × Fin 2) => + epsilon.1 b.1 a.1 * epsilon.1 b.2 a.2)] at h + exact h /-! -## G. The `ε` re-index of a vector-Weyl family +## F. The `ε` re-index of a vector-Weyl family Re-indexing both spinor slots by `ε` sends a family with the dual law to one with the fundamental law, without touching the representation, and does not change the span. It @@ -579,14 +411,17 @@ does move the contraction: the Pauli matrices go to their transposes. -/ -/-- Conjugating a Pauli matrix by the symplectic form on both spinor slots produces the - conjugate Pauli matrix of the same vector index. -/ +/-- The transposes `(σ_μ)ᵀ` of the covariant Pauli matrices, entrywise `(1, -σ₁, σ₂, -σ₃)`. -/ +def pauliBar (μ : Fin 1 ⊕ Fin 3) : Matrix (Fin 2) (Fin 2) ℂ := (PauliMatrix.pauliLower μ)ᵀ + +/-- Conjugating a Pauli matrix by the symplectic form on both spinor slots produces + `pauliBar` of the same vector index. -/ lemma sum_pauliMatrix_mul_epsilon (μ : Fin 1 ⊕ Fin 3) (k₁ k₂ : Fin 2) : ∑ a : Fin 2 × Fin 2, PauliMatrix.pauliMatrix μ a.1 a.2 * (epsilon.1 a.1 k₁ * epsilon.1 a.2 k₂) = pauliBar μ k₁ k₂ := by rcases μ with μ | μ <;> fin_cases μ <;> fin_cases k₁ <;> fin_cases k₂ <;> simp [Fintype.sum_prod_type, Fin.sum_univ_two, PauliMatrix.pauliMatrix, - pauliBar, pauliLower, PauliMatrix.pauliSelfAdjoint', SL2C.epsilon_coe] + pauliBar, PauliMatrix.pauliLower, PauliMatrix.pauliSelfAdjoint', SL2C.epsilon_coe] /-- The `ε` re-index of such a family: the vector index is left alone and both spinor slots are sent through the symplectic form. -/ @@ -611,23 +446,17 @@ lemma vectorEpsReindex_vectorEpsReindex : have h : (fun k => vectorEpsReindex T (μ, k)) = epsReindex (fun k => T (μ, k)) := rfl rw [vectorEpsReindex_eq_epsReindex, h, epsReindex_epsReindex] -/-- Every re-indexed component lies in the span of the original components. -/ -lemma vectorEpsReindex_mem_iSup (d : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2) : - vectorEpsReindex T d ∈ ⨆ e, ℂ ∙ T e := - sum_mem fun k _ => Submodule.smul_mem _ _ - (Submodule.mem_iSup_of_mem (d.1, k) (Submodule.mem_span_singleton_self _)) - /-- The re-index does not change the span of the components. -/ -lemma iSup_span_vectorEpsReindex : - (⨆ d, ℂ ∙ vectorEpsReindex T d) = ⨆ d, ℂ ∙ T d := by - refine le_antisymm (iSup_le fun d => ?_) (iSup_le fun d => ?_) - · rw [Submodule.span_singleton_le_iff_mem] - exact vectorEpsReindex_mem_iSup T d - · rw [Submodule.span_singleton_le_iff_mem] - have h : T d = vectorEpsReindex (vectorEpsReindex T) d := by +lemma componentSpan_vectorEpsReindex : + componentSpan (vectorEpsReindex T) = componentSpan T := by + refine le_antisymm ((componentSpan_le_iff _ _).2 fun d => ?_) + ((componentSpan_le_iff _ _).2 fun d => ?_) + · exact sum_mem fun k _ => Submodule.smul_mem _ _ (mem_componentSpan_self T (d.1, k)) + · have h : T d = vectorEpsReindex (vectorEpsReindex T) d := by rw [vectorEpsReindex_vectorEpsReindex] rw [h] - exact vectorEpsReindex_mem_iSup (vectorEpsReindex T) d + exact sum_mem fun k _ => Submodule.smul_mem _ _ + (mem_componentSpan_self (vectorEpsReindex T) (d.1, k)) end VectorReindex @@ -637,64 +466,51 @@ variable {B : Type*} [AddCommGroup B] [Module ℂ B] {repLorentz : Representation ℂ SL(2,ℂ) B} {T : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2 → B} -/-- The conjugate Pauli contraction `σ̄_μ^{α' α} T^μ{}_{α α'}`, against a dual Weyl pair. -/ +/-- The contraction `∑ μ, ∑ a, pauliBar μ a₁ a₂ • T (μ, a)` against the transposed Pauli + matrices, the invariant of a vector index against a dual Weyl pair. -/ noncomputable def pauliBarContraction : B := ∑ μ : Fin 1 ⊕ Fin 3, ∑ a : Fin 2 × Fin 2, pauliBar μ a.1 a.2 • T (μ, a) -/-- The `ε` re-index turns a family with the mixed contragredient index law into a family - with the mixed fundamental index law, for the very same representation. -/ +/-- The index law as one matrix on the product index. -/ +lemma repLorentz_T' (hT : IsVectorDualLeftRightWeyl B repLorentz T) (g : SL(2,ℂ)) + (d : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2) : + repLorentz g (T d) = ∑ e : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2, + ((((SL2C.toLorentzGroup g).1 e.1 d.1 : ℝ) : ℂ) + * ((g.1⁻¹)ᵀ e.2.1 d.2.1 * (g.1⁻¹)ᴴ e.2.2 d.2.2)) • T e := by + rw [show d = (d.1, d.2) from rfl, hT.repLorentz_T, Fintype.sum_prod_type] + +/-- The `ε` re-index turns the mixed dual law into the mixed fundamental law for the same + representation, the vector slot untouched: `sum_mixedEpsilon_mul_inv` is the only + mathematical step. -/ lemma isVectorLeftRightWeyl_vectorEpsReindex (hT : IsVectorDualLeftRightWeyl B repLorentz T) : IsVectorLeftRightWeyl B repLorentz (vectorEpsReindex T) where repLorentz_T g μ l := by - have hstep : ∀ k : Fin 2 × Fin 2, - (epsilon.1 l.1 k.1 * epsilon.1 l.2 k.2) • repLorentz g (T (μ, k)) - = ∑ ν : Fin 1 ⊕ Fin 3, ∑ b : Fin 2 × Fin 2, - ((epsilon.1 l.1 k.1 * epsilon.1 l.2 k.2) - * ((((SL2C.toLorentzGroup g).1 ν μ : ℝ) : ℂ) - * ((g.1⁻¹)ᵀ b.1 k.1 * (g.1⁻¹)ᴴ b.2 k.2))) • T (ν, b) := by - intro k - rw [hT.repLorentz_T g μ k, Finset.smul_sum] - exact Finset.sum_congr rfl fun ν _ => by - rw [Finset.smul_sum] - exact Finset.sum_congr rfl fun b _ => smul_smul _ _ _ - calc repLorentz g (vectorEpsReindex T (μ, l)) - = ∑ k : Fin 2 × Fin 2, (epsilon.1 l.1 k.1 * epsilon.1 l.2 k.2) - • repLorentz g (T (μ, k)) := by - simp only [vectorEpsReindex, map_sum, map_smul] - _ = ∑ ν : Fin 1 ⊕ Fin 3, ∑ b : Fin 2 × Fin 2, (∑ k : Fin 2 × Fin 2, - (epsilon.1 l.1 k.1 * epsilon.1 l.2 k.2) - * ((((SL2C.toLorentzGroup g).1 ν μ : ℝ) : ℂ) - * ((g.1⁻¹)ᵀ b.1 k.1 * (g.1⁻¹)ᴴ b.2 k.2))) • T (ν, b) := by - simp only [hstep] - rw [Finset.sum_comm] - refine Finset.sum_congr rfl fun ν _ => ?_ - rw [Finset.sum_comm] - exact Finset.sum_congr rfl fun b _ => (Finset.sum_smul).symm - _ = ∑ ν : Fin 1 ⊕ Fin 3, ∑ a : Fin 2 × Fin 2, - ((((SL2C.toLorentzGroup g).1 ν μ : ℝ) : ℂ) - * (g.1 a.1 l.1 * star (g.1 a.2 l.2))) • vectorEpsReindex T (ν, a) := by - refine Finset.sum_congr rfl fun ν _ => ?_ - have hinner : ∀ b : Fin 2 × Fin 2, - (∑ k : Fin 2 × Fin 2, (epsilon.1 l.1 k.1 * epsilon.1 l.2 k.2) - * ((((SL2C.toLorentzGroup g).1 ν μ : ℝ) : ℂ) - * ((g.1⁻¹)ᵀ b.1 k.1 * (g.1⁻¹)ᴴ b.2 k.2))) - = (((SL2C.toLorentzGroup g).1 ν μ : ℝ) : ℂ) - * ∑ a : Fin 2 × Fin 2, (g.1 a.1 l.1 * star (g.1 a.2 l.2)) - * (epsilon.1 a.1 b.1 * epsilon.1 a.2 b.2) := by - intro b - rw [← sum_mixedEpsilon_mul_inv g l b, Finset.mul_sum] - exact Finset.sum_congr rfl fun k _ => by ring - simp only [hinner] - symm - simp only [vectorEpsReindex, Finset.smul_sum, smul_smul] - rw [Finset.sum_comm] - refine Finset.sum_congr rfl fun b _ => ?_ - rw [← Finset.sum_smul, Finset.mul_sum] - exact congrArg (· • T (ν, b)) (Finset.sum_congr rfl fun a _ => by ring) - -/-- The re-index carries the Pauli contraction of the re-indexed family to the conjugate Pauli - contraction of the original, with no sign or scalar. -/ + have h := (repLorentz g).map_sum_smul_of_forall_eq (fun k => T (μ, k)) T + (fun e k => (((SL2C.toLorentzGroup g).1 e.1 μ : ℝ) : ℂ) + * ((g.1⁻¹)ᵀ e.2.1 k.1 * (g.1⁻¹)ᴴ e.2.2 k.2)) (fun k => hT.repLorentz_T' g (μ, k)) + (fun k => epsilon.1 l.1 k.1 * epsilon.1 l.2 k.2) + refine h.trans ?_ + rw [Fintype.sum_prod_type] + refine Finset.sum_congr rfl fun ν _ => ?_ + have hinner : ∀ b : Fin 2 × Fin 2, + (∑ k : Fin 2 × Fin 2, (epsilon.1 l.1 k.1 * epsilon.1 l.2 k.2) + * ((((SL2C.toLorentzGroup g).1 ν μ : ℝ) : ℂ) + * ((g.1⁻¹)ᵀ b.1 k.1 * (g.1⁻¹)ᴴ b.2 k.2))) + = (((SL2C.toLorentzGroup g).1 ν μ : ℝ) : ℂ) + * ∑ a : Fin 2 × Fin 2, (g.1 a.1 l.1 * star (g.1 a.2 l.2)) + * (epsilon.1 a.1 b.1 * epsilon.1 a.2 b.2) := fun b => by + rw [← sum_mixedEpsilon_mul_inv g l b, Finset.mul_sum] + exact Finset.sum_congr rfl fun k _ => by ring + simp only [hinner, mul_smul, ← Finset.smul_sum] + rw [Fintype.sum_sum_mul_smul (fun (b a : Fin 2 × Fin 2) => + epsilon.1 a.1 b.1 * epsilon.1 a.2 b.2) + (fun a => g.1 a.1 l.1 * star (g.1 a.2 l.2)) (fun b => T (ν, b))] + simp only [← mul_smul] + rfl + +/-- The re-index carries the Pauli contraction of the re-indexed family to the + `pauliBar` contraction of the original, with no sign or scalar. -/ lemma pauliContraction_vectorEpsReindex : IsVectorLeftRightWeyl.pauliContraction (T := vectorEpsReindex T) = pauliBarContraction (T := T) := by @@ -709,11 +525,11 @@ end IsVectorDualLeftRightWeyl /-! -## H. The classification of the invariants of the dual families +## G. The classification of the invariants of the dual families -Transporting sections D and G along the re-index: a dual Weyl pair with no vector index -has no invariant at all, so there is no Dirac mass term, and with a vector index every -invariant is a multiple of the conjugate Pauli contraction. +Transporting sections C and F along the re-index: a dual Weyl pair with no vector index has +no invariant, and with a vector index every invariant is a multiple of the `pauliBar` +contraction. -/ @@ -722,66 +538,54 @@ section DualClassification variable {B : Type*} [AddCommGroup B] [Module ℂ B] {repLorentz : Representation ℂ SL(2,ℂ) B} -/-- A dual left-handed and a dual right-handed Weyl index have no invariant contraction, so - every Lorentz invariant of the span is zero. This is the absence of a Dirac mass term. -/ +/-- A dual left-handed and a dual right-handed Weyl index with no vector index between them + have no Lorentz invariant in the span of their components but `0`: the mixed pair is the + four-vector representation, whose invariants need a second vector index, as in + `IsVectorDualLeftRightWeyl`. -/ theorem IsDualLeftRightWeyl.eq_zero_of_invariant {T : Fin 2 × Fin 2 → B} - (hT : IsDualLeftRightWeyl B repLorentz T) {x : B} (hx : x ∈ ⨆ d, ℂ ∙ T d) - (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x = 0 := by - have hT' := hT.isLeftRightWeyl_epsReindex - have hx' : x ∈ hT'.span := by - rw [IsLeftRightWeyl.span, iSup_span_epsReindex] - exact hx - exact hT'.eq_zero_of_invariant hx' hinv + (hT : IsDualLeftRightWeyl B repLorentz T) {x : B} (hx : x ∈ componentSpan T) + (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x = 0 := + hT.isLeftRightWeyl_epsReindex.eq_zero_of_invariant (by rwa [componentSpan_epsReindex]) hinv /-- The same modulo a Lorentz-stable subspace `S`: such an invariant already lies in `S`. -/ theorem IsDualLeftRightWeyl.mem_of_invariant_of_mem_sup {T : Fin 2 × Fin 2 → B} (hT : IsDualLeftRightWeyl B repLorentz T) {x : B} (S : Submodule ℂ B) (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) - (hx : x ∈ (⨆ d, ℂ ∙ T d) ⊔ S) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by - have hT' := hT.isLeftRightWeyl_epsReindex - have hx' : x ∈ hT'.span ⊔ S := by - rw [IsLeftRightWeyl.span, iSup_span_epsReindex] - exact hx - exact hT'.mem_of_invariant_of_mem_sup S hS hx' hinv + (hx : x ∈ componentSpan T ⊔ S) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := + hT.isLeftRightWeyl_epsReindex.mem_of_invariant_of_mem_sup S hS + (by rwa [componentSpan_epsReindex]) hinv namespace IsVectorDualLeftRightWeyl variable {T : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2 → B} -/-- The conjugate Pauli contraction of a family with the mixed contragredient index law - is Lorentz invariant. -/ +/-- The `pauliBar` contraction of a family with the mixed dual law is Lorentz invariant. -/ lemma repLorentz_pauliBarContraction (hT : IsVectorDualLeftRightWeyl B repLorentz T) (g : SL(2,ℂ)) : repLorentz g (pauliBarContraction (T := T)) = pauliBarContraction (T := T) := by have h := hT.isVectorLeftRightWeyl_vectorEpsReindex.repLorentz_pauliContraction g rwa [pauliContraction_vectorEpsReindex] at h -/-- For the mixed contragredient law, every Lorentz invariant of the span is a multiple of the - conjugate Pauli contraction. This is the kinetic term of a Weyl fermion. -/ +/-- For the mixed dual law, every Lorentz invariant of the span is a multiple of the + `pauliBar` contraction. This is the kinetic term of a Weyl fermion. -/ theorem exists_smul_pauliBarContraction_of_invariant - (hT : IsVectorDualLeftRightWeyl B repLorentz T) {x : B} (hx : x ∈ ⨆ d, ℂ ∙ T d) + (hT : IsVectorDualLeftRightWeyl B repLorentz T) {x : B} (hx : x ∈ componentSpan T) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : ∃ a : ℂ, x = a • pauliBarContraction (T := T) := by - have hT' := hT.isVectorLeftRightWeyl_vectorEpsReindex - have hx' : x ∈ hT'.span := by - rw [IsVectorLeftRightWeyl.span, iSup_span_vectorEpsReindex] - exact hx - obtain ⟨a, ha⟩ := hT'.exists_smul_pauliContraction_of_invariant hx' hinv + obtain ⟨a, ha⟩ := + hT.isVectorLeftRightWeyl_vectorEpsReindex.exists_smul_pauliContraction_of_invariant + (by rwa [componentSpan_vectorEpsReindex]) hinv exact ⟨a, by rwa [pauliContraction_vectorEpsReindex] at ha⟩ -/-- The classification of the Lorentz invariants of a family with the mixed - contragredient index law, modulo a Lorentz-stable submodule `S`. -/ +/-- The same modulo a Lorentz-stable submodule `S`. -/ theorem exists_smul_pauliBarContraction_of_invariant_subset (hT : IsVectorDualLeftRightWeyl B repLorentz T) {x : B} (S : Submodule ℂ B) (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) - (hx : x ∈ (⨆ d, ℂ ∙ T d) ⊔ S) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : + (hx : x ∈ componentSpan T ⊔ S) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : ∃ a : ℂ, ∃ y ∈ S, x = a • pauliBarContraction (T := T) + y := by - have hT' := hT.isVectorLeftRightWeyl_vectorEpsReindex - have hx' : x ∈ hT'.span ⊔ S := by - rw [IsVectorLeftRightWeyl.span, iSup_span_vectorEpsReindex] - exact hx obtain ⟨a, y, hy, ha⟩ := - hT'.exists_smul_pauliContraction_of_invariant_subset S hS hx' hinv + hT.isVectorLeftRightWeyl_vectorEpsReindex.exists_smul_pauliContraction_of_invariant_subset + S hS (by rwa [componentSpan_vectorEpsReindex]) hinv exact ⟨a, y, hy, by rwa [pauliContraction_vectorEpsReindex] at ha⟩ end IsVectorDualLeftRightWeyl diff --git a/Physlib/Relativity/LorentzGroup/Invariants/LorentzCovariance.lean b/Physlib/Relativity/LorentzGroup/Invariants/LorentzCovariance.lean index ab62ab298..18a9b6c1d 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/LorentzCovariance.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/LorentzCovariance.lean @@ -51,6 +51,15 @@ variable {ι B : Type*} [AddCommMonoid B] [Module ℂ B] /-- The span of the components of a family `T`. -/ def componentSpan (T : ι → B) : Submodule ℂ B := ⨆ i, ℂ ∙ T i +/-- Every component lies in the component span. -/ +lemma mem_componentSpan_self (T : ι → B) (i : ι) : T i ∈ componentSpan T := + Submodule.mem_iSup_of_mem i (Submodule.mem_span_singleton_self _) + +/-- The component span lies in a submodule exactly when every component does. -/ +lemma componentSpan_le_iff (T : ι → B) (N : Submodule ℂ B) : + componentSpan T ≤ N ↔ ∀ i, T i ∈ N := + iSup_le_iff.trans (forall_congr' fun _ => Submodule.span_singleton_le_iff_mem _ _) + variable [Fintype ι] /-- A vector lies in the component span exactly when it is a combination `∑ i, c i • T i`. -/ diff --git a/Physlib/Relativity/LorentzGroup/Invariants/RankTwo.lean b/Physlib/Relativity/LorentzGroup/Invariants/RankTwo.lean index a8b91479a..8447b0492 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/RankTwo.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/RankTwo.lean @@ -337,6 +337,22 @@ lemma boostAverageZ_symm (d e : Fin 2 → Fin 1 ⊕ Fin 3) : noncomputable def metricContraction : B := ∑ d : Fin 2 → Fin 1 ⊕ Fin 3, ((minkowskiMatrixZ (d 0) (d 1) : ℤ) : ℂ) • T d +/-- The Minkowski metric, as a coefficient tensor on two slots, is fixed by every Lorentz + matrix: `Λ η Λᵀ = η`, which is `LorentzGroup.sum_minkowskiMatrixZ_mul`. -/ +lemma isInvariantCoeff_minkowskiMatrixZ : + IsInvariantCoeff fun d : Fin 2 → Fin 1 ⊕ Fin 3 => ((minkowskiMatrixZ (d 0) (d 1) : ℤ) : ℂ) := by + intro g + funext a + simp only [act] + rw [← (piFinTwoEquiv fun _ => Fin 1 ⊕ Fin 3).symm.sum_comp, Fintype.sum_prod_type] + simp only [piFinTwoEquiv_symm_apply, Fin.prod_univ_two] + exact LorentzGroup.sum_minkowskiMatrixZ_mul (SL2C.toLorentzGroup g) (a 0) (a 1) + +/-- The metric contraction of a rank-two family is a Lorentz invariant. -/ +lemma repLorentz_metricContraction (hT : IsLorentzCovariant 2 B repLorentz T) (g : SL(2,ℂ)) : + repLorentz g (metricContraction (T := T)) = metricContraction (T := T) := + hT.isInvariant_sum_smul isInvariantCoeff_minkowskiMatrixZ g + /-! ## E.2. Iterating the averaged round on the coefficients diff --git a/Physlib/Relativity/PauliMatrices/SelfAdjoint.lean b/Physlib/Relativity/PauliMatrices/SelfAdjoint.lean index 9a3ceab64..d714b5da5 100644 --- a/Physlib/Relativity/PauliMatrices/SelfAdjoint.lean +++ b/Physlib/Relativity/PauliMatrices/SelfAdjoint.lean @@ -470,4 +470,28 @@ lemma pauliBasis_minkowskiMetric_pauliBasis' (i : Fin 1 ⊕ Fin 3) : simp [pauliSelfAdjoint', pauliSelfAdjoint, pauliBasis, pauliBasis', minkowskiMatrix.inr_i_inr_i, Subtype.ext_iff, NegMemClass.coe_neg, neg_neg] +/-! ### The covariant Pauli matrices as plain matrices -/ + +/-- The Pauli matrices with the vector index lowered by the Minkowski metric, + `σ_μ = η_{μμ} σ^μ`, as plain matrices: the underlying matrices of `pauliSelfAdjoint'`. -/ +def pauliLower (μ : Fin 1 ⊕ Fin 3) : Matrix (Fin 2) (Fin 2) ℂ := (pauliSelfAdjoint' μ).1 + +/-- The covariant Pauli matrices are the underlying matrices of the basis `pauliBasis'`. -/ +lemma pauliBasis'_coe (μ : Fin 1 ⊕ Fin 3) : (pauliBasis' μ).1 = pauliLower μ := by + rw [pauliBasis', Basis.coe_mk, pauliLower] + +/-- Lowering the vector index multiplies by the diagonal entry of the metric. -/ +lemma pauliLower_eq_smul (μ : Fin 1 ⊕ Fin 3) : + pauliLower μ = ((minkowskiMatrixZ μ μ : ℤ) : ℂ) • pauliMatrix μ := by + rcases μ with μ | μ <;> fin_cases μ <;> simp [pauliLower, pauliSelfAdjoint', minkowskiMatrixZ] + +/-- The Fierz completeness relation: the covariant Pauli matrices span the `2 × 2` matrices, + with the trace pairing as the duality and normalisation `2`. -/ +lemma sum_pauliLower_mul_pauliLower (α α' β β' : Fin 2) : + ∑ ρ : Fin 1 ⊕ Fin 3, pauliLower ρ β' β * pauliLower ρ α α' + = 2 * ((if α = β then 1 else 0) * (if α' = β' then 1 else 0)) := by + fin_cases α <;> fin_cases α' <;> fin_cases β <;> fin_cases β' <;> + simp [pauliLower, pauliSelfAdjoint', pauliMatrix, Fintype.sum_sum_type, Fin.sum_univ_three] <;> + norm_num [Complex.ext_iff] + end PauliMatrix diff --git a/Physlib/Relativity/SL2C/Basic.lean b/Physlib/Relativity/SL2C/Basic.lean index 07d7f16b5..94d57052f 100644 --- a/Physlib/Relativity/SL2C/Basic.lean +++ b/Physlib/Relativity/SL2C/Basic.lean @@ -38,6 +38,29 @@ lemma inverse_coe (M : SL(2, ℂ)) : M.1⁻¹ = (M⁻¹).1 := by simp lemma transpose_coe (M : SL(2, ℂ)) : M.1ᵀ = (M.transpose).1 := rfl + +/-- Entrywise complex conjugation as a monoid endomorphism of `SL(2,ℂ)`: Mathlib's + `SpecialLinearGroup.map` along `starRingEnd ℂ`. -/ +abbrev conjHom : SL(2,ℂ) →* SL(2,ℂ) := SpecialLinearGroup.map (starRingEnd ℂ) + +lemma conjHom_coe (g : SL(2,ℂ)) : (conjHom g).1 = g.1.map star := rfl + +/-- Conjugation is an involution, hence surjective. -/ +lemma conjHom_involutive : Function.Involutive conjHom := by + intro g + apply Subtype.ext + ext i j + simp + +/-- Conjugating the group argument undoes the conjugation of the entries: the inverse + conjugate transpose at `conjHom g` is the inverse transpose at `g`. -/ +lemma conjHom_inv_conjTranspose (g : SL(2,ℂ)) : (((conjHom g).1)⁻¹)ᴴ = (g.1⁻¹)ᵀ := by + have h1 : ((conjHom g).1)⁻¹ = (g.1⁻¹).map star := by + rw [inverse_coe, ← map_inv, inverse_coe] + rfl + rw [h1] + ext i j + simp [Matrix.conjTranspose_apply, Matrix.map_apply] /-! ## Representation of SL(2, ℂ) on spacetime @@ -188,6 +211,25 @@ lemma toSelfAdjointMap_basis (i : Fin 1 ⊕ Fin 3) : ((toSelfAdjointMap M) (PauliMatrix.pauliBasis' i)))] rfl +/-- The intertwining identity `toSelfAdjointMap_basis` read entrywise: sandwiching the + covariant Pauli matrix `σ_μ` between `g` and `gᴴ` mixes the covariant Pauli matrices by the + column `μ` of the Lorentz matrix of `g`, the summed Lorentz index first. -/ +lemma sum_pauliLower_mul_sl2c (g : SL(2,ℂ)) (μ : Fin 1 ⊕ Fin 3) (β β' : Fin 2) : + ∑ p : Fin 2 × Fin 2, PauliMatrix.pauliLower μ p.1 p.2 * (g.1 β p.1 * star (g.1 β' p.2)) + = ∑ ν : Fin 1 ⊕ Fin 3, (((toLorentzGroup g).1 ν μ : ℝ) : ℂ) + * PauliMatrix.pauliLower ν β β' := by + have h := congrArg (fun A : selfAdjoint (Matrix (Fin 2) (Fin 2) ℂ) => A.1 β β') + (toSelfAdjointMap_basis (M := g) μ) + simp only [toSelfAdjointMap_apply_coe, AddSubmonoidClass.coe_finsetSum, + Matrix.sum_apply, selfAdjoint.val_smul, Matrix.smul_apply, Complex.real_smul, + PauliMatrix.pauliBasis'_coe] at h + rw [← h, Matrix.mul_apply, Fintype.sum_prod_type_right] + refine Finset.sum_congr rfl fun p₂ _ => ?_ + rw [Matrix.mul_apply, Finset.sum_mul] + exact Finset.sum_congr rfl fun p₁ _ => by + rw [Matrix.conjTranspose_apply] + ring + lemma toSelfAdjointMap_pauliBasis (i : Fin 1 ⊕ Fin 3) : toSelfAdjointMap M (PauliMatrix.pauliBasis i) = ∑ j, (toLorentzGroup M⁻¹).1 i j • PauliMatrix.pauliBasis j := by From 7db2baf182932c35fcb5ed5d00b5f321049ae906 Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Mon, 21 Sep 2026 15:47:10 +0400 Subject: [PATCH 334/367] docs: add AI task folder and some AI analysis tasks --- AITasks/Done/.gitkeep | 0 AITasks/ToDo/boost-weight-extraction.md | 157 ++++++++++++++++++ AITasks/ToDo/invariant-coefficient-sharing.md | 144 ++++++++++++++++ 3 files changed, 301 insertions(+) create mode 100644 AITasks/Done/.gitkeep create mode 100644 AITasks/ToDo/boost-weight-extraction.md create mode 100644 AITasks/ToDo/invariant-coefficient-sharing.md diff --git a/AITasks/Done/.gitkeep b/AITasks/Done/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/AITasks/ToDo/boost-weight-extraction.md b/AITasks/ToDo/boost-weight-extraction.md new file mode 100644 index 000000000..a334911ae --- /dev/null +++ b/AITasks/ToDo/boost-weight-extraction.md @@ -0,0 +1,157 @@ +# Prepare the boost-weight product and parity extraction + +## Task and output + +Perform a read-only mathematical and dependency investigation. Write your findings to +`AITasks/Done/boost-weight-extraction-report.md`. This is preparation for a bounded +post-bump extraction, not implementation or a claim of Lean verification. No prior +chat is needed, and this task does not depend on the coefficient-lifting report. + +Determine which boost-weight multiplication, support and parity results currently in +Standard Model files should be reusable general results, and precisely how to extract +them without changing the existing classifications or strengthening their assumptions. + +## Source baseline and working rules + +This handoff was checked against PR #1415 source commit +`5589e23dde62da95d6f7e4d9467cf63ecc111680` (Lean/Mathlib 4.33.0). A separate task is +integrating upstream's 4.34.0 bump. Use a separate checkout supplied by the human, not +the active bump workspace. Record the actual commit, toolchain, manifest revision and +any relevant dirty source files you inspect. If the PR has advanced, locate the named +declarations and report material differences. Do not invent missing source content. + +Read `AGENTS.md`, `AI-POLICY.md` and `docs/ReviewGuidelines.md`. + +- Only write the output report. Leave this task file in `ToDo` for human acceptance. +- Do not edit Lean files, imports, dependencies, other reports or the roadmap. +- Do not run Lean probes, builds, cache downloads, dependency updates or linters. + This task-specific restriction overrides repository default validation instructions. +- Do not stage, commit, push, fetch, switch branches, stash, reset or delete files. +- Do not interrupt workers or contact reviewers. Preserve all pre-existing work. +- Inspect locally available Mathlib source if useful, recording its version. Reserve + claims about 4.34.0 API availability for that version's actual source or later probes. + +## Sources to read + +1. `Physlib/Relativity/LorentzGroup/Boosts/WeightGrading.lean`: + - `Lorentz.BoostWeight.boostWeightSubmodule` + - `mul_mem_boostWeightSubmodule`, `boostWeightSubmodule_iSupIndep` + - `mem_boostWeightSubmodule_zero_of_invariant` + - `mem_of_mem_iSup_of_boostWeight_zero` + - `WeightDecomposition` and its `copy`/`sup` API +2. `Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/MassDimLTEight.lean`: + sections A and B, in `Lorentz.BoostWeight.WeightDecomposition`: + - `mul_le_iSup_convolution`, `mulOfMul`, `mulOfMul_supp` + - `exists_add_eq_of_mem_mulOfMul_supp` + - `two_dvd_of_mem_mulOfMul_supp`, `not_two_dvd_of_mem_mulOfMul_supp` + - `sup_supp`, `map_boostWeightSubmodule_le` + - `mem_of_invariant_of_mem_sup_of_odd_supp` + Read the later SM applications to understand their contracts, not to refactor them. +3. `Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/DerivSubmodule/BoostWeightDecomposition.lean`: + - the general `WeightDecomposition.ofTrivialAction` and its computation rules; + - the Higgs specializations as consumers and evidence for the general/SM boundary. +4. Supporting interfaces as needed: + - `Physlib/Relativity/LorentzGroup/Invariants/LorentzCovariance.lean` + - `Physlib/Relativity/IsLorentzDeriv.lean` + - `Physlib/Relativity/Fermions/Weyl/BoostWeight.lean` + +Search for all actual uses of the candidate declarations. No untracked historical +report or Standard Model table prototype is required. + +## Questions to resolve + +### 1. Exact extraction inventory + +For each candidate, record its full namespace, source location, effective hypotheses, +proof dependencies and consumers. Classify it as: + +- pure submodule/finite-support mathematics; +- general Lorentz boost-weight mathematics; +- a Standard Model specialization; +- a possible wrapper of existing library machinery. + +Check section variables and `omit` directives; do not mistake the surrounding file's +imports or variables for genuine mathematical prerequisites of a declaration. + +### 2. Product construction + +Explain how the product decomposition is constructed: its weight-`m` piece is the join +of products of pieces with weights `k + l = m`, its chosen finite support is the sum +of the two chosen supports, and its pieces span `V * W`. + +Trace all obligations back to their assumptions, particularly multiplicativity of the +representation, scalar compatibility and distributivity of submodule products over +joins. Preserve factor order: the existing algebra is a ring, not assumed commutative. +Do not introduce a direct-sum grading, homogeneous basis, canonical decomposition or +finite-dimensional ambient module unless actually required by the source contract. + +Review whether `mul_le_iSup_convolution` needs its current assumptions or is better +replaced by a library result. Distinguish a useful simplification from gratuitous +generalization. Explain the role of `ofTrivialAction` without expanding into Higgs +derivative constructions. + +### 3. Support and parity semantics + +Read the fields of `WeightDecomposition` literally. At the reference revision, +`piece_eq_bot` requires vanishing outside `supp`; it does not require each member of +`supp` to have a nonzero piece. Determine the consequences for the current docstrings +and for claims about sums of supports. Do not silently strengthen the structure. + +Explain the even/even and even/odd results on this chosen finite support, including +zero submodules and redundant support entries. Distinguish boost-weight parity from +fermionic statistics and from mass dimension; do not conflate them. + +### 4. Excluding invariants, including modulo a stable submodule + +Explain why Lorentz invariance implies boost weight zero, while weight zero for one +axis does not by itself imply Lorentz invariance. + +Trace the proof of `mem_of_invariant_of_mem_sup_of_odd_supp`: quotient action, stability +of `S`, equivariance of `S.mkQ`, images of weight pieces, and elimination of the zero +piece. Determine whether the proof uses oddness only to show the zero piece vanishes. +If so, assess a zero-piece criterion with an odd-support corollary as a small candidate +improvement; do not presuppose that a new API is necessary. + +Identify any genuine dependence on the separate invariant-coefficient lifting theorem. +Do not redesign general peeling/composition or classify new representations. + +### 5. Homes, imports and consumer impact + +Propose minimal destinations and dependency directions. Prefer existing appropriate +modules, notably `Boosts/WeightGrading.lean`, unless a different home has a concrete +mathematical or import justification. General results must not import SM applications. + +Inventory the library calls that might replace trivial helpers. Identify declarations +to move unchanged versus candidates requiring a statement/docstring adjustment. +For each adjustment, state how the old consumer contract would still be recovered. +Do not rename or generalize things solely to make the report appear more ambitious. + +The source containing the product/parity results is behind the inherited +`StandardModel.JetAlgebra.SectorEquiv.Basic` blocker at the reference revision. A +proof-looking source is not evidence of a successful current build. Explain how a +later standalone generic probe can validate extraction and which original consumer +builds would remain owed. Do not repair or build that blocker. + +## Report requirements and completion + +Write a focused report with: + +1. Source provenance and exact scope inspected. +2. Declaration table: hypotheses, genuine dependencies, proposed home and consumers. +3. Mathematical account of product decomposition, support and quotient/parity logic. +4. Any documentation overclaims or mathematical risks, with exact source references. +5. Bounded extraction proposal, separating required work from optional improvements. +6. Post-bump Lean experiment checklist and stop/go gates. + +The experiment checklist should cover destination-only imports, exact old consumer +contracts, preservation of noncommutative factor order, redundant/empty support cases, +zero-piece/odd-support conclusions and principal axiom audits. Identify blocked +production consumers separately from restated application probes. + +Separate source-verified facts, mathematical deductions and uncompiled Lean sketches. +Do not claim builds, benchmarks, optimal assumptions or formal verification. Provide +counterevidence and unresolved choices where appropriate. The report should let a +fresh agent begin a narrowly scoped 4.34.0 spike or implementation after human review. + +Finish in chat with the report path and material findings/uncertainties. Confirm that +only the report was added or changed. Report delivery is not implementation acceptance. diff --git a/AITasks/ToDo/invariant-coefficient-sharing.md b/AITasks/ToDo/invariant-coefficient-sharing.md new file mode 100644 index 000000000..c5165cec4 --- /dev/null +++ b/AITasks/ToDo/invariant-coefficient-sharing.md @@ -0,0 +1,144 @@ +# Prepare the shared invariant-coefficient lifting investigation + +## Task and output + +Perform a read-only mathematical and dependency investigation. Write your findings to +`AITasks/Done/invariant-coefficient-sharing-report.md`. This is preparation for a later +Lean spike, not implementation or a claim of Lean verification. No prior chat is needed. + +The aim is to identify one natural theorem from which the existing Lorentz and gauge +invariant-coefficient lifting results follow without stronger hypotheses. + +## Source baseline and working rules + +This handoff was checked against PR #1415 source commit +`5589e23dde62da95d6f7e4d9467cf63ecc111680` (Lean/Mathlib 4.33.0). A separate task is +integrating upstream's 4.34.0 bump. Use a separate checkout supplied by the human, not +the active bump workspace. Record the actual commit, toolchain, manifest revision and +any relevant dirty source files you inspect. Do not assume the current PR head matches +this reference. If declarations have moved, locate them and report the difference; if +essential sources are unavailable, report that limitation rather than inventing them. + +Read `AGENTS.md`, `AI-POLICY.md` and `docs/ReviewGuidelines.md`. + +- Only write the output report. Leave this task file in `ToDo` for human acceptance. +- Do not edit Lean files, imports, dependencies, other reports or the roadmap. +- Do not run Lean probes, builds, cache downloads, dependency updates or linters. + This task-specific restriction overrides repository default validation instructions. +- Do not stage, commit, push, fetch, switch branches, stash, reset or delete files. +- Do not interrupt workers or contact reviewers. Preserve all pre-existing work. +- Inspect locally available Mathlib source if useful, recording its version. Absence + from that snapshot is not proof of absence from Mathlib 4.34.0. + +## Sources to read + +1. `Physlib/Relativity/LorentzGroup/Invariants/Basic.lean`: + - `Lorentz.Invariants.contractₗ` + - `Lorentz.Invariants.exists_invariantCoeff` + - `actMat`, `actMatₗ`, `inner_actMat`, `exists_invariantCoeff_matrix` + - `exists_isInvariantCoeff_of_mem_span` +2. `Physlib/Particles/StandardModel/GaugeGroup/Invariants/Basic.lean`: + - `StandardModel.Family.contractₗ`, `actₗ`, `inner_actₗ` + - `sum_star_mul_of_transpose`, `exists_invariant_coeff` + - section C's `exists_mem_add_of_mem_sup`, `exists_smul_add_of_mem_sup` +3. For existing supporting APIs and representative callers: + - `Physlib/Relativity/LorentzGroup/Invariants/LorentzCovariance.lean` + - `Physlib/Mathematics/LinearCombination.lean` + - the three `Invariants/Is*Weyl.lean` modules + - `StandardModel/GaugeGroup/Invariants/IsSU2BiFundamental.lean` and + `IsSU3FunAntiFun.lean` (under `Physlib/Particles/`) + +Search for actual callers; this list is a starting point, not a complete inventory. +No untracked historical report or Standard Model table prototype is required. + +## Questions to resolve + +### 1. Exact contract comparison + +Transcribe the two principal statements with their effective section variables, +typeclasses and universes. Tabulate all differences, including conclusion ordering. + +Both seek coefficients in a finite family `T : ι → B` such that +`x = ∑ i, c i • T i` and every supplied coefficient map fixes `c`. +The family may be linearly dependent; neither uniqueness nor injectivity is promised. + +At the reference commit, the Lorentz lifting theorem accepts an arbitrary index type +`G` and an adjoint-closure witness for each map. The gauge theorem has `[Group G]` and +an explicit inverse-adjoint identity on coefficients. Inspect the actual assumptions: +do not infer action laws, invertibility or unitarity solely from comments calling `A` +an action. Explain which laws are assumed, which follow and which are unused. + +Track where the proof needs complex scalars, finite coefficient dimension, orthogonal +decomposition and the `WithLp` conversions. Distinguish the inner product on coefficient +space from the target `B`; do not impose an inner product or finite dimension on `B`. + +### 2. Common proof mechanism + +Give a precise proof correspondence, with source declaration/line references: + +- The contraction map `q`, its kernel `K`, and the intertwining equation. +- Why the coefficient maps preserve `K`. +- Why the adjoint condition makes `Kᗮ` invariant. +- Why replacing a preimage by its component in `Kᗮ` preserves its image. +- Why the change under a transformation lies in both `K` and `Kᗮ`, hence is zero. + +Explain the distinction between an invariant expression and an arbitrary coefficient +description of it. Analyse a dependent family and the empty-index boundary on paper. +Do not assume invariant lifting for arbitrary representations. + +### 3. Candidate abstraction and library reuse + +Identify existing Mathlib/Physlib results that may supply the argument or its steps. +Give exact declarations and checked source versions, not guesses about available APIs. + +Propose the smallest natural common statement. Compare a theorem about an intertwining +linear map with a theorem directly about component families only where this affects +reuse and usability. Explain how each existing theorem would specialize it, matching +every hypothesis. The specializations must not depend on the old proofs they replace. + +Provide candidate signatures as uncompiled sketches, clearly labelled. Preserve the +existing complex finite-family setting unless a directly useful relaxation is justified. +Distinguish sufficient assumptions from necessity or minimality; do not claim either +without a mathematical argument. No infinite-dimensional or semisimplicity framework. + +### 4. Placement, consumers and boundary + +Recommend a suitable existing mathematics home, or justify a small new module. Show +the intended import direction, keeping the general theorem independent of Lorentz and +Standard Model application imports. Identify which wrappers and matrix adapters remain +useful, which duplicated proofs disappear and which public callers need adjustment. + +Inspect the two generic quotient/peeling lemmas only to explain their relationship to +lifting and whether they belong nearby. Do not redesign `StandardModel.Peeling.Step`, +prototype peeling, or expand into gauge classifications or boost-weight extraction. + +### 5. Post-bump experiment plan + +Specify a short ordered list of Lean 4.34.0 probes that would settle the remaining +questions: intended destination imports, both original contracts, dependent and empty +families, actual consumer application shapes, and principal axiom audits. Distinguish +compiling a restated application from compiling its original production consumer. + +The inherited `StandardModel.JetAlgebra.SectorEquiv.Basic` failure blocks some SM +consumers at the reference revision. Do not repair or build it; name any validation +obligations it prevents and do not assume its status on another revision. + +## Report requirements and completion + +Keep the report focused and self-contained. Include: + +1. Source provenance and scope actually inspected. +2. Exact contract table and common proof map. +3. Existing library machinery and candidate statement(s). +4. Derivation of both specializations, with unresolved steps explicitly labelled. +5. Placement/consumer map and bounded proposed implementation scope. +6. Post-bump experiments, risks and questions requiring human judgement. + +Separate source-verified facts, mathematical deductions and untested Lean proposals. +Do not report timings, builds, axiom audits or successful elaboration: none is run in +this task. Report counterevidence as readily as supporting evidence. A reasoned +recommendation is welcome; do not force a shared design if it is not justified. + +Finish in chat with the report path and material findings/uncertainties. Confirm that +only the report was added or changed. Human review, then a post-bump Lean spike, is the +acceptance gate before implementation. From 4ea5200ede951b9db3ff2de5d676cf4c9d45e065 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Mon, 21 Sep 2026 14:59:44 +0200 Subject: [PATCH 335/367] feat: AI-tasks --- .../Done/boost-weight-extraction-report.md | 811 ++++++++++++++++++ .../{ToDo => Done}/boost-weight-extraction.md | 0 .../invariant-coefficient-sharing-report.md | 705 +++++++++++++++ .../invariant-coefficient-sharing.md | 0 4 files changed, 1516 insertions(+) create mode 100644 AITasks/Done/boost-weight-extraction-report.md rename AITasks/{ToDo => Done}/boost-weight-extraction.md (100%) create mode 100644 AITasks/Done/invariant-coefficient-sharing-report.md rename AITasks/{ToDo => Done}/invariant-coefficient-sharing.md (100%) diff --git a/AITasks/Done/boost-weight-extraction-report.md b/AITasks/Done/boost-weight-extraction-report.md new file mode 100644 index 000000000..2dd917f5d --- /dev/null +++ b/AITasks/Done/boost-weight-extraction-report.md @@ -0,0 +1,811 @@ +# Boost-weight product and parity extraction: investigation report + +Read-only investigation. No Lean was elaborated, built, linted, cached or probed; no Lean +file, import, dependency, other report or roadmap file was edited. The only file added by +this task is this report. + +Claims below are tagged: + +- **[S]** source-verified — read directly from the files and line numbers cited. +- **[M]** mathematical deduction from **[S]** facts, done on paper, not machine-checked. +- **[K]** uncompiled Lean sketch — illustrative only, never elaborated. + +--- + +## 1. Source provenance and exact scope inspected + +**[S]** Working tree `/Users/josephsmith/LocalGithub/JTSphyslib`, branch `AddPotentialAlgebra`. + +| item | value | +| --- | --- | +| HEAD | `7db2baf182932c35fcb5ed5d00b5f321049ae906` (`docs: add AI task folder and some AI analysis tasks`, 2026-09-21) | +| handoff reference commit | `5589e23dde62da95d6f7e4d9467cf63ecc111680` | +| relation | reference is an ancestor of HEAD | +| `git diff 5589e23d..HEAD --stat` | three files, all under `AITasks/` — **no `.lean` file differs** | +| dirty files at start | `Draft.md` only (3 insertions, 1 deletion); not a Lean source, not inspected for content | +| `lean-toolchain` | `leanprover/lean4:v4.33.0` | +| `lake-manifest.json` | manifest version `1.2.0`; `mathlib` rev `db584cd6d46c92f209a44c0f1c829460d327499d`, inputRev `v4.33.0` | +| git worktrees | one — this checkout is not the bump workspace and holds no 4.34.0 material | + +**[S]** Every declaration named in the handoff is present at the reference revision, byte for +byte. Nothing had to be relocated and no material difference from the handoff's description +was found. Mathlib claims below were read from `.lake/packages/mathlib` at rev `db584cd6` +(v4.33.0) and are asserted **only** for that snapshot. + +Read in full: `Physlib/Relativity/LorentzGroup/Boosts/WeightGrading.lean` (246 lines), +`Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/MassDimLTEight.lean` (386), +`Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/DerivSubmodule/BoostWeightDecomposition.lean` (339). +Read in relevant part: the general `Lorentz.BoostWeight.WeightDecomposition` blocks of +`IsFermionSector/DerivSubmodule/BoostWeightDecomposition.lean` and +`IsGaugeSector/DerivSubmodule/BoostWeightDecomposition.lean`; +`HiggsAlgebraCovRealization/Basic.lean` lines 1122–1232 (`IsDerivativeCollection`, +`boostDecomp`, `trivialWeightDecomposition`); +`CovAlgebraRealization/FermionGaugeSector/MassWeight.lean`; +`Relativity/LorentzGroup/Invariants/LorentzCovariance.lean`; +`Relativity/Fermions/Weyl/BoostWeight.lean` (section A); +`Relativity/IsLorentzDeriv.lean` (header); `Relativity/LightConeDeriv.lean` (declaration index). +Consumer inventory by repository-wide grep, not from the handoff's starting list. Import +closures by a static parse of `import` lines (script kept in the scratchpad, not added to the +repository). + +**Not inspected:** the interiors of the fermion and gauge sector files beyond their general +blocks and their `derivSubmoduleBoostWeight*` contracts; `Relativity/LorentzGroup/Boosts/` +siblings other than `Axis.lean:152`. + +### 1.1 The build blocker, verified statically + +**[S]** `StandardModel.JetAlgebra.SectorEquiv.Basic` is genuinely in the import closure of +every file holding the candidate declarations. The chain, each link read from the importing +file's header: + +``` +CovAlgebraRealization/YukawaSector/MassDimLTEight.lean + → IsFermionSector/DerivSubmodule/BoostWeightDecomposition.lean (line 13, private import) + → AlgebraRealization/HiggsAlgebraCovRealization/Basic.lean (line 10) + → JetAlgebra/CovJetAlgebra/Higgs.lean (line 9) + → JetAlgebra/CovJetAlgebra/Basic.lean → JetAlgebra/Realization.lean + → AlgebraRealization/Basic.lean → JetAlgebra/TransformsIn.lean + → JetAlgebra/MassWeightPoly.lean → JetAlgebra/Generators.lean + → JetAlgebra/Invariants.lean → JetAlgebra/LorentzAction.lean + → JetAlgebra/SectorEquiv/Structure.lean → JetAlgebra/SectorEquiv/Basic.lean +``` + +**[S]** Closure check across the relevant files: + +| file | behind the blocker? | +| --- | --- | +| `Relativity/LorentzGroup/Boosts/WeightGrading.lean` | **no** (closure 58 Physlib files, no `StandardModel/`) | +| `Relativity/LorentzGroup/Invariants/LorentzCovariance.lean` | **no** (62, no `StandardModel/`) | +| `Relativity/Fermions/Weyl/BoostWeight.lean` | **no** (62) | +| `Relativity/IsLorentzDeriv.lean` | **no** (59) | +| `CovAlgebraRealization/YukawaSector/MassDimLTEight.lean` | **yes** | +| `.../YukawaSector/Basic.lean` | **yes** | +| `HiggsAlgebraCovRealization/Basic.lean` | **yes** | +| `HiggsAlgebraCovRealization/DerivSubmodule/BoostWeightDecomposition.lean` | **yes** | +| `IsFermionSector/DerivSubmodule/BoostWeightDecomposition.lean` | **yes** | +| `IsGaugeSector/DerivSubmodule/BoostWeightDecomposition.lean` | **yes** | +| `CovAlgebraRealization/FermionGaugeSector/MassWeight.lean` | **yes** (via the same chain) | + +**[M]** Consequence for this report: *every* source fragment in §2 except `WeightGrading.lean` +itself sits behind the blocker. A proof-looking body in those files is not evidence that it +elaborates at this revision. I have read them as mathematics and as a specification of the +intended contracts, not as verified Lean. This is the single largest caveat on everything +below, and it is also the strongest practical argument *for* the extraction: **[M]** 18 +declarations with no Standard Model content are currently unbuildable for reasons that have +nothing to do with them. + +I did not attempt to repair, diagnose or build the blocker, per the handoff. + +--- + +## 2. Extraction inventory + +### 2.0 The full picture: general API scattered across four Standard Model files + +The handoff names one block. **[S]** Repository-wide grep for +`namespace Lorentz.BoostWeight.WeightDecomposition` finds **four** such blocks inside +`Physlib/Particles/StandardModel/`, holding 18 declarations between them, none of which +mentions the Standard Model: + +| file | lines | declarations | +| --- | --- | --- | +| `CovAlgebraRealization/YukawaSector/MassDimLTEight.lean` | 53–205 | 9 (the handoff's list) | +| `IsFermionSector/DerivSubmodule/BoostWeightDecomposition.lean` | 49–113 | 4 (`ofWeightBasis`, `iSupFintype`, `iSupFintype_piece`, `ofAxisTwo`) | +| `AlgebraRealization/HiggsAlgebraCovRealization/DerivSubmodule/BoostWeightDecomposition.lean` | 40–77 | 3 (`ofTrivialAction`, `ofTrivialAction_piece`, `ofTrivialAction_supp`) | +| `IsGaugeSector/DerivSubmodule/BoostWeightDecomposition.lean` | 42–70 | 2 (`iSupOfSupp`, `iSupOfSupp_piece`) | + +**[M]** Each block is prefixed by the identical variable line +`variable {K : Type*} [Field K] [Algebra ℝ K] {M : Type*} [AddCommGroup M] [Module K M]`, +i.e. the generality of `WeightGrading.lean` itself. **[S]** The pattern is deliberate: each +sector file opens with a general block, closes it, and only then enters +`namespace StandardModel`. The structure of the repository already records the judgement that +this material is general; only its *location* is wrong. + +I report the 18 for completeness but, per the handoff's scope discipline, §5 proposes moving +only a bounded subset, with the rest named as follow-on work. + +### 2.1 Declaration table — the handoff's nine + +Namespace for all nine: `Lorentz.BoostWeight.WeightDecomposition`. +Surrounding variables, **[S]** `MassDimLTEight.lean:69–70`: +`{K : Type*} [Field K] [Algebra ℝ K] {A : Type*} [Ring A] [Algebra K A]`, +`{rep : Representation K SL(2,ℂ) A} {i : Fin 3} {V W : Submodule K A}`. +Abbreviation used below: `hmul : ∀ (Λ : SL(2,ℂ)) (x y : A), rep Λ (x * y) = rep Λ x * rep Λ y`. + +| # | declaration | line | effective hypotheses (after `omit`/usage analysis) | genuine proof dependencies | class | consumers | +| --- | --- | --- | --- | --- | --- | --- | +| 1 | `mul_le_iSup_convolution` | 75 | **`omit [Algebra ℝ K]` at line 72.** Needs only `{K} {A} [Ring A] [Algebra K A]` and `(p q : ℤ → Submodule K A)`. **[M]** `[Field K]` is inherited, not used — `Submodule.iSup_mul`/`mul_iSup` are stated at `[CommSemiring R]`. No `rep`, no `i`, no boost weight. | `Submodule.iSup_mul`, `Submodule.mul_iSup`, `iSup_le`, `le_iSup_of_le` | **pure submodule mathematics**; **wrapper of library machinery** | 1 internal (line 108). No external consumer. | +| 2 | `mulOfMul` | 87 | full block + `hmul` + `d₁ d₂` | `mul_mem_boostWeightSubmodule` (WeightGrading:87), `mul_le_iSup_convolution`, `Submodule.mul_le`, `mul_bot`, `bot_mul`, `mul_mem_mul`, `Finset.add_mem_add`, the four `WeightDecomposition` fields | **general Lorentz boost-weight mathematics** (needs an algebra structure on the carrier) | `MassDimLTEight.lean:178, 198, 199`; **`CovAlgebraRealization/FermionGaugeSector/MassWeight.lean:81`** | +| 3 | `mulOfMul_supp` | 114 | as 2 | `rfl` | accessor | `MassDimLTEight.lean:126` | +| 4 | `exists_add_eq_of_mem_mulOfMul_supp` | 121 | as 2, `hmul` implicit | `mulOfMul_supp`, `Finset.mem_add` | **wrapper of library machinery** | lines 136, 146 | +| 5 | `two_dvd_of_mem_mulOfMul_supp` | 131 | as 2, `hmul` implicit, + parity of both supports | 4, `dvd_add` | general (parity of a Finset sumset) | `MassDimLTEight.lean:267` | +| 6 | `not_two_dvd_of_mem_mulOfMul_supp` | 141 | as 2, `hmul` implicit, + even/odd supports | 4, `dvd_add_right` | general (as 5) | `MassDimLTEight.lean:247, 266`; **`FermionGaugeSector/MassWeight.lean:88`** | +| 7 | `sup_supp` | 151 | `{K} [Field K] [Algebra ℝ K] {A} … {rep} {i} {V W}` — **[M]** but `sup` itself is defined in `WeightGrading.lean:226` at `{M} [AddCommGroup M] [Module K M]`; the `[Ring A] [Algebra K A]` here is inherited and unused | `rfl` | **orphan accessor** — belongs beside `sup_piece` (WeightGrading:236–238) | `MassDimLTEight.lean:309` | +| 8 | `map_boostWeightSubmodule_le` | 170 | declares its own `{M N} [AddCommGroup M] [Module K M] [AddCommGroup N] [Module K N] {repM} {repN}`; `[Field K] [Algebra ℝ K]` inherited and **genuinely required** (they are prerequisites of `boostWeightSubmodule` itself). **[M]** `[Ring A] [Algebra K A]` inherited and unused. | `boostWeightSubmodule` membership unfolding, `map_smul` | **general Lorentz boost-weight mathematics** | line 191 only | +| 9 | `mem_of_invariant_of_mem_sup_of_odd_supp` | 182 | declares its own `{M} [AddCommGroup M] [Module ℂ M] {repLorentz} {j} {V}`. **[M]** `ℂ` is a *specialisation*, not a requirement — see §2.3. `[Ring A]`, `[Algebra K A]`, `[Field K]`, `[Algebra ℝ K]` all inherited and unused at `ℂ`. | 8; `mem_of_mem_iSup_of_boostWeight_zero` (WeightGrading:176); `mem_boostWeightSubmodule_zero_of_invariant` (WeightGrading:132); `Representation.quotient` (Mathlib `RepresentationTheory/Basic.lean:333`); **`Lorentz.quotient_apply_mkQ`** (`LorentzCovariance.lean:182–185`, proved `rfl`); `Submodule.{map_mono, mem_sup, map_iSup, mem_map_of_mem, map_bot, mem_bot, ker_mkQ, Quotient.mk_eq_zero}` | **general Lorentz boost-weight mathematics** | `MassDimLTEight.lean:293, 305`; **`FermionGaugeSector/MassWeight.lean:112`** | + +**[S] Section-variable warning, discharged.** The handoff asks not to mistake the surrounding +file's variables for genuine prerequisites. Three concrete instances found: + +- `mul_le_iSup_convolution` carries an explicit `omit [Algebra ℝ K] in` (line 72) but still + inherits `[Field K]`, which it does not use. +- `sup_supp` inherits `[Ring A] [Algebra K A]` although `WeightDecomposition.sup` is defined + without them. +- `mem_of_invariant_of_mem_sup_of_odd_supp` inherits the whole algebra block while working in + a bare module `M`. + +**[M]** None of these is a soundness problem; all three would simply become cleaner in a +destination file whose variable block matches the mathematics. + +### 2.2 The remaining nine general declarations + +| declaration | file:line | hypotheses | class | consumers | +| --- | --- | --- | --- | --- | +| `ofTrivialAction` | Higgs BWD:49 | `rep`, `htriv : ∀ g x, rep g x = x`, `i` | general | Higgs BWD:127, 132 (and :69, :85 via `ofTrivialAction_piece`) | +| `ofTrivialAction_piece` | Higgs BWD:67 | as above | accessor (`rfl`) | Higgs BWD:69, 70, 85, 86 | +| `ofTrivialAction_supp` | Higgs BWD:73 | as above | accessor (`rfl`) | none outside its file | +| `ofWeightBasis` | Fermion BWD:58 | `[Fintype ι]`, a `Module.Basis ι K M` of weight vectors, a weight function, **a supplied `s` with `∀ j, wt j ∈ s`** | general | Fermion BWD (2 sites) | +| `iSupFintype` | Fermion BWD:78 | `[Fintype ι]`, a family of decompositions | general | Fermion BWD (2 sites) | +| `iSupFintype_piece` | Fermion BWD:92 | as above | accessor (`rfl`) | Fermion BWD | +| `ofAxisTwo` | Fermion BWD:99 | a decomposition of `⊤` along axis `2` | general | Fermion BWD (4 sites) | +| `iSupOfSupp` | Gauge BWD:52 | arbitrary (possibly infinite) `ι`, **a supplied common `s` with `∀ a, (d a).supp ⊆ s`** | general | Gauge BWD (2 sites) | +| `iSupOfSupp_piece` | Gauge BWD:65 | as above | accessor (`rfl`) | Gauge BWD | + +**[M]** `iSupFintype` and `iSupOfSupp` are the same construction with two different support +strategies — a `biUnion` over a finite index, versus a user-supplied common bound for an +arbitrary index. **[M]** `iSupFintype` is derivable from `iSupOfSupp` by taking +`s := Finset.univ.biUnion fun a => (d a).supp`, so a single home would let one be a corollary +of the other. Neither is in the handoff's scope and I do not propose merging them here; the +observation belongs in the follow-on note. + +**[M] Import feasibility, if `WeightGrading.lean` were the destination** (all **[S]** on the +locations): + +- `ofAxisTwo` needs `SL2C.boostAxis_eq_conj` (`Boosts/Axis.lean:152`, already imported at + `WeightGrading.lean:8`) and `SL2C.rotationZToAxis` (`SL2C/AxisRotations.lean:136`, imported + by `Axis.lean:8`). **No new Physlib import.** +- `mulOfMul` needs pointwise `+` on `Finset ℤ`; **[S]** `WeightGrading.lean:11` already imports + `Mathlib.Algebra.Group.Pointwise.Finset.Basic`, and **[S]** no pointwise `Finset` operation + appears anywhere in `WeightGrading.lean`'s 246 lines (its only `Finset` uses are + `add_sum_erase`, `erase_eq`, `mem_union_left/right`, `sum_insert`, `mem_insert_self`, + `insert_eq_self`, `sum_update_of_mem`, `ne_of_mem_erase`, `mem_of_mem_erase`). **[M]** That + import is therefore currently carrying no weight in that file, and the one thing it would be + needed for is `mulOfMul.supp`. I read this as deliberate pre-positioning for the move; I + cannot confirm it is unused without a build, so it is probe P0b. +- `mem_of_invariant_of_mem_sup_of_odd_supp` needs `Representation.quotient`, **[S]** in + `Mathlib.RepresentationTheory.Basic:333`, already imported at `WeightGrading.lean:9`. +- `mulOfMul` needs `Submodule` multiplication (`Mathlib/Algebra/Algebra/Operations.lean`). + Whether that is already in `WeightGrading.lean`'s transitive Mathlib closure I **cannot + determine without elaborating**; assume an explicit import is needed (probe P0a). +- `ofWeightBasis` needs `Module.Basis`; likely transitively present via + `Mathlib.LinearAlgebra.Eigenspace.Basic`, but unverified (probe P0a). + +### 2.3 The one cross-file dependency, and what it is not + +**[S]** `mem_of_invariant_of_mem_sup_of_odd_supp`'s proof calls `quotient_apply_mkQ` +(`MassDimLTEight.lean:199`). That lemma lives in +`Relativity/LorentzGroup/Invariants/LorentzCovariance.lean:182–185`: + +``` +lemma quotient_apply_mkQ {B : Type*} [AddCommGroup B] [Module ℂ B] + (repLorentz : Representation ℂ SL(2,ℂ) B) (S : Submodule ℂ B) + (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) (g : SL(2,ℂ)) (y : B) : + repLorentz.quotient S (fun g y hy => hS g y hy) g (S.mkQ y) = S.mkQ (repLorentz g y) := rfl +``` + +**[S]** It is proved by `rfl`, and **[S]** it is stated at `ℂ`. **[M]** Two consequences. + +1. **This is why `mem_of_invariant_of_mem_sup_of_odd_supp` is stated at `ℂ`.** Every other + ingredient of that proof is `K`-generic. The `ℂ` is inherited from a helper lemma's + accidental specialisation, not from the mathematics. Restating the helper at `K` (or + inlining its `rfl`) would let the parity theorem be `K`-generic like the rest of + `WeightGrading.lean`. **[M]** I flag this as a *consistency* fix, not a generalisation for + its own sake: it makes the declaration match the file it would move into. +2. **[S]** `MassDimLTEight.lean` reaches `LorentzCovariance.lean` through + `Physlib.Relativity.LorentzGroup.Invariants.RankFour` (line 10), and + `LorentzCovariance.lean` imports `Invariants/Basic.lean`, which is the home of + `exists_invariantCoeff`. + +**Answer to the handoff's question 4 on dependence upon the invariant-coefficient lifting +theorem: there is none.** **[M]** No declaration in §2.1 or §2.2 calls `exists_invariantCoeff`, +`exists_invariantCoeff_matrix`, `exists_isInvariantCoeff_of_mem_span`, `contractₗ`, `actMat`, +or anything else from the coefficient-lifting development. The *only* thread between the two +subjects is the `rfl` lemma above, which is about quotient representations and has no +coefficient content. The two tasks are genuinely independent, as the handoff states. + +**[M]** This matters for the extraction: if the parity theorem moved to `WeightGrading.lean` +naively, `WeightGrading.lean` would have to import `LorentzCovariance.lean`, dragging in +`Invariants/Basic.lean`, `LightConeDeriv.lean` and `Mathematics/LinearCombination.lean` — a +large and entirely spurious dependency, and one that would point the boost-weight file at the +coefficient-lifting file for a `rfl`. **The recommended fix is to inline it**: the proof step +becomes `fun g => congrArg S.mkQ (hinv g)` or `fun g => by rw [show … = … from rfl, hinv g]`. + +--- + +## 3. The mathematics + +### 3.1 The product decomposition + +**[S]** `mulOfMul` (MassDimLTEight.lean:87–108) builds, from `d₁ : WeightDecomposition rep i V` +and `d₂ : WeightDecomposition rep i W`, a `WeightDecomposition rep i (V * W)` with + +``` +piece m := ⨆ (k : ℤ) (l : ℤ) (_ : k + l = m), d₁.piece k * d₂.piece l +supp := d₁.supp + d₂.supp -- pointwise Finset sum +``` + +**[M]** The four obligations and where each hypothesis is spent: + +- **`piece_le m`** — that the weight-`m` piece really has weight `m`. Reduces by + `Submodule.mul_le` to: `a ∈ d₁.piece k`, `b ∈ d₂.piece l`, `k + l = m` implies + `a * b ∈ boostWeightSubmodule rep i m`. **[S]** This is exactly + `mul_mem_boostWeightSubmodule` (`WeightGrading.lean:87–93`), whose proof is + `rep Λ (x*y) = rep Λ x * rep Λ y = (t^a • x)(t^b • y) = t^(a+b) • (x*y)`. The three + ingredients: **multiplicativity of the representation** (`hmul`, the only hypothesis + `mulOfMul` adds beyond the two decompositions); **scalar compatibility** + (`smul_mul_smul_comm`, which needs `A` to be an algebra over `K`, supplied by + `[Algebra K A]`); and **`zpow_add₀`** on `algebraMap ℝ K t`, which needs that scalar nonzero + — supplied by the private `algebraMap_ne_zero` (`WeightGrading.lean:67–68`) and hence by + `[Field K]` (injectivity of a ring hom out of a field) and `[Algebra ℝ K]`. +- **`piece_eq_bot m hm`** — that pieces vanish off `d₁.supp + d₂.supp`. **[S]** The proof + (lines 97–101) case-splits on `k ∈ d₁.supp`: if yes, then `l ∉ d₂.supp` (else `k + l = m` + would be in the sumset, by `Finset.add_mem_add`), so the right factor is `⊥` and + `Submodule.mul_bot` finishes; if no, the left factor is `⊥` and `Submodule.bot_mul` finishes. + **[M]** Note both `mul_bot` and `bot_mul` are used, and neither is derivable from the other + without commutativity — the proof is already written to be order-safe. +- **`iSup_piece`** — that the pieces join to `V * W`. **[S]** `le_antisymm` of two inequalities + (lines 102–108). The `≤` direction: each `d₁.piece k * d₂.piece l ≤ V * W` by + `Submodule.mul_mem_mul` and `d₁.iSup_piece`/`d₂.iSup_piece`. The `≥` direction: rewrite + `V * W` as `(⨆ k, d₁.piece k) * (⨆ l, d₂.piece l)` and apply `mul_le_iSup_convolution`. + +**[M] Factor order is preserved throughout, and must be.** `A` is `[Ring A]`, not +`[CommRing A]`. Every step keeps `d₁` on the left of `d₂`: the piece is +`d₁.piece k * d₂.piece l` (never `d₂.piece l * d₁.piece k`); `mul_mem_boostWeightSubmodule` +takes its arguments in the order `hx : x ∈ …a`, `hy : y ∈ …b` and concludes about `x * y`; and +`mul_le_iSup_convolution` rewrites with `Submodule.iSup_mul` first and `Submodule.mul_iSup` +second, i.e. it peels the left factor first. **[M]** The weight index `m = k + l` *is* +commutative (`ℤ`), which is what makes `supp` symmetric, but the submodules are not, and +`mulOfMul d₁ d₂` and `mulOfMul d₂ d₁` decompose *different* submodules (`V * W` versus +`W * V`). Any restatement must not "simplify" by symmetrising. + +**[M] Associativity is also load-bearing at the consumer.** **[S]** +`higgsSqFermionBoostWeight` (MassDimLTEight.lean:252–261) is +`mulOfMul hmul (mulOfMul hmul dH dH') dF`, decomposing +`derivSubmodule a * derivSubmodule b * derivSubmodule c`. That type-checks only because Lean +parses `x * y * z` as `(x * y) * z` and the nesting is left. A restated `mulOfMul` that +changed argument order, or a "convenience" ternary version, would break this silently at the +elaboration level rather than the mathematical one. + +**[M] What is *not* needed, and must not be introduced.** No direct-sum grading +(`DirectSum.Decomposition`, `SetLike.GradedMonoid`); no homogeneous basis; no canonical or +unique decomposition; no finite-dimensionality of `A`; no `iSupIndep` hypothesis. The +construction is purely about joins of submodule products. **[S]** Independence *is* available +(`boostWeightSubmodule_iSupIndep`, `WeightGrading.lean:125`) and *is* used elsewhere +(`mem_of_mem_iSup_of_boostWeight_zero`), but `mulOfMul` never touches it. Introducing a graded +structure would be the classic over-abstraction here: it would demand that the pieces be +*equal* to the weight spaces rather than contained in them, which is false for the sector +submodules (§3.2). + +### 3.2 `mul_le_iSup_convolution`: keep, strengthen, or replace? + +**[S]** The statement is + +``` +(⨆ k, p k) * (⨆ l, q l) ≤ ⨆ (m : ℤ) (k : ℤ) (l : ℤ) (_ : k + l = m), p k * q l +``` + +and the proof is four lines: `Submodule.iSup_mul`, `iSup_le`, `Submodule.mul_iSup`, then +three `le_iSup_of_le` to land at `(m, k, l, rfl)`. + +**[M] Assessment.** The current hypotheses are *more* than needed (§2.1 row 1: `[Field K]` and +`[Algebra ℝ K]` are both inert, the latter explicitly omitted, the former not). But the +interesting observation is that the statement is the weaker half of an **equality**: + +**[M]** `(⨆ k, p k) * (⨆ l, q l) = ⨆ k, ⨆ l, p k * q l` by +`Submodule.iSup_mul` (Mathlib `Algebra/Algebra/Operations.lean:297`) and +`Submodule.mul_iSup` (:300), and `⨆ k, ⨆ l, p k * q l = ⨆ m, ⨆ k, ⨆ l, ⨆ (_ : k + l = m), p k * q l` +by reindexing the double join along the surjection `(k, l) ↦ k + l` — each `(k,l)` appears +exactly once on the right, under `m = k + l`. + +**[S]** And the *other* inequality is proved separately, inline, at `MassDimLTEight.lean:103–106` +(the first branch of `iSup_piece`'s `le_antisymm`). **[M]** So the file currently proves both +halves of one identity in two places, in two styles. Stating the equality once and taking +`le_antisymm` for free is a genuine simplification — it removes a duplicated argument and names +the fact. + +**[M] Replace by a library result?** No: I found no Mathlib lemma of this convolution shape. +`Submodule.iSup_mul` and `Submodule.mul_iSup` are the two halves of the *unindexed* step, and +the reindexing is the part Physlib must supply. So the recommendation is **keep the lemma, +strengthen it to an equality, drop the inert typeclasses, and give it a home where it reads as +what it is** — a statement about submodule products and joins with no boost weight, no +representation and no `ℤ` structure beyond addition. **[M]** Stated at a general additive index +it would read: + +**[K]** (uncompiled sketch) +```lean +lemma Submodule.iSup_mul_iSup_eq_iSup_add {R A ι : Type*} [CommSemiring R] [Semiring A] + [Algebra R A] [AddMonoid ι] (p q : ι → Submodule R A) : + (⨆ k, p k) * (⨆ l, q l) = ⨆ (m : ι) (k : ι) (l : ι) (_ : k + l = m), p k * q l +``` +**[M] Counter-consideration.** That is a Mathlib-shaped statement in a `Submodule` namespace, +and putting it in Physlib means Physlib carries a lemma that arguably belongs upstream. +Generalising the index from `ℤ` to `AddMonoid ι` is speculative — nothing needs it. **[M] My +recommendation is the middle course**: strengthen to an equality, keep it at `ℤ` and keep the +`Submodule R A` generality it already has, and place it in the destination file with a comment +that it is a candidate for upstreaming. Do not chase the `AddMonoid` version. + +### 3.3 The role of `ofTrivialAction` + +**[S]** `ofTrivialAction rep htriv i : WeightDecomposition rep i ⊤` with +`piece k := if k = 0 then ⊤ else ⊥` and `supp := {0}`, for any `rep` acting as the identity +(`Higgs BWD:49–63`). + +**[M]** Its role in the architecture is to be the *base case* of the weight bookkeeping. The +general machine that produces sector decompositions is **[S]** `IsDerivativeCollection.boostDecomp` +(`HiggsAlgebraCovRealization/Basic.lean:1158–1201`), which takes a symbol map whose derivative +slots rotate as Lorentz vectors plus a decomposition `hw` of the *value space* `W`, and returns +a decomposition of the span of the symbols, with weights +`(∑ j, lightConeWeight (c j)) + (weight in W)`. A Lorentz-trivial value space contributes +nothing, and `ofTrivialAction` is the statement of "nothing". **[S]** The Higgs file uses it +exactly so: `higgsValueWeight` and `barHiggsValueWeight` (`Higgs BWD:125–132`) are +`ofTrivialAction` at the dual and conjugate-dual of the trivial representation on `HiggsVec`, +and are fed straight into `boostDecomp` at lines 226 and 233. I do not expand further into the +Higgs derivative constructions, per the handoff. + +**[S] A concrete duplication that the extraction would remove.** +`HiggsAlgebraCovRealization.trivialWeightDecomposition` (`HiggsAlgebraCovRealization/Basic.lean:1213–1227`) +is a 14-line `where`-block for `WeightDecomposition (1 : Representation ℂ SL(2,ℂ) ℂ) i ⊤` whose +`piece`, `supp`, `piece_eq_bot` and `iSup_piece` are **character-for-character the same** as +`ofTrivialAction`'s, differing only in `piece_le` (`simp` versus +`rw [htriv, zpow_zero, one_smul]`). **[S]** `ofTrivialAction`'s own docstring (`Higgs BWD:46–48`) +says so: *"`HiggsAlgebraCovRealization.trivialWeightDecomposition` is the case `M = K`."* +**[M]** They are not shared today because `ofTrivialAction` lives in a file that imports +`HiggsAlgebraCovRealization/Basic.lean`, so the dependency runs the wrong way. **[S]** But +`HiggsAlgebraCovRealization/Basic.lean:14` already imports +`Physlib.Relativity.LorentzGroup.Boosts.WeightGrading`. **[M]** So moving `ofTrivialAction` into +`WeightGrading.lean` immediately makes `trivialWeightDecomposition` a one-liner +(`ofTrivialAction 1 (fun _ _ => rfl) i`, modulo whether `(1 : Representation …) g x = x` is +`rfl` — **[S]** the existing proof discharges the analogous goal with `simp`, so `rfl` may not +suffice and `fun g x => by simp` may be needed). It has **[S]** 6 references across 3 files, so +this is a real, if small, payoff. + +### 3.4 `supp` semantics: read the field literally + +**[S]** The structure (`WeightGrading.lean:198–206`): + +``` +structure WeightDecomposition (rep : Representation K SL(2,ℂ) M) (i : Fin 3) (V : Submodule K M) where + piece : ℤ → Submodule K M + supp : Finset ℤ + piece_le : ∀ k, piece k ≤ boostWeightSubmodule rep i k + piece_eq_bot : ∀ k ∉ supp, piece k = ⊥ + iSup_piece : (⨆ k, piece k) = V +``` + +**[M] `piece_eq_bot` is a one-way condition.** It says `supp` *contains* the set of weights +with a nonzero piece. It does **not** say the reverse: `k ∈ supp` is entirely compatible with +`piece k = ⊥`. So `supp` is a *declared bound*, not the support, and the structure has no +field forcing minimality. Two decompositions with the same `piece` and different `supp` are +both legal and are different terms. + +**[S] This is not hypothetical — it is how the library uses it.** Three constructions +deliberately over-declare: + +- `ofWeightBasis` (`Fermion BWD:58–61`) takes `s` and `hs : ∀ j, wt j ∈ s` as *inputs*: the + caller supplies any superset. +- `iSupOfSupp` (`Gauge BWD:52–54`) takes `s` and `hs : ∀ a, (d a).supp ⊆ s`: again any + superset, and its docstring says so ("a common finite set of weights containing every + member's support is supplied"). +- `boostDecomp` (`HiggsAlgebraCovRealization/Basic.lean:1165–1166`) sets + `supp := (Finset.univ ×ˢ hw.supp).image fun p => (∑ j, lightConeWeight (p.1 j)) + p.2`, an + image over **all** light-cone multi-indices `c : Fin n → Fin 4` with no check that the + corresponding `lightConeDeriv F i c` has nonzero range. **[M]** For a sector whose symbols + satisfy relations, or at `n = 0` where the four `c` collapse, this is visibly redundant. + +**[M] Consequences, and none of them is a soundness problem.** + +1. **The parity arguments stay valid.** Over-declaring `supp` makes the hypotheses + `∀ k ∈ supp, 2 ∣ k` and `∀ k ∈ supp, ¬ 2 ∣ k` *harder to satisfy*, and makes the conclusion + of `piece_eq_bot` apply to *fewer* `k`. Both directions are safe: nothing concludes + "`k ∈ supp`, therefore `piece k ≠ ⊥`". I checked all nine declarations for such a step and + found none. +2. **`supp` is not an invariant of the decomposed submodule.** `mulOfMul_supp`'s value + `d₁.supp + d₂.supp` depends on the *terms* `d₁`, `d₂`, not just on `V` and `W`. Any future + lemma of the form "`V * W` has such-and-such weights" must be stated about a given + decomposition, never about the submodule. +3. **Empty and redundant boundary cases.** **[M]** If `d₁.supp = ∅` then all `d₁.piece k = ⊥`, + so `V = ⊥`, and `d₁.supp + d₂.supp = ∅` (the pointwise sum of Finsets is an image of a + product, empty if either factor is), and `V * W = ⊥`. Consistent. If `0 ∈ d.supp` but + `d.piece 0 = ⊥`, then `mem_of_invariant_of_mem_sup_of_odd_supp` is *inapplicable* (its + `hodd` fails at `0`) even though its conclusion holds. That is exactly the gap §4.2 + proposes closing. + +**[M] Do not add a minimality field.** Strengthening `piece_eq_bot` to an iff would break +`ofWeightBasis`, `iSupOfSupp` and `boostDecomp`, all of which would then owe a nontriviality +proof for every declared weight — in `boostDecomp`'s case, a proof that a light-cone symbol +range is nonzero, which is genuinely hard and sector-specific. The current design is right; +only the prose is wrong (§4.1). + +### 3.5 Parity on the declared support + +**[S]** Two lemmas, both routed through `exists_add_eq_of_mem_mulOfMul_supp`: + +- `two_dvd_of_mem_mulOfMul_supp`: even ⊞ even ⊆ even, by `dvd_add`. +- `not_two_dvd_of_mem_mulOfMul_supp`: even ⊞ odd ⊆ odd, by `dvd_add_right`. + +**[M]** Both are statements about the *declared* supports, so they inherit §3.4's over-approximation +harmlessly: an even bound plus an odd bound is an odd bound. They hold for zero submodules +(vacuously, empty sumset) and survive redundant entries (a redundant even entry contributes +redundant odd sums). **[M]** Note there is no "odd ⊞ odd ⊆ even" lemma, and none is needed: the +four surviving Yukawa products each have **exactly one** fermion factor, so odd ⊞ odd never +arises. **[S]** `higgsSqFermionBoostWeight` nests even ⊞ even first and only then ⊞ odd +(`MassDimLTEight.lean:263–270`). + +**[M] Three gradings that must not be conflated**, since the handoff asks: + +| grading | carrier | values | where | +| --- | --- | --- | --- | +| **boost weight** | a representation of `SL(2,ℂ)`, one grading per spatial axis `i : Fin 3` | `ℤ`, additive under multiplication | `boostWeightSubmodule rep i w` | +| **mass weight / mass dimension** | the algebra `B` via `massWeightPoly : B →ₐ[ℂ] Polynomial B` | `ℕ` | `sectorMassWeight`, `massWeightSubmodule` | +| **fermionic statistics** | — | — | **nowhere in this development** | + +**[M]** The parity argument is entirely about the first. The theorem it proves is about the +second: **[S]** `mem_of_lorentz_invariant_sectorMassWeight_higgs_fermion_five_sup` and +`…_seven_sup` (`MassDimLTEight.lean:287–313`) say that *mass* weights 5 and 7 carry no Lorentz +invariant, and they get there by showing that every product occurring at those mass weights has +odd *boost* weight. The link between the two gradings is not a grading morphism; it is the +sector-specific enumeration of which products occur at which mass weight +(`sectorMassWeight_higgs_fermion_five`, `…_seven`), which is Standard Model content and stays +in the Standard Model file. + +**[M] Statistics play no role whatsoever.** `A` is `[Ring A]`; nothing anticommutes, no +superalgebra, no `ℤ/2`-grading of the algebra. **[S]** The fermion file's docstring calls the +odd support *"the boost-weight shadow of the spin-statistics split"* +(`IsFermionSector/DerivSubmodule/BoostWeightDecomposition.lean:566–567`). **[M]** That is +physics prose about *why* the weights come out odd — half-integer spin gives an odd Weyl +contribution `±1` on top of the even `±2, 0` from derivative slots — and it is a correct +gloss, but a reader must not infer that any statistics hypothesis is in play. Worth a +clarifying half-sentence if that docstring is ever touched; not a defect. + +### 3.6 Invariance, weight zero, and the quotient + +**Why invariance forces boost weight zero.** **[S]** `mem_boostWeightSubmodule_zero_of_invariant` +(`WeightGrading.lean:132–137`): if `rep g x = x` for every `g`, then in particular for +`boostAxis i t ht`, so `rep (boostAxis i t ht) x = x = (algebraMap ℝ K t) ^ 0 • x`. Two lines, +no content beyond `zpow_zero` and `one_smul`. + +**Why the converse fails.** **[M]** `boostWeightSubmodule rep i 0` only constrains the +one-parameter boost subgroup along a *single* axis `i`. Everything commuting with that +constraint is free. Concretely, in the vector representation, **[S]** `lightConeWeight` takes +the value `0` on the two transverse light-cone directions of axis `i` +(`Relativity/.../BoostWeightDecomposition.lean:78`, +`lightConeWeight_eq_two_or_neg_two_or_zero`, and the Higgs file's gloss at lines 28–30: +"`+2` for `D₀ - Dᵢ`, `-2` for `D₀ + Dᵢ` and `0` for the two transverse directions"). **[M]** +So the axis-`i` weight-zero space of a rank-one tensor is two-dimensional, spanned by the two +directions transverse to `i`; rotations about the `i`-axis mix those two directions and fix +neither. Hence a weight-zero vector that is not invariant. **[M]** The gap is structural: the +weight-zero space is the fixed space of a one-parameter subgroup, and `SL(2,ℂ)` is six +real-dimensional. The implication runs one way only, which is precisely why the theorem is +phrased as an *exclusion* (no invariants where weight zero is impossible) and never as a +classification. + +**The quotient step, traced.** **[S]** `mem_of_invariant_of_mem_sup_of_odd_supp` +(`MassDimLTEight.lean:182–203`), in order: + +1. **`hzero`** (line 187): `d.piece 0 = ⊥`, from `d.piece_eq_bot 0` and `hodd 0 _ ⟨0, rfl⟩` + (i.e. `2 ∣ 0`, contradicting oddness at `0`). +2. **stability ⇒ a quotient representation**: `repLorentz.quotient S (fun g y hy => hS g y hy)` + (Mathlib `RepresentationTheory/Basic.lean:333`). **[M]** `hS` is exactly the hypothesis + Mathlib's `le_comap` form needs, restated membership-wise. +3. **equivariance of `S.mkQ`** (line 191): supplied as `fun _ _ => rfl` to + `map_boostWeightSubmodule_le`. **[M]** The quotient representation is *defined* so that this + is definitional; that is the content of `quotient_apply_mkQ` (§2.3). +4. **`hle`** (lines 188–191): images of pieces stay of pure weight — + `(d.piece m).map S.mkQ ≤ boostWeightSubmodule (quotient …) j m`, by `Submodule.map_mono` on + `d.piece_le m` followed by `map_boostWeightSubmodule_le`. +5. **`hmem`** (lines 192–196): `S.mkQ x` lies in the join of the images. From + `x = y + z` with `y ∈ V`, `z ∈ S` (`Submodule.mem_sup`), `S.mkQ z = 0`, and + `d.iSup_piece` plus `Submodule.map_iSup`. +6. **`hinv'`** (lines 197–199): the class of `x` is invariant for the quotient representation. + This is the `quotient_apply_mkQ` call. +7. **the kill** (lines 200–202): `mem_of_mem_iSup_of_boostWeight_zero hle hmem (…zero_of_invariant hinv' j)` + puts `S.mkQ x` in `(d.piece 0).map S.mkQ`, which is `⊥` by `hzero` and `Submodule.map_bot`. +8. **conclusion** (line 203): `S.mkQ x = 0` means `x ∈ ker S.mkQ = S`. + +**[M] Why stability of `S` cannot be dropped.** Without it there is no quotient representation +at step 2, so steps 4–7 have nothing to act on. **[S]** The gauge file makes the same point in +prose for its own peeling lemma (`GaugeGroup/Invariants/Basic.lean:182–184`): *"an unstable +line has no invariant but `0`, while its sum with the span may well carry invariants outside +the span."* The same counterexample applies here. + +**[M] Where the weight machinery actually bites** is step 7, and only there: the job of +`mem_of_mem_iSup_of_boostWeight_zero` (`WeightGrading.lean:176–188`) is to convert "lies in a +join of pure-weight spaces **and** has weight zero" into "lies in the weight-zero one". Its own +proof rests on `boostWeightSubmodule_iSupIndep` (line 125), which rests on the weight-`k` space +sitting in the `2^k` eigenspace of the boost at parameter `2` and on `k ↦ 2^k` being injective. +**[M]** That is the single place where independence of the weight spaces is used in the whole +parity argument. + +--- + +## 4. Documentation overclaims and mathematical risks + +### 4.1 `supp` described as "the weights that occur" — five places + +**[S]** All of the following describe `supp` as the set of weights *occurring*, which §3.4 +shows is not what the structure guarantees: + +| # | text | location | +| --- | --- | --- | +| O1 | `/-- The finite set of weights that occur. -/` (the field docstring itself) | `WeightGrading.lean:203` | +| O2 | *"a finitely supported family of subspaces of pure boost weight"* | `WeightGrading.lean:25–26` (module doc) — **[M]** this one is defensible: "finitely supported" in the `Finsupp` sense means vanishing off a finite set, which is exactly `piece_eq_bot`. No change needed. | +| O3 | `/-- The weights occurring in a convolution are the sums of the weights occurring in the two factors. -/` | `MassDimLTEight.lean:111–112` | +| O4 | `/-- A weight of a convolution splits as a weight of the left factor plus a weight of the right one. -/` | `MassDimLTEight.lean:119–120` | +| O5 | `/-- The weights of a join of two decompositions are the weights of the two. -/` and `/-- **The boost weights occurring in the Higgs derivative submodules** -/` | `MassDimLTEight.lean:149`; `Higgs BWD:129–130` | + +**[M] Severity: documentation only.** Every *statement* is correct; only the prose promises +more. The fix is to speak of "the declared weights" or "the recorded support" rather than +"the weights that occur", and to say in O1 that `supp` is any finite set outside which the +pieces vanish, not necessarily the smallest. **[M]** O3's statement `supp = d₁.supp + d₂.supp` +is an exact equality and is fine; it is the word "occurring" that over-promises, twice in one +sentence. + +**[M] Why this matters beyond tidiness.** A future contributor reading O1 could reasonably +write a lemma of the form `k ∈ d.supp → d.piece k ≠ ⊥` and find it unprovable, or worse, +*assume* it in a proof sketch. Since `boostDecomp` demonstrably over-declares (§3.4), such a +lemma would be false for the actual sector decompositions. + +### 4.2 The oddness hypothesis is stronger than the proof needs + +**[S]** In `mem_of_invariant_of_mem_sup_of_odd_supp`, `hodd` occurs exactly twice in the file: +once as the binder (line 184) and once in the proof (line 187, producing `hzero`). I checked +the remaining 16 lines of the proof (188–203) and `hodd` does not appear. **[M]** Therefore the +proof uses oddness **only** to establish `d.piece 0 = ⊥`, exactly as the handoff anticipates. + +**[M] The natural statement is the zero-piece one**, with oddness as a corollary: + +**[K]** (uncompiled sketch) +```lean +/-- A submodule whose weight-zero piece is trivial carries no Lorentz invariant beyond a + Lorentz-stable submodule `S`: an invariant of the join with `S` already lies in `S`. + Invariance forces boost weight zero, and there is nothing of weight zero on offer. -/ +lemma mem_of_invariant_of_mem_sup_of_piece_zero + (d : WeightDecomposition repLorentz j V) (hzero : d.piece 0 = ⊥) + (S : Submodule ℂ M) (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) {x : M} + (hx : x ∈ V ⊔ S) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := … + +/-- A submodule all of whose declared boost weights are odd has trivial weight-zero piece, + since zero is even. -/ +lemma mem_of_invariant_of_mem_sup_of_odd_supp + (d : WeightDecomposition repLorentz j V) (hodd : ∀ k ∈ d.supp, ¬ (2 : ℤ) ∣ k) + (S : Submodule ℂ M) (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) {x : M} + (hx : x ∈ V ⊔ S) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := + mem_of_invariant_of_mem_sup_of_piece_zero d + (d.piece_eq_bot 0 fun hmem => hodd 0 hmem ⟨0, rfl⟩) S hS hx hinv +``` + +**[M]** The old consumer contract is recovered **exactly** — same name, same explicit and +implicit argument order, same conclusion — so **[S]** all three call sites +(`MassDimLTEight.lean:293, 305`; `FermionGaugeSector/MassWeight.lean:112`) are untouched. The +corollary's proof is the single line that currently sits at line 187. + +**[M] Is the stronger version worth having?** Honest answer: **no current consumer needs it**, +and AGENTS.md warns against adding results that are trivial rearrangements. The case for it is +that it is the *actual* theorem (the parity is a sufficient condition for a hypothesis about +one submodule being `⊥`), it costs one line, and it would apply to a decomposition that +redundantly declares `0` in its support — a situation §3.4 shows the library's own constructors +can produce. The case against is that it is speculative API. **[M] I do not presuppose that +this new API is necessary**; I record it as a small optional improvement for the human to +accept or decline, and the required scope in §5 works either way. + +### 4.3 Other risks + +**[M] R1 — the `ℂ`/`K` seam.** `mem_of_invariant_of_mem_sup_of_odd_supp` is at `ℂ` for an +accidental reason (§2.3) while everything around it is at `K`. If it moves into +`WeightGrading.lean` unchanged, that file will have one `ℂ`-only declaration among +`K`-generic ones. Generalising requires a `K`-form of `quotient_apply_mkQ` (or an inline +`rfl`), which is cheap; but it is a *change*, and every consumer is at `ℂ`, so the human may +prefer to leave it. Flagged, not decided. + +**[M] R2 — `WeightGrading.lean` would grow.** 246 lines today; the required scope in §5 adds +roughly 100–120, the full 18-declaration consolidation roughly 200–220. Still far below any +file-size limit, but it changes the file from "the definition and its independence" into "the +definition and its whole API". **[S]** `docs/ReviewGuidelines.md` bands a 100–200 line PR as +"large, okay but try to break up", so the full consolidation should be split. + +**[M] R3 — the `@[simp]` accessors.** `mulOfMul_supp` (`@[simp]`, line 113) and `sup_supp` +(`@[simp]`, line 150) are `rfl` lemmas that would enter a much more widely imported file. A +`simp` lemma that unfolds `supp` to a `Finset` sum or union will now fire in contexts that never +saw it before. **[M]** Low risk (both sides are already-normal forms) but a real behavioural +change, and the kind of thing that shows up as an unexpected `simp` failure three files away. + +**[M] R4 — nothing in this extraction is verifiable end to end right now.** §1.1: every +consumer is behind the blocker. Even a perfect extraction can only be validated against +*restated* applications until the blocker is resolved. §6 separates these two kinds of evidence +explicitly. + +--- + +## 5. Bounded extraction proposal + +### 5.1 Destination + +**[M] Recommended home: `Physlib/Relativity/LorentzGroup/Boosts/WeightGrading.lean`.** +It is the file that defines `WeightDecomposition`, `copy` and `sup`; it is the only one of the +candidates that builds today (§1.1); its existing variable block is exactly the generality the +candidates want; and **[S]** it already imports `Boosts/Axis.lean` and +`Mathlib.Algebra.Group.Pointwise.Finset.Basic`, covering two of the four import needs (§2.2). +AGENTS.md's "place results in the appropriate existing file" points here and no other +mathematical or import consideration points elsewhere. + +**[M] One declaration should not go there: `mul_le_iSup_convolution`** (§3.2). It has no +Lorentz content at all — no `rep`, no axis, no weight. Two options: (a) put it in +`WeightGrading.lean` anyway, in a small section marked as a submodule-only preliminary, with a +comment that it is upstreamable; (b) put it in `Physlib/Mathematics/` — there is no obviously +right file there, so this would mean a new one. **[M] I recommend (a)**: a new file for one +four-line lemma is worse than a clearly-marked section, and AGENTS.md defaults against new +files. + +**[M] Import direction.** `WeightGrading.lean` must not import any Standard Model file, and +nothing in the proposal makes it do so. The one thing that would is the `quotient_apply_mkQ` +dependency, which points at `Invariants/LorentzCovariance.lean` (not SM, but a large and +irrelevant subtree) — inline it (§2.3). + +### 5.2 Required work + +Ordered, each step independently reviewable. **[M]** Steps 1–2 are a single coherent concept +("the product of two boost-weight decompositions"); step 3 is a second +("odd boost weight admits no invariant"); AGENTS.md's one-concept-per-PR rule suggests two PRs. + +**PR A — the convolution.** + +1. Add to `WeightGrading.lean` section C, after `sup_piece`: `sup_supp` (moved verbatim from + `MassDimLTEight.lean:151`, shedding the inert `[Ring A] [Algebra K A]`), then a new section + with `variable {A : Type*} [Ring A] [Algebra K A]` holding `mul_le_iSup_convolution` + (strengthened to an equality per §3.2, inert typeclasses dropped), `mulOfMul`, + `mulOfMul_supp`, `exists_add_eq_of_mem_mulOfMul_supp`, `two_dvd_of_mem_mulOfMul_supp`, + `not_two_dvd_of_mem_mulOfMul_supp`. +2. Delete those six-plus-one from `MassDimLTEight.lean:53–152`; the file keeps its + `namespace Lorentz.BoostWeight.WeightDecomposition` block only if step 3 is deferred, + otherwise the whole block goes and the file starts at `namespace StandardModel`. +3. Add the needed Mathlib import(s) for `Submodule` multiplication (§2.2, probe P0a); update + `WeightGrading.lean`'s module docstring, which **[S]** currently says at lines 27–29 that the + product *"is built where it is used, in `CovAlgebraRealization/YukawaSector/MassDimLTEight.lean`"* + — that sentence becomes false and must be replaced. +4. Fix overclaims O1, O3, O4, O5 (§4.1). + +**PR B — the parity exclusion.** + +5. Move `map_boostWeightSubmodule_le` and `mem_of_invariant_of_mem_sup_of_odd_supp` into + `WeightGrading.lean` section B (they belong with + `mem_of_mem_iSup_of_boostWeight_zero`, which the latter calls). +6. Inline `quotient_apply_mkQ` (§2.3) so that `WeightGrading.lean` gains no import. +7. Delete the corresponding block from `MassDimLTEight.lean`; the file then begins at + `namespace StandardModel` and holds only Standard Model content (sections C, D, E), which is + what its name promises. + +**[M] Consumer impact: none.** All nine declarations keep their full names +(`Lorentz.BoostWeight.WeightDecomposition.*`) because the namespace is already the general one +— **[S]** `MassDimLTEight.lean:53` opens exactly `namespace Lorentz.BoostWeight.WeightDecomposition`. +Moving the declarations between files does not change a single call site, provided the consumer +files still reach `WeightGrading.lean`, which **[S]** they do +(`HiggsAlgebraCovRealization/Basic.lean:14` imports it and everything downstream inherits it). +**[M]** The only things that change are the two `@[simp]` lemmas' visibility (risk R3) and the +`hmul` argument, which stays in the same position. + +### 5.3 Optional improvements, explicitly outside the required scope + +| # | improvement | recommendation | +| --- | --- | --- | +| I1 | Strengthen `mul_le_iSup_convolution` to an equality and use `le_antisymm` in `mulOfMul.iSup_piece` (§3.2) | **Do** — it removes a duplicated argument. Folded into PR A above. | +| I2 | Split out `mem_of_invariant_of_mem_sup_of_piece_zero` with the odd-support corollary (§4.2) | **Offer** — one line, recovers the old contract exactly, but no consumer needs it. Human's call. | +| I3 | Generalise the parity theorem from `ℂ` to `K` (§2.3, R1) | **Offer** — makes it match its neighbours. Needs a `K`-form of the `rfl` helper. | +| I4 | Move the other nine general declarations (`ofTrivialAction`×3, `ofWeightBasis`, `iSupFintype`×2, `ofAxisTwo`, `iSupOfSupp`×2) into `WeightGrading.lean` (§2.0, §2.2) | **Follow-on PR C.** Independently worthwhile — it unblocks `trivialWeightDecomposition` as a one-liner (§3.3) and would let `iSupFintype` become a corollary of `iSupOfSupp`. Out of this task's scope. | +| I5 | Relocate `IsDerivativeCollection` and `boostDecomp` (`HiggsAlgebraCovRealization/Basic.lean:1137–1209`) | **Not now.** They are general in content — **[S]** they use only `B`, `repLorentz`, `RotatesIndices` and `lightConeDeriv`, and the surrounding `[Ring B] [Algebra ℂ B]`, `rep`, `massWeightPoly` are inherited and unused — but their prerequisites live in `Relativity/LightConeDeriv.lean`, which `WeightGrading.lean` does **not** import. A different destination and a bigger decision. | +| I6 | Generalise `mul_le_iSup_convolution`'s index from `ℤ` to `AddMonoid ι` | **Do not.** Nothing needs it (§3.2). | +| I7 | Introduce a graded-algebra structure | **Do not** (§3.1). It would require equality where the library has containment. | +| I8 | Add a minimality field to `WeightDecomposition.supp` | **Do not** (§3.4). It would break three existing constructors. | + +**[M] Estimated required diff:** PR A roughly +95/−85, PR B roughly +40/−35, plus docstrings — +each within `docs/ReviewGuidelines.md`'s "average" band, each a single concept. + +--- + +## 6. Post-bump Lean experiment checklist + +Each probe is a stop/go gate. Probes are labelled **[generic]** if they can run without any +Standard Model file, and **[blocked]** if they require the blocker to be resolved first. + +| # | probe | kind | pass criterion | stop/go | +| --- | --- | --- | --- | --- | +| **P0a** | **Destination-only imports.** In a scratch copy of `WeightGrading.lean` on 4.34.0, add the import(s) needed for `Submodule` multiplication (`Mathlib.Algebra.Algebra.Operations` or its 4.34.0 successor) and, if I4 is in scope, for `Module.Basis`. Build that file alone. | generic | Elaborates; `lake exe importGraph`-style inspection shows no new `Physlib/Particles/` edge. | **Stop** if `WeightGrading.lean` acquires any Standard Model dependency. That is the invariant the whole extraction exists to protect. | +| **P0b** | **The pointwise import.** Confirm that `Mathlib.Algebra.Group.Pointwise.Finset.Basic` (line 11) is what supplies `+ : Finset ℤ → Finset ℤ → Finset ℤ`, and that it is currently unused (§2.2). | generic | `mulOfMul.supp` elaborates with no further import. | Go either way; this only affects whether the PR adds or removes an import line. | +| **P1** | **Convolution, standalone.** State `mul_le_iSup_convolution` as an **equality** (§3.2) and `mulOfMul` in the destination, with the §5.2 variable block. Build. | generic | Both elaborate with no hypothesis beyond `hmul` and the two decompositions. | **Stop** if `hmul` proves insufficient — that would contradict the handoff's central claim and must be reported, not worked around by adding a representation hypothesis. | +| **P2** | **Noncommutative factor order.** With `A` a noncommutative ring (e.g. `Matrix (Fin 2) (Fin 2) ℂ` as a `ℂ`-algebra), check that `mulOfMul d₁ d₂ : WeightDecomposition rep i (V * W)` and that `mulOfMul d₂ d₁` has type `… (W * V)`, and that these do not unify. Also check the **left-nested** triple `mulOfMul hmul (mulOfMul hmul d₁ d₂) d₃ : … (V * W * U)` elaborates (§3.1). | generic | Types are as stated; the triple elaborates against `V * W * U` without an explicit `mul_assoc` rewrite. | **Stop** if the triple needs a rewrite: `higgsSqFermionBoostWeight` (`MassDimLTEight.lean:252`) and any analogue depend on it. | +| **P3** | **Redundant and empty support.** `d` with `supp := {0, 1}` but `piece 1 = ⊥`; `d` with `supp := ∅` (so `V = ⊥`); and `mulOfMul` of an empty-support factor with a nonempty one. Check `supp` values and that `piece_eq_bot` is still provable. | generic | `∅ + s = ∅`; the redundant entry is accepted; no lemma in the moved set concludes `piece k ≠ ⊥` from `k ∈ supp`. | Go. Confirms §3.4 in Lean rather than on paper. | +| **P4** | **Parity, standalone.** State `map_boostWeightSubmodule_le` and `mem_of_invariant_of_mem_sup_of_odd_supp` in the destination with `quotient_apply_mkQ` **inlined** (§2.3). Build. | generic | Elaborates; the destination still has no `Invariants/` import. | **Stop** if inlining fails — then `quotient_apply_mkQ` must move to a lower file instead, which is a separate decision. | +| **P5** | **Zero-piece / odd-support conclusion** (only if I2 is accepted). State `mem_of_invariant_of_mem_sup_of_piece_zero` and derive `mem_of_invariant_of_mem_sup_of_odd_supp` from it with the §4.2 one-liner. | generic | The corollary's statement is **verbatim** the current one, including implicit/explicit argument order. | Go. If the corollary's signature drifts at all, drop I2 rather than change consumers. | +| **P6** | **`K`-genericity** (only if I3 is accepted). Restate the parity theorem at `{K} [Field K] [Algebra ℝ K]`. | generic | Elaborates; the `ℂ` instance still typechecks at every old call shape. | Go / drop I3. | +| **P7** | **Restated application shapes.** Reproduce, without importing any Standard Model file, the four consumer shapes: `mulOfMul` of two abstract decompositions with even/odd support hypotheses; the nested `(even ⊞ even) ⊞ odd`; `((d₁.sup d₂).sup d₃)` with a `Finset.mem_union` case split (mirroring `MassDimLTEight.lean:307–313`); and the final `mem_of_invariant_of_mem_sup_of_odd_supp` application. | generic | All four elaborate against the moved declarations. | Go. **This is the furthest the extraction can be validated while the blocker stands.** Record explicitly that it is *restated shapes*, not production consumers. | +| **P8** | **Principal axiom audit.** `#print axioms` on `mulOfMul`, `mul_le_iSup_convolution`, `mulOfMul_supp`, `exists_add_eq_of_mem_mulOfMul_supp`, `two_dvd_of_mem_mulOfMul_supp`, `not_two_dvd_of_mem_mulOfMul_supp`, `sup_supp`, `map_boostWeightSubmodule_le`, `mem_of_invariant_of_mem_sup_of_odd_supp`. | generic | `propext`, `Classical.choice`, `Quot.sound` only — no `sorryAx`, no `Lean.ofReduceBool`. | **Stop** on anything else; AGENTS.md requires such declarations to be tagged. | +| **P9** | **Original production consumers.** Build, unchanged: `CovAlgebraRealization/YukawaSector/MassDimLTEight.lean` (sections C–E), `CovAlgebraRealization/FermionGaugeSector/MassWeight.lean`, `AlgebraRealization/HiggsAlgebraCovRealization/DerivSubmodule/BoostWeightDecomposition.lean`, `IsFermionSector/DerivSubmodule/BoostWeightDecomposition.lean`, `IsGaugeSector/DerivSubmodule/BoostWeightDecomposition.lean`. | **blocked** | All five elaborate with no call-site edits. | **This is the real acceptance gate and it cannot be reached until `StandardModel.JetAlgebra.SectorEquiv.Basic` builds.** Do not repair that blocker as part of this work; record the obligation as owed. | + +### 6.1 Blocked production consumers, named + +**[S]** The validation obligations that the blocker prevents, listed so they can be discharged +later rather than forgotten: + +| consumer | declarations it exercises | file:line | +| --- | --- | --- | +| `higgsFermionBoostWeight`, `odd_higgsFermionBoostWeight_supp` | `mulOfMul`, `not_two_dvd_of_mem_mulOfMul_supp` | `MassDimLTEight.lean:236–248` | +| `higgsSqFermionBoostWeight`, `odd_higgsSqFermionBoostWeight_supp` | nested `mulOfMul`, `two_dvd_…`, `not_two_dvd_…` | `MassDimLTEight.lean:252–270` | +| `mem_of_lorentz_invariant_sectorMassWeight_higgs_fermion_five_sup` | `mem_of_invariant_of_mem_sup_of_odd_supp` | `MassDimLTEight.lean:287–293` | +| `…_seven_sup` | `sup`, `sup_supp`, `mem_of_invariant_of_mem_sup_of_odd_supp` | `MassDimLTEight.lean:299–313` | +| `gaugeFermionBoostWeight`, `odd_gaugeFermionBoostWeight_supp`, `mem_of_lorentz_invariant_sectorMassWeight_gauge_fermion_seven_sup` | `mulOfMul`, `not_two_dvd_…`, `mem_of_invariant_of_mem_sup_of_odd_supp` | `FermionGaugeSector/MassWeight.lean:78–113` | +| `higgsValueWeight`, `barHiggsValueWeight`, `higgsSubmoduleBoostWeight_piece`, `barHiggsSubmoduleBoostWeight_piece` | `ofTrivialAction`, `ofTrivialAction_piece` | `Higgs BWD:125–132, 238–267` | + +**[M]** Until P9 runs, the strongest honest claim available is: *the moved declarations +elaborate in a Standard-Model-free setting and support restated versions of every application +shape the production consumers use.* That is not the same as the consumers building, and this +report does not conflate them. + +--- + +## 7. Unresolved choices for human judgement + +1. **Destination for `mul_le_iSup_convolution`** — a marked section in `WeightGrading.lean` + (recommended) or a new `Physlib/Mathematics/` file (§5.1). +2. **I2, the zero-piece split** — genuinely optional, one line, no consumer (§4.2). I have not + presupposed it is necessary. +3. **I3, `ℂ` → `K`** — consistency with the destination file versus leaving a working + declaration alone (§2.3, R1). +4. **Scope of PR C (I4)** — whether the other nine general declarations move in the same + campaign. **[M]** They should, eventually; the `trivialWeightDecomposition` duplication + (§3.3) is the concrete payoff. +5. **Standing preference against cross-file moves.** Earlier sessions recorded a preference + that work on a Lean file stay within that file and not relocate results. This proposal is + inherently a cross-file move and needs an explicit go-ahead. **[M]** If that preference + stands, the useful residue is the documentation fix (§4.1, O1/O3/O4/O5) and the + `mul_le_iSup_convolution` strengthening (I1), both of which are in-file changes and both of + which are worth doing on their own. +6. **Sequencing against the 4.34.0 bump.** Every probe in §6 is a 4.34.0 probe. **[M]** Since + `WeightGrading.lean` is not behind the blocker, PR A and PR B could in principle be prepared + against 4.33.0 and rebased — but the handoff forbids running anything here, so this is a + scheduling question for the human, not a finding. + +--- + +## 8. What this report does not establish + +No Lean was elaborated. No build, cache fetch, lint, benchmark, timing or axiom audit was run, +and none is reported. Every Lean fragment above is an uncompiled sketch. The import-closure and +usage facts are from static text analysis, which sees `import` lines and identifier occurrences +but not elaboration: in particular, "no pointwise operation appears in `WeightGrading.lean`" +(§2.2) is a grep result, not a proof that the import is removable, and "`hodd` is used once" +(§4.2) is a textual count of a proof I could not elaborate. Mathlib claims hold only for rev +`db584cd6` (v4.33.0); absence there is not absence from 4.34.0, and presence there is not +presence in 4.34.0. No assumption is made about whether +`StandardModel.JetAlgebra.SectorEquiv.Basic` builds on any other revision, and I neither +repaired nor attempted to build it. I claim sufficiency of the hypotheses discussed, never +optimality or minimality. Human review, then the §6 probes on 4.34.0, are the acceptance gate +before implementation. diff --git a/AITasks/ToDo/boost-weight-extraction.md b/AITasks/Done/boost-weight-extraction.md similarity index 100% rename from AITasks/ToDo/boost-weight-extraction.md rename to AITasks/Done/boost-weight-extraction.md diff --git a/AITasks/Done/invariant-coefficient-sharing-report.md b/AITasks/Done/invariant-coefficient-sharing-report.md new file mode 100644 index 000000000..fb350d081 --- /dev/null +++ b/AITasks/Done/invariant-coefficient-sharing-report.md @@ -0,0 +1,705 @@ +# Shared invariant-coefficient lifting: investigation report + +Read-only investigation. No Lean was elaborated, built, linted or probed; no Lean file, +import, dependency, other report or roadmap file was edited. The only file added by this +task is this report. + +Claims below are tagged: + +- **[S]** source-verified — read directly from the files and line numbers cited. +- **[M]** mathematical deduction from **[S]** facts, done on paper, not machine-checked. +- **[K]** uncompiled Lean sketch — illustrative only, never elaborated. + +--- + +## 1. Source provenance and scope inspected + +**[S]** Working tree `/Users/josephsmith/LocalGithub/JTSphyslib`, branch `AddPotentialAlgebra`. + +| item | value | +| --- | --- | +| HEAD | `7db2baf182932c35fcb5ed5d00b5f321049ae906` (`docs: add AI task folder and some AI analysis tasks`, 2026-09-21) | +| handoff reference commit | `5589e23dde62da95d6f7e4d9467cf63ecc111680` | +| relation | reference is an ancestor of HEAD (`git merge-base --is-ancestor` succeeds) | +| `git diff 5589e23d..HEAD --stat` | `AITasks/Done/.gitkeep`, `AITasks/ToDo/boost-weight-extraction.md`, `AITasks/ToDo/invariant-coefficient-sharing.md` — **no `.lean` file differs** | +| dirty files at start | `Draft.md` only (3 insertions, 1 deletion; not inspected for content, not a Lean source) | +| `lean-toolchain` | `leanprover/lean4:v4.33.0` | +| `lake-manifest.json` | manifest version `1.2.0`; `mathlib` rev `db584cd6d46c92f209a44c0f1c829460d327499d`, inputRev `v4.33.0` | +| git worktrees | one — this checkout is not a bump workspace and contains no 4.34.0 material | + +So **[S]** every declaration named in the handoff is at the reference revision, byte for byte. +No declaration had to be relocated, and no material difference from the handoff description +was found. All Mathlib references below were read from `.lake/packages/mathlib` at rev +`db584cd6` (v4.33.0) and are asserted **only** for that snapshot. + +Files read in full: `Physlib/Relativity/LorentzGroup/Invariants/Basic.lean` (341 lines), +`Physlib/Particles/StandardModel/GaugeGroup/Invariants/Basic.lean` (233), +`Physlib/Mathematics/LinearCombination.lean` (40). Read in relevant part: +`Physlib/Relativity/LorentzGroup/Invariants/LorentzCovariance.lean`, +`Physlib/Relativity/LorentzGroup/Invariants/IsLeftRightWeyl.lean`, +`Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiFundamental.lean`, +`.../IsSU3FunAntiFun.lean`, `Physlib/Particles/StandardModel/Peeling.lean`. +Consumer inventory obtained by repository-wide grep, not by the handoff's starting list. +Import closures computed by a static parse of `import` lines (a script in the scratchpad, +not added to the repository). + +**Not inspected:** the interiors of `IsSU2Adjoint`, `IsSU2BiAdjoint`, `IsSU3Adjoint`, +`IsSU3BiAdjoint`, `IsSU2QuadFundamental`, `IsSU3BiFundamental`, `IsU1BiAdjoint`, +`IsBiLeftWeyl`, `IsVectorLeftRightWeyl` beyond their call sites; the `Rank*` Lorentz files. + +--- + +## 2. Exact contract comparison + +### 2.1 The two statements, transcribed with their effective context + +**[S]** Lorentz — `Physlib/Relativity/LorentzGroup/Invariants/Basic.lean`, file-level +variable at line 52, section variable at line 62, theorem at lines 79–85: + +``` +variable {B : Type*} [AddCommGroup B] [Module ℂ B] -- line 52 +section Complement +variable {ι : Type} [Fintype ι] {G : Type*} -- line 62 + +theorem Lorentz.Invariants.exists_invariantCoeff + (T : ι → B) (φ : G → B →ₗ[ℂ] B) + (A : G → (ι → ℂ) →ₗ[ℂ] (ι → ℂ)) + (hφ : ∀ (g : G) (c : ι → ℂ), φ g (∑ i, c i • T i) = ∑ i, A g c i • T i) + (hA : ∀ g : G, ∃ g' : G, ∀ u v : EuclideanSpace ℂ ι, + ⟪u, WithLp.toLp 2 (A g v.ofLp)⟫_ℂ = ⟪WithLp.toLp 2 (A g' u.ofLp), v⟫_ℂ) + {x : B} (hx : x ∈ ⨆ i, ℂ ∙ T i) (hinv : ∀ g, φ g x = x) : + ∃ c : ι → ℂ, x = ∑ i, c i • T i ∧ ∀ g, A g c = c +``` + +**[S]** Gauge — `Physlib/Particles/StandardModel/GaugeGroup/Invariants/Basic.lean`, +file-level variable at line 48, section variable at lines 93–94, theorem at 141–145: + +``` +variable {B : Type*} [AddCommGroup B] [Module ℂ B] {ι : Type*} [Fintype ι] -- line 48 +section Complement +variable {G : Type*} [Group G] (T : ι → B) (φ : G → B →ₗ[ℂ] B) + (A : G → (ι → ℂ) →ₗ[ℂ] (ι → ℂ)) -- lines 93–94 + +theorem StandardModel.Family.exists_invariant_coeff + (hφ : ∀ g (c : ι → ℂ), φ g (∑ i, c i • T i) = ∑ i, A g c i • T i) + (hA : ∀ g (c d : ι → ℂ), ∑ i, star (c i) * A g d i = ∑ i, star (A g⁻¹ c i) * d i) + {x : B} (hx : x ∈ ⨆ i, ℂ ∙ T i) (hinv : ∀ g, φ g x = x) : + ∃ c : ι → ℂ, x = ∑ i, c i • T i ∧ ∀ g, A g c = c +``` + +### 2.2 Difference table + +| # | aspect | Lorentz `exists_invariantCoeff` | gauge `exists_invariant_coeff` | verdict | +| --- | --- | --- | --- | --- | +| 1 | `B` | `Type*`, `[AddCommGroup B] [Module ℂ B]` | identical | same | +| 2 | `ι` universe | `Type` (universe 0) | `Type*` | **gauge is more general** | +| 3 | `ι` finiteness | `[Fintype ι]` | `[Fintype ι]` | same | +| 4 | `G` | bare `{G : Type*}`, no class | `{G : Type*} [Group G]` | **Lorentz is more general** | +| 5 | `A` | `G → (ι → ℂ) →ₗ[ℂ] (ι → ℂ)` | identical | same | +| 6 | `hφ` (the law) | `∀ g c, φ g (∑ i, c i • T i) = ∑ i, A g c i • T i` | character-for-character identical | same | +| 7 | `hA` (the adjoint) | `∀ g, ∃ g', ∀ u v : EuclideanSpace ℂ ι, ⟪u, A g v⟫ = ⟪A g' u, v⟫` | `∀ g c d : ι → ℂ, ∑ i, star (c i) * A g d i = ∑ i, star (A g⁻¹ c i) * d i` | **the only real difference** | +| 8 | `hx` | `x ∈ ⨆ i, ℂ ∙ T i` | identical | same | +| 9 | `hinv` | `∀ g, φ g x = x` | identical | same | +| 10 | conclusion | `∃ c, x = ∑ i, c i • T i ∧ ∀ g, A g c = c` | character-for-character identical | **same, including ordering** | +| 11 | argument order | `T φ A hφ hA hx hinv` | `T φ A hφ hA hx hinv` (T, φ, A via section variables) | same | +| 12 | naming | camel `exists_invariantCoeff` | snake `exists_invariant_coeff` | cosmetic | + +**Conclusion-ordering caveat.** The handoff asks about conclusion ordering. The two +*principal* statements agree exactly. The flip is one level up, in the Lorentz matrix +wrapper: **[S]** `exists_invariantCoeff_matrix` (Basic.lean:166–176) concludes +`∃ c, (∀ g, actMat (M g) c = c) ∧ x = ∑ i, c i • T i` — invariance first — and its proof +ends with `exact ⟨c, hinvc, hc⟩`, i.e. it exists only to swap the conjuncts. +**[S]** `exists_isInvariantCoeff_of_mem_span` (267–278) and +**[S]** `IsLorentzCovariant.exists_isInvariantCoeff_of_mem_componentSpan` +(`LorentzCovariance.lean:155–159`) keep that order. The gauge callers all destructure as +`obtain ⟨c, rfl, hc⟩` (7 sites, §5.1), the Lorentz Weyl callers as `obtain ⟨c, hc, hx'⟩`. +Any shared statement must therefore fix one order; the *existing* shared order (both +principal theorems) is `x = … ∧ invariance`, and the flip lives only in the matrix wrapper, +which is Lorentz-only and can keep flipping. + +### 2.3 What `hA` actually assumes + +This is the crux, and the comments are misleading in both files. + +**[S]** The gauge file's section-B prose (lines 84–87) says: *"One property of `A` is needed: +`A g⁻¹` is the adjoint of `A g` for the standard inner product on coefficients, which is to +say that `A` is unitary."* + +**[M]** Two corrections. (a) "`A g⁻¹` is the adjoint of `A g`" does **not** say `A` is +unitary; it says `A g` has an adjoint inside the family. It coincides with unitarity only +if one additionally knows `A` is a homomorphism and `A 1 = 1`, and **[S]** neither is +assumed anywhere in the statement or used anywhere in the proof. (b) `[Group G]` is used +*solely to be able to write `g⁻¹` in `hA`*: **[S]** reading the proof (lines 146–169), the +group structure never appears — `hA` is applied once, at `g`, inside `inner_actₗ` +(line 165), and the element `g⁻¹` it produces is fed straight to `hKstab _ u hu` (line 166), +which accepts *any* element of `G`. No multiplication, no `inv_inv`, no `one_mul`. + +**[M]** Therefore the gauge hypothesis is strictly the special case of the Lorentz +hypothesis in which the witness `g'` is chosen to be `g⁻¹`, and the `[Group G]` instance is +not a mathematical prerequisite of the theorem but a prerequisite of *writing* that +particular choice. + +**[S] Decisive counterevidence against standardising on `g⁻¹`.** The Lorentz families are +genuinely not unitary, and the library says so: Basic.lean:154–155 documents `inner_actMat` +with *"The action is not unitary, and is not used to be."* Concretely, the witnesses +supplied by the three Lorentz call sites are conjugate transposes, not inverses: + +- `exists_isInvariantCoeff_of_mem_span` (Basic.lean:275–277) supplies + `dagger g = ⟨g.1ᴴ, …⟩` (`dagger`, line 217); +- `IsLeftRightWeyl.exists_isInvariantCoeff_of_mem_componentSpan` (lines 134–137) supplies + `Invariants.dagger g`; +- `IsBiLeftWeyl` (line 139 ff.) likewise. + +For `g ∈ SL(2,ℂ)`, `g† ≠ g⁻¹` in general. So a shared statement phrased with `g⁻¹` would +be **unusable** by the Lorentz side. The existential-witness form is not gratuitous +generality; it is the form the existing Lorentz applications need. + +### 2.4 Which laws are assumed, which follow, which are unused + +**[M]**, from reading both proofs: + +| property of `A` | status | +| --- | --- | +| `A g` linear | assumed (it is a `→ₗ[ℂ]`); used for `hKstab` and for the `Kᗮ` decomposition | +| `A` multiplicative / a representation | **never assumed, never used** — `A` is a bare function `G → End` | +| `A 1 = 1` | **never assumed, never used** | +| `A g` invertible | **never assumed, never used** | +| `A g` unitary / isometric | **never assumed, never used** (the gauge docstring's claim is not a hypothesis) | +| adjoint of `A g` lies in the family | assumed; the *only* nontrivial hypothesis on `A` | +| `φ` multiplicative or a representation | **never assumed** — `φ : G → B →ₗ[ℂ] B` is a bare function; the callers pass `fun g => repLorentz g`, discarding the monoid-hom structure | +| `T` linearly independent | **never assumed**; explicitly disclaimed in the Lorentz docstring (lines 77–78: *"Nothing is claimed about uniqueness, the components being possibly dependent."*) | + +**[M]** So both theorems are about an arbitrary *set* of linear maps closed under adjoints +in a weak (witness-wise) sense, not about a group representation. + +### 2.5 Where complex scalars, finiteness and `WithLp` are actually needed + +**[M]**, tracing the proofs: + +- **Inner product / orthogonality**: needed only on the *coefficient* space + `EuclideanSpace ℂ ι = WithLp 2 (ι → ℂ)`. The two Mathlib facts consumed are + **[S]** `Submodule.exists_add_mem_mem_orthogonal` + (`Mathlib/Analysis/InnerProductSpace/Projection/Basic.lean:427`, needs + `[K.HasOrthogonalProjection]`) and **[S]** `Submodule.inf_orthogonal_eq_bot` + (`Mathlib/Analysis/InnerProductSpace/Orthogonal.lean:98`). +- **`[Fintype ι]`** does three jobs: it makes `∑ i` meaningful; it makes + `EuclideanSpace ℂ ι` finite-dimensional hence complete, which supplies + `HasOrthogonalProjection` through **[S]** + `HasOrthogonalProjection.ofCompleteSpace` (`Projection/Basic.lean:54`); and it makes + `Fintype.range_linearCombination` available for the `hx` unpacking. +- **`ℂ`**: used only as an `RCLike` field carrying the standard inner product. **[M]** The + argument is verbatim valid over `𝕜` with `[RCLike 𝕜]`, since every Mathlib lemma used is + stated at `RCLike`. I do **not** recommend taking that generality (§3.4). +- **`WithLp.toLp 2` / `.ofLp`**: pure type-level plumbing, as the Lorentz docstring says + (Basic.lean:65). No mathematical content. +- **`B`**: **[S]** carries *no* inner product, *no* norm and *no* finiteness in either + statement, and must not acquire any. `[AddCommGroup B]` (rather than `AddCommMonoid`) is + genuinely used: **[M]** step `h1` applies `map_sub` to `contractₗ`, which needs subtraction + in the codomain. + +### 2.6 Boundary cases, on paper + +**[M] Dependent family.** The whole point. If the `T i` satisfy relations, `K = ker(contract)` +is a nonzero subspace of coefficient space and the *given* coefficient `c` need not be +invariant; the theorem replaces it by its `Kᗮ`-component. Uniqueness is not claimed and does +not hold: any `c + κ` with `κ ∈ K` represents the same vector. **[M]** A stronger true +statement the proof in fact establishes, but does not expose: the produced `c` is the unique +*minimum-norm* representation of `x`, being the orthogonal projection of an arbitrary one +onto `Kᗮ`. Nothing currently needs this. + +**[M] Empty index.** For `ι` empty, `⨆ i : ι, ℂ ∙ T i = ⊥`, so `hx` forces `x = 0`; `ι → ℂ` +is a subsingleton, so the unique `c` satisfies both conjuncts trivially. No hypothesis is +vacuously violated and the statement is true but content-free. **[M]** The proof also goes +through unchanged, since `K = ⊥ = ⊤` in the zero space and `Kᗮ` is the same zero space. + +**[M] Degenerate `T` (all `T i = 0`).** `K = ⊤`, `Kᗮ = ⊥`, the produced `c` is `0`, and the +theorem says `x = 0` with `A g 0 = 0` — true by linearity of `A g`. + +--- + +## 3. Common proof mechanism, library machinery and the candidate statement + +### 3.1 Step-by-step correspondence + +The two proofs are the same proof. Line-by-line map, all **[S]**: + +| step | Lorentz `Invariants/Basic.lean` | gauge `GaugeGroup/Invariants/Basic.lean` | +| --- | --- | --- | +| unpack `hx` into a coefficient `c` | 87–90 (inline `span_range_eq_iSup` + `Fintype.range_linearCombination`) | 146 (via the extracted `mem_iSup_span_singleton_iff`, 58–61 — the same three rewrites) | +| the contraction map `q` | `contractₗ` 66–72 | `contractₗ` 98–104 — **identical definition body** | +| intertwining `q ∘ A g = φ g ∘ q` | `hcontr`, 91–93 | `hΦ`, 147–148 | +| `K := ker q` | 94 | 149 | +| `K` is `A`-stable | `hKstab`, 95–99 | `hKstab`, 150–153 | +| split `c = k + k'`, `k ∈ K`, `k' ∈ Kᗮ` | 100 | 154 | +| `x = q k'` (the `K` part is invisible) | `hx'`, 101–103 | `hx'`, 155–158 | +| `A g k' − k' ∈ K` (uses `hinv`) | `h1`, 105–106 | `h1`, 160–161 | +| `A g k' ∈ Kᗮ` (uses the adjoint) | `h2`, 107–111 | `h2`, 162–166 | +| `K ⊓ Kᗮ = ⊥` kills the difference | 112–115 | 167–169 | + +**Why the coefficient maps preserve `K`** **[M]**: if `q u = 0` then +`q (A g u) = φ g (q u) = φ g 0 = 0`. Only linearity of `φ g` and the intertwining law are +used; no property of `A` beyond linearity. + +**Why the adjoint condition makes `Kᗮ` invariant** **[M]**: let `g'` witness the adjoint of +`g`. For `u ∈ K`, `⟪u, A g k'⟫ = ⟪A g' u, k'⟫ = 0`, because `A g' u ∈ K` (stability applied at +`g'`) and `k' ∈ Kᗮ`. Note this consumes stability of `K` **at the witness `g'`, not at `g`** — +which is exactly why `hA` must range over a family closed under adjoints, and why a single +`g` with an adjoint outside the family would not do. + +**Why replacing a preimage by its `Kᗮ` component preserves the image** **[M]**: `q` is linear +and kills `K`, so `q (k + k') = q k'`. + +**Why the change is zero** **[M]**: `A g k' − k'` lies in `K` (by `h1`, using invariance of +`x`) and in `Kᗮ` (by `h2` and `k' ∈ Kᗮ`, which is a subspace). `K ⊓ Kᗮ = ⊥` in an inner +product space over `RCLike`, so the difference vanishes: `A g k' = k'`. + +### 3.2 Invariant expression vs. invariant coefficient description + +**[M]** The distinction the theorem exists to bridge. "`x` is invariant" is a statement about +a vector of `B`. "`c` is invariant" is a statement about a point of `ι`-space. The map +`c ↦ ∑ i, c i • T i` is equivariant but in general neither injective nor surjective onto the +invariants of its image *pointwise*: an invariant vector can be written with wildly +non-invariant coefficients (add any `κ ∈ K`, then move it — `A g κ` is another element of `K`, +generally `≠ κ`). The theorem says the fibre of an invariant vector always *contains* an +invariant point, which is what lets the downstream classification argue entirely in the +finite space `ι → ℂ`. It does **not** say the fibre consists of invariant points, and no +downstream file may assume that. + +### 3.3 Existing Mathlib machinery for the individual steps + +All **[S]**, read at mathlib rev `db584cd6` (v4.33.0). These are *available at the inspected +snapshot*; nothing here is a claim about 4.34.0. + +| step | Mathlib declaration | file:line | context needed | +| --- | --- | --- | --- | +| split into `K ⊕ Kᗮ` | `Submodule.exists_add_mem_mem_orthogonal` | `Analysis/InnerProductSpace/Projection/Basic.lean:427` | `[K.HasOrthogonalProjection]` | +| `HasOrthogonalProjection` | `HasOrthogonalProjection.ofCompleteSpace` | `Projection/Basic.lean:54` | `[CompleteSpace K]` | +| `K ⊓ Kᗮ = ⊥` | `Submodule.inf_orthogonal_eq_bot` | `Analysis/InnerProductSpace/Orthogonal.lean:98` | — | +| pairing against `Kᗮ` | `Submodule.inner_right_of_mem_orthogonal` | `Orthogonal.lean:64` | — | +| **identify an adjoint from the pairing law** | `LinearMap.eq_adjoint_iff` | `Analysis/InnerProductSpace/Adjoint.lean:612` | `[FiniteDimensional 𝕜 E] [FiniteDimensional 𝕜 F]` | +| **`Kᗮ` invariant under `T` when `K` invariant under `T†`** | `Module.End.mem_invtSubmodule_adjoint_iff` | `Adjoint.lean:827` | `[FiniteDimensional 𝕜 E]` | +| same, continuous version | `ContinuousLinearMap.orthogonal_mem_invtSubmodule` | `Adjoint.lean:486` | `[CompleteSpace E]` | +| the invariance predicate | `Module.End.invtSubmodule`, `mem_invtSubmodule_iff_forall_mem_of_mem` | `Algebra/Module/Submodule/Invariant.lean:35, 58` | — | +| unpack `x ∈ ⨆ i, ℂ ∙ T i` | `Submodule.span_range_eq_iSup`, `Fintype.range_linearCombination` | (already used by both files) | `[Fintype ι]` | +| move a combination under a map given by a matrix | `LinearMap.map_sum_smul_of_forall_eq` | `Physlib/Mathematics/LinearCombination.lean:36` | Physlib, `CommSemiring R` | + +**[M] There is no single Mathlib theorem that does the whole job.** The nearest relative is +`LinearMap.IsSymmetric.orthogonalComplement_mem_invtSubmodule` +(**[S]** `Analysis/InnerProductSpace/Semisimple.lean:30`), which handles one symmetric +operator, not a family with witnessed adjoints. Mathlib's semisimplicity results live on the +other side of the argument (they *use* this kind of complement to get semisimplicity), and +`Representation.invariants` carries no lifting theorem of this shape. So the common theorem +has to be stated in Physlib. + +**[M] But the `h2` step can be delegated.** `Module.End.mem_invtSubmodule_adjoint_iff` is +exactly "`Kᗮ` is `T`-invariant iff `K` is `T†`-invariant", and `LinearMap.eq_adjoint_iff` +turns the hypothesis `hA` into the identification `A g' = (A g)†`. Both need +`[FiniteDimensional ℂ (EuclideanSpace ℂ ι)]`, which `[Fintype ι]` supplies. This would +replace roughly the five hand-written lines of `h2` in each file. This is a genuine +simplification (it names the concept instead of re-deriving it), not a generalisation; it +is listed as *optional* in §6 because it is a proof-internal change with an elaboration risk +(`LinearMap.adjoint` is noncomputable and carries `FiniteDimensional` side conditions that +must be found by instance search). + +### 3.4 The smallest natural common statement + +**[M] Recommendation.** The common statement is the Lorentz theorem with `ι` generalised from +`Type` to `Type*`. Nothing else changes. Specifically: + +**[K]** (uncompiled sketch) + +```lean +/-- An invariant of the span of a finite family is the contraction of an invariant + coefficient function, provided the coefficient maps have all their adjoints inside the + family: for every `g` some `g'` acts as the adjoint of `g`. The components may be + linearly dependent, so nothing is claimed about uniqueness. -/ +theorem exists_invariantCoeff_of_adjoint_mem + {B : Type*} [AddCommGroup B] [Module ℂ B] {ι : Type*} [Fintype ι] {G : Type*} + (T : ι → B) (φ : G → B →ₗ[ℂ] B) (A : G → (ι → ℂ) →ₗ[ℂ] (ι → ℂ)) + (hφ : ∀ (g : G) (c : ι → ℂ), φ g (∑ i, c i • T i) = ∑ i, A g c i • T i) + (hA : ∀ g : G, ∃ g' : G, ∀ u v : EuclideanSpace ℂ ι, + ⟪u, WithLp.toLp 2 (A g v.ofLp)⟫_ℂ = ⟪WithLp.toLp 2 (A g' u.ofLp), v⟫_ℂ) + {x : B} (hx : x ∈ ⨆ i, ℂ ∙ T i) (hinv : ∀ g, φ g x = x) : + ∃ c : ι → ℂ, x = ∑ i, c i • T i ∧ ∀ g, A g c = c +``` + +**[M] Why this and not something more abstract.** The handoff asks whether to state the +theorem about an intertwining linear map `q : E →ₗ[ℂ] B` rather than about a component +family. An abstract version would read: *given `q : E →ₗ[ℂ] B` with `E` a finite-dimensional +complex inner product space, a family `Ψ : G → E →ₗ[ℂ] E` with `q ∘ Ψ g = φ g ∘ q` and +adjoints inside the family, every `x ∈ range q` with `∀ g, φ g x = x` has a preimage fixed by +every `Ψ g`.* That is the mathematically honest form, and the component version is its +instance at `E = EuclideanSpace ℂ ι`, `q = contractₗ T`. + +Arguments for the abstract form: it separates the mathematics (an intertwiner and its kernel) +from the presentation (a family of vectors); it is what one would submit to Mathlib; and +`range q` is a cleaner hypothesis than `⨆ i, ℂ ∙ T i`. + +Arguments against, and why I recommend the component form anyway **[M]**: (a) *every* consumer +— 10 call sites, §5.1 — arrives with a family `T` and an `hφ` stated in `∑ i, c i • T i` form, +and would immediately need the same `hx`-unpacking and the same `contractₗ` wrapper, so the +abstract form buys a level of indirection and no shared work; (b) the `hφ` form is *not* the +naive `q ∘ Ψ g = φ g ∘ q` — it is stated pointwise on raw functions `c : ι → ℂ` and bridged to +`EuclideanSpace` by the caller-invisible `WithLp` shuffle, so an abstract statement would push +that shuffle onto every caller; (c) the handoff's own instruction is to prefer the smallest +natural statement, and the only actual difference between the two existing theorems is one +hypothesis. I therefore recommend the abstract version be *recorded as the mathematical +content in the docstring* and not separately formalised unless a third, non-family consumer +appears. + +**[M] On minimality.** I claim the hypotheses are *sufficient*, and I do **not** claim they are +necessary or minimal. Two concrete non-claims: (i) I have no argument that adjoint-closure is +necessary — a family whose adjoints escape may still admit invariant lifting for other reasons +(e.g. if `K = ⊥`, the statement is trivially true with no hypothesis on `A` at all, which +already shows the hypothesis is not necessary); (ii) `[Fintype ι]` could conceivably be +relaxed to a completeness/closedness condition on `K`, but `∑ i` would have to become a +`Finsupp` sum and every consumer would change; I do not recommend it. + +**[M] On `RCLike 𝕜`.** Every Mathlib lemma in the chain is stated at `RCLike`, so the proof +would go through verbatim at `𝕜`. I recommend **against** taking it: all 10 consumers are at +`ℂ`, the `hA` hypothesis for a real family would need a different bridge (`star` is trivial +over `ℝ`, so the "conjugate transpose" lemmas would degenerate), and the handoff explicitly +says to preserve the complex setting absent a directly useful relaxation. Record it as a +known free generalisation, not as scope. + +--- + +## 4. Derivation of both specialisations + +Both derivations below are **[M]** on paper with **[K]** Lean sketches. Neither was elaborated. + +### 4.1 The Lorentz specialisation + +**[M]** Trivial: the proposed statement *is* `exists_invariantCoeff` with `ι : Type` widened to +`Type*`. Widening a universe on an implicit type variable cannot break a caller that +instantiates it at `Type 0`, and **[S]** all three Lorentz instantiations do +(`Fin n → Fin 1 ⊕ Fin 3` at Basic.lean:267, `Fin 2 × Fin 2` at IsLeftRightWeyl.lean:131, and +the analogous type in IsBiLeftWeyl). So: + +**[K]** +```lean +theorem Lorentz.Invariants.exists_invariantCoeff (T : ι → B) (φ : G → B →ₗ[ℂ] B) … := + exists_invariantCoeff_of_adjoint_mem T φ A hφ hA hx hinv +``` +or, preferably, the name simply moves and `Invariants/Basic.lean` re-exports it. + +**Unresolved:** whether `Lorentz.Invariants.exists_invariantCoeff` should survive as a name at +all. **[S]** it has **zero** consumers outside its own file (repository-wide grep: the only +reference is `exists_invariantCoeff_matrix` at line 171). So it could simply be deleted and +`exists_invariantCoeff_matrix` call the shared theorem directly. That is the smaller diff and +I recommend it; the human should confirm, since it removes a `public` name. + +### 4.2 The gauge specialisation + +**[M]** Take `g' := g⁻¹` and convert the raw-sum hypothesis to the inner-product one. The +conversion already exists: **[S]** `Family.inner_actₗ` (GaugeGroup/Invariants/Basic.lean:129–137) +has exactly the signature + +``` +inner_actₗ (hA : ∀ g (c d : ι → ℂ), ∑ i, star (c i) * A g d i = ∑ i, star (A g⁻¹ c i) * d i) + (g : G) (a b : EuclideanSpace ℂ ι) : ⟪a, actₗ A g b⟫_ℂ = ⟪actₗ A g⁻¹ a, b⟫_ℂ +``` + +and **[S]** `actₗ A g b` is defined (lines 108–112) as `WithLp.toLp 2 (A g b.ofLp)` via +`LinearMap.mk`, so the two sides should be definitionally equal. + +**[K]** +```lean +theorem StandardModel.Family.exists_invariant_coeff + (hφ : ∀ g (c : ι → ℂ), φ g (∑ i, c i • T i) = ∑ i, A g c i • T i) + (hA : ∀ g (c d : ι → ℂ), ∑ i, star (c i) * A g d i = ∑ i, star (A g⁻¹ c i) * d i) + {x : B} (hx : x ∈ ⨆ i, ℂ ∙ T i) (hinv : ∀ g, φ g x = x) : + ∃ c : ι → ℂ, x = ∑ i, c i • T i ∧ ∀ g, A g c = c := + exists_invariantCoeff_of_adjoint_mem T φ A hφ + (fun g => ⟨g⁻¹, fun u v => inner_actₗ A hA g u v⟩) hx hinv +``` + +**Explicitly labelled unresolved step.** Whether `fun u v => inner_actₗ A hA g u v` typechecks +against the general `hA` *without* a `show`/`simp only [actₗ]` bridge. The target wants +`⟪u, WithLp.toLp 2 (A g v.ofLp)⟫` where `inner_actₗ` produces `⟪u, actₗ A g v⟫`. **[M]** These +should be defeq by `LinearMap.coe_mk` unfolding, but structure-eta on `LinearMap` applications +is exactly the kind of thing that elaborates or does not depending on reducibility settings. +If it does not, the fix is a one-line `simp only [actₗ, LinearMap.coe_mk, AddHom.coe_mk]` in +the wrapper — no change to either contract. This is probe P3 in §6. + +**Hypothesis matching, checked item by item** **[M]**: `B`, `ι`, `Fintype ι`, `T`, `φ`, `A`, +`hφ`, `hx`, `hinv` are syntactically identical between the gauge theorem and the shared one; +`[Group G]` remains a hypothesis of the *gauge* theorem (it is needed to state `hA`) and is +simply not passed to the shared one; `hA` is discharged as above. Nothing is strengthened, +and the gauge conclusion is unchanged, so **[M]** the 7 existing `obtain ⟨c, rfl, hc⟩` call +sites are untouched. + +**[M] The specialisations do not depend on the proofs they replace.** Each is a direct +application of the new theorem with a hypothesis supplied from a lemma (`inner_actₗ`) that is +independent of `exists_invariant_coeff`. **[S]** `inner_actₗ` is proved from `hA` and +`PiLp.inner_apply` alone (lines 133–137); it does not call `exists_invariant_coeff`. + +--- + +## 5. Placement, consumers and boundary + +### 5.1 Consumer inventory (repository-wide grep, **[S]**) + +`Lorentz.Invariants.exists_invariantCoeff` — **0 external consumers**; used once, internally, +at `Invariants/Basic.lean:171`. + +`Lorentz.Invariants.exists_invariantCoeff_matrix` — 2 consumers: +`Invariants/IsLeftRightWeyl.lean:134`, `Invariants/IsBiLeftWeyl.lean:139` +(plus internal use at `Invariants/Basic.lean:273`). + +`Lorentz.Invariants.exists_isInvariantCoeff_of_mem_span` — 1 consumer: +`Invariants/LorentzCovariance.lean:159`. + +`StandardModel.Family.exists_invariant_coeff` — **7 call sites**, in +`GaugeGroup/Invariants/`: `IsSU2Adjoint.lean:171`, `IsSU2BiAdjoint.lean:474`, +`IsSU3Adjoint.lean:205`, `IsSU3FunAntiFun.lean:282`, `IsSU3BiAdjoint.lean:918`, +`IsSU2QuadFundamental.lean:445`, `IsSU2BiFundamental.lean:317`. All destructure +`obtain ⟨c, rfl, hc⟩`. Four of them supply `hA` through +`Family.sum_star_mul_of_transpose act sum_act_mul act_star` (IsSU2Adjoint:173, +IsSU2BiAdjoint:476, IsSU3Adjoint:207, IsSU3BiAdjoint:920); the other three supply a +hand-proved `sum_star_mul_act`. + +Supporting gauge API, **[S]**: `Family.mem_iSup_span_singleton_iff` — 12 sites across 11 files +including `IsGaugeSector/MassWeight/MassDimEight.lean:114`; `Family.mem_iSup_span_singleton` — +5 sites; `Family.sum_pi_two` — 4 direct sites plus many uses of the per-file `sum_pi_two` +wrappers that delegate to it. + +Neither `Invariants.contractₗ` nor `Family.contractₗ`, nor `actMatₗ`, `inner_actMat`, `actₗ`, +`inner_actₗ` has any consumer outside its own file. + +### 5.2 Import-direction facts (**[S]**, static import-closure computation) + +| file | Physlib closure size | imports SM? | behind `JetAlgebra.SectorEquiv.Basic`? | +| --- | --- | --- | --- | +| `Physlib/Mathematics/LinearCombination.lean` | 1 (Mathlib only) | no | no | +| `Relativity/LorentzGroup/Invariants/Basic.lean` | 61 | no | no | +| `Relativity/LorentzGroup/Invariants/LorentzCovariance.lean` | 62 | no | no | +| `Relativity/LorentzGroup/Invariants/IsLeftRightWeyl.lean` | 67 | no | no | +| `StandardModel/GaugeGroup/Invariants/Basic.lean` | **1 (Mathlib only)** | no | no | +| `StandardModel/GaugeGroup/Invariants/IsSU2BiFundamental.lean` | 100 | yes | **no** | +| `StandardModel/GaugeGroup/Invariants/IsSU3FunAntiFun.lean` | 100 | yes | **no** | +| `StandardModel/Peeling.lean` | 120 | yes | **no** | +| `StandardModel/IsGaugeSector/MassWeight/MassDimEight.lean` | 120 | yes | **no** | + +**[S]** Notably `GaugeGroup/Invariants/Basic.lean` currently imports **no Physlib file at all** +— only `Mathlib.Analysis.InnerProductSpace.PiL2`, +`Mathlib.Analysis.InnerProductSpace.Projection.Basic` and +`Mathlib.LinearAlgebra.Finsupp.LinearCombination`. It is under `StandardModel/` for +organisational reasons, not dependency ones. + +**[S] Good news for validation:** none of the ten consumers is behind the +`StandardModel.JetAlgebra.SectorEquiv.Basic` blocker. That blocker sits under +`AlgebraRealization`/`CovAlgebraRealization`/`JetAlgebra` and is reached only through +`HiggsAlgebraCovRealization.Basic`. So, subject to the 4.34.0 bump itself, every production +consumer of both lifting theorems is reachable for a real build. This contrasts sharply with +the boost-weight task, where every consumer is blocked. + +### 5.3 Recommended home + +The shared theorem has no Lorentz content and no Standard Model content, so neither current +home is right. Two candidates: + +**Option A (recommended): extend `Physlib/Mathematics/LinearCombination.lean`.** +**[S]** That file is already "Finite linear combinations under a linear map", already holds +`Fintype.sum_sum_mul_smul` and `LinearMap.map_sum_smul_of_forall_eq`, and is already imported +by `Relativity/LorentzGroup/Invariants/Basic.lean` — which is, **[S]**, its *only* importer in +the repository. Cost: two new Mathlib imports +(`Mathlib.Analysis.InnerProductSpace.PiL2`, `…Projection.Basic`), both of which its sole +current importer already has, and both of which the gauge file already has. So the +import-graph cost is genuinely zero for existing consumers. Conforms to AGENTS.md's "place +results in the appropriate existing file; do not create new files without good reason". +Requires the file's module docstring to be rewritten (it currently promises exactly two +bookkeeping identities) and a scalar-generality seam (the existing content is at +`[CommSemiring R]`; the new content is at `ℂ`), which means a new `section` with its own +variables. + +**Option B: a new `Physlib/Mathematics/InnerProductSpace/InvariantCoefficient.lean`.** +**[S]** `Physlib/Mathematics/InnerProductSpace/` exists and holds `Adjoint.lean`, `Basic.lean`, +`Calculus.lean`, `Gaussian.lean`, `Submodule.lean`. Cleaner thematically — the theorem *is* an +inner-product-space complement argument — and avoids mixing an analysis import into an +otherwise algebra-only file. Cost: a new file, against AGENTS.md's default. + +**[M] Recommendation: Option A**, on the strength of the zero import cost and the AGENTS.md +default, with Option B as the fallback if the human objects to analysis entering +`LinearCombination.lean`. This is a judgement call and is flagged in §7. + +Import direction either way: `Mathematics/…` ← `Relativity/LorentzGroup/Invariants/Basic.lean` +and `Mathematics/…` ← `StandardModel/GaugeGroup/Invariants/Basic.lean`. **[M]** The general +theorem must not import either; neither currently exports anything the other needs, and +nothing in the proposal creates a Lorentz→SM or SM→Lorentz edge. + +### 5.4 What survives, what disappears, what changes + +**[M]** Disappears (proof bodies only, no public names lost if wrappers are kept): + +- the ~24-line body of `Family.exists_invariant_coeff` (GaugeGroup/Invariants/Basic.lean:146–169); +- the ~30-line body of `Invariants.exists_invariantCoeff` (Invariants/Basic.lean:86–115); +- one of the two `contractₗ` definitions — **[S]** `Invariants.contractₗ` (66–72) and + `Family.contractₗ` (98–104) have *identical* bodies modulo the position of `T`, and neither + has an external consumer, so both can be replaced by one definition in the new home. + +**[M]** Survives unchanged and stays where it is: + +- `Invariants.actMat`, `actMatₗ`, `inner_actMat`, `exists_invariantCoeff_matrix`, + `sum_mul_actMat`, `sum_mul_eq_zero_of_actMat_eq`, `two_zpow_ne_one`, `dagger`, + `toLorentzGroup_dagger`, and all of section C — these are the Lorentz *matrix adapter* and + have real Lorentz content; +- `Family.actₗ`, `Family.inner_actₗ`, `Family.sum_star_mul_of_transpose` — the gauge-side + bridge from the raw-sum hypothesis to the inner-product one; `inner_actₗ` becomes the engine + of the wrapper and `sum_star_mul_of_transpose` keeps its 4 consumers; +- `Family.mem_iSup_span_singleton_iff`, `mem_iSup_span_singleton`, `sum_pi_two` — 21 consumers + between them, no reason to touch. **[M]** `mem_iSup_span_singleton_iff` is arguably also + general mathematics that could move alongside (the Lorentz file inlines the same three + rewrites at Basic.lean:87–90), but it is not part of the lifting theorem and moving it would + touch 11 files. **Recommend leaving it**, and noting the duplication in a comment. + +**[M]** Public callers needing adjustment: **none**, provided both existing theorems are kept +as thin wrappers with unchanged signatures. That is the whole point of the proposed shape. + +### 5.5 The two generic peeling lemmas — relationship only + +The handoff asks me to inspect `exists_mem_add_of_mem_sup` and `exists_smul_add_of_mem_sup` +(GaugeGroup/Invariants/Basic.lean:190–229) only to explain their relationship to lifting and +whether they belong nearby. I have not redesigned anything. + +**[S]** Both take `{G : Type*}` with *no* `[Group G]` — unlike `exists_invariant_coeff` in the +same file. Both are about a stable submodule `S`, the quotient representation `S.mapQ S (φ g)`, +and lifting a quotient classification back. Neither mentions coefficients, inner products, +`ι`, `Fintype` or `ℂ`-specific analysis; **[M]** their only genuine prerequisites are +`[AddCommGroup B] [Module ℂ B]` and Mathlib's `Submodule.mapQ`/`mkQ` API, and the `ℂ` could be +any commutative ring for which `Submodule` quotients exist. + +**[M] Relationship to lifting: orthogonal.** Lifting turns *one family's* invariants into a +finite coefficient problem; peeling turns a *classification already obtained in a quotient* +back into a statement in `B`. In the consumer files they are used in sequence — e.g. **[S]** +`IsSU2BiFundamental.exists_smul_epsilonContraction_of_invariant'` (line 317) calls +`exists_invariant_coeff`, and `IsSU2BiFundamental` section F (line 358) then calls +`exists_smul_add_of_mem_sup` with that theorem applied in `B ⧸ S` — but neither uses the other. + +**[S]** Their real downstream shape is `StandardModel.Peeling.Step` (`Peeling.lean:296–302`), +whose `classify` field is exactly `exists_smul_add_of_mem_sup`'s conclusion minus the +invariance of the remainder: +`∀ S, IsStableUnder σ S → ∀ x ∈ V ⊔ S, (∀ g, σ g x = x) → ∃ c, ∃ y ∈ S, x = c • contraction + y`. +**[S]** `Peeling.lean` is not behind the blocker. + +**[M] Recommendation: do not move them in this change.** They are not part of the shared +lifting theorem, they have a natural downstream home (`Peeling.lean`) that already consumes +them, and moving them is a separate decision with 9 call sites. If the human later wants the +gauge `Invariants/Basic.lean` to be purely about families, section C is the natural thing to +relocate to `Peeling.lean` — but that is a different PR, and this report does not argue for it. + +--- + +## 6. Bounded implementation scope and post-bump experiment plan + +### 6.1 Proposed scope (required work only) + +1. Add `exists_invariantCoeff_of_adjoint_mem` (§3.4) and one `contractₗ` to the chosen home, + with a docstring recording the abstract intertwiner formulation from §3.4 and the + non-uniqueness caveat from §2.6. +2. Re-prove `StandardModel.Family.exists_invariant_coeff` as the §4.2 wrapper; delete its + proof body and `Family.contractₗ`; keep `actₗ`, `inner_actₗ`, `sum_star_mul_of_transpose`. +3. Delete `Lorentz.Invariants.exists_invariantCoeff` and `Invariants.contractₗ` (zero external + consumers) and point `exists_invariantCoeff_matrix` at the shared theorem — **or**, if the + human prefers to keep the name, re-prove it as a one-line wrapper. Either way + `exists_invariantCoeff_matrix`'s signature and conjunct order are unchanged. +4. Fix the two misleading pieces of prose: the gauge file's "which is to say that `A` is + unitary" (lines 84–87) and the Lorentz `inner_actMat` docstring's implicit contrast — see + §2.3. The gauge prose should say "closed under adjoints, with `g⁻¹` supplying the adjoint + of `g` in every gauge case", not "unitary". + +**[M] Estimated diff:** roughly +45 / −60 Lean lines plus docstrings — within the +"easy to check" band of `docs/ReviewGuidelines.md`, and a single coherent concept +("invariants of the span of a finite family lift to invariant coefficients") as AGENTS.md +requires. + +### 6.2 Optional improvements, explicitly out of the required scope + +- Replace the hand-written `h2` step by `LinearMap.eq_adjoint_iff` + + `Module.End.mem_invtSubmodule_adjoint_iff` (§3.3). Proof-internal; no contract change. +- Expose the minimum-norm characterisation of the produced coefficient (§2.6). No consumer. +- Generalise `ℂ` to `RCLike 𝕜`. **Recommended against** (§3.4). +- Relocate `mem_iSup_span_singleton_iff` (§5.4). **Recommended against** in this PR. +- Relocate gauge section C to `Peeling.lean` (§5.5). **Recommended against** in this PR. + +### 6.3 Ordered Lean 4.34.0 probes + +Each probe is a stop/go gate; a failure at P*n* means the remaining probes are not informative. + +| # | probe | pass criterion | stop/go | +| --- | --- | --- | --- | +| **P0** | Build the *destination* file only, with the two new Mathlib imports added and no new content. | Elaborates. | If `Mathlib.Analysis.InnerProductSpace.{PiL2, Projection.Basic}` have moved or been split in 4.34.0, resolve the new module names before anything else. | +| **P1** | State and prove `exists_invariantCoeff_of_adjoint_mem` in the destination, by copying the body of `Invariants.exists_invariantCoeff` verbatim and widening `ι` to `Type*`. | Elaborates with no new hypotheses. | Failure here means a Mathlib API in the orthogonal-projection chain changed; §3.3 lists every dependency with its 4.33.0 line so the diff can be located. | +| **P2** | Restate `Lorentz.Invariants.exists_invariantCoeff`'s *original* contract (verbatim, `ι : Type`) as a wrapper around P1. | Elaborates; `#print axioms` shows only the three standard axioms. | Go. | +| **P3** | Restate `StandardModel.Family.exists_invariant_coeff`'s *original* contract verbatim as the §4.2 wrapper. | Elaborates. | **The known-risky step** (§4.2): if `inner_actₗ`'s `actₗ A g v` does not unify with `WithLp.toLp 2 (A g v.ofLp)`, add `simp only [actₗ, LinearMap.coe_mk, AddHom.coe_mk]`. Neither contract changes either way. | +| **P4** | Empty-index and dependent-family sanity, as *restated applications*: `ι := Fin 0` with any `T`; and `ι := Fin 2` with `T 0 = T 1 ≠ 0`, `G := Unit`, `A _ := id`. | Both elaborate; the dependent one demonstrably does not force `c 0 = c 1`. | Go. Confirms §2.6 in Lean rather than on paper. | +| **P5** | Compile the **original production consumers**, not restatements: `GaugeGroup/Invariants/IsSU2BiFundamental.lean` and `IsSU3FunAntiFun.lean` (hand-proved `hA`), then `IsSU2Adjoint.lean` and `IsSU3BiAdjoint.lean` (`sum_star_mul_of_transpose` route), then `Relativity/LorentzGroup/Invariants/IsLeftRightWeyl.lean` and `LorentzCovariance.lean`. | All six elaborate unchanged. | **This is the acceptance gate.** §5.2 establishes that none of these is behind the blocker, so a failure here is a real regression, not an inherited one. | +| **P6** | `#print axioms` on `exists_invariantCoeff_of_adjoint_mem`, `Family.exists_invariant_coeff`, `Invariants.exists_invariantCoeff_matrix`, `Invariants.exists_isInvariantCoeff_of_mem_span`. | `propext`, `Classical.choice`, `Quot.sound` only — no `sorryAx`, no `Lean.ofReduceBool`. | Go. | +| **P7** *(optional)* | Swap the `h2` step for the Mathlib `invtSubmodule` route (§6.2). | P1–P6 still pass. | Purely optional; abandon on any friction. | + +**[S] Blocker-related validation obligations.** The +`StandardModel.JetAlgebra.SectorEquiv.Basic` failure blocks nothing on this task's critical +path (§5.2). The one thing it does prevent is confirming that the *downstream* gauge-sector +consumers of the classification theorems — e.g. +`CovAlgebraRealization/GaugeHiggsSector/`, which sit behind +`HiggsAlgebraCovRealization.Basic` — still build. Those are consumers of the classification +*results*, not of the lifting theorem, and their contracts are untouched by this proposal; but +that reasoning is **[M]**, not a build, and should be recorded as owed. Do not repair or build +the blocker as part of this work. + +--- + +## 7. Risks, counterevidence and questions for human judgement + +**[M] Risks.** + +1. *The §4.2 defeq* (P3). Low severity, known fix, no contract impact. +2. *Docstring drift.* The gauge file's section-B prose is the argument's exposition; rewriting + "unitary" out of it changes the file's narrative. This is a documentation correction, not a + mathematical one, but AGENTS.md treats module documentation as load-bearing and the human + should read the replacement text. +3. *Deleting `Invariants.exists_invariantCoeff` and the two `contractₗ`.* All three are + `@[expose] public` with docstrings. Grep says zero external consumers, but grep cannot see + consumers in a branch not yet merged. +4. *`Type` → `Type*` on `ι`.* **[M]** Cannot break a `Type 0` instantiation, but it can change + universe-metavariable resolution in an unannotated call. All three Lorentz call sites pass + `T` explicitly, which pins `ι`, so the risk is small. + +**Counterevidence to the whole proposal, stated fairly.** The strongest argument *against* +merging is that the two theorems currently sit in files whose module docstrings tell two +different, self-contained stories — "which vectors does `SL(2,ℂ)` leave alone" and "which +linear combinations of gauge components are invariant" — and each story reads better with its +proof visible. Merging saves ~55 lines of duplicated proof and one duplicated definition, but +costs a hop to a third file for a reader of either. **[M]** I judge the merge worthwhile +because the duplication is *exact* (§3.1 is a line-by-line identity, not an analogy) and +because the gauge file's prose has already drifted into a false claim ("unitary") that a +single shared statement would have prevented. But this is a taste judgement about +navigability, which `docs/ReviewGuidelines.md` explicitly reserves to the reviewer. + +**Questions requiring human judgement.** + +- **Home:** Option A (`Mathematics/LinearCombination.lean`, zero import cost, changes the + file's character) or Option B (new `Mathematics/InnerProductSpace/InvariantCoefficient.lean`, + cleaner theme, a new file)? §5.3. +- **Name:** `exists_invariantCoeff_of_adjoint_mem` is descriptive but long. The two existing + names differ only in casing convention; the shared one has to pick a namespace that is + neither `Lorentz.Invariants` nor `StandardModel.Family`. +- **Deletion:** delete `Lorentz.Invariants.exists_invariantCoeff` (zero consumers) or keep it + as a wrapper? §4.1. +- **Standing preference:** previous sessions recorded a preference that work on a Lean file be + confined to that file, without moving results out. This proposal is inherently a cross-file + move and therefore needs an explicit go-ahead; if that preference still holds, the alternative + is to leave both theorems where they are and only fix the "unitary" prose (§6.1 item 4), + which is a genuinely useful standalone change. + +--- + +## 8. What this report does not establish + +No Lean was elaborated. No build, benchmark, timing, axiom audit or lint run was performed, and +none is reported. Every Lean fragment above is an uncompiled sketch. Mathlib claims are asserted +only for rev `db584cd6` (v4.33.0) as read from `.lake/packages/mathlib`; absence from that +snapshot is not evidence of absence from 4.34.0, and presence in it is not evidence of presence +in 4.34.0. No assumption is made about whether `StandardModel.JetAlgebra.SectorEquiv.Basic` +builds on any other revision. Human review, then the §6.3 probes on 4.34.0, are the acceptance +gate before implementation. diff --git a/AITasks/ToDo/invariant-coefficient-sharing.md b/AITasks/Done/invariant-coefficient-sharing.md similarity index 100% rename from AITasks/ToDo/invariant-coefficient-sharing.md rename to AITasks/Done/invariant-coefficient-sharing.md From d08fd70d24ab9020ded657e1e8767f8f89b22fc2 Mon Sep 17 00:00:00 2001 From: doxtor6 Date: Thu, 17 Sep 2026 08:10:10 -0400 Subject: [PATCH 336/367] refactor: drop trivial index factors from the representation named by a charge tuple MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The internal index of a row is now the product of the nontrivial SU(n) representation indices only: singlets and U(1) positions contribute no factor, and the trivial representation is dropped rather than tensored in. Charges.rep is assembled in two steps, the Kronecker product Charges.suRep over the nontrivial dimensions Charges.dims, then the U(1) twists Charges.twist. The quark row is indexed by Fin 3 × Fin 2 and the lepton row by Fin 2, matching the existing QuarkDoublet and LeptonDoublet; the consistency file checks both index types by rfl and both matrices against QuarkDoublet.jetGaugeMatrix and LeptonDoublet.doubletMatrix without reindexing. Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01V7CBqQ2HL9cLsgfbfuvqNa --- .../MatterField/MatrixRep/Table.lean | 134 ++++++++++++------ .../StandardModel/Model/Consistency.lean | 41 ++++-- 2 files changed, 119 insertions(+), 56 deletions(-) diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Table.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Table.lean index 92fbf1e11..42fc23596 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Table.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Table.lean @@ -118,58 +118,110 @@ abbrev Charges : Factors jets → Type | [f] => f.Charge | f :: g :: gs => f.Charge × Charges (g :: gs) -/-- **The internal index** of a field with the given charges: the product of the - `SU(n)`-representation indices; `U(1)` factors contribute no index. (A definition rather - than an abbreviation, so that instance search on `Idx Γ c` finds the instances below - instead of unfolding into a stuck match on `Γ`.) -/ -def Idx : (Γ : Factors jets) → Charges Γ → Type - | [], _ => Fin 1 - | [.U1 _], _ => Fin 1 - | [.SU (n := n) _], r => Fin (r.dim n) - | .U1 _ :: g :: gs, c => Idx (g :: gs) c.2 - | .SU (n := n) _ :: g :: gs, c => Fin (c.1.dim n) × Idx (g :: gs) c.2 - -/-- The index of a charge tuple is finite. -/ +/-- **The internal index of a list of dimensions**: the product of the `Fin n` over the + list, with `Fin 1` for the empty list and no trailing factor for a one-element list. -/ +def IdxOfDims : List ℕ → Type + | [] => Fin 1 + | [n] => Fin n + | n :: m :: ms => Fin n × IdxOfDims (m :: ms) + +/-- The index of a list of dimensions is finite. -/ @[instance_reducible] -def Idx.fintype : (Γ : Factors jets) → (c : Charges Γ) → Fintype (Idx Γ c) - | [], _ => inferInstanceAs (Fintype (Fin 1)) - | [.U1 _], _ => inferInstanceAs (Fintype (Fin 1)) - | [.SU (n := n) _], r => inferInstanceAs (Fintype (Fin (r.dim n))) - | .U1 _ :: g :: gs, c => Idx.fintype (g :: gs) c.2 - | .SU (n := n) _ :: g :: gs, c => - letI := Idx.fintype (g :: gs) c.2 - inferInstanceAs (Fintype (Fin (c.1.dim n) × Idx (g :: gs) c.2)) - -/-- The index of a charge tuple has decidable equality. -/ +def IdxOfDims.fintype : (ds : List ℕ) → Fintype (IdxOfDims ds) + | [] => inferInstanceAs (Fintype (Fin 1)) + | [n] => inferInstanceAs (Fintype (Fin n)) + | n :: m :: ms => + letI := IdxOfDims.fintype (m :: ms) + inferInstanceAs (Fintype (Fin n × IdxOfDims (m :: ms))) + +/-- The index of a list of dimensions has decidable equality. -/ @[instance_reducible] -def Idx.decidableEq : (Γ : Factors jets) → (c : Charges Γ) → DecidableEq (Idx Γ c) - | [], _ => inferInstanceAs (DecidableEq (Fin 1)) - | [.U1 _], _ => inferInstanceAs (DecidableEq (Fin 1)) - | [.SU (n := n) _], r => inferInstanceAs (DecidableEq (Fin (r.dim n))) - | .U1 _ :: g :: gs, c => Idx.decidableEq (g :: gs) c.2 - | .SU (n := n) _ :: g :: gs, c => - letI := Idx.decidableEq (g :: gs) c.2 - inferInstanceAs (DecidableEq (Fin (c.1.dim n) × Idx (g :: gs) c.2)) - -instance (Γ : Factors jets) (c : Charges Γ) : Fintype (Idx Γ c) := Idx.fintype Γ c +def IdxOfDims.decidableEq : (ds : List ℕ) → DecidableEq (IdxOfDims ds) + | [] => inferInstanceAs (DecidableEq (Fin 1)) + | [n] => inferInstanceAs (DecidableEq (Fin n)) + | n :: m :: ms => + letI := IdxOfDims.decidableEq (m :: ms) + inferInstanceAs (DecidableEq (Fin n × IdxOfDims (m :: ms))) + +instance (ds : List ℕ) : Fintype (IdxOfDims ds) := IdxOfDims.fintype ds + +instance (ds : List ℕ) : DecidableEq (IdxOfDims ds) := IdxOfDims.decidableEq ds + +/-- The dimensions an `SU(n)` label contributes to the internal index: none for the + singlet, `n` for the fundamental and the antifundamental. -/ +def SURep.dims (n : ℕ) : SURep → List ℕ + | .singlet => [] + | .fund => [n] + | .antifund => [n] + +/-- **The dimensions of the internal index** of a charge tuple: the sizes of the + nontrivial `SU(n)` representations it names, in the order of the factors. `U(1)` factors + and singlets contribute nothing, so that a field charged under a single `SU(n)` factor is + indexed by `Fin n` alone. -/ +def Charges.dims : (Γ : Factors jets) → Charges Γ → List ℕ + | [], _ => [] + | [.U1 _], _ => [] + | [.SU (n := n) _], r => SURep.dims n r + | .U1 _ :: g :: gs, c => Charges.dims (g :: gs) c.2 + | .SU (n := n) _ :: g :: gs, c => SURep.dims n c.1 ++ Charges.dims (g :: gs) c.2 -instance (Γ : Factors jets) (c : Charges Γ) : DecidableEq (Idx Γ c) := Idx.decidableEq Γ c +/-- **The internal index** of a field with the given charges: the product of the + nontrivial `SU(n)`-representation indices. -/ +abbrev Idx (Γ : Factors jets) (c : Charges Γ) : Type := IdxOfDims (Charges.dims Γ c) /-! ## C. The representation named by a charge tuple +The representation is assembled in two steps. The `SU(n)` labels give a Kronecker product +of fundamental and antifundamental representations over the nontrivial dimensions, +`Charges.suRep`, in which a singlet contributes no factor and the trivial representation is +dropped rather than tensored in; the `U(1)` charges then twist the result, `Charges.twist`. + -/ -/-- **The matrix representation named by a charge tuple**: the Kronecker product of the - `SU(n)` representations the labels name, twisted by the charge powers of the `U(1)` - jets. -/ -noncomputable def Charges.rep : (Γ : Factors jets) → (c : Charges Γ) → MatrixRep jets (Idx Γ c) +/-- The Kronecker product with the representation on the remaining dimensions, with the + trivial representation dropped when there are none. -/ +noncomputable def MatrixRep.kronDims {n : ℕ} (R₁ : MatrixRep jets (Fin n)) : + (ds : List ℕ) → MatrixRep jets (IdxOfDims ds) → MatrixRep jets (IdxOfDims (n :: ds)) + | [], _ => R₁ + | _ :: _, R₂ => R₁.kron R₂ + +/-- The matrix representation of an `SU(n)` factor named by a label, on the index of the + dimensions the label contributes. -/ +noncomputable def SURep.repDims {n : ℕ} (F : SUFactor jets (Fin n)) : + (r : SURep) → MatrixRep jets (IdxOfDims (r.dims n)) + | .singlet => MatrixRep.trivial + | .fund => F.fund + | .antifund => F.fund.conj + +/-- The `SU(n)` part of the representation named by a charge tuple: the Kronecker product + of the nontrivial representations the labels name. -/ +noncomputable def Charges.suRep : + (Γ : Factors jets) → (c : Charges Γ) → MatrixRep jets (IdxOfDims (Charges.dims Γ c)) | [], _ => MatrixRep.trivial - | [.U1 F], q => F.charge q MatrixRep.trivial - | [.SU F], r => SURep.rep F r - | .U1 F :: g :: gs, c => F.charge c.1 (Charges.rep (g :: gs) c.2) - | .SU F :: g :: gs, c => (SURep.rep F c.1).kron (Charges.rep (g :: gs) c.2) + | [.U1 _], _ => MatrixRep.trivial + | [.SU F], r => SURep.repDims F r + | .U1 _ :: g :: gs, c => Charges.suRep (g :: gs) c.2 + | .SU _ :: g :: gs, (.singlet, c) => Charges.suRep (g :: gs) c + | .SU F :: g :: gs, (.fund, c) => F.fund.kronDims _ (Charges.suRep (g :: gs) c) + | .SU F :: g :: gs, (.antifund, c) => F.fund.conj.kronDims _ (Charges.suRep (g :: gs) c) + +/-- The `U(1)` part of the representation named by a charge tuple: the charge twists of + all the `U(1)` factors, applied to a given representation. -/ +noncomputable def Charges.twist {ι : Type} [Fintype ι] [DecidableEq ι] : + (Γ : Factors jets) → Charges Γ → MatrixRep jets ι → MatrixRep jets ι + | [], _, R => R + | [.U1 F], q, R => F.charge q R + | [.SU _], _, R => R + | .U1 F :: g :: gs, c, R => F.charge c.1 (Charges.twist (g :: gs) c.2 R) + | .SU _ :: g :: gs, c, R => Charges.twist (g :: gs) c.2 R + +/-- **The matrix representation named by a charge tuple**: the Kronecker product of the + nontrivial `SU(n)` representations the labels name, twisted by the charge powers of the + `U(1)` jets. -/ +noncomputable def Charges.rep (Γ : Factors jets) (c : Charges Γ) : MatrixRep jets (Idx Γ c) := + Charges.twist Γ c (Charges.suRep Γ c) /-! diff --git a/Physlib/Particles/StandardModel/Model/Consistency.lean b/Physlib/Particles/StandardModel/Model/Consistency.lean index 8ab1fd2fa..5584f4f0d 100644 --- a/Physlib/Particles/StandardModel/Model/Consistency.lean +++ b/Physlib/Particles/StandardModel/Model/Consistency.lean @@ -8,6 +8,7 @@ module public import Physlib.Particles.StandardModel.Basic public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet.GaugeAlgebraAction +public import Physlib.Particles.StandardModel.Fermions.LeptonDoublet.GaugeAlgebraAction /-! # Consistency of the Standard Model table with the existing formalisation @@ -22,8 +23,9 @@ row acts by the existing colour–weak matrix of the quark doublet. - `StandardModel.Model.localGaugeData_eq` : the gauge data of the table is the existing local gauge data of the Standard Model. -- `StandardModel.Model.quarkDoublet_rep_mat` : the quark row reproduces - `QuarkDoublet.jetGaugeMatrix`. +- `StandardModel.Model.quarkDoublet_rep_mat`, `leptonDoublet_rep_mat` : the quark and lepton + rows reproduce `QuarkDoublet.jetGaugeMatrix` and `LeptonDoublet.doubletMatrix`, on the + same index types. -/ @@ -42,21 +44,30 @@ theorem localGaugeData_eq : StandardModel.localGaugeData = gaugeData := rfl /-- The charges of the quark row. -/ abbrev quarkCharges : Charges factors := (.fund, .fund, 1) +/-- The charges of the lepton row. -/ +abbrev leptonCharges : Charges factors := (.singlet, .fund, -3) + +/-- The quark row is indexed by a colour and a weak index, as the existing quark doublet. -/ +example : Idx factors quarkCharges = (Fin 3 × Fin 2) := rfl + +/-- The lepton row is indexed by a weak index alone, as the existing lepton doublet. -/ +example : Idx factors leptonCharges = Fin 2 := rfl + /-- The quark row acts on its colour–weak index by the existing matrix `u · (U₃ ⊗ U₂)` of - the quark doublet, up to the trivial index of the `U(1)` factor. -/ + the quark doublet. -/ lemma quarkDoublet_rep_mat (U : JetGaugeGroupI) : - Matrix.reindex (Equiv.prodCongr (Equiv.refl (Fin 3)) (Equiv.prodUnique (Fin 2) (Fin 1))) - (Equiv.prodCongr (Equiv.refl (Fin 3)) (Equiv.prodUnique (Fin 2) (Fin 1))) - ((Charges.rep factors quarkCharges).mat U) - = QuarkDoublet.jetGaugeMatrix U := by - show Matrix.reindex (Equiv.prodCongr (Equiv.refl (Fin 3)) (Equiv.prodUnique (Fin 2) (Fin 1))) - (Equiv.prodCongr (Equiv.refl (Fin 3)) (Equiv.prodUnique (Fin 2) (Fin 1))) - (Matrix.kroneckerMap (· * ·) U.1.1 (Matrix.kroneckerMap (· * ·) U.2.1.1 - (MatterField.chargePow 1 U.2.2 • (1 : Matrix (Fin 1) (Fin 1) JetRing)))) - = QuarkDoublet.jetGaugeMatrix U - refine Matrix.ext fun i j => ?_ - simp [Matrix.kroneckerMap_apply, MatterField.chargePow, QuarkDoublet.jetGaugeMatrix] - ring + (Charges.rep factors quarkCharges).mat U = QuarkDoublet.jetGaugeMatrix U := by + show MatterField.chargePow 1 U.2.2 • Matrix.kroneckerMap (· * ·) U.1.1 U.2.1.1 + = QuarkDoublet.jetGaugeMatrix U + simp [MatterField.chargePow, QuarkDoublet.jetGaugeMatrix] + +/-- The lepton row acts on its weak index by the existing matrix `ū³ · U₂` of the lepton + doublet. -/ +lemma leptonDoublet_rep_mat (U : JetGaugeGroupI) : + (Charges.rep factors leptonCharges).mat U = LeptonDoublet.doubletMatrix U := by + show MatterField.chargePow (-3) U.2.2 • U.2.1.1 = LeptonDoublet.doubletMatrix U + rw [LeptonDoublet.doubletMatrix] + congr 1 end Model From 0068baf67b6750f73232ef41be8ef5cb03868f56 Mon Sep 17 00:00:00 2001 From: doxtor6 Date: Thu, 17 Sep 2026 10:35:45 -0400 Subject: [PATCH 337/367] refactor: define the Standard Model local gauge data as the table's gauge data StandardModel.localGaugeData is now Model.gaugeData, the package that LocalGaugeData.ofFactors assembles from the factor list [.SU 3, .SU 2, .U1]. The hand-built structure literal and the hand-written faithfulness proof are kept as comments for reference; every bridging rule of section B still holds by rfl, since each field of the assembled package is definitionally the existing Standard Model construction, and faithfulness is inherited from the generic instance. Verified by rebuilding the Standard Model chain up to and including FieldData and the species files; JetAlgebra/SectorEquiv/Basic.lean fails identically on the unmodified head and is unrelated to this change. Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01V7CBqQ2HL9cLsgfbfuvqNa --- .../GaugeGroup/LocalGaugeData.lean | 25 ++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/Physlib/Particles/StandardModel/GaugeGroup/LocalGaugeData.lean b/Physlib/Particles/StandardModel/GaugeGroup/LocalGaugeData.lean index d70f98a91..bda34df3c 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/LocalGaugeData.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/LocalGaugeData.lean @@ -8,6 +8,7 @@ module public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Truncation public import Physlib.Particles.StandardModel.GaugeGroup.MaurerCartan.Basic +public import Physlib.Particles.StandardModel.Basic /-! # The Standard Model gauge group as local gauge data @@ -68,9 +69,20 @@ is registered globally. /-- The Standard Model gauge group as local gauge data, for the jet gauge group `JetGaugeGroupI` and its Lie algebra `JetGaugeAlgebra` over the global group - `GaugeGroupI` and gauge algebra `GaugeAlgebra`. Nothing is redefined. Every data field - is an existing Standard Model construction and every proof field an existing Standard - Model lemma. -/ + `GaugeGroupI` and gauge algebra `GaugeAlgebra`. It is the gauge data + `StandardModel.Model.gaugeData` that the model table assembles from the factor list + `[.SU 3, .SU 2, .U1]` by `LocalGaugeData.ofFactors`; the carriers of that assembly are + `JetGaugeGroupI` and `JetGaugeAlgebra` on the nose, and each data field is definitionally + the existing Standard Model construction (the rules of section B are all `rfl`). -/ +noncomputable def localGaugeData : + LocalGaugeData GaugeGroupI GaugeAlgebra JetGaugeGroupI JetGaugeAlgebra := + Model.gaugeData + +/- The hand-built package this definition replaces. Every field below is definitionally +equal to the corresponding field of `Model.gaugeData`, which is why the rules of section B +still hold by `rfl`; the literal is kept here for reference until the hand-built gauge +group is retired. + noncomputable def localGaugeData : LocalGaugeData GaugeGroupI GaugeAlgebra JetGaugeGroupI JetGaugeAlgebra where eval := JetGaugeGroupI.eval @@ -97,6 +109,7 @@ noncomputable def localGaugeData : maurerCartan_cocycle := maurerCartanForm_cocycle maurerCartan_structure := maurerCartanForm_structure deriv_adjoint := deriv_adjointMap +-/ /-! @@ -192,10 +205,16 @@ lemma localGaugeData_adjointCoeff_toU1Value (U : JetGaugeGroupI) `JetGaugeAlgebra.ext_of_eval_iteratedDeriv` and `maurerCartanForm_eq_zero_iff_ofConstant`. Unlike the package itself this is a property of it and not a choice, so it is an instance. -/ +instance instFaithfulLocalGaugeData : localGaugeData.Faithful := + inferInstanceAs Model.gaugeData.Faithful + +/- The hand-built proof this instance replaces: + instance instFaithfulLocalGaugeData : localGaugeData.Faithful where ext_of_evalLie_iteratedDeriv h := JetGaugeAlgebra.ext_of_eval_iteratedDeriv h eq_ofConstant_of_maurerCartan_eq_zero h := by obtain ⟨c, hc⟩ := (maurerCartanForm_eq_zero_iff_ofConstant _).mp h rw [hc, localGaugeData_eval, localGaugeData_ofConstant, JetGaugeGroupI.eval_ofConstant] +-/ end StandardModel From 7d7b4b4f7163eba40f62351a6b42008ba1954bf1 Mon Sep 17 00:00:00 2001 From: doxtor6 Date: Thu, 17 Sep 2026 15:53:12 -0400 Subject: [PATCH 338/367] feat: define the Standard Model fields as matter field data, pilot on the lepton doublet MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Regroup the table layer as agreed on Zulip: a field is its Lorentz label and its charge tuple, `MatterFieldData Γ := LorentzLabel × Charges Γ`, so that the lepton doublet reads `(.L, .singlet, .fund, -3)`; `MatterFieldData.toMatterField` compiles it to a `MatterField` (or, through an identification `e` of the target space, `toMatterFieldOn e`); the field data of a model, `FieldData Γ Fields := Fields → ℕ × MatterFieldData Γ`, compiles to a `GaugeFieldData`. The row and table types are replaced by these. The dimension functions become abbreviations so that the index of a datum reduces to its `Fin` product at reducible transparency. The Standard Model card `StandardModel/Basic.lean` now names its six fields as values and its table as the generation counts; the species counts still close by `decide`. The pilot file `Model/LeptonDoublet.lean` holds only theorems about the lepton doublet datum: it is indexed by `Fin 2`, its gauge jets and gauge algebra act by the hand-built `LeptonDoublet.doubletMatrix` and `actionMatrix`, and on the target space `LeptonDoublet` identified with its tensor-product value, the matter field the general theory derives from the datum is `LeptonDoublet.matterField` itself (`leptonDoublet_toMatterFieldOn_eq`). Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01V7CBqQ2HL9cLsgfbfuvqNa --- Physlib.lean | 1 + .../MatterField/MatrixRep/Table.lean | 313 ++++++++++-------- Physlib/Particles/StandardModel/Basic.lean | 90 +++-- .../StandardModel/Model/Consistency.lean | 34 +- .../StandardModel/Model/LeptonDoublet.lean | 182 ++++++++++ 5 files changed, 437 insertions(+), 183 deletions(-) create mode 100644 Physlib/Particles/StandardModel/Model/LeptonDoublet.lean diff --git a/Physlib.lean b/Physlib.lean index 6fadd45bf..4a27b7136 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -442,6 +442,7 @@ public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.MassWeight public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.Prod public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.TransformsIn public import Physlib.Particles.StandardModel.Model.Consistency +public import Physlib.Particles.StandardModel.Model.LeptonDoublet public import Physlib.Particles.StandardModel.Peeling public import Physlib.Particles.StandardModel.Representations public import Physlib.Particles.SuperSymmetry.MSSMNu.AnomalyCancellation.B3 diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Table.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Table.lean index 42fc23596..289b896c3 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Table.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Table.lean @@ -15,36 +15,38 @@ public import Physlib.Relativity.Fermions.Weyl.RightHanded ## i. Overview A gauge-theory model is written down, as in a model-building tool, as a *table*: the gauge -group as a list of factors, and one row per field recording its number of generations, -its Lorentz character and one charge per factor — an integer charge under a `U(1)` factor, -a representation label under an `SU(n)` factor. +group as a list of factors, and for each field its number of generations, its Lorentz +label and one charge per factor — an integer charge under a `U(1)` factor, a +representation label under an `SU(n)` factor. This file defines the tables over any local gauge data and compiles them into the general theory. A gauge group is a list of `Factor`s, each a `U1Factor` or an `SUFactor` of the -local gauge data; the charges of a row form the tuple `Charges Γ` over the list, so that a -row reads `(1, .fund, .fund)`; the charges name a matrix representation `Charges.rep`, -assembled from the factors by the hypercharge twist and the Kronecker product; a row -compiles to a `MatterField` and a table to a `GaugeFieldData`. +local gauge data; the charges of a field form the tuple `Charges Γ` over the list; the +charges name a matrix representation `Charges.rep`, assembled from the factors by the +hypercharge twist and the Kronecker product; a field is its Lorentz label and its charges, +`MatterFieldData Γ`, so that it reads `(.L, .singlet, .fund, -3)`, and compiles to a +`MatterField`; the field data of a model, `FieldData Γ Fields`, assigns each field its +number of generations and its data, and compiles to a `GaugeFieldData`. ## ii. Key results - `LocalGaugeData.Factor`, `Factors` : a gauge group presented as a list of factors. - `SURep`, `Charges` : the charge labels of a row and the charge tuple. - `Charges.rep` : the matrix representation named by a charge tuple. -- `FermionRow`, `ScalarRow`, `Table` : the rows and the table. -- `FermionRow.matterField`, `ScalarRow.matterField`, `Table.fieldData` : the compilation. -- `Table.fieldData_gaugeLorentzCompatible` : the field content of a table satisfies - `GaugeFieldData.GaugeLorentzCompatible`, species by species through - `Table.fieldData_fermion_gaugeLorentzCompatible` and - `Table.fieldData_boson_gaugeLorentzCompatible`. +- `LorentzLabel`, `MatterFieldData` : the Lorentz label and the data of a field. +- `MatterFieldData.toMatterField`, `toMatterFieldOn` : the matter field of a datum, on the + tensor-product target space or on any target space presented as one. +- `FieldData`, `FieldData.toGaugeFieldData` : the field data of a model and its compilation. +- `FieldData.toGaugeFieldData_gaugeLorentzCompatible` : the field content of a model + satisfies `GaugeFieldData.GaugeLorentzCompatible`. ## iii. Table of contents - A. Factors and charge labels - B. Charge tuples and their internal index - C. The representation named by a charge tuple -- D. The rows and their matter fields -- E. The table and its field content +- D. Matter field data and its matter field +- E. The field data of a model and its field content -/ @@ -120,7 +122,7 @@ abbrev Charges : Factors jets → Type /-- **The internal index of a list of dimensions**: the product of the `Fin n` over the list, with `Fin 1` for the empty list and no trailing factor for a one-element list. -/ -def IdxOfDims : List ℕ → Type +abbrev IdxOfDims : List ℕ → Type | [] => Fin 1 | [n] => Fin n | n :: m :: ms => Fin n × IdxOfDims (m :: ms) @@ -149,7 +151,7 @@ instance (ds : List ℕ) : DecidableEq (IdxOfDims ds) := IdxOfDims.decidableEq d /-- The dimensions an `SU(n)` label contributes to the internal index: none for the singlet, `n` for the fundamental and the antifundamental. -/ -def SURep.dims (n : ℕ) : SURep → List ℕ +abbrev SURep.dims (n : ℕ) : SURep → List ℕ | .singlet => [] | .fund => [n] | .antifund => [n] @@ -158,7 +160,7 @@ def SURep.dims (n : ℕ) : SURep → List ℕ nontrivial `SU(n)` representations it names, in the order of the factors. `U(1)` factors and singlets contribute nothing, so that a field charged under a single `SU(n)` factor is indexed by `Fin n` alone. -/ -def Charges.dims : (Γ : Factors jets) → Charges Γ → List ℕ +abbrev Charges.dims : (Γ : Factors jets) → Charges Γ → List ℕ | [], _ => [] | [.U1 _], _ => [] | [.SU (n := n) _], r => SURep.dims n r @@ -225,39 +227,39 @@ noncomputable def Charges.rep (Γ : Factors jets) (c : Charges Γ) : MatrixRep j /-! -## D. The rows and their matter fields +## D. Matter field data and its matter field + +A field of a model is written down as its Lorentz label and its charge tuple, so that +`(.L, .singlet, .fund, -3)` is a left-handed doublet of hypercharge `-3`. The datum +compiles to a `MatterField` on the target space `S ⊗ (Idx → ℂ)` of the label's Lorentz +factor and the internal index of the charges, or, through an identification `e`, on any +target space presented as such a tensor product. -/ -/-- The chirality of a fermion row: a left- or right-handed Weyl spinor. -/ -inductive Chirality +/-- **The Lorentz label of a field**: a left- or right-handed Weyl spinor or a scalar. -/ +inductive LorentzLabel /-- A left-handed Weyl spinor. -/ | L /-- A right-handed Weyl spinor. -/ | R + /-- A Lorentz scalar. -/ + | scalar deriving DecidableEq, Repr -/-- **A fermion row** of a table: the name of the field, its number of generations, its - chirality and its charges. -/ -structure FermionRow (Γ : Factors jets) where - /-- The name of the field. -/ - name : String - /-- The number of generations. -/ - generations : ℕ - /-- The chirality. -/ - chirality : Chirality - /-- The charges, one per factor. -/ - charges : Charges Γ - -/-- **A scalar row** of a table: the name of the field, its number of generations and its - charges. -/ -structure ScalarRow (Γ : Factors jets) where - /-- The name of the field. -/ - name : String - /-- The number of generations. -/ - generations : ℕ - /-- The charges, one per factor. -/ - charges : Charges Γ +namespace LorentzLabel + +/-- Whether the label is fermionic. -/ +def isFermion : LorentzLabel → Bool + | .L => true + | .R => true + | .scalar => false + +/-- The Lorentz factor of the target space of a field with the given label. -/ +abbrev Space : LorentzLabel → Type + | .L => Fermion.LeftHandedWeyl + | .R => Fermion.RightHandedWeyl + | .scalar => ℂ instance : Module.Finite ℂ Fermion.LeftHandedWeyl := Module.Finite.of_basis Fermion.LeftHandedWeyl.basis @@ -265,123 +267,174 @@ instance : Module.Finite ℂ Fermion.LeftHandedWeyl := instance : Module.Finite ℂ Fermion.RightHandedWeyl := Module.Finite.of_basis Fermion.RightHandedWeyl.basis -/-- The mass weight of a fermion, in the units in which a derivative has weight `2`. -/ -def fermionMassWeight : ℕ := 3 +instance instAddCommGroupSpace : (l : LorentzLabel) → AddCommGroup l.Space + | .L => inferInstanceAs (AddCommGroup Fermion.LeftHandedWeyl) + | .R => inferInstanceAs (AddCommGroup Fermion.RightHandedWeyl) + | .scalar => inferInstanceAs (AddCommGroup ℂ) + +instance instModuleSpace : (l : LorentzLabel) → Module ℂ l.Space + | .L => inferInstanceAs (Module ℂ Fermion.LeftHandedWeyl) + | .R => inferInstanceAs (Module ℂ Fermion.RightHandedWeyl) + | .scalar => inferInstanceAs (Module ℂ ℂ) + +instance instFreeSpace : (l : LorentzLabel) → Module.Free ℂ l.Space + | .L => inferInstanceAs (Module.Free ℂ Fermion.LeftHandedWeyl) + | .R => inferInstanceAs (Module.Free ℂ Fermion.RightHandedWeyl) + | .scalar => inferInstanceAs (Module.Free ℂ ℂ) + +instance instFiniteSpace : (l : LorentzLabel) → Module.Finite ℂ l.Space + | .L => inferInstanceAs (Module.Finite ℂ Fermion.LeftHandedWeyl) + | .R => inferInstanceAs (Module.Finite ℂ Fermion.RightHandedWeyl) + | .scalar => inferInstanceAs (Module.Finite ℂ ℂ) + +/-- The representation of the Lorentz group on the Lorentz factor of a label. -/ +noncomputable def rep : (l : LorentzLabel) → Representation ℂ SL(2,ℂ) l.Space + | .L => Fermion.LeftHandedWeyl.rep + | .R => Fermion.RightHandedWeyl.rep + | .scalar => Representation.trivial ℂ SL(2,ℂ) ℂ + +/-- The mass weight of a field with the given label, in the units in which a derivative + has weight `2`: `3` for a Weyl spinor, `2` for a scalar. -/ +def massWeight : LorentzLabel → ℕ + | .L => 3 + | .R => 3 + | .scalar => 2 + +end LorentzLabel -/-- The mass weight of a scalar, in the units in which a derivative has weight `2`. -/ -def scalarMassWeight : ℕ := 2 +/-- **The data of a matter field**: its Lorentz label and its charge tuple, so that a + field reads `(.L, .singlet, .fund, -3)`. -/ +abbrev MatterFieldData (Γ : Factors jets) : Type := LorentzLabel × Charges Γ -variable {Γ : Factors jets} +namespace MatterFieldData -/-- **The matter field of a fermion row**: a Weyl spinor of the row's chirality tensored - with the internal index of its charges, transforming in the representation the charges - name, of mass weight `3`. -/ -noncomputable def FermionRow.matterField (r : FermionRow Γ) : MatterField jets := - match r.chirality with - | .L => (Charges.rep Γ r.charges).matterField (LinearEquiv.refl ℂ _) - Fermion.LeftHandedWeyl.rep fermionMassWeight - | .R => (Charges.rep Γ r.charges).matterField (LinearEquiv.refl ℂ _) - Fermion.RightHandedWeyl.rep fermionMassWeight +variable {Γ : Factors jets} (M : MatterFieldData Γ) -/-- **The matter field of a scalar row**: a Lorentz scalar with the internal index of its - charges, transforming in the representation the charges name, of mass weight `2`. -/ -noncomputable def ScalarRow.matterField (r : ScalarRow Γ) : MatterField jets := - (Charges.rep Γ r.charges).matterField (LinearEquiv.refl ℂ _) - (Representation.trivial ℂ SL(2,ℂ) ℂ) scalarMassWeight +/-- The Lorentz label of the field. -/ +abbrev lorentz : LorentzLabel := M.1 + +/-- The charges of the field. -/ +abbrev charges : Charges Γ := M.2 + +/-- The internal index of the field. -/ +abbrev Idx : Type := LocalGaugeData.Idx Γ M.charges + +/-- The matrix representation named by the charges of the field. -/ +noncomputable abbrev rep : MatrixRep jets M.Idx := Charges.rep Γ M.charges + +/-- The mass weight of the field. -/ +abbrev massWeight : ℕ := M.lorentz.massWeight + +/-- **The matter field of a datum on a presented target space**: a target space `V` + identified with the Lorentz factor of the label tensored with the internal index of the + charges, transforming in the representation the charges name. -/ +noncomputable def toMatterFieldOn {V : Type} [AddCommGroup V] [Module ℂ V] + [Module.Free ℂ V] [Module.Finite ℂ V] + (e : V ≃ₗ[ℂ] M.lorentz.Space ⊗[ℂ] (M.Idx → ℂ)) : MatterField jets := + M.rep.matterField e M.lorentz.rep M.massWeight + +/-- **The matter field of a datum**: the target space is the Lorentz factor of the label + tensored with the internal index of the charges. -/ +noncomputable def toMatterField : MatterField jets := + M.toMatterFieldOn (LinearEquiv.refl ℂ _) + +variable {V : Type} [AddCommGroup V] [Module ℂ V] [Module.Free ℂ V] [Module.Finite ℂ V] + (e : V ≃ₗ[ℂ] M.lorentz.Space ⊗[ℂ] (M.Idx → ℂ)) + +@[simp] +lemma toMatterFieldOn_V : (M.toMatterFieldOn e).V = V := rfl @[simp] -lemma FermionRow.matterField_massWeight (r : FermionRow Γ) : - r.matterField.massWeight = fermionMassWeight := by - cases h : r.chirality <;> simp [FermionRow.matterField, h] +lemma toMatterFieldOn_repJet : (M.toMatterFieldOn e).repJet = M.rep.repJet e := rfl @[simp] -lemma ScalarRow.matterField_massWeight (r : ScalarRow Γ) : - r.matterField.massWeight = scalarMassWeight := rfl - -/-- The gauge and Lorentz actions of a fermion row commute: the row is a matrix - representation on the internal index tensored with a Weyl spinor. -/ -lemma FermionRow.matterField_gaugeLorentzCompatible (r : FermionRow Γ) : - r.matterField.GaugeLorentzCompatible := by - cases h : r.chirality <;> simp only [FermionRow.matterField, h] <;> - exact MatrixRep.matterField_gaugeLorentzCompatible _ _ _ _ - -/-- The gauge and Lorentz actions of a scalar row commute. -/ -lemma ScalarRow.matterField_gaugeLorentzCompatible (r : ScalarRow Γ) : - r.matterField.GaugeLorentzCompatible := +lemma toMatterFieldOn_repAlgebra : (M.toMatterFieldOn e).repAlgebra = M.rep.repAlgebra e := + rfl + +@[simp] +lemma toMatterFieldOn_repLorentz : + (M.toMatterFieldOn e).repLorentz = MatrixRep.repLorentz e M.lorentz.rep := rfl + +@[simp] +lemma toMatterFieldOn_massWeight : (M.toMatterFieldOn e).massWeight = M.massWeight := rfl + +@[simp] +lemma toMatterField_massWeight : M.toMatterField.massWeight = M.massWeight := rfl + +/-- The gauge and Lorentz actions of the matter field of a datum commute. -/ +lemma toMatterFieldOn_gaugeLorentzCompatible : + (M.toMatterFieldOn e).GaugeLorentzCompatible := MatrixRep.matterField_gaugeLorentzCompatible _ _ _ _ +/-- The gauge and Lorentz actions of the matter field of a datum commute. -/ +lemma toMatterField_gaugeLorentzCompatible : M.toMatterField.GaugeLorentzCompatible := + M.toMatterFieldOn_gaugeLorentzCompatible _ + +end MatterFieldData + /-! -## E. The table and its field content +## E. The field data of a model and its field content -/ -/-- **A model table**: the gauge group as a list of factors, the fermion rows and the - scalar rows. -/ -structure Table (jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J) where - /-- The gauge group. -/ - gauge : Factors jets - /-- The fermion rows. -/ - fermions : List (FermionRow gauge) - /-- The scalar rows. -/ - scalars : List (ScalarRow gauge) +/-- **The field data of a model**: for each field of the model, its number of generations + and its matter field data. -/ +abbrev FieldData (Γ : Factors jets) (Fields : Type) : Type := Fields → ℕ × MatterFieldData Γ -namespace Table +namespace FieldData -variable [Module.Finite ℝ 𝔤] (T : Table jets) +variable [Module.Finite ℝ 𝔤] {Γ : Factors jets} {Fields : Type} [Fintype Fields] + [DecidableEq Fields] (D : FieldData Γ Fields) -/-- The fermionic species of a table: a fermion row together with a generation. -/ -abbrev FermionSpecies : Type := - Σ i : Fin T.fermions.length, Fin (T.fermions.get i).generations +/-- The number of generations of a field. -/ +abbrev generations (f : Fields) : ℕ := (D f).1 -/-- The bosonic species of a table: a scalar row together with a generation. -/ -abbrev BosonSpecies : Type := - Σ i : Fin T.scalars.length, Fin (T.scalars.get i).generations +/-- The matter field data of a field. -/ +abbrev data (f : Fields) : MatterFieldData Γ := (D f).2 -/-- **The field content of a table**: one matter field per species. -/ -noncomputable def fieldData : GaugeFieldData jets where - FermionSpecies := T.FermionSpecies - fermion s := (T.fermions.get s.1).matterField - BosonSpecies := T.BosonSpecies - boson s := (T.scalars.get s.1).matterField +/-- The fermionic fields of the model. -/ +abbrev Fermions : Type := {f : Fields // (D.data f).lorentz.isFermion = true} -@[simp] -lemma fieldData_FermionSpecies : T.fieldData.FermionSpecies = T.FermionSpecies := rfl +/-- The bosonic fields of the model. -/ +abbrev Bosons : Type := {f : Fields // (D.data f).lorentz.isFermion = false} -@[simp] -lemma fieldData_fermion (s : T.FermionSpecies) : - T.fieldData.fermion s = (T.fermions.get s.1).matterField := rfl +/-- The fermionic species of the model: a fermionic field together with a generation. -/ +abbrev FermionSpecies : Type := Σ f : D.Fermions, Fin (D.generations f.1) -@[simp] -lemma fieldData_BosonSpecies : T.fieldData.BosonSpecies = T.BosonSpecies := rfl +/-- The bosonic species of the model: a bosonic field together with a generation. -/ +abbrev BosonSpecies : Type := Σ f : D.Bosons, Fin (D.generations f.1) -@[simp] -lemma fieldData_boson (s : T.BosonSpecies) : - T.fieldData.boson s = (T.scalars.get s.1).matterField := rfl +/-- **The field content of a model**: one matter field per species, the matter field of the + species' data. -/ +noncomputable def toGaugeFieldData : GaugeFieldData jets where + FermionSpecies := D.FermionSpecies + fermion s := (D.data s.1.1).toMatterField + BosonSpecies := D.BosonSpecies + boson s := (D.data s.1.1).toMatterField -/-- Every fermionic species of a table has mass weight `3`. -/ -lemma fieldData_fermion_massWeight (s : T.FermionSpecies) : - (T.fieldData.fermion s).massWeight = fermionMassWeight := by simp +@[simp] +lemma toGaugeFieldData_FermionSpecies : + D.toGaugeFieldData.FermionSpecies = D.FermionSpecies := rfl -/-- Every bosonic species of a table has mass weight `2`. -/ -lemma fieldData_boson_massWeight (s : T.BosonSpecies) : - (T.fieldData.boson s).massWeight = scalarMassWeight := by simp +@[simp] +lemma toGaugeFieldData_fermion (s : D.FermionSpecies) : + D.toGaugeFieldData.fermion s = (D.data s.1.1).toMatterField := rfl -/-- Every fermionic species of a table satisfies `MatterField.GaugeLorentzCompatible`. -/ -lemma fieldData_fermion_gaugeLorentzCompatible (s : T.FermionSpecies) : - (T.fieldData.fermion s).GaugeLorentzCompatible := - FermionRow.matterField_gaugeLorentzCompatible _ +@[simp] +lemma toGaugeFieldData_BosonSpecies : D.toGaugeFieldData.BosonSpecies = D.BosonSpecies := rfl -/-- Every bosonic species of a table satisfies `MatterField.GaugeLorentzCompatible`. -/ -lemma fieldData_boson_gaugeLorentzCompatible (s : T.BosonSpecies) : - (T.fieldData.boson s).GaugeLorentzCompatible := - ScalarRow.matterField_gaugeLorentzCompatible _ +@[simp] +lemma toGaugeFieldData_boson (s : D.BosonSpecies) : + D.toGaugeFieldData.boson s = (D.data s.1.1).toMatterField := rfl -/-- The field content of a table satisfies `GaugeFieldData.GaugeLorentzCompatible`: every - row is a matrix representation on the internal index tensored with a Lorentz factor. -/ -lemma fieldData_gaugeLorentzCompatible : T.fieldData.GaugeLorentzCompatible := - ⟨T.fieldData_fermion_gaugeLorentzCompatible, T.fieldData_boson_gaugeLorentzCompatible⟩ +/-- The field content of a model satisfies `GaugeFieldData.GaugeLorentzCompatible`: every + species is a matrix representation on the internal index tensored with a Lorentz + factor. -/ +lemma toGaugeFieldData_gaugeLorentzCompatible : D.toGaugeFieldData.GaugeLorentzCompatible := + ⟨fun _ => MatterFieldData.toMatterField_gaugeLorentzCompatible _, + fun _ => MatterFieldData.toMatterField_gaugeLorentzCompatible _⟩ -end Table +end FieldData end LocalGaugeData diff --git a/Physlib/Particles/StandardModel/Basic.lean b/Physlib/Particles/StandardModel/Basic.lean index 42e2d83d6..10b42c9c9 100644 --- a/Physlib/Particles/StandardModel/Basic.lean +++ b/Physlib/Particles/StandardModel/Basic.lean @@ -12,17 +12,17 @@ public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.OfFactors ## i. Overview The Standard Model as a model table: the gauge group `SU(3) × SU(2) × U(1)` named by its -factors, one row per fermion field and one row per scalar field. Everything else is -derived: the local gauge data of the gauge group is assembled from the factors by -`LocalGaugeData.ofFactors`, and the table compiles, through -`Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.MatrixRep.Table`, to the field -content `StandardModel.Model.fieldData : GaugeFieldData gaugeData`, from which the general -theory derives the algebra of field operators and the gauge and Lorentz actions. - -Each row lists the name of the field, its number of generations, its chirality, and its -charges in the order of the factors: the `SU(3)` label, the `SU(2)` label and the -hypercharge. Hypercharges are integers, six times the conventional `Y`, so that the gauge -group acting is the honest `U(1)` of unitary jets. The right-handed singlets are +factors, each field as its Lorentz label and its charges, and the table assigning each +field its number of generations. Everything else is derived: the local gauge data of the +gauge group is assembled from the factors by `LocalGaugeData.ofFactors`, and the table +compiles, through `Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.MatrixRep.Table`, +to the field content `StandardModel.Model.fieldData : GaugeFieldData gaugeData`, from +which the general theory derives the algebra of field operators and the gauge and Lorentz +actions. + +The charges are listed in the order of the factors: the `SU(3)` label, the `SU(2)` label +and the hypercharge. Hypercharges are integers, six times the conventional `Y`, so that +the gauge group acting is the honest `U(1)` of unitary jets. The right-handed singlets are right-handed Weyl spinors in the fundamental of colour rather than conjugate left-handed fields. @@ -30,7 +30,9 @@ fields. - `StandardModel.Model.gauge` : the gauge group, as a list of factors. - `StandardModel.Model.gaugeData` : its local gauge data. -- `StandardModel.Model.fermions`, `scalars` : the field tables. +- `StandardModel.Model.quarkDoublet`, `leptonDoublet`, `upSinglet`, `downSinglet`, + `leptonSinglet`, `higgs` : the fields, as their Lorentz label and charges. +- `StandardModel.Model.table` : the table, each field with its number of generations. - `StandardModel.Model.fieldData` : the field content of the Standard Model. ## iii. Table of contents @@ -69,19 +71,46 @@ noncomputable abbrev factors : Factors gaugeData := Factors.factors gauge ## B. The fields +Each field is its Lorentz label and its charges in the order of the factors: the `SU(3)` +label, the `SU(2)` label and the hypercharge. + -/ -/-- The fermion fields: `q ∼ (3, 2)_{1}`, `l ∼ (1, 2)_{-3}`, `u ∼ (3, 1)_{4}`, - `d ∼ (3, 1)_{-2}`, `e ∼ (1, 1)_{-6}`, three generations each. -/ -def fermions : List (FermionRow factors) := - [ ⟨"q", 3, .L, (.fund, .fund, 1)⟩, - ⟨"l", 3, .L, (.singlet, .fund, -3)⟩, - ⟨"u", 3, .R, (.fund, .singlet, 4)⟩, - ⟨"d", 3, .R, (.fund, .singlet, -2)⟩, - ⟨"e", 3, .R, (.singlet, .singlet, -6)⟩ ] +/-- The quark doublet `q ∼ (3, 2)_{1}`. -/ +abbrev quarkDoublet : MatterFieldData factors := (.L, .fund, .fund, 1) + +/-- The lepton doublet `l ∼ (1, 2)_{-3}`. -/ +abbrev leptonDoublet : MatterFieldData factors := (.L, .singlet, .fund, -3) + +/-- The up-type quark singlet `u ∼ (3, 1)_{4}`. -/ +abbrev upSinglet : MatterFieldData factors := (.R, .fund, .singlet, 4) + +/-- The down-type quark singlet `d ∼ (3, 1)_{-2}`. -/ +abbrev downSinglet : MatterFieldData factors := (.R, .fund, .singlet, -2) -/-- The scalar fields: the Higgs `H ∼ (1, 2)_{3}`. -/ -def scalars : List (ScalarRow factors) := [⟨"H", 1, (.singlet, .fund, 3)⟩] +/-- The charged-lepton singlet `e ∼ (1, 1)_{-6}`. -/ +abbrev leptonSinglet : MatterFieldData factors := (.R, .singlet, .singlet, -6) + +/-- The Higgs `H ∼ (1, 2)_{3}`. -/ +abbrev higgs : MatterFieldData factors := (.scalar, .singlet, .fund, 3) + +/-- The fields of the Standard Model. -/ +inductive Fields + /-- The quark doublet. -/ + | q + /-- The lepton doublet. -/ + | l + /-- The up-type quark singlet. -/ + | u + /-- The down-type quark singlet. -/ + | d + /-- The charged-lepton singlet. -/ + | e + /-- The Higgs. -/ + | H + deriving DecidableEq, Repr + +instance : Fintype Fields := ⟨{.q, .l, .u, .d, .e, .H}, fun x => by cases x <;> decide⟩ /-! @@ -89,12 +118,19 @@ def scalars : List (ScalarRow factors) := [⟨"H", 1, (.singlet, .fund, 3)⟩] -/ -/-- **The Standard Model table.** -/ -noncomputable def table : Table gaugeData := ⟨factors, fermions, scalars⟩ - -/-- **The field content of the Standard Model**: the fifteen fermionic species (five rows +/-- **The Standard Model table**: each field with its number of generations, three for the + fermions and one for the Higgs. -/ +def table : FieldData factors Fields + | .q => (3, quarkDoublet) + | .l => (3, leptonDoublet) + | .u => (3, upSinglet) + | .d => (3, downSinglet) + | .e => (3, leptonSinglet) + | .H => (1, higgs) + +/-- **The field content of the Standard Model**: the fifteen fermionic species (five fields in three generations) and the Higgs, as matter fields of `gaugeData`. -/ -noncomputable def fieldData : GaugeFieldData gaugeData := table.fieldData +noncomputable def fieldData : GaugeFieldData gaugeData := table.toGaugeFieldData /-- The Standard Model has fifteen fermionic species. -/ lemma card_fermionSpecies : Fintype.card fieldData.FermionSpecies = 15 := by decide diff --git a/Physlib/Particles/StandardModel/Model/Consistency.lean b/Physlib/Particles/StandardModel/Model/Consistency.lean index 5584f4f0d..06c65f4be 100644 --- a/Physlib/Particles/StandardModel/Model/Consistency.lean +++ b/Physlib/Particles/StandardModel/Model/Consistency.lean @@ -8,7 +8,6 @@ module public import Physlib.Particles.StandardModel.Basic public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet.GaugeAlgebraAction -public import Physlib.Particles.StandardModel.Fermions.LeptonDoublet.GaugeAlgebraAction /-! # Consistency of the Standard Model table with the existing formalisation @@ -23,9 +22,8 @@ row acts by the existing colour–weak matrix of the quark doublet. - `StandardModel.Model.localGaugeData_eq` : the gauge data of the table is the existing local gauge data of the Standard Model. -- `StandardModel.Model.quarkDoublet_rep_mat`, `leptonDoublet_rep_mat` : the quark and lepton - rows reproduce `QuarkDoublet.jetGaugeMatrix` and `LeptonDoublet.doubletMatrix`, on the - same index types. +- `StandardModel.Model.quarkDoublet_rep_mat` : the quark doublet reproduces + `QuarkDoublet.jetGaugeMatrix`, on the same index type. -/ @@ -41,34 +39,18 @@ namespace Model gauge data of the Standard Model. -/ theorem localGaugeData_eq : StandardModel.localGaugeData = gaugeData := rfl -/-- The charges of the quark row. -/ -abbrev quarkCharges : Charges factors := (.fund, .fund, 1) - -/-- The charges of the lepton row. -/ -abbrev leptonCharges : Charges factors := (.singlet, .fund, -3) - -/-- The quark row is indexed by a colour and a weak index, as the existing quark doublet. -/ -example : Idx factors quarkCharges = (Fin 3 × Fin 2) := rfl - -/-- The lepton row is indexed by a weak index alone, as the existing lepton doublet. -/ -example : Idx factors leptonCharges = Fin 2 := rfl +/-- The quark doublet is indexed by a colour and a weak index, as the existing quark + doublet. -/ +example : quarkDoublet.Idx = (Fin 3 × Fin 2) := rfl -/-- The quark row acts on its colour–weak index by the existing matrix `u · (U₃ ⊗ U₂)` of - the quark doublet. -/ +/-- The quark doublet acts on its colour–weak index by the existing matrix `u · (U₃ ⊗ U₂)` + of the quark doublet. -/ lemma quarkDoublet_rep_mat (U : JetGaugeGroupI) : - (Charges.rep factors quarkCharges).mat U = QuarkDoublet.jetGaugeMatrix U := by + quarkDoublet.rep.mat U = QuarkDoublet.jetGaugeMatrix U := by show MatterField.chargePow 1 U.2.2 • Matrix.kroneckerMap (· * ·) U.1.1 U.2.1.1 = QuarkDoublet.jetGaugeMatrix U simp [MatterField.chargePow, QuarkDoublet.jetGaugeMatrix] -/-- The lepton row acts on its weak index by the existing matrix `ū³ · U₂` of the lepton - doublet. -/ -lemma leptonDoublet_rep_mat (U : JetGaugeGroupI) : - (Charges.rep factors leptonCharges).mat U = LeptonDoublet.doubletMatrix U := by - show MatterField.chargePow (-3) U.2.2 • U.2.1.1 = LeptonDoublet.doubletMatrix U - rw [LeptonDoublet.doubletMatrix] - congr 1 - end Model end StandardModel diff --git a/Physlib/Particles/StandardModel/Model/LeptonDoublet.lean b/Physlib/Particles/StandardModel/Model/LeptonDoublet.lean new file mode 100644 index 000000000..043468c91 --- /dev/null +++ b/Physlib/Particles/StandardModel/Model/LeptonDoublet.lean @@ -0,0 +1,182 @@ +/- +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.StandardModel.Basic +public import Physlib.Particles.StandardModel.Model.Consistency +public import Physlib.Particles.StandardModel.Fermions.MatterField +/-! + +# The lepton doublet of the Standard Model table + +## i. Overview + +The lepton doublet of the Standard Model is the datum `StandardModel.Model.leptonDoublet`, +`(.L, .singlet, .fund, -3)`, of `Physlib.Particles.StandardModel.Basic`. This file records +what the general theory derives from it and checks it against the hand-built +`StandardModel.LeptonDoublet`: the datum is indexed by the weak index alone, its gauge jets +act by the matrix `ū³ · U₂` of the hand-built doublet and its gauge algebra by the +hand-built action matrix, and, on the target space `LeptonDoublet` identified with its +tensor-product value, the matter field the general theory derives from the datum is the +hand-built matter field itself. + +## ii. Key results + +- `StandardModel.Model.leptonDoublet_rep_mat`, `leptonDoublet_rep_act` : the datum acts by + `LeptonDoublet.doubletMatrix` and `LeptonDoublet.actionMatrix`. +- `StandardModel.Model.leptonDoublet_toMatterFieldOn_eq` : on the target space + `LeptonDoublet`, the matter field of the datum is `LeptonDoublet.matterField`. + +## iii. Table of contents + +- A. The index and the matrices +- B. The matter field on the hand-built target space + +-/ + +@[expose] public section + +open LocalGaugeData Matrix TensorProduct + +namespace StandardModel + +namespace Model + +/-! + +## A. The index and the matrices + +-/ + +/-- The lepton doublet is indexed by a weak index alone, as the hand-built lepton doublet. -/ +example : leptonDoublet.Idx = Fin 2 := rfl + +/-- The lepton doublet has mass weight `3`. -/ +example : leptonDoublet.massWeight = 3 := rfl + +/-- The lepton doublet acts on its weak index by the matrix `ū³ · U₂` of the hand-built + lepton doublet. -/ +lemma leptonDoublet_rep_mat (U : JetGaugeGroupI) : + leptonDoublet.rep.mat U = LeptonDoublet.doubletMatrix U := by + show MatterField.chargePow (-3) U.2.2 • U.2.1.1 = LeptonDoublet.doubletMatrix U + rw [LeptonDoublet.doubletMatrix] + congr 1 + +/-- The gauge algebra acts on the weak index of the lepton doublet by the action matrix of + the hand-built lepton doublet. -/ +lemma leptonDoublet_rep_act (c : GaugeAlgebra) : + leptonDoublet.rep.act c = LeptonDoublet.actionMatrix c := by + show Complex.I • (c.2.1 : Matrix (Fin 2) (Fin 2) ℂ) + + (Complex.I * ((-3 : ℤ) : ℂ) * (c.2.2 : ℂ)) • (1 : Matrix (Fin 2) (Fin 2) ℂ) + = LeptonDoublet.actionMatrix c + rw [LeptonDoublet.actionMatrix, GaugeAlgebra.toSU2Matrix, GaugeAlgebra.toU1Value] + ext i j + simp only [Matrix.add_apply, Matrix.smul_apply, Matrix.sub_apply, smul_eq_mul] + ring + +/-! + +## B. The matter field on the hand-built target space + +The hand-built target space `LeptonDoublet` is a Weyl spinor tensored with a Euclidean +weak index; forgetting the Euclidean structure identifies it with the tensor-product target +space of the datum. + +-/ + +/-- The identification of the hand-built target space with the target space of the datum. -/ +local notation "valIdx" => + LeptonDoublet.valLinEquiv.trans + (TensorProduct.congr (LinearEquiv.refl ℂ Fermion.LeftHandedWeyl) + (WithLp.linearEquiv 2 ℂ (Fin 2 → ℂ))) + +/-- The identification sends a pure tensor to the pure tensor of the weak coordinates. -/ +lemma valIdx_symm_tmul (s : Fermion.LeftHandedWeyl) (w : EuclideanSpace ℂ (Fin 2)) : + LeptonDoublet.valLinEquiv.symm (s ⊗ₜ w) = (valIdx).symm (s ⊗ₜ (WithLp.ofLp w)) := by + simp + +/-- The gauge algebra action of the datum on `LeptonDoublet` is the hand-built action. -/ +lemma leptonDoublet_rep_repAlgebra : + leptonDoublet.rep.repAlgebra valIdx = LeptonDoublet.gaugeAlgebraAction := by + refine LinearMap.ext fun c => LinearMap.ext fun v => ?_ + show MatrixRep.valEnd valIdx (leptonDoublet.rep.act c) v + = LeptonDoublet.weakEnd (LeptonDoublet.actionMatrix c) v + erw [leptonDoublet_rep_act] + obtain ⟨t, rfl⟩ := LeptonDoublet.valLinEquiv.symm.surjective v + induction t using TensorProduct.induction_on with + | zero => simp + | tmul s w => + rw [valIdx_symm_tmul, MatrixRep.valEnd_apply_symm_tmul, LeptonDoublet.weakEnd] + simp [Matrix.toLpLinAlgEquiv, Matrix.toLpLin_apply, TensorProduct.liftAux_tmul] + | add x y hx hy => simp only [map_add, hx, hy] + +/-- The Lorentz action of the datum on `LeptonDoublet` is the hand-built action. -/ +lemma leptonDoublet_repLorentz : + MatrixRep.repLorentz valIdx leptonDoublet.lorentz.rep = LeptonDoublet.repLorentzGroup := by + refine MonoidHom.ext fun Λ => LinearMap.ext fun v => ?_ + obtain ⟨t, rfl⟩ := LeptonDoublet.valLinEquiv.symm.surjective v + induction t using TensorProduct.induction_on with + | zero => simp + | tmul s w => + rw [valIdx_symm_tmul, MatrixRep.repLorentz_apply_symm_tmul, LeptonDoublet.repLorentzGroup] + simp [LorentzLabel.rep] + | add x y hx hy => simp only [map_add, hx, hy] + +/-- The hand-built jet identification on a scalar jet times a pure tensor. -/ +lemma jetValLinEquiv_tmul (χ : JetRing) (s : Fermion.LeftHandedWeyl) (v : Fin 2 → ℂ) : + LeptonDoublet.jetValLinEquiv (χ ⊗ₜ (valIdx).symm (s ⊗ₜ v)) + = s ⊗ₜ WithLp.toLp 2 (fun i => v i • χ) := by + simp [LeptonDoublet.jetValLinEquiv, TensorProduct.piScalarRight_apply] + +/-- The jet identification of the datum and the hand-built one agree on pure tensors. -/ +lemma jetEquiv_valIdx_symm_tmul (s : Fermion.LeftHandedWeyl) (y : Fin 2 → JetRing) : + (MatrixRep.jetEquiv valIdx).symm (s ⊗ₜ y) + = LeptonDoublet.jetValLinEquiv.symm (s ⊗ₜ WithLp.toLp 2 y) := by + obtain ⟨t, rfl⟩ := (TensorProduct.piScalarRight ℂ JetRing JetRing (Fin 2)).surjective y + induction t using TensorProduct.induction_on with + | zero => simp + | tmul f v => + simp [-TensorProduct.piScalarRight_apply, MatrixRep.jetEquiv, LeptonDoublet.jetValLinEquiv] + | add x y hx hy => simp only [map_add, WithLp.toLp_add, tmul_add, hx, hy] + +/-- The jet gauge action of the datum on `LeptonDoublet` is the hand-built action. -/ +lemma leptonDoublet_rep_repJet : + leptonDoublet.rep.repJet valIdx = LeptonDoublet.repJetGaugeGroupI := by + refine MonoidHom.ext fun U => LinearMap.ext fun z => ?_ + change (MatrixRep.jetEquiv valIdx).symm (MatrixRep.jetEnd Fermion.LeftHandedWeyl + (leptonDoublet.rep.mat U) (MatrixRep.jetEquiv valIdx z)) + = LeptonDoublet.jetValLinEquiv.symm + (Module.End.lTensorAlgHom ℂ (EuclideanSpace JetRing (Fin 2)) Fermion.LeftHandedWeyl + ((Matrix.toLpLinAlgEquiv 2 (LeptonDoublet.doubletMatrix U)).restrictScalars ℂ) + (LeptonDoublet.jetValLinEquiv z)) + erw [leptonDoublet_rep_mat] + induction z using TensorProduct.induction_on with + | zero => simp + | tmul χ v => + obtain ⟨t, rfl⟩ := (valIdx).symm.surjective v + induction t using TensorProduct.induction_on with + | zero => simp + | tmul s w => + rw [MatrixRep.jetEquiv_tmul, MatrixRep.jetEnd_tmul, jetValLinEquiv_tmul, + jetEquiv_valIdx_symm_tmul] + simp [Matrix.toLpLinAlgEquiv, Matrix.toLpLin_apply, TensorProduct.liftAux_tmul] + | add x y hx hy => simp only [tmul_add, map_add, hx, hy] + | add x y hx hy => simp only [map_add, hx, hy] + +/-- **The matter field of the datum on `LeptonDoublet` is the hand-built matter field**: + the two descriptions of the lepton doublet, the table's and the hand-built one, agree on + the same target space. -/ +theorem leptonDoublet_toMatterFieldOn_eq : + leptonDoublet.toMatterFieldOn valIdx = LeptonDoublet.matterField := by + have hL := leptonDoublet_repLorentz + have hJ := leptonDoublet_rep_repJet + have hA := leptonDoublet_rep_repAlgebra + unfold MatterFieldData.toMatterFieldOn MatrixRep.matterField LeptonDoublet.matterField + congr 1 + +end Model + +end StandardModel From d7a249b51b2c10143313fdc53d064dfeb369dc8a Mon Sep 17 00:00:00 2001 From: doxtor6 Date: Mon, 21 Sep 2026 03:08:37 -0400 Subject: [PATCH 339/367] refactor: derive the lepton doublet actions and matter field from the table's datum Define `LeptonDoublet.valIdx`, the identification of the hand-built target space with the target space of `StandardModel.Model.leptonDoublet`, and redefine along it `repLorentzGroup`, `repJetGaugeGroupI`, `doubletMatrix`, `weakEnd`, `actionMatrix`, `gaugeAlgebraAction`, `jetActionMatrix` and `LeptonDoublet.matterField` as the Lorentz action, jet action, matrix of jets, endomorphisms, action matrices and matter field the general theory derives from the datum. The hand-built definitions are kept as comments, with `repLorentzGroup_apply`, `doubletMatrix_eq`, `actionMatrix_eq`, `jetActionMatrix_eq` and `repJetGaugeGroupI_eq_doubletMatrix` recording their formulas. `isInfinitesimalActionOf`, `repCoeff_eq`, `repJetGaugeGroupI_smul`, `jetActionMatrix_map_cc_foldl`, the `weakEnd` algebra lemmas and `gaugeAlgebraAction_comm_repLorentzGroup` become the generic `MatrixRep` results; the hand-written infinitesimal-action proof and the weak-matrix derivative and equivariance identities are commented out. `Model/LeptonDoublet.lean` now records the identities, which hold by `rfl`. Co-authored-by: Claude Opus 4.8 --- .../Fermions/LeptonDoublet/Basic.lean | 133 ++++++++++++++- .../LeptonDoublet/GaugeAlgebraAction.lean | 160 ++++++++++++++++-- .../StandardModel/Fermions/MatterField.lean | 9 + .../StandardModel/Model/LeptonDoublet.lean | 157 ++--------------- 4 files changed, 301 insertions(+), 158 deletions(-) diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/Basic.lean b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/Basic.lean index 68ed61aab..d2f79e4e2 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/Basic.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/Basic.lean @@ -11,6 +11,8 @@ public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecompositio public import Physlib.Particles.StandardModel.GaugeGroup.JetGaugeGroup.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData +public import Physlib.Particles.StandardModel.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.MatrixRep.Table public import Physlib.Relativity.Tensors.ComplexTensor.Basic public import Mathlib.LinearAlgebra.TensorProduct.Pi public import Mathlib.Analysis.Normed.Lp.Matrix @@ -35,6 +37,8 @@ form of the Standard Model gauge group. ## ii. Key results - `LeptonDoublet` : the target space of the `(1, 2)_{-3}` multiplet. +- `valIdx` : the identification with the target space of the table's datum + `StandardModel.Model.leptonDoublet`, from which every action below is derived. - `repLorentzGroup` : the left-handed Lorentz action. - `repGaugeGroupI` : the action of the unquotiented gauge group. - `repGaugeGroupI_tmul_basis_eq_sum` : the gauge action in a tensor-product basis. @@ -117,6 +121,22 @@ lemma val_add (l₁ l₂ : LeptonDoublet) : (l₁ + l₂).val = l₁.val + l₂. @[simp] lemma val_smul (r : ℂ) (l : LeptonDoublet) : (r • l).val = r • l.val := rfl +/-- **The identification with the target space of the table's datum.** The lepton doublet + is the datum `StandardModel.Model.leptonDoublet`, `(.L, .singlet, .fund, -3)`, of the + Standard Model table; its target space is a left-handed Weyl spinor tensored with the + weak coordinates `Fin 2 → ℂ`, and forgetting the Euclidean norm on the weak index + identifies `LeptonDoublet` with it. Every action below is the one the general theory + derives from the datum, transported along this identification. -/ +noncomputable def valIdx : LeptonDoublet ≃ₗ[ℂ] Fermion.LeftHandedWeyl ⊗[ℂ] (Fin 2 → ℂ) := + valLinEquiv.trans + (TensorProduct.congr (LinearEquiv.refl ℂ Fermion.LeftHandedWeyl) + (WithLp.linearEquiv 2 ℂ (Fin 2 → ℂ))) + +/-- The identification sends a pure tensor to the pure tensor of the weak coordinates. -/ +lemma valLinEquiv_symm_tmul (s : Fermion.LeftHandedWeyl) (w : EuclideanSpace ℂ (Fin 2)) : + valLinEquiv.symm (s ⊗ₜ w) = valIdx.symm (s ⊗ₜ (WithLp.ofLp w)) := by + simp [valIdx] + /-! ## The basis of the lepton-doublet space @@ -141,6 +161,13 @@ The Lorentz group acts on the left-handed Weyl factor and leaves the weak index open Matrix MatrixGroups +/-- The left-handed Lorentz representation on lepton doublets: the Lorentz action the + general theory derives from the datum, on the Weyl factor with the weak index fixed + (`repLorentzGroup_apply`). -/ +noncomputable def repLorentzGroup : Representation ℂ (SL(2,ℂ)) LeptonDoublet := + LocalGaugeData.MatrixRep.repLorentz valIdx Fermion.LeftHandedWeyl.rep + +/- The hand-built definition, now derived from the datum: open Representation in /-- The left-handed Lorentz representation on lepton doublets. -/ noncomputable def repLorentzGroup : Representation ℂ (SL(2,ℂ)) LeptonDoublet where @@ -154,6 +181,21 @@ noncomputable def repLorentzGroup : Representation ℂ (SL(2,ℂ)) LeptonDoublet map_mul' Λ₁ Λ₂ := by ext1 l simp [TensorProduct.map_map, Module.End.mul_eq_comp] +-/ + +/-- The Lorentz action through the tensor-product value: the left-handed action on the + Weyl factor and the identity on the weak index. -/ +lemma repLorentzGroup_apply (Λ : SL(2,ℂ)) (v : LeptonDoublet) : + repLorentzGroup Λ v = valLinEquiv.symm + (TensorProduct.map (Fermion.LeftHandedWeyl.rep Λ) LinearMap.id (valLinEquiv v)) := by + obtain ⟨t, rfl⟩ := valLinEquiv.symm.surjective v + induction t using TensorProduct.induction_on with + | zero => simp [-valLinEquiv_apply] + | tmul s w => + rw [valLinEquiv_symm_tmul, repLorentzGroup, + LocalGaugeData.MatrixRep.repLorentz_apply_symm_tmul] + simp [valIdx] + | add x y hx hy => simp only [map_add, hx, hy] /-! @@ -351,6 +393,16 @@ noncomputable def jetValLinEquiv : ((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: the jet action the general theory derives from the datum. 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 (`repJetGaugeGroupI_eq_doubletMatrix`). -/ +noncomputable def repJetGaugeGroupI : + Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] LeptonDoublet) := + Model.leptonDoublet.rep.repJet valIdx + +/- The hand-built definition, now derived from the datum: /-- 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 @@ -399,6 +451,64 @@ noncomputable def repJetGaugeGroupI : rw [hM, map_mul, hres, map_mul] ext d x simp +-/ + +/-- The `JetRing`-valued weak matrix of the jet gauge action on the lepton doublet: the + matrix of jets by which a gauge jet acts on the datum. -/ +noncomputable def doubletMatrix (U : JetGaugeGroupI) : Matrix (Fin 2) (Fin 2) JetRing := + Model.leptonDoublet.rep.mat U + +open LocalGaugeData in +/-- The weak matrix of a gauge jet is its `SU(2)` matrix carrying the `-3` hypercharge + phase `(star u) ^ 3`. -/ +lemma doubletMatrix_eq (U : JetGaugeGroupI) : + doubletMatrix U = ((star ((U.2.2 : unitary JetRing) : JetRing)) ^ 3) • + ((U.2.1 : specialUnitaryGroup (Fin 2) JetRing) : Matrix (Fin 2) (Fin 2) JetRing) := by + show MatterField.chargePow (-3) U.2.2 • U.2.1.1 = _ + congr 1 + +/-- `jetValLinEquiv` on a scalar jet times a pure tensor. -/ +lemma jetValLinEquiv_tmul (χ : JetRing) (s : Fermion.LeftHandedWeyl) (v : Fin 2 → ℂ) : + jetValLinEquiv (χ ⊗ₜ valIdx.symm (s ⊗ₜ v)) = s ⊗ₜ WithLp.toLp 2 (fun i => v i • χ) := by + simp [jetValLinEquiv, valIdx, TensorProduct.piScalarRight_apply] + +/-- The jet identification of the datum and `jetValLinEquiv` agree on pure tensors. -/ +lemma jetEquiv_valIdx_symm_tmul (s : Fermion.LeftHandedWeyl) (y : Fin 2 → JetRing) : + (LocalGaugeData.MatrixRep.jetEquiv valIdx).symm (s ⊗ₜ y) + = jetValLinEquiv.symm (s ⊗ₜ WithLp.toLp 2 y) := by + obtain ⟨t, rfl⟩ := (TensorProduct.piScalarRight ℂ JetRing JetRing (Fin 2)).surjective y + induction t using TensorProduct.induction_on with + | zero => simp + | tmul f v => + simp [-TensorProduct.piScalarRight_apply, LocalGaugeData.MatrixRep.jetEquiv, + jetValLinEquiv, valIdx] + | add x y hx hy => simp only [map_add, WithLp.toLp_add, tmul_add, hx, hy] + +/-- The jet gauge action through `jetValLinEquiv`: the weak matrix of the gauge jet acts + `JetRing`-linearly on the weak coordinates. -/ +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)) := by + change (LocalGaugeData.MatrixRep.jetEquiv valIdx).symm + (LocalGaugeData.MatrixRep.jetEnd Fermion.LeftHandedWeyl (doubletMatrix U) + (LocalGaugeData.MatrixRep.jetEquiv valIdx z)) = _ + induction z using TensorProduct.induction_on with + | zero => simp + | tmul χ v => + obtain ⟨t, rfl⟩ := valIdx.symm.surjective v + induction t using TensorProduct.induction_on with + | zero => simp + | tmul s w => + rw [LocalGaugeData.MatrixRep.jetEquiv_tmul, LocalGaugeData.MatrixRep.jetEnd_tmul, + jetValLinEquiv_tmul, jetEquiv_valIdx_symm_tmul] + simp [Matrix.toLpLinAlgEquiv, Matrix.toLpLin_apply, TensorProduct.liftAux_tmul] + | add x y hx hy => simp only [tmul_add, map_add, hx, hy] + | add x y hx hy => simp only [map_add, hx, hy] /-- The identification of the jets of the lepton doublet intertwines multiplication by a scalar jet with the `JetRing`-scalar action on the weak coordinates. -/ @@ -437,6 +547,14 @@ lemma jetValLinEquiv_smul (χ : JetRing) (z : JetRing ⊗[ℂ] LeptonDoublet) : 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 := + Model.leptonDoublet.rep.repJet_smul valIdx U χ z + +/- The hand-built proof, now derived from the datum: /-- **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) @@ -465,6 +583,7 @@ lemma repJetGaugeGroupI_smul (U : JetGaugeGroupI) (χ : JetRing) 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 `(1, 2)_{-3}` action on the lepton-doublet factor, and @@ -478,7 +597,10 @@ lemma repJetGaugeGroupI_ofConstant (g : GaugeGroupI) : | zero => simp [show ({ val := 0 } : LeptonDoublet) = 0 from rfl] | tmul psi c => apply jetValLinEquiv.injective - simp [repJetGaugeGroupI, jetValLinEquiv, repGaugeGroupI] + show jetValLinEquiv (repJetGaugeGroupI _ (d ⊗ₜ ⟨psi ⊗ₜ c⟩)) + = jetValLinEquiv (TensorProduct.map LinearMap.id (repGaugeGroupI g) (d ⊗ₜ ⟨psi ⊗ₜ c⟩)) + rw [repJetGaugeGroupI_eq_doubletMatrix, doubletMatrix_eq] + simp [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) @@ -536,10 +658,9 @@ lemma repLorentzGroup_apply_basis (Λ : SL(2,ℂ)) (j : Fin 2 × Fin 2) : repLorentzGroup Λ (basis j) = ∑ β, Λ.1 β j.1 • basis (β, j.2) := by obtain ⟨k, w⟩ := j simp only [basis, Module.Basis.map_apply, Module.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, map_sum] + repLorentzGroup_apply, LinearEquiv.apply_symm_apply, TensorProduct.map_tmul, + Fermion.LeftHandedWeyl.rep_apply_basis, LinearMap.id_apply, TensorProduct.sum_tmul, + map_sum] refine Finset.sum_congr rfl fun x _ => ?_ rw [← TensorProduct.smul_tmul', map_smul] @@ -699,7 +820,7 @@ lemma leptonDoublet_repLorentzGroup_boostAxis_two_basis (t : ℝ) (ht : t ≠ 0) 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, + simp [LeptonDoublet.basis, LeptonDoublet.repLorentzGroup_apply, Module.Basis.map_apply, Module.Basis.tensorProduct_apply, leftHandedWeyl_rep_boostAxis_two_basis] rw [← TensorProduct.smul_tmul', map_smul] diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean index 853323e6e..09e849145 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean @@ -21,11 +21,12 @@ public import Physlib.Mathematics.TensorProductComm 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 — -`LocalGaugeData.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. +`(star u) ^ 3 • U₂` infinitesimally. Every definition is the one the general theory +derives from the table's datum `StandardModel.Model.leptonDoublet`, transported along +`LeptonDoublet.valIdx`; the compatibility with the jet gauge action — +`LocalGaugeData.IsInfinitesimalActionOf` — is the generic +`LocalGaugeData.MatrixRep.isInfinitesimalActionOf`. The hand-built definitions and the +hand-written proof are kept in comments. ## ii. Key results @@ -58,6 +59,14 @@ open Matrix MatrixGroups -/ +/-- 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 := + LocalGaugeData.MatrixRep.valEnd valIdx A + +/- The hand-built definition, now derived from the datum: + /-- 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) ℂ) : @@ -65,7 +74,48 @@ noncomputable def weakEnd (A : Matrix (Fin 2) (Fin 2) ℂ) : valLinEquiv.symm.toLinearMap ∘ₗ Module.End.lTensorAlgHom ℂ (EuclideanSpace ℂ (Fin 2)) Fermion.LeftHandedWeyl (Matrix.toLpLinAlgEquiv 2 A) ∘ₗ valLinEquiv.toLinearMap +-/ + +/-- The weak endomorphism through the tensor-product value. -/ +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)) := by + obtain ⟨t, rfl⟩ := valLinEquiv.symm.surjective v + induction t using TensorProduct.induction_on with + | zero => simp [-valLinEquiv_apply] + | tmul s w => + rw [valLinEquiv_symm_tmul, weakEnd, LocalGaugeData.MatrixRep.valEnd_apply_symm_tmul] + simp [valIdx, Matrix.toLpLinAlgEquiv, Matrix.toLpLin_apply, TensorProduct.liftAux_tmul] + | add x y hx hy => simp only [map_add, hx, hy] + +lemma weakEnd_add (A B : Matrix (Fin 2) (Fin 2) ℂ) : + weakEnd (A + B) = weakEnd A + weakEnd B := + LocalGaugeData.MatrixRep.valEnd_add valIdx A B + +lemma weakEnd_smul (z : ℂ) (A : Matrix (Fin 2) (Fin 2) ℂ) : + weakEnd (z • A) = z • weakEnd A := + LocalGaugeData.MatrixRep.valEnd_smul valIdx z A + +lemma weakEnd_zero : weakEnd 0 = 0 := LocalGaugeData.MatrixRep.valEnd_zero valIdx +lemma weakEnd_neg (A : Matrix (Fin 2) (Fin 2) ℂ) : weakEnd (-A) = -weakEnd A := + LocalGaugeData.MatrixRep.valEnd_neg valIdx A + +lemma weakEnd_multiset_sum (m : Multiset (Matrix (Fin 2) (Fin 2) ℂ)) : + weakEnd m.sum = (m.map weakEnd).sum := + LocalGaugeData.MatrixRep.valEnd_multiset_sum valIdx m + +/-- The weak endomorphisms compose through matrix multiplication. -/ +lemma weakEnd_mul (A B : Matrix (Fin 2) (Fin 2) ℂ) : + weakEnd (A * B) = weakEnd A ∘ₗ weakEnd B := + LocalGaugeData.MatrixRep.valEnd_mul valIdx A B + +/-- The weak endomorphism of the identity matrix is the identity. -/ +lemma weakEnd_one : weakEnd 1 = LinearMap.id := LocalGaugeData.MatrixRep.valEnd_one valIdx + +/- The hand-built proofs, now derived from the datum: lemma weakEnd_apply_mk (A : Matrix (Fin 2) (Fin 2) ℂ) (v : LeptonDoublet) : weakEnd A v = valLinEquiv.symm @@ -103,7 +153,39 @@ lemma weakEnd_mul (A B : Matrix (Fin 2) (Fin 2) ℂ) : 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: the action matrix of the datum. -/ +noncomputable def actionMatrix (c : GaugeAlgebra) : Matrix (Fin 2) (Fin 2) ℂ := + Model.leptonDoublet.rep.act c + +/-- The action matrix is `i` times the weak part, shifted by `i` times `-3` the + hypercharge. -/ +lemma actionMatrix_eq (c : GaugeAlgebra) : + actionMatrix c = Complex.I • (c.toSU2Matrix - ((3 : ℂ) • c.toU1Value) • 1) := by + show Complex.I • (c.2.1 : Matrix (Fin 2) (Fin 2) ℂ) + + (Complex.I * ((-3 : ℤ) : ℂ) * (c.2.2 : ℂ)) • (1 : Matrix (Fin 2) (Fin 2) ℂ) = _ + rw [GaugeAlgebra.toSU2Matrix, GaugeAlgebra.toU1Value] + ext i j + simp only [Matrix.add_apply, Matrix.smul_apply, Matrix.sub_apply, smul_eq_mul] + ring + +/-- **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 `GaugeAlgebraRealization.covDerivIter` and by + `LocalGaugeData.IsInfinitesimalActionOf`. It is the action the general theory derives + from the datum. -/ +noncomputable def gaugeAlgebraAction : + GaugeAlgebra →ₗ[ℝ] LeptonDoublet →ₗ[ℂ] LeptonDoublet := + Model.leptonDoublet.rep.repAlgebra valIdx + +/-- The gauge algebra acts by the weak endomorphism of its action matrix. -/ +lemma gaugeAlgebraAction_apply (c : GaugeAlgebra) : + gaugeAlgebraAction c = weakEnd (actionMatrix c) := rfl +/- The hand-built definitions, now derived from the datum: /-- 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. -/ @@ -139,16 +221,17 @@ noncomputable def gaugeAlgebraAction : 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 `LocalGaugeData.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. +jet gauge action, in the sense of `LocalGaugeData.IsInfinitesimalActionOf`: this is the +generic `LocalGaugeData.MatrixRep.isInfinitesimalActionOf`, proved once for every matrix +representation of jets. The jet action matrix and the base-point Taylor coefficients of +the jet action are likewise those of the datum. -/ @@ -156,6 +239,32 @@ section InfinitesimalAction open MvPowerSeries +/-- The jet-valued matrix of the infinitesimal `(1, 2)_{-3}` action of a jet of gauge + algebra elements: the jet action matrix of the datum. -/ +noncomputable def jetActionMatrix (a : JetGaugeAlgebra) : Matrix (Fin 2) (Fin 2) JetRing := + Model.leptonDoublet.rep.jetAct a + +/-- The jet action matrix is `i` times the weak part, shifted by `i` times `-3` the + hypercharge. -/ +lemma jetActionMatrix_eq (a : JetGaugeAlgebra) : + jetActionMatrix a = Complex.I • (a.toSU2Matrix - ((3 : ℂ) • a.toU1Value) • 1) := by + show Complex.I • (a.2.1 : Matrix (Fin 2) (Fin 2) JetRing) + + ((Complex.I * ((-3 : ℤ) : ℂ)) • (a.2.2 : JetRing)) • (1 : Matrix (Fin 2) (Fin 2) JetRing) + = _ + rw [JetGaugeAlgebra.toSU2Matrix, JetGaugeAlgebra.toU1Value] + refine Matrix.ext fun i j => ?_ + simp only [Matrix.add_apply, Matrix.smul_apply, Matrix.sub_apply, Matrix.one_apply] + split_ifs <;> simp [Algebra.smul_def] <;> ring + +/-- 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)) := + Model.leptonDoublet.rep.jetAct_map_cc_foldl p a + +/- The hand-built definition and proofs, now derived from the datum: /-- 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) : @@ -207,7 +316,9 @@ lemma jetActionMatrix_map_cc_foldl (p : Multiset (Fin 1 ⊕ Fin 3)) (a : JetGaug 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] +-/ +/- `doubletMatrix` and `repJetGaugeGroupI_eq_doubletMatrix` now live in `LeptonDoublet.Basic`: /-- 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 := @@ -222,7 +333,10 @@ lemma repJetGaugeGroupI_eq_doubletMatrix (U : JetGaugeGroupI) Fermion.LeftHandedWeyl ((Matrix.toLpLinAlgEquiv 2 (doubletMatrix U)).restrictScalars ℂ) (jetValLinEquiv z)) := rfl +-/ +/- The hand-written derivative and equivariance identities for the weak matrix, now the + axioms `mat_map_pderiv` and `mat_mul_jetAct` of the datum's matrix representation: /-- 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 @@ -444,7 +558,18 @@ private lemma foldl_pderiv_neg (x : Multiset (Fin 1 ⊕ Fin 3)) (f : JetRing) : 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 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)) : + GaugeAlgebraRealization.repCoeff repJetGaugeGroupI U x + = weakEnd ((doubletMatrix U).map fun f => + constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) := + Model.leptonDoublet.rep.repCoeff_eq valIdx U x + +/- The hand-written proof, now derived from the datum: 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 @@ -518,6 +643,7 @@ 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. -/ @@ -532,12 +658,22 @@ lemma repCoeff_zero_of_eval_eq_one {U : JetGaugeGroupI} (hU : U.eval = 1) : 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, + rw [Matrix.map_apply, Multiset.foldl_zero, doubletMatrix_eq, 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] +/-- **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. This is the generic statement for the datum's matrix + representation. -/ +theorem isInfinitesimalActionOf : + localGaugeData.IsInfinitesimalActionOf gaugeAlgebraAction repJetGaugeGroupI := + Model.leptonDoublet.rep.isInfinitesimalActionOf valIdx + +/- The hand-written proof, now derived from the datum: 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 @@ -646,6 +782,7 @@ theorem isInfinitesimalActionOf : refine congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => ?_) rw [Function.comp_apply, weakEnd_mul, repCoeff_eq] rfl +-/ end InfinitesimalAction @@ -661,8 +798,7 @@ lemma 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)) + LocalGaugeData.MatrixRep.repAlgebra_comm_repLorentz _ _ _ c Λ v end LeptonDoublet diff --git a/Physlib/Particles/StandardModel/Fermions/MatterField.lean b/Physlib/Particles/StandardModel/Fermions/MatterField.lean index d5eed483c..bd03e2bf6 100644 --- a/Physlib/Particles/StandardModel/Fermions/MatterField.lean +++ b/Physlib/Particles/StandardModel/Fermions/MatterField.lean @@ -71,6 +71,14 @@ namespace StandardModel namespace LeptonDoublet +/-- The lepton doublet as a matter field of `StandardModel.localGaugeData`, in the `(1, 2)_{-3}` + representation with its left-handed Lorentz action: the matter field the general theory + derives from the table's datum `StandardModel.Model.leptonDoublet`, on the target space + `LeptonDoublet` through `valIdx`. -/ +noncomputable def matterField : MatterField localGaugeData := + Model.leptonDoublet.toMatterFieldOn valIdx + +/- The hand-built definition, now derived from the datum: /-- The lepton doublet as a matter field of `StandardModel.localGaugeData`, in the `(1, 2)_{-3}` representation with its left-handed Lorentz action. -/ noncomputable def matterField : MatterField localGaugeData where @@ -81,6 +89,7 @@ noncomputable def matterField : MatterField localGaugeData where repAlgebra_isInfinitesimalAction := isInfinitesimalActionOf repJet_smul := repJetGaugeGroupI_smul massWeight := 3 +-/ @[simp] lemma matterField_V : matterField.V = LeptonDoublet := rfl diff --git a/Physlib/Particles/StandardModel/Model/LeptonDoublet.lean b/Physlib/Particles/StandardModel/Model/LeptonDoublet.lean index 043468c91..99ad4636f 100644 --- a/Physlib/Particles/StandardModel/Model/LeptonDoublet.lean +++ b/Physlib/Particles/StandardModel/Model/LeptonDoublet.lean @@ -6,7 +6,6 @@ Authors: Jinzheng Li module public import Physlib.Particles.StandardModel.Basic -public import Physlib.Particles.StandardModel.Model.Consistency public import Physlib.Particles.StandardModel.Fermions.MatterField /-! @@ -15,167 +14,45 @@ public import Physlib.Particles.StandardModel.Fermions.MatterField ## i. Overview The lepton doublet of the Standard Model is the datum `StandardModel.Model.leptonDoublet`, -`(.L, .singlet, .fund, -3)`, of `Physlib.Particles.StandardModel.Basic`. This file records -what the general theory derives from it and checks it against the hand-built -`StandardModel.LeptonDoublet`: the datum is indexed by the weak index alone, its gauge jets -act by the matrix `ū³ · U₂` of the hand-built doublet and its gauge algebra by the -hand-built action matrix, and, on the target space `LeptonDoublet` identified with its -tensor-product value, the matter field the general theory derives from the datum is the -hand-built matter field itself. +`(.L, .singlet, .fund, -3)`, of `Physlib.Particles.StandardModel.Basic`. The species +`StandardModel.LeptonDoublet` is defined from it: its weak matrix, action matrix, Lorentz, +jet and gauge-algebra actions, and its matter field are the ones the general theory +derives from the datum, transported to the target space `LeptonDoublet` along +`LeptonDoublet.valIdx`. This file records the identities, all of which hold by +definition. ## ii. Key results -- `StandardModel.Model.leptonDoublet_rep_mat`, `leptonDoublet_rep_act` : the datum acts by - `LeptonDoublet.doubletMatrix` and `LeptonDoublet.actionMatrix`. - `StandardModel.Model.leptonDoublet_toMatterFieldOn_eq` : on the target space `LeptonDoublet`, the matter field of the datum is `LeptonDoublet.matterField`. -## iii. Table of contents - -- A. The index and the matrices -- B. The matter field on the hand-built target space - -/ @[expose] public section -open LocalGaugeData Matrix TensorProduct +open LocalGaugeData namespace StandardModel namespace Model -/-! - -## A. The index and the matrices - --/ - -/-- The lepton doublet is indexed by a weak index alone, as the hand-built lepton doublet. -/ +/-- The lepton doublet is indexed by a weak index alone. -/ example : leptonDoublet.Idx = Fin 2 := rfl /-- The lepton doublet has mass weight `3`. -/ example : leptonDoublet.massWeight = 3 := rfl -/-- The lepton doublet acts on its weak index by the matrix `ū³ · U₂` of the hand-built - lepton doublet. -/ -lemma leptonDoublet_rep_mat (U : JetGaugeGroupI) : - leptonDoublet.rep.mat U = LeptonDoublet.doubletMatrix U := by - show MatterField.chargePow (-3) U.2.2 • U.2.1.1 = LeptonDoublet.doubletMatrix U - rw [LeptonDoublet.doubletMatrix] - congr 1 - -/-- The gauge algebra acts on the weak index of the lepton doublet by the action matrix of - the hand-built lepton doublet. -/ -lemma leptonDoublet_rep_act (c : GaugeAlgebra) : - leptonDoublet.rep.act c = LeptonDoublet.actionMatrix c := by - show Complex.I • (c.2.1 : Matrix (Fin 2) (Fin 2) ℂ) - + (Complex.I * ((-3 : ℤ) : ℂ) * (c.2.2 : ℂ)) • (1 : Matrix (Fin 2) (Fin 2) ℂ) - = LeptonDoublet.actionMatrix c - rw [LeptonDoublet.actionMatrix, GaugeAlgebra.toSU2Matrix, GaugeAlgebra.toU1Value] - ext i j - simp only [Matrix.add_apply, Matrix.smul_apply, Matrix.sub_apply, smul_eq_mul] - ring - -/-! - -## B. The matter field on the hand-built target space - -The hand-built target space `LeptonDoublet` is a Weyl spinor tensored with a Euclidean -weak index; forgetting the Euclidean structure identifies it with the tensor-product target -space of the datum. +/-- The weak matrix of the species is the matrix of jets of the datum. -/ +example (U : JetGaugeGroupI) : leptonDoublet.rep.mat U = LeptonDoublet.doubletMatrix U := rfl --/ +/-- The action matrix of the species is the action matrix of the datum. -/ +example (c : GaugeAlgebra) : leptonDoublet.rep.act c = LeptonDoublet.actionMatrix c := rfl -/-- The identification of the hand-built target space with the target space of the datum. -/ -local notation "valIdx" => - LeptonDoublet.valLinEquiv.trans - (TensorProduct.congr (LinearEquiv.refl ℂ Fermion.LeftHandedWeyl) - (WithLp.linearEquiv 2 ℂ (Fin 2 → ℂ))) - -/-- The identification sends a pure tensor to the pure tensor of the weak coordinates. -/ -lemma valIdx_symm_tmul (s : Fermion.LeftHandedWeyl) (w : EuclideanSpace ℂ (Fin 2)) : - LeptonDoublet.valLinEquiv.symm (s ⊗ₜ w) = (valIdx).symm (s ⊗ₜ (WithLp.ofLp w)) := by - simp - -/-- The gauge algebra action of the datum on `LeptonDoublet` is the hand-built action. -/ -lemma leptonDoublet_rep_repAlgebra : - leptonDoublet.rep.repAlgebra valIdx = LeptonDoublet.gaugeAlgebraAction := by - refine LinearMap.ext fun c => LinearMap.ext fun v => ?_ - show MatrixRep.valEnd valIdx (leptonDoublet.rep.act c) v - = LeptonDoublet.weakEnd (LeptonDoublet.actionMatrix c) v - erw [leptonDoublet_rep_act] - obtain ⟨t, rfl⟩ := LeptonDoublet.valLinEquiv.symm.surjective v - induction t using TensorProduct.induction_on with - | zero => simp - | tmul s w => - rw [valIdx_symm_tmul, MatrixRep.valEnd_apply_symm_tmul, LeptonDoublet.weakEnd] - simp [Matrix.toLpLinAlgEquiv, Matrix.toLpLin_apply, TensorProduct.liftAux_tmul] - | add x y hx hy => simp only [map_add, hx, hy] - -/-- The Lorentz action of the datum on `LeptonDoublet` is the hand-built action. -/ -lemma leptonDoublet_repLorentz : - MatrixRep.repLorentz valIdx leptonDoublet.lorentz.rep = LeptonDoublet.repLorentzGroup := by - refine MonoidHom.ext fun Λ => LinearMap.ext fun v => ?_ - obtain ⟨t, rfl⟩ := LeptonDoublet.valLinEquiv.symm.surjective v - induction t using TensorProduct.induction_on with - | zero => simp - | tmul s w => - rw [valIdx_symm_tmul, MatrixRep.repLorentz_apply_symm_tmul, LeptonDoublet.repLorentzGroup] - simp [LorentzLabel.rep] - | add x y hx hy => simp only [map_add, hx, hy] - -/-- The hand-built jet identification on a scalar jet times a pure tensor. -/ -lemma jetValLinEquiv_tmul (χ : JetRing) (s : Fermion.LeftHandedWeyl) (v : Fin 2 → ℂ) : - LeptonDoublet.jetValLinEquiv (χ ⊗ₜ (valIdx).symm (s ⊗ₜ v)) - = s ⊗ₜ WithLp.toLp 2 (fun i => v i • χ) := by - simp [LeptonDoublet.jetValLinEquiv, TensorProduct.piScalarRight_apply] - -/-- The jet identification of the datum and the hand-built one agree on pure tensors. -/ -lemma jetEquiv_valIdx_symm_tmul (s : Fermion.LeftHandedWeyl) (y : Fin 2 → JetRing) : - (MatrixRep.jetEquiv valIdx).symm (s ⊗ₜ y) - = LeptonDoublet.jetValLinEquiv.symm (s ⊗ₜ WithLp.toLp 2 y) := by - obtain ⟨t, rfl⟩ := (TensorProduct.piScalarRight ℂ JetRing JetRing (Fin 2)).surjective y - induction t using TensorProduct.induction_on with - | zero => simp - | tmul f v => - simp [-TensorProduct.piScalarRight_apply, MatrixRep.jetEquiv, LeptonDoublet.jetValLinEquiv] - | add x y hx hy => simp only [map_add, WithLp.toLp_add, tmul_add, hx, hy] - -/-- The jet gauge action of the datum on `LeptonDoublet` is the hand-built action. -/ -lemma leptonDoublet_rep_repJet : - leptonDoublet.rep.repJet valIdx = LeptonDoublet.repJetGaugeGroupI := by - refine MonoidHom.ext fun U => LinearMap.ext fun z => ?_ - change (MatrixRep.jetEquiv valIdx).symm (MatrixRep.jetEnd Fermion.LeftHandedWeyl - (leptonDoublet.rep.mat U) (MatrixRep.jetEquiv valIdx z)) - = LeptonDoublet.jetValLinEquiv.symm - (Module.End.lTensorAlgHom ℂ (EuclideanSpace JetRing (Fin 2)) Fermion.LeftHandedWeyl - ((Matrix.toLpLinAlgEquiv 2 (LeptonDoublet.doubletMatrix U)).restrictScalars ℂ) - (LeptonDoublet.jetValLinEquiv z)) - erw [leptonDoublet_rep_mat] - induction z using TensorProduct.induction_on with - | zero => simp - | tmul χ v => - obtain ⟨t, rfl⟩ := (valIdx).symm.surjective v - induction t using TensorProduct.induction_on with - | zero => simp - | tmul s w => - rw [MatrixRep.jetEquiv_tmul, MatrixRep.jetEnd_tmul, jetValLinEquiv_tmul, - jetEquiv_valIdx_symm_tmul] - simp [Matrix.toLpLinAlgEquiv, Matrix.toLpLin_apply, TensorProduct.liftAux_tmul] - | add x y hx hy => simp only [tmul_add, map_add, hx, hy] - | add x y hx hy => simp only [map_add, hx, hy] - -/-- **The matter field of the datum on `LeptonDoublet` is the hand-built matter field**: - the two descriptions of the lepton doublet, the table's and the hand-built one, agree on - the same target space. -/ -theorem leptonDoublet_toMatterFieldOn_eq : - leptonDoublet.toMatterFieldOn valIdx = LeptonDoublet.matterField := by - have hL := leptonDoublet_repLorentz - have hJ := leptonDoublet_rep_repJet - have hA := leptonDoublet_rep_repAlgebra - unfold MatterFieldData.toMatterFieldOn MatrixRep.matterField LeptonDoublet.matterField - congr 1 +/-- **The matter field of the datum on `LeptonDoublet` is the matter field of the + species**: the table's description and the species' description of the lepton doublet + are one definition. -/ +lemma leptonDoublet_toMatterFieldOn_eq : + leptonDoublet.toMatterFieldOn LeptonDoublet.valIdx = LeptonDoublet.matterField := rfl end Model From 37eca1fa3848865c0530e2bce4f146db47820240 Mon Sep 17 00:00:00 2001 From: doxtor6 Date: Mon, 21 Sep 2026 05:39:56 -0400 Subject: [PATCH 340/367] refactor: make the lepton doublet an abbreviation of the datum's target space Add the generic target space `MatterFieldData.V`, its basis `MatterFieldData.basis` (with `LorentzLabel.basisIndex`, `LorentzLabel.basis`) and the global gauge action `MatrixRep.repGlobal` of a matrix representation of jets, with `repJet_ofConstant` relating it to the jet action on constant jets when the matrices of constant jets are constant. `LeptonDoublet` is now `abbrev LeptonDoublet := Model.leptonDoublet.V`; the wrapper structure, `valEquiv`, `valLinEquiv`, `valIdx` and `jetValLinEquiv` are removed (the wrapper is kept as a comment). `basis`, `repLorentzGroup`, `repGaugeGroupI`, `repJetGaugeGroupI`, `doubletMatrix`, `weakEnd`, `actionMatrix`, `gaugeAlgebraAction`, `jetActionMatrix` and `LeptonDoublet.matterField` are one-line definitions from the datum; `basis_apply`, `repLorentzGroup_tmul`, `repGaugeGroupI_tmul`, `doubletMatrix_ofConstant_map_constantCoeff`, `doubletMatrix_ofConstant` and `weakEnd_tmul` record the explicit forms, and the basis, kernel, descent and component transformation lemmas keep their statements. `leptonDoublet_toMatterField_eq` replaces `leptonDoublet_toMatterFieldOn_eq`. The projections and inclusions of `Fermions/JetAlgebra/Basic.lean` and `IsFermionSector.derivSubmodule` become `noncomputable`, as the tensor-product instances are. Co-authored-by: Claude Opus 4.8 --- .../MatterField/MatrixRep/Basic.lean | 69 +++ .../MatterField/MatrixRep/Table.lean | 43 ++ .../Fermions/JetAlgebra/Basic.lean | 20 +- .../Fermions/LeptonDoublet/Basic.lean | 544 +++++------------- .../LeptonDoublet/GaugeAlgebraAction.lean | 49 +- .../StandardModel/Fermions/MatterField.lean | 5 +- .../StandardModel/IsFermionSector/Basic.lean | 2 +- .../StandardModel/Model/LeptonDoublet.lean | 25 +- 8 files changed, 312 insertions(+), 445 deletions(-) diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Basic.lean index ad469f03d..928d5215e 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Basic.lean @@ -559,6 +559,75 @@ noncomputable def repLorentz (ρ : Representation ℂ SL(2,ℂ) S) : (MonoidHomClass.toMonoidHom (e.symm.conjAlgEquiv (R := ℂ))).comp (ρ.tprod (Representation.trivial ℂ SL(2,ℂ) (ι → ℂ))) +/-! + +### The global action + +A matrix representation of jets restricts to the jets of constant gauge transformations; +the constant terms of their matrices are the matrices of a representation of the global +gauge group on the target space. When the matrices of constant jets are constant, the jet +action on a constant jet is this global action on the value factor. + +-/ + +section Global + +/-- **The global gauge action** of a matrix representation of jets: a global gauge + transformation acts by the constant term of the matrix of its constant jet. -/ +noncomputable def repGlobal : Representation ℂ G₀ V where + toFun g := valEnd e ((R.mat (jets.ofConstant g)).map (constantCoeff : JetRing → ℂ)) + map_one' := by + rw [map_one jets.ofConstant, R.mat_one, + ← RingHom.mapMatrix_apply (constantCoeff : JetRing →+* ℂ), map_one, valEnd_one] + rfl + map_mul' g h := by + rw [map_mul jets.ofConstant, R.mat_mul, + ← RingHom.mapMatrix_apply (constantCoeff : JetRing →+* ℂ), map_mul, + RingHom.mapMatrix_apply, RingHom.mapMatrix_apply, valEnd_mul] + rfl + +lemma repGlobal_apply (g : G₀) : + R.repGlobal e g = valEnd e ((R.mat (jets.ofConstant g)).map (constantCoeff : JetRing → ℂ)) := + rfl + +/-- The global action on a pure tensor: the constant term of the matrix acts on the + internal index. -/ +lemma repGlobal_apply_symm_tmul (g : G₀) (s : S) (v : ι → ℂ) : + R.repGlobal e g (e.symm (s ⊗ₜ[ℂ] v)) + = e.symm (s ⊗ₜ[ℂ] ((R.mat (jets.ofConstant g)).map (constantCoeff : JetRing → ℂ)).mulVec v) := + valEnd_apply_symm_tmul e _ s v + +/-- A matrix of constant jets acts on a scalar jet times a constant vector through its + constant matrix. -/ +lemma map_C_mulVec_smul (B : Matrix ι ι ℂ) (v : ι → ℂ) (χ : JetRing) : + (B.map (C : ℂ → JetRing)).mulVec (fun i => v i • χ) = fun i => (B.mulVec v) i • χ := by + funext i + simp only [Matrix.mulVec, dotProduct, Matrix.map_apply, Finset.sum_smul, C_mul_eq_smul, + smul_smul] + +/-- **On jets of constant gauge transformations the jet action is the global action** on + the value factor, provided the matrices of constant jets are constant. -/ +lemma repJet_ofConstant + (hconst : ∀ g, R.mat (jets.ofConstant g) + = ((R.mat (jets.ofConstant g)).map (constantCoeff : JetRing → ℂ)).map (C : ℂ → JetRing)) + (g : G₀) : + R.repJet e (jets.ofConstant g) = TensorProduct.map LinearMap.id (R.repGlobal e g) := by + refine LinearMap.ext fun z => ?_ + induction z using TensorProduct.induction_on with + | zero => simp + | tmul χ v => + obtain ⟨t, rfl⟩ := e.symm.surjective v + induction t using TensorProduct.induction_on with + | zero => simp + | tmul s w => + rw [repJet_apply, matEnd_apply, jetEquiv_tmul, jetEnd_tmul, hconst, map_C_mulVec_smul, + ← jetEquiv_tmul e, LinearEquiv.symm_apply_apply, TensorProduct.map_tmul, + LinearMap.id_apply, repGlobal_apply_symm_tmul] + | add x y hx hy => simp only [tmul_add, map_add, hx, hy] + | add x y hx hy => simp only [map_add, hx, hy] + +end Global + variable [Module.Free ℂ V] [Module.Finite ℂ V] /-- **The matter field of a matrix representation**: the target space `V ≃ S ⊗ (ι → ℂ)` diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Table.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Table.lean index 289b896c3..775861a85 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Table.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Table.lean @@ -300,6 +300,29 @@ def massWeight : LorentzLabel → ℕ | .R => 3 | .scalar => 2 +/-- The index of the basis of the Lorentz factor of a label: the two spinor components of + a Weyl spinor, one component for a scalar. -/ +abbrev basisIndex : LorentzLabel → Type + | .L => Fin 2 + | .R => Fin 2 + | .scalar => Unit + +instance instFintypeBasisIndex : (l : LorentzLabel) → Fintype l.basisIndex + | .L => inferInstanceAs (Fintype (Fin 2)) + | .R => inferInstanceAs (Fintype (Fin 2)) + | .scalar => inferInstanceAs (Fintype Unit) + +instance instDecidableEqBasisIndex : (l : LorentzLabel) → DecidableEq l.basisIndex + | .L => inferInstanceAs (DecidableEq (Fin 2)) + | .R => inferInstanceAs (DecidableEq (Fin 2)) + | .scalar => inferInstanceAs (DecidableEq Unit) + +/-- The basis of the Lorentz factor of a label: the Weyl basis, or `1` for a scalar. -/ +noncomputable def basis : (l : LorentzLabel) → Module.Basis l.basisIndex ℂ l.Space + | .L => Fermion.LeftHandedWeyl.basis + | .R => Fermion.RightHandedWeyl.basis + | .scalar => Module.Basis.singleton Unit ℂ + end LorentzLabel /-- **The data of a matter field**: its Lorentz label and its charge tuple, so that a @@ -325,6 +348,22 @@ noncomputable abbrev rep : MatrixRep jets M.Idx := Charges.rep Γ M.charges /-- The mass weight of the field. -/ abbrev massWeight : ℕ := M.lorentz.massWeight +/-- **The target space of the field**: the Lorentz factor of its label tensored with the + functions on its internal index. -/ +abbrev V : Type := M.lorentz.Space ⊗[ℂ] (M.Idx → ℂ) + +/-- **The basis of the target space**: the basis of the Lorentz factor tensored with the + coordinate basis of the internal index. -/ +noncomputable def basis : Module.Basis (M.lorentz.basisIndex × M.Idx) ℂ M.V := + M.lorentz.basis.tensorProduct (Pi.basisFun ℂ M.Idx) + +/-- A basis vector of the target space is a basis vector of the Lorentz factor tensored with + a coordinate vector of the internal index. -/ +@[simp] +lemma basis_apply (a : M.lorentz.basisIndex) (i : M.Idx) : + M.basis (a, i) = M.lorentz.basis a ⊗ₜ Pi.single i 1 := by + rw [basis, Module.Basis.tensorProduct_apply, Pi.basisFun_apply] + /-- **The matter field of a datum on a presented target space**: a target space `V` identified with the Lorentz factor of the label tensored with the internal index of the charges, transforming in the representation the charges name. -/ @@ -361,6 +400,10 @@ lemma toMatterFieldOn_massWeight : (M.toMatterFieldOn e).massWeight = M.massWeig @[simp] lemma toMatterField_massWeight : M.toMatterField.massWeight = M.massWeight := rfl +/-- The target space of the matter field of a datum is the target space of the datum. -/ +@[simp] +lemma toMatterField_V : M.toMatterField.V = M.V := rfl + /-- The gauge and Lorentz actions of the matter field of a datum commute. -/ lemma toMatterFieldOn_gaugeLorentzCompatible : (M.toMatterFieldOn e).GaugeLorentzCompatible := diff --git a/Physlib/Particles/StandardModel/Fermions/JetAlgebra/Basic.lean b/Physlib/Particles/StandardModel/Fermions/JetAlgebra/Basic.lean index 899f7c54c..daa44b55e 100644 --- a/Physlib/Particles/StandardModel/Fermions/JetAlgebra/Basic.lean +++ b/Physlib/Particles/StandardModel/Fermions/JetAlgebra/Basic.lean @@ -127,25 +127,25 @@ 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 := +noncomputable 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 := +noncomputable 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 := +noncomputable 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 := +noncomputable 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 := +noncomputable def downSingletProj (i : Fin 3) : FermionSpace →ₗ[ℂ] DownSinglet := (LinearMap.proj i).comp ((LinearMap.snd ℂ _ _).comp ((LinearMap.snd ℂ _ _).comp ((LinearMap.snd ℂ _ _).comp (LinearMap.snd ℂ _ _)))) @@ -160,28 +160,28 @@ 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 := +noncomputable 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 := +noncomputable 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 := +noncomputable 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 := +noncomputable 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 := +noncomputable 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)))) diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/Basic.lean b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/Basic.lean index d2f79e4e2..c3f02df43 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/Basic.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/Basic.lean @@ -14,9 +14,6 @@ public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData public import Physlib.Particles.StandardModel.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.MatrixRep.Table 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 @@ -26,30 +23,30 @@ The Standard Model lepton doublet is a left-handed Weyl spinor in the `(1, 2)_{- representation. Here charges are normalized as `6Y`, so `-3` is the usual hypercharge `Y = -1/2`. -`LeptonDoublet` is the target vector space of one lepton multiplet. Its Weyl factor -carries the Lorentz index and its two-dimensional factor carries the weak index. -The absence of a colour factor makes it an `SU(3)` singlet. +The lepton doublet is the datum `StandardModel.Model.leptonDoublet`, +`(.L, .singlet, .fund, -3)`, of the Standard Model table. `LeptonDoublet` is its target +space, a left-handed Weyl spinor tensored with the weak coordinates, and every action on +it — Lorentz, global gauge, jet gauge — is the one the general theory derives from the +datum. The hand-built definitions are kept in comments. -The Lorentz and gauge actions are first defined separately. The gauge action is then -computed on a basis, used to identify its kernel, and descended to each supported global -form of the Standard Model gauge group. +The gauge action is computed on a basis, used to identify its kernel, and descended to +each supported global form of the Standard Model gauge group. ## ii. Key results - `LeptonDoublet` : the target space of the `(1, 2)_{-3}` multiplet. -- `valIdx` : the identification with the target space of the table's datum - `StandardModel.Model.leptonDoublet`, from which every action below is derived. - `repLorentzGroup` : the left-handed Lorentz action. - `repGaugeGroupI` : the action of the unquotiented gauge group. -- `repGaugeGroupI_tmul_basis_eq_sum` : the gauge action in a tensor-product basis. +- `repGaugeGroupI_apply_basis` : the gauge action in the spinor–weak basis. - `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. +- `repJetGaugeGroupI` : the action of the jet gauge group on the jets of the doublet. ## iii. Table of contents - A. The lepton-doublet space -- B. Linear structure +- B. The basis - C. Lorentz action - D. Gauge action - E. Kernel of the gauge action @@ -63,16 +60,26 @@ form of the Standard Model gauge group. namespace StandardModel -open TensorProduct +open TensorProduct MvPowerSeries /-! ## A. The lepton-doublet space -The Weyl factor carries the left-handed Lorentz index, while -`EuclideanSpace ℂ (Fin 2)` carries the weak index. +The Weyl factor carries the left-handed Lorentz index, while the functions on `Fin 2` +carry the weak index. + -/ +/-- The target vector space of one Standard Model lepton doublet: the target space of the + datum `StandardModel.Model.leptonDoublet`, a left-handed Weyl spinor tensored with the + weak coordinates. It carries the `(1, 2)_{-3}` representation of the gauge group. -/ +abbrev LeptonDoublet : Type := Model.leptonDoublet.V + +namespace LeptonDoublet + +/- The hand-built wrapper, now an abbreviation of the datum's target space: + /-- The target vector space of one Standard Model lepton doublet. It carries the `(1, 2)_{-3}` representation of the gauge group. -/ @[ext] @@ -80,17 +87,6 @@ structure LeptonDoublet where /-- The left-handed Weyl spinor with its weak-doublet index. -/ val : Fermion.LeftHandedWeyl ⊗[ℂ] EuclideanSpace ℂ (Fin 2) -namespace LeptonDoublet - -/-! - -## B. Linear structure - -The wrapper distinguishes lepton doublets from other isomorphic vector spaces. -The following equivalences transfer the linear structure of the tensor product and expose -that model when defining representations. --/ - /-- Identifies a lepton doublet with its underlying tensor-product value. -/ def valEquiv : LeptonDoublet ≃ Fermion.LeftHandedWeyl ⊗[ℂ] EuclideanSpace ℂ (Fin 2) where toFun := val @@ -107,69 +103,45 @@ def valLinEquiv : LeptonDoublet ≃ₗ[ℂ] invFun := fun m => ⟨m⟩ map_add' := by intros; rfl map_smul' := by intros; rfl +-/ -@[simp] -lemma valLinEquiv_apply (l : LeptonDoublet) : valLinEquiv l = l.val := rfl - -lemma valLinEquiv_symm_apply - (m : Fermion.LeftHandedWeyl ⊗[ℂ] EuclideanSpace ℂ (Fin 2)) : - valLinEquiv.symm m = ⟨m⟩ := rfl - -@[simp] -lemma val_add (l₁ l₂ : LeptonDoublet) : (l₁ + l₂).val = l₁.val + l₂.val := rfl - -@[simp] -lemma val_smul (r : ℂ) (l : LeptonDoublet) : (r • l).val = r • l.val := rfl - -/-- **The identification with the target space of the table's datum.** The lepton doublet - is the datum `StandardModel.Model.leptonDoublet`, `(.L, .singlet, .fund, -3)`, of the - Standard Model table; its target space is a left-handed Weyl spinor tensored with the - weak coordinates `Fin 2 → ℂ`, and forgetting the Euclidean norm on the weak index - identifies `LeptonDoublet` with it. Every action below is the one the general theory - derives from the datum, transported along this identification. -/ -noncomputable def valIdx : LeptonDoublet ≃ₗ[ℂ] Fermion.LeftHandedWeyl ⊗[ℂ] (Fin 2 → ℂ) := - valLinEquiv.trans - (TensorProduct.congr (LinearEquiv.refl ℂ Fermion.LeftHandedWeyl) - (WithLp.linearEquiv 2 ℂ (Fin 2 → ℂ))) - -/-- The identification sends a pure tensor to the pure tensor of the weak coordinates. -/ -lemma valLinEquiv_symm_tmul (s : Fermion.LeftHandedWeyl) (w : EuclideanSpace ℂ (Fin 2)) : - valLinEquiv.symm (s ⊗ₜ w) = valIdx.symm (s ⊗ₜ (WithLp.ofLp w)) := by - simp [valIdx] +/-- The target space is the datum's target space. -/ +example : LeptonDoublet = (Fermion.LeftHandedWeyl ⊗[ℂ] (Fin 2 → ℂ)) := rfl /-! -## The basis of the lepton-doublet space +## B. The basis -/ -/-- A basis on the lepton doublets. -/ +/-- A basis on the lepton doublets: the Weyl basis tensored with the coordinate basis of + the weak index. -/ noncomputable def basis : Module.Basis (Fin 2 × Fin 2) ℂ LeptonDoublet := - (Fermion.LeftHandedWeyl.basis.tensorProduct - (EuclideanSpace.basisFun (Fin 2) ℂ).toBasis).map valLinEquiv.symm + Model.leptonDoublet.basis -instance : Module.Finite ℂ LeptonDoublet := Module.Finite.of_basis basis - -instance : Module.Free ℂ LeptonDoublet := Module.Free.of_basis basis +/-- The lepton-doublet basis vector as an explicit spinor–weak tensor. -/ +lemma basis_apply (k j : Fin 2) : + basis (k, j) = Fermion.LeftHandedWeyl.basis k ⊗ₜ[ℂ] Pi.single j 1 := + Model.leptonDoublet.basis_apply k j /-! ## C. Lorentz action The Lorentz group acts on the left-handed Weyl factor and leaves the weak index fixed. + -/ open Matrix MatrixGroups /-- The left-handed Lorentz representation on lepton doublets: the Lorentz action the - general theory derives from the datum, on the Weyl factor with the weak index fixed - (`repLorentzGroup_apply`). -/ + general theory derives from the datum. -/ noncomputable def repLorentzGroup : Representation ℂ (SL(2,ℂ)) LeptonDoublet := - LocalGaugeData.MatrixRep.repLorentz valIdx Fermion.LeftHandedWeyl.rep + Model.leptonDoublet.toMatterField.repLorentz /- The hand-built definition, now derived from the datum: + open Representation in -/-- The left-handed Lorentz representation on lepton doublets. -/ noncomputable def repLorentzGroup : Representation ℂ (SL(2,ℂ)) LeptonDoublet where toFun Λ := valLinEquiv.symm ∘ₗ (TensorProduct.map (Fermion.LeftHandedWeyl.rep Λ) @@ -183,19 +155,11 @@ noncomputable def repLorentzGroup : Representation ℂ (SL(2,ℂ)) LeptonDoublet simp [TensorProduct.map_map, Module.End.mul_eq_comp] -/ -/-- The Lorentz action through the tensor-product value: the left-handed action on the - Weyl factor and the identity on the weak index. -/ -lemma repLorentzGroup_apply (Λ : SL(2,ℂ)) (v : LeptonDoublet) : - repLorentzGroup Λ v = valLinEquiv.symm - (TensorProduct.map (Fermion.LeftHandedWeyl.rep Λ) LinearMap.id (valLinEquiv v)) := by - obtain ⟨t, rfl⟩ := valLinEquiv.symm.surjective v - induction t using TensorProduct.induction_on with - | zero => simp [-valLinEquiv_apply] - | tmul s w => - rw [valLinEquiv_symm_tmul, repLorentzGroup, - LocalGaugeData.MatrixRep.repLorentz_apply_symm_tmul] - simp [valIdx] - | add x y hx hy => simp only [map_add, hx, hy] +/-- The Lorentz action on a pure spinor–weak tensor: the left-handed action on the Weyl + factor, the weak index untouched. -/ +lemma repLorentzGroup_tmul (Λ : SL(2,ℂ)) (s : Fermion.LeftHandedWeyl) (v : Fin 2 → ℂ) : + repLorentzGroup Λ (s ⊗ₜ v) = Fermion.LeftHandedWeyl.rep Λ s ⊗ₜ v := + LocalGaugeData.MatrixRep.repLorentz_apply_symm_tmul (LinearEquiv.refl ℂ _) _ Λ s v /-! @@ -206,9 +170,58 @@ is `star z ^ 3`; since `z` is unitary, `star z = z⁻¹`, so this represents cha The tensor and basis formulas below expose the coefficients used to compare actions and compute the kernel. + -/ -/-- The `(1, 2)_{-3}` action of the unquotiented Standard Model gauge group. -/ +/-- The `JetRing`-valued weak matrix of the jet gauge action on the lepton doublet: the + matrix of jets by which a gauge jet acts on the datum. -/ +noncomputable def doubletMatrix (U : JetGaugeGroupI) : Matrix (Fin 2) (Fin 2) JetRing := + Model.leptonDoublet.rep.mat U + +open LocalGaugeData in +/-- The weak matrix of a gauge jet is its `SU(2)` matrix carrying the `-3` hypercharge + phase `(star u) ^ 3`. -/ +lemma doubletMatrix_eq (U : JetGaugeGroupI) : + doubletMatrix U = ((star ((U.2.2 : unitary JetRing) : JetRing)) ^ 3) • + ((U.2.1 : specialUnitaryGroup (Fin 2) JetRing) : Matrix (Fin 2) (Fin 2) JetRing) := by + show MatterField.chargePow (-3) U.2.2 • U.2.1.1 = _ + congr 1 + +/-- The constant term of the weak matrix of a constant gauge jet: the `SU(2)` matrix of + the gauge transformation carrying its `-3` hypercharge phase. -/ +lemma doubletMatrix_ofConstant_map_constantCoeff (g : GaugeGroupI) : + (doubletMatrix (JetGaugeGroupI.ofConstant g)).map (constantCoeff : JetRing → ℂ) + = (star g.toU1.1 ^ 3) • g.toSU2.1 := by + 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 + rw [doubletMatrix_eq] + ext i j + simp [hu, hM] + +/-- The weak matrix of a constant gauge jet is constant. -/ +lemma doubletMatrix_ofConstant (g : GaugeGroupI) : + doubletMatrix (JetGaugeGroupI.ofConstant g) + = ((doubletMatrix (JetGaugeGroupI.ofConstant g)).map (constantCoeff : JetRing → ℂ)).map + (MvPowerSeries.C : ℂ → JetRing) := by + 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 + rw [doubletMatrix_ofConstant_map_constantCoeff, doubletMatrix_eq] + ext i j + simp [hu, hM] + +/-- The `(1, 2)_{-3}` action of the unquotiented Standard Model gauge group: the global + action the general theory derives from the datum, the constant term of the jet action. -/ +noncomputable def repGaugeGroupI : Representation ℂ GaugeGroupI LeptonDoublet := + Model.leptonDoublet.rep.repGlobal (LinearEquiv.refl ℂ LeptonDoublet) + +/- The hand-built definition, now derived from the datum: + noncomputable def repGaugeGroupI : Representation ℂ GaugeGroupI LeptonDoublet where toFun g := valLinEquiv.symm ∘ₗ (TensorProduct.map @@ -223,63 +236,46 @@ noncomputable def repGaugeGroupI : Representation ℂ GaugeGroupI LeptonDoublet ext l simp [smul_smul, mul_comm, TensorProduct.map_map, valLinEquiv_symm_apply] ring_nf +-/ + +/-- The gauge action on a pure spinor–weak tensor: the `SU(2)` matrix, scaled by the + hypercharge factor, acts on the weak index. -/ +lemma repGaugeGroupI_tmul (g : GaugeGroupI) (v : Fermion.LeftHandedWeyl) (w : Fin 2 → ℂ) : + repGaugeGroupI g (v ⊗ₜ w) = v ⊗ₜ ((star g.toU1.1 ^ 3) • g.toSU2.1).mulVec w := by + rw [← doubletMatrix_ofConstant_map_constantCoeff] + exact LocalGaugeData.MatrixRep.repGlobal_apply_symm_tmul (LinearEquiv.refl ℂ _) _ g v w -/-- The gauge action on a pure spinor–weak tensor. -/ -lemma repGaugeGroupI_tmul (g : GaugeGroupI) (v : Fermion.LeftHandedWeyl) - (w : EuclideanSpace ℂ (Fin 2)) : - repGaugeGroupI g ⟨v ⊗ₜ w⟩ = - ⟨(star g.toU1.1 ^ 3) • v ⊗ₜ (g.toSU2.1.toEuclideanLin w)⟩ := rfl - -open Fermion in -/-- Expands the gauge action in the spinor–weak basis. -/ -lemma repGaugeGroupI_tmul_basis_eq_sum (g : GaugeGroupI) (k j : Fin 2) : - repGaugeGroupI g ⟨LeftHandedWeyl.basis k ⊗ₜ[ℂ] - EuclideanSpace.basisFun (Fin 2) ℂ j⟩ = - ∑ j' : Fin 2, (star g.toU1.1 ^ 3 * g.toSU2.1 j' j) - • (⟨LeftHandedWeyl.basis k ⊗ₜ[ℂ] - EuclideanSpace.basisFun (Fin 2) ℂ j'⟩ : LeptonDoublet) := by - apply valLinEquiv.injective - apply (((LeftHandedWeyl.basis).tensorProduct - (EuclideanSpace.basisFun (Fin 2) ℂ).toBasis)).repr.injective - ext ⟨⟨k, l⟩, m⟩ - simp only [EuclideanSpace.basisFun_apply, repGaugeGroupI_tmul, valLinEquiv_apply, map_smul, - Finsupp.coe_smul, Pi.smul_apply, - Module.Basis.tensorProduct_repr_tmul_apply, OrthonormalBasis.coe_toBasis_repr_apply, - EuclideanSpace.basisFun_repr, ofLp_toLpLin, PiLp.ofLp_single, toLin'_apply, mulVec_single, - MulOpposite.op_one, col_apply, one_smul, Module.Basis.repr_self, smul_eq_mul, map_sum, - Finsupp.coe_finsetSum, Finset.sum_apply, PiLp.single_apply, ite_mul, one_mul, zero_mul, - mul_ite, mul_zero, Finset.sum_ite_eq, Finset.mem_univ, ↓reduceIte] - ring - -open Fermion in -/-- Two gauge elements induce the same action exactly when their weak-basis coefficients agree. -/ +/-- The gauge action on the lepton-doublet basis: the spinor index is inert and the weak + index transforms by the `SU(2)` matrix, scaled by the hypercharge factor. -/ +lemma repGaugeGroupI_apply_basis (g : GaugeGroupI) (j : Fin 2 × Fin 2) : + repGaugeGroupI g (basis j) = + ∑ w, (star g.toU1.1 ^ 3 * g.toSU2.1 w j.2) • basis (j.1, w) := by + obtain ⟨k, s⟩ := j + rw [basis_apply, repGaugeGroupI_tmul, Matrix.mulVec_single_one] + have hcol : ((star g.toU1.1 ^ 3) • g.toSU2.1).col s + = ∑ w, (star g.toU1.1 ^ 3 * g.toSU2.1 w s) • (Pi.single w 1 : Fin 2 → ℂ) := by + ext i + simp [Matrix.col_apply, Pi.single_apply, Finset.sum_apply] + rw [hcol, TensorProduct.tmul_sum] + refine Finset.sum_congr rfl fun w _ => ?_ + rw [basis_apply, TensorProduct.tmul_smul] + +/-- Two gauge elements induce the same action exactly when their weak-basis coefficients + agree. -/ lemma repGaugeGroupI_eq_iff_mul_eq {g₁ g₂ : GaugeGroupI} : repGaugeGroupI g₁ = repGaugeGroupI g₂ ↔ ∀ j j', star g₁.toU1.1 ^ 3 * g₁.toSU2.1 j' j = star g₂.toU1.1 ^ 3 * g₂.toSU2.1 j' j := by - let b := (LeftHandedWeyl.basis).tensorProduct - (EuclideanSpace.basisFun (Fin 2) ℂ).toBasis constructor · intro h j j' - have h' := congrFun (congrArg (fun f => f.1) h) - ⟨LeftHandedWeyl.basis 0 ⊗ₜ[ℂ] EuclideanSpace.basisFun (Fin 2) ℂ j⟩ - simp only [Fin.isValue, LinearMap.coe_toAddHom, repGaugeGroupI_tmul_basis_eq_sum] at h' - replace h' := congrArg b.repr (congrArg valLinEquiv h') - simpa [Module.Basis.tensorProduct_repr_tmul_apply, -Fin.sum_univ_two, b] using - congrArg (fun f => f (0, j')) h' + have h' : repGaugeGroupI g₁ (basis (0, j)) = repGaugeGroupI g₂ (basis (0, j)) := by rw [h] + rw [repGaugeGroupI_apply_basis, repGaugeGroupI_apply_basis] at h' + have h'' := congrArg (fun v => basis.repr v (0, j')) h' + fin_cases j' <;> simpa [Finsupp.single_apply] using h'' · intro h - apply (valLinEquiv.symm.eq_comp_toLinearMap_iff - (repGaugeGroupI g₁) (repGaugeGroupI g₂)).mp - apply b.ext - rintro ⟨k, j⟩ - have h₁ := repGaugeGroupI_tmul_basis_eq_sum g₁ k j - have h₂ := repGaugeGroupI_tmul_basis_eq_sum g₂ k j - simp only [EuclideanSpace.basisFun_apply] at h₁ h₂ - have hj₀ : (starRingEnd ℂ) g₁.toU1.1 ^ 3 * g₁.toSU2.1 0 j = - (starRingEnd ℂ) g₂.toU1.1 ^ 3 * g₂.toSU2.1 0 j := h j 0 - have hj₁ : (starRingEnd ℂ) g₁.toU1.1 ^ 3 * g₁.toSU2.1 1 j = - (starRingEnd ℂ) g₂.toU1.1 ^ 3 * g₂.toSU2.1 1 j := h j 1 - simp [valLinEquiv_symm_apply, h₁, h₂, b, hj₀, hj₁] + refine basis.ext fun ⟨k, j⟩ => ?_ + rw [repGaugeGroupI_apply_basis, repGaugeGroupI_apply_basis] + exact Finset.sum_congr rfl fun j' _ => by rw [h j j'] /-! @@ -336,9 +332,9 @@ sixth power and therefore act trivially. 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] + MonoidHom.mem_range, gaugeGroupℤ₆Hom_apply, Subtype.exists, forall_exists_index] rintro g x hx ⟨rfl⟩ + rw [mem_repGaugeGroupI_ker_iff_eq] use starRingEnd ℂ (x ^ 3) simp only [gaugeGroupℤ₆OfRoot_toSU2, gaugeGroupℤ₆SU2OfRoot_eq_mul_id, RCLike.star_def, Complex.conj_rootsOfUnity hx, Units.val_inv_eq_inv_val, inv_pow, @@ -364,23 +360,22 @@ noncomputable def repGaugeGroup : (Q : GaugeGroupQuot) → ## G. Jet gauge action -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 `(1, 2)_{-3}` representation extends to jets: 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. Both are the general theory's, for the datum. -/ -@[simp] -lemma mk_zero : (⟨0⟩ : LeptonDoublet) = 0 := rfl - -/-- 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, +/-- The `(1, 2)_{-3}` action of the jet gauge group on the jet space of the lepton +doublet: the jet action the general theory derives from the datum. -/ +noncomputable def repJetGaugeGroupI : + Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] LeptonDoublet) := + Model.leptonDoublet.toMatterField.repJet - `JetRing ⊗[ℂ] LeptonDoublet ≃ LeftHandedWeyl ⊗[ℂ] EuclideanSpace JetRing (Fin 2)`. +/- The hand-built definition, now derived from the datum: --/ +/-- Absorbs the jet ring into the weak index. -/ noncomputable def jetValLinEquiv : JetRing ⊗[ℂ] LeptonDoublet ≃ₗ[ℂ] Fermion.LeftHandedWeyl ⊗[ℂ] EuclideanSpace JetRing (Fin 2) := @@ -393,20 +388,6 @@ noncomputable def jetValLinEquiv : ((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: the jet action the general theory derives from the datum. 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 (`repJetGaugeGroupI_eq_doubletMatrix`). -/ -noncomputable def repJetGaugeGroupI : - Representation ℂ JetGaugeGroupI (JetRing ⊗[ℂ] LeptonDoublet) := - Model.leptonDoublet.rep.repJet valIdx - -/- The hand-built definition, now derived from the datum: -/-- 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 (JetRing ⊗[ℂ] LeptonDoublet) where toFun U := @@ -417,221 +398,25 @@ noncomputable def repJetGaugeGroupI : ((U.2.1 : specialUnitaryGroup (Fin 2) JetRing) : Matrix (Fin 2) (Fin 2) JetRing))).restrictScalars ℂ) ∘ₗ jetValLinEquiv.toLinearMap - map_one' := by - 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 - 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 + map_one' := … + map_mul' U₁ U₂ := … -/ -/-- The `JetRing`-valued weak matrix of the jet gauge action on the lepton doublet: the - matrix of jets by which a gauge jet acts on the datum. -/ -noncomputable def doubletMatrix (U : JetGaugeGroupI) : Matrix (Fin 2) (Fin 2) JetRing := - Model.leptonDoublet.rep.mat U - -open LocalGaugeData in -/-- The weak matrix of a gauge jet is its `SU(2)` matrix carrying the `-3` hypercharge - phase `(star u) ^ 3`. -/ -lemma doubletMatrix_eq (U : JetGaugeGroupI) : - doubletMatrix U = ((star ((U.2.2 : unitary JetRing) : JetRing)) ^ 3) • - ((U.2.1 : specialUnitaryGroup (Fin 2) JetRing) : Matrix (Fin 2) (Fin 2) JetRing) := by - show MatterField.chargePow (-3) U.2.2 • U.2.1.1 = _ - congr 1 - -/-- `jetValLinEquiv` on a scalar jet times a pure tensor. -/ -lemma jetValLinEquiv_tmul (χ : JetRing) (s : Fermion.LeftHandedWeyl) (v : Fin 2 → ℂ) : - jetValLinEquiv (χ ⊗ₜ valIdx.symm (s ⊗ₜ v)) = s ⊗ₜ WithLp.toLp 2 (fun i => v i • χ) := by - simp [jetValLinEquiv, valIdx, TensorProduct.piScalarRight_apply] - -/-- The jet identification of the datum and `jetValLinEquiv` agree on pure tensors. -/ -lemma jetEquiv_valIdx_symm_tmul (s : Fermion.LeftHandedWeyl) (y : Fin 2 → JetRing) : - (LocalGaugeData.MatrixRep.jetEquiv valIdx).symm (s ⊗ₜ y) - = jetValLinEquiv.symm (s ⊗ₜ WithLp.toLp 2 y) := by - obtain ⟨t, rfl⟩ := (TensorProduct.piScalarRight ℂ JetRing JetRing (Fin 2)).surjective y - induction t using TensorProduct.induction_on with - | zero => simp - | tmul f v => - simp [-TensorProduct.piScalarRight_apply, LocalGaugeData.MatrixRep.jetEquiv, - jetValLinEquiv, valIdx] - | add x y hx hy => simp only [map_add, WithLp.toLp_add, tmul_add, hx, hy] - -/-- The jet gauge action through `jetValLinEquiv`: the weak matrix of the gauge jet acts - `JetRing`-linearly on the weak coordinates. -/ -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)) := by - change (LocalGaugeData.MatrixRep.jetEquiv valIdx).symm - (LocalGaugeData.MatrixRep.jetEnd Fermion.LeftHandedWeyl (doubletMatrix U) - (LocalGaugeData.MatrixRep.jetEquiv valIdx z)) = _ - induction z using TensorProduct.induction_on with - | zero => simp - | tmul χ v => - obtain ⟨t, rfl⟩ := valIdx.symm.surjective v - induction t using TensorProduct.induction_on with - | zero => simp - | tmul s w => - rw [LocalGaugeData.MatrixRep.jetEquiv_tmul, LocalGaugeData.MatrixRep.jetEnd_tmul, - jetValLinEquiv_tmul, jetEquiv_valIdx_symm_tmul] - simp [Matrix.toLpLinAlgEquiv, Matrix.toLpLin_apply, TensorProduct.liftAux_tmul] - | add x y hx hy => simp only [tmul_add, map_add, hx, hy] - | add x y hx hy => simp only [map_add, hx, hy] - -/-- 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 := - Model.leptonDoublet.rep.repJet_smul valIdx U χ z - -/- The hand-built proof, now derived from the datum: -/-- **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] --/ + Model.leptonDoublet.toMatterField.repJet_smul U χ z /-- On jets of constant gauge transformations the jet action reduces to the global 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 - 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 - show jetValLinEquiv (repJetGaugeGroupI _ (d ⊗ₜ ⟨psi ⊗ₜ c⟩)) - = jetValLinEquiv (TensorProduct.map LinearMap.id (repGaugeGroupI g) (d ⊗ₜ ⟨psi ⊗ₜ c⟩)) - rw [repJetGaugeGroupI_eq_doubletMatrix, doubletMatrix_eq] - simp [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] + TensorProduct.map LinearMap.id (repGaugeGroupI g) := + Model.leptonDoublet.rep.repJet_ofConstant (LinearEquiv.refl ℂ LeptonDoublet) + doubletMatrix_ofConstant g /-! @@ -645,24 +430,15 @@ combinations below are what a component of a lepton-doublet symbol needs. -/ -/-- The lepton-doublet basis vector as an explicit spinor–weak tensor. -/ -lemma basis_eq_mk (k j : Fin 2) : basis (k, j) = - ⟨Fermion.LeftHandedWeyl.basis k ⊗ₜ[ℂ] EuclideanSpace.basisFun (Fin 2) ℂ j⟩ := by - simp only [basis, Module.Basis.map_apply, Module.Basis.tensorProduct_apply, - OrthonormalBasis.coe_toBasis] - rfl - /-- The Lorentz action on the lepton-doublet basis: the weak index is inert and the spinor index transforms by the matrix itself. -/ lemma repLorentzGroup_apply_basis (Λ : SL(2,ℂ)) (j : Fin 2 × Fin 2) : repLorentzGroup Λ (basis j) = ∑ β, Λ.1 β j.1 • basis (β, j.2) := by obtain ⟨k, w⟩ := j - simp only [basis, Module.Basis.map_apply, Module.Basis.tensorProduct_apply, - repLorentzGroup_apply, LinearEquiv.apply_symm_apply, TensorProduct.map_tmul, - Fermion.LeftHandedWeyl.rep_apply_basis, LinearMap.id_apply, TensorProduct.sum_tmul, - map_sum] - refine Finset.sum_congr rfl fun x _ => ?_ - rw [← TensorProduct.smul_tmul', map_smul] + rw [basis_apply, repLorentzGroup_tmul, Fermion.LeftHandedWeyl.rep_apply_basis, + TensorProduct.sum_tmul] + refine Finset.sum_congr rfl fun β _ => ?_ + rw [basis_apply, TensorProduct.smul_tmul'] /-- The lepton-doublet coordinate functionals transform contragrediently, by the inverse matrix. -/ @@ -700,15 +476,6 @@ lemma repLorentzGroup_conj_dual_dualBasis (Λ : SL(2,ℂ)) (j : Fin 2 × Fin 2) rw [key] simp [Fintype.sum_prod_type, ite_smul] -/-- The gauge action on the lepton-doublet basis: the spinor index is inert and the weak - index transforms by the `SU(2)` matrix, scaled by the hypercharge factor. -/ -lemma repGaugeGroupI_apply_basis (g : GaugeGroupI) (j : Fin 2 × Fin 2) : - repGaugeGroupI g (basis j) = - ∑ w, (star g.toU1.1 ^ 3 * g.toSU2.1 w j.2) • basis (j.1, w) := by - obtain ⟨k, w⟩ := j - simp only [basis_eq_mk] - exact repGaugeGroupI_tmul_basis_eq_sum g k w - /-- The lepton-doublet coordinate functionals carry the contragredient gauge action: the hypercharge and `SU(2)` factors of the inverse group element, transposed. -/ lemma repGaugeGroupI_dual_dualBasis (g : GaugeGroupI) (j : Fin 2 × Fin 2) : @@ -772,18 +539,12 @@ lemma LeptonDoublet.repGaugeGroupI_gaugeTorusGen_basis (i : Fin 4) (j : Fin 2 × = ((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] + rw [LeptonDoublet.repGaugeGroupI_apply_basis] 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) + expI_inv_eq_star, starRingEnd_expI_pow] /-- The dual action of the gauge torus on the coordinate functionals of `LeptonDoublet`: the weights are negated. -/ @@ -820,8 +581,7 @@ lemma leptonDoublet_repLorentzGroup_boostAxis_two_basis (t : ℝ) (ht : t ≠ 0) 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_apply, Module.Basis.map_apply, - Module.Basis.tensorProduct_apply, leftHandedWeyl_rep_boostAxis_two_basis] - rw [← TensorProduct.smul_tmul', map_smul] + rw [LeptonDoublet.basis_apply, LeptonDoublet.repLorentzGroup_tmul, + leftHandedWeyl_rep_boostAxis_two_basis, ← TensorProduct.smul_tmul'] end StandardModel diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean index 09e849145..50dd3a1ed 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean @@ -22,8 +22,8 @@ The infinitesimal `(1, 2)_{-3}` action of the gauge algebra on the lepton double 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. Every definition is the one the general theory -derives from the table's datum `StandardModel.Model.leptonDoublet`, transported along -`LeptonDoublet.valIdx`; the compatibility with the jet gauge action — +derives from the table's datum `StandardModel.Model.leptonDoublet`; the compatibility with +the jet gauge action — `LocalGaugeData.IsInfinitesimalActionOf` — is the generic `LocalGaugeData.MatrixRep.isInfinitesimalActionOf`. The hand-built definitions and the hand-written proof are kept in comments. @@ -63,7 +63,7 @@ open Matrix MatrixGroups the weak index, with the Weyl factor untouched. -/ noncomputable def weakEnd (A : Matrix (Fin 2) (Fin 2) ℂ) : LeptonDoublet →ₗ[ℂ] LeptonDoublet := - LocalGaugeData.MatrixRep.valEnd valIdx A + LocalGaugeData.MatrixRep.valEnd (LinearEquiv.refl ℂ LeptonDoublet) A /- The hand-built definition, now derived from the datum: @@ -76,44 +76,39 @@ noncomputable def weakEnd (A : Matrix (Fin 2) (Fin 2) ℂ) : (Matrix.toLpLinAlgEquiv 2 A) ∘ₗ valLinEquiv.toLinearMap -/ -/-- The weak endomorphism through the tensor-product value. -/ -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)) := by - obtain ⟨t, rfl⟩ := valLinEquiv.symm.surjective v - induction t using TensorProduct.induction_on with - | zero => simp [-valLinEquiv_apply] - | tmul s w => - rw [valLinEquiv_symm_tmul, weakEnd, LocalGaugeData.MatrixRep.valEnd_apply_symm_tmul] - simp [valIdx, Matrix.toLpLinAlgEquiv, Matrix.toLpLin_apply, TensorProduct.liftAux_tmul] - | add x y hx hy => simp only [map_add, hx, hy] +/-- The weak endomorphism on a pure spinor–weak tensor: the matrix acts on the weak + coordinates. -/ +lemma weakEnd_tmul (A : Matrix (Fin 2) (Fin 2) ℂ) (s : Fermion.LeftHandedWeyl) + (v : Fin 2 → ℂ) : + weakEnd A (s ⊗ₜ v) = s ⊗ₜ A.mulVec v := + LocalGaugeData.MatrixRep.valEnd_apply_symm_tmul (LinearEquiv.refl ℂ LeptonDoublet) A s v lemma weakEnd_add (A B : Matrix (Fin 2) (Fin 2) ℂ) : weakEnd (A + B) = weakEnd A + weakEnd B := - LocalGaugeData.MatrixRep.valEnd_add valIdx A B + LocalGaugeData.MatrixRep.valEnd_add (LinearEquiv.refl ℂ LeptonDoublet) A B lemma weakEnd_smul (z : ℂ) (A : Matrix (Fin 2) (Fin 2) ℂ) : weakEnd (z • A) = z • weakEnd A := - LocalGaugeData.MatrixRep.valEnd_smul valIdx z A + LocalGaugeData.MatrixRep.valEnd_smul (LinearEquiv.refl ℂ LeptonDoublet) z A -lemma weakEnd_zero : weakEnd 0 = 0 := LocalGaugeData.MatrixRep.valEnd_zero valIdx +lemma weakEnd_zero : weakEnd 0 = 0 := + LocalGaugeData.MatrixRep.valEnd_zero (LinearEquiv.refl ℂ LeptonDoublet) lemma weakEnd_neg (A : Matrix (Fin 2) (Fin 2) ℂ) : weakEnd (-A) = -weakEnd A := - LocalGaugeData.MatrixRep.valEnd_neg valIdx A + LocalGaugeData.MatrixRep.valEnd_neg (LinearEquiv.refl ℂ LeptonDoublet) A lemma weakEnd_multiset_sum (m : Multiset (Matrix (Fin 2) (Fin 2) ℂ)) : weakEnd m.sum = (m.map weakEnd).sum := - LocalGaugeData.MatrixRep.valEnd_multiset_sum valIdx m + LocalGaugeData.MatrixRep.valEnd_multiset_sum (LinearEquiv.refl ℂ LeptonDoublet) m /-- The weak endomorphisms compose through matrix multiplication. -/ lemma weakEnd_mul (A B : Matrix (Fin 2) (Fin 2) ℂ) : weakEnd (A * B) = weakEnd A ∘ₗ weakEnd B := - LocalGaugeData.MatrixRep.valEnd_mul valIdx A B + LocalGaugeData.MatrixRep.valEnd_mul (LinearEquiv.refl ℂ LeptonDoublet) A B /-- The weak endomorphism of the identity matrix is the identity. -/ -lemma weakEnd_one : weakEnd 1 = LinearMap.id := LocalGaugeData.MatrixRep.valEnd_one valIdx +lemma weakEnd_one : weakEnd 1 = LinearMap.id := + LocalGaugeData.MatrixRep.valEnd_one (LinearEquiv.refl ℂ LeptonDoublet) /- The hand-built proofs, now derived from the datum: lemma weakEnd_apply_mk (A : Matrix (Fin 2) (Fin 2) ℂ) (v : LeptonDoublet) : @@ -179,7 +174,7 @@ lemma actionMatrix_eq (c : GaugeAlgebra) : from the datum. -/ noncomputable def gaugeAlgebraAction : GaugeAlgebra →ₗ[ℝ] LeptonDoublet →ₗ[ℂ] LeptonDoublet := - Model.leptonDoublet.rep.repAlgebra valIdx + Model.leptonDoublet.toMatterField.repAlgebra /-- The gauge algebra acts by the weak endomorphism of its action matrix. -/ lemma gaugeAlgebraAction_apply (c : GaugeAlgebra) : @@ -567,7 +562,7 @@ lemma repCoeff_eq (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : GaugeAlgebraRealization.repCoeff repJetGaugeGroupI U x = weakEnd ((doubletMatrix U).map fun f => constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) := - Model.leptonDoublet.rep.repCoeff_eq valIdx U x + Model.leptonDoublet.rep.repCoeff_eq (LinearEquiv.refl ℂ LeptonDoublet) U x /- The hand-written proof, now derived from the datum: set_option maxHeartbeats 1000000 in @@ -669,9 +664,9 @@ lemma repCoeff_zero_of_eval_eq_one {U : JetGaugeGroupI} (hU : U.eval = 1) : coefficients obey the Maurer–Cartan Leibniz law and intertwine the action with the adjoint transports. This is the generic statement for the datum's matrix representation. -/ -theorem isInfinitesimalActionOf : +lemma isInfinitesimalActionOf : localGaugeData.IsInfinitesimalActionOf gaugeAlgebraAction repJetGaugeGroupI := - Model.leptonDoublet.rep.isInfinitesimalActionOf valIdx + Model.leptonDoublet.toMatterField.repAlgebra_isInfinitesimalAction /- The hand-written proof, now derived from the datum: set_option maxHeartbeats 1000000 in diff --git a/Physlib/Particles/StandardModel/Fermions/MatterField.lean b/Physlib/Particles/StandardModel/Fermions/MatterField.lean index bd03e2bf6..5d60364e3 100644 --- a/Physlib/Particles/StandardModel/Fermions/MatterField.lean +++ b/Physlib/Particles/StandardModel/Fermions/MatterField.lean @@ -73,10 +73,9 @@ namespace LeptonDoublet /-- The lepton doublet as a matter field of `StandardModel.localGaugeData`, in the `(1, 2)_{-3}` representation with its left-handed Lorentz action: the matter field the general theory - derives from the table's datum `StandardModel.Model.leptonDoublet`, on the target space - `LeptonDoublet` through `valIdx`. -/ + derives from the table's datum `StandardModel.Model.leptonDoublet`. -/ noncomputable def matterField : MatterField localGaugeData := - Model.leptonDoublet.toMatterFieldOn valIdx + Model.leptonDoublet.toMatterField /- The hand-built definition, now derived from the datum: /-- The lepton doublet as a matter field of `StandardModel.localGaugeData`, in the `(1, 2)_{-3}` diff --git a/Physlib/Particles/StandardModel/IsFermionSector/Basic.lean b/Physlib/Particles/StandardModel/IsFermionSector/Basic.lean index 5d9fa46c4..0d7dd5f3d 100644 --- a/Physlib/Particles/StandardModel/IsFermionSector/Basic.lean +++ b/Physlib/Particles/StandardModel/IsFermionSector/Basic.lean @@ -395,7 +395,7 @@ 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 +noncomputable 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) ⊔ diff --git a/Physlib/Particles/StandardModel/Model/LeptonDoublet.lean b/Physlib/Particles/StandardModel/Model/LeptonDoublet.lean index 99ad4636f..d3f9898ce 100644 --- a/Physlib/Particles/StandardModel/Model/LeptonDoublet.lean +++ b/Physlib/Particles/StandardModel/Model/LeptonDoublet.lean @@ -15,16 +15,15 @@ public import Physlib.Particles.StandardModel.Fermions.MatterField The lepton doublet of the Standard Model is the datum `StandardModel.Model.leptonDoublet`, `(.L, .singlet, .fund, -3)`, of `Physlib.Particles.StandardModel.Basic`. The species -`StandardModel.LeptonDoublet` is defined from it: its weak matrix, action matrix, Lorentz, -jet and gauge-algebra actions, and its matter field are the ones the general theory -derives from the datum, transported to the target space `LeptonDoublet` along -`LeptonDoublet.valIdx`. This file records the identities, all of which hold by -definition. +`StandardModel.LeptonDoublet` is its target space, and the species' weak matrix, action +matrix, Lorentz, global gauge, jet and gauge-algebra actions and matter field are the ones +the general theory derives from the datum. This file records the identities, all of which +hold by definition. ## ii. Key results -- `StandardModel.Model.leptonDoublet_toMatterFieldOn_eq` : on the target space - `LeptonDoublet`, the matter field of the datum is `LeptonDoublet.matterField`. +- `StandardModel.Model.leptonDoublet_toMatterField_eq` : the matter field of the datum is + `LeptonDoublet.matterField`. -/ @@ -48,11 +47,13 @@ example (U : JetGaugeGroupI) : leptonDoublet.rep.mat U = LeptonDoublet.doubletMa /-- The action matrix of the species is the action matrix of the datum. -/ example (c : GaugeAlgebra) : leptonDoublet.rep.act c = LeptonDoublet.actionMatrix c := rfl -/-- **The matter field of the datum on `LeptonDoublet` is the matter field of the - species**: the table's description and the species' description of the lepton doublet - are one definition. -/ -lemma leptonDoublet_toMatterFieldOn_eq : - leptonDoublet.toMatterFieldOn LeptonDoublet.valIdx = LeptonDoublet.matterField := rfl +/-- The target space of the species is the target space of the datum. -/ +example : LeptonDoublet = leptonDoublet.V := rfl + +/-- **The matter field of the datum is the matter field of the species**: the table's + description and the species' description of the lepton doublet are one definition. -/ +lemma leptonDoublet_toMatterField_eq : + leptonDoublet.toMatterField = LeptonDoublet.matterField := rfl end Model From bbffb2f74224527fac43aef256e010e03db5aa4d Mon Sep 17 00:00:00 2001 From: doxtor6 Date: Mon, 21 Sep 2026 06:05:35 -0400 Subject: [PATCH 341/367] feat: the mass-weight filtration and the invariants of a local field algebra MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add `GaugeFieldData.massWeightScale`, the algebra endomorphism of the local field algebra scaling each generator by `c` to its mass weight, defined through the universal property from `massWeightAssignment`; the graded pieces `massWeightSubmodule` (the common eigenspaces of eigenvalue `c ^ n`) and the filtration `massWeightSubmoduleLE`; the submodules `gaugeInvariants`, `lorentzInvariants` of elements fixed by the jet gauge group and by the Lorentz group, and `invariantsLE`, the invariants of mass weight at most `w`; and `bosonNormSq`, the contraction `φ† φ` of a bosonic species with its conjugate through a basis of its value space. With these the classification of a Lagrangian can be stated for any field datum without model-specific definitions. `FieldData.toGaugeFieldData` and `StandardModel.Model.fieldData` become abbreviations, so that the species types of the card's datum reduce where rewriting needs them. Co-authored-by: Claude Opus 4.8 --- Physlib.lean | 1 + .../LocalFieldAlgebra/MassWeight.lean | 179 ++++++++++++++++++ .../MatterField/MatrixRep/Basic.lean | 1 + .../MatterField/MatrixRep/Table.lean | 2 +- Physlib/Particles/StandardModel/Basic.lean | 2 +- 5 files changed, 183 insertions(+), 2 deletions(-) create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/MassWeight.lean diff --git a/Physlib.lean b/Physlib.lean index 4a27b7136..42b055a3e 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -48,6 +48,7 @@ public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.GaugeSe public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.Jet public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.JetRep public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.LorentzAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.MassWeight public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.Realization public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.Sector public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.SectorRealization diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/MassWeight.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/MassWeight.lean new file mode 100644 index 000000000..fd383492e --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/MassWeight.lean @@ -0,0 +1,179 @@ +/- +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.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.GaugeAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.LorentzAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.TransformsIn +public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeFieldAlgebra.MassDim +/-! + +# The mass-weight filtration and the invariants of a local field algebra + +## i. Overview + +The local field algebra of a field datum is graded by mass weight: a generator `∂_s φ_α` +of a field of mass weight `w` has weight `w + 2 |s|`, a connection generator `∂_s A_μ` has +weight `2 + 2 |s|`. The grading is recorded by the algebra endomorphisms scaling each +generator by `c` to its weight, for real `c`; the weight-`n` piece is the common +eigenspace of eigenvalue `c ^ n`, and the filtration is the join of the pieces of weight +at most `w`. + +Together with the actions of the jet gauge group and of the Lorentz group this gives the +submodule of gauge and Lorentz invariants of mass weight at most `w`, which is what a +Lagrangian classification describes. Everything here is generic: a model contributes only +its datum. + +## ii. Key results + +- `GaugeFieldData.massWeightScale` : the scaling of the local field algebra by `c` to the + mass weight of each generator. +- `GaugeFieldData.massWeightSubmodule`, `massWeightSubmoduleLE` : the graded pieces and + the filtration. +- `GaugeFieldData.gaugeInvariants`, `lorentzInvariants`, `invariantsLE` : the invariants, + and the invariants of mass weight at most `w`. +- `GaugeFieldData.bosonNormSq` : the contraction `φ† φ` of a bosonic species with its + conjugate through a basis of its value space, the simplest invariant. + +## iii. Table of contents + +- A. The mass-weight scaling +- B. The graded pieces and the filtration +- C. The invariants +- D. The contraction of a boson with its conjugate + +-/ + +@[expose] public section + +open TensorProduct Matrix MatrixGroups + +namespace GaugeFieldData + +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] [Module.Finite ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} (T : GaugeFieldData jets) + +/-! + +## A. The mass-weight scaling + +-/ + +/-- The assignment scaling each generator by `c` to its mass weight: a component function + `∂_s φ_α` of a species of mass weight `w` by `c ^ (w + 2 |s|)`, a connection generator + `∂_s A_μ` by `c ^ (2 + 2 |s|)`. The relations hold because the images are generators of + the same kind. -/ +noncomputable def massWeightAssignment (c : ℝ) : T.Assignment T.LocalFieldAlgebra where + fermion i := T.ιFermion i ∘ₗ JetComponentSpace.massWeightScale (T.fermion i).massWeight (c : ℂ) + boson j := T.ιBoson j ∘ₗ JetComponentSpace.massWeightScale (T.boson j).massWeight (c : ℂ) + connection := T.ιConnection ∘ₗ GaugeBoson.JetComponentSpace.massWeightScale 𝔤 c + fermion_mul_self i _ := ιFermion_mul_self i _ + fermion_mul_swap i j _ _ := ιFermion_mul_swap i j _ _ + boson_commute i j _ _ := ιBoson_commute i j _ _ + connection_commute _ _ := ιConnection_commute _ _ + boson_commute_connection _ _ _ := ιBoson_commute_ιConnection _ _ _ + boson_commute_fermion j i _ _ := ιBoson_commute_ιFermion j i _ _ + connection_commute_fermion _ _ _ := ιConnection_commute_ιFermion _ _ _ + +/-- **The mass-weight scaling of the local field algebra**: the algebra endomorphism + scaling each generator by `c` to its mass weight. -/ +noncomputable def massWeightScale (c : ℝ) : T.LocalFieldAlgebra →ₐ[ℂ] T.LocalFieldAlgebra := + (T.massWeightAssignment c).lift + +@[simp] +lemma massWeightScale_ιFermion (c : ℝ) (i : T.FermionSpecies) + (x : JetComponentSpace (T.fermion i)) : + T.massWeightScale c (T.ιFermion i x) + = T.ιFermion i (JetComponentSpace.massWeightScale (T.fermion i).massWeight (c : ℂ) x) := + (T.massWeightAssignment c).lift_ιFermion i x + +@[simp] +lemma massWeightScale_ιBoson (c : ℝ) (j : T.BosonSpecies) + (y : JetComponentSpace (T.boson j)) : + T.massWeightScale c (T.ιBoson j y) + = T.ιBoson j (JetComponentSpace.massWeightScale (T.boson j).massWeight (c : ℂ) y) := + (T.massWeightAssignment c).lift_ιBoson j y + +@[simp] +lemma massWeightScale_ιConnection (c : ℝ) (v : GaugeBoson.JetComponentSpace 𝔤) : + T.massWeightScale c (T.ιConnection v) + = T.ιConnection (GaugeBoson.JetComponentSpace.massWeightScale 𝔤 c v) := + (T.massWeightAssignment c).lift_ιConnection v + +/-! + +## B. The graded pieces and the filtration + +-/ + +/-- **The weight-`n` piece** of the local field algebra: the elements scaled by `c ^ n` + under every mass-weight scaling: the equaliser of the scalings and the scalars. -/ +noncomputable def massWeightSubmodule (n : ℕ) : Submodule ℂ T.LocalFieldAlgebra := + ⨅ c : ℝ, LinearMap.eqLocus (T.massWeightScale c).toLinearMap + (((c : ℂ) ^ n) • (LinearMap.id : T.LocalFieldAlgebra →ₗ[ℂ] T.LocalFieldAlgebra)) + +lemma mem_massWeightSubmodule_iff {n : ℕ} {x : T.LocalFieldAlgebra} : + x ∈ T.massWeightSubmodule n ↔ ∀ c : ℝ, T.massWeightScale c x = ((c : ℂ) ^ n) • x := by + simp only [massWeightSubmodule, Submodule.mem_iInf, LinearMap.mem_eqLocus, + AlgHom.toLinearMap_apply, LinearMap.smul_apply, LinearMap.id_apply] + +/-- **The mass-weight filtration**: the join of the pieces of weight at most `w`. -/ +noncomputable def massWeightSubmoduleLE (w : ℕ) : Submodule ℂ T.LocalFieldAlgebra := + ⨆ k ∈ Finset.range (w + 1), T.massWeightSubmodule k + +lemma massWeightSubmodule_le_massWeightSubmoduleLE {k w : ℕ} (h : k ≤ w) : + T.massWeightSubmodule k ≤ T.massWeightSubmoduleLE w := + le_iSup₂ (f := fun k _ => T.massWeightSubmodule k) k (Finset.mem_range.mpr (Nat.lt_succ_of_le h)) + +/-! + +## C. The invariants + +-/ + +/-- **The gauge invariants**: the elements fixed by every jet of gauge transformations. -/ +noncomputable def gaugeInvariants : Submodule ℂ T.LocalFieldAlgebra := + ⨅ U : GJ, LinearMap.eqLocus (T.repJet U) + (LinearMap.id : T.LocalFieldAlgebra →ₗ[ℂ] T.LocalFieldAlgebra) + +lemma mem_gaugeInvariants_iff {x : T.LocalFieldAlgebra} : + x ∈ T.gaugeInvariants ↔ ∀ U : GJ, T.repJet U x = x := by + simp only [gaugeInvariants, Submodule.mem_iInf, LinearMap.mem_eqLocus, LinearMap.id_apply] + +/-- **The Lorentz invariants**: the elements fixed by every Lorentz transformation. -/ +noncomputable def lorentzInvariants : Submodule ℂ T.LocalFieldAlgebra := + ⨅ Λ : SL(2,ℂ), LinearMap.eqLocus (T.repLorentzGroup Λ) + (LinearMap.id : T.LocalFieldAlgebra →ₗ[ℂ] T.LocalFieldAlgebra) + +lemma mem_lorentzInvariants_iff {x : T.LocalFieldAlgebra} : + x ∈ T.lorentzInvariants ↔ ∀ Λ : SL(2,ℂ), T.repLorentzGroup Λ x = x := by + simp only [lorentzInvariants, Submodule.mem_iInf, LinearMap.mem_eqLocus, LinearMap.id_apply] + +/-- **The invariants of mass weight at most `w`**: the gauge and Lorentz invariants in the + filtration. A Lagrangian of mass dimension at most `w / 2` is an element of it. -/ +noncomputable def invariantsLE (w : ℕ) : Submodule ℂ T.LocalFieldAlgebra := + T.massWeightSubmoduleLE w ⊓ (T.gaugeInvariants ⊓ T.lorentzInvariants) + +lemma mem_invariantsLE_iff {w : ℕ} {x : T.LocalFieldAlgebra} : + x ∈ T.invariantsLE w ↔ x ∈ T.massWeightSubmoduleLE w + ∧ (∀ U : GJ, T.repJet U x = x) ∧ ∀ Λ : SL(2,ℂ), T.repLorentzGroup Λ x = x := by + simp only [invariantsLE, Submodule.mem_inf, mem_gaugeInvariants_iff, mem_lorentzInvariants_iff] + +/-! + +## D. The contraction of a boson with its conjugate + +-/ + +/-- **The contraction `φ† φ`** of a bosonic species with its conjugate, through a basis of + its value space: the sum over the basis of the conjugate coordinate times the coordinate. + For a scalar in a unitary representation it is the mass term. -/ +noncomputable def bosonNormSq (j : T.BosonSpecies) {ι : Type} [Fintype ι] [DecidableEq ι] + (b : Module.Basis ι ℂ (T.BosonValue j)) : T.LocalFieldAlgebra := + ∑ i, T.conjBosonSymbol j 0 (b.conj.dualBasis i) * T.bosonSymbol j 0 (b.dualBasis i) + +end GaugeFieldData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Basic.lean index 928d5215e..6a4389b72 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Basic.lean @@ -597,6 +597,7 @@ lemma repGlobal_apply_symm_tmul (g : G₀) (s : S) (v : ι → ℂ) : = e.symm (s ⊗ₜ[ℂ] ((R.mat (jets.ofConstant g)).map (constantCoeff : JetRing → ℂ)).mulVec v) := valEnd_apply_symm_tmul e _ s v +omit [DecidableEq ι] in /-- A matrix of constant jets acts on a scalar jet times a constant vector through its constant matrix. -/ lemma map_C_mulVec_smul (B : Matrix ι ι ℂ) (v : ι → ℂ) (χ : JetRing) : diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Table.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Table.lean index 775861a85..1f063fb32 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Table.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Table.lean @@ -450,7 +450,7 @@ abbrev BosonSpecies : Type := Σ f : D.Bosons, Fin (D.generations f.1) /-- **The field content of a model**: one matter field per species, the matter field of the species' data. -/ -noncomputable def toGaugeFieldData : GaugeFieldData jets where +noncomputable abbrev toGaugeFieldData : GaugeFieldData jets where FermionSpecies := D.FermionSpecies fermion s := (D.data s.1.1).toMatterField BosonSpecies := D.BosonSpecies diff --git a/Physlib/Particles/StandardModel/Basic.lean b/Physlib/Particles/StandardModel/Basic.lean index 10b42c9c9..c4ac96720 100644 --- a/Physlib/Particles/StandardModel/Basic.lean +++ b/Physlib/Particles/StandardModel/Basic.lean @@ -130,7 +130,7 @@ def table : FieldData factors Fields /-- **The field content of the Standard Model**: the fifteen fermionic species (five fields in three generations) and the Higgs, as matter fields of `gaugeData`. -/ -noncomputable def fieldData : GaugeFieldData gaugeData := table.toGaugeFieldData +noncomputable abbrev fieldData : GaugeFieldData gaugeData := table.toGaugeFieldData /-- The Standard Model has fifteen fermionic species. -/ lemma card_fermionSpecies : Fintype.card fieldData.FermionSpecies = 15 := by decide From d37b7f3672cb51bfd0dc00901f739ec64e3fa682 Mon Sep 17 00:00:00 2001 From: doxtor6 Date: Mon, 21 Sep 2026 06:14:04 -0400 Subject: [PATCH 342/367] feat: state the Standard Model challenge at mass weight four from the card Add `Physlib/Particles/StandardModel/Challenge.lean`: the classification of the Standard Model Lagrangian in self-contained form, every notion in the statement being the card or generic. `higgsMass_mem_massWeightSubmodule` proves from the card and the generic filtration alone that the Higgs mass term `bosonNormSq H higgs.basis` has mass weight four; `invariantsLE_four`, marked `sorryful`, states the challenge at mass weight four: `fieldData.invariantsLE 4` is spanned by the constant term and the Higgs mass term. The module docstring lists the generic term constructors the statement at mass weight eight still needs. Co-authored-by: Claude Opus 4.8 --- Physlib.lean | 1 + .../Particles/StandardModel/Challenge.lean | 86 +++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 Physlib/Particles/StandardModel/Challenge.lean diff --git a/Physlib.lean b/Physlib.lean index 42b055a3e..7aa958b80 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -330,6 +330,7 @@ public import Physlib.Particles.StandardModel.AnomalyCancellation.NoGrav.One.Lem public import Physlib.Particles.StandardModel.AnomalyCancellation.NoGrav.One.LinearParameterization public import Physlib.Particles.StandardModel.AnomalyCancellation.Permutations public import Physlib.Particles.StandardModel.Basic +public import Physlib.Particles.StandardModel.Challenge public import Physlib.Particles.StandardModel.CovAlgebraRealization.Basic public import Physlib.Particles.StandardModel.CovAlgebraRealization.FermionGaugeSector.Basic public import Physlib.Particles.StandardModel.CovAlgebraRealization.FermionGaugeSector.MassWeight diff --git a/Physlib/Particles/StandardModel/Challenge.lean b/Physlib/Particles/StandardModel/Challenge.lean new file mode 100644 index 000000000..81ab49513 --- /dev/null +++ b/Physlib/Particles/StandardModel/Challenge.lean @@ -0,0 +1,86 @@ +/- +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.StandardModel.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.MassWeight +public import Physlib.Meta.Linters.Sorry +/-! + +# The Standard Model challenge + +## i. Overview + +The classification of the Standard Model Lagrangian, stated so that every notion in it is +either the card `Physlib.Particles.StandardModel.Basic` or generic: the left side is the +submodule of gauge and Lorentz invariants of mass weight at most a bound, in the local +field algebra of the card's field datum (`GaugeFieldData.invariantsLE`), and the right +side is the span of the Lagrangian terms, each built by a generic constructor from the +card's fields. The challenge is to prove the statements in this form, with no +Standard-Model-specific definition entering the statement and, eventually, none entering +the proof beyond theorems about the card. + +The classification is currently proved in `AlgebraRealization/MassWeight/Filtration.lean` +in a form whose statement uses the hand-built realization, sector and span definitions of +this folder. Bridging the two forms is the remaining work; the statements below are its +target. + +What can be stated today is the classification up to mass weight four: the constant term +and the Higgs mass term `H† H`, the latter by the generic contraction `bosonNormSq` through +the Higgs basis. The classification up to mass weight eight needs generic constructors +that do not exist yet: the kinetic term of a fermion species, the field strength squared +of each gauge factor, the covariant-derivative and box terms of a scalar, the quartic +potential, and the Yukawa term of a fermion–fermion–scalar triple. Each is a contraction +of the species' indices, one delta or epsilon per gauge factor and a Lorentz contraction, +read off the charges. + +## ii. Key results + +- `StandardModel.Model.higgsMass_mem_massWeightSubmodule` : the Higgs mass term has mass + weight four, from the card and the generic filtration alone. +- `StandardModel.Model.invariantsLE_four` : the challenge at mass weight four. + +-/ + +@[expose] public section + +open LocalGaugeData GaugeFieldData + +namespace StandardModel + +namespace Model + +/-- **The Higgs mass term `H† H` has mass weight four**: a first check that the generic + filtration computes on a term built from the card. -/ +lemma higgsMass_mem_massWeightSubmodule : + fieldData.bosonNormSq ⟨⟨.H, by decide⟩, ⟨0, by decide⟩⟩ higgs.basis + ∈ fieldData.massWeightSubmodule 4 := by + rw [mem_massWeightSubmodule_iff] + intro c + simp only [bosonNormSq, map_sum, map_mul, conjBosonSymbol, bosonSymbol, conjBosonSymbolMap, + bosonSymbolMap, LinearMap.comp_apply, TensorProduct.mk_apply, LinearMap.inl_apply, + LinearMap.inr_apply, Finset.smul_sum] + refine Finset.sum_congr rfl fun i _ => ?_ + have hw : (fieldData.boson ⟨⟨.H, by decide⟩, ⟨0, by decide⟩⟩).massWeight = 2 := rfl + rw [massWeightScale_ιBoson, massWeightScale_ιBoson, hw] + simp only [JetComponentSpace.massWeightScale, LinearMap.smul_apply, LinearMap.prodMap_apply, + TensorProduct.map_tmul, AlgHom.toLinearMap_apply, DerivAlgebraComplex.gradeScale_basis, + Multiset.card_zero, pow_zero, one_smul, LinearMap.id_apply, map_zero, map_smul, + smul_mul_smul_comm, ← pow_add] + +/-- **The challenge at mass weight four**: the gauge and Lorentz invariants of mass weight + at most four in the local field algebra of the Standard Model are spanned by the constant + term and the Higgs mass term `H† H`. -/ +@[sorryful] +theorem invariantsLE_four : + fieldData.invariantsLE 4 + = ℂ ∙ (1 : fieldData.LocalFieldAlgebra) + ⊔ ℂ ∙ fieldData.bosonNormSq ⟨⟨.H, by decide⟩, ⟨0, by decide⟩⟩ higgs.basis := by + sorry + +end Model + +end StandardModel From a166e1435c614fd6e060714767b23c5823929d71 Mon Sep 17 00:00:00 2001 From: doxtor6 Date: Mon, 21 Sep 2026 06:19:04 -0400 Subject: [PATCH 343/367] feat: state the major Standard Model results as challenges from the card MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Extend `Physlib/Particles/StandardModel/Challenge.lean` with self-contained forms of the folder's major theorems, every notion in each statement being the card or generic: `invariantsLE_seven` (no invariant of mass weight five to seven, so the invariants up to weight seven are the constant term and `H† H`); the single-sector classifications `scalarSector_invariantsLE_eight` (`1`, `H† H`, `(H† H)²`), `fermionSector_invariantsLE_eight` and `gaugeSector_invariantsLE_seven` (constants only), through the generic sector subalgebras; `repJet_ofConstant_eq_one_of_center` (a gauge transformation with components `ζ² 1₃`, `ζ³ 1₂`, `ζ` for a sixth root of unity fixes the jets of every species); and `gaugeData_free` (the gauge data of the card is free). All are marked `sorryful`; the module docstring records which results still lack the generic notions needed to state them (the full weight-eight classification, anomaly cancellation, the Higgs potential). Co-authored-by: Claude Opus 4.8 --- .../Particles/StandardModel/Challenge.lean | 140 ++++++++++++++++-- 1 file changed, 127 insertions(+), 13 deletions(-) diff --git a/Physlib/Particles/StandardModel/Challenge.lean b/Physlib/Particles/StandardModel/Challenge.lean index 81ab49513..5a2e3cfdd 100644 --- a/Physlib/Particles/StandardModel/Challenge.lean +++ b/Physlib/Particles/StandardModel/Challenge.lean @@ -7,6 +7,7 @@ module public import Physlib.Particles.StandardModel.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.MassWeight +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.Sector public import Physlib.Meta.Linters.Sorry /-! @@ -28,31 +29,63 @@ in a form whose statement uses the hand-built realization, sector and span defin this folder. Bridging the two forms is the remaining work; the statements below are its target. -What can be stated today is the classification up to mass weight four: the constant term -and the Higgs mass term `H† H`, the latter by the generic contraction `bosonNormSq` through -the Higgs basis. The classification up to mass weight eight needs generic constructors -that do not exist yet: the kinetic term of a fermion species, the field strength squared -of each gauge factor, the covariant-derivative and box terms of a scalar, the quartic -potential, and the Yukawa term of a fermion–fermion–scalar triple. Each is a contraction -of the species' indices, one delta or epsilon per gauge factor and a Lorentz contraction, -read off the charges. +What can be stated today: the classification up to mass weight seven, where the only +invariants are the constant term and the Higgs mass term `H† H`, the latter by the generic +contraction `bosonNormSq` through the Higgs basis; the classification of the single +sectors up to mass weight eight, through the generic sector subalgebras; the triviality of +the central `ℤ₆` of the gauge group on every field; and the freeness of the gauge data. +The full classification up to mass weight eight needs generic constructors that do not +exist yet: the kinetic term of a fermion species, the field strength squared of each gauge +factor, the covariant-derivative and box terms of a scalar, the quartic potential, and the +Yukawa term of a fermion–fermion–scalar triple. Each is a contraction of the species' +indices, one delta or epsilon per gauge factor and a Lorentz contraction, read off the +charges. Two further results of the folder are outside the local field algebra and need +their own generic notions: anomaly cancellation (generic anomaly coefficients of a +table) and the minimisation of the Higgs potential (a generic scalar potential of a +datum). ## ii. Key results - `StandardModel.Model.higgsMass_mem_massWeightSubmodule` : the Higgs mass term has mass weight four, from the card and the generic filtration alone. -- `StandardModel.Model.invariantsLE_four` : the challenge at mass weight four. +- `StandardModel.Model.invariantsLE_four`, `invariantsLE_seven` : the classification up + to mass weight four and seven. +- `StandardModel.Model.scalarSector_invariantsLE_eight`, + `fermionSector_invariantsLE_eight`, `gaugeSector_invariantsLE_seven` : the + single-sector classifications. +- `StandardModel.Model.repJet_ofConstant_eq_one_of_center` : the central `ℤ₆` acts + trivially on every field. +- `StandardModel.Model.gaugeData_free` : the gauge data is free. + +## iii. Table of contents + +- A. The Higgs mass term +- B. The classification below mass weight eight +- C. The single sectors +- D. The centre of the gauge group +- E. Freeness of the gauge data -/ @[expose] public section -open LocalGaugeData GaugeFieldData +open LocalGaugeData GaugeFieldData Matrix MatrixGroups namespace StandardModel namespace Model +/-! + +## A. The Higgs mass term + +-/ + +/-- The Higgs mass term `H† H`: the generic contraction of the Higgs with its conjugate + through the Higgs basis. -/ +local macro "higgsMass" : term => + `(fieldData.bosonNormSq ⟨⟨.H, by decide⟩, ⟨0, by decide⟩⟩ higgs.basis) + /-- **The Higgs mass term `H† H` has mass weight four**: a first check that the generic filtration computes on a term built from the card. -/ lemma higgsMass_mem_massWeightSubmodule : @@ -71,14 +104,95 @@ lemma higgsMass_mem_massWeightSubmodule : Multiset.card_zero, pow_zero, one_smul, LinearMap.id_apply, map_zero, map_smul, smul_mul_smul_comm, ← pow_add] +/-! + +## B. The classification below mass weight eight + +-/ + /-- **The challenge at mass weight four**: the gauge and Lorentz invariants of mass weight at most four in the local field algebra of the Standard Model are spanned by the constant term and the Higgs mass term `H† H`. -/ @[sorryful] theorem invariantsLE_four : - fieldData.invariantsLE 4 - = ℂ ∙ (1 : fieldData.LocalFieldAlgebra) - ⊔ ℂ ∙ fieldData.bosonNormSq ⟨⟨.H, by decide⟩, ⟨0, by decide⟩⟩ higgs.basis := by + fieldData.invariantsLE 4 = ℂ ∙ (1 : fieldData.LocalFieldAlgebra) ⊔ ℂ ∙ higgsMass := by + sorry + +/-- **The challenge below mass weight eight**: no invariant of mass weight five, six or + seven exists, so the invariants of mass weight at most seven are still spanned by the + constant term and the Higgs mass term. -/ +@[sorryful] +theorem invariantsLE_seven : + fieldData.invariantsLE 7 = ℂ ∙ (1 : fieldData.LocalFieldAlgebra) ⊔ ℂ ∙ higgsMass := by + sorry + +/-! + +## C. The single sectors + +The invariants built from one category of fields alone, through the generic sector +subalgebras. Without the connection no derivative of a matter field is gauge covariant, +so the scalar sector has only the powers of `H† H`, the fermion sector only the constants, +and the gauge sector nothing below the field strength squared at mass weight eight. + +-/ + +/-- **The scalar sector up to mass weight eight**: the invariants built from the Higgs + alone are spanned by `1`, `H† H` and `(H† H)²`. -/ +@[sorryful] +theorem scalarSector_invariantsLE_eight : + fieldData.invariantsLE 8 ⊓ (fieldData.SectorAlgebra {.scalar}).toSubmodule + = ℂ ∙ (1 : fieldData.LocalFieldAlgebra) ⊔ ℂ ∙ higgsMass ⊔ ℂ ∙ (higgsMass * higgsMass) := by + sorry + +/-- **The fermion sector up to mass weight eight**: the invariants built from the fermions + alone are the constants. -/ +@[sorryful] +theorem fermionSector_invariantsLE_eight : + fieldData.invariantsLE 8 ⊓ (fieldData.SectorAlgebra {.fermion}).toSubmodule + = ℂ ∙ (1 : fieldData.LocalFieldAlgebra) := by + sorry + +/-- **The gauge sector below mass weight eight**: the invariants built from the gauge + fields alone, of mass weight at most seven, are the constants. -/ +@[sorryful] +theorem gaugeSector_invariantsLE_seven : + fieldData.invariantsLE 7 ⊓ (fieldData.SectorAlgebra {.gauge}).toSubmodule + = ℂ ∙ (1 : fieldData.LocalFieldAlgebra) := by + sorry + +/-! + +## D. The centre of the gauge group + +-/ + +/-- **The central `ℤ₆` acts trivially on every field**: a gauge transformation whose + components are `ζ² 1₃`, `ζ³ 1₂` and `ζ` for a sixth root of unity `ζ` fixes the jets + of every fermionic and bosonic species, since the hypercharges are `6 Y` and every + field has `2 · (colour triality) + 3 · (isospin duality) + 6 Y ≡ 0 (mod 6)`. -/ +@[sorryful] +theorem repJet_ofConstant_eq_one_of_center (ζ : ℂ) (hζ : ζ ^ 6 = 1) (g : Factors.G₀ gauge) + (h₃ : (g.1 : specialUnitaryGroup (Fin 3) ℂ).1 = ζ ^ 2 • (1 : Matrix (Fin 3) (Fin 3) ℂ)) + (h₂ : (g.2.1 : specialUnitaryGroup (Fin 2) ℂ).1 = ζ ^ 3 • (1 : Matrix (Fin 2) (Fin 2) ℂ)) + (h₁ : (g.2.2 : unitary ℂ).1 = ζ) : + (∀ i, (fieldData.fermion i).repJet (gaugeData.ofConstant g) = 1) + ∧ ∀ j, (fieldData.boson j).repJet (gaugeData.ofConstant g) = 1 := by + sorry + +/-! + +## E. Freeness of the gauge data + +-/ + +/-- **The gauge data of the Standard Model is free**: every Taylor family of gauge algebra + elements is realised by a jet, and every jet of gauge algebra elements vanishing at the + base point is the radial Maurer–Cartan component of a pure jet. Proved by hand for the + hand-built gauge data in `GaugeGroup/MaurerCartan/Freeness.lean`; the challenge is the + generic proof, factor by factor, for `ofFactors`. -/ +@[sorryful] +theorem gaugeData_free : gaugeData.Free := by sorry end Model From a22992d9c59375286096c4400516cebe0856a340 Mon Sep 17 00:00:00 2001 From: doxtor6 Date: Mon, 21 Sep 2026 09:26:14 -0400 Subject: [PATCH 344/367] feat: transport of the mass-weight filtration and the invariants along an isomorphism Add to `GaugeFieldData` the lemmas `mem_massWeightSubmodule_apply_iff`, `massWeightSubmodule_map`, `massWeightSubmoduleLE_map`, `mem_massWeightSubmoduleLE_apply_iff`, `gaugeInvariants_map`, `lorentzInvariants_map`, `mem_invariantsLE_apply_iff` and `invariantsLE_map`: an isomorphism of the local field algebras of two field data that intertwines the jet gauge action, the Lorentz action and the mass-weight scaling carries the graded pieces, the filtration and the invariants of mass weight at most `w` of one datum onto those of the other. This is the generic half of the bridge between a model's table and a hand-built datum. Co-authored-by: Claude Opus 4.8 --- .../LocalFieldAlgebra/MassWeight.lean | 91 +++++++++++++++++++ 1 file changed, 91 insertions(+) diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/MassWeight.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/MassWeight.lean index fd383492e..c05079445 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/MassWeight.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/MassWeight.lean @@ -37,6 +37,8 @@ its datum. and the invariants of mass weight at most `w`. - `GaugeFieldData.bosonNormSq` : the contraction `φ† φ` of a bosonic species with its conjugate through a basis of its value space, the simplest invariant. +- `GaugeFieldData.invariantsLE_map` : an isomorphism of local field algebras respecting the + actions and the scaling carries the invariants of one datum onto those of the other. ## iii. Table of contents @@ -44,6 +46,7 @@ its datum. - B. The graded pieces and the filtration - C. The invariants - D. The contraction of a boson with its conjugate +- E. Transport along an isomorphism -/ @@ -176,4 +179,92 @@ noncomputable def bosonNormSq (j : T.BosonSpecies) {ι : Type} [Fintype ι] [Dec (b : Module.Basis ι ℂ (T.BosonValue j)) : T.LocalFieldAlgebra := ∑ i, T.conjBosonSymbol j 0 (b.conj.dualBasis i) * T.bosonSymbol j 0 (b.dualBasis i) +/-! + +## E. Transport along an isomorphism + +An isomorphism of local field algebras intertwining the jet gauge action, the Lorentz +action and the mass-weight scaling carries the graded pieces, the filtration and the +invariants of one datum onto those of the other. This is what relates two presentations +of the same field content, such as a model's table and a hand-built datum. + +-/ + +section Transport + +variable {T} {T' : GaugeFieldData jets} (e : T.LocalFieldAlgebra ≃ₐ[ℂ] T'.LocalFieldAlgebra) + +/-- The mass-weight scaling is respected: the weight-`n` piece is carried onto the + weight-`n` piece. -/ +lemma mem_massWeightSubmodule_apply_iff + (hscale : ∀ (c : ℝ) x, e (T.massWeightScale c x) = T'.massWeightScale c (e x)) + (n : ℕ) (x : T.LocalFieldAlgebra) : + e x ∈ T'.massWeightSubmodule n ↔ x ∈ T.massWeightSubmodule n := by + simp only [mem_massWeightSubmodule_iff, ← hscale, ← map_smul, EmbeddingLike.apply_eq_iff_eq] + +lemma massWeightSubmodule_map + (hscale : ∀ (c : ℝ) x, e (T.massWeightScale c x) = T'.massWeightScale c (e x)) (n : ℕ) : + (T.massWeightSubmodule n).map (e : T.LocalFieldAlgebra →ₗ[ℂ] T'.LocalFieldAlgebra) + = T'.massWeightSubmodule n := by + ext y + obtain ⟨x, rfl⟩ := e.surjective y + rw [Submodule.mem_map_equiv (e := e.toLinearEquiv)] + simp [mem_massWeightSubmodule_apply_iff e hscale] + +lemma massWeightSubmoduleLE_map + (hscale : ∀ (c : ℝ) x, e (T.massWeightScale c x) = T'.massWeightScale c (e x)) (w : ℕ) : + (T.massWeightSubmoduleLE w).map (e : T.LocalFieldAlgebra →ₗ[ℂ] T'.LocalFieldAlgebra) + = T'.massWeightSubmoduleLE w := by + simp only [massWeightSubmoduleLE, Submodule.map_iSup, massWeightSubmodule_map e hscale] + +/-- The gauge invariants are carried onto the gauge invariants. -/ +lemma gaugeInvariants_map (hjet : ∀ (U : GJ) x, e (T.repJet U x) = T'.repJet U (e x)) : + T.gaugeInvariants.map (e : T.LocalFieldAlgebra →ₗ[ℂ] T'.LocalFieldAlgebra) + = T'.gaugeInvariants := by + ext y + obtain ⟨x, rfl⟩ := e.surjective y + rw [Submodule.mem_map_equiv (e := e.toLinearEquiv)] + simp [mem_gaugeInvariants_iff, ← hjet] + +/-- The Lorentz invariants are carried onto the Lorentz invariants. -/ +lemma lorentzInvariants_map + (hlor : ∀ (Λ : SL(2,ℂ)) x, e (T.repLorentzGroup Λ x) = T'.repLorentzGroup Λ (e x)) : + T.lorentzInvariants.map (e : T.LocalFieldAlgebra →ₗ[ℂ] T'.LocalFieldAlgebra) + = T'.lorentzInvariants := by + ext y + obtain ⟨x, rfl⟩ := e.surjective y + rw [Submodule.mem_map_equiv (e := e.toLinearEquiv)] + simp [mem_lorentzInvariants_iff, ← hlor] + +/-- The filtration is respected, element by element. -/ +lemma mem_massWeightSubmoduleLE_apply_iff + (hscale : ∀ (c : ℝ) x, e (T.massWeightScale c x) = T'.massWeightScale c (e x)) (w : ℕ) + (x : T.LocalFieldAlgebra) : + e x ∈ T'.massWeightSubmoduleLE w ↔ x ∈ T.massWeightSubmoduleLE w := by + rw [← massWeightSubmoduleLE_map e hscale w, Submodule.mem_map_equiv (e := e.toLinearEquiv)] + simp + +/-- The invariants of mass weight at most `w` are respected, element by element. -/ +lemma mem_invariantsLE_apply_iff (hjet : ∀ (U : GJ) x, e (T.repJet U x) = T'.repJet U (e x)) + (hlor : ∀ (Λ : SL(2,ℂ)) x, e (T.repLorentzGroup Λ x) = T'.repLorentzGroup Λ (e x)) + (hscale : ∀ (c : ℝ) x, e (T.massWeightScale c x) = T'.massWeightScale c (e x)) (w : ℕ) + (x : T.LocalFieldAlgebra) : + e x ∈ T'.invariantsLE w ↔ x ∈ T.invariantsLE w := by + simp only [mem_invariantsLE_iff, mem_massWeightSubmoduleLE_apply_iff e hscale, ← hjet, ← hlor, + EmbeddingLike.apply_eq_iff_eq] + +/-- **The invariants of mass weight at most `w` are carried onto the invariants of mass + weight at most `w`** by an isomorphism respecting the two actions and the scaling. -/ +lemma invariantsLE_map (hjet : ∀ (U : GJ) x, e (T.repJet U x) = T'.repJet U (e x)) + (hlor : ∀ (Λ : SL(2,ℂ)) x, e (T.repLorentzGroup Λ x) = T'.repLorentzGroup Λ (e x)) + (hscale : ∀ (c : ℝ) x, e (T.massWeightScale c x) = T'.massWeightScale c (e x)) (w : ℕ) : + (T.invariantsLE w).map (e : T.LocalFieldAlgebra →ₗ[ℂ] T'.LocalFieldAlgebra) + = T'.invariantsLE w := by + ext y + obtain ⟨x, rfl⟩ := e.surjective y + rw [Submodule.mem_map_equiv (e := e.toLinearEquiv), mem_invariantsLE_apply_iff e hjet hlor hscale] + simp + +end Transport + end GaugeFieldData From 3342523953018dd2cd7dcfb3ac50f8f985fc4d44 Mon Sep 17 00:00:00 2001 From: doxtor6 Date: Mon, 21 Sep 2026 09:26:14 -0400 Subject: [PATCH 345/367] refactor: keep the compiled field datum a definition `FieldData.toGaugeFieldData` and `StandardModel.Model.fieldData` return to being definitions rather than abbreviations: as abbreviations every unification unfolds the datum into its tensor-algebra structure, which makes rewriting on the local field algebra time out. The one proof that needed the species type to reduce, `higgsMass_mem_massWeightSubmodule`, rewrites at default transparency instead. Co-authored-by: Claude Opus 4.8 --- .../GaugeTheory/MatterField/MatrixRep/Table.lean | 2 +- Physlib/Particles/StandardModel/Basic.lean | 2 +- Physlib/Particles/StandardModel/Challenge.lean | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Table.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Table.lean index 1f063fb32..775861a85 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Table.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Table.lean @@ -450,7 +450,7 @@ abbrev BosonSpecies : Type := Σ f : D.Bosons, Fin (D.generations f.1) /-- **The field content of a model**: one matter field per species, the matter field of the species' data. -/ -noncomputable abbrev toGaugeFieldData : GaugeFieldData jets where +noncomputable def toGaugeFieldData : GaugeFieldData jets where FermionSpecies := D.FermionSpecies fermion s := (D.data s.1.1).toMatterField BosonSpecies := D.BosonSpecies diff --git a/Physlib/Particles/StandardModel/Basic.lean b/Physlib/Particles/StandardModel/Basic.lean index c4ac96720..10b42c9c9 100644 --- a/Physlib/Particles/StandardModel/Basic.lean +++ b/Physlib/Particles/StandardModel/Basic.lean @@ -130,7 +130,7 @@ def table : FieldData factors Fields /-- **The field content of the Standard Model**: the fifteen fermionic species (five fields in three generations) and the Higgs, as matter fields of `gaugeData`. -/ -noncomputable abbrev fieldData : GaugeFieldData gaugeData := table.toGaugeFieldData +noncomputable def fieldData : GaugeFieldData gaugeData := table.toGaugeFieldData /-- The Standard Model has fifteen fermionic species. -/ lemma card_fermionSpecies : Fintype.card fieldData.FermionSpecies = 15 := by decide diff --git a/Physlib/Particles/StandardModel/Challenge.lean b/Physlib/Particles/StandardModel/Challenge.lean index 5a2e3cfdd..0b882b018 100644 --- a/Physlib/Particles/StandardModel/Challenge.lean +++ b/Physlib/Particles/StandardModel/Challenge.lean @@ -98,7 +98,7 @@ lemma higgsMass_mem_massWeightSubmodule : LinearMap.inr_apply, Finset.smul_sum] refine Finset.sum_congr rfl fun i _ => ?_ have hw : (fieldData.boson ⟨⟨.H, by decide⟩, ⟨0, by decide⟩⟩).massWeight = 2 := rfl - rw [massWeightScale_ιBoson, massWeightScale_ιBoson, hw] + erw [massWeightScale_ιBoson, massWeightScale_ιBoson, hw] simp only [JetComponentSpace.massWeightScale, LinearMap.smul_apply, LinearMap.prodMap_apply, TensorProduct.map_tmul, AlgHom.toLinearMap_apply, DerivAlgebraComplex.gradeScale_basis, Multiset.card_zero, pow_zero, one_smul, LinearMap.id_apply, map_zero, map_smul, From b2fb21f77d60a311990293a6296d989e298559ef Mon Sep 17 00:00:00 2001 From: doxtor6 Date: Mon, 21 Sep 2026 09:32:37 -0400 Subject: [PATCH 346/367] feat: relate the Standard Model challenges to the existing theorems Add `Physlib/Particles/StandardModel/Solution.lean`. For a datum `T'` over the card's gauge data and an isomorphism `e` of local field algebras respecting the jet gauge action, the Lorentz action and the mass-weight scaling, `invariantsLE_four_iff`, `invariantsLE_seven_iff`, `scalarSector_invariantsLE_eight_iff`, `fermionSector_invariantsLE_eight_iff` and `gaugeSector_invariantsLE_seven_iff` prove that each classification challenge is equivalent to the same statement on `T'`, with the Lagrangian terms carried across by `e` (`map_eq_map_iff`, `map_one_sup_span`). `gaugeData_free_of_hand_built` proves the freeness challenge from the hand-built freeness of the local gauge data. The module docstring records the second half of the bridge, identifying the generic notions on the hand-built datum with those of the existing theorems, which waits on `JetAlgebra/SectorEquiv/Basic.lean` building again. Co-authored-by: Claude Opus 4.8 --- Physlib.lean | 1 + Physlib/Particles/StandardModel/Solution.lean | 235 ++++++++++++++++++ 2 files changed, 236 insertions(+) create mode 100644 Physlib/Particles/StandardModel/Solution.lean diff --git a/Physlib.lean b/Physlib.lean index 7aa958b80..8c1e96729 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -331,6 +331,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.Challenge +public import Physlib.Particles.StandardModel.Solution public import Physlib.Particles.StandardModel.CovAlgebraRealization.Basic public import Physlib.Particles.StandardModel.CovAlgebraRealization.FermionGaugeSector.Basic public import Physlib.Particles.StandardModel.CovAlgebraRealization.FermionGaugeSector.MassWeight diff --git a/Physlib/Particles/StandardModel/Solution.lean b/Physlib/Particles/StandardModel/Solution.lean new file mode 100644 index 000000000..6e44bf473 --- /dev/null +++ b/Physlib/Particles/StandardModel/Solution.lean @@ -0,0 +1,235 @@ +/- +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.StandardModel.Challenge +public import Physlib.Particles.StandardModel.GaugeGroup.MaurerCartan.Freeness +/-! + +# The challenges and the existing theorems + +## i. Overview + +How the challenges of `Physlib.Particles.StandardModel.Challenge` relate to the theorems +already proved in this folder. The existing proofs live on the hand-built field datum +`StandardModel.fieldData` and its jet algebra `JetAlgebra := fieldData.LocalFieldAlgebra`; +the challenges live on the card's datum `StandardModel.Model.fieldData`. The bridge has +two halves. + +**First half, proved here.** Given a datum `T'` over the card's gauge data and an +isomorphism `e` of the two local field algebras respecting the jet gauge action, the +Lorentz action and the mass-weight scaling, each classification challenge is equivalent to +the same statement on `T'`, with the Lagrangian terms carried across by `e`. This is the +generic `GaugeFieldData.invariantsLE_map`. The datum meant is the hand-built one, +`StandardModel.fieldData`, whose gauge data is the card's by definition; it is kept as a +parameter here because unifying the two spellings of the gauge-data types inside `e` is +too expensive for the elaborator. The isomorphism `e` itself is the species-wise +identification of the card's target spaces with the hand-built ones (the identity for the +lepton doublet, `valLinEquiv` for the other species) assembled through the universal +property of the local field algebra; it is not yet constructed. + +**Second half, not yet buildable.** On the hand-built datum the generic notions coincide +with the ones the existing theorems use: `StandardModel.fieldData.massWeightSubmoduleLE` +with `JetAlgebra.massWeightSubmoduleLE` (defined through `JetAlgebra.massWeightPoly`), +`StandardModel.fieldData.repJet` with `JetAlgebra.repJetGaugeGroupI`, +`StandardModel.fieldData.repLorentzGroup` with `JetAlgebra.repLorentzGroup`, and `e` of the +Higgs mass term with the generator of `isHiggsSector.dotSpan 0 0`. With these, the +challenge at mass weight four is +`CovAlgebraRealization.mem_massWeightSubmodule_four_sup_and_gauge_lorentz_invariant_iff_higgsMass` +for the identity realization and `S = ⊥`, the one at mass weight seven follows from +`mem_massWeightSubmodule_sup_and_gauge_lorentz_invariant_iff` with `standardModelSpan_eq_bot`, +and the sector challenges from the sector files. These identifications cannot be stated +here until `JetAlgebra/SectorEquiv/Basic.lean`, which `JetAlgebra/Basic.lean` imports, +builds again. + +**Freeness** needs no bridge: the gauge data of the card is the hand-built one by +definition, so `instFreeLocalGaugeData` proves `gaugeData_free` outright. The centre +challenge is stated on the card's species and is proved by computing the matrix of each +charge tuple at a constant jet; it does not go through the hand-built species files. + +## ii. Key results + +- `StandardModel.Model.invariantsLE_four_iff`, `invariantsLE_seven_iff`, + `scalarSector_invariantsLE_eight_iff`, `fermionSector_invariantsLE_eight_iff`, + `gaugeSector_invariantsLE_seven_iff` : each classification challenge is equivalent to + its form on another datum over the card's gauge data, given the isomorphism. +- `StandardModel.Model.gaugeData_free_of_hand_built` : the freeness challenge, from the + hand-built proof. + +-/ + +@[expose] public section + +set_option maxHeartbeats 2000000 + +open LocalGaugeData GaugeFieldData Matrix MatrixGroups + +namespace StandardModel + +namespace Model + +/-- The Higgs mass term `H† H` of the card. -/ +local macro "higgsMass" : term => + `(fieldData.bosonNormSq ⟨⟨.H, by decide⟩, ⟨0, by decide⟩⟩ higgs.basis) + +/-! + +## A. The classification challenges, transported to the hand-built datum + +-/ + +section Transport + +variable {T' : GaugeFieldData gaugeData} + (e : fieldData.LocalFieldAlgebra ≃ₐ[ℂ] T'.LocalFieldAlgebra) + (hjet : ∀ (U : Factors.G gauge) x, e (fieldData.repJet U x) = T'.repJet U (e x)) + (hlor : ∀ (Λ : SL(2,ℂ)) x, e (fieldData.repLorentzGroup Λ x) = T'.repLorentzGroup Λ (e x)) + (hscale : ∀ (c : ℝ) x, e (fieldData.massWeightScale c x) = T'.massWeightScale c (e x)) + +include hjet hlor hscale in +/-- Equality of a transported submodule with a transported right-hand side reduces to + equality before transport. -/ +lemma map_eq_map_iff (p q : Submodule ℂ fieldData.LocalFieldAlgebra) : + p.map (e : fieldData.LocalFieldAlgebra →ₗ[ℂ] T'.LocalFieldAlgebra) + = q.map (e : fieldData.LocalFieldAlgebra →ₗ[ℂ] T'.LocalFieldAlgebra) + ↔ p = q := + (Submodule.map_injective_of_injective (f := (e : fieldData.LocalFieldAlgebra →ₗ[ℂ] + T'.LocalFieldAlgebra)) e.injective).eq_iff + +/-- The span of the constant term and a term is carried onto the span of the constant term + and the transported term. -/ +lemma map_one_sup_span (x : fieldData.LocalFieldAlgebra) : + (ℂ ∙ (1 : fieldData.LocalFieldAlgebra) ⊔ ℂ ∙ x).map + (e : fieldData.LocalFieldAlgebra →ₗ[ℂ] T'.LocalFieldAlgebra) + = ℂ ∙ (1 : T'.LocalFieldAlgebra) ⊔ ℂ ∙ e x := by + simp only [Submodule.map_sup, Submodule.map_span, Set.image_singleton, + AlgEquiv.toLinearMap_apply, map_one] + +include hjet hlor hscale in +/-- **The challenge at mass weight four, on another datum**: given the isomorphism, + it is equivalent to the same statement with the Higgs mass term carried across. -/ +theorem invariantsLE_four_iff : + (fieldData.invariantsLE 4 = ℂ ∙ (1 : fieldData.LocalFieldAlgebra) ⊔ ℂ ∙ higgsMass) + ↔ (T'.invariantsLE 4 + = ℂ ∙ (1 : T'.LocalFieldAlgebra) ⊔ ℂ ∙ e higgsMass) := by + have hmap := invariantsLE_map e hjet hlor hscale 4 + have hspan := map_one_sup_span e higgsMass + exact ⟨fun h => hmap.symm.trans ((congrArg (Submodule.map _) h).trans hspan), + fun h => (map_eq_map_iff e hjet hlor hscale _ _).1 (hmap.trans (h.trans hspan.symm))⟩ + +include hjet hlor hscale in +/-- **The challenge at mass weight seven, on the hand-built datum.** -/ +theorem invariantsLE_seven_iff : + (fieldData.invariantsLE 7 = ℂ ∙ (1 : fieldData.LocalFieldAlgebra) ⊔ ℂ ∙ higgsMass) + ↔ (T'.invariantsLE 7 + = ℂ ∙ (1 : T'.LocalFieldAlgebra) ⊔ ℂ ∙ e higgsMass) := by + have hmap := invariantsLE_map e hjet hlor hscale 7 + have hspan := map_one_sup_span e higgsMass + exact ⟨fun h => hmap.symm.trans ((congrArg (Submodule.map _) h).trans hspan), + fun h => (map_eq_map_iff e hjet hlor hscale _ _).1 (hmap.trans (h.trans hspan.symm))⟩ + +include hjet hlor hscale in +/-- **The scalar-sector challenge, on another datum**: given that the isomorphism + also carries the scalar sector onto the scalar sector. -/ +theorem scalarSector_invariantsLE_eight_iff + (hsec : (fieldData.SectorAlgebra {.scalar}).toSubmodule.map + (e : fieldData.LocalFieldAlgebra →ₗ[ℂ] T'.LocalFieldAlgebra) + = (T'.SectorAlgebra {.scalar}).toSubmodule) : + (fieldData.invariantsLE 8 ⊓ (fieldData.SectorAlgebra {.scalar}).toSubmodule + = ℂ ∙ (1 : fieldData.LocalFieldAlgebra) ⊔ ℂ ∙ higgsMass ⊔ ℂ ∙ (higgsMass * higgsMass)) + ↔ (T'.invariantsLE 8 + ⊓ (T'.SectorAlgebra {.scalar}).toSubmodule + = ℂ ∙ (1 : T'.LocalFieldAlgebra) ⊔ ℂ ∙ e higgsMass + ⊔ ℂ ∙ (e higgsMass * e higgsMass)) := by + have hinj : Function.Injective + (e : fieldData.LocalFieldAlgebra →ₗ[ℂ] T'.LocalFieldAlgebra) := + e.injective + have hmap : (fieldData.invariantsLE 8 ⊓ (fieldData.SectorAlgebra {.scalar}).toSubmodule).map + (e : fieldData.LocalFieldAlgebra →ₗ[ℂ] T'.LocalFieldAlgebra) + = T'.invariantsLE 8 + ⊓ (T'.SectorAlgebra {.scalar}).toSubmodule := + (Submodule.map_inf _ hinj).trans + (congrArg₂ (· ⊓ ·) (invariantsLE_map e hjet hlor hscale 8) hsec) + have hspan : (ℂ ∙ (1 : fieldData.LocalFieldAlgebra) ⊔ ℂ ∙ higgsMass + ⊔ ℂ ∙ (higgsMass * higgsMass)).map + (e : fieldData.LocalFieldAlgebra →ₗ[ℂ] T'.LocalFieldAlgebra) + = ℂ ∙ (1 : T'.LocalFieldAlgebra) ⊔ ℂ ∙ e higgsMass + ⊔ ℂ ∙ (e higgsMass * e higgsMass) := by + simp only [Submodule.map_sup, Submodule.map_span, Set.image_singleton, + AlgEquiv.toLinearMap_apply, map_one, map_mul] + exact ⟨fun h => hmap.symm.trans ((congrArg (Submodule.map _) h).trans hspan), + fun h => (map_eq_map_iff e hjet hlor hscale _ _).1 (hmap.trans (h.trans hspan.symm))⟩ + +include hjet hlor hscale in +/-- **The fermion-sector challenge, on the hand-built datum.** -/ +theorem fermionSector_invariantsLE_eight_iff + (hsec : (fieldData.SectorAlgebra {.fermion}).toSubmodule.map + (e : fieldData.LocalFieldAlgebra →ₗ[ℂ] T'.LocalFieldAlgebra) + = (T'.SectorAlgebra {.fermion}).toSubmodule) : + (fieldData.invariantsLE 8 ⊓ (fieldData.SectorAlgebra {.fermion}).toSubmodule + = ℂ ∙ (1 : fieldData.LocalFieldAlgebra)) + ↔ (T'.invariantsLE 8 + ⊓ (T'.SectorAlgebra {.fermion}).toSubmodule + = ℂ ∙ (1 : T'.LocalFieldAlgebra)) := by + have hinj : Function.Injective + (e : fieldData.LocalFieldAlgebra →ₗ[ℂ] T'.LocalFieldAlgebra) := + e.injective + have hmap : (fieldData.invariantsLE 8 ⊓ (fieldData.SectorAlgebra {.fermion}).toSubmodule).map + (e : fieldData.LocalFieldAlgebra →ₗ[ℂ] T'.LocalFieldAlgebra) + = T'.invariantsLE 8 + ⊓ (T'.SectorAlgebra {.fermion}).toSubmodule := + (Submodule.map_inf _ hinj).trans + (congrArg₂ (· ⊓ ·) (invariantsLE_map e hjet hlor hscale 8) hsec) + have hspan : (ℂ ∙ (1 : fieldData.LocalFieldAlgebra)).map + (e : fieldData.LocalFieldAlgebra →ₗ[ℂ] T'.LocalFieldAlgebra) + = ℂ ∙ (1 : T'.LocalFieldAlgebra) := by + simp only [Submodule.map_span, Set.image_singleton, AlgEquiv.toLinearMap_apply, map_one] + exact ⟨fun h => hmap.symm.trans ((congrArg (Submodule.map _) h).trans hspan), + fun h => (map_eq_map_iff e hjet hlor hscale _ _).1 (hmap.trans (h.trans hspan.symm))⟩ + +include hjet hlor hscale in +/-- **The gauge-sector challenge, on the hand-built datum.** -/ +theorem gaugeSector_invariantsLE_seven_iff + (hsec : (fieldData.SectorAlgebra {.gauge}).toSubmodule.map + (e : fieldData.LocalFieldAlgebra →ₗ[ℂ] T'.LocalFieldAlgebra) + = (T'.SectorAlgebra {.gauge}).toSubmodule) : + (fieldData.invariantsLE 7 ⊓ (fieldData.SectorAlgebra {.gauge}).toSubmodule + = ℂ ∙ (1 : fieldData.LocalFieldAlgebra)) + ↔ (T'.invariantsLE 7 + ⊓ (T'.SectorAlgebra {.gauge}).toSubmodule + = ℂ ∙ (1 : T'.LocalFieldAlgebra)) := by + have hinj : Function.Injective + (e : fieldData.LocalFieldAlgebra →ₗ[ℂ] T'.LocalFieldAlgebra) := + e.injective + have hmap : (fieldData.invariantsLE 7 ⊓ (fieldData.SectorAlgebra {.gauge}).toSubmodule).map + (e : fieldData.LocalFieldAlgebra →ₗ[ℂ] T'.LocalFieldAlgebra) + = T'.invariantsLE 7 + ⊓ (T'.SectorAlgebra {.gauge}).toSubmodule := + (Submodule.map_inf _ hinj).trans + (congrArg₂ (· ⊓ ·) (invariantsLE_map e hjet hlor hscale 7) hsec) + have hspan : (ℂ ∙ (1 : fieldData.LocalFieldAlgebra)).map + (e : fieldData.LocalFieldAlgebra →ₗ[ℂ] T'.LocalFieldAlgebra) + = ℂ ∙ (1 : T'.LocalFieldAlgebra) := by + simp only [Submodule.map_span, Set.image_singleton, AlgEquiv.toLinearMap_apply, map_one] + exact ⟨fun h => hmap.symm.trans ((congrArg (Submodule.map _) h).trans hspan), + fun h => (map_eq_map_iff e hjet hlor hscale _ _).1 (hmap.trans (h.trans hspan.symm))⟩ + +end Transport + +/-! + +## B. Freeness, from the hand-built proof + +-/ + +/-- **The freeness challenge holds**: the gauge data of the card is the hand-built local + gauge data by definition, whose freeness is proved factor by factor in + `GaugeGroup/MaurerCartan/Freeness.lean`. -/ +theorem gaugeData_free_of_hand_built : gaugeData.Free := instFreeLocalGaugeData + +end Model + +end StandardModel From 454c018c3e57464e51d7aeb82dbdd21c80954498 Mon Sep 17 00:00:00 2001 From: doxtor6 Date: Mon, 21 Sep 2026 09:37:36 -0400 Subject: [PATCH 347/367] refactor: state the Standard Model challenges element by element The classification challenges of `Challenge.lean` are restated as the existing theorems are: an element of the mass-weight filtration fixed by every jet of gauge transformations and by every Lorentz transformation is exactly a combination of the named terms, with the sector ones adding membership of the sector subalgebra. `GaugeFieldData.invariantsLE_eq_iff` and `invariantsLE_inf_eq_iff` relate this form to the submodule `invariantsLE`, and the equivalences of `Solution.lean` are restated in the same form. Co-authored-by: Claude Opus 4.8 --- .../LocalFieldAlgebra/MassWeight.lean | 17 ++++ .../Particles/StandardModel/Challenge.lean | 67 ++++++++++------ Physlib/Particles/StandardModel/Solution.lean | 80 ++++++++++++++----- 3 files changed, 118 insertions(+), 46 deletions(-) diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/MassWeight.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/MassWeight.lean index c05079445..3f8567040 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/MassWeight.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/MassWeight.lean @@ -166,6 +166,23 @@ lemma mem_invariantsLE_iff {w : ℕ} {x : T.LocalFieldAlgebra} : ∧ (∀ U : GJ, T.repJet U x = x) ∧ ∀ Λ : SL(2,ℂ), T.repLorentzGroup Λ x = x := by simp only [invariantsLE, Submodule.mem_inf, mem_gaugeInvariants_iff, mem_lorentzInvariants_iff] +/-- A description of the invariants of mass weight at most `w`, element by element: an + element of the filtration fixed by both groups is exactly an element of `Q`. -/ +lemma invariantsLE_eq_iff (w : ℕ) (Q : Submodule ℂ T.LocalFieldAlgebra) : + T.invariantsLE w = Q ↔ ∀ x : T.LocalFieldAlgebra, + (x ∈ T.massWeightSubmoduleLE w ∧ (∀ U : GJ, T.repJet U x = x) + ∧ ∀ Λ : SL(2,ℂ), T.repLorentzGroup Λ x = x) ↔ x ∈ Q := by + simp only [SetLike.ext_iff, mem_invariantsLE_iff] + +/-- A description of the invariants of mass weight at most `w` lying in a submodule `A`, + element by element. -/ +lemma invariantsLE_inf_eq_iff (w : ℕ) (A Q : Submodule ℂ T.LocalFieldAlgebra) : + T.invariantsLE w ⊓ A = Q ↔ ∀ x : T.LocalFieldAlgebra, + (x ∈ T.massWeightSubmoduleLE w ∧ x ∈ A ∧ (∀ U : GJ, T.repJet U x = x) + ∧ ∀ Λ : SL(2,ℂ), T.repLorentzGroup Λ x = x) ↔ x ∈ Q := by + simp only [SetLike.ext_iff, Submodule.mem_inf, mem_invariantsLE_iff] + exact forall_congr' fun x => by tauto + /-! ## D. The contraction of a boson with its conjugate diff --git a/Physlib/Particles/StandardModel/Challenge.lean b/Physlib/Particles/StandardModel/Challenge.lean index 0b882b018..8a994ad45 100644 --- a/Physlib/Particles/StandardModel/Challenge.lean +++ b/Physlib/Particles/StandardModel/Challenge.lean @@ -24,6 +24,10 @@ card's fields. The challenge is to prove the statements in this form, with no Standard-Model-specific definition entering the statement and, eventually, none entering the proof beyond theorems about the card. +Each classification is stated element by element, as the existing theorems are: an element +of the filtration `massWeightSubmoduleLE w` fixed by every jet of gauge transformations and +by every Lorentz transformation is exactly a combination of the named terms. + The classification is currently proved in `AlgebraRealization/MassWeight/Filtration.lean` in a form whose statement uses the hand-built realization, sector and span definitions of this folder. Bridging the two forms is the remaining work; the statements below are its @@ -110,20 +114,27 @@ lemma higgsMass_mem_massWeightSubmodule : -/ -/-- **The challenge at mass weight four**: the gauge and Lorentz invariants of mass weight - at most four in the local field algebra of the Standard Model are spanned by the constant - term and the Higgs mass term `H† H`. -/ +/-- **The challenge at mass weight four**: an element of the local field algebra of the + Standard Model of mass weight at most four is fixed by every jet of gauge transformations + and by every Lorentz transformation exactly when it is a combination of the constant term + and the Higgs mass term `H† H`. -/ @[sorryful] -theorem invariantsLE_four : - fieldData.invariantsLE 4 = ℂ ∙ (1 : fieldData.LocalFieldAlgebra) ⊔ ℂ ∙ higgsMass := by +theorem invariantsLE_four (x : fieldData.LocalFieldAlgebra) : + (x ∈ fieldData.massWeightSubmoduleLE 4 + ∧ (∀ U : Factors.G gauge, fieldData.repJet U x = x) + ∧ ∀ Λ : SL(2,ℂ), fieldData.repLorentzGroup Λ x = x) + ↔ x ∈ ℂ ∙ (1 : fieldData.LocalFieldAlgebra) ⊔ ℂ ∙ higgsMass := by sorry /-- **The challenge below mass weight eight**: no invariant of mass weight five, six or - seven exists, so the invariants of mass weight at most seven are still spanned by the - constant term and the Higgs mass term. -/ + seven exists, so an element of mass weight at most seven fixed by both groups is still a + combination of the constant term and the Higgs mass term. -/ @[sorryful] -theorem invariantsLE_seven : - fieldData.invariantsLE 7 = ℂ ∙ (1 : fieldData.LocalFieldAlgebra) ⊔ ℂ ∙ higgsMass := by +theorem invariantsLE_seven (x : fieldData.LocalFieldAlgebra) : + (x ∈ fieldData.massWeightSubmoduleLE 7 + ∧ (∀ U : Factors.G gauge, fieldData.repJet U x = x) + ∧ ∀ Λ : SL(2,ℂ), fieldData.repLorentzGroup Λ x = x) + ↔ x ∈ ℂ ∙ (1 : fieldData.LocalFieldAlgebra) ⊔ ℂ ∙ higgsMass := by sorry /-! @@ -137,28 +148,36 @@ and the gauge sector nothing below the field strength squared at mass weight eig -/ -/-- **The scalar sector up to mass weight eight**: the invariants built from the Higgs - alone are spanned by `1`, `H† H` and `(H† H)²`. -/ +/-- **The scalar sector up to mass weight eight**: an element built from the Higgs alone, + of mass weight at most eight and fixed by both groups, is a combination of `1`, `H† H` + and `(H† H)²`. -/ @[sorryful] -theorem scalarSector_invariantsLE_eight : - fieldData.invariantsLE 8 ⊓ (fieldData.SectorAlgebra {.scalar}).toSubmodule - = ℂ ∙ (1 : fieldData.LocalFieldAlgebra) ⊔ ℂ ∙ higgsMass ⊔ ℂ ∙ (higgsMass * higgsMass) := by +theorem scalarSector_invariantsLE_eight (x : fieldData.LocalFieldAlgebra) : + (x ∈ fieldData.massWeightSubmoduleLE 8 ∧ x ∈ fieldData.SectorAlgebra {.scalar} + ∧ (∀ U : Factors.G gauge, fieldData.repJet U x = x) + ∧ ∀ Λ : SL(2,ℂ), fieldData.repLorentzGroup Λ x = x) + ↔ x ∈ ℂ ∙ (1 : fieldData.LocalFieldAlgebra) ⊔ ℂ ∙ higgsMass + ⊔ ℂ ∙ (higgsMass * higgsMass) := by sorry -/-- **The fermion sector up to mass weight eight**: the invariants built from the fermions - alone are the constants. -/ +/-- **The fermion sector up to mass weight eight**: an element built from the fermions + alone, of mass weight at most eight and fixed by both groups, is a constant. -/ @[sorryful] -theorem fermionSector_invariantsLE_eight : - fieldData.invariantsLE 8 ⊓ (fieldData.SectorAlgebra {.fermion}).toSubmodule - = ℂ ∙ (1 : fieldData.LocalFieldAlgebra) := by +theorem fermionSector_invariantsLE_eight (x : fieldData.LocalFieldAlgebra) : + (x ∈ fieldData.massWeightSubmoduleLE 8 ∧ x ∈ fieldData.SectorAlgebra {.fermion} + ∧ (∀ U : Factors.G gauge, fieldData.repJet U x = x) + ∧ ∀ Λ : SL(2,ℂ), fieldData.repLorentzGroup Λ x = x) + ↔ x ∈ ℂ ∙ (1 : fieldData.LocalFieldAlgebra) := by sorry -/-- **The gauge sector below mass weight eight**: the invariants built from the gauge - fields alone, of mass weight at most seven, are the constants. -/ +/-- **The gauge sector below mass weight eight**: an element built from the gauge fields + alone, of mass weight at most seven and fixed by both groups, is a constant. -/ @[sorryful] -theorem gaugeSector_invariantsLE_seven : - fieldData.invariantsLE 7 ⊓ (fieldData.SectorAlgebra {.gauge}).toSubmodule - = ℂ ∙ (1 : fieldData.LocalFieldAlgebra) := by +theorem gaugeSector_invariantsLE_seven (x : fieldData.LocalFieldAlgebra) : + (x ∈ fieldData.massWeightSubmoduleLE 7 ∧ x ∈ fieldData.SectorAlgebra {.gauge} + ∧ (∀ U : Factors.G gauge, fieldData.repJet U x = x) + ∧ ∀ Λ : SL(2,ℂ), fieldData.repLorentzGroup Λ x = x) + ↔ x ∈ ℂ ∙ (1 : fieldData.LocalFieldAlgebra) := by sorry /-! diff --git a/Physlib/Particles/StandardModel/Solution.lean b/Physlib/Particles/StandardModel/Solution.lean index 6e44bf473..7afdf7b94 100644 --- a/Physlib/Particles/StandardModel/Solution.lean +++ b/Physlib/Particles/StandardModel/Solution.lean @@ -112,9 +112,16 @@ include hjet hlor hscale in /-- **The challenge at mass weight four, on another datum**: given the isomorphism, it is equivalent to the same statement with the Higgs mass term carried across. -/ theorem invariantsLE_four_iff : - (fieldData.invariantsLE 4 = ℂ ∙ (1 : fieldData.LocalFieldAlgebra) ⊔ ℂ ∙ higgsMass) - ↔ (T'.invariantsLE 4 - = ℂ ∙ (1 : T'.LocalFieldAlgebra) ⊔ ℂ ∙ e higgsMass) := by + (∀ x : fieldData.LocalFieldAlgebra, + (x ∈ fieldData.massWeightSubmoduleLE 4 + ∧ (∀ U : Factors.G gauge, fieldData.repJet U x = x) + ∧ ∀ Λ : SL(2,ℂ), fieldData.repLorentzGroup Λ x = x) + ↔ x ∈ ℂ ∙ (1 : fieldData.LocalFieldAlgebra) ⊔ ℂ ∙ higgsMass) + ↔ ∀ y : T'.LocalFieldAlgebra, + (y ∈ T'.massWeightSubmoduleLE 4 ∧ (∀ U : Factors.G gauge, T'.repJet U y = y) + ∧ ∀ Λ : SL(2,ℂ), T'.repLorentzGroup Λ y = y) + ↔ y ∈ ℂ ∙ (1 : T'.LocalFieldAlgebra) ⊔ ℂ ∙ e higgsMass := by + rw [← invariantsLE_eq_iff, ← invariantsLE_eq_iff] have hmap := invariantsLE_map e hjet hlor hscale 4 have hspan := map_one_sup_span e higgsMass exact ⟨fun h => hmap.symm.trans ((congrArg (Submodule.map _) h).trans hspan), @@ -123,9 +130,16 @@ theorem invariantsLE_four_iff : include hjet hlor hscale in /-- **The challenge at mass weight seven, on the hand-built datum.** -/ theorem invariantsLE_seven_iff : - (fieldData.invariantsLE 7 = ℂ ∙ (1 : fieldData.LocalFieldAlgebra) ⊔ ℂ ∙ higgsMass) - ↔ (T'.invariantsLE 7 - = ℂ ∙ (1 : T'.LocalFieldAlgebra) ⊔ ℂ ∙ e higgsMass) := by + (∀ x : fieldData.LocalFieldAlgebra, + (x ∈ fieldData.massWeightSubmoduleLE 7 + ∧ (∀ U : Factors.G gauge, fieldData.repJet U x = x) + ∧ ∀ Λ : SL(2,ℂ), fieldData.repLorentzGroup Λ x = x) + ↔ x ∈ ℂ ∙ (1 : fieldData.LocalFieldAlgebra) ⊔ ℂ ∙ higgsMass) + ↔ ∀ y : T'.LocalFieldAlgebra, + (y ∈ T'.massWeightSubmoduleLE 7 ∧ (∀ U : Factors.G gauge, T'.repJet U y = y) + ∧ ∀ Λ : SL(2,ℂ), T'.repLorentzGroup Λ y = y) + ↔ y ∈ ℂ ∙ (1 : T'.LocalFieldAlgebra) ⊔ ℂ ∙ e higgsMass := by + rw [← invariantsLE_eq_iff, ← invariantsLE_eq_iff] have hmap := invariantsLE_map e hjet hlor hscale 7 have hspan := map_one_sup_span e higgsMass exact ⟨fun h => hmap.symm.trans ((congrArg (Submodule.map _) h).trans hspan), @@ -138,12 +152,20 @@ theorem scalarSector_invariantsLE_eight_iff (hsec : (fieldData.SectorAlgebra {.scalar}).toSubmodule.map (e : fieldData.LocalFieldAlgebra →ₗ[ℂ] T'.LocalFieldAlgebra) = (T'.SectorAlgebra {.scalar}).toSubmodule) : - (fieldData.invariantsLE 8 ⊓ (fieldData.SectorAlgebra {.scalar}).toSubmodule - = ℂ ∙ (1 : fieldData.LocalFieldAlgebra) ⊔ ℂ ∙ higgsMass ⊔ ℂ ∙ (higgsMass * higgsMass)) - ↔ (T'.invariantsLE 8 - ⊓ (T'.SectorAlgebra {.scalar}).toSubmodule - = ℂ ∙ (1 : T'.LocalFieldAlgebra) ⊔ ℂ ∙ e higgsMass - ⊔ ℂ ∙ (e higgsMass * e higgsMass)) := by + (∀ x : fieldData.LocalFieldAlgebra, + (x ∈ fieldData.massWeightSubmoduleLE 8 ∧ x ∈ fieldData.SectorAlgebra {.scalar} + ∧ (∀ U : Factors.G gauge, fieldData.repJet U x = x) + ∧ ∀ Λ : SL(2,ℂ), fieldData.repLorentzGroup Λ x = x) + ↔ x ∈ ℂ ∙ (1 : fieldData.LocalFieldAlgebra) ⊔ ℂ ∙ higgsMass + ⊔ ℂ ∙ (higgsMass * higgsMass)) + ↔ ∀ y : T'.LocalFieldAlgebra, + (y ∈ T'.massWeightSubmoduleLE 8 ∧ y ∈ T'.SectorAlgebra {.scalar} + ∧ (∀ U : Factors.G gauge, T'.repJet U y = y) + ∧ ∀ Λ : SL(2,ℂ), T'.repLorentzGroup Λ y = y) + ↔ y ∈ ℂ ∙ (1 : T'.LocalFieldAlgebra) ⊔ ℂ ∙ e higgsMass + ⊔ ℂ ∙ (e higgsMass * e higgsMass) := by + simp only [← Subalgebra.mem_toSubmodule] + rw [← invariantsLE_inf_eq_iff, ← invariantsLE_inf_eq_iff] have hinj : Function.Injective (e : fieldData.LocalFieldAlgebra →ₗ[ℂ] T'.LocalFieldAlgebra) := e.injective @@ -169,11 +191,18 @@ theorem fermionSector_invariantsLE_eight_iff (hsec : (fieldData.SectorAlgebra {.fermion}).toSubmodule.map (e : fieldData.LocalFieldAlgebra →ₗ[ℂ] T'.LocalFieldAlgebra) = (T'.SectorAlgebra {.fermion}).toSubmodule) : - (fieldData.invariantsLE 8 ⊓ (fieldData.SectorAlgebra {.fermion}).toSubmodule - = ℂ ∙ (1 : fieldData.LocalFieldAlgebra)) - ↔ (T'.invariantsLE 8 - ⊓ (T'.SectorAlgebra {.fermion}).toSubmodule - = ℂ ∙ (1 : T'.LocalFieldAlgebra)) := by + (∀ x : fieldData.LocalFieldAlgebra, + (x ∈ fieldData.massWeightSubmoduleLE 8 ∧ x ∈ fieldData.SectorAlgebra {.fermion} + ∧ (∀ U : Factors.G gauge, fieldData.repJet U x = x) + ∧ ∀ Λ : SL(2,ℂ), fieldData.repLorentzGroup Λ x = x) + ↔ x ∈ ℂ ∙ (1 : fieldData.LocalFieldAlgebra)) + ↔ ∀ y : T'.LocalFieldAlgebra, + (y ∈ T'.massWeightSubmoduleLE 8 ∧ y ∈ T'.SectorAlgebra {.fermion} + ∧ (∀ U : Factors.G gauge, T'.repJet U y = y) + ∧ ∀ Λ : SL(2,ℂ), T'.repLorentzGroup Λ y = y) + ↔ y ∈ ℂ ∙ (1 : T'.LocalFieldAlgebra) := by + simp only [← Subalgebra.mem_toSubmodule] + rw [← invariantsLE_inf_eq_iff, ← invariantsLE_inf_eq_iff] have hinj : Function.Injective (e : fieldData.LocalFieldAlgebra →ₗ[ℂ] T'.LocalFieldAlgebra) := e.injective @@ -196,11 +225,18 @@ theorem gaugeSector_invariantsLE_seven_iff (hsec : (fieldData.SectorAlgebra {.gauge}).toSubmodule.map (e : fieldData.LocalFieldAlgebra →ₗ[ℂ] T'.LocalFieldAlgebra) = (T'.SectorAlgebra {.gauge}).toSubmodule) : - (fieldData.invariantsLE 7 ⊓ (fieldData.SectorAlgebra {.gauge}).toSubmodule - = ℂ ∙ (1 : fieldData.LocalFieldAlgebra)) - ↔ (T'.invariantsLE 7 - ⊓ (T'.SectorAlgebra {.gauge}).toSubmodule - = ℂ ∙ (1 : T'.LocalFieldAlgebra)) := by + (∀ x : fieldData.LocalFieldAlgebra, + (x ∈ fieldData.massWeightSubmoduleLE 7 ∧ x ∈ fieldData.SectorAlgebra {.gauge} + ∧ (∀ U : Factors.G gauge, fieldData.repJet U x = x) + ∧ ∀ Λ : SL(2,ℂ), fieldData.repLorentzGroup Λ x = x) + ↔ x ∈ ℂ ∙ (1 : fieldData.LocalFieldAlgebra)) + ↔ ∀ y : T'.LocalFieldAlgebra, + (y ∈ T'.massWeightSubmoduleLE 7 ∧ y ∈ T'.SectorAlgebra {.gauge} + ∧ (∀ U : Factors.G gauge, T'.repJet U y = y) + ∧ ∀ Λ : SL(2,ℂ), T'.repLorentzGroup Λ y = y) + ↔ y ∈ ℂ ∙ (1 : T'.LocalFieldAlgebra) := by + simp only [← Subalgebra.mem_toSubmodule] + rw [← invariantsLE_inf_eq_iff, ← invariantsLE_inf_eq_iff] have hinj : Function.Injective (e : fieldData.LocalFieldAlgebra →ₗ[ℂ] T'.LocalFieldAlgebra) := e.injective From 957ca7216d631129affc685a5cff7bec2d3723f2 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 22 Sep 2026 11:26:08 +0200 Subject: [PATCH 348/367] feat: Partial build --- .../GaugeTheory/GaugeBoson/Basic.lean | 3 +- .../LocalGaugeFieldAlgebra/GaugeAction.lean | 10 +- .../GaugeBoson/Realization/Symmetrized.lean | 16 +-- .../GaugeSectorRealization.lean | 1 + .../GaugeTheory/LocalFieldAlgebra/Basic.lean | 8 +- .../GaugeTheory/LocalFieldAlgebra/Jet.lean | 4 +- .../GaugeTheory/LocalFieldAlgebra/JetRep.lean | 6 +- .../LocalGaugeData/AdjointCoeff.lean | 4 +- .../GaugeTheory/LocalGaugeData/Basic.lean | 4 +- .../GaugeTheory/LocalGaugeData/Prod.lean | 12 +- .../GaugeTheory/LocalGaugeData/SU/Basic.lean | 64 ++++----- .../LocalGaugeData/Truncation.lean | 6 +- .../GaugeTheory/LocalGaugeData/U1.lean | 71 +++++----- .../JetComponentSpace/TransformsIn.lean | 4 +- .../MatterField/MatrixRep/Basic.lean | 52 ++++---- .../MatterField/MatrixRep/Constructions.lean | 12 +- .../MatterField/MatrixRep/Factors.lean | 24 ++-- Physlib/Mathematics/LeviCivita/Basic.lean | 9 +- .../Mathematics/MvPolynomialTranslation.lean | 18 +-- Physlib/Mathematics/PolynomialEval.lean | 8 +- Physlib/Particles/QED/Basic.lean | 6 +- Physlib/Particles/QED/Evaluation.lean | 22 +-- .../HiggsAlgebraCovRealization/Basic.lean | 22 +-- .../BoostWeightDecomposition.lean | 16 +-- .../MassWeight/GaugeWeightDecomposition.lean | 18 +-- .../MassWeight/MassDimLTEight.lean | 2 +- .../MassWeight/Filtration.lean | 2 +- .../CovAlgebraRealization/MassWeight.lean | 10 +- .../MassWeight/Invariants.lean | 14 +- .../CovAlgebraRealization/Sectors.lean | 6 +- .../Fermions/DownSinglet/Basic.lean | 4 +- .../DownSinglet/GaugeAlgebraAction.lean | 114 ++++++++-------- .../Fermions/LeptonDoublet/Basic.lean | 2 +- .../LeptonDoublet/GaugeAlgebraAction.lean | 118 ++++++++-------- .../Fermions/LeptonSinglet/Basic.lean | 2 +- .../LeptonSinglet/GaugeAlgebraAction.lean | 62 ++++----- .../Fermions/QuarkDoublet/Basic.lean | 4 +- .../QuarkDoublet/GaugeAlgebraAction.lean | 106 +++++++-------- .../Fermions/UpSinglet/Basic.lean | 4 +- .../UpSinglet/GaugeAlgebraAction.lean | 100 +++++++------- .../GaugeAlgebra/JetGaugeAlgebra.lean | 36 ++--- .../GaugeAlgebra/RootDecomposition.lean | 2 +- .../GaugeGroup/GaugeWeightDecomposition.lean | 4 +- .../GaugeGroup/Invariants/IsSU2Adjoint.lean | 2 +- .../GaugeGroup/Invariants/IsSU2BiAdjoint.lean | 4 +- .../Invariants/IsSU2QuadFundamental.lean | 4 +- .../GaugeGroup/Invariants/IsSU3Adjoint.lean | 2 +- .../GaugeGroup/Invariants/IsSU3BiAdjoint.lean | 4 +- .../Invariants/IsSU3BiFundamental.lean | 6 +- .../Invariants/IsSU3FunAntiFun.lean | 4 +- .../GaugeGroup/JetGaugeGroup/Basic.lean | 66 ++++----- .../GaugeGroup/JetGaugeGroup/Truncation.lean | 8 +- .../GaugeGroup/LocalGaugeData.lean | 6 +- .../GaugeGroup/MaurerCartan/Basic.lean | 98 +++++++------- .../GaugeGroup/MaurerCartan/Freeness.lean | 24 ++-- .../GaugeGroup/SU3PermDecomposition.lean | 2 +- .../HiggsBoson/GaugeAlgebraAction.lean | 90 ++++++------- .../IsFermionSector/MassWeight/Basic.lean | 24 ++-- .../BoostWeightDecomposition.lean | 4 +- .../GaugeWeightDecomposition.lean | 2 +- .../IsGaugeSector/MassWeight/Basic.lean | 6 +- Physlib/Relativity/DerivAlgebra.lean | 24 ++-- Physlib/Relativity/JetRing/Basic.lean | 92 ++++++------- Physlib/Relativity/JetRing/Jacobi.lean | 16 +-- Physlib/Relativity/JetRing/Matrix.lean | 126 +++++++++--------- Physlib/Relativity/JetRing/Taylor.lean | 6 +- Physlib/Relativity/LightConeDeriv.lean | 6 +- .../LorentzGroup/Invariants/Basic.lean | 2 +- .../LorentzGroup/Invariants/IsBiLeftWeyl.lean | 2 +- .../Invariants/IsLeftRightWeyl.lean | 2 +- .../LorentzGroup/Invariants/LightCone.lean | 4 +- .../LorentzGroup/Invariants/RankFour.lean | 16 +-- .../LorentzGroup/Invariants/RankThree.lean | 2 +- 73 files changed, 837 insertions(+), 829 deletions(-) diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Basic.lean index e615d4128..03cc15a93 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Basic.lean @@ -83,7 +83,8 @@ def valEquiv : (GaugeBoson 𝔤) ≃ Lorentz.CoVector ⊗[ℝ] 𝔤 where noncomputable instance : AddCommGroup (GaugeBoson 𝔤) := Equiv.addCommGroup (valEquiv 𝔤) -noncomputable instance : Module ℝ (GaugeBoson 𝔤) := Equiv.module ℝ (valEquiv 𝔤) +noncomputable instance : Module ℝ (GaugeBoson 𝔤) := + AddEquiv.module ℝ { valEquiv 𝔤 with map_add' _ _ := rfl } variable (𝔤) in /-- The linear identification with the underlying tensor product. -/ diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeFieldAlgebra/GaugeAction.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeFieldAlgebra/GaugeAction.lean index ef01cc7e9..04ebed659 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeFieldAlgebra/GaugeAction.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeFieldAlgebra/GaugeAction.lean @@ -88,10 +88,10 @@ lemma adjointTransport_one (p : Multiset (Fin 1 ⊕ Fin 3)) : adjointTransport jets 1 p = if p = 0 then LinearMap.id else 0 := by rw [adjointTransport, jets.adjointCoeff_one] rcases eq_or_ne p 0 with rfl | hp - · rw [if_pos rfl, if_pos rfl, TensorProduct.map_id] + · rw [ite_eq_left rfl, ite_eq_left rfl, TensorProduct.map_id] refine LinearMap.ext fun v => ?_ simp - · rw [if_neg hp, if_neg hp] + · rw [ite_eq_right hp, ite_eq_right hp] refine LinearMap.ext fun v => ?_ rw [show TensorProduct.map (LinearMap.id (M := Lorentz.CoVector)) (0 : 𝔤 →ₗ[ℝ] 𝔤) = 0 from by @@ -215,9 +215,9 @@ lemma transport_one : transport jets (1 : GJ) = LinearMap.id := by ((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 + rw [ite_eq_right hp, show ((0 : (GaugeBoson 𝔤) →ₗ[ℝ] (GaugeBoson 𝔤))).dualMap ψ = 0 from LinearMap.ext fun v => by simp, TensorProduct.tmul_zero]), - if_pos rfl, LinearMap.id_apply, + ite_eq_left rfl, LinearMap.id_apply, show (LinearMap.id : (GaugeBoson 𝔤) →ₗ[ℝ] (GaugeBoson 𝔤)).dualMap ψ = ψ from LinearMap.ext fun v => rfl] @@ -489,7 +489,7 @@ lemma componentDual_dualBasis_mcBosonCoeff (W : GJ) rw [Module.Basis.dualBasis_apply_self, ite_mul, one_mul, zero_mul]] rw [Finset.sum_ite_eq' Finset.univ μ (fun ν => φ (jets.evalLie (jets.iteratedDeriv s - (jets.maurerCartan W ν)))), if_pos (Finset.mem_univ μ)] + (jets.maurerCartan W ν)))), ite_eq_left (Finset.mem_univ μ)] /-- The transformation law of the derivative generators, in the form used by `GaugeAlgebraRealization`: a jet of gauge transformations acts on `∂_s A_μ^φ` by the all-orders diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Symmetrized.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Symmetrized.lean index a0b4fdffd..ca9b288b8 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Symmetrized.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/Realization/Symmetrized.lean @@ -822,7 +822,7 @@ lemma eq_zero_of_forall_sum_smul_pow_eq_zero {n : ℕ} {b : ℕ → B} 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 + rwa [Finset.sum_ite_eq (Finset.range n) m (fun j => f (b j)), ite_eq_left hm] at hcoeff /-- Any element of the subalgebra generated by a subalgebra `R` and a single element `y` commuting with `R` is a polynomial in `y` with coefficients in `R`: the subalgebra is the @@ -909,8 +909,8 @@ lemma mem_of_translationInvariant_single (R : Subalgebra ℂ B) (y : B) 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))] + fun j _ hj => ite_eq_right fun h => hj (Finset.mem_range.mpr (Nat.lt_succ_of_le h)))) + rw [ite_eq_left (Nat.lt_succ_iff.mp (Finset.mem_range.mp hj))] 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 @@ -931,7 +931,7 @@ lemma mem_of_translationInvariant_single (R : Subalgebra ℂ B) (y : B) -- the top coefficient of the representation is the top `b`, hence vanishes have hrtop : r (m + 1) = 0 := by have h := hvan (m + 1) (Finset.self_mem_range_succ _) - rw [if_neg (Nat.succ_ne_zero m), hbdef] at h + rw [ite_eq_right (Nat.succ_ne_zero m), hbdef] at h simp only at h rwa [Finset.sum_congr rfl fun k hk => show (if m + 1 ≤ k then (k.choose (m + 1) : ℂ) • (r k * y ^ (k - (m + 1))) else 0) = @@ -939,7 +939,7 @@ lemma mem_of_translationInvariant_single (R : Subalgebra ℂ B) (y : B) have := Finset.mem_range.mp hk simp only [show (m + 1 ≤ k) ↔ k = m + 1 by omega], Finset.sum_ite_eq' (Finset.range (m + 2)) (m + 1) _, - if_pos (Finset.self_mem_range_succ _), Nat.choose_self, Nat.sub_self, pow_zero, + ite_eq_left (Finset.self_mem_range_succ _), Nat.choose_self, Nat.sub_self, pow_zero, mul_one, Nat.cast_one, one_smul] at h -- strip the top term and recurse have hstrip : (∑ k ∈ Finset.range (m + 2), r k * y ^ k) = @@ -1110,15 +1110,15 @@ noncomputable def shiftFamily (t : Sym (Fin 1 ⊕ Fin 3) (m + 1) × ι → ℝ) lemma shiftFamily_eq_zero_of_card_ne (t : Sym (Fin 1 ⊕ Fin 3) (m + 1) × ι → ℝ) (r : {r : Multiset (Fin 1 ⊕ Fin 3) // r ≠ 0}) (hr : r.1.card ≠ m + 1) : shiftFamily m bv t r = 0 := - dif_neg hr + dite_eq_right hr lemma coord_shiftFamily (t : Sym (Fin 1 ⊕ Fin 3) (m + 1) × ι → ℝ) (ps : Sym (Fin 1 ⊕ Fin 3) (m + 1)) (hp0 : (ps : Multiset (Fin 1 ⊕ Fin 3)) ≠ 0) (j : ι) : bv.coord j (shiftFamily m bv t ⟨ps, hp0⟩) = t (ps, j) := by classical - rw [shiftFamily, dif_pos (Sym.card_coe (s := ps)), map_sum] + rw [shiftFamily, dite_eq_left (Sym.card_coe (s := ps)), 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, Finset.sum_ite_eq', Finset.mem_univ, if_true] + smul_eq_mul, mul_ite, mul_one, mul_zero, Finset.sum_ite_eq', Finset.mem_univ, ite_true] rfl include S hcS in diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalCovFieldAlgebra/GaugeSectorRealization.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalCovFieldAlgebra/GaugeSectorRealization.lean index 1e58b044d..3209570ab 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalCovFieldAlgebra/GaugeSectorRealization.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalCovFieldAlgebra/GaugeSectorRealization.lean @@ -144,6 +144,7 @@ lemma covGaugeSectorRealizationEquiv_symm_toAlgHom_covF -/ +set_option maxHeartbeats 400000 in /-- Restricting a realization of the local field algebra to the covariant gauge sector and passing to the gauge-only side gives the covariant restriction of its ordinary gauge-only realization. -/ diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Basic.lean index e6f2d7291..61c1f77ba 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Basic.lean @@ -584,10 +584,10 @@ def evenSubalgebra : Subalgebra ℂ B := Algebra.adjoin ℂ d.evenGenerators instance : IsMulCommutative d.evenSubalgebra := by refine Algebra.isMulCommutative_adjoin ℂ ?_ rintro x (⟨v, rfl⟩ | ⟨v, rfl⟩) y (⟨w, rfl⟩ | ⟨w, rfl⟩) - · exact d.bosonTotal_commute v w - · exact d.bosonTotal_commute_connection v w - · exact (d.bosonTotal_commute_connection w v).symm - · exact d.connection_commute v w + · exact fun _ => d.bosonTotal_commute v w + · exact fun _ => d.bosonTotal_commute_connection v w + · exact fun _ => (d.bosonTotal_commute_connection w v).symm + · exact fun _ => d.connection_commute v w open scoped IsMulCommutative diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Jet.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Jet.lean index acbcb63ec..34a60b3f6 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Jet.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Jet.lean @@ -53,11 +53,11 @@ lemma jetOfConstant_apply (v : V) : jetOfConstant v = (1 : JetRing) ⊗ₜ[ℂ] factor. -/ noncomputable def jetDeriv (μ : Fin 1 ⊕ Fin 3) : JetRing ⊗[ℂ] V →ₗ[ℂ] JetRing ⊗[ℂ] V := - LinearMap.rTensor V (pderiv ℂ μ).toLinearMap + LinearMap.rTensor V (pderiv μ).toLinearMap @[simp] lemma jetDeriv_tmul (μ : Fin 1 ⊕ Fin 3) (f : JetRing) (v : V) : - jetDeriv μ (f ⊗ₜ[ℂ] v) = pderiv ℂ μ f ⊗ₜ[ℂ] v := rfl + jetDeriv μ (f ⊗ₜ[ℂ] v) = pderiv μ f ⊗ₜ[ℂ] v := rfl /-- Formal derivatives on `V`-valued jets commute, since the partial derivatives of jets do. -/ diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/JetRep.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/JetRep.lean index 5df40d611..27ac632fc 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/JetRep.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/JetRep.lean @@ -308,7 +308,8 @@ lemma repConj_smul_comm ⟨(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⟩ + (ConjModule V))))).symm z), + by rw [LinearEquiv.apply_symm_apply, LinearEquiv.apply_symm_apply]⟩ rw [← tensorEquiv_congr_conjEquiv_smul, repConj_apply_conjEquiv, repConj_apply_conjEquiv, hlin, tensorEquiv_congr_conjEquiv_smul] @@ -351,7 +352,8 @@ lemma lTensor_comp_repConj (repV : Representation ℂ G (JetRing ⊗[ℂ] V)) ⟨(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⟩ + (ConjModule V))))).symm z), + by rw [LinearEquiv.apply_symm_apply, LinearEquiv.apply_symm_apply]⟩ rw [LinearMap.comp_apply, LinearMap.comp_apply, repConj_apply_conjEquiv, lTensor_conjEquiv_naturality, lTensor_conjEquiv_naturality, repConj_apply_conjEquiv, ← LinearMap.comp_apply, hf U, LinearMap.comp_apply] diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/AdjointCoeff.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/AdjointCoeff.lean index b100ec876..b90754a97 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/AdjointCoeff.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/AdjointCoeff.lean @@ -91,9 +91,9 @@ lemma adjointCoeff_one (p : Multiset (Fin 1 ⊕ Fin 3)) : refine LinearMap.ext fun a => ?_ rw [adjointCoeff_apply, map_one, Module.End.one_apply] rcases eq_or_ne p 0 with rfl | hp - · rw [iteratedDeriv_zero, LinearMap.id_apply, evalLie_ofConstantLie, if_pos rfl, + · rw [iteratedDeriv_zero, LinearMap.id_apply, evalLie_ofConstantLie, ite_eq_left rfl, LinearMap.id_apply] - · rw [jets.iteratedDeriv_ofConstantLie_of_ne_zero hp, map_zero, if_neg hp, + · rw [jets.iteratedDeriv_ofConstantLie_of_ne_zero hp, map_zero, ite_eq_right hp, LinearMap.zero_apply] /-- The coefficients are derivations of the bracket up to convolution, by the iterated diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Basic.lean index 5208ce8e4..84dc76e2e 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Basic.lean @@ -335,13 +335,13 @@ lemma evalLie_iteratedDeriv_coord (μ : Fin 1 ⊕ Fin 3) (s : Multiset (Fin 1 map_add, ih] by_cases hνμ : ν = μ · subst hνμ - rw [if_pos rfl, Multiset.count_cons_self, Multiset.erase_cons_head, add_smul, one_smul, + rw [ite_eq_left rfl, Multiset.count_cons_self, Multiset.erase_cons_head, add_smul, one_smul, ← LinearMap.comp_apply (jets.iteratedDeriv (s.erase ν)), ← iteratedDeriv_cons_eq_comp_deriv] by_cases hμ : ν ∈ s · rw [Multiset.cons_erase hμ] · rw [Multiset.count_eq_zero.mpr hμ, zero_smul, zero_smul] - · rw [if_neg hνμ, map_zero, map_zero, add_zero, Multiset.count_cons_of_ne (Ne.symm hνμ), + · rw [ite_eq_right hνμ, map_zero, map_zero, add_zero, Multiset.count_cons_of_ne (Ne.symm hνμ), Multiset.erase_cons_tail s hνμ, ← LinearMap.comp_apply (jets.iteratedDeriv (s.erase μ)), ← iteratedDeriv_cons_eq_comp_deriv] diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Prod.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Prod.lean index 0c91b914b..47c42f055 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Prod.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Prod.lean @@ -93,21 +93,21 @@ noncomputable def prod : LocalGaugeData (G₀₁ × G₀₂) (𝔤₁ × 𝔤₂ deriv_coord μ ν a := by by_cases h : μ = ν · subst h - rw [if_pos rfl] + rw [ite_eq_left rfl] refine Prod.ext ?_ ?_ · have := j₁.deriv_coord μ μ a.1 - rw [if_pos rfl] at this + rw [ite_eq_left rfl] at this exact this · have := j₂.deriv_coord μ μ a.2 - rw [if_pos rfl] at this + rw [ite_eq_left rfl] at this exact this - · rw [if_neg h, add_zero] + · rw [ite_eq_right h, add_zero] refine Prod.ext ?_ ?_ · have := j₁.deriv_coord μ ν a.1 - rw [if_neg h, add_zero] at this + rw [ite_eq_right h, add_zero] at this exact this · have := j₂.deriv_coord μ ν a.2 - rw [if_neg h, add_zero] at this + rw [ite_eq_right h, add_zero] at this exact this evalLie_coord μ a := Prod.ext (j₁.evalLie_coord μ a.1) (j₂.evalLie_coord μ a.2) coord_lie μ a b := Prod.ext (j₁.coord_lie μ a.1 b.1) (j₂.coord_lie μ a.2 b.2) diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/SU/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/SU/Basic.lean index 94f08931a..fff2da1b5 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/SU/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/SU/Basic.lean @@ -155,7 +155,7 @@ lemma eval_ofConstant (g : SU n) : eval (ofConstant g) = g := by /-- The entrywise derivative commutes with the conjugate transpose. -/ lemma star_map_pderiv {κ : Type} [Fintype κ] (μ : Fin 1 ⊕ Fin 3) (A : Matrix κ κ JetRing) : - star (A.map (pderiv ℂ μ)) = (star A).map (pderiv ℂ μ) := by + 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 @@ -163,21 +163,21 @@ lemma star_map_pderiv {κ : Type} [Fintype κ] (μ : Fin 1 ⊕ Fin 3) (A : Matri /-- The entrywise derivative of the conjugate transpose of a unitary matrix, through the differentiated unitarity relation. -/ lemma map_pderiv_star_val (μ : Fin 1 ⊕ Fin 3) (U : JetSU n) : - (star U.1).map (pderiv ℂ μ) = -(star U.1 * U.1.map (pderiv ℂ μ) * star U.1) := by - have h1 : U.1 * (star U.1).map (pderiv ℂ μ) = -(U.1.map (pderiv ℂ μ) * star U.1) := + (star U.1).map (pderiv μ) = -(star U.1 * U.1.map (pderiv μ) * star U.1) := by + have h1 : U.1 * (star U.1).map (pderiv μ) = -(U.1.map (pderiv μ) * star U.1) := eq_neg_of_add_eq_zero_right (by rw [← JetRing.matrix_map_pderiv_mul, val_mul_star] exact Matrix.ext fun i j => by - simp [Matrix.map_apply, Matrix.one_apply, apply_ite (pderiv ℂ μ)]) - calc (star U.1).map (pderiv ℂ μ) - = star U.1 * U.1 * (star U.1).map (pderiv ℂ μ) := by rw [star_mul_val, one_mul] - _ = -(star U.1 * U.1.map (pderiv ℂ μ) * star U.1) := by + simp [Matrix.map_apply, Matrix.one_apply, apply_ite (pderiv μ)]) + calc (star U.1).map (pderiv μ) + = star U.1 * U.1 * (star U.1).map (pderiv μ) := by rw [star_mul_val, one_mul] + _ = -(star U.1 * U.1.map (pderiv μ) * star U.1) := by rw [mul_assoc, h1, mul_neg, ← mul_assoc] /-- The Maurer–Cartan matrix `i (∂_μ U) U†` is hermitian. -/ lemma star_mcMatrix (μ : Fin 1 ⊕ Fin 3) (U : JetSU n) : - star (Complex.I • (U.1.map (pderiv ℂ μ) * star U.1)) - = Complex.I • (U.1.map (pderiv ℂ μ) * star U.1) := by + star (Complex.I • (U.1.map (pderiv μ) * star U.1)) + = Complex.I • (U.1.map (pderiv μ) * star U.1) := by rw [star_smul, star_mul, star_star, star_map_pderiv, map_pderiv_star_val, Complex.star_def, Complex.conj_I, neg_smul, mul_neg, smul_neg, neg_neg, ← mul_assoc, ← mul_assoc, val_mul_star, one_mul] @@ -185,7 +185,7 @@ lemma star_mcMatrix (μ : Fin 1 ⊕ Fin 3) (U : JetSU n) : /-- The Maurer–Cartan matrix `i (∂_μ U) U†` is traceless, by Jacobi's formula and `det U = 1`. -/ lemma trace_mcMatrix (μ : Fin 1 ⊕ Fin 3) (U : JetSU n) : - (Complex.I • (U.1.map (pderiv ℂ μ) * star U.1)).trace = 0 := by + (Complex.I • (U.1.map (pderiv μ) * star U.1)).trace = 0 := by rw [Matrix.trace_smul, star_val_eq_adjugate, ← JetRing.jacobi, det_val, pderiv_one, smul_zero] @@ -203,7 +203,7 @@ variable {n : ℕ} /-- The formal derivative in the direction `μ`, entrywise. -/ noncomputable def deriv (μ : Fin 1 ⊕ Fin 3) : JetSUAlgebra n →ₗ[ℝ] JetSUAlgebra n where - toFun a := SUAlgebraOver.ofMatrix (a.1.map (pderiv ℂ μ)) + toFun a := SUAlgebraOver.ofMatrix (a.1.map (pderiv μ)) (by rw [JetSU.star_map_pderiv, a.star_val]) (by rw [← AddMonoidHom.map_trace, a.trace_val, map_zero]) map_add' a b := Subtype.ext (by @@ -217,7 +217,7 @@ noncomputable def deriv (μ : Fin 1 ⊕ Fin 3) : JetSUAlgebra n →ₗ[ℝ] JetS @[simp] lemma deriv_val (μ : Fin 1 ⊕ Fin 3) (a : JetSUAlgebra n) : - (deriv μ a).1 = a.1.map (pderiv ℂ μ) := rfl + (deriv μ a).1 = a.1.map (pderiv μ) := rfl /-- Multiplication by the coordinate `x_μ`, entrywise. -/ noncomputable def coord (μ : Fin 1 ⊕ Fin 3) : JetSUAlgebra n →ₗ[ℝ] JetSUAlgebra n where @@ -340,12 +340,12 @@ lemma adjointValue_val (U : SU n) (a : SUAlgebra n) : /-- The Maurer–Cartan form `i (∂_μ U) U†` of an `SU(n)` gauge jet. -/ noncomputable def mc (U : JetSU n) (μ : Fin 1 ⊕ Fin 3) : JetSUAlgebra n := - SUAlgebraOver.ofMatrix (Complex.I • (U.1.map (pderiv ℂ μ) * star U.1)) + SUAlgebraOver.ofMatrix (Complex.I • (U.1.map (pderiv μ) * star U.1)) (JetSU.star_mcMatrix μ U) (JetSU.trace_mcMatrix μ U) @[simp] lemma mc_val (U : JetSU n) (μ : Fin 1 ⊕ Fin 3) : - (mc U μ).1 = Complex.I • (U.1.map (pderiv ℂ μ) * star U.1) := rfl + (mc U μ).1 = Complex.I • (U.1.map (pderiv μ) * star U.1) := rfl lemma deriv_comm (μ ν : Fin 1 ⊕ Fin 3) (a : JetSUAlgebra n) : deriv μ (deriv ν a) = deriv ν (deriv μ a) := by @@ -355,11 +355,11 @@ lemma deriv_comm (μ ν : Fin 1 ⊕ Fin 3) (a : JetSUAlgebra n) : /-- Pulling a complex scalar out of the entrywise derivative. -/ lemma map_pderiv_smul {κ : Type} (μ : Fin 1 ⊕ Fin 3) (c : ℂ) (M : Matrix κ κ JetRing) : - (c • M).map (pderiv ℂ μ) = c • M.map (pderiv ℂ μ) := + (c • M).map (pderiv μ) = c • M.map (pderiv μ) := Matrix.ext fun _ _ => Derivation.map_smul _ _ _ lemma map_pderiv_sub {κ : Type} (μ : Fin 1 ⊕ Fin 3) (M N : Matrix κ κ JetRing) : - (M - N).map (pderiv ℂ μ) = M.map (pderiv ℂ μ) - N.map (pderiv ℂ μ) := by + (M - N).map (pderiv μ) = M.map (pderiv μ) - N.map (pderiv μ) := by ext i j : 1 simp only [Matrix.map_apply, Matrix.sub_apply, map_sub] @@ -385,13 +385,13 @@ lemma deriv_coord (μ ν : Fin 1 ⊕ Fin 3) (a : JetSUAlgebra n) : deriv μ (coord ν a) = coord ν (deriv μ a) + if μ = ν then a else 0 := by by_cases h : μ = ν · subst h - rw [if_pos rfl] + rw [ite_eq_left rfl] refine Subtype.ext ?_ ext i j simp only [deriv_val, coord_val, Submodule.coe_add, Matrix.map_apply, Matrix.smul_apply, Matrix.add_apply, smul_eq_mul, Derivation.leibniz, pderiv_X_self] ring - · rw [if_neg h, add_zero] + · rw [ite_eq_right h, add_zero] refine Subtype.ext ?_ ext i j simp only [deriv_val, coord_val, Matrix.map_apply, Matrix.smul_apply, smul_eq_mul, @@ -442,12 +442,12 @@ lemma mc_cocycle (U V : JetSU n) (μ : Fin 1 ⊕ Fin 3) : lemma mc_structure (U : JetSU n) (μ ν : Fin 1 ⊕ Fin 3) : deriv μ (mc U ν) - deriv ν (mc U μ) + ⁅mc U μ, mc U ν⁆ = 0 := by set A := U.1 with hA - have key : (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 + have key : (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 rw [JetRing.matrix_map_pderiv_mul, JetRing.matrix_map_pderiv_mul, - show (A.map (pderiv ℂ ν)).map (pderiv ℂ μ) = (A.map (pderiv ℂ μ)).map (pderiv ℂ ν) + show (A.map (pderiv ν)).map (pderiv μ) = (A.map (pderiv μ)).map (pderiv ν) from Matrix.ext fun _ _ => JetRing.pderiv_comm μ ν _, JetSU.map_pderiv_star_val μ, JetSU.map_pderiv_star_val ν] simp only [mul_neg, ← mul_assoc] @@ -465,14 +465,14 @@ lemma deriv_adjoint (U : JetSU n) (μ : Fin 1 ⊕ Fin 3) (x : JetSUAlgebra n) : deriv μ (adjoint U x) = adjoint U (deriv μ x) - ⁅mc U μ, adjoint U x⁆ := by set V := U.1 with hV have hVV : star V * V = 1 := JetSU.star_mul_val U - have hq : (star V).map (pderiv ℂ μ) = -(star V * V.map (pderiv ℂ μ) * star V) := + have hq : (star V).map (pderiv μ) = -(star V * V.map (pderiv μ) * star V) := JetSU.map_pderiv_star_val μ U refine Subtype.ext ?_ simp only [deriv_val, adjoint_val, Submodule.coe_sub, SUAlgebraOver.bracket_val, mc_val] rw [JetRing.matrix_map_pderiv_mul, JetRing.matrix_map_pderiv_mul, 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] + rw [mul_assoc (V.map (pderiv μ)) (star V) V, hVV, mul_one] abel end JetSUAlgebra @@ -527,7 +527,7 @@ variable {n : ℕ} /-- The iterated derivative on `su(n)` jets is the entrywise iterated formal derivative. -/ lemma su_iteratedDeriv_val (s : Multiset (Fin 1 ⊕ Fin 3)) (a : JetSUAlgebra n) : - ((su n).iteratedDeriv s a).1 = a.1.map fun f => s.foldl (fun h ρ => pderiv ℂ ρ h) f := by + ((su n).iteratedDeriv s a).1 = a.1.map fun f => s.foldl (fun h ρ => pderiv ρ h) f := by induction s using Multiset.induction_on generalizing a with | empty => rw [iteratedDeriv_zero, LinearMap.id_apply] @@ -543,7 +543,7 @@ lemma su_iteratedDeriv_val (s : Multiset (Fin 1 ⊕ Fin 3)) (a : JetSUAlgebra n) /-- The base-point value of the iterated derivative on `su(n)` jets, entrywise. -/ lemma su_evalLie_iteratedDeriv_val (s : Multiset (Fin 1 ⊕ Fin 3)) (a : JetSUAlgebra n) : ((su n).evalLie ((su n).iteratedDeriv s a)).1 - = a.1.map fun f => constantCoeff (s.foldl (fun h ρ => pderiv ℂ ρ h) f) := by + = a.1.map fun f => constantCoeff (s.foldl (fun h ρ => pderiv ρ h) f) := by rw [su_evalLie, JetSUAlgebra.evalLie_val, su_iteratedDeriv_val, RingHom.mapMatrix_apply, Matrix.map_map] rfl @@ -575,14 +575,14 @@ instance instFaithfulSU : (su n).Faithful where have hs := congrArg (fun a : SUAlgebra n => a.1 i j) (h s) simpa only [su_evalLie_iteratedDeriv_val, Matrix.map_apply] using hs eq_ofConstant_of_maurerCartan_eq_zero {U} h := by - have hd : ∀ μ, U.1.map (pderiv ℂ μ) = 0 := fun μ => by - have h1 : Complex.I • (U.1.map (pderiv ℂ μ) * star U.1) = 0 := + have hd : ∀ μ, U.1.map (pderiv μ) = 0 := fun μ => by + have h1 : Complex.I • (U.1.map (pderiv μ) * star U.1) = 0 := congrArg Subtype.val (congrFun h μ) - have h2 : U.1.map (pderiv ℂ μ) * star U.1 = 0 := by + have h2 : U.1.map (pderiv μ) * star U.1 = 0 := by have := congrArg (fun M => (-Complex.I) • M) h1 simpa [smul_smul, Complex.I_mul_I] using this - calc U.1.map (pderiv ℂ μ) - = U.1.map (pderiv ℂ μ) * (star U.1 * U.1) := by rw [JetSU.star_mul_val, mul_one] + calc U.1.map (pderiv μ) + = U.1.map (pderiv μ) * (star U.1 * U.1) := by rw [JetSU.star_mul_val, mul_one] _ = 0 := by rw [← mul_assoc, h2, zero_mul] refine Subtype.ext (Matrix.ext fun i j => ?_) show U.1 i j = C (constantCoeff (U.1 i j)) diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Truncation.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Truncation.lean index f22647074..47af04112 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Truncation.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Truncation.lean @@ -196,10 +196,10 @@ lemma evalLie_iteratedDeriv_adjoint_conj_of_mem_truncationKer (g : GJ) {n : ℕ} rw [evalLie_iteratedDeriv_adjoint, Multiset.sum_antidiagonal_eq_of_fst_ne_zero s _ fun p hp hp1 => ?_] · rw [jets.adjointCoeff_conj_of_mem_truncationKer g hU (by simp), adjointCoeff_one, - if_pos rfl, LinearMap.id_apply] + ite_eq_left rfl, LinearMap.id_apply] · rw [jets.adjointCoeff_conj_of_mem_truncationKer g hU ((Multiset.card_le_card (Multiset.fst_le_of_mem_antidiagonal hp)).trans hs), - adjointCoeff_one, if_neg hp1, LinearMap.zero_apply] + adjointCoeff_one, ite_eq_right hp1, LinearMap.zero_apply] /-! @@ -447,7 +447,7 @@ theorem symmetrizedMaurerCartanCoeff_surjective : refine ⟨U, funext fun r => ?_⟩ have hcard : (r.1.card : ℝ) ≠ 0 := Nat.cast_ne_zero.mpr fun h => r.2 (Multiset.card_eq_zero.mp h) - rw [symmetrizedMaurerCartanCoeff_eq_evalLie_iteratedDeriv_radial, hU, hρ, dif_neg r.2, + rw [symmetrizedMaurerCartanCoeff_eq_evalLie_iteratedDeriv_radial, hU, hρ, dite_eq_right r.2, smul_smul, one_div, inv_mul_cancel₀ hcard, one_smul] /-- The symmetrized Maurer–Cartan data are free coordinates on the pure jets of a free diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/U1.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/U1.lean index 31fed1fbb..9a0eb6492 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/U1.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/U1.lean @@ -126,16 +126,16 @@ lemma eval_ofConstant (u : U1) : eval (ofConstant u) = u := /-- The formal derivative of a `u(1)` jet. -/ noncomputable def deriv (μ : Fin 1 ⊕ Fin 3) : JetU1Algebra →ₗ[ℝ] JetU1Algebra where - toFun a := ⟨pderiv ℂ μ a.1, by - show star (pderiv ℂ μ a.1) = pderiv ℂ μ a.1 + toFun a := ⟨pderiv μ a.1, by + show star (pderiv μ a.1) = pderiv μ a.1 rw [← JetRing.pderiv_star, a.2]⟩ map_add' a b := Subtype.ext (map_add _ _ _) map_smul' r a := Subtype.ext (by - show pderiv ℂ μ (r • a.1) = r • pderiv ℂ μ a.1 + show pderiv μ (r • a.1) = r • pderiv μ a.1 rw [← algebraMap_smul ℂ r, Derivation.map_smul, algebraMap_smul]) @[simp] -lemma deriv_val (μ : Fin 1 ⊕ Fin 3) (a : JetU1Algebra) : (deriv μ a : JetRing) = pderiv ℂ μ a := +lemma deriv_val (μ : Fin 1 ⊕ Fin 3) (a : JetU1Algebra) : (deriv μ a : JetRing) = pderiv μ a := rfl /-- Multiplication of a `u(1)` jet by the coordinate `x_μ`. -/ @@ -185,23 +185,23 @@ lemma ofConstantLie_val (a : U1Algebra) : (ofConstantLie a : JetRing) = C (a : /-- The Maurer–Cartan scalar `i (∂_μ u) u⁻¹` of a unitary jet is self-adjoint. -/ lemma star_mcVal (u : JetU1) (μ : Fin 1 ⊕ Fin 3) : - star (Complex.I • (pderiv ℂ μ (u : JetRing) * star (u : JetRing))) - = Complex.I • (pderiv ℂ μ (u : JetRing) * star (u : JetRing)) := by + star (Complex.I • (pderiv μ (u : JetRing) * star (u : JetRing))) + = Complex.I • (pderiv μ (u : JetRing) * star (u : JetRing)) := by have hu : (u : JetRing) * star (u : JetRing) = 1 := Unitary.mul_star_self_of_mem u.2 - have h0 : pderiv ℂ μ ((u : JetRing) * star (u : JetRing)) = 0 := by rw [hu, pderiv_one] + have h0 : pderiv μ ((u : JetRing) * star (u : JetRing)) = 0 := by rw [hu, pderiv_one] rw [Derivation.leibniz, smul_eq_mul, smul_eq_mul] at h0 rw [star_smul, star_mul', star_star, ← JetRing.pderiv_star, Complex.star_def, Complex.conj_I, - neg_smul, show pderiv ℂ μ (star (u : JetRing)) * (u : JetRing) - = -(pderiv ℂ μ (u : JetRing) * star (u : JetRing)) from by linear_combination h0, + neg_smul, show pderiv μ (star (u : JetRing)) * (u : JetRing) + = -(pderiv μ (u : JetRing) * star (u : JetRing)) from by linear_combination h0, smul_neg, neg_neg] /-- The Maurer–Cartan form `i (∂_μ u) u⁻¹` of a `U(1)` jet. -/ noncomputable def mc (u : JetU1) (μ : Fin 1 ⊕ Fin 3) : JetU1Algebra := - ⟨Complex.I • (pderiv ℂ μ (u : JetRing) * star (u : JetRing)), star_mcVal u μ⟩ + ⟨Complex.I • (pderiv μ (u : JetRing) * star (u : JetRing)), star_mcVal u μ⟩ @[simp] lemma mc_val (u : JetU1) (μ : Fin 1 ⊕ Fin 3) : - (mc u μ : JetRing) = Complex.I • (pderiv ℂ μ (u : JetRing) * star (u : JetRing)) := rfl + (mc u μ : JetRing) = Complex.I • (pderiv μ (u : JetRing) * star (u : JetRing)) := rfl lemma mc_ofConstant (g : U1) (μ : Fin 1 ⊕ Fin 3) : mc (ofConstant g) μ = 0 := Subtype.ext (by simp [pderiv_C]) @@ -211,27 +211,28 @@ lemma mc_mul (u v : JetU1) (μ : Fin 1 ⊕ Fin 3) : mc (u * v) μ = mc u μ + mc refine Subtype.ext ?_ have hu : (u : JetRing) * star (u : JetRing) = 1 := Unitary.mul_star_self_of_mem u.2 have hv : (v : JetRing) * star (v : JetRing) = 1 := Unitary.mul_star_self_of_mem v.2 - show Complex.I • (pderiv ℂ μ ((u : JetRing) * v) * star ((u : JetRing) * v)) - = Complex.I • (pderiv ℂ μ (u : JetRing) * star (u : JetRing)) - + Complex.I • (pderiv ℂ μ (v : JetRing) * star (v : JetRing)) + show Complex.I • (pderiv μ ((u : JetRing) * (v : JetRing)) + * star ((u : JetRing) * (v : JetRing))) + = Complex.I • (pderiv μ (u : JetRing) * star (u : JetRing)) + + Complex.I • (pderiv μ (v : JetRing) * star (v : JetRing)) rw [← smul_add, Derivation.leibniz, star_mul', smul_eq_mul, smul_eq_mul] congr 1 - linear_combination (pderiv ℂ μ (u : JetRing) * star (u : JetRing)) * hv - + (pderiv ℂ μ (v : JetRing) * star (v : JetRing)) * hu + linear_combination (pderiv μ (u : JetRing) * star (u : JetRing)) * hv + + (pderiv μ (v : JetRing) * star (v : JetRing)) * hu /-- The Maurer–Cartan form of `U(1)` is flat: the derivatives of a phase commute. -/ lemma pderiv_mcVal_comm (u : JetU1) (μ ν : Fin 1 ⊕ Fin 3) : - pderiv ℂ μ (pderiv ℂ ν (u : JetRing) * star (u : JetRing)) - = pderiv ℂ ν (pderiv ℂ μ (u : JetRing) * star (u : JetRing)) := by + pderiv μ (pderiv ν (u : JetRing) * star (u : JetRing)) + = pderiv ν (pderiv μ (u : JetRing) * star (u : JetRing)) := by have hu : (u : JetRing) * star (u : JetRing) = 1 := Unitary.mul_star_self_of_mem u.2 - have hstar : ∀ ρ : Fin 1 ⊕ Fin 3, pderiv ℂ ρ (star (u : JetRing)) - = -(star (u : JetRing) * pderiv ℂ ρ (u : JetRing) * star (u : JetRing)) := by + 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] + 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)) * ((mul_comm _ _).trans hu) + - pderiv ρ (star (u : JetRing)) * ((mul_comm _ _).trans hu) simp only [Derivation.leibniz, smul_eq_mul] rw [hstar μ, hstar ν, JetRing.pderiv_comm μ ν] ring @@ -266,12 +267,12 @@ noncomputable def u1 : LocalGaugeData U1 U1Algebra JetU1 JetU1Algebra where refine Subtype.ext ?_ by_cases h : μ = ν · subst h - rw [if_pos rfl] - show pderiv ℂ μ ((X μ : JetRing) * a.1) = (X μ : JetRing) * pderiv ℂ μ a.1 + a.1 + rw [ite_eq_left rfl] + show pderiv μ ((X μ : JetRing) * a.1) = (X μ : JetRing) * pderiv μ a.1 + a.1 rw [Derivation.leibniz, smul_eq_mul, smul_eq_mul, pderiv_X_self] ring - · rw [if_neg h, add_zero] - show pderiv ℂ μ ((X ν : JetRing) * a.1) = (X ν : JetRing) * pderiv ℂ μ a.1 + · rw [ite_eq_right h, add_zero] + show pderiv μ ((X ν : JetRing) * a.1) = (X ν : JetRing) * pderiv μ a.1 rw [Derivation.leibniz, smul_eq_mul, smul_eq_mul, pderiv_X_of_ne (Ne.symm h)] ring evalLie_coord μ a := Subtype.ext (by simp) @@ -287,8 +288,8 @@ noncomputable def u1 : LocalGaugeData U1 U1Algebra JetU1 JetU1Algebra where rfl maurerCartan_structure u μ ν := by refine Subtype.ext ?_ - show pderiv ℂ μ (Complex.I • (pderiv ℂ ν (u : JetRing) * star (u : JetRing))) - - pderiv ℂ ν (Complex.I • (pderiv ℂ μ (u : JetRing) * star (u : JetRing))) + 0 = 0 + show pderiv μ (Complex.I • (pderiv ν (u : JetRing) * star (u : JetRing))) + - pderiv ν (Complex.I • (pderiv μ (u : JetRing) * star (u : JetRing))) + 0 = 0 rw [Derivation.map_smul, Derivation.map_smul, JetU1.pderiv_mcVal_comm, sub_self, add_zero] deriv_adjoint _ _ _ := by simp @@ -302,7 +303,7 @@ noncomputable def u1 : LocalGaugeData U1 U1Algebra JetU1 JetU1Algebra where /-- The iterated derivative on `u(1)` jets is the iterated formal derivative. -/ lemma u1_iteratedDeriv_val (s : Multiset (Fin 1 ⊕ Fin 3)) (a : JetU1Algebra) : - (u1.iteratedDeriv s a : JetRing) = s.foldl (fun h ρ => pderiv ℂ ρ h) (a : JetRing) := by + (u1.iteratedDeriv s a : JetRing) = s.foldl (fun h ρ => pderiv ρ h) (a : JetRing) := by induction s using Multiset.induction_on generalizing a with | empty => rw [iteratedDeriv_zero, LinearMap.id_apply, Multiset.foldl_zero] | cons μ t ih => @@ -325,7 +326,7 @@ noncomputable def u1Factor : U1Factor u1 where φJ a := (a : JetRing) φJ_ofConstantLie _ := rfl φJ_cc_foldl p a := by - show constantCoeff (p.foldl (fun h ρ => pderiv ℂ ρ h) (a : JetRing)) + show constantCoeff (p.foldl (fun h ρ => pderiv ρ h) (a : JetRing)) = constantCoeff (u1.iteratedDeriv p a : JetRing) rw [u1_iteratedDeriv_val] φJ_maurerCartan _ _ := rfl @@ -339,14 +340,14 @@ instance instFaithfulU1 : u1.Faithful where simpa only [u1_evalLie, JetU1.evalLie_val, u1_iteratedDeriv_val] using hs eq_ofConstant_of_maurerCartan_eq_zero {u} h := by have hu : (u : JetRing) * star (u : JetRing) = 1 := Unitary.mul_star_self_of_mem u.2 - have hd : ∀ μ, pderiv ℂ μ (u : JetRing) = 0 := fun μ => by - have h1 : Complex.I • (pderiv ℂ μ (u : JetRing) * star (u : JetRing)) = 0 := + have hd : ∀ μ, pderiv μ (u : JetRing) = 0 := fun μ => by + have h1 : Complex.I • (pderiv μ (u : JetRing) * star (u : JetRing)) = 0 := congrArg Subtype.val (congrFun h μ) - have h2 : pderiv ℂ μ (u : JetRing) * star (u : JetRing) = 0 := by + have h2 : pderiv μ (u : JetRing) * star (u : JetRing) = 0 := by have := congrArg (fun z => (-Complex.I) • z) h1 simpa [smul_smul, Complex.I_mul_I] using this - calc pderiv ℂ μ (u : JetRing) - = pderiv ℂ μ (u : JetRing) * ((u : JetRing) * star (u : JetRing)) := by + calc pderiv μ (u : JetRing) + = pderiv μ (u : JetRing) * ((u : JetRing) * star (u : JetRing)) := by rw [hu, mul_one] _ = 0 := by rw [mul_comm (u : JetRing), ← mul_assoc, h2, zero_mul] exact Subtype.ext (JetRing.eq_C_of_pderiv_eq_zero hd) diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/TransformsIn.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/TransformsIn.lean index dc51469bf..a539bd45f 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/TransformsIn.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/JetComponentSpace/TransformsIn.lean @@ -77,7 +77,7 @@ variable {G : Type} [Group G] /-- The iterated formal derivative of a `V`-valued jet acts on the jet-ring factor of a pure tensor: the value factor carries no spacetime dependence. -/ lemma jetIteratedDeriv_tmul (x : Multiset (Fin 1 ⊕ Fin 3)) (f : JetRing) (v : V) : - jetIteratedDeriv x (f ⊗ₜ[ℂ] v) = (x.foldl (fun h ρ => pderiv ℂ ρ h) f) ⊗ₜ[ℂ] v := by + jetIteratedDeriv x (f ⊗ₜ[ℂ] v) = (x.foldl (fun h ρ => pderiv ρ h) f) ⊗ₜ[ℂ] v := by induction x using Multiset.induction_on generalizing f with | empty => rw [jetIteratedDeriv_zero]; rfl | cons μ t ih => @@ -105,7 +105,7 @@ noncomputable def jetCoeffAt (x : Multiset (Fin 1 ⊕ Fin 3)) : @[simp] lemma jetCoeffAt_tmul (x : Multiset (Fin 1 ⊕ Fin 3)) (f : JetRing) (T : Module.End ℂ V) : jetCoeffAt x (f ⊗ₜ[ℂ] T) - = constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f) • T := by + = constantCoeff (x.foldl (fun h ρ => pderiv ρ h) f) • T := by rw [jetCoeffAt, LinearMap.comp_apply, jetIteratedDeriv_tmul, jetEval_tmul] /-- The Taylor coefficient of a jet of endomorphisms, evaluated at a vector, is the Taylor diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Basic.lean index 6a4389b72..e8366a1b5 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Basic.lean @@ -92,12 +92,12 @@ structure MatrixRep (jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J) (ι : Type) [Fint /-- The base-point Taylor coefficients of the jet action matrix are the action matrices of the base-point Taylor coefficients. -/ jetAct_map_cc_foldl : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (a : 𝔤J), - ((jetAct a).map fun f => constantCoeff (p.foldl (fun h ρ => pderiv ℂ ρ h) f)) + ((jetAct a).map fun f => constantCoeff (p.foldl (fun h ρ => pderiv ρ h) f)) = act (jets.evalLie (jets.iteratedDeriv p a)) /-- The derivative identity: the formal derivative of the matrix of a gauge jet is minus the jet action of its Maurer–Cartan form times the matrix. -/ mat_map_pderiv : ∀ (U : GJ) (μ : Fin 1 ⊕ Fin 3), - (mat U).map (fun f => pderiv ℂ μ f) = -(jetAct (jets.maurerCartan U μ) * mat U) + (mat U).map (fun f => pderiv μ f) = -(jetAct (jets.maurerCartan U μ) * mat U) /-- The equivariance identity: the matrix of a gauge jet intertwines the constant jet action with its adjoint transform. -/ mat_mul_jetAct : ∀ (U : GJ) (c : 𝔤), @@ -120,17 +120,17 @@ jet ring into the internal index. /-- The entrywise formal derivative on `ι → JetRing`, as a `ℂ`-linear map. -/ noncomputable def pderivPi (μ : Fin 1 ⊕ Fin 3) : (ι → JetRing) →ₗ[ℂ] (ι → JetRing) where - toFun w i := pderiv ℂ μ (w i) + toFun w i := pderiv μ (w i) map_add' _ _ := funext fun _ => map_add _ _ _ map_smul' _ _ := funext fun _ => Derivation.map_smul _ _ _ lemma pderivPi_apply (μ : Fin 1 ⊕ Fin 3) (w : ι → JetRing) (i : ι) : - pderivPi μ w i = pderiv ℂ μ (w i) := rfl + pderivPi μ w i = pderiv μ (w i) := rfl /-- The entrywise iterated formal derivative on `ι → JetRing`, as a `ℂ`-linear map. -/ noncomputable def foldPi (x : Multiset (Fin 1 ⊕ Fin 3)) : (ι → JetRing) →ₗ[ℂ] (ι → JetRing) where - toFun w i := x.foldl (fun h ρ => pderiv ℂ ρ h) (w i) + toFun w i := x.foldl (fun h ρ => pderiv ρ h) (w i) map_add' v w := funext fun i => JetRing.foldl_pderiv_add x _ _ map_smul' z v := funext fun i => by simp only [Pi.smul_apply, RingHom.id_apply] @@ -138,10 +138,10 @@ noncomputable def foldPi (x : Multiset (Fin 1 ⊕ Fin 3)) : | empty => rfl | cons ν t ih => rw [Multiset.foldl_cons, Multiset.foldl_cons, Derivation.map_smul] - exact ih (fun i => pderiv ℂ ν (v i)) + exact ih (fun i => pderiv ν (v i)) lemma foldPi_apply (x : Multiset (Fin 1 ⊕ Fin 3)) (w : ι → JetRing) (i : ι) : - foldPi x w i = x.foldl (fun h ρ => pderiv ℂ ρ h) (w i) := rfl + foldPi x w i = x.foldl (fun h ρ => pderiv ρ h) (w i) := rfl lemma foldPi_zero : foldPi (ι := ι) 0 = LinearMap.id := LinearMap.ext fun _ => rfl @@ -163,16 +163,16 @@ lemma ccPi_apply (w : ι → JetRing) (i : ι) : ccPi w i = constantCoeff (w i) /-- The iterated formal derivative is `ℂ`-homogeneous. -/ 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 + 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. -/ 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 + 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] @@ -190,7 +190,7 @@ omit [DecidableEq ι] in lemma ccPi_foldPi_mulVec (x : Multiset (Fin 1 ⊕ Fin 3)) (A : Matrix ι ι JetRing) (v : ι → ℂ) : ccPi (foldPi x (A.mulVec fun k => (C (v k) : JetRing))) - = (A.map fun f => constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)).mulVec v := by + = (A.map fun f => constantCoeff (x.foldl (fun h ρ => pderiv ρ h) f)).mulVec v := by funext j simp only [ccPi_apply, foldPi_apply, Matrix.mulVec, dotProduct, Matrix.map_apply] rw [JetRing.foldl_pderiv_sum, map_sum] @@ -457,7 +457,7 @@ lemma repAlgebra_apply (c : 𝔤) : R.repAlgebra e c = valEnd e (R.act c) := rfl lemma repCoeff_eq (U : GJ) (x : Multiset (Fin 1 ⊕ Fin 3)) : GaugeAlgebraRealization.repCoeff (R.repJet e) U x = valEnd e ((R.mat U).map fun f => - constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) := by + constantCoeff (x.foldl (fun h ρ => pderiv ρ h) f)) := by refine LinearMap.ext fun d => ?_ obtain ⟨t, rfl⟩ : ∃ t, d = e.symm t := ⟨e d, (e.symm_apply_apply d).symm⟩ induction t using TensorProduct.induction_on with @@ -487,15 +487,15 @@ theorem isInfinitesimalActionOf : constructor · intro U μ x have hMcons : ((R.mat U).map fun f => - constantCoeff ((μ ::ₘ x).foldl (fun h ρ => pderiv ℂ ρ h) f)) + constantCoeff ((μ ::ₘ x).foldl (fun h ρ => pderiv ρ h) f)) = -((x.antidiagonal.map fun p => R.act (jets.evalLie (jets.iteratedDeriv p.1 (jets.maurerCartan U μ))) * ((R.mat U).map fun f => - constantCoeff (p.2.foldl (fun h ρ => pderiv ℂ ρ h) f))).sum) := by + constantCoeff (p.2.foldl (fun h ρ => pderiv ρ h) f))).sum) := by rw [show ((R.mat U).map fun f => - constantCoeff ((μ ::ₘ x).foldl (fun h ρ => pderiv ℂ ρ h) f)) - = (((R.mat U).map fun f => pderiv ℂ μ f).map fun f => - constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) from + constantCoeff ((μ ::ₘ x).foldl (fun h ρ => pderiv ρ h) f)) + = (((R.mat 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], R.mat_map_pderiv, @@ -511,7 +511,7 @@ theorem isInfinitesimalActionOf : · intro U x c have hcollapse : ∀ (m : Multiset (Fin 1 ⊕ Fin 3)), (((R.act c).map (C : ℂ → JetRing)).map fun f => - constantCoeff (m.foldl (fun h ρ => pderiv ℂ ρ h) f)) + constantCoeff (m.foldl (fun h ρ => pderiv ρ h) f)) = if m = 0 then R.act c else 0 := by intro m rcases eq_or_ne m 0 with rfl | hm @@ -520,23 +520,23 @@ theorem isInfinitesimalActionOf : · refine Matrix.ext fun i j => ?_ simp [Matrix.map_apply, JetRing.foldl_pderiv_C_of_ne_zero hm, hm] have hMact : ((R.mat U).map fun f => - constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) * R.act c + constantCoeff (x.foldl (fun h ρ => pderiv ρ h) f)) * R.act c = (x.antidiagonal.map fun p => R.act (jets.adjointCoeff U p.1 c) * ((R.mat U).map fun f => - constantCoeff (p.2.foldl (fun h ρ => pderiv ℂ ρ h) f))).sum := by + constantCoeff (p.2.foldl (fun h ρ => pderiv ρ h) f))).sum := by have h1 : ((R.mat U * R.jetAct (jets.ofConstantLie c)).map - fun f => constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) + fun f => constantCoeff (x.foldl (fun h ρ => pderiv ρ h) f)) = ((R.mat U).map fun f => - constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) * R.act c := by + constantCoeff (x.foldl (fun h ρ => pderiv ρ h) f)) * R.act c := by rw [R.jetAct_ofConstantLie, JetRing.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 => ((R.mat U).map fun f => - constantCoeff (p.1.foldl (fun h ρ => pderiv ℂ ρ h) f)) * + constantCoeff (p.1.foldl (fun h ρ => pderiv ρ h) f)) * (if p.2 = 0 then R.act c else 0)) - (fun p _ hp => by rw [if_neg hp, Matrix.mul_zero]), - if_pos rfl] + (fun p _ hp => by rw [ite_eq_right hp, Matrix.mul_zero]), + ite_eq_left rfl] rw [← h1, R.mat_mul_jetAct, JetRing.matrix_constantCoeff_foldl_pderiv_mul] exact congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => by rw [R.jetAct_map_cc_foldl, jets.adjointCoeff_apply]) diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Constructions.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Constructions.lean index 3fa486f43..de138ca7d 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Constructions.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Constructions.lean @@ -153,9 +153,9 @@ noncomputable def kron (R₁ : MatrixRep jets ι₁) (R₂ : MatrixRep jets ι kronecker_one_map _ (by simp), one_kronecker_map _ (by simp), R₁.jetAct_map_cc_foldl, R₂.jetAct_map_cc_foldl] mat_map_pderiv U μ := by - have hleib : (R₁.mat U ⊗ₖ R₂.mat U).map (fun f => pderiv ℂ μ f) - = ((R₁.mat U).map fun f => pderiv ℂ μ f) ⊗ₖ R₂.mat U - + R₁.mat U ⊗ₖ ((R₂.mat U).map fun f => pderiv ℂ μ f) := by + have hleib : (R₁.mat U ⊗ₖ R₂.mat U).map (fun f => pderiv μ f) + = ((R₁.mat U).map fun f => pderiv μ f) ⊗ₖ R₂.mat U + + R₁.mat U ⊗ₖ ((R₂.mat U).map fun f => pderiv μ f) := by refine Matrix.ext fun i j => ?_ simp only [Matrix.map_apply, Matrix.kroneckerMap_apply, Matrix.add_apply] rw [Derivation.leibniz, smul_eq_mul, smul_eq_mul] @@ -180,7 +180,7 @@ variable {ι : Type} [Fintype ι] [DecidableEq ι] /-- The iterated formal derivative commutes with conjugation. -/ lemma foldl_pderiv_star (x : Multiset (Fin 1 ⊕ Fin 3)) (f : JetRing) : - x.foldl (fun h ρ => pderiv ℂ ρ h) (star f) = star (x.foldl (fun h ρ => pderiv ℂ ρ h) f) := by + x.foldl (fun h ρ => pderiv ρ h) (star f) = star (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, JetRing.pderiv_star, ih, Multiset.foldl_cons] @@ -211,8 +211,8 @@ noncomputable def conj (R : MatrixRep jets ι) : MatrixRep jets ι where rw [← R.jetAct_map_cc_foldl, Matrix.map_map, Matrix.map_map] congr 1 funext f - show constantCoeff (p.foldl (fun h ρ => pderiv ℂ ρ h) (star f)) - = star (constantCoeff (p.foldl (fun h ρ => pderiv ℂ ρ h) f)) + show constantCoeff (p.foldl (fun h ρ => pderiv ρ h) (star f)) + = star (constantCoeff (p.foldl (fun h ρ => pderiv ρ h) f)) rw [foldl_pderiv_star, JetRing.constantCoeff_star] mat_map_pderiv U μ := by show ((R.mat U).map _).map _ = -((R.jetAct _).map _ * (R.mat U).map _) diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Factors.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Factors.lean index c6a387746..eeb473419 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Factors.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Factors.lean @@ -59,12 +59,12 @@ namespace MatterField /-- **The derivative of a power of a unitary jet**: `∂_μ (u ^ n) = n · u ^ n · (u⁻¹ ∂_μ u)`, for every integer `n`. -/ lemma pderiv_chargePow (n : ℤ) (w : unitary JetRing) (μ : Fin 1 ⊕ Fin 3) : - pderiv ℂ μ (chargePow n w) - = (n : ℂ) • (chargePow n w * (star (w : JetRing) * pderiv ℂ μ (w : JetRing))) := by + pderiv μ (chargePow n w) + = (n : ℂ) • (chargePow n w * (star (w : JetRing) * pderiv μ (w : JetRing))) := by have hws : (w : JetRing) * star (w : JetRing) = 1 := Unitary.mul_star_self_of_mem w.2 have hsw : star (w : JetRing) * (w : JetRing) = 1 := Unitary.star_mul_self_of_mem w.2 - have hD : pderiv ℂ μ (star (w : JetRing)) - = -(star (w : JetRing)) ^ 2 • pderiv ℂ μ (w : JetRing) := + have hD : pderiv μ (star (w : JetRing)) + = -(star (w : JetRing)) ^ 2 • pderiv μ (w : JetRing) := Derivation.leibniz_of_mul_eq_one _ hsw rcases n with k | k · rw [show chargePow (Int.ofNat k) w = (w : JetRing) ^ k from by simp [chargePow], @@ -107,11 +107,11 @@ structure U1Factor (jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J) where φJ : 𝔤J → JetRing φJ_ofConstantLie : ∀ c, φJ (jets.ofConstantLie c) = C (φ c) φJ_cc_foldl : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (a : 𝔤J), - constantCoeff (p.foldl (fun h ρ => pderiv ℂ ρ h) (φJ a)) + constantCoeff (p.foldl (fun h ρ => pderiv ρ h) (φJ a)) = φ (jets.evalLie (jets.iteratedDeriv p a)) φJ_maurerCartan : ∀ (U : GJ) (μ : Fin 1 ⊕ Fin 3), φJ (jets.maurerCartan U μ) - = Complex.I • (pderiv ℂ μ (u U : JetRing) * star (u U : JetRing)) + = Complex.I • (pderiv μ (u U : JetRing) * star (u U : JetRing)) φJ_adjoint : ∀ (U : GJ) (c : 𝔤), φJ (jets.adjoint U (jets.ofConstantLie c)) = φJ (jets.ofConstantLie c) @@ -125,7 +125,7 @@ open MatterField /-- The derivative of the charge-`n` power of the unitary jet of a gauge jet, in terms of the Maurer–Cartan form: `∂_μ (u ^ n) = -(i n) φJ (ω_μ U) · u ^ n`. -/ lemma pderiv_chargePow_u (n : ℤ) (U : GJ) (μ : Fin 1 ⊕ Fin 3) : - pderiv ℂ μ (chargePow n (F.u U)) + pderiv μ (chargePow n (F.u U)) = -(((Complex.I * n) • F.φJ (jets.maurerCartan U μ)) * chargePow n (F.u U)) := by rw [pderiv_chargePow, F.φJ_maurerCartan, smul_smul, show Complex.I * n * Complex.I = -(n : ℂ) from by @@ -180,9 +180,9 @@ noncomputable def charge (n : ℤ) (R : MatrixRep jets ι) : MatrixRep jets ι w mat_map_pderiv U μ := by show (chargePow n (F.u U) • R.mat U).map _ = -((R.jetAct _ + ((Complex.I * n) • F.φJ _) • 1) * (chargePow n (F.u U) • R.mat U)) - have hleib : (chargePow n (F.u U) • R.mat U).map (fun f => pderiv ℂ μ f) - = pderiv ℂ μ (chargePow n (F.u U)) • R.mat U - + chargePow n (F.u U) • ((R.mat U).map fun f => pderiv ℂ μ f) := by + have hleib : (chargePow n (F.u U) • R.mat U).map (fun f => pderiv μ f) + = pderiv μ (chargePow n (F.u U)) • R.mat U + + chargePow n (F.u U) • ((R.mat U).map fun f => pderiv μ f) := by refine Matrix.ext fun i j => ?_ simp only [Matrix.map_apply, Matrix.smul_apply, Matrix.add_apply, smul_eq_mul] rw [Derivation.leibniz, smul_eq_mul, smul_eq_mul] @@ -222,11 +222,11 @@ structure SUFactor (jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J) (n : Type) [Fintyp φJ : 𝔤J → Matrix n n JetRing φJ_ofConstantLie : ∀ c, φJ (jets.ofConstantLie c) = (φ c).map (C : ℂ → JetRing) φJ_cc_foldl : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (a : 𝔤J), - ((φJ a).map fun f => constantCoeff (p.foldl (fun h ρ => pderiv ℂ ρ h) f)) + ((φJ a).map fun f => constantCoeff (p.foldl (fun h ρ => pderiv ρ h) f)) = φ (jets.evalLie (jets.iteratedDeriv p a)) φJ_maurerCartan : ∀ (U : GJ) (μ : Fin 1 ⊕ Fin 3), φJ (jets.maurerCartan U μ) - = Complex.I • (((u U).map fun f => pderiv ℂ μ f) * star (u U)) + = Complex.I • (((u U).map fun f => pderiv μ f) * star (u U)) φJ_adjoint : ∀ (U : GJ) (c : 𝔤), φJ (jets.adjoint U (jets.ofConstantLie c)) = u U * φJ (jets.ofConstantLie c) * star (u U) diff --git a/Physlib/Mathematics/LeviCivita/Basic.lean b/Physlib/Mathematics/LeviCivita/Basic.lean index 5b07d4173..327652ce5 100644 --- a/Physlib/Mathematics/LeviCivita/Basic.lean +++ b/Physlib/Mathematics/LeviCivita/Basic.lean @@ -46,7 +46,7 @@ permutation via `Matrix.det_permutation`. - C. Antisymmetry - D. Vanishing on repeated indices - E. Contraction against a matrix -- E. Closed form on `Fin n` +- F. Closed form on `Fin n` ## iv. References @@ -213,8 +213,11 @@ lemma sum_leviCivitaSymbol_mul_prod (M : Matrix ι ι R) (a : ι → ι) : Fintype.prod_boole, hfun, mul_ite, mul_one, mul_zero, ite_mul, zero_mul] rw [Finset.sum_comm] refine Finset.sum_congr rfl fun σ _ => ?_ - rw [Finset.sum_ite_eq' Finset.univ, if_pos (Finset.mem_univ _)] -## E. Closed form on `Fin n` + rw [Finset.sum_ite_eq' Finset.univ, ite_eq_left (Finset.mem_univ _)] + +/-! + +## F. Closed form on `Fin n` -/ diff --git a/Physlib/Mathematics/MvPolynomialTranslation.lean b/Physlib/Mathematics/MvPolynomialTranslation.lean index 4bb37e451..aa14d6201 100644 --- a/Physlib/Mathematics/MvPolynomialTranslation.lean +++ b/Physlib/Mathematics/MvPolynomialTranslation.lean @@ -73,9 +73,9 @@ lemma notMem_vars_of_forall_aeval_add_eq (Q : MvPolynomial I R) (j : I) exact hjv) obtain ⟨i, hiQ, hji⟩ := Finset.mem_biUnion.mp h2 by_cases hij : i = j - · rw [if_pos hij, vars_0] at hji + · rw [ite_eq_left hij, vars_0] at hji simp at hji - · rw [if_neg hij, vars_X] at hji + · rw [ite_eq_right hij, vars_X] at hji exact hij (Finset.mem_singleton.mp hji).symm /-- A multivariate polynomial over an infinite integral domain that is invariant @@ -95,8 +95,8 @@ theorem mem_adjoin_range_X_sub_X_of_forall_aeval_add_eq (π : I → I) 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)] + · rw [ite_eq_left hi, aeval_X, ite_eq_left hi] + · rw [ite_eq_right hi, map_add, aeval_X, aeval_X, ite_eq_right hi, ite_eq_left (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)) @@ -122,13 +122,13 @@ theorem mem_adjoin_range_X_sub_X_of_forall_aeval_add_eq (π : I → I) intro i simp only [AlgHom.comp_apply, aeval_X] by_cases hi : π i = i - · rw [if_pos hi] + · rw [ite_eq_left hi] simp only [map_add, aeval_X, aeval_C, algebraMap_eq] - rw [if_pos hi, if_congr (show (i = j) ↔ (π i = π j) from + rw [ite_eq_left 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] + · rw [ite_eq_right 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])), + rw [ite_eq_right hi, ite_eq_right (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 @@ -151,6 +151,6 @@ theorem mem_adjoin_range_X_sub_X_of_forall_aeval_add_eq (π : I → I) rintro _ ⟨_, ⟨i, hi, rfl⟩, rfl⟩ refine ⟨i, ?_⟩ simp only [aeval_X] - rw [if_neg (Set.mem_setOf.mp hi)] + rw [ite_eq_right (Set.mem_setOf.mp hi)] end MvPolynomial diff --git a/Physlib/Mathematics/PolynomialEval.lean b/Physlib/Mathematics/PolynomialEval.lean index d7972186b..0990250c8 100644 --- a/Physlib/Mathematics/PolynomialEval.lean +++ b/Physlib/Mathematics/PolynomialEval.lean @@ -72,8 +72,8 @@ lemma eq_zero_of_forall_eval_algebraMap_eq_zero {k A : Type*} [Field k] [Infinit 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] + · rw [ite_eq_left hm] + · rw [ite_eq_right hm, Polynomial.notMem_support_iff.mp hm, map_zero] have hzero : s = 0 := by refine Polynomial.funext fun c => ?_ have h1 := congrArg φ (h c) @@ -117,8 +117,8 @@ lemma coeff_mapCoeffs {A : Type*} [Semiring A] {f : A → A} (hf0 : f 0 = 0) 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] + · rw [ite_eq_left hn] + · rw [ite_eq_right hn, Polynomial.notMem_support_iff.mp hn, hf0] @[simp] lemma mapCoeffs_zero {A : Type*} [Semiring A] (f : A → A) : mapCoeffs f 0 = 0 := by diff --git a/Physlib/Particles/QED/Basic.lean b/Physlib/Particles/QED/Basic.lean index d9d6994e4..3c3de56ed 100644 --- a/Physlib/Particles/QED/Basic.lean +++ b/Physlib/Particles/QED/Basic.lean @@ -478,8 +478,8 @@ exactly the multinomial weight of the Leibniz rule. 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 - rw [Multiset.sum_antidiagonal_eq_of_fst_ne_zero t _ fun p _ hp => if_neg hp] - exact if_pos rfl + rw [Multiset.sum_antidiagonal_eq_of_fst_ne_zero t _ fun p _ hp => ite_eq_right hp] + exact ite_eq_left rfl /-- The Leibniz convolution of a phase family against a module-valued family of jets, over the antidiagonal of the derivative multiset: the formal @@ -655,7 +655,7 @@ noncomputable def trivial (e : ℝ) : GaugeJet e where phase s := if s = 0 then 1 else 0 phase_zero_unitary := by simp phase_deriv s μ := by - rw [if_neg (by simp)] + rw [ite_eq_right (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 diff --git a/Physlib/Particles/QED/Evaluation.lean b/Physlib/Particles/QED/Evaluation.lean index 259e728a9..4dd8cfe16 100644 --- a/Physlib/Particles/QED/Evaluation.lean +++ b/Physlib/Particles/QED/Evaluation.lean @@ -76,7 +76,7 @@ The evaluation map is defined in `Physlib.Particles.QED.Basic`; the concrete sid namespace QED -open Electromagnetism SpaceTime minkowskiMatrix ContDiff +open Electromagnetism SpaceTime minkowskiMatrix ContDiff TensorSpecies Tensor attribute [-simp] Fintype.sum_sum_type @@ -113,9 +113,9 @@ lemma evalPotential_fieldStrength_zero_apply (A : ElectromagneticPotential 3) 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 + η μ μ * η ν ν * toField {A.toFieldStrength x | [μ] [ν]}ᵀ := by rw [evalPotential_fieldStrength_zero_apply A hA μ ν x, - ElectromagneticPotential.toFieldStrength_basis_repr_apply_eq_single (μν := (μ, ν))] + ElectromagneticPotential.toFieldStrength_eval_apply_eq_single A x μ ν] 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 @@ -177,7 +177,7 @@ theorem electricField_eq_evalPotential_fieldStrength (c : SpeedOfLight) 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] + ElectromagneticPotential.electricField_eq_toFieldStrength_eval A t x i hA] simp only [inl_0_inl_0, inr_i_inr_i, one_mul, neg_mul] ring @@ -190,7 +190,7 @@ theorem magneticField_eq_evalPotential_fieldStrength (c : SpeedOfLight) - 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] + ElectromagneticPotential.magneticField_coord_eq_toFieldStrength_eval A t x hA] simp only [inr_i_inr_i, neg_mul, one_mul, neg_neg] /-! @@ -340,10 +340,10 @@ theorem isExtrema_iff_evalPotential_maxwellOperator (𝓕 : FreeSpace) 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] + rw [ElectromagneticPotential.isExtrema_iff_toFieldStrength_eval 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 (μ', ν)) = + have hFmat : ∀ μ' : Fin 1 ⊕ Fin 3, (fun y => toField {A.toFieldStrength y | [μ'] [ν]}ᵀ) = fun y => (η μ' μ' * η ν ν) * evalPotential A (fieldStrength 0 μ' ν) y := by intro μ' funext y @@ -353,10 +353,10 @@ theorem isExtrema_iff_evalPotential_maxwellOperator (𝓕 : FreeSpace) rcases mul_self_eq_one_iff.mp (minkowskiMatrix.η_apply_mul_η_apply_diag ν) with h2' | h2' <;> rw [h1, h2'] <;> ring - calc ∑ μ, ∂_ μ (A.fieldStrengthMatrix · (μ, ν)) x + calc ∑ μ, ∂_ μ (fun y => toField {A.toFieldStrength y | [μ] [ν]}ᵀ) x = ∑ μ, (η μ μ * η ν ν) * ∂_ μ (evalPotential A (fieldStrength 0 μ ν)) x := by refine Finset.sum_congr rfl fun μ _ => ?_ - rw [show (fun y => A.fieldStrengthMatrix y (μ, ν)) = + rw [show (fun y => toField {A.toFieldStrength y | [μ] [ν]}ᵀ) = fun y => (η μ μ * η ν ν) * evalPotential A (fieldStrength 0 μ ν) y from hFmat μ, deriv_const_mul_apply _ _ (hdiffF μ ν)] _ = evalPotential A (maxwellOperator ν) x := by @@ -393,7 +393,7 @@ theorem evalPotential_fieldStrength_lorentzAction (Λ : LorentzGroup 3) have hΛA : Differentiable ℝ (Λ • A) := ElectromagneticPotential.differentiable_action Λ A hA rw [evalPotential_fieldStrength_zero _ hΛA μ ν x, - ElectromagneticPotential.fieldStrengthMatrix_equivariant A Λ hA, + ElectromagneticPotential.toFieldStrength_eval_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] @@ -428,7 +428,7 @@ theorem evalPotential_fieldStrength_gaugeTransform (A : ElectromagneticPotential 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χ] + ElectromagneticPotential.toFieldStrength_eval_gaugeTransform A χ hA hχ] /-- The Maxwell Lagrangian is gauge invariant, as read off from the jet algebra. -/ theorem evalPotential_maxwellTerm_gaugeTransform (A : ElectromagneticPotential 3) diff --git a/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/Basic.lean b/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/Basic.lean index e6ec2ed83..d64770344 100644 --- a/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/Basic.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/Basic.lean @@ -572,7 +572,7 @@ noncomputable def doubletGaugeWeight {ι : Type} (hmul : IsMulRep rep) (x : ι simp piece_eq_bot w hw' := by simp only [Finset.mem_insert, Finset.mem_singleton, not_or] at hw' - rw [if_neg hw'.1, if_neg hw'.2] + rw [ite_eq_right hw'.1, ite_eq_right hw'.2] iSup_piece := by refine le_antisymm (iSup_le fun w => ?_) (iSup_le fun d => iSup_le fun j => ?_) · split_ifs @@ -580,9 +580,9 @@ noncomputable def doubletGaugeWeight {ι : Type} (hmul : IsMulRep rep) (x : ι · exact iSup_mono fun d => le_iSup (fun j => ℂ ∙ x d j) 1 · exact bot_le · fin_cases j - · exact le_iSup_of_le w₀ (by rw [if_pos rfl]; exact le_iSup (fun d => ℂ ∙ x d 0) d) + · exact le_iSup_of_le w₀ (by rw [ite_eq_left rfl]; exact le_iSup (fun d => ℂ ∙ x d 0) d) · exact le_iSup_of_le w₁ - (by rw [if_neg hw.symm, if_pos rfl]; exact le_iSup (fun d => ℂ ∙ x d 1) d) + (by rw [ite_eq_right hw.symm, ite_eq_left rfl]; exact le_iSup (fun d => ℂ ∙ x d 1) d) /-- The gauge weight decomposition of the Higgs submodule: `∇_d H⁰` spans the piece of weight `(0, 0, -1, -3)` and `∇_d H¹` that of weight `(0, 0, 1, -3)`. -/ @@ -777,10 +777,10 @@ lemma coeff_zero_mem_one {x : B} (hx : x ∈ h.higgsAlgebra) : refine h.higgsAlgebra_induction (P := fun x => (massWeightPoly x).coeff 0 ∈ (1 : Submodule ℂ B)) ?_ ?_ ?_ ?_ ?_ hx · intro n d φ - rw [h.H_massWeight, Polynomial.coeff_monomial, if_neg (by omega)] + rw [h.H_massWeight, Polynomial.coeff_monomial, ite_eq_right (by omega)] exact zero_mem _ · intro n d φ - rw [h.barH_massWeight, Polynomial.coeff_monomial, if_neg (by omega)] + rw [h.barH_massWeight, Polynomial.coeff_monomial, ite_eq_right (by omega)] exact zero_mem _ · intro r rw [AlgHom.commutes] @@ -857,7 +857,7 @@ lemma coeff_mem_of_pos {x : B} (hx : x ∈ h.higgsAlgebra) (m : ℕ) (hm : 0 < m · exact zero_mem _ · intro r m hm rw [AlgHom.commutes] - simp only [Polynomial.algebraMap_apply, Polynomial.coeff_C, if_neg (by omega : ¬ m = 0)] + simp only [Polynomial.algebraMap_apply, Polynomial.coeff_C, ite_eq_right (by omega : ¬ m = 0)] exact zero_mem _ · intro x y _ _ ihx ihy m hm rw [map_add, Polynomial.coeff_add] @@ -891,7 +891,7 @@ theorem massWeightSubmodule_eq (i : ℕ) (hi : 0 < i) : refine le_antisymm (fun b hb => ?_) (sup_le ?_ ?_) · have hmain := h.coeff_mem_of_pos (h.mem_higgsAlgebra_of_mem_massWeightSubmodule hb) i hi rwa [h.massWeightPoly_of_mem_massWeightSubmodule hb, Polynomial.coeff_monomial, - if_pos rfl] at hmain + ite_eq_left rfl] at hmain · refine iSup₂_le fun k hk => ?_ exact (sup_le (h.massWeightSubmodule_higgsSubmodule_le (k : ℕ)) (h.massWeightSubmodule_barHiggsSubmodule_le (k : ℕ))).trans @@ -1217,13 +1217,13 @@ noncomputable def trivialWeightDecomposition (i : Fin 3) : piece_le k := by by_cases hk : k = 0 · subst hk - rw [if_pos rfl] + rw [ite_eq_left rfl] intro x _ t ht simp - · rw [if_neg hk] + · rw [ite_eq_right 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])) + piece_eq_bot k hk := ite_eq_right (by simpa using hk) + iSup_piece := le_antisymm le_top (le_iSup_of_le 0 (by rw [ite_eq_left rfl])) @[simp] lemma trivialWeightDecomposition_piece (i : Fin 3) (k : ℤ) : diff --git a/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/DerivSubmodule/BoostWeightDecomposition.lean b/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/DerivSubmodule/BoostWeightDecomposition.lean index ced439f79..316abcbd1 100644 --- a/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/DerivSubmodule/BoostWeightDecomposition.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/DerivSubmodule/BoostWeightDecomposition.lean @@ -54,13 +54,13 @@ noncomputable def ofTrivialAction (rep : Representation K SL(2,ℂ) M) piece_le k := by by_cases hk : k = 0 · subst hk - rw [if_pos rfl] + rw [ite_eq_left rfl] intro x _ t ht rw [htriv, zpow_zero, one_smul] - · rw [if_neg hk] + · rw [ite_eq_right 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])) + piece_eq_bot k hk := ite_eq_right (by simpa using hk) + iSup_piece := le_antisymm le_top (le_iSup_of_le 0 (by rw [ite_eq_left rfl])) /-- The pieces of a trivial action: everything in weight zero, nothing elsewhere. -/ @[simp] @@ -245,8 +245,8 @@ lemma higgsSubmoduleBoostWeight_piece (n : ℕ) (i : Fin 3) (k : ℤ) : 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), + WeightDecomposition.ofTrivialAction_piece, ite_eq_left rfl, Submodule.map_top, iSup_pos hc] + · rw [higgsValueWeight, WeightDecomposition.ofTrivialAction_piece, ite_eq_right (by omega), Submodule.map_bot, iSup_neg hc] /-- The weight-`k` piece of the conjugate-Higgs submodule is the join of the light-cone @@ -261,8 +261,8 @@ lemma barHiggsSubmoduleBoostWeight_piece (n : ℕ) (i : Fin 3) (k : ℤ) : 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), + WeightDecomposition.ofTrivialAction_piece, ite_eq_left rfl, Submodule.map_top, iSup_pos hc] + · rw [barHiggsValueWeight, WeightDecomposition.ofTrivialAction_piece, ite_eq_right (by omega), Submodule.map_bot, iSup_neg hc] /-! diff --git a/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/MassWeight/GaugeWeightDecomposition.lean b/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/MassWeight/GaugeWeightDecomposition.lean index 1e21e9efd..b902ef0da 100644 --- a/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/MassWeight/GaugeWeightDecomposition.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/MassWeight/GaugeWeightDecomposition.lean @@ -204,29 +204,29 @@ lemma derivSubmoduleGaugeWeight_piece_eq (n : ℕ) (w : GaugeWeight) : 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] + rw [h.derivSubmoduleGaugeWeight_piece_eq, ite_eq_left rfl, ite_eq_right (by decide), + ite_eq_right (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] + rw [h.derivSubmoduleGaugeWeight_piece_eq, ite_eq_right (by decide), ite_eq_left rfl, + ite_eq_right (by decide), ite_eq_right (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] + rw [h.derivSubmoduleGaugeWeight_piece_eq, ite_eq_right (by decide), ite_eq_right (by decide), + ite_eq_left 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] + rw [h.derivSubmoduleGaugeWeight_piece_eq, ite_eq_right (by decide), ite_eq_right (by decide), + ite_eq_right (by decide), ite_eq_left rfl, bot_sup_eq] /-- A derivative submodule has no weight-zero content: every Higgs symbol carries hypercharge. -/ @@ -320,7 +320,7 @@ lemma derivSubmodule_zero_pow_four_piece_zero : = 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, + h.derivSubmoduleGaugeWeight_piece_eq, ite_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, diff --git a/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/MassWeight/MassDimLTEight.lean b/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/MassWeight/MassDimLTEight.lean index c6d8616c2..9969ea894 100644 --- a/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/MassWeight/MassDimLTEight.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/MassWeight/MassDimLTEight.lean @@ -314,7 +314,7 @@ theorem exists_mem_of_gauge_lorentz_invariant_massWeightSubmodule_lt_eight_sup ( · obtain ⟨y, hyS, hyG, hxy⟩ := h.exists_mem_of_invariant_massWeightSubmodule_four_sup S hS hx hG have hxy' : x - y ∈ h.lorentzContractionLTEightSpan 4 := by - rw [lorentzContractionLTEightSpan, if_pos rfl] + rw [lorentzContractionLTEightSpan, ite_eq_left rfl] exact hxy refine ⟨y, hyS, hyG, fun g => ?_, hxy'⟩ have hfix : repLorentz g (x - y) = x - y := diff --git a/Physlib/Particles/StandardModel/AlgebraRealization/MassWeight/Filtration.lean b/Physlib/Particles/StandardModel/AlgebraRealization/MassWeight/Filtration.lean index de5738af0..bea9fcf8c 100644 --- a/Physlib/Particles/StandardModel/AlgebraRealization/MassWeight/Filtration.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/MassWeight/Filtration.lean @@ -231,7 +231,7 @@ lemma eq_sum_coeff_massWeightPoly {w : ℕ} {x : B} (hx : x ∈ h.massWeightSubm LinearMap.coe_sum, Finset.sum_apply, LinearMap.coe_comp, Function.comp_apply, LinearMap.coe_restrictScalars, Polynomial.lcoeff_apply, AlgHom.toLinearMap_apply, h.massWeightPoly_of_mem_massWeightSubmodule hy, Polynomial.coeff_monomial, - Finset.sum_ite_eq, Finset.mem_range, Nat.lt_succ_of_le hj, if_true, sub_self] + Finset.sum_ite_eq, Finset.mem_range, Nat.lt_succ_of_le hj, ite_true, sub_self] have h2 := key hx simp only [LinearMap.mem_ker, LinearMap.sub_apply, LinearMap.id_apply, LinearMap.coe_sum, Finset.sum_apply, LinearMap.coe_comp, Function.comp_apply, diff --git a/Physlib/Particles/StandardModel/CovAlgebraRealization/MassWeight.lean b/Physlib/Particles/StandardModel/CovAlgebraRealization/MassWeight.lean index 6315c33ca..d8823cbc9 100644 --- a/Physlib/Particles/StandardModel/CovAlgebraRealization/MassWeight.lean +++ b/Physlib/Particles/StandardModel/CovAlgebraRealization/MassWeight.lean @@ -109,9 +109,9 @@ lemma coeff_massWeightPoly_mem_span (w : ℕ) {x : B} 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] + · rw [ite_eq_left hw] exact Submodule.subset_span ⟨gl, hw, rfl⟩ - · rw [if_neg hw] + · rw [ite_eq_right hw] exact Submodule.zero_mem _ | zero => rw [map_zero, Polynomial.coeff_zero] @@ -134,7 +134,7 @@ lemma massWeightSubmodule_eq_span (w : ℕ) : · 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 + rwa [h1, Polynomial.coeff_monomial, ite_eq_left rfl] at h2 · rintro x ⟨gl, hw, rfl⟩ exact h.list_prod_mem_massWeightSubmodule hw /-! @@ -521,8 +521,8 @@ lemma eq_zero_of_sum_massWeightSubmodule {n : ℕ} {w : Fin n → ℕ} 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 + (fun i _ hne => ite_eq_right fun hcontra => hne (hw hcontra)) + (by simp), ite_eq_left rfl] at hpoly exact hpoly /-- An invariant element decomposes into invariant weight components: if a gauge- diff --git a/Physlib/Particles/StandardModel/CovAlgebraRealization/MassWeight/Invariants.lean b/Physlib/Particles/StandardModel/CovAlgebraRealization/MassWeight/Invariants.lean index 264608c22..0d0ecc2ed 100644 --- a/Physlib/Particles/StandardModel/CovAlgebraRealization/MassWeight/Invariants.lean +++ b/Physlib/Particles/StandardModel/CovAlgebraRealization/MassWeight/Invariants.lean @@ -104,20 +104,20 @@ lemma standardModelSpan_eight : h.standardModelSpan 8 = h.isGaugeSector.lorentzContractionEightSpan ⊔ h.isHiggsSector.lorentzContractionEightSpan ⊔ (h.isFermionSector.kineticSpan ⊔ h.yukawaSpan) := - if_pos rfl + ite_eq_left rfl /-- At mass weight four the span is the line through the Higgs mass term `H† H`, the one invariant of the Standard Model below mass dimension four. -/ lemma standardModelSpan_four : h.standardModelSpan 4 = h.isHiggsSector.dotSpan 0 0 := by - rw [standardModelSpan, if_neg (by norm_num), HiggsAlgebraCovRealization.lorentzContractionLTEightSpan, - if_pos rfl] + rw [standardModelSpan, ite_eq_right (by norm_num), HiggsAlgebraCovRealization.lorentzContractionLTEightSpan, + ite_eq_left rfl] /-- At every mass weight other than four and eight the span is trivial: apart from the Higgs mass term there is no Standard-Model term below mass dimension four. -/ lemma standardModelSpan_eq_bot {w : ℕ} (hw : w ≠ 8) (hw4 : w ≠ 4) : h.standardModelSpan w = ⊥ := by - rw [standardModelSpan, if_neg hw, HiggsAlgebraCovRealization.lorentzContractionLTEightSpan, - if_neg hw4] + rw [standardModelSpan, ite_eq_right hw, HiggsAlgebraCovRealization.lorentzContractionLTEightSpan, + ite_eq_right hw4] /-! @@ -166,7 +166,7 @@ lemma standardModelSpan_le_massWeightSubmodule (w : ℕ) : · subst hw4 exact (h.isHiggsSector.lorentzContractionLTEightSpan_le_massWeightSubmodule 4).trans (h.isHiggsSector_massWeightSubmodule_le (by norm_num)) - · rw [HiggsAlgebraCovRealization.lorentzContractionLTEightSpan, if_neg hw4] + · rw [HiggsAlgebraCovRealization.lorentzContractionLTEightSpan, ite_eq_right hw4] exact bot_le /-- The span at weight `w` is fixed pointwise by the gauge and Lorentz groups together: @@ -265,7 +265,7 @@ lemma peels_sectorMassWeight_higgs {w : ℕ} (hw0 : 0 < w) (hw : w ≤ 8) : h.isHiggsSector.exists_mem_of_gauge_lorentz_invariant_massWeightSubmodule_lt_eight_sup w hw0 hw8 S hSG hSL hx' hG hL refine Submodule.mem_sup.2 ⟨x - y, ?_, y, hyS, by abel⟩ - rwa [standardModelSpan, if_neg (by omega)] + rwa [standardModelSpan, ite_eq_right (by omega)] /-- The fermion sector peels: at weight eight to the ten kinetic terms over the nine family pairs, below it to nothing — there is no Dirac mass term. -/ diff --git a/Physlib/Particles/StandardModel/CovAlgebraRealization/Sectors.lean b/Physlib/Particles/StandardModel/CovAlgebraRealization/Sectors.lean index 4047a5600..5a1016a26 100644 --- a/Physlib/Particles/StandardModel/CovAlgebraRealization/Sectors.lean +++ b/Physlib/Particles/StandardModel/CovAlgebraRealization/Sectors.lean @@ -491,9 +491,9 @@ lemma coeff_massWeightPoly_mem_sectorMassWeight {S : Finset GeneratorClass} {x : 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] + · rw [ite_eq_left hw] exact Submodule.subset_span ⟨gl, hS, hw, rfl⟩ - · rw [if_neg hw] + · rw [ite_eq_right hw] exact Submodule.zero_mem _ | zero => rw [map_zero, Polynomial.coeff_zero] @@ -515,7 +515,7 @@ lemma sectorMassWeight_eq_inf (S : Finset GeneratorClass) (w : ℕ) : 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 + rwa [h1, Polynomial.coeff_monomial, ite_eq_left 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 diff --git a/Physlib/Particles/StandardModel/Fermions/DownSinglet/Basic.lean b/Physlib/Particles/StandardModel/Fermions/DownSinglet/Basic.lean index 59a493c2e..262d849dc 100644 --- a/Physlib/Particles/StandardModel/Fermions/DownSinglet/Basic.lean +++ b/Physlib/Particles/StandardModel/Fermions/DownSinglet/Basic.lean @@ -101,7 +101,7 @@ def valEquiv : DownSinglet ≃ Fermion.RightHandedWeyl ⊗[ℂ] EuclideanSpace instance : AddCommGroup DownSinglet := Equiv.addCommGroup valEquiv -instance : Module ℂ DownSinglet := Equiv.module ℂ valEquiv +instance : Module ℂ DownSinglet := AddEquiv.module ℂ { valEquiv with map_add' _ _ := rfl } /-- The linear identification with the underlying tensor product. -/ def valLinEquiv : DownSinglet ≃ₗ[ℂ] @@ -479,7 +479,7 @@ lemma repJetGaugeGroupI_ofConstant (g : GaugeGroupI) : | zero => simp [show ({ val := 0 } : DownSinglet) = 0 from rfl] | tmul psi c => apply jetValLinEquiv.injective - simp [repJetGaugeGroupI, jetValLinEquiv, repGaugeGroupI] + simp [repJetGaugeGroupI, jetValLinEquiv, repGaugeGroupI, -TensorProduct.congr_symm] 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) diff --git a/Physlib/Particles/StandardModel/Fermions/DownSinglet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/DownSinglet/GaugeAlgebraAction.lean index ca260da45..81a834be7 100644 --- a/Physlib/Particles/StandardModel/Fermions/DownSinglet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/DownSinglet/GaugeAlgebraAction.lean @@ -152,8 +152,8 @@ 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 + 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 => @@ -161,16 +161,16 @@ private lemma pderiv_foldl (μ : Fin 1 ⊕ Fin 3) (x : Multiset (Fin 1 ⊕ Fin 3 /-- 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 + 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 + 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, @@ -185,7 +185,7 @@ noncomputable def jetActionMatrix (a : JetGaugeAlgebra) : Matrix (Fin 3) (Fin 3) 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)) + 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, @@ -219,7 +219,7 @@ lemma repJetGaugeGroupI_eq_downMatrix (U : JetGaugeGroupI) /-- 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) + toFun v := WithLp.toLp 2 fun i => pderiv μ (v.ofLp i) map_add' v w := by refine WithLp.ofLp_injective 2 ?_ funext i @@ -232,7 +232,7 @@ private noncomputable def pderivColour (μ : Fin 1 ⊕ Fin 3) : /-- 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) + 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 @@ -261,8 +261,8 @@ private lemma pderivColour_comp_foldColour (μ : Fin 1 ⊕ Fin 3) 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) + 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 @@ -282,16 +282,16 @@ private lemma jetValLinEquiv_jetDeriv (μ : Fin 1 ⊕ Fin 3) map_zero, map_zero, map_zero] | tmul ψ c => rw [show 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, + = (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 + 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] @@ -347,37 +347,37 @@ set_option maxHeartbeats 1000000 in 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) + (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 + 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) + 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 + * 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) + 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) + * (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 + * 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 + - 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 + = 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 @@ -385,10 +385,10 @@ lemma downMatrix_map_pderiv (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : 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 + 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 + • (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 _ _ @@ -401,7 +401,7 @@ lemma downMatrix_map_pderiv (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : 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) + 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 @@ -426,8 +426,8 @@ lemma downMatrix_mul_jetActionMatrix (U : JetGaugeGroupI) (c : GaugeAlgebra) : /-- 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 + 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] @@ -439,7 +439,7 @@ set_option maxHeartbeats 1000000 in lemma repCoeff_eq (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : GaugeAlgebraRealization.repCoeff repJetGaugeGroupI U x = colourEnd ((downMatrix U).map fun f => - constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) := by + constantCoeff (x.foldl (fun h ρ => pderiv ρ h) f)) := by refine LinearMap.ext fun d => ?_ apply valLinEquiv.injective rw [show GaugeAlgebraRealization.repCoeff repJetGaugeGroupI U x d @@ -474,24 +474,24 @@ lemma repCoeff_eq (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : 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) + 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] + 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) + 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 + 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)) + 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] @@ -515,7 +515,7 @@ lemma repCoeff_zero_of_eval_eq_one {U : JetGaugeGroupI} (hU : U.eval = 1) : 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)) + 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, @@ -537,24 +537,24 @@ theorem isInfinitesimalActionOf : simp only [localGaugeData_evalLie, localGaugeData_iteratedDeriv, localGaugeData_maurerCartan] have hMcons : ((downMatrix U).map fun f => - constantCoeff ((μ ::ₘ x).foldl (fun h ρ => pderiv ℂ ρ h) 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 + 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 + 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)) + 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 + 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], @@ -588,7 +588,7 @@ theorem isInfinitesimalActionOf : 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)) + 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 @@ -597,24 +597,24 @@ theorem isInfinitesimalActionOf : · 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 + constantCoeff (x.foldl (fun h ρ => pderiv ρ h) f)) * actionMatrix c = (x.antidiagonal.map fun p => actionMatrix (localGaugeData.adjointCoeff U p.1 c) * ((downMatrix U).map fun f => - constantCoeff (p.2.foldl (fun h ρ => pderiv ℂ ρ h) f))).sum := by + 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)) + fun f => constantCoeff (x.foldl (fun h ρ => pderiv ρ h) f)) = ((downMatrix U).map fun f => - constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) + constantCoeff (x.foldl (fun h ρ => pderiv ρ h) f)) * actionMatrix c := by rw [hconst, JetRing.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)) * + 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] + (fun p _ hp => by rw [ite_eq_right hp, Matrix.mul_zero]), + ite_eq_left rfl] rw [← h1, downMatrix_mul_jetActionMatrix, JetRing.matrix_constantCoeff_foldl_pderiv_mul] exact congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => by rw [jetActionMatrix_map_cc_foldl, @@ -623,10 +623,10 @@ theorem isInfinitesimalActionOf : = localGaugeData.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))) + constantCoeff (x.foldl (fun h ρ => pderiv ρ h) f))) ∘ₗ gaugeAlgebraAction c = colourEnd (((downMatrix U).map fun f => - constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) + constantCoeff (x.foldl (fun h ρ => pderiv ρ h) f)) * actionMatrix c) from by rw [colourEnd_mul]; rfl, hMact, colourEnd_multiset_sum, Multiset.map_map] diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/Basic.lean b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/Basic.lean index c3f02df43..f3e8d88f2 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/Basic.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/Basic.lean @@ -94,7 +94,7 @@ def valEquiv : LeptonDoublet ≃ Fermion.LeftHandedWeyl ⊗[ℂ] EuclideanSpace instance : AddCommGroup LeptonDoublet := Equiv.addCommGroup valEquiv -instance : Module ℂ LeptonDoublet := Equiv.module ℂ valEquiv +instance : Module ℂ LeptonDoublet := AddEquiv.module ℂ { valEquiv with map_add' _ _ := rfl } /-- The linear identification with the underlying tensor product. -/ def valLinEquiv : LeptonDoublet ≃ₗ[ℂ] diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean index 50dd3a1ed..87cd1df4a 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean @@ -255,7 +255,7 @@ lemma jetActionMatrix_eq (a : JetGaugeAlgebra) : 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)) + constantCoeff (p.foldl (fun h ρ => pderiv ρ h) f)) = actionMatrix (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv p a)) := Model.leptonDoublet.rep.jetAct_map_cc_foldl p a @@ -263,8 +263,8 @@ lemma jetActionMatrix_map_cc_foldl (p : Multiset (Fin 1 ⊕ Fin 3)) (a : JetGaug /-- 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 + 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 => @@ -272,16 +272,16 @@ private lemma pderiv_foldl (μ : Fin 1 ⊕ Fin 3) (x : Multiset (Fin 1 ⊕ Fin 3 /-- 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 + 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 + 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, @@ -296,7 +296,7 @@ noncomputable def jetActionMatrix (a : JetGaugeAlgebra) : Matrix (Fin 2) (Fin 2) 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)) + 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, @@ -335,7 +335,7 @@ lemma repJetGaugeGroupI_eq_doubletMatrix (U : JetGaugeGroupI) /-- 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) + toFun v := WithLp.toLp 2 fun i => pderiv μ (v.ofLp i) map_add' v w := by refine WithLp.ofLp_injective 2 ?_ funext i @@ -348,7 +348,7 @@ private noncomputable def pderivWeak (μ : Fin 1 ⊕ Fin 3) : /-- 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) + 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 @@ -377,8 +377,8 @@ private lemma pderivWeak_comp_foldWeak (μ : Fin 1 ⊕ Fin 3) 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) + 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 @@ -398,16 +398,16 @@ private lemma jetValLinEquiv_jetDeriv (μ : Fin 1 ⊕ Fin 3) map_zero, map_zero, map_zero] | tmul ψ c => rw [show 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, + = (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 + 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] @@ -463,37 +463,37 @@ set_option maxHeartbeats 1000000 in 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) + (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 + 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) + 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 + * 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) + 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) + * (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 + * 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 + - 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 + = 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 @@ -501,10 +501,10 @@ lemma doubletMatrix_map_pderiv (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : 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 + 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 + • (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 _ _ @@ -522,7 +522,7 @@ lemma doubletMatrix_map_pderiv (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : * (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) + 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) @@ -548,8 +548,8 @@ lemma doubletMatrix_mul_jetActionMatrix (U : JetGaugeGroupI) (c : GaugeAlgebra) /-- 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 + 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] @@ -561,7 +561,7 @@ private lemma foldl_pderiv_neg (x : Multiset (Fin 1 ⊕ Fin 3)) (f : JetRing) : lemma repCoeff_eq (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : GaugeAlgebraRealization.repCoeff repJetGaugeGroupI U x = weakEnd ((doubletMatrix U).map fun f => - constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) := + constantCoeff (x.foldl (fun h ρ => pderiv ρ h) f)) := Model.leptonDoublet.rep.repCoeff_eq (LinearEquiv.refl ℂ LeptonDoublet) U x /- The hand-written proof, now derived from the datum: @@ -572,7 +572,7 @@ set_option maxHeartbeats 1000000 in lemma repCoeff_eq (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : GaugeAlgebraRealization.repCoeff repJetGaugeGroupI U x = weakEnd ((doubletMatrix U).map fun f => - constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) := by + constantCoeff (x.foldl (fun h ρ => pderiv ρ h) f)) := by refine LinearMap.ext fun d => ?_ apply valLinEquiv.injective rw [show GaugeAlgebraRealization.repCoeff repJetGaugeGroupI U x d @@ -607,24 +607,24 @@ lemma repCoeff_eq (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : 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) + 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] + 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) + 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 + 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)) + 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] @@ -650,7 +650,7 @@ lemma repCoeff_zero_of_eval_eq_one {U : JetGaugeGroupI} (hU : U.eval = 1) : 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)) + 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_eq, Matrix.smul_apply, @@ -681,24 +681,24 @@ theorem isInfinitesimalActionOf : simp only [localGaugeData_evalLie, localGaugeData_iteratedDeriv, localGaugeData_maurerCartan] have hMcons : ((doubletMatrix U).map fun f => - constantCoeff ((μ ::ₘ x).foldl (fun h ρ => pderiv ℂ ρ h) 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 + 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 + 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)) + 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 + 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], @@ -732,7 +732,7 @@ theorem isInfinitesimalActionOf : 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)) + 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 @@ -741,24 +741,24 @@ theorem isInfinitesimalActionOf : · 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 + constantCoeff (x.foldl (fun h ρ => pderiv ρ h) f)) * actionMatrix c = (x.antidiagonal.map fun p => actionMatrix (localGaugeData.adjointCoeff U p.1 c) * ((doubletMatrix U).map fun f => - constantCoeff (p.2.foldl (fun h ρ => pderiv ℂ ρ h) f))).sum := by + 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)) + fun f => constantCoeff (x.foldl (fun h ρ => pderiv ρ h) f)) = ((doubletMatrix U).map fun f => - constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) + constantCoeff (x.foldl (fun h ρ => pderiv ρ h) f)) * actionMatrix c := by rw [hconst, JetRing.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)) * + 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] + (fun p _ hp => by rw [ite_eq_right hp, Matrix.mul_zero]), + ite_eq_left rfl] rw [← h1, doubletMatrix_mul_jetActionMatrix, JetRing.matrix_constantCoeff_foldl_pderiv_mul] exact congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => by rw [jetActionMatrix_map_cc_foldl, @@ -767,10 +767,10 @@ theorem isInfinitesimalActionOf : = localGaugeData.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))) + constantCoeff (x.foldl (fun h ρ => pderiv ρ h) f))) ∘ₗ gaugeAlgebraAction c = weakEnd (((doubletMatrix U).map fun f => - constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) + constantCoeff (x.foldl (fun h ρ => pderiv ρ h) f)) * actionMatrix c) from by rw [weakEnd_mul]; rfl, hMact, weakEnd_multiset_sum, Multiset.map_map] diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/Basic.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/Basic.lean index 4c41e6ffe..9e9048949 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/Basic.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/Basic.lean @@ -87,7 +87,7 @@ def valEquiv : LeptonSinglet ≃ Fermion.RightHandedWeyl where instance : AddCommGroup LeptonSinglet := Equiv.addCommGroup valEquiv -instance : Module ℂ LeptonSinglet := Equiv.module ℂ valEquiv +instance : Module ℂ LeptonSinglet := AddEquiv.module ℂ { valEquiv with map_add' _ _ := rfl } /-- The linear identification with the underlying Weyl-spinor space. -/ def valLinEquiv : LeptonSinglet ≃ₗ[ℂ] Fermion.RightHandedWeyl where diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/GaugeAlgebraAction.lean index 4212fec25..4233a293b 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/GaugeAlgebraAction.lean @@ -127,16 +127,16 @@ lemma repJetGaugeGroupI_eq_jetPhase (U : JetGaugeGroupI) : /-- 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 + 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 + 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] @@ -146,7 +146,7 @@ private lemma foldl_pderiv_neg (x : Multiset (Fin 1 ⊕ Fin 3)) (f : JetRing) : private lemma jetIteratedDeriv_tmul (x : Multiset (Fin 1 ⊕ Fin 3)) (f : JetRing) (ψ : LeptonSinglet) : jetIteratedDeriv x (f ⊗ₜ[ℂ] ψ) - = (x.foldl (fun h ρ => pderiv ℂ ρ h) f) ⊗ₜ[ℂ] ψ := by + = (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 => @@ -177,7 +177,7 @@ private lemma sum_map_smul_id {α : Type*} (m : Multiset α) (z : α → ℂ) : coefficients of the hypercharge phase. -/ lemma repCoeff_eq (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : GaugeAlgebraRealization.repCoeff repJetGaugeGroupI U x - = constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) (jetPhase U)) + = constantCoeff (x.foldl (fun h ρ => pderiv ρ h) (jetPhase U)) • (LinearMap.id : LeptonSinglet →ₗ[ℂ] LeptonSinglet) := by refine LinearMap.ext fun l => ?_ rw [show GaugeAlgebraRealization.repCoeff repJetGaugeGroupI U x l @@ -207,41 +207,41 @@ lemma repCoeff_zero_of_eval_eq_one {U : JetGaugeGroupI} (hU : U.eval = 1) : 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) + 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 + 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) + 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 + * 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) + 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) + * (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 + * 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 + - 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) + linear_combination (-(6 * pderiv μ ((U.2.2 : unitary JetRing) : JetRing) * (star ((U.2.2 : unitary JetRing) : JetRing)) ^ 7)) * hiC /-! @@ -266,11 +266,11 @@ theorem isInfinitesimalActionOf : · intro U μ x simp only [localGaugeData_evalLie, localGaugeData_iteratedDeriv, localGaugeData_maurerCartan] - have hMcons : constantCoeff ((μ ::ₘ x).foldl (fun h ρ => pderiv ℂ ρ h) (jetPhase U)) + 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 + * 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 @@ -286,41 +286,41 @@ theorem isInfinitesimalActionOf : have hterm : ∀ p : Multiset (Fin 1 ⊕ Fin 3) × Multiset (Fin 1 ⊕ Fin 3), gaugeAlgebraAction (localGaugeData.adjointCoeff U p.1 c) ∘ₗ GaugeAlgebraRealization.repCoeff repJetGaugeGroupI U p.2 - = (Complex.I * (-(6 : ℂ) * constantCoeff (p.1.foldl (fun h ρ => pderiv ℂ ρ h) + = (Complex.I * (-(6 : ℂ) * constantCoeff (p.1.foldl (fun h ρ => pderiv ρ h) (C c.toU1Value))) - * constantCoeff (p.2.foldl (fun h ρ => pderiv ℂ ρ h) (jetPhase U))) + * 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, localGaugeData_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) + (Complex.I * (-(6 : ℂ) * constantCoeff (p.1.foldl (fun h ρ => pderiv ρ h) (C c.toU1Value))) - * constantCoeff (p.2.foldl (fun h ρ => pderiv ℂ ρ h) (jetPhase U))) + * 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) + (Complex.I * (-(6 : ℂ) * constantCoeff (p.1.foldl (fun h ρ => pderiv ρ h) (C c.toU1Value))) - * constantCoeff (p.2.foldl (fun h ρ => pderiv ℂ ρ h) (jetPhase U))) + * 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))) + * 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))) + (fun h ρ => pderiv ρ h) (C c.toU1Value))) + * constantCoeff (p.2.foldl (fun h ρ => pderiv ρ h) (jetPhase U))) • (LinearMap.id : LeptonSinglet →ₗ[ℂ] LeptonSinglet)) (fun p _ hp => hvan p hp), - show ((0 : Multiset (Fin 1 ⊕ Fin 3)).foldl (fun h ρ => pderiv ℂ ρ h) + 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)) + 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 + * 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) diff --git a/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/Basic.lean b/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/Basic.lean index c398d8ff6..69e2d9519 100644 --- a/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/Basic.lean +++ b/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/Basic.lean @@ -66,7 +66,7 @@ The AddCommGroup and module instances are inherited from the underlying tensor p instance : AddCommGroup QuarkDoublet := Equiv.addCommGroup valEquiv -instance : Module ℂ QuarkDoublet := Equiv.module ℂ valEquiv +instance : Module ℂ QuarkDoublet := AddEquiv.module ℂ { valEquiv with map_add' _ _ := rfl } /-- The linear equivalence between `QuarkDoublet` and its underlying tensor product space. -/ def valLinEquiv : QuarkDoublet ≃ₗ[ℂ] @@ -489,7 +489,7 @@ lemma repJetGaugeGroupI_ofConstant (g : GaugeGroupI) : simp | tmul psi c => apply jetValLinEquiv.injective - simp [repJetGaugeGroupI, jetValLinEquiv, repGaugeGroupI] + simp [repJetGaugeGroupI, jetValLinEquiv, repGaugeGroupI, -TensorProduct.congr_symm] 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))) diff --git a/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/GaugeAlgebraAction.lean index a8f4c79d5..d378f9266 100644 --- a/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/GaugeAlgebraAction.lean @@ -188,8 +188,8 @@ 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 + 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 => @@ -197,8 +197,8 @@ private lemma pderiv_foldl (μ : Fin 1 ⊕ Fin 3) (x : Multiset (Fin 1 ⊕ Fin 3 /-- 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 + 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] @@ -215,7 +215,7 @@ noncomputable def jetActionMatrix (a : JetGaugeAlgebra) : 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)) + 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, @@ -258,7 +258,7 @@ lemma repJetGaugeGroupI_eq_jetGaugeMatrix (U : JetGaugeGroupI) 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) + toFun v := WithLp.toLp 2 fun q => pderiv μ (v.ofLp q) map_add' v w := by refine WithLp.ofLp_injective 2 ?_ funext q @@ -272,7 +272,7 @@ private noncomputable def pderivColourWeak (μ : Fin 1 ⊕ Fin 3) : 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) + 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 @@ -301,8 +301,8 @@ private lemma pderivColourWeak_comp_foldColourWeak (μ : Fin 1 ⊕ Fin 3) 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) + 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 @@ -330,11 +330,11 @@ private lemma jetValLinEquiv_jetDeriv (μ : Fin 1 ⊕ Fin 3) | tmul ψ c => rw [show jetDeriv μ (f ⊗ₜ[ℂ] (⟨ψ ⊗ₜ[ℂ] c ⊗ₜ[ℂ] w⟩ : QuarkDoublet)) - = (pderiv ℂ μ f) ⊗ₜ[ℂ] (⟨ψ ⊗ₜ[ℂ] c ⊗ₜ[ℂ] w⟩ : QuarkDoublet) from rfl, + = (pderiv μ f) ⊗ₜ[ℂ] (⟨ψ ⊗ₜ[ℂ] c ⊗ₜ[ℂ] w⟩ : QuarkDoublet) from rfl, show jetValLinEquiv - ((pderiv ℂ μ f) ⊗ₜ[ℂ] (⟨ψ ⊗ₜ[ℂ] c ⊗ₜ[ℂ] w⟩ : QuarkDoublet)) + ((pderiv μ f) ⊗ₜ[ℂ] (⟨ψ ⊗ₜ[ℂ] c ⊗ₜ[ℂ] w⟩ : QuarkDoublet)) = ψ ⊗ₜ[ℂ] (WithLp.toLp 2 fun q => - colourWeakEquiv (c ⊗ₜ[ℂ] w) q • pderiv ℂ μ f) from rfl, + 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, @@ -342,7 +342,7 @@ private lemma jetValLinEquiv_jetDeriv (μ : Fin 1 ⊕ Fin 3) congr 1 refine WithLp.ofLp_injective 2 ?_ funext q - exact (Derivation.map_smul (pderiv ℂ μ) + exact (Derivation.map_smul (pderiv μ) (colourWeakEquiv (c ⊗ₜ[ℂ] w) q) f).symm | add a b ha hb => rw [show ({ val := (a + b) ⊗ₜ[ℂ] w } : QuarkDoublet) @@ -430,10 +430,10 @@ set_option maxHeartbeats 1000000 in 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) + (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 + 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 := @@ -443,15 +443,15 @@ lemma jetGaugeMatrix_map_pderiv (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : 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 + = 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 + = 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)) • + 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) : @@ -460,7 +460,7 @@ lemma jetGaugeMatrix_map_pderiv (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : ((((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 + 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] @@ -468,9 +468,9 @@ lemma jetGaugeMatrix_map_pderiv (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : 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 + 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 _ _ @@ -483,10 +483,10 @@ lemma jetGaugeMatrix_map_pderiv (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : 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) + * (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] + = 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: @@ -513,8 +513,8 @@ lemma jetGaugeMatrix_mul_jetActionMatrix (U : JetGaugeGroupI) (c : GaugeAlgebra) /-- 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 + 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] @@ -526,7 +526,7 @@ set_option maxHeartbeats 1000000 in lemma repCoeff_eq (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : GaugeAlgebraRealization.repCoeff repJetGaugeGroupI U x = colourWeakEnd ((jetGaugeMatrix U).map fun f => - constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) := by + constantCoeff (x.foldl (fun h ρ => pderiv ρ h) f)) := by refine LinearMap.ext fun d => ?_ apply colourWeakValLinEquiv.injective rw [show GaugeAlgebraRealization.repCoeff repJetGaugeGroupI U x d @@ -574,21 +574,21 @@ lemma repCoeff_eq (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : 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)))) + 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))) + 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) + 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))) + 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 => @@ -597,9 +597,9 @@ lemma repCoeff_eq (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : (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))) + 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) + = ∑ 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] @@ -635,7 +635,7 @@ lemma repCoeff_zero_of_eval_eq_one {U : JetGaugeGroupI} (hU : U.eval = 1) : 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)) + 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 @@ -659,24 +659,24 @@ theorem isInfinitesimalActionOf : simp only [localGaugeData_evalLie, localGaugeData_iteratedDeriv, localGaugeData_maurerCartan] have hMcons : ((jetGaugeMatrix U).map fun f => - constantCoeff ((μ ::ₘ x).foldl (fun h ρ => pderiv ℂ ρ h) 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 + 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 + 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)) + 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 + 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], @@ -718,7 +718,7 @@ theorem isInfinitesimalActionOf : ← 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)) + 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 @@ -727,25 +727,25 @@ theorem isInfinitesimalActionOf : · 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 + constantCoeff (x.foldl (fun h ρ => pderiv ρ h) f)) * actionMatrix c = (x.antidiagonal.map fun p => actionMatrix (localGaugeData.adjointCoeff U p.1 c) * ((jetGaugeMatrix U).map fun f => - constantCoeff (p.2.foldl (fun h ρ => pderiv ℂ ρ h) f))).sum := by + 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)) + fun f => constantCoeff (x.foldl (fun h ρ => pderiv ρ h) f)) = ((jetGaugeMatrix U).map fun f => - constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) + constantCoeff (x.foldl (fun h ρ => pderiv ρ h) f)) * actionMatrix c := by rw [hconst, JetRing.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)) * + 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] + (fun p _ hp => by rw [ite_eq_right hp, Matrix.mul_zero]), + ite_eq_left rfl] rw [← h1, jetGaugeMatrix_mul_jetActionMatrix, JetRing.matrix_constantCoeff_foldl_pderiv_mul] exact congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => by @@ -755,10 +755,10 @@ theorem isInfinitesimalActionOf : = localGaugeData.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))) + constantCoeff (x.foldl (fun h ρ => pderiv ρ h) f))) ∘ₗ gaugeAlgebraAction c = colourWeakEnd (((jetGaugeMatrix U).map fun f => - constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) + constantCoeff (x.foldl (fun h ρ => pderiv ρ h) f)) * actionMatrix c) from by rw [colourWeakEnd_mul]; rfl, hMact, colourWeakEnd_multiset_sum, Multiset.map_map] diff --git a/Physlib/Particles/StandardModel/Fermions/UpSinglet/Basic.lean b/Physlib/Particles/StandardModel/Fermions/UpSinglet/Basic.lean index ced960357..fd299c77c 100644 --- a/Physlib/Particles/StandardModel/Fermions/UpSinglet/Basic.lean +++ b/Physlib/Particles/StandardModel/Fermions/UpSinglet/Basic.lean @@ -61,7 +61,7 @@ The AddCommGroup and module instances are inherited from the underlying tensor p instance : AddCommGroup UpSinglet := Equiv.addCommGroup valEquiv -instance : Module ℂ UpSinglet := Equiv.module ℂ valEquiv +instance : Module ℂ UpSinglet := AddEquiv.module ℂ { valEquiv with map_add' _ _ := rfl } /-- The linear equivalence between `UpSinglet` and its underlying tensor product space. -/ def valLinEquiv : UpSinglet ≃ₗ[ℂ] @@ -382,7 +382,7 @@ lemma repJetGaugeGroupI_ofConstant (g : GaugeGroupI) : | zero => simp [show ({ val := 0 } : UpSinglet) = 0 from rfl] | tmul psi c => apply jetValLinEquiv.injective - simp [repJetGaugeGroupI, jetValLinEquiv, repGaugeGroupI] + simp [repJetGaugeGroupI, jetValLinEquiv, repGaugeGroupI, -TensorProduct.congr_symm] have hu : (((JetGaugeGroupI.ofConstant g).2.2 : unitary JetRing) : JetRing) = MvPowerSeries.C ((g.toU1.1 : ℂ)) := rfl have hM : ∀ i j, (((JetGaugeGroupI.ofConstant g).1 : diff --git a/Physlib/Particles/StandardModel/Fermions/UpSinglet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/UpSinglet/GaugeAlgebraAction.lean index 9c06bf622..a140f4b93 100644 --- a/Physlib/Particles/StandardModel/Fermions/UpSinglet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/UpSinglet/GaugeAlgebraAction.lean @@ -162,8 +162,8 @@ 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 + 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 => @@ -171,8 +171,8 @@ private lemma pderiv_foldl (μ : Fin 1 ⊕ Fin 3) (x : Multiset (Fin 1 ⊕ Fin 3 /-- 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 + 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] @@ -186,7 +186,7 @@ noncomputable def jetActionMatrix (a : JetGaugeAlgebra) : Matrix (Fin 3) (Fin 3) 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)) + 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, @@ -220,7 +220,7 @@ lemma repJetGaugeGroupI_eq_upMatrix (U : JetGaugeGroupI) /-- 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) + toFun v := WithLp.toLp 2 fun i => pderiv μ (v.ofLp i) map_add' v w := by refine WithLp.ofLp_injective 2 ?_ funext i @@ -233,7 +233,7 @@ private noncomputable def pderivColour (μ : Fin 1 ⊕ Fin 3) : /-- 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) + 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 @@ -262,8 +262,8 @@ private lemma pderivColour_comp_foldColour (μ : Fin 1 ⊕ Fin 3) 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) + 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 @@ -283,16 +283,16 @@ private lemma jetValLinEquiv_jetDeriv (μ : Fin 1 ⊕ Fin 3) map_zero, map_zero, map_zero] | tmul ψ c => rw [show 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, + = (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 + 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] @@ -348,19 +348,19 @@ set_option maxHeartbeats 1000000 in 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) + (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 + 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) + 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 + * 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) @@ -369,7 +369,7 @@ lemma upMatrix_map_pderiv (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : hleib, hleib, hleib] ring have hm₃U₃ : (maurerCartanForm U μ).toSU3Matrix * U.1.1 - = Complex.I • U.1.1.map (pderiv ℂ μ) := by + = 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 @@ -377,10 +377,10 @@ lemma upMatrix_map_pderiv (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : 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 + 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 + • (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 _ _ @@ -393,10 +393,10 @@ lemma upMatrix_map_pderiv (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : 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) + 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) + - (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 @@ -419,8 +419,8 @@ lemma upMatrix_mul_jetActionMatrix (U : JetGaugeGroupI) (c : GaugeAlgebra) : /-- 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 + 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] @@ -432,7 +432,7 @@ set_option maxHeartbeats 1000000 in lemma repCoeff_eq (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : GaugeAlgebraRealization.repCoeff repJetGaugeGroupI U x = colourEnd ((upMatrix U).map fun f => - constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) := by + constantCoeff (x.foldl (fun h ρ => pderiv ρ h) f)) := by refine LinearMap.ext fun d => ?_ apply valLinEquiv.injective rw [show GaugeAlgebraRealization.repCoeff repJetGaugeGroupI U x d @@ -467,25 +467,25 @@ lemma repCoeff_eq (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : 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) + 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] + 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) + 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 + 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)) + 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], @@ -511,7 +511,7 @@ lemma repCoeff_zero_of_eval_eq_one {U : JetGaugeGroupI} (hU : U.eval = 1) : 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)) + 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, @@ -531,24 +531,24 @@ theorem isInfinitesimalActionOf : simp only [localGaugeData_evalLie, localGaugeData_iteratedDeriv, localGaugeData_maurerCartan] have hMcons : ((upMatrix U).map fun f => - constantCoeff ((μ ::ₘ x).foldl (fun h ρ => pderiv ℂ ρ h) 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 + 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 + 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)) + 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 + 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], @@ -582,7 +582,7 @@ theorem isInfinitesimalActionOf : 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)) + 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 @@ -591,24 +591,24 @@ theorem isInfinitesimalActionOf : · 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 + constantCoeff (x.foldl (fun h ρ => pderiv ρ h) f)) * actionMatrix c = (x.antidiagonal.map fun p => actionMatrix (localGaugeData.adjointCoeff U p.1 c) * ((upMatrix U).map fun f => - constantCoeff (p.2.foldl (fun h ρ => pderiv ℂ ρ h) f))).sum := by + 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)) + fun f => constantCoeff (x.foldl (fun h ρ => pderiv ρ h) f)) = ((upMatrix U).map fun f => - constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) + constantCoeff (x.foldl (fun h ρ => pderiv ρ h) f)) * actionMatrix c := by rw [hconst, JetRing.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)) * + 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] + (fun p _ hp => by rw [ite_eq_right hp, Matrix.mul_zero]), + ite_eq_left rfl] rw [← h1, upMatrix_mul_jetActionMatrix, JetRing.matrix_constantCoeff_foldl_pderiv_mul] exact congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => by rw [jetActionMatrix_map_cc_foldl, @@ -617,10 +617,10 @@ theorem isInfinitesimalActionOf : = localGaugeData.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))) + constantCoeff (x.foldl (fun h ρ => pderiv ρ h) f))) ∘ₗ gaugeAlgebraAction c = colourEnd (((upMatrix U).map fun f => - constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) + constantCoeff (x.foldl (fun h ρ => pderiv ρ h) f)) * actionMatrix c) from by rw [colourEnd_mul]; rfl, hMact, colourEnd_multiset_sum, Multiset.map_map] diff --git a/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean b/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean index 508b31553..d60043ffa 100644 --- a/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean +++ b/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean @@ -272,18 +272,18 @@ noncomputable instance : LieAlgebra ℝ JetGaugeAlgebra where 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) + (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)) + 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)) + 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]) @@ -303,15 +303,15 @@ noncomputable def deriv (μ : Fin 1 ⊕ Fin 3) : JetGaugeAlgebra →ₗ[ℝ] Jet @[simp] lemma deriv_toSU3Matrix (μ : Fin 1 ⊕ Fin 3) (a : JetGaugeAlgebra) : - (deriv μ a).toSU3Matrix = a.toSU3Matrix.map (pderiv ℂ μ) := rfl + (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 + (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 + (deriv μ a).toU1Value = pderiv μ a.toU1Value := rfl /-! @@ -356,7 +356,7 @@ lemma deriv_coord (μ ν : Fin 1 ⊕ Fin 3) (a : JetGaugeAlgebra) : deriv μ (coord ν a) = coord ν (deriv μ a) + if μ = ν then a else 0 := by by_cases h : μ = ν · subst h - rw [if_pos rfl] + rw [ite_eq_left rfl] refine ext_of_matrix ?_ ?_ ?_ · ext i j simp only [deriv_toSU3Matrix, coord_toSU3Matrix, add_toSU3Matrix, Matrix.map_apply, @@ -369,7 +369,7 @@ lemma deriv_coord (μ ν : Fin 1 ⊕ Fin 3) (a : JetGaugeAlgebra) : · simp only [deriv_toU1Value, coord_toU1Value, add_toU1Value, smul_eq_mul, Derivation.leibniz, pderiv_X_self] ring - · rw [if_neg h, add_zero] + · rw [ite_eq_right h, add_zero] refine ext_of_matrix ?_ ?_ ?_ · ext i j simp only [deriv_toSU3Matrix, coord_toSU3Matrix, Matrix.map_apply, Matrix.smul_apply, @@ -403,17 +403,17 @@ lemma deriv_comm (μ ν : Fin 1 ⊕ Fin 3) (a : JetGaugeAlgebra) : 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 + (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 ℂ μ) := + (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 + (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] @@ -484,7 +484,7 @@ lemma iteratedDeriv_singleton (μ : Fin 1 ⊕ Fin 3) : 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 + 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 => @@ -495,7 +495,7 @@ lemma iteratedDeriv_toSU3Matrix (s : Multiset (Fin 1 ⊕ Fin 3)) (a : JetGaugeAl 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 + 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 => @@ -505,7 +505,7 @@ lemma iteratedDeriv_toSU2Matrix (s : Multiset (Fin 1 ⊕ Fin 3)) (a : JetGaugeAl 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 + (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 => @@ -682,21 +682,21 @@ lemma eval_coord (μ : Fin 1 ⊕ Fin 3) (a : JetGaugeAlgebra) : eval (coord μ a /-- 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 + = 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 + = 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 + = constantCoeff (x.foldl (fun h ρ => pderiv ρ h) a.toU1Value) := by rw [eval_toU1Value_eq, iteratedDeriv_toU1Value] diff --git a/Physlib/Particles/StandardModel/GaugeAlgebra/RootDecomposition.lean b/Physlib/Particles/StandardModel/GaugeAlgebra/RootDecomposition.lean index 39ff60852..c8eaec313 100644 --- a/Physlib/Particles/StandardModel/GaugeAlgebra/RootDecomposition.lean +++ b/Physlib/Particles/StandardModel/GaugeAlgebra/RootDecomposition.lean @@ -552,7 +552,7 @@ lemma adjointDecomposition_piece_zero (hmul : IsMulRep rep) ¬ ((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) + exact iSup_congr fun c => ite_eq_left (h3 c) /-- Every weight outside the nine is absent from the adjoint. -/ lemma adjointDecomposition_piece_eq_bot (hmul : IsMulRep rep) diff --git a/Physlib/Particles/StandardModel/GaugeGroup/GaugeWeightDecomposition.lean b/Physlib/Particles/StandardModel/GaugeGroup/GaugeWeightDecomposition.lean index 08f8d0f45..b8ef38c60 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/GaugeWeightDecomposition.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/GaugeWeightDecomposition.lean @@ -509,9 +509,9 @@ noncomputable def spanSingleton (hmul : IsMulRep rep) (x : B) (w : GaugeWeight) simp piece_eq_bot := by intro w' hw' - rw [if_neg (by simpa using hw')] + rw [ite_eq_right (by simpa using hw')] iSup_piece := by - refine le_antisymm (iSup_le fun w' => ?_) (le_iSup_of_le w (by rw [if_pos rfl])) + refine le_antisymm (iSup_le fun w' => ?_) (le_iSup_of_le w (by rw [ite_eq_left rfl])) split_ifs · exact le_rfl · exact bot_le diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2Adjoint.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2Adjoint.lean index 226a6e7c9..11770e05b 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2Adjoint.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2Adjoint.lean @@ -134,7 +134,7 @@ lemma act_su2Flip (k : Fin 3) (c : Fin 3 → ℂ) (a : Fin 3) : act (su2Flip k) c a = ((su2FlipSign k a : ℤ) : ℂ) * c a := by rw [act_apply] 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, + Complex.ofReal_zero, ite_mul, zero_mul, Finset.sum_ite_eq, Finset.mem_univ, ite_true, Complex.ofReal_intCast] /-- A coefficient vector fixed by every isospin rotation is zero: the flip about the axis diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiAdjoint.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiAdjoint.lean index 221c3bfe9..2d6881567 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiAdjoint.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiAdjoint.lean @@ -230,7 +230,7 @@ lemma act_traceCoeff (U : specialUnitaryGroup (Fin 2) ℂ) : act U traceCoeff = · subst h simp [traceCoeff, Fin.prod_univ_two] · simp [traceCoeff, Fin.prod_univ_two, h, Ne.symm h] - simp only [key, Finset.sum_ite_eq', Finset.mem_univ, if_true, ← Complex.ofReal_sum, + simp only [key, Finset.sum_ite_eq', Finset.mem_univ, ite_true, ← Complex.ofReal_sum, sum_su2AdjointMatrix_row_mul] by_cases h : a 0 = a 1 <;> simp [traceCoeff, h] @@ -335,7 +335,7 @@ lemma act_su2Flip (k : Fin 3) (c : (Fin 2 → Fin 3) → ℂ) (a b : Fin 3) : = ((su2FlipSign k a : ℤ) : ℂ) * ((su2FlipSign k b : ℤ) : ℂ) * c ![a, b] := by rw [act_apply, sum_pi_two, Finset.sum_eq_single a, Finset.sum_eq_single b] · simp only [Fin.prod_univ_two, Matrix.cons_val_zero, Matrix.cons_val_one, - su2AdjointMatrix_su2Flip, if_true, Complex.ofReal_intCast] + su2AdjointMatrix_su2Flip, ite_true, Complex.ofReal_intCast] · intro y _ hy simp [-su2AdjointMatrix_apply, su2AdjointMatrix_su2Flip, Ne.symm hy] · simp diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2QuadFundamental.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2QuadFundamental.lean index bf0263c30..a69a7f0cf 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2QuadFundamental.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2QuadFundamental.lean @@ -309,12 +309,12 @@ lemma act_su2Cube (c : (Fin 4 → Fin 2) → ℂ) (l : Fin 4 → Fin 2) : rw [act_apply, Finset.sum_eq_single l] · congr 1 rw [show (∏ i, su2Cube.1 (l i) (l i)) = ∏ i : Fin 4, cubeRoot ^ (1 + (l i : ℕ)) from - Finset.prod_congr rfl fun i _ => by rw [su2Cube_apply, if_pos rfl], + Finset.prod_congr rfl fun i _ => by rw [su2Cube_apply, ite_eq_left rfl], Finset.prod_pow_eq_pow_sum, Finset.sum_add_distrib] simp · intro m _ hm obtain ⟨i, hi⟩ := Function.ne_iff.1 hm - rw [Finset.prod_eq_zero (Finset.mem_univ i) (by rw [su2Cube_apply, if_neg (Ne.symm hi)]), + rw [Finset.prod_eq_zero (Finset.mem_univ i) (by rw [su2Cube_apply, ite_eq_right (Ne.symm hi)]), zero_mul] · simp diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3Adjoint.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3Adjoint.lean index 63ddd7f8d..12c5e9bff 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3Adjoint.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3Adjoint.lean @@ -136,7 +136,7 @@ lemma act_star (U : specialUnitaryGroup (Fin 3) ℂ) (c : Fin 8 → ℂ) : lemma rowAct_su3Parity_apply (k : Fin 3) (c : Fin 8 → ℂ) (a : Fin 8) : rowAct (su3Parity k) c a = ((paritySign k a : ℤ) : ℂ) * c a := by simp only [rowAct, su3AdjointMatrix_su3Parity, apply_ite (fun r : ℝ => (r : ℂ)), - Complex.ofReal_zero, ite_mul, zero_mul, Finset.sum_ite_eq, Finset.mem_univ, if_true, + Complex.ofReal_zero, ite_mul, zero_mul, Finset.sum_ite_eq, Finset.mem_univ, ite_true, Complex.ofReal_intCast] /-- A coefficient vector fixed by every colour rotation is zero: the parities confine it to diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiAdjoint.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiAdjoint.lean index 29065fa27..9d636040b 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiAdjoint.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiAdjoint.lean @@ -254,7 +254,7 @@ lemma act_traceCoeff (U : specialUnitaryGroup (Fin 3) ℂ) : act U traceCoeff = · subst h simp [traceCoeff, Fin.prod_univ_two] · simp [traceCoeff, Fin.prod_univ_two, h, Ne.symm h] - simp only [key, Finset.sum_ite_eq', Finset.mem_univ, if_true, ← Complex.ofReal_sum, + simp only [key, Finset.sum_ite_eq', Finset.mem_univ, ite_true, ← Complex.ofReal_sum, sum_su3AdjointMatrix_row_mul] by_cases h : a 0 = a 1 <;> simp [traceCoeff, h] @@ -322,7 +322,7 @@ lemma rowAct_smul (U : specialUnitaryGroup (Fin 3) ℂ) (z : ℂ) (c : Fin 8 → 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] + Finset.mem_univ, ite_true] /-! diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiFundamental.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiFundamental.lean index 6be4bb5cd..61f460ef6 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiFundamental.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiFundamental.lean @@ -112,7 +112,7 @@ lemma su3Centre_apply (a b : Fin 3) : 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] + · rw [Fin.prod_univ_two, su3Centre_apply, su3Centre_apply, ite_eq_left rfl, ite_eq_left rfl, sq] · intro a _ hal have h : a 0 ≠ l 0 ∨ a 1 ≠ l 1 := by by_contra hc @@ -120,8 +120,8 @@ lemma map_su3Centre {f : B →ₗ[ℂ] B} (hf : IsSU3BiFundamentalMat su3Centre exact hal (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, zero_smul] - · rw [if_neg h, mul_zero, zero_smul] + · rw [ite_eq_right h, zero_mul, zero_smul] + · rw [ite_eq_right h, mul_zero, zero_smul] · intro hl exact absurd (Finset.mem_univ l) hl diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3FunAntiFun.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3FunAntiFun.lean index 06b54571e..3195bee3e 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3FunAntiFun.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3FunAntiFun.lean @@ -165,7 +165,7 @@ lemma act_deltaCoeff (U : specialUnitaryGroup (Fin 3) ℂ) : act U deltaCoeff = · subst h simp [deltaCoeff] · simp [deltaCoeff, h, Ne.symm h] - simp only [key, Finset.sum_ite_eq', Finset.mem_univ, if_true, sum_mul_conj] + simp only [key, Finset.sum_ite_eq', Finset.mem_univ, ite_true, sum_mul_conj] simp [deltaCoeff] /-- The delta contraction: the colour trace of the family. -/ @@ -244,7 +244,7 @@ theorem exists_smul_deltaCoeff_of_act_eq {c : (Fin 2 → Fin 3) → ℂ} have hoff : ∀ a b : Fin 3, a ≠ b → c ![a, b] = 0 := by intro a b hab have h := congrFun (hc (IsSU3BiAdjoint.su3Parity a)) ![a, b] - rw [act_su3Parity, if_pos rfl, if_neg (Ne.symm hab)] at h + rw [act_su3Parity, ite_eq_left rfl, ite_eq_right (Ne.symm hab)] at h linear_combination (-1 / 2 : ℂ) * h have hdiag : ∀ a : Fin 3, c ![a, a] = c ![0, 0] := by have h1 := congrFun (hc su3Perm) ![1, 1] diff --git a/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeGroup/Basic.lean b/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeGroup/Basic.lean index 837d00c44..67e074080 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeGroup/Basic.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeGroup/Basic.lean @@ -204,26 +204,26 @@ and give some properties of it related to the Maurer–Cartan form. 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) + (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 ℂ μ) + · 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 ℂ μ) + · 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 + · 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 @@ -231,27 +231,27 @@ lemma deriv_mul (μ : Fin 1 ⊕ Fin 3) (U V : JetGaugeGroupI) : @[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 + · 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 + 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 + 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 ℂ μ) + · 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 ℂ μ) + · 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) + · 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) : @@ -267,7 +267,7 @@ lemma deriv_mul_inv_toVal_SU3_traceless (μ : Fin 1 ⊕ Fin 3) (U : JetGaugeGrou 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 + 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', @@ -276,7 +276,7 @@ lemma deriv_mul_inv_toVal_SU3_traceless (μ : Fin 1 ⊕ Fin 3) (U : JetGaugeGrou 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, + 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) : @@ -292,14 +292,14 @@ lemma deriv_mul_inv_toVal_SU2_traceless (μ : Fin 1 ⊕ Fin 3) (U : JetGaugeGrou 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 + 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, + 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) : @@ -309,15 +309,15 @@ lemma star_deriv_mul_inv_toVal_SU3 (μ : Fin 1 ⊕ Fin 3) (U : JetGaugeGroupI) : -- 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) := + 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 ℂ μ) := + 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 + (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] + 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] @@ -333,15 +333,15 @@ lemma star_deriv_mul_inv_toVal_SU2 (μ : Fin 1 ⊕ Fin 3) (U : JetGaugeGroupI) : -- 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) := + 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 ℂ μ) := + 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 + (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] + 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] @@ -357,13 +357,13 @@ lemma star_deriv_mul_inv_toVal_U1 (μ : Fin 1 ⊕ Fin 3) (U : JetGaugeGroupI) : -- 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) := + 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 + (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, + 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 @@ -435,13 +435,13 @@ lemma eval_ofConstant (g : GaugeGroupI) : eval (ofConstant g) = g := by 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 + · 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 + · 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 + · show pderiv μ (C U₀.2.2.1 : JetRing) = 0 simp [pderiv_C] end JetGaugeGroupI diff --git a/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeGroup/Truncation.lean b/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeGroup/Truncation.lean index d1b79ccbc..21b2c87bc 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeGroup/Truncation.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/JetGaugeGroup/Truncation.lean @@ -84,7 +84,7 @@ lemma coeff_maurerCartanForm_eq_zero_of_mem_truncationKer (ψ : GaugeAlgebra → (hψ : ψ 0 = 0) (f : JetGaugeAlgebra → JetRing) (hf : ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (a : JetGaugeAlgebra), ψ (JetGaugeAlgebra.eval (JetGaugeAlgebra.iteratedDeriv s a)) = - constantCoeff (s.foldl (fun h ρ => pderiv ℂ ρ h) (f a))) + constantCoeff (s.foldl (fun h ρ => pderiv ρ h) (f a))) {U : JetGaugeGroupI} {n : ℕ} (hU : U ∈ localGaugeData.truncationKer n) (ρ : Fin 1 ⊕ Fin 3) {m : (Fin 1 ⊕ Fin 3) →₀ ℕ} (hm : Finsupp.degree m < n) : coeff m (f (maurerCartanForm U ρ)) = 0 := by @@ -140,15 +140,15 @@ theorem truncation_eq_one_of_mem_truncationKer {U : JetGaugeGroupI} {n : ℕ} rwa [Matrix.mem_unitaryGroup_iff'] at h1 have hstar1 : star U.2.2.1 * U.2.2.1 = 1 := (Unitary.mem_iff.mp U.2.2.2).1 -- the radial relation `∂_ρ U = (−i ω_ρ) U` on each factor - have hd3 : ∀ ρ, U.1.1.map (pderiv ℂ ρ) = + have hd3 : ∀ ρ, U.1.1.map (pderiv ρ) = ((-Complex.I) • (maurerCartanForm U ρ).toSU3Matrix) * U.1.1 := fun ρ => by rw [maurerCartanForm_toSU3Matrix, smul_smul, neg_mul, Complex.I_mul_I, neg_neg, one_smul, mul_assoc, hstar3, mul_one] - have hd2 : ∀ ρ, U.2.1.1.map (pderiv ℂ ρ) = + have hd2 : ∀ ρ, U.2.1.1.map (pderiv ρ) = ((-Complex.I) • (maurerCartanForm U ρ).toSU2Matrix) * U.2.1.1 := fun ρ => by rw [maurerCartanForm_toSU2Matrix, smul_smul, neg_mul, Complex.I_mul_I, neg_neg, one_smul, mul_assoc, hstar2, mul_one] - have hd1 : ∀ ρ, pderiv ℂ ρ U.2.2.1 = + have hd1 : ∀ ρ, pderiv ρ U.2.2.1 = ((-Complex.I) • (maurerCartanForm U ρ).toU1Value) * U.2.2.1 := fun ρ => by rw [maurerCartanForm_toU1Value, smul_smul, neg_mul, Complex.I_mul_I, neg_neg, one_smul, mul_assoc, hstar1, mul_one] diff --git a/Physlib/Particles/StandardModel/GaugeGroup/LocalGaugeData.lean b/Physlib/Particles/StandardModel/GaugeGroup/LocalGaugeData.lean index bda34df3c..3b820d1d3 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/LocalGaugeData.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/LocalGaugeData.lean @@ -169,7 +169,7 @@ lemma localGaugeData_adjointCoeff_toSU3Matrix (U : JetGaugeGroupI) (p : Multiset (Fin 1 ⊕ Fin 3)) (b : GaugeAlgebra) : (localGaugeData.adjointCoeff U p b).toSU3Matrix = ((U.1.1 * b.toSU3Matrix.map (MvPowerSeries.C : ℂ → JetRing) * star U.1.1).map fun f => - MvPowerSeries.constantCoeff (p.foldl (fun h ρ => MvPowerSeries.pderiv ℂ ρ h) f)) := by + MvPowerSeries.constantCoeff (p.foldl (fun h ρ => MvPowerSeries.pderiv ρ h) f)) := by rw [localGaugeData_adjointCoeff_apply, eval_iteratedDeriv_toSU3Matrix, adjointMap_toSU3Matrix, ofConstant_toSU3Matrix] @@ -179,7 +179,7 @@ lemma localGaugeData_adjointCoeff_toSU2Matrix (U : JetGaugeGroupI) (localGaugeData.adjointCoeff U p b).toSU2Matrix = ((U.2.1.1 * b.toSU2Matrix.map (MvPowerSeries.C : ℂ → JetRing) * star U.2.1.1).map fun f => MvPowerSeries.constantCoeff - (p.foldl (fun h ρ => MvPowerSeries.pderiv ℂ ρ h) f)) := by + (p.foldl (fun h ρ => MvPowerSeries.pderiv ρ h) f)) := by rw [localGaugeData_adjointCoeff_apply, eval_iteratedDeriv_toSU2Matrix, adjointMap_toSU2Matrix, ofConstant_toSU2Matrix] @@ -187,7 +187,7 @@ lemma localGaugeData_adjointCoeff_toSU2Matrix (U : JetGaugeGroupI) lemma localGaugeData_adjointCoeff_toU1Value (U : JetGaugeGroupI) (p : Multiset (Fin 1 ⊕ Fin 3)) (b : GaugeAlgebra) : (localGaugeData.adjointCoeff U p b).toU1Value - = MvPowerSeries.constantCoeff (p.foldl (fun h ρ => MvPowerSeries.pderiv ℂ ρ h) + = MvPowerSeries.constantCoeff (p.foldl (fun h ρ => MvPowerSeries.pderiv ρ h) (MvPowerSeries.C b.toU1Value)) := by rw [localGaugeData_adjointCoeff_apply, eval_iteratedDeriv_toU1Value, adjointMap_toU1Value, ofConstant_toU1Value] diff --git a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean index 2fb22664b..2bbbe0283 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean @@ -69,17 +69,17 @@ noncomputable def maurerCartanForm (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : @[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 + 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 + 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 + Complex.I • (pderiv μ U.2.2.1 * star U.2.2.1) := rfl @[simp] lemma maurerCartanForm_one : maurerCartanForm (1 : JetGaugeGroupI) = 0 := by @@ -139,7 +139,7 @@ lemma maurerCartanForm_eq_zero_iff_ofConstant (U : JetGaugeGroupI) : -- 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 + 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] @@ -183,18 +183,18 @@ lemma maurerCartanForm_structure (U : JetGaugeGroupI) (μ ν : Fin 1 ⊕ Fin 3) ⁅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 ℂ ρ) := + (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 + (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 + (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, @@ -202,35 +202,35 @@ lemma maurerCartanForm_structure (U : JetGaugeGroupI) (μ ν : Fin 1 ⊕ Fin 3) 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 + (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) := + 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 + 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 + _ = -(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 ℂ ν) + 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 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 + 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] + 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) + pderiv ρ (star U.2.2.1) * ((mul_comm _ _).trans hu) simp only [Derivation.leibniz, smul_eq_mul] rw [hstar μ, hstar ν, JetRing.pderiv_comm μ ν] ring @@ -268,24 +268,24 @@ lemma exists_deriv_eq_of_maurerCartanForm_structure 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 ℂ ρ) := + (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 + (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 ℂ ρ)) := + (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) := + 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 + (∀ μ, 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 μ), @@ -294,16 +294,16 @@ lemma exists_deriv_eq_of_maurerCartanForm_structure -- 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 ℂ ν) + + (∀ μ ν, (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 + 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 + 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 @@ -314,9 +314,9 @@ lemma exists_deriv_eq_of_maurerCartanForm_structure 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) → + 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 + (∀ μ, 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, @@ -324,7 +324,7 @@ lemma exists_deriv_eq_of_maurerCartanForm_structure 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 + 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, @@ -334,7 +334,7 @@ lemma exists_deriv_eq_of_maurerCartanForm_structure 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 + 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, @@ -379,7 +379,7 @@ lemma exists_deriv_eq_of_maurerCartanForm_structure ⟨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 + 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₁ μ) /-! @@ -404,7 +404,7 @@ lemma deriv_adjointMap (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) (x : JetGauge 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 + (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, @@ -412,26 +412,26 @@ lemma deriv_adjointMap (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) (x : JetGauge 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 + (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) := + 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 + 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] + 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, diff --git a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Freeness.lean b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Freeness.lean index 7aa507d92..ffd66a07d 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Freeness.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Freeness.lean @@ -77,17 +77,17 @@ lemma exists_maurerCartanForm_eq_of_structure 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 + 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 + 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 + 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 @@ -121,7 +121,7 @@ lemma taylorSeries_sum {ι : Type} (t : Finset ι) (f : ι → Multiset (Fin 1 /-- The base-point Taylor data of `taylorSeries f` are `f`. -/ lemma constantCoeff_foldl_pderiv_taylorSeries (f : Multiset (Fin 1 ⊕ Fin 3) → ℂ) (s : Multiset (Fin 1 ⊕ Fin 3)) : - constantCoeff (s.foldl (fun h ρ => pderiv ℂ ρ h) (taylorSeries f)) = f s := by + constantCoeff (s.foldl (fun h ρ => pderiv ρ h) (taylorSeries f)) = f s := by have hfac : ((∏ ν, Nat.factorial (s.count ν) : ℕ) : ℂ) ≠ 0 := Nat.cast_ne_zero.mpr (Finset.prod_ne_zero_iff.mpr fun ν _ => Nat.factorial_ne_zero _) rw [constantCoeff_foldl_pderiv, coeff_taylorSeries, Multiset.toFinsupp_toMultiset, @@ -198,7 +198,7 @@ theorem eval_iteratedDeriv_taylorJet (c : Multiset (Fin 1 ⊕ Fin 3) → GaugeAl /-- The `su(3)` component of the radial Maurer–Cartan component `∑_μ x_μ ω_μ(U)`. -/ lemma radial_toSU3Matrix (U : JetGaugeGroupI) : (localGaugeData.radial U).toSU3Matrix = - ∑ μ, (X μ : JetRing) • (Complex.I • (U.1.1.map (pderiv ℂ μ) * star U.1.1)) := by + ∑ μ, (X μ : JetRing) • (Complex.I • (U.1.1.map (pderiv μ) * star U.1.1)) := by rw [LocalGaugeData.radial, toSU3Matrix_sum] simp only [localGaugeData_coord, localGaugeData_maurerCartan, coord_toSU3Matrix, maurerCartanForm_toSU3Matrix] @@ -206,7 +206,7 @@ lemma radial_toSU3Matrix (U : JetGaugeGroupI) : /-- The `su(2)` component of the radial Maurer–Cartan component. -/ lemma radial_toSU2Matrix (U : JetGaugeGroupI) : (localGaugeData.radial U).toSU2Matrix = - ∑ μ, (X μ : JetRing) • (Complex.I • (U.2.1.1.map (pderiv ℂ μ) * star U.2.1.1)) := by + ∑ μ, (X μ : JetRing) • (Complex.I • (U.2.1.1.map (pderiv μ) * star U.2.1.1)) := by rw [LocalGaugeData.radial, toSU2Matrix_sum] simp only [localGaugeData_coord, localGaugeData_maurerCartan, coord_toSU2Matrix, maurerCartanForm_toSU2Matrix] @@ -214,7 +214,7 @@ lemma radial_toSU2Matrix (U : JetGaugeGroupI) : /-- The `u(1)` component of the radial Maurer–Cartan component. -/ lemma radial_toU1Value (U : JetGaugeGroupI) : (localGaugeData.radial U).toU1Value = - ∑ μ, (X μ : JetRing) • (Complex.I • (pderiv ℂ μ U.2.2.1 * star U.2.2.1)) := by + ∑ μ, (X μ : JetRing) • (Complex.I • (pderiv μ U.2.2.1 * star U.2.2.1)) := by rw [LocalGaugeData.radial, toU1Value_sum] simp only [localGaugeData_coord, localGaugeData_maurerCartan, coord_toU1Value, maurerCartanForm_toU1Value, smul_eq_mul] @@ -230,8 +230,8 @@ lemma exists_eulerTransport_of_radial {κ : Type} [Fintype κ] [DecidableEq κ] V * star V = 1 ∧ (P.trace = 0 → (∀ (M : Matrix κ κ JetRing) (μ : Fin 1 ⊕ Fin 3), - pderiv ℂ μ M.det = (M.map (pderiv ℂ μ) * M.adjugate).trace) → V.det = 1) ∧ - ∑ μ, (X μ : JetRing) • (Complex.I • (V.map (pderiv ℂ μ) * star V)) = P := by + pderiv μ M.det = (M.map (pderiv μ) * M.adjugate).trace) → V.det = 1) ∧ + ∑ μ, (X μ : JetRing) • (Complex.I • (V.map (pderiv μ) * star V)) = P := by 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] @@ -242,8 +242,8 @@ lemma exists_eulerTransport_of_radial {κ : Type} [Fintype κ] [DecidableEq κ] have hVu : V * star V = 1 := eulerTransport_mul_star hRstar hR0 hV0 hEV refine ⟨V, hV0, hVu, fun hPtr hjac => eulerTransport_det hjac (by rw [Matrix.trace_smul, hPtr, smul_zero]) hV0 hEV, ?_⟩ - calc ∑ μ, (X μ : JetRing) • (Complex.I • (V.map (pderiv ℂ μ) * star V)) - = Complex.I • ((∑ μ, (X μ : JetRing) • V.map (pderiv ℂ μ)) * star V) := by + 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] @@ -280,7 +280,7 @@ theorem exists_radial_eq (ρ : JetGaugeAlgebra) (hρ : eval ρ = 0) : have hu0 : constantCoeff (V₁ 0 0) = 1 := by simpa using congrArg (fun M => M (0 : Fin 1) (0 : Fin 1)) hV₁0 have hrad₁' : ∑ μ, (X μ : JetRing) • - (Complex.I • (pderiv ℂ μ (V₁ 0 0) * star (V₁ 0 0))) = ρ.toU1Value := by + (Complex.I • (pderiv μ (V₁ 0 0) * star (V₁ 0 0))) = ρ.toU1Value := 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 diff --git a/Physlib/Particles/StandardModel/GaugeGroup/SU3PermDecomposition.lean b/Physlib/Particles/StandardModel/GaugeGroup/SU3PermDecomposition.lean index 6205f3a2a..9ec971c47 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/SU3PermDecomposition.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/SU3PermDecomposition.lean @@ -157,7 +157,7 @@ lemma su3Weyl_injective : Function.Injective su3Weyl := by 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 + · rw [ite_eq_right h'] at hi exact absurd hi hs /-- The cyclic element is the lift of the three-cycle `finRotate 3`, which is even and so diff --git a/Physlib/Particles/StandardModel/HiggsBoson/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/HiggsBoson/GaugeAlgebraAction.lean index 99925a3e9..ba405d9e0 100644 --- a/Physlib/Particles/StandardModel/HiggsBoson/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/HiggsBoson/GaugeAlgebraAction.lean @@ -150,8 +150,8 @@ 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 + 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 => @@ -159,8 +159,8 @@ private lemma pderiv_foldl (μ : Fin 1 ⊕ Fin 3) (x : Multiset (Fin 1 ⊕ Fin 3 /-- 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 + 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] @@ -174,7 +174,7 @@ noncomputable def jetActionMatrix (a : JetGaugeAlgebra) : Matrix (Fin 2) (Fin 2) 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)) + 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, @@ -193,7 +193,7 @@ lemma jetActionMatrix_map_cc_foldl (p : Multiset (Fin 1 ⊕ Fin 3)) (a : JetGaug /-- 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) + toFun v := WithLp.toLp 2 fun i => pderiv μ (v.ofLp i) map_add' v w := by refine WithLp.ofLp_injective 2 ?_ funext i @@ -206,7 +206,7 @@ private noncomputable def pderivWeak (μ : Fin 1 ⊕ Fin 3) : /-- 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) + 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 @@ -235,8 +235,8 @@ private lemma pderivWeak_comp_foldWeak (μ : Fin 1 ⊕ Fin 3) 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) + 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 @@ -252,7 +252,7 @@ private lemma jetValLinEquiv_jetDeriv (μ : Fin 1 ⊕ Fin 3) rw [jetDeriv_tmul, jetValLinEquiv_tmul, jetValLinEquiv_tmul] refine WithLp.ofLp_injective 2 ?_ funext i - exact (Derivation.map_smul (pderiv ℂ μ) (v.ofLp i) f).symm + 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. -/ @@ -288,14 +288,14 @@ set_option maxHeartbeats 1000000 in 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) + (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 + 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 := @@ -303,7 +303,7 @@ lemma jetGaugeMatrix_map_pderiv (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : 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 + = 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 @@ -311,10 +311,10 @@ lemma jetGaugeMatrix_map_pderiv (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : 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 + 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 + • (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 _ _ @@ -323,8 +323,8 @@ lemma jetGaugeMatrix_map_pderiv (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : 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 ℂ μ))] + 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, @@ -334,12 +334,12 @@ lemma jetGaugeMatrix_map_pderiv (U : JetGaugeGroupI) (μ : Fin 1 ⊕ Fin 3) : * ((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) + 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) + - (3 * pderiv μ ((U.2.2 : unitary JetRing) : JetRing) * ((U.2.2 : unitary JetRing) : JetRing) * ((U.2.2 : unitary JetRing) : JetRing)) * huu @@ -367,8 +367,8 @@ lemma jetGaugeMatrix_mul_jetActionMatrix (U : JetGaugeGroupI) (c : GaugeAlgebra) /-- 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 + 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] @@ -380,7 +380,7 @@ set_option maxHeartbeats 1000000 in lemma repCoeff_eq (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : GaugeAlgebraRealization.repCoeff repJetGaugeGroupI U x = weakEnd ((jetGaugeMatrix U).map fun f => - constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) := by + constantCoeff (x.foldl (fun h ρ => pderiv ρ h) f)) := by refine LinearMap.ext fun v => ?_ rw [show GaugeAlgebraRealization.repCoeff repJetGaugeGroupI U x v = jetEval (jetIteratedDeriv x @@ -390,18 +390,18 @@ lemma repCoeff_eq (U : JetGaugeGroupI) (x : Multiset (Fin 1 ⊕ Fin 3)) : jetValLinEquiv_tmul] refine WithLp.ofLp_injective 2 ?_ funext j - show constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) + 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 + 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)) + 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] @@ -424,7 +424,7 @@ lemma repCoeff_zero_of_eval_eq_one {U : JetGaugeGroupI} (hU : U.eval = 1) : 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)) + 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, @@ -444,24 +444,24 @@ theorem isInfinitesimalActionOf : simp only [localGaugeData_evalLie, localGaugeData_iteratedDeriv, localGaugeData_maurerCartan] have hMcons : ((jetGaugeMatrix U).map fun f => - constantCoeff ((μ ::ₘ x).foldl (fun h ρ => pderiv ℂ ρ h) 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 + 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 + 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)) + 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 + 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], @@ -495,7 +495,7 @@ theorem isInfinitesimalActionOf : 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)) + 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 @@ -504,24 +504,24 @@ theorem isInfinitesimalActionOf : · 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 + constantCoeff (x.foldl (fun h ρ => pderiv ρ h) f)) * actionMatrix c = (x.antidiagonal.map fun p => actionMatrix (localGaugeData.adjointCoeff U p.1 c) * ((jetGaugeMatrix U).map fun f => - constantCoeff (p.2.foldl (fun h ρ => pderiv ℂ ρ h) f))).sum := by + 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)) + fun f => constantCoeff (x.foldl (fun h ρ => pderiv ρ h) f)) = ((jetGaugeMatrix U).map fun f => - constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) + constantCoeff (x.foldl (fun h ρ => pderiv ρ h) f)) * actionMatrix c := by rw [hconst, JetRing.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)) * + 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] + (fun p _ hp => by rw [ite_eq_right hp, Matrix.mul_zero]), + ite_eq_left rfl] rw [← h1, jetGaugeMatrix_mul_jetActionMatrix, JetRing.matrix_constantCoeff_foldl_pderiv_mul] exact congrArg Multiset.sum (Multiset.map_congr rfl fun p hp => by @@ -531,10 +531,10 @@ theorem isInfinitesimalActionOf : = localGaugeData.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))) + constantCoeff (x.foldl (fun h ρ => pderiv ρ h) f))) ∘ₗ gaugeAlgebraAction c = weakEnd (((jetGaugeMatrix U).map fun f => - constantCoeff (x.foldl (fun h ρ => pderiv ℂ ρ h) f)) + constantCoeff (x.foldl (fun h ρ => pderiv ρ h) f)) * actionMatrix c) from by rw [weakEnd_mul]; rfl, hMact, weakEnd_multiset_sum, Multiset.map_map] diff --git a/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/Basic.lean b/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/Basic.lean index 15f54c22c..32f8b2fc9 100644 --- a/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/Basic.lean +++ b/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/Basic.lean @@ -203,25 +203,25 @@ lemma massWeightSubmodule_eq (i : ℕ) (hi : 0 < i) : 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)] + · rw [h.massWeight_d, Polynomial.coeff_monomial, ite_eq_right (by omega)] exact zero_mem _ - · rw [h.massWeight_bard, Polynomial.coeff_monomial, if_neg (by omega)] + · rw [h.massWeight_bard, Polynomial.coeff_monomial, ite_eq_right (by omega)] exact zero_mem _ - · rw [h.massWeight_u, Polynomial.coeff_monomial, if_neg (by omega)] + · rw [h.massWeight_u, Polynomial.coeff_monomial, ite_eq_right (by omega)] exact zero_mem _ - · rw [h.massWeight_baru, Polynomial.coeff_monomial, if_neg (by omega)] + · rw [h.massWeight_baru, Polynomial.coeff_monomial, ite_eq_right (by omega)] exact zero_mem _ - · rw [h.massWeight_Q, Polynomial.coeff_monomial, if_neg (by omega)] + · rw [h.massWeight_Q, Polynomial.coeff_monomial, ite_eq_right (by omega)] exact zero_mem _ - · rw [h.massWeight_barQ, Polynomial.coeff_monomial, if_neg (by omega)] + · rw [h.massWeight_barQ, Polynomial.coeff_monomial, ite_eq_right (by omega)] exact zero_mem _ - · rw [h.massWeight_L, Polynomial.coeff_monomial, if_neg (by omega)] + · rw [h.massWeight_L, Polynomial.coeff_monomial, ite_eq_right (by omega)] exact zero_mem _ - · rw [h.massWeight_barL, Polynomial.coeff_monomial, if_neg (by omega)] + · rw [h.massWeight_barL, Polynomial.coeff_monomial, ite_eq_right (by omega)] exact zero_mem _ - · rw [h.massWeight_e, Polynomial.coeff_monomial, if_neg (by omega)] + · rw [h.massWeight_e, Polynomial.coeff_monomial, ite_eq_right (by omega)] exact zero_mem _ - · rw [h.massWeight_bare, Polynomial.coeff_monomial, if_neg (by omega)] + · rw [h.massWeight_bare, Polynomial.coeff_monomial, ite_eq_right (by omega)] exact zero_mem _ | algebraMap r => rw [AlgHom.commutes] @@ -439,7 +439,7 @@ lemma massWeightSubmodule_eq (i : ℕ) (hi : 0 < i) : | algebraMap r => intro m hm rw [AlgHom.commutes] - simp only [Polynomial.algebraMap_apply, Polynomial.coeff_C, if_neg (by omega : ¬ m = 0)] + simp only [Polynomial.algebraMap_apply, Polynomial.coeff_C, ite_eq_right (by omega : ¬ m = 0)] exact zero_mem _ | add x y hx hy ihx ihy => intro m hm @@ -470,7 +470,7 @@ lemma massWeightSubmodule_eq (i : ℕ) (hi : 0 < i) : 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 + ite_eq_left 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'])) diff --git a/Physlib/Particles/StandardModel/IsGaugeSector/DerivSubmodule/BoostWeightDecomposition.lean b/Physlib/Particles/StandardModel/IsGaugeSector/DerivSubmodule/BoostWeightDecomposition.lean index 37f1f403f..a53b8da6e 100644 --- a/Physlib/Particles/StandardModel/IsGaugeSector/DerivSubmodule/BoostWeightDecomposition.lean +++ b/Physlib/Particles/StandardModel/IsGaugeSector/DerivSubmodule/BoostWeightDecomposition.lean @@ -243,9 +243,9 @@ lemma symbolBoostWeight_piece {n : ℕ} (i : Fin 3) (φ : Module.Dual ℝ GaugeA refine iSup_congr fun c => ?_ by_cases hc : (∑ j, lightConeWeight (c j)) = k · rw [show k - (∑ j, lightConeWeight (c j)) = 0 from by omega, - HiggsAlgebraCovRealization.trivialWeightDecomposition_piece, if_pos rfl, Submodule.map_top, + HiggsAlgebraCovRealization.trivialWeightDecomposition_piece, ite_eq_left rfl, Submodule.map_top, iSup_pos hc, h.range_lightConeDeriv_fieldStrengthSymbol i c φ] - · rw [HiggsAlgebraCovRealization.trivialWeightDecomposition_piece, if_neg (by omega), + · rw [HiggsAlgebraCovRealization.trivialWeightDecomposition_piece, ite_eq_right (by omega), Submodule.map_bot, iSup_neg hc] /-- The packed symbol ranges, joined over the value index and the `n + 2` slots, recover the diff --git a/Physlib/Particles/StandardModel/IsGaugeSector/DerivSubmodule/GaugeWeightDecomposition.lean b/Physlib/Particles/StandardModel/IsGaugeSector/DerivSubmodule/GaugeWeightDecomposition.lean index 36d4114a8..916cbdc1f 100644 --- a/Physlib/Particles/StandardModel/IsGaugeSector/DerivSubmodule/GaugeWeightDecomposition.lean +++ b/Physlib/Particles/StandardModel/IsGaugeSector/DerivSubmodule/GaugeWeightDecomposition.lean @@ -359,7 +359,7 @@ lemma derivSubmoduleGaugeWeight_piece_zero' (n : ℕ) : 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) + exact iSup_congr fun c => ite_eq_left (h3 c) /-- Every other weight has a trivial piece. -/ lemma derivSubmoduleGaugeWeight_piece_eq_bot (n : ℕ) {w : GaugeWeight} diff --git a/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/Basic.lean b/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/Basic.lean index a698e6e06..9295ed766 100644 --- a/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/Basic.lean +++ b/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/Basic.lean @@ -122,7 +122,7 @@ lemma massWeightSubmodule_eq (i : ℕ) (hi : 0 < i) : | 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)] + rw [h.massWeight_F, Polynomial.coeff_monomial, ite_eq_right (by omega)] exact zero_mem _ | algebraMap r => rw [AlgHom.commutes] @@ -194,7 +194,7 @@ lemma massWeightSubmodule_eq (i : ℕ) (hi : 0 < i) : | algebraMap r => intro m hm rw [AlgHom.commutes] - simp only [Polynomial.algebraMap_apply, Polynomial.coeff_C, if_neg (by omega : ¬ m = 0)] + simp only [Polynomial.algebraMap_apply, Polynomial.coeff_C, ite_eq_right (by omega : ¬ m = 0)] exact zero_mem _ | add x y hx hy ihx ihy => intro m hm @@ -225,7 +225,7 @@ lemma massWeightSubmodule_eq (i : ℕ) (hi : 0 < i) : 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 + ite_eq_left 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'])) diff --git a/Physlib/Relativity/DerivAlgebra.lean b/Physlib/Relativity/DerivAlgebra.lean index 9ce687caa..31dde3cdc 100644 --- a/Physlib/Relativity/DerivAlgebra.lean +++ b/Physlib/Relativity/DerivAlgebra.lean @@ -152,8 +152,8 @@ open Nat coefficients by a shift and a multiplication, and the two shifts commute. -/ lemma _root_.MvPowerSeries.pderiv_comm {σ R : Type*} [CommSemiring R] (i j : σ) (f : MvPowerSeries σ R) : - MvPowerSeries.pderiv R i (MvPowerSeries.pderiv R j f) = - MvPowerSeries.pderiv R j (MvPowerSeries.pderiv R i f) := by + MvPowerSeries.pderiv i (MvPowerSeries.pderiv j f) = + MvPowerSeries.pderiv j (MvPowerSeries.pderiv i f) := by ext n rw [MvPowerSeries.coeff_pderiv, MvPowerSeries.coeff_pderiv, MvPowerSeries.coeff_pderiv, MvPowerSeries.coeff_pderiv, add_right_comm n (Finsupp.single i 1) (Finsupp.single j 1)] @@ -167,7 +167,7 @@ lemma _root_.MvPowerSeries.pderiv_comm {σ R : Type*} [CommSemiring R] (i j : σ /-- Differentiating a jet along a multiset of directions is well defined: the partial derivatives commute, so the fold over a multiset does not depend on the order. -/ instance : RightCommutative - (fun (f : JetRing) (μ : Fin 1 ⊕ Fin 3) => MvPowerSeries.pderiv ℂ μ f) where + (fun (f : JetRing) (μ : Fin 1 ⊕ Fin 3) => MvPowerSeries.pderiv μ f) where right_comm f μ ν := MvPowerSeries.pderiv_comm ν μ f /-- The evaluation map taking a function `f : JetRing` to `∂_μ f`. -/ @@ -213,9 +213,9 @@ lemma eval_injective {p q : DerivAlgebraComplex} /-- 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 + eval (deriv ν p) f = eval p (MvPowerSeries.pderiv ν f) := by have h : (eval.flip f) ∘ₗ deriv ν = - eval.flip (MvPowerSeries.pderiv ℂ ν f) := by + 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] @@ -226,8 +226,8 @@ lemma eval_deriv (ν : Fin 1 ⊕ Fin 3) (p : DerivAlgebraComplex) (f : JetRing) ∏ ρ, ((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], + · rw [Finsupp.add_apply, Finsupp.single_eq_same, Nat.factorial_succ, ite_eq_left rfl] + · rw [Finsupp.add_apply, Finsupp.single_eq_of_ne h, add_zero, ite_eq_right h, one_mul], Finset.prod_mul_distrib, Finset.prod_ite_eq' Finset.univ ν] simp rw [nsmul_eq_mul, nsmul_eq_mul, hfac] @@ -249,7 +249,7 @@ lemma eval_one (f : JetRing) : time. -/ lemma eval_basis_eq_constantCoeff_foldl_pderiv (s : Multiset (Fin 1 ⊕ Fin 3)) (f : JetRing) : eval (basis s) f = - MvPowerSeries.constantCoeff (s.foldl (fun g μ => MvPowerSeries.pderiv ℂ μ g) f) := by + MvPowerSeries.constantCoeff (s.foldl (fun g μ => MvPowerSeries.pderiv μ g) f) := by induction s using Multiset.induction_on generalizing f with | empty => rw [Multiset.foldl_zero, show (0 : Multiset (Fin 1 ⊕ Fin 3)) = {} from rfl, basis_nil, @@ -322,16 +322,16 @@ lemma jetRingAction_basis_multiset (χ : JetRing) (s : Multiset (Fin 1 ⊕ Fin 3 jetRingAction χ (basis s) = (s.antidiagonal.map fun p => MvPowerSeries.constantCoeff - (p.1.foldl (fun h ρ => MvPowerSeries.pderiv ℂ ρ h) χ) • basis p.2).sum := by + (p.1.foldl (fun h ρ => MvPowerSeries.pderiv ρ h) χ) • basis p.2).sum := by refine eval_injective fun f => ?_ rw [eval_jetRingAction, eval_basis_eq_constantCoeff_foldl_pderiv, JetRing.constantCoeff_foldl_pderiv_mul, show eval ((s.antidiagonal.map fun p => MvPowerSeries.constantCoeff - (p.1.foldl (fun h ρ => MvPowerSeries.pderiv ℂ ρ h) χ) • basis p.2).sum) f + (p.1.foldl (fun h ρ => MvPowerSeries.pderiv ρ h) χ) • basis p.2).sum) f = (eval.flip f) ((s.antidiagonal.map fun p => MvPowerSeries.constantCoeff - (p.1.foldl (fun h ρ => MvPowerSeries.pderiv ℂ ρ h) χ) • basis p.2).sum) from rfl, + (p.1.foldl (fun h ρ => MvPowerSeries.pderiv ρ h) χ) • basis p.2).sum) from rfl, map_multiset_sum, Multiset.map_map] refine congrArg Multiset.sum (Multiset.map_congr rfl fun p _ => ?_) rw [Function.comp_apply, map_smul, LinearMap.flip_apply, smul_eq_mul, @@ -454,7 +454,7 @@ lemma jetRingAction_apply_ι (χ : JetRing) (μ : Fin 1 ⊕ Fin 3) : `∂_ν (χ 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 + 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, diff --git a/Physlib/Relativity/JetRing/Basic.lean b/Physlib/Relativity/JetRing/Basic.lean index 1d0ebb6a6..d167b0aa7 100644 --- a/Physlib/Relativity/JetRing/Basic.lean +++ b/Physlib/Relativity/JetRing/Basic.lean @@ -162,7 +162,7 @@ lemma constantCoeffₗ_apply (f : JetRing) : constantCoeffₗ f = constantCoeff /-- 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 + pderiv ν (star f) = star (pderiv ν f) := by ext s rw [coeff_pderiv, coeff_star, coeff_star, coeff_pderiv, star_mul'] congr 1 @@ -170,7 +170,7 @@ lemma pderiv_star (ν : Fin 1 ⊕ Fin 3) (f : JetRing) : /-- Formal partial derivatives commute. -/ lemma pderiv_comm (μ ν : Fin 1 ⊕ Fin 3) (f : JetRing) : - pderiv ℂ μ (pderiv ℂ ν f) = pderiv ℂ ν (pderiv ℂ μ f) := by + pderiv μ (pderiv ν f) = pderiv ν (pderiv μ f) := by classical ext s rw [coeff_pderiv, coeff_pderiv, coeff_pderiv, coeff_pderiv, @@ -187,13 +187,13 @@ lemma pderiv_comm (μ ν : Fin 1 ⊕ Fin 3) (f : JetRing) : /-- 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 +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 + 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 => @@ -207,8 +207,8 @@ lemma foldl_pderiv_pderiv (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3 /-- 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 + 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, @@ -217,7 +217,7 @@ lemma foldl_pderiv_add (s : Multiset (Fin 1 ⊕ Fin 3)) (f g : JetRing) : /-- The iterated formal derivative of the zero jet vanishes. -/ @[simp] lemma foldl_pderiv_zero (s : Multiset (Fin 1 ⊕ Fin 3)) : - s.foldl (fun h ρ => pderiv ℂ ρ h) (0 : JetRing) = 0 := by + 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] @@ -225,8 +225,8 @@ lemma foldl_pderiv_zero (s : Multiset (Fin 1 ⊕ Fin 3)) : /-- 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 + 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 @@ -237,30 +237,30 @@ lemma foldl_pderiv_sum {κ : Type*} (s : Multiset (Fin 1 ⊕ Fin 3)) (t : Finset 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.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 + 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 + 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 + 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 + 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 + 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 + 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] @@ -269,17 +269,17 @@ lemma foldl_pderiv_mul (s : Multiset (Fin 1 ⊕ Fin 3)) (f g : JetRing) : /-- 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)) + 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 + 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 + 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] @@ -297,12 +297,12 @@ noncomputable def truncation (n : ℕ) (f : JetRing) : JetRing := @[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 + coeff m (truncation n f) = coeff m f := ite_eq_left 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) + coeff m (truncation n f) = 0 := ite_eq_right (not_le.mpr h) lemma truncation_add (n : ℕ) (f g : JetRing) : truncation n (f + g) = truncation n f + truncation n g := by @@ -366,7 +366,7 @@ lemma truncation_one (n : ℕ) : truncation n (1 : JetRing) = 1 := by 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)] + ite_eq_right (by rintro rfl; simp at hm)] /-- A power series with value `1` and no coefficients in nonzero degree up to `n` truncates to `1`. -/ @@ -378,7 +378,7 @@ lemma truncation_eq_one_of_coeff {n : ℕ} {f : JetRing} (h0 : constantCoeff f = · rw [JetRing.coeff_truncation_of_le hm, JetRing.coeff_truncation_of_le hm] rcases eq_or_ne m 0 with rfl | hm0 · simpa [coeff_zero_eq_constantCoeff] using h0 - · rw [hf m hm0 hm, coeff_one, if_neg hm0] + · rw [hf m hm0 hm, coeff_one, ite_eq_right hm0] · rw [JetRing.coeff_truncation_of_gt (not_le.mp hm), JetRing.coeff_truncation_of_gt (not_le.mp hm)] @@ -423,23 +423,23 @@ lemma coeff_X_smul (ρ : Fin 1 ⊕ Fin 3) (f : JetRing) (p : (Fin 1 ⊕ Fin 3) /-- 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) = + 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 + 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, + rw [ite_eq_left 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ρ] + rw [ite_eq_right h, hρ] simp rw [Finset.sum_congr rfl fun ρ _ => ht ρ, ← Finset.sum_mul, ← Nat.cast_sum, ← Finsupp.degree_eq_sum] @@ -447,7 +447,7 @@ lemma coeff_sum_X_smul_pderiv (f : JetRing) (p : (Fin 1 ⊕ Fin 3) →₀ ℕ) : /-- 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 + (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 @@ -485,10 +485,10 @@ lemma coeff_mul_eq_zero_of_lt {n : ℕ} {w : JetRing} of `p`. -/ lemma coeff_eq_zero_of_coeff_pderiv_eq_zero {n : ℕ} {f : JetRing} (hf : ∀ (ρ : Fin 1 ⊕ Fin 3) (q : (Fin 1 ⊕ Fin 3) →₀ ℕ), Finsupp.degree q < n → - coeff q (pderiv ℂ ρ f) = 0) + coeff q (pderiv ρ f) = 0) {p : (Fin 1 ⊕ Fin 3) →₀ ℕ} (hp : p ≠ 0) (hpn : Finsupp.degree p ≤ n) : coeff p f = 0 := by have h1 := JetRing.coeff_sum_X_smul_pderiv f p - have h2 : coeff p (∑ ρ, (X ρ : JetRing) • pderiv ℂ ρ f) = 0 := by + have h2 : coeff p (∑ ρ, (X ρ : JetRing) • pderiv ρ f) = 0 := by rw [map_sum] refine Finset.sum_eq_zero fun ρ _ => ?_ rw [JetRing.coeff_X_smul] @@ -506,7 +506,7 @@ lemma coeff_eq_zero_of_coeff_pderiv_eq_zero {n : ℕ} {f : JetRing} /-- A power series satisfying a radial relation `∂_ρ f = x_ρ f`, with the `x_ρ` vanishing below degree `n`, has no coefficients in nonzero degree up to `n`. -/ lemma coeff_eq_zero_of_pderiv_eq_mul {n : ℕ} {f : JetRing} {x : (Fin 1 ⊕ Fin 3) → JetRing} - (hd : ∀ ρ, pderiv ℂ ρ f = x ρ * f) + (hd : ∀ ρ, pderiv ρ f = x ρ * f) (hx : ∀ (ρ : Fin 1 ⊕ Fin 3) (q : (Fin 1 ⊕ Fin 3) →₀ ℕ), Finsupp.degree q < n → coeff q (x ρ) = 0) {p : (Fin 1 ⊕ Fin 3) →₀ ℕ} (hp : p ≠ 0) (hpn : Finsupp.degree p ≤ n) : coeff p f = 0 := @@ -522,7 +522,7 @@ lemma coeff_eq_zero_of_pderiv_eq_mul {n : ℕ} {f : JetRing} {x : (Fin 1 ⊕ Fin /-- 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) = + 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] @@ -537,8 +537,8 @@ lemma constantCoeff_foldl_pderiv (s : Multiset (Fin 1 ⊕ Fin 3)) (f : JetRing) ∏ ν, ((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], + · rw [Multiset.count_cons_self, Nat.factorial_succ, ite_eq_left rfl] + · rw [Multiset.count_cons_of_ne h, ite_eq_right h, one_mul], Finset.prod_mul_distrib, Finset.prod_ite_eq' Finset.univ a] simp rw [hfin, hfac, Multiset.toFinsupp_apply] @@ -551,7 +551,7 @@ lemma constantCoeff_foldl_pderiv (s : Multiset (Fin 1 ⊕ Fin 3)) (f : JetRing) 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 = + (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 @@ -563,7 +563,7 @@ lemma sum_constantCoeff_foldl_erase (g : (Fin 1 ⊕ Fin 3) → JetRing) 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 [ite_eq_left (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 @@ -571,8 +571,8 @@ lemma sum_constantCoeff_foldl_erase (g : (Fin 1 ⊕ Fin 3) → JetRing) 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] + · rw [Multiset.count_erase_self, ite_eq_left rfl] + · rw [Multiset.count_erase_of_ne h.symm, ite_eq_right 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 @@ -585,7 +585,7 @@ lemma sum_constantCoeff_foldl_erase (g : (Fin 1 ⊕ Fin 3) → JetRing) (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 + · rw [ite_eq_right 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] diff --git a/Physlib/Relativity/JetRing/Jacobi.lean b/Physlib/Relativity/JetRing/Jacobi.lean index 6cef130c5..8638f6fb9 100644 --- a/Physlib/Relativity/JetRing/Jacobi.lean +++ b/Physlib/Relativity/JetRing/Jacobi.lean @@ -43,7 +43,7 @@ open MvPowerSeries /-- The Leibniz rule for a finite product. -/ lemma pderiv_finset_prod {ι : Type*} [DecidableEq ι] (μ : Fin 1 ⊕ Fin 3) (s : Finset ι) (f : ι → JetRing) : - pderiv ℂ μ (∏ i ∈ s, f i) = ∑ i ∈ s, (∏ j ∈ s.erase i, f j) * pderiv ℂ μ (f i) := by + pderiv μ (∏ i ∈ s, f i) = ∑ i ∈ s, (∏ j ∈ s.erase i, f j) * pderiv μ (f i) := by induction s using Finset.induction_on with | empty => simp | insert a s ha ih => @@ -65,26 +65,26 @@ lemma pderiv_finset_prod {ι : Type*} [DecidableEq ι] (μ : Fin 1 ⊕ Fin 3) (s against the adjugate. -/ lemma jacobi {κ : Type} [Fintype κ] [DecidableEq κ] (M : Matrix κ κ JetRing) (μ : Fin 1 ⊕ Fin 3) : - pderiv ℂ μ M.det = (M.map (pderiv ℂ μ) * M.adjugate).trace := by + pderiv μ M.det = (M.map (pderiv μ) * M.adjugate).trace := by have hcol : ∀ (σ : Equiv.Perm κ) (j : κ), - (∏ i ∈ Finset.univ.erase j, M (σ i) i) * pderiv ℂ μ (M (σ j) j) - = ∏ i, (M.updateCol j fun k => pderiv ℂ μ (M k j)) (σ i) i := by + (∏ i ∈ Finset.univ.erase j, M (σ i) i) * pderiv μ (M (σ j) j) + = ∏ i, (M.updateCol j fun k => pderiv μ (M k j)) (σ i) i := by intro σ j rw [← Finset.mul_prod_erase Finset.univ _ (Finset.mem_univ j), Matrix.updateCol_self, mul_comm] congr 1 exact Finset.prod_congr rfl fun i hi => by rw [Matrix.updateCol_ne (Finset.ne_of_mem_erase hi)] - calc pderiv ℂ μ M.det + calc pderiv μ M.det = ∑ j, ∑ σ : Equiv.Perm κ, Equiv.Perm.sign σ • - ∏ i, (M.updateCol j fun k => pderiv ℂ μ (M k j)) (σ i) i := by + ∏ i, (M.updateCol j fun k => pderiv μ (M k j)) (σ i) i := by rw [Matrix.det_apply, map_sum] simp only [Units.smul_def, map_zsmul, pderiv_finset_prod, Finset.smul_sum, hcol] exact Finset.sum_comm - _ = ∑ j, Matrix.mulVec M.adjugate (fun k => pderiv ℂ μ (M k j)) j := by + _ = ∑ j, Matrix.mulVec M.adjugate (fun k => pderiv μ (M k j)) j := by refine Finset.sum_congr rfl fun j _ => ?_ rw [← Matrix.det_apply, ← Matrix.cramer_apply, Matrix.cramer_eq_adjugate_mulVec] - _ = (M.map (pderiv ℂ μ) * M.adjugate).trace := by + _ = (M.map (pderiv μ) * M.adjugate).trace := by simp only [Matrix.mulVec, dotProduct, Matrix.trace, Matrix.diag, Matrix.mul_apply, Matrix.map_apply] rw [Finset.sum_comm] diff --git a/Physlib/Relativity/JetRing/Matrix.lean b/Physlib/Relativity/JetRing/Matrix.lean index 75ce0a380..7d1cce4e0 100644 --- a/Physlib/Relativity/JetRing/Matrix.lean +++ b/Physlib/Relativity/JetRing/Matrix.lean @@ -72,10 +72,10 @@ direction. `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 ℂ ν) = + (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 + ∀ μ, 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 → @@ -107,38 +107,38 @@ lemma exists_parallelTransport {κ : Type} [Fintype κ] [DecidableEq κ] | _ 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 [ite_eq_left h0, ite_eq_left h0] + · rw [ite_eq_right h0, ite_eq_right 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) = + 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) = + 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, + rw [ite_eq_left 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 [ite_eq_right 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 + 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 ℂ ν) := + 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), @@ -146,7 +146,7 @@ lemma exists_parallelTransport {κ : Type} [Fintype κ] [DecidableEq κ] noncomm_ring have hG0 : (∑ ρ, (X ρ : JetRing) • G ρ) = 0 := by have h1 : (∑ ρ, (X ρ : JetRing) • G ρ) = - (∑ ρ, (X ρ : JetRing) • F.map (pderiv ℂ ρ)) - B * F := by + (∑ ρ, (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] @@ -154,24 +154,24 @@ lemma exists_parallelTransport {κ : Type} [Fintype κ] [DecidableEq κ] · 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, + simp [Matrix.one_apply, apply_ite, coeff_one, h0], zero_add, ite_eq_right 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 + have hS2 : ∀ ν, (∑ ρ, (X ρ : JetRing) • (G ρ).map (pderiv ν)) = - G ν := by intro ν - have hmap : ((∑ ρ, (X ρ : JetRing) • G ρ).map (pderiv ℂ ν)) = - G ν + ∑ ρ, (X ρ : JetRing) • (G ρ).map (pderiv ℂ ν) := by + 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 ρ)) + 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 ℂ ν)) + + 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] @@ -214,10 +214,10 @@ lemma mapMatrix_constantCoeff_star {n : Type} [Fintype n] [DecidableEq n] 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) = + 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 [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 @@ -230,7 +230,7 @@ lemma matrix_eq_zero_of_euler_eq_mul_add_mul {κ : Type} [Fintype κ] [Decidable {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) : + (hW : ∑ ρ, (X ρ : JetRing) • W.map (pderiv ρ) = A * W + W * B) : W = 0 := by classical have hlow : ∀ p : (Fin 1 ⊕ Fin 3) →₀ ℕ, @@ -271,7 +271,7 @@ lemma matrix_eq_zero_of_euler_eq_mul_add_mul {κ : Type} [Fintype κ] [Decidable · 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) = + · 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 @@ -290,7 +290,7 @@ lemma matrix_eq_zero_of_euler_eq_mul_add_mul {κ : Type} [Fintype κ] [Decidable 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 + ∑ ρ, (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) →₀ ℕ), @@ -325,8 +325,8 @@ lemma exists_matrix_eulerTransport {κ : Type} [Fintype κ] [DecidableEq κ] 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 [ite_eq_left h0, ite_eq_left h0] + · rw [ite_eq_right h0, ite_eq_right 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 : κ) => @@ -344,7 +344,7 @@ lemma exists_matrix_eulerTransport {κ : Type} [Fintype κ] [DecidableEq κ] 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, + simp [Matrix.one_apply, apply_ite, coeff_one, h0], zero_add, ite_eq_right h0, ← mul_assoc, mul_inv_cancel₀ (Nat.cast_ne_zero.mpr fun hc => h0 ((Finsupp.degree_eq_zero_iff p).mp hc)), one_mul] @@ -359,13 +359,13 @@ lemma exists_matrix_eulerTransport {κ : Type} [Fintype κ] [DecidableEq κ] coefficients in nonzero degree up to `n`. -/ lemma coeff_entry_eq_zero_of_map_pderiv_eq_mul {κ : Type} [Fintype κ] [DecidableEq κ] {n : ℕ} {A : Matrix κ κ JetRing} {X : (Fin 1 ⊕ Fin 3) → Matrix κ κ JetRing} - (hd : ∀ ρ, A.map (pderiv ℂ ρ) = X ρ * A) + (hd : ∀ ρ, A.map (pderiv ρ) = X ρ * A) (hX : ∀ (ρ : Fin 1 ⊕ Fin 3) (q : (Fin 1 ⊕ Fin 3) →₀ ℕ), Finsupp.degree q < n → ∀ i j, coeff q (X ρ i j) = 0) (i j : κ) {p : (Fin 1 ⊕ Fin 3) →₀ ℕ} (hp : p ≠ 0) (hpn : Finsupp.degree p ≤ n) : coeff p (A i j) = 0 := by refine coeff_eq_zero_of_coeff_pderiv_eq_zero (fun ρ q hq => ?_) hp hpn - have h1 : pderiv ℂ ρ (A i j) = (X ρ * A) i j := by rw [← hd ρ, Matrix.map_apply] + have h1 : pderiv ρ (A i j) = (X ρ * A) i j := by rw [← hd ρ, Matrix.map_apply] rw [h1, Matrix.mul_apply, map_sum] exact Finset.sum_eq_zero fun k _ => coeff_mul_eq_zero_of_lt (fun q' hq' => hX ρ q' hq' i k) _ hq @@ -387,7 +387,7 @@ lemma matrix_map_truncation_eq_one {κ : Type} [Fintype κ] [DecidableEq κ] {n apply_ite constantCoeff, coeff_zero_eq_constantCoeff] using h3 · rw [hA 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_eq, coeff_one, ite_eq_right 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)] @@ -401,7 +401,7 @@ lemma matrix_map_truncation_eq_one {κ : Type} [Fintype κ] [DecidableEq κ] {n /-- 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 + (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] @@ -410,9 +410,9 @@ lemma matrix_map_pderiv_mul {κ : Type} [Fintype κ] [DecidableEq κ] (ρ : Fin /-- 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 + ∑ ρ, (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] @@ -420,18 +420,18 @@ lemma sum_X_smul_map_pderiv_mul {κ : Type} [Fintype κ] [DecidableEq κ] /-- 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 + ∑ ρ, (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 + ∑ ρ, (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] + 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 @@ -440,9 +440,9 @@ 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) : + (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 + 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, @@ -451,10 +451,10 @@ lemma eulerTransport_mul_star {κ : Type} [Fintype κ] [DecidableEq κ] 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 ℂ ρ) = + 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 ℂ ρ) := + 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] @@ -467,16 +467,16 @@ lemma eulerTransport_mul_star {κ : Type} [Fintype κ] [DecidableEq κ] 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) + 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) : + (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 + 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 + _ = ((∑ ρ, (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] @@ -486,9 +486,9 @@ lemma eulerTransport_det {κ : Type} [Fintype κ] [DecidableEq κ] 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 + 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) @@ -500,7 +500,7 @@ lemma eulerTransport_det {κ : Type} [Fintype κ] [DecidableEq κ] -/ lemma jacobi_fin3 (M : Matrix (Fin 3) (Fin 3) JetRing) (μ : Fin 1 ⊕ Fin 3) : - pderiv ℂ μ M.det = (M.map (pderiv ℂ μ) * M.adjugate).trace := by + 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', @@ -510,7 +510,7 @@ lemma jacobi_fin3 (M : Matrix (Fin 3) (Fin 3) JetRing) (μ : Fin 1 ⊕ Fin 3) : 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 + 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, @@ -538,10 +538,10 @@ lemma matrix_multiset_sum_apply {κ α : Type*} [AddCommMonoid α] 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)) + ((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 + (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, foldl_pderiv_sum, map_sum] simp only [constantCoeff_foldl_pderiv_mul] diff --git a/Physlib/Relativity/JetRing/Taylor.lean b/Physlib/Relativity/JetRing/Taylor.lean index 77e91209a..744d68e41 100644 --- a/Physlib/Relativity/JetRing/Taylor.lean +++ b/Physlib/Relativity/JetRing/Taylor.lean @@ -33,8 +33,8 @@ open MvPowerSeries derivatives are equal. -/ lemma ext_of_constantCoeff_foldl_pderiv {f g : JetRing} (h : ∀ s : Multiset (Fin 1 ⊕ Fin 3), - constantCoeff (s.foldl (fun h ρ => pderiv ℂ ρ h) f) - = constantCoeff (s.foldl (fun h ρ => pderiv ℂ ρ h) g)) : f = g := by + constantCoeff (s.foldl (fun h ρ => pderiv ρ h) f) + = constantCoeff (s.foldl (fun h ρ => pderiv ρ h) g)) : f = g := by ext m obtain ⟨s, rfl⟩ : ∃ s : Multiset (Fin 1 ⊕ Fin 3), s.toFinsupp = m := ⟨Multiset.toFinsupp.symm m, Multiset.toFinsupp.apply_symm_apply m⟩ @@ -44,7 +44,7 @@ lemma ext_of_constantCoeff_foldl_pderiv {f g : JetRing} (Finset.prod_ne_zero_iff.mpr fun _ _ => Nat.factorial_ne_zero _)) hs /-- A jet all of whose first derivatives vanish is the constant jet of its value. -/ -lemma eq_C_of_pderiv_eq_zero {f : JetRing} (hf : ∀ μ, pderiv ℂ μ f = 0) : +lemma eq_C_of_pderiv_eq_zero {f : JetRing} (hf : ∀ μ, pderiv μ f = 0) : f = C (constantCoeff f) := pderiv.ext (fun i => by rw [hf i, pderiv_C]) (by rw [constantCoeff_C]) diff --git a/Physlib/Relativity/LightConeDeriv.lean b/Physlib/Relativity/LightConeDeriv.lean index 0306f0901..6a33a9b27 100644 --- a/Physlib/Relativity/LightConeDeriv.lean +++ b/Physlib/Relativity/LightConeDeriv.lean @@ -175,9 +175,9 @@ lemma sum_prod_lightConeCoeffInv (i : Fin 3) {n : ℕ} (d e : Fin n → Fin 1 by_cases hde : d = e · subst hde simp - · rw [if_neg hde] + · rw [ite_eq_right hde] obtain ⟨j, hj⟩ := Function.ne_iff.1 hde - exact Finset.prod_eq_zero (Finset.mem_univ j) (if_neg hj) + exact Finset.prod_eq_zero (Finset.mem_univ j) (ite_eq_right hj) /-- **The coordinate symbols in the light-cone basis.** The change of basis is invertible, so the two families span the same submodule. -/ @@ -188,7 +188,7 @@ lemma eq_sum_lightConeDeriv {n : ℕ} (F : (Fin n → Fin 1 ⊕ Fin 3) → W → 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] + Finset.sum_ite_eq, Finset.mem_univ, ite_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 diff --git a/Physlib/Relativity/LorentzGroup/Invariants/Basic.lean b/Physlib/Relativity/LorentzGroup/Invariants/Basic.lean index d4825743c..ab3138ca1 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/Basic.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/Basic.lean @@ -332,7 +332,7 @@ lemma eq_sum_lightConeComponent (i : Fin 3) (c : (Fin n → Fin 1 ⊕ Fin 3) → simp only [lightConeComponent, Finset.mul_sum, ← mul_assoc] rw [Finset.sum_comm] simp only [← Finset.sum_mul, sum_prod_lightConeCoeffInv, ite_mul, one_mul, zero_mul, - Finset.sum_ite_eq, Finset.mem_univ, if_true] + Finset.sum_ite_eq, Finset.mem_univ, ite_true] end Spacetime diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsBiLeftWeyl.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsBiLeftWeyl.lean index 42921258f..83782dc7c 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsBiLeftWeyl.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsBiLeftWeyl.lean @@ -176,7 +176,7 @@ lemma eq_sum_weightComponent (i : Fin 3) (c : Fin 2 × Fin 2 → ℂ) (α : Fin simp only [weightComponent, Finset.mul_sum, ← mul_assoc] rw [Finset.sum_comm] simp only [← Finset.sum_mul, sum_biLeftCoeffInv_mul, ite_mul, one_mul, zero_mul, - Finset.sum_ite_eq, Finset.mem_univ, if_true] + Finset.sum_ite_eq, Finset.mem_univ, ite_true] /-! diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsLeftRightWeyl.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsLeftRightWeyl.lean index aee405896..181a67f32 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsLeftRightWeyl.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsLeftRightWeyl.lean @@ -172,7 +172,7 @@ lemma eq_sum_weightComponent (i : Fin 3) (c : Fin 2 × Fin 2 → ℂ) (α : Fin simp only [weightComponent, Finset.mul_sum, ← mul_assoc] rw [Finset.sum_comm] simp only [← Finset.sum_mul, sum_pairCoeffInv_mul, ite_mul, one_mul, zero_mul, - Finset.sum_ite_eq, Finset.mem_univ, if_true] + Finset.sum_ite_eq, Finset.mem_univ, ite_true] /-! diff --git a/Physlib/Relativity/LorentzGroup/Invariants/LightCone.lean b/Physlib/Relativity/LorentzGroup/Invariants/LightCone.lean index 8baf4ee63..f063191a7 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/LightCone.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/LightCone.lean @@ -234,9 +234,9 @@ lemma transitionZ_succ (i : Fin 3) {n : ℕ} (d e : Fin (n + 1) → Fin 1 ⊕ Fi show lightConeWeight 2 = 0 from rfl, show lightConeWeight 3 = 0 from rfl, sub_neg_eq_add, sub_zero] by_cases h : InBoostPlane i (d 0) - · rw [if_pos h] + · rw [ite_eq_left h] simp [slotZ, lightConeCoeffInvZ_eq_zero_of_inBoostPlane h] - · rw [if_neg h] + · rw [ite_eq_right h] simp [slotZ, lightConeCoeffInvZ_eq_zero_of_not_inBoostPlane h] ring diff --git a/Physlib/Relativity/LorentzGroup/Invariants/RankFour.lean b/Physlib/Relativity/LorentzGroup/Invariants/RankFour.lean index d999df97a..3fcf72fd3 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/RankFour.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/RankFour.lean @@ -357,11 +357,11 @@ lemma act_flipAxis (k : Fin 3) (c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ) (a : Fi push_cast congr 1 exact Finset.prod_congr rfl fun s _ => by - rw [toLorentzGroup_flipAxis_apply, if_pos rfl, Complex.ofReal_intCast] + rw [toLorentzGroup_flipAxis_apply, ite_eq_left rfl, Complex.ofReal_intCast] · intro d _ hda obtain ⟨s, hs⟩ := Function.ne_iff.1 hda.symm rw [Finset.prod_eq_zero (Finset.mem_univ s), mul_zero] - rw [toLorentzGroup_flipAxis_apply, if_neg hs, Complex.ofReal_zero] + rw [toLorentzGroup_flipAxis_apply, ite_eq_right hs, Complex.ofReal_zero] · exact fun h => absurd (Finset.mem_univ a) h /-- The sign a flip attaches to a coefficient is `1` or `-1`, being a product of such signs. -/ @@ -402,13 +402,13 @@ lemma act_rotationCycle (c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ) (a : Fin 4 → act (SL2C.toLorentzGroup rotationCycle).1 c a = c (cycIdx (cycIdx a)) := by rw [act, Finset.sum_eq_single (cycIdx (cycIdx a))] · rw [Finset.prod_eq_one fun s _ => ?_, mul_one] - rw [toLorentzGroup_rotationCycle_apply, if_pos, Complex.ofReal_one] + rw [toLorentzGroup_rotationCycle_apply, ite_eq_left, Complex.ofReal_one] exact (congrFun (cycIdx_cycIdx_cycIdx a) s).symm · intro d _ hda have hne : cycIdx d ≠ a := fun h => hda (by rw [← h, cycIdx_cycIdx_cycIdx]) obtain ⟨s, hs⟩ := Function.ne_iff.1 hne rw [Finset.prod_eq_zero (Finset.mem_univ s), mul_zero] - rw [toLorentzGroup_rotationCycle_apply, if_neg fun h : a s = cycDir (d s) => hs h.symm, + rw [toLorentzGroup_rotationCycle_apply, ite_eq_right fun h : a s = cycDir (d s) => hs h.symm, Complex.ofReal_zero] · exact fun h => absurd (Finset.mem_univ _) h @@ -544,13 +544,13 @@ lemma eq_ofOrbitCoord {c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ} (hc : IsInvarian funext d by_cases hd : IsFlipFixed d · obtain ⟨k, hk⟩ := (isFlipFixed_iff_exists_mem_orbit d).1 hd - rw [ofOrbitCoord, Finset.sum_eq_single k, if_pos hk, + rw [ofOrbitCoord, Finset.sum_eq_single k, ite_eq_left hk, eq_orbitRep_of_mem_orbit (apply_cycIdx hc) hk] - · exact fun l _ hl => if_neg fun hdl => hl (eq_of_mem_orbit hdl hk) + · exact fun l _ hl => ite_eq_right fun hdl => hl (eq_of_mem_orbit hdl hk) · exact fun h => absurd (Finset.mem_univ k) h · rw [eq_zero_of_not_isFlipFixed hc hd] exact (Finset.sum_eq_zero fun k _ => - if_neg fun hk => hd ((isFlipFixed_iff_exists_mem_orbit d).2 ⟨k, hk⟩)).symm + ite_eq_right fun hk => hd ((isFlipFixed_iff_exists_mem_orbit d).2 ⟨k, hk⟩)).symm /-- Contracting against such a tensor collects the `256` index vectors into the `22` orbits. -/ lemma sum_mul_ofOrbitCoord (f : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ) (b : Fin 22 → ℂ) : @@ -766,7 +766,7 @@ theorem exists_eq_sum {c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ} (hc : IsInvarian rw [Finset.sum_comm] refine Finset.sum_congr rfl fun k _ => ?_ by_cases hk : d ∈ orbit k - · simp only [hk, if_true, Finset.sum_mul] + · simp only [hk, ite_true, Finset.sum_mul] exact Finset.sum_congr rfl fun i _ => Finset.sum_congr rfl fun l _ => by ring · simp [hk] diff --git a/Physlib/Relativity/LorentzGroup/Invariants/RankThree.lean b/Physlib/Relativity/LorentzGroup/Invariants/RankThree.lean index 573ec9633..f3bd00dd5 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/RankThree.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/RankThree.lean @@ -163,7 +163,7 @@ lemma toLorentzGroup_halfTurn_symm (i : Fin 3) (a b : Fin 1 ⊕ Fin 3) : rw [SL2C.toLorentzGroup_halfTurn_apply, SL2C.toLorentzGroup_halfTurn_apply] by_cases h : a = b · rw [h] - · rw [if_neg h, if_neg (Ne.symm h)] + · rw [ite_eq_right h, ite_eq_right (Ne.symm h)] /-- The half turn multiplies a light-cone component by the product of the signs of its slots. -/ lemma lightConeComponent_act_halfTurn {n : ℕ} (i : Fin 3) From 1f186aa69622c7b20f08c0ca5c11ef2253ab5e15 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 22 Sep 2026 14:25:33 +0200 Subject: [PATCH 349/367] feat: fix build, remove IsFieldAlgera --- Physlib.lean | 11 - .../LocalGaugeFieldAlgebra/MassDim.lean | 4 +- .../LocalFieldAlgebra/FieldAlgebra/Basic.lean | 189 ----------- .../FieldAlgebra/ConstantAction.lean | 88 ------ .../FieldAlgebra/GaugeAction.lean | 142 --------- .../FieldAlgebra/JetDeriv.lean | 299 ------------------ .../FieldAlgebra/JetDerivClass.lean | 77 ----- .../FieldAlgebra/JetDerivConstruction.lean | 274 ---------------- .../FieldAlgebra/LorentzAction.lean | 186 ----------- .../FieldAlgebra/MassDim.lean | 130 -------- .../LocalFieldAlgebra/FieldAlgebra/Prod.lean | 126 -------- .../FieldAlgebra/Statistics.lean | 285 ----------------- .../GaugeTheory/MatterField/Basic.lean | 11 +- .../GaugeTheory/MatterField/FieldAlgebra.lean | 112 ------- .../StandardModel/JetAlgebra/Basic.lean | 8 +- .../JetAlgebra/FieldAlgebra.lean | 12 +- .../StandardModel/JetAlgebra/Generators.lean | 50 +-- .../JetAlgebra/SectorEquiv/Basic.lean | 118 +++---- .../JetAlgebra/SectorEquiv/Structure.lean | 122 +++---- .../JetAlgebra/TransformsIn.lean | 20 +- .../Matter/FermionicAlgebra/Prod.lean | 5 +- 21 files changed, 189 insertions(+), 2080 deletions(-) delete mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/Basic.lean delete mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/ConstantAction.lean delete mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/GaugeAction.lean delete mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/JetDeriv.lean delete mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/JetDerivClass.lean delete mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/JetDerivConstruction.lean delete mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/LorentzAction.lean delete mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/MassDim.lean delete mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/Prod.lean delete mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/Statistics.lean delete mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/FieldAlgebra.lean diff --git a/Physlib.lean b/Physlib.lean index 045ea481b..3e0c77911 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -32,16 +32,6 @@ public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalCovFieldAlgebra.Sect public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalCovFieldAlgebra.SectorRealization public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.CovariantDeriv -public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.Basic -public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.ConstantAction -public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.GaugeAction -public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.JetDeriv -public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.JetDerivClass -public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.JetDerivConstruction -public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.LorentzAction -public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.MassDim -public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.Prod -public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.Statistics public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.GaugeAction public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.GaugeSector public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.GaugeSectorRealization @@ -67,7 +57,6 @@ public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.U1 public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.Charge public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.CovariantDeriv -public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.FieldAlgebra public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.GaugeAction public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.TransformsIn diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeFieldAlgebra/MassDim.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeFieldAlgebra/MassDim.lean index 2af249d26..3f121e8b0 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeFieldAlgebra/MassDim.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/GaugeBoson/LocalGaugeFieldAlgebra/MassDim.lean @@ -17,8 +17,8 @@ The mass dimension of the gauge bosons is tracked multiplicatively through the `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.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.MassDim`, on the -real, single-half component space of the gauge bosons. +`Physlib.Particles.StandardModel.Matter.BosonicAlgebra.MassDim`, on the real, +single-half component space of the gauge bosons. ## ii. Key results diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/Basic.lean deleted file mode 100644 index 13b14bd97..000000000 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/Basic.lean +++ /dev/null @@ -1,189 +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.ClassicalFieldTheory.GaugeTheory.MatterField.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 M` — 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 field algebra. - -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 {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} {M : MatterField jets} - -/-! - -## A. The universal property of a field algebra - --/ - -/-- **A field algebra** on a space of component functions `C`: a `ℂ`-algebra `A` generated - by `C`, functorially in endomorphisms of `C`. For a matter field `M` the space `C` is its - `JetComponentSpace M`, and the two instances are the symmetric algebra (bosons) and the - exterior algebra (fermions). - - The class is stated on the component space rather than on the matter field so that `C` - can be an `outParam`, recovered from `A` by unification: a matter field is not recoverable - from its field algebra, since only its value space appears there. The operations that do - need the field itself — the gauge and Lorentz actions and the mass-weight scaling — take - it as an argument, in the files that build them. -/ -class IsFieldAlgebra (C : outParam Type) [AddCommGroup C] [Module ℂ C] - (A : Type) [Ring A] [Algebra ℂ A] where - /-- The inclusion of the component functions as generators. -/ - ι : C →ₗ[ℂ] A - /-- Functoriality: an endomorphism of the component space induces an algebra - endomorphism. -/ - map : (C →ₗ[ℂ] C) → (A →ₐ[ℂ] A) - map_ι : ∀ (f : C →ₗ[ℂ] C) (x : C), - map f (ι x) = ι (f x) - map_id : map LinearMap.id = AlgHom.id ℂ A - map_comp_map : ∀ (f g : C →ₗ[ℂ] C), - (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 {C : Type} [AddCommGroup C] [Module ℂ C] -variable (A : Type) [Ring A] [Algebra ℂ A] [IsFieldAlgebra C A] - -/-- The inclusion of the component functions as the generators of the field algebra. -/ -abbrev ι : C →ₗ[ℂ] 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 : C →ₗ[ℂ] C) : A →ₐ[ℂ] A := - IsFieldAlgebra.map f - -@[simp] -lemma map_ι (f : C →ₗ[ℂ] C) (x : C) : - map A f (ι A x) = ι A (f x) := - IsFieldAlgebra.map_ι f x - -@[simp] -lemma map_id : map A (LinearMap.id : C →ₗ[ℂ] C) - = AlgHom.id ℂ A := - IsFieldAlgebra.map_id - -lemma map_comp_map (f g : C →ₗ[ℂ] C) : - (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 (ι (C := C) 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 : C, 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 M.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) - -section OfField - -variable {M : MatterField jets} [IsFieldAlgebra (JetComponentSpace M) 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 ℂ M.V →ₗ[ℂ] A := - (ι (C := JetComponentSpace M) A).comp - ((LinearMap.inl ℂ (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ M.V) - (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule M.V))).comp - (TensorProduct.mk ℂ DerivAlgebraComplex (Module.Dual ℂ M.V) 1)) - -/-- **The component function `ψ̄_φ` of the conjugate matter field** along the covector `φ` - on `ConjModule M.V`: the undifferentiated generator in the conjugate half of the component - space. -/ -noncomputable def ofConjField : Module.Dual ℂ (ConjModule M.V) →ₗ[ℂ] A := - (ι (C := JetComponentSpace M) A).comp - ((LinearMap.inr ℂ (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ M.V) - (DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule M.V))).comp - (TensorProduct.mk ℂ DerivAlgebraComplex (Module.Dual ℂ (ConjModule M.V)) 1)) - -lemma ofField_apply (φ : Module.Dual ℂ M.V) : - ofField A φ = ι (C := JetComponentSpace M) A - (((1 : DerivAlgebraComplex) ⊗ₜ[ℂ] φ, 0) : JetComponentSpace M) := rfl - -lemma ofConjField_apply (φ : Module.Dual ℂ (ConjModule M.V)) : - ofConjField A φ = ι (C := JetComponentSpace M) A - ((0, (1 : DerivAlgebraComplex) ⊗ₜ[ℂ] φ) : JetComponentSpace M) := rfl - -end OfField - -end FieldAlgebra diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/ConstantAction.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/ConstantAction.lean deleted file mode 100644 index bb1d4afea..000000000 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/ConstantAction.lean +++ /dev/null @@ -1,88 +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.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.GaugeAction -/-! -# Constant gauge transformations on a field algebra - -## i. Overview - -A jet gauge group `GJ` contains the constant — that is, global — gauge transformations as -the image of a homomorphism `ι : G₀ →* GJ` 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 {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} (M : MatterField jets) -variable {A : Type} [Ring A] [Algebra ℂ A] [IsFieldAlgebra (JetComponentSpace M) A] -variable (ι : G₀ →* GJ) - -/-- 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₀ →* GJ` of the - constant jets. -/ -noncomputable def repConstant : - Representation ℂ G₀ A := - (repJet M).comp ι - -lemma repConstant_apply - (g : G₀) (x : A) : - repConstant M ι g x = - repJet M (ι g) x := rfl - -@[simp] -lemma repConstant_apply_one - (g : G₀) : - repConstant M ι g (1 : A) = 1 := - repJet_apply_one M _ - -lemma repConstant_apply_mul - (g : G₀) (x y : A) : - repConstant M ι g (x * y) = - repConstant M ι g x * repConstant M ι g y := - repJet_apply_mul M _ 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 - (g : G₀) (φ : Module.Dual ℂ M.V) : - repConstant M ι g (ofField A φ) = - ofField A (Module.Dual.transpose - (jetEval ∘ₗ (M.repJet (ι 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 - (g : G₀) (φ : Module.Dual ℂ (ConjModule M.V)) : - repConstant M ι g (ofConjField A φ) = - ofConjField A (Module.Dual.transpose - (jetEval ∘ₗ (JetComponentSpace.repConj M.repJet (ι 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/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/GaugeAction.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/GaugeAction.lean deleted file mode 100644 index 3df9d37ca..000000000 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/GaugeAction.lean +++ /dev/null @@ -1,142 +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.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.Basic -public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.GaugeAction -/-! -# The gauge action on the field algebra - -## i. Overview - -Given a fibrewise action of a group `GJ` on the jets `JetRing ⊗[ℂ] V` of a matter -field, the group `GJ` 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 `GJ` is any group acting fibrewise on the jets. For the Standard Model, `GJ` 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 `GJ` - - A.1. Equivariance of the field and its conjugate - --/ - -@[expose] public section - -namespace FieldAlgebra - -open Matrix MatrixGroups TensorProduct - -variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} (M : MatterField jets) -variable {A : Type} [Ring A] [Algebra ℂ A] [IsFieldAlgebra (JetComponentSpace M) A] - -/-! - -## A. The action of the group `GJ` - --/ - -/-- **The jet gauge action on the field algebra** of the matter field `M`: the algebra - functor applied to the gauge action on its jet component space. The fibrewise action on - the jets and its fibrewise-linearity are fields of `M`, so neither has to be supplied - here. -/ -noncomputable def repJet : - Representation ℂ GJ (A) where - toFun U := - (map A (JetComponentSpace.repJet M 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 (U : GJ) (x : A) : - repJet M U x = - map A (JetComponentSpace.repJet M U) x := rfl - -@[simp] -lemma repJet_apply_one (U : GJ) : - repJet M U (1 : A) = 1 := by - simp [repJet_apply] - -lemma repJet_apply_mul (U : GJ) (x y : A) : - repJet M U (x * y) = - repJet M U x * repJet M U y := by - simp [repJet_apply] - -/-- On a component function the jet gauge action is the action on the component space. -/ -@[simp] -lemma repJet_ι (U : GJ) (v : JetComponentSpace M) : - repJet M U (ι A v) = - ι A (JetComponentSpace.repJet M 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 (U : GJ) : A →ₐ[ℂ] A where - toFun := repJet M U - map_add' := LinearMap.map_add _ - map_zero' := LinearMap.map_zero _ - map_one' := repJet_apply_one M U - map_mul' := repJet_apply_mul M 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 - (U : GJ) (φ : Module.Dual ℂ M.V) : - repJet M U (ofField A φ) = - ofField A (Module.Dual.transpose (jetEval ∘ₗ (M.repJet U⁻¹).comp jetOfConstant) φ) := by - rw [ofField_apply, repJet_ι, ofField_apply] - congr 1 - refine Prod.ext ?_ ?_ - · exact JetComponentSpace.repDual_one_tmul M.repJet M.repJet_smul U φ - · rw [JetComponentSpace.repJet_snd] - exact map_zero _ - -/-- **`ofConjField` is gauge equivariant**, for the conjugate action `repConj M.repJet` on the - jets of the conjugate field — which is the physicists' `φ̄ ↦ φ̄ U†`. -/ -lemma repJet_ofConjField - (U : GJ) (φ : Module.Dual ℂ (ConjModule M.V)) : - repJet M U (ofConjField A φ) = - ofConjField A (Module.Dual.transpose - (jetEval ∘ₗ (JetComponentSpace.repConj M.repJet 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 M.repJet) - (JetComponentSpace.repConj_smul_comm M.repJet_smul) U φ - -end FieldAlgebra diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/JetDeriv.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/JetDeriv.lean deleted file mode 100644 index 0948b8cbf..000000000 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/JetDeriv.lean +++ /dev/null @@ -1,299 +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.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.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 {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} {M : MatterField jets} -variable {A : Type} [Ring A] [Algebra ℂ A] [IsFieldAlgebra (JetComponentSpace M) A] - [HasJetDeriv (JetComponentSpace M) (JetComponentSpace.jetDeriv (M := M)) 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 (M := M) μ ν) 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 M) : - 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 ℂ M.V) : - iteratedJetDeriv s (ofField A φ) = - ι A - ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace M) := 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 M.V)) : - iteratedJetDeriv s (ofConjField A φ) = - ι A - ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace M) := 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 ℂ M.V => iteratedJetDeriv s (ofField A φ)) ∪ - Set.range (fun φ : Module.Dual ℂ (ConjModule M.V) => - iteratedJetDeriv s (ofConjField A φ))) - = (⊤ : Subalgebra ℂ (A)) := by - set S : Set (A) := - ⋃ s : Multiset (Fin 1 ⊕ Fin 3), - Set.range (fun φ : Module.Dual ℂ M.V => iteratedJetDeriv s (ofField A φ)) ∪ - Set.range (fun φ : Module.Dual ℂ (ConjModule M.V) => - iteratedJetDeriv s (ofConjField A φ)) with hS - /- The two half-inclusions of the component space into the field algebra. -/ - let gField : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ M.V →ₗ[ℂ] A := - (ι A).comp (LinearMap.inl ℂ _ _) - let gConj : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule M.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 ℂ M.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 M.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 (C := JetComponentSpace M)] - 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 {N : MatterField jets} -variable {B : Type} [Ring B] [Algebra ℂ B] [IsFieldAlgebra (JetComponentSpace N) B] - [HasJetDeriv (JetComponentSpace N) (JetComponentSpace.jetDeriv (M := N)) 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/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/JetDerivClass.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/JetDerivClass.lean deleted file mode 100644 index 5f2f2d22c..000000000 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/JetDerivClass.lean +++ /dev/null @@ -1,77 +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.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.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.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.JetDeriv`. --/ - -@[expose] public section - -variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} {M : MatterField jets} - -/-- **A total derivative on a field algebra**: for each direction `μ` a linear map which is - an (even) derivation and acts on the generators by `shift μ`, the shift of the derivative - label on the component space. - - The shift is carried as a second `outParam` rather than being read off a matter field, - for the same reason `IsFieldAlgebra` is stated on the component space: a matter field is - not recoverable from `A`, while both `C` and the shift on it are, so instance resolution - keeps working. For the component space of a matter field the shift is - `JetComponentSpace.jetDeriv`. -/ -class HasJetDeriv (C : outParam Type) [AddCommGroup C] [Module ℂ C] - (shift : outParam ((Fin 1 ⊕ Fin 3) → C →ₗ[ℂ] C)) - (A : Type) [Ring A] [Algebra ℂ A] [IsFieldAlgebra C A] where - /-- The total derivative in the direction `μ`. -/ - jetDeriv : (Fin 1 ⊕ Fin 3) → A →ₗ[ℂ] A - jetDeriv_ι : ∀ (μ : Fin 1 ⊕ Fin 3) (x : C), - jetDeriv μ (FieldAlgebra.ι A x) = FieldAlgebra.ι A (shift μ 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 (JetComponentSpace M) A] - [HasJetDeriv (JetComponentSpace M) (JetComponentSpace.jetDeriv (M := M)) 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 M) : - 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/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/JetDerivConstruction.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/JetDerivConstruction.lean deleted file mode 100644 index 12a4e0e40..000000000 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/JetDerivConstruction.lean +++ /dev/null @@ -1,274 +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.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.JetDerivClass -public import Physlib.Relativity.IsLorentzDeriv -public import Mathlib.Algebra.TrivSqZeroExt.Basic -public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.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.GaugeTheory.LocalFieldAlgebra.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 {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} {M : MatterField jets} - -/-! - -## 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 M →ₗ[ℂ] BosonicAlgebra M := - 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 M) : - jetDeriv μ (SymmetricAlgebra.ι ℂ _ x) = - SymmetricAlgebra.ι ℂ _ (JetComponentSpace.jetDeriv μ x) := - SymmetricAlgebra.derivationOfLinear_ι _ x - -@[simp] -lemma jetDeriv_one (μ : Fin 1 ⊕ Fin 3) : jetDeriv (M := M) μ (1 : BosonicAlgebra M) = 0 := - SymmetricAlgebra.derivationOfLinear_one _ - -@[simp] -lemma jetDeriv_algebraMap (μ : Fin 1 ⊕ Fin 3) (r : ℂ) : - jetDeriv (M := M) μ (algebraMap ℂ (BosonicAlgebra M) 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 M) : - 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 (JetComponentSpace M) (JetComponentSpace.jetDeriv (M := M)) - (BosonicAlgebra M) where - jetDeriv := jetDeriv - jetDeriv_ι := jetDeriv_ι - jetDeriv_algebraMap := jetDeriv_algebraMap - jetDeriv_mul := jetDeriv_mul - -lemma jetDeriv_eq (μ : Fin 1 ⊕ Fin 3) : - FieldAlgebra.jetDeriv (A := BosonicAlgebra M) μ = jetDeriv μ := rfl - -/-! - -## D. Compatibility with the inclusion of a species - --/ - -variable {N : MatterField jets} - -/-- **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 : M.V →ₗ[ℂ] N.V) (μ : Fin 1 ⊕ Fin 3) (x : BosonicAlgebra N) : - 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 {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} {M : MatterField jets} - -/-! - -## 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 M →ₗ[ℂ] TrivSqZeroExt (FermionicAlgebra M) (FermionicAlgebra M) 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 M) : - (jetDerivGen μ x).fst = ExteriorAlgebra.ι ℂ x := rfl - -@[simp] -lemma jetDerivGen_snd (μ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace M) : - (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 M) : - 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 M →ₐ[ℂ] TrivSqZeroExt (FermionicAlgebra M) (FermionicAlgebra M) := - ExteriorAlgebra.lift ℂ ⟨jetDerivGen μ, jetDerivGen_mul_self μ⟩ - -@[simp] -lemma jetDerivHom_ι (μ : Fin 1 ⊕ Fin 3) (x : JetComponentSpace M) : - 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 M) : - (jetDerivHom μ x).fst = x := by - have h : (TrivSqZeroExt.fstHom ℂ (FermionicAlgebra M) (FermionicAlgebra M)).comp - (jetDerivHom μ) = AlgHom.id ℂ (FermionicAlgebra M) := 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 M →ₗ[ℂ] FermionicAlgebra M 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 M) : - 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 M) : - jetDeriv μ (ExteriorAlgebra.ι ℂ x) = - ExteriorAlgebra.ι ℂ (JetComponentSpace.jetDeriv μ x) := by - rw [jetDeriv_apply, jetDerivHom_ι, jetDerivGen_snd] - -@[simp] -lemma jetDeriv_one (μ : Fin 1 ⊕ Fin 3) : jetDeriv (M := M) μ (1 : FermionicAlgebra M) = 0 := - congrArg TrivSqZeroExt.snd (map_one (jetDerivHom (M := M) μ)) - -@[simp] -lemma jetDeriv_algebraMap (μ : Fin 1 ⊕ Fin 3) (r : ℂ) : - jetDeriv (M := M) μ (algebraMap ℂ (FermionicAlgebra M) 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 M) : - 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 (JetComponentSpace M) (JetComponentSpace.jetDeriv (M := M)) - (FermionicAlgebra M) where - jetDeriv := jetDeriv - jetDeriv_ι := jetDeriv_ι - jetDeriv_algebraMap := jetDeriv_algebraMap - jetDeriv_mul := jetDeriv_mul - -lemma jetDeriv_eq (μ : Fin 1 ⊕ Fin 3) : - FieldAlgebra.jetDeriv (A := FermionicAlgebra M) μ = jetDeriv μ := rfl - -/-! - -## D. Compatibility with the inclusion of a species - --/ - -variable {N : MatterField jets} - -/-- **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 : M.V →ₗ[ℂ] N.V) (μ : Fin 1 ⊕ Fin 3) (x : FermionicAlgebra N) : - 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/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/LorentzAction.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/LorentzAction.lean deleted file mode 100644 index 6d12edabf..000000000 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/LorentzAction.lean +++ /dev/null @@ -1,186 +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.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.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 {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} (M : MatterField jets) -variable {A : Type} [Ring A] [Algebra ℂ A] [IsFieldAlgebra (JetComponentSpace M) A] - -/-! - -## A. The action of the Lorentz group - --/ - -/-- **The Lorentz action on the field algebra** of the matter field `M`: the algebra - functor applied to the Lorentz action on its jet component space. The representation of - `SL(2,ℂ)` on the target space is a field of `M`, so it need not be supplied here. -/ -noncomputable def repLorentzGroup : - Representation ℂ SL(2,ℂ) (A) where - toFun Λ := (map A (JetComponentSpace.repLorentzGroup M Λ)).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 (Λ : SL(2,ℂ)) - (x : A) : - repLorentzGroup M Λ x = - map A (JetComponentSpace.repLorentzGroup M Λ) x := rfl - -@[simp] -lemma repLorentzGroup_apply_one (Λ : SL(2,ℂ)) : - repLorentzGroup M Λ (1 : A) = 1 := by - simp [repLorentzGroup_apply] - -lemma repLorentzGroup_apply_mul (Λ : SL(2,ℂ)) - (x y : A) : - repLorentzGroup M Λ (x * y) - = repLorentzGroup M Λ x * repLorentzGroup M Λ y := by - simp [repLorentzGroup_apply] - -/-- On a component function the Lorentz action is the action on the component space. -/ -@[simp] -lemma repLorentzGroup_ι (Λ : SL(2,ℂ)) - (v : JetComponentSpace M) : - repLorentzGroup M Λ (ι A v) = - ι A (JetComponentSpace.repLorentzGroup M Λ 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 (Λ : SL(2,ℂ)) : - A →ₐ[ℂ] A where - toFun := repLorentzGroup M Λ - map_add' := LinearMap.map_add _ - map_zero' := LinearMap.map_zero _ - map_one' := repLorentzGroup_apply_one M Λ - map_mul' := repLorentzGroup_apply_mul M Λ - 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 `M.repLorentz.dual` with the action on the field - algebra. -/ -@[simp] -lemma repLorentzGroup_ofField (Λ : SL(2,ℂ)) - (φ : Module.Dual ℂ M.V) : - repLorentzGroup M Λ (ofField A φ) = ofField A (M.repLorentz.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 (Λ : SL(2,ℂ)) - (φ : Module.Dual ℂ (ConjModule M.V)) : - repLorentzGroup M Λ (ofConjField A φ) = ofConjField A (M.repLorentz.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) ⊗ₜ[ℂ] (M.repLorentz.conj.dual Λ φ) = _ - rw [DerivAlgebraComplex.repLorentzGroup_apply_one] - -/-! - -## B. Lorentz covariance of the total derivative - --/ - -variable [HasJetDeriv (JetComponentSpace M) (JetComponentSpace.jetDeriv (M := M)) 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 (Λ : SL(2,ℂ)) - (μ : Fin 1 ⊕ Fin 3) (x : A) : - repLorentzGroup M Λ (jetDeriv μ x) = - ∑ a, (((Lorentz.SL2C.toLorentzGroup Λ).1 a μ : ℝ) : ℂ) • - jetDeriv a (repLorentzGroup M Λ 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 : - Lorentz.IsLorentzDeriv (repLorentzGroup M) (jetDeriv (A := A)) where - rep_deriv := repLorentzGroup_jetDeriv M _ _ _ - -end FieldAlgebra diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/MassDim.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/MassDim.lean deleted file mode 100644 index 078b2ccf7..000000000 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/MassDim.lean +++ /dev/null @@ -1,130 +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.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.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 {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} {M : MatterField jets} -variable {A : Type} [Ring A] [Algebra ℂ A] [IsFieldAlgebra (JetComponentSpace M) 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 M) : - 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 ℂ M.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 M.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 (JetComponentSpace M) (JetComponentSpace.jetDeriv (M := M)) 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/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/Prod.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/Prod.lean deleted file mode 100644 index a164278f6..000000000 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/Prod.lean +++ /dev/null @@ -1,126 +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.LinearAlgebra.CliffordAlgebra.Prod -public import Mathlib.LinearAlgebra.TensorProduct.Prod -public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.Statistics -public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.Prod -/-! -# 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 M ⊗[ℂ] BosonicAlgebra N`. -- `FermionicAlgebra.evenOdd` : the Fermi-parity grading. -- `FermionicAlgebra.prodEquiv` : the graded tensor product decomposition. - --/ - -@[expose] public section - -variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} - -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 of the same mass weight 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 shared weight is what `MatterField.prod` needs to exist; the equivalence - itself does not use it. 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 (M N : MatterField jets) - (h : M.massWeight = N.massWeight) : - BosonicAlgebra (M.prod N h) ≃ₐ[ℂ] BosonicAlgebra M ⊗[ℂ] BosonicAlgebra N := - (SymmetricAlgebra.congr (JetComponentSpace.prodEquiv M N h)).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⟩ - - - -/-! - -## 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.GaugeTheory.MatterField.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 (M : MatterField jets) : - ZMod 2 → Submodule ℂ (FermionicAlgebra M) := - CliffordAlgebra.evenOdd (0 : QuadraticForm ℂ (JetComponentSpace M)) - -/-! - -## C. The exterior product decomposition - --/ - -/-- **The fermionic algebra of a direct sum is the exterior product of the fermionic - algebras.** Two matter fields of the same mass weight 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 (M N : MatterField jets) - (h : M.massWeight = N.massWeight) : - FermionicAlgebra (M.prod N h) ≃ₐ[ℂ] - (FermionicAlgebra.evenOdd M ᵍ⊗[ℂ] FermionicAlgebra.evenOdd N) := - (ExteriorAlgebra.congr (JetComponentSpace.prodEquiv M N h)).trans <| - (CliffordAlgebra.equivOfIsometry - (Q₁ := (0 : QuadraticForm ℂ (JetComponentSpace M × JetComponentSpace N))) - (Q₂ := (0 : QuadraticForm ℂ (JetComponentSpace M)).prod - (0 : QuadraticForm ℂ (JetComponentSpace N))) - ⟨LinearEquiv.refl ℂ _, fun _ => by simp⟩).trans - (CliffordAlgebra.prodEquiv _ _) - -end Fermionic diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/Statistics.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/Statistics.lean deleted file mode 100644 index 10b0bdf0d..000000000 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/FieldAlgebra/Statistics.lean +++ /dev/null @@ -1,285 +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.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.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 the matter field `M`, distinguished by the statistics of the -field: - -* the **bosonic algebra** `BosonicAlgebra M`, the symmetric algebra on the jet component - space — the component functions commute; -* the **fermionic algebra** `FermionicAlgebra M`, 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.GaugeTheory.LocalFieldAlgebra.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 {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} {M : MatterField jets} - -/-! - -## A. The bosonic algebra - --/ - -/-- The bosonic algebra of the matter field `M`: 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 (M : MatterField jets) : Type := - SymmetricAlgebra ℂ (JetComponentSpace M) - -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 M))) = ⊤ := - SymmetricAlgebra.adjoin_range_ι - -/-- Two component functions commute: Bose statistics. -/ -lemma ι_mul_ι_comm (x y : JetComponentSpace M) : - (SymmetricAlgebra.ι ℂ _ x * SymmetricAlgebra.ι ℂ _ y : BosonicAlgebra M) - = SymmetricAlgebra.ι ℂ _ y * SymmetricAlgebra.ι ℂ _ x := - mul_comm _ _ - -/-- The bosonic algebra is a field algebra: the symmetric algebra has the universal - property. -/ -noncomputable instance instIsFieldAlgebra : IsFieldAlgebra (JetComponentSpace M) (BosonicAlgebra M) 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 M) = SymmetricAlgebra.ι ℂ (JetComponentSpace M) := 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 {N : MatterField jets} - -/-- **The bosonic algebra is contravariant in the target space.** A linear map - `f : V →ₗ[ℂ] W` induces an algebra homomorphism `BosonicAlgebra N →ₐ[ℂ] BosonicAlgebra M` - 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 : M.V →ₗ[ℂ] N.V) : BosonicAlgebra N →ₐ[ℂ] BosonicAlgebra M := - SymmetricAlgebra.map (JetComponentSpace.comap f) - -@[simp] -lemma comap_ι (f : M.V →ₗ[ℂ] N.V) (x : JetComponentSpace N) : - comap f (FieldAlgebra.ι (BosonicAlgebra N) x) - = FieldAlgebra.ι (BosonicAlgebra M) (JetComponentSpace.comap f x) := - SymmetricAlgebra.map_apply_ι _ x - -@[simp] -lemma comap_id : comap (LinearMap.id : M.V →ₗ[ℂ] M.V) = AlgHom.id ℂ (BosonicAlgebra M) := by - rw [comap, JetComponentSpace.comap_id, SymmetricAlgebra.map_id] - -/-- Functoriality: the order reverses, as it must for a contravariant construction. -/ -lemma comap_comp {P : MatterField jets} (f : M.V →ₗ[ℂ] N.V) (g : N.V →ₗ[ℂ] P.V) : - 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 : M.V →ₗ[ℂ] N.V) (φ : Module.Dual ℂ N.V) : - comap f (FieldAlgebra.ofField (BosonicAlgebra N) φ) - = FieldAlgebra.ofField (BosonicAlgebra M) (φ ∘ₗ 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 : M.V →ₗ[ℂ] N.V) (φ : Module.Dual ℂ (ConjModule N.V)) : - comap f (FieldAlgebra.ofConjField (BosonicAlgebra N) φ) - = FieldAlgebra.ofConjField (BosonicAlgebra M) (φ ∘ₗ ConjModule.map f) := by - rw [FieldAlgebra.ofConjField_apply, comap_ι, FieldAlgebra.ofConjField_apply] - congr 1 - -end BosonicAlgebra - -end Bosonic - -section Fermionic - -open TensorProduct - -variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} {M : MatterField jets} - -/-! - -## A. The fermionic algebra - --/ - -/-- The fermionic algebra of the matter field `M`: 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 (M : MatterField jets) : Type := - ExteriorAlgebra ℂ (JetComponentSpace M) - -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 M))) = ⊤ := - CliffordAlgebra.adjoin_range_ι - -/-- A component function squares to zero: no fermionic field appears twice. -/ -lemma ι_sq_zero (x : JetComponentSpace M) : - ExteriorAlgebra.ι ℂ x * ExteriorAlgebra.ι ℂ x = (0 : FermionicAlgebra M) := - ExteriorAlgebra.ι_sq_zero x - -/-- Two component functions anticommute. -/ -lemma ι_mul_ι_swap (x y : JetComponentSpace M) : - (ExteriorAlgebra.ι ℂ x * ExteriorAlgebra.ι ℂ y : FermionicAlgebra M) - = - (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 (JetComponentSpace M) (FermionicAlgebra M) 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 M) = 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 {N : MatterField jets} - -/-- **The fermionic algebra is contravariant in the target space.** A linear map - `f : V →ₗ[ℂ] W` induces an algebra homomorphism `FermionicAlgebra N →ₐ[ℂ] FermionicAlgebra M` - 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 : M.V →ₗ[ℂ] N.V) : FermionicAlgebra N →ₐ[ℂ] FermionicAlgebra M := - ExteriorAlgebra.map (JetComponentSpace.comap f) - -@[simp] -lemma comap_ι (f : M.V →ₗ[ℂ] N.V) (x : JetComponentSpace N) : - comap f (FieldAlgebra.ι (FermionicAlgebra N) x) - = FieldAlgebra.ι (FermionicAlgebra M) (JetComponentSpace.comap f x) := - ExteriorAlgebra.map_apply_ι _ x - -@[simp] -lemma comap_id : comap (LinearMap.id : M.V →ₗ[ℂ] M.V) = AlgHom.id ℂ (FermionicAlgebra M) := by - rw [comap, JetComponentSpace.comap_id, ExteriorAlgebra.map_id] - -/-- Functoriality: the order reverses, as it must for a contravariant construction. -/ -lemma comap_comp {P : MatterField jets} (f : M.V →ₗ[ℂ] N.V) (g : N.V →ₗ[ℂ] P.V) : - 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 : M.V →ₗ[ℂ] N.V) (φ : Module.Dual ℂ N.V) : - comap f (FieldAlgebra.ofField (FermionicAlgebra N) φ) - = FieldAlgebra.ofField (FermionicAlgebra M) (φ ∘ₗ 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 : M.V →ₗ[ℂ] N.V) (φ : Module.Dual ℂ (ConjModule N.V)) : - comap f (FieldAlgebra.ofConjField (FermionicAlgebra N) φ) - = FieldAlgebra.ofConjField (FermionicAlgebra M) (φ ∘ₗ ConjModule.map f) := by - rw [FieldAlgebra.ofConjField_apply, comap_ι, FieldAlgebra.ofConjField_apply] - congr 1 - -end FermionicAlgebra - -end Fermionic diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Basic.lean index 48bb260e0..6d8fe6530 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Basic.lean @@ -23,11 +23,12 @@ unrelated group. Fixing `jets` rather than `GJ` alone is what lets the global ga `repConstant` below be taken along the *canonical* inclusion `jets.ofConstant`, instead of an arbitrary homomorphism supplied by hand. -`MatterField jets` bundles this data. From it the general theory produces, on any field -algebra `A` of the field (bosonic or fermionic), the jet gauge action, the global gauge -action, the Lorentz action and the mass-weight scaling — all in -`Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.FieldAlgebra`, downstream of the -component space this file's data indexes. A concrete theory therefore only has to supply a +`MatterField jets` bundles this data. From it the general theory produces, on the bosonic +and fermionic algebras of the field, the jet gauge action, the global gauge action, the +Lorentz action and the mass-weight scaling — in +`Physlib.Particles.StandardModel.Matter.BosonicAlgebra` and +`Physlib.Particles.StandardModel.Matter.FermionicAlgebra`, downstream of the component +space this file's data indexes. A concrete theory therefore only has to supply a `MatterField` for each of its fields. ## ii. Key results diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/FieldAlgebra.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/FieldAlgebra.lean deleted file mode 100644 index 7c9b64be0..000000000 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/FieldAlgebra.lean +++ /dev/null @@ -1,112 +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.ClassicalFieldTheory.GaugeTheory.MatterField.Basic -public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.ConstantAction -public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.LorentzAction -public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.MassDim -public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.Statistics -public import Physlib.QFT.PerturbationTheory.FieldStatistics.Basic -/-! -# The field algebras of a matter field - -## i. Overview - -A field algebra of a matter field `M` is any algebra generated by the component functions -`∂_s ψ_α` of `M` — the bosonic and fermionic jet algebras are the two canonical choices. -This file transports the data of `M` onto such an algebra: the jet gauge action, the -global gauge action along the canonical inclusion `jets.ofConstant` of the constant jets, -the Lorentz action and the mass-weight scaling. - -It sits downstream of the component space that `M` indexes, which is why it is separate -from the file carrying the structure itself. - -## ii. Key results - -- `MatterField.FieldAlgebra` : the field algebra of a matter field of a given statistics — - the bosonic algebra for `FieldStatistic.bosonic`, the fermionic algebra for - `FieldStatistic.fermionic`. -- `MatterField.repJetAlgebra` : the jet gauge action on a field algebra of the field. -- `MatterField.repConstant` : the global gauge action, along `jets.ofConstant`. -- `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 field algebra -- B. The actions on a field algebra of the matter field - --/ - -@[expose] public section - -open Matrix MatrixGroups TensorProduct - -namespace MatterField - -variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] - {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] - {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} (M : MatterField jets) - -/-! - -## A. The field algebra - --/ - -open FieldStatistic in -/-- The field algebra of a matter field of a given statistics: the bosonic algebra - `BosonicAlgebra M` for `bosonic`, the exterior algebra `FermionicAlgebra M` for - `fermionic`. -/ -abbrev FieldAlgebra : FieldStatistic → Type - | bosonic => BosonicAlgebra M - | fermionic => FermionicAlgebra M - -/-! - -## B. The actions on a field algebra of the matter field - --/ - -variable (A : Type) [Ring A] [Algebra ℂ A] [IsFieldAlgebra (JetComponentSpace M) A] - -/-- The jet gauge action on a field algebra of the matter field. -/ -noncomputable def repJetAlgebra : Representation ℂ GJ A := - FieldAlgebra.repJet M - -/-- The global gauge action on a field algebra of the matter field, along the canonical - inclusion `jets.ofConstant : G₀ →* GJ` of the constant jets. -/ -noncomputable def repConstant : Representation ℂ G₀ A := - FieldAlgebra.repConstant M jets.ofConstant - -/-- The Lorentz action on a field algebra of the matter field. -/ -noncomputable def repLorentzGroup : Representation ℂ SL(2,ℂ) A := - FieldAlgebra.repLorentzGroup M - -/-- 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 : GJ) (x : JetComponentSpace M) : - M.repJetAlgebra A U (FieldAlgebra.ι A x) = - FieldAlgebra.ι A (JetComponentSpace.repJet M U x) := - FieldAlgebra.repJet_ι M U x - -lemma repConstant_apply (g : G₀) : - M.repConstant A g = M.repJetAlgebra A (jets.ofConstant g) := rfl - -lemma repLorentzGroup_ι (Λ : SL(2,ℂ)) (x : JetComponentSpace M) : - M.repLorentzGroup A Λ (FieldAlgebra.ι A x) = - FieldAlgebra.ι A (JetComponentSpace.repLorentzGroup M Λ x) := - FieldAlgebra.repLorentzGroup_ι M Λ x - -lemma massWeightScale_ι (c : ℂ) (x : JetComponentSpace M) : - 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/Particles/StandardModel/JetAlgebra/Basic.lean b/Physlib/Particles/StandardModel/JetAlgebra/Basic.lean index 03a8b93c1..8ea8d3b60 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/Basic.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/Basic.lean @@ -116,7 +116,7 @@ lemma includeGauge_eq_includeConnection : /-- A degree-one element of the fermionic sector, included, is a total fermionic generator of the field datum, read through the fermionic generator identification. -/ -lemma includeFermion_ι (v : JetComponentSpace FermionSpace) : +lemma includeFermion_ι (v : JetComponentSpace fermionMatterField) : includeFermion (ExteriorAlgebra.ι ℂ v) = fieldData.ιFermionTotal (fermionGeneratorsEquiv.symm v) := (includeFermion_apply_equiv (ExteriorAlgebra.ι ℂ v)).trans @@ -126,10 +126,10 @@ lemma includeFermion_ι (v : JetComponentSpace FermionSpace) : /-- A degree-one element of the Higgs sector, included, is the generator of the one bosonic species of the field datum. -/ -lemma includeHiggs_ι (v : JetComponentSpace HiggsVec) : - includeHiggs (SymmetricAlgebra.ι ℂ (JetComponentSpace HiggsVec) v) +lemma includeHiggs_ι (v : JetComponentSpace HiggsVec.matterField) : + includeHiggs (SymmetricAlgebra.ι ℂ (JetComponentSpace HiggsVec.matterField) v) = fieldData.ιBoson () v := - (((includeHiggs_apply_equiv (SymmetricAlgebra.ι ℂ (JetComponentSpace HiggsVec) v)).trans + (((includeHiggs_apply_equiv (SymmetricAlgebra.ι ℂ (JetComponentSpace HiggsVec.matterField) v)).trans (congrArg (fun b : SymmetricAlgebra ℂ fieldData.BosonGenerators => fieldData.includeBoson b) (higgsAlgebraEquiv_ι v))).trans (StandardModel.includeBoson_ι (bosonGeneratorsEquiv.symm v))).trans diff --git a/Physlib/Particles/StandardModel/JetAlgebra/FieldAlgebra.lean b/Physlib/Particles/StandardModel/JetAlgebra/FieldAlgebra.lean index 900adaaf7..636f1d06b 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/FieldAlgebra.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/FieldAlgebra.lean @@ -228,7 +228,7 @@ lemma higgsField_eq_includeHiggs (s : Multiset (Fin 1 ⊕ Fin 3)) higgsField s φ = includeHiggs (BosonicAlgebra.iteratedJetDeriv s (BosonicAlgebra.ofField φ)) := (higgsField_apply s φ).trans - (congrArg includeHiggs (BosonicAlgebra.iteratedJetDeriv_ofField s φ).symm) + (congrArg includeHiggs (BosonicAlgebra.iteratedJetDeriv_ofField (M := HiggsVec.matterField) s φ).symm) /-- A conjugate Higgs symbol is the Higgs sector's own conjugate derivative symbol, included. -/ @@ -238,7 +238,7 @@ lemma conjHiggsField_eq_includeHiggs (s : Multiset (Fin 1 ⊕ Fin 3)) = includeHiggs (BosonicAlgebra.iteratedJetDeriv s (BosonicAlgebra.ofConjField φ)) := (conjHiggsField_apply s φ).trans - (congrArg includeHiggs (BosonicAlgebra.iteratedJetDeriv_ofConjField s φ).symm) + (congrArg includeHiggs (BosonicAlgebra.iteratedJetDeriv_ofConjField (M := HiggsVec.matterField) s φ).symm) /-- Every element of the Higgs sector lies in the algebra generated by the symbols: the Higgs jet algebra is generated by the Higgs field, its conjugate and their derivatives, @@ -246,7 +246,7 @@ lemma conjHiggsField_eq_includeHiggs (s : Multiset (Fin 1 ⊕ Fin 3)) lemma includeHiggs_mem_adjoin_generators (h : HiggsJetAlgebra) : includeHiggs h ∈ Algebra.adjoin ℂ generators := by refine mem_of_adjoin_eq_top includeHiggs - (BosonicAlgebra.adjoin_iteratedJetDeriv_eq_top (V := HiggsVec)) ?_ h + (BosonicAlgebra.adjoin_iteratedJetDeriv_eq_top (M := HiggsVec.matterField)) ?_ h rintro _ ⟨y, hy, rfl⟩ rw [Set.mem_iUnion] at hy obtain ⟨s, hs⟩ := hy @@ -274,7 +274,7 @@ lemma fermionSymbol_eq_includeFermion (s : Multiset (Fin 1 ⊕ Fin 3)) = includeFermion (FermionicAlgebra.iteratedJetDeriv s (FermionicAlgebra.ofField φ)) := (fermionSymbol_apply s φ).trans - (congrArg includeFermion (FermionicAlgebra.iteratedJetDeriv_ofField s φ).symm) + (congrArg includeFermion (FermionicAlgebra.iteratedJetDeriv_ofField (M := fermionMatterField) s φ).symm) /-- A conjugate fermionic symbol is the fermionic sector's own conjugate derivative symbol, included. -/ @@ -284,7 +284,7 @@ lemma conjFermionSymbol_eq_includeFermion (s : Multiset (Fin 1 ⊕ Fin 3)) = includeFermion (FermionicAlgebra.iteratedJetDeriv s (FermionicAlgebra.ofConjField φ)) := (conjFermionSymbol_apply s φ).trans - (congrArg includeFermion (FermionicAlgebra.iteratedJetDeriv_ofConjField s φ).symm) + (congrArg includeFermion (FermionicAlgebra.iteratedJetDeriv_ofConjField (M := fermionMatterField) s φ).symm) /-- Every fermionic symbol lies in the generated algebra. The families give the symbols of the covectors pulled back from a single species and generation; those span every covector @@ -353,7 +353,7 @@ lemma conjFermionSymbol_mem_adjoin_generators (s : Multiset (Fin 1 ⊕ Fin 3)) lemma includeFermion_mem_adjoin_generators (f : FermionJetAlgebra) : includeFermion f ∈ Algebra.adjoin ℂ generators := by refine mem_of_adjoin_eq_top includeFermion - (FermionicAlgebra.adjoin_iteratedJetDeriv_eq_top (V := FermionSpace)) ?_ f + (FermionicAlgebra.adjoin_iteratedJetDeriv_eq_top (M := fermionMatterField)) ?_ f rintro _ ⟨y, hy, rfl⟩ rw [Set.mem_iUnion] at hy obtain ⟨s, hs⟩ := hy diff --git a/Physlib/Particles/StandardModel/JetAlgebra/Generators.lean b/Physlib/Particles/StandardModel/JetAlgebra/Generators.lean index c78b42c15..2af5860a7 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/Generators.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/Generators.lean @@ -107,9 +107,9 @@ noncomputable def conjHiggsField (s : Multiset (Fin 1 ⊕ Fin 3)) : space. -/ lemma higgsField_apply (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ HiggsVec) : higgsField s φ = includeHiggs (SymmetricAlgebra.ι ℂ _ - ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace HiggsVec)) := + ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace HiggsVec.matterField)) := (iteratedD_includeHiggs s (HiggsJetAlgebra.ofHiggs φ)).trans - (congrArg includeHiggs (BosonicAlgebra.iteratedJetDeriv_ofField s φ)) + (congrArg includeHiggs (BosonicAlgebra.iteratedJetDeriv_ofField (M := HiggsVec.matterField) s φ)) /-- A conjugate Higgs symbol is a single generator of the Higgs sector, included: the derivative label `s` sits in the derivative factor of the conjugate half of the component @@ -117,9 +117,9 @@ lemma higgsField_apply (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ Hi lemma conjHiggsField_apply (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule HiggsVec)) : conjHiggsField s φ = includeHiggs (SymmetricAlgebra.ι ℂ _ - ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace HiggsVec)) := + ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace HiggsVec.matterField)) := (iteratedD_includeHiggs s (HiggsJetAlgebra.ofConjHiggs φ)).trans - (congrArg includeHiggs (BosonicAlgebra.iteratedJetDeriv_ofConjField s φ)) + (congrArg includeHiggs (BosonicAlgebra.iteratedJetDeriv_ofConjField (M := HiggsVec.matterField) s φ)) /-! @@ -143,14 +143,14 @@ so it is worth reducing them once here. noncomputable def fermionSymbol (s : Multiset (Fin 1 ⊕ Fin 3)) : Module.Dual ℂ FermionSpace →ₗ[ℂ] JetAlgebra := (Lorentz.iteratedD (A := JetAlgebra) jetDeriv jetDeriv_comm s).comp - (includeFermion.toLinearMap.comp FermionicAlgebra.ofField) + (includeFermion.toLinearMap.comp (FermionicAlgebra.ofField (M := fermionMatterField))) /-- The conjugate derivative symbols `∂_s ψ̄_φ` of a covector `φ` on the conjugate of the total fermionic target space. -/ noncomputable def conjFermionSymbol (s : Multiset (Fin 1 ⊕ Fin 3)) : Module.Dual ℂ (ConjModule FermionSpace) →ₗ[ℂ] JetAlgebra := (Lorentz.iteratedD (A := JetAlgebra) jetDeriv jetDeriv_comm s).comp - (includeFermion.toLinearMap.comp FermionicAlgebra.ofConjField) + (includeFermion.toLinearMap.comp (FermionicAlgebra.ofConjField (M := fermionMatterField))) /-- A fermionic symbol is a single generator of the fermionic sector, included: the derivative label `s` sits in the derivative factor of the unconjugated half of the @@ -158,9 +158,9 @@ noncomputable def conjFermionSymbol (s : Multiset (Fin 1 ⊕ Fin 3)) : lemma fermionSymbol_apply (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ FermionSpace) : fermionSymbol s φ = includeFermion (ExteriorAlgebra.ι ℂ - ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace FermionSpace)) := - (iteratedD_includeFermion s (FermionicAlgebra.ofField φ)).trans - (congrArg includeFermion (FermionicAlgebra.iteratedJetDeriv_ofField s φ)) + ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace fermionMatterField)) := + (iteratedD_includeFermion s (FermionicAlgebra.ofField (M := fermionMatterField) φ)).trans + (congrArg includeFermion (FermionicAlgebra.iteratedJetDeriv_ofField (M := fermionMatterField) s φ)) /-- A conjugate fermionic symbol is a single generator of the fermionic sector, included: the derivative label `s` sits in the derivative factor of the conjugate half of the @@ -168,9 +168,9 @@ lemma fermionSymbol_apply (s : Multiset (Fin 1 ⊕ Fin 3)) lemma conjFermionSymbol_apply (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule FermionSpace)) : conjFermionSymbol s φ = includeFermion (ExteriorAlgebra.ι ℂ - ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace FermionSpace)) := - (iteratedD_includeFermion s (FermionicAlgebra.ofConjField φ)).trans - (congrArg includeFermion (FermionicAlgebra.iteratedJetDeriv_ofConjField s φ)) + ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace fermionMatterField)) := + (iteratedD_includeFermion s (FermionicAlgebra.ofConjField (M := fermionMatterField) φ)).trans + (congrArg includeFermion (FermionicAlgebra.iteratedJetDeriv_ofConjField (M := fermionMatterField) s φ)) /-! @@ -518,7 +518,7 @@ lemma MemHiggsSector.commute_of_memFermionSector {x y : JetAlgebra} fermionic inclusion, of a degree-one element of the fermionic jet algebra. Every one of the ten fermion families consists of such elements, by the reductions of section B.3. -/ def IsFermionGenerator (x : JetAlgebra) : Prop := - ∃ v : JetComponentSpace FermionSpace, x = includeFermion (ExteriorAlgebra.ι ℂ v) + ∃ v : JetComponentSpace fermionMatterField, x = includeFermion (ExteriorAlgebra.ι ℂ v) /-- A fermionic generator lies in the fermionic sector. -/ lemma IsFermionGenerator.memFermionSector {x : JetAlgebra} (hx : IsFermionGenerator x) : @@ -618,7 +618,7 @@ lemma leptonDoubletField_eq_ιFermion (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3 leptonDoubletField i s φ = fieldData.ιFermion (.leptonDoublet i) ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : - JetComponentSpace (fieldData.FermionValue (.leptonDoublet i))) := + JetComponentSpace (fieldData.fermion (.leptonDoublet i))) := ((leptonDoubletField_apply i s φ).trans (includeFermion_ι _)).trans ((congrArg (fun w : fieldData.FermionGenerators => fieldData.ιFermionTotal w) (fermionGeneratorsEquiv_symm_basis_tmul (.leptonDoublet i) s φ)).trans @@ -632,7 +632,7 @@ lemma conjLeptonDoubletField_eq_ιFermion (i : Fin 3) (s : Multiset (Fin 1 ⊕ F conjLeptonDoubletField i s φ = fieldData.ιFermion (.leptonDoublet i) ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : - JetComponentSpace (fieldData.FermionValue (.leptonDoublet i))) := + JetComponentSpace (fieldData.fermion (.leptonDoublet i))) := ((conjLeptonDoubletField_apply i s φ).trans (includeFermion_ι _)).trans ((congrArg (fun w : fieldData.FermionGenerators => fieldData.ιFermionTotal w) (fermionGeneratorsEquiv_symm_basis_tmul_conj (.leptonDoublet i) s φ)).trans @@ -645,7 +645,7 @@ lemma leptonSingletField_eq_ιFermion (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3 leptonSingletField i s φ = fieldData.ιFermion (.leptonSinglet i) ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : - JetComponentSpace (fieldData.FermionValue (.leptonSinglet i))) := + JetComponentSpace (fieldData.fermion (.leptonSinglet i))) := ((leptonSingletField_apply i s φ).trans (includeFermion_ι _)).trans ((congrArg (fun w : fieldData.FermionGenerators => fieldData.ιFermionTotal w) (fermionGeneratorsEquiv_symm_basis_tmul (.leptonSinglet i) s φ)).trans @@ -659,7 +659,7 @@ lemma conjLeptonSingletField_eq_ιFermion (i : Fin 3) (s : Multiset (Fin 1 ⊕ F conjLeptonSingletField i s φ = fieldData.ιFermion (.leptonSinglet i) ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : - JetComponentSpace (fieldData.FermionValue (.leptonSinglet i))) := + JetComponentSpace (fieldData.fermion (.leptonSinglet i))) := ((conjLeptonSingletField_apply i s φ).trans (includeFermion_ι _)).trans ((congrArg (fun w : fieldData.FermionGenerators => fieldData.ιFermionTotal w) (fermionGeneratorsEquiv_symm_basis_tmul_conj (.leptonSinglet i) s φ)).trans @@ -672,7 +672,7 @@ lemma quarkDoubletField_eq_ιFermion (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3) quarkDoubletField i s φ = fieldData.ιFermion (.quarkDoublet i) ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : - JetComponentSpace (fieldData.FermionValue (.quarkDoublet i))) := + JetComponentSpace (fieldData.fermion (.quarkDoublet i))) := ((quarkDoubletField_apply i s φ).trans (includeFermion_ι _)).trans ((congrArg (fun w : fieldData.FermionGenerators => fieldData.ιFermionTotal w) (fermionGeneratorsEquiv_symm_basis_tmul (.quarkDoublet i) s φ)).trans @@ -686,7 +686,7 @@ lemma conjQuarkDoubletField_eq_ιFermion (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fi conjQuarkDoubletField i s φ = fieldData.ιFermion (.quarkDoublet i) ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : - JetComponentSpace (fieldData.FermionValue (.quarkDoublet i))) := + JetComponentSpace (fieldData.fermion (.quarkDoublet i))) := ((conjQuarkDoubletField_apply i s φ).trans (includeFermion_ι _)).trans ((congrArg (fun w : fieldData.FermionGenerators => fieldData.ιFermionTotal w) (fermionGeneratorsEquiv_symm_basis_tmul_conj (.quarkDoublet i) s φ)).trans @@ -699,7 +699,7 @@ lemma upSingletField_eq_ιFermion (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) upSingletField i s φ = fieldData.ιFermion (.upSinglet i) ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : - JetComponentSpace (fieldData.FermionValue (.upSinglet i))) := + JetComponentSpace (fieldData.fermion (.upSinglet i))) := ((upSingletField_apply i s φ).trans (includeFermion_ι _)).trans ((congrArg (fun w : fieldData.FermionGenerators => fieldData.ιFermionTotal w) (fermionGeneratorsEquiv_symm_basis_tmul (.upSinglet i) s φ)).trans @@ -713,7 +713,7 @@ lemma conjUpSingletField_eq_ιFermion (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3 conjUpSingletField i s φ = fieldData.ιFermion (.upSinglet i) ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : - JetComponentSpace (fieldData.FermionValue (.upSinglet i))) := + JetComponentSpace (fieldData.fermion (.upSinglet i))) := ((conjUpSingletField_apply i s φ).trans (includeFermion_ι _)).trans ((congrArg (fun w : fieldData.FermionGenerators => fieldData.ιFermionTotal w) (fermionGeneratorsEquiv_symm_basis_tmul_conj (.upSinglet i) s φ)).trans @@ -726,7 +726,7 @@ lemma downSingletField_eq_ιFermion (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin 3)) downSingletField i s φ = fieldData.ιFermion (.downSinglet i) ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : - JetComponentSpace (fieldData.FermionValue (.downSinglet i))) := + JetComponentSpace (fieldData.fermion (.downSinglet i))) := ((downSingletField_apply i s φ).trans (includeFermion_ι _)).trans ((congrArg (fun w : fieldData.FermionGenerators => fieldData.ιFermionTotal w) (fermionGeneratorsEquiv_symm_basis_tmul (.downSinglet i) s φ)).trans @@ -740,7 +740,7 @@ lemma conjDownSingletField_eq_ιFermion (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin conjDownSingletField i s φ = fieldData.ιFermion (.downSinglet i) ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : - JetComponentSpace (fieldData.FermionValue (.downSinglet i))) := + JetComponentSpace (fieldData.fermion (.downSinglet i))) := ((conjDownSingletField_apply i s φ).trans (includeFermion_ι _)).trans ((congrArg (fun w : fieldData.FermionGenerators => fieldData.ιFermionTotal w) (fermionGeneratorsEquiv_symm_basis_tmul_conj (.downSinglet i) s φ)).trans @@ -750,7 +750,7 @@ lemma conjDownSingletField_eq_ιFermion (i : Fin 3) (s : Multiset (Fin 1 ⊕ Fin lemma higgsField_eq_ιBoson (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ HiggsVec) : higgsField s φ = fieldData.ιBoson () - ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace HiggsVec) := + ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : JetComponentSpace HiggsVec.matterField) := (higgsField_apply s φ).trans (includeHiggs_ι _) /-- The conjugate Higgs symbols `∂_s H̄_φ` are the conjugate generators of the one bosonic @@ -760,7 +760,7 @@ lemma conjHiggsField_eq_ιBoson (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (ConjModule HiggsVec)) : conjHiggsField s φ = fieldData.ιBoson () - ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace HiggsVec) := + ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : JetComponentSpace HiggsVec.matterField) := (conjHiggsField_apply s φ).trans (includeHiggs_ι _) end JetAlgebra diff --git a/Physlib/Particles/StandardModel/JetAlgebra/SectorEquiv/Basic.lean b/Physlib/Particles/StandardModel/JetAlgebra/SectorEquiv/Basic.lean index 9a8b328e4..ff46ed4d2 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/SectorEquiv/Basic.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/SectorEquiv/Basic.lean @@ -7,6 +7,7 @@ module public import Physlib.Particles.StandardModel.FieldData public import Physlib.Particles.StandardModel.Fermions.JetAlgebra.Basic +public import Physlib.Particles.StandardModel.HiggsBoson.JetAlgebra.Algebra public import Physlib.Particles.StandardModel.HiggsBoson.JetAlgebra.Basic public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.JetDeriv public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.JetDeriv @@ -100,7 +101,8 @@ two. product of five three-generation blocks that `FermionSpace` is, rearranged into a dependent function on the fifteen species. It is a relabelling: every component of a value on one side is a component of the corresponding value on the other. -/ -noncomputable def fermionSpaceEquiv : FermionSpace ≃ₗ[ℂ] fieldData.FermionModule where +noncomputable def fermionSpaceEquiv : + fermionMatterField.V ≃ₗ[ℂ] (fieldData.fermionMatterField 3 fieldData_fermion_massWeight).V where toFun v t := match t with | .leptonDoublet i => v.1 i @@ -137,11 +139,13 @@ noncomputable def fermionSpaceEquiv : FermionSpace ≃ₗ[ℂ] fieldData.Fermion /-- The projection of the total fermionic target space onto the value space of a species of the datum: the relabelling followed by the projection of the module. -/ noncomputable def fermionProj (t : fieldData.FermionSpecies) : - FermionSpace →ₗ[ℂ] fieldData.FermionValue t := - (fieldData.projFermionValue t).comp fermionSpaceEquiv.toLinearMap + fermionMatterField.V →ₗ[ℂ] (fieldData.fermion t).V := + (fieldData.projFermionField 3 fieldData_fermion_massWeight t).comp + fermionSpaceEquiv.toLinearMap lemma fermionProj_eq (t : fieldData.FermionSpecies) : - fermionProj t = (fieldData.projFermionValue t).comp fermionSpaceEquiv.toLinearMap := rfl + fermionProj t = (fieldData.projFermionField 3 fieldData_fermion_massWeight t).comp + fermionSpaceEquiv.toLinearMap := rfl @[simp] lemma fermionProj_leptonDoublet (i : Fin 3) : @@ -171,7 +175,8 @@ lemma fermionProj_downSinglet (i : Fin 3) : /-- The Higgs multiplet is the bosonic module of the datum. There is one bosonic species, so the module of bosonic values is the constant family on it. -/ -noncomputable def higgsModuleEquiv : HiggsVec ≃ₗ[ℂ] fieldData.BosonModule where +noncomputable def higgsModuleEquiv : + HiggsVec.matterField.V ≃ₗ[ℂ] (fieldData.bosonMatterField 2 fieldData_boson_massWeight).V where toFun v := fun _ => v map_add' _ _ := rfl map_smul' _ _ := rfl @@ -181,17 +186,18 @@ noncomputable def higgsModuleEquiv : HiggsVec ≃ₗ[ℂ] fieldData.BosonModule /-- Reading off the one species undoes the relabelling. -/ lemma projBosonValue_comp_higgsModuleEquiv (j : fieldData.BosonSpecies) : - (fieldData.projBosonValue j).comp higgsModuleEquiv.toLinearMap = LinearMap.id := + (fieldData.projBosonField 2 fieldData_boson_massWeight j).comp + higgsModuleEquiv.toLinearMap = LinearMap.id := LinearMap.ext fun _ => rfl /-- The pullback along the relabelling undoes the pullback along the one projection. -/ lemma comap_projBosonValue_comp_comap_higgsModuleEquiv (j : fieldData.BosonSpecies) : (JetComponentSpace.comap higgsModuleEquiv.toLinearMap).comp - (JetComponentSpace.comap (fieldData.projBosonValue j)) + (JetComponentSpace.comap (fieldData.projBosonField 2 fieldData_boson_massWeight j)) = LinearMap.id := ((JetComponentSpace.comap_comp higgsModuleEquiv.toLinearMap - (fieldData.projBosonValue j)).symm.trans - (congrArg (fun f : HiggsVec →ₗ[ℂ] fieldData.BosonValue j => + (fieldData.projBosonField 2 fieldData_boson_massWeight j)).symm.trans + (congrArg (fun f : HiggsVec.matterField.V →ₗ[ℂ] (fieldData.boson j).V => JetComponentSpace.comap f) (projBosonValue_comp_higgsModuleEquiv j))).trans JetComponentSpace.comap_id @@ -211,61 +217,65 @@ by `comapEquiv` to a map *from* the component space of the module *to* that of fermionic target space. The generic presentation of the direct sum as the component space of the fermionic module, followed by the relabelling of the target space. -/ noncomputable def fermionGeneratorsEquiv : - fieldData.FermionGenerators ≃ₗ[ℂ] JetComponentSpace FermionSpace := - fieldData.fermionGeneratorsEquiv.trans (JetComponentSpace.comapEquiv fermionSpaceEquiv) + fieldData.FermionGenerators ≃ₗ[ℂ] JetComponentSpace fermionMatterField := + (fieldData.fermionGeneratorsEquiv 3 fieldData_fermion_massWeight).trans + (JetComponentSpace.comapEquiv (M := fermionMatterField) + (N := fieldData.fermionMatterField 3 fieldData_fermion_massWeight) fermionSpaceEquiv) /-- A species sits inside the fermionic generators as the pullback along the projection onto that species. -/ @[simp] lemma fermionGeneratorsEquiv_inclFermion (t : fieldData.FermionSpecies) - (x : JetComponentSpace (fieldData.FermionValue t)) : + (x : JetComponentSpace (fieldData.fermion t)) : fermionGeneratorsEquiv (fieldData.inclFermion t x) = JetComponentSpace.comap (fermionProj t) x := by rw [fermionProj_eq, JetComponentSpace.comap_comp fermionSpaceEquiv.toLinearMap - (fieldData.projFermionValue t), + (fieldData.projFermionField 3 fieldData_fermion_massWeight t), fermionGeneratorsEquiv, LinearEquiv.trans_apply, - GaugeFieldData.fermionGeneratorsEquiv_inclFermion, + GaugeFieldData.fermionGeneratorsEquiv_inclFermion 3 fieldData_fermion_massWeight, JetComponentSpace.comapEquiv_apply, LinearMap.comp_apply] @[simp] lemma fermionGeneratorsEquiv_symm_comap (t : fieldData.FermionSpecies) - (x : JetComponentSpace (fieldData.FermionValue t)) : + (x : JetComponentSpace (fieldData.fermion t)) : fermionGeneratorsEquiv.symm (JetComponentSpace.comap (fermionProj t) x) = fieldData.inclFermion t x := by rw [← fermionGeneratorsEquiv_inclFermion, LinearEquiv.symm_apply_apply] /-- The second half of a pullback of an unconjugated symbol vanishes. -/ -lemma _root_.JetComponentSpace.comap_snd_of_zero {V W : Type} [AddCommGroup V] [Module ℂ V] - [AddCommGroup W] [Module ℂ W] (f : V →ₗ[ℂ] W) - (x : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ W) : - (JetComponentSpace.comap f ((x, 0) : JetComponentSpace W)).2 = 0 := by - rw [show (JetComponentSpace.comap f ((x, 0) : JetComponentSpace W)).2 +lemma _root_.JetComponentSpace.comap_snd_of_zero {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} {M N : MatterField jets} + (f : M.V →ₗ[ℂ] N.V) (x : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ N.V) : + (JetComponentSpace.comap f ((x, 0) : JetComponentSpace N)).2 = 0 := by + rw [show (JetComponentSpace.comap f ((x, 0) : JetComponentSpace N)).2 = (TensorProduct.map LinearMap.id (Module.Dual.transpose (ConjModule.map f))) - (0 : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule W)) from rfl, map_zero] + (0 : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule N.V)) from rfl, map_zero] /-- The first half of a pullback of a conjugate symbol vanishes. -/ -lemma _root_.JetComponentSpace.comap_fst_of_zero {V W : Type} [AddCommGroup V] [Module ℂ V] - [AddCommGroup W] [Module ℂ W] (f : V →ₗ[ℂ] W) - (y : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule W)) : - (JetComponentSpace.comap f ((0, y) : JetComponentSpace W)).1 = 0 := by - rw [show (JetComponentSpace.comap f ((0, y) : JetComponentSpace W)).1 +lemma _root_.JetComponentSpace.comap_fst_of_zero {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} {M N : MatterField jets} + (f : M.V →ₗ[ℂ] N.V) (y : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ (ConjModule N.V)) : + (JetComponentSpace.comap f ((0, y) : JetComponentSpace N)).1 = 0 := by + rw [show (JetComponentSpace.comap f ((0, y) : JetComponentSpace N)).1 = (TensorProduct.map LinearMap.id (Module.Dual.transpose f)) - (0 : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ W) from rfl, map_zero] + (0 : DerivAlgebraComplex ⊗[ℂ] Module.Dual ℂ N.V) from rfl, map_zero] /-- The unconjugated symbol `∂_s ψ_φ` of a species, read on the total target space. -/ lemma fermionGeneratorsEquiv_symm_basis_tmul (t : fieldData.FermionSpecies) (s : Multiset (Fin 1 ⊕ Fin 3)) (φ : Module.Dual ℂ (fieldData.FermionValue t)) : fermionGeneratorsEquiv.symm ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] - Module.Dual.transpose (fermionProj t) φ, 0) : JetComponentSpace FermionSpace) + Module.Dual.transpose (fermionProj t) φ, 0) : JetComponentSpace fermionMatterField) = fieldData.inclFermion t ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : - JetComponentSpace (fieldData.FermionValue t)) := by + JetComponentSpace (fieldData.fermion t)) := by rw [← fermionGeneratorsEquiv_symm_comap t ((DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ, 0) : - JetComponentSpace (fieldData.FermionValue t))] + JetComponentSpace (fieldData.fermion t))] refine congrArg _ (Prod.ext ?_ ?_) - · exact (JetComponentSpace.comap_fst_tmul (fermionProj t) _ φ 0).symm - · exact (JetComponentSpace.comap_snd_of_zero (fermionProj t) _).symm + · exact (JetComponentSpace.comap_fst_tmul (M := fermionMatterField) (N := fieldData.fermion t) (fermionProj t) _ φ 0).symm + · exact (JetComponentSpace.comap_snd_of_zero (M := fermionMatterField) (N := fieldData.fermion t) (fermionProj t) _).symm /-- The conjugate symbol `∂_s ψ̄_φ` of a species, read on the total target space. -/ lemma fermionGeneratorsEquiv_symm_basis_tmul_conj (t : fieldData.FermionSpecies) @@ -273,34 +283,36 @@ lemma fermionGeneratorsEquiv_symm_basis_tmul_conj (t : fieldData.FermionSpecies) (φ : Module.Dual ℂ (ConjModule (fieldData.FermionValue t))) : fermionGeneratorsEquiv.symm ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] Module.Dual.transpose (ConjModule.map (fermionProj t)) φ) : - JetComponentSpace FermionSpace) + JetComponentSpace fermionMatterField) = fieldData.inclFermion t ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : - JetComponentSpace (fieldData.FermionValue t)) := by + JetComponentSpace (fieldData.fermion t)) := by rw [← fermionGeneratorsEquiv_symm_comap t ((0, DerivAlgebraComplex.basis s ⊗ₜ[ℂ] φ) : - JetComponentSpace (fieldData.FermionValue t))] + JetComponentSpace (fieldData.fermion t))] refine congrArg _ (Prod.ext ?_ ?_) - · exact (JetComponentSpace.comap_fst_of_zero (fermionProj t) _).symm - · exact (JetComponentSpace.comap_snd_tmul (fermionProj t) 0 _ φ).symm + · exact (JetComponentSpace.comap_fst_of_zero (M := fermionMatterField) (N := fieldData.fermion t) (fermionProj t) _).symm + · exact (JetComponentSpace.comap_snd_tmul (M := fermionMatterField) (N := fieldData.fermion t) (fermionProj t) 0 _ φ).symm /-- The bosonic generator space of the datum is the component space of the Higgs. There is one bosonic species, so the direct sum has one summand and the relabelling of the target space is the identification of a one-element function space with its value. -/ noncomputable def bosonGeneratorsEquiv : - fieldData.BosonGenerators ≃ₗ[ℂ] JetComponentSpace HiggsVec := - fieldData.bosonGeneratorsEquiv.trans (JetComponentSpace.comapEquiv higgsModuleEquiv) + fieldData.BosonGenerators ≃ₗ[ℂ] JetComponentSpace HiggsVec.matterField := + (fieldData.bosonGeneratorsEquiv 2 fieldData_boson_massWeight).trans + (JetComponentSpace.comapEquiv (M := HiggsVec.matterField) + (N := fieldData.bosonMatterField 2 fieldData_boson_massWeight) higgsModuleEquiv) @[simp] lemma bosonGeneratorsEquiv_inclBoson (j : fieldData.BosonSpecies) - (y : JetComponentSpace (fieldData.BosonValue j)) : + (y : JetComponentSpace (fieldData.boson j)) : bosonGeneratorsEquiv (fieldData.inclBoson j y) = y := by rw [bosonGeneratorsEquiv, LinearEquiv.trans_apply, - GaugeFieldData.bosonGeneratorsEquiv_inclBoson, JetComponentSpace.comapEquiv_apply] + GaugeFieldData.bosonGeneratorsEquiv_inclBoson 2 fieldData_boson_massWeight, JetComponentSpace.comapEquiv_apply] exact LinearMap.congr_fun (comap_projBosonValue_comp_comap_higgsModuleEquiv j) y @[simp] -lemma bosonGeneratorsEquiv_symm_apply (y : JetComponentSpace HiggsVec) : +lemma bosonGeneratorsEquiv_symm_apply (y : JetComponentSpace HiggsVec.matterField) : bosonGeneratorsEquiv.symm y = fieldData.inclBoson () y := bosonGeneratorsEquiv.injective ((bosonGeneratorsEquiv.apply_symm_apply y).trans @@ -326,18 +338,18 @@ noncomputable def fermionAlgebraEquiv : generator space. -/ noncomputable def higgsAlgebraEquiv : HiggsJetAlgebra ≃ₐ[ℂ] SymmetricAlgebra ℂ fieldData.BosonGenerators := - SymmetricAlgebra.congr (R := ℂ) (M := JetComponentSpace HiggsVec) + SymmetricAlgebra.congr (R := ℂ) (M := JetComponentSpace HiggsVec.matterField) (N := fieldData.BosonGenerators) bosonGeneratorsEquiv.symm @[simp] -lemma fermionAlgebraEquiv_ι (v : JetComponentSpace FermionSpace) : +lemma fermionAlgebraEquiv_ι (v : JetComponentSpace fermionMatterField) : fermionAlgebraEquiv (ExteriorAlgebra.ι ℂ v) = ExteriorAlgebra.ι ℂ (fermionGeneratorsEquiv.symm v) := ExteriorAlgebra.map_apply_ι _ v @[simp] -lemma higgsAlgebraEquiv_ι (v : JetComponentSpace HiggsVec) : - higgsAlgebraEquiv (SymmetricAlgebra.ι ℂ (JetComponentSpace HiggsVec) v) +lemma higgsAlgebraEquiv_ι (v : JetComponentSpace HiggsVec.matterField) : + higgsAlgebraEquiv (SymmetricAlgebra.ι ℂ (JetComponentSpace HiggsVec.matterField) v) = SymmetricAlgebra.ι ℂ fieldData.BosonGenerators (bosonGeneratorsEquiv.symm v) := SymmetricAlgebra.congr_apply_ι bosonGeneratorsEquiv.symm v @@ -370,12 +382,12 @@ lemma includeConnection_one_tmul_ι (v : GaugeBoson.JetComponentSpace GaugeAlgeb /-- The total fermionic generator of a species summand is that species' generator. -/ lemma ιFermionTotal_inclFermion (t : fieldData.FermionSpecies) - (x : JetComponentSpace (fieldData.FermionValue t)) : + (x : JetComponentSpace (fieldData.fermion t)) : fieldData.ιFermionTotal (fieldData.inclFermion t x) = fieldData.ιFermion t x := rfl /-- The total bosonic generator of a species summand is that species' generator. -/ lemma ιBosonTotal_inclBoson (j : fieldData.BosonSpecies) - (y : JetComponentSpace (fieldData.BosonValue j)) : + (y : JetComponentSpace (fieldData.boson j)) : fieldData.ιBosonTotal (fieldData.inclBoson j y) = fieldData.ιBoson j y := rfl /-! @@ -409,7 +421,7 @@ lemma fermionGeneratorsEquiv_jetDerivFermion (μ : Fin 1 ⊕ Fin 3) /-- The inverse form of `fermionGeneratorsEquiv_jetDerivFermion`. -/ lemma fermionGeneratorsEquiv_symm_jetDeriv (μ : Fin 1 ⊕ Fin 3) - (v : JetComponentSpace FermionSpace) : + (v : JetComponentSpace fermionMatterField) : fermionGeneratorsEquiv.symm (JetComponentSpace.jetDeriv μ v) = fieldData.jetDerivFermion μ (fermionGeneratorsEquiv.symm v) := fermionGeneratorsEquiv.injective <| @@ -431,7 +443,7 @@ lemma bosonGeneratorsEquiv_jetDerivBoson (μ : Fin 1 ⊕ Fin 3) /-- The inverse form of `bosonGeneratorsEquiv_jetDerivBoson`. -/ lemma bosonGeneratorsEquiv_symm_jetDeriv (μ : Fin 1 ⊕ Fin 3) - (v : JetComponentSpace HiggsVec) : + (v : JetComponentSpace HiggsVec.matterField) : bosonGeneratorsEquiv.symm (JetComponentSpace.jetDeriv μ v) = fieldData.jetDerivBoson μ (bosonGeneratorsEquiv.symm v) := bosonGeneratorsEquiv.injective <| @@ -446,9 +458,9 @@ lemma bosonGeneratorsEquiv_symm_jetDeriv (μ : Fin 1 ⊕ Fin 3) sector and once in general; the identification lets the general theory apply to the fermionic factor of the migrated carrier, whose generator space is a direct sum of component spaces rather than a single one. -/ -private lemma fermionicAlgebra_jetDeriv_eq {V : Type} [AddCommGroup V] [Module ℂ V] +private lemma fermionicAlgebra_jetDeriv_eq (M : MatterField localGaugeData) (μ : Fin 1 ⊕ Fin 3) : - FermionicAlgebra.jetDeriv (V := V) μ + FermionicAlgebra.jetDeriv (M := M) μ = ExteriorAlgebra.derivationOfLinear (JetComponentSpace.jetDeriv μ) := rfl /-- The fermionic sector equivalence is a map of differential algebras: the exterior @@ -458,7 +470,7 @@ lemma fermionAlgebraEquiv_jetDeriv (μ : Fin 1 ⊕ Fin 3) (f : FermionJetAlgebra fermionAlgebraEquiv (FermionicAlgebra.jetDeriv μ f) = ExteriorAlgebra.derivationOfLinear (fieldData.jetDerivFermion μ) (fermionAlgebraEquiv f) := by - rw [fermionicAlgebra_jetDeriv_eq] + rw [fermionicAlgebra_jetDeriv_eq fermionMatterField] exact ExteriorAlgebra.algHom_derivationOfLinear fermionAlgebraEquiv.toAlgHom (fun x => fermionAlgebraEquiv_ι x) (fun x => fermionGeneratorsEquiv_symm_jetDeriv μ x) f diff --git a/Physlib/Particles/StandardModel/JetAlgebra/SectorEquiv/Structure.lean b/Physlib/Particles/StandardModel/JetAlgebra/SectorEquiv/Structure.lean index 108289f22..f3a2ce978 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/SectorEquiv/Structure.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/SectorEquiv/Structure.lean @@ -146,7 +146,7 @@ module is determined by its species components, so the relabelling too is equiva the fermionic target space with that species' own. -/ lemma lTensor_fermionProj_repJetGaugeGroupI (t : fieldData.FermionSpecies) (U : JetGaugeGroupI) : - (LinearMap.lTensor JetRing (fermionProj t)).comp (FermionSpace.repJetGaugeGroupI U) + (LinearMap.lTensor JetRing (fermionProj t)).comp (fermionMatterField.repJet U) = ((fieldData.fermion t).repJet U).comp (LinearMap.lTensor JetRing (fermionProj t)) := by cases t with @@ -162,19 +162,33 @@ lemma lTensor_fermionProj_repJetGaugeGroupI (t : fieldData.FermionSpecies) product. -/ lemma lTensor_fermionSpaceEquiv_repJetGaugeGroupI (U : JetGaugeGroupI) : (LinearMap.lTensor JetRing fermionSpaceEquiv.toLinearMap).comp - (FermionSpace.repJetGaugeGroupI U) - = (fieldData.repJetFermionModule U).comp + (fermionMatterField.repJet U) + = ((fieldData.fermionMatterField 3 fieldData_fermion_massWeight).repJet U).comp (LinearMap.lTensor JetRing fermionSpaceEquiv.toLinearMap) := by - refine jetPi_hom_ext fieldData.FermionValue fun i => ?_ - have h1 : (LinearMap.lTensor JetRing (fieldData.projFermionValue i)).comp + refine jetPi_hom_ext (fun i => (fieldData.fermion i).V) fun i => ?_ + have h1 : (LinearMap.lTensor JetRing (fieldData.projFermionField 3 fieldData_fermion_massWeight i)).comp (LinearMap.lTensor JetRing fermionSpaceEquiv.toLinearMap) = LinearMap.lTensor JetRing (fermionProj i) := by rw [← LinearMap.lTensor_comp] rfl - rw [← LinearMap.comp_assoc, h1, lTensor_fermionProj_repJetGaugeGroupI i U, - ← LinearMap.comp_assoc, - GaugeFieldData.lTensor_projFermionValue_repJetFermionModule i U, - LinearMap.comp_assoc, h1] + refine LinearMap.ext fun x => ?_ + have e1 := LinearMap.congr_fun h1 (fermionMatterField.repJet U x) + have e2 := LinearMap.congr_fun (lTensor_fermionProj_repJetGaugeGroupI i U) x + have e3 := LinearMap.congr_fun + (GaugeFieldData.lTensor_projFermionValue_repJetFermionModule i U) + (LinearMap.lTensor JetRing fermionSpaceEquiv.toLinearMap x) + have e4 := LinearMap.congr_fun h1 x + simp only [LinearMap.comp_apply] at e1 e2 e3 e4 + -- `show` puts the goal in applied form up to defeq, which `simp only` cannot reach here + show (LinearMap.lTensor JetRing + (fieldData.projFermionField 3 fieldData_fermion_massWeight i)) + ((LinearMap.lTensor JetRing fermionSpaceEquiv.toLinearMap) + (fermionMatterField.repJet U x)) + = (LinearMap.lTensor JetRing + (fieldData.projFermionField 3 fieldData_fermion_massWeight i)) + (((fieldData.fermionMatterField 3 fieldData_fermion_massWeight).repJet U) + ((LinearMap.lTensor JetRing fermionSpaceEquiv.toLinearMap) x)) + exact e1.trans (e2.trans ((congrArg _ e4).symm.trans e3.symm)) /-- The relabelling of the Higgs is equivariant for the jet gauge action. There is one bosonic species, and reading it off undoes the relabelling, so both sides are the Higgs @@ -182,20 +196,34 @@ lemma lTensor_fermionSpaceEquiv_repJetGaugeGroupI (U : JetGaugeGroupI) : exactly the Higgs representation. -/ lemma lTensor_higgsModuleEquiv_repJetGaugeGroupI (U : JetGaugeGroupI) : (LinearMap.lTensor JetRing higgsModuleEquiv.toLinearMap).comp - (HiggsVec.repJetGaugeGroupI U) - = (fieldData.repJetBosonModule U).comp + (HiggsVec.matterField.repJet U) + = ((fieldData.bosonMatterField 2 fieldData_boson_massWeight).repJet U).comp (LinearMap.lTensor JetRing higgsModuleEquiv.toLinearMap) := by - refine jetPi_hom_ext fieldData.BosonValue fun j => LinearMap.ext fun z => ?_ - have h1 : ∀ w : JetRing ⊗[ℂ] HiggsVec, - LinearMap.lTensor JetRing (fieldData.projBosonValue j) + refine jetPi_hom_ext (fun j => (fieldData.boson j).V) fun j => LinearMap.ext fun z => ?_ + have h1 : ∀ w : JetRing ⊗[ℂ] HiggsVec.matterField.V, + LinearMap.lTensor JetRing (fieldData.projBosonField 2 fieldData_boson_massWeight j) (LinearMap.lTensor JetRing higgsModuleEquiv.toLinearMap w) = w := fun w => by induction w using TensorProduct.induction_on with | zero => rw [map_zero, map_zero]; rfl | tmul f v => rfl | add a b ha hb => rw [map_add, map_add, ha, hb]; rfl - simp only [LinearMap.comp_apply, h1] - rw [← LinearMap.comp_apply, - GaugeFieldData.lTensor_projBosonValue_repJetBosonModule j U, LinearMap.comp_apply, h1] + -- `show` puts the goal in applied form up to defeq, which `simp only` cannot reach here + show LinearMap.lTensor JetRing (fieldData.projBosonField 2 fieldData_boson_massWeight j) + ((LinearMap.lTensor JetRing higgsModuleEquiv.toLinearMap) + (HiggsVec.matterField.repJet U z)) + = LinearMap.lTensor JetRing (fieldData.projBosonField 2 fieldData_boson_massWeight j) + (((fieldData.bosonMatterField 2 fieldData_boson_massWeight).repJet U) + ((LinearMap.lTensor JetRing higgsModuleEquiv.toLinearMap) z)) + have e3 : LinearMap.lTensor JetRing + (fieldData.projBosonField 2 fieldData_boson_massWeight j) + (((fieldData.bosonMatterField 2 fieldData_boson_massWeight).repJet U) + ((LinearMap.lTensor JetRing higgsModuleEquiv.toLinearMap) z)) + = ((fieldData.boson j).repJet U) + (LinearMap.lTensor JetRing (fieldData.projBosonField 2 fieldData_boson_massWeight j) + ((LinearMap.lTensor JetRing higgsModuleEquiv.toLinearMap) z)) := + LinearMap.congr_fun (GaugeFieldData.lTensor_projBosonValue_repJetBosonModule j U) _ + rw [h1, e3, h1] + -- the one bosonic species is the Higgs, so the two actions are the same rfl /-! @@ -217,20 +245,19 @@ content. lemma fermionGeneratorsEquiv_repLorentzFermion (Λ : SL(2,ℂ)) (v : fieldData.FermionGenerators) : fermionGeneratorsEquiv (fieldData.repLorentzFermion Λ v) - = JetComponentSpace.repLorentzGroup FermionSpace.repLorentzGroup Λ + = JetComponentSpace.repLorentzGroup fermionMatterField Λ (fermionGeneratorsEquiv v) := by rw [fermionGeneratorsEquiv, LinearEquiv.trans_apply, LinearEquiv.trans_apply, JetComponentSpace.comapEquiv_apply, JetComponentSpace.comapEquiv_apply, GaugeFieldData.fermionGeneratorsEquiv_repLorentzFermion] exact LinearMap.congr_fun - (JetComponentSpace.comap_comp_repLorentzGroup FermionSpace.repLorentzGroup - fieldData.repLorentzFermionModule fermionSpaceEquiv.toLinearMap + (JetComponentSpace.comap_comp_repLorentzGroup fermionSpaceEquiv.toLinearMap fermionSpaceEquiv_comp_repLorentzGroup Λ) _ /-- The composed form of `fermionGeneratorsEquiv_repLorentzFermion`. -/ lemma fermionGeneratorsEquiv_comp_repLorentzFermion (Λ : SL(2,ℂ)) : fermionGeneratorsEquiv.toLinearMap.comp (fieldData.repLorentzFermion Λ) - = (JetComponentSpace.repLorentzGroup FermionSpace.repLorentzGroup Λ).comp + = (JetComponentSpace.repLorentzGroup fermionMatterField Λ).comp fermionGeneratorsEquiv.toLinearMap := LinearMap.ext fun v => fermionGeneratorsEquiv_repLorentzFermion Λ v @@ -241,45 +268,42 @@ lemma fermionGeneratorsEquiv_comp_repLorentzFermion (Λ : SL(2,ℂ)) : lemma bosonGeneratorsEquiv_repLorentzBoson (Λ : SL(2,ℂ)) (w : fieldData.BosonGenerators) : bosonGeneratorsEquiv (fieldData.repLorentzBoson Λ w) - = JetComponentSpace.repLorentzGroup (Representation.trivial ℂ SL(2,ℂ) HiggsVec) Λ + = JetComponentSpace.repLorentzGroup HiggsVec.matterField Λ (bosonGeneratorsEquiv w) := by rw [bosonGeneratorsEquiv, LinearEquiv.trans_apply, LinearEquiv.trans_apply, JetComponentSpace.comapEquiv_apply, JetComponentSpace.comapEquiv_apply, GaugeFieldData.bosonGeneratorsEquiv_repLorentzBoson] exact LinearMap.congr_fun - (JetComponentSpace.comap_comp_repLorentzGroup - (Representation.trivial ℂ SL(2,ℂ) HiggsVec) fieldData.repLorentzBosonModule - higgsModuleEquiv.toLinearMap higgsModuleEquiv_comp_repLorentzGroup Λ) _ + (JetComponentSpace.comap_comp_repLorentzGroup higgsModuleEquiv.toLinearMap + higgsModuleEquiv_comp_repLorentzGroup Λ) _ /-- The composed form of `bosonGeneratorsEquiv_repLorentzBoson`. -/ lemma bosonGeneratorsEquiv_comp_repLorentzBoson (Λ : SL(2,ℂ)) : bosonGeneratorsEquiv.toLinearMap.comp (fieldData.repLorentzBoson Λ) - = (JetComponentSpace.repLorentzGroup (Representation.trivial ℂ SL(2,ℂ) HiggsVec) + = (JetComponentSpace.repLorentzGroup HiggsVec.matterField Λ).comp bosonGeneratorsEquiv.toLinearMap := LinearMap.ext fun w => bosonGeneratorsEquiv_repLorentzBoson Λ w /-- The inverse form of `fermionGeneratorsEquiv_repLorentzFermion`. -/ lemma fermionGeneratorsEquiv_symm_repLorentzGroup (Λ : SL(2,ℂ)) - (w : JetComponentSpace FermionSpace) : + (w : JetComponentSpace fermionMatterField) : fermionGeneratorsEquiv.symm - (JetComponentSpace.repLorentzGroup FermionSpace.repLorentzGroup Λ w) + (JetComponentSpace.repLorentzGroup fermionMatterField Λ w) = fieldData.repLorentzFermion Λ (fermionGeneratorsEquiv.symm w) := fermionGeneratorsEquiv.injective <| (fermionGeneratorsEquiv.apply_symm_apply _).trans <| - ((congrArg (JetComponentSpace.repLorentzGroup FermionSpace.repLorentzGroup Λ) + ((congrArg (JetComponentSpace.repLorentzGroup fermionMatterField Λ) (fermionGeneratorsEquiv.apply_symm_apply w)).symm.trans (fermionGeneratorsEquiv_repLorentzFermion Λ _).symm) /-- The inverse form of `bosonGeneratorsEquiv_repLorentzBoson`. -/ lemma bosonGeneratorsEquiv_symm_repLorentzGroup (Λ : SL(2,ℂ)) - (w : JetComponentSpace HiggsVec) : - bosonGeneratorsEquiv.symm (JetComponentSpace.repLorentzGroup - (Representation.trivial ℂ SL(2,ℂ) HiggsVec) Λ w) + (w : JetComponentSpace HiggsVec.matterField) : + bosonGeneratorsEquiv.symm (JetComponentSpace.repLorentzGroup HiggsVec.matterField Λ w) = fieldData.repLorentzBoson Λ (bosonGeneratorsEquiv.symm w) := bosonGeneratorsEquiv.injective <| (bosonGeneratorsEquiv.apply_symm_apply _).trans <| - ((congrArg (JetComponentSpace.repLorentzGroup - (Representation.trivial ℂ SL(2,ℂ) HiggsVec) Λ) + ((congrArg (JetComponentSpace.repLorentzGroup HiggsVec.matterField Λ) (bosonGeneratorsEquiv.apply_symm_apply w)).symm.trans (bosonGeneratorsEquiv_repLorentzBoson Λ _).symm) @@ -302,26 +326,21 @@ consume. lemma fermionGeneratorsEquiv_repJetFermion (U : JetGaugeGroupI) (v : fieldData.FermionGenerators) : fermionGeneratorsEquiv (fieldData.repJetFermion U v) - = JetComponentSpace.repJet FermionSpace.repJetGaugeGroupI - FermionSpace.repJetGaugeGroupI_smul U (fermionGeneratorsEquiv v) := by + = JetComponentSpace.repJet fermionMatterField U (fermionGeneratorsEquiv v) := by rw [fermionGeneratorsEquiv, LinearEquiv.trans_apply, LinearEquiv.trans_apply, JetComponentSpace.comapEquiv_apply, JetComponentSpace.comapEquiv_apply, - GaugeFieldData.fermionGeneratorsEquiv_repJetFermion U v] + GaugeFieldData.fermionGeneratorsEquiv_repJetFermion 3 fieldData_fermion_massWeight U v] exact LinearMap.congr_fun (JetComponentSpace.comap_comp_repJet - FermionSpace.repJetGaugeGroupI FermionSpace.repJetGaugeGroupI_smul - fieldData.repJetFermionModule GaugeFieldData.repJetFermionModule_smul fermionSpaceEquiv.toLinearMap lTensor_fermionSpaceEquiv_repJetGaugeGroupI U) _ /-- The inverse form of `fermionGeneratorsEquiv_repJetFermion`. -/ lemma fermionGeneratorsEquiv_symm_repJet (U : JetGaugeGroupI) - (w : JetComponentSpace FermionSpace) : - fermionGeneratorsEquiv.symm (JetComponentSpace.repJet FermionSpace.repJetGaugeGroupI - FermionSpace.repJetGaugeGroupI_smul U w) + (w : JetComponentSpace fermionMatterField) : + fermionGeneratorsEquiv.symm (JetComponentSpace.repJet fermionMatterField U w) = fieldData.repJetFermion U (fermionGeneratorsEquiv.symm w) := fermionGeneratorsEquiv.injective <| (fermionGeneratorsEquiv.apply_symm_apply _).trans <| - ((congrArg (JetComponentSpace.repJet FermionSpace.repJetGaugeGroupI - FermionSpace.repJetGaugeGroupI_smul U) + ((congrArg (JetComponentSpace.repJet fermionMatterField U) (fermionGeneratorsEquiv.apply_symm_apply w)).symm.trans (fermionGeneratorsEquiv_repJetFermion U _).symm) @@ -330,26 +349,21 @@ lemma fermionGeneratorsEquiv_symm_repJet (U : JetGaugeGroupI) lemma bosonGeneratorsEquiv_repJetBoson (U : JetGaugeGroupI) (v : fieldData.BosonGenerators) : bosonGeneratorsEquiv (fieldData.repJetBoson U v) - = JetComponentSpace.repJet HiggsVec.repJetGaugeGroupI - HiggsVec.repJetGaugeGroupI_smul U (bosonGeneratorsEquiv v) := by + = JetComponentSpace.repJet HiggsVec.matterField U (bosonGeneratorsEquiv v) := by rw [bosonGeneratorsEquiv, LinearEquiv.trans_apply, LinearEquiv.trans_apply, JetComponentSpace.comapEquiv_apply, JetComponentSpace.comapEquiv_apply, - GaugeFieldData.bosonGeneratorsEquiv_repJetBoson U v] + GaugeFieldData.bosonGeneratorsEquiv_repJetBoson 2 fieldData_boson_massWeight U v] exact LinearMap.congr_fun (JetComponentSpace.comap_comp_repJet - HiggsVec.repJetGaugeGroupI HiggsVec.repJetGaugeGroupI_smul - fieldData.repJetBosonModule GaugeFieldData.repJetBosonModule_smul higgsModuleEquiv.toLinearMap lTensor_higgsModuleEquiv_repJetGaugeGroupI U) _ /-- The inverse form of `bosonGeneratorsEquiv_repJetBoson`. -/ lemma bosonGeneratorsEquiv_symm_repJet (U : JetGaugeGroupI) - (w : JetComponentSpace HiggsVec) : - bosonGeneratorsEquiv.symm (JetComponentSpace.repJet HiggsVec.repJetGaugeGroupI - HiggsVec.repJetGaugeGroupI_smul U w) + (w : JetComponentSpace HiggsVec.matterField) : + bosonGeneratorsEquiv.symm (JetComponentSpace.repJet HiggsVec.matterField U w) = fieldData.repJetBoson U (bosonGeneratorsEquiv.symm w) := bosonGeneratorsEquiv.injective <| (bosonGeneratorsEquiv.apply_symm_apply _).trans <| - ((congrArg (JetComponentSpace.repJet HiggsVec.repJetGaugeGroupI - HiggsVec.repJetGaugeGroupI_smul U) + ((congrArg (JetComponentSpace.repJet HiggsVec.matterField U) (bosonGeneratorsEquiv.apply_symm_apply w)).symm.trans (bosonGeneratorsEquiv_repJetBoson U _).symm) diff --git a/Physlib/Particles/StandardModel/JetAlgebra/TransformsIn.lean b/Physlib/Particles/StandardModel/JetAlgebra/TransformsIn.lean index 17ca04534..40dbf8f31 100644 --- a/Physlib/Particles/StandardModel/JetAlgebra/TransformsIn.lean +++ b/Physlib/Particles/StandardModel/JetAlgebra/TransformsIn.lean @@ -88,7 +88,7 @@ theorem transformsIn_higgsField : refine (repJetGaugeGroupI_includeHiggs U _).trans ?_ refine (congrArg includeHiggs (BosonicAlgebra.repJetGaugeGroupI_iteratedJetDeriv_ofField - HiggsVec.repJetGaugeGroupI HiggsVec.repJetGaugeGroupI_smul U φ s)).trans ?_ + (M := HiggsVec.matterField) U φ s)).trans ?_ refine (map_multiset_sum includeHiggs _).trans ?_ refine (congrArg Multiset.sum (Multiset.map_map _ _ _)).trans ?_ exact congrArg Multiset.sum @@ -105,7 +105,7 @@ theorem transformsIn_conjHiggsField : refine (repJetGaugeGroupI_includeHiggs U _).trans ?_ refine (congrArg includeHiggs (BosonicAlgebra.repJetGaugeGroupI_iteratedJetDeriv_ofConjField - HiggsVec.repJetGaugeGroupI HiggsVec.repJetGaugeGroupI_smul U φ s)).trans ?_ + (M := HiggsVec.matterField) U φ s)).trans ?_ refine (map_multiset_sum includeHiggs _).trans ?_ refine (congrArg Multiset.sum (Multiset.map_map _ _ _)).trans ?_ exact congrArg Multiset.sum @@ -134,7 +134,7 @@ private lemma transformsIn_species {W : Type} [AddCommGroup W] [Module ℂ W] refine (repJetGaugeGroupI_includeFermion U _).trans ?_ refine (congrArg includeFermion (FermionicAlgebra.repJetGaugeGroupI_iteratedJetDeriv_ofField - FermionSpace.repJetGaugeGroupI FermionSpace.repJetGaugeGroupI_smul U _ s)).trans ?_ + (M := fermionMatterField) U _ s)).trans ?_ refine (map_multiset_sum includeFermion _).trans ?_ refine (congrArg Multiset.sum (Multiset.map_map _ _ _)).trans ?_ refine congrArg Multiset.sum (Multiset.map_congr rfl fun q _ => ?_) @@ -187,7 +187,7 @@ private lemma transformsIn_conjSpecies {W : Type} [AddCommGroup W] [Module ℂ W refine (repJetGaugeGroupI_includeFermion U _).trans ?_ refine (congrArg includeFermion (FermionicAlgebra.repJetGaugeGroupI_iteratedJetDeriv_ofConjField - FermionSpace.repJetGaugeGroupI FermionSpace.repJetGaugeGroupI_smul U _ s)).trans ?_ + (M := fermionMatterField) U _ s)).trans ?_ refine (map_multiset_sum includeFermion _).trans ?_ refine (congrArg Multiset.sum (Multiset.map_map _ _ _)).trans ?_ refine congrArg Multiset.sum (Multiset.map_congr rfl fun q _ => ?_) @@ -318,15 +318,15 @@ theorem isLorentzDerivTransforms_higgsField : (higgsField_eq_includeHiggs m χ).symm refine (congrArg (repLorentzGroup Λ) (hstart (List.ofFn l) φ).symm).trans ?_ refine (Lorentz.IsLorentzDeriv.rep_iteratedD_ofFn jetDeriv_comm Λ l - (includeHiggs (BosonicAlgebra.ofField φ))).trans ?_ + (includeHiggs (BosonicAlgebra.ofField (M := HiggsVec.matterField) φ))).trans ?_ refine Finset.sum_congr rfl fun p _ => ?_ refine congrArg (fun z : JetAlgebra => (∏ i, (((Lorentz.SL2C.toLorentzGroup Λ).1 (p i) (l i) : ℝ) : ℂ)) • z) ?_ exact (congrArg (fun z : JetAlgebra => Lorentz.iteratedD jetDeriv jetDeriv_comm (List.ofFn p) z) - ((repLorentzGroup_includeHiggs Λ (BosonicAlgebra.ofField φ)).trans + ((repLorentzGroup_includeHiggs Λ (BosonicAlgebra.ofField (M := HiggsVec.matterField) φ)).trans (congrArg includeHiggs - (BosonicAlgebra.repLorentzGroup_ofField _ Λ φ)))).trans + (BosonicAlgebra.repLorentzGroup_ofField (M := HiggsVec.matterField) Λ φ)))).trans (hstart (List.ofFn p) _) /-- The conjugate Higgs symbols transform as the derivative symbols of the conjugate of a @@ -343,15 +343,15 @@ theorem isLorentzDerivTransforms_conjHiggsField : (conjHiggsField_eq_includeHiggs m χ).symm refine (congrArg (repLorentzGroup Λ) (hstart (List.ofFn l) φ).symm).trans ?_ refine (Lorentz.IsLorentzDeriv.rep_iteratedD_ofFn jetDeriv_comm Λ l - (includeHiggs (BosonicAlgebra.ofConjField φ))).trans ?_ + (includeHiggs (BosonicAlgebra.ofConjField (M := HiggsVec.matterField) φ))).trans ?_ refine Finset.sum_congr rfl fun p _ => ?_ refine congrArg (fun z : JetAlgebra => (∏ i, (((Lorentz.SL2C.toLorentzGroup Λ).1 (p i) (l i) : ℝ) : ℂ)) • z) ?_ exact (congrArg (fun z : JetAlgebra => Lorentz.iteratedD jetDeriv jetDeriv_comm (List.ofFn p) z) - ((repLorentzGroup_includeHiggs Λ (BosonicAlgebra.ofConjField φ)).trans + ((repLorentzGroup_includeHiggs Λ (BosonicAlgebra.ofConjField (M := HiggsVec.matterField) φ)).trans (congrArg includeHiggs - (BosonicAlgebra.repLorentzGroup_ofConjField _ Λ φ)))).trans + (BosonicAlgebra.repLorentzGroup_ofConjField (M := HiggsVec.matterField) Λ φ)))).trans (hstart (List.ofFn p) _) /-! diff --git a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Prod.lean b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Prod.lean index 3008487d9..d942fed3d 100644 --- a/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Prod.lean +++ b/Physlib/Particles/StandardModel/Matter/FermionicAlgebra/Prod.lean @@ -6,7 +6,8 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.Basic -public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.FieldAlgebra.Prod +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.Prod +public import Physlib.Mathematics.ExteriorAlgebra public import Mathlib.LinearAlgebra.CliffordAlgebra.Prod public import Mathlib.LinearAlgebra.TensorProduct.Prod /-! @@ -94,7 +95,7 @@ noncomputable def FermionicAlgebra.prodEquiv (M N : MatterField jets) (h : M.massWeight = N.massWeight) : FermionicAlgebra (M.prod N h) ≃ₐ[ℂ] (FermionicAlgebra.evenOdd M ᵍ⊗[ℂ] FermionicAlgebra.evenOdd N) := - (ExteriorAlgebra.congr (JetComponentSpace.prodEquiv M N h)).trans <| + (ExteriorAlgebra.mapEquiv (JetComponentSpace.prodEquiv M N h)).trans <| (CliffordAlgebra.equivOfIsometry (Q₁ := (0 : QuadraticForm ℂ (JetComponentSpace M × JetComponentSpace N))) (Q₂ := (0 : QuadraticForm ℂ (JetComponentSpace M)).prod From f0cd3913eb0913f602fd00fc257a210e6c7cd89c Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 22 Sep 2026 15:20:39 +0200 Subject: [PATCH 350/367] refactor: Remove boost weights --- Physlib.lean | 12 +- .../HiggsAlgebraCovRealization/Basic.lean | 117 ---- .../DerivSubmodule/Basic.lean | 4 +- .../BoostWeightDecomposition.lean | 339 ----------- .../DerivSubmodule/Centre.lean | 86 +++ .../FermionGaugeSector/MassWeight.lean | 86 ++- .../YukawaSector/MassDimLTEight.lean | 309 ++-------- .../Fermions/DownSinglet/Basic.lean | 20 + .../Fermions/LeptonDoublet/Basic.lean | 20 + .../Fermions/LeptonSinglet/Basic.lean | 17 + .../Fermions/QuarkDoublet/Basic.lean | 20 + .../Fermions/UpSinglet/Basic.lean | 20 + .../BoostWeightDecomposition.lean | 576 ------------------ .../DerivSubmodule/Centre.lean | 179 ++++++ .../BoostWeightDecomposition.lean | 315 ---------- .../IsGaugeSector/DerivSubmodule/Centre.lean | 107 ++++ .../Relativity/Fermions/Weyl/BoostWeight.lean | 2 +- Physlib/Relativity/IsLorentzDeriv.lean | 21 +- Physlib/Relativity/LightConeDeriv.lean | 109 +--- .../LorentzGroup/Boosts/WeightGrading.lean | 246 -------- .../LorentzGroup/Invariants/Centre.lean | 168 +++++ Physlib/Relativity/SL2C/Basic.lean | 12 + 22 files changed, 791 insertions(+), 1994 deletions(-) delete mode 100644 Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/DerivSubmodule/BoostWeightDecomposition.lean create mode 100644 Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/DerivSubmodule/Centre.lean delete mode 100644 Physlib/Particles/StandardModel/IsFermionSector/DerivSubmodule/BoostWeightDecomposition.lean create mode 100644 Physlib/Particles/StandardModel/IsFermionSector/DerivSubmodule/Centre.lean delete mode 100644 Physlib/Particles/StandardModel/IsGaugeSector/DerivSubmodule/BoostWeightDecomposition.lean create mode 100644 Physlib/Particles/StandardModel/IsGaugeSector/DerivSubmodule/Centre.lean delete mode 100644 Physlib/Relativity/LorentzGroup/Boosts/WeightGrading.lean create mode 100644 Physlib/Relativity/LorentzGroup/Invariants/Centre.lean diff --git a/Physlib.lean b/Physlib.lean index 3e0c77911..c6f1b2939 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -309,7 +309,7 @@ public import Physlib.Particles.StandardModel.AlgebraRealization.CovStandardMode public import Physlib.Particles.StandardModel.AlgebraRealization.CovariantDeriv public import Physlib.Particles.StandardModel.AlgebraRealization.HiggsAlgebraCovRealization.Basic public import Physlib.Particles.StandardModel.AlgebraRealization.HiggsAlgebraCovRealization.DerivSubmodule.Basic -public import Physlib.Particles.StandardModel.AlgebraRealization.HiggsAlgebraCovRealization.DerivSubmodule.BoostWeightDecomposition +public import Physlib.Particles.StandardModel.AlgebraRealization.HiggsAlgebraCovRealization.DerivSubmodule.Centre public import Physlib.Particles.StandardModel.AlgebraRealization.HiggsAlgebraCovRealization.DerivSubmodule.GaugeWeightDecomposition public import Physlib.Particles.StandardModel.AlgebraRealization.HiggsAlgebraCovRealization.MassWeight.Basic public import Physlib.Particles.StandardModel.AlgebraRealization.HiggsAlgebraCovRealization.MassWeight.GaugeWeightDecomposition @@ -325,7 +325,6 @@ 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.Challenge -public import Physlib.Particles.StandardModel.Solution public import Physlib.Particles.StandardModel.CovAlgebraRealization.Basic public import Physlib.Particles.StandardModel.CovAlgebraRealization.FermionGaugeSector.Basic public import Physlib.Particles.StandardModel.CovAlgebraRealization.FermionGaugeSector.MassWeight @@ -391,7 +390,7 @@ public import Physlib.Particles.StandardModel.HiggsBoson.MatterField public import Physlib.Particles.StandardModel.HiggsBoson.Potential public import Physlib.Particles.StandardModel.IsFermionSector.Basic public import Physlib.Particles.StandardModel.IsFermionSector.Components -public import Physlib.Particles.StandardModel.IsFermionSector.DerivSubmodule.BoostWeightDecomposition +public import Physlib.Particles.StandardModel.IsFermionSector.DerivSubmodule.Centre public import Physlib.Particles.StandardModel.IsFermionSector.DerivSubmodule.GaugeWeightDecomposition public import Physlib.Particles.StandardModel.IsFermionSector.MassWeight.Basic public import Physlib.Particles.StandardModel.IsFermionSector.MassWeight.GaugeWeightDecomposition @@ -400,7 +399,7 @@ public import Physlib.Particles.StandardModel.IsFermionSector.MassWeight.Kinetic public import Physlib.Particles.StandardModel.IsFermionSector.MassWeight.MassDimEight public import Physlib.Particles.StandardModel.IsFermionSector.MassWeight.MassDimLTEight public import Physlib.Particles.StandardModel.IsGaugeSector.Basic -public import Physlib.Particles.StandardModel.IsGaugeSector.DerivSubmodule.BoostWeightDecomposition +public import Physlib.Particles.StandardModel.IsGaugeSector.DerivSubmodule.Centre public import Physlib.Particles.StandardModel.IsGaugeSector.DerivSubmodule.GaugeWeightDecomposition public import Physlib.Particles.StandardModel.IsGaugeSector.MassWeight.Basic public import Physlib.Particles.StandardModel.IsGaugeSector.MassWeight.GaugeWeightDecomposition @@ -442,6 +441,7 @@ public import Physlib.Particles.StandardModel.Model.Consistency public import Physlib.Particles.StandardModel.Model.LeptonDoublet public import Physlib.Particles.StandardModel.Peeling public import Physlib.Particles.StandardModel.Representations +public import Physlib.Particles.StandardModel.Solution public import Physlib.Particles.SuperSymmetry.MSSMNu.AnomalyCancellation.B3 public import Physlib.Particles.SuperSymmetry.MSSMNu.AnomalyCancellation.Basic public import Physlib.Particles.SuperSymmetry.MSSMNu.AnomalyCancellation.HyperCharge @@ -600,8 +600,8 @@ public import Physlib.Relativity.Bispinors.Basic public import Physlib.Relativity.CliffordAlgebra public import Physlib.Relativity.DerivAlgebra public import Physlib.Relativity.Fermions.Dirac.Basic -public import Physlib.Relativity.Fermions.Weyl.BoostWeight public import Physlib.Relativity.Fermions.Dirac.GammaMatrices +public import Physlib.Relativity.Fermions.Weyl.BoostWeight public import Physlib.Relativity.Fermions.Weyl.Contraction public import Physlib.Relativity.Fermions.Weyl.DualLeftHanded public import Physlib.Relativity.Fermions.Weyl.DualRightHanded @@ -625,9 +625,9 @@ public import Physlib.Relativity.LorentzGroup.Boosts.Apply public import Physlib.Relativity.LorentzGroup.Boosts.Axis 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.Basic +public import Physlib.Relativity.LorentzGroup.Invariants.Centre public import Physlib.Relativity.LorentzGroup.Invariants.IsBiLeftWeyl public import Physlib.Relativity.LorentzGroup.Invariants.IsLeftRightWeyl public import Physlib.Relativity.LorentzGroup.Invariants.IsVectorLeftRightWeyl diff --git a/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/Basic.lean b/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/Basic.lean index d64770344..7f969ab78 100644 --- a/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/Basic.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/Basic.lean @@ -11,7 +11,6 @@ public import Physlib.Relativity.IsLorentzDeriv public import Physlib.Relativity.LightConeDeriv public import Physlib.Relativity.SL2C.AxisRotations public import Physlib.Particles.StandardModel.GaugeGroup.JetGaugeGroup.Basic -public import Physlib.Relativity.LorentzGroup.Boosts.WeightGrading public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.SU2PermDecomposition public import Physlib.Particles.StandardModel.Matter.BosonicAlgebra.JetDeriv @@ -57,8 +56,6 @@ Lagrangian are assembled downstream. up to `massWeightSubmodule_eight_eq`. - `massWeightSubmoduleGaugeWeight` : the gauge weight decomposition of the mass-weight submodules. -- `IsDerivativeCollection.boostDecomp` : the boost weight decomposition of the span of a - symbol whose derivative indices rotate as Lorentz vectors. ## iii. Table of contents @@ -79,7 +76,6 @@ Lagrangian are assembled downstream. - F.4. The gauge weight decomposition - F.5. The low mass weights - G. Gauge invariants -- Aside: derivative collections and boost weights -/ @@ -1116,119 +1112,6 @@ lemma massWeightSubmodule_eight_eq : noncomputable def gaugeInvariantOfMassDim (M : ℕ) : Submodule ℂ B := h.massWeightSubmodule M ⊓ Representation.invariants rep -/-! - -## Aside: derivative collections and boost weights - -A symbol map whose derivative indices rotate as Lorentz vectors (`RotatesIndices`) has a -boost weight decomposition of its span along each spatial axis, read off in the light-cone -basis: a slot of light-cone type `c j` contributes `lightConeWeight (c j)` on top of the -weight of the argument. `IsDerivativeCollection` records the rotation law for a symbol with -several groups of derivative indices, and `trivialWeightDecomposition` is the weight -decomposition of a Lorentz-scalar argument. Both are used by the Higgs, fermion and gauge -sectors alike, which is why they live here rather than in a sector file. - --/ - -open Lorentz.BoostWeight - -/-- A symbol map with `α` groups of derivative indices whose every index rotates as a - Lorentz vector, the grouping being a spectator. -/ -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} - -/-- 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))) = ⊤ := fun c => - le_antisymm le_top (hw.iSup_piece.symm.le.trans (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 - -end IsDerivativeCollection - -/-- 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 [ite_eq_left rfl] - intro x _ t ht - simp - · rw [ite_eq_right hk] - exact bot_le - piece_eq_bot k hk := ite_eq_right (by simpa using hk) - iSup_piece := le_antisymm le_top (le_iSup_of_le 0 (by rw [ite_eq_left rfl])) - -@[simp] -lemma trivialWeightDecomposition_piece (i : Fin 3) (k : ℤ) : - (trivialWeightDecomposition i).piece k = if k = 0 then ⊤ else ⊥ := rfl - end HiggsAlgebraCovRealization end StandardModel diff --git a/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/DerivSubmodule/Basic.lean b/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/DerivSubmodule/Basic.lean index 09108d408..3d41c5f25 100644 --- a/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/DerivSubmodule/Basic.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/DerivSubmodule/Basic.lean @@ -14,8 +14,8 @@ the submodule `derivSubmodule n`. The Higgs is bosonic, so these submodules com with one another, and since neither the gauge nor the Lorentz action changes the number of derivatives they are closed under both. -The gauge and boost weight decompositions of these submodules live in -`GaugeWeightDecomposition.lean` and `BoostWeightDecomposition.lean`. +The gauge weight decomposition of these submodules lives in `GaugeWeightDecomposition.lean`, +and the sign they carry at the centre of `SL(2,ℂ)` in `Centre.lean`. -/ diff --git a/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/DerivSubmodule/BoostWeightDecomposition.lean b/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/DerivSubmodule/BoostWeightDecomposition.lean deleted file mode 100644 index 316abcbd1..000000000 --- a/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/DerivSubmodule/BoostWeightDecomposition.lean +++ /dev/null @@ -1,339 +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.AlgebraRealization.HiggsAlgebraCovRealization.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*: `HiggsAlgebraCovRealization.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. `HiggsAlgebraCovRealization.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 [ite_eq_left rfl] - intro x _ t ht - rw [htriv, zpow_zero, one_smul] - · rw [ite_eq_right hk] - exact bot_le - piece_eq_bot k hk := ite_eq_right (by simpa using hk) - iSup_piece := le_antisymm le_top (le_iSup_of_le 0 (by rw [ite_eq_left 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 HiggsAlgebraCovRealization - -set_option linter.unusedVariables false - -variable {B : Type} [Ring B] [Algebra ℂ B] - {rep : Representation ℂ GaugeGroupI B} - {repLorentz : Representation ℂ SL(2,ℂ) B} - {massWeightPoly : B →ₐ[ℂ] Polynomial B} - (h : HiggsAlgebraCovRealization B rep repLorentz 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.covH 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 (h.covBarH 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 : HiggsAlgebraCovRealization B rep repLorentz massWeightPoly) - {n : ℕ} (i : Fin 3) (c : Fin n → Fin 4) - (φ : Module.Dual ℂ HiggsVec) : B := - lightConeDeriv (h.covH n) i c φ - -/-- **The light-cone conjugate-Higgs symbols.** -/ -noncomputable def lightConeBarHiggs (h : HiggsAlgebraCovRealization B rep repLorentz massWeightPoly) - {n : ℕ} (i : Fin 3) (c : Fin n → Fin 4) - (φ : Module.Dual ℂ (ConjModule HiggsVec)) : B := - lightConeDeriv (h.covBarH 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.covH 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 (h.covBarH 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.covH 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 (h.covBarH 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.covH 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 (h.covBarH 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 : HiggsAlgebraCovRealization B rep repLorentz massWeightPoly) - (n : ℕ) (i : Fin 3) : - WeightDecomposition repLorentz i (h.higgsSubmodule n) := - (IsDerivativeCollection.boostDecomp (h.covH 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 : HiggsAlgebraCovRealization B rep repLorentz massWeightPoly) - (n : ℕ) (i : Fin 3) : - WeightDecomposition repLorentz i (h.barHiggsSubmodule n) := - (IsDerivativeCollection.boostDecomp (h.covBarH 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.covH n) i c) := by - show (⨆ c : Fin n → Fin 4, - ((higgsValueWeight i).piece (k - ∑ j, lightConeWeight (c j))).map - (lightConeDeriv (h.covH 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, ite_eq_left rfl, Submodule.map_top, iSup_pos hc] - · rw [higgsValueWeight, WeightDecomposition.ofTrivialAction_piece, ite_eq_right (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 (h.covBarH n) i c) := by - show (⨆ c : Fin n → Fin 4, - ((barHiggsValueWeight i).piece (k - ∑ j, lightConeWeight (c j))).map - (lightConeDeriv (h.covBarH 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, ite_eq_left rfl, Submodule.map_top, iSup_pos hc] - · rw [barHiggsValueWeight, WeightDecomposition.ofTrivialAction_piece, ite_eq_right (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 : HiggsAlgebraCovRealization B rep repLorentz 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.covH n) i c)) - ⊔ ⨆ (c : Fin n → Fin 4) (_ : (∑ j, lightConeWeight (c j)) = k), - LinearMap.range (lightConeDeriv (h.covBarH 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 - -end HiggsAlgebraCovRealization - -end StandardModel - -end diff --git a/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/DerivSubmodule/Centre.lean b/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/DerivSubmodule/Centre.lean new file mode 100644 index 000000000..c8589f3b2 --- /dev/null +++ b/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/DerivSubmodule/Centre.lean @@ -0,0 +1,86 @@ +/- +Copyright (c) 2026 Joseph Tooby-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.AlgebraRealization.HiggsAlgebraCovRealization.DerivSubmodule.Basic +public import Physlib.Relativity.LorentzGroup.Invariants.Centre +/-! +# The centre of `SL(2,ℂ)` on the Higgs sector + +The Higgs is a Lorentz scalar, so the centre of `SL(2,ℂ)` acts on its derivative submodules by +`+1`: the covariant-derivative slots mix by the Lorentz matrix, which is the identity at the +centre, and the value index is inert because the value space carries the trivial +representation. The conjugate tower is the same, conjugation of the trivial representation +being trivial again. + +This is the integer-spin half of the parity count the Yukawa classification runs. Paired with +`IsFermionSector.derivSubmodule_le_centreEigenspace`, which gives the fermions `-1`, it makes +a product with a single fermion factor carry `-1`, and a subspace of sign `-1` carries no +Lorentz invariant. + +- A. The two towers +- B. The Higgs derivative submodules + +-/ + +@[expose] public section + +namespace StandardModel + +open TensorProduct Matrix MatrixGroups Lorentz Lorentz.Invariants + +namespace HiggsAlgebraCovRealization + +variable {B : Type} [Ring B] [Algebra ℂ B] + {rep : Representation ℂ GaugeGroupI B} + {repLorentz : Representation ℂ SL(2,ℂ) B} + {massWeightPoly : B →ₐ[ℂ] Polynomial B} + (h : HiggsAlgebraCovRealization B rep repLorentz massWeightPoly) + +/-! + +## A. The two towers + +Each tower feeds `range_le_centreEigenspace` with its own Lorentz law and the sign of its +value space, which is `+1` for both: the value space of the Higgs tower carries the trivial +representation and that of the conjugate tower its conjugate. + +-/ + +include h in +/-- The Higgs symbols carry the sign `+1`: their value space is a Lorentz scalar. -/ +lemma range_covH_le_centreEigenspace (n : ℕ) (l : Fin n → Fin 1 ⊕ Fin 3) : + LinearMap.range (h.covH n l) ≤ centreEigenspace repLorentz 1 := + range_le_centreEigenspace h.repLorentz_H (by ext x; simp) l + +include h in +/-- The conjugate Higgs symbols carry the sign `+1`, for the same reason. -/ +lemma range_covBarH_le_centreEigenspace (n : ℕ) (l : Fin n → Fin 1 ⊕ Fin 3) : + LinearMap.range (h.covBarH n l) ≤ centreEigenspace repLorentz 1 := + range_le_centreEigenspace h.repLorentz_barH (by ext x; simp) l + +/-! + +## B. The Higgs derivative submodules + +The derivative submodule is the join of the two towers over the derivative slots, and an +eigenspace is closed under joins. + +-/ + +include h in +/-- **The centre of `SL(2,ℂ)` acts on the Higgs derivative submodules by `+1`**, for any + number of covariant derivatives: the Higgs is a Lorentz scalar and the derivative slots are + inert at the centre. -/ +theorem derivSubmodule_le_centreEigenspace (n : ℕ) : + h.derivSubmodule n ≤ centreEigenspace repLorentz 1 := by + rw [derivSubmodule, higgsSubmodule, barHiggsSubmodule] + exact sup_le (iSup_le fun l => h.range_covH_le_centreEigenspace n l) + (iSup_le fun l => h.range_covBarH_le_centreEigenspace n l) + +end HiggsAlgebraCovRealization + +end StandardModel diff --git a/Physlib/Particles/StandardModel/CovAlgebraRealization/FermionGaugeSector/MassWeight.lean b/Physlib/Particles/StandardModel/CovAlgebraRealization/FermionGaugeSector/MassWeight.lean index 6916a67a0..131bdbfb5 100644 --- a/Physlib/Particles/StandardModel/CovAlgebraRealization/FermionGaugeSector/MassWeight.lean +++ b/Physlib/Particles/StandardModel/CovAlgebraRealization/FermionGaugeSector/MassWeight.lean @@ -7,10 +7,7 @@ module public import Physlib.Particles.StandardModel.CovAlgebraRealization.FermionGaugeSector.Basic public import Physlib.Particles.StandardModel.CovAlgebraRealization.YukawaSector.MassDimLTEight -public import Physlib.Particles.StandardModel.IsGaugeSector.DerivSubmodule.BoostWeightDecomposition --- The fermion boost weights enter only inside the proofs below, so this import is kept --- private: its public form is one character over the line-length limit. -import Physlib.Particles.StandardModel.IsFermionSector.DerivSubmodule.BoostWeightDecomposition +public import Physlib.Particles.StandardModel.IsGaugeSector.DerivSubmodule.Centre /-! # The gauge-fermion invariants below mass weight nine @@ -21,24 +18,20 @@ splittings that arithmetic allows are `4 + 4` and `6 + 2`, and the fermion secto trivial at both four and two, so weight eight vanishes too. That leaves weight seven, the single product `F ψ` of the underived field strength against the underived fermion towers. -Weight seven is barred from carrying an invariant by a parity count on boost weight, the -same one that empties the Yukawa sector at weights five and seven. Along a spatial axis a -field-strength symbol carries even boost weight, its two covector indices and its -derivative slots each contributing `±2` or `0` and its adjoint index nothing, while a -fermion symbol carries odd boost weight, the Weyl-spinor value index contributing the -extra `±1`. The one product at weight seven has exactly one fermion factor, so its boost -weight is odd along every axis; and a Lorentz invariant has boost weight zero, which is -even. - -The machinery is the Yukawa sector's: `WeightDecomposition.mulOfMul` convolves the two -factors' boost decompositions using multiplicativity of the Lorentz representation alone, -`not_two_dvd_of_mem_mulOfMul_supp` does the parity bookkeeping, and -`mem_of_invariant_of_mem_sup_of_odd_supp` turns an odd support into the absence of -invariants modulo a Lorentz-stable submodule. Only the left-hand factor changes: the -Higgs decomposition of even support is replaced by the gauge one, which is even for the -same reason. - -- A. Even field strength against odd fermion +Weight seven is barred from carrying an invariant by the same parity count on spin that +empties the Yukawa sector at weights five and seven. The field strength is of integer spin, +its two covector indices and its derivative slots all mixing by the Lorentz matrix and its +adjoint index not seeing the Lorentz group at all, while a fermion carries one Weyl-spinor +index. The one product at weight seven has exactly one fermion factor, so it is of +half-integer spin; and a half-integer spin carries no Lorentz invariant. + +The machinery is the Yukawa sector's: `mul_le_centreEigenspace` multiplies the signs the +two factors carry at the centre of `SL(2,ℂ)`, and +`mem_of_invariant_of_mem_sup_centreEigenspace_neg_one` turns the sign `-1` into the absence +of invariants modulo a Lorentz-stable submodule. Only the left-hand factor changes: the +Higgs sign `+1` is replaced by the gauge one, which is `+1` for the same reason. + +- A. Integer field strength against half-integer fermion - B. Mass weight seven - C. The classification below mass weight nine @@ -51,7 +44,7 @@ seven, so nothing is gained by stopping short of the first weight the sector can namespace StandardModel -open TensorProduct Matrix MatrixGroups Lorentz Lorentz.BoostWeight +open TensorProduct Matrix MatrixGroups Lorentz Lorentz.Invariants namespace CovAlgebraRealization @@ -63,54 +56,45 @@ variable {B : Type} [Ring B] [Algebra ℂ B] /-! -## A. Even field strength against odd fermion +## A. Integer field strength against half-integer fermion -The two boost weight decompositions of the factors are already proved: the field-strength -derivative submodules carry even weights, the covector and derivative slots contributing -`±2` or `0` and the adjoint index nothing, and the fermion ones carry odd weights, the -Weyl-spinor value index adding `±1`. Convolving them gives a boost weight decomposition of -their product, and even plus odd is odd. +The signs the two factors carry at the centre are already proved: the field-strength +derivative submodules carry `+1`, every one of their indices being inert there, and the +fermion ones carry `-1`, the Weyl-spinor value index doing the work. The Lorentz action on +`B` is by algebra maps, so the product carries `+1` times `-1`. -/ -/-- The boost weight decomposition of a product of a field-strength and a fermion - derivative submodule, obtained by convolving the two factors' decompositions. -/ -private noncomputable def gaugeFermionBoostWeight (a b : ℕ) (i : Fin 3) : - WeightDecomposition repLorentz i - (h.isGaugeSector.derivSubmodule a * h.isFermionSector.derivSubmodule b) := - WeightDecomposition.mulOfMul h.repLorentz_mul - (h.isGaugeSector.derivSubmoduleBoostWeight a i) - (h.isFermionSector.derivSubmoduleBoostWeight b i) - -/-- One field-strength factor against one fermion factor is odd: even plus odd. -/ -private lemma odd_gaugeFermionBoostWeight_supp (a b : ℕ) (i : Fin 3) : - ∀ k ∈ (h.gaugeFermionBoostWeight a b i).supp, ¬ (2 : ℤ) ∣ k := - fun _ hk => WeightDecomposition.not_two_dvd_of_mem_mulOfMul_supp - (fun _ hp => h.isGaugeSector.two_dvd_of_mem_derivSubmoduleBoostWeight_supp a i hp) - (fun _ hq => h.isFermionSector.not_two_dvd_of_mem_derivSubmoduleBoostWeight_supp b i hq) hk +/-- A field-strength derivative submodule against a fermion one is of half-integer spin: + `+1` times `-1`. -/ +private lemma gaugeFermion_le_centreEigenspace (a b : ℕ) : + h.isGaugeSector.derivSubmodule a * h.isFermionSector.derivSubmodule b + ≤ centreEigenspace repLorentz (-1) := by + simpa using mul_le_centreEigenspace h.repLorentz_mul + (h.isGaugeSector.derivSubmodule_le_centreEigenspace a) + (h.isFermionSector.derivSubmodule_le_centreEigenspace b) /-! ## B. Mass weight seven Weight seven is the single product `F ψ`, the underived field strength against the -underived fermion towers. It has exactly one fermion factor, so section A makes every one -of its boost weights odd, and an invariant of odd boost weight is zero modulo a -Lorentz-stable submodule. The axis is immaterial; the first one will do. +underived fermion towers. It has exactly one fermion factor, so section A gives it the sign +`-1`, and a subspace of sign `-1` carries no invariant modulo a Lorentz-stable submodule. -/ /-- Mass weight seven carries no Lorentz invariant modulo a Lorentz-stable submodule: a Lorentz invariant of `sectorMassWeight {gauge, fermion} 7 ⊔ S` lies in `S`. The weight is - the underived field strength against the underived fermion towers, of odd boost - weight. -/ + the underived field strength against the underived fermion towers, of half-integer + spin. -/ theorem mem_of_lorentz_invariant_sectorMassWeight_gauge_fermion_seven_sup (S : Submodule ℂ B) (hSL : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) {x : B} (hx : x ∈ h.sectorMassWeight {GeneratorClass.gauge, GeneratorClass.fermion} 7 ⊔ S) (hL : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by rw [h.sectorMassWeight_gauge_fermion_seven] at hx - exact WeightDecomposition.mem_of_invariant_of_mem_sup_of_odd_supp - (h.gaugeFermionBoostWeight 0 0 0) (h.odd_gaugeFermionBoostWeight_supp 0 0 0) S hSL hx hL + exact mem_of_invariant_of_mem_sup_centreEigenspace_neg_one + (h.gaugeFermion_le_centreEigenspace 0 0) S hSL hx hL /-! diff --git a/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/MassDimLTEight.lean b/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/MassDimLTEight.lean index 915d98171..e7ba2308c 100644 --- a/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/MassDimLTEight.lean +++ b/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/MassDimLTEight.lean @@ -5,12 +5,10 @@ Authors: Joseph Tooby-Smith -/ module +public import Physlib.Particles.StandardModel.AlgebraRealization.HiggsAlgebraCovRealization.DerivSubmodule.Centre public import Physlib.Particles.StandardModel.CovAlgebraRealization.YukawaSector.Basic -public import Physlib.Particles.StandardModel.AlgebraRealization.HiggsAlgebraCovRealization.DerivSubmodule.BoostWeightDecomposition +public import Physlib.Particles.StandardModel.IsFermionSector.DerivSubmodule.Centre public import Physlib.Relativity.LorentzGroup.Invariants.RankFour --- The fermion boost weights enter only inside the proofs below, so this import is kept --- private: its public form is one character over the line-length limit. -import Physlib.Particles.StandardModel.IsFermionSector.DerivSubmodule.BoostWeightDecomposition /-! # The Yukawa invariants below mass weight eight @@ -20,27 +18,21 @@ empty — it vanishes outright below weight five and again at weight six — and that survives, at weights five and seven, is barred from carrying an invariant by a parity count. -The count is on boost weight, not on the number of covector indices as in the gauge -sector. Along a spatial axis every Higgs symbol carries even boost weight, its derivative -slots contributing `±2` or `0` and its value index nothing, while every fermion symbol -carries odd boost weight, the Weyl-spinor value index contributing the extra `±1`. Each of -the four products surviving at weights five and seven has exactly one fermion factor, so -its boost weight is odd along every axis; and an element of odd boost weight cannot be -Lorentz invariant, since invariance forces boost weight zero and zero is even. - -Running that argument needs the product of two weight decompositions, which -`WeightGrading.lean` does not provide: multiplicativity of the Lorentz representation is by -itself enough to convolve two decompositions, and section A builds the product from that -alone. Section B turns an odd -support into the absence of invariants, and does so modulo a Lorentz-stable submodule `S` -by passing to the quotient, where the weight-zero piece of the pushed-forward -decomposition is still trivial. - -- A. Convolving weight decompositions without a grading -- B. Odd boost weight admits no invariant -- C. Even Higgs against odd fermion -- D. Mass weights five and seven -- E. The classification below mass weight eight +The count is on spin, not on the number of covector indices as in the gauge sector. The +Higgs is a Lorentz scalar and a fermion carries one Weyl-spinor index, so each of the four +products surviving at weights five and seven, having exactly one fermion factor, is of +half-integer spin; and a half-integer spin carries no Lorentz invariant. + +The count is run at the centre of `SL(2,ℂ)`, where `Invariants/Centre.lean` puts it: the +element `-1` covers the identity Lorentz transformation, so it acts by `+1` on the Higgs +derivative submodules and by `-1` on the fermion ones, and the Lorentz action on `B` is by +algebra maps, so the signs multiply over a product. Section A does that multiplication for +the four products, and the peeling modulo a Lorentz-stable submodule `S` is +`mem_of_invariant_of_mem_sup_centreEigenspace_neg_one`. + +- A. Integer Higgs against half-integer fermion +- B. Mass weights five and seven +- C. The classification below mass weight eight Unlike the gauge-sector statement, the final theorem needs no `0 < w`: the Yukawa sector is a product of two non-empty sectors, so it already vanishes at weight zero and the @@ -50,163 +42,9 @@ scalars never enter. @[expose] public section -namespace Lorentz.BoostWeight.WeightDecomposition - -open MatrixGroups - -/-! - -## A. Convolving weight decompositions without a grading - -The weight-`m` piece of a product is the join, over the splittings `k + l = m`, of the -products of the weight-`k` and weight-`l` pieces of the factors. That this is a weight -decomposition of the product submodule needs nothing of the representation beyond -multiplicativity: `mul_mem_boostWeightSubmodule` adds the two weights, and the pieces of -the factors join to the factors themselves. - --/ - -variable {K : Type*} [Field K] [Algebra ℝ K] {A : Type*} [Ring A] [Algebra K A] - {rep : Representation K SL(2,ℂ) A} {i : Fin 3} {V W : Submodule K A} - -omit [Algebra ℝ K] in -/-- The bound behind the convolution: a product of two joins of pieces is contained in the - join, over the total weights, of the convolution. -/ -lemma mul_le_iSup_convolution (p q : ℤ → Submodule K A) : - (⨆ k, p k) * (⨆ l, q l) ≤ ⨆ (m : ℤ) (k : ℤ) (l : ℤ) (_ : k + l = m), p k * q l := by - rw [Submodule.iSup_mul] - refine iSup_le fun k => ?_ - rw [Submodule.mul_iSup] - exact iSup_le fun l => le_iSup_of_le (k + l) - (le_iSup_of_le k (le_iSup_of_le l (le_iSup_of_le rfl le_rfl))) - -open scoped Pointwise in -/-- The convolution of two weight decompositions along the same axis, built from - multiplicativity of the representation alone: the weight-`m` piece of the product is the - join over the splittings `k + l = m` of the products of the pieces. -/ -noncomputable def mulOfMul - (hmul : ∀ (Λ : SL(2,ℂ)) (x y : A), rep Λ (x * y) = rep Λ x * rep Λ y) - (d₁ : WeightDecomposition rep i V) (d₂ : WeightDecomposition rep i W) : - WeightDecomposition rep i (V * W) where - piece m := ⨆ (k : ℤ) (l : ℤ) (_ : k + l = m), d₁.piece k * d₂.piece l - supp := d₁.supp + d₂.supp - piece_le m := iSup_le fun k => iSup_le fun l => iSup_le fun hkl => - Submodule.mul_le.2 fun a ha b hb => by - rw [← hkl] - exact mul_mem_boostWeightSubmodule hmul (d₁.piece_le k ha) (d₂.piece_le l hb) - piece_eq_bot m hm := by - refine iSup_eq_bot.2 fun k => iSup_eq_bot.2 fun l => iSup_eq_bot.2 fun hkl => ?_ - by_cases hk : k ∈ d₁.supp - · rw [d₂.piece_eq_bot l fun hl => hm (hkl ▸ Finset.add_mem_add hk hl), Submodule.mul_bot] - · rw [d₁.piece_eq_bot k hk, Submodule.bot_mul] - iSup_piece := - le_antisymm (iSup_le fun m => iSup_le fun k => iSup_le fun l => iSup_le fun _ => - Submodule.mul_le.2 fun a ha b hb => Submodule.mul_mem_mul - (le_of_le_of_eq (le_iSup d₁.piece k) d₁.iSup_piece ha) - (le_of_le_of_eq (le_iSup d₂.piece l) d₂.iSup_piece hb)) - (le_trans (le_of_eq (show V * W = (⨆ k, d₁.piece k) * ⨆ l, d₂.piece l by - rw [d₁.iSup_piece, d₂.iSup_piece])) (mul_le_iSup_convolution _ _)) - -open scoped Pointwise in -/-- The weights occurring in a convolution are the sums of the weights occurring in the - two factors. -/ -@[simp] -lemma mulOfMul_supp - (hmul : ∀ (Λ : SL(2,ℂ)) (x y : A), rep Λ (x * y) = rep Λ x * rep Λ y) - (d₁ : WeightDecomposition rep i V) (d₂ : WeightDecomposition rep i W) : - (d₁.mulOfMul hmul d₂).supp = d₁.supp + d₂.supp := rfl - -/-- A weight of a convolution splits as a weight of the left factor plus a weight of the - right one. -/ -lemma exists_add_eq_of_mem_mulOfMul_supp - {hmul : ∀ (Λ : SL(2,ℂ)) (x y : A), rep Λ (x * y) = rep Λ x * rep Λ y} - {d₁ : WeightDecomposition rep i V} {d₂ : WeightDecomposition rep i W} {m : ℤ} - (hm : m ∈ (d₁.mulOfMul hmul d₂).supp) : - ∃ k ∈ d₁.supp, ∃ l ∈ d₂.supp, k + l = m := by - rw [mulOfMul_supp] at hm - exact Finset.mem_add.1 hm - -/-- Even times even is even: a convolution of two decompositions of even support has even - support. -/ -lemma two_dvd_of_mem_mulOfMul_supp - {hmul : ∀ (Λ : SL(2,ℂ)) (x y : A), rep Λ (x * y) = rep Λ x * rep Λ y} - {d₁ : WeightDecomposition rep i V} {d₂ : WeightDecomposition rep i W} - (h₁ : ∀ k ∈ d₁.supp, (2 : ℤ) ∣ k) (h₂ : ∀ k ∈ d₂.supp, (2 : ℤ) ∣ k) {m : ℤ} - (hm : m ∈ (d₁.mulOfMul hmul d₂).supp) : (2 : ℤ) ∣ m := by - obtain ⟨k, hk, l, hl, rfl⟩ := exists_add_eq_of_mem_mulOfMul_supp hm - exact dvd_add (h₁ k hk) (h₂ l hl) - -/-- Even times odd is odd: a convolution of a decomposition of even support with one of odd - support has odd support. -/ -lemma not_two_dvd_of_mem_mulOfMul_supp - {hmul : ∀ (Λ : SL(2,ℂ)) (x y : A), rep Λ (x * y) = rep Λ x * rep Λ y} - {d₁ : WeightDecomposition rep i V} {d₂ : WeightDecomposition rep i W} - (h₁ : ∀ k ∈ d₁.supp, (2 : ℤ) ∣ k) (h₂ : ∀ k ∈ d₂.supp, ¬ (2 : ℤ) ∣ k) {m : ℤ} - (hm : m ∈ (d₁.mulOfMul hmul d₂).supp) : ¬ (2 : ℤ) ∣ m := by - obtain ⟨k, hk, l, hl, rfl⟩ := exists_add_eq_of_mem_mulOfMul_supp hm - exact fun hdvd => h₂ l hl ((dvd_add_right (h₁ k hk)).1 hdvd) - -/-- The weights of a join of two decompositions are the weights of the two. -/ -@[simp] -lemma sup_supp (d₁ : WeightDecomposition rep i V) (d₂ : WeightDecomposition rep i W) : - (d₁.sup d₂).supp = d₁.supp ∪ d₂.supp := rfl - -/-! - -## B. Odd boost weight admits no invariant - -A Lorentz invariant has boost weight zero along every axis, and zero is even. So a -submodule all of whose weights are odd contains no invariant but `0`. The statement is -wanted modulo a Lorentz-stable submodule `S`, and stability is exactly what is needed to -divide `S` out: the quotient carries a representation intertwined by `S.mkQ`, the images -of the pieces are again of pure weight, they join to the image of the submodule, and the -weight-zero image is the image of the trivial weight-zero piece. So the invariant dies in -the quotient, which is to say it lies in `S`. - --/ - -/-- An equivariant linear map carries boost weight `m` to boost weight `m`: it commutes - with the boosts, and scaling is preserved. -/ -lemma map_boostWeightSubmodule_le {M N : Type*} [AddCommGroup M] [Module K M] - [AddCommGroup N] [Module K N] {repM : Representation K SL(2,ℂ) M} - {repN : Representation K SL(2,ℂ) N} (f : M →ₗ[K] N) - (hf : ∀ (g : SL(2,ℂ)) (y : M), f (repM g y) = repN g (f y)) (j : Fin 3) (m : ℤ) : - (boostWeightSubmodule repM j m).map f ≤ boostWeightSubmodule repN j m := by - rintro _ ⟨y, hy, rfl⟩ - intro t ht - rw [← hf, hy t ht, map_smul] - -/-- A submodule whose boost weights are all odd carries no Lorentz invariant beyond a - Lorentz-stable submodule `S`: an invariant of the join with `S` already lies in `S`. - Invariance forces boost weight zero, and zero is not among the weights on offer. -/ -lemma mem_of_invariant_of_mem_sup_of_odd_supp {M : Type*} [AddCommGroup M] [Module ℂ M] - {repLorentz : Representation ℂ SL(2,ℂ) M} {j : Fin 3} {V : Submodule ℂ M} - (d : WeightDecomposition repLorentz j V) (hodd : ∀ k ∈ d.supp, ¬ (2 : ℤ) ∣ k) - (S : Submodule ℂ M) (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) {x : M} - (hx : x ∈ V ⊔ S) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by - have hzero : d.piece 0 = ⊥ := d.piece_eq_bot 0 fun hmem => hodd 0 hmem ⟨0, rfl⟩ - have hle : ∀ m : ℤ, (d.piece m).map S.mkQ - ≤ boostWeightSubmodule (repLorentz.quotient S fun g y hy => hS g y hy) j m := - fun m => le_trans (Submodule.map_mono (d.piece_le m)) - (map_boostWeightSubmodule_le S.mkQ (fun _ _ => rfl) j m) - have hmem : S.mkQ x ∈ ⨆ m : ℤ, (d.piece m).map S.mkQ := by - obtain ⟨y, hy, z, hz, rfl⟩ := Submodule.mem_sup.1 hx - rw [map_add, show S.mkQ z = 0 from (Submodule.Quotient.mk_eq_zero S).2 hz, add_zero, - ← Submodule.map_iSup] - exact Submodule.mem_map_of_mem (le_of_eq d.iSup_piece.symm hy) - have hinv' : ∀ g : SL(2,ℂ), - (repLorentz.quotient S fun g y hy => hS g y hy) g (S.mkQ x) = S.mkQ x := - fun g => by rw [quotient_apply_mkQ, hinv g] - have hx0 := mem_of_mem_iSup_of_boostWeight_zero hle hmem - (mem_boostWeightSubmodule_zero_of_invariant hinv' j) - rw [hzero, Submodule.map_bot, Submodule.mem_bot] at hx0 - rwa [← Submodule.ker_mkQ S, LinearMap.mem_ker] - -end Lorentz.BoostWeight.WeightDecomposition - namespace StandardModel -open TensorProduct Matrix MatrixGroups Lorentz Lorentz.BoostWeight +open TensorProduct Matrix MatrixGroups Lorentz Lorentz.Invariants namespace CovAlgebraRealization @@ -218,105 +56,82 @@ variable {B : Type} [Ring B] [Algebra ℂ B] /-! -## C. Even Higgs against odd fermion +## A. Integer Higgs against half-integer fermion -The two boost weight decompositions of the factors are already proved: the Higgs -derivative submodules carry even weights, their derivative slots contributing `±2` or `0` -and their value index nothing, and the fermion ones carry odd weights, the Weyl-spinor -value index adding `±1`. Convolving them along section A gives a decomposition of each -product surviving below weight eight, and the parity bookkeeping of that section makes -every weight of such a product odd, since each carries exactly one fermion factor. The -term with two Higgs factors is convolved twice, even against even staying even before the -fermion turns the total odd. +The signs the two factors carry at the centre are already proved: the Higgs derivative +submodules carry `+1`, being Lorentz scalars with inert derivative slots, and the fermion +ones carry `-1`, the Weyl-spinor value index doing the work. The Lorentz action on `B` is +by algebra maps, so the sign of a product is the product of the signs, and each of the +products surviving below weight eight has exactly one fermion factor. The term with two +Higgs factors multiplies twice, `+1` against `+1` staying `+1` before the fermion turns the +total `-1`. -/ -/-- The boost weight decomposition of a product of a Higgs and a fermion derivative - submodule, obtained by convolving the two factors' decompositions. -/ -private noncomputable def higgsFermionBoostWeight (a b : ℕ) (i : Fin 3) : - WeightDecomposition repLorentz i - (h.isHiggsSector.derivSubmodule a * h.isFermionSector.derivSubmodule b) := - WeightDecomposition.mulOfMul h.repLorentz_mul - (h.isHiggsSector.derivSubmoduleBoostWeight a i) - (h.isFermionSector.derivSubmoduleBoostWeight b i) - -/-- One Higgs factor against one fermion factor is odd: even plus odd. -/ -private lemma odd_higgsFermionBoostWeight_supp (a b : ℕ) (i : Fin 3) : - ∀ k ∈ (h.higgsFermionBoostWeight a b i).supp, ¬ (2 : ℤ) ∣ k := - fun _ hk => WeightDecomposition.not_two_dvd_of_mem_mulOfMul_supp - (fun _ hp => h.isHiggsSector.two_dvd_of_mem_derivSubmoduleBoostWeight_supp a i hp) - (fun _ hq => h.isFermionSector.not_two_dvd_of_mem_derivSubmoduleBoostWeight_supp b i hq) hk - -/-- The boost weight decomposition of a product of two Higgs and one fermion derivative - submodule, obtained by convolving the Higgs pair first. -/ -private noncomputable def higgsSqFermionBoostWeight (a b c : ℕ) (i : Fin 3) : - WeightDecomposition repLorentz i - (h.isHiggsSector.derivSubmodule a * h.isHiggsSector.derivSubmodule b - * h.isFermionSector.derivSubmodule c) := - WeightDecomposition.mulOfMul h.repLorentz_mul - (WeightDecomposition.mulOfMul h.repLorentz_mul - (h.isHiggsSector.derivSubmoduleBoostWeight a i) - (h.isHiggsSector.derivSubmoduleBoostWeight b i)) - (h.isFermionSector.derivSubmoduleBoostWeight c i) - -/-- Two Higgs factors against one fermion factor is odd: even plus even plus odd. -/ -private lemma odd_higgsSqFermionBoostWeight_supp (a b c : ℕ) (i : Fin 3) : - ∀ k ∈ (h.higgsSqFermionBoostWeight a b c i).supp, ¬ (2 : ℤ) ∣ k := - fun _ hk => WeightDecomposition.not_two_dvd_of_mem_mulOfMul_supp - (fun _ hp => WeightDecomposition.two_dvd_of_mem_mulOfMul_supp - (fun _ hp' => h.isHiggsSector.two_dvd_of_mem_derivSubmoduleBoostWeight_supp a i hp') - (fun _ hp' => h.isHiggsSector.two_dvd_of_mem_derivSubmoduleBoostWeight_supp b i hp') hp) - (fun _ hq => h.isFermionSector.not_two_dvd_of_mem_derivSubmoduleBoostWeight_supp c i hq) hk +/-- A Higgs derivative submodule against a fermion one is of half-integer spin: `+1` times + `-1`. -/ +private lemma higgsFermion_le_centreEigenspace (a b : ℕ) : + h.isHiggsSector.derivSubmodule a * h.isFermionSector.derivSubmodule b + ≤ centreEigenspace repLorentz (-1) := by + simpa using mul_le_centreEigenspace h.repLorentz_mul + (h.isHiggsSector.derivSubmodule_le_centreEigenspace a) + (h.isFermionSector.derivSubmodule_le_centreEigenspace b) + +/-- Two Higgs derivative submodules against a fermion one is of half-integer spin: `+1` + times `+1` times `-1`. -/ +private lemma higgsSqFermion_le_centreEigenspace (a b c : ℕ) : + h.isHiggsSector.derivSubmodule a * h.isHiggsSector.derivSubmodule b + * h.isFermionSector.derivSubmodule c + ≤ centreEigenspace repLorentz (-1) := by + simpa using mul_le_centreEigenspace h.repLorentz_mul + (mul_le_centreEigenspace h.repLorentz_mul + (h.isHiggsSector.derivSubmodule_le_centreEigenspace a) + (h.isHiggsSector.derivSubmodule_le_centreEigenspace b)) + (h.isFermionSector.derivSubmodule_le_centreEigenspace c) /-! -## D. Mass weights five and seven +## B. Mass weights five and seven Weight five is a single product, the Higgs field against the underived fermion towers. Weight seven is a join of three: the Higgs field against the once-derived towers, the once-derived Higgs field against the underived ones, and two Higgs fields against the -underived ones. Each of the four has exactly one fermion factor, so section C makes all of -their boost weights odd, the join included, and section B leaves the invariant in `S`. The -axis is immaterial; the first one will do. +underived ones. Each of the four has exactly one fermion factor, so section A gives all of +them the sign `-1`, the join included, and the invariant is left in `S`. -/ /-- Mass weight five carries no Lorentz invariant modulo a Lorentz-stable submodule: a Lorentz invariant of `sectorMassWeight {higgs, fermion} 5 ⊔ S` lies in `S`. The weight is - one Higgs field against the underived fermion towers, of odd boost weight. -/ + one Higgs field against the underived fermion towers, of half-integer spin. -/ theorem mem_of_lorentz_invariant_sectorMassWeight_higgs_fermion_five_sup (S : Submodule ℂ B) (hSL : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) {x : B} (hx : x ∈ h.sectorMassWeight {GeneratorClass.higgs, GeneratorClass.fermion} 5 ⊔ S) (hL : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by rw [h.sectorMassWeight_higgs_fermion_five] at hx - exact WeightDecomposition.mem_of_invariant_of_mem_sup_of_odd_supp - (h.higgsFermionBoostWeight 0 0 0) (h.odd_higgsFermionBoostWeight_supp 0 0 0) S hSL hx hL + exact mem_of_invariant_of_mem_sup_centreEigenspace_neg_one + (h.higgsFermion_le_centreEigenspace 0 0) S hSL hx hL /-- Mass weight seven carries no Lorentz invariant modulo a Lorentz-stable submodule: a Lorentz invariant of `sectorMassWeight {higgs, fermion} 7 ⊔ S` lies in `S`. Each of the - three products making up the weight has a single fermion factor, so each is of odd boost - weight and so is their join. -/ + three products making up the weight has a single fermion factor, so each is of + half-integer spin and so is their join. -/ theorem mem_of_lorentz_invariant_sectorMassWeight_higgs_fermion_seven_sup (S : Submodule ℂ B) (hSL : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) {x : B} (hx : x ∈ h.sectorMassWeight {GeneratorClass.higgs, GeneratorClass.fermion} 7 ⊔ S) (hL : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by rw [h.sectorMassWeight_higgs_fermion_seven] at hx - refine WeightDecomposition.mem_of_invariant_of_mem_sup_of_odd_supp - (((h.higgsFermionBoostWeight 0 1 0).sup (h.higgsFermionBoostWeight 1 0 0)).sup - (h.higgsSqFermionBoostWeight 0 0 0 0)) ?_ S hSL hx hL - intro k hk - simp only [WeightDecomposition.sup_supp, Finset.mem_union] at hk - rcases hk with (hk | hk) | hk - · exact h.odd_higgsFermionBoostWeight_supp 0 1 0 k hk - · exact h.odd_higgsFermionBoostWeight_supp 1 0 0 k hk - · exact h.odd_higgsSqFermionBoostWeight_supp 0 0 0 0 k hk + exact mem_of_invariant_of_mem_sup_centreEigenspace_neg_one + (sup_le (sup_le (h.higgsFermion_le_centreEigenspace 0 1) + (h.higgsFermion_le_centreEigenspace 1 0)) + (h.higgsSqFermion_le_centreEigenspace 0 0 0)) S hSL hx hL /-! -## E. The classification below mass weight eight +## C. The classification below mass weight eight The eight weights below eight are now settled: the sector vanishes below weight five and -at weight six, and weights five and seven are section D. So below weight eight the Yukawa +at weight six, and weights five and seven are section B. So below weight eight the Yukawa sector supplies no invariant beyond what `S` already carries, and the equivalences record it. @@ -330,7 +145,7 @@ scalars, which are what force `0 < w` there, never appear. /-- Below mass weight eight the Yukawa sector carries no Lorentz invariant: a Lorentz invariant of `sectorMassWeight {higgs, fermion} w ⊔ S` for `w < 8` lies in `S`. Weights below five and weight six are trivial submodules, and weights five and seven are section - D. -/ + B. -/ theorem mem_of_lorentz_invariant_sectorMassWeight_higgs_fermion_lt_eight_sup (w : ℕ) (hw : w < 8) (S : Submodule ℂ B) (hSL : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) {x : B} @@ -349,7 +164,7 @@ set_option linter.unusedVariables false in an element of `sectorMassWeight {higgs, fermion} w ⊔ S` for `w < 8` is fixed by both groups exactly when it is itself an element of `S` fixed by both groups. Gauge stability of `S` is not needed, and neither is gauge invariance of `x`: the forward direction is - the boost-weight parity argument, which uses the Lorentz group alone. -/ + the spin parity argument, which uses the Lorentz group alone. -/ theorem mem_sectorMassWeight_higgs_fermion_lt_eight_sup_and_gauge_lorentz_invariant_iff (w : ℕ) (hw : w < 8) (S : Submodule ℂ B) (hS : ∀ g : GaugeGroupI, ∀ y ∈ S, repGauge g y ∈ S) diff --git a/Physlib/Particles/StandardModel/Fermions/DownSinglet/Basic.lean b/Physlib/Particles/StandardModel/Fermions/DownSinglet/Basic.lean index 262d849dc..72d54343a 100644 --- a/Physlib/Particles/StandardModel/Fermions/DownSinglet/Basic.lean +++ b/Physlib/Particles/StandardModel/Fermions/DownSinglet/Basic.lean @@ -579,6 +579,26 @@ lemma repLorentzGroup_conj_dual_dualBasis (Λ : SL(2,ℂ)) (j : Fin 2 × Fin 3) rw [key] simp [Fintype.sum_prod_type, ite_smul] +/-- **The centre of `SL(2,ℂ)` acts on the down-singlet space by `-1`**: the value space carries a + single Weyl-spinor index, and `-1` is not the identity on a half-integer spin. -/ +lemma repLorentzGroup_neg_one : repLorentzGroup (-1) = -LinearMap.id := by + apply basis.ext + intro j + obtain ⟨a, c⟩ := j + rw [repLorentzGroup_apply_basis] + fin_cases a <;> + simp [basis, Matrix.one_apply, Module.Basis.tensorProduct_apply] + +/-- The centre acts on the conjugate down-singlet space by `-1` as well: conjugation does not + move a real sign. -/ +lemma repLorentzGroup_conj_neg_one : repLorentzGroup.conj (-1) = -LinearMap.id := by + apply basis.conj.ext + intro j + obtain ⟨a, c⟩ := j + rw [repLorentzGroup_conj_apply_basis] + fin_cases a <;> + simp [basis, Matrix.one_apply, Module.Basis.tensorProduct_apply] + /-- The gauge action on the down-singlet basis: the spinor index is inert and the colour index transforms by the `SU(3)` matrix, scaled by the hypercharge factor. -/ lemma repGaugeGroupI_apply_basis (g : GaugeGroupI) (j : Fin 2 × Fin 3) : diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/Basic.lean b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/Basic.lean index f3e8d88f2..c6058f3c5 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/Basic.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/Basic.lean @@ -476,6 +476,26 @@ lemma repLorentzGroup_conj_dual_dualBasis (Λ : SL(2,ℂ)) (j : Fin 2 × Fin 2) rw [key] simp [Fintype.sum_prod_type, ite_smul] +/-- **The centre of `SL(2,ℂ)` acts on the lepton-doublet space by `-1`**: the value space carries a + single Weyl-spinor index, and `-1` is not the identity on a half-integer spin. -/ +lemma repLorentzGroup_neg_one : repLorentzGroup (-1) = -LinearMap.id := by + apply basis.ext + intro j + obtain ⟨a, w⟩ := j + rw [repLorentzGroup_apply_basis] + fin_cases a <;> + simp [basis, Matrix.one_apply] + +/-- The centre acts on the conjugate lepton-doublet space by `-1` as well: conjugation does not + move a real sign. -/ +lemma repLorentzGroup_conj_neg_one : repLorentzGroup.conj (-1) = -LinearMap.id := by + apply basis.conj.ext + intro j + obtain ⟨a, w⟩ := j + rw [repLorentzGroup_conj_apply_basis] + fin_cases a <;> + simp [basis, Matrix.one_apply] + /-- The lepton-doublet coordinate functionals carry the contragredient gauge action: the hypercharge and `SU(2)` factors of the inverse group element, transposed. -/ lemma repGaugeGroupI_dual_dualBasis (g : GaugeGroupI) (j : Fin 2 × Fin 2) : diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/Basic.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/Basic.lean index 9e9048949..28284a5e4 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/Basic.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/Basic.lean @@ -177,6 +177,23 @@ lemma repLorentzGroup_conj_dual_dualBasis (Λ : SL(2,ℂ)) (α : Fin 2) : (Matrix.of fun l j => (Λ⁻¹).1 l j) (fun j => repLorentzGroup_conj_apply_basis Λ⁻¹ j) +/-- **The centre of `SL(2,ℂ)` acts on the charged-lepton-singlet space by `-1`**: the value + space carries a single Weyl-spinor index, and `-1` is not the identity on a half-integer + spin. -/ +lemma repLorentzGroup_neg_one : repLorentzGroup (-1) = -LinearMap.id := by + apply basis.ext + intro α + rw [repLorentzGroup_apply_basis] + fin_cases α <;> simp [Matrix.one_apply] + +/-- The centre acts on the conjugate charged-lepton-singlet space by `-1` as well: + conjugation does not move a real sign. -/ +lemma repLorentzGroup_conj_neg_one : repLorentzGroup.conj (-1) = -LinearMap.id := by + apply basis.conj.ext + intro α + rw [repLorentzGroup_conj_apply_basis] + fin_cases α <;> simp [Matrix.one_apply] + /-! ## D. Global Gauge action diff --git a/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/Basic.lean b/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/Basic.lean index 69e2d9519..286fc1ab4 100644 --- a/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/Basic.lean +++ b/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/Basic.lean @@ -601,6 +601,26 @@ lemma repLorentzGroup_conj_dual_dualBasis (Λ : SL(2,ℂ)) (j : Fin 2 × Fin 3 rw [key] simp [Fintype.sum_prod_type, ite_smul] +/-- **The centre of `SL(2,ℂ)` acts on the quark-doublet space by `-1`**: the value space carries a + single Weyl-spinor index, and `-1` is not the identity on a half-integer spin. -/ +lemma repLorentzGroup_neg_one : repLorentzGroup (-1) = -LinearMap.id := by + apply basis.ext + intro j + obtain ⟨a, c, w⟩ := j + rw [repLorentzGroup_apply_basis] + fin_cases a <;> + simp [basis, Matrix.one_apply, Module.Basis.tensorProduct_apply] + +/-- The centre acts on the conjugate quark-doublet space by `-1` as well: conjugation does not + move a real sign. -/ +lemma repLorentzGroup_conj_neg_one : repLorentzGroup.conj (-1) = -LinearMap.id := by + apply basis.conj.ext + intro j + obtain ⟨a, c, w⟩ := j + rw [repLorentzGroup_conj_apply_basis] + fin_cases a <;> + simp [basis, Matrix.one_apply, Module.Basis.tensorProduct_apply] + /-- The gauge action on the quark-doublet basis: the spinor index is inert, the colour index transforms by the `SU(3)` matrix and the weak index by the `SU(2)` matrix, scaled by the hypercharge factor. -/ diff --git a/Physlib/Particles/StandardModel/Fermions/UpSinglet/Basic.lean b/Physlib/Particles/StandardModel/Fermions/UpSinglet/Basic.lean index fd299c77c..4b5491881 100644 --- a/Physlib/Particles/StandardModel/Fermions/UpSinglet/Basic.lean +++ b/Physlib/Particles/StandardModel/Fermions/UpSinglet/Basic.lean @@ -479,6 +479,26 @@ lemma repLorentzGroup_conj_dual_dualBasis (Λ : SL(2,ℂ)) (j : Fin 2 × Fin 3) rw [key] simp [Fintype.sum_prod_type, ite_smul] +/-- **The centre of `SL(2,ℂ)` acts on the up-singlet space by `-1`**: the value space carries a + single Weyl-spinor index, and `-1` is not the identity on a half-integer spin. -/ +lemma repLorentzGroup_neg_one : repLorentzGroup (-1) = -LinearMap.id := by + apply basis.ext + intro j + obtain ⟨a, c⟩ := j + rw [repLorentzGroup_apply_basis] + fin_cases a <;> + simp [basis, Matrix.one_apply, Module.Basis.tensorProduct_apply] + +/-- The centre acts on the conjugate up-singlet space by `-1` as well: conjugation does not + move a real sign. -/ +lemma repLorentzGroup_conj_neg_one : repLorentzGroup.conj (-1) = -LinearMap.id := by + apply basis.conj.ext + intro j + obtain ⟨a, c⟩ := j + rw [repLorentzGroup_conj_apply_basis] + fin_cases a <;> + simp [basis, Matrix.one_apply, Module.Basis.tensorProduct_apply] + /-- The gauge action on the up-singlet basis: the spinor index is inert and the colour index transforms by the `SU(3)` matrix, scaled by the hypercharge factor. -/ lemma repGaugeGroupI_apply_basis (g : GaugeGroupI) (j : Fin 2 × Fin 3) : diff --git a/Physlib/Particles/StandardModel/IsFermionSector/DerivSubmodule/BoostWeightDecomposition.lean b/Physlib/Particles/StandardModel/IsFermionSector/DerivSubmodule/BoostWeightDecomposition.lean deleted file mode 100644 index 365db15d6..000000000 --- a/Physlib/Particles/StandardModel/IsFermionSector/DerivSubmodule/BoostWeightDecomposition.lean +++ /dev/null @@ -1,576 +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.IsFermionSector.Basic -public import Physlib.Relativity.Fermions.Weyl.BoostWeight -public import Physlib.Particles.StandardModel.AlgebraRealization.HiggsAlgebraCovRealization.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. - --/ - -@[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)) := - HiggsAlgebraCovRealization.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)) := - HiggsAlgebraCovRealization.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)) := - HiggsAlgebraCovRealization.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)) := - HiggsAlgebraCovRealization.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)) := - HiggsAlgebraCovRealization.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)) := - HiggsAlgebraCovRealization.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)) := - HiggsAlgebraCovRealization.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)) := - HiggsAlgebraCovRealization.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)) := - HiggsAlgebraCovRealization.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)) := - HiggsAlgebraCovRealization.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 - -/-- 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) - -end IsFermionSector - -end StandardModel - -end diff --git a/Physlib/Particles/StandardModel/IsFermionSector/DerivSubmodule/Centre.lean b/Physlib/Particles/StandardModel/IsFermionSector/DerivSubmodule/Centre.lean new file mode 100644 index 000000000..3e4a62246 --- /dev/null +++ b/Physlib/Particles/StandardModel/IsFermionSector/DerivSubmodule/Centre.lean @@ -0,0 +1,179 @@ +/- +Copyright (c) 2026 Joseph Tooby-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.LorentzGroup.Invariants.Centre +/-! +# The centre of `SL(2,ℂ)` on the fermion sector + +The fermion symbols are the only Standard Model generators of half-integer spin, and this +file records what that costs them: the element `-1` of `SL(2,ℂ)` acts on every fermion +derivative submodule by `-1`, where it acts on the Higgs and gauge ones by `+1`. + +The mechanism is uniform across the ten species. A fermion symbol `d i l φ` carries `n` +covariant-derivative slots, each a four-vector index, and one value index in the dual of a +Weyl-based representation. The derivative slots see `-1` through the Lorentz matrix, which is +the identity there (`SL2C.toLorentzGroup_neg_one`), so they do not move at all; the value +index sees it through `rep.dual`, and `repLorentzGroup_neg_one` says that the Weyl factor +turns it into a sign. `Invariants.range_le_centreEigenspace_neg_one` does this once for an +arbitrary symbol family; section A applies it to the ten species and section B joins them. + +This is the half-integer-spin obstruction of `Invariants/Centre.lean` in the form the Yukawa +and gauge-fermion classifications need: a product with an odd number of fermion factors +inherits the sign, and a subspace of sign `-1` carries no Lorentz invariant. + +- A. The ten species +- B. The fermion derivative submodules + +-/ + +@[expose] public section + +namespace StandardModel + +open Matrix MatrixGroups Lorentz Lorentz.Invariants + +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) + +/-! + +## A. The ten species + +Each species feeds `range_le_centreEigenspace_neg_one` with its own Lorentz law and the sign +of its value space. The five unbarred species are Weyl-valued and the five barred ones are +conjugate Weyl-valued; conjugation does not move a real sign, so all ten carry `-1`. + +-/ + +include h in +/-- The `d` symbols carry the sign `-1`. -/ +lemma range_d_le_centreEigenspace (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : + LinearMap.range (d f l) ≤ centreEigenspace repLorentz (-1) := + range_le_centreEigenspace_neg_one (h.repLorentz_d f) + DownSinglet.repLorentzGroup_neg_one l + +include h in +/-- The `bard` symbols carry the sign `-1`. -/ +lemma range_bard_le_centreEigenspace (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : + LinearMap.range (bard f l) ≤ centreEigenspace repLorentz (-1) := + range_le_centreEigenspace_neg_one (h.repLorentz_bard f) + DownSinglet.repLorentzGroup_conj_neg_one l + +include h in +/-- The `u` symbols carry the sign `-1`. -/ +lemma range_u_le_centreEigenspace (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : + LinearMap.range (u f l) ≤ centreEigenspace repLorentz (-1) := + range_le_centreEigenspace_neg_one (h.repLorentz_u f) + UpSinglet.repLorentzGroup_neg_one l + +include h in +/-- The `baru` symbols carry the sign `-1`. -/ +lemma range_baru_le_centreEigenspace (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : + LinearMap.range (baru f l) ≤ centreEigenspace repLorentz (-1) := + range_le_centreEigenspace_neg_one (h.repLorentz_baru f) + UpSinglet.repLorentzGroup_conj_neg_one l + +include h in +/-- The `Q` symbols carry the sign `-1`. -/ +lemma range_Q_le_centreEigenspace (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : + LinearMap.range (Q f l) ≤ centreEigenspace repLorentz (-1) := + range_le_centreEigenspace_neg_one (h.repLorentz_Q f) + QuarkDoublet.repLorentzGroup_neg_one l + +include h in +/-- The `barQ` symbols carry the sign `-1`. -/ +lemma range_barQ_le_centreEigenspace (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : + LinearMap.range (barQ f l) ≤ centreEigenspace repLorentz (-1) := + range_le_centreEigenspace_neg_one (h.repLorentz_barQ f) + QuarkDoublet.repLorentzGroup_conj_neg_one l + +include h in +/-- The `L` symbols carry the sign `-1`. -/ +lemma range_L_le_centreEigenspace (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : + LinearMap.range (L f l) ≤ centreEigenspace repLorentz (-1) := + range_le_centreEigenspace_neg_one (h.repLorentz_L f) + LeptonDoublet.repLorentzGroup_neg_one l + +include h in +/-- The `barL` symbols carry the sign `-1`. -/ +lemma range_barL_le_centreEigenspace (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : + LinearMap.range (barL f l) ≤ centreEigenspace repLorentz (-1) := + range_le_centreEigenspace_neg_one (h.repLorentz_barL f) + LeptonDoublet.repLorentzGroup_conj_neg_one l + +include h in +/-- The `e` symbols carry the sign `-1`. -/ +lemma range_e_le_centreEigenspace (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : + LinearMap.range (e f l) ≤ centreEigenspace repLorentz (-1) := + range_le_centreEigenspace_neg_one (h.repLorentz_e f) + LeptonSinglet.repLorentzGroup_neg_one l + +include h in +/-- The `bare` symbols carry the sign `-1`. -/ +lemma range_bare_le_centreEigenspace (f : Fin 3) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : + LinearMap.range (bare f l) ≤ centreEigenspace repLorentz (-1) := + range_le_centreEigenspace_neg_one (h.repLorentz_bare f) + LeptonSinglet.repLorentzGroup_conj_neg_one l + +/-! + +## B. The fermion derivative submodules + +The derivative submodule is the join over the three families, the derivative slots and the ten +species of the ranges of section A, and an eigenspace is closed under joins. + +-/ + +include h in +/-- **The centre of `SL(2,ℂ)` acts on the fermion derivative submodules by `-1`**, for any + number of covariant derivatives: every fermion symbol carries one Weyl-spinor value index, + and the derivative slots are inert at the centre. -/ +theorem derivSubmodule_le_centreEigenspace (n : ℕ) : + h.derivSubmodule n ≤ centreEigenspace repLorentz (-1) := by + rw [derivSubmodule] + refine iSup_le fun f => iSup_le fun l => ?_ + refine sup_le (sup_le (sup_le (sup_le (sup_le (sup_le (sup_le (sup_le (sup_le + (h.range_d_le_centreEigenspace f l) (h.range_bard_le_centreEigenspace f l)) + (h.range_u_le_centreEigenspace f l)) (h.range_baru_le_centreEigenspace f l)) + (h.range_Q_le_centreEigenspace f l)) (h.range_barQ_le_centreEigenspace f l)) + (h.range_L_le_centreEigenspace f l)) (h.range_barL_le_centreEigenspace f l)) + (h.range_e_le_centreEigenspace f l)) (h.range_bare_le_centreEigenspace f l) + +end IsFermionSector + +end StandardModel diff --git a/Physlib/Particles/StandardModel/IsGaugeSector/DerivSubmodule/BoostWeightDecomposition.lean b/Physlib/Particles/StandardModel/IsGaugeSector/DerivSubmodule/BoostWeightDecomposition.lean deleted file mode 100644 index a53b8da6e..000000000 --- a/Physlib/Particles/StandardModel/IsGaugeSector/DerivSubmodule/BoostWeightDecomposition.lean +++ /dev/null @@ -1,315 +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.IsGaugeSector.Basic -public import Physlib.Particles.StandardModel.AlgebraRealization.HiggsAlgebraCovRealization.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 `HiggsAlgebraCovRealization.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 HiggsAlgebraCovRealization.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 - (HiggsAlgebraCovRealization.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, - ((HiggsAlgebraCovRealization.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, - HiggsAlgebraCovRealization.trivialWeightDecomposition_piece, ite_eq_left rfl, Submodule.map_top, - iSup_pos hc, h.range_lightConeDeriv_fieldStrengthSymbol i c φ] - · rw [HiggsAlgebraCovRealization.trivialWeightDecomposition_piece, ite_eq_right (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 - -end IsGaugeSector - -end StandardModel - -end diff --git a/Physlib/Particles/StandardModel/IsGaugeSector/DerivSubmodule/Centre.lean b/Physlib/Particles/StandardModel/IsGaugeSector/DerivSubmodule/Centre.lean new file mode 100644 index 000000000..c1f35d6c0 --- /dev/null +++ b/Physlib/Particles/StandardModel/IsGaugeSector/DerivSubmodule/Centre.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.IsGaugeSector.Basic +public import Physlib.Relativity.LorentzGroup.Invariants.Centre +/-! +# The centre of `SL(2,ℂ)` on the gauge sector + +The field strength is of integer spin, so the centre of `SL(2,ℂ)` acts on its derivative +submodules by `+1`. Every index a field-strength symbol carries — the two covector indices and +the covariant-derivative slots — mixes by the Lorentz matrix, and the adjoint value index does +not see the Lorentz group at all; since `-1` covers the identity Lorentz transformation +(`SL2C.toLorentzGroup_neg_one`), nothing moves. + +This is the integer-spin half of the parity count the gauge-fermion classification runs. +Paired with `IsFermionSector.derivSubmodule_le_centreEigenspace`, which gives the fermions +`-1`, it makes the product `F ψ` carry `-1`, and a subspace of sign `-1` carries no Lorentz +invariant. + +Unlike the Higgs and fermion towers, the field-strength symbols are not of the shape +`IsLorentzCovDerivTransforms` describes — they carry two covector indices beside their +derivative slots — so the collapse at the centre is run directly on `repLorentz_F`. + +- A. The field-strength symbols +- B. The field-strength derivative submodules + +-/ + +@[expose] public section + +namespace StandardModel + +open TensorProduct Matrix MatrixGroups Lorentz Lorentz.Invariants + +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 symbols + +At the centre each of the three sums of `repLorentz_F` is a sum against a row of the identity +matrix, so each collapses to its diagonal term and the symbol is returned unchanged. + +-/ + +include h in +/-- A field-strength symbol is fixed by the centre of `SL(2,ℂ)`: all of its indices mix by the + Lorentz matrix, which is the identity there. -/ +lemma repLorentz_neg_one_F {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) (μ ν : Fin 1 ⊕ Fin 3) + (φ : Module.Dual ℝ GaugeAlgebra) : repLorentz (-1) (F l μ ν φ) = F l μ ν φ := by + rw [h.repLorentz_F (-1) n l μ ν φ, SL2C.toLorentzGroup_neg_one, Finset.sum_eq_single l] + · simp [Matrix.one_apply] + · intro p _ hp + obtain ⟨i, hi⟩ := Function.ne_iff.1 hp + rw [Finset.prod_eq_zero (Finset.mem_univ i)] + · simp + · simp [hi] + · simp + +include h in +/-- The span of a field-strength symbol family carries the sign `+1`. -/ +lemma span_range_F_le_centreEigenspace {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) + (μ ν : Fin 1 ⊕ Fin 3) : + Submodule.span ℂ (Set.range (F l μ ν)) ≤ centreEigenspace repLorentz 1 := by + refine Submodule.span_le.2 ?_ + rintro _ ⟨φ, rfl⟩ + rw [SetLike.mem_coe, mem_centreEigenspace, h.repLorentz_neg_one_F l μ ν φ, one_smul] + +/-! + +## B. The field-strength derivative submodules + +The derivative submodule is the join of the symbol spans over the derivative slots and the two +covector indices, and an eigenspace is closed under joins. + +-/ + +include h in +/-- **The centre of `SL(2,ℂ)` acts on the field-strength derivative submodules by `+1`**, for + any number of covariant derivatives: the field strength is of integer spin and every one of + its indices is inert at the centre. -/ +theorem derivSubmodule_le_centreEigenspace (n : ℕ) : + h.derivSubmodule n ≤ centreEigenspace repLorentz 1 := by + rw [derivSubmodule] + exact iSup_le fun l => iSup_le fun μ => iSup_le fun ν => + h.span_range_F_le_centreEigenspace l μ ν + +end IsGaugeSector + +end StandardModel diff --git a/Physlib/Relativity/Fermions/Weyl/BoostWeight.lean b/Physlib/Relativity/Fermions/Weyl/BoostWeight.lean index 396071f7a..0da0b5455 100644 --- a/Physlib/Relativity/Fermions/Weyl/BoostWeight.lean +++ b/Physlib/Relativity/Fermions/Weyl/BoostWeight.lean @@ -7,7 +7,7 @@ module public import Physlib.Relativity.Fermions.Weyl.LeftHanded public import Physlib.Relativity.Fermions.Weyl.RightHanded -public import Physlib.Relativity.LorentzGroup.Boosts.WeightGrading +public import Physlib.Relativity.LorentzGroup.Boosts.Axis /-! # The boost weights of a Weyl spinor diff --git a/Physlib/Relativity/IsLorentzDeriv.lean b/Physlib/Relativity/IsLorentzDeriv.lean index 3186c1477..bee98eb83 100644 --- a/Physlib/Relativity/IsLorentzDeriv.lean +++ b/Physlib/Relativity/IsLorentzDeriv.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Relativity.LorentzGroup.Boosts.WeightGrading +public import Physlib.Relativity.LorentzGroup.Boosts.Axis public import Mathlib.RepresentationTheory.Basic public import Mathlib.RingTheory.GradedAlgebra.Basic public import Mathlib.Algebra.DirectSum.Internal @@ -159,6 +159,25 @@ def IsLorentzCovDerivTransforms {k V : Type*} [CommRing k] [AddCommGroup V] (∏ i, (((SL2C.toLorentzGroup Λ).1 (p i) (l i) : ℝ) : ℂ)) • F p (rep.dual Λ φ) +/-- **At the centre the derivative slots do not mix.** The element `-1` of `SL(2,ℂ)` covers + the identity Lorentz transformation, so the sum over tuples collapses to the single term + `p = l` and only the value index moves. -/ +lemma IsLorentzCovDerivTransforms.neg_one_apply {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} + (hF : IsLorentzCovDerivTransforms repLorentz rep F) + {n : ℕ} (l : Fin n → (Fin 1 ⊕ Fin 3)) (φ : Module.Dual k V) : + repLorentz (-1) (F l φ) = F l (rep.dual (-1) φ) := by + rw [hF (-1) n l φ, SL2C.toLorentzGroup_neg_one, Finset.sum_eq_single l] + · simp + · intro p _ hp + obtain ⟨i, hi⟩ := Function.ne_iff.1 hp + rw [Finset.prod_eq_zero (Finset.mem_univ i)] + · simp + · simp [hi] + · simp + namespace IsLorentzDeriv variable {rep : Representation ℂ SL(2,ℂ) A} {D : (Fin 1 ⊕ Fin 3) → A →ₗ[ℂ] A} diff --git a/Physlib/Relativity/LightConeDeriv.lean b/Physlib/Relativity/LightConeDeriv.lean index 6a33a9b27..a39791ebf 100644 --- a/Physlib/Relativity/LightConeDeriv.lean +++ b/Physlib/Relativity/LightConeDeriv.lean @@ -5,21 +5,22 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Relativity.LorentzGroup.Boosts.WeightGrading +public import Physlib.Relativity.LorentzGroup.Boosts.Axis /-! -# Light-cone derivative symbols +# The light-cone basis of an axis -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. +A tuple 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, and `lightConeCoeffInv` the inverse change of basis. The point of the +change of basis is `sum_boostAxis_lightConeCoeff`: the four directions are eigenvectors of +the boost along the axis, of weight `lightConeWeight` — `+2` for `D₀ - Dᵢ`, `-2` for +`D₀ + Dᵢ`, and `0` for the transverse directions. -The hypothesis the development runs on is `RotatesIndices`: every index of the symbol -map is a Lorentz vector index. +On a tuple of slots the two coefficient matrices are still inverse to one another +(`sum_prod_lightConeCoeff`, `sum_prod_lightConeCoeffInv`) and the weights add +(`sum_prod_lightConeCoeff`). That is what the classification of the Lorentz invariants in +`LorentzGroup/Invariants` runs on: it writes a coefficient tensor in this basis and keeps +only the piece of total weight zero. -/ @@ -27,20 +28,7 @@ map is a Lorentz vector index. 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) +open Matrix MatrixGroups /-- 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. -/ @@ -149,16 +137,8 @@ lemma sum_prod_lightConeCoeff (i : Fin 3) {n : ℕ} (c : Fin n → Fin 4) _ = ((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 - -/-- The scalar behind `f_eq_sum_lightConeDeriv`: the two coefficient matrices are inverse - slot by slot, hence inverse on multi-indices. -/ +/-- The two coefficient matrices are inverse slot by slot, hence inverse on multi-indices; + this is `sum_prod_lightConeCoeff` with the two factors the other way round. -/ 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 @@ -179,61 +159,4 @@ lemma sum_prod_lightConeCoeffInv (i : Fin 3) {n : ℕ} (d e : Fin n → Fin 1 obtain ⟨j, hj⟩ := Function.ne_iff.1 hde exact Finset.prod_eq_zero (Finset.mem_univ j) (ite_eq_right 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, ite_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) - end Lorentz diff --git a/Physlib/Relativity/LorentzGroup/Boosts/WeightGrading.lean b/Physlib/Relativity/LorentzGroup/Boosts/WeightGrading.lean deleted file mode 100644 index 53ae2986b..000000000 --- a/Physlib/Relativity/LorentzGroup/Boosts/WeightGrading.lean +++ /dev/null @@ -1,246 +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.Relativity.LorentzGroup.Boosts.Axis -public import Mathlib.RepresentationTheory.Basic -public import Mathlib.LinearAlgebra.Eigenspace.Basic -public import Mathlib.Algebra.Group.Pointwise.Finset.Basic -/-! -# Boost weights of representations of `SL(2,ℂ)` - -## i. Overview - -An element of a representation of `SL(2,ℂ)` has boost weight `k` along the `i`-th spatial -axis when the one-parameter boost family along that axis scales it by `t ^ k`; -`boostWeightSubmodule rep i k` collects these elements. Weights add under multiplication, -and the weight spaces sit in eigenspaces of a single boost at distinct eigenvalues, so they -are independent. That is all the Standard Model needs of them: an invariant of the group has -boost weight zero along every axis, so a weight-zero vector of a join of weight spaces lies -in the weight-zero one. - -A `WeightDecomposition` records a finitely supported family of subspaces of pure boost -weight joining to a given submodule; it is transported along equalities and joined here. The -product of two decompositions, which needs only multiplicativity of the representation, is -built where it is used, in `CovAlgebraRealization/YukawaSector/MassDimLTEight.lean`, together -with the parity argument that a submodule of odd boost weights carries no invariant. - -## ii. Key results - -- `boostWeightSubmodule` : the weight-`k` space along the `i`-th axis. -- `mul_mem_boostWeightSubmodule` : weights add under multiplication. -- `boostWeightSubmodule_iSupIndep` : the weight spaces are independent. -- `mem_boostWeightSubmodule_zero_of_invariant` and `mem_of_mem_iSup_of_boostWeight_zero` : - an invariant has weight zero, and lies in the weight-zero term of any join of weight - spaces containing it. -- `WeightDecomposition`, with its transport `copy` and join `sup`. - -## iii. Table of contents - -- A. Boost weights -- B. Independence of the weight spaces -- C. Weight decompositions of submodules - --/ - -@[expose] public section - -namespace Lorentz - -open Matrix MatrixGroups - -/-! - -## A. Boost weights - --/ - -namespace BoostWeight - -variable {K : Type*} [Field K] [Algebra ℝ K] -variable {M : Type*} [AddCommGroup M] [Module K M] -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 along the `i`-th axis: the vectors scaling by - `t ^ w` under the boost along that axis 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 (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 (Lorentz.SL2C.boostAxis i t ht) x = (algebraMap ℝ K t) ^ w • x := Iff.rfl - -variable {A : Type*} [Ring A] [Algebra K A] - -/-- Weights add under multiplication, when the representation is multiplicative. -/ -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)] - -/-! - -## B. Independence of the weight spaces - -The weight-`k` space lies in the `2 ^ k` eigenspace of the boost at parameter two, and -distinct weights give distinct eigenvalues, so the weight spaces are independent. An -invariant of the group has weight zero along every axis; written as a sum of vectors of -definite weight it is therefore the weight-zero term, and a weight-zero vector of a join of -weight spaces lies in the weight-zero one. - --/ - -/-- The weight space of weight `k` sits inside the `2 ^ k` eigenspace of the boost at - parameter two. -/ -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 - 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 (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 M)).comp - zpow_algebraMap_two_injective).mono fun k => boostWeightSubmodule_le_eigenspace rep k - -/-- A vector fixed by the whole group has boost weight zero along every axis. -/ -lemma mem_boostWeightSubmodule_zero_of_invariant {rep : Representation K SL(2,ℂ) M} {x : M} - (hinv : ∀ g : SL(2,ℂ), rep g x = x) (i : Fin 3) : - x ∈ boostWeightSubmodule rep i 0 := by - rw [mem_boostWeightSubmodule] - intro t ht - rw [hinv, zpow_zero, one_smul] - -/-- Vectors of distinct boost weights adding to zero are each zero. -/ -lemma eq_zero_of_sum_mem_boostWeightSubmodule {rep : Representation K SL(2,ℂ) M} - {s : Finset ℤ} {w : ℤ → M} (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 vector written as a sum of definite weights equals the weight-zero - term. -/ -lemma eq_component_zero_of_mem_boostWeightSubmodule {rep : Representation K SL(2,ℂ) M} - {s : Finset ℤ} {w : ℤ → M} {x : M} (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 - -/-- If each `S m` lies in the weight-`m` space, a weight-zero vector of their join lies in - `S 0`. -/ -lemma mem_of_mem_iSup_of_boostWeight_zero {rep : Representation K SL(2,ℂ) M} {i : Fin 3} - {S : ℤ → Submodule K M} (hS : ∀ m : ℤ, S m ≤ boostWeightSubmodule rep i m) {x : M} - (hx : x ∈ ⨆ m, S m) (h0 : x ∈ boostWeightSubmodule rep i 0) : x ∈ S 0 := by - 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 _) ?_ - · 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] - -/-! - -## 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`. -/ -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 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 : (⨆ k, piece k) = V - -namespace WeightDecomposition - -variable {rep : Representation K SL(2,ℂ) M} {V₁ V₂ : Submodule K M} - -/-- Transport a weight decomposition along an equality of submodules. -/ -def copy (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 (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 (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 (d₁ : WeightDecomposition rep i V₁) (d₂ : WeightDecomposition rep i V₂) - (k : ℤ) : (d₁.sup d₂).piece k = d₁.piece k ⊔ d₂.piece k := rfl - -end WeightDecomposition - -end BoostWeight - -end Lorentz - -end diff --git a/Physlib/Relativity/LorentzGroup/Invariants/Centre.lean b/Physlib/Relativity/LorentzGroup/Invariants/Centre.lean new file mode 100644 index 000000000..9a2fa53b1 --- /dev/null +++ b/Physlib/Relativity/LorentzGroup/Invariants/Centre.lean @@ -0,0 +1,168 @@ +/- +Copyright (c) 2026 Joseph Tooby-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.IsLorentzDeriv +/-! +# Lorentz invariants of a half-integer spin + +The other files of this folder classify the invariants of a given index pattern by contracting +the components with a coefficient tensor. This one settles, in one step and for every pattern +at once, the patterns that carry no invariant for the crudest of reasons: they are of +half-integer spin, and a half-integer spin has no invariant because the centre of `SL(2,ℂ)` +already tells integer spin from half-integer spin apart. + +The element `-1` of `SL(2,ℂ)` covers the identity Lorentz transformation +(`SL2C.toLorentzGroup_neg_one`), so a representation of `SL(2,ℂ)` that factors through the +Lorentz group — a tensor of four-vector indices — sends it to the identity, while each Weyl +index contributes a sign. A subspace with an odd number of Weyl indices therefore lies in the +`-1` eigenspace of `repLorentz (-1)`, and a vector both fixed by the group and negated by `-1` +is zero. `centreEigenspace` names the eigenspace, `mul_le_centreEigenspace` multiplies the two +signs in a product of subspaces, and `mem_of_invariant_of_mem_sup_centreEigenspace_neg_one` is +the classification modulo a Lorentz-stable subspace `S`, the form the Standard Model files use. + +The subspaces that arise there are spans of symbol families, so section B reads the sign of +such a span off the sign of the value space: the covariant-derivative slots of a family +obeying `IsLorentzCovDerivTransforms` are inert at the centre, and only the value index moves. + +This replaces, for the Standard Model sectors, the boost-weight parity count: odd boost weight +along a spatial axis and a sign of `-1` at the centre are the same statement about the same +subspaces, and the centre needs neither a grading nor a light-cone basis to say it. + +- A. The sign a subspace carries at the centre +- B. The sign of a symbol family +- C. Signs multiply +- D. The classification modulo a Lorentz-stable submodule +-/ + +@[expose] public section + +namespace Lorentz + +open Matrix MatrixGroups + +namespace Invariants + +variable {V : Type*} [AddCommGroup V] [Module ℂ V] + +/-! + +## A. The sign a subspace carries at the centre + +The centre of `SL(2,ℂ)` is `±1` and squares to the identity, so `repLorentz (-1)` is an +involution and the only signs on offer are `±1`. A tensor of four-vector indices carries `1`, +a Weyl index carries `-1`, and nothing else is needed of the pattern. + +-/ + +/-- The subspace on which the centre of `SL(2,ℂ)` acts by the scalar `ε`: an integer spin + sits at `ε = 1` and a half-integer spin at `ε = -1`. -/ +def centreEigenspace (repLorentz : Representation ℂ SL(2,ℂ) V) (ε : ℂ) : Submodule ℂ V := + Module.End.eigenspace (repLorentz (-1)) ε + +/-- Membership of `centreEigenspace` unfolded: the centre scales the vector by `ε`. -/ +lemma mem_centreEigenspace {repLorentz : Representation ℂ SL(2,ℂ) V} {ε : ℂ} {x : V} : + x ∈ centreEigenspace repLorentz ε ↔ repLorentz (-1) x = ε • x := by + simp [centreEigenspace] + +/-- Dualising a representation preserves the sign at the centre: `-1` is its own inverse, so + the contragredient action of the centre is the transpose of a scalar. -/ +lemma dual_neg_one_eq_smul_id {rep : Representation ℂ SL(2,ℂ) V} {ε : ℂ} + (hrep : rep (-1) = ε • LinearMap.id) : rep.dual (-1) = ε • LinearMap.id := by + ext φ x + have hinv : (-1 : SL(2,ℂ))⁻¹ = -1 := by simp + simp [Representation.dual_apply, Module.Dual.transpose_apply, hinv, hrep] + +/-! + +## B. The sign of a symbol family + +A family of symbols transforming as the covariant derivatives of a field valued in `V` carries +at the centre the sign that `V` does. The derivative slots mix by the Lorentz matrix, which is +the identity at the centre, so they contribute nothing; the value index moves by `rep.dual`, +which carries the sign of `rep` by section A. Both signs that occur are recorded, `ε = 1` for +the Lorentz-scalar value spaces and `ε = -1` for the Weyl ones. + +-/ + +variable {A : Type} [Ring A] [Algebra ℂ A] + +/-- **The span of one symbol family carries the sign of its value space.** -/ +lemma range_le_centreEigenspace {repLorentz : Representation ℂ SL(2,ℂ) A} + {rep : Representation ℂ SL(2,ℂ) V} + {F : {n : ℕ} → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] A} + (hF : IsLorentzCovDerivTransforms repLorentz rep F) {ε : ℂ} + (hrep : rep (-1) = ε • LinearMap.id) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : + LinearMap.range (F l) ≤ centreEigenspace repLorentz ε := by + rintro _ ⟨φ, rfl⟩ + rw [mem_centreEigenspace, hF.neg_one_apply l φ, dual_neg_one_eq_smul_id hrep] + simp + +/-- The half-integer case of `range_le_centreEigenspace`, in the form the Weyl value spaces + state their sign. -/ +lemma range_le_centreEigenspace_neg_one {repLorentz : Representation ℂ SL(2,ℂ) A} + {rep : Representation ℂ SL(2,ℂ) V} + {F : {n : ℕ} → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ V →ₗ[ℂ] A} + (hF : IsLorentzCovDerivTransforms repLorentz rep F) + (hrep : rep (-1) = -LinearMap.id) {n : ℕ} (l : Fin n → Fin 1 ⊕ Fin 3) : + LinearMap.range (F l) ≤ centreEigenspace repLorentz (-1) := + range_le_centreEigenspace hF (by rw [hrep]; module) l + +/-! + +## C. Signs multiply + +The Lorentz action on the field algebra is by algebra maps, so the sign a product carries is +the product of the signs of its factors. This is the whole of the bookkeeping that the +boost-weight convolution used to do: two Weyl indices cancel and an odd number does not. + +-/ + +/-- The sign of a product is the product of the signs. -/ +lemma mul_le_centreEigenspace {repLorentz : Representation ℂ SL(2,ℂ) A} + (hmul : ∀ (Λ : SL(2,ℂ)) (x y : A), repLorentz Λ (x * y) = repLorentz Λ x * repLorentz Λ y) + {W₁ W₂ : Submodule ℂ A} {ε₁ ε₂ : ℂ} (h₁ : W₁ ≤ centreEigenspace repLorentz ε₁) + (h₂ : W₂ ≤ centreEigenspace repLorentz ε₂) : + W₁ * W₂ ≤ centreEigenspace repLorentz (ε₁ * ε₂) := by + refine Submodule.mul_le.2 fun a ha b hb => ?_ + rw [mem_centreEigenspace, hmul, mem_centreEigenspace.1 (h₁ ha), + mem_centreEigenspace.1 (h₂ hb), Algebra.smul_mul_assoc, Algebra.mul_smul_comm, smul_smul] + +/-! + +## D. The classification modulo a Lorentz-stable submodule + +A vector of a subspace of sign `-1` that the group fixes is negated by `-1` and fixed by it at +once, so it is zero. Modulo a stable subspace `S` the same count leaves twice the vector inside +`S`, and halving is allowed over `ℂ`; no quotient representation is needed. + +-/ + +/-- **A subspace of half-integer spin carries no Lorentz invariant beyond a Lorentz-stable + submodule `S`**: an invariant of the join with `S` already lies in `S`. Writing the invariant + as `v + s`, invariance under the centre gives `2 • v = repLorentz (-1) s - s`, which lies in + `S`, and so does `v`. -/ +lemma mem_of_invariant_of_mem_sup_centreEigenspace_neg_one + {repLorentz : Representation ℂ SL(2,ℂ) A} {W : Submodule ℂ A} + (hW : W ≤ centreEigenspace repLorentz (-1)) (S : Submodule ℂ A) + (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) {x : A} (hx : x ∈ W ⊔ S) + (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by + obtain ⟨v, hv, s, hs, rfl⟩ := Submodule.mem_sup.1 hx + have hcentre : repLorentz (-1) (v + s) = -v + repLorentz (-1) s := by + rw [map_add, mem_centreEigenspace.1 (hW hv)] + module + have htwo : (2 : ℂ) • v = repLorentz (-1) s - s := by + have hfix := hinv (-1) + rw [hcentre] at hfix + linear_combination (norm := module) -hfix + have hvS : v ∈ S := by + have : (2 : ℂ) • v ∈ S := htwo ▸ S.sub_mem (hS (-1) s hs) hs + simpa using S.smul_mem (2 : ℂ)⁻¹ this + exact S.add_mem hvS hs + +end Invariants + +end Lorentz diff --git a/Physlib/Relativity/SL2C/Basic.lean b/Physlib/Relativity/SL2C/Basic.lean index 48b177d0e..a2d8cf5b1 100644 --- a/Physlib/Relativity/SL2C/Basic.lean +++ b/Physlib/Relativity/SL2C/Basic.lean @@ -202,6 +202,18 @@ lemma toLorentzGroup_eq_pauliBasis' (M : SL(2, ℂ)) : PauliMatrix.pauliBasis' PauliMatrix.pauliBasis' (toSelfAdjointMap M) := by rfl +/-- **The centre of `SL(2, ℂ)` covers the identity Lorentz transformation.** The covering + map sandwiches, `A ↦ M A Mᴴ`, so the two signs of `-1` cancel. Together with + `_root_.map_one` this says that the covering map is two-to-one. -/ +lemma toLorentzGroup_neg_one : toLorentzGroup (-1) = 1 := by + ext1 + have h : toSelfAdjointMap (-1) = LinearMap.id := by + ext1 A + simp [toSelfAdjointMap] + show toMatrix (-1) = _ + simp only [toMatrix, MonoidHom.coe_mk, OneHom.coe_mk, h, LinearMap.toMatrix_id] + rfl + lemma toSelfAdjointMap_basis (i : Fin 1 ⊕ Fin 3) : toSelfAdjointMap M (PauliMatrix.pauliBasis' i) = ∑ j, (toLorentzGroup M).1 j i • PauliMatrix.pauliBasis' j := by From 63435205fe0a5d90ae4cf64c4c0ce5e8251b488a Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 22 Sep 2026 16:14:27 +0200 Subject: [PATCH 351/367] refactor: Remove old file --- Physlib.lean | 1 - Physlib/Particles/LagrangianTheory/Basic.lean | 107 ------------------ .../StandardModel/GaugeAlgebra/Basic.lean | 2 +- .../GaugeAlgebra/JetGaugeAlgebra.lean | 2 +- .../GaugeGroup/MaurerCartan/Basic.lean | 2 +- 5 files changed, 3 insertions(+), 111 deletions(-) delete mode 100644 Physlib/Particles/LagrangianTheory/Basic.lean diff --git a/Physlib.lean b/Physlib.lean index c6f1b2939..a9c250be0 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -288,7 +288,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.LagrangianTheory.Basic public import Physlib.Particles.NeutrinoPhysics.Basic public import Physlib.Particles.QED.Basic public import Physlib.Particles.QED.CurrentCoupling diff --git a/Physlib/Particles/LagrangianTheory/Basic.lean b/Physlib/Particles/LagrangianTheory/Basic.lean deleted file mode 100644 index 1d02e9bbb..000000000 --- a/Physlib/Particles/LagrangianTheory/Basic.lean +++ /dev/null @@ -1,107 +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 Physlib.Relativity.DerivAlgebra -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 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 -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 -public import Physlib.Relativity.SL2C.Basic -/-! - -# The basis of the dual real jet-slot algebra - -## i. Overview - -`LagrangianTheory.dualRealJetAlgebraBasis` is the basis of the symmetric algebra of dual real -jet slots `SymmetricAlgebra ℝ (Module.Dual ℝ Lorentz.CoVector)`, indexed by multisets of -spacetime indices. It is the multiset-indexed basis used throughout the gauge-boson jet -algebra (`GaugeBoson/LocalGaugeFieldAlgebra`) to name a monomial in the derivative slots by the -multiset of spacetime indices it carries. - --/ - -@[expose] public section - -open Matrix MatrixGroups Module TensorProduct - -namespace LagrangianTheory - -/-- 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 - -/-- 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 - -end LagrangianTheory diff --git a/Physlib/Particles/StandardModel/GaugeAlgebra/Basic.lean b/Physlib/Particles/StandardModel/GaugeAlgebra/Basic.lean index 35f560e9b..36303e2f7 100644 --- a/Physlib/Particles/StandardModel/GaugeAlgebra/Basic.lean +++ b/Physlib/Particles/StandardModel/GaugeAlgebra/Basic.lean @@ -13,7 +13,7 @@ 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.Relativity.DerivAlgebra public import Mathlib.RingTheory.MvPowerSeries.Derivative public import Physlib.Mathematics.MvPolynomialTranslation public import Mathlib.Algebra.MvPolynomial.Derivation diff --git a/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean b/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean index d60043ffa..378c71e93 100644 --- a/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean +++ b/Physlib/Particles/StandardModel/GaugeAlgebra/JetGaugeAlgebra.lean @@ -14,7 +14,7 @@ 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.Relativity.DerivAlgebra public import Mathlib.RingTheory.MvPowerSeries.Derivative public import Physlib.Mathematics.MvPolynomialTranslation public import Mathlib.Algebra.MvPolynomial.Derivation diff --git a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean index 2bbbe0283..1c706b5fd 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean @@ -14,7 +14,7 @@ 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.Relativity.DerivAlgebra public import Mathlib.RingTheory.MvPowerSeries.Derivative public import Physlib.Mathematics.MvPolynomialTranslation public import Mathlib.Algebra.MvPolynomial.Derivation From d81d8424ad322af986e013c0651f745233b5d23b Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Tue, 22 Sep 2026 17:12:39 +0200 Subject: [PATCH 352/367] feat: Reduce IsSU3BiAdjiont using Fable 5.1 --- .../GaugeGroup/Invariants/IsSU3BiAdjoint.lean | 1112 +++++------------ 1 file changed, 281 insertions(+), 831 deletions(-) diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiAdjoint.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiAdjoint.lean index 9d636040b..a1fb611b2 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiAdjoint.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiAdjoint.lean @@ -11,52 +11,31 @@ public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.Basic /-! # Gauge tensors carrying two `su(3)` adjoint indices -A gluon field strength `F^a` carries one colour index `a`, running over the eight Gell-Mann -directions of `su(3)`. A product of two field strengths carries two, and the combination -that enters the Yang–Mills Lagrangian is the colour trace `∑ a, F^a F^a`. This file proves -the group theory behind that choice, in the form the Standard Model files consume: among -all combinations of the components of such a product, the multiples of the trace are the -only ones every colour rotation leaves alone. In the language of representation theory, -`8 ⊗ 8 = 1 ⊕ 8 ⊕ 8 ⊕ 10 ⊕ 10̄ ⊕ 27` contains exactly one singlet, the Kronecker delta. - -`IsSU3BiAdjoint B repGauge T` records the hypothesis. `T` is a family indexed by two colour -indices and valued in a module `B` carrying a representation `repGauge` of the gauge group, -and a colour rotation `U ∈ SU(3)` moves its components by two copies of the adjoint matrix -of `U`, as a rank two tensor `T^{a b}` should. Nothing is asked of the isospin and -hypercharge factors: a product of coloured fields may well carry hypercharge, and the -conclusions are accordingly about invariance under colour. - -The theorem, `mem_span_sup_su3_invariant_iff`, is stated modulo a colour-stable submodule -`S`, because the Standard Model files handle many families at once and peel them off one -at a time: a colour invariant in the span of the components joined with `S` is a multiple -of the trace contraction up to a colour-invariant error in `S`. - -The proof has two halves, and neither needs more than the module structure of `B`. - -The first half is the linear algebra of `Invariants.Basic`. A vector of the span is -`∑ l, c l • T l` for a coefficient function `c` on pairs of colour indices, and a colour -rotation acts on `c` by the Kronecker square of its adjoint matrix, a unitary action. So an -invariant vector of the span is the contraction of an invariant coefficient -(`Family.exists_invariant_coeff`), and the question becomes a finite one. - -The second half is a finite computation. An invariant coefficient is a bilinear form on -colour coordinates fixed by every colour rotation, and a handful of explicit rotations pin -it down. The colour parities, the diagonal sign matrices of `SU(3)`, scale each Gell-Mann -direction by a sign and kill every entry joining two directions of different sign pattern. -The cyclic permutation and the transposition of colours, the Weyl group, equate the diagonal -entries along the root directions, equate them in the Cartan plane and kill the -antisymmetric entries. Two rotations inside the `SU(2)` of the first two colours carry a -Cartan direction onto the two members of a root pair and tie the Cartan entries to the root -entries. So the form is a multiple of the Kronecker delta and the vector a multiple of the -trace. - -Section A sets up the adjoint matrix and the transformation law. Section B has the span, -the action on coefficients and the trace contraction. Section C has the coordinate vectors -of one index, section D computes the rotations on them, section E is the finite -computation, section F classifies the invariants of the span, and section G divides out a -stable submodule and proves the theorem. An aside at the end holds what other files import -from here and the theorem does not use: the weight basis of the adjoint and the gauge form -of the theorem. +A product of two gluon field strengths carries two colour indices, and the only combination +of its components fixed by every colour rotation is the trace `∑ a, F^a F^a`: in +`8 ⊗ 8 = 1 ⊕ 8 ⊕ 8 ⊕ 10 ⊕ 10̄ ⊕ 27` the one singlet is the Kronecker delta. `IsSU3BiAdjoint` +records a family indexed by two colour indices that each colour rotation `U ∈ SU(3)` moves by +two copies of the adjoint matrix of `U`, and `mem_span_sup_invariant_iff` says that a gauge +invariant in its span, modulo a gauge-stable submodule `S`, is a multiple of the trace modulo +`S`. The isospin and hypercharge factors are unconstrained throughout. + +A vector of the span is `∑ l, c l • T l`, and a rotation moves it by moving the coefficient +`c` with the Kronecker square of its adjoint matrix, a unitary action, so by +`Family.exists_invariant_coeff` an invariant is the contraction of an invariant coefficient (B). +Such a coefficient is a bilinear form on colour coordinates fixed by every rotation, and five +rotations pin it down to a multiple of the delta (C–E): the three colour parities and a turn +in the `SU(2)` of the first two colours, which permute Gell-Mann directions up to sign, and +the cyclic permutation of colours, which also rotates the Cartan plane. The result descends to +the quotient by a stable submodule (F, G). + +- A. The adjoint matrix and the transformation law +- B. Coefficients, their action and the trace +- C. Coordinate vectors of one index +- D. Five colour rotations on the Gell-Mann directions +- E. An invariant coefficient is a multiple of the Kronecker delta +- F. The colour invariants of the span +- Aside: the weight basis of the adjoint, for `MassDimEight` +- G. The invariants modulo a stable submodule -/ @[expose] public section @@ -67,15 +46,14 @@ open Matrix /-! -## A. The adjoint action of `SU(3)` on a colour index +## A. The adjoint matrix and the transformation law -## A.1. The adjoint matrix - -Conjugating a Gell-Mann matrix by `U ∈ SU(3)` gives another traceless hermitian matrix, -and `su3AdjointMatrix U` holds its coordinates in the Gell-Mann basis, read off with the -trace pairing. By definition it is the `su(3)` block of `GaugeAlgebra.adjointMatrix` at the -colour rotation `(U, 1, 1)`, so it is orthogonal, the identity at `U = 1` and transposed at -`U⁻¹`, all of which is inherited from there. +`su3AdjointMatrix U` holds the Gell-Mann coordinates of the Gell-Mann matrices conjugated by +`U`. It is the `su(3)` block of `GaugeAlgebra.adjointMatrix` at the colour rotation `(U, 1, 1)`, +so it is orthogonal and transposed at `U⁻¹`. A family is bi-adjoint when a colour rotation +moves its components by one factor of the adjoint matrix per index, the summed index in the +row slot: `IsSU3BiAdjointMat` for one linear map and one `U`, `IsSU3BiAdjoint` for +`repGauge (U, 1, 1)` at every `U`. -/ @@ -86,7 +64,6 @@ noncomputable def su3AdjointMatrix (U : specialUnitaryGroup (Fin 3) ℂ) : Matrix.of fun i j => 2⁻¹ * (Matrix.trace (gellMannMatrix i * (U.1 * gellMannMatrix j * star U.1))).re -/-- The entries of the adjoint matrix. -/ @[simp] lemma su3AdjointMatrix_apply (U : specialUnitaryGroup (Fin 3) ℂ) (i j : Fin 8) : su3AdjointMatrix U i j @@ -99,47 +76,20 @@ lemma sum_su3AdjointMatrix_row_mul (U : specialUnitaryGroup (Fin 3) ℂ) (c d : = if c = d then 1 else 0 := GaugeAlgebra.sum_adjointMatrix_inl_row_mul (U, 1, 1) c d -/-- The adjoint matrix of the identity is the identity. -/ -lemma su3AdjointMatrix_one (a b : Fin 8) : - su3AdjointMatrix 1 a b = if a = b then 1 else 0 := by - have h := congrFun (congrFun GaugeAlgebra.adjointMatrix_one (Sum.inl a)) (Sum.inl b) - rw [Matrix.one_apply] at h - simpa [su3AdjointMatrix_apply] using h - /-- The adjoint matrix of the inverse is the transpose. -/ lemma su3AdjointMatrix_inv (U : specialUnitaryGroup (Fin 3) ℂ) (a b : Fin 8) : su3AdjointMatrix U⁻¹ a b = su3AdjointMatrix U b a := by have h := GaugeAlgebra.adjointMatrix_inv_apply (U, 1, 1) (Sum.inl a) (Sum.inl b) rwa [show ((U, 1, 1) : GaugeGroupI)⁻¹ = (U⁻¹, 1, 1) from by simp] at h -/-- The Gell-Mann matrices are orthonormal for the trace pairing: this is the adjoint - matrix of the identity, read entry by entry. -/ -lemma re_trace_gellMannMatrix_mul (a b : Fin 8) : - 2⁻¹ * (Matrix.trace (gellMannMatrix a * gellMannMatrix b)).re - = if a = b then 1 else 0 := by - rw [← su3AdjointMatrix_one a b, su3AdjointMatrix_apply] - simp - /-- An entry of the adjoint matrix is a Gell-Mann coordinate of a conjugated Gell-Mann - matrix. -/ + matrix, which is how the rotations of section D are computed. -/ 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 families - -The transformation law carries one factor of the adjoint matrix per index, with the summed -index in the row slot. `IsSU3BiAdjointMat` records it for one linear map and one element -of `SU(3)`, and `IsSU3BiAdjoint` asks it of the colour rotation `(U, 1, 1)` for every `U`. -Since `U ↦ (U, 1, 1)` is a homomorphism this is an action of `SU(3)`, and it is all that -is assumed. - --/ - /-- The linear map `f` moves the components of `T` as `U ∈ SU(3)` moves a tensor with two adjoint indices: one factor of the adjoint matrix per index. -/ def IsSU3BiAdjointMat {B : Type*} [AddCommMonoid B] [Module ℂ B] @@ -149,9 +99,8 @@ def IsSU3BiAdjointMat {B : Type*} [AddCommMonoid B] [Module ℂ B] 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 b}` under the colour factor of the gauge group. Nothing is asked of the - isospin and hypercharge factors. -/ +/-- A family `T` of elements of `B`, indexed by two `su(3)` adjoint indices, transforms as a + tensor `T^{a b}` under the colour factor of the gauge group. -/ structure IsSU3BiAdjoint (B : Type*) [AddCommMonoid B] [Module ℂ B] (repGauge : Representation ℂ GaugeGroupI B) (T : (Fin 2 → Fin 8) → B) : Prop where @@ -160,9 +109,8 @@ structure IsSU3BiAdjoint (B : Type*) [AddCommMonoid B] [Module ℂ B] namespace IsSU3BiAdjoint -/- `span`, `traceContraction` and `biVec` take the hypothesis `hT` only to hang off it by -dot notation, and `mem_span_sup_invariant_iff` keeps a hypothesis for its caller; each is -marked `nolint unusedArguments` where it is declared. -/ +/- `span` and `traceContraction` take the hypothesis `hT` only to hang off it by dot +notation, and `mem_span_sup_invariant_iff` keeps a hypothesis for its caller. -/ set_option linter.unusedVariables false variable {B : Type*} [AddCommGroup B] [Module ℂ B] @@ -173,13 +121,11 @@ variable {B : Type*} [AddCommGroup B] [Module ℂ B] ## B. Coefficients, their action and the trace A vector of the span of the components is a contraction `∑ l, c l • T l` against a -coefficient function `c` on pairs of colour indices, and the transformation law says exactly -that a colour rotation moves such a contraction by moving `c` with the Kronecker square of -its adjoint matrix, `act U`. Orthogonality of the adjoint matrix makes `act U⁻¹` the +coefficient `c` on pairs of colour indices, and a colour rotation moves it by moving `c` with +the Kronecker square `act U` of its adjoint matrix. Orthogonality makes `act U⁻¹` the transpose of `act U`, and the matrix being real, `act U` commutes with conjugation: these are -the two hypotheses of `Family.exists_invariant_coeff`. The trace contraction -`∑ a, T ![a, a]` is the contraction against the Kronecker delta `traceCoeff`, and it is -colour invariant because the delta is an invariant coefficient. +the two hypotheses of `Family.exists_invariant_coeff`. The trace contraction `∑ a, T ![a, a]` +is fixed by every rotation because the rows of the adjoint matrix are orthonormal. -/ @@ -187,32 +133,20 @@ colour invariant because the delta is an invariant coefficient. @[nolint unusedArguments] def span (hT : IsSU3BiAdjoint B repGauge T) : Submodule ℂ B := ⨆ d, ℂ ∙ T d -/-- A vector lies in the span precisely when it is a linear combination of the - components. -/ -lemma mem_span_iff (hT : IsSU3BiAdjoint B repGauge T) (x : B) : - x ∈ hT.span ↔ ∃ (c : (Fin 2 → Fin 8) → ℂ), x = ∑ d, c d • T d := - Family.mem_iSup_span_singleton_iff T x - -/-- A sum over pairs of colour 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] := - Family.sum_pi_two F - -/-- The action of `U ∈ SU(3)` on coefficient functions: the Kronecker square of its - adjoint matrix. -/ +/-- The action of `U ∈ SU(3)` on coefficients: the Kronecker square of its adjoint + matrix. -/ noncomputable def act (U : specialUnitaryGroup (Fin 3) ℂ) : ((Fin 2 → Fin 8) → ℂ) →ₗ[ℂ] (Fin 2 → Fin 8) → ℂ := Matrix.toLin' (Matrix.of fun a l => ∏ i : Fin 2, ((su3AdjointMatrix U (a i) (l i) : ℝ) : ℂ)) -/-- The action on coefficients, written out. -/ lemma act_apply (U : specialUnitaryGroup (Fin 3) ℂ) (c : (Fin 2 → Fin 8) → ℂ) (a : Fin 2 → Fin 8) : act U c a = ∑ l, (∏ i : Fin 2, ((su3AdjointMatrix U (a i) (l i) : ℝ) : ℂ)) * c l := by simp [act, Matrix.mulVec, dotProduct] -/-- The transformation law in coefficient form: a map moving the components by `U` moves a - contraction by `act U` on its coefficients. -/ +/-- A map moving the components by `U` moves a contraction by `act U` on its + coefficients. -/ lemma map_sum_smul {U : specialUnitaryGroup (Fin 3) ℂ} {f : B →ₗ[ℂ] B} (hf : IsSU3BiAdjointMat U f T) (c : (Fin 2 → Fin 8) → ℂ) : f (∑ l, c l • T l) = ∑ a, act U c a • T a := by @@ -222,72 +156,43 @@ lemma map_sum_smul {U : specialUnitaryGroup (Fin 3) ℂ} {f : B →ₗ[ℂ] B} rw [hf l, Finset.smul_sum] exact Finset.sum_congr rfl fun a _ => by rw [smul_smul, mul_comm] -/-- The action of `U⁻¹` is the transpose of the action of `U`, the adjoint matrix being - orthogonal. -/ +/-- The action of `U⁻¹` is the transpose of the action of `U`. -/ lemma sum_act_mul (U : specialUnitaryGroup (Fin 3) ℂ) (c d : (Fin 2 → Fin 8) → ℂ) : ∑ a, act U c a * d a = ∑ l, c l * act U⁻¹ d l := by simp only [act_apply, su3AdjointMatrix_inv, Finset.sum_mul, Finset.mul_sum] rw [Finset.sum_comm] exact Finset.sum_congr rfl fun l _ => Finset.sum_congr rfl fun a _ => by ring -/-- The action on coefficients commutes with complex conjugation, the adjoint matrix being - real. -/ +/-- The action on coefficients commutes with complex conjugation. -/ lemma act_star (U : specialUnitaryGroup (Fin 3) ℂ) (c : (Fin 2 → Fin 8) → ℂ) : act U (star c) = star (act U c) := by funext a simp [act_apply, star_sum, star_mul', Complex.conj_ofReal] -/-- The Kronecker delta on pairs of colour indices: the coefficients of the trace. -/ -def traceCoeff : (Fin 2 → Fin 8) → ℂ := fun l => if l 0 = l 1 then 1 else 0 - -/-- The Kronecker delta is an invariant coefficient: the rows of the adjoint matrix are - orthonormal. -/ -lemma act_traceCoeff (U : specialUnitaryGroup (Fin 3) ℂ) : act U traceCoeff = traceCoeff := by - funext a - rw [act_apply, sum_pi_two] - have key : ∀ x y : Fin 8, - (∏ i : Fin 2, ((su3AdjointMatrix U (a i) (![x, y] i) : ℝ) : ℂ)) * traceCoeff ![x, y] - = if y = x then - ((su3AdjointMatrix U (a 0) x * su3AdjointMatrix U (a 1) x : ℝ) : ℂ) else 0 := by - intro x y - by_cases h : y = x - · subst h - simp [traceCoeff, Fin.prod_univ_two] - · simp [traceCoeff, Fin.prod_univ_two, h, Ne.symm h] - simp only [key, Finset.sum_ite_eq', Finset.mem_univ, ite_true, ← Complex.ofReal_sum, - sum_su3AdjointMatrix_row_mul] - by_cases h : a 0 = a 1 <;> simp [traceCoeff, h] - /-- The trace contraction: the Kronecker contraction of the two colour indices. -/ @[nolint unusedArguments] def traceContraction (hT : IsSU3BiAdjoint B repGauge T) : B := ∑ a : Fin 8, T ![a, a] -/-- The trace is the contraction against the Kronecker delta. -/ -lemma sum_traceCoeff_smul (T : (Fin 2 → Fin 8) → B) : - ∑ l, traceCoeff l • T l = ∑ a : Fin 8, T ![a, a] := by - rw [sum_pi_two] - simp [traceCoeff, ite_smul] - /-- Any map moving the components by an `SU(3)` matrix fixes the trace contraction. -/ 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 - rw [traceContraction, ← sum_traceCoeff_smul, map_sum_smul hf, act_traceCoeff] - -/-- The trace contraction is colour invariant. Nothing constrains the isospin and - hypercharge factors, which may well move it. -/ -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) + unfold IsSU3BiAdjointMat at hf + simp only [traceContraction, map_sum, hf, Fin.prod_univ_two, Matrix.cons_val_zero, + Matrix.cons_val_one] + rw [Finset.sum_comm] + simp only [← Finset.sum_smul, ← Complex.ofReal_mul, ← Complex.ofReal_sum, + sum_su3AdjointMatrix_row_mul, Family.sum_pi_two] + simp [ite_smul] /-! ## C. Coordinate vectors of one index -The action of `U` on a single adjoint index is the row action `rowAct U` of its adjoint -matrix on coordinate vectors `Fin 8 → ℂ`, and `unitVec a` is the coordinate vector of the -Gell-Mann direction `a`. Sections D and E work entirely with these. +`rowAct U` is the adjoint matrix of `U` acting on coordinate vectors `Fin 8 → ℂ` of one +index, and `unitVec a` is the coordinate vector of the Gell-Mann direction `a`. The image of +`unitVec b` is the column `b` of the adjoint matrix, so computing what a rotation does to the +Gell-Mann directions is computing its adjoint matrix, column by column. -/ @@ -299,19 +204,11 @@ noncomputable def rowAct (U : specialUnitaryGroup (Fin 3) ℂ) (c : Fin 8 → Fin 8 → ℂ := fun a => ∑ x : Fin 8, ((su3AdjointMatrix U a x : ℝ) : ℂ) * c x -/-- The row action is additive. -/ 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 respects differences. -/ -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. -/ lemma rowAct_smul (U : specialUnitaryGroup (Fin 3) ℂ) (z : ℂ) (c : Fin 8 → ℂ) : rowAct U (z • c) = z • rowAct U c := by funext a @@ -324,21 +221,26 @@ lemma rowAct_unitVec (U : specialUnitaryGroup (Fin 3) ℂ) (b a : Fin 8) : simp only [rowAct, unitVec, mul_ite, mul_one, mul_zero, Finset.sum_ite_eq', Finset.mem_univ, ite_true] -/-! +/-- The square of `√3`, as it appears in the adjoint matrices below. -/ +lemma sqrt_three_mul_self : ((Real.sqrt 3 : ℝ) : ℂ) * ((Real.sqrt 3 : ℝ) : ℂ) = 3 := by + rw [← Complex.ofReal_mul, Real.mul_self_sqrt (by norm_num : (0 : ℝ) ≤ 3)] + norm_num -## D. A handful of colour rotations on coordinate vectors +/-! -The classification of section E tests an invariant form against a few elements of `SU(3)`, -and this section computes what each does to the coordinate vectors of one index. Each -computation is the same: conjugate the Gell-Mann matrices by the element, read off the -adjoint matrix, and hence the row action on `unitVec`. +## D. Five colour rotations on the Gell-Mann directions -## D.1. The colour parities +Each rotation is computed the same way: conjugate the Gell-Mann matrices, read off the +adjoint matrix by `su3AdjointMatrix_eq_gellMannCoeff`, and hence the row action on `unitVec`. -The diagonal matrices of `SU(3)` with entries `±1` are the identity and the three parities -`su3Parity k`, which fix the colour `k` and reverse the other two. Conjugation by a parity -scales a Gell-Mann matrix by the product of the two diagonal entries it pairs, which is a -sign `paritySign`, so each Gell-Mann direction is an eigenvector of every parity. +The three colour parities `su3Parity k`, the diagonal matrices of `SU(3)` with entries `±1`, +scale each Gell-Mann direction by a sign `paritySign`. The cyclic permutation of colours +`su3Perm` permutes the six root directions up to sign and rotates the Cartan plane through +`2π/3`. The turn `su3Turn`, the element `!![u, v; -conj v, conj u]` of the `SU(2)` of the +first two colours at `u = (1 + i) / 2` and `v = (1 - i) / 2`, is a rotation through `2π/3` +about the axis `λ₁ + λ₂ - λ₃` of that `su(2)`: it carries `λ₁ ↦ -λ₂ ↦ -λ₃ ↦ λ₁` and fixes +`λ₈`, so it links a Cartan direction to the root directions, which nothing normalising the +torus can do. -/ @@ -371,10 +273,13 @@ lemma conj_gellMannMatrix_su3Parity (k : Fin 3) (b : Fin 8) : /-- The adjoint matrix of a parity is diagonal, with the signs on the diagonal. -/ lemma su3AdjointMatrix_su3Parity (k : Fin 3) (a b : Fin 8) : su3AdjointMatrix (su3Parity k) a b = if a = b then (paritySign k b : ℝ) else 0 := by - rw [su3AdjointMatrix_apply, conj_gellMannMatrix_su3Parity, Matrix.mul_smul, - Matrix.trace_smul, smul_eq_mul, ← Complex.ofReal_intCast, Complex.re_ofReal_mul, - mul_left_comm, re_trace_gellMannMatrix_mul] - by_cases h : a = b <;> simp [h] + rw [su3AdjointMatrix_eq_gellMannCoeff, conj_gellMannMatrix_su3Parity] + have h3 : Real.sqrt 3 ≠ 0 := by positivity + fin_cases k <;> fin_cases a <;> fin_cases b <;> + simp [gellMannCoeff, paritySign, gellMannMatrix_zero, gellMannMatrix_one, + gellMannMatrix_two, gellMannMatrix_three, gellMannMatrix_four, gellMannMatrix_five, + gellMannMatrix_six, gellMannMatrix_seven] <;> + field_simp <;> norm_num [Real.sq_sqrt] /-- A parity scales each Gell-Mann direction by its sign. -/ lemma rowAct_su3Parity_unitVec (k : Fin 3) (b : Fin 8) : @@ -383,46 +288,6 @@ lemma rowAct_su3Parity_unitVec (k : Fin 3) (b : Fin 8) : rw [rowAct_unitVec, su3AdjointMatrix_su3Parity] by_cases h : a = b <;> simp [unitVec, h] -/-! - -## D.2. The cyclic colour rotation - -Conjugation by the cyclic permutation matrix `su3Perm` permutes the matrix units, hence the -Gell-Mann matrices up to signs; only the two Cartan directions are mixed, by a rotation -through `2 π / 3`. On the Cartan plane the rotation is diagonalised by the combinations -`x₂ ∓ i x₇`, recorded in `cartanVec`, with eigenvalues `ω` and `ω ^ 2`. - --/ - -/-- The star of the cyclic colour matrix is the matrix of the inverse 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 - -/-- 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_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, - gellMannMatrix_seven, Matrix.mul_apply, Fin.sum_univ_three] - all_goals ring - /-- The image of each Gell-Mann direction under the cyclic colour rotation: the six root directions are permuted up to sign, the two Cartan directions rotated into each other. -/ noncomputable def permCol : Fin 8 → Fin 8 → ℂ @@ -438,270 +303,77 @@ noncomputable def permCol : Fin 8 → Fin 8 → ℂ /-- The cyclic colour rotation on the Gell-Mann directions. -/ 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, su3AdjointMatrix_eq_gellMannCoeff, conj_gellMannMatrix_su3Perm] - fin_cases b <;> fin_cases a <;> simp [permGellMann, gellMannCoeff, permCol, unitVec] - all_goals first - | ring1 - | linear_combination (-(1 : ℂ) / 6) * h3 - -/-- The two eigenvectors of the cyclic colour rotation in the Cartan plane, the - combinations `x₂ ∓ i x₇` of the two Cartan coordinates. -/ -noncomputable def cartanVec : Fin 2 → Fin 8 → ℂ - | 0 => unitVec 2 - Complex.I • unitVec 7 - | 1 => unitVec 2 + Complex.I • unitVec 7 - -/-- The grade of each Cartan eigenvector: its eigenvalue is `ω ^ cartanGrade`. -/ -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 `ω ^ 2`, 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_su3Perm_cartanVec (c : Fin 2) : - rowAct su3Perm (cartanVec c) = su3PermSign (cartanGrade c) • cartanVec c := by - fin_cases c <;> - simp only [cartanVec, cartanGrade, rowAct_sub, rowAct_add, rowAct_smul, - rowAct_su3Perm_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 direction in the eigenbasis of the cyclic colour rotation. -/ -lemma unitVec_two_eq_cartanVec_add : - unitVec 2 = (2 : ℂ)⁻¹ • (cartanVec 0 + cartanVec 1) := by - simp only [cartanVec] - module - -/-- The second Cartan direction in the eigenbasis of the cyclic colour rotation. -/ -lemma unitVec_seven_eq_cartanVec_sub : - unitVec 7 = (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 colour transposition - -Conjugation by the transposition `su3Transp` of the first two colours permutes the -Gell-Mann matrices up to signs, without mixing any two of them: 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. - --/ - -/-- The transposition 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. -/ -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_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, - gellMannMatrix_seven, Matrix.mul_apply, Fin.sum_univ_three] - -/-- The image of each Gell-Mann direction under the transposition. -/ -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 directions. -/ -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, su3AdjointMatrix_eq_gellMannCoeff, conj_gellMannMatrix_su3Transp] + rw [rowAct_unitVec, su3AdjointMatrix_eq_gellMannCoeff, su3Perm_coe] 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 - -/-! - -## D.4. Two turns in the `SU(2)` of the first two colours - -Everything so far normalises the colour torus, and nothing in the normaliser can tell the -Cartan plane from the root directions. The directions `λ₁`, `λ₂`, `λ₃` span an `su(2)` -acting on the first two colours, on which the corresponding `SU(2)` acts by rotations, and -the turn `su3Turn v` with `u = (1 + i) / 2` and `|v| = |u|` carries `λ₃` onto the root -direction `-2 u v`. Two turns are used: `su3TurnFst` lands on `-λ₁` and `su3TurnSnd` on -`λ₂`, since the Weyl group never mixes the two members of a root pair. - --/ - -/-- 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 turn matrix. -/ -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 turn matrix lies in `SU(3)` when its off-diagonal entry has the modulus of the - diagonal one. -/ -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 turn as an element of `SU(3)`. -/ -noncomputable def su3Turn (v : ℂ) (hv : v * (starRingEnd ℂ) v = 2⁻¹) : - specialUnitaryGroup (Fin 3) ℂ := ⟨su3TurnMatrix v, su3TurnMatrix_mem hv⟩ - -/-- Conjugating the first Cartan direction by a turn: the diagonal cancels, and what is left - is a combination of the two members of the first root pair. -/ -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 (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] + simp [gellMannCoeff, permCol, unitVec, Matrix.star_eq_conjTranspose, Matrix.mul_apply, + Fin.sum_univ_three, gellMannMatrix_zero, gellMannMatrix_one, gellMannMatrix_two, + gellMannMatrix_three, gellMannMatrix_four, gellMannMatrix_five, gellMannMatrix_six, + gellMannMatrix_seven] 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 - -/-- The first turn, at `v = (1 - 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 turn, at `v = (1 + 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 turn carries the first Cartan direction to minus the first member of the - first root pair. -/ -lemma rowAct_su3TurnFst_unitVec_two : - rowAct su3TurnFst (unitVec 2) = -unitVec 0 := by - funext a - rw [su3TurnFst, rowAct_unitVec, su3AdjointMatrix_eq_gellMannCoeff, - conj_gellMannMatrix_two_su3Turn] - fin_cases a <;> simp [gellMannCoeff, unitVec] - all_goals norm_num - -/-- The second turn carries the first Cartan direction to the second member of the first - root pair. -/ -lemma rowAct_su3TurnSnd_unitVec_two : - rowAct su3TurnSnd (unitVec 2) = unitVec 1 := by - funext a - rw [su3TurnSnd, rowAct_unitVec, su3AdjointMatrix_eq_gellMannCoeff, - conj_gellMannMatrix_two_su3Turn] - fin_cases a <;> simp [gellMannCoeff, unitVec] - all_goals norm_num + | linear_combination (-(1 : ℂ) / 6) * sqrt_three_mul_self + +/-- The turn: the rotation through `2π/3` about `λ₁ + λ₂ - λ₃` in the `SU(2)` of the first + two colours, with the third colour fixed. -/ +noncomputable def su3Turn : specialUnitaryGroup (Fin 3) ℂ := + ⟨!![(1 + Complex.I) / 2, (1 - Complex.I) / 2, 0; + -(1 + Complex.I) / 2, (1 - Complex.I) / 2, 0; + 0, 0, 1], by + rw [Matrix.mem_specialUnitaryGroup_iff, Matrix.mem_unitaryGroup_iff, Matrix.det_fin_three] + constructor + · ext i j + fin_cases i <;> fin_cases j <;> + norm_num [Matrix.star_eq_conjTranspose, Matrix.mul_apply, Fin.sum_univ_three, + Complex.ext_iff, Complex.star_def, map_ofNat, Complex.div_ofNat_re, + Complex.div_ofNat_im] + · norm_num [Complex.ext_iff, Complex.div_ofNat_re, Complex.div_ofNat_im]⟩ + +/-- The turn on the first root pair and the Cartan directions: a signed cycle of `λ₁`, `λ₂`, + `λ₃`, and `λ₈` fixed. -/ +lemma rowAct_su3Turn_unitVec : + rowAct su3Turn (unitVec 0) = (-1 : ℂ) • unitVec 1 + ∧ rowAct su3Turn (unitVec 1) = (1 : ℂ) • unitVec 2 + ∧ rowAct su3Turn (unitVec 2) = (-1 : ℂ) • unitVec 0 + ∧ rowAct su3Turn (unitVec 7) = (1 : ℂ) • unitVec 7 := by + have h3 : Real.sqrt 3 ≠ 0 := by positivity + refine ⟨?_, ?_, ?_, ?_⟩ + all_goals funext a + all_goals rw [rowAct_unitVec, su3AdjointMatrix_eq_gellMannCoeff] + all_goals fin_cases a + all_goals + norm_num [su3Turn, gellMannCoeff, unitVec, Matrix.star_eq_conjTranspose, Matrix.mul_apply, + Fin.sum_univ_three, gellMannMatrix_zero, gellMannMatrix_one, gellMannMatrix_two, + gellMannMatrix_seven, Complex.ext_iff, Complex.star_def, map_ofNat, + Complex.div_ofNat_re, Complex.div_ofNat_im] + all_goals field_simp + all_goals norm_num [Real.sq_sqrt] /-! ## E. An invariant coefficient is a multiple of the Kronecker delta -A coefficient `c` is a bilinear form `form c` on coordinate vectors, with `c ![a, b]` the -value on two Gell-Mann directions. If `c` is fixed by every `act U`, the form is fixed by -every row action, and the rotations of section D read off its entries: the parities -kill the entries joining directions of different sign pattern, the transposition and the -cyclic rotation kill the remaining off-diagonal entries and equate the diagonal ones within -the root directions and within the Cartan plane, and the two turns equate a Cartan diagonal -entry with a root one. What is left is a multiple of the delta. +A coefficient `c` is a bilinear form `form c` on coordinate vectors, with `c ![a, b]` its value +on two Gell-Mann directions. If `c` is fixed by every `act U` then the form is fixed by every +row action (`form_rowAct`), so a rotation carrying `unitVec a` to `s • unitVec a'` and +`unitVec b` to `t • unitVec b'` gives `c ![a, b] = s * t * c ![a', b']` +(`entry_eq_of_rowAct`). Section D supplies the rotations: the parities kill every entry +joining two directions of different sign pattern, and the turn and the cyclic rotation carry +the remaining off-diagonal entries onto killed ones (`eq_zero_of_ne`); the turn and the cyclic +rotation equate the diagonal entries, the Cartan pair through the rotation of the Cartan +plane, whose off-diagonal entries are now zero (`diag_eq`). -/ /-- The bilinear form on coordinate vectors with coefficients `c`. -/ -def form (c : (Fin 2 → Fin 8) → ℂ) (v w : Fin 8 → ℂ) : ℂ := - ∑ l, v (l 0) * w (l 1) * c l - -/-- The form on two Gell-Mann directions is an entry of `c`. -/ -lemma form_unitVec (c : (Fin 2 → Fin 8) → ℂ) (a b : Fin 8) : - form c (unitVec a) (unitVec b) = c ![a, b] := by - rw [form, sum_pi_two, Finset.sum_eq_single a, Finset.sum_eq_single b] - · simp [unitVec] +def form (c : (Fin 2 → Fin 8) → ℂ) (v w : Fin 8 → ℂ) : ℂ := ∑ l, v (l 0) * w (l 1) * c l + +/-- The form on two scaled Gell-Mann directions is a scaled entry of `c`. -/ +lemma form_smul_unitVec (c : (Fin 2 → Fin 8) → ℂ) (s t : ℂ) (a b : Fin 8) : + form c (s • unitVec a) (t • unitVec b) = s * t * c ![a, b] := by + rw [form, Family.sum_pi_two, Finset.sum_eq_single a, Finset.sum_eq_single b] + · simp only [Matrix.cons_val_zero, Matrix.cons_val_one, Pi.smul_apply, unitVec, ite_true, + smul_eq_mul, mul_one] · intro y _ hy simp [unitVec, hy] · simp @@ -709,208 +381,144 @@ lemma form_unitVec (c : (Fin 2 → Fin 8) → ℂ) (a b : Fin 8) : simp [unitVec, hx] · simp -/-- The form is additive on the left. -/ -lemma form_add_left (c : (Fin 2 → Fin 8) → ℂ) (v v' w : Fin 8 → ℂ) : - form c (v + v') w = form c v w + form c v' w := by - simp only [form, Pi.add_apply, add_mul, Finset.sum_add_distrib] - -/-- The form is additive on the right. -/ -lemma form_add_right (c : (Fin 2 → Fin 8) → ℂ) (v w w' : Fin 8 → ℂ) : - form c v (w + w') = form c v w + form c v w' := by - simp only [form, Pi.add_apply, mul_add, add_mul, Finset.sum_add_distrib] - -/-- The form respects differences on the left. -/ -lemma form_sub_left (c : (Fin 2 → Fin 8) → ℂ) (v v' w : Fin 8 → ℂ) : - form c (v - v') w = form c v w - form c v' w := by - simp only [form, Pi.sub_apply, sub_mul, Finset.sum_sub_distrib] - -/-- The form respects differences on the right. -/ -lemma form_sub_right (c : (Fin 2 → Fin 8) → ℂ) (v w w' : Fin 8 → ℂ) : - form c v (w - w') = form c v w - form c v w' := by - simp only [form, Pi.sub_apply, mul_sub, sub_mul, Finset.sum_sub_distrib] - -/-- The form is homogeneous on the left. -/ -lemma form_smul_left (c : (Fin 2 → Fin 8) → ℂ) (z : ℂ) (v w : Fin 8 → ℂ) : - form c (z • v) w = z * form c v w := by - simp only [form, Pi.smul_apply, smul_eq_mul, Finset.mul_sum, mul_assoc] - -/-- The form is homogeneous on the right. -/ -lemma form_smul_right (c : (Fin 2 → Fin 8) → ℂ) (z : ℂ) (v w : Fin 8 → ℂ) : - form c v (z • w) = z * form c v w := by - simp only [form, Pi.smul_apply, smul_eq_mul, Finset.mul_sum] - exact Finset.sum_congr rfl fun l _ => by ring - -/-- The form on a negated left argument. -/ -lemma form_neg_left (c : (Fin 2 → Fin 8) → ℂ) (v w : Fin 8 → ℂ) : - form c (-v) w = -form c v w := by - simp only [form, Pi.neg_apply, neg_mul, Finset.sum_neg_distrib] - -/-- The form on a negated right argument. -/ -lemma form_neg_right (c : (Fin 2 → Fin 8) → ℂ) (v w : Fin 8 → ℂ) : - form c v (-w) = -form c v w := by - simp only [form, Pi.neg_apply, mul_neg, neg_mul, Finset.sum_neg_distrib] +variable {c : (Fin 2 → Fin 8) → ℂ} (hc : ∀ U : specialUnitaryGroup (Fin 3) ℂ, act U c = c) +include hc /-- The form of an invariant coefficient is fixed by every row action: the row action on a product of coordinate vectors is `act U` on the product coefficient, and `act U⁻¹` is the transpose of `act U`. -/ -lemma form_rowAct {c : (Fin 2 → Fin 8) → ℂ} - (hc : ∀ U : specialUnitaryGroup (Fin 3) ℂ, act U c = c) - (U : specialUnitaryGroup (Fin 3) ℂ) (v w : Fin 8 → ℂ) : +lemma form_rowAct (U : specialUnitaryGroup (Fin 3) ℂ) (v w : Fin 8 → ℂ) : form c (rowAct U v) (rowAct U w) = form c v w := by have key : ∀ l : Fin 2 → Fin 8, rowAct U v (l 0) * rowAct U w (l 1) = act U (fun m => v (m 0) * w (m 1)) l := by intro l simp only [rowAct, act_apply, Fin.prod_univ_two] - rw [sum_pi_two, Finset.sum_mul_sum] + rw [Family.sum_pi_two, Finset.sum_mul_sum] refine Finset.sum_congr rfl fun x _ => Finset.sum_congr rfl fun y _ => ?_ simp only [Matrix.cons_val_zero, Matrix.cons_val_one] ring simp only [form, key] rw [sum_act_mul, hc] -/-- An invariant coefficient is a multiple of the Kronecker delta. -/ -theorem exists_smul_traceCoeff_of_act_eq {c : (Fin 2 → Fin 8) → ℂ} - (hc : ∀ U : specialUnitaryGroup (Fin 3) ℂ, act U c = c) : - ∃ z : ℂ, c = z • traceCoeff := by - have hβ := form_rowAct hc - -- the parities kill every entry joining two directions of different sign pattern - have hpar : ∀ (k : Fin 3) (a b : Fin 8), - paritySign k a ≠ paritySign k b → c ![a, b] = 0 := by - intro k a b hab - have h := hβ (su3Parity k) (unitVec a) (unitVec b) - rw [rowAct_su3Parity_unitVec, rowAct_su3Parity_unitVec, form_smul_left, form_smul_right, - form_unitVec, ← mul_assoc] at h - have hpm : ∀ (k : Fin 3) (a : Fin 8), paritySign k a = 1 ∨ paritySign k a = -1 := by +/-- The invariance equation on two Gell-Mann directions, for a rotation carrying each to a + multiple of a Gell-Mann direction. -/ +lemma entry_eq_of_rowAct {U : specialUnitaryGroup (Fin 3) ℂ} {a a' b b' : Fin 8} (s t : ℂ) + (ha : rowAct U (unitVec a) = s • unitVec a') (hb : rowAct U (unitVec b) = t • unitVec b') : + c ![a, b] = s * t * c ![a', b'] := by + have h := form_rowAct hc U (unitVec a) (unitVec b) + rw [ha, hb, form_smul_unitVec, ← one_smul ℂ (unitVec a), ← one_smul ℂ (unitVec b), + form_smul_unitVec, one_mul, one_mul] at h + exact h.symm + +/-- The invariance equation of the cyclic rotation, read off `permCol`. -/ +lemma perm_entry_eq (a b a' b' : Fin 8) (s t : ℂ) + (ha : permCol a = s • unitVec a') (hb : permCol b = t • unitVec b') : + c ![a, b] = s * t * c ![a', b'] := + entry_eq_of_rowAct hc s t (by rw [rowAct_su3Perm_unitVec, ha]) + (by rw [rowAct_su3Perm_unitVec, hb]) + +/-- Every off-diagonal entry vanishes. -/ +lemma eq_zero_of_ne {a b : Fin 8} (hab : a ≠ b) : c ![a, b] = 0 := by + -- an entry joining two directions of different sign pattern is its own negative + have hpar : ∀ {a b : Fin 8} (k : Fin 3), paritySign k a ≠ paritySign k b → c ![a, b] = 0 := by + intro a b k hk + have h := entry_eq_of_rowAct hc _ _ (rowAct_su3Parity_unitVec k a) + (rowAct_su3Parity_unitVec k b) + have hs : ∀ (k : Fin 3) (a b : Fin 8), + paritySign k a ≠ paritySign k b → paritySign k a * paritySign k b = -1 := by decide - rcases hpm k a with ha | ha <;> rcases hpm k b with hb | hb <;> rw [ha, hb] at h hab <;> - push_cast at h - · exact absurd rfl hab - · linear_combination (-1 / 2 : ℂ) * h - · linear_combination (-1 / 2 : ℂ) * h - · exact absurd rfl hab - -- the transposition and the cyclic rotation, on Gell-Mann directions - have hτ : ∀ a b, form c (transpCol a) (transpCol b) = c ![a, b] := fun a b => by - have h := hβ su3Transp (unitVec a) (unitVec b) - rwa [rowAct_su3Transp_unitVec, rowAct_su3Transp_unitVec, form_unitVec] at h - have hπ : ∀ a b, form c (permCol a) (permCol b) = c ![a, b] := fun a b => by - have h := hβ su3Perm (unitVec a) (unitVec b) - rwa [rowAct_su3Perm_unitVec, rowAct_su3Perm_unitVec, form_unitVec] at h - -- the remaining off-diagonal entries: within a root pair or within the Cartan plane + rw [← Int.cast_mul, hs k a b hk] at h + push_cast at h + linear_combination (1 / 2 : ℂ) * h + -- the turn carries the first root pair and the Cartan pair onto pairs a parity separates + obtain ⟨h0, h1, h2, h7⟩ := rowAct_su3Turn_unitVec have h01 : c ![0, 1] = 0 := by - have h := hτ 0 1 - simp only [transpCol, form_neg_right, form_unitVec] at h - linear_combination (-1 / 2 : ℂ) * h + rw [entry_eq_of_rowAct hc _ _ h0 h1, hpar (a := 1) (b := 2) 0 (by decide), mul_zero] have h10 : c ![1, 0] = 0 := by - have h := hτ 1 0 - simp only [transpCol, form_neg_left, form_unitVec] at h - linear_combination (-1 / 2 : ℂ) * h + rw [entry_eq_of_rowAct hc _ _ h1 h0, hpar (a := 2) (b := 1) 0 (by decide), mul_zero] have h27 : c ![2, 7] = 0 := by - have h := hτ 2 7 - simp only [transpCol, form_neg_left, form_unitVec] at h - linear_combination (-1 / 2 : ℂ) * h + rw [entry_eq_of_rowAct hc _ _ h2 h7, hpar (a := 0) (b := 7) 0 (by decide), mul_zero] have h72 : c ![7, 2] = 0 := by - have h := hτ 7 2 - simp only [transpCol, form_neg_right, form_unitVec] at h - linear_combination (-1 / 2 : ℂ) * h + rw [entry_eq_of_rowAct hc _ _ h7 h2, hpar (a := 7) (b := 0) 0 (by decide), mul_zero] + -- the cyclic rotation carries each root pair onto the previous one have h34 : c ![3, 4] = 0 := by - have h := hπ 3 4 - simp only [permCol, form_neg_right, form_unitVec] at h - rw [← h, h01, neg_zero] + rw [perm_entry_eq hc 3 4 0 1 1 (-1) (by simp [permCol]) (by simp [permCol]), h01, mul_zero] have h43 : c ![4, 3] = 0 := by - have h := hπ 4 3 - simp only [permCol, form_neg_left, form_unitVec] at h - rw [← h, h10, neg_zero] + rw [perm_entry_eq hc 4 3 1 0 (-1) 1 (by simp [permCol]) (by simp [permCol]), h10, mul_zero] have h56 : c ![5, 6] = 0 := by - have h := hπ 5 6 - simp only [permCol, form_neg_right, form_unitVec] at h - rw [← h, h34, neg_zero] + rw [perm_entry_eq hc 5 6 3 4 1 (-1) (by simp [permCol]) (by simp [permCol]), h34, mul_zero] have h65 : c ![6, 5] = 0 := by - have h := hπ 6 5 - simp only [permCol, form_neg_left, form_unitVec] at h - rw [← h, h43, neg_zero] - have hoff : ∀ a b : Fin 8, a ≠ b → c ![a, b] = 0 := by - intro a b hab - have key : (∃ k, paritySign k a ≠ paritySign k b) - ∨ (a = 0 ∧ b = 1) ∨ (a = 1 ∧ b = 0) ∨ (a = 2 ∧ b = 7) ∨ (a = 7 ∧ b = 2) - ∨ (a = 3 ∧ b = 4) ∨ (a = 4 ∧ b = 3) ∨ (a = 5 ∧ b = 6) - ∨ (a = 6 ∧ b = 5) := by - revert a b - decide - rcases key with ⟨k, hk⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ - | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ - · exact hpar k a b hk - all_goals assumption - -- the diagonal entries along the root directions, moved around by the cyclic rotation - have h55 : c ![5, 5] = c ![0, 0] := by - simpa only [permCol, form_unitVec] using hπ 0 0 - have h66 : c ![6, 6] = c ![1, 1] := by - simpa only [permCol, form_unitVec] using hπ 1 1 - have h33 : c ![3, 3] = c ![5, 5] := by - simpa only [permCol, form_unitVec] using hπ 5 5 - have h44 : c ![4, 4] = c ![6, 6] := by - simpa only [permCol, form_neg_left, form_neg_right, neg_neg, form_unitVec] using hπ 6 6 - -- the two turns tie the Cartan entry `c ![2, 2]` to `c ![0, 0]` and `c ![1, 1]` - have hQ : c ![0, 0] = c ![2, 2] := by - have h := hβ su3TurnFst (unitVec 2) (unitVec 2) - rwa [rowAct_su3TurnFst_unitVec_two, form_neg_left, form_neg_right, neg_neg, form_unitVec, - form_unitVec] at h - have hQ' : c ![1, 1] = c ![2, 2] := by - have h := hβ su3TurnSnd (unitVec 2) (unitVec 2) - rwa [rowAct_su3TurnSnd_unitVec_two, form_unitVec, form_unitVec] at h - -- the Cartan plane: the eigenvectors of the cyclic rotation are isotropic - have hω : ∀ a : Fin 2, form c (cartanVec a) (cartanVec a) = 0 := by - intro a - have h := hβ su3Perm (cartanVec a) (cartanVec a) - rw [rowAct_su3Perm_cartanVec, form_smul_left, form_smul_right, ← mul_assoc, - ← su3PermSign_add] at h - have hs : su3PermSign (cartanGrade a + cartanGrade a) ≠ 1 := by - fin_cases a - · exact su3Omega_isPrimitiveRoot.pow_ne_one_of_pos_of_lt (by decide) (by decide) - · exact su3Omega_isPrimitiveRoot.pow_ne_one_of_pos_of_lt (by decide) (by decide) - exact (mul_left_eq_self₀.1 h).resolve_left hs + rw [perm_entry_eq hc 6 5 4 3 (-1) 1 (by simp [permCol]) (by simp [permCol]), h43, mul_zero] + -- every other pair of distinct directions is separated by a parity + have key : ∀ a b : Fin 8, a ≠ b → (∃ k, paritySign k a ≠ paritySign k b) + ∨ (a = 0 ∧ b = 1) ∨ (a = 1 ∧ b = 0) ∨ (a = 2 ∧ b = 7) ∨ (a = 7 ∧ b = 2) + ∨ (a = 3 ∧ b = 4) ∨ (a = 4 ∧ b = 3) ∨ (a = 5 ∧ b = 6) ∨ (a = 6 ∧ b = 5) := by + decide + rcases key a b hab with ⟨k, hk⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ + | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ + · exact hpar k hk + all_goals assumption + +/-- Every diagonal entry equals the entry at the first Cartan direction. -/ +lemma diag_eq (a : Fin 8) : c ![a, a] = c ![2, 2] := by + -- the turn cycles `λ₁, λ₂, λ₃`, and the cyclic rotation moves the root directions around + obtain ⟨h0, h1, -, -⟩ := rowAct_su3Turn_unitVec + have h01 : c ![0, 0] = c ![1, 1] := by rw [entry_eq_of_rowAct hc _ _ h0 h0]; ring + have h12 : c ![1, 1] = c ![2, 2] := by rw [entry_eq_of_rowAct hc _ _ h1 h1]; ring + have h05 : c ![0, 0] = c ![5, 5] := by + rw [perm_entry_eq hc 0 0 5 5 1 1 (by simp [permCol]) (by simp [permCol])]; ring + have h16 : c ![1, 1] = c ![6, 6] := by + rw [perm_entry_eq hc 1 1 6 6 1 1 (by simp [permCol]) (by simp [permCol])]; ring + have h53 : c ![5, 5] = c ![3, 3] := by + rw [perm_entry_eq hc 5 5 3 3 1 1 (by simp [permCol]) (by simp [permCol])]; ring + have h64 : c ![6, 6] = c ![4, 4] := by + rw [perm_entry_eq hc 6 6 4 4 (-1) (-1) (by simp [permCol]) (by simp [permCol])]; ring + -- the Cartan plane is rotated through `2π/3`, and its off-diagonal entries vanish have h77 : c ![7, 7] = c ![2, 2] := by - rw [← form_unitVec c 7 7, ← form_unitVec c 2 2, unitVec_two_eq_cartanVec_add, - unitVec_seven_eq_cartanVec_sub] - simp only [form_smul_left, form_smul_right, form_add_left, form_add_right, form_sub_left, - form_sub_right, hω] - linear_combination - (-(form c (cartanVec 0) (cartanVec 1) + form c (cartanVec 1) (cartanVec 0)) / 4) - * Complex.I_sq - have hdiag : ∀ a : Fin 8, c ![a, a] = c ![2, 2] := by - intro a - have ha : a = 0 ∨ a = 1 ∨ a = 2 ∨ a = 3 ∨ a = 4 ∨ a = 5 ∨ a = 6 ∨ a = 7 := by - revert a - decide - rcases ha with rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl - · exact hQ - · exact hQ' - · rfl - · rw [h33, h55, hQ] - · rw [h44, h66, hQ'] - · rw [h55, hQ] - · rw [h66, hQ'] - · exact h77 - refine ⟨c ![2, 2], funext fun l => ?_⟩ + have h := form_rowAct hc su3Perm (unitVec 2) (unitVec 2) + rw [rowAct_su3Perm_unitVec, ← one_smul ℂ (unitVec 2), form_smul_unitVec] at h + simp only [form, permCol, Family.sum_pi_two, Fin.sum_univ_eight, Matrix.cons_val_zero, + Matrix.cons_val_one, Pi.add_apply, Pi.smul_apply, unitVec, smul_eq_mul] at h + simp only [Fin.isValue, Fin.reduceEq, ite_true, ite_false, mul_one, mul_zero, add_zero, + zero_add, eq_zero_of_ne hc (show (2 : Fin 8) ≠ 7 by decide), + eq_zero_of_ne hc (show (7 : Fin 8) ≠ 2 by decide), one_mul] at h + linear_combination (4 / 3 : ℂ) * h - (c ![7, 7] / 3) * sqrt_three_mul_self + have key : ∀ a : Fin 8, a = 0 ∨ a = 1 ∨ a = 2 ∨ a = 3 ∨ a = 4 ∨ a = 5 ∨ a = 6 ∨ a = 7 := by + decide + rcases key a with rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl + · rw [h01, h12] + · exact h12 + · rfl + · rw [← h53, ← h05, h01, h12] + · rw [← h64, ← h16, h12] + · rw [← h05, h01, h12] + · rw [← h16, h12] + · exact h77 + +/-- An invariant coefficient is a multiple of the Kronecker delta. -/ +theorem exists_eq_ite_of_act_eq : ∃ z : ℂ, ∀ l, c l = if l 0 = l 1 then z else 0 := by + refine ⟨c ![2, 2], fun l => ?_⟩ obtain ⟨a, b, rfl⟩ : ∃ a b, l = ![a, b] := ⟨l 0, l 1, by ext i; fin_cases i <;> rfl⟩ by_cases h : a = b · subst h - simp [traceCoeff, hdiag] - · simp [traceCoeff, h, hoff a b h] + simp [diag_eq hc] + · simp [h, eq_zero_of_ne hc h] + +omit hc /-! ## F. The colour invariants of the span -The action on coefficients is unitary, by `sum_act_mul` and `act_star`, so -`Family.exists_invariant_coeff` writes a colour invariant of the span as the contraction of -an invariant coefficient, and section E makes that coefficient a multiple of the delta. The -statement is made for any family of linear maps `φ U` obeying the law, not only for the -colour rotations `repGauge (U, 1, 1)`, so that section G can apply it in a quotient. +The action on coefficients is unitary, so `Family.exists_invariant_coeff` writes a colour +invariant of the span as the contraction of an invariant coefficient, which section E makes a +multiple of the delta. The statement is for any family of linear maps `φ U` obeying the law, +so that section G can apply it in a quotient. -/ -/-- Every invariant in the span of a family obeying the law for a family of linear maps - `φ U` is a multiple of the trace: the one singlet of `8 ⊗ 8`. -/ +/-- Every invariant in the span of a family obeying the law for linear maps `φ U` is a + multiple of the trace: the one singlet of `8 ⊗ 8`. -/ theorem exists_smul_sum_diag_of_invariant {φ : specialUnitaryGroup (Fin 3) ℂ → B →ₗ[ℂ] B} (hT : ∀ U, IsSU3BiAdjointMat U (φ U) T) {x : B} (hx : x ∈ ⨆ d, ℂ ∙ T d) (hinv : ∀ U, φ U x = x) : @@ -918,73 +526,23 @@ theorem exists_smul_sum_diag_of_invariant {φ : specialUnitaryGroup (Fin 3) ℂ obtain ⟨c, rfl, hc⟩ := Family.exists_invariant_coeff T φ act (fun U c => map_sum_smul (hT U) c) (Family.sum_star_mul_of_transpose act sum_act_mul act_star) hx hinv - obtain ⟨z, hz⟩ := exists_smul_traceCoeff_of_act_eq hc + obtain ⟨z, hz⟩ := exists_eq_ite_of_act_eq hc refine ⟨z, ?_⟩ - rw [hz, ← sum_traceCoeff_smul, Finset.smul_sum] - simp only [Pi.smul_apply, smul_eq_mul, mul_smul] - -/-- Every colour invariant in the span of the components is a multiple of the trace - contraction. -/ -theorem exists_smul_traceContraction_of_su3_invariant (hT : IsSU3BiAdjoint B repGauge T) - {x : B} (hx : x ∈ hT.span) - (hinv : ∀ U : specialUnitaryGroup (Fin 3) ℂ, repGauge (U, 1, 1) x = x) : - ∃ z : ℂ, x = z • hT.traceContraction := - exists_smul_sum_diag_of_invariant hT.repGauge_T hx hinv - -/-! - -## G. The invariants modulo a stable submodule - -The Standard Model files handle many families at once and peel them off one at a time, so -the classification is wanted modulo a submodule `S` in which the other families are parked. -The law descends to the quotient by a colour-stable `S`, so section F applies there, and -`Family.exists_smul_add_of_mem_sup` lifts the result back. - --/ - -/-- The law descends to the quotient by a submodule stable under the map. -/ -lemma isSU3BiAdjointMat_mapQ {U : specialUnitaryGroup (Fin 3) ℂ} {f : B →ₗ[ℂ] B} - (hf : IsSU3BiAdjointMat U f T) (S : Submodule ℂ B) (hS : ∀ y ∈ S, f y ∈ S) : - IsSU3BiAdjointMat U (S.mapQ S f hS) fun l => S.mkQ (T l) := by - intro l - dsimp only - rw [← LinearMap.comp_apply, Submodule.mapQ_mkQ, LinearMap.comp_apply, hf 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` is a multiple of the trace contraction up to a colour-invariant remainder in `S`. -/ -theorem mem_span_sup_su3_invariant_iff (hT : IsSU3BiAdjoint 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) : - ∃ c : ℂ, ∃ y ∈ S, x = c • hT.traceContraction + y - ∧ ∀ U : specialUnitaryGroup (Fin 3) ℂ, repGauge (U, 1, 1) y = y := by - refine Family.exists_smul_add_of_mem_sup T (fun U => repGauge (U, 1, 1)) S hS - hT.traceContraction hT.repGauge_traceContraction (fun x hx hinv => ?_) hx hinv - obtain ⟨z, hz⟩ := exists_smul_sum_diag_of_invariant - (fun U => isSU3BiAdjointMat_mapQ (hT.repGauge_T U) S (hS U)) hx hinv - exact ⟨z, by rw [hz, traceContraction, map_sum]⟩ + simp only [hz, Family.sum_pi_two, Matrix.cons_val_zero, Matrix.cons_val_one, ite_smul, + zero_smul, Finset.smul_sum] + refine Finset.sum_congr rfl fun x _ => ?_ + rw [Finset.sum_eq_single x (fun b _ hb => by simp [Ne.symm hb]) (by simp)] + simp /-! -## Aside: what other files import from here - -Nothing from here on is used by the theorem above. Each item exists because another file -imports it under this name, and each says which. - -## Aside: the weight basis of the adjoint, for `MassDimEight` and `IsSU3Adjoint` +## Aside: the weight basis of the adjoint, for `MassDimEight` -The Gell-Mann directions carry no definite colour charge; the eigenvectors of the colour -torus do. They are, 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: eight coordinate vectors `wtCoeff`, indexed by `WeightIdx`. `MassDimEight` matches -the gluon field strengths with the components of a bi-adjoint family through this basis, -using that its root pairs and Cartan indices are those of the whole gauge algebra, -`rootIdx_castSucc` and `cartanIdx_castSucc`, and that the sixty four contractions `biVec` -of `T` against two weight vectors span the components, `span_eq_wtSpan`. `IsSU3Adjoint` -reads the two Cartan directions in the eigenbasis `cartanVec`, `wtCoeff_cartan_zero` and -`wtCoeff_cartan_one`. +Nothing here is used by the theorem below. The eigenvectors of the colour torus are, for each +root direction, the two combinations `x₁ ± i x₂` of the paired Gell-Mann coordinates, and the +two Cartan directions: `wtCoeff`, indexed by `WeightIdx`. `MassDimEight` matches the gluon +field strengths with the components of a bi-adjoint family through this basis, using that its +root pairs and Cartan indices are those of the whole gauge algebra. -/ @@ -1009,13 +567,6 @@ lemma cartanIdx_castSucc (c : Fin 2) : GaugeAlgebra.cartanIdx c.castSucc.castSucc = Sum.inl (GaugeAlgebra.su3CartanId c) := by fin_cases c <;> rfl -/-- Every Gell-Mann index is a member 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 = GaugeAlgebra.su3CartanId c := by - revert a - decide - /-- The weight basis of the adjoint in Gell-Mann coordinates: `x₁ ± i x₂` on each root pair, and the Cartan directions themselves. -/ noncomputable def wtCoeff : WeightIdx → Fin 8 → ℂ @@ -1025,138 +576,31 @@ noncomputable def wtCoeff : WeightIdx → Fin 8 → ℂ - Complex.I * (if a = (rootPair r).2 then 1 else 0) | Sum.inr (Sum.inr c), a => if a = GaugeAlgebra.su3CartanId c then 1 else 0 -/-- 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 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 (GaugeAlgebra.su3CartanId c) = wtCoeff (Sum.inr (Sum.inr c)) := rfl - -/-- The first Cartan direction in the eigenbasis of the cyclic colour rotation. -/ -lemma wtCoeff_cartan_zero : - wtCoeff (Sum.inr (Sum.inr 0)) = (2 : ℂ)⁻¹ • (cartanVec 0 + cartanVec 1) := - unitVec_two_eq_cartanVec_add - -/-- The second Cartan direction in the eigenbasis of the cyclic colour rotation. -/ -lemma wtCoeff_cartan_one : - wtCoeff (Sum.inr (Sum.inr 1)) = (Complex.I / 2) • (cartanVec 0 - cartanVec 1) := - unitVec_seven_eq_cartanVec_sub - -/-- The contraction of the two indices of `T` against a pair of coordinate vectors. -/ -@[nolint unusedArguments] -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) - -/-- Scaling the left coordinate vector. -/ -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] - -/-- Scaling the right coordinate vector. -/ -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 - -/-- Adding 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] - -/-- Subtracting 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] - -/-- Adding 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] - -/-- Subtracting 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 Gell-Mann directions returns a component. -/ -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] - rw [Finset.sum_eq_single_of_mem a (Finset.mem_univ a) fun x _ hx => by simp [hx]] - simp - -/-- The join of the lines through 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) - -/-- A weight vector contracted against a Gell-Mann direction lies in `wtSpan`. -/ -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 lies in `wtSpan`. -/ -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 bi-adjoint weight vectors span the components: the change of basis from the - Gell-Mann basis to the weight basis is invertible. -/ -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 _)) - /-! -## Aside: the gauge form of the theorem, for `MassDimEight` +## G. The invariants modulo a stable submodule + +The Standard Model files handle many families at once and peel them off one at a time, so the +classification is wanted modulo a submodule `S` in which the other families are parked. The +law descends to the quotient by a stable `S`, section F applies there, and +`Family.exists_smul_add_of_mem_sup` lifts the result back. Once the trace contraction is known +to be gauge invariant, so is the remainder `y = x - c • traceContraction`. -/ -/-- The gauge form on an algebra: a gauge invariant of the span joined with a gauge-stable - submodule is a multiple of the trace contraction up to a gauge-invariant remainder, once - the trace contraction is known to be gauge invariant. The multiplicativity hypothesis - `hmul` is not used; `MassDimEight` passes it. -/ +/-- The law descends to the quotient by a submodule stable under the map. -/ +lemma isSU3BiAdjointMat_mapQ {U : specialUnitaryGroup (Fin 3) ℂ} {f : B →ₗ[ℂ] B} + (hf : IsSU3BiAdjointMat U f T) (S : Submodule ℂ B) (hS : ∀ y ∈ S, f y ∈ S) : + IsSU3BiAdjointMat U (S.mapQ S f hS) fun l => S.mkQ (T l) := by + intro l + dsimp only + rw [← LinearMap.comp_apply, Submodule.mapQ_mkQ, LinearMap.comp_apply, hf l, map_sum] + exact Finset.sum_congr rfl fun a _ => map_smul _ _ _ + +/-- A gauge invariant of the span joined with a gauge-stable submodule is a multiple of the + trace contraction up to a gauge-invariant remainder, once the trace contraction is known to + be gauge invariant. The multiplicativity hypothesis `hmul` is not used; `MassDimEight` + passes it. -/ @[nolint unusedArguments] theorem mem_span_sup_invariant_iff {B : Type*} [Ring B] [Algebra ℂ B] {repGauge : Representation ℂ GaugeGroupI B} {T : (Fin 2 → Fin 8) → B} @@ -1168,8 +612,14 @@ theorem mem_span_sup_invariant_iff {B : Type*} [Ring B] [Algebra ℂ B] (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : ∃ c : ℂ, ∃ y ∈ S, x = c • hT.traceContraction + y ∧ ∀ g : GaugeGroupI, repGauge g y = y := by - obtain ⟨c, y, hyS, hxy, -⟩ := - hT.mem_span_sup_su3_invariant_iff x S (fun U => hS (U, 1, 1)) hx fun U => hinv (U, 1, 1) + obtain ⟨c, y, hyS, hxy, -⟩ := Family.exists_smul_add_of_mem_sup T + (fun U => repGauge (U, 1, 1)) S (fun U => hS (U, 1, 1)) hT.traceContraction + (fun U => hT.map_traceContraction (hT.repGauge_T U)) + (fun x hx hinv => by + obtain ⟨z, hz⟩ := exists_smul_sum_diag_of_invariant + (fun U => isSU3BiAdjointMat_mapQ (hT.repGauge_T U) S (hS (U, 1, 1))) hx hinv + exact ⟨z, by rw [hz, traceContraction, map_sum]⟩) + hx (fun U => hinv (U, 1, 1)) refine ⟨c, y, hyS, hxy, fun g => ?_⟩ rw [show y = x - c • hT.traceContraction from by rw [hxy]; abel, map_sub, map_smul, hinv g, htc g] From ece6796c0bb2fc6e5db9fbf17b191169d11534ff Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Tue, 22 Sep 2026 20:47:39 +0400 Subject: [PATCH 353/367] docs: Add TODO on extensions of gauge field data --- .../GaugeTheory/LocalFieldAlgebra/Sector.lean | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Sector.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Sector.lean index b791cfe76..c2ec0c0ed 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Sector.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalFieldAlgebra/Sector.lean @@ -261,6 +261,11 @@ lemma union (S S' : Finset FieldCategory) : unfold SectorAlgebra rw [sectorGenerators_union, Algebra.adjoin_union] +TODO (lines := 259-262) (date := 2026-09-22) "Add an `Add` instance on `GaugeFieldData` + and the companion of this lemma, here and for `CovSectorAlgebra`, for a sum of data: a + sector of `F + G` as the parts from `F`, from `G` and the words mixing the two, so that + `invariantsLE` of an extension reduces to the mixed part." + variable {T} /-! From 2a17c40cc6d2ea1d1b392d20636a4c2a1163974e Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Wed, 23 Sep 2026 17:22:28 +0400 Subject: [PATCH 354/367] refactor: Add new lemma and derive the Lorentz and gauge invariant-coefficient lifts from it --- Physlib/Mathematics/LinearCombination.lean | 55 ++++++++++- .../GaugeGroup/Invariants/Basic.lean | 89 ++++------------- .../LorentzGroup/Invariants/Basic.lean | 99 ++++--------------- 3 files changed, 89 insertions(+), 154 deletions(-) diff --git a/Physlib/Mathematics/LinearCombination.lean b/Physlib/Mathematics/LinearCombination.lean index 6e5bbc86b..83638e5f6 100644 --- a/Physlib/Mathematics/LinearCombination.lean +++ b/Physlib/Mathematics/LinearCombination.lean @@ -5,10 +5,7 @@ Authors: Joseph Tooby-Smith, Nathaneal Sajan -/ module -public import Mathlib.Algebra.BigOperators.Group.Finset.Sigma -public import Mathlib.Algebra.BigOperators.GroupWithZero.Action -public import Mathlib.Algebra.Module.BigOperators -public import Mathlib.Algebra.Module.LinearMap.Defs +public import Mathlib.Analysis.InnerProductSpace.PiL2 /-! # Finite linear combinations under a linear map @@ -17,6 +14,10 @@ A family `T : ι → B` of vectors of a module, indexed by a finite type, has th against coefficients moved by a matrix regroups as the same combination of the matrix-moved components, and a linear map given on the family by a matrix moves a combination by that matrix acting on the coefficients. + +Over `ℂ`, when linear maps on `B` move combinations by moving their coefficients, a combination +fixed by all the maps is the combination of fixed coefficients, provided the coefficient maps +have their adjoints among themselves: `Fintype.exists_invariant_coeff_of_adjoint_mem`. -/ @[expose] public section @@ -38,3 +39,49 @@ lemma LinearMap.map_sum_smul_of_forall_eq (φ : B →ₗ[R] B') (T : ι → B) ( φ (∑ l, c l • T l) = ∑ a, (∑ l, c l * M a l) • T' a := by rw [map_sum, Fintype.sum_sum_mul_smul] exact Finset.sum_congr rfl fun l _ => by rw [map_smul, hT] + +open scoped InnerProductSpace in +/-- A vector of the span of `T` fixed by every `φ g` is the combination of coefficients fixed + by every `A g`, where `φ g` moves combinations by moving their coefficients with `A g`. The + one condition on `A` is that for every `g` some `g'` acts as the adjoint of `g` for the + standard inner product on coefficients; neither the `φ g` nor the `A g` need form a + representation, and `B` carries no inner product. The components may be dependent, so the + coefficients need not be unique: the proof takes the part of any coefficients orthogonal to + those contracting to `0`. -/ +lemma Fintype.exists_invariant_coeff_of_adjoint_mem {ι G B : Type*} [Fintype ι] + [AddCommGroup B] [Module ℂ B] (T : ι → B) (φ : G → B →ₗ[ℂ] B) + (A : G → (ι → ℂ) →ₗ[ℂ] (ι → ℂ)) + (hφ : ∀ (g : G) (c : ι → ℂ), φ g (∑ i, c i • T i) = ∑ i, A g c i • T i) + (hA : ∀ g : G, ∃ g' : G, ∀ u v : EuclideanSpace ℂ ι, + ⟪u, WithLp.toLp 2 (A g v.ofLp)⟫_ℂ = ⟪WithLp.toLp 2 (A g' u.ofLp), v⟫_ℂ) + {x : B} (hx : x ∈ ⨆ i, ℂ ∙ T i) (hinv : ∀ g, φ g x = x) : + ∃ c : ι → ℂ, x = ∑ i, c i • T i ∧ ∀ g, A g c = c := by + classical + obtain ⟨c, rfl⟩ : ∃ c : ι → ℂ, x = ∑ i, c i • T i := by + rw [← Submodule.span_range_eq_iSup, ← Fintype.range_linearCombination, + LinearMap.mem_range] at hx + simpa only [Fintype.linearCombination_apply, eq_comm] using hx + -- `K`: the coefficients contracting to `0`, stable under every `A g`. + set q := Fintype.linearCombination ℂ T ∘ₗ (WithLp.linearEquiv 2 ℂ (ι → ℂ)).toLinearMap + have hq : ∀ u, q u = ∑ i, u.ofLp i • T i := fun u => Fintype.linearCombination_apply ℂ T _ + set K := LinearMap.ker q + have hKstab : ∀ g, ∀ u ∈ K, WithLp.toLp 2 (A g u.ofLp) ∈ K := fun g u hu => by + rw [LinearMap.mem_ker, hq] at hu ⊢ + rw [← hφ, hu, map_zero] + -- Replace `c` by its part `k'` in `Kᗮ`, which contracts to the same vector. + obtain ⟨k, hk, k', hk', hkk'⟩ := K.exists_add_mem_mem_orthogonal (WithLp.toLp 2 c) + have hx' : ∑ i, c i • T i = q k' := by + rw [← zero_add (q k'), ← LinearMap.mem_ker.1 hk, ← map_add, ← hkk', hq] + refine ⟨k'.ofLp, hx'.trans (hq k'), fun g => ?_⟩ + -- The change of `k'` under `A g` lies in `K` by invariance of the vector, and in `Kᗮ` since + -- the adjoint of `A g` preserves `K`. + have h1 : WithLp.toLp 2 (A g k'.ofLp) - k' ∈ K := by + rw [LinearMap.mem_ker, map_sub, hq, ← hφ, ← hq, ← hx', hinv, sub_self] + have h2 : WithLp.toLp 2 (A g k'.ofLp) ∈ Kᗮ := by + obtain ⟨g', hg'⟩ := hA g + refine (Submodule.mem_orthogonal _ _).2 fun u hu => ?_ + rw [hg' u k'] + exact Submodule.inner_right_of_mem_orthogonal (hKstab g' u hu) hk' + have h3 : WithLp.toLp 2 (A g k'.ofLp) - k' ∈ K ⊓ Kᗮ := ⟨h1, Submodule.sub_mem _ h2 hk'⟩ + rw [Submodule.inf_orthogonal_eq_bot, Submodule.mem_bot, sub_eq_zero] at h3 + exact congrArg WithLp.ofLp h3 diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/Basic.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/Basic.lean index fd1607792..4db073858 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/Basic.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/Basic.lean @@ -5,9 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Mathlib.Analysis.InnerProductSpace.PiL2 -public import Mathlib.Analysis.InnerProductSpace.Projection.Basic -public import Mathlib.LinearAlgebra.Finsupp.LinearCombination +public import Physlib.Mathematics.LinearCombination /-! # Families of components and their invariants @@ -25,12 +23,13 @@ linear combination `∑ i, c i • T i`, so the span is described by coefficient The second is the heart of the matter. An invariant vector of the span need not have an invariant coefficient function, because the components may be linearly dependent. But the -coefficients contracting to zero form a subspace stable under the action, and when the action -preserves the standard inner product, so does its orthogonal complement. Projecting the -coefficient of an invariant vector onto that complement leaves the vector alone and makes -the coefficient invariant. So an invariant of the span is the contraction of an invariant -coefficient, and classifying invariants of the span reduces to classifying invariant -coefficient functions, a finite linear-algebra problem: `Family.exists_invariant_coeff`. +coefficients contracting to zero form a subspace stable under the action, and when `A g⁻¹` is +the adjoint of `A g` for the standard inner product, so is its orthogonal complement. +Projecting the coefficient of an invariant vector onto that complement leaves the vector alone +and makes the coefficient invariant. So an invariant of the span is the contraction of an +invariant coefficient, and classifying invariants of the span reduces to classifying invariant +coefficient functions, a finite linear-algebra problem: `Family.exists_invariant_coeff`, the +case `g' = g⁻¹` of `Fintype.exists_invariant_coeff_of_adjoint_mem`. The third is peeling. The Standard Model files handle many families at once and remove them one at a time modulo a stable submodule `S` in which the other families are parked. A @@ -81,10 +80,11 @@ lemma sum_pi_two {n : ℕ} {M : Type*} [AddCommMonoid M] (F : (Fin 2 → Fin n) The transformations are a family of linear maps `φ g` on `B`, indexed by a group `G`, and the law says that `φ g` moves a contraction `∑ i, c i • T i` to the contraction against -`A g c`, for a linear action `A g` on coefficient functions. One property of `A` is needed: -`A g⁻¹` is the adjoint of `A g` for the standard inner product on coefficients, which is to -say that `A` is unitary. For an action by real matrices this follows from `A g⁻¹` being the -transpose of `A g` and `A g` commuting with conjugation, `sum_star_mul_of_transpose`. +`A g c`, for a linear map `A g` on coefficient functions. One property of `A` is needed: +`A g⁻¹` is the adjoint of `A g` for the standard inner product on coefficients. This is +unitarity only when `A` is moreover a representation, which is not assumed. For real matrices +it follows from `A g⁻¹` being the transpose of `A g` and `A g` commuting with conjugation, +`sum_star_mul_of_transpose`. -/ @@ -93,24 +93,6 @@ section Complement variable {G : Type*} [Group G] (T : ι → B) (φ : G → B →ₗ[ℂ] B) (A : G → (ι → ℂ) →ₗ[ℂ] (ι → ℂ)) -/-- The contraction, as a linear map on the coefficient space with its standard inner - product. -/ -noncomputable def contractₗ : EuclideanSpace ℂ ι →ₗ[ℂ] B where - toFun c := ∑ i, c.ofLp i • T i - map_add' c c' := by - simp only [WithLp.ofLp_add, Pi.add_apply, add_smul, Finset.sum_add_distrib] - map_smul' z c := by - simp only [WithLp.ofLp_smul, Pi.smul_apply, smul_eq_mul, RingHom.id_apply, Finset.smul_sum, - smul_smul] - -/-- The action on coefficients, on the coefficient space with its standard inner - product. -/ -noncomputable def actₗ (g : G) : EuclideanSpace ℂ ι →ₗ[ℂ] EuclideanSpace ℂ ι where - toFun c := WithLp.toLp 2 (A g c.ofLp) - map_add' c c' := by simp only [WithLp.ofLp_add, map_add, WithLp.toLp_add] - map_smul' z c := by - simp only [WithLp.ofLp_smul, map_smul, RingHom.id_apply, WithLp.toLp_smul] - /-- For an action by real matrices, `A g⁻¹` being the transpose of `A g` and `A g` commuting with conjugation make `A g⁻¹` the adjoint of `A g`. -/ lemma sum_star_mul_of_transpose @@ -124,49 +106,18 @@ lemma sum_star_mul_of_transpose _ = ∑ i, d i * star (A g⁻¹ c i) := h _ = ∑ i, star (A g⁻¹ c i) * d i := by simp_rw [mul_comm] -open scoped InnerProductSpace in -/-- The adjoint property, read on the coefficient space with its standard inner product. -/ -lemma inner_actₗ - (hA : ∀ g (c d : ι → ℂ), ∑ i, star (c i) * A g d i = ∑ i, star (A g⁻¹ c i) * d i) - (g : G) (a b : EuclideanSpace ℂ ι) : - ⟪a, actₗ A g b⟫_ℂ = ⟪actₗ A g⁻¹ a, b⟫_ℂ := by - have h := hA g a.ofLp b.ofLp - simp only [PiLp.inner_apply, RCLike.inner_apply, actₗ, LinearMap.coe_mk, AddHom.coe_mk, - Complex.star_def] at h ⊢ - rw [Finset.sum_congr rfl fun i _ => mul_comm (A g b.ofLp i) _, h] - exact Finset.sum_congr rfl fun i _ => mul_comm _ _ - /-- An invariant of the span of a family is the contraction of an invariant coefficient - function, provided the transformations act on coefficients by a unitary action. -/ + function, provided `A g⁻¹` is the adjoint of `A g` on coefficients. -/ theorem exists_invariant_coeff (hφ : ∀ g (c : ι → ℂ), φ g (∑ i, c i • T i) = ∑ i, A g c i • T i) (hA : ∀ g (c d : ι → ℂ), ∑ i, star (c i) * A g d i = ∑ i, star (A g⁻¹ c i) * d i) {x : B} (hx : x ∈ ⨆ i, ℂ ∙ T i) (hinv : ∀ g, φ g x = x) : - ∃ c : ι → ℂ, x = ∑ i, c i • T i ∧ ∀ g, A g c = c := by - obtain ⟨c, rfl⟩ := (mem_iSup_span_singleton_iff T x).1 hx - have hΦ : ∀ (g : G) (u : EuclideanSpace ℂ ι), - contractₗ T (actₗ A g u) = φ g (contractₗ T u) := fun g u => (hφ g u.ofLp).symm - set K := LinearMap.ker (contractₗ T) with hK - have hKstab : ∀ g, ∀ u ∈ K, actₗ A g u ∈ K := by - intro g u hu - rw [hK, LinearMap.mem_ker] at hu ⊢ - rw [hΦ, hu, map_zero] - obtain ⟨k, hk, k', hk', hkk'⟩ := K.exists_add_mem_mem_orthogonal (WithLp.toLp 2 c) - have hx' : ∑ i, c i • T i = contractₗ T k' := by - have h := congrArg (contractₗ T) hkk' - rw [map_add, LinearMap.mem_ker.1 hk, zero_add] at h - exact h - refine ⟨k'.ofLp, hx', fun g => ?_⟩ - have h1 : actₗ A g k' - k' ∈ K := by - rw [hK, LinearMap.mem_ker, map_sub, sub_eq_zero, hΦ, ← hx', hinv] - have h2 : actₗ A g k' ∈ Kᗮ := by - rw [Submodule.mem_orthogonal] - intro u hu - rw [inner_actₗ A hA] - exact Submodule.inner_right_of_mem_orthogonal (hKstab _ u hu) hk' - have h3 : actₗ A g k' - k' ∈ K ⊓ Kᗮ := ⟨h1, Submodule.sub_mem _ h2 hk'⟩ - rw [Submodule.inf_orthogonal_eq_bot, Submodule.mem_bot, sub_eq_zero] at h3 - exact congrArg WithLp.ofLp h3 + ∃ c : ι → ℂ, x = ∑ i, c i • T i ∧ ∀ g, A g c = c := + Fintype.exists_invariant_coeff_of_adjoint_mem T φ A hφ (fun g => ⟨g⁻¹, fun u v => by + have h := hA g u.ofLp v.ofLp + simp only [PiLp.inner_apply, RCLike.inner_apply, Complex.star_def] at h ⊢ + rw [Finset.sum_congr rfl fun i _ => mul_comm (A g v.ofLp i) _, h] + exact Finset.sum_congr rfl fun i _ => mul_comm _ _⟩) hx hinv end Complement diff --git a/Physlib/Relativity/LorentzGroup/Invariants/Basic.lean b/Physlib/Relativity/LorentzGroup/Invariants/Basic.lean index ab3138ca1..39c702646 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/Basic.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/Basic.lean @@ -7,23 +7,23 @@ module public import Physlib.Relativity.LightConeDeriv public import Physlib.Mathematics.LinearCombination -public import Mathlib.Analysis.InnerProductSpace.Projection.Basic /-! # Invariants of the span of a family of components Every file in this folder asks the same question of a different index pattern. A family `T` of vectors of a complex vector space `B`, indexed by a finite set `ι` and moved by a representation of `SL(2,ℂ)`, spans a subspace of `B`; which of its vectors does the group -leave alone? This file holds the three steps of the answer that do not depend on the pattern. - -The first turns the question into a finite one. A vector of the span is a contraction -`∑ i, c i • T i` for a coefficient function `c : ι → ℂ`, and the group moves such a vector by -moving `c`. The components may satisfy linear relations, so `c` is not determined by the -vector and need not be invariant, but the coefficients contracting to `0` form a subspace `K` -which the group preserves, and so does its orthogonal complement whenever the coefficient -action is closed under taking adjoints. Replacing `c` by its part in `Kᗮ` keeps the vector and -makes `c` invariant: `exists_invariantCoeff`. What is left is a question about `ι`-indexed -tuples of complex numbers. +leave alone? The answer has three steps that do not depend on the pattern. + +The first, general linear algebra, turns the question into a finite one. A vector of the span +is a contraction `∑ i, c i • T i` for a coefficient function `c : ι → ℂ`, and the group moves +such a vector by moving `c`. The components may satisfy linear relations, so `c` is not +determined by the vector and need not be invariant, but the coefficients contracting to `0` form +a subspace `K` which the group preserves, and so does its orthogonal complement whenever the +coefficient action is closed under taking adjoints. Replacing `c` by its part in `Kᗮ` keeps the +vector and makes `c` invariant: `Fintype.exists_invariant_coeff_of_adjoint_mem`, in +`Physlib.Mathematics.LinearCombination`. What is left is a question about `ι`-indexed tuples of +complex numbers. This file holds the other two steps. The second reads that condition off the transformation law. Every family here is moved by a matrix, `repLorentz g (T l) = ∑_a M_g(a, l) • T a`, so the coefficients move by `actMat M_g`, @@ -53,78 +53,14 @@ variable {B : Type*} [AddCommGroup B] [Module ℂ B] /-! -## A. An invariant of the span is the contraction of an invariant coefficient - --/ - -section Complement - -variable {ι : Type} [Fintype ι] {G : Type*} - -/-- Contraction with the components, as a linear map on the coefficients carrying the standard - inner product; `WithLp.toLp 2` and `.ofLp` only translate to the plain function type. -/ -noncomputable def contractₗ (T : ι → B) : EuclideanSpace ℂ ι →ₗ[ℂ] B where - toFun c := ∑ i, c.ofLp i • T i - map_add' c c' := by - simp only [WithLp.ofLp_add, Pi.add_apply, add_smul, Finset.sum_add_distrib] - map_smul' z c := by - simp only [WithLp.ofLp_smul, Pi.smul_apply, smul_eq_mul, RingHom.id_apply, Finset.smul_sum, - smul_smul] - -open scoped InnerProductSpace in -/-- An invariant of the span is the contraction of an invariant coefficient function, provided - the coefficient action `A` has all its adjoints inside the family: for every `g` some `g'` - acts as the adjoint of `g`. Nothing is claimed about uniqueness, the components being - possibly dependent. -/ -theorem exists_invariantCoeff (T : ι → B) (φ : G → B →ₗ[ℂ] B) - (A : G → (ι → ℂ) →ₗ[ℂ] (ι → ℂ)) - (hφ : ∀ (g : G) (c : ι → ℂ), φ g (∑ i, c i • T i) = ∑ i, A g c i • T i) - (hA : ∀ g : G, ∃ g' : G, ∀ u v : EuclideanSpace ℂ ι, - ⟪u, WithLp.toLp 2 (A g v.ofLp)⟫_ℂ = ⟪WithLp.toLp 2 (A g' u.ofLp), v⟫_ℂ) - {x : B} (hx : x ∈ ⨆ i, ℂ ∙ T i) (hinv : ∀ g, φ g x = x) : - ∃ c : ι → ℂ, x = ∑ i, c i • T i ∧ ∀ g, A g c = c := by - classical - obtain ⟨c, rfl⟩ : ∃ c : ι → ℂ, x = ∑ i, c i • T i := by - rw [← Submodule.span_range_eq_iSup, ← Fintype.range_linearCombination, - LinearMap.mem_range] at hx - simpa only [Fintype.linearCombination_apply, eq_comm] using hx - have hcontr : ∀ (g : G) (u : EuclideanSpace ℂ ι), - contractₗ T (WithLp.toLp 2 (A g u.ofLp)) = φ g (contractₗ T u) := - fun g u => (hφ g u.ofLp).symm - set K := LinearMap.ker (contractₗ T) with hK - have hKstab : ∀ (g : G) (u : EuclideanSpace ℂ ι), u ∈ K → - WithLp.toLp 2 (A g u.ofLp) ∈ K := by - intro g u hu - rw [hK, LinearMap.mem_ker] at hu ⊢ - rw [hcontr, hu, map_zero] - obtain ⟨k, hk, k', hk', hkk'⟩ := K.exists_add_mem_mem_orthogonal (WithLp.toLp 2 c) - have hx' : ∑ i, c i • T i = contractₗ T k' := by - have h := congrArg (contractₗ T) hkk' - rwa [map_add, LinearMap.mem_ker.1 hk, zero_add] at h - refine ⟨k'.ofLp, hx', fun g => ?_⟩ - have h1 : WithLp.toLp 2 (A g k'.ofLp) - k' ∈ K := by - rw [hK, LinearMap.mem_ker, map_sub, hcontr, ← hx', hinv, hx', sub_self] - have h2 : WithLp.toLp 2 (A g k'.ofLp) ∈ Kᗮ := by - obtain ⟨g', hg'⟩ := hA g - refine (Submodule.mem_orthogonal _ _).2 fun u hu => ?_ - rw [hg' u k'] - exact Submodule.inner_right_of_mem_orthogonal (hKstab g' u hu) hk' - have h3 : WithLp.toLp 2 (A g k'.ofLp) - k' ∈ K ⊓ Kᗮ := - ⟨h1, Submodule.sub_mem _ h2 hk'⟩ - rw [Submodule.inf_orthogonal_eq_bot, Submodule.mem_bot, sub_eq_zero] at h3 - exact congrArg WithLp.ofLp h3 - -end Complement - -/-! - -## B. Coefficient functions moved by a matrix +## A. Coefficient functions moved by a matrix Every family in this folder is moved by a matrix: `repLorentz g (T l) = ∑_a M_g(a, l) • T a`, with `M_g` built from the Lorentz matrix of `g`, from `g` itself on Weyl indices, or from both. The coefficients then move by `actMat M_g`, whose adjoint is the action of the conjugate -transpose of `M_g`. So the hypothesis of A reads: for every `g` some `g'` has `M_{g'}` the -conjugate transpose of `M_g`. In every case below `g'` is `g†`. +transpose of `M_g`. So the adjoint hypothesis of `Fintype.exists_invariant_coeff_of_adjoint_mem` +reads: for every `g` some `g'` has `M_{g'}` the conjugate transpose of `M_g`. In every case below +`g'` is `g†`. The weight argument is also generic: a covector that the transposed matrix reproduces up to a scalar reads off a component that `actMat M_g` scales by that scalar, so an invariant @@ -168,7 +104,8 @@ theorem exists_invariantCoeff_matrix (T : ι → B) (φ : G → B →ₗ[ℂ] B) (hM : ∀ g : G, ∃ g' : G, ∀ a d, M g' a d = star (M g d a)) {x : B} (hx : x ∈ ⨆ i, ℂ ∙ T i) (hinv : ∀ g, φ g x = x) : ∃ c : ι → ℂ, (∀ g, actMat (M g) c = c) ∧ x = ∑ i, c i • T i := by - obtain ⟨c, hc, hinvc⟩ := exists_invariantCoeff T φ (fun g => actMatₗ (M g)) + obtain ⟨c, hc, hinvc⟩ := Fintype.exists_invariant_coeff_of_adjoint_mem T φ + (fun g => actMatₗ (M g)) (fun g c => (φ g).map_sum_smul_of_forall_eq T T (M g) (hT g) c) (fun g => by obtain ⟨g', hg'⟩ := hM g @@ -205,7 +142,7 @@ end Mat /-! -## C. Coefficient tensors on spacetime indices +## B. Coefficient tensors on spacetime indices -/ From 77c7da42a4c9634e8de21d1bc963ec06c50c9588 Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Thu, 24 Sep 2026 11:48:15 +0400 Subject: [PATCH 355/367] refactor peeling.lean --- Physlib.lean | 3 +- Physlib/Mathematics/InvariantReduction.lean | 374 ++++++++ Physlib/Mathematics/LinearCombination.lean | 34 + .../MassWeight/Filtration.lean | 41 +- .../MassWeight/Invariants.lean | 124 +-- .../YukawaSector/Families/BarHiggs.lean | 10 +- .../YukawaSector/Families/Higgs.lean | 10 +- .../YukawaSector/Families/Symbols.lean | 4 +- .../YukawaSector/MassDimEight.lean | 297 ++++--- .../GaugeGroup/Invariants/Basic.lean | 70 +- .../GaugeGroup/Invariants/IsSU2Adjoint.lean | 15 +- .../Invariants/IsSU2AntiFundamental.lean | 46 + .../GaugeGroup/Invariants/IsSU2BiAdjoint.lean | 8 +- .../Invariants/IsSU2BiFundamental.lean | 27 +- .../Invariants/IsSU2QuadFundamental.lean | 11 +- .../GaugeGroup/Invariants/IsSU3Adjoint.lean | 15 +- .../GaugeGroup/Invariants/IsSU3BiAdjoint.lean | 9 +- .../Invariants/IsSU3BiFundamental.lean | 16 +- .../Invariants/IsSU3FunAntiFun.lean | 28 +- .../StandardModel/InvariantReduction.lean | 232 +++++ .../MassWeight/KineticFamilies.lean | 89 +- .../MassWeight/KineticTerms.lean | 246 +++--- .../MassWeight/MassDimEight.lean | 275 +++--- .../MassWeight/MassDimLTEight.lean | 2 +- Physlib/Particles/StandardModel/Peeling.lean | 831 ------------------ .../LorentzGroup/Invariants/IsBiLeftWeyl.lean | 81 +- .../Invariants/IsLeftRightWeyl.lean | 10 +- .../Invariants/IsVectorLeftRightWeyl.lean | 9 + .../Invariants/LorentzCovariance.lean | 16 - .../LorentzGroup/Invariants/RankFour.lean | 40 +- .../LorentzGroup/Invariants/RankOne.lean | 10 +- .../LorentzGroup/Invariants/RankThree.lean | 10 +- .../LorentzGroup/Invariants/RankTwo.lean | 16 +- 33 files changed, 1510 insertions(+), 1499 deletions(-) create mode 100644 Physlib/Mathematics/InvariantReduction.lean create mode 100644 Physlib/Particles/StandardModel/InvariantReduction.lean delete mode 100644 Physlib/Particles/StandardModel/Peeling.lean diff --git a/Physlib.lean b/Physlib.lean index a9c250be0..065d2a852 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -208,6 +208,7 @@ public import Physlib.Mathematics.InnerProductSpace.Basic public import Physlib.Mathematics.InnerProductSpace.Calculus public import Physlib.Mathematics.InnerProductSpace.Gaussian public import Physlib.Mathematics.InnerProductSpace.Submodule +public import Physlib.Mathematics.InvariantReduction public import Physlib.Mathematics.KroneckerDelta.Basic public import Physlib.Mathematics.KroneckerDelta.Contraction public import Physlib.Mathematics.LeviCivita.Basic @@ -387,6 +388,7 @@ public import Physlib.Particles.StandardModel.HiggsBoson.JetAlgebra.Algebra public import Physlib.Particles.StandardModel.HiggsBoson.JetAlgebra.Basic public import Physlib.Particles.StandardModel.HiggsBoson.MatterField public import Physlib.Particles.StandardModel.HiggsBoson.Potential +public import Physlib.Particles.StandardModel.InvariantReduction public import Physlib.Particles.StandardModel.IsFermionSector.Basic public import Physlib.Particles.StandardModel.IsFermionSector.Components public import Physlib.Particles.StandardModel.IsFermionSector.DerivSubmodule.Centre @@ -438,7 +440,6 @@ public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.Prod public import Physlib.Particles.StandardModel.Matter.FermionicAlgebra.TransformsIn public import Physlib.Particles.StandardModel.Model.Consistency public import Physlib.Particles.StandardModel.Model.LeptonDoublet -public import Physlib.Particles.StandardModel.Peeling public import Physlib.Particles.StandardModel.Representations public import Physlib.Particles.StandardModel.Solution public import Physlib.Particles.SuperSymmetry.MSSMNu.AnomalyCancellation.B3 diff --git a/Physlib/Mathematics/InvariantReduction.lean b/Physlib/Mathematics/InvariantReduction.lean new file mode 100644 index 000000000..4683a5155 --- /dev/null +++ b/Physlib/Mathematics/InvariantReduction.lean @@ -0,0 +1,374 @@ +/- +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 Mathlib.Algebra.Algebra.Operations +public import Mathlib.LinearAlgebra.Quotient.Basic +/-! +# Reducing invariants modulo a stable submodule + +Let `σ : G → B →ₗ[R] B` be a family of linear maps, indexed by an arbitrary type. No group or +representation law is assumed. An element `x` is invariant when `σ g x = x` for every `g`, and +a submodule is stable when every `σ g` carries it into itself. + +The relation `ReducesInvariantsTo σ V W` says: for every stable submodule `S`, every invariant +of `V ⊔ S` lies in `W ⊔ S`. It is transitive, antitone in the source, monotone in the target +and, for stable sources and a stable target, closed under finite joins of the source. A +classification of the invariants of a family can therefore be applied one family at a time, +the other families being kept in the stable remainder `S`. + +Such a reduction is usually proved in the quotient `B ⧸ S`. If every invariant of the image of +`V` in `B ⧸ S` lies in the image of `W`, then every invariant of `V ⊔ S` lies in `W ⊔ S`, and +when `W` is pointwise fixed the remainder in `S` is itself invariant: +`IsStableUnder.exists_add_of_quotient`. The quotient hypothesis is not implied by a +classification of the invariants of `V` alone, since the invariants of `B ⧸ S` are the classes +`x` with `σ g x - x ∈ S`. + +`InvariantReductionToSpan σ V` packages a reduction of `V` to the span of one fixed vector, +the form in which the classification theorems are applied. + +- A. Stable and fixed submodules +- B. Reducing invariants +- C. Reduction through a quotient +- D. Reduction to the span of one vector + +-/ + +@[expose] public section + +/-! + +## A. Stable and fixed submodules + +-/ + +section Stability + +variable {R B G : Type*} [Semiring R] [AddCommMonoid B] [Module R B] + +/-- A submodule carried into itself by every map of the family `σ`. -/ +def IsStableUnder (σ : G → B →ₗ[R] B) (V : Submodule R B) : Prop := + ∀ g, ∀ y ∈ V, σ g y ∈ V + +/-- A submodule fixed pointwise by every map of the family `σ`. -/ +def IsFixedBy (σ : G → B →ₗ[R] B) (V : Submodule R B) : Prop := + ∀ g, ∀ y ∈ V, σ g y = y + +variable {σ : G → B →ₗ[R] B} + +/-- Stability as an inclusion of images. -/ +lemma isStableUnder_iff_map {V : Submodule R B} : + IsStableUnder σ V ↔ ∀ g, Submodule.map (σ g) V ≤ V := by + constructor + · rintro hV g _ ⟨y, hy, rfl⟩ + exact hV g y hy + · exact fun hV g y hy => hV g ⟨y, hy, rfl⟩ + +/-- A pointwise-fixed submodule is stable. -/ +lemma IsFixedBy.isStableUnder {V : Submodule R B} (hV : IsFixedBy σ V) : IsStableUnder σ V := + fun g y hy => by rw [hV g y hy]; exact hy + +/-- A join of two pointwise-fixed submodules is pointwise fixed. -/ +lemma IsFixedBy.sup {V V' : Submodule R B} (hV : IsFixedBy σ V) (hV' : IsFixedBy σ V') : + IsFixedBy σ (V ⊔ V') := by + intro g y hy + obtain ⟨a, ha, b, hb, rfl⟩ := Submodule.mem_sup.1 hy + rw [map_add, hV g a ha, hV' g b hb] + +/-- The zero submodule is stable. -/ +lemma isStableUnder_bot : IsStableUnder σ (⊥ : Submodule R B) := by + intro g y hy + rw [Submodule.mem_bot] at hy + simp [hy] + +/-- A join of two stable submodules is stable. -/ +lemma IsStableUnder.sup {V V' : Submodule R B} (hV : IsStableUnder σ V) + (hV' : IsStableUnder σ V') : IsStableUnder σ (V ⊔ V') := + isStableUnder_iff_map.2 fun g => by + rw [Submodule.map_sup] + exact sup_le_sup (isStableUnder_iff_map.1 hV g) (isStableUnder_iff_map.1 hV' g) + +/-- An indexed join of stable submodules is stable. The index is a `Sort`, so this covers + the bounded join `⨆ i ∈ s, V i`. -/ +lemma isStableUnder_iSup {ι : Sort*} {V : ι → Submodule R B} + (hV : ∀ i, IsStableUnder σ (V i)) : IsStableUnder σ (⨆ i, V i) := + isStableUnder_iff_map.2 fun g => by + rw [Submodule.map_iSup] + exact iSup_mono fun i => isStableUnder_iff_map.1 (hV i) g + +/-- The span of a fixed vector is pointwise fixed. -/ +lemma isFixedBy_span_singleton {b : B} (hb : ∀ g, σ g b = b) : IsFixedBy σ (R ∙ b) := by + intro g y hy + obtain ⟨c, rfl⟩ := Submodule.mem_span_singleton.1 hy + rw [map_smul, hb] + +/-- An indexed join of pointwise-fixed submodules is pointwise fixed. -/ +lemma isFixedBy_iSup {ι : Sort*} {V : ι → Submodule R B} (hV : ∀ i, IsFixedBy σ (V i)) : + IsFixedBy σ (⨆ i, V i) := by + intro g y hy + refine Submodule.iSup_induction (motive := fun z => σ g z = z) V hy (fun i z hz => hV i g z hz) + (map_zero _) fun z z' hz hz' => by rw [map_add, hz, hz'] + +/-- The span of a family of fixed vectors is pointwise fixed. -/ +lemma isFixedBy_iSup_span_singleton {ι : Sort*} {T : ι → B} (hT : ∀ i g, σ g (T i) = T i) : + IsFixedBy σ (⨆ i, R ∙ T i) := + isFixedBy_iSup fun i => isFixedBy_span_singleton (hT i) + +/-- The span of a family is stable when each map sends each member into the span. -/ +lemma isStableUnder_iSup_span_singleton {ι : Type*} {T : ι → B} + (hT : ∀ g i, σ g (T i) ∈ ⨆ j, R ∙ T j) : IsStableUnder σ (⨆ i, R ∙ T i) := + isStableUnder_iff_map.2 fun g => by + rw [Submodule.map_iSup] + exact iSup_le fun i => by + rw [Submodule.map_span, Set.image_singleton, Submodule.span_singleton_le_iff_mem] + exact hT g i + +/-- The span of a finite family is stable when each map sends each member to a combination + of the family. -/ +lemma isStableUnder_iSup_span_singleton_of_sum {ι : Type*} [Fintype ι] {T : ι → B} + (hT : ∀ g i, ∃ c : ι → R, σ g (T i) = ∑ a, c a • T a) : + IsStableUnder σ (⨆ i, R ∙ T i) := by + refine isStableUnder_iSup_span_singleton fun g i => ?_ + obtain ⟨c, hc⟩ := hT g i + rw [hc] + exact sum_mem fun a _ => Submodule.smul_mem _ _ + (Submodule.mem_iSup_of_mem a (Submodule.mem_span_singleton_self _)) + +/-- A product of two stable submodules of an algebra is stable under maps respecting + multiplication. -/ +lemma IsStableUnder.mul {R A : Type*} [CommSemiring R] [Semiring A] [Algebra R A] + {σ : G → A →ₗ[R] A} (hσ : ∀ g (a b : A), σ g (a * b) = σ g a * σ g b) + {V V' : Submodule R A} (hV : IsStableUnder σ V) (hV' : IsStableUnder σ V') : + IsStableUnder σ (V * V') := + isStableUnder_iff_map.2 fun g => by + rw [Submodule.map_le_iff_le_comap] + refine Submodule.mul_le.2 fun a ha b hb => ?_ + show σ g (a * b) ∈ V * V' + rw [hσ] + exact Submodule.mul_mem_mul (hV g a ha) (hV' g b hb) + +end Stability + +/-! + +## B. Reducing invariants + +To reduce `V₁ ⊔ V₂` to `W`, the summand `V₂` is first moved into the remainder, which needs `V₂` +stable; the result lies in `W ⊔ (V₂ ⊔ S)`, and reducing `V₂` from there needs `W` stable. + +-/ + +section Reduction + +variable {R B G : Type*} [Semiring R] [AddCommMonoid B] [Module R B] {σ : G → B →ₗ[R] B} + +/-- Every invariant of `V ⊔ S`, for `S` a `σ`-stable submodule, lies in `W ⊔ S`. -/ +def ReducesInvariantsTo (σ : G → B →ₗ[R] B) (V W : Submodule R B) : Prop := + ∀ S : Submodule R B, IsStableUnder σ S → ∀ x ∈ V ⊔ S, (∀ g, σ g x = x) → x ∈ W ⊔ S + +/-- A submodule reduces to any submodule containing it. -/ +lemma reducesInvariantsTo_of_le {V W : Submodule R B} (hVW : V ≤ W) : + ReducesInvariantsTo σ V W := + fun S _ _ hx _ => sup_le_sup_right hVW S hx + +/-- A reduction restricts to a smaller source. -/ +lemma ReducesInvariantsTo.mono_left {V V' W : Submodule R B} (hP : ReducesInvariantsTo σ V' W) + (hV : V ≤ V') : ReducesInvariantsTo σ V W := + fun S hS x hx hinv => hP S hS x (sup_le_sup_right hV S hx) hinv + +/-- A reduction extends to a larger target. -/ +lemma ReducesInvariantsTo.mono_right {V W W' : Submodule R B} + (hP : ReducesInvariantsTo σ V W') (hW : W' ≤ W) : ReducesInvariantsTo σ V W := + fun S hS x hx hinv => sup_le_sup_right hW S (hP S hS x hx hinv) + +/-- Successive reductions compose. -/ +lemma ReducesInvariantsTo.trans {V W W' : Submodule R B} (hP : ReducesInvariantsTo σ V W) + (hQ : ReducesInvariantsTo σ W W') : ReducesInvariantsTo σ V W' := + fun S hS x hx hinv => hQ S hS x (hP S hS x hx hinv) hinv + +/-- Reductions of `V` and of a stable `V'` to a common stable target combine to a reduction of + `V ⊔ V'`. -/ +lemma ReducesInvariantsTo.sup {V V' W : Submodule R B} (hP : ReducesInvariantsTo σ V W) + (hQ : ReducesInvariantsTo σ V' W) (hV' : IsStableUnder σ V') (hW : IsStableUnder σ W) : + ReducesInvariantsTo σ (V ⊔ V') W := by + intro S hS x hx hinv + have h : x ∈ W ⊔ (V' ⊔ S) := hP (V' ⊔ S) (hV'.sup hS) x (by rwa [← sup_assoc]) hinv + rw [sup_left_comm] at h + have h' := hQ (W ⊔ S) (hW.sup hS) x h hinv + rwa [← sup_assoc, sup_idem] at h' + +/-- Reductions of stable submodules to a common stable target combine over a finite set. -/ +lemma ReducesInvariantsTo.biSup {ι : Type*} [DecidableEq ι] {V : ι → Submodule R B} + {W : Submodule R B} (hP : ∀ i, ReducesInvariantsTo σ (V i) W) + (hV : ∀ i, IsStableUnder σ (V i)) (hW : IsStableUnder σ W) (s : Finset ι) : + ReducesInvariantsTo σ (⨆ i ∈ s, V i) W := by + induction s using Finset.induction_on with + | empty => exact reducesInvariantsTo_of_le (by simp) + | @insert a s _ ih => + rw [Finset.iSup_insert] + exact (hP a).sup ih (isStableUnder_iSup fun i => isStableUnder_iSup fun _ => hV i) hW + +/-- Reductions of stable submodules to a common stable target combine over a finite index + type. -/ +lemma ReducesInvariantsTo.iSup {ι : Type*} [Fintype ι] [DecidableEq ι] + {V : ι → Submodule R B} {W : Submodule R B} (hP : ∀ i, ReducesInvariantsTo σ (V i) W) + (hV : ∀ i, IsStableUnder σ (V i)) (hW : IsStableUnder σ W) : + ReducesInvariantsTo σ (⨆ i, V i) W := + (ReducesInvariantsTo.biSup hP hV hW Finset.univ).mono_left + (iSup_le fun i => le_iSup₂_of_le i (Finset.mem_univ i) le_rfl) + +/-- A reduction for the subfamily `σ ∘ ι` is a reduction for `σ`: an invariant of `σ` is an + invariant of the subfamily, and a `σ`-stable submodule is stable under the subfamily. -/ +lemma ReducesInvariantsTo.comp {G' : Type*} (ι : G' → G) {V W : Submodule R B} + (hP : ReducesInvariantsTo (fun g' => σ (ι g')) V W) : ReducesInvariantsTo σ V W := + fun S hS x hx hinv => hP S (fun g' y hy => hS (ι g') y hy) x hx fun g' => hinv (ι g') + +end Reduction + +/-! + +## C. Reduction through a quotient + +For a `σ`-stable `S`, the maps `S.mapQ S (σ g) _` act on `B ⧸ S`. The hypotheses below classify +invariants of that action on the image of the source, which is where a classification valid in +every module is applied. + +-/ + +/-- The image of the span of a family is the span of the images. -/ +lemma Submodule.map_iSup_span_singleton {R M M₂ ι : Type*} [Semiring R] [AddCommMonoid M] + [Module R M] [AddCommMonoid M₂] [Module R M₂] (f : M →ₗ[R] M₂) (T : ι → M) : + (⨆ i, R ∙ T i).map f = ⨆ i, R ∙ f (T i) := by + simp only [Submodule.map_iSup, Submodule.map_span, Set.image_singleton] + +section Quotient + +variable {R B G : Type*} [Ring R] [AddCommGroup B] [Module R B] {σ : G → B →ₗ[R] B} + {S V W : Submodule R B} + +/-- An invariant of `V ⊔ S` lies in `W ⊔ S` when every invariant of the image of `V` in + `B ⧸ S` lies in the image of `W`. -/ +lemma IsStableUnder.mem_sup_of_quotient (hS : IsStableUnder σ S) + (hclass : ∀ x ∈ V.map S.mkQ, (∀ g, S.mapQ S (σ g) (hS g) x = x) → x ∈ W.map S.mkQ) + {x : B} (hx : x ∈ V ⊔ S) (hinv : ∀ g, σ g x = x) : x ∈ W ⊔ S := by + rw [sup_comm, ← Submodule.comap_map_mkQ, Submodule.mem_comap] at hx ⊢ + exact hclass _ hx fun g => by rw [Submodule.mkQ_apply, Submodule.mapQ_apply, hinv] + +/-- `V` reduces to `W` when, for every stable `S`, every invariant of the image of `V` in + `B ⧸ S` lies in the image of `W`. -/ +lemma reducesInvariantsTo_of_quotient + (hclass : ∀ S : Submodule R B, ∀ hS : IsStableUnder σ S, ∀ x ∈ V.map S.mkQ, + (∀ g, S.mapQ S (σ g) (hS g) x = x) → x ∈ W.map S.mkQ) : + ReducesInvariantsTo σ V W := + fun S hS _ hx hinv => hS.mem_sup_of_quotient (hclass S hS) hx hinv + +/-- An invariant of `W ⊔ S`, for `W` pointwise fixed, is an element of `W` plus an invariant + element of `S`. -/ +lemma IsFixedBy.exists_add_of_mem_sup (hW : IsFixedBy σ W) {x : B} (hx : x ∈ W ⊔ S) + (hinv : ∀ g, σ g x = x) : ∃ w ∈ W, ∃ y ∈ S, x = w + y ∧ ∀ g, σ g y = y := by + obtain ⟨w, hw, y, hy, rfl⟩ := Submodule.mem_sup.1 hx + refine ⟨w, hw, y, hy, rfl, fun g => add_left_cancel (a := w) ?_⟩ + have h := hinv g + rwa [map_add, hW g w hw] at h + +/-- Quotient to remainder: when every invariant of the image of `V` in `B ⧸ S` lies in the + image of a pointwise-fixed `W`, an invariant of `V ⊔ S` is an element of `W` plus an + invariant element of `S`. -/ +lemma IsStableUnder.exists_add_of_quotient (hS : IsStableUnder σ S) (hW : IsFixedBy σ W) + (hclass : ∀ x ∈ V.map S.mkQ, (∀ g, S.mapQ S (σ g) (hS g) x = x) → x ∈ W.map S.mkQ) + {x : B} (hx : x ∈ V ⊔ S) (hinv : ∀ g, σ g x = x) : + ∃ w ∈ W, ∃ y ∈ S, x = w + y ∧ ∀ g, σ g y = y := + hW.exists_add_of_mem_sup (hS.mem_sup_of_quotient hclass hx hinv) hinv + +/-- Quotient to remainder for a single fixed vector `v`: when every invariant of the image of + `V` in `B ⧸ S` is a multiple of the class of `v`, an invariant of `V ⊔ S` is a multiple of + `v` plus an invariant element of `S`. -/ +lemma IsStableUnder.exists_smul_add_of_quotient (hS : IsStableUnder σ S) {v : B} + (hv : ∀ g, σ g v = v) + (hclass : ∀ x ∈ V.map S.mkQ, (∀ g, S.mapQ S (σ g) (hS g) x = x) → ∃ c : R, x = c • S.mkQ v) + {x : B} (hx : x ∈ V ⊔ S) (hinv : ∀ g, σ g x = x) : + ∃ c : R, ∃ y ∈ S, x = c • v + y ∧ ∀ g, σ g y = y := by + obtain ⟨w, hw, y, hy, rfl, hyinv⟩ := hS.exists_add_of_quotient (isFixedBy_span_singleton hv) + (fun x hx hinv => by + obtain ⟨c, rfl⟩ := hclass x hx hinv + exact ⟨c • v, Submodule.smul_mem _ c (Submodule.mem_span_singleton_self v), + map_smul _ c v⟩) hx hinv + obtain ⟨c, rfl⟩ := Submodule.mem_span_singleton.1 hw + exact ⟨c, y, hy, rfl, hyinv⟩ + +end Quotient + +/-! + +## D. Reduction to the span of one vector + +-/ + +section Span + +variable {R B G : Type*} [Semiring R] [AddCommMonoid B] [Module R B] {σ : G → B →ₗ[R] B} + +/-- A stable submodule `V` together with a fixed vector such that, for every stable `S`, every + invariant of `V ⊔ S` is a multiple of that vector plus an element of `S`. The vector need not + be nonzero or lie in `V`. -/ +structure InvariantReductionToSpan (σ : G → B →ₗ[R] B) (V : Submodule R B) where + /-- The vector whose span receives the invariants of `V`. -/ + spanningVector : B + /-- The submodule is stable. -/ + stable : IsStableUnder σ V + /-- The spanning vector is invariant. -/ + spanningVector_fixed : ∀ g, σ g spanningVector = spanningVector + /-- An invariant of `V ⊔ S`, for `S` stable, is a multiple of the spanning vector plus an + element of `S`. -/ + reduce : ∀ S : Submodule R B, IsStableUnder σ S → ∀ x ∈ V ⊔ S, (∀ g, σ g x = x) → + ∃ c : R, ∃ y ∈ S, x = c • spanningVector + y + +namespace InvariantReductionToSpan + +variable {V : Submodule R B} + +/-- The submodule reduces to the span of the spanning vector. -/ +lemma reducesInvariantsTo (r : InvariantReductionToSpan σ V) : + ReducesInvariantsTo σ V (R ∙ r.spanningVector) := by + intro S hS x hx hinv + obtain ⟨c, y, hy, rfl⟩ := r.reduce S hS x hx hinv + exact Submodule.add_mem_sup (Submodule.smul_mem _ c (Submodule.mem_span_singleton_self _)) hy + +/-- A finite family of reductions to spans reduces the join of the submodules to the span of + the spanning vectors. -/ +lemma reducesInvariantsTo_iSup {κ : Type*} [Fintype κ] [DecidableEq κ] + {V : κ → Submodule R B} (r : ∀ k, InvariantReductionToSpan σ (V k)) : + ReducesInvariantsTo σ (⨆ k, V k) (⨆ k, R ∙ (r k).spanningVector) := + ReducesInvariantsTo.iSup + (fun k => (r k).reducesInvariantsTo.mono_right + (le_iSup (fun k' => R ∙ (r k').spanningVector) k)) + (fun k => (r k).stable) + (isFixedBy_iSup_span_singleton fun k => (r k).spanningVector_fixed).isStableUnder + +/-- The span of a fixed vector reduces to itself. -/ +def ofFixed (b : B) (hb : ∀ g, σ g b = b) : + InvariantReductionToSpan σ (R ∙ b) where + spanningVector := b + stable := (isFixedBy_span_singleton hb).isStableUnder + spanningVector_fixed := hb + reduce S _ x hx _ := by + obtain ⟨a, ha, y, hy, rfl⟩ := Submodule.mem_sup.1 hx + obtain ⟨c, rfl⟩ := Submodule.mem_span_singleton.1 ha + exact ⟨c, y, hy, rfl⟩ + +/-- The span of a nonempty family whose members all equal one fixed vector reduces to the + span of that vector. -/ +def ofFixedFamily {ι : Type*} [Nonempty ι] {T : ι → B} (b : B) + (hTb : ∀ i, T i = b) (hb : ∀ g, σ g b = b) : InvariantReductionToSpan σ (⨆ i, R ∙ T i) := + have hspan : (⨆ i, R ∙ T i) = R ∙ b := by simp only [hTb, iSup_const] + { spanningVector := b + stable := hspan ▸ (ofFixed b hb).stable + spanningVector_fixed := hb + reduce := hspan ▸ (ofFixed b hb).reduce } + +end InvariantReductionToSpan + +end Span diff --git a/Physlib/Mathematics/LinearCombination.lean b/Physlib/Mathematics/LinearCombination.lean index 83638e5f6..24e46a0b6 100644 --- a/Physlib/Mathematics/LinearCombination.lean +++ b/Physlib/Mathematics/LinearCombination.lean @@ -18,6 +18,10 @@ acting on the coefficients. Over `ℂ`, when linear maps on `B` move combinations by moving their coefficients, a combination fixed by all the maps is the combination of fixed coefficients, provided the coefficient maps have their adjoints among themselves: `Fintype.exists_invariant_coeff_of_adjoint_mem`. + +The span `⨆ i, R ∙ T i` of a family is bounded through its members: the range of a linear +map is the span of the images of a basis, and a product of submodules lying in spans of +families lies in any submodule containing the products of their members. -/ @[expose] public section @@ -85,3 +89,33 @@ lemma Fintype.exists_invariant_coeff_of_adjoint_mem {ι G B : Type*} [Fintype ι have h3 : WithLp.toLp 2 (A g k'.ofLp) - k' ∈ K ⊓ Kᗮ := ⟨h1, Submodule.sub_mem _ h2 hk'⟩ rw [Submodule.inf_orthogonal_eq_bot, Submodule.mem_bot, sub_eq_zero] at h3 exact congrArg WithLp.ofLp h3 + +/-- The range of a linear map is the span of the images of a basis. -/ +lemma LinearMap.range_eq_iSup_span_basis {ι R M N : Type*} [Semiring R] [AddCommMonoid M] + [Module R M] [AddCommMonoid N] [Module R N] (b : Module.Basis ι R M) (f : M →ₗ[R] N) : + LinearMap.range f = ⨆ i, R ∙ f (b i) := by + rw [LinearMap.range_eq_map, ← b.span_eq, Submodule.map_span, ← Set.range_comp, + Submodule.span_range_eq_iSup] + rfl + +/-- A product of two submodules, each inside the span of a family, lies in any submodule + containing the products of the members of the two families. -/ +lemma Submodule.mul_le_of_le_iSup_span {ι κ R A : Type*} [CommSemiring R] [Semiring A] + [Algebra R A] {V V' X : Submodule R A} {a : ι → A} {b : κ → A} + (hV : V ≤ ⨆ i, R ∙ a i) (hV' : V' ≤ ⨆ j, R ∙ b j) (hX : ∀ i j, a i * b j ∈ X) : + V * V' ≤ X := by + refine (mul_le_mul' hV hV').trans ?_ + rw [← Submodule.span_range_eq_iSup, ← Submodule.span_range_eq_iSup, Submodule.span_mul_span, + Submodule.span_le] + rintro _ ⟨_, ⟨i, rfl⟩, _, ⟨j, rfl⟩, rfl⟩ + exact hX i j + +/-- The three-factor form of `Submodule.mul_le_of_le_iSup_span`. -/ +lemma Submodule.mul_mul_le_of_le_iSup_span {ι κ ν R A : Type*} [CommSemiring R] [Semiring A] + [Algebra R A] {V V' V'' X : Submodule R A} {a : ι → A} {b : κ → A} {c : ν → A} + (hV : V ≤ ⨆ i, R ∙ a i) (hV' : V' ≤ ⨆ j, R ∙ b j) (hV'' : V'' ≤ ⨆ k, R ∙ c k) + (hX : ∀ i j k, a i * (b j * c k) ∈ X) : V * (V' * V'') ≤ X := + mul_le_of_le_iSup_span hV + (mul_le_of_le_iSup_span (X := ⨆ p : κ × ν, R ∙ (b p.1 * c p.2)) hV' hV'' + fun j k => Submodule.mem_iSup_of_mem (j, k) (Submodule.mem_span_singleton_self _)) + fun i p => hX i p.1 p.2 diff --git a/Physlib/Particles/StandardModel/CovAlgebraRealization/MassWeight/Filtration.lean b/Physlib/Particles/StandardModel/CovAlgebraRealization/MassWeight/Filtration.lean index 2b4d8f8a9..e60aadd28 100644 --- a/Physlib/Particles/StandardModel/CovAlgebraRealization/MassWeight/Filtration.lean +++ b/Physlib/Particles/StandardModel/CovAlgebraRealization/MassWeight/Filtration.lean @@ -27,11 +27,11 @@ Section B settles what the weight-zero piece is: the only word of total weight z empty word, every generator carrying positive weight, so `massWeightSubmodule 0` is exactly the scalars, and the unit is fixed by both groups because both act by algebra maps. -The classification then runs as it does for the grading. `Peels` is closed under joins in -its source, and the filtration is a join: each weight from one to eight peels to the -Standard-Model span of that weight by `peels_massWeightSubmodule`, weight zero peels to -itself, and the join of the nine is a peeling of the filtration. No independence of the -sectors, and none of the weights, is used anywhere. +The classification then runs as it does for the grading. `ReducesInvariantsTo` is closed under +joins in its source, and the filtration is a join: each weight from one to eight reduces to +the Standard-Model span of that weight by `reducesInvariantsTo_massWeightSubmodule`, weight +zero reduces to itself, and the join of the nine is a reduction of the filtration. No independence +of the sectors, and none of the weights, is used anywhere. The answer at bound eight is the whole of the Standard Model below and at mass dimension four: the constant term, the Higgs mass term `H† H`, and the dimension-four Lagrangian. @@ -39,7 +39,7 @@ four: the constant term, the Higgs mass term `H† H`, and the dimension-four La - A. The mass-weight filtration - B. The constant term at weight zero - C. The span of the filtration -- D. Peeling the filtration +- D. Reducing the filtration - E. The classification up to mass dimension four - F. The Standard Model Lagrangian with its constant and mass terms @@ -94,7 +94,7 @@ lemma massWeightSubmoduleLE_mono {w w' : ℕ} (hw : w ≤ w') : h.massWeightSubmodule_le_massWeightSubmoduleLE (hk.trans hw) /-- The filtration as a join over a finite index type, which is the form in which the - peeling of a join consumes it. -/ + reduction of a join consumes it. -/ lemma massWeightSubmoduleLE_eq_iSup (w : ℕ) : h.massWeightSubmoduleLE w = ⨆ k : Fin (w + 1), h.massWeightSubmodule (k : ℕ) := le_antisymm @@ -223,27 +223,27 @@ lemma standardModelSpanLE_eight : /-! -## D. Peeling the filtration +## D. Reducing the filtration -/ -/-- The filtration peels to its span, at every bound up to eight. The filtration is a - join of the graded pieces, each of them stable under both groups, and `Peels` is closed - under joins in its source: the weights are taken one at a time, each in turn joining the - error term of the others. At positive weight the graded peeling of `Invariants.lean` is - used; at weight zero a submodule peels to itself, the constant term being carried in the +/-- The filtration reduces to its span, at every bound up to eight. The filtration is a + join of the graded pieces, each of them stable under both groups, and `ReducesInvariantsTo` is + closed under joins in its source: the weights are taken one at a time, each in turn joining the + error term of the others. At positive weight the graded reduction of `Invariants.lean` is + used; at weight zero a submodule reduces to itself, the constant term being carried in the span. -/ -lemma peels_massWeightSubmoduleLE {w : ℕ} (hw : w ≤ 8) : - Peels (gaugeLorentzMaps repGauge repLorentz) (h.massWeightSubmoduleLE w) +lemma reducesInvariantsTo_massWeightSubmoduleLE {w : ℕ} (hw : w ≤ 8) : + ReducesInvariantsTo (gaugeLorentzMaps repGauge repLorentz) (h.massWeightSubmoduleLE w) (h.standardModelSpanLE w) := by rw [h.massWeightSubmoduleLE_eq_iSup] - refine Peels.iSup (fun k => ?_) (fun _ => ?_) + refine ReducesInvariantsTo.iSup (fun k => ?_) (fun _ => ?_) (h.isFixedBy_standardModelSpanLE w).isStableUnder · have hkw : (k : ℕ) ≤ w := Nat.lt_succ_iff.1 k.isLt rcases Nat.eq_zero_or_pos (k : ℕ) with hk0 | hk0 · rw [hk0] - exact peels_of_le (h.massWeightSubmodule_zero_le_standardModelSpanLE w) - · exact (h.peels_massWeightSubmodule hk0 (hkw.trans hw)).mono_right + exact reducesInvariantsTo_of_le (h.massWeightSubmodule_zero_le_standardModelSpanLE w) + · exact (h.reducesInvariantsTo_massWeightSubmodule hk0 (hkw.trans hw)).mono_right (h.standardModelSpan_le_standardModelSpanLE hkw) · exact isStableUnder_gaugeLorentzMaps_iff.2 ⟨fun g _ hy => h.repGauge_mem_massWeightSubmodule g hy, @@ -271,8 +271,9 @@ theorem exists_mem_standardModelSpanLE_of_gauge_and_lorentz_invariant (w : ℕ) ∧ (∀ g : SL(2,ℂ), repLorentz g y = y) ∧ x - y ∈ h.standardModelSpanLE w := by obtain ⟨z, hz, y, hy, rfl⟩ := Submodule.mem_sup.1 - (h.peels_massWeightSubmoduleLE hw S (isStableUnder_gaugeLorentzMaps_iff.2 ⟨hS, hSL⟩) - x hx (forall_gaugeLorentzMaps_eq_self_iff.2 ⟨hG, hL⟩)) + (h.reducesInvariantsTo_massWeightSubmoduleLE hw S + (isStableUnder_gaugeLorentzMaps_iff.2 ⟨hS, hSL⟩) x hx + (forall_gaugeLorentzMaps_eq_self_iff.2 ⟨hG, hL⟩)) refine ⟨y, hy, fun g => ?_, fun g => ?_, by simpa using hz⟩ · have hstep := hG g rw [map_add, h.repGauge_of_mem_standardModelSpanLE w g hz, add_right_inj] at hstep diff --git a/Physlib/Particles/StandardModel/CovAlgebraRealization/MassWeight/Invariants.lean b/Physlib/Particles/StandardModel/CovAlgebraRealization/MassWeight/Invariants.lean index 0d0ecc2ed..6ea5fc777 100644 --- a/Physlib/Particles/StandardModel/CovAlgebraRealization/MassWeight/Invariants.lean +++ b/Physlib/Particles/StandardModel/CovAlgebraRealization/MassWeight/Invariants.lean @@ -37,23 +37,23 @@ from an invariant of the whole that its eight pieces are separately invariant wo the pieces to be determined by their sum — the independence of the sectors, which does not follow from `CovAlgebraRealization` and is deliberately left open in `Sectors.lean`. -Nothing here uses it. The classifications are carried in the shared form `Peels σ V W` of -`Peeling.lean` — every `σ`-invariant of `V ⊔ S` lies in `W ⊔ S`, for every `σ`-stable `S` -— and that relation is closed under joins in its source. Joining the sectors therefore -asks only that each of them be carried into itself by the two groups, which they are -(`repGauge_mem_sectorMassWeight`, `repLorentz_mem_sectorMassWeight`). The eight are taken -one at a time, each in turn joining the error term of the others, and independence never -enters. +Nothing here uses it. The classifications are carried in the shared form +`ReducesInvariantsTo σ V W` of `Physlib.Mathematics.InvariantReduction` — every `σ`-invariant +of `V ⊔ S` lies in `W ⊔ S`, for every `σ`-stable `S` — and that relation is closed under +joins in its source. Joining the sectors therefore asks only that each of them be carried into +itself by the two groups, which they are (`repGauge_mem_sectorMassWeight`, +`repLorentz_mem_sectorMassWeight`). The eight are taken one at a time, each in turn joining the +error term of the others, and independence never enters. Section A collects the surviving spans of the eight sectors into `standardModelSpan`, and section B checks that it is made of invariants of the right mass weight, which is both the -easy direction of the classification and the stability the peeling asks of its target. -Section C converts each sector's classification into a peeling, section D joins them, and +easy direction of the classification and the stability the reduction asks of its target. +Section C converts each sector's classification into a reduction, section D joins them, and sections E and F read off the equivalence and its consequence at mass dimension four. - A. The span of the Standard Model Lagrangian - B. The span is made of invariants of the right weight -- C. Each sector peels to the span +- C. Each sector reduces to the span - D. Joining the eight sectors - E. The classification at mass dimension at most four - F. The Standard Model Lagrangian @@ -171,7 +171,7 @@ lemma standardModelSpan_le_massWeightSubmodule (w : ℕ) : /-- The span at weight `w` is fixed pointwise by the gauge and Lorentz groups together: every one of its contributions is a span of invariants. This is the easy direction of - the classification, and it is also what supplies the stability the peeling asks of its + the classification, and it is also what supplies the stability the reduction asks of its target. -/ lemma isFixedBy_standardModelSpan (w : ℕ) : IsFixedBy (gaugeLorentzMaps repGauge repLorentz) (h.standardModelSpan w) := by @@ -213,22 +213,22 @@ lemma repLorentz_of_mem_standardModelSpan (w : ℕ) (Λ : SL(2,ℂ)) {y : B} /-! -## C. Each sector peels to the span +## C. Each sector reduces to the span -/ -/-- The empty sector peels: away from weight zero it is trivial, its only word being the - empty one. -/ -lemma peels_sectorMassWeight_empty {w : ℕ} (hw : w ≠ 0) : - Peels (gaugeLorentzMaps repGauge repLorentz) (h.sectorMassWeight ∅ w) +/-- The empty sector reduces to the span: away from weight zero it is trivial, its only word + being the empty one. -/ +lemma reducesInvariantsTo_sectorMassWeight_empty {w : ℕ} (hw : w ≠ 0) : + ReducesInvariantsTo (gaugeLorentzMaps repGauge repLorentz) (h.sectorMassWeight ∅ w) (h.standardModelSpan w) := by rw [h.sectorMassWeight_empty_of_ne_zero hw] - exact peels_of_le bot_le + exact reducesInvariantsTo_of_le bot_le -/-- The gauge sector peels: at weight eight to its four Lorentz contractions, below it to - nothing at all. -/ -lemma peels_sectorMassWeight_gauge {w : ℕ} (hw0 : 0 < w) (hw : w ≤ 8) : - Peels (gaugeLorentzMaps repGauge repLorentz) +/-- The gauge sector reduces to the span: at weight eight to its four Lorentz contractions, + below it to nothing at all. -/ +lemma reducesInvariantsTo_sectorMassWeight_gauge {w : ℕ} (hw0 : 0 < w) (hw : w ≤ 8) : + ReducesInvariantsTo (gaugeLorentzMaps repGauge repLorentz) (h.sectorMassWeight {GeneratorClass.gauge} w) (h.standardModelSpan w) := by intro S hS x hx hinv obtain ⟨hSG, hSL⟩ := isStableUnder_gaugeLorentzMaps_iff.1 hS @@ -245,10 +245,11 @@ lemma peels_sectorMassWeight_gauge {w : ℕ} (hw0 : 0 < w) (hw : w ≤ 8) : (h.isGaugeSector.mem_of_lorentz_invariant_massWeightSubmodule_lt_eight_sup w hw0 hw8 S hSL hx' hL) -/-- The Higgs sector peels: at weight eight to the two box terms, the kinetic term and the - quartic potential, at weight four to the Higgs mass term, and elsewhere to nothing. -/ -lemma peels_sectorMassWeight_higgs {w : ℕ} (hw0 : 0 < w) (hw : w ≤ 8) : - Peels (gaugeLorentzMaps repGauge repLorentz) +/-- The Higgs sector reduces to the span: at weight eight to the two box terms, the kinetic + term and the quartic potential, at weight four to the Higgs mass term, and elsewhere to nothing. + -/ +lemma reducesInvariantsTo_sectorMassWeight_higgs {w : ℕ} (hw0 : 0 < w) (hw : w ≤ 8) : + ReducesInvariantsTo (gaugeLorentzMaps repGauge repLorentz) (h.sectorMassWeight {GeneratorClass.higgs} w) (h.standardModelSpan w) := by intro S hS x hx hinv obtain ⟨hSG, hSL⟩ := isStableUnder_gaugeLorentzMaps_iff.1 hS @@ -267,10 +268,10 @@ lemma peels_sectorMassWeight_higgs {w : ℕ} (hw0 : 0 < w) (hw : w ≤ 8) : refine Submodule.mem_sup.2 ⟨x - y, ?_, y, hyS, by abel⟩ rwa [standardModelSpan, ite_eq_right (by omega)] -/-- The fermion sector peels: at weight eight to the ten kinetic terms over the nine +/-- The fermion sector reduces to the span: at weight eight to the ten kinetic terms over the nine family pairs, below it to nothing — there is no Dirac mass term. -/ -lemma peels_sectorMassWeight_fermion {w : ℕ} (hw0 : 0 < w) (hw : w ≤ 8) : - Peels (gaugeLorentzMaps repGauge repLorentz) +lemma reducesInvariantsTo_sectorMassWeight_fermion {w : ℕ} (hw0 : 0 < w) (hw : w ≤ 8) : + ReducesInvariantsTo (gaugeLorentzMaps repGauge repLorentz) (h.sectorMassWeight {GeneratorClass.fermion} w) (h.standardModelSpan w) := by intro S hS x hx hinv obtain ⟨hSG, hSL⟩ := isStableUnder_gaugeLorentzMaps_iff.1 hS @@ -287,10 +288,10 @@ lemma peels_sectorMassWeight_fermion {w : ℕ} (hw0 : 0 < w) (hw : w ≤ 8) : (h.isFermionSector.mem_of_invariant_massWeightSubmodule_lt_eight_sup w hw0 hw8 S hSG hSL hx' hG hL) -/-- The Yukawa sector peels: at weight eight to the six Yukawa couplings over the nine +/-- The Yukawa sector reduces to the span: at weight eight to the six Yukawa couplings over the nine family pairs, below it to nothing. -/ -lemma peels_sectorMassWeight_higgs_fermion {w : ℕ} (hw : w ≤ 8) : - Peels (gaugeLorentzMaps repGauge repLorentz) +lemma reducesInvariantsTo_sectorMassWeight_higgs_fermion {w : ℕ} (hw : w ≤ 8) : + ReducesInvariantsTo (gaugeLorentzMaps repGauge repLorentz) (h.sectorMassWeight {GeneratorClass.higgs, GeneratorClass.fermion} w) (h.standardModelSpan w) := by intro S hS x hx hinv @@ -305,9 +306,9 @@ lemma peels_sectorMassWeight_higgs_fermion {w : ℕ} (hw : w ≤ 8) : (h.mem_of_lorentz_invariant_sectorMassWeight_higgs_fermion_lt_eight_sup w hw8 S hSL hx hL) -/-- The gauge-Higgs sector peels to nothing: it carries no invariant below weight nine. -/ -lemma peels_sectorMassWeight_gauge_higgs {w : ℕ} (hw : w ≤ 8) : - Peels (gaugeLorentzMaps repGauge repLorentz) +/-- The gauge-Higgs sector reduces to nothing: it carries no invariant below weight nine. -/ +lemma reducesInvariantsTo_sectorMassWeight_gauge_higgs {w : ℕ} (hw : w ≤ 8) : + ReducesInvariantsTo (gaugeLorentzMaps repGauge repLorentz) (h.sectorMassWeight {GeneratorClass.gauge, GeneratorClass.higgs} w) (h.standardModelSpan w) := by intro S hS x hx hinv @@ -316,10 +317,10 @@ lemma peels_sectorMassWeight_gauge_higgs {w : ℕ} (hw : w ≤ 8) : exact Submodule.mem_sup_right (h.mem_of_invariant_sectorMassWeight_gauge_higgs_lt_nine_sup w (by omega) S hSL hx hL) -/-- The gauge-fermion sector peels to nothing: it carries no invariant below weight +/-- The gauge-fermion sector reduces to nothing: it carries no invariant below weight nine. -/ -lemma peels_sectorMassWeight_gauge_fermion {w : ℕ} (hw : w ≤ 8) : - Peels (gaugeLorentzMaps repGauge repLorentz) +lemma reducesInvariantsTo_sectorMassWeight_gauge_fermion {w : ℕ} (hw : w ≤ 8) : + ReducesInvariantsTo (gaugeLorentzMaps repGauge repLorentz) (h.sectorMassWeight {GeneratorClass.gauge, GeneratorClass.fermion} w) (h.standardModelSpan w) := by intro S hS x hx hinv @@ -328,9 +329,9 @@ lemma peels_sectorMassWeight_gauge_fermion {w : ℕ} (hw : w ≤ 8) : exact Submodule.mem_sup_right (h.mem_of_invariant_sectorMassWeight_gauge_fermion_lt_nine_sup w (by omega) S hSL hx hL) -/-- The mixed sector peels to nothing: it is trivial below weight nine. -/ -lemma peels_sectorMassWeight_mixed {w : ℕ} (hw : w ≤ 8) : - Peels (gaugeLorentzMaps repGauge repLorentz) +/-- The mixed sector reduces to nothing: it is trivial below weight nine. -/ +lemma reducesInvariantsTo_sectorMassWeight_mixed {w : ℕ} (hw : w ≤ 8) : + ReducesInvariantsTo (gaugeLorentzMaps repGauge repLorentz) (h.sectorMassWeight {GeneratorClass.gauge, GeneratorClass.higgs, GeneratorClass.fermion} w) (h.standardModelSpan w) := fun S _ x hx _ => @@ -344,18 +345,18 @@ lemma peels_sectorMassWeight_mixed {w : ℕ} (hw : w ≤ 8) : -/ /-- Every weight part of every sector is carried into itself by both groups: the stability - the join of the peelings asks of its summands. -/ + the join of the reductions asks of its summands. -/ lemma isStableUnder_sectorMassWeight (T : Finset GeneratorClass) (w : ℕ) : IsStableUnder (gaugeLorentzMaps repGauge repLorentz) (h.sectorMassWeight T w) := isStableUnder_gaugeLorentzMaps_iff.2 ⟨fun g _ hy => h.repGauge_mem_sectorMassWeight g hy, fun Λ _ hy => h.repLorentz_mem_sectorMassWeight Λ hy⟩ -/-- Every sector peels to the span, at every weight from one to eight. The three +/-- Every sector reduces to the span, at every weight from one to eight. The three constructors of `GeneratorClass` give eight class sets, and section C treats each. -/ -lemma peels_sectorMassWeight {w : ℕ} (hw0 : 0 < w) (hw : w ≤ 8) +lemma reducesInvariantsTo_sectorMassWeight {w : ℕ} (hw0 : 0 < w) (hw : w ≤ 8) (T : Finset GeneratorClass) : - Peels (gaugeLorentzMaps repGauge repLorentz) (h.sectorMassWeight T w) + ReducesInvariantsTo (gaugeLorentzMaps repGauge repLorentz) (h.sectorMassWeight T w) (h.standardModelSpan w) := by have hT : T = ∅ ∨ T = {GeneratorClass.gauge} ∨ T = {GeneratorClass.higgs} ∨ T = {GeneratorClass.fermion} ∨ T = {GeneratorClass.gauge, GeneratorClass.higgs} @@ -365,25 +366,25 @@ lemma peels_sectorMassWeight {w : ℕ} (hw0 : 0 < w) (hw : w ≤ 8) revert T decide rcases hT with rfl | rfl | rfl | rfl | rfl | rfl | rfl | rfl - · exact h.peels_sectorMassWeight_empty (by omega) - · exact h.peels_sectorMassWeight_gauge hw0 hw - · exact h.peels_sectorMassWeight_higgs hw0 hw - · exact h.peels_sectorMassWeight_fermion hw0 hw - · exact h.peels_sectorMassWeight_gauge_higgs hw - · exact h.peels_sectorMassWeight_gauge_fermion hw - · exact h.peels_sectorMassWeight_higgs_fermion hw - · exact h.peels_sectorMassWeight_mixed hw - -/-- The whole weight-`w` submodule peels to the span, for `w` from one to eight. The + · exact h.reducesInvariantsTo_sectorMassWeight_empty (by omega) + · exact h.reducesInvariantsTo_sectorMassWeight_gauge hw0 hw + · exact h.reducesInvariantsTo_sectorMassWeight_higgs hw0 hw + · exact h.reducesInvariantsTo_sectorMassWeight_fermion hw0 hw + · exact h.reducesInvariantsTo_sectorMassWeight_gauge_higgs hw + · exact h.reducesInvariantsTo_sectorMassWeight_gauge_fermion hw + · exact h.reducesInvariantsTo_sectorMassWeight_higgs_fermion hw + · exact h.reducesInvariantsTo_sectorMassWeight_mixed hw + +/-- The whole weight-`w` submodule reduces to the span, for `w` from one to eight. The mass-weight submodule is the join of the eight sectors' weight-`w` parts, each of them - stable under both groups, and `Peels` is closed under joins in its source: the sectors - are taken one at a time, each in turn joining the error term of the others. No + stable under both groups, and `ReducesInvariantsTo` is closed under joins in its source: the + sectors are taken one at a time, each in turn joining the error term of the others. No independence of the sectors is used, and none is available. -/ -lemma peels_massWeightSubmodule {w : ℕ} (hw0 : 0 < w) (hw : w ≤ 8) : - Peels (gaugeLorentzMaps repGauge repLorentz) (h.massWeightSubmodule w) +lemma reducesInvariantsTo_massWeightSubmodule {w : ℕ} (hw0 : 0 < w) (hw : w ≤ 8) : + ReducesInvariantsTo (gaugeLorentzMaps repGauge repLorentz) (h.massWeightSubmodule w) (h.standardModelSpan w) := by rw [h.massWeightSubmodule_eq_iSup_sectorMassWeight w] - exact Peels.iSup (fun T => h.peels_sectorMassWeight hw0 hw T) + exact ReducesInvariantsTo.iSup (fun T => h.reducesInvariantsTo_sectorMassWeight hw0 hw T) (fun T => h.isStableUnder_sectorMassWeight T w) (h.isFixedBy_standardModelSpan w).isStableUnder @@ -408,8 +409,9 @@ theorem exists_mem_standardModelSpan_of_gauge_and_lorentz_invariant (w : ℕ) ∧ (∀ g : SL(2,ℂ), repLorentz g y = y) ∧ x - y ∈ h.standardModelSpan w := by obtain ⟨z, hz, y, hy, rfl⟩ := Submodule.mem_sup.1 - (h.peels_massWeightSubmodule hw0 hw S (isStableUnder_gaugeLorentzMaps_iff.2 ⟨hS, hSL⟩) - x hx (forall_gaugeLorentzMaps_eq_self_iff.2 ⟨hG, hL⟩)) + (h.reducesInvariantsTo_massWeightSubmodule hw0 hw S + (isStableUnder_gaugeLorentzMaps_iff.2 ⟨hS, hSL⟩) x hx + (forall_gaugeLorentzMaps_eq_self_iff.2 ⟨hG, hL⟩)) refine ⟨y, hy, fun g => ?_, fun g => ?_, by simpa using hz⟩ · have hstep := hG g rw [map_add, h.repGauge_of_mem_standardModelSpan w g hz, add_right_inj] at hstep diff --git a/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/Families/BarHiggs.lean b/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/Families/BarHiggs.lean index b3079d614..51944bd3c 100644 --- a/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/Families/BarHiggs.lean +++ b/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/Families/BarHiggs.lean @@ -177,7 +177,7 @@ lemma isBiDualLeftWeyl_barDownBlockIsospin (f f' : Fin 3) : IsBiDualLeftWeyl B repLorentz (fun l : Fin 2 × Fin 2 => h.barDownBlockIsospin f f' l.1 l.2) := by simp only [h.barDownBlockIsospin_eq] - exact isBiDualLeftWeyl_sum fun p => + exact IsBiDualLeftWeyl.sum fun p => h.isBiDualLeftWeyl_barDownBlock f f' p.1 p.2 p.2 p.1 /-- The conjugate down-type Yukawa term of the family pair `(f, f')`. -/ @@ -376,9 +376,9 @@ lemma isBiDualRightWeyl_barUpBlockIsospin (f f' : Fin 3) : IsBiDualRightWeyl B repLorentz (fun l : Fin 2 × Fin 2 => h.barUpBlockIsospin f f' l.1 l.2) := by simp only [h.barUpBlockIsospin_eq] - exact isBiDualRightWeyl_sub - (isBiDualRightWeyl_sum fun a => h.isBiDualRightWeyl_barUpBlock f f' 0 a a 1) - (isBiDualRightWeyl_sum fun a => h.isBiDualRightWeyl_barUpBlock f f' 1 a a 0) + exact IsBiDualRightWeyl.sub + (IsBiDualRightWeyl.sum fun a => h.isBiDualRightWeyl_barUpBlock f f' 0 a a 1) + (IsBiDualRightWeyl.sum fun a => h.isBiDualRightWeyl_barUpBlock f f' 1 a a 0) /-- The conjugate up-type Yukawa term of the family pair `(f, f')`. -/ noncomputable def barUpYukawa (f f' : Fin 3) : B := @@ -549,7 +549,7 @@ lemma isBiDualLeftWeyl_barLeptonBlockIsospin (f f' : Fin 3) : IsBiDualLeftWeyl B repLorentz (fun l : Fin 2 × Fin 2 => h.barLeptonBlockIsospin f f' l.1 l.2) := by simp only [h.barLeptonBlockIsospin_eq] - exact isBiDualLeftWeyl_sum fun w => h.isBiDualLeftWeyl_barLeptonBlock f f' w w + exact IsBiDualLeftWeyl.sum fun w => h.isBiDualLeftWeyl_barLeptonBlock f f' w w /-- The conjugate charged-lepton Yukawa term of the family pair `(f, f')`. -/ noncomputable def barLeptonYukawa (f f' : Fin 3) : B := diff --git a/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/Families/Higgs.lean b/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/Families/Higgs.lean index b8c874366..6667ffab1 100644 --- a/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/Families/Higgs.lean +++ b/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/Families/Higgs.lean @@ -198,7 +198,7 @@ lemma isBiDualRightWeyl_downBlockIsospin (f f' : Fin 3) : IsBiDualRightWeyl B repLorentz (fun l : Fin 2 × Fin 2 => h.downBlockIsospin f f' l.1 l.2) := by simp only [h.downBlockIsospin_eq] - exact isBiDualRightWeyl_sum fun p => h.isBiDualRightWeyl_downBlock f f' p.1 p.2 p.2 p.1 + exact IsBiDualRightWeyl.sum fun p => h.isBiDualRightWeyl_downBlock f f' p.1 p.2 p.2 p.1 /-- The down-type Yukawa term of the family pair `(f, f')`: the down-singlet symbol of family `f` against the conjugate quark doublet of family `f'` and a Higgs symbol, with @@ -398,9 +398,9 @@ lemma isBiDualLeftWeyl_upBlockIsospin (f f' : Fin 3) : IsBiDualLeftWeyl B repLorentz (fun l : Fin 2 × Fin 2 => h.upBlockIsospin f f' l.1 l.2) := by simp only [h.upBlockIsospin_eq] - exact isBiDualLeftWeyl_sub - (isBiDualLeftWeyl_sum fun a => h.isBiDualLeftWeyl_upBlock f f' 0 a a 1) - (isBiDualLeftWeyl_sum fun a => h.isBiDualLeftWeyl_upBlock f f' 1 a a 0) + exact IsBiDualLeftWeyl.sub + (IsBiDualLeftWeyl.sum fun a => h.isBiDualLeftWeyl_upBlock f f' 0 a a 1) + (IsBiDualLeftWeyl.sum fun a => h.isBiDualLeftWeyl_upBlock f f' 1 a a 0) /-- The up-type Yukawa term of the family pair `(f, f')`: the colour indices are joined by the Kronecker delta, the isospin indices by the antisymmetric symbol, and the two @@ -570,7 +570,7 @@ lemma isBiDualRightWeyl_leptonBlockIsospin (f f' : Fin 3) : IsBiDualRightWeyl B repLorentz (fun l : Fin 2 × Fin 2 => h.leptonBlockIsospin f f' l.1 l.2) := by simp only [h.leptonBlockIsospin_eq] - exact isBiDualRightWeyl_sum fun w => h.isBiDualRightWeyl_leptonBlock f f' w w + exact IsBiDualRightWeyl.sum fun w => h.isBiDualRightWeyl_leptonBlock f f' w w /-- The charged-lepton Yukawa term of the family pair `(f, f')`: the isospin indices are joined by the Kronecker delta and the two right-handed spinor indices by the diff --git a/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/Families/Symbols.lean b/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/Families/Symbols.lean index 1d655855b..5d61370ae 100644 --- a/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/Families/Symbols.lean +++ b/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/Families/Symbols.lean @@ -11,7 +11,7 @@ public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecompositio public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU3FunAntiFun public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU2AntiFundamental public import Physlib.Relativity.LorentzGroup.Invariants.IsBiLeftWeyl -public import Physlib.Particles.StandardModel.Peeling +public import Physlib.Particles.StandardModel.InvariantReduction /-! # The symbols of the Yukawa blocks @@ -27,7 +27,7 @@ the sums and differences a contraction performs. Two things here are easy to get wrong and are settled once. A gauge transformation is a triple and the three index laws each constrain one factor of it: colour, isospin and Lorentz between them say nothing about hypercharge, so hypercharge is a fourth step and not -a corollary of the other three, and `forall_repGauge_eq_self`, in `StandardModel.Peeling` +a corollary of the other three, and `forall_repGauge_eq_self`, in `StandardModel.InvariantReduction` with the rest of the shared framework, is what assembles the four into gauge invariance. And the twelve blocks come in two fermion orderings, but the fermion symbols anticommute, so the two orderings of a block span the same submodule and have the diff --git a/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/MassDimEight.lean b/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/MassDimEight.lean index 993cda075..2b7713d31 100644 --- a/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/MassDimEight.lean +++ b/Physlib/Particles/StandardModel/CovAlgebraRealization/YukawaSector/MassDimEight.lean @@ -7,7 +7,7 @@ module public import Physlib.Particles.StandardModel.CovAlgebraRealization.YukawaSector.Families.BarHiggs public import Physlib.Particles.StandardModel.CovAlgebraRealization.YukawaSector.GaugeWeightDecomposition -public import Physlib.Particles.StandardModel.Peeling +public import Physlib.Particles.StandardModel.InvariantReduction /-! # The Yukawa sector at mass weight eight @@ -27,21 +27,22 @@ that weight-zero piece modulo `S`, by `mem_sectorMassWeightEight_piece_zero_sup_ And the six couplings, their index laws and their contractions are built in the `Families` files, together with `yukawaSpan_le_inf`, which is the easy direction of the equivalence. -What is left is the peeling. A block of the decomposition is a product of three symbol +What is left is the reduction. A block of the decomposition is a product of three symbol ranges, and the classification of its invariants is three classifications in a row — colour, then isospin, then Lorentz — each cutting the span down to the span of one contraction. The three groups are different, and the fifty-four surviving blocks have to -be peeled apart one at a time, so the argument is organised around a single relation -`Peels σ V W`: a `σ`-invariant of `V ⊔ S` lies in `W ⊔ S` whenever `S` is `σ`-stable. That -relation composes — it is transitive, it is monotone in both arguments, and it is closed -under joins in its source — and every classification theorem the `GaugeGroup` and -`LorentzGroup` files provide is an instance of it, packaged as a `Step`. +be reduced one at a time, so the argument is organised around a single relation +`ReducesInvariantsTo σ V W`: a `σ`-invariant of `V ⊔ S` lies in `W ⊔ S` whenever `S` is +`σ`-stable. That relation composes — it is transitive, antitone in its source, monotone in its +target, and closed under joins of stable sources — and each `GaugeGroup` or `LorentzGroup` +classification used here is an instance of it, packaged as an `InvariantReductionToSpan`. ## ii. Key results - `sectorMassWeightEightGaugeWeight_piece_zero_le` : the weight-zero piece inside the six surviving block submodules. -- `peels_yukawaSpan` : the six blocks, over the nine family pairs, peel to the Yukawa span. +- `reducesInvariantsTo_yukawaSpan` : the six blocks, over the nine family pairs, reduce to the + Yukawa span. - `mem_yukawaSpan_sup_of_gauge_and_lorentz_invariant`, `exists_mem_of_gauge_and_lorentz_invariant` and `mem_sectorMassWeight_higgs_fermion_eight_sup_and_gauge_lorentz_invariant_iff` : the @@ -52,7 +53,7 @@ under joins in its source — and every classification theorem the `GaugeGroup` - A. The symbol ranges as spans of components - B. The block submodules and their stability - C. The twelve surviving blocks as six submodules -- D. The blocks peel to the Yukawa terms +- D. The blocks reduce to the Yukawa terms - E. The classification of the invariants of mass weight eight -/ @@ -82,7 +83,8 @@ lemma higgsSubmodule_zero_le : h.isHiggsSector.higgsSubmodule 0 ≤ ⨆ i, ℂ ∙ h.isHiggsSector.higgs ![] i := by refine iSup_le fun l => ?_ rw [show l = (![] : Fin 0 → Fin 1 ⊕ Fin 3) from Subsingleton.elim _ _, - range_eq_iSup_span_dualBasis HiggsVec.orthonormBasis.toBasis (h.isHiggsSector.covH 0 ![])] + LinearMap.range_eq_iSup_span_basis HiggsVec.orthonormBasis.toBasis.dualBasis + (h.isHiggsSector.covH 0 ![])] exact le_rfl /-- The conjugate Higgs submodule without derivatives lies in the span of the conjugate @@ -91,7 +93,7 @@ lemma barHiggsSubmodule_zero_le : h.isHiggsSector.barHiggsSubmodule 0 ≤ ⨆ i, ℂ ∙ h.isHiggsSector.barHiggs ![] i := by refine iSup_le fun l => ?_ rw [show l = (![] : Fin 0 → Fin 1 ⊕ Fin 3) from Subsingleton.elim _ _, - range_eq_iSup_span_dualBasis HiggsVec.orthonormBasis.toBasis.conj + LinearMap.range_eq_iSup_span_basis HiggsVec.orthonormBasis.toBasis.conj.dualBasis (h.isHiggsSector.covBarH 0 ![])] exact le_rfl @@ -99,61 +101,61 @@ lemma barHiggsSubmodule_zero_le : lemma range_d_eq (f : Fin 3) : LinearMap.range (h.covD f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) = ⨆ j, ℂ ∙ h.isFermionSector.dComponent f ![] j := - range_eq_iSup_span_dualBasis DownSinglet.basis (h.covD f ![]) + LinearMap.range_eq_iSup_span_basis DownSinglet.basis.dualBasis (h.covD f ![]) /-- The range of the conjugate down-singlet symbol map is the span of its components. -/ lemma range_bard_eq (f : Fin 3) : LinearMap.range (h.covBarD f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) = ⨆ j, ℂ ∙ h.isFermionSector.bardComponent f ![] j := - range_eq_iSup_span_dualBasis DownSinglet.basis.conj (h.covBarD f ![]) + LinearMap.range_eq_iSup_span_basis DownSinglet.basis.conj.dualBasis (h.covBarD f ![]) /-- The range of the up-singlet symbol map is the span of its components. -/ lemma range_u_eq (f : Fin 3) : LinearMap.range (h.covU f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) = ⨆ j, ℂ ∙ h.isFermionSector.uComponent f ![] j := - range_eq_iSup_span_dualBasis UpSinglet.basis (h.covU f ![]) + LinearMap.range_eq_iSup_span_basis UpSinglet.basis.dualBasis (h.covU f ![]) /-- The range of the conjugate up-singlet symbol map is the span of its components. -/ lemma range_baru_eq (f : Fin 3) : LinearMap.range (h.covBarU f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) = ⨆ j, ℂ ∙ h.isFermionSector.baruComponent f ![] j := - range_eq_iSup_span_dualBasis UpSinglet.basis.conj (h.covBarU f ![]) + LinearMap.range_eq_iSup_span_basis UpSinglet.basis.conj.dualBasis (h.covBarU f ![]) /-- The range of the quark-doublet symbol map is the span of its components. -/ lemma range_Q_eq (f : Fin 3) : LinearMap.range (h.covQ f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) = ⨆ j, ℂ ∙ h.isFermionSector.QComponent f ![] j := - range_eq_iSup_span_dualBasis QuarkDoublet.basis (h.covQ f ![]) + LinearMap.range_eq_iSup_span_basis QuarkDoublet.basis.dualBasis (h.covQ f ![]) /-- The range of the conjugate quark-doublet symbol map is the span of its components. -/ lemma range_barQ_eq (f : Fin 3) : LinearMap.range (h.covBarQ f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) = ⨆ j, ℂ ∙ h.isFermionSector.barQComponent f ![] j := - range_eq_iSup_span_dualBasis QuarkDoublet.basis.conj (h.covBarQ f ![]) + LinearMap.range_eq_iSup_span_basis QuarkDoublet.basis.conj.dualBasis (h.covBarQ f ![]) /-- The range of the lepton-doublet symbol map is the span of its components. -/ lemma range_L_eq (f : Fin 3) : LinearMap.range (h.covL f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) = ⨆ j, ℂ ∙ h.isFermionSector.LComponent f ![] j := - range_eq_iSup_span_dualBasis LeptonDoublet.basis (h.covL f ![]) + LinearMap.range_eq_iSup_span_basis LeptonDoublet.basis.dualBasis (h.covL f ![]) /-- The range of the conjugate lepton-doublet symbol map is the span of its components. -/ lemma range_barL_eq (f : Fin 3) : LinearMap.range (h.covBarL f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) = ⨆ j, ℂ ∙ h.isFermionSector.barLComponent f ![] j := - range_eq_iSup_span_dualBasis LeptonDoublet.basis.conj (h.covBarL f ![]) + LinearMap.range_eq_iSup_span_basis LeptonDoublet.basis.conj.dualBasis (h.covBarL f ![]) /-- The range of the lepton-singlet symbol map is the span of its components. -/ lemma range_e_eq (f : Fin 3) : LinearMap.range (h.covE f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) = ⨆ j, ℂ ∙ h.isFermionSector.eComponent f ![] j := - range_eq_iSup_span_dualBasis LeptonSinglet.basis (h.covE f ![]) + LinearMap.range_eq_iSup_span_basis LeptonSinglet.basis.dualBasis (h.covE f ![]) /-- The range of the conjugate lepton-singlet symbol map is the span of its components. -/ lemma range_bare_eq (f : Fin 3) : LinearMap.range (h.covBarE f (![] : Fin 0 → Fin 1 ⊕ Fin 3)) = ⨆ j, ℂ ∙ h.isFermionSector.bareComponent f ![] j := - range_eq_iSup_span_dualBasis LeptonSinglet.basis.conj (h.covBarE f ![]) + LinearMap.range_eq_iSup_span_basis LeptonSinglet.basis.conj.dualBasis (h.covBarE f ![]) /-! @@ -164,7 +166,7 @@ ranges, and this is the submodule the classification of that block runs inside. are carried into themselves by both groups, each factor being the range of an equivariant symbol map with no derivative slots for the Lorentz group to mix, and a product of stable submodules being stable. That stability is what lets the six blocks — fifty-four of them -once the family pairs are counted — be peeled apart one at a time, each in turn joining the +once the family pairs are counted — be reduced one at a time, each in turn joining the error term of the others. -/ @@ -443,239 +445,265 @@ lemma sectorMassWeightEightGaugeWeight_piece_zero_le : /-! -## D. The blocks peel to the Yukawa terms +## D. The blocks reduce to the Yukawa terms Each block is classified in three stages, and each stage is the same move: one index law holds at every value of the indices it does not see, so a family of steps is applied at -once by `Peels.iSup_step`, and what comes out is the span of the contractions, which is the -source of the next stage. Colour first, then isospin, then Lorentz — the order is forced, -each contraction being a spectator of the ones after it. +once by `InvariantReductionToSpan.reducesInvariantsTo_iSup`, and what comes out is the span of +the contractions, which is the source of the next stage. Colour first, then isospin, then Lorentz — +the order is forced, each contraction being a spectator of the ones after it. -The two lepton blocks have no colour index at all, so their first stage is `Step.ofFixed` -rather than a classification: the block is already fixed by the colour factor and the stage -peels it to itself. That keeps them in the same three-stage shape as the four quark -blocks. +The two lepton blocks have no colour index at all, so their first stage is +`InvariantReductionToSpan.ofFixed` rather than a classification: the block is already fixed by the +colour factor and the stage reduces it to itself. That keeps them in the same three-stage shape as +the four quark blocks. -/ include h in -/-- The down-type block peels to the down-type Yukawa term. -/ -lemma peels_downYukawa (f f' : Fin 3) : - Peels (gaugeLorentzMaps repGauge repLorentz) (h.downBlockSubmodule f f') +/-- The down-type block reduces to the down-type Yukawa term. -/ +lemma reducesInvariantsTo_downYukawa (f f' : Fin 3) : + ReducesInvariantsTo (gaugeLorentzMaps repGauge repLorentz) (h.downBlockSubmodule f f') (ℂ ∙ h.downYukawa f f') := by - have hcolour : Peels (gaugeLorentzMaps repGauge repLorentz) (h.downBlockSubmodule f f') + have hcolour : ReducesInvariantsTo (gaugeLorentzMaps repGauge repLorentz) + (h.downBlockSubmodule f f') (⨆ k : Fin 2 × Fin 2 × Fin 2 × Fin 2, ℂ ∙ h.downBlockColour f f' k.1 k.2.1 k.2.2.1 k.2.2.2) := by - refine Peels.ofSU3 ((Peels.iSup_step fun k : Fin 2 × Fin 2 × Fin 2 × Fin 2 => - Step.ofSU3FunAntiFun - (h.isSU3FunAntiFun_downBlock f f' k.1 k.2.1 k.2.2.1 k.2.2.2)).mono_left ?_) + refine ReducesInvariantsTo.ofSU3 ((InvariantReductionToSpan.reducesInvariantsTo_iSup + fun k : Fin 2 × Fin 2 × Fin 2 × Fin 2 => + IsSU3FunAntiFun.invariantReductionToSpan + (h.isSU3FunAntiFun_downBlock f f' k.1 k.2.1 k.2.2.1 k.2.2.2)).mono_left ?_) rw [downBlockSubmodule] - refine mul_mul_le_of_le h.higgsSubmodule_zero_le (le_of_eq (h.range_d_eq f)) - (le_of_eq (h.range_barQ_eq f')) fun i j k => ?_ + refine Submodule.mul_mul_le_of_le_iSup_span h.higgsSubmodule_zero_le + (le_of_eq (h.range_d_eq f)) (le_of_eq (h.range_barQ_eq f')) fun i j k => ?_ rw [show h.isHiggsSector.higgs ![] i * (h.isFermionSector.dComponent f ![] j * h.isFermionSector.barQComponent f' ![] k) = h.downBlock f f' i j.1 (![k.2.1, j.2] 1) k.1 (![k.2.1, j.2] 0) k.2.2 from by simp [downBlock]] exact Submodule.mem_iSup_of_mem (i, j.1, k.1, k.2.2) (IsSU3FunAntiFun.mem_span _) - have hisospin : Peels (gaugeLorentzMaps repGauge repLorentz) + have hisospin : ReducesInvariantsTo (gaugeLorentzMaps repGauge repLorentz) (⨆ k : Fin 2 × Fin 2 × Fin 2 × Fin 2, ℂ ∙ h.downBlockColour f f' k.1 k.2.1 k.2.2.1 k.2.2.2) (⨆ m : Fin 2 × Fin 2, ℂ ∙ h.downBlockIsospin f f' m.1 m.2) := by - refine Peels.ofSU2 ((Peels.iSup_step fun m : Fin 2 × Fin 2 => - Step.ofSU2FunAntiFun (h.isSU2FunAntiFun_downBlockColour f f' m.1 m.2)).mono_left ?_) + refine ReducesInvariantsTo.ofSU2 ((InvariantReductionToSpan.reducesInvariantsTo_iSup + fun m : Fin 2 × Fin 2 => + IsSU2FunAntiFun.invariantReductionToSpan + (h.isSU2FunAntiFun_downBlockColour f f' m.1 m.2)).mono_left ?_) refine iSup_le fun k => (Submodule.span_singleton_le_iff_mem _ _).2 (Submodule.mem_iSup_of_mem (k.2.1, k.2.2.1) ?_) rw [show h.downBlockColour f f' k.1 k.2.1 k.2.2.1 k.2.2.2 = h.downBlockColour f f' (![k.2.2.2, k.1] 1) k.2.1 k.2.2.1 (![k.2.2.2, k.1] 0) from by simp] exact IsSU2BiFundamental.mem_span _ - exact (hcolour.trans hisospin).trans (Peels.ofLorentz - (Step.ofBiDualRightWeyl (h.isBiDualRightWeyl_downBlockIsospin f f')).peels) + exact (hcolour.trans hisospin).trans (ReducesInvariantsTo.ofLorentz + (IsBiDualRightWeyl.invariantReductionToSpan + (h.isBiDualRightWeyl_downBlockIsospin f f')).reducesInvariantsTo) include h in -/-- The up-type block peels to the up-type Yukawa term. Isospin is contracted by the +/-- The up-type block reduces to the up-type Yukawa term. Isospin is contracted by the antisymmetric symbol here, the Higgs symbol and the quark doublet both carrying the anti-fundamental. -/ -lemma peels_upYukawa (f f' : Fin 3) : - Peels (gaugeLorentzMaps repGauge repLorentz) (h.upBlockSubmodule f f') +lemma reducesInvariantsTo_upYukawa (f f' : Fin 3) : + ReducesInvariantsTo (gaugeLorentzMaps repGauge repLorentz) (h.upBlockSubmodule f f') (ℂ ∙ h.upYukawa f f') := by - have hcolour : Peels (gaugeLorentzMaps repGauge repLorentz) (h.upBlockSubmodule f f') + have hcolour : ReducesInvariantsTo (gaugeLorentzMaps repGauge repLorentz) + (h.upBlockSubmodule f f') (⨆ k : Fin 2 × Fin 2 × Fin 2 × Fin 2, ℂ ∙ h.upBlockColour f f' k.1 k.2.1 k.2.2.1 k.2.2.2) := by - refine Peels.ofSU3 ((Peels.iSup_step fun k : Fin 2 × Fin 2 × Fin 2 × Fin 2 => - Step.ofSU3FunAntiFun - (h.isSU3FunAntiFun_upBlock f f' k.1 k.2.1 k.2.2.1 k.2.2.2)).mono_left ?_) + refine ReducesInvariantsTo.ofSU3 ((InvariantReductionToSpan.reducesInvariantsTo_iSup + fun k : Fin 2 × Fin 2 × Fin 2 × Fin 2 => + IsSU3FunAntiFun.invariantReductionToSpan + (h.isSU3FunAntiFun_upBlock f f' k.1 k.2.1 k.2.2.1 k.2.2.2)).mono_left ?_) rw [upBlockSubmodule] - refine mul_mul_le_of_le h.higgsSubmodule_zero_le (le_of_eq (h.range_baru_eq f)) - (le_of_eq (h.range_Q_eq f')) fun i j k => ?_ + refine Submodule.mul_mul_le_of_le_iSup_span h.higgsSubmodule_zero_le + (le_of_eq (h.range_baru_eq f)) (le_of_eq (h.range_Q_eq f')) fun i j k => ?_ rw [show h.isHiggsSector.higgs ![] i * (h.isFermionSector.baruComponent f ![] j * h.isFermionSector.QComponent f' ![] k) = h.upBlock f f' i j.1 (![j.2, k.2.1] 0) k.1 (![j.2, k.2.1] 1) k.2.2 from by simp [upBlock]] exact Submodule.mem_iSup_of_mem (i, j.1, k.1, k.2.2) (IsSU3FunAntiFun.mem_span _) - have hisospin : Peels (gaugeLorentzMaps repGauge repLorentz) + have hisospin : ReducesInvariantsTo (gaugeLorentzMaps repGauge repLorentz) (⨆ k : Fin 2 × Fin 2 × Fin 2 × Fin 2, ℂ ∙ h.upBlockColour f f' k.1 k.2.1 k.2.2.1 k.2.2.2) (⨆ m : Fin 2 × Fin 2, ℂ ∙ h.upBlockIsospin f f' m.1 m.2) := by - refine Peels.ofSU2 ((Peels.iSup_step fun m : Fin 2 × Fin 2 => - Step.ofSU2BiAntiFun (h.isSU2BiAntiFun_upBlockColour f f' m.1 m.2)).mono_left ?_) + refine ReducesInvariantsTo.ofSU2 ((InvariantReductionToSpan.reducesInvariantsTo_iSup + fun m : Fin 2 × Fin 2 => + IsSU2BiAntiFun.invariantReductionToSpan + (h.isSU2BiAntiFun_upBlockColour f f' m.1 m.2)).mono_left ?_) refine iSup_le fun k => (Submodule.span_singleton_le_iff_mem _ _).2 (Submodule.mem_iSup_of_mem (k.2.1, k.2.2.1) ?_) rw [show h.upBlockColour f f' k.1 k.2.1 k.2.2.1 k.2.2.2 = h.upBlockColour f f' (![k.1, k.2.2.2] 0) k.2.1 k.2.2.1 (![k.1, k.2.2.2] 1) from by simp] exact IsSU2BiFundamental.mem_span _ - exact (hcolour.trans hisospin).trans (Peels.ofLorentz - (Step.ofBiDualLeftWeyl (h.isBiDualLeftWeyl_upBlockIsospin f f')).peels) + exact (hcolour.trans hisospin).trans (ReducesInvariantsTo.ofLorentz + (IsBiDualLeftWeyl.invariantReductionToSpan + (h.isBiDualLeftWeyl_upBlockIsospin f f')).reducesInvariantsTo) include h in -/-- The charged-lepton block peels to the charged-lepton Yukawa term. Its colour stage is +/-- The charged-lepton block reduces to the charged-lepton Yukawa term. Its colour stage is the trivial one: the three symbols carry no colour index between them, so the block is - fixed by the colour factor and the stage peels it to itself. -/ -lemma peels_leptonYukawa (f f' : Fin 3) : - Peels (gaugeLorentzMaps repGauge repLorentz) (h.leptonBlockSubmodule f f') + fixed by the colour factor and the stage reduces it to itself. -/ +lemma reducesInvariantsTo_leptonYukawa (f f' : Fin 3) : + ReducesInvariantsTo (gaugeLorentzMaps repGauge repLorentz) (h.leptonBlockSubmodule f f') (ℂ ∙ h.leptonYukawa f f') := by - have hcolour : Peels (gaugeLorentzMaps repGauge repLorentz) (h.leptonBlockSubmodule f f') + have hcolour : ReducesInvariantsTo (gaugeLorentzMaps repGauge repLorentz) + (h.leptonBlockSubmodule f f') (⨆ k : Fin 2 × Fin 2 × Fin 2 × Fin 2, ℂ ∙ h.leptonBlock f f' k.1 k.2.1 k.2.2.1 k.2.2.2) := by - refine Peels.ofSU3 ((Peels.iSup_step fun k : Fin 2 × Fin 2 × Fin 2 × Fin 2 => - Step.ofFixed (h.leptonBlock f f' k.1 k.2.1 k.2.2.1 k.2.2.2) - fun U => h.repGauge_su3_leptonBlock U f f' k.1 k.2.1 k.2.2.1 k.2.2.2).mono_left ?_) + refine ReducesInvariantsTo.ofSU3 ((InvariantReductionToSpan.reducesInvariantsTo_iSup + fun k : Fin 2 × Fin 2 × Fin 2 × Fin 2 => + InvariantReductionToSpan.ofFixed (h.leptonBlock f f' k.1 k.2.1 k.2.2.1 k.2.2.2) + fun U => h.repGauge_su3_leptonBlock U f f' k.1 k.2.1 k.2.2.1 k.2.2.2).mono_left ?_) rw [leptonBlockSubmodule] - refine mul_mul_le_of_le h.higgsSubmodule_zero_le (le_of_eq (h.range_barL_eq f)) - (le_of_eq (h.range_e_eq f')) fun i j k => ?_ + refine Submodule.mul_mul_le_of_le_iSup_span h.higgsSubmodule_zero_le + (le_of_eq (h.range_barL_eq f)) (le_of_eq (h.range_e_eq f')) fun i j k => ?_ rw [show h.isHiggsSector.higgs ![] i * (h.isFermionSector.barLComponent f ![] j * h.isFermionSector.eComponent f' ![] k) = h.leptonBlock f f' i j.1 j.2 k from by simp [leptonBlock]] exact Submodule.mem_iSup_of_mem (i, j.1, j.2, k) (Submodule.mem_span_singleton_self _) - have hisospin : Peels (gaugeLorentzMaps repGauge repLorentz) + have hisospin : ReducesInvariantsTo (gaugeLorentzMaps repGauge repLorentz) (⨆ k : Fin 2 × Fin 2 × Fin 2 × Fin 2, ℂ ∙ h.leptonBlock f f' k.1 k.2.1 k.2.2.1 k.2.2.2) (⨆ m : Fin 2 × Fin 2, ℂ ∙ h.leptonBlockIsospin f f' m.1 m.2) := by - refine Peels.ofSU2 ((Peels.iSup_step fun m : Fin 2 × Fin 2 => - Step.ofSU2FunAntiFun (h.isSU2FunAntiFun_leptonBlock f f' m.1 m.2)).mono_left ?_) + refine ReducesInvariantsTo.ofSU2 ((InvariantReductionToSpan.reducesInvariantsTo_iSup + fun m : Fin 2 × Fin 2 => + IsSU2FunAntiFun.invariantReductionToSpan + (h.isSU2FunAntiFun_leptonBlock f f' m.1 m.2)).mono_left ?_) refine iSup_le fun k => (Submodule.span_singleton_le_iff_mem _ _).2 (Submodule.mem_iSup_of_mem (k.2.1, k.2.2.2) ?_) rw [show h.leptonBlock f f' k.1 k.2.1 k.2.2.1 k.2.2.2 = h.leptonBlock f f' (![k.2.2.1, k.1] 1) k.2.1 (![k.2.2.1, k.1] 0) k.2.2.2 from by simp] exact IsSU2BiFundamental.mem_span _ - exact (hcolour.trans hisospin).trans (Peels.ofLorentz - (Step.ofBiDualRightWeyl (h.isBiDualRightWeyl_leptonBlockIsospin f f')).peels) + exact (hcolour.trans hisospin).trans (ReducesInvariantsTo.ofLorentz + (IsBiDualRightWeyl.invariantReductionToSpan + (h.isBiDualRightWeyl_leptonBlockIsospin f f')).reducesInvariantsTo) include h in -/-- The conjugate down-type block peels to the conjugate down-type Yukawa term. -/ -lemma peels_barDownYukawa (f f' : Fin 3) : - Peels (gaugeLorentzMaps repGauge repLorentz) (h.barDownBlockSubmodule f f') +/-- The conjugate down-type block reduces to the conjugate down-type Yukawa term. -/ +lemma reducesInvariantsTo_barDownYukawa (f f' : Fin 3) : + ReducesInvariantsTo (gaugeLorentzMaps repGauge repLorentz) (h.barDownBlockSubmodule f f') (ℂ ∙ h.barDownYukawa f f') := by - have hcolour : Peels (gaugeLorentzMaps repGauge repLorentz) + have hcolour : ReducesInvariantsTo (gaugeLorentzMaps repGauge repLorentz) (h.barDownBlockSubmodule f f') (⨆ k : Fin 2 × Fin 2 × Fin 2 × Fin 2, ℂ ∙ h.barDownBlockColour f f' k.1 k.2.1 k.2.2.1 k.2.2.2) := by - refine Peels.ofSU3 ((Peels.iSup_step fun k : Fin 2 × Fin 2 × Fin 2 × Fin 2 => - Step.ofSU3FunAntiFun - (h.isSU3FunAntiFun_barDownBlock f f' k.1 k.2.1 k.2.2.1 k.2.2.2)).mono_left ?_) + refine ReducesInvariantsTo.ofSU3 ((InvariantReductionToSpan.reducesInvariantsTo_iSup + fun k : Fin 2 × Fin 2 × Fin 2 × Fin 2 => + IsSU3FunAntiFun.invariantReductionToSpan + (h.isSU3FunAntiFun_barDownBlock f f' k.1 k.2.1 k.2.2.1 k.2.2.2)).mono_left ?_) rw [barDownBlockSubmodule] - refine mul_mul_le_of_le h.barHiggsSubmodule_zero_le (le_of_eq (h.range_bard_eq f)) - (le_of_eq (h.range_Q_eq f')) fun i j k => ?_ + refine Submodule.mul_mul_le_of_le_iSup_span h.barHiggsSubmodule_zero_le + (le_of_eq (h.range_bard_eq f)) (le_of_eq (h.range_Q_eq f')) fun i j k => ?_ rw [show h.isHiggsSector.barHiggs ![] i * (h.isFermionSector.bardComponent f ![] j * h.isFermionSector.QComponent f' ![] k) = h.barDownBlock f f' i j.1 (![j.2, k.2.1] 0) k.1 (![j.2, k.2.1] 1) k.2.2 from by simp [barDownBlock]] exact Submodule.mem_iSup_of_mem (i, j.1, k.1, k.2.2) (IsSU3FunAntiFun.mem_span _) - have hisospin : Peels (gaugeLorentzMaps repGauge repLorentz) + have hisospin : ReducesInvariantsTo (gaugeLorentzMaps repGauge repLorentz) (⨆ k : Fin 2 × Fin 2 × Fin 2 × Fin 2, ℂ ∙ h.barDownBlockColour f f' k.1 k.2.1 k.2.2.1 k.2.2.2) (⨆ m : Fin 2 × Fin 2, ℂ ∙ h.barDownBlockIsospin f f' m.1 m.2) := by - refine Peels.ofSU2 ((Peels.iSup_step fun m : Fin 2 × Fin 2 => - Step.ofSU2FunAntiFun - (h.isSU2FunAntiFun_barDownBlockColour f f' m.1 m.2)).mono_left ?_) + refine ReducesInvariantsTo.ofSU2 ((InvariantReductionToSpan.reducesInvariantsTo_iSup + fun m : Fin 2 × Fin 2 => + IsSU2FunAntiFun.invariantReductionToSpan + (h.isSU2FunAntiFun_barDownBlockColour f f' m.1 m.2)).mono_left ?_) refine iSup_le fun k => (Submodule.span_singleton_le_iff_mem _ _).2 (Submodule.mem_iSup_of_mem (k.2.1, k.2.2.1) ?_) rw [show h.barDownBlockColour f f' k.1 k.2.1 k.2.2.1 k.2.2.2 = h.barDownBlockColour f f' (![k.1, k.2.2.2] 0) k.2.1 k.2.2.1 (![k.1, k.2.2.2] 1) from by simp] exact IsSU2BiFundamental.mem_span _ - exact (hcolour.trans hisospin).trans (Peels.ofLorentz - (Step.ofBiDualLeftWeyl (h.isBiDualLeftWeyl_barDownBlockIsospin f f')).peels) + exact (hcolour.trans hisospin).trans (ReducesInvariantsTo.ofLorentz + (IsBiDualLeftWeyl.invariantReductionToSpan + (h.isBiDualLeftWeyl_barDownBlockIsospin f f')).reducesInvariantsTo) include h in -/-- The conjugate up-type block peels to the conjugate up-type Yukawa term. -/ -lemma peels_barUpYukawa (f f' : Fin 3) : - Peels (gaugeLorentzMaps repGauge repLorentz) (h.barUpBlockSubmodule f f') +/-- The conjugate up-type block reduces to the conjugate up-type Yukawa term. -/ +lemma reducesInvariantsTo_barUpYukawa (f f' : Fin 3) : + ReducesInvariantsTo (gaugeLorentzMaps repGauge repLorentz) (h.barUpBlockSubmodule f f') (ℂ ∙ h.barUpYukawa f f') := by - have hcolour : Peels (gaugeLorentzMaps repGauge repLorentz) (h.barUpBlockSubmodule f f') + have hcolour : ReducesInvariantsTo (gaugeLorentzMaps repGauge repLorentz) + (h.barUpBlockSubmodule f f') (⨆ k : Fin 2 × Fin 2 × Fin 2 × Fin 2, ℂ ∙ h.barUpBlockColour f f' k.1 k.2.1 k.2.2.1 k.2.2.2) := by - refine Peels.ofSU3 ((Peels.iSup_step fun k : Fin 2 × Fin 2 × Fin 2 × Fin 2 => - Step.ofSU3FunAntiFun - (h.isSU3FunAntiFun_barUpBlock f f' k.1 k.2.1 k.2.2.1 k.2.2.2)).mono_left ?_) + refine ReducesInvariantsTo.ofSU3 ((InvariantReductionToSpan.reducesInvariantsTo_iSup + fun k : Fin 2 × Fin 2 × Fin 2 × Fin 2 => + IsSU3FunAntiFun.invariantReductionToSpan + (h.isSU3FunAntiFun_barUpBlock f f' k.1 k.2.1 k.2.2.1 k.2.2.2)).mono_left ?_) rw [barUpBlockSubmodule] - refine mul_mul_le_of_le h.barHiggsSubmodule_zero_le (le_of_eq (h.range_u_eq f)) - (le_of_eq (h.range_barQ_eq f')) fun i j k => ?_ + refine Submodule.mul_mul_le_of_le_iSup_span h.barHiggsSubmodule_zero_le + (le_of_eq (h.range_u_eq f)) (le_of_eq (h.range_barQ_eq f')) fun i j k => ?_ rw [show h.isHiggsSector.barHiggs ![] i * (h.isFermionSector.uComponent f ![] j * h.isFermionSector.barQComponent f' ![] k) = h.barUpBlock f f' i j.1 (![k.2.1, j.2] 1) k.1 (![k.2.1, j.2] 0) k.2.2 from by simp [barUpBlock]] exact Submodule.mem_iSup_of_mem (i, j.1, k.1, k.2.2) (IsSU3FunAntiFun.mem_span _) - have hisospin : Peels (gaugeLorentzMaps repGauge repLorentz) + have hisospin : ReducesInvariantsTo (gaugeLorentzMaps repGauge repLorentz) (⨆ k : Fin 2 × Fin 2 × Fin 2 × Fin 2, ℂ ∙ h.barUpBlockColour f f' k.1 k.2.1 k.2.2.1 k.2.2.2) (⨆ m : Fin 2 × Fin 2, ℂ ∙ h.barUpBlockIsospin f f' m.1 m.2) := by - refine Peels.ofSU2 ((Peels.iSup_step fun m : Fin 2 × Fin 2 => - Step.ofSU2BiFundamental - (h.isSU2BiFundamental_barUpBlockColour f f' m.1 m.2)).mono_left ?_) + refine ReducesInvariantsTo.ofSU2 ((InvariantReductionToSpan.reducesInvariantsTo_iSup + fun m : Fin 2 × Fin 2 => + IsSU2BiFundamental.invariantReductionToSpan + (h.isSU2BiFundamental_barUpBlockColour f f' m.1 m.2)).mono_left ?_) refine iSup_le fun k => (Submodule.span_singleton_le_iff_mem _ _).2 (Submodule.mem_iSup_of_mem (k.2.1, k.2.2.1) ?_) rw [show h.barUpBlockColour f f' k.1 k.2.1 k.2.2.1 k.2.2.2 = h.barUpBlockColour f f' (![k.1, k.2.2.2] 0) k.2.1 k.2.2.1 (![k.1, k.2.2.2] 1) from by simp] exact IsSU2BiFundamental.mem_span _ - exact (hcolour.trans hisospin).trans (Peels.ofLorentz - (Step.ofBiDualRightWeyl (h.isBiDualRightWeyl_barUpBlockIsospin f f')).peels) + exact (hcolour.trans hisospin).trans (ReducesInvariantsTo.ofLorentz + (IsBiDualRightWeyl.invariantReductionToSpan + (h.isBiDualRightWeyl_barUpBlockIsospin f f')).reducesInvariantsTo) include h in -/-- The conjugate charged-lepton block peels to the conjugate charged-lepton Yukawa term, +/-- The conjugate charged-lepton block reduces to the conjugate charged-lepton Yukawa term, again with the trivial colour stage. -/ -lemma peels_barLeptonYukawa (f f' : Fin 3) : - Peels (gaugeLorentzMaps repGauge repLorentz) (h.barLeptonBlockSubmodule f f') +lemma reducesInvariantsTo_barLeptonYukawa (f f' : Fin 3) : + ReducesInvariantsTo (gaugeLorentzMaps repGauge repLorentz) (h.barLeptonBlockSubmodule f f') (ℂ ∙ h.barLeptonYukawa f f') := by - have hcolour : Peels (gaugeLorentzMaps repGauge repLorentz) + have hcolour : ReducesInvariantsTo (gaugeLorentzMaps repGauge repLorentz) (h.barLeptonBlockSubmodule f f') (⨆ k : Fin 2 × Fin 2 × Fin 2 × Fin 2, ℂ ∙ h.barLeptonBlock f f' k.1 k.2.1 k.2.2.1 k.2.2.2) := by - refine Peels.ofSU3 ((Peels.iSup_step fun k : Fin 2 × Fin 2 × Fin 2 × Fin 2 => - Step.ofFixed (h.barLeptonBlock f f' k.1 k.2.1 k.2.2.1 k.2.2.2) - fun U => - h.repGauge_su3_barLeptonBlock U f f' k.1 k.2.1 k.2.2.1 k.2.2.2).mono_left ?_) + refine ReducesInvariantsTo.ofSU3 ((InvariantReductionToSpan.reducesInvariantsTo_iSup + fun k : Fin 2 × Fin 2 × Fin 2 × Fin 2 => + InvariantReductionToSpan.ofFixed (h.barLeptonBlock f f' k.1 k.2.1 k.2.2.1 k.2.2.2) + fun U => + h.repGauge_su3_barLeptonBlock U f f' k.1 k.2.1 k.2.2.1 k.2.2.2).mono_left ?_) rw [barLeptonBlockSubmodule] - refine mul_mul_le_of_le h.barHiggsSubmodule_zero_le (le_of_eq (h.range_L_eq f)) - (le_of_eq (h.range_bare_eq f')) fun i j k => ?_ + refine Submodule.mul_mul_le_of_le_iSup_span h.barHiggsSubmodule_zero_le + (le_of_eq (h.range_L_eq f)) (le_of_eq (h.range_bare_eq f')) fun i j k => ?_ rw [show h.isHiggsSector.barHiggs ![] i * (h.isFermionSector.LComponent f ![] j * h.isFermionSector.bareComponent f' ![] k) = h.barLeptonBlock f f' i j.1 j.2 k from by simp [barLeptonBlock]] exact Submodule.mem_iSup_of_mem (i, j.1, j.2, k) (Submodule.mem_span_singleton_self _) - have hisospin : Peels (gaugeLorentzMaps repGauge repLorentz) + have hisospin : ReducesInvariantsTo (gaugeLorentzMaps repGauge repLorentz) (⨆ k : Fin 2 × Fin 2 × Fin 2 × Fin 2, ℂ ∙ h.barLeptonBlock f f' k.1 k.2.1 k.2.2.1 k.2.2.2) (⨆ m : Fin 2 × Fin 2, ℂ ∙ h.barLeptonBlockIsospin f f' m.1 m.2) := by - refine Peels.ofSU2 ((Peels.iSup_step fun m : Fin 2 × Fin 2 => - Step.ofSU2FunAntiFun (h.isSU2FunAntiFun_barLeptonBlock f f' m.1 m.2)).mono_left ?_) + refine ReducesInvariantsTo.ofSU2 ((InvariantReductionToSpan.reducesInvariantsTo_iSup + fun m : Fin 2 × Fin 2 => + IsSU2FunAntiFun.invariantReductionToSpan + (h.isSU2FunAntiFun_barLeptonBlock f f' m.1 m.2)).mono_left ?_) refine iSup_le fun k => (Submodule.span_singleton_le_iff_mem _ _).2 (Submodule.mem_iSup_of_mem (k.2.1, k.2.2.2) ?_) rw [show h.barLeptonBlock f f' k.1 k.2.1 k.2.2.1 k.2.2.2 = h.barLeptonBlock f f' (![k.1, k.2.2.1] 0) k.2.1 (![k.1, k.2.2.1] 1) k.2.2.2 from by simp] exact IsSU2BiFundamental.mem_span _ - exact (hcolour.trans hisospin).trans (Peels.ofLorentz - (Step.ofBiDualLeftWeyl (h.isBiDualLeftWeyl_barLeptonBlockIsospin f f')).peels) + exact (hcolour.trans hisospin).trans (ReducesInvariantsTo.ofLorentz + (IsBiDualLeftWeyl.invariantReductionToSpan + (h.isBiDualLeftWeyl_barLeptonBlockIsospin f f')).reducesInvariantsTo) /-! ## E. The classification of the invariants of mass weight eight The two directions meet. Forwards: a gauge invariant of the sector lies in the weight-zero -piece modulo `S`, the piece lies in the six block submodules, and the peeling takes those to +piece modulo `S`, the piece lies in the six block submodules, and the reduction takes those to the Yukawa span. Backwards: `yukawaSpan_le_inf` says the Yukawa span is made of invariants of the right mass weight to begin with, so splitting `x` as `(x - y) + y` recovers the hypotheses. Nothing but that splitting is needed for the converse, which is what makes the @@ -740,28 +768,31 @@ lemma span_barLeptonYukawa_le_yukawaSpan (f f' : Fin 3) : (Submodule.mem_span_singleton_self _)))) include h in -/-- The join of the six block submodules over the nine family pairs peels to the Yukawa +/-- The join of the six block submodules over the nine family pairs reduces to the Yukawa span: the fifty-four blocks are taken one at a time, each in turn joining the error term of the others, which is what their stability is for. -/ -lemma peels_yukawaSpan : - Peels (gaugeLorentzMaps repGauge repLorentz) h.blockSubmodule h.yukawaSpan := by +lemma reducesInvariantsTo_yukawaSpan : + ReducesInvariantsTo (gaugeLorentzMaps repGauge repLorentz) h.blockSubmodule h.yukawaSpan := by have hW : IsStableUnder (gaugeLorentzMaps repGauge repLorentz) h.yukawaSpan := h.isFixedBy_yukawaSpan.isStableUnder - have hblock : ∀ f f' : Fin 3, Peels (gaugeLorentzMaps repGauge repLorentz) + have hblock : ∀ f f' : Fin 3, ReducesInvariantsTo (gaugeLorentzMaps repGauge repLorentz) (h.downBlockSubmodule f f' ⊔ h.upBlockSubmodule f f' ⊔ h.leptonBlockSubmodule f f' ⊔ h.barDownBlockSubmodule f f' ⊔ h.barUpBlockSubmodule f f' ⊔ h.barLeptonBlockSubmodule f f') h.yukawaSpan := fun f f' => - Peels.sup (Peels.sup (Peels.sup (Peels.sup (Peels.sup - ((h.peels_downYukawa f f').mono_right (h.span_downYukawa_le_yukawaSpan f f')) - ((h.peels_upYukawa f f').mono_right (h.span_upYukawa_le_yukawaSpan f f')) + ReducesInvariantsTo.sup (ReducesInvariantsTo.sup (ReducesInvariantsTo.sup + (ReducesInvariantsTo.sup (ReducesInvariantsTo.sup + ((h.reducesInvariantsTo_downYukawa f f').mono_right (h.span_downYukawa_le_yukawaSpan f f')) + ((h.reducesInvariantsTo_upYukawa f f').mono_right (h.span_upYukawa_le_yukawaSpan f f')) (h.isStableUnder_upBlockSubmodule f f') hW) - ((h.peels_leptonYukawa f f').mono_right (h.span_leptonYukawa_le_yukawaSpan f f')) + ((h.reducesInvariantsTo_leptonYukawa f f').mono_right + (h.span_leptonYukawa_le_yukawaSpan f f')) (h.isStableUnder_leptonBlockSubmodule f f') hW) - ((h.peels_barDownYukawa f f').mono_right (h.span_barDownYukawa_le_yukawaSpan f f')) + ((h.reducesInvariantsTo_barDownYukawa f f').mono_right + (h.span_barDownYukawa_le_yukawaSpan f f')) (h.isStableUnder_barDownBlockSubmodule f f') hW) - ((h.peels_barUpYukawa f f').mono_right (h.span_barUpYukawa_le_yukawaSpan f f')) + ((h.reducesInvariantsTo_barUpYukawa f f').mono_right (h.span_barUpYukawa_le_yukawaSpan f f')) (h.isStableUnder_barUpBlockSubmodule f f') hW) - ((h.peels_barLeptonYukawa f f').mono_right + ((h.reducesInvariantsTo_barLeptonYukawa f f').mono_right (h.span_barLeptonYukawa_le_yukawaSpan f f')) (h.isStableUnder_barLeptonBlockSubmodule f f') hW have hstable : ∀ f f' : Fin 3, IsStableUnder (gaugeLorentzMaps repGauge repLorentz) @@ -775,14 +806,14 @@ lemma peels_yukawaSpan : (h.isStableUnder_barUpBlockSubmodule f f') |>.sup (h.isStableUnder_barLeptonBlockSubmodule f f') rw [blockSubmodule] - exact Peels.iSup (fun f => Peels.iSup (hblock f) (hstable f) hW) + exact ReducesInvariantsTo.iSup (fun f => ReducesInvariantsTo.iSup (hblock f) (hstable f) hW) (fun f => isStableUnder_iSup (hstable f)) hW include h in /-- A gauge and Lorentz invariant of the Yukawa sector at mass weight eight, modulo a submodule `S` stable under both groups, lies in the Yukawa span joined with `S`. Hypercharge puts it in the weight-zero piece, the piece lies in the six block submodules, - and colour, isospin and Lorentz peel each block down to its Yukawa term. -/ + and colour, isospin and Lorentz reduce each block to its Yukawa term. -/ theorem mem_yukawaSpan_sup_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} @@ -792,7 +823,7 @@ theorem mem_yukawaSpan_sup_of_gauge_and_lorentz_invariant (S : Submodule ℂ B) x ∈ h.yukawaSpan ⊔ S := by have hpiece := h.mem_sectorMassWeightEight_piece_zero_sup_of_invariant (fun i y hy => hS (gaugeTorusGen i) y hy) hx hGinv - exact h.peels_yukawaSpan S (isStableUnder_gaugeLorentzMaps_iff.2 ⟨hS, hSL⟩) x + exact h.reducesInvariantsTo_yukawaSpan S (isStableUnder_gaugeLorentzMaps_iff.2 ⟨hS, hSL⟩) x (sup_le_sup_right h.sectorMassWeightEightGaugeWeight_piece_zero_le S hpiece) (forall_gaugeLorentzMaps_eq_self_iff.2 ⟨hGinv, hLinv⟩) diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/Basic.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/Basic.lean index 4db073858..1137ab7bc 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/Basic.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/Basic.lean @@ -5,6 +5,7 @@ Authors: Joseph Tooby-Smith -/ module +public import Physlib.Mathematics.InvariantReduction public import Physlib.Mathematics.LinearCombination /-! # Families of components and their invariants @@ -15,7 +16,7 @@ field strengths `F^a F^b` indexed by `ι = Fin 2 → Fin 8`. A gauge transformat components into one another by a fixed matrix, and the question is always the same: which linear combinations of the components does every transformation leave alone? The answer, file by file, is a specific contraction, the trace `∑ a, T ![a, a]` or an epsilon symbol, -and this file holds the three steps of the argument that do not depend on the family. +and this file holds the two steps of the argument that do not depend on the family. The first is bookkeeping: a vector lies in the span of the components precisely when it is a linear combination `∑ i, c i • T i`, so the span is described by coefficient functions @@ -31,11 +32,10 @@ invariant coefficient, and classifying invariants of the span reduces to classif coefficient functions, a finite linear-algebra problem: `Family.exists_invariant_coeff`, the case `g' = g⁻¹` of `Fintype.exists_invariant_coeff_of_adjoint_mem`. -The third is peeling. The Standard Model files handle many families at once and remove them -one at a time modulo a stable submodule `S` in which the other families are parked. A -classification of the invariants of a family, valid in every module, applies in the quotient -`B ⧸ S`, and `Family.exists_smul_add_of_mem_sup` lifts it back: an invariant of the span -joined with `S` is a multiple of the contraction up to an invariant remainder in `S`. +The classifications are also needed modulo a stable submodule `S`. Each family file shows that +its law descends to `B ⧸ S`, applies its classification there, and lifts the result back with +`IsStableUnder.exists_smul_add_of_quotient` or `IsStableUnder.mem_sup_of_quotient` from +`Physlib.Mathematics.InvariantReduction`. -/ @[expose] public section @@ -121,64 +121,6 @@ theorem exists_invariant_coeff end Complement -/-! - -## C. Peeling a family off a stable submodule - -A submodule `S` stable under the transformations carries the induced maps -`S.mapQ S (φ g) _` on the quotient, and the classes of the components form a family in the -quotient. When the invariants of that family are known to be the classes of a submodule `W` -of invariant vectors, typically the multiples of one contraction `v`, an invariant of the -span joined with `S` lies in `W` up to a remainder in `S`, and the remainder is invariant for -free, being the difference of two invariants. Stability of `S` cannot be dropped: an unstable -line has no invariant but `0`, while its sum with the span may well carry invariants outside -the span. - --/ - -/-- Peeling one family off a stable submodule, when its invariants in the quotient are - known to be the classes of a submodule `W` of invariant vectors. -/ -theorem exists_mem_add_of_mem_sup {G : Type*} (T : ι → B) (φ : G → B →ₗ[ℂ] B) - (S : Submodule ℂ B) (hS : ∀ g, ∀ y ∈ S, φ g y ∈ S) (W : Submodule ℂ B) - (hW : ∀ w ∈ W, ∀ g, φ g w = w) - (hclass : ∀ x : B ⧸ S, x ∈ (⨆ i, ℂ ∙ S.mkQ (T i)) → - (∀ g, S.mapQ S (φ g) (hS g) x = x) → x ∈ W.map S.mkQ) - {x : B} (hx : x ∈ (⨆ i, ℂ ∙ T i) ⊔ S) (hinv : ∀ g, φ g x = x) : - ∃ w ∈ W, ∃ y ∈ S, x = w + y ∧ ∀ g, φ g y = y := by - have hmk : S.mkQ x ∈ ⨆ i, ℂ ∙ S.mkQ (T i) := by - obtain ⟨u, hu, z, hz, huz⟩ := Submodule.mem_sup.1 hx - obtain ⟨c, hc⟩ := (mem_iSup_span_singleton_iff T u).1 hu - refine (mem_iSup_span_singleton_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 i _ => map_smul _ _ _ - obtain ⟨w, hw, hwx⟩ := hclass _ hmk fun g => by - rw [Submodule.mkQ_apply, Submodule.mapQ_apply, hinv] - refine ⟨w, hw, x - w, ?_, by abel, fun g => ?_⟩ - · have hker : x - w ∈ LinearMap.ker S.mkQ := by - rw [LinearMap.mem_ker, map_sub, hwx, sub_self] - rwa [Submodule.ker_mkQ] at hker - · rw [map_sub, hinv g, hW w hw g] - -/-- Peeling one family off a stable submodule, when its invariants in the quotient are - known to be the multiples of the class of an invariant vector `v`. -/ -theorem exists_smul_add_of_mem_sup {G : Type*} (T : ι → B) (φ : G → B →ₗ[ℂ] B) - (S : Submodule ℂ B) (hS : ∀ g, ∀ y ∈ S, φ g y ∈ S) (v : B) (hv : ∀ g, φ g v = v) - (hclass : ∀ x : B ⧸ S, x ∈ (⨆ i, ℂ ∙ S.mkQ (T i)) → - (∀ g, S.mapQ S (φ g) (hS g) x = x) → ∃ c : ℂ, x = c • S.mkQ v) - {x : B} (hx : x ∈ (⨆ i, ℂ ∙ T i) ⊔ S) (hinv : ∀ g, φ g x = x) : - ∃ c : ℂ, ∃ y ∈ S, x = c • v + y ∧ ∀ g, φ g y = y := by - obtain ⟨w, hw, y, hyS, hxy, hyinv⟩ := exists_mem_add_of_mem_sup T φ S hS (ℂ ∙ v) - (fun w hw g => by - obtain ⟨c, rfl⟩ := Submodule.mem_span_singleton.1 hw - rw [map_smul, hv]) - (fun x hx hinv => by - obtain ⟨c, hc⟩ := hclass x hx hinv - exact ⟨c • v, Submodule.smul_mem _ _ (Submodule.mem_span_singleton_self _), - by rw [map_smul, hc]⟩) hx hinv - obtain ⟨c, rfl⟩ := Submodule.mem_span_singleton.1 hw - exact ⟨c, y, hyS, hxy, hyinv⟩ - end Family end StandardModel diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2Adjoint.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2Adjoint.lean index 11770e05b..eb40e3960 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2Adjoint.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2Adjoint.lean @@ -158,7 +158,7 @@ theorem eq_zero_of_act_eq {c : Fin 3 → ℂ} The action on coefficients is unitary, so `Family.exists_invariant_coeff` writes an invariant of the span as the contraction of an invariant coefficient vector, which section C makes zero. The statement is made for any family of linear maps obeying the law, so that it -applies in a quotient, and `Family.exists_smul_add_of_mem_sup` then gives the form modulo a +applies in a quotient, and `IsStableUnder.mem_sup_of_quotient` then gives the form modulo a stable submodule: an invariant of the span joined with `S` lies in `S`. -/ @@ -197,12 +197,13 @@ theorem mem_of_mem_span_sup_su2_invariant (hT : IsSU2Adjoint B repGauge T) (x : (hx : x ∈ hT.span ⊔ S) (hinv : ∀ U : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, U, 1) x = x) : x ∈ S := by - obtain ⟨c, y, hyS, hxy, -⟩ := Family.exists_smul_add_of_mem_sup T - (fun U => repGauge (1, U, 1)) S hS 0 (fun U => map_zero _) - (fun x hx hinv => ⟨0, by - rw [eq_zero_of_invariant' (fun U => isSU2AdjointMat_mapQ (hT.repGauge_T U) S (hS U)) - hx hinv, zero_smul]⟩) hx hinv - rwa [hxy, smul_zero, zero_add] + have h := IsStableUnder.mem_sup_of_quotient (σ := fun U => repGauge (1, U, 1)) + (V := ⨆ i, ℂ ∙ T i) (W := ⊥) hS (fun x hx hinv => by + rw [Submodule.map_iSup_span_singleton] at hx + rw [Submodule.map_bot, Submodule.mem_bot] + exact eq_zero_of_invariant' (fun U => isSU2AdjointMat_mapQ (hT.repGauge_T U) S (hS U)) + hx hinv) hx hinv + rwa [bot_sup_eq] at h /-- The isospin invariants of the span of the components joined with an isospin-stable submodule are exactly the isospin invariants of the submodule. -/ diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2AntiFundamental.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2AntiFundamental.lean index 9b278a560..f3bd338a5 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2AntiFundamental.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2AntiFundamental.lean @@ -75,6 +75,16 @@ variable {B : Type*} [AddCommGroup B] [Module ℂ B] {repGauge : Representation ℂ GaugeGroupI B} {U : specialUnitaryGroup (Fin 2) ℂ} {f : B →ₗ[ℂ] B} +/-- A finite sum of families carrying one fundamental and one anti-fundamental isospin + index is such a family again. -/ +lemma sum {ι : Type} [Fintype ι] {T : ι → (Fin 2 → Fin 2) → B} + (hT : ∀ i, IsSU2FunAntiFun B repGauge (T i)) : + IsSU2FunAntiFun B repGauge (fun l => ∑ i, T i l) where + repGauge_T V l := by + rw [map_sum, Finset.sum_congr rfl fun i (_ : i ∈ Finset.univ) => (hT i).repGauge_T V l, + Finset.sum_comm] + exact Finset.sum_congr rfl fun a _ => Finset.smul_sum.symm + /-! ## A.1. The epsilon re-index of the anti-fundamental slot @@ -208,6 +218,19 @@ theorem mem_span_sup_su2_invariant_iff {T : (Fin 2 → Fin 2) → B} refine ⟨-c, y, hyS, ?_, hyinv⟩ rw [hxy, epsilonContraction_reindex, smul_neg, neg_smul] +/-- The isospin invariants of the component span reduce to the span of the delta + contraction. -/ +noncomputable def invariantReductionToSpan {T : (Fin 2 → Fin 2) → B} + (hT : IsSU2FunAntiFun B repGauge T) : + InvariantReductionToSpan (fun V : specialUnitaryGroup (Fin 2) ℂ => repGauge (1, V, 1)) + (span T) where + spanningVector := deltaContraction T + stable := isStableUnder_iSup_span_singleton_of_sum fun V l => ⟨_, hT.repGauge_T V l⟩ + spanningVector_fixed := repGauge_deltaContraction hT + reduce S hS x hx hinv := by + obtain ⟨c, y, hy, hxy, -⟩ := hT.mem_span_sup_su2_invariant_iff x S hS hx hinv + exact ⟨c, y, hy, hxy⟩ + end IsSU2FunAntiFun /-! @@ -245,6 +268,16 @@ variable {B : Type*} [AddCommGroup B] [Module ℂ B] {repGauge : Representation ℂ GaugeGroupI B} {U : specialUnitaryGroup (Fin 2) ℂ} {f : B →ₗ[ℂ] B} +/-- A finite sum of families carrying two anti-fundamental isospin indices is such a family + again. -/ +lemma sum {ι : Type} [Fintype ι] {T : ι → (Fin 2 → Fin 2) → B} + (hT : ∀ i, IsSU2BiAntiFun B repGauge (T i)) : + IsSU2BiAntiFun B repGauge (fun l => ∑ i, T i l) where + repGauge_T V l := by + rw [map_sum, Finset.sum_congr rfl fun i (_ : i ∈ Finset.univ) => (hT i).repGauge_T V l, + Finset.sum_comm] + exact Finset.sum_congr rfl fun a _ => Finset.smul_sum.symm + /-! ## B.1. The epsilon re-index of both slots @@ -374,6 +407,19 @@ theorem mem_span_sup_su2_invariant_iff {T : (Fin 2 → Fin 2) → B} (by rw [span_reindex]; exact hx) hinv exact ⟨c, y, hyS, by rw [hxy, epsilonContraction_reindex], hyinv⟩ +/-- The isospin invariants of the component span reduce to the span of the epsilon + contraction. -/ +noncomputable def invariantReductionToSpan {T : (Fin 2 → Fin 2) → B} + (hT : IsSU2BiAntiFun B repGauge T) : + InvariantReductionToSpan (fun V : specialUnitaryGroup (Fin 2) ℂ => repGauge (1, V, 1)) + (span T) where + spanningVector := epsilonContraction T + stable := isStableUnder_iSup_span_singleton_of_sum fun V l => ⟨_, hT.repGauge_T V l⟩ + spanningVector_fixed := repGauge_epsilonContraction hT + reduce S hS x hx hinv := by + obtain ⟨c, y, hy, hxy, -⟩ := hT.mem_span_sup_su2_invariant_iff x S hS hx hinv + exact ⟨c, y, hy, hxy⟩ + end IsSU2BiAntiFun /-! diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiAdjoint.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiAdjoint.lean index 2d6881567..a6f536670 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiAdjoint.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiAdjoint.lean @@ -494,7 +494,7 @@ theorem exists_smul_traceContraction_of_su2_invariant (hT : IsSU2BiAdjoint B rep The Standard Model files handle many families at once and peel them off one at a time, so the classification is wanted modulo a submodule `S` in which the other families are parked. The law descends to the quotient by an isospin-stable `S`, so section E applies there, and -`Family.exists_smul_add_of_mem_sup` lifts the result back. +`IsStableUnder.exists_smul_add_of_quotient` lifts the result back. -/ @@ -517,8 +517,10 @@ theorem mem_span_sup_su2_invariant_iff (hT : IsSU2BiAdjoint B repGauge T) (x : B (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 - refine Family.exists_smul_add_of_mem_sup T (fun U => repGauge (1, U, 1)) S hS - hT.traceContraction hT.repGauge_traceContraction (fun x hx hinv => ?_) hx hinv + refine IsStableUnder.exists_smul_add_of_quotient (V := ⨆ i, ℂ ∙ T i) + (hS : IsStableUnder (fun U => repGauge (1, U, 1)) S) hT.repGauge_traceContraction + (fun x hx hinv => ?_) hx hinv + rw [Submodule.map_iSup_span_singleton] at hx obtain ⟨z, hz⟩ := exists_smul_sum_diag_of_invariant (fun U => isSU2BiAdjointMat_mapQ (hT.repGauge_T U) S (hS U)) hx hinv exact ⟨z, by rw [hz, traceContraction, map_sum]⟩ diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiFundamental.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiFundamental.lean index ef44b343a..ebcf29ab3 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiFundamental.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2BiFundamental.lean @@ -95,6 +95,15 @@ 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] := Family.sum_pi_two F +/-- A finite sum of bi-fundamental isospin families is such a family again. -/ +lemma sum {ι : Type} [Fintype ι] {T : ι → (Fin 2 → Fin 2) → B} + (hT : ∀ i, IsSU2BiFundamental B repGauge (T i)) : + IsSU2BiFundamental B repGauge (fun l => ∑ i, T i l) where + repGauge_T V l := by + rw [map_sum, Finset.sum_congr rfl fun i (_ : i ∈ Finset.univ) => (hT i).repGauge_T V l, + Finset.sum_comm] + exact Finset.sum_congr rfl fun a _ => Finset.smul_sum.symm + /-! ## B. The antisymmetric symbol and the epsilon contraction @@ -355,12 +364,26 @@ theorem mem_span_sup_su2_invariant_iff {T : (Fin 2 → Fin 2) → B} (hinv : ∀ V : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, V, 1) x = x) : ∃ c : ℂ, ∃ y ∈ S, x = c • epsilonContraction T + y ∧ ∀ V : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, V, 1) y = y := by - refine Family.exists_smul_add_of_mem_sup T (fun V => repGauge (1, V, 1)) S hS - (epsilonContraction T) (repGauge_epsilonContraction hT) (fun x hx hinv => ?_) hx hinv + refine IsStableUnder.exists_smul_add_of_quotient (σ := fun V => repGauge (1, V, 1)) + (V := ⨆ i, ℂ ∙ T i) hS (repGauge_epsilonContraction hT) (fun x hx hinv => ?_) hx hinv + rw [Submodule.map_iSup_span_singleton] at hx obtain ⟨z, hz⟩ := exists_smul_epsilonContraction_of_invariant' (fun V => isSU2BiFundamentalMat_mapQ (hT.repGauge_T V) S (hS V)) hx hinv exact ⟨z, by rw [hz, epsilonContraction, epsilonContraction, map_sub]⟩ +/-- The isospin invariants of the component span reduce to the span of the epsilon + contraction. -/ +noncomputable def invariantReductionToSpan {T : (Fin 2 → Fin 2) → B} + (hT : IsSU2BiFundamental B repGauge T) : + InvariantReductionToSpan (fun V : specialUnitaryGroup (Fin 2) ℂ => repGauge (1, V, 1)) + (span T) where + spanningVector := epsilonContraction T + stable := isStableUnder_iSup_span_singleton_of_sum fun V l => ⟨_, hT.repGauge_T V l⟩ + spanningVector_fixed := repGauge_epsilonContraction hT + reduce S hS x hx hinv := by + obtain ⟨c, y, hy, hxy, -⟩ := hT.mem_span_sup_su2_invariant_iff x S hS hx hinv + exact ⟨c, y, hy, hxy⟩ + /-! ## Aside: the entries of an `SU(2)` matrix under conjugation diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2QuadFundamental.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2QuadFundamental.lean index a69a7f0cf..88c2559dc 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2QuadFundamental.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU2QuadFundamental.lean @@ -464,7 +464,7 @@ theorem exists_smul_add_smul_of_su2_invariant {T : (Fin 4 → Fin 2) → B} ## F. The invariants modulo a stable submodule The law descends to the quotient by an isospin-stable `S`, so section E applies there, and -`Family.exists_mem_add_of_mem_sup` lifts the result back, the invariants of the quotient +`IsStableUnder.exists_add_of_quotient` lifts the result back, the invariants of the quotient family being the classes of the plane spanned by the two contractions. -/ @@ -501,14 +501,15 @@ theorem mem_span_sup_su2_invariant_iff {T : (Fin 4 → Fin 2) → B} ∃ c₁ c₂ : ℂ, ∃ y ∈ S, x = c₁ • epsilonContraction₁₂ T + c₂ • epsilonContraction₁₃ T + y ∧ ∀ V : specialUnitaryGroup (Fin 2) ℂ, repGauge (1, V, 1) y = y := by - obtain ⟨w, hw, y, hyS, hxy, hyinv⟩ := Family.exists_mem_add_of_mem_sup T - (fun V => repGauge (1, V, 1)) S hS - (Submodule.span ℂ {epsilonContraction₁₂ T, epsilonContraction₁₃ T}) - (fun w hw V => by + obtain ⟨w, hw, y, hyS, hxy, hyinv⟩ := IsStableUnder.exists_add_of_quotient + (σ := fun V => repGauge (1, V, 1)) (V := ⨆ i, ℂ ∙ T i) + (W := Submodule.span ℂ {epsilonContraction₁₂ T, epsilonContraction₁₃ T}) hS + (fun V w hw => by obtain ⟨c₁, c₂, rfl⟩ := Submodule.mem_span_pair.1 hw rw [map_add, map_smul, map_smul, repGauge_epsilonContraction₁₂ hT, repGauge_epsilonContraction₁₃ hT]) (fun x hx hinv => by + rw [Submodule.map_iSup_span_singleton] at hx obtain ⟨c₁, c₂, hx'⟩ := exists_smul_add_smul_of_invariant' (fun V => isSU2QuadFundamentalMat_mapQ (hT.repGauge_T V) S (hS V)) hx hinv refine ⟨c₁ • epsilonContraction₁₂ T + c₂ • epsilonContraction₁₃ T, diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3Adjoint.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3Adjoint.lean index 12c5e9bff..ee6c1ad37 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3Adjoint.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3Adjoint.lean @@ -192,7 +192,7 @@ theorem eq_zero_of_rowAct_eq {c : Fin 8 → ℂ} The action on coefficients is unitary, so `Family.exists_invariant_coeff` writes an invariant of the span as the contraction of an invariant coefficient vector, which section C makes zero. The statement is made for any family of linear maps obeying the law, so that -it applies in a quotient, and `Family.exists_smul_add_of_mem_sup` then gives the form +it applies in a quotient, and `IsStableUnder.mem_sup_of_quotient` then gives the form modulo a stable submodule: an invariant of the span joined with `S` lies in `S`. -/ @@ -231,12 +231,13 @@ theorem mem_of_mem_span_sup_su3_invariant (hT : IsSU3Adjoint B repGauge T) (x : (hx : x ∈ hT.span ⊔ S) (hinv : ∀ U : specialUnitaryGroup (Fin 3) ℂ, repGauge (U, 1, 1) x = x) : x ∈ S := by - obtain ⟨c, y, hyS, hxy, -⟩ := Family.exists_smul_add_of_mem_sup T - (fun U => repGauge (U, 1, 1)) S hS 0 (fun U => map_zero _) - (fun x hx hinv => ⟨0, by - rw [eq_zero_of_invariant' (fun U => isSU3AdjointMat_mapQ (hT.repGauge_T U) S (hS U)) - hx hinv, zero_smul]⟩) hx hinv - rwa [hxy, smul_zero, zero_add] + have h := IsStableUnder.mem_sup_of_quotient (σ := fun U => repGauge (U, 1, 1)) + (V := ⨆ i, ℂ ∙ T i) (W := ⊥) hS (fun x hx hinv => by + rw [Submodule.map_iSup_span_singleton] at hx + rw [Submodule.map_bot, Submodule.mem_bot] + exact eq_zero_of_invariant' (fun U => isSU3AdjointMat_mapQ (hT.repGauge_T U) S (hS U)) + hx hinv) hx hinv + rwa [bot_sup_eq] at h /-- The colour invariants of the span of the components joined with a colour-stable submodule are exactly the colour invariants of the submodule. -/ diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiAdjoint.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiAdjoint.lean index a1fb611b2..24804eff3 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiAdjoint.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiAdjoint.lean @@ -583,8 +583,8 @@ noncomputable def wtCoeff : WeightIdx → Fin 8 → ℂ The Standard Model files handle many families at once and peel them off one at a time, so the classification is wanted modulo a submodule `S` in which the other families are parked. The law descends to the quotient by a stable `S`, section F applies there, and -`Family.exists_smul_add_of_mem_sup` lifts the result back. Once the trace contraction is known -to be gauge invariant, so is the remainder `y = x - c • traceContraction`. +`IsStableUnder.exists_smul_add_of_quotient` lifts the result back. Once the trace contraction +is known to be gauge invariant, so is the remainder `y = x - c • traceContraction`. -/ @@ -612,10 +612,11 @@ theorem mem_span_sup_invariant_iff {B : Type*} [Ring B] [Algebra ℂ B] (hinv : ∀ g : GaugeGroupI, repGauge g x = x) : ∃ c : ℂ, ∃ y ∈ S, x = c • hT.traceContraction + y ∧ ∀ g : GaugeGroupI, repGauge g y = y := by - obtain ⟨c, y, hyS, hxy, -⟩ := Family.exists_smul_add_of_mem_sup T - (fun U => repGauge (U, 1, 1)) S (fun U => hS (U, 1, 1)) hT.traceContraction + obtain ⟨c, y, hyS, hxy, -⟩ := IsStableUnder.exists_smul_add_of_quotient + (σ := fun U => repGauge (U, 1, 1)) (V := ⨆ i, ℂ ∙ T i) (fun U => hS (U, 1, 1)) (fun U => hT.map_traceContraction (hT.repGauge_T U)) (fun x hx hinv => by + rw [Submodule.map_iSup_span_singleton] at hx obtain ⟨z, hz⟩ := exists_smul_sum_diag_of_invariant (fun U => isSU3BiAdjointMat_mapQ (hT.repGauge_T U) S (hS (U, 1, 1))) hx hinv exact ⟨z, by rw [hz, traceContraction, map_sum]⟩) diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiFundamental.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiFundamental.lean index 61f460ef6..faaefe19c 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiFundamental.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3BiFundamental.lean @@ -155,7 +155,7 @@ theorem eq_zero_of_su3_invariant (hT : IsSU3BiFundamental B repGauge T) {x : B} ## C. The invariants modulo a stable submodule The law descends to the quotient by a colour-stable submodule `S`, section B applies there, -and `Family.exists_smul_add_of_mem_sup` lifts the result back: an invariant of the span +and `IsStableUnder.mem_sup_of_quotient` lifts the result back: an invariant of the span joined with `S` lies in `S`, two fundamental colour indices contributing nothing. -/ @@ -177,13 +177,13 @@ theorem mem_of_mem_span_sup_su3_invariant (hT : IsSU3BiFundamental B repGauge T) (hx : x ∈ hT.span ⊔ S) (hinv : ∀ U : specialUnitaryGroup (Fin 3) ℂ, repGauge (U, 1, 1) x = x) : x ∈ S := by - obtain ⟨c, y, hyS, hxy, -⟩ := Family.exists_smul_add_of_mem_sup T - (fun U => repGauge (U, 1, 1)) S hS 0 (fun U => map_zero _) - (fun x hx hinv => ⟨0, by - rw [eq_zero_of_invariant' - (fun U => isSU3BiFundamentalMat_mapQ (hT.repGauge_T U) S (hS U)) hx hinv, zero_smul]⟩) - hx hinv - rwa [hxy, smul_zero, zero_add] + have h := IsStableUnder.mem_sup_of_quotient (σ := fun U => repGauge (U, 1, 1)) + (V := ⨆ i, ℂ ∙ T i) (W := ⊥) hS (fun x hx hinv => by + rw [Submodule.map_iSup_span_singleton] at hx + rw [Submodule.map_bot, Submodule.mem_bot] + exact eq_zero_of_invariant' + (fun U => isSU3BiFundamentalMat_mapQ (hT.repGauge_T U) S (hS U)) hx hinv) hx hinv + rwa [bot_sup_eq] at h /-- The colour invariants of the span of the components joined with a colour-stable submodule are exactly the colour invariants of the submodule. -/ diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3FunAntiFun.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3FunAntiFun.lean index 3195bee3e..f02d92883 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3FunAntiFun.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/IsSU3FunAntiFun.lean @@ -92,6 +92,16 @@ 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] := Family.sum_pi_two F +/-- A finite sum of families carrying one fundamental and one anti-fundamental colour index + is such a family again. -/ +lemma sum {ι : Type} [Fintype ι] {T : ι → (Fin 2 → Fin 3) → B} + (hT : ∀ i, IsSU3FunAntiFun B repGauge (T i)) : + IsSU3FunAntiFun B repGauge (fun l => ∑ i, T i l) where + repGauge_T U l := by + rw [map_sum, Finset.sum_congr rfl fun i (_ : i ∈ Finset.univ) => (hT i).repGauge_T U l, + Finset.sum_comm] + exact Finset.sum_congr rfl fun a _ => Finset.smul_sum.symm + /-! ## B. The action on coefficients and the delta contraction @@ -319,12 +329,26 @@ theorem mem_span_sup_su3_invariant_iff {T : (Fin 2 → Fin 3) → B} (hinv : ∀ U : specialUnitaryGroup (Fin 3) ℂ, repGauge (U, 1, 1) x = x) : ∃ c : ℂ, ∃ y ∈ S, x = c • deltaContraction T + y ∧ ∀ U : specialUnitaryGroup (Fin 3) ℂ, repGauge (U, 1, 1) y = y := by - refine Family.exists_smul_add_of_mem_sup T (fun U => repGauge (U, 1, 1)) S hS - (deltaContraction T) (repGauge_deltaContraction hT) (fun x hx hinv => ?_) hx hinv + refine IsStableUnder.exists_smul_add_of_quotient (σ := fun U => repGauge (U, 1, 1)) + (V := ⨆ i, ℂ ∙ T i) hS (repGauge_deltaContraction hT) (fun x hx hinv => ?_) hx hinv + rw [Submodule.map_iSup_span_singleton] at hx obtain ⟨z, hz⟩ := exists_smul_deltaContraction_of_invariant' (fun U => isSU3FunAntiFunMat_mapQ (hT.repGauge_T U) S (hS U)) hx hinv exact ⟨z, by rw [hz, deltaContraction, deltaContraction, map_sum]⟩ +/-- The colour invariants of the component span reduce to the span of the delta + contraction. -/ +noncomputable def invariantReductionToSpan {T : (Fin 2 → Fin 3) → B} + (hT : IsSU3FunAntiFun B repGauge T) : + InvariantReductionToSpan (fun U : specialUnitaryGroup (Fin 3) ℂ => repGauge (U, 1, 1)) + (span T) where + spanningVector := deltaContraction T + stable := isStableUnder_iSup_span_singleton_of_sum fun U l => ⟨_, hT.repGauge_T U l⟩ + spanningVector_fixed := repGauge_deltaContraction hT + reduce S hS x hx hinv := by + obtain ⟨c, y, hy, hxy, -⟩ := hT.mem_span_sup_su3_invariant_iff x S hS hx hinv + exact ⟨c, y, hy, hxy⟩ + end IsSU3FunAntiFun end StandardModel diff --git a/Physlib/Particles/StandardModel/InvariantReduction.lean b/Physlib/Particles/StandardModel/InvariantReduction.lean new file mode 100644 index 000000000..b7e1a25a4 --- /dev/null +++ b/Physlib/Particles/StandardModel/InvariantReduction.lean @@ -0,0 +1,232 @@ +/- +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.Mathematics.InvariantReduction +public import Physlib.Particles.StandardModel.GaugeGroup.Basic +public import Physlib.Relativity.IsLorentzDeriv +/-! +# Invariant reduction for the gauge and Lorentz groups + +The Standard Model sectors are classified with `ReducesInvariantsTo` from +`Physlib.Mathematics.InvariantReduction`, one index law at a time: colour, isospin and Lorentz. +The reductions for the individual laws are `invariantReductionToSpan` beside each +classification theorem. This file supplies what the sectors share when combining them. + +- A. The family `gaugeLorentzMaps` indexed by `GaugeGroupI ⊕ SL(2,ℂ)`, and the transport of + colour, isospin and Lorentz reductions to it. +- B. The colour, isospin and hypercharge factors of a gauge transformation; an element fixed + by each factor is gauge invariant. +- C. Stability of the range of a symbol map under the gauge and Lorentz groups. +-/ + +@[expose] public section + +namespace StandardModel + +open TensorProduct Matrix MatrixGroups Lorentz Pointwise ComplexConjugate + +/-! + +## A. The gauge and Lorentz groups together + +The family indexed by the disjoint union of the two groups has as invariants the elements +fixed by both groups, and as stable submodules those stable under both. A reduction for the +colour, isospin or Lorentz factor is transported to it by `ReducesInvariantsTo.comp`. + +-/ + +section BothGroups + +variable {B : Type*} [AddCommGroup B] [Module ℂ B] + (repGauge : Representation ℂ GaugeGroupI B) + (repLorentz : Representation ℂ SL(2,ℂ) B) + +/-- The gauge and Lorentz groups read as a single family of linear maps, indexed by their + disjoint union. -/ +def gaugeLorentzMaps : GaugeGroupI ⊕ SL(2,ℂ) → B →ₗ[ℂ] B := + Sum.elim (fun g => repGauge g) (fun Λ => repLorentz Λ) + +variable {repGauge repLorentz} + +/-- A submodule stable under both groups is stable under the combined family, and + conversely. -/ +lemma isStableUnder_gaugeLorentzMaps_iff {V : Submodule ℂ B} : + IsStableUnder (gaugeLorentzMaps repGauge repLorentz) V + ↔ (∀ g : GaugeGroupI, ∀ y ∈ V, repGauge g y ∈ V) + ∧ ∀ Λ : SL(2,ℂ), ∀ y ∈ V, repLorentz Λ y ∈ V := by + constructor + · exact fun hV => ⟨fun g => hV (Sum.inl g), fun Λ => hV (Sum.inr Λ)⟩ + · rintro ⟨hg, hL⟩ (g | Λ) + · exact hg g + · exact hL Λ + +/-- An element fixed by both groups is fixed by the combined family, and conversely. -/ +lemma forall_gaugeLorentzMaps_eq_self_iff {x : B} : + (∀ p, gaugeLorentzMaps repGauge repLorentz p x = x) + ↔ (∀ g : GaugeGroupI, repGauge g x = x) ∧ ∀ Λ : SL(2,ℂ), repLorentz Λ x = x := by + constructor + · exact fun hx => ⟨fun g => hx (Sum.inl g), fun Λ => hx (Sum.inr Λ)⟩ + · rintro ⟨hg, hL⟩ (g | Λ) + · exact hg g + · exact hL Λ + +/-- A reduction for the colour factor is a reduction for the gauge and Lorentz groups + together. -/ +lemma ReducesInvariantsTo.ofSU3 {V W : Submodule ℂ B} + (hP : ReducesInvariantsTo (fun U : specialUnitaryGroup (Fin 3) ℂ => repGauge (U, 1, 1)) V W) : + ReducesInvariantsTo (gaugeLorentzMaps repGauge repLorentz) V W := + ReducesInvariantsTo.comp + (fun U : specialUnitaryGroup (Fin 3) ℂ => Sum.inl ((U, 1, 1) : GaugeGroupI)) hP + +/-- A reduction for the isospin factor is a reduction for the gauge and Lorentz groups + together. -/ +lemma ReducesInvariantsTo.ofSU2 {V W : Submodule ℂ B} + (hP : ReducesInvariantsTo (fun U : specialUnitaryGroup (Fin 2) ℂ => repGauge (1, U, 1)) V W) : + ReducesInvariantsTo (gaugeLorentzMaps repGauge repLorentz) V W := + ReducesInvariantsTo.comp + (fun U : specialUnitaryGroup (Fin 2) ℂ => Sum.inl ((1, U, 1) : GaugeGroupI)) hP + +/-- A Lorentz reduction is a reduction for the gauge and Lorentz groups together. -/ +lemma ReducesInvariantsTo.ofLorentz {V W : Submodule ℂ B} + (hP : ReducesInvariantsTo (fun Λ : SL(2,ℂ) => repLorentz Λ) V W) : + ReducesInvariantsTo (gaugeLorentzMaps repGauge repLorentz) V W := + ReducesInvariantsTo.comp (Sum.inr (α := GaugeGroupI)) hP + +end BothGroups + +/-! + +## B. The three factors of a gauge transformation + +A gauge transformation is a triple `(U, V, t)`, and the colour, isospin and hypercharge laws +each constrain one factor. This section records the factors and inverses of `(U, 1, 1)`, +`(1, V, 1)` and `(1, 1, t)`, the entries of inverses in `SU(3)` and `SU(2)`, and the +factorisation that turns three separate invariances into gauge invariance. + +-/ + +/-- The entries of the inverse of an `SU(3)` element are the conjugated transposed + entries, the inverse of a unitary matrix being its conjugate transpose. -/ +lemma su3_inv_apply (U : specialUnitaryGroup (Fin 3) ℂ) (a b : Fin 3) : + (U⁻¹).1 a b = conj (U.1 b a) := by + rw [← Matrix.star_eq_inv, Matrix.specialUnitaryGroup.coe_star] + simp [Matrix.star_apply] + +/-- The entries of the inverse of an `SU(2)` element are the conjugated transposed + entries. -/ +lemma su2_inv_apply (U : specialUnitaryGroup (Fin 2) ℂ) (a b : Fin 2) : + (U⁻¹).1 a b = conj (U.1 b a) := by + rw [← Matrix.star_eq_inv, Matrix.specialUnitaryGroup.coe_star] + simp [Matrix.star_apply] + +/-- The inverse of a unitary scalar is its conjugate. -/ +lemma unitary_inv_coe (t : unitary ℂ) : ((t⁻¹ : unitary ℂ) : ℂ) = star (t : ℂ) := rfl + +/-- The colour factor of a colour gauge transformation. -/ +@[simp] lemma toSU3_su3Elt (U : specialUnitaryGroup (Fin 3) ℂ) : + GaugeGroupI.toSU3 ((U, 1, 1) : GaugeGroupI) = U := rfl + +/-- The isospin factor of a colour gauge transformation is trivial. -/ +@[simp] lemma toSU2_su3Elt (U : specialUnitaryGroup (Fin 3) ℂ) : + GaugeGroupI.toSU2 ((U, 1, 1) : GaugeGroupI) = 1 := rfl + +/-- The hypercharge factor of a colour gauge transformation is trivial. -/ +@[simp] lemma toU1_su3Elt (U : specialUnitaryGroup (Fin 3) ℂ) : + GaugeGroupI.toU1 ((U, 1, 1) : GaugeGroupI) = 1 := rfl + +/-- The inverse of a colour gauge transformation is the colour transformation of the + inverse. -/ +@[simp] lemma inv_su3Elt (U : specialUnitaryGroup (Fin 3) ℂ) : + ((U, 1, 1) : GaugeGroupI)⁻¹ = ((U⁻¹, 1, 1) : GaugeGroupI) := by + simp + +/-- The colour factor of an isospin gauge transformation is trivial. -/ +@[simp] lemma toSU3_su2Elt (V : specialUnitaryGroup (Fin 2) ℂ) : + GaugeGroupI.toSU3 ((1, V, 1) : GaugeGroupI) = 1 := rfl + +/-- The isospin factor of an isospin gauge transformation. -/ +@[simp] lemma toSU2_su2Elt (V : specialUnitaryGroup (Fin 2) ℂ) : + GaugeGroupI.toSU2 ((1, V, 1) : GaugeGroupI) = V := rfl + +/-- The hypercharge factor of an isospin gauge transformation is trivial. -/ +@[simp] lemma toU1_su2Elt (V : specialUnitaryGroup (Fin 2) ℂ) : + GaugeGroupI.toU1 ((1, V, 1) : GaugeGroupI) = 1 := rfl + +/-- The inverse of an isospin gauge transformation is the isospin transformation of the + inverse. -/ +@[simp] lemma inv_su2Elt (V : specialUnitaryGroup (Fin 2) ℂ) : + ((1, V, 1) : GaugeGroupI)⁻¹ = ((1, V⁻¹, 1) : GaugeGroupI) := by + simp + +/-- The colour factor of a hypercharge gauge transformation is trivial. -/ +@[simp] lemma toSU3_u1Elt (t : unitary ℂ) : + GaugeGroupI.toSU3 ((1, 1, t) : GaugeGroupI) = 1 := rfl + +/-- The isospin factor of a hypercharge gauge transformation is trivial. -/ +@[simp] lemma toSU2_u1Elt (t : unitary ℂ) : + GaugeGroupI.toSU2 ((1, 1, t) : GaugeGroupI) = 1 := rfl + +/-- The hypercharge factor of a hypercharge gauge transformation. -/ +@[simp] lemma toU1_u1Elt (t : unitary ℂ) : + GaugeGroupI.toU1 ((1, 1, t) : GaugeGroupI) = t := rfl + +/-- The inverse of a hypercharge gauge transformation is the hypercharge transformation of + the inverse. -/ +@[simp] lemma inv_u1Elt (t : unitary ℂ) : + ((1, 1, t) : GaugeGroupI)⁻¹ = ((1, 1, t⁻¹) : GaugeGroupI) := by + simp + +/-- A gauge transformation is the product of its colour, isospin and hypercharge parts, so + an element fixed by each of the three factors separately is gauge invariant. -/ +lemma forall_repGauge_eq_self {B : Type*} [AddCommGroup B] [Module ℂ B] + {rep : Representation ℂ GaugeGroupI B} {x : B} + (h3 : ∀ U : specialUnitaryGroup (Fin 3) ℂ, rep (U, 1, 1) x = x) + (h2 : ∀ V : specialUnitaryGroup (Fin 2) ℂ, rep (1, V, 1) x = x) + (h1 : ∀ t : unitary ℂ, rep (1, 1, t) x = x) (g : GaugeGroupI) : rep g x = x := by + have hg : g = ((g.1, 1, 1) : GaugeGroupI) * (((1, g.2.1, 1) : GaugeGroupI) + * ((1, 1, g.2.2) : GaugeGroupI)) := by + simp [Prod.ext_iff] + rw [hg, map_mul, Module.End.mul_apply, map_mul, Module.End.mul_apply, h1, h2, h3] + +/-! + +## C. Stability of symbol ranges + +The range of a symbol map is carried into itself by the gauge group, and, with no +derivative slots, by the Lorentz group. + +-/ + +section Ranges + +variable {B : Type} [Ring B] [Algebra ℂ B] + +/-- The range of a symbol map is carried into itself by the gauge group: the symbol is + equivariant, so a gauge transformation only moves the dual vector it is evaluated at. -/ +lemma isStableUnder_range_repGauge {M : Type} [AddCommGroup M] [Module ℂ M] + {repGauge : Representation ℂ GaugeGroupI B} {ρ : Representation ℂ GaugeGroupI M} + {F : Module.Dual ℂ M →ₗ[ℂ] B} (hF : ∀ g φ, repGauge g (F φ) = F (ρ.dual g φ)) : + ∀ g : GaugeGroupI, ∀ y ∈ LinearMap.range F, repGauge g y ∈ LinearMap.range F := by + rintro g _ ⟨φ, rfl⟩ + exact ⟨ρ.dual g φ, (hF g φ).symm⟩ + +/-- The range of an underived symbol map is carried into itself by the Lorentz group: with + no derivative slots to mix, the transformation law moves the dual vector alone. -/ +lemma isStableUnder_range_repLorentz {M : Type} [AddCommGroup M] [Module ℂ M] + {repLorentz : Representation ℂ SL(2,ℂ) B} {ρ : Representation ℂ SL(2,ℂ) M} + {F : {n : ℕ} → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ M →ₗ[ℂ] B} + (hF : IsLorentzCovDerivTransforms repLorentz ρ F) (Λ : SL(2,ℂ)) : + ∀ y ∈ LinearMap.range (F (![] : Fin 0 → Fin 1 ⊕ Fin 3)), + repLorentz Λ y ∈ LinearMap.range (F (![] : Fin 0 → Fin 1 ⊕ Fin 3)) := by + rintro _ ⟨φ, rfl⟩ + rw [hF Λ 0 ![] φ, Fintype.sum_subsingleton _ ![]] + simp only [Finset.univ_eq_empty, Finset.prod_empty, one_smul] + exact ⟨ρ.dual Λ φ, rfl⟩ + +end Ranges + +end StandardModel diff --git a/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/KineticFamilies.lean b/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/KineticFamilies.lean index 4bf18804b..dc964ec09 100644 --- a/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/KineticFamilies.lean +++ b/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/KineticFamilies.lean @@ -6,7 +6,9 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.IsFermionSector.MassWeight.MassDimLTEight -public import Physlib.Particles.StandardModel.Peeling +public import Physlib.Particles.StandardModel.InvariantReduction +public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU3FunAntiFun +public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU2AntiFundamental /-! # The kinetic terms of the fermion sector @@ -19,16 +21,16 @@ matrices. That last contraction is `ψ̄ σ̄^μ ∂_μ ψ`. Ten blocks arise, the five conjugate pairs each with the derivative on one factor or the other, and they differ only in which indices their symbols carry. So the work is done once, -generically, in the shape `StandardModel.Peeling` consumes: a `KineticBlock` packages a +generically, in terms of `InvariantReductionToSpan`: a `KineticBlock` packages a block together with its three classification steps — colour, isospin, Lorentz — and from -that package alone come the contraction, its invariance under both groups, and the peeling +that package alone come the contraction, its invariance under both groups, and the reduction of the block down to the line through it. The ten blocks are then ten instantiations. The three stages are the same three the Yukawa sector runs, in the same order, and for the same reason: each contraction is a spectator of the ones after it. Where a block's symbols carry no colour index — the two lepton-doublet blocks and the two lepton-singlet ones — the -colour stage is `Step.ofFixedFamily` rather than a classification, and likewise for isospin -where the symbols carry none. That keeps all ten blocks in one shape. +colour stage is `InvariantReductionToSpan.ofFixedFamily` rather than a classification, and +likewise for isospin where the symbols carry none. That keeps all ten blocks in one shape. The ten blocks themselves are built in `KineticTerms`, which instantiates the package. @@ -675,14 +677,14 @@ lemma unitary_star_mul_coe (t : unitary ℂ) : star (t : ℂ) * (t : ℂ) = 1 := A kinetic block is classified in three stages, and every block runs the same three: colour, then isospin, then Lorentz, each contraction a spectator of the ones after it. `KineticBlock` packages a block together with the three steps, and from the package alone come the kinetic -term, its invariance under both groups, and the peeling of the block down to the line +term, its invariance under both groups, and the reduction of the block to the line through it. The colour and isospin indices of the block are listed in the order the classifiers read them, fundamental first; a block whose symbols carry no colour, or no isospin, simply -ignores the corresponding pair and supplies `Step.ofFixedFamily` for that stage. Each step -comes with the fact that its contraction lies in the submodule it classifies, which is what -carries the invariance of one stage through the stages after it. +ignores the corresponding pair and supplies `InvariantReductionToSpan.ofFixedFamily` for that +stage. Each step comes with the fact that its contraction lies in the submodule it classifies, which +is what carries the invariance of one stage through the stages after it. -/ @@ -702,25 +704,25 @@ structure KineticBlock where classified, by the delta contraction if the block carries colour and trivially if it does not. -/ colourStep : ∀ (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) (w w' : Fin 2), - Step (fun U : specialUnitaryGroup (Fin 3) ℂ => repGauge (U, 1, 1)) + InvariantReductionToSpan (fun U : specialUnitaryGroup (Fin 3) ℂ => repGauge (U, 1, 1)) (⨆ n : Fin 2 → Fin 3, ℂ ∙ blk q l (n 0) (n 1) w w') /-- The colour contraction lies in the span of the components it contracts. -/ - colourStep_mem : ∀ q l w w', (colourStep q l w w').contraction + colourStep_mem : ∀ q l w w', (colourStep q l w w').spanningVector ∈ ⨆ n : Fin 2 → Fin 3, ℂ ∙ blk q l (n 0) (n 1) w w' /-- The isospin stage, applied to the colour contraction. -/ isospinStep : ∀ (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2), - Step (fun V : specialUnitaryGroup (Fin 2) ℂ => repGauge (1, V, 1)) - (⨆ n : Fin 2 → Fin 2, ℂ ∙ (colourStep q l (n 0) (n 1)).contraction) + InvariantReductionToSpan (fun V : specialUnitaryGroup (Fin 2) ℂ => repGauge (1, V, 1)) + (⨆ n : Fin 2 → Fin 2, ℂ ∙ (colourStep q l (n 0) (n 1)).spanningVector) /-- The isospin contraction lies in the span of the colour contractions. -/ - isospinStep_mem : ∀ q l, (isospinStep q l).contraction - ∈ ⨆ n : Fin 2 → Fin 2, ℂ ∙ (colourStep q l (n 0) (n 1)).contraction + isospinStep_mem : ∀ q l, (isospinStep q l).spanningVector + ∈ ⨆ n : Fin 2 → Fin 2, ℂ ∙ (colourStep q l (n 0) (n 1)).spanningVector /-- The Lorentz stage, applied to the doubly contracted block: one four-vector index against a dual dotted and a dual undotted spinor index. -/ - lorentzStep : Step (fun Λ : SL(2,ℂ) => repLorentz Λ) - (⨆ p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2, ℂ ∙ (isospinStep p.1 p.2).contraction) + lorentzStep : InvariantReductionToSpan (fun Λ : SL(2,ℂ) => repLorentz Λ) + (⨆ p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2, ℂ ∙ (isospinStep p.1 p.2).spanningVector) /-- The Lorentz contraction lies in the span of the isospin contractions. -/ - lorentzStep_mem : lorentzStep.contraction - ∈ ⨆ p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2, ℂ ∙ (isospinStep p.1 p.2).contraction + lorentzStep_mem : lorentzStep.spanningVector + ∈ ⨆ p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2, ℂ ∙ (isospinStep p.1 p.2).spanningVector /-- A hypercharge transformation fixes every component of the block, the hypercharges of a species and its conjugate cancelling. -/ hyper : ∀ (t : unitary ℂ) q l c c' w w', @@ -732,32 +734,31 @@ variable {repGauge repLorentz} (K : KineticBlock repGauge repLorentz) /-- The kinetic term of a block: the conjugate Pauli contraction of its doubly contracted form, which is `ψ̄ σ̄^μ ∂_μ ψ` with the colour and isospin indices already joined. -/ -noncomputable def kineticTerm : B := K.lorentzStep.contraction +noncomputable def kineticTerm : B := K.lorentzStep.spanningVector /-- The join, over the derivative, spinor and isospin indices, of the colour spans of the - block: what the block submodule is peeled from. -/ + block: what the block submodule is reduced from. -/ noncomputable def blockSpan : Submodule ℂ B := ⨆ k : (Fin 1 ⊕ Fin 3) × (Fin 2 × Fin 2) × (Fin 2 × Fin 2), ⨆ n : Fin 2 → Fin 3, ℂ ∙ K.blk k.1 k.2.1 (n 0) (n 1) k.2.2.1 k.2.2.2 -/-- The three stages in sequence: the block span peels to the line through the kinetic - term. -/ -lemma peels : - Peels (gaugeLorentzMaps repGauge repLorentz) K.blockSpan (ℂ ∙ K.kineticTerm) := by +/-- The three stages in sequence: the block span reduces to the span of the kinetic term. -/ +lemma reducesInvariantsTo : + ReducesInvariantsTo (gaugeLorentzMaps repGauge repLorentz) K.blockSpan (ℂ ∙ K.kineticTerm) := by rw [blockSpan, kineticTerm] - have hc := Peels.iSup_step (σ := fun U : specialUnitaryGroup (Fin 3) ℂ => - repGauge ((U, 1, 1) : GaugeGroupI)) + have hc := InvariantReductionToSpan.reducesInvariantsTo_iSup + (σ := fun U : specialUnitaryGroup (Fin 3) ℂ => repGauge ((U, 1, 1) : GaugeGroupI)) (V := fun k : (Fin 1 ⊕ Fin 3) × (Fin 2 × Fin 2) × (Fin 2 × Fin 2) => ⨆ n : Fin 2 → Fin 3, ℂ ∙ K.blk k.1 k.2.1 (n 0) (n 1) k.2.2.1 k.2.2.2) fun k => K.colourStep k.1 k.2.1 k.2.2.1 k.2.2.2 - have hi := Peels.iSup_step (σ := fun V : specialUnitaryGroup (Fin 2) ℂ => - repGauge ((1, V, 1) : GaugeGroupI)) + have hi := InvariantReductionToSpan.reducesInvariantsTo_iSup + (σ := fun V : specialUnitaryGroup (Fin 2) ℂ => repGauge ((1, V, 1) : GaugeGroupI)) (V := fun p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2 => - ⨆ n : Fin 2 → Fin 2, ℂ ∙ (K.colourStep p.1 p.2 (n 0) (n 1)).contraction) + ⨆ n : Fin 2 → Fin 2, ℂ ∙ (K.colourStep p.1 p.2 (n 0) (n 1)).spanningVector) fun p => K.isospinStep p.1 p.2 - have h1 := Peels.ofSU3 (repLorentz := repLorentz) hc - have h2 := Peels.ofSU2 (repLorentz := repLorentz) hi - have h3 := Peels.ofLorentz (repGauge := repGauge) K.lorentzStep.peels + have h1 := ReducesInvariantsTo.ofSU3 (repLorentz := repLorentz) hc + have h2 := ReducesInvariantsTo.ofSU2 (repLorentz := repLorentz) hi + have h3 := ReducesInvariantsTo.ofLorentz (repGauge := repGauge) K.lorentzStep.reducesInvariantsTo refine (h1.mono_right ?_).trans (h2.trans h3) refine iSup_le fun k => le_iSup_of_le (k.1, k.2.1) (le_iSup_of_le ![k.2.2.1, k.2.2.2] ?_) simp @@ -766,10 +767,10 @@ lemma peels : contraction lies in the span of the objects of the stage before it. -/ lemma kineticTerm_mem {V : Submodule ℂ B} (hV : ∀ q l c c' w w', K.blk q l c c' w w' ∈ V) : K.kineticTerm ∈ V := by - have hcol : ∀ q l w w', (K.colourStep q l w w').contraction ∈ V := fun q l w w' => + have hcol : ∀ q l w w', (K.colourStep q l w w').spanningVector ∈ V := fun q l w w' => (iSup_le fun n => (Submodule.span_singleton_le_iff_mem _ _).2 (hV _ _ _ _ _ _)) (K.colourStep_mem q l w w') - have hiso : ∀ q l, (K.isospinStep q l).contraction ∈ V := fun q l => + have hiso : ∀ q l, (K.isospinStep q l).spanningVector ∈ V := fun q l => (iSup_le fun n => (Submodule.span_singleton_le_iff_mem _ _).2 (hcol _ _ _ _)) (K.isospinStep_mem q l) exact (iSup_le fun p => (Submodule.span_singleton_le_iff_mem _ _).2 (hiso _ _)) @@ -780,10 +781,10 @@ lemma kineticTerm_mem {V : Submodule ℂ B} lemma repGauge_su3_kineticTerm (U : specialUnitaryGroup (Fin 3) ℂ) : repGauge ((U, 1, 1) : GaugeGroupI) K.kineticTerm = K.kineticTerm := by have hiso : ∀ p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2, ∀ U', - repGauge ((U', 1, 1) : GaugeGroupI) (K.isospinStep p.1 p.2).contraction - = (K.isospinStep p.1 p.2).contraction := fun p U' => + repGauge ((U', 1, 1) : GaugeGroupI) (K.isospinStep p.1 p.2).spanningVector + = (K.isospinStep p.1 p.2).spanningVector := fun p U' => isFixedBy_iSup_span_singleton - (fun n U'' => (K.colourStep p.1 p.2 (n 0) (n 1)).contraction_fixed U'') U' _ + (fun n U'' => (K.colourStep p.1 p.2 (n 0) (n 1)).spanningVector_fixed U'') U' _ (K.isospinStep_mem p.1 p.2) exact isFixedBy_iSup_span_singleton (fun p U' => hiso p U') U _ K.lorentzStep_mem @@ -791,20 +792,20 @@ lemma repGauge_su3_kineticTerm (U : specialUnitaryGroup (Fin 3) ℂ) : lemma repGauge_su2_kineticTerm (V : specialUnitaryGroup (Fin 2) ℂ) : repGauge ((1, V, 1) : GaugeGroupI) K.kineticTerm = K.kineticTerm := isFixedBy_iSup_span_singleton - (fun p V' => (K.isospinStep p.1 p.2).contraction_fixed V') V _ K.lorentzStep_mem + (fun p V' => (K.isospinStep p.1 p.2).spanningVector_fixed V') V _ K.lorentzStep_mem /-- The kinetic term is fixed by the hypercharge factor, the hypercharges of a species and its conjugate cancelling on every component of the block. -/ lemma repGauge_u1_kineticTerm (t : unitary ℂ) : repGauge ((1, 1, t) : GaugeGroupI) K.kineticTerm = K.kineticTerm := by have hcol : ∀ q l w w', ∀ t' : unitary ℂ, - repGauge ((1, 1, t') : GaugeGroupI) (K.colourStep q l w w').contraction - = (K.colourStep q l w w').contraction := fun q l w w' t' => + repGauge ((1, 1, t') : GaugeGroupI) (K.colourStep q l w w').spanningVector + = (K.colourStep q l w w').spanningVector := fun q l w w' t' => isFixedBy_iSup_span_singleton (fun n t'' => K.hyper t'' q l (n 0) (n 1) w w') t' _ (K.colourStep_mem q l w w') have hiso : ∀ p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2, ∀ t' : unitary ℂ, - repGauge ((1, 1, t') : GaugeGroupI) (K.isospinStep p.1 p.2).contraction - = (K.isospinStep p.1 p.2).contraction := fun p t' => + repGauge ((1, 1, t') : GaugeGroupI) (K.isospinStep p.1 p.2).spanningVector + = (K.isospinStep p.1 p.2).spanningVector := fun p t' => isFixedBy_iSup_span_singleton (fun n t'' => hcol p.1 p.2 (n 0) (n 1) t'') t' _ (K.isospinStep_mem p.1 p.2) exact isFixedBy_iSup_span_singleton (fun p t' => hiso p t') t _ K.lorentzStep_mem @@ -818,7 +819,7 @@ lemma repGauge_kineticTerm (g : GaugeGroupI) : repGauge g K.kineticTerm = K.kine /-- The kinetic term is Lorentz invariant, being the conjugate Pauli contraction of a vector dual left-right Weyl family. -/ lemma repLorentz_kineticTerm (Λ : SL(2,ℂ)) : - repLorentz Λ K.kineticTerm = K.kineticTerm := K.lorentzStep.contraction_fixed Λ + repLorentz Λ K.kineticTerm = K.kineticTerm := K.lorentzStep.spanningVector_fixed Λ end KineticBlock diff --git a/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/KineticTerms.lean b/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/KineticTerms.lean index 939cf8531..6017d6412 100644 --- a/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/KineticTerms.lean +++ b/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/KineticTerms.lean @@ -117,22 +117,25 @@ lemma repGauge_u1_dbardBlk (t : unitary ℂ) (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3 /-- The colour stage of the `d ∂ bard` block. -/ noncomputable def dbardColourStep (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) (w w' : Fin 2) : - Step (fun U : specialUnitaryGroup (Fin 3) ℂ => repGauge ((U, 1, 1) : GaugeGroupI)) + InvariantReductionToSpan + (fun U : specialUnitaryGroup (Fin 3) ℂ => repGauge ((U, 1, 1) : GaugeGroupI)) (⨆ n : Fin 2 → Fin 3, ℂ ∙ h.dbardBlk f f' q l (n 0) (n 1) w w') := - Step.ofSU3FunAntiFun (h.isSU3FunAntiFun_dbardBlk f f' q l w w') + IsSU3FunAntiFun.invariantReductionToSpan (h.isSU3FunAntiFun_dbardBlk f f' q l w w') /-- The colour contraction of the `d ∂ bard` block, written out. -/ lemma dbardColourStep_contraction (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) (w w' : Fin 2) : - (h.dbardColourStep f f' q l w w').contraction + (h.dbardColourStep f f' q l w w').spanningVector = ∑ a : Fin 3, h.dbardBlk f f' q l a a w w' := rfl /-- The isospin stage of the `d ∂ bard` block. -/ noncomputable def dbardIsospinStep (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) : - Step (fun V : specialUnitaryGroup (Fin 2) ℂ => repGauge ((1, V, 1) : GaugeGroupI)) - (⨆ n : Fin 2 → Fin 2, ℂ ∙ (h.dbardColourStep f f' q l (n 0) (n 1)).contraction) := - Step.ofFixedFamily (h.dbardColourStep f f' q l 0 0).contraction (fun _ => rfl) + InvariantReductionToSpan + (fun V : specialUnitaryGroup (Fin 2) ℂ => repGauge ((1, V, 1) : GaugeGroupI)) + (⨆ n : Fin 2 → Fin 2, ℂ ∙ (h.dbardColourStep f f' q l (n 0) (n 1)).spanningVector) := + InvariantReductionToSpan.ofFixedFamily (h.dbardColourStep f f' q l 0 0).spanningVector + (fun _ => rfl) (fun V => isFixedBy_iSup_span_singleton (fun n V' => h.repGauge_su2_dbardBlk V' f f' q l (n 0) (n 1) 0 0) V _ (IsSU3FunAntiFun.deltaContraction_mem_span _)) @@ -142,9 +145,9 @@ noncomputable def dbardIsospinStep (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) lemma isVectorDualLeftRightWeyl_dbard (f f' : Fin 3) : IsVectorDualLeftRightWeyl B repLorentz (fun p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2 => - (h.dbardIsospinStep f f' p.1 p.2).contraction) := by + (h.dbardIsospinStep f f' p.1 p.2).spanningVector) := by have hsum : ∀ p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2, - (h.dbardIsospinStep f f' p.1 p.2).contraction + (h.dbardIsospinStep f f' p.1 p.2).spanningVector = ∑ a : Fin 3, h.dbardBlk f f' p.1 p.2 a a 0 0 := fun _ => rfl simp only [hsum] exact isVectorDualLeftRightWeyl_sum fun a : Fin 3 => isVectorDualLeftRightWeyl_mul_swap @@ -153,10 +156,10 @@ lemma isVectorDualLeftRightWeyl_dbard (f f' : Fin 3) : /-- The Lorentz stage of the `d ∂ bard` block. -/ noncomputable def dbardLorentzStep (f f' : Fin 3) : - Step (fun Λ : SL(2,ℂ) => repLorentz Λ) + InvariantReductionToSpan (fun Λ : SL(2,ℂ) => repLorentz Λ) (⨆ p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2, - ℂ ∙ (h.dbardIsospinStep f f' p.1 p.2).contraction) := - Step.ofVectorDualLeftRightWeyl (h.isVectorDualLeftRightWeyl_dbard f f') + ℂ ∙ (h.dbardIsospinStep f f' p.1 p.2).spanningVector) := + IsVectorDualLeftRightWeyl.invariantReductionToSpan (h.isVectorDualLeftRightWeyl_dbard f f') /-- The `d ∂ bard` block as a kinetic block. -/ noncomputable def dbardKineticBlock (f f' : Fin 3) : KineticBlock repGauge repLorentz where @@ -206,22 +209,25 @@ lemma repGauge_u1_barddBlk (t : unitary ℂ) (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3 /-- The colour stage of the `bard ∂ d` block. -/ noncomputable def barddColourStep (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) (w w' : Fin 2) : - Step (fun U : specialUnitaryGroup (Fin 3) ℂ => repGauge ((U, 1, 1) : GaugeGroupI)) + InvariantReductionToSpan + (fun U : specialUnitaryGroup (Fin 3) ℂ => repGauge ((U, 1, 1) : GaugeGroupI)) (⨆ n : Fin 2 → Fin 3, ℂ ∙ h.barddBlk f f' q l (n 0) (n 1) w w') := - Step.ofSU3FunAntiFun (h.isSU3FunAntiFun_barddBlk f f' q l w w') + IsSU3FunAntiFun.invariantReductionToSpan (h.isSU3FunAntiFun_barddBlk f f' q l w w') /-- The colour contraction of the `bard ∂ d` block, written out. -/ lemma barddColourStep_contraction (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) (w w' : Fin 2) : - (h.barddColourStep f f' q l w w').contraction + (h.barddColourStep f f' q l w w').spanningVector = ∑ a : Fin 3, h.barddBlk f f' q l a a w w' := rfl /-- The isospin stage of the `bard ∂ d` block. -/ noncomputable def barddIsospinStep (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) : - Step (fun V : specialUnitaryGroup (Fin 2) ℂ => repGauge ((1, V, 1) : GaugeGroupI)) - (⨆ n : Fin 2 → Fin 2, ℂ ∙ (h.barddColourStep f f' q l (n 0) (n 1)).contraction) := - Step.ofFixedFamily (h.barddColourStep f f' q l 0 0).contraction (fun _ => rfl) + InvariantReductionToSpan + (fun V : specialUnitaryGroup (Fin 2) ℂ => repGauge ((1, V, 1) : GaugeGroupI)) + (⨆ n : Fin 2 → Fin 2, ℂ ∙ (h.barddColourStep f f' q l (n 0) (n 1)).spanningVector) := + InvariantReductionToSpan.ofFixedFamily (h.barddColourStep f f' q l 0 0).spanningVector + (fun _ => rfl) (fun V => isFixedBy_iSup_span_singleton (fun n V' => h.repGauge_su2_barddBlk V' f f' q l (n 0) (n 1) 0 0) V _ (IsSU3FunAntiFun.deltaContraction_mem_span _)) @@ -231,9 +237,9 @@ noncomputable def barddIsospinStep (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) lemma isVectorDualLeftRightWeyl_bardd (f f' : Fin 3) : IsVectorDualLeftRightWeyl B repLorentz (fun p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2 => - (h.barddIsospinStep f f' p.1 p.2).contraction) := by + (h.barddIsospinStep f f' p.1 p.2).spanningVector) := by have hsum : ∀ p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2, - (h.barddIsospinStep f f' p.1 p.2).contraction + (h.barddIsospinStep f f' p.1 p.2).spanningVector = ∑ a : Fin 3, h.barddBlk f f' p.1 p.2 a a 0 0 := fun _ => rfl simp only [hsum] exact isVectorDualLeftRightWeyl_sum fun a : Fin 3 => isVectorDualLeftRightWeyl_mul @@ -242,10 +248,10 @@ lemma isVectorDualLeftRightWeyl_bardd (f f' : Fin 3) : /-- The Lorentz stage of the `bard ∂ d` block. -/ noncomputable def barddLorentzStep (f f' : Fin 3) : - Step (fun Λ : SL(2,ℂ) => repLorentz Λ) + InvariantReductionToSpan (fun Λ : SL(2,ℂ) => repLorentz Λ) (⨆ p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2, - ℂ ∙ (h.barddIsospinStep f f' p.1 p.2).contraction) := - Step.ofVectorDualLeftRightWeyl (h.isVectorDualLeftRightWeyl_bardd f f') + ℂ ∙ (h.barddIsospinStep f f' p.1 p.2).spanningVector) := + IsVectorDualLeftRightWeyl.invariantReductionToSpan (h.isVectorDualLeftRightWeyl_bardd f f') /-- The `bard ∂ d` block as a kinetic block. -/ noncomputable def barddKineticBlock (f f' : Fin 3) : KineticBlock repGauge repLorentz where @@ -295,22 +301,25 @@ lemma repGauge_u1_ubaruBlk (t : unitary ℂ) (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3 /-- The colour stage of the `u ∂ baru` block. -/ noncomputable def ubaruColourStep (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) (w w' : Fin 2) : - Step (fun U : specialUnitaryGroup (Fin 3) ℂ => repGauge ((U, 1, 1) : GaugeGroupI)) + InvariantReductionToSpan + (fun U : specialUnitaryGroup (Fin 3) ℂ => repGauge ((U, 1, 1) : GaugeGroupI)) (⨆ n : Fin 2 → Fin 3, ℂ ∙ h.ubaruBlk f f' q l (n 0) (n 1) w w') := - Step.ofSU3FunAntiFun (h.isSU3FunAntiFun_ubaruBlk f f' q l w w') + IsSU3FunAntiFun.invariantReductionToSpan (h.isSU3FunAntiFun_ubaruBlk f f' q l w w') /-- The colour contraction of the `u ∂ baru` block, written out. -/ lemma ubaruColourStep_contraction (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) (w w' : Fin 2) : - (h.ubaruColourStep f f' q l w w').contraction + (h.ubaruColourStep f f' q l w w').spanningVector = ∑ a : Fin 3, h.ubaruBlk f f' q l a a w w' := rfl /-- The isospin stage of the `u ∂ baru` block. -/ noncomputable def ubaruIsospinStep (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) : - Step (fun V : specialUnitaryGroup (Fin 2) ℂ => repGauge ((1, V, 1) : GaugeGroupI)) - (⨆ n : Fin 2 → Fin 2, ℂ ∙ (h.ubaruColourStep f f' q l (n 0) (n 1)).contraction) := - Step.ofFixedFamily (h.ubaruColourStep f f' q l 0 0).contraction (fun _ => rfl) + InvariantReductionToSpan + (fun V : specialUnitaryGroup (Fin 2) ℂ => repGauge ((1, V, 1) : GaugeGroupI)) + (⨆ n : Fin 2 → Fin 2, ℂ ∙ (h.ubaruColourStep f f' q l (n 0) (n 1)).spanningVector) := + InvariantReductionToSpan.ofFixedFamily (h.ubaruColourStep f f' q l 0 0).spanningVector + (fun _ => rfl) (fun V => isFixedBy_iSup_span_singleton (fun n V' => h.repGauge_su2_ubaruBlk V' f f' q l (n 0) (n 1) 0 0) V _ (IsSU3FunAntiFun.deltaContraction_mem_span _)) @@ -320,9 +329,9 @@ noncomputable def ubaruIsospinStep (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) lemma isVectorDualLeftRightWeyl_ubaru (f f' : Fin 3) : IsVectorDualLeftRightWeyl B repLorentz (fun p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2 => - (h.ubaruIsospinStep f f' p.1 p.2).contraction) := by + (h.ubaruIsospinStep f f' p.1 p.2).spanningVector) := by have hsum : ∀ p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2, - (h.ubaruIsospinStep f f' p.1 p.2).contraction + (h.ubaruIsospinStep f f' p.1 p.2).spanningVector = ∑ a : Fin 3, h.ubaruBlk f f' p.1 p.2 a a 0 0 := fun _ => rfl simp only [hsum] exact isVectorDualLeftRightWeyl_sum fun a : Fin 3 => isVectorDualLeftRightWeyl_mul_swap @@ -331,10 +340,10 @@ lemma isVectorDualLeftRightWeyl_ubaru (f f' : Fin 3) : /-- The Lorentz stage of the `u ∂ baru` block. -/ noncomputable def ubaruLorentzStep (f f' : Fin 3) : - Step (fun Λ : SL(2,ℂ) => repLorentz Λ) + InvariantReductionToSpan (fun Λ : SL(2,ℂ) => repLorentz Λ) (⨆ p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2, - ℂ ∙ (h.ubaruIsospinStep f f' p.1 p.2).contraction) := - Step.ofVectorDualLeftRightWeyl (h.isVectorDualLeftRightWeyl_ubaru f f') + ℂ ∙ (h.ubaruIsospinStep f f' p.1 p.2).spanningVector) := + IsVectorDualLeftRightWeyl.invariantReductionToSpan (h.isVectorDualLeftRightWeyl_ubaru f f') /-- The `u ∂ baru` block as a kinetic block. -/ noncomputable def ubaruKineticBlock (f f' : Fin 3) : KineticBlock repGauge repLorentz where @@ -384,22 +393,25 @@ lemma repGauge_u1_baruuBlk (t : unitary ℂ) (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3 /-- The colour stage of the `baru ∂ u` block. -/ noncomputable def baruuColourStep (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) (w w' : Fin 2) : - Step (fun U : specialUnitaryGroup (Fin 3) ℂ => repGauge ((U, 1, 1) : GaugeGroupI)) + InvariantReductionToSpan + (fun U : specialUnitaryGroup (Fin 3) ℂ => repGauge ((U, 1, 1) : GaugeGroupI)) (⨆ n : Fin 2 → Fin 3, ℂ ∙ h.baruuBlk f f' q l (n 0) (n 1) w w') := - Step.ofSU3FunAntiFun (h.isSU3FunAntiFun_baruuBlk f f' q l w w') + IsSU3FunAntiFun.invariantReductionToSpan (h.isSU3FunAntiFun_baruuBlk f f' q l w w') /-- The colour contraction of the `baru ∂ u` block, written out. -/ lemma baruuColourStep_contraction (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) (w w' : Fin 2) : - (h.baruuColourStep f f' q l w w').contraction + (h.baruuColourStep f f' q l w w').spanningVector = ∑ a : Fin 3, h.baruuBlk f f' q l a a w w' := rfl /-- The isospin stage of the `baru ∂ u` block. -/ noncomputable def baruuIsospinStep (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) : - Step (fun V : specialUnitaryGroup (Fin 2) ℂ => repGauge ((1, V, 1) : GaugeGroupI)) - (⨆ n : Fin 2 → Fin 2, ℂ ∙ (h.baruuColourStep f f' q l (n 0) (n 1)).contraction) := - Step.ofFixedFamily (h.baruuColourStep f f' q l 0 0).contraction (fun _ => rfl) + InvariantReductionToSpan + (fun V : specialUnitaryGroup (Fin 2) ℂ => repGauge ((1, V, 1) : GaugeGroupI)) + (⨆ n : Fin 2 → Fin 2, ℂ ∙ (h.baruuColourStep f f' q l (n 0) (n 1)).spanningVector) := + InvariantReductionToSpan.ofFixedFamily (h.baruuColourStep f f' q l 0 0).spanningVector + (fun _ => rfl) (fun V => isFixedBy_iSup_span_singleton (fun n V' => h.repGauge_su2_baruuBlk V' f f' q l (n 0) (n 1) 0 0) V _ (IsSU3FunAntiFun.deltaContraction_mem_span _)) @@ -409,9 +421,9 @@ noncomputable def baruuIsospinStep (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) lemma isVectorDualLeftRightWeyl_baruu (f f' : Fin 3) : IsVectorDualLeftRightWeyl B repLorentz (fun p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2 => - (h.baruuIsospinStep f f' p.1 p.2).contraction) := by + (h.baruuIsospinStep f f' p.1 p.2).spanningVector) := by have hsum : ∀ p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2, - (h.baruuIsospinStep f f' p.1 p.2).contraction + (h.baruuIsospinStep f f' p.1 p.2).spanningVector = ∑ a : Fin 3, h.baruuBlk f f' p.1 p.2 a a 0 0 := fun _ => rfl simp only [hsum] exact isVectorDualLeftRightWeyl_sum fun a : Fin 3 => isVectorDualLeftRightWeyl_mul @@ -420,10 +432,10 @@ lemma isVectorDualLeftRightWeyl_baruu (f f' : Fin 3) : /-- The Lorentz stage of the `baru ∂ u` block. -/ noncomputable def baruuLorentzStep (f f' : Fin 3) : - Step (fun Λ : SL(2,ℂ) => repLorentz Λ) + InvariantReductionToSpan (fun Λ : SL(2,ℂ) => repLorentz Λ) (⨆ p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2, - ℂ ∙ (h.baruuIsospinStep f f' p.1 p.2).contraction) := - Step.ofVectorDualLeftRightWeyl (h.isVectorDualLeftRightWeyl_baruu f f') + ℂ ∙ (h.baruuIsospinStep f f' p.1 p.2).spanningVector) := + IsVectorDualLeftRightWeyl.invariantReductionToSpan (h.isVectorDualLeftRightWeyl_baruu f f') /-- The `baru ∂ u` block as a kinetic block. -/ noncomputable def baruuKineticBlock (f f' : Fin 3) : KineticBlock repGauge repLorentz where @@ -482,22 +494,24 @@ lemma repGauge_u1_QbarQBlk (t : unitary ℂ) (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3 /-- The colour stage of the `Q ∂ barQ` block. -/ noncomputable def QbarQColourStep (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) (w w' : Fin 2) : - Step (fun U : specialUnitaryGroup (Fin 3) ℂ => repGauge ((U, 1, 1) : GaugeGroupI)) + InvariantReductionToSpan + (fun U : specialUnitaryGroup (Fin 3) ℂ => repGauge ((U, 1, 1) : GaugeGroupI)) (⨆ n : Fin 2 → Fin 3, ℂ ∙ h.QbarQBlk f f' q l (n 0) (n 1) w w') := - Step.ofSU3FunAntiFun (h.isSU3FunAntiFun_QbarQBlk f f' q l w w') + IsSU3FunAntiFun.invariantReductionToSpan (h.isSU3FunAntiFun_QbarQBlk f f' q l w w') /-- The colour contraction of the `Q ∂ barQ` block, written out. -/ lemma QbarQColourStep_contraction (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) (w w' : Fin 2) : - (h.QbarQColourStep f f' q l w w').contraction + (h.QbarQColourStep f f' q l w w').spanningVector = ∑ a : Fin 3, h.QbarQBlk f f' q l a a w w' := rfl /-- The isospin stage of the `Q ∂ barQ` block. -/ noncomputable def QbarQIsospinStep (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) : - Step (fun V : specialUnitaryGroup (Fin 2) ℂ => repGauge ((1, V, 1) : GaugeGroupI)) - (⨆ n : Fin 2 → Fin 2, ℂ ∙ (h.QbarQColourStep f f' q l (n 0) (n 1)).contraction) := - Step.ofSU2FunAntiFun (by + InvariantReductionToSpan + (fun V : specialUnitaryGroup (Fin 2) ℂ => repGauge ((1, V, 1) : GaugeGroupI)) + (⨆ n : Fin 2 → Fin 2, ℂ ∙ (h.QbarQColourStep f f' q l (n 0) (n 1)).spanningVector) := + IsSU2FunAntiFun.invariantReductionToSpan (by simp only [QbarQColourStep_contraction] exact IsSU2FunAntiFun.sum fun a : Fin 3 => h.isSU2FunAntiFun_QbarQBlk f f' q l a a) @@ -506,9 +520,9 @@ noncomputable def QbarQIsospinStep (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) lemma isVectorDualLeftRightWeyl_QbarQ (f f' : Fin 3) : IsVectorDualLeftRightWeyl B repLorentz (fun p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2 => - (h.QbarQIsospinStep f f' p.1 p.2).contraction) := by + (h.QbarQIsospinStep f f' p.1 p.2).spanningVector) := by have hsum : ∀ p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2, - (h.QbarQIsospinStep f f' p.1 p.2).contraction + (h.QbarQIsospinStep f f' p.1 p.2).spanningVector = ∑ i : Fin 2 × Fin 3, h.QbarQBlk f f' p.1 p.2 i.2 i.2 i.1 i.1 := by intro p show (∑ a : Fin 3, h.QbarQBlk f f' p.1 p.2 a a 0 0) @@ -521,10 +535,10 @@ lemma isVectorDualLeftRightWeyl_QbarQ (f f' : Fin 3) : /-- The Lorentz stage of the `Q ∂ barQ` block. -/ noncomputable def QbarQLorentzStep (f f' : Fin 3) : - Step (fun Λ : SL(2,ℂ) => repLorentz Λ) + InvariantReductionToSpan (fun Λ : SL(2,ℂ) => repLorentz Λ) (⨆ p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2, - ℂ ∙ (h.QbarQIsospinStep f f' p.1 p.2).contraction) := - Step.ofVectorDualLeftRightWeyl (h.isVectorDualLeftRightWeyl_QbarQ f f') + ℂ ∙ (h.QbarQIsospinStep f f' p.1 p.2).spanningVector) := + IsVectorDualLeftRightWeyl.invariantReductionToSpan (h.isVectorDualLeftRightWeyl_QbarQ f f') /-- The `Q ∂ barQ` block as a kinetic block. -/ noncomputable def QbarQKineticBlock (f f' : Fin 3) : KineticBlock repGauge repLorentz where @@ -574,22 +588,24 @@ lemma repGauge_u1_barQQBlk (t : unitary ℂ) (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3 /-- The colour stage of the `barQ ∂ Q` block. -/ noncomputable def barQQColourStep (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) (w w' : Fin 2) : - Step (fun U : specialUnitaryGroup (Fin 3) ℂ => repGauge ((U, 1, 1) : GaugeGroupI)) + InvariantReductionToSpan + (fun U : specialUnitaryGroup (Fin 3) ℂ => repGauge ((U, 1, 1) : GaugeGroupI)) (⨆ n : Fin 2 → Fin 3, ℂ ∙ h.barQQBlk f f' q l (n 0) (n 1) w w') := - Step.ofSU3FunAntiFun (h.isSU3FunAntiFun_barQQBlk f f' q l w w') + IsSU3FunAntiFun.invariantReductionToSpan (h.isSU3FunAntiFun_barQQBlk f f' q l w w') /-- The colour contraction of the `barQ ∂ Q` block, written out. -/ lemma barQQColourStep_contraction (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) (w w' : Fin 2) : - (h.barQQColourStep f f' q l w w').contraction + (h.barQQColourStep f f' q l w w').spanningVector = ∑ a : Fin 3, h.barQQBlk f f' q l a a w w' := rfl /-- The isospin stage of the `barQ ∂ Q` block. -/ noncomputable def barQQIsospinStep (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) : - Step (fun V : specialUnitaryGroup (Fin 2) ℂ => repGauge ((1, V, 1) : GaugeGroupI)) - (⨆ n : Fin 2 → Fin 2, ℂ ∙ (h.barQQColourStep f f' q l (n 0) (n 1)).contraction) := - Step.ofSU2FunAntiFun (by + InvariantReductionToSpan + (fun V : specialUnitaryGroup (Fin 2) ℂ => repGauge ((1, V, 1) : GaugeGroupI)) + (⨆ n : Fin 2 → Fin 2, ℂ ∙ (h.barQQColourStep f f' q l (n 0) (n 1)).spanningVector) := + IsSU2FunAntiFun.invariantReductionToSpan (by simp only [barQQColourStep_contraction] exact IsSU2FunAntiFun.sum fun a : Fin 3 => h.isSU2FunAntiFun_barQQBlk f f' q l a a) @@ -598,9 +614,9 @@ noncomputable def barQQIsospinStep (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) lemma isVectorDualLeftRightWeyl_barQQ (f f' : Fin 3) : IsVectorDualLeftRightWeyl B repLorentz (fun p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2 => - (h.barQQIsospinStep f f' p.1 p.2).contraction) := by + (h.barQQIsospinStep f f' p.1 p.2).spanningVector) := by have hsum : ∀ p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2, - (h.barQQIsospinStep f f' p.1 p.2).contraction + (h.barQQIsospinStep f f' p.1 p.2).spanningVector = ∑ i : Fin 2 × Fin 3, h.barQQBlk f f' p.1 p.2 i.2 i.2 i.1 i.1 := by intro p show (∑ a : Fin 3, h.barQQBlk f f' p.1 p.2 a a 0 0) @@ -613,10 +629,10 @@ lemma isVectorDualLeftRightWeyl_barQQ (f f' : Fin 3) : /-- The Lorentz stage of the `barQ ∂ Q` block. -/ noncomputable def barQQLorentzStep (f f' : Fin 3) : - Step (fun Λ : SL(2,ℂ) => repLorentz Λ) + InvariantReductionToSpan (fun Λ : SL(2,ℂ) => repLorentz Λ) (⨆ p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2, - ℂ ∙ (h.barQQIsospinStep f f' p.1 p.2).contraction) := - Step.ofVectorDualLeftRightWeyl (h.isVectorDualLeftRightWeyl_barQQ f f') + ℂ ∙ (h.barQQIsospinStep f f' p.1 p.2).spanningVector) := + IsVectorDualLeftRightWeyl.invariantReductionToSpan (h.isVectorDualLeftRightWeyl_barQQ f f') /-- The `barQ ∂ Q` block as a kinetic block. -/ noncomputable def barQQKineticBlock (f f' : Fin 3) : KineticBlock repGauge repLorentz where @@ -675,23 +691,25 @@ lemma repGauge_u1_LbarLBlk (t : unitary ℂ) (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3 /-- The colour stage of the `L ∂ barL` block. -/ noncomputable def LbarLColourStep (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) (w w' : Fin 2) : - Step (fun U : specialUnitaryGroup (Fin 3) ℂ => repGauge ((U, 1, 1) : GaugeGroupI)) + InvariantReductionToSpan + (fun U : specialUnitaryGroup (Fin 3) ℂ => repGauge ((U, 1, 1) : GaugeGroupI)) (⨆ n : Fin 2 → Fin 3, ℂ ∙ h.LbarLBlk f f' q l (n 0) (n 1) w w') := - Step.ofFixedFamily (h.LbarLBlk f f' q l 0 0 w w') (fun _ => rfl) + InvariantReductionToSpan.ofFixedFamily (h.LbarLBlk f f' q l 0 0 w w') (fun _ => rfl) (fun U => h.repGauge_su3_LbarLBlk U f f' q l 0 0 w w') /-- The colour contraction of the `L ∂ barL` block, written out. -/ lemma LbarLColourStep_contraction (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) (w w' : Fin 2) : - (h.LbarLColourStep f f' q l w w').contraction + (h.LbarLColourStep f f' q l w w').spanningVector = h.LbarLBlk f f' q l 0 0 w w' := rfl /-- The isospin stage of the `L ∂ barL` block. -/ noncomputable def LbarLIsospinStep (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) : - Step (fun V : specialUnitaryGroup (Fin 2) ℂ => repGauge ((1, V, 1) : GaugeGroupI)) - (⨆ n : Fin 2 → Fin 2, ℂ ∙ (h.LbarLColourStep f f' q l (n 0) (n 1)).contraction) := - Step.ofSU2FunAntiFun (by + InvariantReductionToSpan + (fun V : specialUnitaryGroup (Fin 2) ℂ => repGauge ((1, V, 1) : GaugeGroupI)) + (⨆ n : Fin 2 → Fin 2, ℂ ∙ (h.LbarLColourStep f f' q l (n 0) (n 1)).spanningVector) := + IsSU2FunAntiFun.invariantReductionToSpan (by simp only [LbarLColourStep_contraction] exact h.isSU2FunAntiFun_LbarLBlk f f' q l 0 0) @@ -700,9 +718,9 @@ noncomputable def LbarLIsospinStep (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) lemma isVectorDualLeftRightWeyl_LbarL (f f' : Fin 3) : IsVectorDualLeftRightWeyl B repLorentz (fun p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2 => - (h.LbarLIsospinStep f f' p.1 p.2).contraction) := by + (h.LbarLIsospinStep f f' p.1 p.2).spanningVector) := by have hsum : ∀ p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2, - (h.LbarLIsospinStep f f' p.1 p.2).contraction + (h.LbarLIsospinStep f f' p.1 p.2).spanningVector = ∑ i : Fin 2, h.LbarLBlk f f' p.1 p.2 0 0 i i := by intro p show h.LbarLBlk f f' p.1 p.2 0 0 0 0 + h.LbarLBlk f f' p.1 p.2 0 0 1 1 = _ @@ -714,10 +732,10 @@ lemma isVectorDualLeftRightWeyl_LbarL (f f' : Fin 3) : /-- The Lorentz stage of the `L ∂ barL` block. -/ noncomputable def LbarLLorentzStep (f f' : Fin 3) : - Step (fun Λ : SL(2,ℂ) => repLorentz Λ) + InvariantReductionToSpan (fun Λ : SL(2,ℂ) => repLorentz Λ) (⨆ p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2, - ℂ ∙ (h.LbarLIsospinStep f f' p.1 p.2).contraction) := - Step.ofVectorDualLeftRightWeyl (h.isVectorDualLeftRightWeyl_LbarL f f') + ℂ ∙ (h.LbarLIsospinStep f f' p.1 p.2).spanningVector) := + IsVectorDualLeftRightWeyl.invariantReductionToSpan (h.isVectorDualLeftRightWeyl_LbarL f f') /-- The `L ∂ barL` block as a kinetic block. -/ noncomputable def LbarLKineticBlock (f f' : Fin 3) : KineticBlock repGauge repLorentz where @@ -767,23 +785,25 @@ lemma repGauge_u1_barLLBlk (t : unitary ℂ) (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3 /-- The colour stage of the `barL ∂ L` block. -/ noncomputable def barLLColourStep (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) (w w' : Fin 2) : - Step (fun U : specialUnitaryGroup (Fin 3) ℂ => repGauge ((U, 1, 1) : GaugeGroupI)) + InvariantReductionToSpan + (fun U : specialUnitaryGroup (Fin 3) ℂ => repGauge ((U, 1, 1) : GaugeGroupI)) (⨆ n : Fin 2 → Fin 3, ℂ ∙ h.barLLBlk f f' q l (n 0) (n 1) w w') := - Step.ofFixedFamily (h.barLLBlk f f' q l 0 0 w w') (fun _ => rfl) + InvariantReductionToSpan.ofFixedFamily (h.barLLBlk f f' q l 0 0 w w') (fun _ => rfl) (fun U => h.repGauge_su3_barLLBlk U f f' q l 0 0 w w') /-- The colour contraction of the `barL ∂ L` block, written out. -/ lemma barLLColourStep_contraction (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) (w w' : Fin 2) : - (h.barLLColourStep f f' q l w w').contraction + (h.barLLColourStep f f' q l w w').spanningVector = h.barLLBlk f f' q l 0 0 w w' := rfl /-- The isospin stage of the `barL ∂ L` block. -/ noncomputable def barLLIsospinStep (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) : - Step (fun V : specialUnitaryGroup (Fin 2) ℂ => repGauge ((1, V, 1) : GaugeGroupI)) - (⨆ n : Fin 2 → Fin 2, ℂ ∙ (h.barLLColourStep f f' q l (n 0) (n 1)).contraction) := - Step.ofSU2FunAntiFun (by + InvariantReductionToSpan + (fun V : specialUnitaryGroup (Fin 2) ℂ => repGauge ((1, V, 1) : GaugeGroupI)) + (⨆ n : Fin 2 → Fin 2, ℂ ∙ (h.barLLColourStep f f' q l (n 0) (n 1)).spanningVector) := + IsSU2FunAntiFun.invariantReductionToSpan (by simp only [barLLColourStep_contraction] exact h.isSU2FunAntiFun_barLLBlk f f' q l 0 0) @@ -792,9 +812,9 @@ noncomputable def barLLIsospinStep (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) lemma isVectorDualLeftRightWeyl_barLL (f f' : Fin 3) : IsVectorDualLeftRightWeyl B repLorentz (fun p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2 => - (h.barLLIsospinStep f f' p.1 p.2).contraction) := by + (h.barLLIsospinStep f f' p.1 p.2).spanningVector) := by have hsum : ∀ p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2, - (h.barLLIsospinStep f f' p.1 p.2).contraction + (h.barLLIsospinStep f f' p.1 p.2).spanningVector = ∑ i : Fin 2, h.barLLBlk f f' p.1 p.2 0 0 i i := by intro p show h.barLLBlk f f' p.1 p.2 0 0 0 0 + h.barLLBlk f f' p.1 p.2 0 0 1 1 = _ @@ -806,10 +826,10 @@ lemma isVectorDualLeftRightWeyl_barLL (f f' : Fin 3) : /-- The Lorentz stage of the `barL ∂ L` block. -/ noncomputable def barLLLorentzStep (f f' : Fin 3) : - Step (fun Λ : SL(2,ℂ) => repLorentz Λ) + InvariantReductionToSpan (fun Λ : SL(2,ℂ) => repLorentz Λ) (⨆ p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2, - ℂ ∙ (h.barLLIsospinStep f f' p.1 p.2).contraction) := - Step.ofVectorDualLeftRightWeyl (h.isVectorDualLeftRightWeyl_barLL f f') + ℂ ∙ (h.barLLIsospinStep f f' p.1 p.2).spanningVector) := + IsVectorDualLeftRightWeyl.invariantReductionToSpan (h.isVectorDualLeftRightWeyl_barLL f f') /-- The `barL ∂ L` block as a kinetic block. -/ noncomputable def barLLKineticBlock (f f' : Fin 3) : KineticBlock repGauge repLorentz where @@ -868,23 +888,26 @@ lemma repGauge_u1_ebareBlk (t : unitary ℂ) (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3 /-- The colour stage of the `e ∂ bare` block. -/ noncomputable def ebareColourStep (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) (w w' : Fin 2) : - Step (fun U : specialUnitaryGroup (Fin 3) ℂ => repGauge ((U, 1, 1) : GaugeGroupI)) + InvariantReductionToSpan + (fun U : specialUnitaryGroup (Fin 3) ℂ => repGauge ((U, 1, 1) : GaugeGroupI)) (⨆ n : Fin 2 → Fin 3, ℂ ∙ h.ebareBlk f f' q l (n 0) (n 1) w w') := - Step.ofFixedFamily (h.ebareBlk f f' q l 0 0 w w') (fun _ => rfl) + InvariantReductionToSpan.ofFixedFamily (h.ebareBlk f f' q l 0 0 w w') (fun _ => rfl) (fun U => h.repGauge_su3_ebareBlk U f f' q l 0 0 w w') /-- The colour contraction of the `e ∂ bare` block, written out. -/ lemma ebareColourStep_contraction (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) (w w' : Fin 2) : - (h.ebareColourStep f f' q l w w').contraction + (h.ebareColourStep f f' q l w w').spanningVector = h.ebareBlk f f' q l 0 0 w w' := rfl /-- The isospin stage of the `e ∂ bare` block. -/ noncomputable def ebareIsospinStep (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) : - Step (fun V : specialUnitaryGroup (Fin 2) ℂ => repGauge ((1, V, 1) : GaugeGroupI)) - (⨆ n : Fin 2 → Fin 2, ℂ ∙ (h.ebareColourStep f f' q l (n 0) (n 1)).contraction) := - Step.ofFixedFamily (h.ebareColourStep f f' q l 0 0).contraction (fun _ => rfl) + InvariantReductionToSpan + (fun V : specialUnitaryGroup (Fin 2) ℂ => repGauge ((1, V, 1) : GaugeGroupI)) + (⨆ n : Fin 2 → Fin 2, ℂ ∙ (h.ebareColourStep f f' q l (n 0) (n 1)).spanningVector) := + InvariantReductionToSpan.ofFixedFamily (h.ebareColourStep f f' q l 0 0).spanningVector + (fun _ => rfl) (fun V => isFixedBy_iSup_span_singleton (fun n V' => h.repGauge_su2_ebareBlk V' f f' q l (n 0) (n 1) 0 0) V _ (Submodule.mem_iSup_of_mem ![0, 0] (Submodule.mem_span_singleton_self _))) @@ -894,9 +917,9 @@ noncomputable def ebareIsospinStep (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) lemma isVectorDualLeftRightWeyl_ebare (f f' : Fin 3) : IsVectorDualLeftRightWeyl B repLorentz (fun p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2 => - (h.ebareIsospinStep f f' p.1 p.2).contraction) := by + (h.ebareIsospinStep f f' p.1 p.2).spanningVector) := by have hsum : ∀ p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2, - (h.ebareIsospinStep f f' p.1 p.2).contraction + (h.ebareIsospinStep f f' p.1 p.2).spanningVector = h.ebareBlk f f' p.1 p.2 0 0 0 0 := fun _ => rfl simp only [hsum] exact isVectorDualLeftRightWeyl_mul_swap @@ -905,10 +928,10 @@ lemma isVectorDualLeftRightWeyl_ebare (f f' : Fin 3) : /-- The Lorentz stage of the `e ∂ bare` block. -/ noncomputable def ebareLorentzStep (f f' : Fin 3) : - Step (fun Λ : SL(2,ℂ) => repLorentz Λ) + InvariantReductionToSpan (fun Λ : SL(2,ℂ) => repLorentz Λ) (⨆ p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2, - ℂ ∙ (h.ebareIsospinStep f f' p.1 p.2).contraction) := - Step.ofVectorDualLeftRightWeyl (h.isVectorDualLeftRightWeyl_ebare f f') + ℂ ∙ (h.ebareIsospinStep f f' p.1 p.2).spanningVector) := + IsVectorDualLeftRightWeyl.invariantReductionToSpan (h.isVectorDualLeftRightWeyl_ebare f f') /-- The `e ∂ bare` block as a kinetic block. -/ noncomputable def ebareKineticBlock (f f' : Fin 3) : KineticBlock repGauge repLorentz where @@ -958,23 +981,26 @@ lemma repGauge_u1_bareeBlk (t : unitary ℂ) (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3 /-- The colour stage of the `bare ∂ e` block. -/ noncomputable def bareeColourStep (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) (w w' : Fin 2) : - Step (fun U : specialUnitaryGroup (Fin 3) ℂ => repGauge ((U, 1, 1) : GaugeGroupI)) + InvariantReductionToSpan + (fun U : specialUnitaryGroup (Fin 3) ℂ => repGauge ((U, 1, 1) : GaugeGroupI)) (⨆ n : Fin 2 → Fin 3, ℂ ∙ h.bareeBlk f f' q l (n 0) (n 1) w w') := - Step.ofFixedFamily (h.bareeBlk f f' q l 0 0 w w') (fun _ => rfl) + InvariantReductionToSpan.ofFixedFamily (h.bareeBlk f f' q l 0 0 w w') (fun _ => rfl) (fun U => h.repGauge_su3_bareeBlk U f f' q l 0 0 w w') /-- The colour contraction of the `bare ∂ e` block, written out. -/ lemma bareeColourStep_contraction (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) (w w' : Fin 2) : - (h.bareeColourStep f f' q l w w').contraction + (h.bareeColourStep f f' q l w w').spanningVector = h.bareeBlk f f' q l 0 0 w w' := rfl /-- The isospin stage of the `bare ∂ e` block. -/ noncomputable def bareeIsospinStep (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) (l : Fin 2 × Fin 2) : - Step (fun V : specialUnitaryGroup (Fin 2) ℂ => repGauge ((1, V, 1) : GaugeGroupI)) - (⨆ n : Fin 2 → Fin 2, ℂ ∙ (h.bareeColourStep f f' q l (n 0) (n 1)).contraction) := - Step.ofFixedFamily (h.bareeColourStep f f' q l 0 0).contraction (fun _ => rfl) + InvariantReductionToSpan + (fun V : specialUnitaryGroup (Fin 2) ℂ => repGauge ((1, V, 1) : GaugeGroupI)) + (⨆ n : Fin 2 → Fin 2, ℂ ∙ (h.bareeColourStep f f' q l (n 0) (n 1)).spanningVector) := + InvariantReductionToSpan.ofFixedFamily (h.bareeColourStep f f' q l 0 0).spanningVector + (fun _ => rfl) (fun V => isFixedBy_iSup_span_singleton (fun n V' => h.repGauge_su2_bareeBlk V' f f' q l (n 0) (n 1) 0 0) V _ (Submodule.mem_iSup_of_mem ![0, 0] (Submodule.mem_span_singleton_self _))) @@ -984,9 +1010,9 @@ noncomputable def bareeIsospinStep (f f' : Fin 3) (q : Fin 1 ⊕ Fin 3) lemma isVectorDualLeftRightWeyl_baree (f f' : Fin 3) : IsVectorDualLeftRightWeyl B repLorentz (fun p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2 => - (h.bareeIsospinStep f f' p.1 p.2).contraction) := by + (h.bareeIsospinStep f f' p.1 p.2).spanningVector) := by have hsum : ∀ p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2, - (h.bareeIsospinStep f f' p.1 p.2).contraction + (h.bareeIsospinStep f f' p.1 p.2).spanningVector = h.bareeBlk f f' p.1 p.2 0 0 0 0 := fun _ => rfl simp only [hsum] exact isVectorDualLeftRightWeyl_mul @@ -995,10 +1021,10 @@ lemma isVectorDualLeftRightWeyl_baree (f f' : Fin 3) : /-- The Lorentz stage of the `bare ∂ e` block. -/ noncomputable def bareeLorentzStep (f f' : Fin 3) : - Step (fun Λ : SL(2,ℂ) => repLorentz Λ) + InvariantReductionToSpan (fun Λ : SL(2,ℂ) => repLorentz Λ) (⨆ p : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2, - ℂ ∙ (h.bareeIsospinStep f f' p.1 p.2).contraction) := - Step.ofVectorDualLeftRightWeyl (h.isVectorDualLeftRightWeyl_baree f f') + ℂ ∙ (h.bareeIsospinStep f f' p.1 p.2).spanningVector) := + IsVectorDualLeftRightWeyl.invariantReductionToSpan (h.isVectorDualLeftRightWeyl_baree f f') /-- The `bare ∂ e` block as a kinetic block. -/ noncomputable def bareeKineticBlock (f f' : Fin 3) : KineticBlock repGauge repLorentz where diff --git a/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/MassDimEight.lean b/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/MassDimEight.lean index 607f4fe8e..d7b13264d 100644 --- a/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/MassDimEight.lean +++ b/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/MassDimEight.lean @@ -22,15 +22,16 @@ The classification runs the four stages every sector runs. Hypercharge first, th gauge weight decomposition: `massWeightSubmoduleGaugeWeightEight_piece_zero` cuts the hundred pairings of two fermion symbols down to the ten conjugate ones, every other pairing having hypercharges that cannot cancel. Then colour, then isospin, then Lorentz, -one classification each, chained by the `Peels` relation of `StandardModel.Peeling` and -supplied by the `KineticBlock` packages of `KineticTerms`. What is left is the kinetic -span: one term for each of the ten pairings and each of the nine pairs of generations. +one classification each, chained by the `ReducesInvariantsTo` relation of +`Physlib.Mathematics.InvariantReduction` and supplied by the `KineticBlock` packages of +`KineticTerms`. What is left is the kinetic span: one term for each of the ten pairings and each of +the nine pairs of generations. - A. Symbol ranges and their stability - B. The block submodules - C. The symbol ranges inside the derivative submodules, and the mass weight - D. The kinetic span -- E. The blocks peel to the kinetic terms +- E. The blocks reduce to the kinetic terms - F. The classification as an equivalence -/ @@ -73,7 +74,7 @@ variable {B : Type} [Ring B] [Algebra ℂ B] ## A. Symbol ranges and their stability -The peeling asks two things of the submodule a block is read from: that the two groups +The reduction asks two things of the submodule a block is read from: that the two groups carry it into itself, and that it lies in the span of the block's components. Both come from the symbol maps. A gauge transformation moves only the covector a symbol is evaluated at, so a symbol range is gauge stable at any number of derivative slots. The Lorentz group @@ -153,7 +154,7 @@ Each of the ten conjugate pairings gives one submodule per pair of generations: underived range of one species against the once-derived ranges of its conjugate, joined over the derivative direction so that the Lorentz group has somewhere to move it. Each is carried into itself by both groups and lies in the span of the components of the matching -kinetic block, which is all the peeling asks. +kinetic block, which is all the reduction asks. -/ @@ -183,23 +184,25 @@ include h in lemma dbardPairSubmodule_le_blockSpan (f f' : Fin 3) : h.dbardPairSubmodule f f' ≤ (h.dbardKineticBlock f f').blockSpan := by rw [dbardPairSubmodule, KineticBlock.blockSpan] - refine mul_le_of_le - (A := fun k => d f (![] : Fin 0 → Fin 1 ⊕ Fin 3) (DownSinglet.basis.dualBasis k)) - (C := fun k : (Fin 1 ⊕ Fin 3) × (Fin 2 × Fin 3) => + refine Submodule.mul_le_of_le_iSup_span + (a := fun k => d f (![] : Fin 0 → Fin 1 ⊕ Fin 3) (DownSinglet.basis.dualBasis k)) + (b := fun k : (Fin 1 ⊕ Fin 3) × (Fin 2 × Fin 3) => bard f' ![k.1] (DownSinglet.basis.conj.dualBasis k.2)) - (le_of_eq (range_eq_iSup_span_dualBasis DownSinglet.basis _)) (iSup_le fun μ => ?_) ?_ - · rw [range_eq_iSup_span_dualBasis DownSinglet.basis.conj (bard f' ![μ])] + (le_of_eq (LinearMap.range_eq_iSup_span_basis DownSinglet.basis.dualBasis _)) + (iSup_le fun μ => ?_) ?_ + · rw [LinearMap.range_eq_iSup_span_basis DownSinglet.basis.conj.dualBasis (bard f' ![μ])] exact iSup_le fun k => le_iSup_of_le (μ, k) le_rfl · intro i j exact Submodule.mem_iSup_of_mem (j.1, (j.2.1, i.1), (0, 0)) (Submodule.mem_iSup_of_mem ![j.2.2, i.2] (Submodule.mem_span_singleton_self _)) include h in -/-- The `d ∂ bard` block peels to its kinetic term. -/ -lemma peels_dbard (f f' : Fin 3) : - Peels (gaugeLorentzMaps repGauge repLorentz) (h.dbardPairSubmodule f f') +/-- The `d ∂ bard` block reduces to its kinetic term. -/ +lemma reducesInvariantsTo_dbard (f f' : Fin 3) : + ReducesInvariantsTo (gaugeLorentzMaps repGauge repLorentz) (h.dbardPairSubmodule f f') (ℂ ∙ (h.dbardKineticBlock f f').kineticTerm) := - ((h.dbardKineticBlock f f').peels).mono_left (h.dbardPairSubmodule_le_blockSpan f f') + (h.dbardKineticBlock f f').reducesInvariantsTo.mono_left + (h.dbardPairSubmodule_le_blockSpan f f') set_option linter.unusedVariables false in /-- The submodule of the `bard ∂ d` block of a generation pair: an underived @@ -227,23 +230,25 @@ include h in lemma barddPairSubmodule_le_blockSpan (f f' : Fin 3) : h.barddPairSubmodule f f' ≤ (h.barddKineticBlock f f').blockSpan := by rw [barddPairSubmodule, KineticBlock.blockSpan] - refine mul_le_of_le - (A := fun k => bard f (![] : Fin 0 → Fin 1 ⊕ Fin 3) (DownSinglet.basis.conj.dualBasis k)) - (C := fun k : (Fin 1 ⊕ Fin 3) × (Fin 2 × Fin 3) => + refine Submodule.mul_le_of_le_iSup_span + (a := fun k => bard f (![] : Fin 0 → Fin 1 ⊕ Fin 3) (DownSinglet.basis.conj.dualBasis k)) + (b := fun k : (Fin 1 ⊕ Fin 3) × (Fin 2 × Fin 3) => d f' ![k.1] (DownSinglet.basis.dualBasis k.2)) - (le_of_eq (range_eq_iSup_span_dualBasis DownSinglet.basis.conj _)) (iSup_le fun μ => ?_) ?_ - · rw [range_eq_iSup_span_dualBasis DownSinglet.basis (d f' ![μ])] + (le_of_eq (LinearMap.range_eq_iSup_span_basis DownSinglet.basis.conj.dualBasis _)) + (iSup_le fun μ => ?_) ?_ + · rw [LinearMap.range_eq_iSup_span_basis DownSinglet.basis.dualBasis (d f' ![μ])] exact iSup_le fun k => le_iSup_of_le (μ, k) le_rfl · intro i j exact Submodule.mem_iSup_of_mem (j.1, (i.1, j.2.1), (0, 0)) (Submodule.mem_iSup_of_mem ![i.2, j.2.2] (Submodule.mem_span_singleton_self _)) include h in -/-- The `bard ∂ d` block peels to its kinetic term. -/ -lemma peels_bardd (f f' : Fin 3) : - Peels (gaugeLorentzMaps repGauge repLorentz) (h.barddPairSubmodule f f') +/-- The `bard ∂ d` block reduces to its kinetic term. -/ +lemma reducesInvariantsTo_bardd (f f' : Fin 3) : + ReducesInvariantsTo (gaugeLorentzMaps repGauge repLorentz) (h.barddPairSubmodule f f') (ℂ ∙ (h.barddKineticBlock f f').kineticTerm) := - ((h.barddKineticBlock f f').peels).mono_left (h.barddPairSubmodule_le_blockSpan f f') + (h.barddKineticBlock f f').reducesInvariantsTo.mono_left + (h.barddPairSubmodule_le_blockSpan f f') set_option linter.unusedVariables false in /-- The submodule of the `u ∂ baru` block of a generation pair: an underived @@ -271,23 +276,25 @@ include h in lemma ubaruPairSubmodule_le_blockSpan (f f' : Fin 3) : h.ubaruPairSubmodule f f' ≤ (h.ubaruKineticBlock f f').blockSpan := by rw [ubaruPairSubmodule, KineticBlock.blockSpan] - refine mul_le_of_le - (A := fun k => u f (![] : Fin 0 → Fin 1 ⊕ Fin 3) (UpSinglet.basis.dualBasis k)) - (C := fun k : (Fin 1 ⊕ Fin 3) × (Fin 2 × Fin 3) => + refine Submodule.mul_le_of_le_iSup_span + (a := fun k => u f (![] : Fin 0 → Fin 1 ⊕ Fin 3) (UpSinglet.basis.dualBasis k)) + (b := fun k : (Fin 1 ⊕ Fin 3) × (Fin 2 × Fin 3) => baru f' ![k.1] (UpSinglet.basis.conj.dualBasis k.2)) - (le_of_eq (range_eq_iSup_span_dualBasis UpSinglet.basis _)) (iSup_le fun μ => ?_) ?_ - · rw [range_eq_iSup_span_dualBasis UpSinglet.basis.conj (baru f' ![μ])] + (le_of_eq (LinearMap.range_eq_iSup_span_basis UpSinglet.basis.dualBasis _)) + (iSup_le fun μ => ?_) ?_ + · rw [LinearMap.range_eq_iSup_span_basis UpSinglet.basis.conj.dualBasis (baru f' ![μ])] exact iSup_le fun k => le_iSup_of_le (μ, k) le_rfl · intro i j exact Submodule.mem_iSup_of_mem (j.1, (j.2.1, i.1), (0, 0)) (Submodule.mem_iSup_of_mem ![j.2.2, i.2] (Submodule.mem_span_singleton_self _)) include h in -/-- The `u ∂ baru` block peels to its kinetic term. -/ -lemma peels_ubaru (f f' : Fin 3) : - Peels (gaugeLorentzMaps repGauge repLorentz) (h.ubaruPairSubmodule f f') +/-- The `u ∂ baru` block reduces to its kinetic term. -/ +lemma reducesInvariantsTo_ubaru (f f' : Fin 3) : + ReducesInvariantsTo (gaugeLorentzMaps repGauge repLorentz) (h.ubaruPairSubmodule f f') (ℂ ∙ (h.ubaruKineticBlock f f').kineticTerm) := - ((h.ubaruKineticBlock f f').peels).mono_left (h.ubaruPairSubmodule_le_blockSpan f f') + (h.ubaruKineticBlock f f').reducesInvariantsTo.mono_left + (h.ubaruPairSubmodule_le_blockSpan f f') set_option linter.unusedVariables false in /-- The submodule of the `baru ∂ u` block of a generation pair: an underived @@ -315,23 +322,25 @@ include h in lemma baruuPairSubmodule_le_blockSpan (f f' : Fin 3) : h.baruuPairSubmodule f f' ≤ (h.baruuKineticBlock f f').blockSpan := by rw [baruuPairSubmodule, KineticBlock.blockSpan] - refine mul_le_of_le - (A := fun k => baru f (![] : Fin 0 → Fin 1 ⊕ Fin 3) (UpSinglet.basis.conj.dualBasis k)) - (C := fun k : (Fin 1 ⊕ Fin 3) × (Fin 2 × Fin 3) => + refine Submodule.mul_le_of_le_iSup_span + (a := fun k => baru f (![] : Fin 0 → Fin 1 ⊕ Fin 3) (UpSinglet.basis.conj.dualBasis k)) + (b := fun k : (Fin 1 ⊕ Fin 3) × (Fin 2 × Fin 3) => u f' ![k.1] (UpSinglet.basis.dualBasis k.2)) - (le_of_eq (range_eq_iSup_span_dualBasis UpSinglet.basis.conj _)) (iSup_le fun μ => ?_) ?_ - · rw [range_eq_iSup_span_dualBasis UpSinglet.basis (u f' ![μ])] + (le_of_eq (LinearMap.range_eq_iSup_span_basis UpSinglet.basis.conj.dualBasis _)) + (iSup_le fun μ => ?_) ?_ + · rw [LinearMap.range_eq_iSup_span_basis UpSinglet.basis.dualBasis (u f' ![μ])] exact iSup_le fun k => le_iSup_of_le (μ, k) le_rfl · intro i j exact Submodule.mem_iSup_of_mem (j.1, (i.1, j.2.1), (0, 0)) (Submodule.mem_iSup_of_mem ![i.2, j.2.2] (Submodule.mem_span_singleton_self _)) include h in -/-- The `baru ∂ u` block peels to its kinetic term. -/ -lemma peels_baruu (f f' : Fin 3) : - Peels (gaugeLorentzMaps repGauge repLorentz) (h.baruuPairSubmodule f f') +/-- The `baru ∂ u` block reduces to its kinetic term. -/ +lemma reducesInvariantsTo_baruu (f f' : Fin 3) : + ReducesInvariantsTo (gaugeLorentzMaps repGauge repLorentz) (h.baruuPairSubmodule f f') (ℂ ∙ (h.baruuKineticBlock f f').kineticTerm) := - ((h.baruuKineticBlock f f').peels).mono_left (h.baruuPairSubmodule_le_blockSpan f f') + (h.baruuKineticBlock f f').reducesInvariantsTo.mono_left + (h.baruuPairSubmodule_le_blockSpan f f') set_option linter.unusedVariables false in /-- The submodule of the `Q ∂ barQ` block of a generation pair: an underived @@ -359,23 +368,25 @@ include h in lemma QbarQPairSubmodule_le_blockSpan (f f' : Fin 3) : h.QbarQPairSubmodule f f' ≤ (h.QbarQKineticBlock f f').blockSpan := by rw [QbarQPairSubmodule, KineticBlock.blockSpan] - refine mul_le_of_le - (A := fun k => Q f (![] : Fin 0 → Fin 1 ⊕ Fin 3) (QuarkDoublet.basis.dualBasis k)) - (C := fun k : (Fin 1 ⊕ Fin 3) × (Fin 2 × Fin 3 × Fin 2) => + refine Submodule.mul_le_of_le_iSup_span + (a := fun k => Q f (![] : Fin 0 → Fin 1 ⊕ Fin 3) (QuarkDoublet.basis.dualBasis k)) + (b := fun k : (Fin 1 ⊕ Fin 3) × (Fin 2 × Fin 3 × Fin 2) => barQ f' ![k.1] (QuarkDoublet.basis.conj.dualBasis k.2)) - (le_of_eq (range_eq_iSup_span_dualBasis QuarkDoublet.basis _)) (iSup_le fun μ => ?_) ?_ - · rw [range_eq_iSup_span_dualBasis QuarkDoublet.basis.conj (barQ f' ![μ])] + (le_of_eq (LinearMap.range_eq_iSup_span_basis QuarkDoublet.basis.dualBasis _)) + (iSup_le fun μ => ?_) ?_ + · rw [LinearMap.range_eq_iSup_span_basis QuarkDoublet.basis.conj.dualBasis (barQ f' ![μ])] exact iSup_le fun k => le_iSup_of_le (μ, k) le_rfl · intro i j exact Submodule.mem_iSup_of_mem (j.1, (i.1, j.2.1), (j.2.2.2, i.2.2)) (Submodule.mem_iSup_of_mem ![j.2.2.1, i.2.1] (Submodule.mem_span_singleton_self _)) include h in -/-- The `Q ∂ barQ` block peels to its kinetic term. -/ -lemma peels_QbarQ (f f' : Fin 3) : - Peels (gaugeLorentzMaps repGauge repLorentz) (h.QbarQPairSubmodule f f') +/-- The `Q ∂ barQ` block reduces to its kinetic term. -/ +lemma reducesInvariantsTo_QbarQ (f f' : Fin 3) : + ReducesInvariantsTo (gaugeLorentzMaps repGauge repLorentz) (h.QbarQPairSubmodule f f') (ℂ ∙ (h.QbarQKineticBlock f f').kineticTerm) := - ((h.QbarQKineticBlock f f').peels).mono_left (h.QbarQPairSubmodule_le_blockSpan f f') + (h.QbarQKineticBlock f f').reducesInvariantsTo.mono_left + (h.QbarQPairSubmodule_le_blockSpan f f') set_option linter.unusedVariables false in /-- The submodule of the `barQ ∂ Q` block of a generation pair: an underived @@ -403,23 +414,25 @@ include h in lemma barQQPairSubmodule_le_blockSpan (f f' : Fin 3) : h.barQQPairSubmodule f f' ≤ (h.barQQKineticBlock f f').blockSpan := by rw [barQQPairSubmodule, KineticBlock.blockSpan] - refine mul_le_of_le - (A := fun k => barQ f (![] : Fin 0 → Fin 1 ⊕ Fin 3) (QuarkDoublet.basis.conj.dualBasis k)) - (C := fun k : (Fin 1 ⊕ Fin 3) × (Fin 2 × Fin 3 × Fin 2) => + refine Submodule.mul_le_of_le_iSup_span + (a := fun k => barQ f (![] : Fin 0 → Fin 1 ⊕ Fin 3) (QuarkDoublet.basis.conj.dualBasis k)) + (b := fun k : (Fin 1 ⊕ Fin 3) × (Fin 2 × Fin 3 × Fin 2) => Q f' ![k.1] (QuarkDoublet.basis.dualBasis k.2)) - (le_of_eq (range_eq_iSup_span_dualBasis QuarkDoublet.basis.conj _)) (iSup_le fun μ => ?_) ?_ - · rw [range_eq_iSup_span_dualBasis QuarkDoublet.basis (Q f' ![μ])] + (le_of_eq (LinearMap.range_eq_iSup_span_basis QuarkDoublet.basis.conj.dualBasis _)) + (iSup_le fun μ => ?_) ?_ + · rw [LinearMap.range_eq_iSup_span_basis QuarkDoublet.basis.dualBasis (Q f' ![μ])] exact iSup_le fun k => le_iSup_of_le (μ, k) le_rfl · intro i j exact Submodule.mem_iSup_of_mem (j.1, (j.2.1, i.1), (i.2.2, j.2.2.2)) (Submodule.mem_iSup_of_mem ![i.2.1, j.2.2.1] (Submodule.mem_span_singleton_self _)) include h in -/-- The `barQ ∂ Q` block peels to its kinetic term. -/ -lemma peels_barQQ (f f' : Fin 3) : - Peels (gaugeLorentzMaps repGauge repLorentz) (h.barQQPairSubmodule f f') +/-- The `barQ ∂ Q` block reduces to its kinetic term. -/ +lemma reducesInvariantsTo_barQQ (f f' : Fin 3) : + ReducesInvariantsTo (gaugeLorentzMaps repGauge repLorentz) (h.barQQPairSubmodule f f') (ℂ ∙ (h.barQQKineticBlock f f').kineticTerm) := - ((h.barQQKineticBlock f f').peels).mono_left (h.barQQPairSubmodule_le_blockSpan f f') + (h.barQQKineticBlock f f').reducesInvariantsTo.mono_left + (h.barQQPairSubmodule_le_blockSpan f f') set_option linter.unusedVariables false in /-- The submodule of the `L ∂ barL` block of a generation pair: an underived @@ -447,23 +460,25 @@ include h in lemma LbarLPairSubmodule_le_blockSpan (f f' : Fin 3) : h.LbarLPairSubmodule f f' ≤ (h.LbarLKineticBlock f f').blockSpan := by rw [LbarLPairSubmodule, KineticBlock.blockSpan] - refine mul_le_of_le - (A := fun k => L f (![] : Fin 0 → Fin 1 ⊕ Fin 3) (LeptonDoublet.basis.dualBasis k)) - (C := fun k : (Fin 1 ⊕ Fin 3) × (Fin 2 × Fin 2) => + refine Submodule.mul_le_of_le_iSup_span + (a := fun k => L f (![] : Fin 0 → Fin 1 ⊕ Fin 3) (LeptonDoublet.basis.dualBasis k)) + (b := fun k : (Fin 1 ⊕ Fin 3) × (Fin 2 × Fin 2) => barL f' ![k.1] (LeptonDoublet.basis.conj.dualBasis k.2)) - (le_of_eq (range_eq_iSup_span_dualBasis LeptonDoublet.basis _)) (iSup_le fun μ => ?_) ?_ - · rw [range_eq_iSup_span_dualBasis LeptonDoublet.basis.conj (barL f' ![μ])] + (le_of_eq (LinearMap.range_eq_iSup_span_basis LeptonDoublet.basis.dualBasis _)) + (iSup_le fun μ => ?_) ?_ + · rw [LinearMap.range_eq_iSup_span_basis LeptonDoublet.basis.conj.dualBasis (barL f' ![μ])] exact iSup_le fun k => le_iSup_of_le (μ, k) le_rfl · intro i j exact Submodule.mem_iSup_of_mem (j.1, (i.1, j.2.1), (j.2.2, i.2)) (Submodule.mem_iSup_of_mem ![0, 0] (Submodule.mem_span_singleton_self _)) include h in -/-- The `L ∂ barL` block peels to its kinetic term. -/ -lemma peels_LbarL (f f' : Fin 3) : - Peels (gaugeLorentzMaps repGauge repLorentz) (h.LbarLPairSubmodule f f') +/-- The `L ∂ barL` block reduces to its kinetic term. -/ +lemma reducesInvariantsTo_LbarL (f f' : Fin 3) : + ReducesInvariantsTo (gaugeLorentzMaps repGauge repLorentz) (h.LbarLPairSubmodule f f') (ℂ ∙ (h.LbarLKineticBlock f f').kineticTerm) := - ((h.LbarLKineticBlock f f').peels).mono_left (h.LbarLPairSubmodule_le_blockSpan f f') + (h.LbarLKineticBlock f f').reducesInvariantsTo.mono_left + (h.LbarLPairSubmodule_le_blockSpan f f') set_option linter.unusedVariables false in /-- The submodule of the `barL ∂ L` block of a generation pair: an underived @@ -491,23 +506,25 @@ include h in lemma barLLPairSubmodule_le_blockSpan (f f' : Fin 3) : h.barLLPairSubmodule f f' ≤ (h.barLLKineticBlock f f').blockSpan := by rw [barLLPairSubmodule, KineticBlock.blockSpan] - refine mul_le_of_le - (A := fun k => barL f (![] : Fin 0 → Fin 1 ⊕ Fin 3) (LeptonDoublet.basis.conj.dualBasis k)) - (C := fun k : (Fin 1 ⊕ Fin 3) × (Fin 2 × Fin 2) => + refine Submodule.mul_le_of_le_iSup_span + (a := fun k => barL f (![] : Fin 0 → Fin 1 ⊕ Fin 3) (LeptonDoublet.basis.conj.dualBasis k)) + (b := fun k : (Fin 1 ⊕ Fin 3) × (Fin 2 × Fin 2) => L f' ![k.1] (LeptonDoublet.basis.dualBasis k.2)) - (le_of_eq (range_eq_iSup_span_dualBasis LeptonDoublet.basis.conj _)) (iSup_le fun μ => ?_) ?_ - · rw [range_eq_iSup_span_dualBasis LeptonDoublet.basis (L f' ![μ])] + (le_of_eq (LinearMap.range_eq_iSup_span_basis LeptonDoublet.basis.conj.dualBasis _)) + (iSup_le fun μ => ?_) ?_ + · rw [LinearMap.range_eq_iSup_span_basis LeptonDoublet.basis.dualBasis (L f' ![μ])] exact iSup_le fun k => le_iSup_of_le (μ, k) le_rfl · intro i j exact Submodule.mem_iSup_of_mem (j.1, (j.2.1, i.1), (i.2, j.2.2)) (Submodule.mem_iSup_of_mem ![0, 0] (Submodule.mem_span_singleton_self _)) include h in -/-- The `barL ∂ L` block peels to its kinetic term. -/ -lemma peels_barLL (f f' : Fin 3) : - Peels (gaugeLorentzMaps repGauge repLorentz) (h.barLLPairSubmodule f f') +/-- The `barL ∂ L` block reduces to its kinetic term. -/ +lemma reducesInvariantsTo_barLL (f f' : Fin 3) : + ReducesInvariantsTo (gaugeLorentzMaps repGauge repLorentz) (h.barLLPairSubmodule f f') (ℂ ∙ (h.barLLKineticBlock f f').kineticTerm) := - ((h.barLLKineticBlock f f').peels).mono_left (h.barLLPairSubmodule_le_blockSpan f f') + (h.barLLKineticBlock f f').reducesInvariantsTo.mono_left + (h.barLLPairSubmodule_le_blockSpan f f') set_option linter.unusedVariables false in /-- The submodule of the `e ∂ bare` block of a generation pair: an underived @@ -535,23 +552,25 @@ include h in lemma ebarePairSubmodule_le_blockSpan (f f' : Fin 3) : h.ebarePairSubmodule f f' ≤ (h.ebareKineticBlock f f').blockSpan := by rw [ebarePairSubmodule, KineticBlock.blockSpan] - refine mul_le_of_le - (A := fun k => e f (![] : Fin 0 → Fin 1 ⊕ Fin 3) (LeptonSinglet.basis.dualBasis k)) - (C := fun k : (Fin 1 ⊕ Fin 3) × (Fin 2) => + refine Submodule.mul_le_of_le_iSup_span + (a := fun k => e f (![] : Fin 0 → Fin 1 ⊕ Fin 3) (LeptonSinglet.basis.dualBasis k)) + (b := fun k : (Fin 1 ⊕ Fin 3) × (Fin 2) => bare f' ![k.1] (LeptonSinglet.basis.conj.dualBasis k.2)) - (le_of_eq (range_eq_iSup_span_dualBasis LeptonSinglet.basis _)) (iSup_le fun μ => ?_) ?_ - · rw [range_eq_iSup_span_dualBasis LeptonSinglet.basis.conj (bare f' ![μ])] + (le_of_eq (LinearMap.range_eq_iSup_span_basis LeptonSinglet.basis.dualBasis _)) + (iSup_le fun μ => ?_) ?_ + · rw [LinearMap.range_eq_iSup_span_basis LeptonSinglet.basis.conj.dualBasis (bare f' ![μ])] exact iSup_le fun k => le_iSup_of_le (μ, k) le_rfl · intro i j exact Submodule.mem_iSup_of_mem (j.1, (j.2, i), (0, 0)) (Submodule.mem_iSup_of_mem ![0, 0] (Submodule.mem_span_singleton_self _)) include h in -/-- The `e ∂ bare` block peels to its kinetic term. -/ -lemma peels_ebare (f f' : Fin 3) : - Peels (gaugeLorentzMaps repGauge repLorentz) (h.ebarePairSubmodule f f') +/-- The `e ∂ bare` block reduces to its kinetic term. -/ +lemma reducesInvariantsTo_ebare (f f' : Fin 3) : + ReducesInvariantsTo (gaugeLorentzMaps repGauge repLorentz) (h.ebarePairSubmodule f f') (ℂ ∙ (h.ebareKineticBlock f f').kineticTerm) := - ((h.ebareKineticBlock f f').peels).mono_left (h.ebarePairSubmodule_le_blockSpan f f') + (h.ebareKineticBlock f f').reducesInvariantsTo.mono_left + (h.ebarePairSubmodule_le_blockSpan f f') set_option linter.unusedVariables false in /-- The submodule of the `bare ∂ e` block of a generation pair: an underived @@ -579,23 +598,25 @@ include h in lemma bareePairSubmodule_le_blockSpan (f f' : Fin 3) : h.bareePairSubmodule f f' ≤ (h.bareeKineticBlock f f').blockSpan := by rw [bareePairSubmodule, KineticBlock.blockSpan] - refine mul_le_of_le - (A := fun k => bare f (![] : Fin 0 → Fin 1 ⊕ Fin 3) (LeptonSinglet.basis.conj.dualBasis k)) - (C := fun k : (Fin 1 ⊕ Fin 3) × (Fin 2) => + refine Submodule.mul_le_of_le_iSup_span + (a := fun k => bare f (![] : Fin 0 → Fin 1 ⊕ Fin 3) (LeptonSinglet.basis.conj.dualBasis k)) + (b := fun k : (Fin 1 ⊕ Fin 3) × (Fin 2) => e f' ![k.1] (LeptonSinglet.basis.dualBasis k.2)) - (le_of_eq (range_eq_iSup_span_dualBasis LeptonSinglet.basis.conj _)) (iSup_le fun μ => ?_) ?_ - · rw [range_eq_iSup_span_dualBasis LeptonSinglet.basis (e f' ![μ])] + (le_of_eq (LinearMap.range_eq_iSup_span_basis LeptonSinglet.basis.conj.dualBasis _)) + (iSup_le fun μ => ?_) ?_ + · rw [LinearMap.range_eq_iSup_span_basis LeptonSinglet.basis.dualBasis (e f' ![μ])] exact iSup_le fun k => le_iSup_of_le (μ, k) le_rfl · intro i j exact Submodule.mem_iSup_of_mem (j.1, (i, j.2), (0, 0)) (Submodule.mem_iSup_of_mem ![0, 0] (Submodule.mem_span_singleton_self _)) include h in -/-- The `bare ∂ e` block peels to its kinetic term. -/ -lemma peels_baree (f f' : Fin 3) : - Peels (gaugeLorentzMaps repGauge repLorentz) (h.bareePairSubmodule f f') +/-- The `bare ∂ e` block reduces to its kinetic term. -/ +lemma reducesInvariantsTo_baree (f f' : Fin 3) : + ReducesInvariantsTo (gaugeLorentzMaps repGauge repLorentz) (h.bareePairSubmodule f f') (ℂ ∙ (h.bareeKineticBlock f f').kineticTerm) := - ((h.bareeKineticBlock f f').peels).mono_left (h.bareePairSubmodule_le_blockSpan f f') + (h.bareeKineticBlock f f').reducesInvariantsTo.mono_left + (h.bareePairSubmodule_le_blockSpan f f') /-! @@ -1083,13 +1104,14 @@ lemma kineticSpan_le_lorentzInvariants : h.kineticSpan ≤ repLorentz.invariants /-! -## E. The blocks peel to the kinetic terms +## E. The blocks reduce to the kinetic terms The weight-zero piece of the gauge weight decomposition lies in the join of the ten block submodules, hypercharge having already cut the hundred pairings down to ten; and each -block peels to its kinetic term, by the three stages its `KineticBlock` package supplies. -Joining the ten and then the nine generation pairs is `Peels.sup` and `Peels.iSup`, which -is where the stability of the blocks and of the kinetic span is spent. +block reduces to its kinetic term, by the three stages its `KineticBlock` package supplies. +Joining the ten and then the nine generation pairs is `ReducesInvariantsTo.sup` and +`ReducesInvariantsTo.iSup`, which is where the stability of the blocks and of the kinetic span is +spent. -/ @@ -1183,9 +1205,10 @@ lemma massWeightSubmoduleGaugeWeightEight_piece_zero_le : LinearMap.range (e f' ![ν])) μ)) include h in -/-- The join of the ten block submodules peels to the kinetic span. -/ -lemma peels_kineticBlockSubmodule : - Peels (gaugeLorentzMaps repGauge repLorentz) h.kineticBlockSubmodule h.kineticSpan := by +/-- The join of the ten block submodules reduces to the kinetic span. -/ +lemma reducesInvariantsTo_kineticBlockSubmodule : + ReducesInvariantsTo (gaugeLorentzMaps repGauge repLorentz) h.kineticBlockSubmodule + h.kineticSpan := by have hW : IsStableUnder (gaugeLorentzMaps repGauge repLorentz) h.kineticSpan := h.isFixedBy_kineticSpan.isStableUnder have hS : ∀ f f' : Fin 3, IsStableUnder (gaugeLorentzMaps repGauge repLorentz) @@ -1219,7 +1242,7 @@ lemma peels_kineticBlockSubmodule : (h.isStableUnder_barLLPairSubmodule f f')) (h.isStableUnder_ebarePairSubmodule f f')) (h.isStableUnder_bareePairSubmodule f f') - have hP : ∀ f f' : Fin 3, Peels (gaugeLorentzMaps repGauge repLorentz) + have hP : ∀ f f' : Fin 3, ReducesInvariantsTo (gaugeLorentzMaps repGauge repLorentz) ( h.dbardPairSubmodule f f' ⊔ h.barddPairSubmodule f f' @@ -1231,36 +1254,36 @@ lemma peels_kineticBlockSubmodule : ⊔ h.barLLPairSubmodule f f' ⊔ h.ebarePairSubmodule f f' ⊔ h.bareePairSubmodule f f') h.kineticSpan := fun f f' => - Peels.sup - (Peels.sup - (Peels.sup - (Peels.sup - (Peels.sup - (Peels.sup - (Peels.sup - (Peels.sup - (Peels.sup - ((h.peels_dbard f f').mono_right (h.span_dbard_le_kineticSpan f f')) - ((h.peels_bardd f f').mono_right (h.span_bardd_le_kineticSpan f f')) + ReducesInvariantsTo.sup + (ReducesInvariantsTo.sup + (ReducesInvariantsTo.sup + (ReducesInvariantsTo.sup + (ReducesInvariantsTo.sup + (ReducesInvariantsTo.sup + (ReducesInvariantsTo.sup + (ReducesInvariantsTo.sup + (ReducesInvariantsTo.sup + ((h.reducesInvariantsTo_dbard f f').mono_right (h.span_dbard_le_kineticSpan f f')) + ((h.reducesInvariantsTo_bardd f f').mono_right (h.span_bardd_le_kineticSpan f f')) (h.isStableUnder_barddPairSubmodule f f') hW) - ((h.peels_ubaru f f').mono_right (h.span_ubaru_le_kineticSpan f f')) + ((h.reducesInvariantsTo_ubaru f f').mono_right (h.span_ubaru_le_kineticSpan f f')) (h.isStableUnder_ubaruPairSubmodule f f') hW) - ((h.peels_baruu f f').mono_right (h.span_baruu_le_kineticSpan f f')) + ((h.reducesInvariantsTo_baruu f f').mono_right (h.span_baruu_le_kineticSpan f f')) (h.isStableUnder_baruuPairSubmodule f f') hW) - ((h.peels_QbarQ f f').mono_right (h.span_QbarQ_le_kineticSpan f f')) + ((h.reducesInvariantsTo_QbarQ f f').mono_right (h.span_QbarQ_le_kineticSpan f f')) (h.isStableUnder_QbarQPairSubmodule f f') hW) - ((h.peels_barQQ f f').mono_right (h.span_barQQ_le_kineticSpan f f')) + ((h.reducesInvariantsTo_barQQ f f').mono_right (h.span_barQQ_le_kineticSpan f f')) (h.isStableUnder_barQQPairSubmodule f f') hW) - ((h.peels_LbarL f f').mono_right (h.span_LbarL_le_kineticSpan f f')) + ((h.reducesInvariantsTo_LbarL f f').mono_right (h.span_LbarL_le_kineticSpan f f')) (h.isStableUnder_LbarLPairSubmodule f f') hW) - ((h.peels_barLL f f').mono_right (h.span_barLL_le_kineticSpan f f')) + ((h.reducesInvariantsTo_barLL f f').mono_right (h.span_barLL_le_kineticSpan f f')) (h.isStableUnder_barLLPairSubmodule f f') hW) - ((h.peels_ebare f f').mono_right (h.span_ebare_le_kineticSpan f f')) + ((h.reducesInvariantsTo_ebare f f').mono_right (h.span_ebare_le_kineticSpan f f')) (h.isStableUnder_ebarePairSubmodule f f') hW) - ((h.peels_baree f f').mono_right (h.span_baree_le_kineticSpan f f')) + ((h.reducesInvariantsTo_baree f f').mono_right (h.span_baree_le_kineticSpan f f')) (h.isStableUnder_bareePairSubmodule f f') hW rw [kineticBlockSubmodule] - exact Peels.iSup (fun f => Peels.iSup (hP f) (hS f) hW) + exact ReducesInvariantsTo.iSup (fun f => ReducesInvariantsTo.iSup (hP f) (hS f) hW) (fun f => isStableUnder_iSup fun f' => hS f f') hW /-! @@ -1268,7 +1291,7 @@ lemma peels_kineticBlockSubmodule : ## F. The classification as an equivalence The two directions meet. Forwards: hypercharge puts a gauge invariant in the weight-zero -piece, section E peels that down to the kinetic span, and what is left over is in `S` and +piece, section E reduces that to the kinetic span, and what is left over is in `S` and is itself invariant, the kinetic span being made of invariants. Backwards: the kinetic span is a space of gauge and Lorentz invariants of mass weight eight, so splitting `x` as `(x - y) + y` puts it back together. @@ -1302,7 +1325,7 @@ theorem exists_mem_of_gauge_and_lorentz_invariant (S : Submodule ℂ B) have hxinv : ∀ p, gaugeLorentzMaps repGauge repLorentz p x = x := forall_gaugeLorentzMaps_eq_self_iff.2 ⟨hG, hL⟩ obtain ⟨z, hz, y, hy, hzy⟩ := Submodule.mem_sup.1 - (h.peels_kineticBlockSubmodule S hSstab x hblk hxinv) + (h.reducesInvariantsTo_kineticBlockSubmodule S hSstab x hblk hxinv) have hzG := (Representation.mem_invariants _ _).1 (h.kineticSpan_le_invariants hz) have hzL := (Representation.mem_invariants _ _).1 (h.kineticSpan_le_lorentzInvariants hz) refine ⟨y, hy, fun g => ?_, fun g => ?_, ?_⟩ diff --git a/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/MassDimLTEight.lean b/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/MassDimLTEight.lean index 93e1c45b8..f7a11ad98 100644 --- a/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/MassDimLTEight.lean +++ b/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/MassDimLTEight.lean @@ -8,7 +8,7 @@ module public import Physlib.Particles.StandardModel.IsFermionSector.Components public import Physlib.Particles.StandardModel.IsFermionSector.MassWeight.GaugeWeightDecomposition public import Physlib.Relativity.LorentzGroup.Invariants.IsVectorLeftRightWeyl -public import Physlib.Particles.StandardModel.Peeling +public import Physlib.Particles.StandardModel.InvariantReduction /-! # The invariants below mass weight eight diff --git a/Physlib/Particles/StandardModel/Peeling.lean b/Physlib/Particles/StandardModel/Peeling.lean deleted file mode 100644 index fc67c986f..000000000 --- a/Physlib/Particles/StandardModel/Peeling.lean +++ /dev/null @@ -1,831 +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.GaugeWeightDecomposition -public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU3FunAntiFun -public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU2AntiFundamental -public import Physlib.Particles.StandardModel.GaugeGroup.Invariants.IsSU2BiFundamental -public import Physlib.Relativity.IsLorentzDeriv -public import Physlib.Relativity.LorentzGroup.Invariants.IsBiLeftWeyl -public import Physlib.Relativity.LorentzGroup.Invariants.IsVectorLeftRightWeyl -/-! -# Peeling invariants off a stable submodule - -Every sector of the Standard Model is classified the same way. A submodule of the algebra -is cut down by one index law at a time — colour, then isospin, then Lorentz — and at each -stage a classification theorem says that an invariant of the submodule is a multiple of a -single contraction, up to an error term in a submodule that the group carries into itself. -This file is the machinery that runs those stages, shared by every sector so that they all -tell the same story. - -The relation is `Peels σ V W`: every `σ`-invariant of `V ⊔ S` lies in `W ⊔ S`, for every -`σ`-stable `S`. It is transitive, monotone in both arguments and closed under joins in its -source, and those four moves are all a sector-level argument ever needs: stages chain by -`Peels.trans`, a sum of blocks is handled by `Peels.sup`, and a family of blocks by -`Peels.biSup` and `Peels.iSup`. - -The maps `σ` are a bare family of linear maps indexed by any type, not a representation. -That is what lets one relation serve three stages: colour is `fun U => repGauge (U, 1, 1)`, -isospin is `fun V => repGauge (1, V, 1)`, Lorentz is `fun Λ => repLorentz Λ`, and both -groups at once is the family indexed by `GaugeGroupI ⊕ SL(2,ℂ)`. A peeling for one of the -three transports to a peeling for all of them by `Peels.comp`. - -A `Step` packages one classification theorem: the submodule, the contraction its invariants -are multiples of, and the three facts the peeling consumes. The constructors wrap the -classifiers of the colour, isospin and Lorentz index laws, together with `Step.ofFixed` for -a stage that has nothing to do — a lepton block has no colour index, and rather than making -it an exception it is given the trivial colour step. - -Three further groups of shared facts ride along, for the same reason: they are used by -every sector and belong to none. A gauge transformation is a triple, so an element fixed by -its colour, isospin and hypercharge factors separately is gauge invariant, and each index -law constrains one factor and says nothing about the others (E). A contraction of one pair -of indices is a sum, or a difference, of components, so each index law has to be known -closed under those before the next contraction can be formed (F). And a weight piece lies -inside the submodule it decomposes, a symbol range is the span of its components, and a -product of stable submodules is stable (G). - -- A. Stable and fixed submodules -- B. The peeling relation -- C. The classification steps -- D. The two groups at once -- E. The three factors of a gauge transformation -- F. Sums and differences of classified families -- G. Weight pieces, symbol ranges and stability - --/ - -@[expose] public section - -namespace StandardModel - -open TensorProduct Matrix MatrixGroups Lorentz Pointwise ComplexConjugate - -/-! - -## A. Stable and fixed submodules - -The peeling argument never uses a group structure, only a family of linear maps `σ` indexed -by a type `G`, and two properties of a submodule with respect to it: being carried into -itself, and being fixed pointwise. Both are needed. Stability is what lets a submodule be -adjoined to the error term `S` of a classification, and it is exactly the hypothesis the -classification theorems ask of `S`; fixedness is the stronger property the spans of the -contractions have, and it implies stability. - --/ - -section Stability - -variable {B : Type*} [AddCommGroup B] [Module ℂ B] {G : Type*} - -/-- A submodule carried into itself by every map of the family `σ`. This is the hypothesis - every classification modulo a submodule asks of that submodule. -/ -def IsStableUnder (σ : G → B →ₗ[ℂ] B) (V : Submodule ℂ B) : Prop := - ∀ g, ∀ y ∈ V, σ g y ∈ V - -/-- A submodule fixed pointwise by every map of the family `σ`. -/ -def IsFixedBy (σ : G → B →ₗ[ℂ] B) (V : Submodule ℂ B) : Prop := - ∀ g, ∀ y ∈ V, σ g y = y - -/-- Stability read as an inclusion of images, which is the form the lattice operations - are handled in. -/ -lemma isStableUnder_iff_map {σ : G → B →ₗ[ℂ] B} {V : Submodule ℂ B} : - IsStableUnder σ V ↔ ∀ g, Submodule.map (σ g) V ≤ V := by - constructor - · rintro hV g _ ⟨y, hy, rfl⟩ - exact hV g y hy - · exact fun hV g y hy => hV g ⟨y, hy, rfl⟩ - -/-- A submodule fixed pointwise is stable. -/ -lemma IsFixedBy.isStableUnder {σ : G → B →ₗ[ℂ] B} {V : Submodule ℂ B} (hV : IsFixedBy σ V) : - IsStableUnder σ V := fun g y hy => by rw [hV g y hy]; exact hy - -/-- A join of two pointwise-fixed submodules is pointwise fixed. -/ -lemma IsFixedBy.sup {σ : G → B →ₗ[ℂ] B} {V V' : Submodule ℂ B} (hV : IsFixedBy σ V) - (hV' : IsFixedBy σ V') : IsFixedBy σ (V ⊔ V') := by - intro g y hy - obtain ⟨a, ha, b, hb, rfl⟩ := Submodule.mem_sup.1 hy - rw [map_add, hV g a ha, hV' g b hb] - -/-- The zero submodule is stable. -/ -lemma isStableUnder_bot {σ : G → B →ₗ[ℂ] B} : IsStableUnder σ (⊥ : Submodule ℂ B) := by - intro g y hy - rw [Submodule.mem_bot] at hy - simp [hy] - -/-- A join of two stable submodules is stable. -/ -lemma IsStableUnder.sup {σ : G → B →ₗ[ℂ] B} {V V' : Submodule ℂ B} (hV : IsStableUnder σ V) - (hV' : IsStableUnder σ V') : IsStableUnder σ (V ⊔ V') := - isStableUnder_iff_map.2 fun g => by - rw [Submodule.map_sup] - exact sup_le_sup (isStableUnder_iff_map.1 hV g) (isStableUnder_iff_map.1 hV' g) - -/-- An indexed join of stable submodules is stable. The index is a `Sort`, so this covers - the join over a proposition and with it the bounded join `⨆ i ∈ s, V i`. -/ -lemma isStableUnder_iSup {σ : G → B →ₗ[ℂ] B} {ι : Sort*} {V : ι → Submodule ℂ B} - (hV : ∀ i, IsStableUnder σ (V i)) : IsStableUnder σ (⨆ i, V i) := - isStableUnder_iff_map.2 fun g => by - rw [Submodule.map_iSup] - exact iSup_mono fun i => isStableUnder_iff_map.1 (hV i) g - -/-- The line through a fixed vector is fixed, hence stable. -/ -lemma isFixedBy_span_singleton {σ : G → B →ₗ[ℂ] B} {b : B} (hb : ∀ g, σ g b = b) : - IsFixedBy σ (ℂ ∙ b) := by - intro g y hy - obtain ⟨c, rfl⟩ := Submodule.mem_span_singleton.1 hy - rw [map_smul, hb] - -/-- An indexed join of pointwise-fixed submodules is pointwise fixed. -/ -lemma isFixedBy_iSup {σ : G → B →ₗ[ℂ] B} {ι : Sort*} {V : ι → Submodule ℂ B} - (hV : ∀ i, IsFixedBy σ (V i)) : IsFixedBy σ (⨆ i, V i) := by - intro g y hy - refine Submodule.iSup_induction (motive := fun z => σ g z = z) V hy (fun i z hz => hV i g z hz) - (map_zero _) fun z z' hz hz' => by rw [map_add, hz, hz'] - -/-- A join of lines through fixed vectors is pointwise fixed: the form in which a family of - contractions supplies the fixedness of its span. -/ -lemma isFixedBy_iSup_span_singleton {σ : G → B →ₗ[ℂ] B} {ι : Sort*} {T : ι → B} - (hT : ∀ i g, σ g (T i) = T i) : IsFixedBy σ (⨆ i, ℂ ∙ T i) := - isFixedBy_iSup fun i => isFixedBy_span_singleton (hT i) - -/-- The span of a family whose members transform into combinations of the family is - stable. -/ -lemma isStableUnder_iSup_span_singleton {σ : G → B →ₗ[ℂ] B} {ι : Type*} {T : ι → B} - (hT : ∀ g i, σ g (T i) ∈ ⨆ j, ℂ ∙ T j) : IsStableUnder σ (⨆ i, ℂ ∙ T i) := - isStableUnder_iff_map.2 fun g => by - rw [Submodule.map_iSup] - exact iSup_le fun i => by - rw [Submodule.map_span, Set.image_singleton, Submodule.span_singleton_le_iff_mem] - exact hT g i - -/-- The span of a family transforming by a finite combination of itself is stable: the - form in which the three index laws supply stability. -/ -lemma isStableUnder_iSup_span_singleton_of_sum {σ : G → B →ₗ[ℂ] B} {ι : Type*} [Fintype ι] - {T : ι → B} (hT : ∀ g i, ∃ c : ι → ℂ, σ g (T i) = ∑ a, c a • T a) : - IsStableUnder σ (⨆ i, ℂ ∙ T i) := by - refine isStableUnder_iSup_span_singleton fun g i => ?_ - obtain ⟨c, hc⟩ := hT g i - rw [hc] - exact sum_mem fun a _ => Submodule.smul_mem _ _ - (Submodule.mem_iSup_of_mem a (Submodule.mem_span_singleton_self _)) - -end Stability - -/-! - -## B. The peeling relation - -`Peels σ V W` says that a `σ`-invariant of `V` joined with a `σ`-stable submodule `S` lies -in `W` joined with `S`, for every such `S`. It is the shape every classification modulo a -stable submodule takes, and everything the argument does with those classifications is one -of four moves: enlarging the target, shrinking the source, composing two of them in -sequence, and — the one that does real work — joining two of them. - -The join is where stability is spent. To peel `V₁ ⊔ V₂` down to `W` the second summand is -put into the error term, which asks that `V₂` be stable; what comes back out is an element -of `W ⊔ (V₂ ⊔ S)`, and peeling `V₂` off that in turn asks that `W` be stable, since `W` is -now part of the error term. Both hypotheses are met in practice, `V₂` being a span of -symbol components and `W` a span of invariants. - --/ - -section Peeling - -variable {B : Type*} [AddCommGroup B] [Module ℂ B] {G : Type*} - -/-- The peeling relation: every `σ`-invariant of `V ⊔ S`, for `S` a `σ`-stable submodule, - lies in `W ⊔ S`. This is the conclusion each classification modulo a stable submodule - reaches, in a form that composes. -/ -def Peels (σ : G → B →ₗ[ℂ] B) (V W : Submodule ℂ B) : Prop := - ∀ S : Submodule ℂ B, IsStableUnder σ S → ∀ x ∈ V ⊔ S, (∀ g, σ g x = x) → x ∈ W ⊔ S - -/-- An inclusion peels: nothing has to be classified. -/ -lemma peels_of_le {σ : G → B →ₗ[ℂ] B} {V W : Submodule ℂ B} (hVW : V ≤ W) : Peels σ V W := - fun S _ _ hx _ => sup_le_sup_right hVW S hx - -/-- Peeling a smaller source. -/ -lemma Peels.mono_left {σ : G → B →ₗ[ℂ] B} {V V' W : Submodule ℂ B} (hP : Peels σ V' W) - (hV : V ≤ V') : Peels σ V W := - fun S hS x hx hinv => hP S hS x (sup_le_sup_right hV S hx) hinv - -/-- Peeling to a larger target. -/ -lemma Peels.mono_right {σ : G → B →ₗ[ℂ] B} {V W W' : Submodule ℂ B} (hP : Peels σ V W') - (hW : W' ≤ W) : Peels σ V W := - fun S hS x hx hinv => sup_le_sup_right hW S (hP S hS x hx hinv) - -/-- Two peelings in sequence. This is what turns the colour, isospin and Lorentz - classifications of a block into a single one. -/ -lemma Peels.trans {σ : G → B →ₗ[ℂ] B} {V W W' : Submodule ℂ B} (hP : Peels σ V W) - (hQ : Peels σ W W') : Peels σ V W' := - fun S hS x hx hinv => hQ S hS x (hP S hS x hx hinv) hinv - -/-- Peeling a join, one summand at a time: the second summand joins the error term while - the first is classified, and the roles are then exchanged. -/ -lemma Peels.sup {σ : G → B →ₗ[ℂ] B} {V V' W : Submodule ℂ B} (hP : Peels σ V W) - (hQ : Peels σ V' W) (hV' : IsStableUnder σ V') (hW : IsStableUnder σ W) : - Peels σ (V ⊔ V') W := by - intro S hS x hx hinv - have h1 : x ∈ W ⊔ (V' ⊔ S) := - hP (V' ⊔ S) (hV'.sup hS) x (by rwa [← sup_assoc]) hinv - have h2 : x ∈ V' ⊔ (W ⊔ S) := by - have hcomm : W ⊔ (V' ⊔ S) = V' ⊔ (W ⊔ S) := sup_left_comm W V' S - rwa [hcomm] at h1 - have h3 : x ∈ W ⊔ (W ⊔ S) := hQ (W ⊔ S) (hW.sup hS) x h2 hinv - rwa [← sup_assoc, sup_idem] at h3 - -/-- Peeling a join over a finite set, by induction on the set. -/ -lemma Peels.biSup {σ : G → B →ₗ[ℂ] B} {ι : Type*} [DecidableEq ι] {V : ι → Submodule ℂ B} - {W : Submodule ℂ B} (hP : ∀ i, Peels σ (V i) W) (hV : ∀ i, IsStableUnder σ (V i)) - (hW : IsStableUnder σ W) : ∀ s : Finset ι, Peels σ (⨆ i ∈ s, V i) W := by - intro s - induction s using Finset.induction_on with - | empty => - refine peels_of_le (le_trans (le_of_eq ?_) bot_le) - simp - | @insert a s _ ih => - rw [Finset.iSup_insert] - exact (hP a).sup ih (isStableUnder_iSup fun i => isStableUnder_iSup fun _ => hV i) hW - -/-- Peeling a join over a finite index type. -/ -lemma Peels.iSup {σ : G → B →ₗ[ℂ] B} {ι : Type*} [Fintype ι] [DecidableEq ι] - {V : ι → Submodule ℂ B} {W : Submodule ℂ B} (hP : ∀ i, Peels σ (V i) W) - (hV : ∀ i, IsStableUnder σ (V i)) (hW : IsStableUnder σ W) : Peels σ (⨆ i, V i) W := by - have hs := Peels.biSup hP hV hW Finset.univ - refine hs.mono_left (iSup_le fun i => le_iSup₂_of_le i (Finset.mem_univ i) le_rfl) - -/-- Peeling under a reindexing of the family of maps: an invariant of the larger family is - an invariant of the smaller one and a stable submodule for the larger is stable for the - smaller, so a peeling for the smaller family is one for the larger. This is what lets the - colour, isospin and Lorentz peelings, each stated for its own group, be read as peelings - for the gauge and Lorentz groups together. -/ -lemma Peels.comp {σ : G → B →ₗ[ℂ] B} {G' : Type*} (ι : G' → G) {V W : Submodule ℂ B} - (hP : Peels (fun g' => σ (ι g')) V W) : Peels σ V W := - fun S hS x hx hinv => hP S (fun g' y hy => hS (ι g') y hy) x hx fun g' => hinv (ι g') - -end Peeling - -/-! - -## C. The classification steps - -A `Step` packages what one classification theorem provides: a submodule, the single -contraction its invariants are multiples of, and the three facts the peeling needs — that -the submodule is stable, that the contraction is fixed, and that an invariant of the -submodule joined with a stable error term is a multiple of the contraction plus an error. - -Six constructors cover the file. Five wrap the classification theorems of the colour, -isospin and Lorentz index laws. The sixth wraps no theorem at all: a line through a fixed -vector is classified by that vector, and it is what stands in for the colour step of a -lepton block, whose three symbols carry no colour index between them. With it the two -lepton couplings are peeled in the same three stages as the four quark ones. - --/ - -section Steps - -variable {B : Type*} [AddCommGroup B] [Module ℂ B] {G : Type*} - -/-- One classification of the invariants of a submodule, in the form the peeling consumes: - the submodule is stable, the contraction it classifies down to is fixed, and every - invariant of the submodule joined with a stable error term is a multiple of the - contraction up to an error. -/ -structure Step (σ : G → B →ₗ[ℂ] B) (V : Submodule ℂ B) where - /-- The single invariant the classification produces. -/ - contraction : B - /-- The submodule being classified is carried into itself. -/ - stable : IsStableUnder σ V - /-- The contraction is fixed by the whole family. -/ - contraction_fixed : ∀ g, σ g contraction = contraction - /-- The classification itself, modulo a stable error term. -/ - classify : ∀ S : Submodule ℂ B, IsStableUnder σ S → ∀ x ∈ V ⊔ S, (∀ g, σ g x = x) → - ∃ c : ℂ, ∃ y ∈ S, x = c • contraction + y - -/-- A step peels its submodule down to the line through its contraction. -/ -lemma Step.peels {σ : G → B →ₗ[ℂ] B} {V : Submodule ℂ B} (st : Step σ V) : - Peels σ V (ℂ ∙ st.contraction) := by - intro S hS x hx hinv - obtain ⟨c, y, hy, rfl⟩ := st.classify S hS x hx hinv - exact Submodule.mem_sup.2 ⟨c • st.contraction, - Submodule.mem_span_singleton.2 ⟨c, rfl⟩, y, hy, rfl⟩ - -/-- The line through a step's contraction is fixed, hence stable: the form in which a - step supplies the stability of the target of a peeling. -/ -lemma Step.span_contraction_stable {σ : G → B →ₗ[ℂ] B} {V : Submodule ℂ B} - (st : Step σ V) : IsStableUnder σ (ℂ ∙ st.contraction) := - (isFixedBy_span_singleton st.contraction_fixed).isStableUnder - -/-- A family of steps peels the join of their submodules down to the join of their - contractions. This is the whole of one stage of a block's classification: one index law - holds at each value of the indices it does not see, and the classification is applied at - each of those values in turn. -/ -lemma Peels.iSup_step {σ : G → B →ₗ[ℂ] B} {κ : Type*} [Fintype κ] [DecidableEq κ] - {V : κ → Submodule ℂ B} (st : ∀ k, Step σ (V k)) : - Peels σ (⨆ k, V k) (⨆ k, ℂ ∙ (st k).contraction) := - Peels.iSup (fun k => ((st k).peels).mono_right - (le_iSup (fun k' => ℂ ∙ (st k').contraction) k)) (fun k => (st k).stable) - (isStableUnder_iSup fun k => (st k).span_contraction_stable) - -/-- The trivial step: a line through a vector that the family fixes is already classified, - by that vector itself. This is the colour step of a lepton block, whose symbols carry no - colour index, and it is what makes those blocks a case of the general argument rather - than an exception to it. -/ -noncomputable def Step.ofFixed {σ : G → B →ₗ[ℂ] B} (b : B) (hb : ∀ g, σ g b = b) : - Step σ (ℂ ∙ b) where - contraction := b - stable := (isFixedBy_span_singleton hb).isStableUnder - contraction_fixed := hb - classify S _ x hx _ := by - obtain ⟨a, ha, y, hy, rfl⟩ := Submodule.mem_sup.1 hx - obtain ⟨c, rfl⟩ := Submodule.mem_span_singleton.1 ha - exact ⟨c, y, hy, rfl⟩ - -/-- The trivial step on a family that does not move at all: if every member of the family - is the same fixed vector, the join of the lines through the family is the line through - that vector, and it is classified by it. This is the colour step of a block whose symbols - carry no colour index, and the isospin step of one whose symbols carry no isospin. -/ -noncomputable def Step.ofFixedFamily {σ : G → B →ₗ[ℂ] B} {ι : Type*} [Nonempty ι] - {T : ι → B} (b : B) (hTb : ∀ i, T i = b) (hb : ∀ g, σ g b = b) : - Step σ (⨆ i, ℂ ∙ T i) where - contraction := b - stable := by - refine (isFixedBy_iSup fun i => ?_).isStableUnder - rw [hTb i] - exact isFixedBy_span_singleton hb - contraction_fixed := hb - classify S _ x hx _ := by - obtain ⟨a, ha, y, hy, rfl⟩ := Submodule.mem_sup.1 hx - have hspan : (⨆ i, ℂ ∙ T i) = ℂ ∙ b := by - refine le_antisymm (iSup_le fun i => ?_) (le_iSup_of_le (Classical.arbitrary ι) ?_) - · rw [hTb i] - · rw [hTb (Classical.arbitrary ι)] - rw [hspan] at ha - obtain ⟨c, rfl⟩ := Submodule.mem_span_singleton.1 ha - exact ⟨c, y, hy, rfl⟩ - -end Steps - -section GaugeSteps - -variable {B : Type*} [AddCommGroup B] [Module ℂ B] - {repGauge : Representation ℂ GaugeGroupI B} - {repLorentz : Representation ℂ SL(2,ℂ) B} - -/-- The colour step of a family carrying one fundamental and one anti-fundamental colour - index: its invariants are the multiples of the delta contraction. -/ -noncomputable def Step.ofSU3FunAntiFun {T : (Fin 2 → Fin 3) → B} - (hT : IsSU3FunAntiFun B repGauge T) : - Step (fun U : specialUnitaryGroup (Fin 3) ℂ => repGauge (U, 1, 1)) - (IsSU3FunAntiFun.span T) where - contraction := IsSU3FunAntiFun.deltaContraction T - stable := isStableUnder_iSup_span_singleton_of_sum fun U l => ⟨_, hT.repGauge_T U l⟩ - contraction_fixed U := IsSU3FunAntiFun.repGauge_deltaContraction hT U - classify S hS x hx hinv := by - obtain ⟨c, y, hy, hxy, _⟩ := hT.mem_span_sup_su3_invariant_iff x S hS hx hinv - exact ⟨c, y, hy, hxy⟩ - -/-- The isospin step of a family carrying one fundamental and one anti-fundamental isospin - index: its invariants are the multiples of the delta contraction. -/ -noncomputable def Step.ofSU2FunAntiFun {T : (Fin 2 → Fin 2) → B} - (hT : IsSU2FunAntiFun B repGauge T) : - Step (fun V : specialUnitaryGroup (Fin 2) ℂ => repGauge (1, V, 1)) - (IsSU2BiFundamental.span T) where - contraction := IsSU2FunAntiFun.deltaContraction T - stable := isStableUnder_iSup_span_singleton_of_sum fun V l => ⟨_, hT.repGauge_T V l⟩ - contraction_fixed V := IsSU2FunAntiFun.repGauge_deltaContraction hT V - classify S hS x hx hinv := by - obtain ⟨c, y, hy, hxy, _⟩ := hT.mem_span_sup_su2_invariant_iff x S hS hx hinv - exact ⟨c, y, hy, hxy⟩ - -/-- The isospin step of a family carrying two anti-fundamental isospin indices: its - invariants are the multiples of the epsilon contraction, a pair of anti-fundamental - indices admitting no trace. -/ -noncomputable def Step.ofSU2BiAntiFun {T : (Fin 2 → Fin 2) → B} - (hT : IsSU2BiAntiFun B repGauge T) : - Step (fun V : specialUnitaryGroup (Fin 2) ℂ => repGauge (1, V, 1)) - (IsSU2BiFundamental.span T) where - contraction := IsSU2BiFundamental.epsilonContraction T - stable := isStableUnder_iSup_span_singleton_of_sum fun V l => ⟨_, hT.repGauge_T V l⟩ - contraction_fixed V := IsSU2BiAntiFun.repGauge_epsilonContraction hT V - classify S hS x hx hinv := by - obtain ⟨c, y, hy, hxy, _⟩ := hT.mem_span_sup_su2_invariant_iff x S hS hx hinv - exact ⟨c, y, hy, hxy⟩ - -/-- The isospin step of a family carrying two fundamental isospin indices. -/ -noncomputable def Step.ofSU2BiFundamental {T : (Fin 2 → Fin 2) → B} - (hT : IsSU2BiFundamental B repGauge T) : - Step (fun V : specialUnitaryGroup (Fin 2) ℂ => repGauge (1, V, 1)) - (IsSU2BiFundamental.span T) where - contraction := IsSU2BiFundamental.epsilonContraction T - stable := isStableUnder_iSup_span_singleton_of_sum fun V l => ⟨_, hT.repGauge_T V l⟩ - contraction_fixed V := IsSU2BiFundamental.repGauge_epsilonContraction hT V - classify S hS x hx hinv := by - obtain ⟨c, y, hy, hxy, _⟩ := hT.mem_span_sup_su2_invariant_iff x S hS hx hinv - exact ⟨c, y, hy, hxy⟩ - -/-- The Lorentz step of a family carrying two dual left-handed Weyl indices: its invariants - are the multiples of the epsilon contraction. -/ -noncomputable def Step.ofBiDualLeftWeyl {T : Fin 2 × Fin 2 → B} - (hT : IsBiDualLeftWeyl B repLorentz T) : - Step (fun Λ : SL(2,ℂ) => repLorentz Λ) (⨆ l, ℂ ∙ T l) where - contraction := IsBiLeftWeyl.epsilonContraction (T := T) - stable := isStableUnder_iSup_span_singleton_of_sum fun Λ l => ⟨_, hT.repLorentz_T Λ l⟩ - contraction_fixed Λ := hT.repLorentz_epsilonContraction Λ - classify S hS _ hx hinv := - hT.exists_smul_epsilonContraction_of_invariant_subset S hS hx hinv - -/-- The Lorentz step of a family carrying two dual right-handed Weyl indices. -/ -noncomputable def Step.ofBiDualRightWeyl {T : Fin 2 × Fin 2 → B} - (hT : IsBiDualRightWeyl B repLorentz T) : - Step (fun Λ : SL(2,ℂ) => repLorentz Λ) (⨆ l, ℂ ∙ T l) where - contraction := IsBiLeftWeyl.epsilonContraction (T := T) - stable := isStableUnder_iSup_span_singleton_of_sum fun Λ l => ⟨_, hT.repLorentz_T Λ l⟩ - contraction_fixed Λ := hT.repLorentz_epsilonContraction Λ - classify S hS _ hx hinv := - hT.exists_smul_epsilonContraction_of_invariant_subset S hS hx hinv - -/-- The Lorentz step of a family carrying one four-vector index and a pair of dual - opposite-chirality Weyl indices: its invariants are the multiples of the conjugate Pauli - contraction. This is the kinetic term of a Weyl fermion. -/ -noncomputable def Step.ofVectorDualLeftRightWeyl {B : Type*} [AddCommGroup B] [Module ℂ B] - {repLorentz : Representation ℂ SL(2,ℂ) B} - {T : (Fin 1 ⊕ Fin 3) × Fin 2 × Fin 2 → B} - (hT : IsVectorDualLeftRightWeyl B repLorentz T) : - Step (fun Λ : SL(2,ℂ) => repLorentz Λ) (⨆ q, ℂ ∙ T q) where - contraction := IsVectorDualLeftRightWeyl.pauliBarContraction (T := T) - stable := isStableUnder_iSup_span_singleton_of_sum fun Λ q => ⟨_, hT.repLorentz_T' Λ q⟩ - contraction_fixed Λ := hT.repLorentz_pauliBarContraction Λ - classify S hS _ hx hinv := - hT.exists_smul_pauliBarContraction_of_invariant_subset S hS hx hinv - -end GaugeSteps - -/-! - -## D. The two groups at once - -The three classifications of a block are read at three different groups, and the twelve -blocks have to be peeled apart under the gauge and Lorentz groups together. Both are -handled by one device: the family of maps indexed by the disjoint union of the two groups, -whose invariants are the elements fixed by both and whose stable submodules are those -stable under both. Each stage is then a peeling for a subfamily, transported by -`Peels.comp`. - --/ - -section BothGroups - -variable {B : Type*} [AddCommGroup B] [Module ℂ B] - (repGauge : Representation ℂ GaugeGroupI B) - (repLorentz : Representation ℂ SL(2,ℂ) B) - -/-- The gauge and Lorentz groups read as a single family of linear maps, indexed by their - disjoint union. -/ -def gaugeLorentzMaps : GaugeGroupI ⊕ SL(2,ℂ) → B →ₗ[ℂ] B := - Sum.elim (fun g => repGauge g) (fun Λ => repLorentz Λ) - -variable {repGauge repLorentz} - -/-- A submodule stable under both groups is stable under the combined family, and - conversely. -/ -lemma isStableUnder_gaugeLorentzMaps_iff {V : Submodule ℂ B} : - IsStableUnder (gaugeLorentzMaps repGauge repLorentz) V - ↔ (∀ g : GaugeGroupI, ∀ y ∈ V, repGauge g y ∈ V) - ∧ ∀ Λ : SL(2,ℂ), ∀ y ∈ V, repLorentz Λ y ∈ V := by - constructor - · exact fun hV => ⟨fun g => hV (Sum.inl g), fun Λ => hV (Sum.inr Λ)⟩ - · rintro ⟨hg, hL⟩ (g | Λ) - · exact hg g - · exact hL Λ - -/-- An element fixed by both groups is fixed by the combined family, and conversely. -/ -lemma forall_gaugeLorentzMaps_eq_self_iff {x : B} : - (∀ p, gaugeLorentzMaps repGauge repLorentz p x = x) - ↔ (∀ g : GaugeGroupI, repGauge g x = x) ∧ ∀ Λ : SL(2,ℂ), repLorentz Λ x = x := by - constructor - · exact fun hx => ⟨fun g => hx (Sum.inl g), fun Λ => hx (Sum.inr Λ)⟩ - · rintro ⟨hg, hL⟩ (g | Λ) - · exact hg g - · exact hL Λ - -/-- A colour peeling is a peeling for the gauge and Lorentz groups together. -/ -lemma Peels.ofSU3 {V W : Submodule ℂ B} - (hP : Peels (fun U : specialUnitaryGroup (Fin 3) ℂ => repGauge (U, 1, 1)) V W) : - Peels (gaugeLorentzMaps repGauge repLorentz) V W := - Peels.comp (fun U : specialUnitaryGroup (Fin 3) ℂ => Sum.inl ((U, 1, 1) : GaugeGroupI)) hP - -/-- An isospin peeling is a peeling for the gauge and Lorentz groups together. -/ -lemma Peels.ofSU2 {V W : Submodule ℂ B} - (hP : Peels (fun U : specialUnitaryGroup (Fin 2) ℂ => repGauge (1, U, 1)) V W) : - Peels (gaugeLorentzMaps repGauge repLorentz) V W := - Peels.comp (fun U : specialUnitaryGroup (Fin 2) ℂ => Sum.inl ((1, U, 1) : GaugeGroupI)) hP - -/-- A Lorentz peeling is a peeling for the gauge and Lorentz groups together. -/ -lemma Peels.ofLorentz {V W : Submodule ℂ B} - (hP : Peels (fun Λ : SL(2,ℂ) => repLorentz Λ) V W) : - Peels (gaugeLorentzMaps repGauge repLorentz) V W := - Peels.comp (Sum.inr (α := GaugeGroupI)) hP - -end BothGroups - -/-! - -## E. The three factors of a gauge transformation - -A gauge transformation is a triple, and the three index laws below each constrain one -factor of it and say nothing about the other two. This section reads a representation at -each factor separately: the entries of an inverse in the two unitary groups, the three -one-parameter embeddings `(U, 1, 1)`, `(1, V, 1)` and `(1, 1, t)` together with their -inverses, and the factorisation of an arbitrary gauge transformation into the three, which -is what turns three separate invariances into gauge invariance. - --/ - -/-- The entries of the inverse of an `SU(3)` element are the conjugated transposed - entries, the inverse of a unitary matrix being its conjugate transpose. -/ -lemma su3_inv_apply (U : specialUnitaryGroup (Fin 3) ℂ) (a b : Fin 3) : - (U⁻¹).1 a b = conj (U.1 b a) := by - rw [← Matrix.star_eq_inv, Matrix.specialUnitaryGroup.coe_star] - simp [Matrix.star_apply] - -/-- The entries of the inverse of an `SU(2)` element are the conjugated transposed - entries. -/ -lemma su2_inv_apply (U : specialUnitaryGroup (Fin 2) ℂ) (a b : Fin 2) : - (U⁻¹).1 a b = conj (U.1 b a) := by - rw [← Matrix.star_eq_inv, Matrix.specialUnitaryGroup.coe_star] - simp [Matrix.star_apply] - -/-- The inverse of a unitary scalar is its conjugate. -/ -lemma unitary_inv_coe (t : unitary ℂ) : ((t⁻¹ : unitary ℂ) : ℂ) = star (t : ℂ) := rfl - -/-- The colour factor of a colour gauge transformation. -/ -@[simp] lemma toSU3_su3Elt (U : specialUnitaryGroup (Fin 3) ℂ) : - GaugeGroupI.toSU3 ((U, 1, 1) : GaugeGroupI) = U := rfl - -/-- The isospin factor of a colour gauge transformation is trivial. -/ -@[simp] lemma toSU2_su3Elt (U : specialUnitaryGroup (Fin 3) ℂ) : - GaugeGroupI.toSU2 ((U, 1, 1) : GaugeGroupI) = 1 := rfl - -/-- The hypercharge factor of a colour gauge transformation is trivial. -/ -@[simp] lemma toU1_su3Elt (U : specialUnitaryGroup (Fin 3) ℂ) : - GaugeGroupI.toU1 ((U, 1, 1) : GaugeGroupI) = 1 := rfl - -/-- The inverse of a colour gauge transformation is the colour transformation of the - inverse. -/ -@[simp] lemma inv_su3Elt (U : specialUnitaryGroup (Fin 3) ℂ) : - ((U, 1, 1) : GaugeGroupI)⁻¹ = ((U⁻¹, 1, 1) : GaugeGroupI) := by - simp - -/-- The colour factor of an isospin gauge transformation is trivial. -/ -@[simp] lemma toSU3_su2Elt (V : specialUnitaryGroup (Fin 2) ℂ) : - GaugeGroupI.toSU3 ((1, V, 1) : GaugeGroupI) = 1 := rfl - -/-- The isospin factor of an isospin gauge transformation. -/ -@[simp] lemma toSU2_su2Elt (V : specialUnitaryGroup (Fin 2) ℂ) : - GaugeGroupI.toSU2 ((1, V, 1) : GaugeGroupI) = V := rfl - -/-- The hypercharge factor of an isospin gauge transformation is trivial. -/ -@[simp] lemma toU1_su2Elt (V : specialUnitaryGroup (Fin 2) ℂ) : - GaugeGroupI.toU1 ((1, V, 1) : GaugeGroupI) = 1 := rfl - -/-- The inverse of an isospin gauge transformation is the isospin transformation of the - inverse. -/ -@[simp] lemma inv_su2Elt (V : specialUnitaryGroup (Fin 2) ℂ) : - ((1, V, 1) : GaugeGroupI)⁻¹ = ((1, V⁻¹, 1) : GaugeGroupI) := by - simp - - -/-- The colour factor of a hypercharge gauge transformation is trivial. -/ -@[simp] lemma toSU3_u1Elt (t : unitary ℂ) : - GaugeGroupI.toSU3 ((1, 1, t) : GaugeGroupI) = 1 := rfl - -/-- The isospin factor of a hypercharge gauge transformation is trivial. -/ -@[simp] lemma toSU2_u1Elt (t : unitary ℂ) : - GaugeGroupI.toSU2 ((1, 1, t) : GaugeGroupI) = 1 := rfl - -/-- The hypercharge factor of a hypercharge gauge transformation. -/ -@[simp] lemma toU1_u1Elt (t : unitary ℂ) : - GaugeGroupI.toU1 ((1, 1, t) : GaugeGroupI) = t := rfl - -/-- The inverse of a hypercharge gauge transformation is the hypercharge transformation of - the inverse. -/ -@[simp] lemma inv_u1Elt (t : unitary ℂ) : - ((1, 1, t) : GaugeGroupI)⁻¹ = ((1, 1, t⁻¹) : GaugeGroupI) := by - simp - -/-- A gauge transformation is the product of its colour, isospin and hypercharge parts, so - an element fixed by each of the three factors separately is gauge invariant. -/ -lemma forall_repGauge_eq_self {B : Type*} [AddCommGroup B] [Module ℂ B] - {rep : Representation ℂ GaugeGroupI B} {x : B} - (h3 : ∀ U : specialUnitaryGroup (Fin 3) ℂ, rep (U, 1, 1) x = x) - (h2 : ∀ V : specialUnitaryGroup (Fin 2) ℂ, rep (1, V, 1) x = x) - (h1 : ∀ t : unitary ℂ, rep (1, 1, t) x = x) (g : GaugeGroupI) : rep g x = x := by - have hg : g = ((g.1, 1, 1) : GaugeGroupI) * (((1, g.2.1, 1) : GaugeGroupI) - * ((1, 1, g.2.2) : GaugeGroupI)) := by - simp [Prod.ext_iff] - rw [hg, map_mul, Module.End.mul_apply, map_mul, Module.End.mul_apply, h1, h2, h3] - -/-! - -## F. Sums and differences of classified families - -Contracting one pair of indices of a block leaves a family in the remaining pairs, and that -family is a finite sum — or, where the contraction is by the antisymmetric symbol, a -difference — of the block's own components. So each index law has to be known closed under -those operations before the second and third contractions can be formed. - --/ - -/-- A finite sum of families carrying one fundamental and one anti-fundamental colour index - is such a family again. -/ -lemma IsSU3FunAntiFun.sum {M : Type*} [AddCommGroup M] [Module ℂ M] - {rep : Representation ℂ GaugeGroupI M} {ι : Type} [Fintype ι] - {T : ι → (Fin 2 → Fin 3) → M} (hT : ∀ i, IsSU3FunAntiFun M rep (T i)) : - IsSU3FunAntiFun M rep (fun l => ∑ i, T i l) where - repGauge_T U l := by - rw [map_sum, Finset.sum_congr rfl fun i (_ : i ∈ Finset.univ) => (hT i).repGauge_T U l, - Finset.sum_comm] - exact Finset.sum_congr rfl fun a _ => Finset.smul_sum.symm - -/-- A finite sum of families carrying one fundamental and one anti-fundamental isospin - index is such a family again. -/ -lemma IsSU2FunAntiFun.sum {M : Type*} [AddCommGroup M] [Module ℂ M] - {rep : Representation ℂ GaugeGroupI M} {ι : Type} [Fintype ι] - {T : ι → (Fin 2 → Fin 2) → M} (hT : ∀ i, IsSU2FunAntiFun M rep (T i)) : - IsSU2FunAntiFun M rep (fun l => ∑ i, T i l) where - repGauge_T V l := by - rw [map_sum, Finset.sum_congr rfl fun i (_ : i ∈ Finset.univ) => (hT i).repGauge_T V l, - Finset.sum_comm] - exact Finset.sum_congr rfl fun a _ => Finset.smul_sum.symm - -/-- A finite sum of families carrying two anti-fundamental isospin indices is such a family - again. -/ -lemma IsSU2BiAntiFun.sum {M : Type*} [AddCommGroup M] [Module ℂ M] - {rep : Representation ℂ GaugeGroupI M} {ι : Type} [Fintype ι] - {T : ι → (Fin 2 → Fin 2) → M} (hT : ∀ i, IsSU2BiAntiFun M rep (T i)) : - IsSU2BiAntiFun M rep (fun l => ∑ i, T i l) where - repGauge_T V l := by - rw [map_sum, Finset.sum_congr rfl fun i (_ : i ∈ Finset.univ) => (hT i).repGauge_T V l, - Finset.sum_comm] - exact Finset.sum_congr rfl fun a _ => Finset.smul_sum.symm - -/-- A finite sum of families carrying two dual right-handed Weyl indices is such a family - again. -/ -lemma isBiDualRightWeyl_sum {M : Type*} [AddCommGroup M] [Module ℂ M] - {rep : Representation ℂ SL(2,ℂ) M} {ι : Type} [Fintype ι] - {T : ι → Fin 2 × Fin 2 → M} (hT : ∀ i, IsBiDualRightWeyl M rep (T i)) : - IsBiDualRightWeyl M rep (fun l => ∑ i, T i l) where - repLorentz_T Λ l := by - rw [map_sum, Finset.sum_congr rfl fun i (_ : i ∈ Finset.univ) => (hT i).repLorentz_T Λ l, - Finset.sum_comm] - exact Finset.sum_congr rfl fun a _ => Finset.smul_sum.symm - -/-- A finite sum of families carrying two dual left-handed Weyl indices is such a family - again. -/ -lemma isBiDualLeftWeyl_sum {M : Type*} [AddCommGroup M] [Module ℂ M] - {rep : Representation ℂ SL(2,ℂ) M} {ι : Type} [Fintype ι] - {T : ι → Fin 2 × Fin 2 → M} (hT : ∀ i, IsBiDualLeftWeyl M rep (T i)) : - IsBiDualLeftWeyl M rep (fun l => ∑ i, T i l) where - repLorentz_T Λ l := by - rw [map_sum, Finset.sum_congr rfl fun i (_ : i ∈ Finset.univ) => (hT i).repLorentz_T Λ l, - Finset.sum_comm] - exact Finset.sum_congr rfl fun a _ => Finset.smul_sum.symm - -/-- A difference of two families carrying two dual left-handed Weyl indices is such a - family again. -/ -lemma isBiDualLeftWeyl_sub {M : Type*} [AddCommGroup M] [Module ℂ M] - {rep : Representation ℂ SL(2,ℂ) M} {T T' : Fin 2 × Fin 2 → M} - (hT : IsBiDualLeftWeyl M rep T) (hT' : IsBiDualLeftWeyl M rep T') : - IsBiDualLeftWeyl M rep (fun l => T l - T' l) where - repLorentz_T Λ l := by - rw [map_sub, hT.repLorentz_T Λ l, hT'.repLorentz_T Λ l, ← Finset.sum_sub_distrib] - exact Finset.sum_congr rfl fun a _ => (smul_sub _ _ _).symm - -/-- A finite sum of bi-fundamental isospin families is such a family again. -/ -lemma IsSU2BiFundamental.sum {M : Type*} [AddCommGroup M] [Module ℂ M] - {rep : Representation ℂ GaugeGroupI M} {ι : Type} [Fintype ι] - {T : ι → (Fin 2 → Fin 2) → M} (hT : ∀ i, IsSU2BiFundamental M rep (T i)) : - IsSU2BiFundamental M rep (fun l => ∑ i, T i l) where - repGauge_T V l := by - rw [map_sum, Finset.sum_congr rfl fun i (_ : i ∈ Finset.univ) => (hT i).repGauge_T V l, - Finset.sum_comm] - exact Finset.sum_congr rfl fun a _ => Finset.smul_sum.symm - -/-- A difference of two families carrying two dual right-handed Weyl indices is such a - family again. -/ -lemma isBiDualRightWeyl_sub {M : Type*} [AddCommGroup M] [Module ℂ M] - {rep : Representation ℂ SL(2,ℂ) M} {T T' : Fin 2 × Fin 2 → M} - (hT : IsBiDualRightWeyl M rep T) (hT' : IsBiDualRightWeyl M rep T') : - IsBiDualRightWeyl M rep (fun l => T l - T' l) where - repLorentz_T Λ l := by - rw [map_sub, hT.repLorentz_T Λ l, hT'.repLorentz_T Λ l, ← Finset.sum_sub_distrib] - exact Finset.sum_congr rfl fun a _ => (smul_sub _ _ _).symm - -/-! - -## G. Weight pieces, symbol ranges and stability - -The last group of shared facts is about the objects a sector-level argument hands the -peeling: a symbol range is the span of the symbol's components against a dual basis, and -the product of two stable submodules is stable. Neither mentions a particular sector. - --/ - -section Bridges - -variable {B : Type} [Ring B] [Algebra ℂ B] - -/-- The range of a symbol map is the span of its components against the dual basis of the - value space. This is the companion of `range_eq_iSup_span`, which reads the same range off - `Module.Basis.coord`; the two families of components are equal, but the components of the - `Families` files are the ones written here. -/ -lemma range_eq_iSup_span_dualBasis {V M : Type} [AddCommGroup V] [Module ℂ V] - [AddCommGroup M] [Module ℂ M] {ι : Type} [Fintype ι] [DecidableEq ι] - (b : Module.Basis ι ℂ V) (F : Module.Dual ℂ V →ₗ[ℂ] M) : - LinearMap.range F = ⨆ j, ℂ ∙ F (b.dualBasis j) := by - rw [LinearMap.range_eq_map, ← b.dualBasis.span_eq, Submodule.map_span, ← Set.range_comp, - Submodule.span_range_eq_iSup] - rfl - -/-- The product of two lines is the line through the product. -/ -lemma span_singleton_mul_span_singleton (a b : B) : (ℂ ∙ a) * (ℂ ∙ b) = ℂ ∙ (a * b) := by - rw [Submodule.span_mul_span, Set.singleton_mul_singleton] - -/-- A product of three spans of families is the span of the products, which is the form in - which a block submodule is compared with the span of its components. -/ -lemma mul_mul_le_of_le {ιa ιb ιc : Type} {VA VB VC X : Submodule ℂ B} {A : ιa → B} - {C : ιb → B} {D : ιc → B} (hA : VA ≤ ⨆ i, ℂ ∙ A i) (hC : VB ≤ ⨆ j, ℂ ∙ C j) - (hD : VC ≤ ⨆ k, ℂ ∙ D k) (hX : ∀ i j k, A i * (C j * D k) ∈ X) : - VA * (VB * VC) ≤ X := by - refine le_trans (mul_le_mul' hA (mul_le_mul' hC hD)) ?_ - rw [Submodule.iSup_mul] - refine iSup_le fun i => ?_ - rw [Submodule.iSup_mul, Submodule.mul_iSup] - refine iSup_le fun j => ?_ - rw [Submodule.mul_iSup, Submodule.mul_iSup] - refine iSup_le fun k => ?_ - rw [span_singleton_mul_span_singleton, span_singleton_mul_span_singleton, - Submodule.span_singleton_le_iff_mem] - exact hX i j k - -/-- A product of two submodules, each inside the join of the lines through a family, lies - in any submodule containing the products of the two families. -/ -lemma mul_le_of_le {ιa ιb : Type} {VA VB X : Submodule ℂ B} {A : ιa → B} {C : ιb → B} - (hA : VA ≤ ⨆ i, ℂ ∙ A i) (hC : VB ≤ ⨆ j, ℂ ∙ C j) (hX : ∀ i j, A i * C j ∈ X) : - VA * VB ≤ X := by - refine le_trans (mul_le_mul' hA hC) ?_ - rw [Submodule.iSup_mul] - refine iSup_le fun i => ?_ - rw [Submodule.mul_iSup] - refine iSup_le fun j => ?_ - rw [span_singleton_mul_span_singleton, Submodule.span_singleton_le_iff_mem] - exact hX i j - -/-- The range of a symbol map is carried into itself by the gauge group: the symbol is - equivariant, so a gauge transformation only moves the dual vector it is evaluated at. -/ -lemma isStableUnder_range_repGauge {M : Type} [AddCommGroup M] [Module ℂ M] - {repGauge : Representation ℂ GaugeGroupI B} {ρ : Representation ℂ GaugeGroupI M} - {F : Module.Dual ℂ M →ₗ[ℂ] B} (hF : ∀ g φ, repGauge g (F φ) = F (ρ.dual g φ)) : - ∀ g : GaugeGroupI, ∀ y ∈ LinearMap.range F, repGauge g y ∈ LinearMap.range F := by - rintro g _ ⟨φ, rfl⟩ - exact ⟨ρ.dual g φ, (hF g φ).symm⟩ - -/-- At zero derivative slots the assignments of derivative directions form a one-element - type, so a sum over them has a single term. -/ -lemma univ_deriv_slots_zero (l : Fin 0 → Fin 1 ⊕ Fin 3) : - (Finset.univ : Finset (Fin 0 → Fin 1 ⊕ Fin 3)) = {l} := - Finset.eq_singleton_iff_unique_mem.mpr - ⟨Finset.mem_univ l, fun x _ => Subsingleton.elim x l⟩ - -/-- The range of an underived symbol map is carried into itself by the Lorentz group: with - no derivative slots to mix, the transformation law moves the dual vector alone. -/ -lemma isStableUnder_range_repLorentz {M : Type} [AddCommGroup M] [Module ℂ M] - {repLorentz : Representation ℂ SL(2,ℂ) B} {ρ : Representation ℂ SL(2,ℂ) M} - {F : {n : ℕ} → (Fin n → Fin 1 ⊕ Fin 3) → Module.Dual ℂ M →ₗ[ℂ] B} - (hF : IsLorentzCovDerivTransforms repLorentz ρ F) (Λ : SL(2,ℂ)) : - ∀ y ∈ LinearMap.range (F (![] : Fin 0 → Fin 1 ⊕ Fin 3)), - repLorentz Λ y ∈ LinearMap.range (F (![] : Fin 0 → Fin 1 ⊕ Fin 3)) := by - rintro _ ⟨φ, rfl⟩ - rw [hF Λ 0 ![] φ, univ_deriv_slots_zero (![] : Fin 0 → Fin 1 ⊕ Fin 3), - Finset.sum_singleton] - simp only [Finset.univ_eq_empty, Finset.prod_empty, one_smul] - exact ⟨ρ.dual Λ φ, rfl⟩ - -/-- A product of two stable submodules is stable, the maps of the family respecting - multiplication. -/ -lemma IsStableUnder.mul {G : Type*} {σ : G → B →ₗ[ℂ] B} - (hσ : ∀ g (a b : B), σ g (a * b) = σ g a * σ g b) {V V' : Submodule ℂ B} - (hV : IsStableUnder σ V) (hV' : IsStableUnder σ V') : IsStableUnder σ (V * V') := - isStableUnder_iff_map.2 fun g => by - rw [Submodule.map_le_iff_le_comap] - refine Submodule.mul_le.2 fun a ha b hb => ?_ - show σ g (a * b) ∈ V * V' - rw [hσ] - exact Submodule.mul_mem_mul (hV g a ha) (hV' g b hb) - -end Bridges - -end StandardModel diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsBiLeftWeyl.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsBiLeftWeyl.lean index 83782dc7c..5898fb3a9 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsBiLeftWeyl.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsBiLeftWeyl.lean @@ -7,6 +7,7 @@ module public import Physlib.Relativity.LorentzGroup.Invariants.IsLeftRightWeyl public import Physlib.Relativity.Fermions.Weyl.Metric +public import Physlib.Mathematics.InvariantReduction /-! # Lorentz invariants of two left-handed Weyl indices @@ -345,14 +346,13 @@ lemma exists_smul_epsilonContraction_of_invariant_subset {x : B} (S : Submodule (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) (hx : x ∈ componentSpan T ⊔ S) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : ∃ a : ℂ, ∃ y ∈ S, x = a • epsilonContraction (T := T) + y := by - obtain ⟨a, hcomb⟩ := (hT.isBiLeftWeyl_quotient S hS).exists_smul_epsilonContraction_of_invariant - (mkQ_mem_componentSpan T S hx) fun g => by rw [quotient_apply_mkQ, hinv g] - 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 + obtain ⟨a, y, hy, rfl, -⟩ := IsStableUnder.exists_smul_add_of_quotient + (σ := fun g : SL(2,ℂ) => repLorentz g) hS hT.repLorentz_epsilonContraction + (fun z hz hzinv => by + rw [mkQ_epsilonContraction] + exact (hT.isBiLeftWeyl_quotient S hS).exists_smul_epsilonContraction_of_invariant + ((Submodule.map_iSup_span_singleton S.mkQ T).le hz) hzinv) hx hinv + exact ⟨a, y, hy, rfl⟩ end IsBiLeftWeyl @@ -363,7 +363,8 @@ end IsBiLeftWeyl `IsBiDualLeftWeyl` and `IsBiDualRightWeyl` are the laws the Standard Model's fermion symbols carry: one factor of `(g⁻¹)ᵀ` per index for an undotted pair, one of `(g⁻¹)ᴴ` for a dotted pair; `isBiDualLeftWeyl_dualLeftHandedWeyl` and `isBiDualRightWeyl_dualRightHandedWeyl` pin -them to the tensor squares of the repository's dual Weyl representations. The re-index +them to the tensor squares of the repository's dual Weyl representations, and both laws are +closed under finite sums and differences of families. The re-index `epsReindex` sends both slots through `ε`: it converts the undotted law into the fundamental one for the same representation, is an involution, leaves the span unchanged and leaves the `ε` contraction exactly as it was, with no sign or scalar. For a dotted family the same @@ -422,6 +423,48 @@ lemma isBiDualRightWeyl_dualRightHandedWeyl : exact Finset.sum_congr rfl fun x _ => Finset.sum_congr rfl fun y _ => by rw [mul_comm] +/-- A finite sum of families carrying two dual left-handed Weyl indices is such a family + again. -/ +lemma IsBiDualLeftWeyl.sum {M : Type*} [AddCommGroup M] [Module ℂ M] + {rep : Representation ℂ SL(2,ℂ) M} {ι : Type} [Fintype ι] + {T : ι → Fin 2 × Fin 2 → M} (hT : ∀ i, IsBiDualLeftWeyl M rep (T i)) : + IsBiDualLeftWeyl M rep (fun l => ∑ i, T i l) where + repLorentz_T Λ l := by + rw [map_sum, Finset.sum_congr rfl fun i (_ : i ∈ Finset.univ) => (hT i).repLorentz_T Λ l, + Finset.sum_comm] + exact Finset.sum_congr rfl fun a _ => Finset.smul_sum.symm + +/-- A difference of two families carrying two dual left-handed Weyl indices is such a + family again. -/ +lemma IsBiDualLeftWeyl.sub {M : Type*} [AddCommGroup M] [Module ℂ M] + {rep : Representation ℂ SL(2,ℂ) M} {T T' : Fin 2 × Fin 2 → M} + (hT : IsBiDualLeftWeyl M rep T) (hT' : IsBiDualLeftWeyl M rep T') : + IsBiDualLeftWeyl M rep (fun l => T l - T' l) where + repLorentz_T Λ l := by + rw [map_sub, hT.repLorentz_T Λ l, hT'.repLorentz_T Λ l, ← Finset.sum_sub_distrib] + exact Finset.sum_congr rfl fun a _ => (smul_sub _ _ _).symm + +/-- A finite sum of families carrying two dual right-handed Weyl indices is such a family + again. -/ +lemma IsBiDualRightWeyl.sum {M : Type*} [AddCommGroup M] [Module ℂ M] + {rep : Representation ℂ SL(2,ℂ) M} {ι : Type} [Fintype ι] + {T : ι → Fin 2 × Fin 2 → M} (hT : ∀ i, IsBiDualRightWeyl M rep (T i)) : + IsBiDualRightWeyl M rep (fun l => ∑ i, T i l) where + repLorentz_T Λ l := by + rw [map_sum, Finset.sum_congr rfl fun i (_ : i ∈ Finset.univ) => (hT i).repLorentz_T Λ l, + Finset.sum_comm] + exact Finset.sum_congr rfl fun a _ => Finset.smul_sum.symm + +/-- A difference of two families carrying two dual right-handed Weyl indices is such a + family again. -/ +lemma IsBiDualRightWeyl.sub {M : Type*} [AddCommGroup M] [Module ℂ M] + {rep : Representation ℂ SL(2,ℂ) M} {T T' : Fin 2 × Fin 2 → M} + (hT : IsBiDualRightWeyl M rep T) (hT' : IsBiDualRightWeyl M rep T') : + IsBiDualRightWeyl M rep (fun l => T l - T' l) where + repLorentz_T Λ l := by + rw [map_sub, hT.repLorentz_T Λ l, hT'.repLorentz_T Λ l, ← Finset.sum_sub_distrib] + exact Finset.sum_congr rfl fun a _ => (smul_sub _ _ _).symm + /-- The `ε` re-index of a family indexed by two Weyl indices: both index slots are transported through the symplectic form. -/ noncomputable def epsReindex {B : Type*} [AddCommMonoid B] [Module ℂ B] @@ -604,6 +647,26 @@ theorem IsBiDualRightWeyl.exists_smul_epsilonContraction_of_invariant_subset hT.isBiDualLeftWeyl_comp.exists_smul_epsilonContraction_of_invariant_subset S (fun g y hy => hS (SL2C.conjHom g) y hy) hx fun g => hinv (SL2C.conjHom g) +/-- For the undotted dual law, the Lorentz invariants of the component span reduce to the span + of the `ε` contraction. -/ +noncomputable def IsBiDualLeftWeyl.invariantReductionToSpan + (hT : IsBiDualLeftWeyl B repLorentz T) : + InvariantReductionToSpan (fun g : SL(2,ℂ) => repLorentz g) (⨆ l, ℂ ∙ T l) where + spanningVector := IsBiLeftWeyl.epsilonContraction (T := T) + stable := isStableUnder_iSup_span_singleton_of_sum fun g l => ⟨_, hT.repLorentz_T g l⟩ + spanningVector_fixed := hT.repLorentz_epsilonContraction + reduce S hS _ hx hinv := hT.exists_smul_epsilonContraction_of_invariant_subset S hS hx hinv + +/-- For the dotted dual law, the Lorentz invariants of the component span reduce to the span + of the `ε` contraction. -/ +noncomputable def IsBiDualRightWeyl.invariantReductionToSpan + (hT : IsBiDualRightWeyl B repLorentz T) : + InvariantReductionToSpan (fun g : SL(2,ℂ) => repLorentz g) (⨆ l, ℂ ∙ T l) where + spanningVector := IsBiLeftWeyl.epsilonContraction (T := T) + stable := isStableUnder_iSup_span_singleton_of_sum fun g l => ⟨_, hT.repLorentz_T g l⟩ + spanningVector_fixed := hT.repLorentz_epsilonContraction + reduce S hS _ hx hinv := hT.exists_smul_epsilonContraction_of_invariant_subset S hS hx hinv + end DualClassification end Lorentz diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsLeftRightWeyl.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsLeftRightWeyl.lean index 181a67f32..3a3633b48 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsLeftRightWeyl.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsLeftRightWeyl.lean @@ -6,6 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Relativity.LorentzGroup.Invariants.LorentzCovariance +public import Physlib.Mathematics.InvariantReduction public import Physlib.Relativity.Fermions.Weyl.BoostWeight /-! # Lorentz invariants of a left-handed and a right-handed Weyl index @@ -322,9 +323,12 @@ include hT in lemma mem_of_invariant_of_mem_sup {x : B} (S : Submodule ℂ B) (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) (hx : x ∈ componentSpan T ⊔ S) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by - have hzero := (hT.isLeftRightWeyl_quotient S hS).eq_zero_of_invariant - (mkQ_mem_componentSpan T S hx) fun g => by rw [quotient_apply_mkQ, hinv g] - rwa [← Submodule.ker_mkQ S, LinearMap.mem_ker] + have h := IsStableUnder.mem_sup_of_quotient (σ := fun g : SL(2,ℂ) => repLorentz g) (W := ⊥) hS + (fun y hy hyinv => by + rw [Submodule.map_bot, Submodule.mem_bot] + exact (hT.isLeftRightWeyl_quotient S hS).eq_zero_of_invariant + ((Submodule.map_iSup_span_singleton S.mkQ T).le hy) hyinv) hx hinv + rwa [bot_sup_eq] at h end IsLeftRightWeyl diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsVectorLeftRightWeyl.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsVectorLeftRightWeyl.lean index fd1f6c3e9..59f07dac2 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsVectorLeftRightWeyl.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsVectorLeftRightWeyl.lean @@ -588,6 +588,15 @@ theorem exists_smul_pauliBarContraction_of_invariant_subset S hS (by rwa [componentSpan_vectorEpsReindex]) hinv exact ⟨a, y, hy, by rwa [pauliContraction_vectorEpsReindex] at ha⟩ +/-- For the mixed dual law, the Lorentz invariants of the component span reduce to the span + of the `pauliBar` contraction. -/ +noncomputable def invariantReductionToSpan (hT : IsVectorDualLeftRightWeyl B repLorentz T) : + InvariantReductionToSpan (fun g : SL(2,ℂ) => repLorentz g) (⨆ q, ℂ ∙ T q) where + spanningVector := pauliBarContraction (T := T) + stable := isStableUnder_iSup_span_singleton_of_sum fun g q => ⟨_, hT.repLorentz_T' g q⟩ + spanningVector_fixed := hT.repLorentz_pauliBarContraction + reduce S hS _ hx hinv := hT.exists_smul_pauliBarContraction_of_invariant_subset S hS hx hinv + end IsVectorDualLeftRightWeyl end DualClassification diff --git a/Physlib/Relativity/LorentzGroup/Invariants/LorentzCovariance.lean b/Physlib/Relativity/LorentzGroup/Invariants/LorentzCovariance.lean index 18a9b6c1d..1c6d7ca11 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/LorentzCovariance.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/LorentzCovariance.lean @@ -76,22 +76,6 @@ lemma sum_smul_mem_componentSpan (T : ι → B) (c : ι → ℂ) : ∑ i, c i end Span -section SpanQuotient - -variable {ι B : Type*} [Fintype ι] [AddCommGroup B] [Module ℂ B] - -/-- Taking classes modulo a submodule `S` carries `componentSpan T ⊔ S` into the span of the - classes of the components. -/ -lemma mkQ_mem_componentSpan (T : ι → B) (S : Submodule ℂ B) {x : B} - (hx : x ∈ componentSpan T ⊔ S) : S.mkQ x ∈ componentSpan fun i => S.mkQ (T i) := by - obtain ⟨u, hu, z, hz, rfl⟩ := Submodule.mem_sup.1 hx - obtain ⟨c, rfl⟩ := (mem_componentSpan_iff T u).1 hu - refine (mem_componentSpan_iff _ _).2 ⟨c, ?_⟩ - rw [map_add, show S.mkQ z = 0 from (Submodule.Quotient.mk_eq_zero S).2 hz, add_zero, map_sum] - exact Finset.sum_congr rfl fun i _ => map_smul _ _ _ - -end SpanQuotient - /-! ## B. Families transforming with one Lorentz matrix per index diff --git a/Physlib/Relativity/LorentzGroup/Invariants/RankFour.lean b/Physlib/Relativity/LorentzGroup/Invariants/RankFour.lean index 3fcf72fd3..880a778af 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/RankFour.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/RankFour.lean @@ -7,6 +7,7 @@ module public import Physlib.Relativity.LorentzGroup.Invariants.LightCone public import Physlib.Relativity.LorentzGroup.Invariants.LorentzCovariance +public import Physlib.Mathematics.InvariantReduction public import Physlib.Mathematics.LeviCivita.Basic public import Mathlib.LinearAlgebra.Matrix.Determinant.Basic /-! @@ -775,12 +776,11 @@ theorem exists_eq_sum {c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ} (hc : IsInvarian ## H. The classification, and the classification modulo a stable submodule C to G give `exists_smul_contraction_of_invariant`, the case `S = ⊥` of the theorem. For -general `S`, right to left is immediate and does not use `hS`; left to right passes to the -quotient `B ⧸ S`, that is `B` with `S` declared zero and `S.mkQ` the map to classes. Stability -lets `repLorentz` act there and the classes of the components again form a rank-four family, -both by `IsLorentzCovariant.quotient`, so back in `B` the difference between `x` and the -matching combination of contractions has zero class, hence lies in `S`, and is invariant as a -difference of invariants. +general `S`, right to left is immediate and does not use `hS`. Left to right passes to the +quotient `B ⧸ S`: the classes of the components again form a rank-four family +(`IsLorentzCovariant.quotient`), the classification applies there, and +`IsStableUnder.exists_add_of_quotient` lifts it back. The four contractions are invariant, so +the remainder in `S` is invariant. -/ /-- Every Lorentz invariant of the span is a combination of the four contractions. -/ @@ -796,6 +796,12 @@ theorem exists_smul_contraction_of_invariant (hT : IsLorentzCovariant 4 B repLor simp only [contraction_eq, Finset.smul_sum, Finset.sum_smul, smul_smul] exact Finset.sum_comm +/-- The quotient map carries each contraction to the same contraction of the images. -/ +lemma mkQ_contraction (S : Submodule ℂ B) (i : Fin 4) : + S.mkQ (contraction T i) = contraction (fun l => S.mkQ (T l)) i := by + rw [contraction_eq, contraction_eq, map_sum] + exact Finset.sum_congr rfl fun d _ => map_smul _ _ _ + /-- Left to right in `mem_span_sup_invariant_iff`, proved in the quotient by `S`. -/ lemma exists_smul_contraction_of_invariant_subset (hT : IsLorentzCovariant 4 B repLorentz T) {x : B} (S : Submodule ℂ B) @@ -805,16 +811,18 @@ lemma exists_smul_contraction_of_invariant_subset x = a₁ • outerContraction T + a₂ • innerContraction T + a₃ • splitContraction T + a₄ • epsilonContraction T + y ∧ ∀ g : SL(2,ℂ), repLorentz g y = y := by - obtain ⟨a₁, a₂, a₃, a₄, hcomb⟩ := exists_smul_contraction_of_invariant (hT.quotient S hS) - (mkQ_mem_componentSpan T S hx) fun g => by rw [quotient_apply_mkQ, hinv g] - refine ⟨a₁, a₂, a₃, a₄, - x - (a₁ • outerContraction T + a₂ • innerContraction T + a₃ • splitContraction T - + a₄ • epsilonContraction T), ?_, by abel, fun g => ?_⟩ - · rw [← Submodule.ker_mkQ S, LinearMap.mem_ker, map_sub, hcomb] - simp only [outerContraction, innerContraction, splitContraction, epsilonContraction, - map_add, map_smul, map_sum] - abel - · rw [map_sub, hinv g, repLorentz_smul_contraction hT a₁ a₂ a₃ a₄ g] + obtain ⟨w, hw, y, hy, rfl, hyinv⟩ := IsStableUnder.exists_add_of_quotient + (σ := fun g : SL(2,ℂ) => repLorentz g) hS + (isFixedBy_iSup_span_singleton fun i g => repLorentz_contraction hT i g) + (fun z hz hzinv => by + obtain ⟨a₁, a₂, a₃, a₄, hz'⟩ := exists_smul_contraction_of_invariant (hT.quotient S hS) + ((Submodule.map_iSup_span_singleton S.mkQ T).le hz) hzinv + rw [hz', Submodule.map_iSup_span_singleton] + simp only [mkQ_contraction] + exact (mem_componentSpan_iff _ _).2 ⟨![a₁, a₂, a₃, a₄], by simp [sum_smul_contraction]⟩) + hx hinv + obtain ⟨a, rfl⟩ := (mem_componentSpan_iff (contraction T) w).1 hw + exact ⟨a 0, a 1, a 2, a 3, y, hy, by rw [sum_smul_contraction], hyinv⟩ /-- A vector of `componentSpan T ⊔ S`, the sums `u + y` with `u` in the span and `y` in the Lorentz-stable subspace `S`, is invariant exactly when it is a combination of the four diff --git a/Physlib/Relativity/LorentzGroup/Invariants/RankOne.lean b/Physlib/Relativity/LorentzGroup/Invariants/RankOne.lean index fd39780e3..f53f672b3 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/RankOne.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/RankOne.lean @@ -6,6 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Relativity.LorentzGroup.Invariants.LorentzCovariance +public import Physlib.Mathematics.InvariantReduction /-! # Lorentz invariants of a single four-vector index @@ -128,9 +129,12 @@ section B applies there and an invariant of `componentSpan T ⊔ S` lies in `S`. lemma mem_of_invariant_of_mem_sup (hT : IsLorentzCovariant 1 B repLorentz T) {x : B} (S : Submodule ℂ B) (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) (hx : x ∈ componentSpan T ⊔ S) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by - have hzero := eq_zero_of_invariant (hT.quotient S hS) (mkQ_mem_componentSpan T S hx) - fun g => by rw [quotient_apply_mkQ, hinv g] - rwa [← Submodule.ker_mkQ S, LinearMap.mem_ker] + have h := IsStableUnder.mem_sup_of_quotient (σ := fun g : SL(2,ℂ) => repLorentz g) (W := ⊥) hS + (fun y hy hyinv => by + rw [Submodule.map_bot, Submodule.mem_bot] + exact eq_zero_of_invariant (hT.quotient S hS) + ((Submodule.map_iSup_span_singleton S.mkQ T).le hy) hyinv) hx hinv + rwa [bot_sup_eq] at h end RankOne diff --git a/Physlib/Relativity/LorentzGroup/Invariants/RankThree.lean b/Physlib/Relativity/LorentzGroup/Invariants/RankThree.lean index f3bd00dd5..8d276eb16 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/RankThree.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/RankThree.lean @@ -6,6 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Relativity.LorentzGroup.Invariants.LorentzCovariance +public import Physlib.Mathematics.InvariantReduction public meta import Mathlib.Data.Fintype.Sum public meta import Mathlib.Data.Fintype.Pi /-! @@ -217,9 +218,12 @@ section B applies there and an invariant of `componentSpan T ⊔ S` lies in `S`. lemma mem_of_invariant_of_mem_sup (hT : IsLorentzCovariant 3 B repLorentz T) {x : B} (S : Submodule ℂ B) (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) (hx : x ∈ componentSpan T ⊔ S) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x ∈ S := by - have hzero := eq_zero_of_invariant (hT.quotient S hS) (mkQ_mem_componentSpan T S hx) - fun g => by rw [quotient_apply_mkQ, hinv g] - rwa [← Submodule.ker_mkQ S, LinearMap.mem_ker] + have h := IsStableUnder.mem_sup_of_quotient (σ := fun g : SL(2,ℂ) => repLorentz g) (W := ⊥) hS + (fun y hy hyinv => by + rw [Submodule.map_bot, Submodule.mem_bot] + exact eq_zero_of_invariant (hT.quotient S hS) + ((Submodule.map_iSup_span_singleton S.mkQ T).le hy) hyinv) hx hinv + rwa [bot_sup_eq] at h end RankThree diff --git a/Physlib/Relativity/LorentzGroup/Invariants/RankTwo.lean b/Physlib/Relativity/LorentzGroup/Invariants/RankTwo.lean index 8447b0492..4006c0fa2 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/RankTwo.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/RankTwo.lean @@ -7,6 +7,7 @@ module public import Physlib.Relativity.LorentzGroup.Invariants.LightCone public import Physlib.Relativity.LorentzGroup.Invariants.LorentzCovariance +public import Physlib.Mathematics.InvariantReduction public meta import Mathlib.Data.Fintype.Sum public meta import Mathlib.Data.Fintype.Pi /-! @@ -477,14 +478,13 @@ lemma exists_smul_metricContraction_of_invariant_subset (hS : ∀ g : SL(2,ℂ), ∀ y ∈ S, repLorentz g y ∈ S) (hx : x ∈ componentSpan T ⊔ S) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : ∃ a : ℂ, ∃ y ∈ S, x = a • metricContraction (T := T) + y := by - obtain ⟨a, hcomb⟩ := exists_smul_metricContraction_of_invariant (hT.quotient S hS) - (mkQ_mem_componentSpan T S hx) fun g => by rw [quotient_apply_mkQ, hinv g] - 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 + obtain ⟨a, y, hy, rfl, -⟩ := IsStableUnder.exists_smul_add_of_quotient + (σ := fun g : SL(2,ℂ) => repLorentz g) hS (repLorentz_metricContraction hT) + (fun z hz hzinv => by + rw [mkQ_metricContraction] + exact exists_smul_metricContraction_of_invariant (hT.quotient S hS) + ((Submodule.map_iSup_span_singleton S.mkQ T).le hz) hzinv) hx hinv + exact ⟨a, y, hy, rfl⟩ end RankTwo From 7b8ea34b09e9002cc66957be7f84d6129de11878 Mon Sep 17 00:00:00 2001 From: doxtor6 Date: Wed, 23 Sep 2026 13:27:37 -0400 Subject: [PATCH 356/367] refactor: Move TransformsIn and InfinitesimalAction from LocalGaugeData/ to MatterField/ MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `LocalGaugeData.TransformsIn` (gauge tensors in a representation) and `LocalGaugeData.IsInfinitesimalActionOf` with the covariance of the covariant derivative are statements about a matter representation on `JetRing ⊗ V`, and they import the matter covariant derivative and the gauge-boson realizations. They now live in `MatterField/`, so that `LocalGaugeData/` no longer imports anything above it. Names and namespaces are unchanged; only the module paths and the imports of their users move. Co-authored-by: Claude Opus 4.8 --- Physlib.lean | 4 ++-- .../ClassicalFieldTheory/GaugeTheory/MatterField/Basic.lean | 2 +- .../GaugeTheory/MatterField/CovariantDeriv.lean | 4 ++-- .../{LocalGaugeData => MatterField}/InfinitesimalAction.lean | 2 +- .../GaugeTheory/MatterField/LorentzCovariantDeriv.lean | 2 +- .../GaugeTheory/MatterField/MatrixRep/Basic.lean | 2 +- .../{LocalGaugeData => MatterField}/TransformsIn.lean | 2 +- .../Particles/StandardModel/Fermions/DownSinglet/Basic.lean | 2 +- .../Fermions/DownSinglet/GaugeAlgebraAction.lean | 2 +- .../Particles/StandardModel/Fermions/JetAlgebra/Species.lean | 2 +- .../Particles/StandardModel/Fermions/LeptonDoublet/Basic.lean | 2 +- .../Fermions/LeptonDoublet/GaugeAlgebraAction.lean | 2 +- .../Fermions/LeptonSinglet/GaugeAlgebraAction.lean | 2 +- .../Particles/StandardModel/Fermions/QuarkDoublet/Basic.lean | 2 +- .../Fermions/QuarkDoublet/GaugeAlgebraAction.lean | 2 +- Physlib/Particles/StandardModel/Fermions/UpSinglet/Basic.lean | 2 +- .../StandardModel/Fermions/UpSinglet/GaugeAlgebraAction.lean | 2 +- .../Particles/StandardModel/GaugeGroup/LocalGaugeData.lean | 2 +- .../StandardModel/HiggsBoson/GaugeAlgebraAction.lean | 2 +- 19 files changed, 21 insertions(+), 21 deletions(-) rename Physlib/ClassicalFieldTheory/GaugeTheory/{LocalGaugeData => MatterField}/InfinitesimalAction.lean (99%) rename Physlib/ClassicalFieldTheory/GaugeTheory/{LocalGaugeData => MatterField}/TransformsIn.lean (98%) diff --git a/Physlib.lean b/Physlib.lean index 065d2a852..d7a6081f4 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -45,18 +45,17 @@ public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.SectorR public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.TransformsIn public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.AdjointCoeff public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Basic -public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.MaurerCartan public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.OfFactors public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Prod public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.SU.Algebra public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.SU.Basic -public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.TransformsIn public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Truncation public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.U1 public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.Charge public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.CovariantDeriv +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.InfinitesimalAction public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.GaugeAction public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.TransformsIn @@ -67,6 +66,7 @@ public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.MatrixRep.Fac public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.MatrixRep.Table public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.Pi public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.Prod +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.TransformsIn public import Physlib.ClassicalFieldTheory.Local.Variation public import Physlib.ClassicalMechanics.Basic public import Physlib.ClassicalMechanics.DampedHarmonicOscillator.Basic diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Basic.lean index 6d8fe6530..8082ba3ea 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/Basic.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.InfinitesimalAction /-! # Matter fields of a gauge theory diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/CovariantDeriv.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/CovariantDeriv.lean index ac007b0d2..254fcc80c 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/CovariantDeriv.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/CovariantDeriv.lean @@ -34,7 +34,7 @@ and with them of `V`, the analogue of `adjointDualCoeff` for a general representation; The gauge tensors of a representation themselves — `LocalGaugeData.TransformsIn`, the generalization of `TransformsInAdjoint` — are defined on top of `repDualCoeff` in -`Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.TransformsIn`. +`Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.TransformsIn`. ## The covariant derivative @@ -50,7 +50,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.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction`. +in `Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.InfinitesimalAction`. -/ diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/InfinitesimalAction.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/InfinitesimalAction.lean similarity index 99% rename from Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/InfinitesimalAction.lean rename to Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/InfinitesimalAction.lean index 066f02426..bffbd752b 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/InfinitesimalAction.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/InfinitesimalAction.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.TransformsIn +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.TransformsIn public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.JetRep /-! # The infinitesimal action underlying a matter representation diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/LorentzCovariantDeriv.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/LorentzCovariantDeriv.lean index c35fdbf90..578b7ead3 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/LorentzCovariantDeriv.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/LorentzCovariantDeriv.lean @@ -5,7 +5,7 @@ Authors: Joseph Tooby-Smith, Nathaneal Sajan -/ module -public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.InfinitesimalAction public import Physlib.Relativity.LorentzMix /-! # The Lorentz law of the covariant derivatives of a matter family diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Basic.lean index e8366a1b5..acba52e96 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Basic.lean @@ -6,7 +6,7 @@ Authors: Jinzheng Li module public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.Basic -public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.InfinitesimalAction public import Mathlib.LinearAlgebra.TensorProduct.Pi public import Mathlib.LinearAlgebra.Matrix.ToLin /-! diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/TransformsIn.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/TransformsIn.lean similarity index 98% rename from Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/TransformsIn.lean rename to Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/TransformsIn.lean index d048264dd..be1baf9a3 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/TransformsIn.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/TransformsIn.lean @@ -19,7 +19,7 @@ convolution of the base-point Taylor coefficients `repDualCoeff` of `rep` agains lower symbols, with no inhomogeneous term. This is the generalization of `TransformsInAdjoint` from the adjoint representation to an arbitrary one, and the property preserved by the covariant derivative in -`Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction`. +`Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.InfinitesimalAction`. Nothing here depends on the local gauge data beyond the group `GJ` acting; the definition lives in the `LocalGaugeData` namespace with the transformation laws that consume it. diff --git a/Physlib/Particles/StandardModel/Fermions/DownSinglet/Basic.lean b/Physlib/Particles/StandardModel/Fermions/DownSinglet/Basic.lean index 72d54343a..267e787c6 100644 --- a/Physlib/Particles/StandardModel/Fermions/DownSinglet/Basic.lean +++ b/Physlib/Particles/StandardModel/Fermions/DownSinglet/Basic.lean @@ -9,7 +9,7 @@ public import Physlib.Particles.StandardModel.GaugeGroup.Basic public import Physlib.Relativity.Fermions.Weyl.BoostWeight public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.JetGaugeGroup.Basic -public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.InfinitesimalAction public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.JetComponentSpace.GaugeAction public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeFieldAlgebra.GaugeAction diff --git a/Physlib/Particles/StandardModel/Fermions/DownSinglet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/DownSinglet/GaugeAlgebraAction.lean index 81a834be7..8ab55cbb8 100644 --- a/Physlib/Particles/StandardModel/Fermions/DownSinglet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/DownSinglet/GaugeAlgebraAction.lean @@ -6,7 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.Fermions.DownSinglet.Basic -public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.InfinitesimalAction public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeFieldAlgebra.GaugeAction public import Mathlib.LinearAlgebra.TensorProduct.Pi diff --git a/Physlib/Particles/StandardModel/Fermions/JetAlgebra/Species.lean b/Physlib/Particles/StandardModel/Fermions/JetAlgebra/Species.lean index 5e1517925..1bb49a15c 100644 --- a/Physlib/Particles/StandardModel/Fermions/JetAlgebra/Species.lean +++ b/Physlib/Particles/StandardModel/Fermions/JetAlgebra/Species.lean @@ -6,7 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.Fermions.JetAlgebra.Basic -public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.InfinitesimalAction public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData /-! # Species compatibility inside the fermionic target space diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/Basic.lean b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/Basic.lean index c6058f3c5..30e57b244 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/Basic.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/Basic.lean @@ -9,7 +9,7 @@ public import Physlib.Particles.StandardModel.GaugeGroup.Basic public import Physlib.Relativity.Fermions.Weyl.BoostWeight public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.JetGaugeGroup.Basic -public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.InfinitesimalAction public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData public import Physlib.Particles.StandardModel.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.MatrixRep.Table diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean index 87cd1df4a..9a2acba36 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonDoublet/GaugeAlgebraAction.lean @@ -6,7 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.Fermions.LeptonDoublet.Basic -public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.InfinitesimalAction public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeFieldAlgebra.GaugeAction public import Mathlib.LinearAlgebra.TensorProduct.Pi diff --git a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/GaugeAlgebraAction.lean index 4233a293b..610892218 100644 --- a/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/LeptonSinglet/GaugeAlgebraAction.lean @@ -6,7 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.Fermions.LeptonSinglet.Basic -public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.InfinitesimalAction public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeFieldAlgebra.GaugeAction /-! diff --git a/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/Basic.lean b/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/Basic.lean index 286fc1ab4..424be96de 100644 --- a/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/Basic.lean +++ b/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/Basic.lean @@ -9,7 +9,7 @@ public import Physlib.Particles.StandardModel.GaugeGroup.Basic public import Physlib.Relativity.Fermions.Weyl.BoostWeight public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.JetGaugeGroup.Basic -public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.InfinitesimalAction public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData public import Physlib.Relativity.Fermions.Weyl.LeftHanded public import Physlib.Relativity.Fermions.Weyl.RightHanded diff --git a/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/GaugeAlgebraAction.lean index d378f9266..603aa49ed 100644 --- a/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/QuarkDoublet/GaugeAlgebraAction.lean @@ -6,7 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.Fermions.QuarkDoublet.Basic -public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.InfinitesimalAction public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeFieldAlgebra.GaugeAction public import Mathlib.LinearAlgebra.TensorProduct.Pi diff --git a/Physlib/Particles/StandardModel/Fermions/UpSinglet/Basic.lean b/Physlib/Particles/StandardModel/Fermions/UpSinglet/Basic.lean index 4b5491881..c5c3690de 100644 --- a/Physlib/Particles/StandardModel/Fermions/UpSinglet/Basic.lean +++ b/Physlib/Particles/StandardModel/Fermions/UpSinglet/Basic.lean @@ -9,7 +9,7 @@ public import Physlib.Particles.StandardModel.GaugeGroup.Basic public import Physlib.Relativity.Fermions.Weyl.BoostWeight public import Physlib.Particles.StandardModel.GaugeGroup.GaugeWeightDecomposition public import Physlib.Particles.StandardModel.GaugeGroup.JetGaugeGroup.Basic -public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.InfinitesimalAction public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData public import Physlib.Relativity.Tensors.ComplexTensor.Basic public import Mathlib.LinearAlgebra.TensorProduct.Pi diff --git a/Physlib/Particles/StandardModel/Fermions/UpSinglet/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/Fermions/UpSinglet/GaugeAlgebraAction.lean index a140f4b93..5f9a70ffd 100644 --- a/Physlib/Particles/StandardModel/Fermions/UpSinglet/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/Fermions/UpSinglet/GaugeAlgebraAction.lean @@ -6,7 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.Fermions.UpSinglet.Basic -public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.InfinitesimalAction public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeFieldAlgebra.GaugeAction public import Mathlib.LinearAlgebra.TensorProduct.Pi diff --git a/Physlib/Particles/StandardModel/GaugeGroup/LocalGaugeData.lean b/Physlib/Particles/StandardModel/GaugeGroup/LocalGaugeData.lean index 3b820d1d3..c10298621 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/LocalGaugeData.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/LocalGaugeData.lean @@ -5,7 +5,7 @@ Authors: Nathaneal Sajan -/ module -public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.InfinitesimalAction public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Truncation public import Physlib.Particles.StandardModel.GaugeGroup.MaurerCartan.Basic public import Physlib.Particles.StandardModel.Basic diff --git a/Physlib/Particles/StandardModel/HiggsBoson/GaugeAlgebraAction.lean b/Physlib/Particles/StandardModel/HiggsBoson/GaugeAlgebraAction.lean index ba405d9e0..f7e8e943a 100644 --- a/Physlib/Particles/StandardModel/HiggsBoson/GaugeAlgebraAction.lean +++ b/Physlib/Particles/StandardModel/HiggsBoson/GaugeAlgebraAction.lean @@ -6,7 +6,7 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.HiggsBoson.JetAlgebra.Basic -public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.InfinitesimalAction +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.InfinitesimalAction public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData public import Physlib.ClassicalFieldTheory.GaugeTheory.GaugeBoson.LocalGaugeFieldAlgebra.GaugeAction public import Mathlib.LinearAlgebra.TensorProduct.Pi From 7c6a6ed0c3aaae493aef550075fe921b8ae09e5e Mon Sep 17 00:00:00 2001 From: doxtor6 Date: Wed, 23 Sep 2026 13:27:37 -0400 Subject: [PATCH 357/367] refactor: Move U1Factor, SUFactor, Factor and Factors to LocalGaugeData/Factor.lean The factors of a gauge group (`LocalGaugeData.U1Factor`, `SUFactor`, `Factor`, `Factors`) describe the local gauge data, not matter: their fields mention only the gauge jets, the gauge algebra and the jet ring. They move from `MatterField/MatrixRep/Factors.lean` and `MatterField/MatrixRep/Table.lean` into the new `LocalGaugeData/Factor.lean`, and `U1.lean`, `SU/Basic.lean`, `Prod.lean` and `OfFactors.lean` import that file instead of the matrix-representation layer. `MatrixRep/Factors.lean` keeps the charge twist and the fundamental representation. `StandardModel/Basic.lean` imports the table file directly, which it previously received through `OfFactors`. Co-authored-by: Claude Opus 4.8 --- Physlib.lean | 1 + .../GaugeTheory/LocalGaugeData/Factor.lean | 131 ++++++++++++++++++ .../GaugeTheory/LocalGaugeData/OfFactors.lean | 1 - .../GaugeTheory/LocalGaugeData/Prod.lean | 2 +- .../GaugeTheory/LocalGaugeData/SU/Basic.lean | 2 +- .../GaugeTheory/LocalGaugeData/U1.lean | 2 +- .../MatterField/MatrixRep/Factors.lean | 80 ++--------- .../MatterField/MatrixRep/Table.lean | 25 +--- Physlib/Particles/StandardModel/Basic.lean | 1 + 9 files changed, 156 insertions(+), 89 deletions(-) create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Factor.lean diff --git a/Physlib.lean b/Physlib.lean index d7a6081f4..b3e7f1ce3 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -45,6 +45,7 @@ public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.SectorR public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.TransformsIn public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.AdjointCoeff public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Basic +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Factor public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.MaurerCartan public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.OfFactors public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Prod diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Factor.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Factor.lean new file mode 100644 index 000000000..5c868370e --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Factor.lean @@ -0,0 +1,131 @@ +/- +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.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Basic +/-! +# The factors of a gauge group + +## i. Overview + +A gauge group is presented, as in a model-building table, by its factors: `U(1)` factors +and `SU(n)` factors. This file says what a factor of a local gauge data package is, without +reference to matter: + +* `LocalGaugeData.U1Factor` : a unitary jet `u U` attached to each gauge jet, with the + matching components `φ`, `φJ` of the gauge algebra and its jets, related by the + Maurer–Cartan form `φJ (ω_μ U) = i (∂_μ u) u⁻¹` and invariant under the adjoint action; +* `LocalGaugeData.SUFactor` : a unitary matrix of jets `u U` attached to each gauge jet, + with the matching matrix components `φ`, `φJ`, related by the Maurer–Cartan form + `φJ (ω_μ U) = i (∂_μ u) u⁻¹` and transforming by conjugation under the adjoint action; +* `LocalGaugeData.Factor`, `Factors` : a factor of either kind, and a gauge group as a + list of factors. + +The canonical factors of the concrete packages are `LocalGaugeData.u1Factor` and +`LocalGaugeData.suFactor`, the lifts of factors along a product are in +`Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Prod`, and the representations +a factor names (the charge twist, the fundamental) are built in +`Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.MatrixRep.Factors`. + +## ii. Key results + +- `LocalGaugeData.U1Factor` : a `U(1)` factor of the local gauge data. +- `LocalGaugeData.SUFactor` : an `SU(n)` factor of the local gauge data. +- `LocalGaugeData.Factor`, `LocalGaugeData.Factors` : a gauge group presented by its factors. + +## iii. Table of contents + +- A. `U(1)` factors +- B. `SU(n)` factors +- C. A gauge group as a list of factors + +-/ + +@[expose] public section + +open MvPowerSeries + +namespace LocalGaugeData + +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + +/-! + +## A. `U(1)` factors + +-/ + +/-- **A `U(1)` factor** of the local gauge data: a unitary jet `u U` attached to each gauge + jet, with the corresponding components `φ c` of the gauge algebra and `φJ a` of its jets, + related by the Maurer–Cartan form `φJ (ω_μ U) = i (∂_μ u) u⁻¹` and invariant under the + adjoint action. -/ +structure U1Factor (jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J) where + /-- The unitary jet of a gauge jet. -/ + u : GJ →* unitary JetRing + /-- The `u(1)` component of a gauge algebra element. -/ + φ : 𝔤 →ₗ[ℝ] ℂ + /-- The `u(1)` component of a jet of gauge algebra elements. -/ + φJ : 𝔤J → JetRing + φJ_ofConstantLie : ∀ c, φJ (jets.ofConstantLie c) = C (φ c) + φJ_cc_foldl : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (a : 𝔤J), + constantCoeff (p.foldl (fun h ρ => pderiv ρ h) (φJ a)) + = φ (jets.evalLie (jets.iteratedDeriv p a)) + φJ_maurerCartan : ∀ (U : GJ) (μ : Fin 1 ⊕ Fin 3), + φJ (jets.maurerCartan U μ) + = Complex.I • (pderiv μ (u U : JetRing) * star (u U : JetRing)) + φJ_adjoint : ∀ (U : GJ) (c : 𝔤), + φJ (jets.adjoint U (jets.ofConstantLie c)) = φJ (jets.ofConstantLie c) + +/-! + +## B. `SU(n)` factors + +-/ + +/-- **An `SU(n)` factor** of the local gauge data: a unitary matrix of jets `u U` attached + to each gauge jet, with the corresponding matrix components `φ c` of the gauge algebra + and `φJ a` of its jets, related by the Maurer–Cartan form `φJ (ω_μ U) = i (∂_μ u) u⁻¹` + and transforming by conjugation under the adjoint action. -/ +structure SUFactor (jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J) (n : Type) [Fintype n] [DecidableEq n] + where + /-- The unitary matrix of jets of a gauge jet. -/ + u : GJ → Matrix n n JetRing + u_one : u 1 = 1 + u_mul : ∀ U V, u (U * V) = u U * u V + u_unitary : ∀ U, star (u U) * u U = 1 + /-- The matrix component of a gauge algebra element. -/ + φ : 𝔤 →ₗ[ℝ] Matrix n n ℂ + /-- The matrix component of a jet of gauge algebra elements. -/ + φJ : 𝔤J → Matrix n n JetRing + φJ_ofConstantLie : ∀ c, φJ (jets.ofConstantLie c) = (φ c).map (C : ℂ → JetRing) + φJ_cc_foldl : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (a : 𝔤J), + ((φJ a).map fun f => constantCoeff (p.foldl (fun h ρ => pderiv ρ h) f)) + = φ (jets.evalLie (jets.iteratedDeriv p a)) + φJ_maurerCartan : ∀ (U : GJ) (μ : Fin 1 ⊕ Fin 3), + φJ (jets.maurerCartan U μ) + = Complex.I • (((u U).map fun f => pderiv μ f) * star (u U)) + φJ_adjoint : ∀ (U : GJ) (c : 𝔤), + φJ (jets.adjoint U (jets.ofConstantLie c)) = u U * φJ (jets.ofConstantLie c) * star (u U) + +/-! + +## C. A gauge group as a list of factors + +-/ + +/-- **A factor of the gauge group**, presented in the local gauge data: a `U(1)` factor or + an `SU(n)` factor. -/ +inductive Factor (jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J) + /-- A `U(1)` factor. -/ + | U1 (F : U1Factor jets) + /-- An `SU(n)` factor. -/ + | SU {n : ℕ} (F : SUFactor jets (Fin n)) + +/-- **A gauge group presented by its factors.** -/ +abbrev Factors (jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J) : Type := List (Factor jets) + +end LocalGaugeData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/OfFactors.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/OfFactors.lean index 55919b2fc..2f175fd9e 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/OfFactors.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/OfFactors.lean @@ -8,7 +8,6 @@ module public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.SU.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.U1 public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Prod -public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.MatrixRep.Table /-! # Local gauge data from a list of factors diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Prod.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Prod.lean index 47c42f055..9e9d50115 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Prod.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Prod.lean @@ -5,7 +5,7 @@ Authors: Jinzheng Li -/ module -public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.MatrixRep.Factors +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Factor public import Mathlib.Algebra.Lie.Prod /-! # The product of local gauge data diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/SU/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/SU/Basic.lean index fff2da1b5..ba9f9bd98 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/SU/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/SU/Basic.lean @@ -6,7 +6,7 @@ Authors: Jinzheng Li module public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.SU.Algebra -public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.MatrixRep.Factors +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Factor public import Physlib.Relativity.JetRing.Jacobi public import Physlib.Relativity.JetRing.Taylor /-! diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/U1.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/U1.lean index 9a0eb6492..0e871402e 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/U1.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/U1.lean @@ -5,7 +5,7 @@ Authors: Jinzheng Li -/ module -public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.MatrixRep.Factors +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Factor public import Physlib.Relativity.JetRing.Taylor /-! # The local gauge data of `U(1)` diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Factors.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Factors.lean index eeb473419..ab2fa5022 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Factors.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Factors.lean @@ -5,6 +5,7 @@ Authors: Jinzheng Li -/ module +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Factor public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.MatrixRep.Constructions public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.Charge /-! @@ -14,33 +15,24 @@ public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.Charge A model-building table assigns to each field one charge per factor of the gauge group: a rational charge under a `U(1)` factor, a representation label under an `SU(n)` factor. -This file packages what a factor of the local gauge data must provide for its -representations to be built as matrix representations: - -* `LocalGaugeData.U1Factor` : a unitary jet `u U` attached to each gauge jet, with the - matching components `φ`, `φJ` of the gauge algebra and its jets, related by the - Maurer–Cartan form `φJ (ω_μ U) = i (∂_μ u) u⁻¹` and invariant under the adjoint action; -* `LocalGaugeData.SUFactor` : a unitary matrix of jets `u U` attached to each gauge jet, - with the matching matrix components `φ`, `φJ`, related by the Maurer–Cartan form - `φJ (ω_μ U) = i (∂_μ u) u⁻¹` and transforming by conjugation under the adjoint action. - -From these, `U1Factor.charge n R` twists a matrix representation `R` by the charge-`n` -power of the unitary jet, and `SUFactor.fund` is the fundamental representation. Together -with `MatrixRep.trivial`, `MatrixRep.kron` and `MatrixRep.conj`, every representation -named in a table is assembled from these. +The factors themselves, `LocalGaugeData.U1Factor` and `LocalGaugeData.SUFactor`, are part +of the gauge data (`Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Factor`). This +file builds the representations they name: `U1Factor.charge n R` twists a matrix +representation `R` by the charge-`n` power of the unitary jet, and `SUFactor.fund` is the +fundamental representation. Together with `MatrixRep.trivial`, `MatrixRep.kron` and +`MatrixRep.conj`, every representation named in a table is assembled from these. ## ii. Key results -- `LocalGaugeData.U1Factor`, `U1Factor.charge` : a `U(1)` factor and the charge twist. +- `U1Factor.charge` : the charge twist of a matrix representation by a `U(1)` factor. - `MatterField.pderiv_chargePow` : the derivative of a power of a unitary jet. -- `LocalGaugeData.SUFactor`, `SUFactor.fund` : an `SU(n)` factor and its fundamental - representation. +- `SUFactor.fund` : the fundamental representation of an `SU(n)` factor. ## iii. Table of contents - A. Powers of a unitary jet -- B. `U(1)` factors and the charge twist -- C. `SU(n)` factors and the fundamental representation +- B. The charge twist of a `U(1)` factor +- C. The fundamental representation of an `SU(n)` factor -/ @@ -90,31 +82,10 @@ variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ /-! -## B. `U(1)` factors and the charge twist +## B. The charge twist of a `U(1)` factor -/ -/-- **A `U(1)` factor** of the local gauge data: a unitary jet `u U` attached to each gauge - jet, with the corresponding components `φ c` of the gauge algebra and `φJ a` of its jets, - related by the Maurer–Cartan form `φJ (ω_μ U) = i (∂_μ u) u⁻¹` and invariant under the - adjoint action. -/ -structure U1Factor (jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J) where - /-- The unitary jet of a gauge jet. -/ - u : GJ →* unitary JetRing - /-- The `u(1)` component of a gauge algebra element. -/ - φ : 𝔤 →ₗ[ℝ] ℂ - /-- The `u(1)` component of a jet of gauge algebra elements. -/ - φJ : 𝔤J → JetRing - φJ_ofConstantLie : ∀ c, φJ (jets.ofConstantLie c) = C (φ c) - φJ_cc_foldl : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (a : 𝔤J), - constantCoeff (p.foldl (fun h ρ => pderiv ρ h) (φJ a)) - = φ (jets.evalLie (jets.iteratedDeriv p a)) - φJ_maurerCartan : ∀ (U : GJ) (μ : Fin 1 ⊕ Fin 3), - φJ (jets.maurerCartan U μ) - = Complex.I • (pderiv μ (u U : JetRing) * star (u U : JetRing)) - φJ_adjoint : ∀ (U : GJ) (c : 𝔤), - φJ (jets.adjoint U (jets.ofConstantLie c)) = φJ (jets.ofConstantLie c) - namespace U1Factor variable {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} (F : U1Factor jets) @@ -201,35 +172,10 @@ end U1Factor /-! -## C. `SU(n)` factors and the fundamental representation +## C. The fundamental representation of an `SU(n)` factor -/ -/-- **An `SU(n)` factor** of the local gauge data: a unitary matrix of jets `u U` attached - to each gauge jet, with the corresponding matrix components `φ c` of the gauge algebra - and `φJ a` of its jets, related by the Maurer–Cartan form `φJ (ω_μ U) = i (∂_μ u) u⁻¹` - and transforming by conjugation under the adjoint action. -/ -structure SUFactor (jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J) (n : Type) [Fintype n] [DecidableEq n] - where - /-- The unitary matrix of jets of a gauge jet. -/ - u : GJ → Matrix n n JetRing - u_one : u 1 = 1 - u_mul : ∀ U V, u (U * V) = u U * u V - u_unitary : ∀ U, star (u U) * u U = 1 - /-- The matrix component of a gauge algebra element. -/ - φ : 𝔤 →ₗ[ℝ] Matrix n n ℂ - /-- The matrix component of a jet of gauge algebra elements. -/ - φJ : 𝔤J → Matrix n n JetRing - φJ_ofConstantLie : ∀ c, φJ (jets.ofConstantLie c) = (φ c).map (C : ℂ → JetRing) - φJ_cc_foldl : ∀ (p : Multiset (Fin 1 ⊕ Fin 3)) (a : 𝔤J), - ((φJ a).map fun f => constantCoeff (p.foldl (fun h ρ => pderiv ρ h) f)) - = φ (jets.evalLie (jets.iteratedDeriv p a)) - φJ_maurerCartan : ∀ (U : GJ) (μ : Fin 1 ⊕ Fin 3), - φJ (jets.maurerCartan U μ) - = Complex.I • (((u U).map fun f => pderiv μ f) * star (u U)) - φJ_adjoint : ∀ (U : GJ) (c : 𝔤), - φJ (jets.adjoint U (jets.ofConstantLie c)) = u U * φJ (jets.ofConstantLie c) * star (u U) - namespace SUFactor variable {jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J} {n : Type} [Fintype n] [DecidableEq n] diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Table.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Table.lean index 775861a85..75c7a21c5 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Table.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/MatterField/MatrixRep/Table.lean @@ -20,17 +20,17 @@ label and one charge per factor — an integer charge under a `U(1)` factor, a representation label under an `SU(n)` factor. This file defines the tables over any local gauge data and compiles them into the general -theory. A gauge group is a list of `Factor`s, each a `U1Factor` or an `SUFactor` of the -local gauge data; the charges of a field form the tuple `Charges Γ` over the list; the -charges name a matrix representation `Charges.rep`, assembled from the factors by the -hypercharge twist and the Kronecker product; a field is its Lorentz label and its charges, +theory. A gauge group is a list of `Factor`s of the local gauge data +(`Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Factor`); the charges of a field +form the tuple `Charges Γ` over the list; the charges name a matrix representation +`Charges.rep`, assembled from the factors by the hypercharge twist and the Kronecker +product; a field is its Lorentz label and its charges, `MatterFieldData Γ`, so that it reads `(.L, .singlet, .fund, -3)`, and compiles to a `MatterField`; the field data of a model, `FieldData Γ Fields`, assigns each field its number of generations and its data, and compiles to a `GaugeFieldData`. ## ii. Key results -- `LocalGaugeData.Factor`, `Factors` : a gauge group presented as a list of factors. - `SURep`, `Charges` : the charge labels of a row and the charge tuple. - `Charges.rep` : the matrix representation named by a charge tuple. - `LorentzLabel`, `MatterFieldData` : the Lorentz label and the data of a field. @@ -42,7 +42,7 @@ number of generations and its data, and compiles to a `GaugeFieldData`. ## iii. Table of contents -- A. Factors and charge labels +- A. Charge labels - B. Charge tuples and their internal index - C. The representation named by a charge tuple - D. Matter field data and its matter field @@ -61,21 +61,10 @@ variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ /-! -## A. Factors and charge labels +## A. Charge labels -/ -/-- **A factor of the gauge group**, presented in the local gauge data: a `U(1)` factor or - an `SU(n)` factor. -/ -inductive Factor (jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J) - /-- A `U(1)` factor. -/ - | U1 (F : U1Factor jets) - /-- An `SU(n)` factor. -/ - | SU {n : ℕ} (F : SUFactor jets (Fin n)) - -/-- **A gauge group presented by its factors.** -/ -abbrev Factors (jets : LocalGaugeData G₀ 𝔤 GJ 𝔤J) : Type := List (Factor jets) - /-- **A representation label under `SU(n)`.** -/ inductive SURep /-- The singlet `1`. -/ diff --git a/Physlib/Particles/StandardModel/Basic.lean b/Physlib/Particles/StandardModel/Basic.lean index 10b42c9c9..d37fa283b 100644 --- a/Physlib/Particles/StandardModel/Basic.lean +++ b/Physlib/Particles/StandardModel/Basic.lean @@ -6,6 +6,7 @@ Authors: Jinzheng Li module public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.OfFactors +public import Physlib.ClassicalFieldTheory.GaugeTheory.MatterField.MatrixRep.Table /-! # The Standard Model From bf5034510d5a47b665caff047d196af4df60ae88 Mon Sep 17 00:00:00 2001 From: doxtor6 Date: Wed, 23 Sep 2026 13:27:37 -0400 Subject: [PATCH 358/367] chore: Remove the stale TODO asking for a product of LocalGaugeData `LocalGaugeData/Prod.lean` provides it. Co-authored-by: Claude Opus 4.8 --- .../ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Basic.lean | 2 -- 1 file changed, 2 deletions(-) diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Basic.lean index 84dc76e2e..5e969ae02 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Basic.lean @@ -320,8 +320,6 @@ lemma iteratedDeriv_ofConstantLie_of_ne_zero {p : Multiset (Fin 1 ⊕ Fin 3)} (h · rw [iteratedDeriv_zero, LinearMap.id_apply, deriv_ofConstantLie] · rw [ih ht, map_zero] -TODO "Add product of LocalGaugeData." - /-- The Euler identity: at the base point, `x_μ` acts on the `s`-th derivative by removing one `μ` and counting how many there were. With `∂_s` the derivatives in `s`, `(∂_s (x_μ a))|₀ = s(μ) · (∂_{s − μ} a)|₀`. -/ From 460d95e05356446f4c8643e065216e25501a0407 Mon Sep 17 00:00:00 2001 From: doxtor6 Date: Thu, 24 Sep 2026 07:42:07 -0400 Subject: [PATCH 359/367] refactor: Rename the carriers of a list of factors from Factors.G to OfFactors.G MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `Factors` was both the type of a gauge group presented by its factors, `LocalGaugeData.Factors jets`, and the namespace holding the carriers `Factors.G Γ`, `Factors.𝔤 Γ`, `Factors.G₀ Γ`, `Factors.𝔤J Γ` of the gauge data `ofFactors Γ` of a list of factor symbols. The carriers now live in the namespace `OfFactors`, named after the gauge data they carry, and `Factors.factors`, `Factors.inr` remain the only declarations in the namespace of the type. Co-authored-by: Claude Opus 4.8 --- .../GaugeTheory/LocalGaugeData/OfFactors.lean | 6 ++--- .../Particles/StandardModel/Challenge.lean | 12 +++++----- Physlib/Particles/StandardModel/Solution.lean | 22 +++++++++---------- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/OfFactors.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/OfFactors.lean index 2f175fd9e..7c5f41c6e 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/OfFactors.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/OfFactors.lean @@ -137,7 +137,7 @@ found at every use site identical to those inside the gauge data. -/ -namespace Factors +namespace OfFactors /-- The group of jets of a list of factors. -/ def G : List FactorSpec → Type @@ -248,7 +248,7 @@ instance instFinite𝔤 : (Γ : List FactorSpec) → Module.Finite ℝ (𝔤 Γ) letI := instFinite𝔤 (g :: gs) inferInstanceAs (Module.Finite ℝ (f.𝔤 × 𝔤 (g :: gs))) -end Factors +end OfFactors /-! @@ -287,7 +287,7 @@ instance instFaithfulTrivial : trivial.Faithful where ext_of_evalLie_iteratedDeriv _ := rfl eq_ofConstant_of_maurerCartan_eq_zero _ := rfl -open Factors in +open OfFactors in /-- **The local gauge data of a list of factors**: the product, in the order of the list, of the local gauge data of the factors. -/ noncomputable def ofFactors : (Γ : List FactorSpec) → LocalGaugeData (G₀ Γ) (𝔤 Γ) (G Γ) (𝔤J Γ) diff --git a/Physlib/Particles/StandardModel/Challenge.lean b/Physlib/Particles/StandardModel/Challenge.lean index 8a994ad45..06491b3fd 100644 --- a/Physlib/Particles/StandardModel/Challenge.lean +++ b/Physlib/Particles/StandardModel/Challenge.lean @@ -121,7 +121,7 @@ lemma higgsMass_mem_massWeightSubmodule : @[sorryful] theorem invariantsLE_four (x : fieldData.LocalFieldAlgebra) : (x ∈ fieldData.massWeightSubmoduleLE 4 - ∧ (∀ U : Factors.G gauge, fieldData.repJet U x = x) + ∧ (∀ U : OfFactors.G gauge, fieldData.repJet U x = x) ∧ ∀ Λ : SL(2,ℂ), fieldData.repLorentzGroup Λ x = x) ↔ x ∈ ℂ ∙ (1 : fieldData.LocalFieldAlgebra) ⊔ ℂ ∙ higgsMass := by sorry @@ -132,7 +132,7 @@ theorem invariantsLE_four (x : fieldData.LocalFieldAlgebra) : @[sorryful] theorem invariantsLE_seven (x : fieldData.LocalFieldAlgebra) : (x ∈ fieldData.massWeightSubmoduleLE 7 - ∧ (∀ U : Factors.G gauge, fieldData.repJet U x = x) + ∧ (∀ U : OfFactors.G gauge, fieldData.repJet U x = x) ∧ ∀ Λ : SL(2,ℂ), fieldData.repLorentzGroup Λ x = x) ↔ x ∈ ℂ ∙ (1 : fieldData.LocalFieldAlgebra) ⊔ ℂ ∙ higgsMass := by sorry @@ -154,7 +154,7 @@ and the gauge sector nothing below the field strength squared at mass weight eig @[sorryful] theorem scalarSector_invariantsLE_eight (x : fieldData.LocalFieldAlgebra) : (x ∈ fieldData.massWeightSubmoduleLE 8 ∧ x ∈ fieldData.SectorAlgebra {.scalar} - ∧ (∀ U : Factors.G gauge, fieldData.repJet U x = x) + ∧ (∀ U : OfFactors.G gauge, fieldData.repJet U x = x) ∧ ∀ Λ : SL(2,ℂ), fieldData.repLorentzGroup Λ x = x) ↔ x ∈ ℂ ∙ (1 : fieldData.LocalFieldAlgebra) ⊔ ℂ ∙ higgsMass ⊔ ℂ ∙ (higgsMass * higgsMass) := by @@ -165,7 +165,7 @@ theorem scalarSector_invariantsLE_eight (x : fieldData.LocalFieldAlgebra) : @[sorryful] theorem fermionSector_invariantsLE_eight (x : fieldData.LocalFieldAlgebra) : (x ∈ fieldData.massWeightSubmoduleLE 8 ∧ x ∈ fieldData.SectorAlgebra {.fermion} - ∧ (∀ U : Factors.G gauge, fieldData.repJet U x = x) + ∧ (∀ U : OfFactors.G gauge, fieldData.repJet U x = x) ∧ ∀ Λ : SL(2,ℂ), fieldData.repLorentzGroup Λ x = x) ↔ x ∈ ℂ ∙ (1 : fieldData.LocalFieldAlgebra) := by sorry @@ -175,7 +175,7 @@ theorem fermionSector_invariantsLE_eight (x : fieldData.LocalFieldAlgebra) : @[sorryful] theorem gaugeSector_invariantsLE_seven (x : fieldData.LocalFieldAlgebra) : (x ∈ fieldData.massWeightSubmoduleLE 7 ∧ x ∈ fieldData.SectorAlgebra {.gauge} - ∧ (∀ U : Factors.G gauge, fieldData.repJet U x = x) + ∧ (∀ U : OfFactors.G gauge, fieldData.repJet U x = x) ∧ ∀ Λ : SL(2,ℂ), fieldData.repLorentzGroup Λ x = x) ↔ x ∈ ℂ ∙ (1 : fieldData.LocalFieldAlgebra) := by sorry @@ -191,7 +191,7 @@ theorem gaugeSector_invariantsLE_seven (x : fieldData.LocalFieldAlgebra) : of every fermionic and bosonic species, since the hypercharges are `6 Y` and every field has `2 · (colour triality) + 3 · (isospin duality) + 6 Y ≡ 0 (mod 6)`. -/ @[sorryful] -theorem repJet_ofConstant_eq_one_of_center (ζ : ℂ) (hζ : ζ ^ 6 = 1) (g : Factors.G₀ gauge) +theorem repJet_ofConstant_eq_one_of_center (ζ : ℂ) (hζ : ζ ^ 6 = 1) (g : OfFactors.G₀ gauge) (h₃ : (g.1 : specialUnitaryGroup (Fin 3) ℂ).1 = ζ ^ 2 • (1 : Matrix (Fin 3) (Fin 3) ℂ)) (h₂ : (g.2.1 : specialUnitaryGroup (Fin 2) ℂ).1 = ζ ^ 3 • (1 : Matrix (Fin 2) (Fin 2) ℂ)) (h₁ : (g.2.2 : unitary ℂ).1 = ζ) : diff --git a/Physlib/Particles/StandardModel/Solution.lean b/Physlib/Particles/StandardModel/Solution.lean index 7afdf7b94..ba476767a 100644 --- a/Physlib/Particles/StandardModel/Solution.lean +++ b/Physlib/Particles/StandardModel/Solution.lean @@ -85,7 +85,7 @@ section Transport variable {T' : GaugeFieldData gaugeData} (e : fieldData.LocalFieldAlgebra ≃ₐ[ℂ] T'.LocalFieldAlgebra) - (hjet : ∀ (U : Factors.G gauge) x, e (fieldData.repJet U x) = T'.repJet U (e x)) + (hjet : ∀ (U : OfFactors.G gauge) x, e (fieldData.repJet U x) = T'.repJet U (e x)) (hlor : ∀ (Λ : SL(2,ℂ)) x, e (fieldData.repLorentzGroup Λ x) = T'.repLorentzGroup Λ (e x)) (hscale : ∀ (c : ℝ) x, e (fieldData.massWeightScale c x) = T'.massWeightScale c (e x)) @@ -114,11 +114,11 @@ include hjet hlor hscale in theorem invariantsLE_four_iff : (∀ x : fieldData.LocalFieldAlgebra, (x ∈ fieldData.massWeightSubmoduleLE 4 - ∧ (∀ U : Factors.G gauge, fieldData.repJet U x = x) + ∧ (∀ U : OfFactors.G gauge, fieldData.repJet U x = x) ∧ ∀ Λ : SL(2,ℂ), fieldData.repLorentzGroup Λ x = x) ↔ x ∈ ℂ ∙ (1 : fieldData.LocalFieldAlgebra) ⊔ ℂ ∙ higgsMass) ↔ ∀ y : T'.LocalFieldAlgebra, - (y ∈ T'.massWeightSubmoduleLE 4 ∧ (∀ U : Factors.G gauge, T'.repJet U y = y) + (y ∈ T'.massWeightSubmoduleLE 4 ∧ (∀ U : OfFactors.G gauge, T'.repJet U y = y) ∧ ∀ Λ : SL(2,ℂ), T'.repLorentzGroup Λ y = y) ↔ y ∈ ℂ ∙ (1 : T'.LocalFieldAlgebra) ⊔ ℂ ∙ e higgsMass := by rw [← invariantsLE_eq_iff, ← invariantsLE_eq_iff] @@ -132,11 +132,11 @@ include hjet hlor hscale in theorem invariantsLE_seven_iff : (∀ x : fieldData.LocalFieldAlgebra, (x ∈ fieldData.massWeightSubmoduleLE 7 - ∧ (∀ U : Factors.G gauge, fieldData.repJet U x = x) + ∧ (∀ U : OfFactors.G gauge, fieldData.repJet U x = x) ∧ ∀ Λ : SL(2,ℂ), fieldData.repLorentzGroup Λ x = x) ↔ x ∈ ℂ ∙ (1 : fieldData.LocalFieldAlgebra) ⊔ ℂ ∙ higgsMass) ↔ ∀ y : T'.LocalFieldAlgebra, - (y ∈ T'.massWeightSubmoduleLE 7 ∧ (∀ U : Factors.G gauge, T'.repJet U y = y) + (y ∈ T'.massWeightSubmoduleLE 7 ∧ (∀ U : OfFactors.G gauge, T'.repJet U y = y) ∧ ∀ Λ : SL(2,ℂ), T'.repLorentzGroup Λ y = y) ↔ y ∈ ℂ ∙ (1 : T'.LocalFieldAlgebra) ⊔ ℂ ∙ e higgsMass := by rw [← invariantsLE_eq_iff, ← invariantsLE_eq_iff] @@ -154,13 +154,13 @@ theorem scalarSector_invariantsLE_eight_iff = (T'.SectorAlgebra {.scalar}).toSubmodule) : (∀ x : fieldData.LocalFieldAlgebra, (x ∈ fieldData.massWeightSubmoduleLE 8 ∧ x ∈ fieldData.SectorAlgebra {.scalar} - ∧ (∀ U : Factors.G gauge, fieldData.repJet U x = x) + ∧ (∀ U : OfFactors.G gauge, fieldData.repJet U x = x) ∧ ∀ Λ : SL(2,ℂ), fieldData.repLorentzGroup Λ x = x) ↔ x ∈ ℂ ∙ (1 : fieldData.LocalFieldAlgebra) ⊔ ℂ ∙ higgsMass ⊔ ℂ ∙ (higgsMass * higgsMass)) ↔ ∀ y : T'.LocalFieldAlgebra, (y ∈ T'.massWeightSubmoduleLE 8 ∧ y ∈ T'.SectorAlgebra {.scalar} - ∧ (∀ U : Factors.G gauge, T'.repJet U y = y) + ∧ (∀ U : OfFactors.G gauge, T'.repJet U y = y) ∧ ∀ Λ : SL(2,ℂ), T'.repLorentzGroup Λ y = y) ↔ y ∈ ℂ ∙ (1 : T'.LocalFieldAlgebra) ⊔ ℂ ∙ e higgsMass ⊔ ℂ ∙ (e higgsMass * e higgsMass) := by @@ -193,12 +193,12 @@ theorem fermionSector_invariantsLE_eight_iff = (T'.SectorAlgebra {.fermion}).toSubmodule) : (∀ x : fieldData.LocalFieldAlgebra, (x ∈ fieldData.massWeightSubmoduleLE 8 ∧ x ∈ fieldData.SectorAlgebra {.fermion} - ∧ (∀ U : Factors.G gauge, fieldData.repJet U x = x) + ∧ (∀ U : OfFactors.G gauge, fieldData.repJet U x = x) ∧ ∀ Λ : SL(2,ℂ), fieldData.repLorentzGroup Λ x = x) ↔ x ∈ ℂ ∙ (1 : fieldData.LocalFieldAlgebra)) ↔ ∀ y : T'.LocalFieldAlgebra, (y ∈ T'.massWeightSubmoduleLE 8 ∧ y ∈ T'.SectorAlgebra {.fermion} - ∧ (∀ U : Factors.G gauge, T'.repJet U y = y) + ∧ (∀ U : OfFactors.G gauge, T'.repJet U y = y) ∧ ∀ Λ : SL(2,ℂ), T'.repLorentzGroup Λ y = y) ↔ y ∈ ℂ ∙ (1 : T'.LocalFieldAlgebra) := by simp only [← Subalgebra.mem_toSubmodule] @@ -227,12 +227,12 @@ theorem gaugeSector_invariantsLE_seven_iff = (T'.SectorAlgebra {.gauge}).toSubmodule) : (∀ x : fieldData.LocalFieldAlgebra, (x ∈ fieldData.massWeightSubmoduleLE 7 ∧ x ∈ fieldData.SectorAlgebra {.gauge} - ∧ (∀ U : Factors.G gauge, fieldData.repJet U x = x) + ∧ (∀ U : OfFactors.G gauge, fieldData.repJet U x = x) ∧ ∀ Λ : SL(2,ℂ), fieldData.repLorentzGroup Λ x = x) ↔ x ∈ ℂ ∙ (1 : fieldData.LocalFieldAlgebra)) ↔ ∀ y : T'.LocalFieldAlgebra, (y ∈ T'.massWeightSubmoduleLE 7 ∧ y ∈ T'.SectorAlgebra {.gauge} - ∧ (∀ U : Factors.G gauge, T'.repJet U y = y) + ∧ (∀ U : OfFactors.G gauge, T'.repJet U y = y) ∧ ∀ Λ : SL(2,ℂ), T'.repLorentzGroup Λ y = y) ↔ y ∈ ℂ ∙ (1 : T'.LocalFieldAlgebra) := by simp only [← Subalgebra.mem_toSubmodule] From 3519d7453e25edf388044ebeb01628c04350a8d8 Mon Sep 17 00:00:00 2001 From: doxtor6 Date: Thu, 24 Sep 2026 07:42:07 -0400 Subject: [PATCH 360/367] refactor: Inline conjMap into the conjugation representation on su(n) `SUAlgebraOver.conjMap` and its `rfl` lemma existed only to build `SUAlgebraOver.conj`. Co-authored-by: Claude Opus 4.8 --- .../LocalGaugeData/SU/Algebra.lean | 26 +++++++------------ 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/SU/Algebra.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/SU/Algebra.lean index 9133969b3..93450329a 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/SU/Algebra.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/SU/Algebra.lean @@ -88,24 +88,16 @@ lemma ext {a b : SUAlgebraOver R n} (h : a.1 = b.1) : a = b := Subtype.ext h -/ -/-- Conjugation `a ↦ U a U†` by a unitary matrix, as a real-linear map of `su(n)`. -/ -noncomputable def conjMap (U : unitaryGroup (Fin n) R) : - SUAlgebraOver R n →ₗ[ℝ] SUAlgebraOver R n where - toFun a := ofMatrix (U.1 * a.1 * star U.1) - (by rw [star_mul, star_mul, star_star, a.star_val, mul_assoc]) - (by - rw [Matrix.trace_mul_comm, ← mul_assoc, show star U.1 * U.1 = 1 from - (Unitary.mem_iff.mp U.2).1, one_mul, a.trace_val]) - map_add' a b := Subtype.ext (by simp [mul_add, add_mul]) - map_smul' r a := Subtype.ext (by simp) - -@[simp] -lemma conjMap_val (U : unitaryGroup (Fin n) R) (a : SUAlgebraOver R n) : - (conjMap U a).1 = U.1 * a.1 * star U.1 := rfl - -/-- **The conjugation representation** of the unitary group on `su(n)`. -/ +/-- **The conjugation representation** of the unitary group on `su(n)`: `a ↦ U a U†`. -/ noncomputable def conj : Representation ℝ (unitaryGroup (Fin n) R) (SUAlgebraOver R n) where - toFun := conjMap + toFun U := + { toFun a := ofMatrix (U.1 * a.1 * star U.1) + (by rw [star_mul, star_mul, star_star, a.star_val, mul_assoc]) + (by + rw [Matrix.trace_mul_comm, ← mul_assoc, show star U.1 * U.1 = 1 from + (Unitary.mem_iff.mp U.2).1, one_mul, a.trace_val]) + map_add' a b := Subtype.ext (by simp [mul_add, add_mul]) + map_smul' r a := Subtype.ext (by simp) } map_one' := LinearMap.ext fun a => Subtype.ext (by simp) map_mul' U V := LinearMap.ext fun a => Subtype.ext (by simp [star_mul, mul_assoc]) From a184b2fd902e46e69532ff72128a2a3075faa98a Mon Sep 17 00:00:00 2001 From: doxtor6 Date: Thu, 24 Sep 2026 09:29:55 -0400 Subject: [PATCH 361/367] feat: Add MatrixJets, a presentation of gauge jets by matrices, and derive su and u1 from it MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `LocalGaugeData.MatrixJets κ G₀ 𝔤 GJ 𝔤J` records injective maps of the four carriers into `κ × κ` matrices of jets and what each structure map is in matrices (entrywise constant coefficient and inclusion of constants, entrywise derivative and coordinate, conjugation for the adjoint actions, `i (∂_μ U) U†` for the Maurer–Cartan form). From it, `MatrixJets.toLocalGaugeData` proves the laws of `LocalGaugeData` once, `MatrixJets.faithful` proves faithfulness, `MatrixJets.lieJ_iteratedDeriv` computes the iterated derivative entrywise, and `MatrixJets.suFactor` is the canonical `SU`-type factor. The matrix identities it needs (`mapMatrix_C_star`, `star_map_pderiv`, `map_pderiv_star_of_unitary`, `star_mcMatrix`, ...) live in the same file. `SU/Basic.lean` now supplies only the carriers, the structure maps and the Maurer–Cartan form, and defines `su n` as `(suMatrixJets n).toLocalGaugeData`; its faithfulness and canonical factor are the generic ones. `U1.lean` does the same through `u1MatrixJets`, reading a scalar as a `1 × 1` matrix. The identities `mc_cocycle`, `mc_structure`, `deriv_adjoint` and their kin are no longer proved twice. Co-authored-by: Claude Opus 4.8 --- Physlib.lean | 1 + .../LocalGaugeData/MatrixJets.lean | 480 ++++++++++++++++++ .../GaugeTheory/LocalGaugeData/SU/Basic.lean | 352 ++----------- .../GaugeTheory/LocalGaugeData/U1.lean | 222 ++++---- 4 files changed, 654 insertions(+), 401 deletions(-) create mode 100644 Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/MatrixJets.lean diff --git a/Physlib.lean b/Physlib.lean index b3e7f1ce3..809c99eaf 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -46,6 +46,7 @@ public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalFieldAlgebra.Transfo public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.AdjointCoeff public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Basic public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Factor +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.MatrixJets public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.MaurerCartan public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.OfFactors public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Prod diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/MatrixJets.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/MatrixJets.lean new file mode 100644 index 000000000..37ad37d34 --- /dev/null +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/MatrixJets.lean @@ -0,0 +1,480 @@ +/- +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.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Factor +public import Physlib.Relativity.JetRing.Matrix +public import Physlib.Relativity.JetRing.Taylor +/-! +# Matrix jet groups + +## i. Overview + +`U(1)` and `SU(n)` present their local gauge data in the same way: the gauge jets are +unitary matrices of jets, the Lie algebra jets are hermitian matrices of jets, evaluation is +the entrywise constant coefficient, constants embed entrywise, the derivative and the +coordinates act entrywise, the adjoint action is conjugation `U a U†` and the Maurer–Cartan +form is `i (∂_μ U) U†`. Every law of `LocalGaugeData` then follows from matrix identities +over the jet ring. + +`MatrixJets` records such a presentation: injective maps of the four carriers into matrices, +and what each structure map is in matrices. From it, `MatrixJets.toLocalGaugeData` proves +the laws once, `MatrixJets.faithful` shows the package is faithful, and +`MatrixJets.suFactor` is its canonical `SU`-type factor. The concrete packages `u1` and +`su n` are instances. + +## ii. Key results + +- `LocalGaugeData.MatrixJets` : a presentation of gauge jets by matrices of jets. +- `LocalGaugeData.MatrixJets.toLocalGaugeData` : the local gauge data it presents. +- `LocalGaugeData.MatrixJets.faithful` : that local gauge data is faithful. +- `LocalGaugeData.MatrixJets.suFactor` : its canonical `SU`-type factor. + +## iii. Table of contents + +- A. Matrix identities over the jet ring +- B. The presentation +- C. The local gauge data +- D. The iterated derivative and faithfulness +- E. The canonical factor + +-/ + +@[expose] public section + +open MvPowerSeries + +namespace LocalGaugeData + +/-! + +## A. Matrix identities over the jet ring + +-/ + +section Identities + +variable {κ : Type} + +/-- Entrywise inclusion of constants commutes with the conjugate transpose. -/ +lemma mapMatrix_C_star [Fintype κ] [DecidableEq κ] (A : Matrix κ κ ℂ) : + (C : ℂ →+* JetRing).mapMatrix (star A) = star ((C : ℂ →+* JetRing).mapMatrix A) := by + ext i j + simp [RingHom.mapMatrix_apply, Matrix.map_apply, Matrix.star_apply] + +/-- Entrywise inclusion of constants commutes with complex scalars. -/ +lemma mapMatrix_C_smul [Fintype κ] [DecidableEq κ] (c : ℂ) (M : Matrix κ κ ℂ) : + (C : ℂ →+* JetRing).mapMatrix (c • M) = c • (C : ℂ →+* JetRing).mapMatrix M := by + ext i j : 1 + simp only [RingHom.mapMatrix_apply, Matrix.map_apply, Matrix.smul_apply, + MvPowerSeries.smul_eq_C_mul, smul_eq_mul, map_mul] + +/-- The entrywise constant coefficient commutes with complex scalars. -/ +lemma mapMatrix_constantCoeff_smul [Fintype κ] [DecidableEq κ] (c : ℂ) + (M : Matrix κ κ JetRing) : + (constantCoeff : JetRing →+* ℂ).mapMatrix (c • M) + = c • (constantCoeff : JetRing →+* ℂ).mapMatrix M := by + ext i j + simp [RingHom.mapMatrix_apply, Matrix.map_apply] + +/-- The entrywise derivative commutes with the conjugate transpose. -/ +lemma star_map_pderiv [Fintype κ] (μ : Fin 1 ⊕ Fin 3) (A : Matrix κ κ JetRing) : + 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 + +/-- Pulling a complex scalar out of the entrywise derivative. -/ +lemma map_pderiv_smul (μ : Fin 1 ⊕ Fin 3) (c : ℂ) (M : Matrix κ κ JetRing) : + (c • M).map (pderiv μ) = c • M.map (pderiv μ) := + Matrix.ext fun _ _ => Derivation.map_smul _ _ _ + +/-- The entrywise derivative of a difference. -/ +lemma map_pderiv_sub (μ : Fin 1 ⊕ Fin 3) (M N : Matrix κ κ JetRing) : + (M - N).map (pderiv μ) = M.map (pderiv μ) - N.map (pderiv μ) := by + ext i j : 1 + simp only [Matrix.map_apply, Matrix.sub_apply, map_sub] + +/-- The entrywise derivative of the conjugate transpose of a unitary matrix, through the + differentiated unitarity relation. -/ +lemma map_pderiv_star_of_unitary [Fintype κ] [DecidableEq κ] (μ : Fin 1 ⊕ Fin 3) + {U : Matrix κ κ JetRing} + (hU : U * star U = 1) (hU' : star U * U = 1) : + (star U).map (pderiv μ) = -(star U * U.map (pderiv μ) * star U) := by + have h1 : U * (star U).map (pderiv μ) = -(U.map (pderiv μ) * star U) := + eq_neg_of_add_eq_zero_right (by + rw [← JetRing.matrix_map_pderiv_mul, hU] + exact Matrix.ext fun i j => by + simp [Matrix.map_apply, Matrix.one_apply, apply_ite (pderiv μ)]) + calc (star U).map (pderiv μ) + = star U * U * (star U).map (pderiv μ) := by rw [hU', one_mul] + _ = -(star U * U.map (pderiv μ) * star U) := by + rw [mul_assoc, h1, mul_neg, ← mul_assoc] + +/-- The Maurer–Cartan matrix `i (∂_μ U) U†` of a unitary matrix of jets is hermitian. -/ +lemma star_mcMatrix [Fintype κ] [DecidableEq κ] (μ : Fin 1 ⊕ Fin 3) {U : Matrix κ κ JetRing} + (hU : U * star U = 1) (hU' : star U * U = 1) : + star (Complex.I • (U.map (pderiv μ) * star U)) = Complex.I • (U.map (pderiv μ) * star U) := by + rw [star_smul, star_mul, star_star, star_map_pderiv, map_pderiv_star_of_unitary μ hU hU', + Complex.star_def, Complex.conj_I, neg_smul, mul_neg, smul_neg, neg_neg, ← mul_assoc, + ← mul_assoc, hU, one_mul] + +end Identities + +/-! + +## B. The presentation + +-/ + +variable {G₀ : Type} [Group G₀] {𝔤 : Type} [LieRing 𝔤] [LieAlgebra ℝ 𝔤] + {GJ : Type} [Group GJ] {𝔤J : Type} [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] + +/-- **A presentation of gauge jets by matrices**: the value group, its Lie algebra, the jet + group and its Lie algebra of jets embed into `κ × κ` matrices, and every structure map of + the local gauge data is what it is for matrices: the entrywise constant coefficient, + inclusion of constants, derivative and coordinate multiplication, conjugation for the + adjoint actions and `i (∂_μ U) U†` for the Maurer–Cartan form. -/ +structure MatrixJets (κ : Type) [Fintype κ] [DecidableEq κ] (G₀ : Type) [Group G₀] + (𝔤 : Type) [LieRing 𝔤] [LieAlgebra ℝ 𝔤] (GJ : Type) [Group GJ] + (𝔤J : Type) [LieRing 𝔤J] [LieAlgebra ℝ 𝔤J] where + /-- The matrix of a value. -/ + toMat₀ : G₀ →* Matrix κ κ ℂ + toMat₀_injective : Function.Injective toMat₀ + /-- The matrix of jets of a gauge jet. -/ + toMatJ : GJ →* Matrix κ κ JetRing + toMatJ_injective : Function.Injective toMatJ + toMatJ_mul_star : ∀ U, toMatJ U * star (toMatJ U) = 1 + star_toMatJ_mul : ∀ U, star (toMatJ U) * toMatJ U = 1 + /-- The matrix of a Lie algebra element. -/ + lie₀ : 𝔤 →ₗ[ℝ] Matrix κ κ ℂ + lie₀_injective : Function.Injective lie₀ + lie₀_bracket : ∀ a b, lie₀ ⁅a, b⁆ = Complex.I • (lie₀ a * lie₀ b - lie₀ b * lie₀ a) + /-- The matrix of jets of a Lie algebra jet. -/ + lieJ : 𝔤J →ₗ[ℝ] Matrix κ κ JetRing + lieJ_injective : Function.Injective lieJ + lieJ_bracket : ∀ a b, lieJ ⁅a, b⁆ = Complex.I • (lieJ a * lieJ b - lieJ b * lieJ a) + /-- Evaluation of a gauge jet at the base point. -/ + eval : GJ →* G₀ + toMat₀_eval : ∀ U, toMat₀ (eval U) = (constantCoeff : JetRing →+* ℂ).mapMatrix (toMatJ U) + /-- A constant gauge transformation as a jet. -/ + ofConstant : G₀ →* GJ + toMatJ_ofConstant : ∀ g, toMatJ (ofConstant g) = (C : ℂ →+* JetRing).mapMatrix (toMat₀ g) + /-- Evaluation of a Lie algebra jet at the base point. -/ + evalLie : 𝔤J →ₗ[ℝ] 𝔤 + lie₀_evalLie : ∀ a, lie₀ (evalLie a) = (constantCoeff : JetRing →+* ℂ).mapMatrix (lieJ a) + /-- A constant Lie algebra element as a jet. -/ + ofConstantLie : 𝔤 →ₗ[ℝ] 𝔤J + lieJ_ofConstantLie : ∀ a, lieJ (ofConstantLie a) = (C : ℂ →+* JetRing).mapMatrix (lie₀ a) + /-- The formal derivative in the direction `μ`. -/ + deriv : (Fin 1 ⊕ Fin 3) → 𝔤J →ₗ[ℝ] 𝔤J + lieJ_deriv : ∀ μ a, lieJ (deriv μ a) = (lieJ a).map (pderiv μ) + /-- Multiplication of a jet by the spacetime coordinate `x_μ`. -/ + coord : (Fin 1 ⊕ Fin 3) → 𝔤J →ₗ[ℝ] 𝔤J + lieJ_coord : ∀ μ a, lieJ (coord μ a) = (X μ : JetRing) • lieJ a + /-- The adjoint action of the jet group on the jet Lie algebra. -/ + adjoint : Representation ℝ GJ 𝔤J + lieJ_adjoint : ∀ U a, lieJ (adjoint U a) = toMatJ U * lieJ a * star (toMatJ U) + /-- The adjoint representation of the value group on its Lie algebra. -/ + adjointValue : Representation ℝ G₀ 𝔤 + lie₀_adjointValue : ∀ g a, lie₀ (adjointValue g a) = toMat₀ g * lie₀ a * star (toMat₀ g) + /-- The Maurer–Cartan form `i (∂_μ U) U⁻¹` of a gauge jet. -/ + maurerCartan : GJ → (Fin 1 ⊕ Fin 3) → 𝔤J + lieJ_maurerCartan : ∀ U μ, lieJ (maurerCartan U μ) + = Complex.I • ((toMatJ U).map (pderiv μ) * star (toMatJ U)) + +namespace MatrixJets + +variable {κ : Type} [Fintype κ] [DecidableEq κ] (M : MatrixJets κ G₀ 𝔤 GJ 𝔤J) + +/-! + +## C. The local gauge data + +Every law is an identity of matrices, read through the injective maps `lieJ` and `toMat₀`. + +-/ + +lemma eval_ofConstant (g : G₀) : M.eval (M.ofConstant g) = g := by + refine M.toMat₀_injective ?_ + rw [M.toMat₀_eval, M.toMatJ_ofConstant] + ext i j + simp [RingHom.mapMatrix_apply, Matrix.map_apply, constantCoeff_C] + +lemma evalLie_lie (a b : 𝔤J) : M.evalLie ⁅a, b⁆ = ⁅M.evalLie a, M.evalLie b⁆ := by + refine M.lie₀_injective ?_ + rw [M.lie₀_bracket, M.lie₀_evalLie, M.lie₀_evalLie, M.lie₀_evalLie, M.lieJ_bracket, + mapMatrix_constantCoeff_smul, map_sub, map_mul, map_mul] + +lemma ofConstantLie_lie (a b : 𝔤) : + M.ofConstantLie ⁅a, b⁆ = ⁅M.ofConstantLie a, M.ofConstantLie b⁆ := by + refine M.lieJ_injective ?_ + rw [M.lieJ_bracket, M.lieJ_ofConstantLie, M.lieJ_ofConstantLie, M.lieJ_ofConstantLie, + M.lie₀_bracket, mapMatrix_C_smul, map_sub, map_mul, map_mul] + +lemma evalLie_ofConstantLie (a : 𝔤) : M.evalLie (M.ofConstantLie a) = a := by + refine M.lie₀_injective ?_ + rw [M.lie₀_evalLie, M.lieJ_ofConstantLie] + ext i j + simp [RingHom.mapMatrix_apply, Matrix.map_apply, constantCoeff_C] + +lemma deriv_comm (μ ν : Fin 1 ⊕ Fin 3) (a : 𝔤J) : + M.deriv μ (M.deriv ν a) = M.deriv ν (M.deriv μ a) := by + refine M.lieJ_injective ?_ + rw [M.lieJ_deriv, M.lieJ_deriv, M.lieJ_deriv, M.lieJ_deriv] + ext i j : 1 + simp [Matrix.map_apply, JetRing.pderiv_comm μ ν] + +lemma deriv_bracket (μ : Fin 1 ⊕ Fin 3) (x y : 𝔤J) : + M.deriv μ ⁅x, y⁆ = ⁅M.deriv μ x, y⁆ + ⁅x, M.deriv μ y⁆ := by + refine M.lieJ_injective ?_ + rw [map_add, M.lieJ_deriv, M.lieJ_bracket, M.lieJ_bracket, M.lieJ_bracket, M.lieJ_deriv, + M.lieJ_deriv, map_pderiv_smul, map_pderiv_sub, JetRing.matrix_map_pderiv_mul, + JetRing.matrix_map_pderiv_mul, ← smul_add] + congr 1 + abel + +lemma deriv_ofConstantLie (μ : Fin 1 ⊕ Fin 3) (a : 𝔤) : M.deriv μ (M.ofConstantLie a) = 0 := by + refine M.lieJ_injective ?_ + rw [M.lieJ_deriv, M.lieJ_ofConstantLie, map_zero] + ext i j : 1 + simp [Matrix.map_apply, RingHom.mapMatrix_apply, pderiv_C] + +lemma deriv_coord (μ ν : Fin 1 ⊕ Fin 3) (a : 𝔤J) : + M.deriv μ (M.coord ν a) = M.coord ν (M.deriv μ a) + if μ = ν then a else 0 := by + refine M.lieJ_injective ?_ + by_cases h : μ = ν + · subst h + rw [ite_eq_left rfl, map_add, M.lieJ_deriv, M.lieJ_coord, M.lieJ_coord, M.lieJ_deriv] + ext i j + simp only [Matrix.map_apply, Matrix.smul_apply, Matrix.add_apply, smul_eq_mul, + Derivation.leibniz, pderiv_X_self] + ring + · rw [ite_eq_right h, add_zero, M.lieJ_deriv, M.lieJ_coord, M.lieJ_coord, M.lieJ_deriv] + ext i j + simp only [Matrix.map_apply, Matrix.smul_apply, smul_eq_mul, Derivation.leibniz, + pderiv_X_of_ne (Ne.symm h), mul_zero, add_zero] + +lemma evalLie_coord (μ : Fin 1 ⊕ Fin 3) (a : 𝔤J) : M.evalLie (M.coord μ a) = 0 := by + refine M.lie₀_injective ?_ + rw [M.lie₀_evalLie, M.lieJ_coord, map_zero] + ext i j + simp [RingHom.mapMatrix_apply, Matrix.map_apply, Matrix.smul_apply] + +lemma coord_lie (μ : Fin 1 ⊕ Fin 3) (a b : 𝔤J) : ⁅M.coord μ a, b⁆ = M.coord μ ⁅a, b⁆ := by + refine M.lieJ_injective ?_ + rw [M.lieJ_bracket, M.lieJ_coord, M.lieJ_coord, M.lieJ_bracket] + simp only [Matrix.smul_mul, Matrix.mul_smul, smul_sub, smul_comm (X μ : JetRing) Complex.I] + +/-- Conjugation by a unitary matrix respects products. -/ +lemma conj_mul_conj (U : GJ) (A B : Matrix κ κ JetRing) : + (M.toMatJ U * A * star (M.toMatJ U)) * (M.toMatJ U * B * star (M.toMatJ U)) + = M.toMatJ U * (A * B) * star (M.toMatJ U) := by + simp only [mul_assoc] + rw [show star (M.toMatJ U) * (M.toMatJ U * (B * star (M.toMatJ U))) = B * star (M.toMatJ U) + from by rw [← mul_assoc, M.star_toMatJ_mul, one_mul]] + +lemma adjoint_lie (U : GJ) (x y : 𝔤J) : + M.adjoint U ⁅x, y⁆ = ⁅M.adjoint U x, M.adjoint U y⁆ := by + refine M.lieJ_injective ?_ + rw [M.lieJ_adjoint, M.lieJ_bracket, M.lieJ_bracket, M.lieJ_adjoint, M.lieJ_adjoint, + M.conj_mul_conj, M.conj_mul_conj] + simp only [mul_smul_comm, smul_mul_assoc, mul_sub, sub_mul] + +lemma evalLie_adjoint (U : GJ) (x : 𝔤J) : + M.evalLie (M.adjoint U x) = M.adjointValue (M.eval U) (M.evalLie x) := by + refine M.lie₀_injective ?_ + rw [M.lie₀_evalLie, M.lieJ_adjoint, M.lie₀_adjointValue, M.toMat₀_eval, M.lie₀_evalLie, + map_mul, map_mul, JetRing.mapMatrix_constantCoeff_star] + +lemma maurerCartan_ofConstant (g : G₀) (μ : Fin 1 ⊕ Fin 3) : + M.maurerCartan (M.ofConstant g) μ = 0 := by + refine M.lieJ_injective ?_ + rw [M.lieJ_maurerCartan, M.toMatJ_ofConstant, map_zero] + ext i j : 1 + simp [Matrix.mul_apply, Matrix.map_apply, RingHom.mapMatrix_apply, pderiv_C] + +lemma maurerCartan_cocycle (U V : GJ) (μ : Fin 1 ⊕ Fin 3) : + M.maurerCartan (U * V) μ = M.maurerCartan U μ + M.adjoint U (M.maurerCartan V μ) := by + refine M.lieJ_injective ?_ + rw [map_add, M.lieJ_maurerCartan, M.lieJ_maurerCartan, M.lieJ_adjoint, M.lieJ_maurerCartan, + map_mul, JetRing.matrix_map_pderiv_mul, star_mul, add_mul, smul_add, mul_smul_comm, + smul_mul_assoc] + congr 1 + · rw [mul_assoc, ← mul_assoc (M.toMatJ V), M.toMatJ_mul_star, one_mul] + · simp only [mul_assoc] + +lemma maurerCartan_structure (U : GJ) (μ ν : Fin 1 ⊕ Fin 3) : + M.deriv μ (M.maurerCartan U ν) - M.deriv ν (M.maurerCartan U μ) + + ⁅M.maurerCartan U μ, M.maurerCartan U ν⁆ = 0 := by + set A := M.toMatJ U with hA + have hU : A * star A = 1 := M.toMatJ_mul_star U + have hU' : star A * A = 1 := M.star_toMatJ_mul U + have key : (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 + rw [JetRing.matrix_map_pderiv_mul, JetRing.matrix_map_pderiv_mul, + show (A.map (pderiv ν)).map (pderiv μ) = (A.map (pderiv μ)).map (pderiv ν) + from Matrix.ext fun _ _ => JetRing.pderiv_comm μ ν _, + map_pderiv_star_of_unitary μ hU hU', map_pderiv_star_of_unitary ν hU hU'] + simp only [mul_neg, ← mul_assoc] + abel + have hcancel : ∀ P Q : Matrix κ κ JetRing, (P - Q) + (-P - -Q) = 0 := + fun P Q => by abel + refine M.lieJ_injective ?_ + rw [map_add, map_sub, M.lieJ_deriv, M.lieJ_deriv, M.lieJ_bracket, M.lieJ_maurerCartan, + M.lieJ_maurerCartan, map_zero, map_pderiv_smul, map_pderiv_smul, ← smul_sub, ← hA, key] + simp only [smul_mul_smul_comm, Complex.I_mul_I, neg_one_smul, ← smul_add, hcancel, smul_zero] + +lemma deriv_adjoint (U : GJ) (μ : Fin 1 ⊕ Fin 3) (x : 𝔤J) : + M.deriv μ (M.adjoint U x) = M.adjoint U (M.deriv μ x) + - ⁅M.maurerCartan U μ, M.adjoint U x⁆ := by + set V := M.toMatJ U with hV + have hVV : star V * V = 1 := M.star_toMatJ_mul U + have hq : (star V).map (pderiv μ) = -(star V * V.map (pderiv μ) * star V) := + map_pderiv_star_of_unitary μ (M.toMatJ_mul_star U) hVV + refine M.lieJ_injective ?_ + rw [map_sub, M.lieJ_deriv, M.lieJ_adjoint, M.lieJ_adjoint, M.lieJ_bracket, + M.lieJ_maurerCartan, M.lieJ_adjoint, M.lieJ_deriv, JetRing.matrix_map_pderiv_mul, + JetRing.matrix_map_pderiv_mul, 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 + +/-- Evaluation of Lie algebra jets, as a morphism of Lie algebras. -/ +noncomputable def evalLieHom : 𝔤J →ₗ⁅ℝ⁆ 𝔤 where + toLinearMap := M.evalLie + map_lie' := M.evalLie_lie _ _ + +@[simp] +lemma evalLieHom_apply (a : 𝔤J) : M.evalLieHom a = M.evalLie a := rfl + +/-- **The local gauge data presented by matrices of jets.** -/ +noncomputable def toLocalGaugeData : LocalGaugeData G₀ 𝔤 GJ 𝔤J where + eval := M.eval + ofConstant := M.ofConstant + eval_ofConstant := M.eval_ofConstant + evalLie := M.evalLieHom + ofConstantLie := M.ofConstantLie + ofConstantLie_lie := M.ofConstantLie_lie + evalLie_ofConstantLie := M.evalLie_ofConstantLie + deriv := M.deriv + deriv_comm := M.deriv_comm + deriv_bracket := M.deriv_bracket + deriv_ofConstantLie := M.deriv_ofConstantLie + coord := M.coord + deriv_coord := M.deriv_coord + evalLie_coord := M.evalLie_coord + coord_lie := M.coord_lie + adjoint := M.adjoint + adjoint_lie := M.adjoint_lie + adjointValue := M.adjointValue + evalLie_adjoint := M.evalLie_adjoint + maurerCartan := M.maurerCartan + maurerCartan_ofConstant := M.maurerCartan_ofConstant + maurerCartan_cocycle := M.maurerCartan_cocycle + maurerCartan_structure := M.maurerCartan_structure + deriv_adjoint := M.deriv_adjoint + +@[simp] lemma toLocalGaugeData_eval : M.toLocalGaugeData.eval = M.eval := rfl +@[simp] lemma toLocalGaugeData_ofConstant : M.toLocalGaugeData.ofConstant = M.ofConstant := rfl +@[simp] lemma toLocalGaugeData_evalLie_apply (a : 𝔤J) : + M.toLocalGaugeData.evalLie a = M.evalLie a := rfl +@[simp] lemma toLocalGaugeData_ofConstantLie : + M.toLocalGaugeData.ofConstantLie = M.ofConstantLie := rfl +@[simp] lemma toLocalGaugeData_deriv (μ : Fin 1 ⊕ Fin 3) : + M.toLocalGaugeData.deriv μ = M.deriv μ := rfl +@[simp] lemma toLocalGaugeData_coord (μ : Fin 1 ⊕ Fin 3) : + M.toLocalGaugeData.coord μ = M.coord μ := rfl +@[simp] lemma toLocalGaugeData_adjoint : M.toLocalGaugeData.adjoint = M.adjoint := rfl +@[simp] lemma toLocalGaugeData_adjointValue : + M.toLocalGaugeData.adjointValue = M.adjointValue := rfl +@[simp] lemma toLocalGaugeData_maurerCartan : + M.toLocalGaugeData.maurerCartan = M.maurerCartan := rfl + +/-! + +## D. The iterated derivative and faithfulness + +-/ + +/-- The iterated derivative is the entrywise iterated formal derivative. -/ +lemma lieJ_iteratedDeriv (s : Multiset (Fin 1 ⊕ Fin 3)) (a : 𝔤J) : + M.lieJ (M.toLocalGaugeData.iteratedDeriv s a) + = (M.lieJ a).map fun f => s.foldl (fun h ρ => pderiv ρ h) f := by + induction s using Multiset.induction_on generalizing a with + | empty => + rw [iteratedDeriv_zero, LinearMap.id_apply] + ext i j : 1 + simp [Matrix.map_apply] + | cons μ t ih => + rw [iteratedDeriv_cons, LinearMap.comp_apply, toLocalGaugeData_deriv, M.lieJ_deriv, ih, + Matrix.map_map] + ext i j : 1 + simp only [Matrix.map_apply, Function.comp_apply, Multiset.foldl_cons] + exact (JetRing.foldl_pderiv_pderiv t μ _).symm + +/-- The base-point value of the iterated derivative, entrywise. -/ +lemma lie₀_evalLie_iteratedDeriv (s : Multiset (Fin 1 ⊕ Fin 3)) (a : 𝔤J) : + M.lie₀ (M.toLocalGaugeData.evalLie (M.toLocalGaugeData.iteratedDeriv s a)) + = (M.lieJ a).map fun f => constantCoeff (s.foldl (fun h ρ => pderiv ρ h) f) := by + rw [toLocalGaugeData_evalLie_apply, M.lie₀_evalLie, M.lieJ_iteratedDeriv, + RingHom.mapMatrix_apply, Matrix.map_map] + rfl + +/-- **A package presented by matrices is faithful**: a jet is determined entrywise by the + constant coefficients of its derivatives, and a jet with vanishing Maurer–Cartan form has + constant entries. -/ +theorem faithful : M.toLocalGaugeData.Faithful where + ext_of_evalLie_iteratedDeriv {x y} h := by + refine M.lieJ_injective (Matrix.ext fun i j => ?_) + refine JetRing.ext_of_constantCoeff_foldl_pderiv fun s => ?_ + have hs := congrArg M.lie₀ (h s) + rw [M.lie₀_evalLie_iteratedDeriv, M.lie₀_evalLie_iteratedDeriv] at hs + simpa only [Matrix.map_apply] using congrArg (fun A => A i j) hs + eq_ofConstant_of_maurerCartan_eq_zero {U} h := by + have hU : M.toMatJ U * star (M.toMatJ U) = 1 := M.toMatJ_mul_star U + have hd : ∀ μ, (M.toMatJ U).map (pderiv μ) = 0 := fun μ => by + have h1 : Complex.I • ((M.toMatJ U).map (pderiv μ) * star (M.toMatJ U)) = 0 := by + rw [← M.lieJ_maurerCartan, show M.maurerCartan U μ = 0 from congrFun h μ, map_zero] + have h2 : (M.toMatJ U).map (pderiv μ) * star (M.toMatJ U) = 0 := by + have := congrArg (fun A => (-Complex.I) • A) h1 + simpa [smul_smul, Complex.I_mul_I] using this + calc (M.toMatJ U).map (pderiv μ) + = (M.toMatJ U).map (pderiv μ) * (star (M.toMatJ U) * M.toMatJ U) := by + rw [M.star_toMatJ_mul, mul_one] + _ = 0 := by rw [← mul_assoc, h2, zero_mul] + refine M.toMatJ_injective (Matrix.ext fun i j => ?_) + rw [toLocalGaugeData_ofConstant, toLocalGaugeData_eval, M.toMatJ_ofConstant, M.toMat₀_eval, + RingHom.mapMatrix_apply, RingHom.mapMatrix_apply, Matrix.map_map] + show M.toMatJ U i j = C (constantCoeff (M.toMatJ U i j)) + exact JetRing.eq_C_of_pderiv_eq_zero fun μ => congrArg (fun A => A i j) (hd μ) + +/-! + +## E. The canonical factor + +-/ + +/-- **The canonical `SU`-type factor** of a package presented by matrices: the matrices of + jets themselves. -/ +noncomputable def suFactor : SUFactor M.toLocalGaugeData κ where + u := M.toMatJ + u_one := map_one M.toMatJ + u_mul := map_mul M.toMatJ + u_unitary := M.star_toMatJ_mul + φ := M.lie₀ + φJ := M.lieJ + φJ_ofConstantLie a := M.lieJ_ofConstantLie a + φJ_cc_foldl p a := (M.lie₀_evalLie_iteratedDeriv p a).symm + φJ_maurerCartan U μ := M.lieJ_maurerCartan U μ + φJ_adjoint U c := M.lieJ_adjoint U (M.ofConstantLie c) + +end MatrixJets + +end LocalGaugeData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/SU/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/SU/Basic.lean index ba9f9bd98..7c7b41f59 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/SU/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/SU/Basic.lean @@ -6,9 +6,8 @@ Authors: Jinzheng Li module public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.SU.Algebra -public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Factor +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.MatrixJets public import Physlib.Relativity.JetRing.Jacobi -public import Physlib.Relativity.JetRing.Taylor /-! # The local gauge data of `SU(n)` @@ -22,13 +21,16 @@ matrices of power series. Evaluation and the constant inclusion act entrywise, t action is conjugation, and the Maurer–Cartan form is `i (∂_μ U) U⁻¹`, hermitian by the differentiated unitarity relation and traceless by Jacobi's formula. -The package comes with its canonical `SUFactor` and is faithful. +This is a presentation by matrices of jets, `LocalGaugeData.suMatrixJets n`, so the laws of +the local gauge data, its canonical `SUFactor` and its faithfulness come from +`Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.MatrixJets`. What this file +supplies is the carriers and the structure maps on them. ## ii. Key results - `SU`, `JetSU`, `SUAlgebra`, `JetSUAlgebra` : the carriers. -- `JetSUAlgebra.mc` : the Maurer–Cartan form, with `mc_cocycle`, `mc_structure` and - `deriv_adjoint`. +- `JetSUAlgebra.mc` : the Maurer–Cartan form. +- `LocalGaugeData.suMatrixJets` : the presentation of `SU(n)` by matrices of jets. - `LocalGaugeData.su` : the local gauge data of `SU(n)`. - `LocalGaugeData.suFactor` : its canonical `SU(n)` factor. - `LocalGaugeData.instFaithfulSU` : the package is faithful. @@ -38,9 +40,8 @@ The package comes with its canonical `SUFactor` and is faithful. - A. The carriers - B. The structure maps on the group - C. The structure maps on the Lie algebra -- D. The Maurer–Cartan form and the identities -- E. The local gauge data -- F. The canonical factor and faithfulness +- D. The Maurer–Cartan form +- E. The presentation and the local gauge data -/ @@ -105,12 +106,6 @@ lemma star_val_eq_adjugate (U : JetSU n) : star U.1 = U.1.adjugate := by _ = star U.1 * U.1 * U.1.adjugate := by rw [mul_assoc] _ = U.1.adjugate := by rw [star_mul_val, one_mul] -/-- Entrywise inclusion of constants commutes with the conjugate transpose. -/ -lemma mapMatrix_C_star {κ : Type} [Fintype κ] [DecidableEq κ] (A : Matrix κ κ ℂ) : - (C : ℂ →+* JetRing).mapMatrix (star A) = star ((C : ℂ →+* JetRing).mapMatrix A) := by - ext i j - simp [RingHom.mapMatrix_apply, Matrix.map_apply, Matrix.star_apply] - /-- Evaluation of a jet of an `SU(n)` gauge transformation at the base point: the entrywise constant coefficient. -/ noncomputable def eval : JetSU n →* SU n where @@ -138,8 +133,8 @@ noncomputable def ofConstant : SU n →* JetSU n where 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] + (C : ℂ →+* JetRing).mapMatrix (star u.1) from + (LocalGaugeData.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) @@ -147,41 +142,6 @@ noncomputable def ofConstant : SU n →* JetSU n where @[simp] lemma ofConstant_val (u : SU n) : (ofConstant u).1 = (C : ℂ →+* JetRing).mapMatrix u.1 := rfl -@[simp] -lemma eval_ofConstant (g : SU n) : eval (ofConstant g) = g := by - refine Subtype.ext ?_ - ext i j - simp [RingHom.mapMatrix_apply, Matrix.map_apply] - -/-- The entrywise derivative commutes with the conjugate transpose. -/ -lemma star_map_pderiv {κ : Type} [Fintype κ] (μ : Fin 1 ⊕ Fin 3) (A : Matrix κ κ JetRing) : - 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 - -/-- The entrywise derivative of the conjugate transpose of a unitary matrix, through the - differentiated unitarity relation. -/ -lemma map_pderiv_star_val (μ : Fin 1 ⊕ Fin 3) (U : JetSU n) : - (star U.1).map (pderiv μ) = -(star U.1 * U.1.map (pderiv μ) * star U.1) := by - have h1 : U.1 * (star U.1).map (pderiv μ) = -(U.1.map (pderiv μ) * star U.1) := - eq_neg_of_add_eq_zero_right (by - rw [← JetRing.matrix_map_pderiv_mul, val_mul_star] - exact Matrix.ext fun i j => by - simp [Matrix.map_apply, Matrix.one_apply, apply_ite (pderiv μ)]) - calc (star U.1).map (pderiv μ) - = star U.1 * U.1 * (star U.1).map (pderiv μ) := by rw [star_mul_val, one_mul] - _ = -(star U.1 * U.1.map (pderiv μ) * star U.1) := by - rw [mul_assoc, h1, mul_neg, ← mul_assoc] - -/-- The Maurer–Cartan matrix `i (∂_μ U) U†` is hermitian. -/ -lemma star_mcMatrix (μ : Fin 1 ⊕ Fin 3) (U : JetSU n) : - star (Complex.I • (U.1.map (pderiv μ) * star U.1)) - = Complex.I • (U.1.map (pderiv μ) * star U.1) := by - rw [star_smul, star_mul, star_star, star_map_pderiv, map_pderiv_star_val, Complex.star_def, - Complex.conj_I, neg_smul, mul_neg, smul_neg, neg_neg, ← mul_assoc, ← mul_assoc, - val_mul_star, one_mul] - /-- The Maurer–Cartan matrix `i (∂_μ U) U†` is traceless, by Jacobi's formula and `det U = 1`. -/ lemma trace_mcMatrix (μ : Fin 1 ⊕ Fin 3) (U : JetSU n) : @@ -204,7 +164,7 @@ variable {n : ℕ} /-- The formal derivative in the direction `μ`, entrywise. -/ noncomputable def deriv (μ : Fin 1 ⊕ Fin 3) : JetSUAlgebra n →ₗ[ℝ] JetSUAlgebra n where toFun a := SUAlgebraOver.ofMatrix (a.1.map (pderiv μ)) - (by rw [JetSU.star_map_pderiv, a.star_val]) + (by rw [LocalGaugeData.star_map_pderiv, a.star_val]) (by rw [← AddMonoidHom.map_trace, a.trace_val, map_zero]) map_add' a b := Subtype.ext (by ext i j : 1 @@ -231,13 +191,6 @@ noncomputable def coord (μ : Fin 1 ⊕ Fin 3) : JetSUAlgebra n →ₗ[ℝ] JetS lemma coord_val (μ : Fin 1 ⊕ Fin 3) (a : JetSUAlgebra n) : (coord μ a).1 = (X μ : JetRing) • a.1 := rfl -lemma mapMatrix_constantCoeff_smul {κ : Type} [Fintype κ] [DecidableEq κ] (c : ℂ) - (M : Matrix κ κ JetRing) : - (constantCoeff : JetRing →+* ℂ).mapMatrix (c • M) - = c • (constantCoeff : JetRing →+* ℂ).mapMatrix M := by - ext i j - simp [RingHom.mapMatrix_apply, Matrix.map_apply] - lemma star_mapMatrix_constantCoeff (a : JetSUAlgebra n) : star ((constantCoeff : JetRing →+* ℂ).mapMatrix a.1) = (constantCoeff : JetRing →+* ℂ).mapMatrix a.1 := by @@ -247,9 +200,8 @@ lemma trace_mapMatrix_constantCoeff (a : JetSUAlgebra n) : ((constantCoeff : JetRing →+* ℂ).mapMatrix a.1).trace = 0 := by rw [RingHom.mapMatrix_apply, ← AddMonoidHom.map_trace, a.trace_val, map_zero] -/-- Evaluation at the base point: the entrywise constant coefficient, a morphism of Lie - algebras. -/ -noncomputable def evalLie : JetSUAlgebra n →ₗ⁅ℝ⁆ SUAlgebra n where +/-- Evaluation at the base point: the entrywise constant coefficient. -/ +noncomputable def evalLie : JetSUAlgebra n →ₗ[ℝ] SUAlgebra n where toFun a := SUAlgebraOver.ofMatrix ((constantCoeff : JetRing →+* ℂ).mapMatrix a.1) (star_mapMatrix_constantCoeff a) (trace_mapMatrix_constantCoeff a) map_add' a b := Subtype.ext (by @@ -260,11 +212,6 @@ noncomputable def evalLie : JetSUAlgebra n →ₗ⁅ℝ⁆ SUAlgebra n where ext i j simp only [RingHom.mapMatrix_apply, Matrix.map_apply, Matrix.smul_apply] rw [← algebraMap_smul ℂ r, constantCoeff_smul, algebraMap_smul]) - map_lie' := by - intro a b - refine Subtype.ext ?_ - simp only [SUAlgebraOver.ofMatrix_val, SUAlgebraOver.bracket_val] - rw [mapMatrix_constantCoeff_smul, map_sub, map_mul, map_mul] @[simp] lemma evalLie_val (a : JetSUAlgebra n) : @@ -275,7 +222,7 @@ lemma C_smul (r : ℝ) (x : ℂ) : (C (r • x) : JetRing) = r • C x := by lemma star_mapMatrix_C (a : SUAlgebra n) : star ((C : ℂ →+* JetRing).mapMatrix a.1) = (C : ℂ →+* JetRing).mapMatrix a.1 := by - rw [← JetSU.mapMatrix_C_star, a.star_val] + rw [← LocalGaugeData.mapMatrix_C_star, a.star_val] lemma trace_mapMatrix_C (a : SUAlgebra n) : ((C : ℂ →+* JetRing).mapMatrix a.1).trace = 0 := by rw [RingHom.mapMatrix_apply, ← AddMonoidHom.map_trace, a.trace_val, map_zero] @@ -297,25 +244,6 @@ noncomputable def ofConstantLie : SUAlgebra n →ₗ[ℝ] JetSUAlgebra n where lemma ofConstantLie_val (a : SUAlgebra n) : (ofConstantLie a).1 = (C : ℂ →+* JetRing).mapMatrix a.1 := rfl -lemma mapMatrix_C_smul {κ : Type} [Fintype κ] [DecidableEq κ] (c : ℂ) (M : Matrix κ κ ℂ) : - (C : ℂ →+* JetRing).mapMatrix (c • M) = c • (C : ℂ →+* JetRing).mapMatrix M := by - ext i j : 1 - simp only [RingHom.mapMatrix_apply, Matrix.map_apply, Matrix.smul_apply, - MvPowerSeries.smul_eq_C_mul, smul_eq_mul, map_mul] - -/-- The constant inclusion is a morphism of Lie algebras. -/ -lemma ofConstantLie_lie (a b : SUAlgebra n) : - ofConstantLie ⁅a, b⁆ = ⁅ofConstantLie a, ofConstantLie b⁆ := by - refine Subtype.ext ?_ - simp only [ofConstantLie_val, SUAlgebraOver.bracket_val] - rw [mapMatrix_C_smul, map_sub, map_mul, map_mul] - -@[simp] -lemma evalLie_ofConstantLie (a : SUAlgebra n) : evalLie (ofConstantLie a) = a := by - refine Subtype.ext ?_ - ext i j - simp [RingHom.mapMatrix_apply, Matrix.map_apply, constantCoeff_C] - /-- The adjoint action `a ↦ U a U†` of the jets of `SU(n)` on the jets of `su(n)`. -/ noncomputable def adjoint : Representation ℝ (JetSU n) (JetSUAlgebra n) := (SUAlgebraOver.conj (R := JetRing)).comp (specialUnitaryToUnitary JetRing n) @@ -334,258 +262,86 @@ lemma adjointValue_val (U : SU n) (a : SUAlgebra n) : /-! -## D. The Maurer–Cartan form and the identities +## D. The Maurer–Cartan form -/ /-- The Maurer–Cartan form `i (∂_μ U) U†` of an `SU(n)` gauge jet. -/ noncomputable def mc (U : JetSU n) (μ : Fin 1 ⊕ Fin 3) : JetSUAlgebra n := SUAlgebraOver.ofMatrix (Complex.I • (U.1.map (pderiv μ) * star U.1)) - (JetSU.star_mcMatrix μ U) (JetSU.trace_mcMatrix μ U) + (LocalGaugeData.star_mcMatrix μ (JetSU.val_mul_star U) (JetSU.star_mul_val U)) + (JetSU.trace_mcMatrix μ U) @[simp] lemma mc_val (U : JetSU n) (μ : Fin 1 ⊕ Fin 3) : (mc U μ).1 = Complex.I • (U.1.map (pderiv μ) * star U.1) := rfl -lemma deriv_comm (μ ν : Fin 1 ⊕ Fin 3) (a : JetSUAlgebra n) : - deriv μ (deriv ν a) = deriv ν (deriv μ a) := by - refine Subtype.ext ?_ - ext i j : 1 - simp [Matrix.map_apply, JetRing.pderiv_comm μ ν] - -/-- Pulling a complex scalar out of the entrywise derivative. -/ -lemma map_pderiv_smul {κ : Type} (μ : Fin 1 ⊕ Fin 3) (c : ℂ) (M : Matrix κ κ JetRing) : - (c • M).map (pderiv μ) = c • M.map (pderiv μ) := - Matrix.ext fun _ _ => Derivation.map_smul _ _ _ - -lemma map_pderiv_sub {κ : Type} (μ : Fin 1 ⊕ Fin 3) (M N : Matrix κ κ JetRing) : - (M - N).map (pderiv μ) = M.map (pderiv μ) - N.map (pderiv μ) := by - ext i j : 1 - simp only [Matrix.map_apply, Matrix.sub_apply, map_sub] - -/-- The derivative is a derivation of the bracket. -/ -lemma deriv_bracket (μ : Fin 1 ⊕ Fin 3) (x y : JetSUAlgebra n) : - deriv μ ⁅x, y⁆ = ⁅deriv μ x, y⁆ + ⁅x, deriv μ y⁆ := by - refine Subtype.ext ?_ - simp only [deriv_val, SUAlgebraOver.bracket_val, Submodule.coe_add, map_pderiv_smul, - map_pderiv_sub, JetRing.matrix_map_pderiv_mul] - rw [← smul_add] - congr 1 - abel - -@[simp] -lemma deriv_ofConstantLie (μ : Fin 1 ⊕ Fin 3) (a : SUAlgebra n) : - deriv μ (ofConstantLie a) = 0 := by - refine Subtype.ext ?_ - ext i j : 1 - simp [Matrix.map_apply, RingHom.mapMatrix_apply, pderiv_C] - -/-- The Leibniz rule for a coordinate: `∂_μ (x_ν a) = x_ν ∂_μ a + δ_{μν} a`. -/ -lemma deriv_coord (μ ν : Fin 1 ⊕ Fin 3) (a : JetSUAlgebra n) : - deriv μ (coord ν a) = coord ν (deriv μ a) + if μ = ν then a else 0 := by - by_cases h : μ = ν - · subst h - rw [ite_eq_left rfl] - refine Subtype.ext ?_ - ext i j - simp only [deriv_val, coord_val, Submodule.coe_add, Matrix.map_apply, Matrix.smul_apply, - Matrix.add_apply, smul_eq_mul, Derivation.leibniz, pderiv_X_self] - ring - · rw [ite_eq_right h, add_zero] - refine Subtype.ext ?_ - ext i j - simp only [deriv_val, coord_val, Matrix.map_apply, Matrix.smul_apply, smul_eq_mul, - Derivation.leibniz, pderiv_X_of_ne (Ne.symm h), mul_zero, add_zero] - -/-- A coordinate vanishes at the base point. -/ -lemma evalLie_coord (μ : Fin 1 ⊕ Fin 3) (a : JetSUAlgebra n) : evalLie (coord μ a) = 0 := by - refine Subtype.ext ?_ - ext i j - simp [RingHom.mapMatrix_apply, Matrix.map_apply, Matrix.smul_apply] - -/-- The coordinates are central for the bracket. -/ -lemma coord_lie (μ : Fin 1 ⊕ Fin 3) (a b : JetSUAlgebra n) : - ⁅coord μ a, b⁆ = coord μ ⁅a, b⁆ := by - refine Subtype.ext ?_ - simp only [SUAlgebraOver.bracket_val, coord_val, Matrix.smul_mul, Matrix.mul_smul, smul_sub, - smul_comm (X μ : JetRing) Complex.I] - -lemma adjoint_lie (U : JetSU n) (x y : JetSUAlgebra n) : - adjoint U ⁅x, y⁆ = ⁅adjoint U x, adjoint U y⁆ := - SUAlgebraOver.conj_lie _ x y - -/-- At the base point the adjoint action of a jet is the adjoint action of its value. -/ -lemma evalLie_adjoint (U : JetSU n) (x : JetSUAlgebra n) : - evalLie (adjoint U x) = adjointValue (JetSU.eval U) (evalLie x) := by - refine Subtype.ext ?_ - simp only [evalLie_val, adjoint_val, adjointValue_val, JetSU.eval_val, map_mul, - JetRing.mapMatrix_constantCoeff_star] - -@[simp] -lemma mc_ofConstant (g : SU n) (μ : Fin 1 ⊕ Fin 3) : mc (JetSU.ofConstant g) μ = 0 := by - refine Subtype.ext ?_ - ext i j : 1 - simp [Matrix.mul_apply, Matrix.map_apply, RingHom.mapMatrix_apply, pderiv_C] - -/-- The Maurer–Cartan form is a cocycle for the adjoint action. -/ -lemma mc_cocycle (U V : JetSU n) (μ : Fin 1 ⊕ Fin 3) : - mc (U * V) μ = mc U μ + adjoint U (mc V μ) := by - refine Subtype.ext ?_ - simp only [mc_val, Submodule.coe_add, adjoint_val, Submonoid.coe_mul] - rw [JetRing.matrix_map_pderiv_mul, star_mul, add_mul, smul_add, mul_smul_comm, - smul_mul_assoc] - congr 1 - · rw [mul_assoc, ← mul_assoc V.1, JetSU.val_mul_star, one_mul] - · simp only [mul_assoc] - -/-- The Maurer–Cartan form is flat: `∂_μ ω_ν − ∂_ν ω_μ + ⁅ω_μ, ω_ν⁆ = 0`. -/ -lemma mc_structure (U : JetSU n) (μ ν : Fin 1 ⊕ Fin 3) : - deriv μ (mc U ν) - deriv ν (mc U μ) + ⁅mc U μ, mc U ν⁆ = 0 := by - set A := U.1 with hA - have key : (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 - rw [JetRing.matrix_map_pderiv_mul, JetRing.matrix_map_pderiv_mul, - show (A.map (pderiv ν)).map (pderiv μ) = (A.map (pderiv μ)).map (pderiv ν) - from Matrix.ext fun _ _ => JetRing.pderiv_comm μ ν _, - JetSU.map_pderiv_star_val μ, JetSU.map_pderiv_star_val ν] - simp only [mul_neg, ← mul_assoc] - abel - have hcancel : ∀ P Q : Matrix (Fin n) (Fin n) JetRing, (P - Q) + (-P - -Q) = 0 := - fun P Q => by abel - refine Subtype.ext ?_ - simp only [Submodule.coe_add, Submodule.coe_sub, deriv_val, SUAlgebraOver.bracket_val, mc_val, - map_pderiv_smul, smul_mul_smul_comm, Submodule.coe_zero] - rw [← smul_sub, key, Complex.I_mul_I, neg_one_smul, neg_one_smul, ← smul_add, hcancel, - smul_zero] - -/-- The derivative of the adjoint action: `∂_μ (Ad_U x) = Ad_U (∂_μ x) − ⁅ω_μ(U), Ad_U x⁆`. -/ -lemma deriv_adjoint (U : JetSU n) (μ : Fin 1 ⊕ Fin 3) (x : JetSUAlgebra n) : - deriv μ (adjoint U x) = adjoint U (deriv μ x) - ⁅mc U μ, adjoint U x⁆ := by - set V := U.1 with hV - have hVV : star V * V = 1 := JetSU.star_mul_val U - have hq : (star V).map (pderiv μ) = -(star V * V.map (pderiv μ) * star V) := - JetSU.map_pderiv_star_val μ U - refine Subtype.ext ?_ - simp only [deriv_val, adjoint_val, Submodule.coe_sub, SUAlgebraOver.bracket_val, mc_val] - rw [JetRing.matrix_map_pderiv_mul, JetRing.matrix_map_pderiv_mul, 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 - end JetSUAlgebra /-! -## E. The local gauge data +## E. The presentation and the local gauge data -/ namespace LocalGaugeData -/-- **The local gauge data of `SU(n)`**: special unitary jets, traceless hermitian jets - with the bracket `i (a b − b a)` and the conjugation action, and the Maurer–Cartan form - `i (∂_μ U) U⁻¹`. -/ -noncomputable def su (n : ℕ) : LocalGaugeData (SU n) (SUAlgebra n) (JetSU n) (JetSUAlgebra n) - where +/-- **The presentation of `SU(n)` by matrices of jets**: the carriers are subtypes of + matrices and every structure map is the matrix one. -/ +noncomputable def suMatrixJets (n : ℕ) : + MatrixJets (Fin n) (SU n) (SUAlgebra n) (JetSU n) (JetSUAlgebra n) where + toMat₀ := (specialUnitaryGroup (Fin n) ℂ).subtype + toMat₀_injective _ _ h := Subtype.ext h + toMatJ := (specialUnitaryGroup (Fin n) JetRing).subtype + toMatJ_injective _ _ h := Subtype.ext h + toMatJ_mul_star := JetSU.val_mul_star + star_toMatJ_mul := JetSU.star_mul_val + lie₀ := (SUAlgebraOver.submodule ℂ n).subtype + lie₀_injective _ _ h := Subtype.ext h + lie₀_bracket _ _ := rfl + lieJ := (SUAlgebraOver.submodule JetRing n).subtype + lieJ_injective _ _ h := Subtype.ext h + lieJ_bracket _ _ := rfl eval := JetSU.eval + toMat₀_eval _ := rfl ofConstant := JetSU.ofConstant - eval_ofConstant := JetSU.eval_ofConstant + toMatJ_ofConstant _ := rfl evalLie := JetSUAlgebra.evalLie + lie₀_evalLie _ := rfl ofConstantLie := JetSUAlgebra.ofConstantLie - ofConstantLie_lie := JetSUAlgebra.ofConstantLie_lie - evalLie_ofConstantLie := JetSUAlgebra.evalLie_ofConstantLie + lieJ_ofConstantLie _ := rfl deriv := JetSUAlgebra.deriv - deriv_comm := JetSUAlgebra.deriv_comm - deriv_bracket := JetSUAlgebra.deriv_bracket - deriv_ofConstantLie := JetSUAlgebra.deriv_ofConstantLie + lieJ_deriv _ _ := rfl coord := JetSUAlgebra.coord - deriv_coord := JetSUAlgebra.deriv_coord - evalLie_coord := JetSUAlgebra.evalLie_coord - coord_lie := JetSUAlgebra.coord_lie + lieJ_coord _ _ := rfl adjoint := JetSUAlgebra.adjoint - adjoint_lie := JetSUAlgebra.adjoint_lie + lieJ_adjoint _ _ := rfl adjointValue := JetSUAlgebra.adjointValue - evalLie_adjoint := JetSUAlgebra.evalLie_adjoint + lie₀_adjointValue _ _ := rfl maurerCartan := JetSUAlgebra.mc - maurerCartan_ofConstant := JetSUAlgebra.mc_ofConstant - maurerCartan_cocycle := JetSUAlgebra.mc_cocycle - maurerCartan_structure := JetSUAlgebra.mc_structure - deriv_adjoint := JetSUAlgebra.deriv_adjoint + lieJ_maurerCartan _ _ := rfl + +/-- **The local gauge data of `SU(n)`**: special unitary jets, traceless hermitian jets + with the bracket `i (a b − b a)` and the conjugation action, and the Maurer–Cartan form + `i (∂_μ U) U⁻¹`. -/ +noncomputable def su (n : ℕ) : LocalGaugeData (SU n) (SUAlgebra n) (JetSU n) (JetSUAlgebra n) := + (suMatrixJets n).toLocalGaugeData variable {n : ℕ} @[simp] lemma su_eval : (su n).eval = JetSU.eval := rfl @[simp] lemma su_ofConstant : (su n).ofConstant = JetSU.ofConstant := rfl -@[simp] lemma su_evalLie : (su n).evalLie = JetSUAlgebra.evalLie := rfl +@[simp] lemma su_evalLie_apply (a : JetSUAlgebra n) : (su n).evalLie a = JetSUAlgebra.evalLie a := + rfl @[simp] lemma su_ofConstantLie : (su n).ofConstantLie = JetSUAlgebra.ofConstantLie := rfl @[simp] lemma su_deriv (μ : Fin 1 ⊕ Fin 3) : (su n).deriv μ = JetSUAlgebra.deriv μ := rfl @[simp] lemma su_adjoint : (su n).adjoint = JetSUAlgebra.adjoint := rfl @[simp] lemma su_maurerCartan : (su n).maurerCartan = JetSUAlgebra.mc := rfl -/-- The iterated derivative on `su(n)` jets is the entrywise iterated formal derivative. -/ -lemma su_iteratedDeriv_val (s : Multiset (Fin 1 ⊕ Fin 3)) (a : JetSUAlgebra n) : - ((su n).iteratedDeriv s a).1 = a.1.map fun f => s.foldl (fun h ρ => pderiv ρ h) f := by - induction s using Multiset.induction_on generalizing a with - | empty => - rw [iteratedDeriv_zero, LinearMap.id_apply] - ext i j : 1 - simp [Matrix.map_apply] - | cons μ t ih => - rw [iteratedDeriv_cons, LinearMap.comp_apply, su_deriv, JetSUAlgebra.deriv_val, ih, - Matrix.map_map] - ext i j : 1 - simp only [Matrix.map_apply, Function.comp_apply, Multiset.foldl_cons] - exact (JetRing.foldl_pderiv_pderiv t μ _).symm - -/-- The base-point value of the iterated derivative on `su(n)` jets, entrywise. -/ -lemma su_evalLie_iteratedDeriv_val (s : Multiset (Fin 1 ⊕ Fin 3)) (a : JetSUAlgebra n) : - ((su n).evalLie ((su n).iteratedDeriv s a)).1 - = a.1.map fun f => constantCoeff (s.foldl (fun h ρ => pderiv ρ h) f) := by - rw [su_evalLie, JetSUAlgebra.evalLie_val, su_iteratedDeriv_val, RingHom.mapMatrix_apply, - Matrix.map_map] - rfl - -/-! - -## F. The canonical factor and faithfulness - --/ - /-- The canonical `SU(n)` factor of the local gauge data of `SU(n)`. -/ -noncomputable def suFactor (n : ℕ) : SUFactor (su n) (Fin n) where - u U := U.1 - u_one := rfl - u_mul _ _ := rfl - u_unitary := JetSU.star_mul_val - φ := (SUAlgebraOver.submodule ℂ n).subtype - φJ a := a.1 - φJ_ofConstantLie _ := rfl - φJ_cc_foldl p a := (su_evalLie_iteratedDeriv_val p a).symm - φJ_maurerCartan _ _ := rfl - φJ_adjoint _ _ := rfl +noncomputable def suFactor (n : ℕ) : SUFactor (su n) (Fin n) := (suMatrixJets n).suFactor /-- The local gauge data of `SU(n)` is faithful. -/ -instance instFaithfulSU : (su n).Faithful where - ext_of_evalLie_iteratedDeriv {x y} h := by - refine Subtype.ext (Matrix.ext fun i j => ?_) - refine JetRing.ext_of_constantCoeff_foldl_pderiv fun s => ?_ - have hs := congrArg (fun a : SUAlgebra n => a.1 i j) (h s) - simpa only [su_evalLie_iteratedDeriv_val, Matrix.map_apply] using hs - eq_ofConstant_of_maurerCartan_eq_zero {U} h := by - have hd : ∀ μ, U.1.map (pderiv μ) = 0 := fun μ => by - have h1 : Complex.I • (U.1.map (pderiv μ) * star U.1) = 0 := - congrArg Subtype.val (congrFun h μ) - have h2 : U.1.map (pderiv μ) * star U.1 = 0 := by - have := congrArg (fun M => (-Complex.I) • M) h1 - simpa [smul_smul, Complex.I_mul_I] using this - calc U.1.map (pderiv μ) - = U.1.map (pderiv μ) * (star U.1 * U.1) := by rw [JetSU.star_mul_val, mul_one] - _ = 0 := by rw [← mul_assoc, h2, zero_mul] - refine Subtype.ext (Matrix.ext fun i j => ?_) - show U.1 i j = C (constantCoeff (U.1 i j)) - exact JetRing.eq_C_of_pderiv_eq_zero fun μ => congrArg (fun M => M i j) (hd μ) +instance instFaithfulSU : (su n).Faithful := (suMatrixJets n).faithful end LocalGaugeData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/U1.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/U1.lean index 0e871402e..f80b794a7 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/U1.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/U1.lean @@ -5,8 +5,7 @@ Authors: Jinzheng Li -/ module -public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Factor -public import Physlib.Relativity.JetRing.Taylor +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.MatrixJets /-! # The local gauge data of `U(1)` @@ -18,11 +17,15 @@ transformations are the unitary formal power series, the Lie algebra is the self (real) scalars and its jets the self-adjoint power series, with vanishing bracket and trivial adjoint action. The Maurer–Cartan form is `i (∂_μ u) u⁻¹`. -The package comes with its canonical `U1Factor` and is faithful. +Read as `1 × 1` matrices, this is a presentation by matrices of jets, +`LocalGaugeData.u1MatrixJets`, so the laws of the local gauge data and its faithfulness come +from `Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.MatrixJets`. What this file +supplies is the carriers, the structure maps on them, and the canonical `U1Factor`. ## ii. Key results - `U1`, `JetU1`, `U1Algebra`, `JetU1Algebra` : the carriers. +- `LocalGaugeData.u1MatrixJets` : the presentation of `U(1)` by `1 × 1` matrices of jets. - `LocalGaugeData.u1` : the local gauge data of `U(1)`. - `LocalGaugeData.u1Factor` : its canonical `U(1)` factor. - `LocalGaugeData.instFaithfulU1` : the package is faithful. @@ -32,8 +35,9 @@ The package comes with its canonical `U1Factor` and is faithful. - A. The carriers - B. The structure maps - C. The Maurer–Cartan form -- D. The local gauge data -- E. The canonical factor and faithfulness +- D. Scalars as `1 × 1` matrices +- E. The presentation and the local gauge data +- F. The canonical factor -/ @@ -120,10 +124,6 @@ noncomputable def ofConstant : U1 →* JetU1 where @[simp] lemma ofConstant_val (u : U1) : (ofConstant u : JetRing) = C (u : ℂ) := rfl -@[simp] -lemma eval_ofConstant (u : U1) : eval (ofConstant u) = u := - Subtype.ext (constantCoeff_C u.1) - /-- The formal derivative of a `u(1)` jet. -/ noncomputable def deriv (μ : Fin 1 ⊕ Fin 3) : JetU1Algebra →ₗ[ℝ] JetU1Algebra where toFun a := ⟨pderiv μ a.1, by @@ -151,7 +151,7 @@ lemma coord_val (μ : Fin 1 ⊕ Fin 3) (a : JetU1Algebra) : (coord μ a : JetRing) = (X μ : JetRing) * a := rfl /-- Evaluation of a `u(1)` jet at the base point. -/ -noncomputable def evalLie : JetU1Algebra →ₗ⁅ℝ⁆ U1Algebra where +noncomputable def evalLie : JetU1Algebra →ₗ[ℝ] U1Algebra where toFun a := ⟨constantCoeff a.1, by show star (constantCoeff a.1) = constantCoeff a.1 rw [← JetRing.constantCoeff_star, a.2]⟩ @@ -159,7 +159,6 @@ noncomputable def evalLie : JetU1Algebra →ₗ⁅ℝ⁆ U1Algebra where map_smul' r a := Subtype.ext (by show constantCoeff (r • a.1) = r • constantCoeff a.1 rw [← algebraMap_smul ℂ r, constantCoeff_smul, algebraMap_smul]) - map_lie' := by intro a b; simp @[simp] lemma evalLie_val (a : JetU1Algebra) : (evalLie a : ℂ) = constantCoeff (a : JetRing) := rfl @@ -203,99 +202,133 @@ noncomputable def mc (u : JetU1) (μ : Fin 1 ⊕ Fin 3) : JetU1Algebra := lemma mc_val (u : JetU1) (μ : Fin 1 ⊕ Fin 3) : (mc u μ : JetRing) = Complex.I • (pderiv μ (u : JetRing) * star (u : JetRing)) := rfl -lemma mc_ofConstant (g : U1) (μ : Fin 1 ⊕ Fin 3) : mc (ofConstant g) μ = 0 := - Subtype.ext (by simp [pderiv_C]) +/-! -/-- The Maurer–Cartan form of `U(1)` is additive: the abelian cocycle law. -/ -lemma mc_mul (u v : JetU1) (μ : Fin 1 ⊕ Fin 3) : mc (u * v) μ = mc u μ + mc v μ := by - refine Subtype.ext ?_ - have hu : (u : JetRing) * star (u : JetRing) = 1 := Unitary.mul_star_self_of_mem u.2 - have hv : (v : JetRing) * star (v : JetRing) = 1 := Unitary.mul_star_self_of_mem v.2 - show Complex.I • (pderiv μ ((u : JetRing) * (v : JetRing)) - * star ((u : JetRing) * (v : JetRing))) - = Complex.I • (pderiv μ (u : JetRing) * star (u : JetRing)) - + Complex.I • (pderiv μ (v : JetRing) * star (v : JetRing)) - rw [← smul_add, Derivation.leibniz, star_mul', smul_eq_mul, smul_eq_mul] - congr 1 - linear_combination (pderiv μ (u : JetRing) * star (u : JetRing)) * hv - + (pderiv μ (v : JetRing) * star (v : JetRing)) * hu - -/-- The Maurer–Cartan form of `U(1)` is flat: the derivatives of a phase commute. -/ -lemma pderiv_mcVal_comm (u : JetU1) (μ ν : Fin 1 ⊕ Fin 3) : - pderiv μ (pderiv ν (u : JetRing) * star (u : JetRing)) - = pderiv ν (pderiv μ (u : JetRing) * star (u : JetRing)) := by - have hu : (u : JetRing) * star (u : JetRing) = 1 := Unitary.mul_star_self_of_mem u.2 - 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)) * ((mul_comm _ _).trans hu) - simp only [Derivation.leibniz, smul_eq_mul] - rw [hstar μ, hstar ν, JetRing.pderiv_comm μ ν] - ring +## D. Scalars as `1 × 1` matrices -end JetU1 +The presentation of `U(1)` by matrices reads a scalar as the `1 × 1` scalar matrix. + +-/ + +section Scalar + +variable {R : Type} [CommRing R] [StarRing R] + +lemma scalar_star (x : R) : star (Matrix.scalar (Fin 1) x) = Matrix.scalar (Fin 1) (star x) := by + rw [Matrix.scalar_apply, Matrix.scalar_apply, Matrix.star_eq_conjTranspose, + Matrix.diagonal_conjTranspose] + rfl + +omit [StarRing R] in +lemma scalar_map {S : Type} [CommRing S] (f : R → S) (hf : f 0 = 0) (x : R) : + (Matrix.scalar (Fin 1) x).map f = Matrix.scalar (Fin 1) (f x) := by + rw [Matrix.scalar_apply, Matrix.scalar_apply, Matrix.diagonal_map hf] + +omit [StarRing R] in +lemma scalar_smul {M : Type} [Monoid M] [DistribMulAction M R] (c : M) (x : R) : + Matrix.scalar (Fin 1) (c • x) = c • Matrix.scalar (Fin 1) x := by + rw [Matrix.scalar_apply, Matrix.scalar_apply, ← Matrix.diagonal_smul] + rfl + +end Scalar /-! -## D. The local gauge data +## E. The presentation and the local gauge data -/ +end JetU1 + namespace LocalGaugeData -/-- **The local gauge data of `U(1)`**: unitary jets, self-adjoint scalar jets with - vanishing bracket and trivial adjoint action, and the Maurer–Cartan form - `i (∂_μ u) u⁻¹`. -/ -noncomputable def u1 : LocalGaugeData U1 U1Algebra JetU1 JetU1Algebra where +open JetU1 + +/-- **The presentation of `U(1)` by `1 × 1` matrices of jets.** -/ +noncomputable def u1MatrixJets : MatrixJets (Fin 1) U1 U1Algebra JetU1 JetU1Algebra where + toMat₀ := (Matrix.scalar (Fin 1) : ℂ →+* _).toMonoidHom.comp (unitary ℂ).subtype + toMat₀_injective _ _ h := Subtype.ext (Matrix.scalar_inj.mp h) + toMatJ := (Matrix.scalar (Fin 1) : JetRing →+* _).toMonoidHom.comp (unitary JetRing).subtype + toMatJ_injective _ _ h := Subtype.ext (Matrix.scalar_inj.mp h) + toMatJ_mul_star u := by + show Matrix.scalar (Fin 1) u.1 * star (Matrix.scalar (Fin 1) u.1) = 1 + rw [scalar_star, ← map_mul, Unitary.mul_star_self_of_mem u.2, map_one] + star_toMatJ_mul u := by + show star (Matrix.scalar (Fin 1) u.1) * Matrix.scalar (Fin 1) u.1 = 1 + rw [scalar_star, ← map_mul, Unitary.star_mul_self_of_mem u.2, map_one] + lie₀ := + { toFun a := Matrix.scalar (Fin 1) a.1 + map_add' a b := by rw [AddSubgroup.coe_add, map_add] + map_smul' r a := by rw [selfAdjoint.val_smul, scalar_smul, RingHom.id_apply] } + lie₀_injective _ _ h := Subtype.ext (Matrix.scalar_inj.mp h) + lie₀_bracket a b := by + show Matrix.scalar (Fin 1) ((0 : U1Algebra) : ℂ) + = Complex.I • (Matrix.scalar (Fin 1) a.1 * Matrix.scalar (Fin 1) b.1 + - Matrix.scalar (Fin 1) b.1 * Matrix.scalar (Fin 1) a.1) + rw [ZeroMemClass.coe_zero, map_zero, ← map_mul, ← map_mul, mul_comm a.1 b.1, sub_self, + smul_zero] + lieJ := + { toFun a := Matrix.scalar (Fin 1) a.1 + map_add' a b := by rw [AddSubgroup.coe_add, map_add] + map_smul' r a := by rw [selfAdjoint.val_smul, scalar_smul, RingHom.id_apply] } + lieJ_injective _ _ h := Subtype.ext (Matrix.scalar_inj.mp h) + lieJ_bracket a b := by + show Matrix.scalar (Fin 1) ((0 : JetU1Algebra) : JetRing) + = Complex.I • (Matrix.scalar (Fin 1) a.1 * Matrix.scalar (Fin 1) b.1 + - Matrix.scalar (Fin 1) b.1 * Matrix.scalar (Fin 1) a.1) + rw [ZeroMemClass.coe_zero, map_zero, ← map_mul, ← map_mul, mul_comm a.1 b.1, sub_self, + smul_zero] eval := JetU1.eval + toMat₀_eval u := by + show Matrix.scalar (Fin 1) (constantCoeff u.1) = (Matrix.scalar (Fin 1) u.1).map constantCoeff + rw [scalar_map _ (map_zero _)] ofConstant := JetU1.ofConstant - eval_ofConstant := JetU1.eval_ofConstant + toMatJ_ofConstant u := by + show Matrix.scalar (Fin 1) (C u.1) = (Matrix.scalar (Fin 1) u.1).map C + rw [scalar_map _ (map_zero _)] evalLie := JetU1.evalLie + lie₀_evalLie a := by + show Matrix.scalar (Fin 1) (constantCoeff a.1) = (Matrix.scalar (Fin 1) a.1).map constantCoeff + rw [scalar_map _ (map_zero _)] ofConstantLie := JetU1.ofConstantLie - ofConstantLie_lie _ _ := by simp - evalLie_ofConstantLie a := Subtype.ext (by simp) + lieJ_ofConstantLie a := by + show Matrix.scalar (Fin 1) (C a.1) = (Matrix.scalar (Fin 1) a.1).map C + rw [scalar_map _ (map_zero _)] deriv := JetU1.deriv - deriv_comm μ ν a := Subtype.ext (JetRing.pderiv_comm μ ν a.1) - deriv_bracket _ _ _ := by simp - deriv_ofConstantLie μ a := Subtype.ext (by simp [pderiv_C]) + lieJ_deriv μ a := by + show Matrix.scalar (Fin 1) (pderiv μ a.1) = (Matrix.scalar (Fin 1) a.1).map (pderiv μ) + rw [scalar_map _ (map_zero _)] coord := JetU1.coord - deriv_coord μ ν a := by - refine Subtype.ext ?_ - by_cases h : μ = ν - · subst h - rw [ite_eq_left rfl] - show pderiv μ ((X μ : JetRing) * a.1) = (X μ : JetRing) * pderiv μ a.1 + a.1 - rw [Derivation.leibniz, smul_eq_mul, smul_eq_mul, pderiv_X_self] - ring - · rw [ite_eq_right h, add_zero] - show pderiv μ ((X ν : JetRing) * a.1) = (X ν : JetRing) * pderiv μ a.1 - rw [Derivation.leibniz, smul_eq_mul, smul_eq_mul, pderiv_X_of_ne (Ne.symm h)] - ring - evalLie_coord μ a := Subtype.ext (by simp) - coord_lie _ _ _ := by simp + lieJ_coord μ a := by + show Matrix.scalar (Fin 1) ((X μ : JetRing) * a.1) = (X μ : JetRing) • Matrix.scalar (Fin 1) a.1 + rw [← smul_eq_mul, scalar_smul] adjoint := Representation.trivial ℝ JetU1 JetU1Algebra - adjoint_lie _ _ _ := by simp + lieJ_adjoint u a := by + show Matrix.scalar (Fin 1) a.1 + = Matrix.scalar (Fin 1) u.1 * Matrix.scalar (Fin 1) a.1 * star (Matrix.scalar (Fin 1) u.1) + rw [scalar_star, ← map_mul, ← map_mul, mul_comm u.1, mul_assoc, + Unitary.mul_star_self_of_mem u.2, mul_one] adjointValue := Representation.trivial ℝ U1 U1Algebra - evalLie_adjoint _ _ := rfl + lie₀_adjointValue u a := by + show Matrix.scalar (Fin 1) a.1 + = Matrix.scalar (Fin 1) u.1 * Matrix.scalar (Fin 1) a.1 * star (Matrix.scalar (Fin 1) u.1) + rw [scalar_star, ← map_mul, ← map_mul, mul_comm u.1, mul_assoc, + Unitary.mul_star_self_of_mem u.2, mul_one] maurerCartan := JetU1.mc - maurerCartan_ofConstant := JetU1.mc_ofConstant - maurerCartan_cocycle u v μ := by - rw [JetU1.mc_mul] - rfl - maurerCartan_structure u μ ν := by - refine Subtype.ext ?_ - show pderiv μ (Complex.I • (pderiv ν (u : JetRing) * star (u : JetRing))) - - pderiv ν (Complex.I • (pderiv μ (u : JetRing) * star (u : JetRing))) + 0 = 0 - rw [Derivation.map_smul, Derivation.map_smul, JetU1.pderiv_mcVal_comm, sub_self, add_zero] - deriv_adjoint _ _ _ := by simp + lieJ_maurerCartan u μ := by + show Matrix.scalar (Fin 1) (Complex.I • (pderiv μ u.1 * star u.1)) + = Complex.I • ((Matrix.scalar (Fin 1) u.1).map (pderiv μ) * star (Matrix.scalar (Fin 1) u.1)) + rw [scalar_smul, map_mul, scalar_star, scalar_map _ (map_zero _)] + +/-- **The local gauge data of `U(1)`**: unitary jets, self-adjoint scalar jets with + vanishing bracket and trivial adjoint action, and the Maurer–Cartan form + `i (∂_μ u) u⁻¹`. -/ +noncomputable def u1 : LocalGaugeData U1 U1Algebra JetU1 JetU1Algebra := + u1MatrixJets.toLocalGaugeData @[simp] lemma u1_eval : u1.eval = JetU1.eval := rfl @[simp] lemma u1_ofConstant : u1.ofConstant = JetU1.ofConstant := rfl -@[simp] lemma u1_evalLie : u1.evalLie = JetU1.evalLie := rfl +@[simp] lemma u1_evalLie_apply (a : JetU1Algebra) : u1.evalLie a = JetU1.evalLie a := rfl @[simp] lemma u1_ofConstantLie : u1.ofConstantLie = JetU1.ofConstantLie := rfl @[simp] lemma u1_deriv (μ : Fin 1 ⊕ Fin 3) : u1.deriv μ = JetU1.deriv μ := rfl @[simp] lemma u1_maurerCartan : u1.maurerCartan = JetU1.mc := rfl @@ -310,9 +343,12 @@ lemma u1_iteratedDeriv_val (s : Multiset (Fin 1 ⊕ Fin 3)) (a : JetU1Algebra) : rw [iteratedDeriv_cons, LinearMap.comp_apply, u1_deriv, JetU1.deriv_val, ih, Multiset.foldl_cons, JetRing.foldl_pderiv_pderiv] +/-- The local gauge data of `U(1)` is faithful. -/ +instance instFaithfulU1 : u1.Faithful := u1MatrixJets.faithful + /-! -## E. The canonical factor and faithfulness +## F. The canonical factor -/ @@ -332,24 +368,4 @@ noncomputable def u1Factor : U1Factor u1 where φJ_maurerCartan _ _ := rfl φJ_adjoint _ _ := rfl -/-- The local gauge data of `U(1)` is faithful. -/ -instance instFaithfulU1 : u1.Faithful where - ext_of_evalLie_iteratedDeriv {x y} h := Subtype.ext <| - JetRing.ext_of_constantCoeff_foldl_pderiv fun s => by - have hs := congrArg Subtype.val (h s) - simpa only [u1_evalLie, JetU1.evalLie_val, u1_iteratedDeriv_val] using hs - eq_ofConstant_of_maurerCartan_eq_zero {u} h := by - have hu : (u : JetRing) * star (u : JetRing) = 1 := Unitary.mul_star_self_of_mem u.2 - have hd : ∀ μ, pderiv μ (u : JetRing) = 0 := fun μ => by - have h1 : Complex.I • (pderiv μ (u : JetRing) * star (u : JetRing)) = 0 := - congrArg Subtype.val (congrFun h μ) - have h2 : pderiv μ (u : JetRing) * star (u : JetRing) = 0 := by - have := congrArg (fun z => (-Complex.I) • z) h1 - simpa [smul_smul, Complex.I_mul_I] using this - calc pderiv μ (u : JetRing) - = pderiv μ (u : JetRing) * ((u : JetRing) * star (u : JetRing)) := by - rw [hu, mul_one] - _ = 0 := by rw [mul_comm (u : JetRing), ← mul_assoc, h2, zero_mul] - exact Subtype.ext (JetRing.eq_C_of_pderiv_eq_zero hd) - end LocalGaugeData From 5ccd59b4324de2aeb91698bc14707c954893bef4 Mon Sep 17 00:00:00 2001 From: doxtor6 Date: Thu, 24 Sep 2026 09:29:55 -0400 Subject: [PATCH 362/367] chore: Remove unused lemmas from LocalGaugeData/Basic and Truncation `evalLie_adjoint_ofConstantLie_of_eval_eq_one`, `mem_truncationKer_iff`, `eval_eq_one_of_mem_truncationKer`, `evalLie_iteratedDeriv_maurerCartan_eq_zero_of_mem_truncationKer`, `truncationKer_antitone`, `adjointCoeff_eq_one_of_mem_truncationKer`, `adjointCoeff_mul_of_mem_truncationKer_left` and `truncationProjZero_surjective` were referenced nowhere. Co-authored-by: Claude Opus 4.8 --- .../GaugeTheory/LocalGaugeData/Basic.lean | 5 --- .../LocalGaugeData/Truncation.lean | 44 ------------------- 2 files changed, 49 deletions(-) diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Basic.lean index 5e969ae02..b4c1f759b 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Basic.lean @@ -174,11 +174,6 @@ lemma evalLie_adjoint_ofConstantLie (U : GJ) (a : 𝔤) : jets.evalLie (jets.adjoint U (jets.ofConstantLie a)) = jets.adjointValue (jets.eval U) a := by rw [jets.evalLie_adjoint, jets.evalLie_ofConstantLie] -/-- A jet with trivial value acts trivially on constants at the base point. -/ -lemma evalLie_adjoint_ofConstantLie_of_eval_eq_one {U : GJ} (hU : jets.eval U = 1) (a : 𝔤) : - jets.evalLie (jets.adjoint U (jets.ofConstantLie a)) = a := by - rw [evalLie_adjoint_ofConstantLie, hU, map_one, Module.End.one_apply] - /-- The Maurer–Cartan form is determined by the Leibniz rule, up to the centre. Since `adjoint U` is invertible, `deriv_adjoint` says exactly that the inner derivation `⁅maurerCartan U μ, ·⁆` is `adjoint U ∘ deriv μ ∘ adjoint U⁻¹ − deriv μ`; so any other diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Truncation.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Truncation.lean index 47af04112..59e302bb8 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Truncation.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Truncation.lean @@ -98,23 +98,6 @@ noncomputable def truncationKer (n : ℕ) : Subgroup GJ where exact jets.evalLie_iteratedDeriv_adjoint_eq_zero U⁻¹ fun q hq => hU.2 q μ (lt_of_le_of_lt (Multiset.card_le_card hq) hs) -lemma mem_truncationKer_iff {n : ℕ} {U : GJ} : - U ∈ jets.truncationKer n ↔ jets.eval U = 1 ∧ - ∀ (s : Multiset (Fin 1 ⊕ Fin 3)) (μ : Fin 1 ⊕ Fin 3), s.card < n → - jets.evalLie (jets.iteratedDeriv s (jets.maurerCartan U μ)) = 0 := Iff.rfl - -lemma eval_eq_one_of_mem_truncationKer {n : ℕ} {U : GJ} (hU : U ∈ jets.truncationKer n) : - jets.eval U = 1 := hU.1 - -lemma evalLie_iteratedDeriv_maurerCartan_eq_zero_of_mem_truncationKer {n : ℕ} {U : GJ} - (hU : U ∈ jets.truncationKer n) {s : Multiset (Fin 1 ⊕ Fin 3)} (hs : s.card < n) - (μ : Fin 1 ⊕ Fin 3) : jets.evalLie (jets.iteratedDeriv s (jets.maurerCartan U μ)) = 0 := - hU.2 s μ hs - -/-- The filtration decreases: a jet trivial to order `n` is trivial to every lower order. -/ -lemma truncationKer_antitone : Antitone jets.truncationKer := - fun _ _ hmn _ hU => ⟨hU.1, fun s μ hs => hU.2 s μ (lt_of_lt_of_le hs hmn)⟩ - /-- The zeroth truncation kernel is the group of pure jets, those with identity value. -/ lemma mem_truncationKer_zero_iff {U : GJ} : U ∈ jets.truncationKer 0 ↔ jets.eval U = 1 := ⟨fun h => h.1, fun h => ⟨h, fun _ _ hs => absurd hs (Nat.not_lt_zero _)⟩⟩ @@ -146,17 +129,6 @@ lemma adjointDualCoeff_eq_zero_of_mem_truncationKer {n : ℕ} {U : GJ} rw [adjointDualCoeff, jets.adjointCoeff_eq_zero_of_mem_truncationKer hU hx hxn] exact LinearMap.ext fun φ => LinearMap.ext fun a => map_zero φ -/-- Up to order `n`, a jet trivial to order `n` has the adjoint coefficients of the - identity. -/ -lemma adjointCoeff_eq_one_of_mem_truncationKer {n : ℕ} {U : GJ} (hU : U ∈ jets.truncationKer n) - {x : Multiset (Fin 1 ⊕ Fin 3)} (hxn : x.card ≤ n) : - jets.adjointCoeff U x = jets.adjointCoeff 1 x := by - rw [adjointCoeff_one] - split_ifs with h - · subst h - exact jets.adjointCoeff_zero_of_eval_eq_one hU.1 - · exact jets.adjointCoeff_eq_zero_of_mem_truncationKer hU h hxn - /-- Up to order `n`, a jet trivial to order `n` is invisible on the right of a product. -/ lemma adjointCoeff_mul_of_mem_truncationKer_right (g : GJ) {n : ℕ} {U : GJ} (hU : U ∈ jets.truncationKer n) {x : Multiset (Fin 1 ⊕ Fin 3)} (hxn : x.card ≤ n) : @@ -167,16 +139,6 @@ lemma adjointCoeff_mul_of_mem_truncationKer_right (g : GJ) {n : ℕ} {U : GJ} ((Multiset.card_le_card (Multiset.snd_le_of_mem_antidiagonal hp)).trans hxn), LinearMap.comp_zero] -/-- Up to order `n`, a jet trivial to order `n` is invisible on the left of a product. -/ -lemma adjointCoeff_mul_of_mem_truncationKer_left (g : GJ) {n : ℕ} {U : GJ} - (hU : U ∈ jets.truncationKer n) {x : Multiset (Fin 1 ⊕ Fin 3)} (hxn : x.card ≤ n) : - jets.adjointCoeff (U * g) x = jets.adjointCoeff g x := by - rw [adjointCoeff_mul, Multiset.sum_antidiagonal_eq_of_fst_ne_zero x _ fun p hp hp1 => ?_] - · rw [jets.adjointCoeff_zero_of_eval_eq_one hU.1, LinearMap.id_comp] - · rw [jets.adjointCoeff_eq_zero_of_mem_truncationKer hU hp1 - ((Multiset.card_le_card (Multiset.fst_le_of_mem_antidiagonal hp)).trans hxn), - LinearMap.zero_comp] - /-- Up to order `n`, a conjugate of a jet trivial to order `n` has the adjoint coefficients of the identity. -/ lemma adjointCoeff_conj_of_mem_truncationKer (g : GJ) {n : ℕ} {U : GJ} @@ -249,12 +211,6 @@ lemma eq_truncationProjZero_mul_ofConstant (U : GJ) : U = jets.truncationProjZero U * jets.ofConstant (jets.eval U) := by simp -lemma truncationProjZero_surjective : Function.Surjective jets.truncationProjZero := by - intro V - refine ⟨V, Subtype.ext ?_⟩ - rw [coe_truncationProjZero, jets.mem_truncationKer_zero_iff.mp V.2, map_one, inv_one, - mul_one] - /-- The pure part of a jet is trivial exactly when the jet is constant. -/ lemma truncationProjZero_eq_one_iff {U : GJ} : jets.truncationProjZero U = 1 ↔ U = jets.ofConstant (jets.eval U) := by From d8fc2bbec61c09036a6de9f5ca386095e34fd1fe Mon Sep 17 00:00:00 2001 From: doxtor6 Date: Thu, 24 Sep 2026 09:29:55 -0400 Subject: [PATCH 363/367] docs: Replace the TODO on the carriers of a list of factors by the rationale The recursion on the list is deliberate: a single factor keeps its own carrier and the carrier of a list unfolds to the literal product of its factors' carriers. Co-authored-by: Claude Opus 4.8 --- .../GaugeTheory/LocalGaugeData/OfFactors.lean | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/OfFactors.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/OfFactors.lean index 7c5f41c6e..c6c4ffbc3 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/OfFactors.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/OfFactors.lean @@ -163,8 +163,12 @@ def 𝔤J : List FactorSpec → Type | [f] => f.𝔤J | f :: g :: gs => f.𝔤J × 𝔤J (g :: gs) -TODO (lines := 142-166) (date := 2026-09-11) "These could all - likely be defined with the typical List.foldr construction, or List.prod of similar." +/-! +The carriers are written by recursion on the list rather than as a fold, so that a single +factor has its own carrier rather than `f.G × Unit`, and so that the carrier of a list +unfolds to the literal product of the carriers of its factors, `JetSU 3 × JetSU 2 × JetU1` +for the Standard Model. The same recursion gives the instances and the gauge data below. +-/ instance : Bracket Unit Unit := ⟨fun _ _ => ()⟩ From 3602ab222de898ea9e707f1271a748d3a1dc5110 Mon Sep 17 00:00:00 2001 From: doxtor6 Date: Thu, 24 Sep 2026 14:42:28 -0400 Subject: [PATCH 364/367] refactor: Move the matrix identities over the jet ring to JetRing/Matrix.lean `mapMatrix_C_star`, `mapMatrix_C_smul`, `mapMatrix_constantCoeff_smul`, `star_map_pderiv`, `map_pderiv_smul`, `map_pderiv_sub`, `map_pderiv_star_of_unitary` and `star_mcMatrix` are facts about matrices of power series, not about gauge data. They move from `LocalGaugeData/MatrixJets.lean` to `Relativity/JetRing/Matrix.lean`, in the `JetRing` namespace. `MatrixJets.faithful` becomes a `lemma`. Co-authored-by: Claude Opus 4.8 --- .../LocalGaugeData/MatrixJets.lean | 107 +++--------------- .../GaugeTheory/LocalGaugeData/SU/Basic.lean | 8 +- Physlib/Relativity/JetRing/Matrix.lean | 75 ++++++++++++ 3 files changed, 95 insertions(+), 95 deletions(-) diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/MatrixJets.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/MatrixJets.lean index 37ad37d34..8be51be17 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/MatrixJets.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/MatrixJets.lean @@ -35,11 +35,10 @@ the laws once, `MatrixJets.faithful` shows the package is faithful, and ## iii. Table of contents -- A. Matrix identities over the jet ring -- B. The presentation -- C. The local gauge data -- D. The iterated derivative and faithfulness -- E. The canonical factor +- A. The presentation +- B. The local gauge data +- C. The iterated derivative and faithfulness +- D. The canonical factor -/ @@ -51,82 +50,7 @@ namespace LocalGaugeData /-! -## A. Matrix identities over the jet ring - --/ - -section Identities - -variable {κ : Type} - -/-- Entrywise inclusion of constants commutes with the conjugate transpose. -/ -lemma mapMatrix_C_star [Fintype κ] [DecidableEq κ] (A : Matrix κ κ ℂ) : - (C : ℂ →+* JetRing).mapMatrix (star A) = star ((C : ℂ →+* JetRing).mapMatrix A) := by - ext i j - simp [RingHom.mapMatrix_apply, Matrix.map_apply, Matrix.star_apply] - -/-- Entrywise inclusion of constants commutes with complex scalars. -/ -lemma mapMatrix_C_smul [Fintype κ] [DecidableEq κ] (c : ℂ) (M : Matrix κ κ ℂ) : - (C : ℂ →+* JetRing).mapMatrix (c • M) = c • (C : ℂ →+* JetRing).mapMatrix M := by - ext i j : 1 - simp only [RingHom.mapMatrix_apply, Matrix.map_apply, Matrix.smul_apply, - MvPowerSeries.smul_eq_C_mul, smul_eq_mul, map_mul] - -/-- The entrywise constant coefficient commutes with complex scalars. -/ -lemma mapMatrix_constantCoeff_smul [Fintype κ] [DecidableEq κ] (c : ℂ) - (M : Matrix κ κ JetRing) : - (constantCoeff : JetRing →+* ℂ).mapMatrix (c • M) - = c • (constantCoeff : JetRing →+* ℂ).mapMatrix M := by - ext i j - simp [RingHom.mapMatrix_apply, Matrix.map_apply] - -/-- The entrywise derivative commutes with the conjugate transpose. -/ -lemma star_map_pderiv [Fintype κ] (μ : Fin 1 ⊕ Fin 3) (A : Matrix κ κ JetRing) : - 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 - -/-- Pulling a complex scalar out of the entrywise derivative. -/ -lemma map_pderiv_smul (μ : Fin 1 ⊕ Fin 3) (c : ℂ) (M : Matrix κ κ JetRing) : - (c • M).map (pderiv μ) = c • M.map (pderiv μ) := - Matrix.ext fun _ _ => Derivation.map_smul _ _ _ - -/-- The entrywise derivative of a difference. -/ -lemma map_pderiv_sub (μ : Fin 1 ⊕ Fin 3) (M N : Matrix κ κ JetRing) : - (M - N).map (pderiv μ) = M.map (pderiv μ) - N.map (pderiv μ) := by - ext i j : 1 - simp only [Matrix.map_apply, Matrix.sub_apply, map_sub] - -/-- The entrywise derivative of the conjugate transpose of a unitary matrix, through the - differentiated unitarity relation. -/ -lemma map_pderiv_star_of_unitary [Fintype κ] [DecidableEq κ] (μ : Fin 1 ⊕ Fin 3) - {U : Matrix κ κ JetRing} - (hU : U * star U = 1) (hU' : star U * U = 1) : - (star U).map (pderiv μ) = -(star U * U.map (pderiv μ) * star U) := by - have h1 : U * (star U).map (pderiv μ) = -(U.map (pderiv μ) * star U) := - eq_neg_of_add_eq_zero_right (by - rw [← JetRing.matrix_map_pderiv_mul, hU] - exact Matrix.ext fun i j => by - simp [Matrix.map_apply, Matrix.one_apply, apply_ite (pderiv μ)]) - calc (star U).map (pderiv μ) - = star U * U * (star U).map (pderiv μ) := by rw [hU', one_mul] - _ = -(star U * U.map (pderiv μ) * star U) := by - rw [mul_assoc, h1, mul_neg, ← mul_assoc] - -/-- The Maurer–Cartan matrix `i (∂_μ U) U†` of a unitary matrix of jets is hermitian. -/ -lemma star_mcMatrix [Fintype κ] [DecidableEq κ] (μ : Fin 1 ⊕ Fin 3) {U : Matrix κ κ JetRing} - (hU : U * star U = 1) (hU' : star U * U = 1) : - star (Complex.I • (U.map (pderiv μ) * star U)) = Complex.I • (U.map (pderiv μ) * star U) := by - rw [star_smul, star_mul, star_star, star_map_pderiv, map_pderiv_star_of_unitary μ hU hU', - Complex.star_def, Complex.conj_I, neg_smul, mul_neg, smul_neg, neg_neg, ← mul_assoc, - ← mul_assoc, hU, one_mul] - -end Identities - -/-! - -## B. The presentation +## A. The presentation -/ @@ -192,7 +116,7 @@ variable {κ : Type} [Fintype κ] [DecidableEq κ] (M : MatrixJets κ G₀ 𝔤 /-! -## C. The local gauge data +## B. The local gauge data Every law is an identity of matrices, read through the injective maps `lieJ` and `toMat₀`. @@ -207,13 +131,13 @@ lemma eval_ofConstant (g : G₀) : M.eval (M.ofConstant g) = g := by lemma evalLie_lie (a b : 𝔤J) : M.evalLie ⁅a, b⁆ = ⁅M.evalLie a, M.evalLie b⁆ := by refine M.lie₀_injective ?_ rw [M.lie₀_bracket, M.lie₀_evalLie, M.lie₀_evalLie, M.lie₀_evalLie, M.lieJ_bracket, - mapMatrix_constantCoeff_smul, map_sub, map_mul, map_mul] + JetRing.mapMatrix_constantCoeff_smul, map_sub, map_mul, map_mul] lemma ofConstantLie_lie (a b : 𝔤) : M.ofConstantLie ⁅a, b⁆ = ⁅M.ofConstantLie a, M.ofConstantLie b⁆ := by refine M.lieJ_injective ?_ rw [M.lieJ_bracket, M.lieJ_ofConstantLie, M.lieJ_ofConstantLie, M.lieJ_ofConstantLie, - M.lie₀_bracket, mapMatrix_C_smul, map_sub, map_mul, map_mul] + M.lie₀_bracket, JetRing.mapMatrix_C_smul, map_sub, map_mul, map_mul] lemma evalLie_ofConstantLie (a : 𝔤) : M.evalLie (M.ofConstantLie a) = a := by refine M.lie₀_injective ?_ @@ -232,7 +156,7 @@ lemma deriv_bracket (μ : Fin 1 ⊕ Fin 3) (x y : 𝔤J) : M.deriv μ ⁅x, y⁆ = ⁅M.deriv μ x, y⁆ + ⁅x, M.deriv μ y⁆ := by refine M.lieJ_injective ?_ rw [map_add, M.lieJ_deriv, M.lieJ_bracket, M.lieJ_bracket, M.lieJ_bracket, M.lieJ_deriv, - M.lieJ_deriv, map_pderiv_smul, map_pderiv_sub, JetRing.matrix_map_pderiv_mul, + M.lieJ_deriv, JetRing.map_pderiv_smul, JetRing.map_pderiv_sub, JetRing.matrix_map_pderiv_mul, JetRing.matrix_map_pderiv_mul, ← smul_add] congr 1 abel @@ -320,14 +244,15 @@ lemma maurerCartan_structure (U : GJ) (μ ν : Fin 1 ⊕ Fin 3) : rw [JetRing.matrix_map_pderiv_mul, JetRing.matrix_map_pderiv_mul, show (A.map (pderiv ν)).map (pderiv μ) = (A.map (pderiv μ)).map (pderiv ν) from Matrix.ext fun _ _ => JetRing.pderiv_comm μ ν _, - map_pderiv_star_of_unitary μ hU hU', map_pderiv_star_of_unitary ν hU hU'] + JetRing.map_pderiv_star_of_unitary μ hU hU', JetRing.map_pderiv_star_of_unitary ν hU hU'] simp only [mul_neg, ← mul_assoc] abel have hcancel : ∀ P Q : Matrix κ κ JetRing, (P - Q) + (-P - -Q) = 0 := fun P Q => by abel refine M.lieJ_injective ?_ rw [map_add, map_sub, M.lieJ_deriv, M.lieJ_deriv, M.lieJ_bracket, M.lieJ_maurerCartan, - M.lieJ_maurerCartan, map_zero, map_pderiv_smul, map_pderiv_smul, ← smul_sub, ← hA, key] + M.lieJ_maurerCartan, map_zero, JetRing.map_pderiv_smul, JetRing.map_pderiv_smul, ← smul_sub, + ← hA, key] simp only [smul_mul_smul_comm, Complex.I_mul_I, neg_one_smul, ← smul_add, hcancel, smul_zero] lemma deriv_adjoint (U : GJ) (μ : Fin 1 ⊕ Fin 3) (x : 𝔤J) : @@ -336,7 +261,7 @@ lemma deriv_adjoint (U : GJ) (μ : Fin 1 ⊕ Fin 3) (x : 𝔤J) : set V := M.toMatJ U with hV have hVV : star V * V = 1 := M.star_toMatJ_mul U have hq : (star V).map (pderiv μ) = -(star V * V.map (pderiv μ) * star V) := - map_pderiv_star_of_unitary μ (M.toMatJ_mul_star U) hVV + JetRing.map_pderiv_star_of_unitary μ (M.toMatJ_mul_star U) hVV refine M.lieJ_injective ?_ rw [map_sub, M.lieJ_deriv, M.lieJ_adjoint, M.lieJ_adjoint, M.lieJ_bracket, M.lieJ_maurerCartan, M.lieJ_adjoint, M.lieJ_deriv, JetRing.matrix_map_pderiv_mul, @@ -399,7 +324,7 @@ noncomputable def toLocalGaugeData : LocalGaugeData G₀ 𝔤 GJ 𝔤J where /-! -## D. The iterated derivative and faithfulness +## C. The iterated derivative and faithfulness -/ @@ -430,7 +355,7 @@ lemma lie₀_evalLie_iteratedDeriv (s : Multiset (Fin 1 ⊕ Fin 3)) (a : 𝔤J) /-- **A package presented by matrices is faithful**: a jet is determined entrywise by the constant coefficients of its derivatives, and a jet with vanishing Maurer–Cartan form has constant entries. -/ -theorem faithful : M.toLocalGaugeData.Faithful where +lemma faithful : M.toLocalGaugeData.Faithful where ext_of_evalLie_iteratedDeriv {x y} h := by refine M.lieJ_injective (Matrix.ext fun i j => ?_) refine JetRing.ext_of_constantCoeff_foldl_pderiv fun s => ?_ @@ -457,7 +382,7 @@ theorem faithful : M.toLocalGaugeData.Faithful where /-! -## E. The canonical factor +## D. The canonical factor -/ diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/SU/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/SU/Basic.lean index 7c7b41f59..c6bd4a734 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/SU/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/SU/Basic.lean @@ -134,7 +134,7 @@ noncomputable def ofConstant : SU n →* JetSU n where · rw [mem_unitaryGroup_iff] at h1 ⊢ rw [show star ((C : ℂ →+* JetRing).mapMatrix u.1) = (C : ℂ →+* JetRing).mapMatrix (star u.1) from - (LocalGaugeData.mapMatrix_C_star u.1).symm, ← map_mul, h1, map_one] + (JetRing.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) @@ -164,7 +164,7 @@ variable {n : ℕ} /-- The formal derivative in the direction `μ`, entrywise. -/ noncomputable def deriv (μ : Fin 1 ⊕ Fin 3) : JetSUAlgebra n →ₗ[ℝ] JetSUAlgebra n where toFun a := SUAlgebraOver.ofMatrix (a.1.map (pderiv μ)) - (by rw [LocalGaugeData.star_map_pderiv, a.star_val]) + (by rw [JetRing.star_map_pderiv, a.star_val]) (by rw [← AddMonoidHom.map_trace, a.trace_val, map_zero]) map_add' a b := Subtype.ext (by ext i j : 1 @@ -222,7 +222,7 @@ lemma C_smul (r : ℝ) (x : ℂ) : (C (r • x) : JetRing) = r • C x := by lemma star_mapMatrix_C (a : SUAlgebra n) : star ((C : ℂ →+* JetRing).mapMatrix a.1) = (C : ℂ →+* JetRing).mapMatrix a.1 := by - rw [← LocalGaugeData.mapMatrix_C_star, a.star_val] + rw [← JetRing.mapMatrix_C_star, a.star_val] lemma trace_mapMatrix_C (a : SUAlgebra n) : ((C : ℂ →+* JetRing).mapMatrix a.1).trace = 0 := by rw [RingHom.mapMatrix_apply, ← AddMonoidHom.map_trace, a.trace_val, map_zero] @@ -269,7 +269,7 @@ lemma adjointValue_val (U : SU n) (a : SUAlgebra n) : /-- The Maurer–Cartan form `i (∂_μ U) U†` of an `SU(n)` gauge jet. -/ noncomputable def mc (U : JetSU n) (μ : Fin 1 ⊕ Fin 3) : JetSUAlgebra n := SUAlgebraOver.ofMatrix (Complex.I • (U.1.map (pderiv μ) * star U.1)) - (LocalGaugeData.star_mcMatrix μ (JetSU.val_mul_star U) (JetSU.star_mul_val U)) + (JetRing.star_mcMatrix μ (JetSU.val_mul_star U) (JetSU.star_mul_val U)) (JetSU.trace_mcMatrix μ U) @[simp] diff --git a/Physlib/Relativity/JetRing/Matrix.lean b/Physlib/Relativity/JetRing/Matrix.lean index 7d1cce4e0..556cdc154 100644 --- a/Physlib/Relativity/JetRing/Matrix.lean +++ b/Physlib/Relativity/JetRing/Matrix.lean @@ -550,4 +550,79 @@ lemma matrix_constantCoeff_foldl_pderiv_mul {κ : Type} [Fintype κ] [DecidableE rw [Function.comp_apply, Matrix.mul_apply] exact Finset.sum_congr rfl fun k _ => by rw [Matrix.map_apply, Matrix.map_apply] +/-! + +## Conjugation, scalars and derivatives of matrices of jets + +-/ + +section MatrixIdentities + +variable {κ : Type} + +/-- Entrywise inclusion of constants commutes with the conjugate transpose. -/ +lemma mapMatrix_C_star [Fintype κ] [DecidableEq κ] (A : Matrix κ κ ℂ) : + (C : ℂ →+* JetRing).mapMatrix (star A) = star ((C : ℂ →+* JetRing).mapMatrix A) := by + ext i j + simp [RingHom.mapMatrix_apply, Matrix.map_apply, Matrix.star_apply] + +/-- Entrywise inclusion of constants commutes with complex scalars. -/ +lemma mapMatrix_C_smul [Fintype κ] [DecidableEq κ] (c : ℂ) (M : Matrix κ κ ℂ) : + (C : ℂ →+* JetRing).mapMatrix (c • M) = c • (C : ℂ →+* JetRing).mapMatrix M := by + ext i j : 1 + simp only [RingHom.mapMatrix_apply, Matrix.map_apply, Matrix.smul_apply, + MvPowerSeries.smul_eq_C_mul, smul_eq_mul, map_mul] + +/-- The entrywise constant coefficient commutes with complex scalars. -/ +lemma mapMatrix_constantCoeff_smul [Fintype κ] [DecidableEq κ] (c : ℂ) + (M : Matrix κ κ JetRing) : + (constantCoeff : JetRing →+* ℂ).mapMatrix (c • M) + = c • (constantCoeff : JetRing →+* ℂ).mapMatrix M := by + ext i j + simp [RingHom.mapMatrix_apply, Matrix.map_apply] + +/-- The entrywise derivative commutes with the conjugate transpose. -/ +lemma star_map_pderiv [Fintype κ] (μ : Fin 1 ⊕ Fin 3) (A : Matrix κ κ JetRing) : + 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 + +/-- Pulling a complex scalar out of the entrywise derivative. -/ +lemma map_pderiv_smul (μ : Fin 1 ⊕ Fin 3) (c : ℂ) (M : Matrix κ κ JetRing) : + (c • M).map (pderiv μ) = c • M.map (pderiv μ) := + Matrix.ext fun _ _ => Derivation.map_smul _ _ _ + +/-- The entrywise derivative of a difference. -/ +lemma map_pderiv_sub (μ : Fin 1 ⊕ Fin 3) (M N : Matrix κ κ JetRing) : + (M - N).map (pderiv μ) = M.map (pderiv μ) - N.map (pderiv μ) := by + ext i j : 1 + simp only [Matrix.map_apply, Matrix.sub_apply, map_sub] + +/-- The entrywise derivative of the conjugate transpose of a unitary matrix, through the + differentiated unitarity relation. -/ +lemma map_pderiv_star_of_unitary [Fintype κ] [DecidableEq κ] (μ : Fin 1 ⊕ Fin 3) + {U : Matrix κ κ JetRing} + (hU : U * star U = 1) (hU' : star U * U = 1) : + (star U).map (pderiv μ) = -(star U * U.map (pderiv μ) * star U) := by + have h1 : U * (star U).map (pderiv μ) = -(U.map (pderiv μ) * star U) := + eq_neg_of_add_eq_zero_right (by + rw [← JetRing.matrix_map_pderiv_mul, hU] + exact Matrix.ext fun i j => by + simp [Matrix.map_apply, Matrix.one_apply, apply_ite (pderiv μ)]) + calc (star U).map (pderiv μ) + = star U * U * (star U).map (pderiv μ) := by rw [hU', one_mul] + _ = -(star U * U.map (pderiv μ) * star U) := by + rw [mul_assoc, h1, mul_neg, ← mul_assoc] + +/-- The Maurer–Cartan matrix `i (∂_μ U) U†` of a unitary matrix of jets is hermitian. -/ +lemma star_mcMatrix [Fintype κ] [DecidableEq κ] (μ : Fin 1 ⊕ Fin 3) {U : Matrix κ κ JetRing} + (hU : U * star U = 1) (hU' : star U * U = 1) : + star (Complex.I • (U.map (pderiv μ) * star U)) = Complex.I • (U.map (pderiv μ) * star U) := by + rw [star_smul, star_mul, star_star, star_map_pderiv, map_pderiv_star_of_unitary μ hU hU', + Complex.star_def, Complex.conj_I, neg_smul, mul_neg, smul_neg, neg_neg, ← mul_assoc, + ← mul_assoc, hU, one_mul] + +end MatrixIdentities + end JetRing From d77628b9bd96d9ef2c16026c7709066db3fc6d1c Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Fri, 25 Sep 2026 07:00:18 +0100 Subject: [PATCH 365/367] feat: Generalized freeness proof --- .../LocalGaugeData/MatrixJets.lean | 73 ++++- .../GaugeTheory/LocalGaugeData/OfFactors.lean | 21 +- .../GaugeTheory/LocalGaugeData/Prod.lean | 53 +++- .../GaugeTheory/LocalGaugeData/SU/Basic.lean | 14 + .../GaugeTheory/LocalGaugeData/U1.lean | 26 ++ .../Particles/StandardModel/Challenge.lean | 9 +- .../GaugeGroup/MaurerCartan/Basic.lean | 135 +-------- .../GaugeGroup/MaurerCartan/Freeness.lean | 285 +----------------- Physlib/Particles/StandardModel/Solution.lean | 10 +- Physlib/Relativity/JetRing/Basic.lean | 117 ------- Physlib/Relativity/JetRing/Matrix.lean | 218 ++------------ Physlib/Relativity/JetRing/Taylor.lean | 87 +++++- 12 files changed, 301 insertions(+), 747 deletions(-) diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/MatrixJets.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/MatrixJets.lean index 8be51be17..1d3d17ab5 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/MatrixJets.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/MatrixJets.lean @@ -6,6 +6,7 @@ Authors: Jinzheng Li module public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Factor +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Truncation public import Physlib.Relativity.JetRing.Matrix public import Physlib.Relativity.JetRing.Taylor /-! @@ -22,8 +23,9 @@ over the jet ring. `MatrixJets` records such a presentation: injective maps of the four carriers into matrices, and what each structure map is in matrices. From it, `MatrixJets.toLocalGaugeData` proves -the laws once, `MatrixJets.faithful` shows the package is faithful, and -`MatrixJets.suFactor` is its canonical `SU`-type factor. The concrete packages `u1` and +the laws once, `MatrixJets.faithful` shows the package is faithful, `MatrixJets.free` +reduces its freeness to three conditions on the carriers, and `MatrixJets.suFactor` is its +canonical `SU`-type factor. The concrete packages `u1` and `su n` are instances. ## ii. Key results @@ -32,6 +34,7 @@ the laws once, `MatrixJets.faithful` shows the package is faithful, and - `LocalGaugeData.MatrixJets.toLocalGaugeData` : the local gauge data it presents. - `LocalGaugeData.MatrixJets.faithful` : that local gauge data is faithful. - `LocalGaugeData.MatrixJets.suFactor` : its canonical `SU`-type factor. +- `LocalGaugeData.MatrixJets.free` : a criterion for that local gauge data to be free. ## iii. Table of contents @@ -39,6 +42,7 @@ the laws once, `MatrixJets.faithful` shows the package is faithful, and - B. The local gauge data - C. The iterated derivative and faithfulness - D. The canonical factor +- E. Freeness -/ @@ -400,6 +404,71 @@ noncomputable def suFactor : SUFactor M.toLocalGaugeData κ where φJ_maurerCartan U μ := M.lieJ_maurerCartan U μ φJ_adjoint U c := M.lieJ_adjoint U (M.ofConstantLie c) +/-! + +## E. Freeness + +A presentation by matrices is free when its carriers are large enough: the Lie algebra +jets contain every matrix of jets with Taylor data in the Lie algebra, and the gauge jets +contain the unitary fundamental solution `V` of the radial system `E V = −i P V` for every +Lie algebra jet `P`. Taylor completeness and radial integrability then hold because they +hold for matrices of jets. + +-/ + +/-- The radial component of the Maurer–Cartan form, in matrices: + `∑_μ x_μ · i (∂_μ U) U†`. -/ +lemma lieJ_radial (U : GJ) : + M.lieJ (M.toLocalGaugeData.radial U) = + ∑ μ, (X μ : JetRing) • (Complex.I • ((M.toMatJ U).map (pderiv μ) * star (M.toMatJ U))) := by + simp only [radial, map_sum, toLocalGaugeData_coord, toLocalGaugeData_maurerCartan, + M.lieJ_coord, M.lieJ_maurerCartan] + +/-- A gauge jet is pure exactly when its matrix is the identity at the base point. -/ +lemma mem_truncationKer_zero_iff (U : GJ) : + U ∈ M.toLocalGaugeData.truncationKer 0 ↔ + (constantCoeff : JetRing →+* ℂ).mapMatrix (M.toMatJ U) = 1 := by + rw [LocalGaugeData.mem_truncationKer_zero_iff, toLocalGaugeData_eval, ← M.toMat₀_eval, + ← map_one M.toMat₀] + exact M.toMat₀_injective.eq_iff.symm + +/-- **A criterion for freeness.** A presentation by matrices is free when every matrix of + jets built entrywise from Taylor data in `𝔤` is a Lie algebra jet, the Lie algebra jets + are hermitian, and every unitary solution `V` of `E V = −i P V`, `V(0) = 1`, for a Lie + algebra jet `P`, is a gauge jet. -/ +lemma free + (hTaylor : ∀ c : Multiset (Fin 1 ⊕ Fin 3) → 𝔤, + ∃ Y, M.lieJ Y = JetRing.taylorMatrix fun s => M.lie₀ (c s)) + (hherm : ∀ a, star (M.lieJ a) = M.lieJ a) + (hlift : ∀ (ρ : 𝔤J) (V : Matrix κ κ JetRing), + (constantCoeff : JetRing →+* ℂ).mapMatrix V = 1 → V * star V = 1 → + ∑ μ, (X μ : JetRing) • V.map (pderiv μ) = ((-Complex.I) • M.lieJ ρ) * V → + ∃ U, M.toMatJ U = V) : + M.toLocalGaugeData.Free where + toFaithful := M.faithful + exists_evalLie_iteratedDeriv_eq c := by + obtain ⟨Y, hY⟩ := hTaylor c + refine ⟨Y, fun s => M.lie₀_injective ?_⟩ + rw [M.lie₀_evalLie_iteratedDeriv, hY, JetRing.map_constantCoeff_foldl_pderiv_taylorMatrix] + exists_radial_eq ρ hρ := by + -- The matrix `R = −i P` of `P = lieJ ρ` is anti-hermitian and vanishes at the base point. + have hR0 : ∀ i j, constantCoeff (((-Complex.I) • M.lieJ ρ) i j) = 0 := fun i j => by + have h := congrArg (fun A => A i j) (congrArg M.lie₀ hρ) + simp only [toLocalGaugeData_evalLie_apply, M.lie₀_evalLie, map_zero] at h + rw [Matrix.smul_apply, ← coeff_zero_eq_constantCoeff, map_smul, + coeff_zero_eq_constantCoeff] + simpa using congrArg ((-Complex.I) • ·) h + have hRstar : star ((-Complex.I) • M.lieJ ρ) = -((-Complex.I) • M.lieJ ρ) := by + rw [star_smul, hherm] + simp + -- Its Euler transport is unitary, hence a pure gauge jet with radial component `P`. + obtain ⟨V, hV0, hEV⟩ := JetRing.exists_matrix_eulerTransport _ hR0 + have hVu := JetRing.eulerTransport_mul_star hRstar hR0 hV0 hEV + obtain ⟨U, rfl⟩ := hlift ρ V hV0 hVu hEV + refine ⟨⟨U, (M.mem_truncationKer_zero_iff U).2 hV0⟩, M.lieJ_injective ?_⟩ + rw [M.lieJ_radial] + exact JetRing.sum_X_smul_mcMatrix_of_eulerTransport hVu hEV + end MatrixJets end LocalGaugeData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/OfFactors.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/OfFactors.lean index c6c4ffbc3..b2c1eb4ed 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/OfFactors.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/OfFactors.lean @@ -19,8 +19,8 @@ the list, of the local gauge data `LocalGaugeData.u1` and `LocalGaugeData.su n` factors. The carriers are the corresponding products of `JetU1` and `JetSU n`, and of their Lie algebras, so that a model's gauge group is a concrete product of matrix groups. The list of factors of the product, in the sense of the table layer, is assembled from -the canonical factors of the pieces (`Factors.factors`), and the product of faithful -packages is faithful. +the canonical factors of the pieces (`Factors.factors`), and the gauge data is faithful +and free because each factor is and both properties pass to products. With this, a model on any gauge group built from `U(1)` and `SU(n)` factors is a table alone: `LocalGaugeData.ofFactors Γ` is its gauge data and `Factors.factors Γ` is what its @@ -31,6 +31,7 @@ rows are charged under. - `LocalGaugeData.FactorSpec` : the symbols `U1` and `SU n`. - `LocalGaugeData.ofFactors` : the local gauge data of a list of factors. - `LocalGaugeData.Factors.factors` : the canonical factors of that gauge data. +- `LocalGaugeData.instFreeOfFactors` : that gauge data is free. ## iii. Table of contents @@ -123,6 +124,10 @@ noncomputable instance instFaithfulData : (f : FactorSpec) → f.data.Faithful | .U1 => inferInstanceAs u1.Faithful | .SU n => inferInstanceAs (su n).Faithful +noncomputable instance instFreeData : (f : FactorSpec) → f.data.Free + | .U1 => inferInstanceAs u1.Free + | .SU n => inferInstanceAs (su n).Free + end FactorSpec /-! @@ -291,6 +296,10 @@ instance instFaithfulTrivial : trivial.Faithful where ext_of_evalLie_iteratedDeriv _ := rfl eq_ofConstant_of_maurerCartan_eq_zero _ := rfl +instance instFreeTrivial : trivial.Free where + exists_evalLie_iteratedDeriv_eq _ := ⟨(), fun _ => rfl⟩ + exists_radial_eq _ _ := ⟨1, rfl⟩ + open OfFactors in /-- **The local gauge data of a list of factors**: the product, in the order of the list, of the local gauge data of the factors. -/ @@ -317,6 +326,14 @@ noncomputable instance instFaithfulOfFactors : (Γ : List FactorSpec) → (ofFac letI := instFaithfulOfFactors (g :: gs) inferInstanceAs (f.data.prod (ofFactors (g :: gs))).Faithful +/-- The local gauge data of a list of factors is free. -/ +noncomputable instance instFreeOfFactors : (Γ : List FactorSpec) → (ofFactors Γ).Free + | [] => inferInstanceAs trivial.Free + | [f] => inferInstanceAs f.data.Free + | f :: g :: gs => + letI := instFreeOfFactors (g :: gs) + inferInstanceAs (f.data.prod (ofFactors (g :: gs))).Free + /-! ## D. The canonical factors diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Prod.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Prod.lean index 9e9d50115..bd966a19b 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Prod.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/Prod.lean @@ -6,6 +6,7 @@ Authors: Jinzheng Li module public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Factor +public import Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.Truncation public import Mathlib.Algebra.Lie.Prod /-! # The product of local gauge data @@ -14,8 +15,8 @@ public import Mathlib.Algebra.Lie.Prod The local gauge data of a product of gauge groups: every structure map acts componentwise, and every law holds componentwise. A `U(1)` or `SU(n)` factor of either -side lifts to a factor of the product, and the product of two faithful packages is -faithful. +side lifts to a factor of the product, and the product of two faithful (free) packages +is faithful (free). ## ii. Key results @@ -23,6 +24,7 @@ faithful. - `U1Factor.inl`, `U1Factor.inr`, `SUFactor.inl`, `SUFactor.inr` : lifting factors to the product. - `LocalGaugeData.instFaithfulProd` : the product of faithful packages is faithful. +- `LocalGaugeData.instFreeProd` : the product of free packages is free. ## iii. Table of contents @@ -30,6 +32,7 @@ faithful. - B. The product - C. Lifting factors - D. Faithfulness +- E. Freeness -/ @@ -228,6 +231,10 @@ noncomputable def _root_.LocalGaugeData.SUFactor.inr (F : SUFactor j₂ n) : φJ_maurerCartan U μ := F.φJ_maurerCartan U.2 μ φJ_adjoint U c := F.φJ_adjoint U.2 c.2 +TODO (lines := 168-230) (date := 2026-09-25) "These results + (the once directly above this TODO item) + should be moved to their appropriate file." + /-! ## D. Faithfulness @@ -250,4 +257,46 @@ instance instFaithfulProd [j₁.Faithful] [j₂.Faithful] : (j₁.prod j₂).Fai · exact Faithful.eq_ofConstant_of_maurerCartan_eq_zero (jets := j₂) (funext fun μ => congrArg Prod.snd (congrFun h μ)) +/-! + +## E. Freeness + +-/ + +@[simp] +lemma prod_coord (μ : Fin 1 ⊕ Fin 3) (a : 𝔤J₁ × 𝔤J₂) : + (j₁.prod j₂).coord μ a = (j₁.coord μ a.1, j₂.coord μ a.2) := rfl + +/-- The radial component of the Maurer–Cartan form of a product jet is the pair of the + radial components of its factors. -/ +@[simp] +lemma prod_radial (U : G₁ × G₂) : + (j₁.prod j₂).radial U = (j₁.radial U.1, j₂.radial U.2) := by + ext <;> simp [radial, Prod.fst_sum, Prod.snd_sum] + +/-- A product jet lies in the `n`-th truncation kernel exactly when both of its factors do. -/ +lemma mem_prod_truncationKer_iff (n : ℕ) (U : G₁ × G₂) : + U ∈ (j₁.prod j₂).truncationKer n ↔ + U.1 ∈ j₁.truncationKer n ∧ U.2 ∈ j₂.truncationKer n := by + simp only [truncationKer, Subgroup.mem_mk, prod_eval, Prod.mk_eq_one, prod_maurerCartan, + prod_iteratedDeriv, prod_evalLie, Prod.mk_eq_zero] + constructor + · rintro ⟨⟨h1, h2⟩, h⟩ + exact ⟨⟨h1, fun s μ hs => (h s μ hs).1⟩, ⟨h2, fun s μ hs => (h s μ hs).2⟩⟩ + · rintro ⟨⟨h1, h⟩, ⟨h2, h'⟩⟩ + exact ⟨⟨h1, h2⟩, fun s μ hs => ⟨h s μ hs, h' s μ hs⟩⟩ + +/-- The product of two free packages is free: Taylor data and radial components are + realized factor by factor and paired. -/ +instance instFreeProd [j₁.Free] [j₂.Free] : (j₁.prod j₂).Free where + exists_evalLie_iteratedDeriv_eq c := by + obtain ⟨Y₁, hY₁⟩ := j₁.exists_evalLie_iteratedDeriv_eq fun s => (c s).1 + obtain ⟨Y₂, hY₂⟩ := j₂.exists_evalLie_iteratedDeriv_eq fun s => (c s).2 + exact ⟨(Y₁, Y₂), fun s => by simp [hY₁, hY₂]⟩ + exists_radial_eq ρ hρ := by + obtain ⟨U₁, hU₁⟩ := j₁.exists_radial_eq (congrArg Prod.fst hρ) + obtain ⟨U₂, hU₂⟩ := j₂.exists_radial_eq (congrArg Prod.snd hρ) + exact ⟨⟨(U₁.1, U₂.1), (mem_prod_truncationKer_iff 0 _).2 ⟨U₁.2, U₂.2⟩⟩, + by simp [hU₁, hU₂]⟩ + end LocalGaugeData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/SU/Basic.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/SU/Basic.lean index c6bd4a734..90a665809 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/SU/Basic.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/SU/Basic.lean @@ -34,6 +34,7 @@ supplies is the carriers and the structure maps on them. - `LocalGaugeData.su` : the local gauge data of `SU(n)`. - `LocalGaugeData.suFactor` : its canonical `SU(n)` factor. - `LocalGaugeData.instFaithfulSU` : the package is faithful. +- `LocalGaugeData.instFreeSU` : the package is free. ## iii. Table of contents @@ -344,4 +345,17 @@ noncomputable def suFactor (n : ℕ) : SUFactor (su n) (Fin n) := (suMatrixJets /-- The local gauge data of `SU(n)` is faithful. -/ instance instFaithfulSU : (su n).Faithful := (suMatrixJets n).faithful +/-- The local gauge data of `SU(n)` is free. Traceless hermitian Taylor data give a + traceless hermitian matrix of jets, and the unitary Euler transport of a traceless + hermitian jet has unit determinant by Jacobi's formula. -/ +instance instFreeSU : (su n).Free := + (suMatrixJets n).free + (fun c => ⟨SUAlgebraOver.ofMatrix _ (JetRing.star_taylorMatrix fun s => (c s).2.1) + (JetRing.trace_taylorMatrix fun s => (c s).2.2), rfl⟩) + (fun a => a.2.1) + (fun ρ V hV0 hVu hEV => ⟨⟨V, mem_specialUnitaryGroup_iff.mpr ⟨mem_unitaryGroup_iff.mpr hVu, + JetRing.eulerTransport_det JetRing.jacobi + (by rw [Matrix.trace_smul, show ((suMatrixJets n).lieJ ρ).trace = 0 from ρ.2.2, + smul_zero]) hV0 hEV⟩⟩, rfl⟩) + end LocalGaugeData diff --git a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/U1.lean b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/U1.lean index f80b794a7..29e70c4e8 100644 --- a/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/U1.lean +++ b/Physlib/ClassicalFieldTheory/GaugeTheory/LocalGaugeData/U1.lean @@ -29,6 +29,7 @@ supplies is the carriers, the structure maps on them, and the canonical `U1Facto - `LocalGaugeData.u1` : the local gauge data of `U(1)`. - `LocalGaugeData.u1Factor` : its canonical `U(1)` factor. - `LocalGaugeData.instFaithfulU1` : the package is faithful. +- `LocalGaugeData.instFreeU1` : the package is free. ## iii. Table of contents @@ -346,6 +347,31 @@ lemma u1_iteratedDeriv_val (s : Multiset (Fin 1 ⊕ Fin 3)) (a : JetU1Algebra) : /-- The local gauge data of `U(1)` is faithful. -/ instance instFaithfulU1 : u1.Faithful := u1MatrixJets.faithful +/-- A `1 × 1` matrix is the scalar matrix of its entry. -/ +lemma _root_.JetU1.eq_scalar {R : Type} [CommRing R] (A : Matrix (Fin 1) (Fin 1) R) : + A = Matrix.scalar (Fin 1) (A 0 0) := by + ext i j + rw [Fin.fin_one_eq_zero i, Fin.fin_one_eq_zero j] + simp + +/-- The local gauge data of `U(1)` is free. Real Taylor data give a self-adjoint jet, and + the unitary Euler transport of a `1 × 1` matrix is a unitary jet. -/ +instance instFreeU1 : u1.Free := + u1MatrixJets.free + (fun c => ⟨⟨JetRing.taylorSeries fun s => ((c s : U1Algebra) : ℂ), by + rw [selfAdjoint.mem_iff, JetRing.star_taylorSeries] + exact congrArg _ (funext fun s => (c s).2)⟩, by + rw [JetU1.eq_scalar (JetRing.taylorMatrix _), JetRing.taylorMatrix_apply] + rfl⟩) + (fun a => by + show star (Matrix.scalar (Fin 1) a.1) = Matrix.scalar (Fin 1) a.1 + rw [JetU1.scalar_star, a.2]) + (fun ρ V hV0 hVu hEV => by + have hu : V 0 0 * star (V 0 0) = 1 := by + simpa [Matrix.mul_apply] using congrArg (fun A => A 0 0) hVu + exact ⟨⟨V 0 0, Unitary.mem_iff.mpr ⟨by rw [mul_comm]; exact hu, hu⟩⟩, + (JetU1.eq_scalar V).symm⟩) + /-! ## F. The canonical factor diff --git a/Physlib/Particles/StandardModel/Challenge.lean b/Physlib/Particles/StandardModel/Challenge.lean index 06491b3fd..98d286932 100644 --- a/Physlib/Particles/StandardModel/Challenge.lean +++ b/Physlib/Particles/StandardModel/Challenge.lean @@ -207,12 +207,11 @@ theorem repJet_ofConstant_eq_one_of_center (ζ : ℂ) (hζ : ζ ^ 6 = 1) (g : Of /-- **The gauge data of the Standard Model is free**: every Taylor family of gauge algebra elements is realised by a jet, and every jet of gauge algebra elements vanishing at the - base point is the radial Maurer–Cartan component of a pure jet. Proved by hand for the - hand-built gauge data in `GaugeGroup/MaurerCartan/Freeness.lean`; the challenge is the - generic proof, factor by factor, for `ofFactors`. -/ + base point is the radial Maurer–Cartan component of a pure jet. This is the generic + `LocalGaugeData.instFreeOfFactors`: `U(1)` and `SU(n)` are free, and freeness passes to + products. -/ @[sorryful] -theorem gaugeData_free : gaugeData.Free := by - sorry +theorem gaugeData_free : gaugeData.Free := sorry end Model diff --git a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean index 1c706b5fd..d258da307 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Basic.lean @@ -41,8 +41,7 @@ determination of `ω` by its symmetrized base-point data — is proved once, for in `Physlib.ClassicalFieldTheory.GaugeTheory.LocalGaugeData.MaurerCartan`, and read back at `StandardModel.localGaugeData` in `Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData`. What remains here is what the -matrix definition itself gives: the vanishing of `ω` exactly on constant jets, and the -integration of the structural equation. +matrix definition itself gives: the vanishing of `ω` exactly on constant jets. -/ @@ -252,138 +251,6 @@ 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, 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 κ] - (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 derivative of the adjoint action -/ diff --git a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Freeness.lean b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Freeness.lean index ffd66a07d..5f06eaa5a 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Freeness.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/MaurerCartan/Freeness.lean @@ -6,7 +6,6 @@ Authors: Joseph Tooby-Smith module public import Physlib.Particles.StandardModel.GaugeGroup.LocalGaugeData -public import Physlib.Relativity.JetRing.Matrix /-! # Freeness of the Standard Model jets @@ -18,293 +17,23 @@ the jet Lie algebra (Taylor completeness), and every element vanishing at the ba is the radial component `∑_μ x_μ ω_μ(U)` of the Maurer–Cartan form of some pure jet (radial integrability). The general theory then makes the symmetrized Maurer–Cartan data free coordinates on the pure jets, `LocalGaugeData.symmetrizedMaurerCartanCoeff_bijective`, -which is what the classification of gauge invariants uses. - -Both properties are statements about power series, proved here from the matrix -definitions. Taylor completeness is the construction of a power series from its Taylor -coefficients, entry by entry. Radial integrability is the solution of the Euler system -`E U = −i ρ U`, `U(0) = 1` for a prescribed `ρ`, factor by factor by -`JetRing.exists_matrix_eulerTransport`, with unitarity and unit determinant from the Euler -vanishing principle; then `∑_μ x_μ · i (∂_μ U) U† = ρ`. The same integration technique, -applied to the full structural equation, shows that every flat jet 1-form is the -Maurer–Cartan form of a pure jet, `exists_maurerCartanForm_eq_of_structure`. +which is what the classification of gauge invariants uses. The Standard Model package is +free because each of its factors is and freeness passes to products. ## ii. Key results -- `StandardModel.exists_maurerCartanForm_eq_of_structure` : every flat jet 1-form is the - Maurer–Cartan form of a pure jet. -- `StandardModel.taylorJet`, `StandardModel.eval_iteratedDeriv_taylorJet` : Taylor - completeness of the jet gauge algebra. -- `StandardModel.exists_radial_eq` : radial integrability of the jet gauge group. - `StandardModel.instFreeLocalGaugeData` : the package is free. -## iii. Table of contents - -- A. Integrating the structural equation -- B. Taylor completeness -- C. Radial integrability - -/ @[expose] public section namespace StandardModel -open MvPowerSeries JetGaugeAlgebra JetRing - -/-! - -## A. Integrating the structural equation - --/ - -/-- Every flat jet 1-form is the Maurer–Cartan form of a pure jet: the converse of the - structural equation. The jet is the parallel transport - `exists_deriv_eq_of_maurerCartanForm_structure`, and unitarity turns - `∂_μ U = −i ω_μ U` into `ω_μ = i (∂_μ U) U⁻¹`. -/ -lemma exists_maurerCartanForm_eq_of_structure - (ω : (Fin 1 ⊕ Fin 3) → JetGaugeAlgebra) - (hω : ∀ μ ν, deriv μ (ω ν) - deriv ν (ω μ) + ⁅ω μ, ω ν⁆ = 0) : - ∃ U ∈ localGaugeData.truncationKer 0, maurerCartanForm U = ω := by - obtain ⟨U, hU0, hU⟩ := exists_deriv_eq_of_maurerCartanForm_structure ω hω - refine ⟨U, localGaugeData.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 - -/-! - -## B. Taylor completeness - --/ - -/-- The power series with prescribed base-point Taylor data `f`: the coefficient at the - monomial `m` is `f` at the multiset of `m`, divided by the factorials of `m`. -/ -noncomputable def taylorSeries (f : Multiset (Fin 1 ⊕ Fin 3) → ℂ) : JetRing := - fun m => ((∏ ν, Nat.factorial (m ν) : ℕ) : ℂ)⁻¹ * f (Finsupp.toMultiset m) - -lemma coeff_taylorSeries (f : Multiset (Fin 1 ⊕ Fin 3) → ℂ) (m : (Fin 1 ⊕ Fin 3) →₀ ℕ) : - coeff m (taylorSeries f) = ((∏ ν, Nat.factorial (m ν) : ℕ) : ℂ)⁻¹ * f (Finsupp.toMultiset m) := - rfl - -lemma star_taylorSeries (f : Multiset (Fin 1 ⊕ Fin 3) → ℂ) : - star (taylorSeries f) = taylorSeries fun s => star (f s) := by - ext m - rw [JetRing.coeff_star, coeff_taylorSeries, coeff_taylorSeries, star_mul', star_inv₀, - star_natCast] - -lemma taylorSeries_sum {ι : Type} (t : Finset ι) (f : ι → Multiset (Fin 1 ⊕ Fin 3) → ℂ) : - taylorSeries (fun s => ∑ i ∈ t, f i s) = ∑ i ∈ t, taylorSeries (f i) := by - ext m - simp only [coeff_taylorSeries, map_sum, Finset.mul_sum] - -/-- The base-point Taylor data of `taylorSeries f` are `f`. -/ -lemma constantCoeff_foldl_pderiv_taylorSeries (f : Multiset (Fin 1 ⊕ Fin 3) → ℂ) - (s : Multiset (Fin 1 ⊕ Fin 3)) : - constantCoeff (s.foldl (fun h ρ => pderiv ρ h) (taylorSeries f)) = f s := by - have hfac : ((∏ ν, Nat.factorial (s.count ν) : ℕ) : ℂ) ≠ 0 := - Nat.cast_ne_zero.mpr (Finset.prod_ne_zero_iff.mpr fun ν _ => Nat.factorial_ne_zero _) - rw [constantCoeff_foldl_pderiv, coeff_taylorSeries, Multiset.toFinsupp_toMultiset, - show (∏ ν, Nat.factorial (s.toFinsupp ν)) = ∏ ν, Nat.factorial (s.count ν) from - Finset.prod_congr rfl fun ν _ => by rw [Multiset.toFinsupp_apply], - ← mul_assoc, mul_inv_cancel₀ hfac, one_mul] - -/-- The matrix of jets with prescribed base-point Taylor data `M`, entrywise. -/ -noncomputable def taylorMatrix {κ : Type} (M : Multiset (Fin 1 ⊕ Fin 3) → Matrix κ κ ℂ) : - Matrix κ κ JetRing := - Matrix.of fun i j => taylorSeries fun s => M s i j - -lemma taylorMatrix_apply {κ : Type} (M : Multiset (Fin 1 ⊕ Fin 3) → Matrix κ κ ℂ) (i j : κ) : - taylorMatrix M i j = taylorSeries fun s => M s i j := - rfl - -lemma star_taylorMatrix {κ : Type} {M : Multiset (Fin 1 ⊕ Fin 3) → Matrix κ κ ℂ} - (hM : ∀ s, star (M s) = M s) : star (taylorMatrix M) = taylorMatrix M := by - ext i j : 1 - rw [Matrix.star_apply, taylorMatrix_apply, taylorMatrix_apply, star_taylorSeries] - exact congrArg taylorSeries (funext fun s => by rw [← Matrix.star_apply, hM s]) - -lemma trace_taylorMatrix {κ : Type} [Fintype κ] {M : Multiset (Fin 1 ⊕ Fin 3) → Matrix κ κ ℂ} - (hM : ∀ s, (M s).trace = 0) : (taylorMatrix M).trace = 0 := by - have h : ∀ s, ∑ i, M s i i = 0 := fun s => hM s - simp only [Matrix.trace, Matrix.diag_apply, taylorMatrix_apply, ← taylorSeries_sum, h] - ext m - simp [coeff_taylorSeries] - -/-- The jet gauge algebra element with prescribed base-point Taylor data `c`, built - entrywise from `taylorSeries`. Hermiticity and tracelessness are inherited from the - values of `c`. -/ -noncomputable def taylorJet (c : Multiset (Fin 1 ⊕ Fin 3) → GaugeAlgebra) : JetGaugeAlgebra := - ofMatrixProd - (taylorMatrix fun s => (c s).toSU3Matrix, taylorMatrix fun s => (c s).toSU2Matrix, - taylorSeries fun s => (c s).toU1Value) - ⟨star_taylorMatrix fun s => (c s).1.2.1, trace_taylorMatrix fun s => (c s).1.2.2⟩ - ⟨star_taylorMatrix fun s => (c s).2.1.2.1, trace_taylorMatrix fun s => (c s).2.1.2.2⟩ - (by rw [star_taylorSeries]; exact congrArg taylorSeries (funext fun s => (c s).2.2.2)) - -@[simp] -lemma taylorJet_toSU3Matrix (c : Multiset (Fin 1 ⊕ Fin 3) → GaugeAlgebra) : - (taylorJet c).toSU3Matrix = taylorMatrix fun s => (c s).toSU3Matrix := - rfl - -@[simp] -lemma taylorJet_toSU2Matrix (c : Multiset (Fin 1 ⊕ Fin 3) → GaugeAlgebra) : - (taylorJet c).toSU2Matrix = taylorMatrix fun s => (c s).toSU2Matrix := - rfl - -@[simp] -lemma taylorJet_toU1Value (c : Multiset (Fin 1 ⊕ Fin 3) → GaugeAlgebra) : - (taylorJet c).toU1Value = taylorSeries fun s => (c s).toU1Value := - rfl - -/-- Taylor completeness: the base-point Taylor data of `taylorJet c` are `c`. -/ -theorem eval_iteratedDeriv_taylorJet (c : Multiset (Fin 1 ⊕ Fin 3) → GaugeAlgebra) - (s : Multiset (Fin 1 ⊕ Fin 3)) : eval (iteratedDeriv s (taylorJet c)) = c s := by - refine GaugeAlgebra.ext_of_matrix ?_ ?_ ?_ - · ext i j - rw [eval_iteratedDeriv_toSU3Matrix, Matrix.map_apply, taylorJet_toSU3Matrix, - taylorMatrix_apply, constantCoeff_foldl_pderiv_taylorSeries] - · ext i j - rw [eval_iteratedDeriv_toSU2Matrix, Matrix.map_apply, taylorJet_toSU2Matrix, - taylorMatrix_apply, constantCoeff_foldl_pderiv_taylorSeries] - · rw [eval_iteratedDeriv_toU1Value, taylorJet_toU1Value, constantCoeff_foldl_pderiv_taylorSeries] - -/-! - -## C. Radial integrability - --/ - -/-- The `su(3)` component of the radial Maurer–Cartan component `∑_μ x_μ ω_μ(U)`. -/ -lemma radial_toSU3Matrix (U : JetGaugeGroupI) : - (localGaugeData.radial U).toSU3Matrix = - ∑ μ, (X μ : JetRing) • (Complex.I • (U.1.1.map (pderiv μ) * star U.1.1)) := by - rw [LocalGaugeData.radial, toSU3Matrix_sum] - simp only [localGaugeData_coord, localGaugeData_maurerCartan, - coord_toSU3Matrix, maurerCartanForm_toSU3Matrix] - -/-- The `su(2)` component of the radial Maurer–Cartan component. -/ -lemma radial_toSU2Matrix (U : JetGaugeGroupI) : - (localGaugeData.radial U).toSU2Matrix = - ∑ μ, (X μ : JetRing) • (Complex.I • (U.2.1.1.map (pderiv μ) * star U.2.1.1)) := by - rw [LocalGaugeData.radial, toSU2Matrix_sum] - simp only [localGaugeData_coord, localGaugeData_maurerCartan, - coord_toSU2Matrix, maurerCartanForm_toSU2Matrix] - -/-- The `u(1)` component of the radial Maurer–Cartan component. -/ -lemma radial_toU1Value (U : JetGaugeGroupI) : - (localGaugeData.radial U).toU1Value = - ∑ μ, (X μ : JetRing) • (Complex.I • (pderiv μ U.2.2.1 * star U.2.2.1)) := by - rw [LocalGaugeData.radial, toU1Value_sum] - simp only [localGaugeData_coord, localGaugeData_maurerCartan, - coord_toU1Value, maurerCartanForm_toU1Value, smul_eq_mul] - -/-- The factorwise construction behind radial integrability: for every hermitian matrix - `P` of jets vanishing at the base point there is a unitary Euler transport `V` based at - `1` whose radial Maurer–Cartan component `∑_μ x_μ · i (∂_μ V) V†` is `P`; and `V` has - unit determinant when `P` is traceless. -/ -lemma exists_eulerTransport_of_radial {κ : Type} [Fintype κ] [DecidableEq κ] - (P : Matrix κ κ JetRing) (hP0 : ∀ i j, constantCoeff (P i j) = 0) (hPstar : star P = P) : - ∃ V : Matrix κ κ JetRing, - (constantCoeff : JetRing →+* ℂ).mapMatrix V = 1 ∧ - V * star V = 1 ∧ - (P.trace = 0 → - (∀ (M : Matrix κ κ JetRing) (μ : Fin 1 ⊕ Fin 3), - pderiv μ M.det = (M.map (pderiv μ) * M.adjugate).trace) → V.det = 1) ∧ - ∑ μ, (X μ : JetRing) • (Complex.I • (V.map (pderiv μ) * star V)) = P := by - 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, hV0, hVu, fun hPtr hjac => - eulerTransport_det hjac (by rw [Matrix.trace_smul, hPtr, smul_zero]) hV0 hEV, ?_⟩ - 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 - -/-- Radial integrability: every element of the jet gauge algebra vanishing at the base - point is the radial Maurer–Cartan component of a pure jet, assembled factor by factor - from `exists_eulerTransport_of_radial`. -/ -theorem exists_radial_eq (ρ : JetGaugeAlgebra) (hρ : eval ρ = 0) : - ∃ U : localGaugeData.truncationKer 0, localGaugeData.radial U.1 = ρ := by - classical - have h₃ : ∀ i j, constantCoeff (ρ.toSU3Matrix i j) = 0 := fun i j => by - rw [← eval_toSU3Matrix_apply, hρ] - simp - have h₂ : ∀ i j, constantCoeff (ρ.toSU2Matrix i j) = 0 := fun i j => by - rw [← eval_toSU2Matrix_apply, hρ] - simp - have h₁ : constantCoeff ρ.toU1Value = 0 := by - rw [← eval_toU1Value_eq, hρ] - simp - obtain ⟨V₃, hV₃0, hV₃u, hdet₃, hrad₃⟩ := - exists_eulerTransport_of_radial ρ.toSU3Matrix h₃ ρ.1.2.1 - obtain ⟨V₂, hV₂0, hV₂u, hdet₂, hrad₂⟩ := - exists_eulerTransport_of_radial ρ.toSU2Matrix h₂ ρ.2.1.2.1 - obtain ⟨V₁, hV₁0, hV₁u, _, hrad₁⟩ := - exists_eulerTransport_of_radial (κ := Fin 1) (Matrix.of fun _ _ => ρ.toU1Value) - (fun _ _ => h₁) (Matrix.ext fun _ _ => ρ.2.2.2) - have hd₃ : V₃.det = 1 := hdet₃ (show ρ.toSU3Matrix.trace = 0 from ρ.1.2.2) jacobi_fin3 - have hd₂ : V₂.det = 1 := hdet₂ (show ρ.toSU2Matrix.trace = 0 from ρ.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 - have hrad₁' : ∑ μ, (X μ : JetRing) • - (Complex.I • (pderiv μ (V₁ 0 0) * star (V₁ 0 0))) = ρ.toU1Value := 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⟩⟩), - localGaugeData.mem_truncationKer_zero_iff.mpr - (Prod.ext (Subtype.ext hV₃0) (Prod.ext (Subtype.ext hV₂0) (Subtype.ext hu0)))⟩, ?_⟩ - refine ext_of_matrix ?_ ?_ ?_ - · rw [radial_toSU3Matrix] - exact hrad₃ - · rw [radial_toSU2Matrix] - exact hrad₂ - · rw [radial_toU1Value] - exact hrad₁' - -/-- The Standard Model package is free: Taylor completeness is `eval_iteratedDeriv_taylorJet` - and radial integrability is `exists_radial_eq`. The symmetrized Maurer–Cartan data are - therefore free coordinates on its pure jets, by the general - `LocalGaugeData.symmetrizedMaurerCartanCoeff_bijective`. -/ -instance instFreeLocalGaugeData : localGaugeData.Free where - toFaithful := inferInstance - exists_evalLie_iteratedDeriv_eq c := ⟨taylorJet c, eval_iteratedDeriv_taylorJet c⟩ - exists_radial_eq ρ hρ := exists_radial_eq ρ hρ +/-- The Standard Model package is free. It is the local gauge data of the factors + `SU(3)`, `SU(2)` and `U(1)`, each free, and freeness passes to products: + `LocalGaugeData.instFreeOfFactors`. The symmetrized Maurer–Cartan data are therefore free + coordinates on its pure jets, by `LocalGaugeData.symmetrizedMaurerCartanCoeff_bijective`. -/ +instance instFreeLocalGaugeData : localGaugeData.Free := LocalGaugeData.instFreeOfFactors _ end StandardModel diff --git a/Physlib/Particles/StandardModel/Solution.lean b/Physlib/Particles/StandardModel/Solution.lean index ba476767a..77f62fee4 100644 --- a/Physlib/Particles/StandardModel/Solution.lean +++ b/Physlib/Particles/StandardModel/Solution.lean @@ -46,7 +46,8 @@ here until `JetAlgebra/SectorEquiv/Basic.lean`, which `JetAlgebra/Basic.lean` im builds again. **Freeness** needs no bridge: the gauge data of the card is the hand-built one by -definition, so `instFreeLocalGaugeData` proves `gaugeData_free` outright. The centre +definition, so `instFreeLocalGaugeData`, itself the generic +`LocalGaugeData.instFreeOfFactors`, proves `gaugeData_free` outright. The centre challenge is stated on the card's species and is proved by computing the matrix of each charge tuple at a constant jet; it does not go through the hand-built species files. @@ -57,7 +58,7 @@ charge tuple at a constant jet; it does not go through the hand-built species fi `gaugeSector_invariantsLE_seven_iff` : each classification challenge is equivalent to its form on another datum over the card's gauge data, given the isomorphism. - `StandardModel.Model.gaugeData_free_of_hand_built` : the freeness challenge, from the - hand-built proof. + instance on the hand-built gauge data. -/ @@ -257,13 +258,12 @@ end Transport /-! -## B. Freeness, from the hand-built proof +## B. Freeness, from the hand-built gauge data -/ /-- **The freeness challenge holds**: the gauge data of the card is the hand-built local - gauge data by definition, whose freeness is proved factor by factor in - `GaugeGroup/MaurerCartan/Freeness.lean`. -/ + gauge data by definition, whose freeness is `instFreeLocalGaugeData`. -/ theorem gaugeData_free_of_hand_built : gaugeData.Free := instFreeLocalGaugeData end Model diff --git a/Physlib/Relativity/JetRing/Basic.lean b/Physlib/Relativity/JetRing/Basic.lean index d167b0aa7..86a774868 100644 --- a/Physlib/Relativity/JetRing/Basic.lean +++ b/Physlib/Relativity/JetRing/Basic.lean @@ -126,25 +126,6 @@ lemma coeff_single_one_mul (μ : Fin 1 ⊕ Fin 3) (f g : JetRing) : 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 - /-- The constant-coefficient evaluation of a jet, as a `ℂ`-linear map. -/ noncomputable def constantCoeffₗ : JetRing →ₗ[ℂ] ℂ where toFun := constantCoeff @@ -313,44 +294,6 @@ lemma truncation_add (n : ℕ) (f g : JetRing) : · 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 @@ -382,22 +325,6 @@ lemma truncation_eq_one_of_coeff {n : ℕ} {f : JetRing} (h0 : constantCoeff f = · rw [JetRing.coeff_truncation_of_gt (not_le.mp hm), JetRing.coeff_truncation_of_gt (not_le.mp 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 @@ -545,50 +472,6 @@ lemma constantCoeff_foldl_pderiv (s : Multiset (Fin 1 ⊕ Fin 3)) (f : JetRing) 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 [ite_eq_left (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, ite_eq_left rfl] - · rw [Multiset.count_erase_of_ne h.symm, ite_eq_right 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 [ite_eq_right 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 ν, diff --git a/Physlib/Relativity/JetRing/Matrix.lean b/Physlib/Relativity/JetRing/Matrix.lean index 556cdc154..ccc3c8ac8 100644 --- a/Physlib/Relativity/JetRing/Matrix.lean +++ b/Physlib/Relativity/JetRing/Matrix.lean @@ -13,9 +13,9 @@ public import Physlib.Mathematics.MultisetAntidiagonal /-! # 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. +Results about matrices with entries in `JetRing`, chiefly the Euler (radial) transport: a +matrix of jets vanishing at the base point is the radial logarithmic derivative of a formal +fundamental solution. -/ @[expose] public section @@ -24,178 +24,6 @@ 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, Matrix.add_apply, map_add] - 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 [ite_eq_left h0, ite_eq_left h0] - · rw [ite_eq_right h0, ite_eq_right 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 [ite_eq_left 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 [ite_eq_right 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, ite_eq_right 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 @@ -461,6 +289,21 @@ lemma eulerTransport_mul_star {κ : Type} [Fintype κ] [DecidableEq κ] noncomm_ring exact sub_eq_zero.mp (matrix_eq_zero_of_euler_eq_mul_add_mul R (-R) hR0 hB h0 hEW) +/-- The radial Maurer–Cartan component of a unitary fundamental solution of the radial + system `E V = −i P V` is `P`: `∑_μ x_μ · i (∂_μ V) V† = P`. -/ +lemma sum_X_smul_mcMatrix_of_eulerTransport {κ : Type} [Fintype κ] [DecidableEq κ] + {P V : Matrix κ κ JetRing} (hVu : V * star V = 1) + (hEV : ∑ μ, (X μ : JetRing) • V.map (pderiv μ) = ((-Complex.I) • P) * V) : + ∑ μ, (X μ : JetRing) • (Complex.I • (V.map (pderiv μ) * star V)) = P := by + 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 + /-- 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`. -/ @@ -495,31 +338,6 @@ lemma eulerTransport_det {κ : Type} [Fintype κ] [DecidableEq κ] /-! -## 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 - -/-! - ## The Leibniz rule at the base point for matrices of power series -/ diff --git a/Physlib/Relativity/JetRing/Taylor.lean b/Physlib/Relativity/JetRing/Taylor.lean index 744d68e41..4214bf7fd 100644 --- a/Physlib/Relativity/JetRing/Taylor.lean +++ b/Physlib/Relativity/JetRing/Taylor.lean @@ -6,20 +6,31 @@ Authors: Jinzheng Li module public import Physlib.Relativity.JetRing.Basic +public import Mathlib.LinearAlgebra.Matrix.Trace /-! -# Taylor determinacy of jets +# Taylor determinacy and completeness of jets ## i. Overview A jet is determined by the base-point values of its iterated derivatives, and a jet all of whose first derivatives vanish is the constant jet of its value. These are the two facts that make the jets of a matrix gauge group a faithful package of local gauge data, in the -sense of `LocalGaugeData.Faithful`. +sense of `LocalGaugeData.Faithful`. Conversely every family of base-point Taylor data is +realized by a jet, `taylorSeries`, and entrywise by a matrix of jets, `taylorMatrix`: this +is the Taylor completeness half of `LocalGaugeData.Free`. ## ii. Key results - `JetRing.ext_of_constantCoeff_foldl_pderiv` : Taylor determinacy. - `JetRing.eq_C_of_pderiv_eq_zero` : a jet with vanishing derivatives is constant. +- `JetRing.taylorSeries`, `JetRing.constantCoeff_foldl_pderiv_taylorSeries` : Taylor + completeness. +- `JetRing.taylorMatrix` : Taylor completeness for matrices of jets. + +## iii. Table of contents + +- A. Taylor determinacy +- B. Taylor completeness -/ @@ -29,6 +40,12 @@ namespace JetRing open MvPowerSeries +/-! + +## A. Taylor determinacy + +-/ + /-- **Taylor determinacy**: two jets with the same base-point values of all iterated derivatives are equal. -/ lemma ext_of_constantCoeff_foldl_pderiv {f g : JetRing} @@ -48,4 +65,70 @@ lemma eq_C_of_pderiv_eq_zero {f : JetRing} (hf : ∀ μ, pderiv μ f = 0) : f = C (constantCoeff f) := pderiv.ext (fun i => by rw [hf i, pderiv_C]) (by rw [constantCoeff_C]) +/-! + +## B. Taylor completeness + +-/ + +/-- The power series with prescribed base-point Taylor data `f`: the coefficient at the + monomial `m` is `f` at the multiset of `m`, divided by the factorials of `m`. -/ +noncomputable def taylorSeries (f : Multiset (Fin 1 ⊕ Fin 3) → ℂ) : JetRing := + fun m => ((∏ ν, Nat.factorial (m ν) : ℕ) : ℂ)⁻¹ * f (Finsupp.toMultiset m) + +lemma coeff_taylorSeries (f : Multiset (Fin 1 ⊕ Fin 3) → ℂ) (m : (Fin 1 ⊕ Fin 3) →₀ ℕ) : + coeff m (taylorSeries f) = ((∏ ν, Nat.factorial (m ν) : ℕ) : ℂ)⁻¹ * f (Finsupp.toMultiset m) := + rfl + +lemma star_taylorSeries (f : Multiset (Fin 1 ⊕ Fin 3) → ℂ) : + star (taylorSeries f) = taylorSeries fun s => star (f s) := by + ext m + rw [coeff_star, coeff_taylorSeries, coeff_taylorSeries, star_mul', star_inv₀, + star_natCast] + +lemma taylorSeries_sum {ι : Type} (t : Finset ι) (f : ι → Multiset (Fin 1 ⊕ Fin 3) → ℂ) : + taylorSeries (fun s => ∑ i ∈ t, f i s) = ∑ i ∈ t, taylorSeries (f i) := by + ext m + simp only [coeff_taylorSeries, map_sum, Finset.mul_sum] + +/-- The base-point Taylor data of `taylorSeries f` are `f`. -/ +lemma constantCoeff_foldl_pderiv_taylorSeries (f : Multiset (Fin 1 ⊕ Fin 3) → ℂ) + (s : Multiset (Fin 1 ⊕ Fin 3)) : + constantCoeff (s.foldl (fun h ρ => pderiv ρ h) (taylorSeries f)) = f s := by + have hfac : ((∏ ν, Nat.factorial (s.count ν) : ℕ) : ℂ) ≠ 0 := + Nat.cast_ne_zero.mpr (Finset.prod_ne_zero_iff.mpr fun ν _ => Nat.factorial_ne_zero _) + rw [constantCoeff_foldl_pderiv, coeff_taylorSeries, Multiset.toFinsupp_toMultiset, + show (∏ ν, Nat.factorial (s.toFinsupp ν)) = ∏ ν, Nat.factorial (s.count ν) from + Finset.prod_congr rfl fun ν _ => by rw [Multiset.toFinsupp_apply], + ← mul_assoc, mul_inv_cancel₀ hfac, one_mul] + +/-- The matrix of jets with prescribed base-point Taylor data `M`, entrywise. -/ +noncomputable def taylorMatrix {κ : Type} (M : Multiset (Fin 1 ⊕ Fin 3) → Matrix κ κ ℂ) : + Matrix κ κ JetRing := + Matrix.of fun i j => taylorSeries fun s => M s i j + +lemma taylorMatrix_apply {κ : Type} (M : Multiset (Fin 1 ⊕ Fin 3) → Matrix κ κ ℂ) (i j : κ) : + taylorMatrix M i j = taylorSeries fun s => M s i j := + rfl + +lemma star_taylorMatrix {κ : Type} {M : Multiset (Fin 1 ⊕ Fin 3) → Matrix κ κ ℂ} + (hM : ∀ s, star (M s) = M s) : star (taylorMatrix M) = taylorMatrix M := by + ext i j : 1 + rw [Matrix.star_apply, taylorMatrix_apply, taylorMatrix_apply, star_taylorSeries] + exact congrArg taylorSeries (funext fun s => by rw [← Matrix.star_apply, hM s]) + +lemma trace_taylorMatrix {κ : Type} [Fintype κ] {M : Multiset (Fin 1 ⊕ Fin 3) → Matrix κ κ ℂ} + (hM : ∀ s, (M s).trace = 0) : (taylorMatrix M).trace = 0 := by + have h : ∀ s, ∑ i, M s i i = 0 := fun s => hM s + simp only [Matrix.trace, Matrix.diag_apply, taylorMatrix_apply, ← taylorSeries_sum, h] + ext m + simp [coeff_taylorSeries] + +/-- The base-point Taylor data of `taylorMatrix M` are `M`, entrywise. -/ +lemma map_constantCoeff_foldl_pderiv_taylorMatrix {κ : Type} + (M : Multiset (Fin 1 ⊕ Fin 3) → Matrix κ κ ℂ) (s : Multiset (Fin 1 ⊕ Fin 3)) : + (taylorMatrix M).map (fun f => constantCoeff (s.foldl (fun h ρ => pderiv ρ h) f)) = M s := by + ext i j + rw [Matrix.map_apply, taylorMatrix_apply, constantCoeff_foldl_pderiv_taylorSeries] + end JetRing From e3148b9f8890bb7b5c6612e2e74a9a65190cc25e Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Fri, 25 Sep 2026 00:04:41 +0400 Subject: [PATCH 366/367] Refactor: further clean up of weyl and rank two Lorentz invariance Co-Authored-By: Claude Opus 5.5 --- Physlib/Mathematics/LinearCombination.lean | 6 +- .../GaugeGroup/Invariants/Basic.lean | 4 +- .../Relativity/Fermions/Weyl/BoostWeight.lean | 103 +--- .../LorentzGroup/Invariants/Basic.lean | 103 +++- .../LorentzGroup/Invariants/Centre.lean | 9 +- .../LorentzGroup/Invariants/IsBiLeftWeyl.lean | 254 +++------- .../Invariants/IsLeftRightWeyl.lean | 268 +++------- .../LorentzGroup/Invariants/LightCone.lean | 128 +---- .../Invariants/LorentzCovariance.lean | 8 +- .../LorentzGroup/Invariants/RankFour.lean | 142 ++---- .../LorentzGroup/Invariants/RankThree.lean | 64 +-- .../LorentzGroup/Invariants/RankTwo.lean | 458 ++++-------------- Physlib/Relativity/SL2C/AxisRotations.lean | 75 ++- 13 files changed, 447 insertions(+), 1175 deletions(-) diff --git a/Physlib/Mathematics/LinearCombination.lean b/Physlib/Mathematics/LinearCombination.lean index 24e46a0b6..c30ddfbfd 100644 --- a/Physlib/Mathematics/LinearCombination.lean +++ b/Physlib/Mathematics/LinearCombination.lean @@ -61,10 +61,8 @@ lemma Fintype.exists_invariant_coeff_of_adjoint_mem {ι G B : Type*} [Fintype ι {x : B} (hx : x ∈ ⨆ i, ℂ ∙ T i) (hinv : ∀ g, φ g x = x) : ∃ c : ι → ℂ, x = ∑ i, c i • T i ∧ ∀ g, A g c = c := by classical - obtain ⟨c, rfl⟩ : ∃ c : ι → ℂ, x = ∑ i, c i • T i := by - rw [← Submodule.span_range_eq_iSup, ← Fintype.range_linearCombination, - LinearMap.mem_range] at hx - simpa only [Fintype.linearCombination_apply, eq_comm] using hx + obtain ⟨c, rfl⟩ : ∃ c : ι → ℂ, ∑ i, c i • T i = x := by + rwa [← Submodule.span_range_eq_iSup, Submodule.mem_span_range_iff_exists_fun] at hx -- `K`: the coefficients contracting to `0`, stable under every `A g`. set q := Fintype.linearCombination ℂ T ∘ₗ (WithLp.linearEquiv 2 ℂ (ι → ℂ)).toLinearMap have hq : ∀ u, q u = ∑ i, u.ofLp i • T i := fun u => Fintype.linearCombination_apply ℂ T _ diff --git a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/Basic.lean b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/Basic.lean index 1137ab7bc..7dcda783e 100644 --- a/Physlib/Particles/StandardModel/GaugeGroup/Invariants/Basic.lean +++ b/Physlib/Particles/StandardModel/GaugeGroup/Invariants/Basic.lean @@ -56,8 +56,8 @@ variable {B : Type*} [AddCommGroup B] [Module ℂ B] {ι : Type*} [Fintype ι] of them. -/ lemma mem_iSup_span_singleton_iff (T : ι → B) (x : B) : x ∈ (⨆ i, ℂ ∙ T i) ↔ ∃ c : ι → ℂ, x = ∑ i, c i • T i := by - rw [← Submodule.span_range_eq_iSup, ← Fintype.range_linearCombination, LinearMap.mem_range] - simp only [Fintype.linearCombination_apply, eq_comm] + rw [← Submodule.span_range_eq_iSup, Submodule.mem_span_range_iff_exists_fun] + exact exists_congr fun _ => eq_comm omit [Fintype ι] in /-- Every component lies in the span. -/ diff --git a/Physlib/Relativity/Fermions/Weyl/BoostWeight.lean b/Physlib/Relativity/Fermions/Weyl/BoostWeight.lean index 0da0b5455..61bf4a581 100644 --- a/Physlib/Relativity/Fermions/Weyl/BoostWeight.lean +++ b/Physlib/Relativity/Fermions/Weyl/BoostWeight.lean @@ -13,14 +13,7 @@ public import Physlib.Relativity.LorentzGroup.Boosts.Axis 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 (A). - -Along a general axis the boost is the `z`-boost conjugated by `SL2C.rotationZToAxis`, so the -columns of that rotation are boost eigenvectors of the same weights. Section B records them as -explicit coefficient vectors on the standard Weyl basis, for a left-handed index and, through -the conjugate boost, for a right-handed one, with the matrices writing the standard basis back. -Their normalisation is not uniform across the axes and is kept as it is. Section C is the weight -of a pair of Weyl indices. +the second weight `-1`. A Weyl spinor is a half-vector. -/ @@ -41,10 +34,6 @@ open Matrix MatrixGroups 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) @@ -61,94 +50,4 @@ lemma leftHandedWeyl_rep_boostAxis_two_basis (t : ℝ) (ht : t ≠ 0) (k : Fin 2 fin_cases k <;> simp [weylWeight, Fin.sum_univ_two] -/-! - -## B. The Weyl weight bases along a spatial axis - --/ - -/-- 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 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 [SL2C.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 - -/-! - -## C. The weight of a pair of Weyl indices - --/ - -/-- 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 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] - end Lorentz diff --git a/Physlib/Relativity/LorentzGroup/Invariants/Basic.lean b/Physlib/Relativity/LorentzGroup/Invariants/Basic.lean index 39c702646..db2e97396 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/Basic.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/Basic.lean @@ -37,8 +37,11 @@ transpose is the same product for the transposed matrix, which is again a Lorent from `SL(2,ℂ)`, so `exists_isInvariantCoeff_of_mem_span` applies. Writing each slot of a coefficient tensor in the light-cone basis of an axis splits it into pieces that a boost scales by powers of its parameter, and an invariant keeps only the piece of weight zero: -`IsInvariantCoeff.lightConeComponent_eq_zero`. The Weyl patterns run the same argument on the -second step with the Weyl weight bases of `Fermions.Weyl.BoostWeight`. +`IsInvariantCoeff.lightConeComponent_eq_zero`. Section C records what the half turns about the +axes and the cyclic rotation of the axes force on an invariant coefficient tensor, for any +number of slots. The Weyl patterns need only the second step: there a boost and a half turn +act diagonally or antidiagonally on the coefficients, and the rank-specific files read the +constraints off directly. -/ @[expose] public section @@ -88,7 +91,7 @@ noncomputable def actMatₗ (M : ι → ι → ℂ) : (ι → ℂ) →ₗ[ℂ] ( open scoped InnerProductSpace in /-- Across the standard inner product the action of `M` becomes that of its conjugate - transpose. The action is not unitary, and is not used to be. -/ + transpose. The action is not unitary, and need not be. -/ lemma inner_actMat (M N : ι → ι → ℂ) (hN : ∀ a d, N a d = star (M d a)) (u v : EuclideanSpace ℂ ι) : ⟪u, WithLp.toLp 2 (actMat M v.ofLp)⟫_ℂ = ⟪WithLp.toLp 2 (actMat N u.ofLp), v⟫_ℂ := by @@ -99,7 +102,7 @@ lemma inner_actMat (M N : ι → ι → ℂ) (hN : ∀ a d, N a d = star (M d a) /-- An invariant of the span is the contraction of a coefficient function that every `M g` fixes, provided the matrices are closed under conjugate transposition. -/ -theorem exists_invariantCoeff_matrix (T : ι → B) (φ : G → B →ₗ[ℂ] B) (M : G → ι → ι → ℂ) +lemma exists_invariantCoeff_matrix (T : ι → B) (φ : G → B →ₗ[ℂ] B) (M : G → ι → ι → ℂ) (hT : ∀ (g : G) l, φ g (T l) = ∑ a, M g a l • T a) (hM : ∀ g : G, ∃ g' : G, ∀ a d, M g' a d = star (M g d a)) {x : B} (hx : x ∈ ⨆ i, ℂ ∙ T i) (hinv : ∀ g, φ g x = x) : @@ -201,7 +204,7 @@ end Monoid /-- An invariant of the span is the contraction of an invariant coefficient tensor: the adjoint of `act Λ` is the action of `Λᵀ`, which is the Lorentz matrix of `g†`. -/ -theorem exists_isInvariantCoeff_of_mem_span {T : (Fin n → Fin 1 ⊕ Fin 3) → B} +lemma exists_isInvariantCoeff_of_mem_span {T : (Fin n → Fin 1 ⊕ Fin 3) → B} {repLorentz : Representation ℂ SL(2,ℂ) B} (hT : ∀ (g : SL(2,ℂ)) l, repLorentz g (T l) = ∑ a : Fin n → Fin 1 ⊕ Fin 3, (∏ i, (((SL2C.toLorentzGroup g).1 (a i) (l i) : ℝ) : ℂ)) • T a) @@ -241,15 +244,6 @@ lemma toLorentzGroup_boostAxis_symm (i : Fin 3) {t : ℝ} (ht : t ≠ 0) (a b : congrFun (congrFun (SL2C.toLorentzGroup_conjTranspose (SL2C.boostAxis_conjTranspose i t ht).symm) a) b -/-- The boost with parameter `t` multiplies a light-cone component by `t` raised to the weight - of `κ`, the sum of the weights of the directions `κ` picks. -/ -lemma lightConeComponent_act_boostAxis (i : Fin 3) (c : (Fin n → Fin 1 ⊕ Fin 3) → ℂ) - (κ : Fin n → Fin 4) {t : ℝ} (ht : t ≠ 0) : - lightConeComponent i (act (SL2C.toLorentzGroup (SL2C.boostAxis i t ht)).1 c) κ - = ((t : ℝ) : ℂ) ^ (∑ s, lightConeWeight (κ s)) * lightConeComponent i c κ := - lightConeComponent_act i _ c κ _ fun d => by - simpa only [toLorentzGroup_boostAxis_symm i ht (d _)] using sum_prod_lightConeCoeff i κ d ht - /-- An invariant coefficient tensor has no light-cone component of nonzero weight: the boost at `t = 2` would rescale such a component by a factor other than `1`. -/ lemma IsInvariantCoeff.lightConeComponent_eq_zero {c : (Fin n → Fin 1 ⊕ Fin 3) → ℂ} @@ -271,6 +265,87 @@ lemma eq_sum_lightConeComponent (i : Fin 3) (c : (Fin n → Fin 1 ⊕ Fin 3) → simp only [← Finset.sum_mul, sum_prod_lightConeCoeffInv, ite_mul, one_mul, zero_mul, Finset.sum_ite_eq, Finset.mem_univ, ite_true] +/-! + +## C. The half turns and the cyclic rotation on coefficient tensors + +The half turn `SL2C.halfTurn k` has a diagonal Lorentz matrix with the signs `halfTurnSign k`, +so it multiplies the coefficient at `d` by the product of the signs of the slots of `d`. That +product is `1` or `-1`, and where it is `-1` invariance forces the coefficient to vanish. + +The cyclic rotation `SL2C.rotationCycle` has the permutation matrix of `cycDir`, so it moves +coefficients rather than rescaling them, and invariance says that a coefficient tensor takes +the same value at `d` and at `cycIdx d`, the index vector with every slot rotated. + +-/ + +/-- The half turn about the axis `k` multiplies the coefficient at `a` by the product of the + signs `halfTurnSign k` of the slots of `a`. -/ +lemma act_halfTurn (k : Fin 3) (c : (Fin n → Fin 1 ⊕ Fin 3) → ℂ) (a : Fin n → Fin 1 ⊕ Fin 3) : + act (SL2C.toLorentzGroup (SL2C.halfTurn k)).1 c a + = ((∏ s, halfTurnSign k (a s) : ℤ) : ℂ) * c a := by + rw [act, Finset.sum_eq_single a] + · rw [mul_comm] + push_cast + congr 1 + exact Finset.prod_congr rfl fun s _ => by + rw [SL2C.toLorentzGroup_halfTurn_apply, ite_eq_left rfl, Complex.ofReal_intCast] + · intro d _ hd + obtain ⟨s, hs⟩ := Function.ne_iff.1 hd.symm + rw [Finset.prod_eq_zero (Finset.mem_univ s), mul_zero] + rw [SL2C.toLorentzGroup_halfTurn_apply, ite_eq_right hs, Complex.ofReal_zero] + · exact fun h => absurd (Finset.mem_univ a) h + +/-- The sign a half turn attaches to a coefficient is `1` or `-1`, being a product of such + signs. -/ +lemma prod_halfTurnSign_eq_one_or (k : Fin 3) (d : Fin n → Fin 1 ⊕ Fin 3) : + ∏ s, halfTurnSign k (d s) = 1 ∨ ∏ s, halfTurnSign k (d s) = -1 := by + refine Finset.prod_induction _ (fun m : ℤ => m = 1 ∨ m = -1) ?_ (Or.inl rfl) fun s _ => ?_ + · rintro a b (rfl | rfl) (rfl | rfl) <;> norm_num + · unfold halfTurnSign + split_ifs <;> simp + +/-- An invariant coefficient tensor vanishes at every index vector that some half turn + negates. -/ +lemma IsInvariantCoeff.eq_zero_of_prod_halfTurnSign_ne_one {c : (Fin n → Fin 1 ⊕ Fin 3) → ℂ} + (hc : IsInvariantCoeff c) {k : Fin 3} {d : Fin n → Fin 1 ⊕ Fin 3} + (hd : ∏ s, halfTurnSign k (d s) ≠ 1) : c d = 0 := by + have h := congrFun (hc (SL2C.halfTurn k)) d + rw [act_halfTurn, (prod_halfTurnSign_eq_one_or k d).resolve_left hd] at h + push_cast at h + linear_combination (-2⁻¹ : ℂ) * h + +/-- The relabelling `cycDir`, which fixes time and sends `x → y → z → x`, applied in every + slot. -/ +def cycIdx (d : Fin n → Fin 1 ⊕ Fin 3) : Fin n → Fin 1 ⊕ Fin 3 := fun s => cycDir (d s) + +/-- Cycling the axes three times is the identity. -/ +lemma cycIdx_cycIdx_cycIdx (d : Fin n → Fin 1 ⊕ Fin 3) : cycIdx (cycIdx (cycIdx d)) = d := + funext fun s => cycDir_cycDir_cycDir (d s) + +/-- The cyclic rotation permutes coefficients: the new coefficient at `a` is the old one at `a` + cycled back. -/ +lemma act_rotationCycle (c : (Fin n → Fin 1 ⊕ Fin 3) → ℂ) (a : Fin n → Fin 1 ⊕ Fin 3) : + act (SL2C.toLorentzGroup SL2C.rotationCycle).1 c a = c (cycIdx (cycIdx a)) := by + rw [act, Finset.sum_eq_single (cycIdx (cycIdx a))] + · rw [Finset.prod_eq_one fun s _ => ?_, mul_one] + rw [SL2C.toLorentzGroup_rotationCycle_apply, ite_eq_left, Complex.ofReal_one] + exact (congrFun (cycIdx_cycIdx_cycIdx a) s).symm + · intro d _ hd + have hne : cycIdx d ≠ a := fun h => hd (by rw [← h, cycIdx_cycIdx_cycIdx]) + obtain ⟨s, hs⟩ := Function.ne_iff.1 hne + rw [Finset.prod_eq_zero (Finset.mem_univ s), mul_zero] + rw [SL2C.toLorentzGroup_rotationCycle_apply, + ite_eq_right fun h : a s = cycDir (d s) => hs h.symm, Complex.ofReal_zero] + · exact fun h => absurd (Finset.mem_univ _) h + +/-- An invariant coefficient tensor is constant on the orbits of the cyclic rotation. -/ +lemma IsInvariantCoeff.apply_cycIdx {c : (Fin n → Fin 1 ⊕ Fin 3) → ℂ} (hc : IsInvariantCoeff c) + (d : Fin n → Fin 1 ⊕ Fin 3) : c (cycIdx d) = c d := by + have h := congrFun (hc SL2C.rotationCycle) (cycIdx d) + rw [act_rotationCycle, cycIdx_cycIdx_cycIdx] at h + exact h.symm + end Spacetime end Invariants diff --git a/Physlib/Relativity/LorentzGroup/Invariants/Centre.lean b/Physlib/Relativity/LorentzGroup/Invariants/Centre.lean index 9a2fa53b1..196df27b4 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/Centre.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/Centre.lean @@ -28,9 +28,8 @@ The subspaces that arise there are spans of symbol families, so section B reads such a span off the sign of the value space: the covariant-derivative slots of a family obeying `IsLorentzCovDerivTransforms` are inert at the centre, and only the value index moves. -This replaces, for the Standard Model sectors, the boost-weight parity count: odd boost weight -along a spatial axis and a sign of `-1` at the centre are the same statement about the same -subspaces, and the centre needs neither a grading nor a light-cone basis to say it. +The argument uses the central element alone: it needs neither a grading nor a light-cone +basis. - A. The sign a subspace carries at the centre - B. The sign of a symbol family @@ -116,8 +115,8 @@ lemma range_le_centreEigenspace_neg_one {repLorentz : Representation ℂ SL(2, ## C. Signs multiply The Lorentz action on the field algebra is by algebra maps, so the sign a product carries is -the product of the signs of its factors. This is the whole of the bookkeeping that the -boost-weight convolution used to do: two Weyl indices cancel and an odd number does not. +the product of the signs of its factors. This is the whole of the bookkeeping: two Weyl +indices cancel and an odd number does not. -/ diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsBiLeftWeyl.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsBiLeftWeyl.lean index 5898fb3a9..a7072d357 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsBiLeftWeyl.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsBiLeftWeyl.lean @@ -24,15 +24,17 @@ invariant. The components are vectors `T a` of a complex vector space `B` carrying a representation `repLorentz` of `SL(2,ℂ)`, and `IsBiLeftWeyl` says the group moves each index by the matrix -of `g` (B). An invariant of `componentSpan T` is `∑_a c_a • T a` for a coefficient function `c` -fixed by the action `act` (B, from `Invariants.Basic`), and the argument is the same-handedness -twin of `IsLeftRightWeyl`: the coefficients move by the component matrix `g_{a₁ l₁} g_{a₂ l₂}` -applied to `c`, whose left eigenvectors for an axis boost take the conjugated Weyl weight basis -on both slots (A, C). An invariant is fixed by the weight-zero projection along each axis; the -three projections sum to `2 - swap` (D), and `M c = 3 c` says exactly that `c` is antisymmetric, -which is the `ε` symbol (E). Section F divides out `S`. - -Sections G and H transport the classification to dual Weyl indices, which transform by +of `g` (A). An invariant of `componentSpan T` is `∑_a c_a • T a` for a coefficient function `c` +fixed by the action `act` (A, from `Invariants.Basic`), where `g` moves `c` by the component +matrix `g_{a₁ d₁} g_{a₂ d₂}`, with no complex conjugation. Two elements of `SL(2,ℂ)` pin `c` +down (C). The boost `diag (t, t⁻¹)` along `z` scales `c (0, 0)` by `t²` and `c (1, 1)` by +`t⁻²`, so these vanish. The half turn `!![0, -i; -i, 0]` about `x` swaps the two values of each +index with a factor `-i`, so it sends `c (a₁, a₂)` to `(-i)² c (1 - a₁, 1 - a₂)`, and invariance +gives `c (1, 0) = -c (0, 1)`. What is left is `c (0, 1)` times the `ε` symbol (B). Invariance +under the whole group implies invariance under these two elements; nothing is claimed about +the group they generate. Section D divides out `S`. + +Sections E and F transport the classification to dual Weyl indices, which transform by `(g⁻¹)ᵀ` on an undotted slot and by `(g⁻¹)ᴴ` on a dotted one. The symplectic form `ε` of `Fermions.Weyl.Metric` satisfies `ε g⁻¹ = gᵀ ε`, so re-indexing both slots by `ε` turns a dual family into a fundamental one for the same representation. Entrywise conjugation is the @@ -49,61 +51,7 @@ open TensorProduct Matrix MatrixGroups SL2C Invariants /-! -## A. The weight basis of a pair of left-handed indices - -Both indices are graded by the Weyl weight basis of `Fermions.Weyl.BoostWeight`, so the weight -basis of the pair is its tensor square and the weight is `pairWeight`. The axis boosts are -Hermitian, so as left eigenvectors of the coefficient matrix both slots take the conjugated -basis. - --/ - -/-- The axis-`i` weight basis of the coefficients of a pair of left-handed indices. -/ -def biLeftCoeff (i : Fin 3) (κ α : Fin 2 × Fin 2) : ℂ := - weylCoeffC i κ.1 α.1 * weylCoeffC i κ.2 α.2 - -/-- The standard basis of the coefficients written back in the axis-`i` weight basis. -/ -noncomputable def biLeftCoeffInv (i : Fin 3) (α κ : Fin 2 × Fin 2) : ℂ := - weylCoeffInvC i α.1 κ.1 * weylCoeffInvC 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 : (∑ κ₁, weylCoeffInvC i α.1 κ₁ * weylCoeffC i κ₁ β.1) - * (∑ κ₂, weylCoeffInvC i α.2 κ₂ * weylCoeffC 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_weylCoeffInvC_mul, sum_weylCoeffInvC_mul] - obtain ⟨α₁, α₂⟩ := α - obtain ⟨β₁, β₂⟩ := β - by_cases h1 : α₁ = β₁ <;> by_cases h2 : α₂ = β₂ <;> simp [h1, h2, Prod.mk.injEq] - -/-- The pair weight basis consists of left eigenvectors of the coefficient matrix - `g_{a₁ l₁} g_{a₂ l₂}` of the axis-`i` boost, with eigenvalue `t ^ pairWeight κ`. -/ -lemma sum_boostAxis_biLeftCoeff (i : Fin 3) (κ l : Fin 2 × Fin 2) {t : ℝ} (ht : t ≠ 0) : - ∑ a : Fin 2 × Fin 2, biLeftCoeff i κ a - * ((SL2C.boostAxis i t ht).1 a.1 l.1 * (SL2C.boostAxis i t ht).1 a.2 l.2) - = ((t : ℝ) : ℂ) ^ (pairWeight κ) * biLeftCoeff i κ l := by - have htc : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - have hfac : (∑ a₁, star ((SL2C.boostAxis i t ht).1 l.1 a₁) * weylCoeffC i κ.1 a₁) - * (∑ a₂, star ((SL2C.boostAxis i t ht).1 l.2 a₂) * weylCoeffC i κ.2 a₂) - = ∑ a : Fin 2 × Fin 2, biLeftCoeff i κ a - * ((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] - refine Finset.sum_congr rfl fun a₁ _ => Finset.sum_congr rfl fun a₂ _ => ?_ - simp only [biLeftCoeff, star_boostAxis_apply] - ring - rw [← hfac, sum_boostAxis_weylCoeffC i κ.1 l.1 ht, sum_boostAxis_weylCoeffC i κ.2 l.2 ht, - pairWeight, biLeftCoeff, zpow_add₀ htc] - ring - -/-! - -## B. Bi-left-handed Weyl tensors and their coefficient functions +## A. Bi-left-handed Weyl tensors and their coefficient functions -/ @@ -134,7 +82,7 @@ def IsInvariantCoeff (c : Fin 2 × Fin 2 → ℂ) : Prop := ∀ g : SL(2,ℂ), a include hT in /-- An invariant of the span is the contraction of an invariant coefficient function: the adjoint of the action of `g` is the action of `g†`. -/ -theorem exists_isInvariantCoeff_of_mem_componentSpan {x : B} (hx : x ∈ componentSpan T) +lemma exists_isInvariantCoeff_of_mem_componentSpan {x : B} (hx : x ∈ componentSpan T) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : ∃ c : Fin 2 × Fin 2 → ℂ, IsInvariantCoeff c ∧ x = ∑ d, c d • T d := by obtain ⟨c, hc, hx'⟩ := Invariants.exists_invariantCoeff_matrix T (fun g => repLorentz g) @@ -146,88 +94,10 @@ theorem exists_isInvariantCoeff_of_mem_componentSpan {x : B} (hx : x ∈ compone /-! -## C. The weight grading of the coefficients - -The four covectors `biLeftCoeff i κ` read off the weight components of a coefficient function, -and the axis-`i` boost multiplies the component at `κ` by `t ^ pairWeight κ`. An invariant -function has no component of weight `±2`. - --/ - -/-- The axis-`i` weight component of a coefficient function at the pair `κ`. -/ -def weightComponent (i : Fin 3) (c : Fin 2 × Fin 2 → ℂ) (κ : Fin 2 × Fin 2) : ℂ := - ∑ a : Fin 2 × Fin 2, biLeftCoeff i κ a * c a - -/-- The axis-`i` boost multiplies the weight component at `κ` by `t ^ pairWeight κ`. -/ -lemma weightComponent_act_boostAxis (i : Fin 3) (c : Fin 2 × Fin 2 → ℂ) - (κ : Fin 2 × Fin 2) {t : ℝ} (ht : t ≠ 0) : - weightComponent i (act (SL2C.boostAxis i t ht) c) κ - = ((t : ℝ) : ℂ) ^ (pairWeight κ) * weightComponent i c κ := - sum_mul_actMat _ _ c _ fun l => sum_boostAxis_biLeftCoeff i κ l ht - -/-- An invariant coefficient function has no weight component of nonzero weight. -/ -lemma weightComponent_eq_zero {c : Fin 2 × Fin 2 → ℂ} (hc : IsInvariantCoeff c) (i : Fin 3) - {κ : Fin 2 × Fin 2} (hκ : pairWeight κ ≠ 0) : weightComponent i c κ = 0 := - sum_mul_eq_zero_of_actMat_eq _ (hc (SL2C.boostAxis i 2 two_ne_zero)) - (fun l => sum_boostAxis_biLeftCoeff i κ l two_ne_zero) (two_zpow_ne_one hκ) - -/-- A coefficient function is recovered from its weight components. -/ -lemma eq_sum_weightComponent (i : Fin 3) (c : Fin 2 × Fin 2 → ℂ) (α : Fin 2 × Fin 2) : - c α = ∑ κ : Fin 2 × Fin 2, biLeftCoeffInv i α κ * weightComponent i c κ := by - simp only [weightComponent, Finset.mul_sum, ← mul_assoc] - rw [Finset.sum_comm] - simp only [← Finset.sum_mul, sum_biLeftCoeffInv_mul, ite_mul, one_mul, zero_mul, - Finset.sum_ite_eq, Finset.mem_univ, ite_true] - -/-! - -## D. The weight-zero round and its average over the axes - -Keeping only the weight-zero components writes an invariant coefficient function as one matrix -per axis applied to itself, and the three average to `2 - swap`. - --/ - -/-- The matrix of the axis-`i` weight-zero projection on coefficient functions. -/ -noncomputable def weightZeroTransition (i : Fin 3) (α β : Fin 2 × Fin 2) : ℂ := - ∑ κ ∈ Finset.univ.filter (fun κ : Fin 2 × Fin 2 => pairWeight κ = 0), - biLeftCoeffInv i α κ * biLeftCoeff i κ β - -/-- An invariant coefficient function is fixed by the axis-`i` weight-zero projection. -/ -lemma eq_sum_weightZeroTransition {c : Fin 2 × Fin 2 → ℂ} (hc : IsInvariantCoeff c) (i : Fin 3) - (α : Fin 2 × Fin 2) : c α = ∑ β, weightZeroTransition i α β * c β := by - have hfil : ∀ κ ∈ Finset.univ.filter (fun κ : Fin 2 × Fin 2 => ¬ pairWeight κ = 0), - biLeftCoeffInv i α κ * weightComponent i c κ = 0 := - fun κ hκ => by rw [weightComponent_eq_zero hc i (Finset.mem_filter.1 hκ).2, mul_zero] - rw [eq_sum_weightComponent i c α, ← Finset.sum_filter_add_sum_filter_not Finset.univ - (fun κ : Fin 2 × Fin 2 => pairWeight κ = 0), Finset.sum_eq_zero hfil, add_zero] - simp only [weightComponent, weightZeroTransition, Finset.mul_sum, Finset.sum_mul, ← mul_assoc] - rw [Finset.sum_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, weylCoeffC, weylCoeffInvC] <;> - norm_num [Complex.ext_iff] - -/-! - -## E. The epsilon contraction and the linear certificate +## B. The epsilon contraction -The summed transition is `2 - swap`, so `M c = 3 c` says exactly that `c` is antisymmetric. -An invariant coefficient function is therefore the `ε` symbol up to a scalar, and the invariant -is that multiple of the `ε` contraction. +The `ε` symbol, in the convention of `Fermion.metricRaw`, contracts the two indices +antisymmetrically, and the contraction is invariant because `det g = 1`. -/ @@ -265,27 +135,55 @@ lemma repLorentz_epsilonContraction (g : SL(2,ℂ)) : · 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 - -/-- An invariant coefficient function is antisymmetric: the summed transition is `2 - swap`, - and an invariant is its eigenvector for the eigenvalue `3`. -/ -lemma eq_neg_swap {c : Fin 2 × Fin 2 → ℂ} (hc : IsInvariantCoeff c) (β : Fin 2 × Fin 2) : - c β = - c β.swap := by - have h3 : ∑ i : Fin 3, ∑ α, weightZeroTransition i β α * c α = 3 * c β := by - rw [Fin.sum_univ_three, ← eq_sum_weightZeroTransition hc 0 β, - ← eq_sum_weightZeroTransition hc 1 β, ← eq_sum_weightZeroTransition hc 2 β] - ring - rw [show (∑ i : Fin 3, ∑ α, weightZeroTransition i β α * c α) = 2 * c β - c β.swap from by - rw [Finset.sum_comm, ← sum_transitionEntry_mul c β] - exact Finset.sum_congr rfl fun α _ => by - rw [← Finset.sum_mul, sum_weightZeroTransition_eq]] at h3 - linear_combination -h3 +/-! + +## C. The boost along `z` and the half turn about `x` force the `ε` form + +The boost along `z` is diagonal, so `act` rescales each coefficient and kills the two diagonal +ones. The half turn about `x` is antidiagonal, so `act` moves each coefficient to the opposite +pair of index values with the factor `(-i)² = -1`, which makes the coefficients antisymmetric. + +-/ + +/-- The boost `diag (t, t⁻¹)` along `z` scales `c (0, 0)` by `t²` and `c (1, 1)` by `t⁻²`; at + `t = 2` invariance forces both to vanish. -/ +lemma IsInvariantCoeff.apply_self_eq_zero {c : Fin 2 × Fin 2 → ℂ} (hc : IsInvariantCoeff c) + (k : Fin 2) : c (k, k) = 0 := by + have h := hc (SL2C.boostAxis 2 2 two_ne_zero) + revert k + refine Fin.forall_fin_two.2 ⟨?_, ?_⟩ + · have h00 := congrFun h (0, 0) + simp [act, Fintype.sum_prod_type, Fin.sum_univ_two] at h00 + linear_combination h00 / 3 + · have h11 := congrFun h (1, 1) + simp [act, Fintype.sum_prod_type, Fin.sum_univ_two] at h11 + linear_combination -(4 / 3 : ℂ) * h11 + +/-- An invariant coefficient function is antisymmetric. The half turn `!![0, -i; -i, 0]` about + `x` sends `c (0, 1)` to `(-i)² c (1, 0) = -c (1, 0)`, and the diagonal coefficients vanish by + the boost. -/ +lemma IsInvariantCoeff.eq_neg_swap {c : Fin 2 × Fin 2 → ℂ} (hc : IsInvariantCoeff c) + (a : Fin 2 × Fin 2) : c a = -c a.swap := by + have h01 := congrFun (hc (SL2C.halfTurn 0)) (0, 1) + simp [act, Fintype.sum_prod_type, Fin.sum_univ_two] at h01 + obtain ⟨a₁, a₂⟩ := a + fin_cases a₁ <;> fin_cases a₂ + · simp [hc.apply_self_eq_zero 0] + · show c (0, 1) = -c (1, 0) + linear_combination -h01 + · show c (1, 0) = -c (0, 1) + linear_combination -h01 + · simp [hc.apply_self_eq_zero 1] + +/-- An invariant coefficient function is `c (0, 1)` times the `ε` symbol. -/ +lemma IsInvariantCoeff.eq_smul_epsZ {c : Fin 2 × Fin 2 → ℂ} (hc : IsInvariantCoeff c) + (a : Fin 2 × Fin 2) : c a = c (0, 1) * ((epsZ a : ℤ) : ℂ) := by + obtain ⟨a₁, a₂⟩ := a + fin_cases a₁ <;> fin_cases a₂ + · simp [hc.apply_self_eq_zero 0, epsZ] + · simp [epsZ] + · simpa [epsZ] using hc.eq_neg_swap (1, 0) + · simp [hc.apply_self_eq_zero 1, epsZ] include hT in /-- The classification of the Lorentz invariants: every element of the span of the @@ -294,25 +192,13 @@ theorem exists_smul_epsilonContraction_of_invariant {x : B} (hx : x ∈ componen (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : ∃ a : ℂ, x = a • epsilonContraction (T := T) := by obtain ⟨c, hc, rfl⟩ := hT.exists_isInvariantCoeff_of_mem_componentSpan hx hinv - have h00 : c (0, 0) = 0 := by - have h := eq_neg_swap hc (0, 0) - rw [Prod.swap_prod_mk] at h - linear_combination h / 2 - have h11 : c (1, 1) = 0 := by - have h := eq_neg_swap hc (1, 1) - rw [Prod.swap_prod_mk] at h - linear_combination h / 2 - have h10 : c (1, 0) = - c (0, 1) := by - have h := eq_neg_swap hc (1, 0) - rwa [Prod.swap_prod_mk] at h refine ⟨c (0, 1), ?_⟩ - rw [epsilonContraction_eq] - simp only [Fintype.sum_prod_type, Fin.sum_univ_two, h00, h11, h10] - module + rw [epsilonContraction, Finset.smul_sum] + exact Finset.sum_congr rfl fun a _ => by rw [smul_smul, ← hc.eq_smul_epsZ a] /-! -## F. The classification modulo a Lorentz-stable submodule +## D. The classification modulo a Lorentz-stable submodule A stable subspace `S` is divided out by passing to the quotient `B ⧸ S`: the classes of the components again form a bi-left-handed tensor, so the classification applies there and lifts @@ -358,7 +244,7 @@ end IsBiLeftWeyl /-! -## G. Dual-index families and the `ε` re-index +## E. Dual-index families and the `ε` re-index `IsBiDualLeftWeyl` and `IsBiDualRightWeyl` are the laws the Standard Model's fermion symbols carry: one factor of `(g⁻¹)ᵀ` per index for an undotted pair, one of `(g⁻¹)ᴴ` for a dotted @@ -575,7 +461,7 @@ lemma IsBiDualRightWeyl.isBiLeftWeyl_epsReindex {B : Type*} [AddCommGroup B] /-! -## H. The classification of the invariants of a dual-index family +## F. The classification of the invariants of a dual-index family The re-index leaves the `ε` contraction alone, so the contraction in the conclusions is that of the original family, `T (0, 1) - T (1, 0)`, with no sign or scalar attached. For the dotted diff --git a/Physlib/Relativity/LorentzGroup/Invariants/IsLeftRightWeyl.lean b/Physlib/Relativity/LorentzGroup/Invariants/IsLeftRightWeyl.lean index 3a3633b48..3bc80dac5 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/IsLeftRightWeyl.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/IsLeftRightWeyl.lean @@ -7,7 +7,6 @@ module public import Physlib.Relativity.LorentzGroup.Invariants.LorentzCovariance public import Physlib.Mathematics.InvariantReduction -public import Physlib.Relativity.Fermions.Weyl.BoostWeight /-! # Lorentz invariants of a left-handed and a right-handed Weyl index @@ -19,15 +18,15 @@ a Lorentz-stable subspace `S`, the form the Standard Model files use. The components are vectors `T a` of a complex vector space `B` carrying a representation `repLorentz` of `SL(2,ℂ)`, and `IsLeftRightWeyl` says the group moves the left index by the -matrix of `g` and the right index by its complex conjugate (B). An invariant of +matrix of `g` and the right index by its complex conjugate (A). An invariant of `componentSpan T` is `∑_a c_a • T a` for a coefficient function `c` fixed by the action `act` -(B, from `Invariants.Basic`), and the argument is the four-vector one with the light-cone basis -replaced by the Weyl weight bases of `Fermions.Weyl.BoostWeight`. The coefficients move by the -component matrix `g_{a₁ l₁} ḡ_{a₂ l₂}` applied to `c`, whose left eigenvectors for an axis -boost are the products `pairCoeff` of a conjugated left and a plain right weight vector, with -weights `2`, `0`, `0`, `-2` (A, C). An invariant is fixed by the weight-zero projection along -each axis (D); the three projections sum to a matrix `M` with `M ^ 2 = 2 M`, while an invariant -would need `M c = 3 c`, which forces `c = 0` (E). Section F divides out `S`. +(A, from `Invariants.Basic`), and two elements of `SL(2,ℂ)` already force such a `c` to vanish +(B). Both are diagonal, and a diagonal `g = diag (λ₀, λ₁)` multiplies `c (a₁, a₂)` by +`λ_{a₁} * conj λ_{a₂}`. The boost `diag (t, t⁻¹)` along `z` scales `c (0, 0)` by `t²` and +`c (1, 1)` by `t⁻²`, so these vanish, and the half turn `diag (-i, i)` about `z` multiplies +`c (0, 1)` and `c (1, 0)` by `-i * conj i = -1`, so these vanish too. Invariance under the whole +group implies invariance under these two elements; nothing is claimed about the group they +generate. Section C divides out `S`. The dual law, `(g⁻¹)ᵀ` on the undotted and `(g⁻¹)ᴴ` on the dotted slot, is `IsDualLeftRightWeyl` in `IsVectorLeftRightWeyl`, which transports this classification to it. @@ -41,62 +40,7 @@ open TensorProduct Matrix MatrixGroups SL2C Invariants /-! -## A. The weight basis of the coefficients 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 axis boosts are -Hermitian, so as left eigenvectors of the coefficient matrix the left slot takes the -conjugated basis and the right slot the plain one, the opposite of the components. - --/ - -/-- The axis-`i` weight basis of the coefficients of a left-right pair of indices. -/ -def pairCoeff (i : Fin 3) (κ α : Fin 2 × Fin 2) : ℂ := - weylCoeffC i κ.1 α.1 * weylCoeff i κ.2 α.2 - -/-- The standard basis of the coefficients written back in the axis-`i` weight basis. -/ -noncomputable def pairCoeffInv (i : Fin 3) (α κ : Fin 2 × Fin 2) : ℂ := - weylCoeffInvC i α.1 κ.1 * weylCoeffInv 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 : (∑ κ₁, weylCoeffInvC i α.1 κ₁ * weylCoeffC i κ₁ β.1) - * (∑ κ₂, weylCoeffInv i α.2 κ₂ * weylCoeff 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_weylCoeffInvC_mul, sum_weylCoeffInv_mul] - obtain ⟨α₁, α₂⟩ := α - obtain ⟨β₁, β₂⟩ := β - by_cases h1 : α₁ = β₁ <;> by_cases h2 : α₂ = β₂ <;> simp [h1, h2, Prod.mk.injEq] - -/-- The pair weight basis consists of left eigenvectors of the coefficient matrix - `g_{a₁ l₁} ḡ_{a₂ l₂}` of the axis-`i` boost, with eigenvalue `t ^ pairWeight κ`. -/ -lemma sum_boostAxis_pairCoeff (i : Fin 3) (κ l : Fin 2 × Fin 2) {t : ℝ} (ht : t ≠ 0) : - ∑ a : Fin 2 × Fin 2, pairCoeff i κ a - * ((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 κ l := by - have htc : ((t : ℝ) : ℂ) ≠ 0 := Complex.ofReal_ne_zero.mpr ht - have hfac : (∑ a₁, star ((SL2C.boostAxis i t ht).1 l.1 a₁) * weylCoeffC i κ.1 a₁) - * (∑ a₂, (SL2C.boostAxis i t ht).1 l.2 a₂ * weylCoeff i κ.2 a₂) - = ∑ a : Fin 2 × Fin 2, pairCoeff i κ a - * ((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] - refine Finset.sum_congr rfl fun a₁ _ => Finset.sum_congr rfl fun a₂ _ => ?_ - simp only [pairCoeff, star_boostAxis_apply] - ring - rw [← hfac, sum_boostAxis_weylCoeffC i κ.1 l.1 ht, sum_boostAxis_weylCoeff i κ.2 l.2 ht, - pairWeight, pairCoeff, zpow_add₀ htc] - ring - -/-! - -## B. Left-right bispinors and their coefficient functions +## A. Left-right bispinors and their coefficient functions -/ @@ -129,7 +73,7 @@ def IsInvariantCoeff (c : Fin 2 × Fin 2 → ℂ) : Prop := ∀ g : SL(2,ℂ), a include hT in /-- An invariant of the span is the contraction of an invariant coefficient function: the adjoint of the action of `g` is the action of `g†`. -/ -theorem exists_isInvariantCoeff_of_mem_componentSpan {x : B} (hx : x ∈ componentSpan T) +lemma exists_isInvariantCoeff_of_mem_componentSpan {x : B} (hx : x ∈ componentSpan T) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : ∃ c : Fin 2 × Fin 2 → ℂ, IsInvariantCoeff c ∧ x = ∑ d, c d • T d := by obtain ⟨c, hc, hx'⟩ := Invariants.exists_invariantCoeff_matrix T (fun g => repLorentz g) @@ -141,152 +85,56 @@ theorem exists_isInvariantCoeff_of_mem_componentSpan {x : B} (hx : x ∈ compone /-! -## C. The weight grading of the coefficients - -The four covectors `pairCoeff i κ` read off the weight components of a coefficient function, -and the axis-`i` boost multiplies the component at `κ` by `t ^ pairWeight κ`. An invariant -function therefore has no component of weight `±2`, and is recovered from its two weight-zero -components alone. - --/ - -/-- The axis-`i` weight component of a coefficient function at the pair `κ`. -/ -def weightComponent (i : Fin 3) (c : Fin 2 × Fin 2 → ℂ) (κ : Fin 2 × Fin 2) : ℂ := - ∑ a : Fin 2 × Fin 2, pairCoeff i κ a * c a - -/-- The axis-`i` boost multiplies the weight component at `κ` by `t ^ pairWeight κ`. -/ -lemma weightComponent_act_boostAxis (i : Fin 3) (c : Fin 2 × Fin 2 → ℂ) - (κ : Fin 2 × Fin 2) {t : ℝ} (ht : t ≠ 0) : - weightComponent i (act (SL2C.boostAxis i t ht) c) κ - = ((t : ℝ) : ℂ) ^ (pairWeight κ) * weightComponent i c κ := - sum_mul_actMat _ _ c _ fun l => sum_boostAxis_pairCoeff i κ l ht - -/-- An invariant coefficient function has no weight component of nonzero weight. -/ -lemma weightComponent_eq_zero {c : Fin 2 × Fin 2 → ℂ} (hc : IsInvariantCoeff c) (i : Fin 3) - {κ : Fin 2 × Fin 2} (hκ : pairWeight κ ≠ 0) : weightComponent i c κ = 0 := - sum_mul_eq_zero_of_actMat_eq _ (hc (SL2C.boostAxis i 2 two_ne_zero)) - (fun l => sum_boostAxis_pairCoeff i κ l two_ne_zero) (two_zpow_ne_one hκ) - -/-- A coefficient function is recovered from its weight components. -/ -lemma eq_sum_weightComponent (i : Fin 3) (c : Fin 2 × Fin 2 → ℂ) (α : Fin 2 × Fin 2) : - c α = ∑ κ : Fin 2 × Fin 2, pairCoeffInv i α κ * weightComponent i c κ := by - simp only [weightComponent, Finset.mul_sum, ← mul_assoc] - rw [Finset.sum_comm] - simp only [← Finset.sum_mul, sum_pairCoeffInv_mul, ite_mul, one_mul, zero_mul, - Finset.sum_ite_eq, Finset.mem_univ, ite_true] - -/-! - -## D. The weight-zero round and its average over the axes - -Keeping only the weight-zero components writes an invariant coefficient function as one matrix -per axis applied to itself, and the three average to a matrix with a short closed form. - --/ - -/-- The matrix of the axis-`i` weight-zero projection on coefficient functions. -/ -noncomputable def weightZeroTransition (i : Fin 3) (α β : Fin 2 × Fin 2) : ℂ := - ∑ κ ∈ Finset.univ.filter (fun κ : Fin 2 × Fin 2 => pairWeight κ = 0), - pairCoeffInv i α κ * pairCoeff i κ β - -/-- An invariant coefficient function is fixed by the axis-`i` weight-zero projection. -/ -lemma eq_sum_weightZeroTransition {c : Fin 2 × Fin 2 → ℂ} (hc : IsInvariantCoeff c) (i : Fin 3) - (α : Fin 2 × Fin 2) : c α = ∑ β, weightZeroTransition i α β * c β := by - have hfil : ∀ κ ∈ Finset.univ.filter (fun κ : Fin 2 × Fin 2 => ¬ pairWeight κ = 0), - pairCoeffInv i α κ * weightComponent i c κ = 0 := - fun κ hκ => by rw [weightComponent_eq_zero hc i (Finset.mem_filter.1 hκ).2, mul_zero] - rw [eq_sum_weightComponent i c α, ← Finset.sum_filter_add_sum_filter_not Finset.univ - (fun κ : Fin 2 × Fin 2 => pairWeight κ = 0), Finset.sum_eq_zero hfil, add_zero] - simp only [weightComponent, weightZeroTransition, Finset.mul_sum, Finset.sum_mul, ← mul_assoc] - rw [Finset.sum_comm] - -/-! - -## E. The quadratic certificate and the classification +## B. The boost and the half turn along `z` force the coefficients to vanish -The summed transition `M` satisfies `M ^ 2 = 2 M`, while an invariant coefficient function -would have to satisfy `M c = 3 c`. Only `c = 0` does both. +Both elements used are diagonal, so `act` rescales each coefficient: `diag (λ₀, λ₁)` multiplies +`c (a₁, a₂)` by `λ_{a₁} * conj λ_{a₂}`, the right index taking the complex conjugate. The boost +along `z` at `t = 2` kills the two diagonal coefficients, and the half turn about `z` kills the +two mixed ones. -/ -/-- 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] - -/-- 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 - -/-- An invariant coefficient function is `3` times its averaged round, so it is an eigenvector - of the summed transition for the eigenvalue `3`. -/ -lemma applyTransition_eq_three_smul {c : Fin 2 × Fin 2 → ℂ} (hc : IsInvariantCoeff c) - (β : Fin 2 × Fin 2) : applyTransition c β = 3 * c β := by - have h3 : ∑ i : Fin 3, ∑ α, weightZeroTransition i β α * c α = 3 * c β := by - rw [Fin.sum_univ_three, ← eq_sum_weightZeroTransition hc 0 β, - ← eq_sum_weightZeroTransition hc 1 β, ← eq_sum_weightZeroTransition hc 2 β] - ring - rw [← h3, applyTransition, Finset.sum_comm] - exact Finset.sum_congr rfl fun α _ => by rw [← Finset.sum_mul, sum_weightZeroTransition_eq] - -/-- An invariant coefficient function is zero: `3` is not an eigenvalue of a matrix squaring - to twice itself unless the eigenvector is. -/ -lemma eq_zero_of_isInvariantCoeff {c : Fin 2 × Fin 2 → ℂ} (hc : IsInvariantCoeff c) : c = 0 := by - funext β - show c β = 0 - have h9 : applyTransition (applyTransition c) β = 9 * c β := by - rw [show applyTransition c = fun γ => 3 * c γ from - funext fun γ => applyTransition_eq_three_smul hc γ, applyTransition_const_mul, - applyTransition_eq_three_smul hc] - ring - have h6 : applyTransition (applyTransition c) β = 6 * c β := by - rw [applyTransition_applyTransition, applyTransition_eq_three_smul hc] - ring - rw [h9] at h6 - linear_combination h6 / 3 +/-- The boost `diag (t, t⁻¹)` along `z` scales `c (0, 0)` by `t * conj t = t²` and `c (1, 1)` + by `t⁻²`; at `t = 2` invariance forces both to vanish. -/ +lemma IsInvariantCoeff.apply_self_eq_zero {c : Fin 2 × Fin 2 → ℂ} (hc : IsInvariantCoeff c) + (k : Fin 2) : c (k, k) = 0 := by + have h := hc (SL2C.boostAxis 2 2 two_ne_zero) + revert k + refine Fin.forall_fin_two.2 ⟨?_, ?_⟩ + · have h00 := congrFun h (0, 0) + simp [act, Fintype.sum_prod_type, Fin.sum_univ_two, map_ofNat] at h00 + linear_combination h00 / 3 + · have h11 := congrFun h (1, 1) + simp [act, Fintype.sum_prod_type, Fin.sum_univ_two, map_ofNat] at h11 + linear_combination -(4 / 3 : ℂ) * h11 + +/-- The half turn `diag (-i, i)` about `z` multiplies `c (0, 1)` by `-i * conj i = -1` and + `c (1, 0)` by `i * conj (-i) = -1`, so invariance forces both mixed coefficients to vanish. -/ +lemma IsInvariantCoeff.apply_eq_zero_of_ne {c : Fin 2 × Fin 2 → ℂ} (hc : IsInvariantCoeff c) + {a : Fin 2 × Fin 2} (ha : a.1 ≠ a.2) : c a = 0 := by + have h := hc (SL2C.halfTurn 2) + have h01 := congrFun h (0, 1) + have h10 := congrFun h (1, 0) + simp [act, Fintype.sum_prod_type, Fin.sum_univ_two] at h01 h10 + obtain ⟨a₁, a₂⟩ := a + fin_cases a₁ <;> fin_cases a₂ + · exact absurd rfl ha + · show c (0, 1) = 0 + linear_combination -h01 / 2 + · show c (1, 0) = 0 + linear_combination -h10 / 2 + · exact absurd rfl ha + +/-- An invariant coefficient function is zero: the boost kills its diagonal and the half turn + its mixed coefficients. -/ +lemma IsInvariantCoeff.eq_zero {c : Fin 2 × Fin 2 → ℂ} (hc : IsInvariantCoeff c) : c = 0 := by + funext a + by_cases ha : a.1 = a.2 + · obtain ⟨a₁, a₂⟩ := a + simp only at ha + subst ha + exact hc.apply_self_eq_zero a₁ + · exact hc.apply_eq_zero_of_ne ha include hT in /-- Every Lorentz invariant in the span of the components is zero: the pair of indices carries @@ -294,11 +142,11 @@ include hT in theorem eq_zero_of_invariant {x : B} (hx : x ∈ componentSpan T) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : x = 0 := by obtain ⟨c, hc, rfl⟩ := hT.exists_isInvariantCoeff_of_mem_componentSpan hx hinv - simp [eq_zero_of_isInvariantCoeff hc] + simp [hc.eq_zero] /-! -## F. The classification modulo a Lorentz-stable submodule +## C. The classification modulo a Lorentz-stable submodule A stable subspace `S` is divided out by passing to the quotient `B ⧸ S`: the classes of the components again form a bispinor, so the classification applies there and lifts back with an diff --git a/Physlib/Relativity/LorentzGroup/Invariants/LightCone.lean b/Physlib/Relativity/LorentzGroup/Invariants/LightCone.lean index f063191a7..59538775c 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/LightCone.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/LightCone.lean @@ -8,31 +8,26 @@ module public import Physlib.Mathematics.Fin public import Physlib.Relativity.LorentzGroup.Invariants.Basic /-! -# The light-cone basis of a boost axis over the integers and the rationals +# The light-cone basis of a boost axis over the integers `lightConeCoeff` and `lightConeCoeffInv` of `LightConeDeriv` change a spacetime index into the light-cone basis of a spatial axis `i`: the two directions `D₀ - Dᵢ` and `D₀ + Dᵢ` of the plane the boost along `i` moves, and the two transverse directions. Their entries are `0`, `±1` and -`±1/2`, so both matrices have integer or rational mirrors, and the rank-two and rank-four -classifications compute with a mirror rather than with `ℂ`: the kernel evaluates `ℤ` and `ℚ` -and does not evaluate `ℂ`. The Weyl classifications carry their own weight bases and use none -of this. This file holds the mirrors and what is proved about them at an arbitrary number of -indices; the rank-specific files contract them against as many slots as they have. +`±1/2`, so both matrices have integer mirrors, and the rank-four classification computes with +them in the kernel, which evaluates `ℤ` and does not evaluate `ℂ`. This file holds the mirrors +and what is proved about them at an arbitrary number of indices. The change of basis one way is `lightConeCoeffZ`, an exact integer copy. The other way needs -the halves: `lightConeCoeffInvQ` keeps them, and `lightConeCoeffInvZ` clears them, so it is -twice the true inverse and a contraction over `n` slots carries a factor `2 ^ n` that the -rank-specific file divides out. That is the only normalization in play, and -`coe_lightConeCoeffInvZ_eq_two_mul` and `coe_lightConeCoeffInvZ` record it against `ℂ` and `ℚ`. - -Three groupings of the four light-cone directions are used. `InBoostPlane` separates the two -directions of weight `±2` from the two transverse ones, one index at a time. `sectorIndex` -sorts the four into the three sectors of distinct boost weight, raising, lowering and -transverse, `sectorWeight` records those weights, and `slotTransition` and `slotTransitionZ` -sum one slot of the change of basis over a sector. `slotZ` keeps the four directions apart -instead, and `transitionZ` composes it over `n` slots into `2 ^ n` times the map keeping the -light-cone components of total weight `m`; `transitionZ_eq_sum` unfolds that recursion into a -single sum over the multi-indices of that weight. +the halves, and `lightConeCoeffInvZ` clears them, so it is twice the true inverse and a +contraction over `n` slots carries a factor `2 ^ n` that the rank-four file divides out. That +is the only normalization in play, and `coe_lightConeCoeffInvZ_eq_two_mul` records it against +`ℂ`. + +`InBoostPlane` separates the two directions of weight `±2` from the two transverse ones, one +index at a time. `slotZ` is one slot of the change of basis, and `transitionZ` composes it over +`n` slots into `2 ^ n` times the map keeping the light-cone components of total weight `m`; +`transitionZ_eq_sum` unfolds that recursion into a single sum over the multi-indices of that +weight. -/ @[expose] public section @@ -45,7 +40,7 @@ namespace Invariants /-! -## A. The change of basis over the integers and the rationals +## A. The change of basis over the integers -/ @@ -75,25 +70,6 @@ lemma coe_lightConeCoeffInvZ_eq_two_mul (i : Fin 3) (μ : Fin 1 ⊕ Fin 3) (κ : rw [lightConeCoeffInvZ, lightConeCoeffInv] split_ifs <;> norm_num -/-- The inverse light-cone coefficients over `ℚ`, with the halves kept as halves. -/ -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 - -/-- The integer mirror is twice the rational one. -/ -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 - /-! ## B. The boost plane @@ -125,75 +101,13 @@ lemma lightConeCoeffInvZ_eq_zero_of_not_inBoostPlane {i : Fin 3} {μ : Fin 1 ⊕ /-! -## C. The three sectors of the light-cone directions - -The four light-cone directions carry only three distinct boost weights, `2`, `-2` and `0` twice, -and a sum over multi-indices of a given total weight only sees that much: `sectorIndex` sorts -the directions accordingly, and summing one slot of the change of basis over a sector gives -`slotTransition` over `ℚ` and `slotTransitionZ` over `ℤ`, again twice as large. - --/ - -/-- The sector of each light-cone direction: `0` raising, `1` lowering, `2` and `3` transverse. -/ -def sectorIndex : Fin 4 → Fin 3 := ![0, 1, 2, 2] - -/-- The boost weight of each sector: `2` raising, `-2` lowering, `0` transverse. -/ -def sectorWeight : Fin 3 → ℤ := ![2, -2, 0] - -/-- The light-cone weight of a direction is the weight of its sector. -/ -lemma lightConeWeight_eq_sectorWeight (κ : Fin 4) : - lightConeWeight κ = sectorWeight (sectorIndex κ) := by - fin_cases κ <;> rfl - -/-- The slot factor summed over the directions of one sector, over `ℚ`. -/ -def slotTransition (i : Fin 3) (κ : Fin 3) (μ ν : Fin 1 ⊕ Fin 3) : ℚ := - ∑ κ' ∈ Finset.univ.filter (fun κ' : Fin 4 => sectorIndex κ' = κ), - lightConeCoeffInvQ i μ κ' * (lightConeCoeffZ i κ' ν : ℚ) - -/-- The slot factor summed over one sector, in closed form over `ℤ`: on the boost plane the - raising sector carries `[[1, -1], [-1, 1]]` and the lowering sector the all-ones matrix, and - the transverse sector is twice the identity on the transverse directions. -/ -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 is the sector sum of the slot factors. -/ -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 - rw [Finset.sum_filter, Fin.sum_univ_four] - rcases μ with a | j <;> rcases ν with b | l - · simp only [Fin.fin_one_eq_zero a, Fin.fin_one_eq_zero b] - fin_cases κ <;> simp [slotTransitionZ, lightConeCoeffInvZ, lightConeCoeffZ, sectorIndex] - · simp only [Fin.fin_one_eq_zero a] - fin_cases κ <;> fin_cases i <;> fin_cases l <;> - simp [slotTransitionZ, lightConeCoeffInvZ, lightConeCoeffZ, sectorIndex] - · simp only [Fin.fin_one_eq_zero b] - fin_cases κ <;> fin_cases i <;> fin_cases j <;> - simp [slotTransitionZ, lightConeCoeffInvZ, lightConeCoeffZ, sectorIndex] - · fin_cases κ <;> fin_cases i <;> fin_cases j <;> fin_cases l <;> - simp [slotTransitionZ, lightConeCoeffInvZ, lightConeCoeffZ, sectorIndex] - -/-- The integer sector matrix is twice the rational one, which is what the two names promise. -/ -lemma coe_slotTransitionZ (i : Fin 3) (κ : Fin 3) (μ ν : Fin 1 ⊕ Fin 3) : - ((slotTransitionZ i κ μ ν : ℤ) : ℚ) = 2 * slotTransition i κ μ ν := by - rw [slotTransitionZ_eq_sum, slotTransition, Finset.mul_sum] - push_cast - exact Finset.sum_congr rfl fun κ' _ => by rw [coe_lightConeCoeffInvZ]; ring - -/-! - -## D. The weight-keeping transition over any number of slots +## C. The weight-keeping transition over any number of slots -Keeping the four directions apart instead of their three sectors, one slot of the change of -basis is `slotZ`, and composing it over `n` slots while tracking the weight left to distribute -gives `transitionZ`. The recursion follows B: a slot whose direction lies in the boost plane -takes weight `2` or `-2` and leaves `m - 2` or `m + 2`, and a transverse slot takes either -direction of weight `0`, which is why those two are added, and leaves `m`. +One slot of the change of basis, keeping the four directions apart, is `slotZ`, and composing it +over `n` slots while tracking the weight left to distribute gives `transitionZ`. The recursion +follows B: a slot whose direction lies in the boost plane takes weight `2` or `-2` and leaves +`m - 2` or `m + 2`, and a transverse slot takes either direction of weight `0`, which is why +those two are added, and leaves `m`. Unfolding the recursion into a single sum splits into two independent steps. The case split of the recursion is the boost-plane support argument of B and nothing else: once it is resolved, diff --git a/Physlib/Relativity/LorentzGroup/Invariants/LorentzCovariance.lean b/Physlib/Relativity/LorentzGroup/Invariants/LorentzCovariance.lean index 1c6d7ca11..273cd1c0c 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/LorentzCovariance.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/LorentzCovariance.lean @@ -65,10 +65,8 @@ variable [Fintype ι] /-- A vector lies in the component span exactly when it is a combination `∑ i, c i • T i`. -/ lemma mem_componentSpan_iff (T : ι → B) (x : B) : x ∈ componentSpan T ↔ ∃ c : ι → ℂ, x = ∑ i, c i • T i := by - classical - rw [componentSpan, ← Submodule.span_range_eq_iSup, ← Fintype.range_linearCombination, - LinearMap.mem_range] - simp only [Fintype.linearCombination_apply, eq_comm] + rw [componentSpan, ← Submodule.span_range_eq_iSup, Submodule.mem_span_range_iff_exists_fun] + exact exists_congr fun _ => eq_comm /-- Every combination of the components lies in their span. -/ lemma sum_smul_mem_componentSpan (T : ι → B) (c : ι → ℂ) : ∑ i, c i • T i ∈ componentSpan T := @@ -136,7 +134,7 @@ lemma quotient (hT : IsLorentzCovariant n B repLorentz T) (S : Submodule ℂ B) /-- A Lorentz invariant lying in the span of the components is the contraction of a coefficient tensor that the Lorentz matrices themselves fix. -/ -theorem exists_isInvariantCoeff_of_mem_componentSpan +lemma exists_isInvariantCoeff_of_mem_componentSpan (hT : IsLorentzCovariant n B repLorentz T) {x : B} (hx : x ∈ componentSpan T) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : ∃ c : (Fin n → Fin 1 ⊕ Fin 3) → ℂ, IsInvariantCoeff c ∧ x = ∑ d, c d • T d := diff --git a/Physlib/Relativity/LorentzGroup/Invariants/RankFour.lean b/Physlib/Relativity/LorentzGroup/Invariants/RankFour.lean index 880a778af..9a4ba404d 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/RankFour.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/RankFour.lean @@ -318,107 +318,35 @@ Lorentz matrix coming from `SL(2,ℂ)`, that of `g†`. ## D. The rotations by `π` about the axes and the rotation `x → y → z → x` -The rotation by `π` about the `k`-th axis is `i σ_k` (`flipAxis k`), with diagonal Lorentz -matrix fixing time and that axis and negating the other two, so it multiplies `c d` by `-1` -once per slot of `d` holding a negated direction (`act_flipAxis`), and where that sign is `-1` -invariance forces `c d = 0`. Call `d` flip-fixed when all three signs are `1` (`IsFlipFixed`): -with `n_t, n_x, n_y, n_z` the counts of each direction that says all four have the same parity, -so `xxyy` and `txyz` survive, `tttx` does not, and `64` of `256` remain. +The rotation by `π` about the `k`-th axis is `SL2C.halfTurn k`, with diagonal Lorentz matrix +fixing time and that axis and negating the other two, so it multiplies `c d` by `-1` once per +slot of `d` holding a negated direction (`act_halfTurn`), and where that sign is `-1` +invariance forces `c d = 0`. Call `d` half-turn fixed when all three signs are `1` +(`IsHalfTurnFixed`): with `n_t, n_x, n_y, n_z` the counts of each direction that says all four +have the same parity, so `xxyy` and `txyz` survive, `tttx` does not, and `64` of `256` remain. The rotation `x → y → z → x` fixes time (`rotationCycle`) and permutes rather than rescales, so the new coefficient at `a` is the old one at `cycIdx (cycIdx a)` (`act_rotationCycle`) and invariance reads `c (cycIdx d) = c d`: `c` is constant on the orbit -`{d, cycIdx d, cycIdx (cycIdx d)}`, of three members unless `d` is `tttt`. +`{d, cycIdx d, cycIdx (cycIdx d)}`, of three members unless `d` is `tttt`. Both actions are +stated for any number of slots in `Invariants.Basic`. -/ -/-- Rotation by `π` about the `k`-th axis: the matrices below are `i σ_x`, `i σ_y`, `i σ_z`. -/ -def flipAxis : Fin 3 → SL(2,ℂ) - | 0 => ⟨!![0, Complex.I; Complex.I, 0], by simp [Matrix.det_fin_two_of]⟩ -- `i σ_x` - | 1 => ⟨!![0, 1; -1, 0], by simp [Matrix.det_fin_two_of]⟩ -- `i σ_y` - | 2 => ⟨!![Complex.I, 0; 0, -Complex.I], by simp [Matrix.det_fin_two_of]⟩ -- `i σ_z` - -/-- The sign the `k`-th flip gives a direction: `+1` on time and the axis, `-1` transverse. -/ -def flipSign (k : Fin 3) (μ : Fin 1 ⊕ Fin 3) : ℤ := - if μ = Sum.inl 0 ∨ μ = Sum.inr k then 1 else -1 - -/-- The Lorentz matrix of the `k`-th flip is diagonal, carrying `flipSign k`. -/ -lemma toLorentzGroup_flipAxis_apply (k : Fin 3) (a b : Fin 1 ⊕ Fin 3) : - (SL2C.toLorentzGroup (flipAxis k)).1 a b = if a = b then (flipSign k a : ℝ) else 0 := by - refine Complex.ofReal_injective ?_ - rw [SL2C.toLorentzGroup_eq_trace, PauliMatrix.trace_pauliSelfAdjoint'_mul_apply] - fin_cases k <;> rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> - simp [flipAxis, flipSign, PauliMatrix.pauliSelfAdjoint', PauliMatrix.pauliMatrix, - Matrix.mul_apply, Matrix.conjTranspose_apply, Fin.sum_univ_two, Complex.ext_iff] - -/-- Being diagonal, the flip rescales each coefficient by the product of its four signs. -/ -lemma act_flipAxis (k : Fin 3) (c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ) (a : Fin 4 → Fin 1 ⊕ Fin 3) : - act (SL2C.toLorentzGroup (flipAxis k)).1 c a = ((∏ s, flipSign k (a s) : ℤ) : ℂ) * c a := by - rw [act, Finset.sum_eq_single a] - · rw [mul_comm] - push_cast - congr 1 - exact Finset.prod_congr rfl fun s _ => by - rw [toLorentzGroup_flipAxis_apply, ite_eq_left rfl, Complex.ofReal_intCast] - · intro d _ hda - obtain ⟨s, hs⟩ := Function.ne_iff.1 hda.symm - rw [Finset.prod_eq_zero (Finset.mem_univ s), mul_zero] - rw [toLorentzGroup_flipAxis_apply, ite_eq_right hs, Complex.ofReal_zero] - · exact fun h => absurd (Finset.mem_univ a) h - -/-- The sign a flip attaches to a coefficient is `1` or `-1`, being a product of such signs. -/ -lemma prod_flipSign_eq_one_or (k : Fin 3) (d : Fin 4 → Fin 1 ⊕ Fin 3) : - ∏ s, flipSign k (d s) = 1 ∨ ∏ s, flipSign k (d s) = -1 := by - refine Finset.prod_induction _ (fun n : ℤ => n = 1 ∨ n = -1) ?_ (Or.inl rfl) fun s _ => ?_ - · rintro a b (rfl | rfl) (rfl | rfl) <;> norm_num - · unfold flipSign - split_ifs <;> simp - -/-- All three flips fix the coefficient at `d`, that is the sign product is `1` for each axis. - Equivalently, and not used below, all four directions occur an even number of times among the - slots, or all four an odd number. -/ -def IsFlipFixed (d : Fin 4 → Fin 1 ⊕ Fin 3) : Prop := - ∀ k : Fin 3, ∏ s, flipSign k (d s) = 1 - -instance : DecidablePred IsFlipFixed := fun d => - inferInstanceAs (Decidable (∀ k : Fin 3, ∏ s, flipSign k (d s) = 1)) - -/-- An invariant coefficient tensor vanishes off the flip-fixed index vectors. -/ -lemma eq_zero_of_not_isFlipFixed {c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ} - (hc : IsInvariantCoeff c) {d : Fin 4 → Fin 1 ⊕ Fin 3} (hd : ¬IsFlipFixed d) : c d = 0 := by +/-- All three half turns fix the coefficient at `d`, that is the sign product is `1` for each + axis. Equivalently, and not used below, all four directions occur an even number of times + among the slots, or all four an odd number. -/ +def IsHalfTurnFixed (d : Fin 4 → Fin 1 ⊕ Fin 3) : Prop := + ∀ k : Fin 3, ∏ s, halfTurnSign k (d s) = 1 + +instance : DecidablePred IsHalfTurnFixed := fun d => + inferInstanceAs (Decidable (∀ k : Fin 3, ∏ s, halfTurnSign k (d s) = 1)) + +/-- An invariant coefficient tensor vanishes off the half-turn fixed index vectors. -/ +lemma eq_zero_of_not_isHalfTurnFixed {c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ} + (hc : IsInvariantCoeff c) {d : Fin 4 → Fin 1 ⊕ Fin 3} (hd : ¬IsHalfTurnFixed d) : + c d = 0 := by obtain ⟨k, hk⟩ := not_forall.1 hd - have h := congrFun (hc (flipAxis k)) d - rw [act_flipAxis, (prod_flipSign_eq_one_or k d).resolve_left hk] at h - push_cast at h - linear_combination (-2⁻¹ : ℂ) * h - -/-- The relabelling `cycDir`, which fixes time and sends `x → y → z → x`, applied in every slot. -/ -def cycIdx (d : Fin 4 → Fin 1 ⊕ Fin 3) : Fin 4 → Fin 1 ⊕ Fin 3 := fun s => cycDir (d s) - -/-- Cycling the axes three times is the identity. -/ -lemma cycIdx_cycIdx_cycIdx (d : Fin 4 → Fin 1 ⊕ Fin 3) : cycIdx (cycIdx (cycIdx d)) = d := - funext fun s => cycDir_cycDir_cycDir (d s) - -/-- The cyclic rotation permutes entries: the new entry at `a` is the old one at `a` cycled back. -/ -lemma act_rotationCycle (c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ) (a : Fin 4 → Fin 1 ⊕ Fin 3) : - act (SL2C.toLorentzGroup rotationCycle).1 c a = c (cycIdx (cycIdx a)) := by - rw [act, Finset.sum_eq_single (cycIdx (cycIdx a))] - · rw [Finset.prod_eq_one fun s _ => ?_, mul_one] - rw [toLorentzGroup_rotationCycle_apply, ite_eq_left, Complex.ofReal_one] - exact (congrFun (cycIdx_cycIdx_cycIdx a) s).symm - · intro d _ hda - have hne : cycIdx d ≠ a := fun h => hda (by rw [← h, cycIdx_cycIdx_cycIdx]) - obtain ⟨s, hs⟩ := Function.ne_iff.1 hne - rw [Finset.prod_eq_zero (Finset.mem_univ s), mul_zero] - rw [toLorentzGroup_rotationCycle_apply, ite_eq_right fun h : a s = cycDir (d s) => hs h.symm, - Complex.ofReal_zero] - · exact fun h => absurd (Finset.mem_univ _) h - -/-- An invariant coefficient tensor is constant on the orbits of the cyclic rotation. -/ -lemma apply_cycIdx {c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ} (hc : IsInvariantCoeff c) - (d : Fin 4 → Fin 1 ⊕ Fin 3) : c (cycIdx d) = c d := by - have h := congrFun (hc rotationCycle) (cycIdx d) - rw [act_rotationCycle, cycIdx_cycIdx_cycIdx] at h - exact h.symm + exact hc.eq_zero_of_prod_halfTurnSign_ne_one hk /-! @@ -475,10 +403,10 @@ lemma sixteen_mul_eq_sum_transitionZ {c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ} Write an index vector as a word, `tttt` or `txxt`. Cycling the axes carries one to another and three cyclings return it, so they fall into orbits of at most three: `txxt`, `tyyt`, `tzzt` -form one, and `tttt` is alone. By D an invariant tensor vanishes off the `64` flip-fixed +form one, and `tttt` is alone. By D an invariant tensor vanishes off the `64` half-turn fixed vectors and is constant on each orbit, and those `64` make `22` orbits, `21` of size three plus `tttt`; `orbitRep` lists one from each, and the two lemmas below check at all `256` index -vectors that these cover the flip-fixed ones without overlapping. So an invariant tensor is its +vectors that these cover the half-turn fixed ones without overlapping. So an invariant tensor is its `22` values at the representatives, its orbit coordinates, which `ofOrbitCoord` inverts. -/ @@ -511,9 +439,9 @@ def orbitRep : Fin 22 → Fin 4 → Fin 1 ⊕ Fin 3 := def orbit (k : Fin 22) : Finset (Fin 4 → Fin 1 ⊕ Fin 3) := {orbitRep k, cycIdx (orbitRep k), cycIdx (cycIdx (orbitRep k))} -/-- The vectors in one of the `22` orbits are exactly the flip-fixed ones, a finite check. -/ -lemma isFlipFixed_iff_exists_mem_orbit : - ∀ d, IsFlipFixed d ↔ ∃ k, d ∈ orbit k := by +/-- The vectors in one of the `22` orbits are exactly the half-turn fixed ones, a finite check. -/ +lemma isHalfTurnFixed_iff_exists_mem_orbit : + ∀ d, IsHalfTurnFixed d ↔ ∃ k, d ∈ orbit k := by decide +kernel /-- Different orbits share no index vector, a finite check. -/ @@ -543,15 +471,15 @@ noncomputable def ofOrbitCoord (b : Fin 22 → ℂ) (d : Fin 4 → Fin 1 ⊕ Fin lemma eq_ofOrbitCoord {c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ} (hc : IsInvariantCoeff c) : c = ofOrbitCoord fun k => c (orbitRep k) := by funext d - by_cases hd : IsFlipFixed d - · obtain ⟨k, hk⟩ := (isFlipFixed_iff_exists_mem_orbit d).1 hd + by_cases hd : IsHalfTurnFixed d + · obtain ⟨k, hk⟩ := (isHalfTurnFixed_iff_exists_mem_orbit d).1 hd rw [ofOrbitCoord, Finset.sum_eq_single k, ite_eq_left hk, - eq_orbitRep_of_mem_orbit (apply_cycIdx hc) hk] + eq_orbitRep_of_mem_orbit hc.apply_cycIdx hk] · exact fun l _ hl => ite_eq_right fun hdl => hl (eq_of_mem_orbit hdl hk) · exact fun h => absurd (Finset.mem_univ k) h - · rw [eq_zero_of_not_isFlipFixed hc hd] + · rw [eq_zero_of_not_isHalfTurnFixed hc hd] exact (Finset.sum_eq_zero fun k _ => - ite_eq_right fun hk => hd ((isFlipFixed_iff_exists_mem_orbit d).2 ⟨k, hk⟩)).symm + ite_eq_right fun hk => hd ((isHalfTurnFixed_iff_exists_mem_orbit d).2 ⟨k, hk⟩)).symm /-- Contracting against such a tensor collects the `256` index vectors into the `22` orbits. -/ lemma sum_mul_ofOrbitCoord (f : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ) (b : Fin 22 → ℂ) : @@ -635,8 +563,8 @@ lemma orbitMatrix_mulVec {c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ} have h₀ := h (orbitRep k) have h₁ := h (cycIdx (orbitRep k)) have h₂ := h (cycIdx (cycIdx (orbitRep k))) - rw [apply_cycIdx hc] at h₁ - rw [apply_cycIdx hc, apply_cycIdx hc] at h₂ + rw [hc.apply_cycIdx] at h₁ + rw [hc.apply_cycIdx, hc.apply_cycIdx] at h₂ simp only [Matrix.mulVec, dotProduct, Matrix.map_apply, orbitMatrix_apply, Pi.smul_apply, smul_eq_mul, Int.cast_sum, Int.cast_add, Finset.sum_add_distrib, add_mul] linear_combination -(h₀ + h₁ + h₂) @@ -752,7 +680,7 @@ lemma orbitCoord_eq {c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ} (hc : IsInvariantC exact Finset.sum_congr rfl fun l _ => by ring /-- An invariant coefficient tensor is a combination of the four. -/ -theorem exists_eq_sum {c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ} (hc : IsInvariantCoeff c) : +lemma exists_eq_sum {c : (Fin 4 → Fin 1 ⊕ Fin 3) → ℂ} (hc : IsInvariantCoeff c) : ∃ a : Fin 4 → ℂ, c = fun d => ∑ i, a i * ((contractionCoeff i d : ℤ) : ℂ) := by refine ⟨fun i => 24⁻¹ * ∑ l, (contractionWeight i l : ℂ) * c (orbitRep l), funext fun d => ?_⟩ have hfour : ∀ i d, ((contractionCoeff i d : ℤ) : ℂ) diff --git a/Physlib/Relativity/LorentzGroup/Invariants/RankThree.lean b/Physlib/Relativity/LorentzGroup/Invariants/RankThree.lean index 8d276eb16..da30404f6 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/RankThree.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/RankThree.lean @@ -45,54 +45,13 @@ open TensorProduct Matrix MatrixGroups SL2C Invariants ## A. The half turn about a spatial axis -The half turn about the axis `i` is the rotation by `π` about it, `SL2C.halfTurn i`. Its -Lorentz matrix is diagonal, fixing time and the axis and negating the two transverse -directions, so on the light-cone directions of that axis it is `1` on the two of weight -`±2` and `-1` on the two transverse ones (`lightConeSign`). +The half turn about the axis `i` is the rotation by `π` about it, `SL2C.halfTurn i` from +`SL2C.AxisRotations`. Its Lorentz matrix is diagonal, fixing time and the axis and negating +the two transverse directions, so on the light-cone directions of that axis it is `1` on the +two of weight `±2` and `-1` on the two transverse ones (`lightConeSign`). -/ -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 the half turn about an axis gives each light-cone direction of that axis: `1` on the two of weight `±2`, `-1` on the two transverse ones. -/ def lightConeSign (κ : Fin 4) : ℤ := if κ = 0 ∨ κ = 1 then 1 else -1 @@ -107,9 +66,9 @@ lemma sum_halfTurn_lightConeCoeff (i : Fin 3) (κ : Fin 4) (ν : Fin 1 ⊕ Fin 3 rcases ν with a | j · rw [Subsingleton.elim a 0] fin_cases i <;> fin_cases κ <;> - simp [lightConeCoeff, lightConeSign, Fintype.sum_sum_type] + simp [lightConeCoeff, lightConeSign, halfTurnSign, Fintype.sum_sum_type] · fin_cases i <;> fin_cases j <;> fin_cases κ <;> - simp [lightConeCoeff, lightConeSign, Fintype.sum_sum_type] + simp [lightConeCoeff, lightConeSign, halfTurnSign, 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. -/ @@ -157,22 +116,13 @@ negates exactly those, so they vanish too and nothing is left. -/ -/-- The Lorentz matrix of the half turn is diagonal, hence symmetric. -/ -lemma toLorentzGroup_halfTurn_symm (i : Fin 3) (a b : Fin 1 ⊕ Fin 3) : - (SL2C.toLorentzGroup (SL2C.halfTurn i)).1 a b - = (SL2C.toLorentzGroup (SL2C.halfTurn i)).1 b a := by - rw [SL2C.toLorentzGroup_halfTurn_apply, SL2C.toLorentzGroup_halfTurn_apply] - by_cases h : a = b - · rw [h] - · rw [ite_eq_right h, ite_eq_right (Ne.symm h)] - /-- The half turn multiplies a light-cone component by the product of the signs of its slots. -/ lemma lightConeComponent_act_halfTurn {n : ℕ} (i : Fin 3) (c : (Fin n → Fin 1 ⊕ Fin 3) → ℂ) (κ : Fin n → Fin 4) : lightConeComponent i (act (SL2C.toLorentzGroup (SL2C.halfTurn i)).1 c) κ = ((∏ s, lightConeSign (κ s) : ℤ) : ℂ) * lightConeComponent i c κ := lightConeComponent_act i _ c κ _ fun d => by - simpa only [toLorentzGroup_halfTurn_symm i (d _)] using + simpa only [SL2C.toLorentzGroup_halfTurn_symm i (d _)] using sum_prod_halfTurn_lightConeCoeff i κ d /-- An invariant coefficient tensor has no weight-zero light-cone component either, the half diff --git a/Physlib/Relativity/LorentzGroup/Invariants/RankTwo.lean b/Physlib/Relativity/LorentzGroup/Invariants/RankTwo.lean index 4006c0fa2..78162661c 100644 --- a/Physlib/Relativity/LorentzGroup/Invariants/RankTwo.lean +++ b/Physlib/Relativity/LorentzGroup/Invariants/RankTwo.lean @@ -5,7 +5,6 @@ Authors: Joseph Tooby-Smith -/ module -public import Physlib.Relativity.LorentzGroup.Invariants.LightCone public import Physlib.Relativity.LorentzGroup.Invariants.LorentzCovariance public import Physlib.Mathematics.InvariantReduction public meta import Mathlib.Data.Fintype.Sum @@ -13,15 +12,16 @@ public meta import Mathlib.Data.Fintype.Pi /-! # Lorentz invariants among two four-vector indices -A rank-two tensor `T^{μν}` has `16` components, and exactly one combination of them is -fixed by every rotation and boost, the metric trace +A rank-two tensor `T^{μν}` has `16` components, and the metric trace -`metricContraction = η_{μν} T^{μν}`. +`metricContraction = η_{μν} T^{μν}` -Every other invariant is a multiple of it: nothing else ties two indices, the Levi-Civita -symbol needing four. That is `exists_smul_metricContraction_of_invariant`, and +is fixed by every rotation and boost. Every Lorentz invariant in the span of the components is +a multiple of it: nothing else ties two indices, the Levi-Civita symbol needing four. That is +`exists_smul_metricContraction_of_invariant`, and `exists_smul_metricContraction_of_invariant_subset` is the same statement modulo a -Lorentz-stable subspace `S`, the form the Standard Model files use. +Lorentz-stable subspace `S`, the form the Standard Model files use. The metric contraction is +the only invariant up to scale; for a given `T` it may be zero. The components are vectors `T d` of a complex vector space `B` carrying a representation `repLorentz` of `SL(2,ℂ)`, indexed by two directions, and `IsLorentzCovariant 2` says the @@ -29,18 +29,15 @@ group moves them with one factor of the Lorentz matrix per slot. `componentSpan of their combinations. An invariant of the span is `∑_d c_d • T d` for a coefficient tensor `c` that the Lorentz -matrices themselves fix (from `Invariants.Basic`), and the rest runs at two slots on the -light-cone coefficients and sector matrices of `Invariants.LightCone`. Along a spatial axis -the four light-cone directions carry boost weights `2`, `-2`, `0`, `0`, and an -invariant `c` has no light-cone component of nonzero weight, so it is fixed by the weight-zero -projection along each axis (A); averaging the three gives one linear map on the `16` -coefficients, `12` times an integer matrix with a short closed form (B, C). Its eigenvalues are -`12`, `10`, `4`, `0`, with `12` simple, so the cubic `λ (λ - 4) (λ - 10)` sends everything onto -that one eigenvector, which is the metric (D). Section E draws the conclusion and F divides -out `S`. - -No rotation averaging is needed here, unlike the four-index case: for two indices the -three weight-zero conditions already cut the `16` components down to a single line. +matrices themselves fix (from `Invariants.Basic`), and three kinds of transformation pin `c` +down (B). The half turn about each axis has a diagonal Lorentz matrix with entries `±1`, and +for `μ ≠ ν` one of the three negates `c_{μν}`, so the off-diagonal coefficients vanish. The +cyclic rotation `x → y → z → x` permutes the spatial directions, so `c_xx = c_yy = c_zz`. The +boost along `z` scales the light-cone component of `c` along `D₀ - D_z` in both slots by `t⁴`, +so that component vanishes, and with the off-diagonal coefficients gone it is `c_tt + c_zz`. +So `c` is `c_tt` times the Minkowski metric. Invariance under the whole group implies +invariance under these elements; nothing is claimed about the group they generate. Section C +divides out `S`. -/ @[expose] public section @@ -57,279 +54,7 @@ variable {B : Type*} [AddCommGroup B] [Module ℂ B] /-! -## A. The weight-zero transition along one axis - -An invariant coefficient tensor keeps only its light-cone components of total weight zero, so -writing it back on the coefficients it is fixed by one matrix per axis: a sum over the sector -patterns of total weight zero of the per-slot sector matrices of `Invariants.LightCone`. - --/ - -/-- The weight-zero projection along axis `i`, as a matrix on the components: the sum over the - three sector patterns of weight zero of the products 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) - -/-- A weight-zero light-cone sum over two slots regroups as a sum over sector patterns of - weight zero of the products 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 - -/-- An invariant coefficient tensor is fixed by the axis-`i` weight-zero transition. -/ -lemma eq_sum_weightZeroTransition {c : (Fin 2 → Fin 1 ⊕ Fin 3) → ℂ} - (hc : IsInvariantCoeff c) (i : Fin 3) (d : Fin 2 → Fin 1 ⊕ Fin 3) : - c d = ∑ e, ((weightZeroTransition i e d : ℚ) : ℂ) * c e := by - have hfil : ∀ κ ∈ Finset.univ.filter - (fun κ : Fin 2 → Fin 4 => ¬ (∑ s, lightConeWeight (κ s)) = 0), - (∏ s, lightConeCoeffInv i (d s) (κ s)) * lightConeComponent i c κ = 0 := - fun κ hκ => by - rw [hc.lightConeComponent_eq_zero i (Finset.mem_filter.1 hκ).2, mul_zero] - rw [eq_sum_lightConeComponent i c d, ← Finset.sum_filter_add_sum_filter_not Finset.univ - (fun κ : Fin 2 → Fin 4 => (∑ s, lightConeWeight (κ s)) = 0), Finset.sum_eq_zero hfil, - add_zero] - calc ∑ κ ∈ Finset.univ.filter (fun κ : Fin 2 → Fin 4 => (∑ s, lightConeWeight (κ s)) = 0), - (∏ s, lightConeCoeffInv i (d s) (κ s)) * lightConeComponent i c κ - = ∑ e, (∑ κ ∈ Finset.univ.filter - (fun κ : Fin 2 → Fin 4 => (∑ s, lightConeWeight (κ s)) = 0), - ∏ s, lightConeCoeffInv i (d s) (κ s) * lightConeCoeff i (κ s) (e s)) * c e := by - simp only [lightConeComponent, Finset.mul_sum, Finset.sum_mul, Finset.prod_mul_distrib] - rw [Finset.sum_comm] - exact Finset.sum_congr rfl fun e _ => Finset.sum_congr rfl fun κ _ => by ring - _ = _ := by - refine Finset.sum_congr rfl fun e _ => ?_ - congr 1 - rw [weightZeroTransition_eq_sum_lightCone] - push_cast - simp only [coe_lightConeCoeffInvQ, coe_lightConeCoeffZ] - -/-! - -## B. The average over the axes - -An invariant coefficient tensor is fixed by each of the three weight-zero transitions, hence -by their average. - --/ - -/-- The average `M` of the three weight-zero transitions, as a matrix on the components. Its - powers drive the endgame. -/ -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 - -/-- An invariant coefficient tensor is fixed by the average of the three transitions. -/ -lemma eq_sum_boostAverageTransition {c : (Fin 2 → Fin 1 ⊕ Fin 3) → ℂ} - (hc : IsInvariantCoeff c) (d : Fin 2 → Fin 1 ⊕ Fin 3) : - c d = ∑ e, ((boostAverageTransition e d : ℚ) : ℂ) * c e := by - have h3 : (3 : ℂ) * c d = ∑ i : Fin 3, ∑ e, ((weightZeroTransition i e d : ℚ) : ℂ) * c e := by - rw [Fin.sum_univ_three, ← eq_sum_weightZeroTransition hc 0 d, - ← eq_sum_weightZeroTransition hc 1 d, ← eq_sum_weightZeroTransition hc 2 d] - ring - rw [show (∑ e, ((boostAverageTransition e d : ℚ) : ℂ) * c e) - = (3 : ℂ)⁻¹ * ∑ i : Fin 3, ∑ e, ((weightZeroTransition i e d : ℚ) : ℂ) * c e from by - 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], ← h3] - ring - -/-! - -## C. The average as an integer matrix - -Twelve times the average is an integer matrix on the `16` components, with a short closed -form that 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 `Invariants.LightCone`. -/ -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 average. A pair of equal indices talks only to such pairs, - with time-time `6`, mixed time-space `-2` and space-space diagonal `10`; a pair with one - time index carries `2` on itself and `-2` on its transpose; 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) - -/-- Entrywise decidability for integer matrices; instance search does not see through the - `Matrix` synonym when both indices are bound. -/ -private instance decidableForallEntriesZ {ι : Type*} [Fintype ι] (f g : Matrix ι ι ℤ) : - Decidable (∀ k l, f k l = g k l) := - @Fintype.decidableForallFintype ι _ - (fun _ => @Fintype.decidableForallFintype ι _ (fun _ => Int.instDecidableEq _ _) _) _ - -/-- 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 - -/-! - -## D. The certificate polynomial and the trace projector - -The average has eigenvalues `12`, `10`, `4` and `0` on the `16` components, with the -invariant eigenvalue `12` simple, so the cubic `λ (λ - 4) (λ - 10)` sends the matrix to a -rank-one one, the outer square of the metric. That identity is the certificate, checked -entry by entry. - --/ - -/-- 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 `M (M - 4)`: supported on the pairs of equal indices, where it is a - multiple of the metric outer square minus a multiple of the identity on the 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: the cubic at the integer average is `48` times the outer square of the - metric. Checked through a materialised intermediate product, so each kernel step is one - multiplication of matrices with cheap entries. -/ -lemma Q_explicit : - Q = Matrix.of fun d e : Fin 2 → Fin 1 ⊕ Fin 3 => - 48 * (minkowskiMatrixZ (d 0) (d 1) * minkowskiMatrixZ (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 - -/-- The integer averaged round is a symmetric matrix, a finite check. -/ -lemma boostAverageZ_transpose : boostAverageZᵀ = boostAverageZ := by - rw [boostAverageZ_eq] - ext d e - revert d e - decide +kernel - -/-- The same read on a pair of entries. -/ -lemma boostAverageZ_symm (d e : Fin 2 → Fin 1 ⊕ Fin 3) : - boostAverageZ d e = boostAverageZ e d := by - have h := congrFun (congrFun boostAverageZ_transpose e) d - rwa [Matrix.transpose_apply] at h - -/-! - -## E. The classification of the Lorentz invariants - -## E.1. The metric contraction +## A. The metric contraction -/ @@ -356,91 +81,71 @@ lemma repLorentz_metricContraction (hT : IsLorentzCovariant 2 B repLorentz T) (g /-! -## E.2. Iterating the averaged round on the coefficients - --/ - -/-- An invariant coefficient tensor is fixed by the integer averaged round, up to `12`. -/ -lemma twelve_mul_eq_sum_boostAverageZ {c : (Fin 2 → Fin 1 ⊕ Fin 3) → ℂ} - (hc : IsInvariantCoeff c) (d : Fin 2 → Fin 1 ⊕ Fin 3) : - (12 : ℂ) * c d = ∑ e, ((boostAverageZ d e : ℤ) : ℂ) * c e := by - rw [show (12 : ℂ) * c d = ∑ e, (12 : ℂ) * (((boostAverageTransition e d : ℚ) : ℂ) * c e) from by - rw [← Finset.mul_sum, ← eq_sum_boostAverageTransition hc]] - refine Finset.sum_congr rfl fun e _ => ?_ - have hb := congrArg (fun q : ℚ => (q : ℂ)) (coe_boostAverageZ e d) - push_cast at hb - rw [boostAverageZ_symm d e, hb] - ring - -/-- The same for `n` rounds: the `n`-th power of the integer matrix, up to `12 ^ n`. -/ -lemma pow_mul_eq_sum_pow_boostAverageZ {c : (Fin 2 → Fin 1 ⊕ Fin 3) → ℂ} - (hc : IsInvariantCoeff c) (n : ℕ) (d : Fin 2 → Fin 1 ⊕ Fin 3) : - ((12 : ℂ) ^ n) * c d = ∑ e, (((boostAverageZ ^ n) d e : ℤ) : ℂ) * c e := by - induction n generalizing d with - | zero => simp [Matrix.one_apply, apply_ite (fun q : ℤ => (q : ℂ)), ite_mul, Finset.sum_ite_eq] - | succ n ih => - calc ((12 : ℂ) ^ (n + 1)) * c d - = (12 : ℂ) ^ n * ((12 : ℂ) * c d) := by ring - _ = ∑ f, ((boostAverageZ d f : ℤ) : ℂ) * ((12 : ℂ) ^ n * c f) := by - rw [twelve_mul_eq_sum_boostAverageZ hc, Finset.mul_sum] - exact Finset.sum_congr rfl fun f _ => by ring - _ = ∑ e, (((boostAverageZ ^ (n + 1)) d e : ℤ) : ℂ) * c e := by - simp only [ih, Finset.mul_sum, pow_succ' boostAverageZ n, Matrix.mul_apply] - rw [Finset.sum_comm] - refine Finset.sum_congr rfl fun e _ => ?_ - push_cast - rw [Finset.sum_mul] - exact Finset.sum_congr rfl fun f _ => by ring +## B. The classification of the Lorentz invariants -/-! - -## E.3. The certificate round +The half turns kill the off-diagonal coefficients, the cyclic rotation equates the three +spatial diagonal ones, and the boost along `z` relates the spatial diagonal to the time +diagonal. Together these leave `c_tt` times the metric. -/ -/-- The certificate polynomial contracted against an invariant coefficient tensor. Each power of - the integer average contributes the matching power of `12`, and the cubic evaluates to - `12 ^ 3 - 14 * 12 ^ 2 + 40 * 12 = 192`. -/ -lemma sum_Q_mul_eq {c : (Fin 2 → Fin 1 ⊕ Fin 3) → ℂ} (hc : IsInvariantCoeff c) - (d : Fin 2 → Fin 1 ⊕ Fin 3) : - ∑ e, ((Q d e : ℤ) : ℂ) * c e = (192 : ℂ) * c d := by - have h1 := pow_mul_eq_sum_pow_boostAverageZ hc 1 d - have h2 := pow_mul_eq_sum_pow_boostAverageZ hc 2 d - have h3 := pow_mul_eq_sum_pow_boostAverageZ hc 3 d - simp only [pow_one] at h1 - rw [show (∑ 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) from by - simp only [Finset.mul_sum, ← Finset.sum_sub_distrib, ← Finset.sum_add_distrib] - refine Finset.sum_congr rfl fun e _ => ?_ - rw [Q_eq_poly] - push_cast [Matrix.sub_apply, Matrix.add_apply, Matrix.smul_apply, smul_eq_mul] - ring, ← h1, ← h2, ← h3] - ring - -/-- The certificate applied to an invariant coefficient tensor: `192 c = 48 η (η ⬝ c)`, so - every invariant coefficient tensor is a multiple of the metric. -/ +/-- Two distinct directions are told apart by the half turn about some axis: it keeps one and + negates the other, a finite check. -/ +lemma exists_halfTurnSign_mul_ne_one : + ∀ μ ν : Fin 1 ⊕ Fin 3, μ ≠ ν → ∃ k, halfTurnSign k μ * halfTurnSign k ν ≠ 1 := by + decide + +/-- An invariant coefficient tensor has no off-diagonal coefficients: for `μ ≠ ν` some half + turn multiplies `c_{μν}` by `-1`. -/ +lemma eq_zero_of_ne {c : (Fin 2 → Fin 1 ⊕ Fin 3) → ℂ} (hc : IsInvariantCoeff c) + {d : Fin 2 → Fin 1 ⊕ Fin 3} (hd : d 0 ≠ d 1) : c d = 0 := by + obtain ⟨k, hk⟩ := exists_halfTurnSign_mul_ne_one _ _ hd + exact hc.eq_zero_of_prod_halfTurnSign_ne_one (k := k) (by rwa [Fin.prod_univ_two]) + +/-- The three spatial diagonal coefficients of an invariant coefficient tensor agree: the + cyclic rotation carries `c_xx` to `c_yy` to `c_zz`. -/ +lemma apply_inr_inr_eq {c : (Fin 2 → Fin 1 ⊕ Fin 3) → ℂ} (hc : IsInvariantCoeff c) + (j : Fin 3) : c ![Sum.inr j, Sum.inr j] = c ![Sum.inr 2, Sum.inr 2] := by + have hcyc (j : Fin 3) : c ![Sum.inr (j + 1), Sum.inr (j + 1)] = c ![Sum.inr j, Sum.inr j] := by + have h := hc.apply_cycIdx ![Sum.inr j, Sum.inr j] + rwa [show cycIdx ![Sum.inr j, Sum.inr j] = ![Sum.inr (j + 1), Sum.inr (j + 1)] from + cycDir_comp_two _ _] at h + fin_cases j + · exact hcyc 2 + · exact (hcyc 0).trans (hcyc 2) + · rfl + +/-- The time and spatial diagonal coefficients of an invariant coefficient tensor are opposite. + The boost along `z` scales the light-cone component along `D₀ - D_z` in both slots by `t⁴`, so + that component, `c_tt - c_tz - c_zt + c_zz`, vanishes, and the mixed terms are `0`. -/ +lemma apply_inl_inl_add_apply_inr_inr {c : (Fin 2 → Fin 1 ⊕ Fin 3) → ℂ} + (hc : IsInvariantCoeff c) : c ![Sum.inl 0, Sum.inl 0] + c ![Sum.inr 2, Sum.inr 2] = 0 := by + have h := hc.lightConeComponent_eq_zero 2 (κ := ![0, 0]) (by decide) + rw [lightConeComponent, ← (finTwoArrowEquiv _).symm.sum_comp, Fintype.sum_prod_type] at h + simp [Fintype.sum_sum_type, Fin.sum_univ_three, lightConeCoeff] at h + rw [eq_zero_of_ne hc (d := ![Sum.inl 0, Sum.inr 2]) (by simp), + eq_zero_of_ne hc (d := ![Sum.inr 2, Sum.inl 0]) (by simp)] at h + linear_combination h + +/-- An invariant coefficient tensor is `c_tt` times the Minkowski metric. -/ lemma eq_smul_minkowskiMatrixZ {c : (Fin 2 → Fin 1 ⊕ Fin 3) → ℂ} (hc : IsInvariantCoeff c) (d : Fin 2 → Fin 1 ⊕ Fin 3) : - c d = ((4 : ℂ)⁻¹ * ∑ e, ((minkowskiMatrixZ (e 0) (e 1) : ℤ) : ℂ) * c e) - * ((minkowskiMatrixZ (d 0) (d 1) : ℤ) : ℂ) := by - have hQ := sum_Q_mul_eq hc d - rw [show (∑ e, ((Q d e : ℤ) : ℂ) * c e) - = 48 * ((minkowskiMatrixZ (d 0) (d 1) : ℤ) : ℂ) - * ∑ e, ((minkowskiMatrixZ (e 0) (e 1) : ℤ) : ℂ) * c e from by - rw [Finset.mul_sum] - refine Finset.sum_congr rfl fun e _ => ?_ - rw [Q_explicit, Matrix.of_apply] - push_cast - ring] at hQ - linear_combination -hQ / 192 - -/-! - -## E.4. The classification - --/ + c d = c ![Sum.inl 0, Sum.inl 0] * ((minkowskiMatrixZ (d 0) (d 1) : ℤ) : ℂ) := by + by_cases hd : d 0 = d 1 + · have hd' : d = ![d 0, d 0] := by + funext s + fin_cases s + · rfl + · exact hd.symm + rw [hd', Matrix.cons_val_zero, Matrix.cons_val_one, Matrix.cons_val_zero] + rcases d 0 with a | j + · rw [Subsingleton.elim a 0] + simp [minkowskiMatrixZ] + · rw [apply_inr_inr_eq hc j] + simp [minkowskiMatrixZ] + linear_combination apply_inl_inl_add_apply_inr_inr hc + · rw [eq_zero_of_ne hc hd] + simp [minkowskiMatrixZ, Matrix.diagonal_apply_ne _ hd] /-- Every Lorentz invariant in the span of the components is a multiple of the metric contraction. -/ @@ -448,18 +153,17 @@ theorem exists_smul_metricContraction_of_invariant (hT : IsLorentzCovariant 2 B {x : B} (hx : x ∈ componentSpan T) (hinv : ∀ g : SL(2,ℂ), repLorentz g x = x) : ∃ a : ℂ, x = a • metricContraction (T := T) := by obtain ⟨c, hc, rfl⟩ := hT.exists_isInvariantCoeff_of_mem_componentSpan hx hinv - refine ⟨(4 : ℂ)⁻¹ * ∑ e, ((minkowskiMatrixZ (e 0) (e 1) : ℤ) : ℂ) * c e, ?_⟩ + refine ⟨c ![Sum.inl 0, Sum.inl 0], ?_⟩ rw [metricContraction, Finset.smul_sum] - refine Finset.sum_congr rfl fun d _ => ?_ - rw [smul_smul, ← eq_smul_minkowskiMatrixZ hc d] + exact Finset.sum_congr rfl fun d _ => by rw [smul_smul, ← eq_smul_minkowskiMatrixZ hc d] /-! -## F. The classification modulo a Lorentz-stable submodule +## C. The classification modulo a Lorentz-stable submodule A stable subspace `S` is divided out by passing to the quotient `B ⧸ S`, that is `B` with -`S` declared zero: the classes of the components again form a bi-Lorentz tensor, so -section E applies there and lifts back with an error term in `S`. +`S` declared zero: the classes of the components again form a rank-two family, so +section B applies there and lifts back with an error term in `S`. -/ diff --git a/Physlib/Relativity/SL2C/AxisRotations.lean b/Physlib/Relativity/SL2C/AxisRotations.lean index e290ca09f..14d88cde7 100644 --- a/Physlib/Relativity/SL2C/AxisRotations.lean +++ b/Physlib/Relativity/SL2C/AxisRotations.lean @@ -25,7 +25,9 @@ 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. + diagonal matrix; +- `halfTurn`, the rotation by `π` about a coordinate axis, lifted as `-i σ_k`; +- `toLorentzGroup_halfTurn_apply`, its diagonal Lorentz matrix with signs `halfTurnSign`. -/ @[expose] public section @@ -225,4 +227,75 @@ lemma rotationZToAxis_two_mul_diagonal_mul_inv (a b : ℂ) : end Lorentz.SL2C +/-! + +## C. Half turns about the coordinate axes + +The half turn about the axis `k` is the rotation by `π` about it. It has two lifts to +`SL(2,ℂ)`, `-i σ_k` and `i σ_k`, which differ by the central element `-1` and have the same +Lorentz matrix. The chosen lift `halfTurn k` is `-i σ_k`, the value at `θ = π` of +`cos (θ / 2) - i sin (θ / 2) σ_k`, the convention `rotationCycle` also follows. Its Lorentz +matrix is diagonal: it fixes time and the axis and negates the two transverse directions, with +the signs recorded by `halfTurnSign`. + +-/ + +namespace Lorentz + +/-- The sign the half turn about the axis `k` gives a direction: `1` on time and on the axis, +`-1` on the two transverse directions. -/ +def halfTurnSign (k : Fin 3) (μ : Fin 1 ⊕ Fin 3) : ℤ := + if μ = Sum.inl 0 ∨ μ = Sum.inr k then 1 else -1 + +namespace SL2C + +open Matrix MatrixGroups + +/-- The half turn about the axis `k`, the rotation by `π` about it, as the element `-i σ_k` of +`SL(2,ℂ)`. The other lift `i σ_k` is `-halfTurn k`. -/ +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, `-i σ_x`. -/ +@[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, `-i σ_y`. -/ +@[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, `-i σ_z`. -/ +@[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 `k` is diagonal, with the signs +`halfTurnSign k`: it fixes time and the axis and negates the two transverse directions. -/ +lemma toLorentzGroup_halfTurn_apply (k : Fin 3) (a b : Fin 1 ⊕ Fin 3) : + (toLorentzGroup (halfTurn k)).1 a b = if a = b then (halfTurnSign k a : ℝ) else 0 := by + refine Complex.ofReal_injective ?_ + rw [toLorentzGroup_eq_trace, PauliMatrix.trace_pauliSelfAdjoint'_mul_apply] + fin_cases k <;> rcases a with a | a <;> rcases b with b | b <;> fin_cases a <;> fin_cases b <;> + simp [halfTurnSign, PauliMatrix.pauliSelfAdjoint', PauliMatrix.pauliMatrix, + Matrix.mul_apply, Matrix.conjTranspose_apply, Fin.sum_univ_two, Complex.ext_iff] + +/-- The Lorentz matrix of the half turn is diagonal, hence symmetric. -/ +lemma toLorentzGroup_halfTurn_symm (k : Fin 3) (a b : Fin 1 ⊕ Fin 3) : + (toLorentzGroup (halfTurn k)).1 a b = (toLorentzGroup (halfTurn k)).1 b a := by + rw [toLorentzGroup_halfTurn_apply, toLorentzGroup_halfTurn_apply] + by_cases h : a = b + · rw [h] + · rw [ite_eq_right h, ite_eq_right (Ne.symm h)] + +end SL2C + +end Lorentz + end From 44c1ed99581df5f1b384e5d94d43eb718bf3c62e Mon Sep 17 00:00:00 2001 From: Nathaneal Date: Fri, 25 Sep 2026 18:49:44 +0400 Subject: [PATCH 367/367] feat: Describe subalgebras generated by homogeneous submodules and refactor mass weight proofs --- Physlib.lean | 1 + .../Mathematics/HomogeneousGenerators.lean | 345 +++++++++ .../HiggsAlgebraCovRealization/Basic.lean | 357 ++++------ .../MassWeight/Basic.lean | 65 +- .../IsFermionSector/MassWeight/Basic.lean | 662 +++++------------- .../IsGaugeSector/MassWeight/Basic.lean | 406 ++++------- 6 files changed, 831 insertions(+), 1005 deletions(-) create mode 100644 Physlib/Mathematics/HomogeneousGenerators.lean diff --git a/Physlib.lean b/Physlib.lean index 809c99eaf..112323150 100644 --- a/Physlib.lean +++ b/Physlib.lean @@ -205,6 +205,7 @@ public import Physlib.Mathematics.Fin.Involutions public import Physlib.Mathematics.Geometry.Metric.PseudoRiemannian.Defs public import Physlib.Mathematics.Geometry.Metric.Riemannian.Defs public import Physlib.Mathematics.HasTemperateGrowth +public import Physlib.Mathematics.HomogeneousGenerators public import Physlib.Mathematics.InnerProductSpace.Adjoint public import Physlib.Mathematics.InnerProductSpace.Basic public import Physlib.Mathematics.InnerProductSpace.Calculus diff --git a/Physlib/Mathematics/HomogeneousGenerators.lean b/Physlib/Mathematics/HomogeneousGenerators.lean new file mode 100644 index 000000000..8512a71a9 --- /dev/null +++ b/Physlib/Mathematics/HomogeneousGenerators.lean @@ -0,0 +1,345 @@ +/- +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 Mathlib.Algebra.Algebra.Operations +public import Mathlib.Algebra.Polynomial.AlgebraMap +public import Mathlib.RingTheory.Adjoin.Basic +/-! +# Subalgebras generated by homogeneous submodules + +## i. Overview + +Let `f : B →ₐ[R] B[X]` be an algebra map into the polynomials over a possibly +noncommutative algebra `B`. The degree-`w` part of a subalgebra `A` is the submodule +`A.homogeneousSubmodule f w` of elements `x ∈ A` with `f x = monomial w x`. Nothing +requires `f` to be a grading of `B`: the pieces need not span `B`, and `f x` need not +determine `x`. + +Suppose that `A` is generated by a family of submodules `D n`, and that `f` is the monomial +`X ^ deg n` on `D n`. Then the degree-`w` part of `A` is spanned by the products +`D n₁ * ⋯ * D nₖ`, in every order of the factors, whose degrees add up to `w` +(`homogeneousSubmodule_eq_productsOfDegree`). The empty product is `1`, so degree zero +contains the scalars. This is a spanning statement. It gives no unique decomposition, and +it assumes neither that the generators commute nor that their products are nonzero. + +Everything else is read off from it. + +- Removing the leftmost factor of each product: the degree-`w` part, for `w` positive, is + spanned by the products `D k * A_(w - deg k)` (`homogeneousSubmodule_eq_iSup_mul`). This + needs no positivity. When some `deg k` vanishes, the right-hand side contains the term + `D k * A_w` of the same degree, so the equality holds without giving a decreasing + recursion. +- If every generator has positive degree, degree zero is exactly the scalar submodule `1` + (`homogeneousSubmodule_zero_eq_one`), the image of `R` in `B`, which need not be a copy + of `R`. +- If moreover `n < deg n`, the degree-`i` part is spanned by the generators of degree `i` + and the products of two parts of smaller positive degree + (`homogeneousSubmodule_eq_sup_iSup_mul`). The bound makes the index ranges finite. +- A property of degrees holding at zero and at every generator degree, and closed under + addition, holds at every degree with a nonzero part (`homogeneousSubmodule_eq_bot`). + This only proves vanishing: a degree with the property may still have zero part. + +## ii. Key results + +- `Subalgebra.homogeneousSubmodule` : the degree-`w` part of a subalgebra. +- `Submodule.productsOfDegree` : the span of the products of generators of total degree `w`. +- `Subalgebra.coeff_mem_homogeneousSubmodule` : the coefficients of `f x` are homogeneous. +- `Subalgebra.homogeneousSubmodule_eq_productsOfDegree` : spanning by products. +- `Subalgebra.homogeneousSubmodule_eq_iSup_mul` : removing the leftmost generator. +- `Subalgebra.homogeneousSubmodule_zero_eq_one` : degree zero is the scalars. +- `Subalgebra.homogeneousSubmodule_eq_sup_iSup_mul` : the binary recursion. +- `Subalgebra.homogeneousSubmodule_eq_bot` : unreachable degrees vanish. + +## iii. Table of contents + +- A. The homogeneous submodules of a subalgebra +- B. Products of generators of a given total degree +- C. Subalgebras generated by homogeneous submodules + - C.1. Generators and coefficients + - C.2. Spanning by products of generators + - C.3. Removing the leftmost generator + - C.4. Degree zero and the binary recursion + - C.5. Unreachable degrees + +-/ + +@[expose] public section + +variable {R B : Type*} [CommSemiring R] [Ring B] [Algebra R B] + +namespace Subalgebra + +/-! + +## A. The homogeneous submodules of a subalgebra + +-/ + +/-- The degree-`w` part of `A` for `f`: the elements `x ∈ A` with `f x = monomial w x`. -/ +noncomputable def homogeneousSubmodule (A : Subalgebra R B) (f : B →ₐ[R] Polynomial B) + (w : ℕ) : Submodule R B := + A.toSubmodule + ⊓ LinearMap.ker (f.toLinearMap + - (Polynomial.monomial w : B →ₗ[B] Polynomial B).restrictScalars R) + +variable {A : Subalgebra R B} {f : B →ₐ[R] Polynomial B} + +lemma mem_homogeneousSubmodule_iff {w : ℕ} {x : B} : + x ∈ A.homogeneousSubmodule f w ↔ x ∈ A ∧ f x = Polynomial.monomial w x := by + simp only [homogeneousSubmodule, Submodule.mem_inf, Subalgebra.mem_toSubmodule, + LinearMap.mem_ker, LinearMap.sub_apply, AlgHom.toLinearMap_apply, + LinearMap.coe_restrictScalars, sub_eq_zero] + +/-- The scalars have degree zero. -/ +lemma one_le_homogeneousSubmodule_zero : (1 : Submodule R B) ≤ A.homogeneousSubmodule f 0 := + Submodule.one_le.mpr (mem_homogeneousSubmodule_iff.mpr ⟨A.one_mem, by simp⟩) + +/-- Degrees add under multiplication. -/ +lemma homogeneousSubmodule_mul_le (m n : ℕ) : + A.homogeneousSubmodule f m * A.homogeneousSubmodule f n + ≤ A.homogeneousSubmodule f (m + n) := + Submodule.mul_le.mpr fun x hx y hy => by + obtain ⟨hxA, hxf⟩ := mem_homogeneousSubmodule_iff.mp hx + obtain ⟨hyA, hyf⟩ := mem_homogeneousSubmodule_iff.mp hy + exact mem_homogeneousSubmodule_iff.mpr ⟨A.mul_mem hxA hyA, + by rw [map_mul, hxf, hyf, Polynomial.monomial_mul_monomial]⟩ + +end Subalgebra + +/-! + +## B. Products of generators of a given total degree + +-/ + +namespace Submodule + +/-- The span of the products `D n₁ * ⋯ * D nₖ` whose degrees `deg n₁ + ⋯ + deg nₖ` add up + to `w`. Every order of the factors occurs separately, and the empty product is `1`. -/ +noncomputable def productsOfDegree (D : ℕ → Submodule R B) (deg : ℕ → ℕ) (w : ℕ) : + Submodule R B := + ⨆ (l : List ℕ) (_ : (l.map deg).sum = w), (l.map D).prod + +variable {D : ℕ → Submodule R B} {deg : ℕ → ℕ} + +lemma list_prod_le_productsOfDegree (l : List ℕ) : + (l.map D).prod ≤ productsOfDegree D deg (l.map deg).sum := + le_iSup₂_of_le (f := fun (l' : List ℕ) (_ : (l'.map deg).sum = (l.map deg).sum) => + (l'.map D).prod) l rfl le_rfl + +/-- Concatenating products adds their degrees. -/ +lemma productsOfDegree_mul_le (a b : ℕ) : + productsOfDegree D deg a * productsOfDegree D deg b ≤ productsOfDegree D deg (a + b) := by + unfold productsOfDegree + rw [Submodule.iSup_mul] + refine iSup_le fun l => ?_ + rw [Submodule.iSup_mul] + refine iSup_le fun hl => ?_ + rw [Submodule.mul_iSup] + refine iSup_le fun l' => ?_ + rw [Submodule.mul_iSup] + refine iSup_le fun hl' => ?_ + refine le_iSup₂_of_le (l ++ l') (by simp [hl, hl']) ?_ + rw [List.map_append, List.prod_append] + +end Submodule + +namespace Subalgebra + +open Submodule + +/-! + +## C. Subalgebras generated by homogeneous submodules + +Throughout, `A` is generated by the submodules `D n` (`hA`), and `f` is the monomial +`X ^ deg n` on `D n` (`hD`). + +-/ + +variable {A : Subalgebra R B} {f : B →ₐ[R] Polynomial B} + {D : ℕ → Submodule R B} {deg : ℕ → ℕ} + (hA : A = Algebra.adjoin R (⋃ n, (D n : Set B))) + (hD : ∀ n, ∀ x ∈ D n, f x = Polynomial.monomial (deg n) x) + +/-! + +### C.1. Generators and coefficients + +-/ + +include hA hD in +/-- A generator in `D n` has degree `deg n`. -/ +lemma le_homogeneousSubmodule (n : ℕ) : D n ≤ A.homogeneousSubmodule f (deg n) := + fun x hx => mem_homogeneousSubmodule_iff.mpr + ⟨hA ▸ Algebra.subset_adjoin (Set.mem_iUnion.mpr ⟨n, hx⟩), hD n x hx⟩ + +include hA hD in +/-- A product of generators has the sum of their degrees. -/ +lemma list_prod_le_homogeneousSubmodule (l : List ℕ) : + (l.map D).prod ≤ A.homogeneousSubmodule f (l.map deg).sum := by + induction l with + | nil => simpa using one_le_homogeneousSubmodule_zero + | cons n l ih => + simp only [List.map_cons, List.prod_cons, List.sum_cons] + exact (mul_le_mul' (le_homogeneousSubmodule hA hD n) ih).trans + (homogeneousSubmodule_mul_le _ _) + +include hA hD in +/-- The products of generators of total degree `w` lie in the degree-`w` part of `A`. -/ +lemma productsOfDegree_le_homogeneousSubmodule (w : ℕ) : + productsOfDegree D deg w ≤ A.homogeneousSubmodule f w := + iSup₂_le fun l hl => hl ▸ list_prod_le_homogeneousSubmodule hA hD l + +include hA hD in +/-- Every coefficient of `f x`, for `x ∈ A`, is a sum of products of generators: the one + induction over the generation of `A`. -/ +lemma coeff_mem_productsOfDegree {x : B} (hx : x ∈ A) (m : ℕ) : + (f x).coeff m ∈ productsOfDegree D deg m := by + subst hA + induction hx using Algebra.adjoin_induction generalizing m with + | mem y hy => + obtain ⟨n, hn⟩ := Set.mem_iUnion.mp hy + rw [hD n y hn, Polynomial.coeff_monomial] + split_ifs with hw + · exact hw ▸ list_prod_le_productsOfDegree [n] (by simpa using hn) + · exact zero_mem _ + | algebraMap r => + rw [AlgHom.commutes, Polynomial.algebraMap_apply, Polynomial.coeff_C] + split_ifs with hm + · exact hm ▸ list_prod_le_productsOfDegree (D := D) (deg := deg) [] + (by simp [Submodule.algebraMap_mem r]) + · exact zero_mem _ + | add x y _ _ ihx ihy => + rw [map_add, Polynomial.coeff_add] + exact add_mem (ihx m) (ihy m) + | mul x y _ _ ihx ihy => + rw [map_mul, Polynomial.coeff_mul] + refine sum_mem fun p hp => ?_ + rw [← Finset.mem_antidiagonal.mp hp] + exact productsOfDegree_mul_le _ _ (mul_mem_mul (ihx p.1) (ihy p.2)) + +include hA hD in +/-- The coefficient of `X ^ m` in `f x`, for `x ∈ A`, lies in the degree-`m` part of `A`. -/ +lemma coeff_mem_homogeneousSubmodule {x : B} (hx : x ∈ A) (m : ℕ) : + (f x).coeff m ∈ A.homogeneousSubmodule f m := + productsOfDegree_le_homogeneousSubmodule hA hD m (coeff_mem_productsOfDegree hA hD hx m) + +/-! + +### C.2. Spanning by products of generators + +-/ + +include hA hD in +/-- The degree-`w` part of `A` is spanned by the products of generators, in every order, + whose degrees add up to `w`. -/ +lemma homogeneousSubmodule_eq_productsOfDegree (w : ℕ) : + A.homogeneousSubmodule f w = productsOfDegree D deg w := by + refine le_antisymm (fun x hx => ?_) (productsOfDegree_le_homogeneousSubmodule hA hD w) + obtain ⟨hxA, hxf⟩ := mem_homogeneousSubmodule_iff.mp hx + simpa [hxf] using coeff_mem_productsOfDegree hA hD hxA w + +/-! + +### C.3. Removing the leftmost generator + +-/ + +include hA hD in +/-- For positive `w`, the degree-`w` part of `A` is spanned by the products of a generator + `D k` of degree at most `w` with the part of the remaining degree. The bound `n ≤ deg n` + only makes the range of `k` finite. -/ +lemma homogeneousSubmodule_eq_iSup_mul (hle : ∀ n, n ≤ deg n) {w : ℕ} (hw : 0 < w) : + A.homogeneousSubmodule f w + = ⨆ k ∈ (Finset.range (w + 1)).filter (fun k => deg k ≤ w), + D k * A.homogeneousSubmodule f (w - deg k) := by + refine le_antisymm ?_ (iSup₂_le fun k hk => ?_) + · rw [homogeneousSubmodule_eq_productsOfDegree hA hD w] + refine iSup₂_le fun l hl => ?_ + cases l with + | nil => simp at hl; omega + | cons n l => + simp only [List.map_cons, List.sum_cons] at hl + have hn : n ∈ (Finset.range (w + 1)).filter (fun k => deg k ≤ w) := + Finset.mem_filter.mpr ⟨Finset.mem_range.mpr (by have := hle n; omega), by omega⟩ + refine le_iSup₂_of_le (f := fun k (_ : k ∈ (Finset.range (w + 1)).filter + (fun k => deg k ≤ w)) => D k * A.homogeneousSubmodule f (w - deg k)) n hn ?_ + rw [List.map_cons, List.prod_cons, show w - deg n = (l.map deg).sum by omega] + exact mul_le_mul' le_rfl (list_prod_le_homogeneousSubmodule hA hD l) + · have hk := (Finset.mem_filter.mp hk).2 + refine (mul_le_mul' (le_homogeneousSubmodule hA hD k) le_rfl).trans ?_ + exact (homogeneousSubmodule_mul_le _ _).trans (le_of_eq (by congr 1; omega)) + +/-! + +### C.4. Degree zero and the binary recursion + +-/ + +include hA hD in +/-- If every generator has positive degree, degree zero is the scalar submodule. -/ +lemma homogeneousSubmodule_zero_eq_one (hpos : ∀ n, 0 < deg n) : + A.homogeneousSubmodule f 0 = 1 := by + refine le_antisymm ?_ one_le_homogeneousSubmodule_zero + rw [homogeneousSubmodule_eq_productsOfDegree hA hD 0] + refine iSup₂_le fun l hl => ?_ + cases l with + | nil => simp + | cons n l => + have := hpos n + simp only [List.map_cons, List.sum_cons] at hl + omega + +include hA hD in +/-- If `n < deg n` for every `n`, the degree-`i` part of `A`, for positive `i`, is spanned + by the generators of degree `i` and the products of two parts of positive degrees adding + up to `i`. It follows from removing the leftmost generator: a generator of degree `i` + leaves degree zero, which is the scalars. -/ +lemma homogeneousSubmodule_eq_sup_iSup_mul (hlt : ∀ n, n < deg n) (i : ℕ) (hi : 0 < i) : + A.homogeneousSubmodule f i + = (⨆ k ∈ Finset.univ.filter (fun k : Fin i => deg k = i), D k) + ⊔ (⨆ p ∈ Finset.univ.filter (fun p : Fin i × Fin i => (p.1 : ℕ) + (p.2 : ℕ) = i), + A.homogeneousSubmodule f p.1 * A.homogeneousSubmodule f p.2) := by + refine le_antisymm ?_ (sup_le (iSup₂_le fun k hk => ?_) (iSup₂_le fun p hp => ?_)) + · rw [homogeneousSubmodule_eq_iSup_mul hA hD (fun n => (hlt n).le) hi] + refine iSup₂_le fun k hk => ?_ + rcases (Finset.mem_filter.mp hk).2.eq_or_lt with hki | hki + · rw [hki, Nat.sub_self, homogeneousSubmodule_zero_eq_one hA hD + (fun n => Nat.zero_lt_of_lt (hlt n)), mul_one] + refine le_sup_of_le_left (le_iSup₂_of_le (f := fun (k : Fin i) + (_ : k ∈ Finset.univ.filter (fun k : Fin i => deg k = i)) => D k) + ⟨k, hki ▸ hlt k⟩ (by simpa using hki) le_rfl) + · refine le_sup_of_le_right (le_iSup₂_of_le (f := fun (p : Fin i × Fin i) + (_ : p ∈ Finset.univ.filter (fun p : Fin i × Fin i => (p.1 : ℕ) + (p.2 : ℕ) = i)) => + A.homogeneousSubmodule f p.1 * A.homogeneousSubmodule f p.2) + (⟨deg k, hki⟩, ⟨i - deg k, by have := hlt k; omega⟩) (by simp; omega) ?_) + exact mul_le_mul' (le_homogeneousSubmodule hA hD k) le_rfl + · exact (le_homogeneousSubmodule hA hD k).trans (le_of_eq (by rw [(Finset.mem_filter.mp hk).2])) + · exact (homogeneousSubmodule_mul_le _ _).trans (le_of_eq (by rw [(Finset.mem_filter.mp hp).2])) + +/-! + +### C.5. Unreachable degrees + +-/ + +include hA hD in +/-- If a set of degrees contains `0` and every `deg n` and is closed under addition, a + degree outside it has zero part. This proves vanishing only: a degree in the set may + still have zero part. -/ +lemma homogeneousSubmodule_eq_bot (P : ℕ → Prop) (h0 : P 0) (hP : ∀ n, P (deg n)) + (hadd : ∀ a b, P a → P b → P (a + b)) {w : ℕ} (hw : ¬ P w) : + A.homogeneousSubmodule f w = ⊥ := by + have hl : ∀ l : List ℕ, P (l.map deg).sum := fun l => by + induction l with + | nil => simpa using h0 + | cons n l ih => simpa using hadd _ _ (hP n) ih + rw [homogeneousSubmodule_eq_productsOfDegree hA hD w, eq_bot_iff] + exact iSup₂_le fun l hw' => absurd (hw' ▸ hl l) hw + +end Subalgebra diff --git a/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/Basic.lean b/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/Basic.lean index 7f969ab78..bde844a2d 100644 --- a/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/Basic.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/Basic.lean @@ -5,6 +5,7 @@ Authors: Joseph Tooby-Smith -/ module +public import Physlib.Mathematics.HomogeneousGenerators public import Physlib.Particles.StandardModel.HiggsBoson.Basic public import Physlib.Particles.StandardModel.JetAlgebra.CovJetAlgebra.Higgs public import Physlib.Relativity.IsLorentzDeriv @@ -39,9 +40,10 @@ field pushed along the map, and every law they satisfy is that algebra's law pus it. From them the file builds the submodules `higgsSubmodule n` and `barHiggsSubmodule n` of terms linear in `∇_d H` and `∇_d H̄`, the algebra `higgsAlgebra` they generate, and its mass-weight submodules `massWeightSubmodule n`. Each of these carries a gauge weight -decomposition, and the mass-weight submodules obey a recursion which is expanded at weights -`2`, `4`, `6` and `8`. These are the pieces from which the Higgs terms of the Standard Model -Lagrangian are assembled downstream. +decomposition. The mass-weight submodules are described by the results of +`Physlib.Mathematics.HomogeneousGenerators`, and removing the leftmost Higgs tower of each +product gives them explicitly at weights `2`, `4`, `6` and `8`. These are the pieces from +which the Higgs terms of the Standard Model Lagrangian are assembled downstream. ## ii. Key results @@ -52,8 +54,9 @@ Lagrangian are assembled downstream. decompositions of the Higgs submodules. - `rep_dotGaugeHiggs_invariant`, `repLorentz_dotGaugeHiggs` : the gauge invariance and the Lorentz law of the inner product `H† H` with derivatives on the two factors. -- `massWeightSubmodule_eq` : the weight recursion, expanded in `massWeightSubmodule_two_eq` - up to `massWeightSubmodule_eight_eq`. +- `massWeightSubmodule_eq_iSup_mul`, `massWeightSubmodule_eq` : removing the leftmost Higgs + tower, and the binary weight recursion. +- `massWeightSubmodule_two_eq` up to `massWeightSubmodule_eight_eq` : the mass weights up to eight. - `massWeightSubmoduleGaugeWeight` : the gauge weight decomposition of the mass-weight submodules. @@ -71,10 +74,10 @@ Lagrangian are assembled downstream. - E. The Higgs inner product - F. The mass weight submodules - F.1. Membership and the grading - - F.2. The weight recursion + - F.2. The weight decompositions - F.3. The odd mass weights vanish - F.4. The gauge weight decomposition - - F.5. The low mass weights + - F.5. Mass weights up to eight - G. Gauge invariants -/ @@ -495,6 +498,13 @@ lemma barHiggsSubmodule_comm_barHiggsSubmodule (n1 n2 : ℕ) : h.mul_comm_of_le_higgsAlgebra (h.barHiggsSubmodule_le_higgsAlgebra n1) (h.barHiggsSubmodule_le_higgsAlgebra n2) +/-- A conjugate Higgs submodule commutes past a Higgs submodule standing in front of 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 + /-! ## D. The gauge weight decomposition of the Higgs submodules @@ -682,6 +692,9 @@ lemma repLorentz_dotGaugeHiggs {m n : ℕ} (g : SL(2,ℂ)) ## F. The mass weight submodules +A Higgs tower `∇ⁿH` or `∇ⁿH̄` has mass weight `2 * (1 + n)`, twice its mass dimension +`1 + n`; a term of mass dimension four, as in the Lagrangian, has weight eight. + -/ /-- All terms built from the Higgs symbols and their derivatives which have mass weight @@ -704,10 +717,8 @@ noncomputable def massWeightSubmodule scales it by `X ^ n`. -/ lemma mem_massWeightSubmodule_iff {n : ℕ} {x : B} : x ∈ h.massWeightSubmodule n - ↔ x ∈ h.higgsAlgebra ∧ massWeightPoly x = Polynomial.monomial n x := by - simp only [massWeightSubmodule, Submodule.mem_inf, Subalgebra.mem_toSubmodule, - LinearMap.mem_ker, LinearMap.sub_apply, AlgHom.toLinearMap_apply, - LinearMap.coe_restrictScalars, sub_eq_zero] + ↔ x ∈ h.higgsAlgebra ∧ massWeightPoly x = Polynomial.monomial n x := + Subalgebra.mem_homogeneousSubmodule_iff /-- The mass weight of an element of the weight-`n` submodule. -/ lemma massWeightPoly_of_mem_massWeightSubmodule {n : ℕ} {x : B} @@ -727,16 +738,12 @@ lemma massWeightSubmodule_mul_comm (n m : ℕ) : /-- The scalars have mass weight zero. -/ lemma one_le_massWeightSubmodule_zero : (1 : Submodule ℂ B) ≤ h.massWeightSubmodule 0 := - Submodule.one_le.mpr (h.mem_massWeightSubmodule_iff.mpr ⟨Subalgebra.one_mem _, by simp⟩) + Subalgebra.one_le_homogeneousSubmodule_zero /-- Mass weights add under multiplication. -/ lemma massWeightSubmodule_mul_le (m n : ℕ) : h.massWeightSubmodule m * h.massWeightSubmodule n ≤ h.massWeightSubmodule (m + n) := - Submodule.mul_le.mpr fun x hx y hy => by - obtain ⟨hxa, hxw⟩ := h.mem_massWeightSubmodule_iff.mp hx - obtain ⟨hya, hyw⟩ := h.mem_massWeightSubmodule_iff.mp hy - exact h.mem_massWeightSubmodule_iff.mpr ⟨Subalgebra.mul_mem _ hxa hya, - by rw [map_mul, hxw, hyw, Polynomial.monomial_mul_monomial]⟩ + Subalgebra.homogeneousSubmodule_mul_le m n /-- The Higgs symbols with `n` derivatives have mass weight `2 * (1 + n)`. -/ lemma massWeightSubmodule_higgsSubmodule_le (n : ℕ) : @@ -757,124 +764,43 @@ lemma massWeightSubmodule_barHiggsSubmodule_le (n : ℕ) : /-! -### F.2. The weight recursion +### F.2. The weight decompositions -An element of the Higgs algebra is a polynomial in the symbols, and `massWeightPoly` reads -off its homogeneous components: the weight-`0` component is a scalar, the weight-`m` -component has mass weight `m`, and a component of positive weight is a sum of symbols of -that weight and of products of two components of lower positive weight. The last statement, -applied to an element of pure weight, is the recursion `massWeightSubmodule_eq`. +The Higgs algebra is generated by the towers `∇ⁿH ⊔ ∇ⁿH̄`, on which `massWeightPoly` is the +monomial `X ^ (2 * (1 + n))`. The results of `Physlib.Mathematics.HomogeneousGenerators` +then describe every mass weight submodule, as a join of products of towers in the order +written. -/ -/-- The weight-zero component of an element of the Higgs algebra is a scalar. -/ -lemma coeff_zero_mem_one {x : B} (hx : x ∈ h.higgsAlgebra) : - (massWeightPoly x).coeff 0 ∈ (1 : Submodule ℂ B) := by - refine h.higgsAlgebra_induction - (P := fun x => (massWeightPoly x).coeff 0 ∈ (1 : Submodule ℂ B)) ?_ ?_ ?_ ?_ ?_ hx - · intro n d φ - rw [h.H_massWeight, Polynomial.coeff_monomial, ite_eq_right (by omega)] - exact zero_mem _ - · intro n d φ - rw [h.barH_massWeight, Polynomial.coeff_monomial, ite_eq_right (by omega)] - exact zero_mem _ - · intro r - rw [AlgHom.commutes] - simp only [Polynomial.algebraMap_apply, Polynomial.coeff_C] - exact Submodule.mem_one.mpr ⟨r, rfl⟩ - · intro x y _ _ ihx ihy - rw [map_add, Polynomial.coeff_add] - exact Submodule.add_mem _ ihx ihy - · intro x y _ _ ihx ihy - rw [map_mul, Polynomial.mul_coeff_zero] - simpa only [Submodule.one_mul] using Submodule.mul_mem_mul ihx ihy - -/-- The weight-`m` component of an element of the Higgs algebra has mass weight `m`. -/ -lemma coeff_mem_massWeightSubmodule {x : B} (hx : x ∈ h.higgsAlgebra) (m : ℕ) : - (massWeightPoly x).coeff m ∈ h.massWeightSubmodule m := by - refine h.higgsAlgebra_induction - (P := fun x => ∀ m, (massWeightPoly x).coeff m ∈ h.massWeightSubmodule m) ?_ ?_ ?_ ?_ ?_ hx m - · intro n d φ m - rw [h.H_massWeight, Polynomial.coeff_monomial] - split_ifs with hw - · subst hw - exact h.massWeightSubmodule_higgsSubmodule_le n (Submodule.mem_iSup_of_mem d ⟨φ, rfl⟩) - · exact zero_mem _ - · intro n d φ m - rw [h.barH_massWeight, Polynomial.coeff_monomial] - split_ifs with hw - · subst hw - exact h.massWeightSubmodule_barHiggsSubmodule_le n - (Submodule.mem_iSup_of_mem d ⟨φ, rfl⟩) - · exact zero_mem _ - · intro r 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 _ - · intro x y _ _ ihx ihy m - rw [map_add, Polynomial.coeff_add] - exact Submodule.add_mem _ (ihx m) (ihy m) - · intro x y _ _ ihx ihy m - rw [map_mul, Polynomial.coeff_mul] - refine Submodule.sum_mem _ fun p hp => ?_ - rw [← Finset.mem_antidiagonal.mp hp] - exact h.massWeightSubmodule_mul_le _ _ (Submodule.mul_mem_mul (ihx p.1) (ihy p.2)) - -/-- A component of positive weight `m` of an element of the Higgs algebra is a sum of - symbols of weight `m` and of products of two components of lower positive weight. -/ -lemma coeff_mem_of_pos {x : B} (hx : x ∈ h.higgsAlgebra) (m : ℕ) (hm : 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 - refine h.higgsAlgebra_induction (P := fun x => ∀ 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 : ℕ))) - ?_ ?_ ?_ ?_ ?_ hx m hm - · intro n d φ m _ - rw [h.H_massWeight, Polynomial.coeff_monomial] - split_ifs with hw - · exact Submodule.mem_sup_left (Submodule.mem_iSup_of_mem ⟨n, 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 n d φ m _ - rw [h.barH_massWeight, Polynomial.coeff_monomial] - split_ifs with hw - · exact Submodule.mem_sup_left (Submodule.mem_iSup_of_mem ⟨n, 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 _ - · intro r m hm - rw [AlgHom.commutes] - simp only [Polynomial.algebraMap_apply, Polynomial.coeff_C, ite_eq_right (by omega : ¬ m = 0)] - exact zero_mem _ - · intro x y _ _ ihx ihy m hm - rw [map_add, Polynomial.coeff_add] - exact Submodule.add_mem _ (ihx m hm) (ihy m hm) - · intro x y hx hy ihx ihy m hm - rw [map_mul, Polynomial.coeff_mul] - refine Submodule.sum_mem _ fun p hp => ?_ - have hsum := Finset.mem_antidiagonal.mp hp - rcases Nat.eq_zero_or_pos p.1 with h1 | h1 - · rw [h1, show p.2 = m by omega] - simpa only [Submodule.one_mul] using - Submodule.mul_mem_mul (h.coeff_zero_mem_one hx) (ihy m hm) - · rcases Nat.eq_zero_or_pos p.2 with h2 | h2 - · rw [h2, show p.1 = m by omega] - simpa only [Submodule.mul_one] using - Submodule.mul_mem_mul (ihx m hm) (h.coeff_zero_mem_one hy) - · refine Submodule.mem_sup_right (Submodule.mem_iSup_of_mem - ((⟨⟨p.1, by omega⟩, ⟨p.2, by omega⟩⟩ : Fin m × Fin m)) - (Submodule.mem_iSup_of_mem (Finset.mem_filter.mpr ⟨Finset.mem_univ _, hsum⟩) ?_)) - exact Submodule.mul_mem_mul (h.coeff_mem_massWeightSubmodule hx p.1) - (h.coeff_mem_massWeightSubmodule hy p.2) +/-- The Higgs algebra is generated by the Higgs and conjugate Higgs towers of every + derivative order. -/ +lemma higgsAlgebra_eq_adjoin : + h.higgsAlgebra = Algebra.adjoin ℂ + (⋃ n, ((h.higgsSubmodule n ⊔ h.barHiggsSubmodule n : Submodule ℂ B) : Set B)) := by + refine le_antisymm (Algebra.adjoin_le fun y hy => ?_) (Algebra.adjoin_le fun y hy => ?_) + · simp only [Set.mem_iUnion, Set.mem_union, Set.mem_range] at hy + obtain ⟨n, d, ⟨φ, rfl⟩ | ⟨φ, rfl⟩⟩ := hy + · exact Algebra.subset_adjoin (Set.mem_iUnion.mpr ⟨n, Submodule.mem_sup_left + (Submodule.mem_iSup_of_mem d ⟨φ, rfl⟩)⟩) + · exact Algebra.subset_adjoin (Set.mem_iUnion.mpr ⟨n, Submodule.mem_sup_right + (Submodule.mem_iSup_of_mem d ⟨φ, rfl⟩)⟩) + · obtain ⟨n, hy⟩ := Set.mem_iUnion.mp hy + exact sup_le (h.higgsSubmodule_le_higgsAlgebra n) (h.barHiggsSubmodule_le_higgsAlgebra n) hy + +/-- `massWeightPoly` is the monomial `X ^ (2 * (1 + n))` on the Higgs and conjugate Higgs + towers with `n` derivatives. -/ +lemma massWeightPoly_of_mem_higgsSubmodule_sup (n : ℕ) : + ∀ x ∈ h.higgsSubmodule n ⊔ h.barHiggsSubmodule n, + massWeightPoly x = Polynomial.monomial (2 * (1 + n)) x := fun _ hx => + h.massWeightPoly_of_mem_massWeightSubmodule + (sup_le (h.massWeightSubmodule_higgsSubmodule_le n) + (h.massWeightSubmodule_barHiggsSubmodule_le n) hx) + +/-- Weight zero is the scalars: every Higgs tower has positive weight. -/ +lemma massWeightSubmodule_zero_eq : h.massWeightSubmodule 0 = 1 := + Subalgebra.homogeneousSubmodule_zero_eq_one h.higgsAlgebra_eq_adjoin + h.massWeightPoly_of_mem_higgsSubmodule_sup (fun n => by omega) /-- The weight recursion: a term of positive mass weight `i` is a sum of symbols of weight `i` and of products of two terms of lower positive weight adding up to `i`. -/ @@ -883,43 +809,35 @@ theorem massWeightSubmodule_eq (i : ℕ) (hi : 0 < 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 ?_ ?_) - · have hmain := h.coeff_mem_of_pos (h.mem_higgsAlgebra_of_mem_massWeightSubmodule hb) i hi - rwa [h.massWeightPoly_of_mem_massWeightSubmodule hb, Polynomial.coeff_monomial, - ite_eq_left rfl] at hmain - · refine iSup₂_le fun k hk => ?_ - exact (sup_le (h.massWeightSubmodule_higgsSubmodule_le (k : ℕ)) - (h.massWeightSubmodule_barHiggsSubmodule_le (k : ℕ))).trans - (le_of_eq (by rw [(Finset.mem_filter.mp hk).2])) - · refine iSup₂_le fun p hp => ?_ - exact (h.massWeightSubmodule_mul_le (p.1 : ℕ) (p.2 : ℕ)).trans - (le_of_eq (by rw [(Finset.mem_filter.mp hp).2])) + h.massWeightSubmodule (p.1 : ℕ) * h.massWeightSubmodule (p.2 : ℕ)) := + Subalgebra.homogeneousSubmodule_eq_sup_iSup_mul (deg := fun n => 2 * (1 + n)) + h.higgsAlgebra_eq_adjoin h.massWeightPoly_of_mem_higgsSubmodule_sup + (fun n => by omega) i hi + +/-- Removing the leftmost Higgs tower: a term of positive weight `w` is a sum of products + of a tower `∇ⁿH` or `∇ⁿH̄`, of weight `2 * (1 + n) ≤ w`, with a term of the remaining + weight. -/ +lemma massWeightSubmodule_eq_iSup_mul (w : ℕ) (hw : 0 < w) : + h.massWeightSubmodule w + = ⨆ n ∈ (Finset.range (w + 1)).filter (fun n => 2 * (1 + n) ≤ w), + (h.higgsSubmodule n ⊔ h.barHiggsSubmodule n) * h.massWeightSubmodule (w - 2 * (1 + n)) := + Subalgebra.homogeneousSubmodule_eq_iSup_mul (deg := fun n => 2 * (1 + n)) + h.higgsAlgebra_eq_adjoin h.massWeightPoly_of_mem_higgsSubmodule_sup + (fun n => by omega) hw /-! ### F.3. The odd mass weights vanish -Every symbol has even mass weight `2 * (1 + n)` and weights add under multiplication, so no -term of the Higgs algebra has odd mass weight. The proof runs the recursion: at an odd -weight the symbol part is empty, and each product has an odd factor of lower weight. - -/ -/-- The odd mass weight submodules are trivial. -/ +/-- The odd mass weight submodules are trivial: every Higgs tower has even weight, and + weights add under products. -/ lemma massWeightSubmodule_odd_eq_bot (n : ℕ) (hn : Odd n) : - h.massWeightSubmodule n = ⊥ := by - induction n using Nat.strongRecOn with - | _ n ih => - rw [h.massWeightSubmodule_eq n hn.pos, eq_bot_iff, sup_le_iff] - obtain ⟨r, hr⟩ := hn - refine ⟨iSup₂_le fun k hk => ?_, iSup₂_le fun p hp => ?_⟩ - · have := (Finset.mem_filter.mp hk).2 - omega - · have hsum := (Finset.mem_filter.mp hp).2 - rcases Nat.even_or_odd (p.1 : ℕ) with ⟨s, hs⟩ | ho - · rw [ih p.2 p.2.isLt ⟨r - s, by omega⟩, Submodule.mul_bot] - · rw [ih p.1 p.1.isLt ho, Submodule.bot_mul] + h.massWeightSubmodule n = ⊥ := + Subalgebra.homogeneousSubmodule_eq_bot h.higgsAlgebra_eq_adjoin + h.massWeightPoly_of_mem_higgsSubmodule_sup (fun w => w % 2 = 0) rfl (fun n => by omega) + (fun a b ha hb => by omega) (by obtain ⟨r, rfl⟩ := hn; omega) /-! @@ -960,42 +878,41 @@ noncomputable instance massWeightSubmoduleGaugeWeightOfNeZero (i : ℕ) [NeZero /-! -### F.5. The low mass weights +### F.5. Mass weights up to eight -The recursion expanded at weights `2`, `4`, `6` and `8`, with the products written in a -fixed order using the commutation of the Higgs submodules. The odd weights vanish by -`massWeightSubmodule_odd_eq_bot`, so only even splittings survive. +Each case removes the leftmost tower. The towers with `0`, `1`, `2` and `3` derivatives +have weights `2`, `4`, `6` and `8`, and the remaining weight is read off from a smaller weight. +Expanding the joins gives the products of `H` and `H̄`; the Higgs algebra is commutative, +so orders differing only by the position of commuting factors are merged, and the products +are written in a fixed order. -/ /-- Weight two: the underived Higgs and conjugate Higgs. -/ 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] - -/-- Weight four: the once-derived symbols and the products of two underived ones. -/ + rw [h.massWeightSubmodule_eq_iSup_mul 2 (by decide), + show (Finset.range 3).filter (fun n => 2 * (1 + n) ≤ 2) = {0} from by decide, + Finset.iSup_singleton] + simp [h.massWeightSubmodule_zero_eq] + +/-- Weight four: the once-derived symbols and the products of two underived ones. The + leftmost tower is underived, leaving weight two, or once-derived, leaving weight zero. -/ 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] + rw [h.massWeightSubmodule_eq_iSup_mul 4 (by decide), + show (Finset.range 5).filter (fun n => 2 * (1 + n) ≤ 4) = {0, 1} from by decide, + Finset.iSup_insert, Finset.iSup_singleton] + simp only [Nat.reduceMul, Nat.reduceAdd, Nat.reduceSub, h.massWeightSubmodule_two_eq, + h.massWeightSubmodule_zero_eq, mul_one, Submodule.sup_mul, Submodule.mul_sup, + barHiggsSubmodule_comm_higgsSubmodule] + simp only [sup_assoc, sup_comm, sup_left_comm, sup_left_idem] /-- Weight six: the twice-derived symbols, a once-derived symbol against an underived one, - and the products of three underived ones. -/ + and the products of three underived ones. The leftmost tower leaves weight four, two or + zero. -/ lemma massWeightSubmodule_six_eq : h.massWeightSubmodule 6 = -- The derivative terms h.higgsSubmodule 2 ⊔ h.barHiggsSubmodule 2 ⊔ @@ -1008,25 +925,27 @@ lemma massWeightSubmodule_six_eq : h.massWeightSubmodule 6 = 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, - h.barHiggsSubmodule_comm_barHiggsSubmodule 0 1, ← sup_assoc, sup_right_idem] + rw [h.massWeightSubmodule_eq_iSup_mul 6 (by decide), + show (Finset.range 7).filter (fun n => 2 * (1 + n) ≤ 6) = {0, 1, 2} from by decide, + Finset.iSup_insert, Finset.iSup_insert, Finset.iSup_singleton] + simp only [Nat.reduceMul, Nat.reduceAdd, Nat.reduceSub, h.massWeightSubmodule_four_eq, + h.massWeightSubmodule_two_eq, h.massWeightSubmodule_zero_eq, mul_one, + Submodule.sup_mul, Submodule.mul_sup, mul_assoc, barHiggsSubmodule_comm_higgsSubmodule, + h.barHiggs_higgs_left_comm, h.higgsSubmodule_comm_higgsSubmodule 0 1, + h.barHiggsSubmodule_comm_barHiggsSubmodule 0 1] + -- the products are atoms for the final reordering of the join + generalize h.higgsSubmodule 2 = v1, h.barHiggsSubmodule 2 = v2, + h.higgsSubmodule 1 * h.higgsSubmodule 0 = v3, h.higgsSubmodule 1 * h.barHiggsSubmodule 0 = v4, + h.higgsSubmodule 0 * h.barHiggsSubmodule 1 = v5, + h.barHiggsSubmodule 1 * h.barHiggsSubmodule 0 = v6, + h.higgsSubmodule 0 * (h.higgsSubmodule 0 * h.higgsSubmodule 0) = v7, + h.higgsSubmodule 0 * (h.higgsSubmodule 0 * h.barHiggsSubmodule 0) = v8, + h.higgsSubmodule 0 * (h.barHiggsSubmodule 0 * h.barHiggsSubmodule 0) = v9, + h.barHiggsSubmodule 0 * (h.barHiggsSubmodule 0 * h.barHiggsSubmodule 0) = v10 + ac_rfl /-- Weight eight: the derivative terms with up to three derivatives, and the products of - four underived symbols. -/ + four underived symbols. The leftmost tower leaves weight six, four, two or zero. -/ lemma massWeightSubmodule_eight_eq : h.massWeightSubmodule 8 = -- The derivative terms @@ -1051,32 +970,20 @@ lemma massWeightSubmodule_eight_eq : 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) + rw [h.massWeightSubmodule_eq_iSup_mul 8 (by decide), + show (Finset.range 9).filter (fun n => 2 * (1 + n) ≤ 8) = {0, 1, 2, 3} from by decide, + Finset.iSup_insert, Finset.iSup_insert, Finset.iSup_insert, Finset.iSup_singleton] + 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) C - have hlcB : ∀ (C : Submodule ℂ B), - h.barHiggsSubmodule 0 * (h.barHiggsSubmodule 1 * C) + Commute.left_comm (h.higgsSubmodule_comm_higgsSubmodule 0 1) 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) C - simp only [Submodule.sup_mul, Submodule.mul_sup, barHiggsSubmodule_comm_higgsSubmodule, - mul_assoc, hlc, hlcH, hlcB, - h.higgsSubmodule_comm_higgsSubmodule 0 1, - h.higgsSubmodule_comm_higgsSubmodule 0 2, - h.barHiggsSubmodule_comm_barHiggsSubmodule 0 1, + Commute.left_comm (h.barHiggsSubmodule_comm_barHiggsSubmodule 0 1) C + simp only [Nat.reduceMul, Nat.reduceAdd, Nat.reduceSub, h.massWeightSubmodule_six_eq, + h.massWeightSubmodule_four_eq, h.massWeightSubmodule_two_eq, + h.massWeightSubmodule_zero_eq, mul_one, Submodule.sup_mul, Submodule.mul_sup, mul_assoc, + barHiggsSubmodule_comm_higgsSubmodule, h.barHiggs_higgs_left_comm, hlcH, hlcB, + h.higgsSubmodule_comm_higgsSubmodule 0 2, h.barHiggsSubmodule_comm_barHiggsSubmodule 0 1, h.barHiggsSubmodule_comm_barHiggsSubmodule 0 2] -- the products are atoms for the final reordering of the join generalize h.higgsSubmodule 3 = v1, h.barHiggsSubmodule 3 = v2, @@ -1100,7 +1007,7 @@ lemma massWeightSubmodule_eight_eq : = v19, 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] + ac_rfl /-! diff --git a/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/MassWeight/Basic.lean b/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/MassWeight/Basic.lean index 849fdf6a2..bb8aecae2 100644 --- a/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/MassWeight/Basic.lean +++ b/Physlib/Particles/StandardModel/AlgebraRealization/HiggsAlgebraCovRealization/MassWeight/Basic.lean @@ -13,9 +13,9 @@ The mass-weight submodules of the Higgs sector are described in `HiggsAlgebraCovRealization.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. +a Higgs tower with `n` derivatives has mass weight `2 * (1 + n)`, twice its mass dimension +`1 + n`, only even weights are non-zero, and the mass weights up to eight (mass dimension +at most four) are the partitions of the weight into such towers. -/ @@ -51,39 +51,47 @@ lemma massWeightSubmodule_eq_derivSubmodule (i : ℕ) (hi : 0 < i) : h.massWeightSubmodule (p.1 : ℕ) * h.massWeightSubmodule (p.2 : ℕ)) := h.massWeightSubmodule_eq i hi +/-- Removing the leftmost Higgs tower, written with the derivative submodules: a term of + positive weight `w` is a sum of products of a tower `derivSubmodule n`, of weight + `2 * (1 + n) ≤ w`, with a term of the remaining weight. -/ +lemma massWeightSubmodule_eq_iSup_derivSubmodule_mul (w : ℕ) (hw : 0 < w) : + h.massWeightSubmodule w + = ⨆ n ∈ (Finset.range (w + 1)).filter (fun n => 2 * (1 + n) ≤ w), + h.derivSubmodule n * h.massWeightSubmodule (w - 2 * (1 + n)) := + h.massWeightSubmodule_eq_iSup_mul w hw + /-- Weight two is the underived Higgs symbols. -/ lemma massWeightSubmodule_two_eq_deriv : h.massWeightSubmodule 2 = h.derivSubmodule 0 := h.massWeightSubmodule_two_eq -/-- Weight four. -/ +/-- Weight four: the leftmost tower is underived, leaving weight two, which is an underived + tower, or once-derived, leaving weight zero. -/ 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. -/ + rw [h.massWeightSubmodule_eq_iSup_derivSubmodule_mul 4 (by decide), + show (Finset.range 5).filter (fun n => 2 * (1 + n) ≤ 4) = {0, 1} from by decide, + Finset.iSup_insert, Finset.iSup_singleton] + simp [h.massWeightSubmodule_two_eq_deriv, h.massWeightSubmodule_zero_eq, sup_comm] + +/-- Weight six: the leftmost tower leaves weight four, two or zero. The product of an + underived tower with a once-derived one occurs in both orders, which agree by + `derivSubmodule_mul_comm`. -/ 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] + rw [h.massWeightSubmodule_eq_iSup_derivSubmodule_mul 6 (by decide), + show (Finset.range 7).filter (fun n => 2 * (1 + n) ≤ 6) = {0, 1, 2} from by decide, + Finset.iSup_insert, Finset.iSup_insert, Finset.iSup_singleton] + simp only [Nat.reduceMul, Nat.reduceAdd, Nat.reduceSub, h.massWeightSubmodule_four_eq_deriv, + h.massWeightSubmodule_two_eq_deriv, h.massWeightSubmodule_zero_eq, mul_one, + Submodule.mul_sup, mul_assoc, h.derivSubmodule_mul_comm 0 1] simp only [sup_assoc, sup_comm, sup_left_comm, sup_left_idem] -set_option maxHeartbeats 4000000 in -/-- Weight eight. -/ +/-- Weight eight: the leftmost tower leaves weight six, four, two or zero. Products that + differ only in the order of commuting towers agree by `derivSubmodule_mul_comm`. -/ lemma massWeightSubmodule_eight_eq_deriv : h.massWeightSubmodule 8 = h.derivSubmodule 3 ⊔ h.derivSubmodule 2 * h.derivSubmodule 0 @@ -91,9 +99,16 @@ lemma massWeightSubmodule_eight_eq_deriv : ⊔ 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] + rw [h.massWeightSubmodule_eq_iSup_derivSubmodule_mul 8 (by decide), + show (Finset.range 9).filter (fun n => 2 * (1 + n) ≤ 8) = {0, 1, 2, 3} from by decide, + Finset.iSup_insert, Finset.iSup_insert, Finset.iSup_insert, Finset.iSup_singleton] + have hlc (C : Submodule ℂ B) : h.derivSubmodule 0 * (h.derivSubmodule 1 * C) + = h.derivSubmodule 1 * (h.derivSubmodule 0 * C) := + Commute.left_comm (h.derivSubmodule_mul_comm 0 1) C + simp only [Nat.reduceMul, Nat.reduceAdd, Nat.reduceSub, h.massWeightSubmodule_six_eq_deriv, + h.massWeightSubmodule_four_eq_deriv, h.massWeightSubmodule_two_eq_deriv, + h.massWeightSubmodule_zero_eq, mul_one, Submodule.mul_sup, mul_assoc, hlc, + h.derivSubmodule_mul_comm 0 2] simp only [sup_assoc, sup_comm, sup_left_comm, sup_left_idem] end HiggsAlgebraCovRealization diff --git a/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/Basic.lean b/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/Basic.lean index 32f8b2fc9..2f445e8de 100644 --- a/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/Basic.lean +++ b/Physlib/Particles/StandardModel/IsFermionSector/MassWeight/Basic.lean @@ -5,17 +5,37 @@ Authors: Joseph Tooby-Smith -/ module +public import Physlib.Mathematics.HomogeneousGenerators 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`. +## i. Overview + +The elements of the fermion algebra of a given mass weight form a submodule. Mass weight is +twice the mass dimension, so that it is a natural number: a fermion tower `∇ⁿψ` with `n` +covariant derivatives has mass dimension `3/2 + n` and mass weight `3 + 2 * n`, and a term +of mass dimension four, as in the Lagrangian, has mass weight eight. + +The fermion towers generate the fermion algebra, and `massWeightPoly` is a monomial on +each of them. The results of `Physlib.Mathematics.HomogeneousGenerators` then describe +every mass-weight submodule. The submodules of weight at most eight are found by removing +the leftmost tower of each product, and weight eight collapses, by the commutation of the +derivative submodules, to the kinetic sector `derivSubmodule 0 * derivSubmodule 1`. + +## ii. Key results + +- `massWeightSubmodule_eq_iSup_mul` : removing the leftmost fermion tower. +- `massWeightSubmodule_eq` : the binary weight recursion. +- `massWeightSubmodule_eq_bot` : the weights `1`, `2` and `4` are empty. +- `massWeightSubmodule_three_eq` to `massWeightSubmodule_eight_eq` : the mass weights up to eight. + +## iii. Table of contents + +- A. The mass-weight submodules +- B. The fermion towers generate and have weight `3 + 2 * n` +- C. The weight decompositions +- D. Mass weights up to eight -/ @@ -48,6 +68,12 @@ variable {B : Type} [Ring B] [Algebra ℂ B] (h : IsFermionSector B repGauge hrepGauge_mul repLorentz hrepLorentz_mul d bard u baru Q barQ L barL e bare massWeightPoly) +/-! + +## A. The mass-weight submodules + +-/ + /-- 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`. -/ @@ -60,525 +86,171 @@ noncomputable def massWeightSubmodule (h : IsFermionSector B repGauge hrepGauge_ 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' + massWeightPoly x = Polynomial.monomial w x := + (Subalgebra.mem_homogeneousSubmodule_iff.mp hx).2 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 + (hx : x ∈ h.massWeightSubmodule w) : x ∈ h.fermionAlgebra := + (Subalgebra.mem_homogeneousSubmodule_iff.mp hx).1 + +lemma one_le_massWeightSubmodule_zero : (1 : Submodule ℂ B) ≤ h.massWeightSubmodule 0 := + Subalgebra.one_le_homogeneousSubmodule_zero + +lemma massWeightSubmodule_mul_le (m n : ℕ) : + h.massWeightSubmodule m * h.massWeightSubmodule n ≤ h.massWeightSubmodule (m + n) := + Subalgebra.homogeneousSubmodule_mul_le m n + +/-! + +## B. The fermion towers generate and have weight `3 + 2 * n` + +-/ + +/-- The fermion algebra is generated by the fermion towers of every derivative order. -/ +lemma fermionAlgebra_eq_adjoin_derivSubmodule : + h.fermionAlgebra = Algebra.adjoin ℂ (⋃ n, (h.derivSubmodule n : Set B)) := by + simp only [h.derivSubmodule_eq_span, Algebra.adjoin_iUnion, Algebra.adjoin_span, + fermionAlgebra] + exact iSup_comm + +/-- `massWeightPoly` is the monomial `X ^ (3 + 2 * n)` on the fermion towers with `n` + covariant derivatives. -/ +lemma massWeightPoly_of_mem_derivSubmodule (n : ℕ) : + ∀ x ∈ h.derivSubmodule n, massWeightPoly x = Polynomial.monomial (3 + 2 * n) x := by + intro x hx + rw [h.derivSubmodule_eq_span] at hx + induction hx using Submodule.span_induction with + | mem y hy => + simp only [Set.mem_iUnion, Set.mem_union, Set.mem_range] at hy + obtain ⟨i, l, (((((((((⟨φ, rfl⟩ | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | + ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩) | ⟨φ, rfl⟩)⟩ := hy <;> + simp only [h.massWeight_d, h.massWeight_bard, h.massWeight_u, h.massWeight_baru, + h.massWeight_Q, h.massWeight_barQ, h.massWeight_L, h.massWeight_barL, h.massWeight_e, + h.massWeight_bare] + | zero => simp + | add x y _ _ hx hy => rw [map_add, hx, hy, map_add] + | smul c x _ hx => rw [map_smul, hx, Polynomial.smul_monomial] /-- 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 + h.derivSubmodule n ≤ h.massWeightSubmodule (3 + 2 * n) := + Subalgebra.le_homogeneousSubmodule h.fermionAlgebra_eq_adjoin_derivSubmodule + h.massWeightPoly_of_mem_derivSubmodule n -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`. -/ +/-! + +## C. The weight decompositions + +Every result here is a spanning statement: a submodule is a join of products of fermion +towers, in the order written. It says nothing about the products being nonzero or +independent. + +-/ + +/-- Weight zero is the scalars: every fermion tower has positive weight. -/ +lemma massWeightSubmodule_zero_eq : h.massWeightSubmodule 0 = 1 := + Subalgebra.homogeneousSubmodule_zero_eq_one h.fermionAlgebra_eq_adjoin_derivSubmodule + h.massWeightPoly_of_mem_derivSubmodule (fun n => by omega) + +/-- 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, ite_eq_right (by omega)] - exact zero_mem _ - · rw [h.massWeight_bard, Polynomial.coeff_monomial, ite_eq_right (by omega)] - exact zero_mem _ - · rw [h.massWeight_u, Polynomial.coeff_monomial, ite_eq_right (by omega)] - exact zero_mem _ - · rw [h.massWeight_baru, Polynomial.coeff_monomial, ite_eq_right (by omega)] - exact zero_mem _ - · rw [h.massWeight_Q, Polynomial.coeff_monomial, ite_eq_right (by omega)] - exact zero_mem _ - · rw [h.massWeight_barQ, Polynomial.coeff_monomial, ite_eq_right (by omega)] - exact zero_mem _ - · rw [h.massWeight_L, Polynomial.coeff_monomial, ite_eq_right (by omega)] - exact zero_mem _ - · rw [h.massWeight_barL, Polynomial.coeff_monomial, ite_eq_right (by omega)] - exact zero_mem _ - · rw [h.massWeight_e, Polynomial.coeff_monomial, ite_eq_right (by omega)] - exact zero_mem _ - · rw [h.massWeight_bare, Polynomial.coeff_monomial, ite_eq_right (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, ite_eq_right (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, - ite_eq_left 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'])) + h.massWeightSubmodule (p.1 : ℕ) * h.massWeightSubmodule (p.2 : ℕ)) := + Subalgebra.homogeneousSubmodule_eq_sup_iSup_mul (deg := fun n => 3 + 2 * n) + h.fermionAlgebra_eq_adjoin_derivSubmodule h.massWeightPoly_of_mem_derivSubmodule + (fun n => by omega) i hi + +/-- Removing the leftmost fermion tower: an element of positive weight `w` is a sum of + products of a tower `∇ⁿψ` of weight `3 + 2 * n ≤ w` with an element of the remaining + weight. -/ +lemma massWeightSubmodule_eq_iSup_mul (w : ℕ) (hw : 0 < w) : + h.massWeightSubmodule w + = ⨆ n ∈ (Finset.range (w + 1)).filter (fun n => 3 + 2 * n ≤ w), + h.derivSubmodule n * h.massWeightSubmodule (w - (3 + 2 * n)) := + Subalgebra.homogeneousSubmodule_eq_iSup_mul (deg := fun n => 3 + 2 * n) + h.fermionAlgebra_eq_adjoin_derivSubmodule h.massWeightPoly_of_mem_derivSubmodule + (fun n => by omega) hw + +/-- The weights `1`, `2` and `4` are empty: the tower weights `3, 5, 7, …` and their sums + only reach `0`, `3` and every weight from `5` on. -/ +lemma massWeightSubmodule_eq_bot {w : ℕ} (hw : ¬ (w = 0 ∨ w = 3 ∨ 5 ≤ w)) : + h.massWeightSubmodule w = ⊥ := + Subalgebra.homogeneousSubmodule_eq_bot h.fermionAlgebra_eq_adjoin_derivSubmodule + h.massWeightPoly_of_mem_derivSubmodule (fun w => w = 0 ∨ w = 3 ∨ 5 ≤ w) + (by omega) (fun n => by omega) (fun a b ha hb => by omega) hw /-! -## The mass-weight submodules in low weight +## D. Mass weights up to eight + +Each case removes the leftmost tower. The towers `ψ`, `∇ψ` and `∇∇ψ` have weights `3`, `5` +and `7`; the remaining weight is then read off from a smaller 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 one. -/ +lemma massWeightSubmodule_one_eq : h.massWeightSubmodule 1 = ⊥ := + h.massWeightSubmodule_eq_bot (by omega) /-- 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_two_eq : h.massWeightSubmodule 2 = ⊥ := + h.massWeightSubmodule_eq_bot (by omega) + +/-- Weight three is the underived fermion towers: `ψ` leaves weight zero. -/ 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] + rw [h.massWeightSubmodule_eq_iSup_mul 3 (by norm_num), + show (Finset.range 4).filter (fun n => 3 + 2 * n ≤ 3) = {0} from by decide, + Finset.iSup_singleton] + simp [h.massWeightSubmodule_zero_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_four_eq : h.massWeightSubmodule 4 = ⊥ := + h.massWeightSubmodule_eq_bot (by omega) + +/-- Weight five is the once-derived fermion towers: `ψ` would leave weight two, which is + empty, and `∇ψ` leaves weight zero. -/ 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. -/ + rw [h.massWeightSubmodule_eq_iSup_mul 5 (by norm_num), + show (Finset.range 6).filter (fun n => 3 + 2 * n ≤ 5) = {0, 1} from by decide, + Finset.iSup_insert, Finset.iSup_singleton] + simp [h.massWeightSubmodule_zero_eq, h.massWeightSubmodule_two_eq] + +/-- Weight six is the products of two underived fermion towers: `ψ` leaves weight three, + which is `ψ`, and `∇ψ` would leave weight one, which is empty. -/ 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. -/ + rw [h.massWeightSubmodule_eq_iSup_mul 6 (by norm_num), + show (Finset.range 7).filter (fun n => 3 + 2 * n ≤ 6) = {0, 1} from by decide, + Finset.iSup_insert, Finset.iSup_singleton] + simp [h.massWeightSubmodule_three_eq, h.massWeightSubmodule_one_eq] + +/-- Weight seven is the twice-derived fermion towers: `ψ` and `∇ψ` would leave weights + four and two, which are empty, and `∇∇ψ` leaves weight zero. -/ 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`. -/ + rw [h.massWeightSubmodule_eq_iSup_mul 7 (by norm_num), + show (Finset.range 8).filter (fun n => 3 + 2 * n ≤ 7) = {0, 1, 2} from by decide, + Finset.iSup_insert, Finset.iSup_insert, Finset.iSup_singleton] + simp [h.massWeightSubmodule_four_eq, h.massWeightSubmodule_two_eq, + h.massWeightSubmodule_zero_eq] + +/-- Weight eight is the products of an underived and a once-derived fermion tower, the + kinetic-term sector: `ψ` leaves `∇ψ`, `∇ψ` leaves `ψ`, and `∇∇ψ` would leave weight one, + which is empty. 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] + rw [h.massWeightSubmodule_eq_iSup_mul 8 (by norm_num), + show (Finset.range 9).filter (fun n => 3 + 2 * n ≤ 8) = {0, 1, 2} from by decide, + Finset.iSup_insert, Finset.iSup_insert, Finset.iSup_singleton] + simp [h.massWeightSubmodule_five_eq, h.massWeightSubmodule_three_eq, + h.massWeightSubmodule_one_eq, h.derivSubmodule_mul_comm 1 0] end IsFermionSector diff --git a/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/Basic.lean b/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/Basic.lean index 9295ed766..1d676d3c2 100644 --- a/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/Basic.lean +++ b/Physlib/Particles/StandardModel/IsGaugeSector/MassWeight/Basic.lean @@ -5,16 +5,36 @@ Authors: Joseph Tooby-Smith -/ module +public import Physlib.Mathematics.HomogeneousGenerators 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. +## i. Overview + +The elements of the gauge algebra of a given mass weight form a submodule. Mass weight is +twice the mass dimension: a field-strength tower `∇ⁿF` with `n` covariant derivatives has +mass dimension `2 + n` and mass weight `2 * (2 + n)`, and a term of mass dimension four, as +in the Lagrangian, has mass weight eight. + +The field-strength towers generate the gauge algebra, and `massWeightPoly` is a monomial on +each of them. The results of `Physlib.Mathematics.HomogeneousGenerators` then describe +every mass-weight submodule. The submodules of weight at most eight are found by removing +the leftmost tower of each product; weight eight is the `∇∇F` and `F · F` sectors. + +## ii. Key results + +- `massWeightSubmodule_eq_iSup_mul` : removing the leftmost field-strength tower. +- `massWeightSubmodule_eq` : the binary weight recursion. +- `massWeightSubmodule_eq_bot` : the odd weights and the weight two are empty. +- `massWeightSubmodule_four_eq` to `massWeightSubmodule_eight_eq` : the mass weights up to eight. + +## iii. Table of contents + +- A. The mass-weight submodules +- B. The field-strength towers generate and have weight `2 * (2 + n)` +- C. The weight decompositions +- D. Mass weights up to eight -/ @@ -38,6 +58,11 @@ variable {B : Type} [Ring B] [Algebra ℂ B] {massWeightPoly : B →ₐ[ℂ] Polynomial B} (h : IsGaugeSector B repGauge hrepGauge_mul repLorentz hrepLorentz_mul F massWeightPoly) +/-! + +## A. The mass-weight submodules + +-/ /-- 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 @@ -51,293 +76,154 @@ noncomputable def massWeightSubmodule (h : IsGaugeSector B repGauge hrepGauge_mu 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' + massWeightPoly x = Polynomial.monomial w x := + (Subalgebra.mem_homogeneousSubmodule_iff.mp hx).2 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 + (hx : x ∈ h.massWeightSubmodule w) : x ∈ h.gaugeAlgebra := + (Subalgebra.mem_homogeneousSubmodule_iff.mp hx).1 + +lemma one_le_massWeightSubmodule_zero : (1 : Submodule ℂ B) ≤ h.massWeightSubmodule 0 := + Subalgebra.one_le_homogeneousSubmodule_zero + +lemma massWeightSubmodule_mul_le (m n : ℕ) : + h.massWeightSubmodule m * h.massWeightSubmodule n ≤ h.massWeightSubmodule (m + n) := + Subalgebra.homogeneousSubmodule_mul_le m n + +/-! + +## B. The field-strength towers generate and have weight `2 * (2 + n)` + +-/ + +/-- The gauge algebra is generated by the field-strength towers of every derivative + order. -/ +lemma gaugeAlgebra_eq_adjoin_derivSubmodule : + h.gaugeAlgebra = Algebra.adjoin ℂ (⋃ n, (h.derivSubmodule n : Set B)) := by + simp only [derivSubmodule, ← Submodule.span_iUnion, Algebra.adjoin_iUnion, + Algebra.adjoin_span, gaugeAlgebra] + +/-- `massWeightPoly` is the monomial `X ^ (2 * (2 + n))` on the field-strength towers with + `n` covariant derivatives. -/ +lemma massWeightPoly_of_mem_derivSubmodule (n : ℕ) : + ∀ x ∈ h.derivSubmodule n, massWeightPoly x = Polynomial.monomial (2 * (2 + n)) x := by + intro x hx + have hle : h.derivSubmodule n ≤ LinearMap.ker (massWeightPoly.toLinearMap + - (Polynomial.monomial (2 * (2 + n)) : B →ₗ[B] Polynomial B).restrictScalars ℂ) := + iSup_le fun l => iSup_le fun μ => iSup_le fun ν => Submodule.span_le.mpr <| by + rintro _ ⟨φ, rfl⟩ + simp [h.massWeight_F] + simpa [sub_eq_zero] using hle hx /-- 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 + h.derivSubmodule n ≤ h.massWeightSubmodule (2 * (2 + n)) := + Subalgebra.le_homogeneousSubmodule h.gaugeAlgebra_eq_adjoin_derivSubmodule + h.massWeightPoly_of_mem_derivSubmodule n -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`. -/ +/-! + +## C. The weight decompositions + +Every result here is a spanning statement: a submodule is a join of products of +field-strength towers, in the order written. + +-/ + +/-- Weight zero is the scalars: every field-strength tower has positive weight. -/ +lemma massWeightSubmodule_zero_eq : h.massWeightSubmodule 0 = 1 := + Subalgebra.homogeneousSubmodule_zero_eq_one h.gaugeAlgebra_eq_adjoin_derivSubmodule + h.massWeightPoly_of_mem_derivSubmodule (fun n => by omega) + +/-- 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, ite_eq_right (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, ite_eq_right (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, - ite_eq_left 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'])) + h.massWeightSubmodule (p.1 : ℕ) * h.massWeightSubmodule (p.2 : ℕ)) := + Subalgebra.homogeneousSubmodule_eq_sup_iSup_mul (deg := fun n => 2 * (2 + n)) + h.gaugeAlgebra_eq_adjoin_derivSubmodule h.massWeightPoly_of_mem_derivSubmodule + (fun n => by omega) i hi + +/-- Removing the leftmost field-strength tower: an element of positive weight `w` is a sum + of products of a tower `∇ⁿF` of weight `2 * (2 + n) ≤ w` with an element of the + remaining weight. -/ +lemma massWeightSubmodule_eq_iSup_mul (w : ℕ) (hw : 0 < w) : + h.massWeightSubmodule w + = ⨆ n ∈ (Finset.range (w + 1)).filter (fun n => 2 * (2 + n) ≤ w), + h.derivSubmodule n * h.massWeightSubmodule (w - 2 * (2 + n)) := + Subalgebra.homogeneousSubmodule_eq_iSup_mul (deg := fun n => 2 * (2 + n)) + h.gaugeAlgebra_eq_adjoin_derivSubmodule h.massWeightPoly_of_mem_derivSubmodule + (fun n => by omega) hw + +/-- The weights `1`, `2`, `3`, `5` and `7` are empty: the tower weights `4, 6, 8, …` and + their sums only reach `0` and the even weights from `4` on. -/ +lemma massWeightSubmodule_eq_bot {w : ℕ} (hw : ¬ (w = 0 ∨ (4 ≤ w ∧ w % 2 = 0))) : + h.massWeightSubmodule w = ⊥ := + Subalgebra.homogeneousSubmodule_eq_bot h.gaugeAlgebra_eq_adjoin_derivSubmodule + h.massWeightPoly_of_mem_derivSubmodule (fun w => w = 0 ∨ (4 ≤ w ∧ w % 2 = 0)) + (by omega) (fun n => by omega) (fun a b ha hb => by omega) hw /-! -## The mass-weight submodules in low weight +## D. Mass weights up to eight + +Each case removes the leftmost tower. The towers `F`, `∇F` and `∇∇F` have weights `4`, `6` +and `8`; the remaining weight is then read off from a smaller 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 +lemma massWeightSubmodule_one_eq : h.massWeightSubmodule 1 = ⊥ := + h.massWeightSubmodule_eq_bot (by omega) /-- 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] +lemma massWeightSubmodule_two_eq : h.massWeightSubmodule 2 = ⊥ := + h.massWeightSubmodule_eq_bot (by omega) /-- 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_three_eq : h.massWeightSubmodule 3 = ⊥ := + h.massWeightSubmodule_eq_bot (by omega) + +/-- Weight four is the underived field-strength towers: `F` leaves weight zero. -/ 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] + rw [h.massWeightSubmodule_eq_iSup_mul 4 (by norm_num), + show (Finset.range 5).filter (fun n => 2 * (2 + n) ≤ 4) = {0} from by decide, + Finset.iSup_singleton] + simp [h.massWeightSubmodule_zero_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_five_eq : h.massWeightSubmodule 5 = ⊥ := + h.massWeightSubmodule_eq_bot (by omega) + +/-- Weight six is the once-derived field-strength towers: `F` would leave weight two, + which is empty, and `∇F` leaves weight zero. -/ 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] + rw [h.massWeightSubmodule_eq_iSup_mul 6 (by norm_num), + show (Finset.range 7).filter (fun n => 2 * (2 + n) ≤ 6) = {0, 1} from by decide, + Finset.iSup_insert, Finset.iSup_singleton] + simp [h.massWeightSubmodule_two_eq, h.massWeightSubmodule_zero_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_seven_eq : h.massWeightSubmodule 7 = ⊥ := + h.massWeightSubmodule_eq_bot (by omega) + +/-- Weight eight is the twice-derived field-strength towers together with the products + of two underived ones, the `∇∇F` and `F · F` sectors: `F` leaves weight four, which is + `F`, `∇F` would leave weight two, which is empty, and `∇∇F` leaves weight zero. -/ 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] + rw [h.massWeightSubmodule_eq_iSup_mul 8 (by norm_num), + show (Finset.range 9).filter (fun n => 2 * (2 + n) ≤ 8) = {0, 1, 2} from by decide, + Finset.iSup_insert, Finset.iSup_insert, Finset.iSup_singleton] + simp [h.massWeightSubmodule_four_eq, h.massWeightSubmodule_two_eq, + h.massWeightSubmodule_zero_eq, sup_comm] end IsGaugeSector